From b2f83350e6f57189fe054b813e86440185007f9e Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:54:16 +0000 Subject: [PATCH 1/3] SDK: update useAccountUpdateRecovery to use AuthContextV2 adapter --- .../accounts/mutations/use-account-update-recovery.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sdk/src/modules/accounts/mutations/use-account-update-recovery.ts b/packages/sdk/src/modules/accounts/mutations/use-account-update-recovery.ts index be8fc29f6a..364e2e6792 100644 --- a/packages/sdk/src/modules/accounts/mutations/use-account-update-recovery.ts +++ b/packages/sdk/src/modules/accounts/mutations/use-account-update-recovery.ts @@ -7,7 +7,7 @@ import { } from "@tanstack/react-query"; import hs from "hivesigner"; import { getAccountFullQueryOptions } from "../queries"; -import type { AuthContext } from "@/modules/core/types"; +import type { AuthContextV2 } from "@/modules/core/types"; import { broadcastOperations } from "@/modules/core/hive-tx"; type SignType = "key" | "keychain" | "hivesigner" | "ecency"; @@ -30,7 +30,7 @@ export function useAccountUpdateRecovery( username: string | undefined, code: string | undefined, options: UpdateRecoveryOptions, - auth?: AuthContext + auth?: AuthContextV2 ) { const { data } = useQuery(getAccountFullQueryOptions(username)); @@ -86,10 +86,10 @@ export function useAccountUpdateRecovery( key ); } else if (type === "keychain") { - if (!auth?.broadcast) { + if (!auth?.adapter?.broadcastWithKeychain) { throw new Error("[SDK][Accounts] – missing keychain broadcaster"); } - return auth.broadcast([["change_recovery_account", operationBody]], "owner"); + return auth.adapter.broadcastWithKeychain(data.name, [["change_recovery_account", operationBody]], "owner"); } else { if (!options.hsCallbackUrl && process.env.NODE_ENV === "development") { console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing."); From b0cc09e606950b529ab762a4b792c06c3e9d8414 Mon Sep 17 00:00:00 2001 From: feruzm Date: Thu, 6 Aug 2026 12:26:32 +0000 Subject: [PATCH 2/3] SDK: migrate the remaining auth.broadcast callers to the V2 adapter The recovery fix was correct and closed one of four instances of the same bug. Every field on AuthContext is optional, broadcast? included, so AuthContextV2 satisfies it structurally: the type checker sees nothing, auth?.broadcast is silently undefined at runtime, and each site fails only when a user reaches it. That is why this arrived as a Sentry issue rather than a build failure, and why fixing one said nothing about the rest. The web app passes V2 everywhere via getSdkAuthContext, so all of these are reachable today: - useAccountRevokePosting, from manage-authorities.tsx. Same hard throw as the recovery one, on the same permissions page. - useSignOperationByKeychain, from transaction-signer.tsx. Same hard throw. - broadcastJson, from follow-controls.tsx. Different shape: auth.broadcast is the first branch of a fallback chain rather than a requirement, so a Keychain user with a HiveSigner token still worked and one without a stored posting key and no token hit "cannot broadcast w/o posting key or token". broadcastJson gets its adapter branch LAST rather than first. Every branch above it already serves the sessions that reach it, and reordering would change which method signs for people it currently works for; placed last it only claims cases that were previously errors. Left alone deliberately: the two auth.broadcast checks in use-broadcast-mutation sit under case 'custom', where an explicitly supplied broadcaster is the point. Once callers stop passing V1, AuthContext.broadcast has no users left and can go, which would make the next occurrence a compile error instead of a runtime one. --- .../mutations/use-account-revoke-posting.ts | 12 +++++--- .../modules/core/mutations/broadcast-json.ts | 30 +++++++++++++++++-- .../mutations/sign-operation-by-keychain.ts | 8 ++--- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/packages/sdk/src/modules/accounts/mutations/use-account-revoke-posting.ts b/packages/sdk/src/modules/accounts/mutations/use-account-revoke-posting.ts index 82e2b7b86e..3542104883 100644 --- a/packages/sdk/src/modules/accounts/mutations/use-account-revoke-posting.ts +++ b/packages/sdk/src/modules/accounts/mutations/use-account-revoke-posting.ts @@ -8,7 +8,7 @@ import { import { getAccountFullQueryOptions } from "../queries"; import { FullAccount } from "../types"; import hs from "hivesigner"; -import type { AuthContext } from "@/modules/core/types"; +import type { AuthContextV2 } from "@/modules/core/types"; import { broadcastOperations } from "@/modules/core/hive-tx"; type SignType = "key" | "keychain" | "hivesigner"; @@ -29,7 +29,7 @@ type RevokePostingOptions = Pick< export function useAccountRevokePosting( username: string | undefined, options: RevokePostingOptions, - auth?: AuthContext + auth?: AuthContextV2 ) { const queryClient = useQueryClient(); @@ -60,10 +60,14 @@ export function useAccountRevokePosting( if (type === "key" && key) { return broadcastOperations([["account_update", operationBody]], key); } else if (type === "keychain") { - if (!auth?.broadcast) { + if (!auth?.adapter?.broadcastWithKeychain) { throw new Error("[SDK][Accounts] – missing keychain broadcaster"); } - return auth.broadcast([["account_update", operationBody]], "active"); + return auth.adapter.broadcastWithKeychain( + data.name, + [["account_update", operationBody]], + "active" + ); } else { if (!options.hsCallbackUrl && process.env.NODE_ENV === "development") { console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing."); diff --git a/packages/sdk/src/modules/core/mutations/broadcast-json.ts b/packages/sdk/src/modules/core/mutations/broadcast-json.ts index 680f04f261..3e8ccb799b 100644 --- a/packages/sdk/src/modules/core/mutations/broadcast-json.ts +++ b/packages/sdk/src/modules/core/mutations/broadcast-json.ts @@ -1,13 +1,13 @@ import { PrivateKey } from "../../../hive-tx"; import { broadcastOperations } from "@/modules/core/hive-tx"; import hs from "hivesigner"; -import type { AuthContext } from "@/modules/core/types"; +import type { AuthContextV2 } from "@/modules/core/types"; export async function broadcastJson( username: string | undefined, id: string, payload: T, - auth?: AuthContext + auth?: AuthContextV2 ) { if (!username) { throw new Error( @@ -44,6 +44,32 @@ export async function broadcastJson( return response.result; } + /* + * Adapter, as a last resort rather than first. + * + * `auth.broadcast` above is the deprecated V1 field, and an AuthContextV2 + * does not carry it, so a Keychain user whose posting key is not stored and + * who has no HiveSigner token reached the throw below instead of being asked + * to sign. The web app passes V2 everywhere (`getSdkAuthContext`), so this is + * reachable today from follow and unfollow. + * + * Placed last on purpose: every branch above already works for the sessions + * that reach it, and reordering would change which method signs for people + * it currently serves. This only claims cases that were previously errors. + */ + const adapter = auth?.adapter; + if (adapter) { + const ops: Parameters>[1] = + [["custom_json", jjson]]; + + if (auth?.loginType === "keychain" && adapter.broadcastWithKeychain) { + return adapter.broadcastWithKeychain(username, ops, "posting"); + } + if (auth?.loginType === "hiveauth" && adapter.broadcastWithHiveAuth) { + return adapter.broadcastWithHiveAuth(username, ops, "posting"); + } + } + throw new Error( "[SDK][Broadcast] – cannot broadcast w/o posting key or token" ); diff --git a/packages/sdk/src/modules/operations/mutations/sign-operation-by-keychain.ts b/packages/sdk/src/modules/operations/mutations/sign-operation-by-keychain.ts index d40464f15c..8bb81fd226 100644 --- a/packages/sdk/src/modules/operations/mutations/sign-operation-by-keychain.ts +++ b/packages/sdk/src/modules/operations/mutations/sign-operation-by-keychain.ts @@ -1,10 +1,10 @@ import type { Operation } from "../../../hive-tx"; import { useMutation } from "@tanstack/react-query"; -import type { AuthContext } from "@/modules/core/types"; +import type { AuthContextV2 } from "@/modules/core/types"; export function useSignOperationByKeychain( username: string | undefined, - auth?: AuthContext, + auth?: AuthContextV2, keyType: "owner" | "active" | "posting" | "memo" = "active" ) { return useMutation({ @@ -15,11 +15,11 @@ export function useSignOperationByKeychain( "[SDK][Keychain] – cannot sign operation with anon user" ); } - if (!auth?.broadcast) { + if (!auth?.adapter?.broadcastWithKeychain) { throw new Error("[SDK][Keychain] – missing keychain broadcaster"); } - return auth.broadcast([operation], keyType); + return auth.adapter.broadcastWithKeychain(username, [operation], keyType); }, }); } From e0c8715efa7677907613df49ac738b48c2045e52 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 12:45:03 +0000 Subject: [PATCH 3/3] chore: apply changeset versioning for PR #1376 --- packages/sdk/CHANGELOG.md | 6 ++++++ packages/sdk/dist/browser/index.d.ts | 8 ++++---- packages/sdk/dist/browser/index.js | 2 +- packages/sdk/dist/browser/index.js.map | 2 +- packages/sdk/dist/node/index.cjs | 2 +- packages/sdk/dist/node/index.cjs.map | 2 +- packages/sdk/dist/node/index.mjs | 2 +- packages/sdk/dist/node/index.mjs.map | 2 +- packages/sdk/package.json | 2 +- packages/wallets/CHANGELOG.md | 7 +++++++ packages/wallets/package.json | 2 +- 11 files changed, 25 insertions(+), 12 deletions(-) diff --git a/packages/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md index 5fe57db394..ec43a1550e 100644 --- a/packages/sdk/CHANGELOG.md +++ b/packages/sdk/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 2.3.77 + +### Patch Changes + +- SDK: update useAccountUpdateRecovery to use AuthContextV2 adapter (#1376) + ## 2.3.76 ### Patch Changes diff --git a/packages/sdk/dist/browser/index.d.ts b/packages/sdk/dist/browser/index.d.ts index 9956fdac17..1515796d6f 100644 --- a/packages/sdk/dist/browser/index.d.ts +++ b/packages/sdk/dist/browser/index.d.ts @@ -990,7 +990,7 @@ declare function useBroadcastMutation(mutationKey: MutationKey | undefined, u broadcastMode?: BroadcastMode; }): _tanstack_react_query.UseMutationResult; -declare function broadcastJson(username: string | undefined, id: string, payload: T, auth?: AuthContext): Promise; +declare function broadcastJson(username: string | undefined, id: string, payload: T, auth?: AuthContextV2): Promise; /** * Delay (ms) before invalidating chain-derived queries after an async @@ -2255,7 +2255,7 @@ interface CommonPayload$1 { type RevokePostingOptions = Pick, "onSuccess" | "onError"> & { hsCallbackUrl?: string; }; -declare function useAccountRevokePosting(username: string | undefined, options: RevokePostingOptions, auth?: AuthContext): _tanstack_react_query.UseMutationResult; +declare function useAccountRevokePosting(username: string | undefined, options: RevokePostingOptions, auth?: AuthContextV2): _tanstack_react_query.UseMutationResult; type SignType = "key" | "keychain" | "hivesigner" | "ecency"; interface CommonPayload { @@ -2267,7 +2267,7 @@ interface CommonPayload { type UpdateRecoveryOptions = Pick, "onSuccess" | "onError"> & { hsCallbackUrl?: string; }; -declare function useAccountUpdateRecovery(username: string | undefined, code: string | undefined, options: UpdateRecoveryOptions, auth?: AuthContext): _tanstack_react_query.UseMutationResult; +declare function useAccountUpdateRecovery(username: string | undefined, code: string | undefined, options: UpdateRecoveryOptions, auth?: AuthContextV2): _tanstack_react_query.UseMutationResult; interface Payload { currentKey: PrivateKey; @@ -3028,7 +3028,7 @@ declare function useSignOperationByKey(username: string | undefined): _tanstack_ keyOrSeed: string; }, unknown>; -declare function useSignOperationByKeychain(username: string | undefined, auth?: AuthContext, keyType?: "owner" | "active" | "posting" | "memo"): _tanstack_react_query.UseMutationResult; diff --git a/packages/sdk/dist/browser/index.js b/packages/sdk/dist/browser/index.js index 17e4dc07e9..dd5eedb5c3 100644 --- a/packages/sdk/dist/browser/index.js +++ b/packages/sdk/dist/browser/index.js @@ -1,4 +1,4 @@ -import {useQuery,useInfiniteQuery,useMutation,QueryClient,queryOptions,infiniteQueryOptions,useQueryClient,isServer}from'@tanstack/react-query';import {hexToBytes,bytesToHex}from'@noble/hashes/utils.js';import {ripemd160}from'@noble/hashes/legacy.js';import nn from'bs58';import {secp256k1}from'@noble/curves/secp256k1.js';import {sha256,sha512}from'@noble/hashes/sha2.js';import {cbc}from'@noble/ciphers/aes.js';import Ln from'hivesigner';var Jr=Object.defineProperty;var Oo=(e,t,r)=>t in e?Jr(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var gt=(e,t)=>{for(var r in t)Jr(e,r,{get:t[r],enumerable:true});};var A=(e,t,r)=>Oo(e,typeof t!="symbol"?t+"":t,r);var yt=new ArrayBuffer(0),ht=null,wt=null;function xo(){return ht||(typeof TextEncoder<"u"?ht=new TextEncoder:ht={encode(e){let t=[];for(let r=0;r>6,128|n&63);else if(n>=55296&&n<=56319&&r+1>18,128|n>>12&63,128|n>>6&63,128|n&63);}else t.push(224|n>>12,128|n>>6&63,128|n&63);}return new Uint8Array(t)}}),ht}function Yr(){return wt||(typeof TextDecoder<"u"?wt=new TextDecoder:wt={decode(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r="";for(let n=0;n>10),56320+(o&1023)));}return r}}),wt}var j=class j{constructor(t=j.DEFAULT_CAPACITY,r=j.DEFAULT_ENDIAN){A(this,"buffer");A(this,"view");A(this,"offset");A(this,"markedOffset");A(this,"limit");A(this,"littleEndian");A(this,"readUInt32",this.readUint32);this.buffer=t===0?yt:new ArrayBuffer(t),this.view=t===0?new DataView(yt):new DataView(this.buffer),this.offset=0,this.markedOffset=-1,this.limit=t,this.littleEndian=r;}static allocate(t,r){return new j(t,r)}static concat(t,r){let n=0;for(let a=0;a0&&(n.buffer=t.buffer,n.offset=t.byteOffset,n.limit=t.byteOffset+t.byteLength,n.view=new DataView(t.buffer));else if(t instanceof ArrayBuffer)n=new j(0,r),t.byteLength>0&&(n.buffer=t,n.offset=0,n.limit=t.byteLength,n.view=t.byteLength>0?new DataView(t):new DataView(yt));else if(Array.isArray(t))n=new j(t.length,r),n.limit=t.length,new Uint8Array(n.buffer).set(t);else throw TypeError("Illegal buffer");return n}writeBytes(t,r){return this.append(t,r)}writeInt8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setInt8(r,t),n&&(this.offset+=1),this}writeByte(t,r){return this.writeInt8(t,r)}writeUint8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setUint8(r,t),n&&(this.offset+=1),this}writeUInt8(t,r){return this.writeUint8(t,r)}readUint8(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint8(t);return r&&(this.offset+=1),n}readUInt8(t){return this.readUint8(t)}writeInt16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setInt16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeShort(t,r){return this.writeInt16(t,r)}writeUint16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setUint16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeUInt16(t,r){return this.writeUint16(t,r)}writeInt32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setInt32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeInt(t,r){return this.writeInt32(t,r)}writeUint32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setUint32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeUInt32(t,r){return this.writeUint32(t,r)}readUint32(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint32(t,this.littleEndian);return r&&(this.offset+=4),n}append(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i;return t instanceof j?(i=new Uint8Array(t.buffer,t.offset,t.limit-t.offset),t.offset+=i.length):t instanceof Uint8Array?i=t:t instanceof ArrayBuffer?i=new Uint8Array(t):i=new Uint8Array(t),i.length<=0?this:(r+i.length>this.buffer.byteLength&&this.resize(r+i.length),new Uint8Array(this.buffer).set(i,r),n&&(this.offset+=i.length),this)}clone(t){let r=new j(0,this.littleEndian);return t?(r.buffer=new ArrayBuffer(this.buffer.byteLength),new Uint8Array(r.buffer).set(new Uint8Array(this.buffer)),r.view=new DataView(r.buffer)):(r.buffer=this.buffer,r.view=this.view),r.offset=this.offset,r.markedOffset=this.markedOffset,r.limit=this.limit,r}copy(t,r){if(t===void 0&&(t=this.offset),r===void 0&&(r=this.limit),t===r)return new j(0,this.littleEndian);let n=r-t,i=new j(n,this.littleEndian);return i.offset=0,i.limit=n,new Uint8Array(i.buffer).set(new Uint8Array(this.buffer).subarray(t,r),0),i}copyTo(t,r,n,i){let o=typeof r>"u",s=typeof n>"u";r=o?t.offset:r,n=s?this.offset:n,i=i===void 0?this.limit:i;let a=i-n;return a===0?t:(t.ensureCapacity(r+a),new Uint8Array(t.buffer).set(new Uint8Array(this.buffer).subarray(n,i),r),s&&(this.offset+=a),o&&(t.offset+=a),this)}ensureCapacity(t){let r=this.buffer.byteLength;return rt?r:t):this}flip(){return this.limit=this.offset,this.offset=0,this}resize(t){if(this.buffer.byteLength"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigInt64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeLong(t,r){return this.writeInt64(t,r)}readInt64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigInt64(t,this.littleEndian);return r&&(this.offset+=8),n}readLong(t){return this.readInt64(t)}writeUint64(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigUint64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeUInt64(t,r){return this.writeUint64(t,r)}readUint64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigUint64(t,this.littleEndian);return r&&(this.offset+=8),n}readUInt64(t){return this.readUint64(t)}toBuffer(t){let r=this.offset,n=this.limit;return !t&&r===0&&n===this.buffer.byteLength?this.buffer:r===n?yt:this.buffer.slice(r,n)}toArrayBuffer(t){return this.toBuffer(t)}writeVarint32(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=this.calculateVarint32(t);for(r+i>this.buffer.byteLength&&this.resize(r+i),t>>>=0;t>=128;)this.view.setUint8(r++,t&127|128),t>>>=7;return this.view.setUint8(r++,t),n?(this.offset=r,this):i}readVarint32(t){let r=typeof t>"u";typeof t>"u"&&(t=this.offset);let n=0,i=0,o;do o=this.view.getUint8(t++),n<5&&(i|=(o&127)<<7*n),++n;while((o&128)!==0);return i|=0,r?(this.offset=t,i):{value:i,length:n}}calculateVarint32(t){return t=t>>>0,t<128?1:t<16384?2:t<1<<21?3:t<1<<28?4:5}writeVString(t,r){let n=typeof r>"u",i=n?this.offset:r,o=xo().encode(t),s=o.length,a=this.calculateVarint32(s);return i+a+s>this.buffer.byteLength&&this.resize(i+a+s),this.writeVarint32(s,i),i+=a,new Uint8Array(this.buffer).set(o,i),i+=s,n?(this.offset=i,this):i-(r||0)}readVString(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=t,i=this.readVarint32(t),o=i.value,s=i.length;t+=s;let a=Yr().decode(new Uint8Array(this.buffer,t,o));return t+=o,r?(this.offset=t,a):{string:a,length:t-n}}readUTF8String(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=Yr().decode(new Uint8Array(this.buffer,r,t));return n?(this.offset+=t,i):{string:i,length:t}}};A(j,"LITTLE_ENDIAN",true),A(j,"BIG_ENDIAN",false),A(j,"DEFAULT_CAPACITY",16),A(j,"DEFAULT_ENDIAN",j.BIG_ENDIAN);var D=j;var E={nodes:["https://api.hive.blog","https://api.deathwing.me","https://api.openhive.network","https://techcoderx.com","https://api.syncad.com","https://rpc.mahdiyari.info"],restNodes:["https://api.hive.blog","https://rpc.mahdiyari.info","https://api.syncad.com","https://hiveapi.actifit.io","https://api.c0ff33a.uk"],restNodesByApi:{hivesense:["https://api.hive.blog","https://api.syncad.com"]},userAgent:"ecency-sdk",chain_id:"beeab0de00000000000000000000000000000000000000000000000000000000",address_prefix:"STM",timeout:5e3,broadcastTimeout:15e3,retry:5,resilience:{adaptiveTimeout:true,adaptiveTimeoutFloorMs:2e3,adaptiveTimeoutFactor:4,hedge:false,hedgeDelayFloorMs:750,hedgeDelayFactor:2,hedgeBucketCapacity:10,hedgeRefillPerSuccess:.1,totalBudgetFactor:2}},Wt=e=>Array.isArray(e)?[...new Set(e.filter(t=>typeof t=="string").map(t=>t.trim().replace(/\/+$/,"")).filter(t=>t.length>0&&/^https?:\/\/.+/.test(t)))]:[],Gt=e=>{let t=Wt(e);t.length&&(E.nodes=t);},zt=e=>{let t=Wt(e);t.length&&(E.restNodes=t);},Jt=e=>{if(!e||typeof e!="object")return;let t={...E.restNodesByApi};for(let[r,n]of Object.entries(e)){let i=Wt(n);i.length?t[r]=i:delete t[r];}E.restNodesByApi=t;},Yt=e=>{if(typeof e!="string")return;let t=e.trim();!t||/[\u0000-\u001f\u007f]/.test(t)||(E.userAgent=t);},Xt=e=>{if(!e||typeof e!="object")return;let t=E.resilience,r=i=>typeof i=="boolean",n=i=>typeof i=="number"&&Number.isFinite(i)&&i>0;r(e.adaptiveTimeout)&&(t.adaptiveTimeout=e.adaptiveTimeout),n(e.adaptiveTimeoutFloorMs)&&(t.adaptiveTimeoutFloorMs=Math.max(e.adaptiveTimeoutFloorMs,2e3)),n(e.adaptiveTimeoutFactor)&&(t.adaptiveTimeoutFactor=e.adaptiveTimeoutFactor),r(e.hedge)&&(t.hedge=e.hedge),n(e.hedgeDelayFloorMs)&&(t.hedgeDelayFloorMs=e.hedgeDelayFloorMs),n(e.hedgeDelayFactor)&&(t.hedgeDelayFactor=e.hedgeDelayFactor),n(e.hedgeBucketCapacity)&&(t.hedgeBucketCapacity=e.hedgeBucketCapacity),n(e.hedgeRefillPerSuccess)&&(t.hedgeRefillPerSuccess=Math.min(e.hedgeRefillPerSuccess,1)),n(e.totalBudgetFactor)&&(t.totalBudgetFactor=Math.max(e.totalBudgetFactor,1));};var Oe=class e{constructor(t,r,n){A(this,"data");A(this,"recovery");A(this,"compressed");this.data=t,this.recovery=r,this.compressed=n??true;}static from(t){if(typeof t=="string"){let r=hexToBytes(t),n=parseInt(bytesToHex(r.subarray(0,1)),16)-31,i=true;n<0&&(i=false,n=n+4);let o=r.subarray(1);return new e(o,n,i)}else throw new Error("Expected string for data")}toBuffer(){let t=new Uint8Array(65).fill(0);return this.compressed?t[0]=this.recovery+31&255:t[0]=this.recovery+27&255,t.set(this.data,1),t}customToString(){return bytesToHex(this.toBuffer())}toString(){return this.customToString()}getPublicKey(t){if(t instanceof Uint8Array&&t.length!==32||typeof t=="string"&&t.length!==64)throw new Error("Expected a valid sha256 hash as message");typeof t=="string"&&(t=hexToBytes(t));let r=secp256k1.Signature.fromBytes(this.data,"compact"),n=new secp256k1.Signature(r.r,r.s,this.recovery);return new X(n.recoverPublicKey(t).toBytes())}};var X=class e{constructor(t,r){A(this,"key");A(this,"prefix");this.key=t,this.prefix=r??E.address_prefix;}static fromString(t){let r=E.address_prefix;if(typeof t!="string"||t.length<=r.length)throw new Error("Invalid public key");let n=t.slice(0,r.length);if(n!==r)throw new Error(`Public key must start with ${r}`);let i;try{i=nn.decode(t.slice(r.length));}catch{throw new Error("Invalid public key encoding")}if(i.length!==37)throw new Error("Invalid public key length");let o=i.subarray(0,33),s=i.subarray(33,37),a=ripemd160(o).subarray(0,4);if(!So(s,a))throw new Error("Public key checksum mismatch");try{secp256k1.Point.fromBytes(o);}catch{throw new Error("Invalid public key")}return new e(o,n)}static from(t){return t instanceof e?t:e.fromString(t)}verify(t,r){return typeof r=="string"&&(r=Oe.from(r)),secp256k1.verify(r.data,t,this.key,{prehash:false,format:"compact"})}toString(){return Eo(this.key,this.prefix)}toJSON(){return this.toString()}inspect(){return `PublicKey: ${this.toString()}`}},Eo=(e,t)=>{let r=ripemd160(e);return t+nn.encode(new Uint8Array([...e,...r.subarray(0,4)]))},So=(e,t)=>{if(e.byteLength!==t.byteLength)return false;for(let r=0;r{throw new Error("Void can not be serialized")},_=(e,t)=>{e.writeVString(t);},To=(e,t)=>{e.writeInt16(t);},sn=(e,t)=>{e.writeInt64(t);},on=(e,t)=>{e.writeUint8(t);},pe=(e,t)=>{e.writeUint16(t);},Z=(e,t)=>{e.writeUint32(t);},an=(e,t)=>{e.writeUint64(t);},he=(e,t)=>{e.writeByte(t?1:0);},cn=e=>(t,r)=>{let[n,i]=r;t.writeVarint32(n),e[n](t,i);},I=(e,t)=>{let r=_t.from(t),n=r.getPrecision();e.writeInt64(Math.round(r.amount*Math.pow(10,n))),e.writeUint8(n);for(let i=0;i<7;i++)e.writeUint8(r.symbol.charCodeAt(i)||0);},xe=(e,t)=>{e.writeUint32(Math.floor(new Date(t+"Z").getTime()/1e3));},ge=(e,t)=>{t===null||typeof t=="string"&&t.slice(-39)==="1111111111111111111111111111111114T1Anm"?e.append(new Uint8Array(33).fill(0)):e.append(X.from(t).key);},un=(e=null)=>(t,r)=>{r=bt.from(r);let n=r.buffer.length;if(e){if(n!==e)throw new Error(`Unable to serialize binary. Expected ${e} bytes, got ${n}`)}else t.writeVarint32(n);t.append(r.buffer);},pn=un(),Zt=(e,t)=>(r,n)=>{r.writeVarint32(n.length);for(let[i,o]of n)e(r,i),t(r,o);},L=e=>(t,r)=>{t.writeVarint32(r.length);for(let n of r)e(t,n);},le=e=>(t,r)=>{for(let[n,i]of e)try{i(t,r[n]);}catch(o){throw o.message=`${n}: ${o.message}`,o}},Re=e=>(t,r)=>{r!==void 0?(t.writeByte(1),e(t,r)):t.writeByte(0);},z=le([["weight_threshold",Z],["account_auths",Zt(_,pe)],["key_auths",Zt(ge,pe)]]),Ro=le([["account",_],["weight",pe]]),er=le([["base",I],["quote",I]]),Fo=le([["account_creation_fee",I],["maximum_block_size",Z],["hbd_interest_rate",pe]]),F=(e,t)=>{let r=le(t);return (n,i)=>{n.writeVarint32(e),r(n,i);}},C={};C.account_create=F(R.account_create,[["fee",I],["creator",_],["new_account_name",_],["owner",z],["active",z],["posting",z],["memo_key",ge],["json_metadata",_]]);C.account_create_with_delegation=F(R.account_create_with_delegation,[["fee",I],["delegation",I],["creator",_],["new_account_name",_],["owner",z],["active",z],["posting",z],["memo_key",ge],["json_metadata",_],["extensions",L(se)]]);C.account_update=F(R.account_update,[["account",_],["owner",Re(z)],["active",Re(z)],["posting",Re(z)],["memo_key",ge],["json_metadata",_]]);C.account_witness_proxy=F(R.account_witness_proxy,[["account",_],["proxy",_]]);C.account_witness_vote=F(R.account_witness_vote,[["account",_],["witness",_],["approve",he]]);C.cancel_transfer_from_savings=F(R.cancel_transfer_from_savings,[["from",_],["request_id",Z]]);C.change_recovery_account=F(R.change_recovery_account,[["account_to_recover",_],["new_recovery_account",_],["extensions",L(se)]]);C.claim_account=F(R.claim_account,[["creator",_],["fee",I],["extensions",L(se)]]);C.claim_reward_balance=F(R.claim_reward_balance,[["account",_],["reward_hive",I],["reward_hbd",I],["reward_vests",I]]);C.comment=F(R.comment,[["parent_author",_],["parent_permlink",_],["author",_],["permlink",_],["title",_],["body",_],["json_metadata",_]]);C.comment_options=F(R.comment_options,[["author",_],["permlink",_],["max_accepted_payout",I],["percent_hbd",pe],["allow_votes",he],["allow_curation_rewards",he],["extensions",L(cn([le([["beneficiaries",L(Ro)]])]))]]);C.convert=F(R.convert,[["owner",_],["requestid",Z],["amount",I]]);C.create_claimed_account=F(R.create_claimed_account,[["creator",_],["new_account_name",_],["owner",z],["active",z],["posting",z],["memo_key",ge],["json_metadata",_],["extensions",L(se)]]);C.custom=F(R.custom,[["required_auths",L(_)],["id",pe],["data",pn]]);C.custom_json=F(R.custom_json,[["required_auths",L(_)],["required_posting_auths",L(_)],["id",_],["json",_]]);C.decline_voting_rights=F(R.decline_voting_rights,[["account",_],["decline",he]]);C.delegate_vesting_shares=F(R.delegate_vesting_shares,[["delegator",_],["delegatee",_],["vesting_shares",I]]);C.delete_comment=F(R.delete_comment,[["author",_],["permlink",_]]);C.escrow_approve=F(R.escrow_approve,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Z],["approve",he]]);C.escrow_dispute=F(R.escrow_dispute,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Z]]);C.escrow_release=F(R.escrow_release,[["from",_],["to",_],["agent",_],["who",_],["receiver",_],["escrow_id",Z],["hbd_amount",I],["hive_amount",I]]);C.escrow_transfer=F(R.escrow_transfer,[["from",_],["to",_],["hbd_amount",I],["hive_amount",I],["escrow_id",Z],["agent",_],["fee",I],["json_meta",_],["ratification_deadline",xe],["escrow_expiration",xe]]);C.feed_publish=F(R.feed_publish,[["publisher",_],["exchange_rate",er]]);C.limit_order_cancel=F(R.limit_order_cancel,[["owner",_],["orderid",Z]]);C.limit_order_create=F(R.limit_order_create,[["owner",_],["orderid",Z],["amount_to_sell",I],["min_to_receive",I],["fill_or_kill",he],["expiration",xe]]);C.limit_order_create2=F(R.limit_order_create2,[["owner",_],["orderid",Z],["amount_to_sell",I],["exchange_rate",er],["fill_or_kill",he],["expiration",xe]]);C.recover_account=F(R.recover_account,[["account_to_recover",_],["new_owner_authority",z],["recent_owner_authority",z],["extensions",L(se)]]);C.request_account_recovery=F(R.request_account_recovery,[["recovery_account",_],["account_to_recover",_],["new_owner_authority",z],["extensions",L(se)]]);C.reset_account=F(R.reset_account,[["reset_account",_],["account_to_reset",_],["new_owner_authority",z]]);C.set_reset_account=F(R.set_reset_account,[["account",_],["current_reset_account",_],["reset_account",_]]);C.set_withdraw_vesting_route=F(R.set_withdraw_vesting_route,[["from_account",_],["to_account",_],["percent",pe],["auto_vest",he]]);C.transfer=F(R.transfer,[["from",_],["to",_],["amount",I],["memo",_]]);C.transfer_from_savings=F(R.transfer_from_savings,[["from",_],["request_id",Z],["to",_],["amount",I],["memo",_]]);C.transfer_to_savings=F(R.transfer_to_savings,[["from",_],["to",_],["amount",I],["memo",_]]);C.transfer_to_vesting=F(R.transfer_to_vesting,[["from",_],["to",_],["amount",I]]);C.vote=F(R.vote,[["voter",_],["author",_],["permlink",_],["weight",To]]);C.withdraw_vesting=F(R.withdraw_vesting,[["account",_],["vesting_shares",I]]);C.witness_update=F(R.witness_update,[["owner",_],["url",_],["block_signing_key",ge],["props",Fo],["fee",I]]);C.witness_set_properties=F(R.witness_set_properties,[["owner",_],["props",Zt(_,pn)],["extensions",L(se)]]);C.account_update2=F(R.account_update2,[["account",_],["owner",Re(z)],["active",Re(z)],["posting",Re(z)],["memo_key",Re(ge)],["json_metadata",_],["posting_json_metadata",_],["extensions",L(se)]]);C.create_proposal=F(R.create_proposal,[["creator",_],["receiver",_],["start_date",xe],["end_date",xe],["daily_pay",I],["subject",_],["permlink",_],["extensions",L(se)]]);C.update_proposal_votes=F(R.update_proposal_votes,[["voter",_],["proposal_ids",L(sn)],["approve",he],["extensions",L(se)]]);C.remove_proposal=F(R.remove_proposal,[["proposal_owner",_],["proposal_ids",L(sn)],["extensions",L(se)]]);var qo=le([["end_date",xe]]);C.update_proposal=F(R.update_proposal,[["proposal_id",an],["creator",_],["daily_pay",I],["subject",_],["permlink",_],["extensions",L(cn([se,qo]))]]);C.collateralized_convert=F(R.collateralized_convert,[["owner",_],["requestid",Z],["amount",I]]);C.recurrent_transfer=F(R.recurrent_transfer,[["from",_],["to",_],["amount",I],["memo",_],["recurrence",pe],["executions",pe],["extensions",L(le([["type",on],["value",le([["pair_id",on]])]]))]]);var Io=(e,t)=>{let r=C[t[0]];if(!r)throw new Error(`No serializer for operation: ${t[0]}`);try{r(e,t[1]);}catch(n){throw n.message=`${t[0]}: ${n.message}`,n}},Do=le([["ref_block_num",pe],["ref_block_prefix",Z],["expiration",xe],["operations",L(Io)],["extensions",L(_)]]),Ko=le([["from",ge],["to",ge],["nonce",an],["check",Z],["encrypted",un()]]),de={Asset:I,Memo:Ko,Price:er,PublicKey:ge,String:_,Transaction:Do,UInt16:pe,UInt32:Z};var Ze=e=>new Promise(t=>setTimeout(t,e));var Bo=(()=>{try{return !(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof process<"u"&&process.versions!=null&&process.versions.node!=null}catch{return false}})();function mn(){return Bo?{"User-Agent":E.userAgent}:{}}var ee=class extends Error{constructor(r){super(r.message);A(this,"name","RPCError");A(this,"data");A(this,"code");A(this,"stack");this.code=r.code,"data"in r&&(this.data=r.data);}},Fe=class extends Error{constructor(r,n,i={}){super(n);A(this,"node");A(this,"rateLimitMs");A(this,"isRateLimit");this.node=r,this.rateLimitMs=i.rateLimitMs??0,this.isRateLimit=i.isRateLimit??false;}};function gn(e){if(!e)return 0;let t=Number(e);if(Number.isFinite(t))return t>0?t*1e3:0;let r=Date.parse(e);if(Number.isFinite(r)){let n=r-Date.now();return n>0?n:0}return 0}var Mo=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],No=["Failed to fetch","NetworkError when attempting to fetch","Load failed","fetch failed"];function Qo(e){if(!e)return "";let t=[String(e.name||""),String(e.message||""),String(e.code||"")],r=e.cause;for(let n=0;r&&n<5;n++)t.push(String(r.code||""),String(r.message||"")),r=r.cause;return t.join(" ")}function Ho(e){if(!e)return false;if(e instanceof Fe)return true;if(e instanceof ee)return false;let t=Qo(e);return !!(Mo.some(r=>t.includes(r))||No.some(r=>t.includes(r))||e instanceof SyntaxError||/Unexpected token|JSON\.parse|Unexpected end of JSON/i.test(t))}function tr(e,t){return !!(e===-32603||e<=-32e3&&e>=-32099||e===-32601||e===-32602&&/unable to parse|endpoint data|internal/i.test(t))}function yn(e){let t=e.indexOf(".");return t>0?e.slice(0,t):e}var Uo=1e4,Vo=6e4,jo=12e4,ln=2,dn=6e4,fn=12e4,Lo=30,et=.3,rr=3,tt=5*6e4,hn=6e4,wn=1e3,_n=2e3,At=class{constructor(){A(this,"health",new Map);}getOrCreate(t){let r=this.health.get(t);return r||(r={consecutiveFailures:0,lastFailureTime:0,rateLimitedUntil:0,rateLimitStreak:0,lastRateLimitAt:0,apiFailures:new Map,headBlock:0,headBlockUpdatedAt:0,ewmaLatencyMs:void 0,latencySampleCount:0,latencyUpdatedAt:0,lastProbeAt:Date.now(),apiLatency:new Map},this.health.set(t,r)),r}recordSuccess(t,r,n,i){let o=this.getOrCreate(t);if(o.consecutiveFailures=0,o.rateLimitStreak=0,r){let s=o.apiFailures.get(r);(!s||!(s.defective&&s.cooldownUntil>Date.now()))&&o.apiFailures.delete(r);}typeof n=="number"&&Number.isFinite(n)&&n>=0&&this.recordLatency(o,n,i??r);}recordSlowFailure(t,r,n){!Number.isFinite(r)||r<_n||this.recordLatency(this.getOrCreate(t),r,n);}getUsableLatencyMs(t,r){let n=this.health.get(t);if(!n)return;let i=Date.now();if(r!==void 0){let o=n.apiLatency.get(r);return o&&o.sampleCount>=rr&&i-o.updatedAt<=tt?o.ewmaMs:void 0}return this.isLatencyUsable(n,i)?n.ewmaLatencyMs:void 0}recordCensoredLatency(t,r,n){!Number.isFinite(r)||r<50||this.recordLatency(this.getOrCreate(t),r,n);}recordLatency(t,r,n){let i=Date.now();if(t.latencyUpdatedAt>0&&i-t.latencyUpdatedAt>tt&&(t.ewmaLatencyMs=void 0,t.latencySampleCount=0,t.apiLatency.clear()),t.ewmaLatencyMs=t.ewmaLatencyMs===void 0?r:et*r+(1-et)*t.ewmaLatencyMs,t.latencySampleCount++,t.latencyUpdatedAt=i,n!==void 0){let o=t.apiLatency.get(n);!o||i-o.updatedAt>tt?t.apiLatency.set(n,{ewmaMs:r,sampleCount:1,updatedAt:i}):(o.ewmaMs=et*r+(1-et)*o.ewmaMs,o.sampleCount++,o.updatedAt=i);}}recordFailure(t,r){let n=this.getOrCreate(t);if(r){let i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};(o.cooldownUntil>0&&o.cooldownUntil<=i||o.lastFailureTime>0&&i-o.lastFailureTime>3e4)&&(o.count=0,o.cooldownUntil=0),o.count++,o.lastFailureTime=i,o.count>=ln&&(o.cooldownUntil=i+dn),n.apiFailures.set(r,o);}else n.consecutiveFailures++,n.lastFailureTime=Date.now();}recordDefectiveResponse(t,r){let n=this.getOrCreate(t),i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};o.count=Math.max(o.count+1,ln),o.lastFailureTime=i,o.cooldownUntil=i+dn,o.defective=true,n.apiFailures.set(r,o);}recordRateLimit(t,r){let n=this.getOrCreate(t),i=Date.now();n.rateLimitStreak>0&&i-n.lastRateLimitAt>jo&&(n.rateLimitStreak=0);let o=typeof r=="number"&&Number.isFinite(r)&&r>0,s=o?r:Math.min(Uo*2**n.rateLimitStreak,Vo);o||n.rateLimitStreak++,n.lastRateLimitAt=i,n.rateLimitedUntil=o?i+s:Math.max(n.rateLimitedUntil,i+s),n.consecutiveFailures++,n.lastFailureTime=i;}recordHeadBlock(t,r){if(!r||!Number.isFinite(r))return;let n=this.getOrCreate(t);n.headBlock=r,n.headBlockUpdatedAt=Date.now();}consensusHeadBlock(){let t=Date.now(),r=[];for(let n of this.health.values())n.headBlock>0&&t-n.headBlockUpdatedAt<=fn&&r.push(n.headBlock);return r.length<2?0:(r.sort((n,i)=>n-i),r[Math.floor((r.length-1)/2)])}isNodeHealthy(t,r){let n=this.health.get(t);if(!n)return true;let i=Date.now();if(n.rateLimitedUntil>i||n.consecutiveFailures>=3&&i-n.lastFailureTime<3e4)return false;if(r){let s=n.apiFailures.get(r);if(s&&s.cooldownUntil>i)return false}let o=this.consensusHeadBlock();return !(o>0&&n.headBlock>0&&i-n.headBlockUpdatedAt<=fn&&o-n.headBlock>Lo)}getOrderedNodes(t,r){let n=[],i=[];for(let u of t)this.isNodeHealthy(u,r)?n.push(u):i.push(u);if(n.length<=1)return [...n,...i];let o=Date.now(),s=n.map((u,p)=>({node:u,i:p,score:this.scoreNode(u,o)})).sort((u,p)=>u.score-p.score||u.i-p.i).map(u=>u.node),a=this.pickReprobeCandidate(n,o);return a&&s[0]!==a?[a,...s.filter(u=>u!==a),...i]:[...s,...i]}isLatencyUsable(t,r){return !!t&&t.ewmaLatencyMs!==void 0&&t.latencySampleCount>=rr&&r-t.latencyUpdatedAt<=tt}scoreNode(t,r){let n=this.health.get(t);return this.isLatencyUsable(n,r)?n.ewmaLatencyMs:wn}pickReprobeCandidate(t,r){let n=r-hn,i,o=1/0;for(let s of t){let a=this.getOrCreate(s),u=Math.max(a.latencyUpdatedAt,a.lastProbeAt);u<=n&&u=1-1e-9?(this.tokens-=1,true):false}refill(){this.clamp(),this.tokens=Math.min(E.resilience.hedgeBucketCapacity,this.tokens+E.resilience.hedgeRefillPerSuccess);}clamp(){this.tokens>E.resilience.hedgeBucketCapacity&&(this.tokens=E.resilience.hedgeBucketCapacity);}get available(){return this.tokens}reset(t=E.resilience.hedgeBucketCapacity){this.tokens=t;}},ir=new nr;function Pt(e,t,r,n,i){let o=E.resilience;if(!o.adaptiveTimeout||i)return n;let s=e.getUsableLatencyMs(t,r);return s===void 0?n:Math.ceil(Math.min(n,Math.max(o.adaptiveTimeoutFloorMs,o.adaptiveTimeoutFactor*s)))}function or(e,t,r,n){r instanceof Fe?r.isRateLimit?e.recordRateLimit(t,r.rateLimitMs||void 0):e.recordFailure(t,n):r instanceof ee?e.recordFailure(t,n):e.recordFailure(t);}function bn(e,t,r,n){if(!n||typeof n!="object"||!r.includes("get_dynamic_global_properties"))return;let i=n.head_block_number;typeof i=="number"&&e.recordHeadBlock(t,i);}function $o(){if(typeof DOMException<"u")return new DOMException("The operation was aborted due to timeout","TimeoutError");let e=new Error("The operation was aborted due to timeout");return e.name="TimeoutError",e}function vn(e){if(e=Math.ceil(e),typeof AbortSignal.timeout=="function")return {signal:AbortSignal.timeout(e),cleanup:()=>{}};let t=new AbortController,r=setTimeout(()=>t.abort($o()),e);return {signal:t.signal,cleanup:()=>clearTimeout(r)}}function sr(e,t){if(!t)return {signal:e,cleanup:()=>{}};if(typeof AbortSignal.any=="function")return {signal:AbortSignal.any([e,t]),cleanup:()=>{}};let r=new AbortController;if(e.aborted)return r.abort(e.reason),{signal:r.signal,cleanup:()=>{}};if(t.aborted)return r.abort(t.reason),{signal:r.signal,cleanup:()=>{}};let n=()=>r.abort(e.reason),i=()=>r.abort(t.reason);e.addEventListener("abort",n,{once:true}),t.addEventListener("abort",i,{once:true});let o=()=>{e.removeEventListener("abort",n),t.removeEventListener("abort",i);};return {signal:r.signal,cleanup:o}}var rt=async(e,t,r,n=E.timeout,i=false,o)=>{let s=Math.floor(Math.random()*1e8),a={jsonrpc:"2.0",method:t,params:r,id:s},{signal:u,cleanup:p}=vn(n),{signal:l,cleanup:f}=sr(u,o),m=()=>{p(),f();};try{let y=await fetch(e,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",...mn()},signal:l});if(y.status===429)throw new Fe(e,"HTTP 429 Rate Limited",{rateLimitMs:gn(y.headers.get("Retry-After")),isRateLimit:!0});if(y.status>=500&&y.status<600)throw new Fe(e,`HTTP ${y.status} from ${e}`);let h=await y.json();if(!h||typeof h.id>"u"||h.id!==s||h.jsonrpc!=="2.0")throw new Error("JSONRPC id mismatch");if("result"in h)return h.result;if("error"in h){let S=h.error;throw "message"in S&&"code"in S?new ee(S):h.error}throw h}catch(y){if(y instanceof ee||y instanceof Fe||o?.aborted)throw y;if(i)return rt(e,t,r,n,false,o);throw y}finally{m();}};function vt(){return Ze(50+Math.random()*50)}function Wo(e){let{method:t,params:r,api:n,primary:i,hedgePool:o,callerTimeout:s,explicitTimeout:a,deadlineAt:u,externalSignal:p,onHedgeFired:l,validate:f}=e;return new Promise((m,y)=>{let h=false,S=0,x=false,P=false,O,W,V=0,M=[],H=Y=>{if(!h){h=true,W!==void 0&&(clearTimeout(W),W=void 0);for(let q of M)q.signal.aborted||q.abort();Y();}},G=(Y,q)=>{S++;let me=new AbortController;M.push(me);let Xe=sr(me.signal,p),Po=Pt($,Y,t,s,a),$t=Date.now();q||(V=$t),rt(Y,t,r,Po,false,Xe.signal).then(oe=>{if(Xe.cleanup(),S--,q||(P=true),!h){if(f&&!f(oe)){if($.recordDefectiveResponse(Y,n),O=new Error(`[hive-tx] response validation failed for ${t} from ${Y}`),!q&&!x){H(()=>y(O));return}S===0&&H(()=>y(O));return}$.recordSuccess(Y,n,Date.now()-$t,t),bn($,Y,t,oe),q?P||$.recordCensoredLatency(i,Date.now()-V,t):x||ir.refill(),H(()=>m(oe));}}).catch(oe=>{if(Xe.cleanup(),S--,q||(P=true),!h){if(p?.aborted){H(()=>y(oe));return}if(oe instanceof ee&&!tr(oe.code,oe.message)){H(()=>y(oe));return}if(or($,Y,oe,n),$.recordSlowFailure(Y,Date.now()-$t,t),O=oe,!q&&!x){H(()=>y(oe));return}S===0&&H(()=>y(O));}});};G(i,false);let Te=$.getUsableLatencyMs(i,t)??0,Ye=Pt($,i,t,s,a),Lt=Math.min(Math.max(E.resilience.hedgeDelayFloorMs,E.resilience.hedgeDelayFactor*Te),.8*Ye);W=setTimeout(()=>{if(W=void 0,h||p?.aborted||Date.now()>=u)return;let Y=o.filter(me=>$.isNodeHealthy(me,n));if(Y.length===0)return;let q=Y[Math.floor(Math.random()*Y.length)];ir.trySpend()&&(x=true,l(q),G(q,true));},Lt);})}var g=async(e,t=[],r,n=E.retry,i,o)=>{if(!Array.isArray(E.nodes))throw new Error("config.nodes is not an array");if(E.nodes.length===0)throw new Error("config.nodes is empty");let s=r!==void 0,a=r??E.timeout,u=yn(e),p=Date.now()+E.resilience.totalBudgetFactor*a,l=new Set,f;for(let m=0;m<=n&&!(m>0&&Date.now()>=p);m++){let y=$.getOrderedNodes(E.nodes,u),h=y.find(P=>!l.has(P));h||(l.clear(),h=y[0]),l.add(h);let S=[];if(E.resilience.hedge&&$.getUsableLatencyMs(h,e)!==void 0&&(S=y.filter(P=>!l.has(P)&&$.isNodeHealthy(P,u)).slice(0,3)),S.length>0)try{return await Wo({method:e,params:t,api:u,primary:h,hedgePool:S,callerTimeout:a,explicitTimeout:s,deadlineAt:p,externalSignal:i,onHedgeFired:P=>l.add(P),validate:o})}catch(P){if(P instanceof ee&&!tr(P.code,P.message)||i?.aborted)throw P;f=P,m{if(!Array.isArray(E.nodes))throw new Error("config.nodes is not an array");if(E.nodes.length===0)throw new Error("config.nodes is empty");let i=yn(e),o=new Set,s;for(let a=0;a!o.has(l));if(!p)break;if(o.add(p),n?.aborted)throw new Error("Aborted");try{let l=await rt(p,e,t,r,!1,n);return $.recordSuccess(p,i),l}catch(l){if(l instanceof ee||n?.aborted||(or($,p,l,i),s=l,!Ho(l)))throw l}}throw s},Go={balance:"/balance-api",hafah:"/hafah-api",hafbe:"/hafbe-api",hivemind:"/hivemind-api",hivesense:"/hivesense-api",reputation:"/reputation-api","nft-tracker":"/nft-tracker-api",hafsql:"/hafsql",status:"/status-api"};async function re(e,t,r,n,i=E.retry,o){if(!Array.isArray(E.restNodes))throw new Error("config.restNodes is not an array");if(E.restNodes.length===0)throw new Error("config.restNodes is empty");let s=n!==void 0,a=n??E.timeout,u=Date.now()+E.resilience.totalBudgetFactor*a,p=`${e}:${t}`,l=E.restNodesByApi?.[e]?.length?E.restNodesByApi[e]:E.restNodes,f=new Set,m,y=false;for(let h=0;h<=i&&!(h>0&&Date.now()>=u);h++){let S=Ee.getOrderedNodes(l,e),x=S.find(q=>!f.has(q));x||(f.clear(),x=S[0]),f.add(x);let P=x+Go[e],O=t,W=r||{},V=new Set;Object.entries(W).forEach(([q,me])=>{O.includes(`{${q}}`)&&(O=O.replace(`{${q}}`,encodeURIComponent(String(me))),V.add(q));});let M=new URL(P+O);if(Object.entries(W).forEach(([q,me])=>{V.has(q)||(Array.isArray(me)?me.forEach(Xe=>M.searchParams.append(q,String(Xe))):M.searchParams.set(q,String(me)));}),o?.aborted)throw new Error("Aborted");y=false;let{signal:H,cleanup:G}=vn(Pt(Ee,x,p,a,s)),{signal:Te,cleanup:Ye}=sr(H,o),Lt=()=>{G(),Ye();},Y=Date.now();try{let q=await fetch(M.toString(),{signal:Te,headers:mn()});if(q.status===404)throw new Error("HTTP 404 - Hint: can happen on wrong params");if(q.status===429)throw Ee.recordRateLimit(x,gn(q.headers.get("Retry-After"))||void 0),y=!0,new Error(`HTTP 429 Rate Limited by ${x}`);if(q.status===503)throw Ee.recordFailure(x,e),y=!0,new Error(`HTTP 503 Service Unavailable from ${x}`);if(!q.ok)throw Ee.recordFailure(x,e),y=!0,new Error(`HTTP ${q.status} from ${x}`);return Ee.recordSuccess(x,e,Date.now()-Y,p),q.json()}catch(q){if(q?.message?.includes("HTTP 404")||o?.aborted)throw q;y||Ee.recordFailure(x,e),Ee.recordSlowFailure(x,Date.now()-Y,p),m=q,h{if(!Array.isArray(E.nodes))throw new Error("config.nodes is not an Array");if(r>E.nodes.length)throw new Error("quorum > config.nodes.length");let o=(u=>{let p=[...u];for(let l=p.length-1;l>0;l--){let f=Math.floor(Math.random()*(l+1));[p[l],p[f]]=[p[f],p[l]];}return p})(E.nodes),s=Math.min(r,o.length),a=[];for(;s>0&&o.length>0;){let u=o.splice(0,s),p=[],l=[];for(let m=0;ml.push(y)).catch(()=>{}));await Promise.all(p),a.push(...l);let f=zo(a,r);if(f)return f;if(s=Math.min(r,o.length),s===0)throw new Error("No more nodes available.")}throw new Error("Couldn't reach quorum.")};function zo(e,t){let r=new Map;for(let i of e){let o=JSON.stringify(i);r.has(o)||r.set(o,[]),r.get(o).push(i);}let n=Array.from(r.values()).find(i=>i.length>=t);return n?n[0]:null}var Yo=hexToBytes(E.chain_id),qe=class e{constructor(t){A(this,"transaction");A(this,"expiration",6e4);A(this,"txId");A(this,"createTransaction",async t=>{let r=await g("condenser_api.get_dynamic_global_properties",[]),n=hexToBytes(r.head_block_id),i=Number(new Uint32Array(n.buffer,n.byteOffset+4,1)[0]),o=new Date(Date.now()+t).toISOString().slice(0,-5);this.transaction={expiration:o,extensions:[],operations:[],ref_block_num:r.head_block_number&65535,ref_block_prefix:i,signatures:[]};});t?.transaction&&(t.transaction instanceof e?(this.transaction=t.transaction.transaction,this.expiration=t.transaction.expiration):this.transaction=t.transaction,this.transaction&&!Array.isArray(this.transaction.signatures)&&(this.transaction.signatures=[]),this.txId=this.digest().txId),t?.expiration&&(this.expiration=t.expiration);}async addOperation(t,r){this.transaction||await this.createTransaction(this.expiration),this.transaction.operations.push([t,r]);}sign(t){if(!this.transaction)throw new Error("First create a transaction by .addOperation()");if(this.transaction){let{digest:r,txId:n}=this.digest();Array.isArray(t)||(t=[t]);for(let i of t){let o=i.sign(r);this.transaction.signatures.push(o.customToString());}return this.txId=n,this.transaction}else throw new Error("No transaction to sign")}async broadcast(t=false){if(!this.transaction)throw new Error("Attempted to broadcast an empty transaction. Add operations by .addOperation()");if(this.transaction.signatures.length===0)throw new Error("Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)");try{await Ue("condenser_api.broadcast_transaction",[this.transaction]);}catch(o){if(!(o instanceof ee&&o.message.includes("Duplicate transaction check failed")))throw o}if(this.txId||(this.txId=this.digest().txId),!t)return {tx_id:this.txId,status:"unknown"};let r=60;await Ze(1e3);let n=await this.checkStatus(),i=1;for(;n?.status!=="within_irreversible_block"&&n?.status!=="expired_irreversible"&&n?.status!=="too_old"&&i>6,128|o&63);else if(o>=55296&&o<=56319&&i+1>18,128|o>>12&63,128|o>>6&63,128|o&63);}else n.push(224|o>>12,128|o>>6&63,128|o&63);}t=new Uint8Array(n);}return new e(sha256(t))}static fromLogin(t,r,n="active"){let i=t+n+r;return e.fromSeed(i)}sign(t){let r=secp256k1.sign(t,this.key,{extraEntropy:true,format:"recovered",prehash:false}),n=parseInt(bytesToHex(r.subarray(0,1)),16);return Oe.from((n+31).toString(16)+bytesToHex(r.subarray(1)))}createPublic(t){return new X(secp256k1.getPublicKey(this.key),t)}toString(){return es(new Uint8Array([...Sn,...this.key]))}inspect(){let t=this.toString();return `PrivateKey: ${t.slice(0,6)}...${t.slice(-6)}`}getSharedSecret(t){let r=secp256k1.getSharedSecret(this.key,t.key);return sha512(r.subarray(1))}static randomKey(){return new e(secp256k1.keygen().secretKey)}},kn=e=>sha256(sha256(e)),es=e=>{let t=kn(e);return nn.encode(new Uint8Array([...e,...t.slice(0,4)]))},ts=e=>{let t=nn.decode(e);if(!xn(t.slice(0,1),Sn))throw new Error("Private key network id mismatch");let r=t.slice(-4),n=t.slice(0,-4),i=kn(n).slice(0,4);if(!xn(r,i))throw new Error("Private key checksum mismatch");return n},xn=(e,t)=>{if(e===t)return true;if(e.byteLength!==t.byteLength)return false;let r=e.byteLength,n=0;for(;nFn(e,t,n,r),Rn=(e,t,r,n,i)=>Fn(e,t,r,n,i).message,Fn=(e,t,r,n,i)=>{let o=r,s=e.getSharedSecret(t),a=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);a.writeUint64(o),a.append(s),a.flip();let u=sha512(new Uint8Array(a.toBuffer())),p=u.subarray(32,48),l=u.subarray(0,32),f=sha256(u).subarray(0,4),m=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);m.append(f),m.flip();let y=m.readUint32();if(i!==void 0){if(y!==i)throw new Error("Invalid key");n=os(n,l,p);}else n=ss(n,l,p);return {nonce:o,message:n,checksum:y}},os=(e,t,r)=>{let n=e;return n=cbc(t,r).decrypt(n),n},ss=(e,t,r)=>{let n=e;return n=cbc(t,r).encrypt(n),n},cr=null,as=()=>{if(cr===null){let r=secp256k1.utils.randomSecretKey();cr=r[0]<<8|r[1];}let e=BigInt(Date.now()),t=++cr%65536;return e=e<{let t=fs(e,33);return new X(t)},us=e=>e.readUint64(),ps=e=>e.readUint32(),ls=e=>{let t=e.readVarint32(),r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())},ds=e=>t=>{let r={},n=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);n.append(t),n.flip();for(let[i,o]of e)try{r[i]=o(n);}catch(s){throw s.message=`${i}: ${s.message}`,s}return r};function fs(e,t){if(e){let r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())}else throw Error("No buffer found on first parameter")}var ms=ds([["from",qn],["to",qn],["nonce",us],["check",ps],["encrypted",ls]]),In={Memo:ms};var Kn=(e,t,r,n)=>{if(!r.startsWith("#"))return r;r=r.substring(1),Mn(),e=Nn(e),t=gs(t);let i=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);i.writeVString(r);let o=new Uint8Array(i.copy(0,i.offset).toBuffer()),{nonce:s,message:a,checksum:u}=Tn(e,t,o,n),p=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);de.Memo(p,{check:u,encrypted:a,from:e.createPublic(),nonce:s,to:t}),p.flip();let l=new Uint8Array(p.toBuffer());return "#"+nn.encode(l)},Bn=(e,t)=>{if(!t.startsWith("#"))return t;t=t.substring(1),Mn(),e=Nn(e);let r=In.Memo(nn.decode(t)),{from:n,to:i,nonce:o,check:s,encrypted:a}=r,p=e.createPublic().toString()===new X(n.key).toString()?new X(i.key):new X(n.key);r=Rn(e,p,o,a,s);let l=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);return l.append(r),l.flip(),"#"+l.readVString()},xt,Mn=()=>{if(xt===void 0){let e;xt=true;try{let t="5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw",n=Kn(t,"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA","#memo\u7231");e=Bn(t,n);}finally{xt=e==="#memo\u7231";}}if(xt===false)throw new Error("This environment does not support encryption.")},Nn=e=>typeof e=="string"?U.fromString(e):e,gs=e=>typeof e=="string"?X.fromString(e):e,Qn={decode:Bn,encode:Kn};var ie={};gt(ie,{buildWitnessSetProperties:()=>vs,makeBitMaskFilter:()=>_s,operations:()=>ws,validateUsername:()=>hs});var hs=e=>{let t="Account name should ";if(!e)return t+"not be empty.";let r=e.length;if(r<3)return t+"be longer.";if(r>16)return t+"be shorter.";/\./.test(e)&&(t="Each account segment should ");let n=e.split("."),i=n.length;for(let o=0;oe.reduce(bs,[BigInt(0),BigInt(0)]).map(t=>t!==BigInt(0)?t.toString():null),bs=([e,t],r)=>r<64?[e|BigInt(1)<{let r={extensions:[],owner:e,props:[]};for(let n of Object.keys(t)){if(t[n]===void 0)continue;let i;switch(n){case "key":case "new_signing_key":i=de.PublicKey;break;case "account_subsidy_budget":case "account_subsidy_decay":case "maximum_block_size":i=de.UInt32;break;case "hbd_interest_rate":i=de.UInt16;break;case "url":i=de.String;break;case "hbd_exchange_rate":i=de.Price;break;case "account_creation_fee":i=de.Asset;break;default:throw new Error(`Unknown witness prop: ${n}`)}r.props.push([n,As(i,t[n])]);}return r.props.sort((n,i)=>n[0].localeCompare(i[0])),["witness_set_properties",r]},As=(e,t)=>{let r=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);return e(r,t),r.flip(),bytesToHex(new Uint8Array(r.toBuffer()))};function dm(e){let t;if(typeof e=="string"){let r=[];for(let n=0;n>6,128|i&63);else if(i>=55296&&i<=56319&&n+1>18,128|i>>12&63,128|i>>6&63,128|i&63);}else r.push(224|i>>12,128|i>>6&63,128|i&63);}t=new Uint8Array(r);}else t=e;return sha256(t)}function Hn(e){try{return U.fromString(e),!0}catch{return false}}async function te(e,t){let r=new qe;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),Ue("condenser_api.broadcast_transaction_synchronous",[r.transaction])}async function Un(e,t){let r=new qe;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),r.broadcast(false)}var Os=432e3;function Vn(e,t){let r=Date.now()/1e3-t.last_update_time,n=Number(t.current_mana)+r*e/Os,i=Math.round(n/e*1e4);return !isFinite(i)||i<0?i=0:i>1e4&&(i=1e4),{current_mana:n,max_mana:e,percentage:i}}function xs(e){let t=parseFloat(e.vesting_shares),r=parseFloat(e.delegated_vesting_shares),n=parseFloat(e.received_vesting_shares),i=parseFloat(e.vesting_withdraw_rate),o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t-s-r+n}function ur(e){let t=xs(e)*1e6;return Vn(t,e.voting_manabar)}function Et(e){return Vn(Number(e.max_rc),e.rc_manabar)}var jn=(u=>(u.COMMON="common",u.INFO="info",u.INSUFFICIENT_RESOURCE_CREDITS="insufficient_resource_credits",u.MISSING_AUTHORITY="missing_authority",u.TOKEN_EXPIRED="token_expired",u.NETWORK="network",u.TIMEOUT="timeout",u.VALIDATION="validation",u))(jn||{});function Ve(e){let t=e?.error_description?String(e.error_description):"",r=e?.message?String(e.message):"",n=e?.error?String(e.error):"",i=t||r||String(e||""),o=a=>!!(n&&a.test(n)||t&&a.test(t)||r&&a.test(r)||i&&a.test(i));if(o(/please wait to transact/i)||o(/insufficient rc/i)||o(/rc mana|rc account|resource credits/i))return {message:"Insufficient Resource Credits. Please wait or power up.",type:"insufficient_resource_credits",originalError:e};if(o(/you may only post once every/i))return {message:"Please wait before posting again (minimum 3 second interval between comments).",type:"common",originalError:e};if(o(/your current vote on this comment is identical/i))return {message:"You have already voted with the same weight.",type:"info",originalError:e};if(o(/must claim something/i))return {message:"You must claim rewards before performing this action.",type:"info",originalError:e};if(o(/cannot claim that much vests/i))return {message:"Cannot claim that amount. Please check your pending rewards.",type:"info",originalError:e};if(o(/cannot delete a comment with net positive/i))return {message:"Cannot delete a comment with positive votes.",type:"info",originalError:e};if(o(/children == 0/i))return {message:"Cannot delete a comment with replies.",type:"common",originalError:e};if(o(/comment_cashout/i))return {message:"Cannot modify a comment that has already been paid out.",type:"common",originalError:e};if(o(/votes evaluating for comment that is paid out is forbidden/i))return {message:"Cannot vote on posts that have already been paid out.",type:"common",originalError:e};if(o(/no (active|owner|posting|memo) key available/i))return {message:"Key not available. Please provide your key to sign this operation.",type:"missing_authority",originalError:e};if(o(/missing (required )?active authority/i))return {message:"Missing active authority. This operation requires your active key.",type:"missing_authority",originalError:e};if(o(/missing (required )?owner authority/i))return {message:"Missing owner authority. This operation requires your owner key.",type:"missing_authority",originalError:e};if(o(/missing (required )?posting authority/i))return {message:"Missing posting authority. Please check your login method.",type:"missing_authority",originalError:e};if(n==="invalid_grant"||n==="unauthorized_access"||o(/token expired/i)||o(/invalid token/i)||o(/\bunauthorized\b/i)||o(/\bforbidden\b/i))return {message:"Authentication token expired. Please log in again.",type:"token_expired",originalError:e};if(o(/has already reblogged/i)||o(/already reblogged this post/i))return {message:"You have already reblogged this post.",type:"info",originalError:e};if(o(/duplicate transaction/i))return {message:"This transaction has already been processed.",type:"info",originalError:e};if(o(/econnrefused/i)||o(/connection refused/i)||o(/failed to fetch/i)||o(/\bnetwork[-\s]?(request|error|timeout|unreachable|down|failed)\b/i))return {message:"Network error. Please check your connection and try again.",type:"network",originalError:e};if(o(/timeout/i)||o(/timed out/i))return {message:"Request timed out. Please try again.",type:"timeout",originalError:e};if(o(/account.*does not exist/i)||o(/account not found/i))return {message:"Account not found. Please check the username.",type:"validation",originalError:e};if(o(/invalid memo key/i))return {message:"Invalid memo key. Cannot encrypt message.",type:"validation",originalError:e};if(o(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i))return {message:"Insufficient funds for this transaction.",type:"validation",originalError:e};if(o(/\b(invalid|validation)\b/i))return {message:(e?.message||i).substring(0,150)||"Validation error occurred",type:"validation",originalError:e};if(e?.error_description&&typeof e.error_description=="string")return {message:e.error_description.substring(0,150),type:"common",originalError:e};if(e?.message&&typeof e.message=="string")return {message:e.message.substring(0,150),type:"common",originalError:e};let s;return typeof e=="object"&&e!==null?e.error_description?s=String(e.error_description):e.code?s=`Error code: ${e.code}`:i&&i!=="[object Object]"?s=i.substring(0,150):s="Unknown error occurred":s=i.substring(0,150)||"Unknown error occurred",{message:s,type:"common",originalError:e}}function Es(e){let t=Ve(e);return [t.message,t.type]}function we(e){let{type:t}=Ve(e);return t==="missing_authority"||t==="token_expired"}function Ss(e){let{type:t}=Ve(e);return t==="insufficient_resource_credits"}function ks(e){let{type:t}=Ve(e);return t==="info"}function Cs(e){let{type:t}=Ve(e);return t==="network"||t==="timeout"}async function _e(e,t,r,n,i="posting",o,s,a="async"){let u=n?.adapter;switch(e){case "key":{if(!u)throw new Error("No adapter provided for key-based auth");let p=o;if(p===void 0)switch(i){case "owner":if(u.getOwnerKey)p=await u.getOwnerKey(t);else throw new Error("Owner key not supported by adapter. Owner operations (like account recovery) require master password login or manual key entry.");break;case "active":u.getActiveKey&&(p=await u.getActiveKey(t));break;case "memo":if(u.getMemoKey)p=await u.getMemoKey(t);else throw new Error("Memo key not supported by adapter. Use memo encryption methods instead.");break;default:p=await u.getPostingKey(t);break}if(!p)throw new Error(`No ${i} key available for ${t}`);let l=U.fromString(p);return a==="async"?await Un(r,l):await te(r,l)}case "hiveauth":{if(!u?.broadcastWithHiveAuth)throw new Error("HiveAuth not supported by adapter");return await u.broadcastWithHiveAuth(t,r,i)}case "hivesigner":{if(!u)throw new Error("No adapter provided for HiveSigner auth");if(i!=="posting"){if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`HiveSigner access token cannot sign ${i} operations. No platform broadcast available.`)}let p=s!==void 0?s:await u.getAccessToken(t);if(p)try{return (await new Ln.Client({accessToken:p}).broadcast(r)).result}catch(l){if(u.broadcastWithHiveSigner&&we(l))return await u.broadcastWithHiveSigner(t,r,i);throw l}if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`No access token available for ${t}`)}case "keychain":{if(!u?.broadcastWithKeychain)throw new Error("Keychain not supported by adapter");return await u.broadcastWithKeychain(t,r,i)}case "custom":{if(!n?.broadcast)throw new Error("No custom broadcast function provided");return await n.broadcast(r,i)}default:throw new Error(`Unknown auth method: ${e}`)}}async function Rs(e,t,r,n="posting",i="async"){let o=r?.adapter;if(o?.getLoginType){let l=await o.getLoginType(e,n);if(l){let f=o.hasPostingAuthorization?await o.hasPostingAuthorization(e):false;if(n==="posting"&&f&&l==="key")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!we(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to key:",m);}if(n==="posting"&&f&&l==="keychain")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!we(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to keychain/snap:",m);}if(n==="posting"&&f&&l==="hiveauth")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!we(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to HiveAuth:",m);}try{return await _e(l,e,t,r,n,void 0,void 0,i)}catch(m){if(we(m)&&o.showAuthUpgradeUI&&(n==="posting"||n==="active")){let y=t.length>0?t[0][0]:"unknown",h=await o.showAuthUpgradeUI(n,y);if(!h)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await _e(h,e,t,r,n,void 0,void 0,i)}throw m}}if(n==="posting")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(f){if(we(f)&&o.showAuthUpgradeUI){let m=t.length>0?t[0][0]:"unknown",y=await o.showAuthUpgradeUI(n,m);if(!y)throw new Error(`No login type available for ${e}. Please log in again.`);return await _e(y,e,t,r,n,void 0,void 0,i)}throw f}else if(n==="active"&&o.showAuthUpgradeUI){let f=t.length>0?t[0][0]:"unknown",m=await o.showAuthUpgradeUI(n,f);if(!m)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await _e(m,e,t,r,n,void 0,void 0,i)}}let s=r?.fallbackChain??["key","hiveauth","hivesigner","keychain","custom"],a=new Map;for(let l of s)try{let f=!1,m="",y,h;switch(l){case "key":if(!o)f=!0,m="No adapter provided";else {let S;switch(n){case "owner":o.getOwnerKey&&(S=await o.getOwnerKey(e));break;case "active":o.getActiveKey&&(S=await o.getActiveKey(e));break;case "memo":o.getMemoKey&&(S=await o.getMemoKey(e));break;default:S=await o.getPostingKey(e);break}S?y=S:(f=!0,m=`No ${n} key available`);}break;case "hiveauth":o?.broadcastWithHiveAuth||(f=!0,m="HiveAuth not supported by adapter");break;case "hivesigner":if(!o)f=!0,m="No adapter provided";else {let S=await o.getAccessToken(e);S&&(h=S);}break;case "keychain":o?.broadcastWithKeychain||(f=!0,m="Keychain not supported by adapter");break;case "custom":r?.broadcast||(f=!0,m="No custom broadcast function provided");break}if(f){a.set(l,new Error(`Skipped: ${m}`));continue}return await _e(l,e,t,r,n,y,h,i)}catch(f){if(a.set(l,f),!we(f))throw f}if(!Array.from(a.values()).some(l=>!l.message.startsWith("Skipped:"))){let l=Array.from(a.entries()).map(([f,m])=>`${f}: ${m.message}`).join(", ");throw new Error(`[SDK][Broadcast] No auth methods attempted for ${e}. ${l}`)}let p=Array.from(a.entries()).map(([l,f])=>`${l}: ${f.message}`).join(", ");throw new Error(`[SDK][Broadcast] All auth methods failed for ${e}. Errors: ${p}`)}function v(e=[],t,r,n=()=>{},i,o="posting",s){let a=s?.broadcastMode??"async";return useMutation({onSuccess:n,onMutate:s?.onMutate,onError:s?.onError,onSettled:s?.onSettled,mutationKey:[...e,t],mutationFn:async u=>{if(!t)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let p=r(u);try{if(i?.enableFallback!==!1&&i?.adapter)return await Rs(t,p,i,o,a);if(i?.broadcast)return await i.broadcast(p,o);let l=i?.postingKey;if(l){if(o!=="posting")throw new Error(`[SDK][Broadcast] Legacy auth only supports posting authority, but '${o}' was requested. Use AuthContextV2 with an adapter for ${o} operations.`);let m=U.fromString(l);return await te(p,m)}let f=i?.accessToken;if(f)return (await new Ln.Client({accessToken:f}).broadcast(p)).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}catch(l){throw l instanceof ee?new Error(l.message):l}}})}async function $n(e,t,r,n){if(!e)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let i={id:t,required_auths:[],required_posting_auths:[e],json:JSON.stringify(r)};if(n?.broadcast)return n.broadcast([["custom_json",i]],"posting");let o=n?.postingKey;if(o){let a=U.fromString(o);return te([["custom_json",i]],a)}let s=n?.accessToken;if(s)return (await new Ln.Client({accessToken:s}).customJson([],[e],t,JSON.stringify(r))).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}var km=4e3;function k(e,t,r){if(e?.invalidateQueries){if(t==="sync")return e.invalidateQueries(r);setTimeout(()=>e.invalidateQueries?.(r),4e3);}}function be(e,t){let r=AbortSignal.timeout(e);if(!t)return r;if(typeof AbortSignal.any=="function")return AbortSignal.any([t,r]);let n=new AbortController,i=()=>{let o=t.aborted?t.reason:r.reason;n.abort(o),t.removeEventListener("abort",i),r.removeEventListener("abort",i);};return t.aborted?n.abort(t.reason):r.aborted?n.abort(r.reason):(t.addEventListener("abort",i,{once:true}),r.addEventListener("abort",i,{once:true})),n.signal}var Ie=(()=>{try{return !1}catch{return false}})(),Is=()=>{try{return ""}catch{return}},ve=1e4,Wn=120*1e3,St,Ds;function Ks(){return St?St():Ds??(Ds=new QueryClient)}var d={privateApiHost:"https://ecency.com",defaultObserver:"ecency",clientId:"ecency-sdk",imageHost:"https://i.ecency.com",get hiveNodes(){return E.nodes},heliusApiKey:Is(),get queryClient(){return Ks()},set queryClient(e){St=()=>e;},pollsApiHost:"https://poll.ecency.com",plausibleHost:"https://pl.ecency.com",dmcaAccounts:[],dmcaTags:[],dmcaPatterns:[],dmcaTagRegexes:[],dmcaPatternRegexes:[],_dmcaInitialized:false},N;(P=>{function e(O){d.queryClient=O;}P.setQueryClient=e;function t(O){St=O;}P.setQueryClientResolver=t;function r(O){d.privateApiHost=O;}P.setPrivateApiHost=r;function n(O){d.clientId=O;}P.setClientId=n;function i(O){if(typeof O!="string"||O.trim()==="")throw new Error("setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; observer resolution would fall back to the post author while caching under an empty key.");d.defaultObserver=O;}P.setDefaultObserver=i;function o(){return d.privateApiHost?d.privateApiHost:typeof window<"u"&&window.location?.origin?window.location.origin:"https://ecency.com"}P.getValidatedBaseUrl=o;function s(O){d.pollsApiHost=O;}P.setPollsApiHost=s;function a(O){d.imageHost=O;}P.setImageHost=a;function u(O){Gt(O);}P.setHiveNodes=u;function p(O){zt(O);}P.setRestNodes=p;function l(O){Jt(O);}P.setRestNodesByApi=l;function f(O){Yt(O);}P.setUserAgent=f;function m(O){Xt(O);}P.setResilience=m;function y(O){if(/(\([^)]*[*+{][^)]*\))[*+{]/.test(O))return {safe:false,reason:"nested quantifiers detected"};if(/\([^|)]*\|[^)]*\)[*+{]/.test(O))return {safe:false,reason:"alternation with quantifier (potential overlap)"};if(/\([^)]*[*+][^)]*\)[*+]/.test(O))return {safe:false,reason:"repeated quantifiers (catastrophic backtracking risk)"};if(/\.\*\.\*/.test(O)||/\.\+\.\+/.test(O))return {safe:false,reason:"multiple greedy quantifiers on wildcards"};let W=/\.?\{(\d+),(\d+)\}/g,V;for(;(V=W.exec(O))!==null;){let[,M,H]=V;if(parseInt(H,10)-parseInt(M,10)>1e3)return {safe:false,reason:`excessive range: {${M},${H}}`}}return {safe:true}}function h(O){let W=["a".repeat(50)+"x","ab".repeat(50)+"x","x".repeat(100),"aaa".repeat(30)+"bbb".repeat(30)+"x"],V=5;for(let M of W){let H=Date.now();try{O.test(M);let G=Date.now()-H;if(G>V)return {safe:!1,reason:`runtime test exceeded ${V}ms (took ${G}ms on input length ${M.length})`}}catch(G){return {safe:false,reason:`runtime test threw error: ${G}`}}}return {safe:true}}function S(O,W=200){try{if(!O)return Ie&&console.warn("[SDK] DMCA pattern rejected: empty pattern"),null;if(O.length>W)return Ie&&console.warn(`[SDK] DMCA pattern rejected: length ${O.length} exceeds max ${W} - pattern: ${O.substring(0,50)}...`),null;let V=y(O);if(!V.safe)return Ie&&console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${V.reason}) - pattern: ${O.substring(0,50)}...`),null;let M;try{M=new RegExp(O);}catch(G){return Ie&&console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${O.substring(0,50)}...`,G),null}let H=h(M);return H.safe?M:(Ie&&console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${H.reason}) - pattern: ${O.substring(0,50)}...`),null)}catch(V){return Ie&&console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${O.substring(0,50)}...`,V),null}}function x(O={}){let W=G=>Array.isArray(G)?G.filter(Te=>typeof Te=="string"):[],V=O||{},M={accounts:W(V.accounts),tags:W(V.tags),patterns:W(V.posts)};d.dmcaAccounts=M.accounts,d.dmcaTags=M.tags,d.dmcaPatterns=M.patterns,d.dmcaTagRegexes=M.tags.map(G=>S(G)).filter(G=>G!==null),d.dmcaPatternRegexes=[];let H=M.tags.length-d.dmcaTagRegexes.length;!d._dmcaInitialized&&Ie&&(console.log("[SDK] DMCA configuration loaded:"),console.log(` - Accounts: ${M.accounts.length}`),console.log(` - Tag patterns: ${d.dmcaTagRegexes.length}/${M.tags.length} compiled (${H} rejected)`),console.log(` - Post patterns: ${M.patterns.length} (using exact string matching)`),H>0&&console.warn(`[SDK] ${H} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`)),d._dmcaInitialized=true;}P.setDmcaLists=x;})(N||(N={}));function Qm(){return new QueryClient({defaultOptions:{queries:{refetchOnWindowFocus:false,refetchOnMount:false}}})}var b=()=>d.queryClient,Gn;(s=>{function e(a){return b().getQueryData(a)}s.getQueryData=e;function t(a){return b().getQueryData(a)}s.getInfiniteQueryData=t;async function r(a){return await b().prefetchQuery(a),e(a.queryKey)}s.prefetchQuery=r;async function n(a){return await b().prefetchInfiniteQuery(a),t(a.queryKey)}s.prefetchInfiniteQuery=n;function i(a){return {prefetch:()=>r(a),getData:()=>e(a.queryKey),useClientQuery:()=>useQuery(a),fetchAndGet:()=>b().fetchQuery(a)}}s.generateClientServerQuery=i;function o(a){return {prefetch:()=>n(a),getData:()=>t(a.queryKey),useClientQuery:()=>useInfiniteQuery(a),fetchAndGet:()=>b().fetchInfiniteQuery(a)}}s.generateClientServerInfiniteQuery=o;})(Gn||(Gn={}));function Um(e){return btoa(JSON.stringify(e))}function Vm(e){let t=atob(e);if(t[0]==="{")return JSON.parse(t)}var zn=(n=>(n.HIVE="HIVE",n.HBD="HBD",n.VESTS="VESTS",n))(zn||{}),kt=(e=>(e["@@000000021"]="HIVE",e["@@000000013"]="HBD",e["@@000000037"]="VESTS",e))(kt||{});function T(e){if(typeof e=="string"){let t=e.split(" ");return {amount:parseFloat(t[0]),symbol:zn[t[1]]}}else return {amount:parseFloat(e.amount.toString())/Math.pow(10,e.precision),symbol:kt[e.nai]}}var pr;function w(){if(!pr){if(typeof globalThis.fetch!="function")throw new Error("[Ecency][SDK] - global fetch is not available");pr=globalThis.fetch.bind(globalThis);}return pr}function Jn(e){return typeof e=="string"?/^hive-\d+$/.test(e):false}function Qs(e){return e&&typeof e=="object"&&"data"in e&&"pagination"in e&&Array.isArray(e.data)}function ae(e,t){return Qs(e)?e:{data:Array.isArray(e)?e:[],pagination:{total:Array.isArray(e)?e.length:0,limit:t,offset:0,has_next:false}}}function je(e,t){return e/1e6*t}function Yn(e){return e===void 0?true:parseInt(e.split("-")[0],10)<1980}var Xn=60*1e3;function Ae(){return queryOptions({queryKey:c.core.dynamicProps(),refetchInterval:Xn,staleTime:Xn,queryFn:async({signal:e})=>{let[t,r,n,i,o]=await Promise.all([g("condenser_api.get_dynamic_global_properties",[],void 0,void 0,e),g("condenser_api.get_feed_history",[],void 0,void 0,e),g("condenser_api.get_chain_properties",[],void 0,void 0,e),g("condenser_api.get_reward_fund",["post"],void 0,void 0,e),g("database_api.get_hardfork_properties",{},void 0,void 0,e).catch(()=>({current_hardfork_version:"1.28.0",last_hardfork:28}))]),s=T(t.total_vesting_shares).amount,a=T(t.total_vesting_fund_hive).amount,u=0;Number.isFinite(s)&&s!==0&&Number.isFinite(a)&&(u=a/s*1e6);let p=T(r.current_median_history.base).amount,l=T(r.current_median_history.quote).amount,f=parseFloat(i.recent_claims),m=T(i.reward_balance).amount,y=Number(t.vote_power_reserve_rate??0),h=i.author_reward_curve??"linear",S=Number(i.content_constant??0),x=String(o.current_hardfork_version??"0.0.0"),P=Number(o.last_hardfork??0),O=t.hbd_print_rate,W=t.hbd_interest_rate,V=t.head_block_number,M=a,H=s,G=T(t.virtual_supply).amount,Te=t.vesting_reward_percent||0,Ye=n.account_creation_fee;return {hivePerMVests:u,base:p,quote:l,fundRecentClaims:f,fundRewardBalance:m,votePowerReserveRate:y,authorRewardCurve:h,contentConstant:S,currentHardforkVersion:x,lastHardfork:P,hbdPrintRate:O,hbdInterestRate:W,headBlock:V,totalVestingFund:M,totalVestingShares:H,virtualSupply:G,vestingRewardPercent:Te,accountCreationFee:Ye,raw:{globalDynamic:t,feedHistory:r,chainProps:n,rewardFund:i,hardforkProps:o}}}})}function og(e="post"){return queryOptions({queryKey:c.core.rewardFund(e),queryFn:()=>g("condenser_api.get_reward_fund",[e])})}function De(...e){let t=e.length;for(;t>0&&e[t-1]===void 0;)t--;return e.slice(0,t)}var c={posts:{entry:e=>["posts","entry",e],postHeader:(e,t)=>["posts","post-header",e,t],content:(e,t)=>["posts","content",e,t],contentReplies:(e,t)=>["posts","content-replies",e,t],accountPosts:(e,t,r,n)=>["posts","account-posts",e,t,r,n],accountPostsPage:(e,t,r,n,i,o)=>["posts","account-posts-page",e,t,r,n,i,o],userPostVote:(e,t,r)=>["posts","user-vote",e,t,r],reblogs:(e,t)=>["posts","reblogs",e,t],entryActiveVotes:(e,t)=>["posts","entry-active-votes",e,t],rebloggedBy:(e,t)=>["posts","reblogged-by",e,t],tips:(e,t)=>["posts","tips",e,t],normalize:(e,t)=>["posts","normalize",e,t],drafts:e=>["posts","drafts",e],draftsInfinite:(e,t)=>De("posts","drafts","infinite",e,t),schedules:e=>["posts","schedules",e],schedulesInfinite:(e,t)=>De("posts","schedules","infinite",e,t),fragments:e=>["posts","fragments",e],fragmentsInfinite:(e,t)=>De("posts","fragments","infinite",e,t),images:e=>["posts","images",e],galleryImages:e=>["posts","gallery-images",e],imagesInfinite:(e,t)=>De("posts","images","infinite",e,t),promoted:e=>["posts","promoted",e],_promotedPrefix:["posts","promoted"],accountPostsBlogPrefix:e=>["posts","account-posts",e,"blog"],postsRanked:(e,t,r,n)=>["posts","posts-ranked",e,t,r,n],postsRankedPage:(e,t,r,n,i,o)=>["posts","posts-ranked-page",e,t,r,n,i,o],discussions:(e,t,r,n)=>["posts","discussions",e,t,r,n],discussion:(e,t,r)=>["posts","discussion",e,t,r],deletedEntry:e=>["posts","deleted-entry",e],commentHistory:(e,t,r)=>["posts","comment-history",e,t,r],trendingTags:()=>["posts","trending-tags"],trendingTagsWithStats:e=>["posts","trending-tags","stats",e],wavesFeed:(e={})=>["posts","waves","feed",e.tag??"",e.following??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],shortsFeed:(e={})=>["posts","waves","shorts",e.tag??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],wavesByHost:e=>["posts","waves","by-host",e],wavesByTag:(e,t)=>["posts","waves","by-tag",e,t],wavesFollowing:(e,t)=>["posts","waves","following",e,t],wavesTrendingTags:(e,t)=>["posts","waves","trending-tags",e,t],wavesByAccount:(e,t)=>["posts","waves","by-account",e,t],wavesTrendingAuthors:e=>["posts","waves","trending-authors",e],_prefix:["posts"]},accounts:{full:e=>["get-account-full",e],list:(...e)=>["accounts","list",...e],friends:(e,t,r,n)=>["accounts","friends",e,t,r,n],searchFriends:(e,t,r)=>["accounts","friends","search",e,t,r],subscriptions:e=>["accounts","subscriptions",e],followCount:e=>["accounts","follow-count",e],recoveries:e=>["accounts","recoveries",e],pendingRecovery:e=>["accounts","recoveries",e,"pending-request"],checkWalletPending:(e,t)=>["accounts","check-wallet-pending",e,t],mutedUsers:e=>["accounts","muted-users",e],following:(e,t,r,n)=>["accounts","following",e,t,r,n],followers:(e,t,r,n)=>["accounts","followers",e,t,r,n],search:(e,t)=>["accounts","search",e,t],profiles:(e,t)=>["accounts","profiles",e,t],lookup:(e,t)=>["accounts","lookup",e,t],transactions:(e,t,r)=>["accounts","transactions",e,t,r],favorites:e=>["accounts","favorites",e],favoritesInfinite:(e,t)=>De("accounts","favorites","infinite",e,t),checkFavorite:(e,t)=>["accounts","favorites","check",e,t],relations:(e,t)=>["accounts","relations",e,t],bots:()=>["accounts","bots"],voteHistory:(e,t)=>["accounts","vote-history",e,t],reputations:(e,t)=>["accounts","reputations",e,t],bookmarks:e=>["accounts","bookmarks",e],bookmarksInfinite:(e,t)=>De("accounts","bookmarks","infinite",e,t),referrals:e=>["accounts","referrals",e],referralsStats:e=>["accounts","referrals-stats",e],proMembers:()=>["accounts","pro-members"],_prefix:["accounts"]},notifications:{announcements:()=>["notifications","announcements"],spotlights:()=>["notifications","spotlights"],list:(e,t)=>["notifications",e,t],unreadCount:e=>["notifications","unread",e],settings:e=>["notifications","settings",e],_prefix:["notifications"]},core:{rewardFund:e=>["core","reward-fund",e],dynamicProps:()=>["core","dynamic-props"],chainProperties:()=>["core","chain-properties"],_prefix:["core"]},communities:{single:(e,t)=>["community","single",e,t],singlePrefix:e=>["community","single",e],context:(e,t)=>["community","context",e,t],rewarded:()=>["communities","rewarded"],list:(e,t,r)=>["communities","list",e,t,r],subscribers:e=>["communities","subscribers",e],subscribersInfinite:e=>["communities","subscribers","infinite",e],accountNotifications:(e,t)=>["communities","account-notifications",e,t]},proposals:{list:()=>["proposals","list"],proposal:e=>["proposals","proposal",e],votes:(e,t,r)=>["proposals","votes",e,t,r],votesPrefix:e=>["proposals","votes",e],votesByUser:e=>["proposals","votes","by-user",e]},search:{topics:(e,t)=>["search","topics",e,t],path:e=>["search","path",e],account:(e,t)=>["search","account",e,t],results:(e,t,r,n,i,o)=>["search",e,t,typeof r=="string"?r==="1"||r==="true":r,n,i,o],controversialRising:(e,t)=>["search","controversial-rising",e,t],similarEntries:(e,t,r)=>r?["search","similar-entries",e,t,r]:["search","similar-entries",e,t],api:(e,t,r,n,i,o)=>De("search","api",e,t,r,n,i,o)},witnesses:{list:e=>["witnesses","list",e],votes:e=>["witnesses","votes",e],proxy:()=>["witnesses","proxy"],voters:(e,t,r,n,i)=>["witnesses","voters",e,t,r,n,i],voterCount:e=>["witnesses","voter-count",e]},wallet:{outgoingRcDelegations:(e,t)=>["wallet","outgoing-rc-delegations",e,t],vestingDelegations:(e,t)=>["wallet","vesting-delegations",e,t],withdrawRoutes:e=>["wallet","withdraw-routes",e],incomingRc:e=>["wallet","incoming-rc",e],conversionRequests:e=>["wallet","conversion-requests",e],receivedVestingShares:e=>["wallet","received-vesting-shares",e],savingsWithdraw:e=>["wallet","savings-withdraw",e],openOrders:e=>["wallet","open-orders",e],collateralizedConversionRequests:e=>["wallet","collateralized-conversion-requests",e],recurrentTransfers:e=>["wallet","recurrent-transfers",e],balanceHistory:(e,t,r)=>["wallet","balance-history",e,t,r],aggregatedHistory:(e,t,r)=>r===void 0?["wallet","aggregated-history",e,t]:["wallet","aggregated-history",e,t,r],portfolio:(e,t,r)=>["wallet","portfolio","v2",e,t,r]},assets:{hiveGeneralInfo:e=>["assets","hive","general-info",e],hiveTransactions:(e,t,r)=>["assets","hive","transactions",e,t,r],hiveWithdrawalRoutes:e=>["assets","hive","withdrawal-routes",e],hiveMetrics:e=>["assets","hive","metrics",e],hbdGeneralInfo:e=>["assets","hbd","general-info",e],hbdTransactions:(e,t,r)=>["assets","hbd","transactions",e,t,r],hivePowerGeneralInfo:e=>["assets","hive-power","general-info",e],hivePowerDelegates:e=>["assets","hive-power","delegates",e],hivePowerDelegatings:e=>["assets","hive-power","delegatings",e],hivePowerTransactions:(e,t,r)=>["assets","hive-power","transactions",e,t,r],pointsGeneralInfo:e=>["assets","points","general-info",e],pointsTransactions:(e,t)=>["assets","points","transactions",e,t],ecencyAssetInfo:(e,t,r)=>["ecency-wallets","asset-info",e,t,r]},market:{statistics:()=>["market","statistics"],orderBook:e=>["market","order-book",e],history:(e,t,r)=>["market","history",e,t,r],feedHistory:()=>["market","feed-history"],hiveHbdStats:()=>["market","hive-hbd-stats"],data:(e,t,r,n)=>["market","data",e,t,r,n],tradeHistory:(e,t,r)=>["market","trade-history",e,t,r],currentMedianHistoryPrice:()=>["market","current-median-history-price"]},analytics:{discoverCuration:e=>["analytics","discover-curation",e],pageStats:(e,t,r,n)=>["analytics","page-stats",e,t,r,n],discoverLeaderboard:e=>["analytics","discover-leaderboard",e]},promotions:{promotePrice:()=>["promotions","promote-price"],boostPlusPrices:()=>["promotions","boost-plus-prices"],boostPlusAccounts:e=>["promotions","boost-plus-accounts",e]},resourceCredits:{account:e=>["resource-credits","account",e],stats:()=>["resource-credits","stats"]},points:{points:(e,t)=>["points",e,t],_prefix:e=>["points",e]},polls:{details:(e,t)=>["polls","details",e,t],vote:(e,t)=>e&&t?["polls","vote",e,t]:["polls","vote"],_prefix:["polls"]},operations:{chainProperties:()=>["operations","chain-properties"]},games:{statusCheck:(e,t)=>["games","status-check",e,t]},quests:{status:e=>["quests","status",e]},support:{settings:e=>["support","settings",e],_prefix:["support"]},badActors:{list:()=>["bad-actors","list"],_prefix:["bad-actors"]},ai:{prices:()=>["ai","prices"],assistPrices:e=>["ai","assist-prices",e],transcribePrice:e=>["ai","transcribe-price",e],_prefix:["ai"]}};function pg(e){return queryOptions({queryKey:c.ai.prices(),queryFn:async()=>{let r=await w()(d.privateApiHost+"/private-api/ai-generate-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch AI generation prices: ${r.status}`);return await r.json()},staleTime:3e5,enabled:!!e})}function mg(e,t){return queryOptions({queryKey:c.ai.assistPrices(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-assist-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI assist prices: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function wg(e,t){return queryOptions({queryKey:c.ai.transcribePrice(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-transcribe-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI transcribe price: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function Ws(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function Ag(e,t){return useMutation({mutationKey:["ai","generate-image"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][GenerateImage] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][GenerateImage] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-generate-image",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,us:e,prompt:r.prompt,aspect_ratio:r.aspect_ratio??"1:1",power:r.power??1,idempotency_key:r.idempotency_key??Ws()})});if(!i.ok){let s=await i.text(),a={};try{a=JSON.parse(s);}catch{}let u=new Error(`[SDK][AI][GenerateImage] \u2013 failed with status ${i.status}${s?`: ${s}`:""}`);throw u.status=i.status,u.data=a,u}if(i.status===202){let s={};try{s=await i.json();}catch{}let a=new Error("[SDK][AI][GenerateImage] \u2013 delivery pending");throw a.status=202,a.data=s,a}return await i.json()},onSuccess:()=>{e&&b().invalidateQueries({queryKey:c.points._prefix(e)});}})}function zs(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function Eg(e,t){return useMutation({mutationKey:["ai","assist"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Assist] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][Assist] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-assist",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r.code??t,us:e,action:r.action,text:r.text,idempotency_key:zs()})});if(!i.ok){let o=await i.text(),s={};try{s=JSON.parse(o);}catch{}let a=new Error(`[SDK][AI][Assist] \u2013 failed with status ${i.status}${o?`: ${o}`:""}`);throw a.status=i.status,a.data=s,a}return await i.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.assistPrices(e)}));}})}function Ys(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function Tg(e,t){return useMutation({mutationKey:["ai","transcribe"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Transcribe] \u2013 username wasn't provided");let n=r.code??t;if(!n)throw new Error("[SDK][AI][Transcribe] \u2013 access token wasn't found");let i=new FormData;i.append("code",n),i.append("duration_ms",String(Math.round(r.durationMs))),i.append("idempotency_key",r.idempotency_key??Ys()),i.append("audio",r.audio,r.fileName??"clip.webm");let s=await w()(d.privateApiHost+"/private-api/ai-transcribe",{method:"POST",body:i});if(!s.ok){let a=await s.text(),u={};try{u=JSON.parse(a);}catch{}throw Object.assign(new Error(`[SDK][AI][Transcribe] \u2013 failed with status ${s.status}${a?`: ${a}`:""}`),{status:s.status,data:u})}return await s.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.transcribePrice(e)}));}})}function lr(e){return !e.posting_json_metadata&&!e.json_metadata}function Zs(e){return e?Object.values(e).some(t=>typeof t=="string"?t.length>0:t!=null):false}function Q(e){return queryOptions({queryKey:c.accounts.full(e),queryFn:async({signal:t})=>{if(!e)return null;let[r,n]=await Promise.all([g("condenser_api.get_accounts",[[e]],void 0,void 0,t,p=>Array.isArray(p)),g("bridge.get_profile",{account:e},void 0,void 0,t).catch(p=>{if(t?.aborted)throw p;return null})]);if(!r?.[0])return null;let i=r[0];if(lr(i)&&Zs(n?.metadata?.profile)){let p=await g("condenser_api.get_accounts",[[e]],void 0,void 0,t,l=>Array.isArray(l)&&(!l[0]||!lr(l[0])));if(p[0]&&!lr(p[0]))i=p[0];else throw new Error(`[SDK][Accounts] \u2013 inconsistent account row for ${e}: empty json metadata while hivemind profile is populated`)}let o=Ke(i.posting_json_metadata),s=n?.stats,a=s?{account:i.name,follower_count:s.followers??0,following_count:s.following??0}:void 0,u=n?.reputation??0;return {name:i.name,owner:i.owner,active:i.active,posting:i.posting,memo_key:i.memo_key,post_count:i.post_count,created:i.created,posting_json_metadata:i.posting_json_metadata,last_vote_time:i.last_vote_time,last_post:i.last_post,json_metadata:i.json_metadata,reward_hive_balance:i.reward_hive_balance,reward_hbd_balance:i.reward_hbd_balance,reward_vesting_hive:i.reward_vesting_hive,reward_vesting_balance:i.reward_vesting_balance,balance:i.balance,hbd_balance:i.hbd_balance,savings_balance:i.savings_balance,savings_hbd_balance:i.savings_hbd_balance,savings_hbd_last_interest_payment:i.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:i.savings_hbd_seconds_last_update,savings_hbd_seconds:i.savings_hbd_seconds,next_vesting_withdrawal:i.next_vesting_withdrawal,pending_claimed_accounts:i.pending_claimed_accounts,vesting_shares:i.vesting_shares,delegated_vesting_shares:i.delegated_vesting_shares,received_vesting_shares:i.received_vesting_shares,vesting_withdraw_rate:i.vesting_withdraw_rate,to_withdraw:i.to_withdraw,withdrawn:i.withdrawn,witness_votes:i.witness_votes,proxy:i.proxy,recovery_account:i.recovery_account,proxied_vsf_votes:i.proxied_vsf_votes,voting_manabar:i.voting_manabar,voting_power:i.voting_power,downvote_manabar:i.downvote_manabar,follow_stats:a,reputation:u,profile:o}},enabled:!!e,staleTime:6e4})}var ea=new Set(["__proto__","constructor","prototype"]);function Ct(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function Zn(e,t){let r={...e};for(let n of Object.keys(t)){if(ea.has(n))continue;let i=t[n],o=r[n];Ct(i)&&Ct(o)?r[n]=Zn(o,i):r[n]=i;}return r}function ta(e){if(!(!e||!Array.isArray(e)))return e.map(({meta:t,...r})=>{if(!t||typeof t!="object")return {...r,meta:t};let{privateKey:n,username:i,...o}=t;return {...r,meta:o}})}function Ke(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.profile&&typeof t.profile=="object")return t.profile}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata:",t,{length:e?.length??0});}return {}}function ei(e){return Ke(e?.posting_json_metadata)}function ti(e,t){if(!e)return t;if(!t)return e;let r=Object.keys(Ke(e.posting_json_metadata)).length;return Object.keys(Ke(t.posting_json_metadata)).length>r?t:e}function ra(e){if(!e)return {};try{let t=JSON.parse(e);if(Ct(t))return t}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata root:",t,{length:e?.length??0});}return {}}function ri({existingPostingJsonMetadata:e,profile:t,tokens:r}){let n=ra(e),i=Ct(n.profile)?n.profile:{},o=dr({existingProfile:i,profile:t,tokens:r});return JSON.stringify({...n,profile:o})}function dr({existingProfile:e,profile:t,tokens:r}){let{tokens:n,version:i,...o}=t??{},s=Zn(e??{},o);return s.tokens&&!Array.isArray(s.tokens)&&(s.tokens=void 0),r!==void 0?s.tokens=r&&r.length>0?r:[]:n!==void 0&&(s.tokens=n),s.tokens=ta(s.tokens),s.version=2,s}function Tt(e){return e.map(t=>{let r={name:t.name,owner:t.owner,active:t.active,posting:t.posting,memo_key:t.memo_key,post_count:t.post_count,created:t.created,reputation:t.reputation,posting_json_metadata:t.posting_json_metadata,last_vote_time:t.last_vote_time,last_post:t.last_post,json_metadata:t.json_metadata,reward_hive_balance:t.reward_hive_balance,reward_hbd_balance:t.reward_hbd_balance,reward_vesting_hive:t.reward_vesting_hive,reward_vesting_balance:t.reward_vesting_balance,balance:t.balance,hbd_balance:t.hbd_balance,savings_balance:t.savings_balance,savings_hbd_balance:t.savings_hbd_balance,savings_hbd_last_interest_payment:t.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:t.savings_hbd_seconds_last_update,savings_hbd_seconds:t.savings_hbd_seconds,next_vesting_withdrawal:t.next_vesting_withdrawal,pending_claimed_accounts:t.pending_claimed_accounts,vesting_shares:t.vesting_shares,delegated_vesting_shares:t.delegated_vesting_shares,received_vesting_shares:t.received_vesting_shares,vesting_withdraw_rate:t.vesting_withdraw_rate,to_withdraw:t.to_withdraw,withdrawn:t.withdrawn,witness_votes:t.witness_votes,proxy:t.proxy,recovery_account:t.recovery_account,proxied_vsf_votes:t.proxied_vsf_votes,voting_manabar:t.voting_manabar,voting_power:t.voting_power,downvote_manabar:t.downvote_manabar},n=Ke(t.posting_json_metadata);if(!n||Object.keys(n).length===0)try{let i=JSON.parse(t.json_metadata||"{}");i.profile&&(n=i.profile);}catch{}return (!n||Object.keys(n).length===0)&&(n={about:"",cover_image:"",location:"",name:"",profile_image:"",website:""}),{...r,profile:n}})}function jg(e){return queryOptions({queryKey:c.accounts.list(...e),enabled:e.length>0,queryFn:async()=>{let t=await g("condenser_api.get_accounts",[e],void 0,void 0,void 0,r=>Array.isArray(r));return Tt(t??[])}})}function zg(e){return queryOptions({queryKey:c.accounts.followCount(e),queryFn:()=>g("condenser_api.get_follow_count",[e])})}function ey(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.followers(e,t,r,n),queryFn:()=>g("condenser_api.get_followers",[e,t,r,n]),enabled:!!e})}function oy(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.following(e,t,r,n),queryFn:()=>g("condenser_api.get_following",[e,t,r,n]),enabled:!!e})}var ni=1e3,ca=20;function py(e){return queryOptions({queryKey:c.accounts.mutedUsers(e),queryFn:async()=>{let t=[],r="";for(let n=0;ns.following);if(o[0]===r&&(o=o.slice(1)),!o.length||(t.push(...o),i.lengthg("condenser_api.lookup_accounts",[e,t]),enabled:!!e,staleTime:1/0})}function by(e,t=5,r=[]){return queryOptions({queryKey:c.accounts.search(e,r),enabled:!!e,queryFn:async()=>(await g("condenser_api.lookup_accounts",[e,t])).filter(i=>r.length>0?!r.includes(i):true)})}var da=new Set(["ownerPublicKey","activePublicKey","postingPublicKey","memoPublicKey"]);function Oy(e,t){return queryOptions({queryKey:c.accounts.checkWalletPending(e,t??null),queryFn:async()=>{if(!e||!t)return {exist:false};let n=await w()(d.privateApiHost+"/private-api/wallets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,code:t})});if(!n.ok)return {exist:false};let i=await n.json(),o=Array.isArray(i)?i.flatMap(s=>{if(!s||typeof s!="object")return [];let a=s,u=typeof a.token=="string"?a.token:void 0;if(!u)return [];let p=a.meta&&typeof a.meta=="object"?{...a.meta}:{},l={},f=typeof a.address=="string"&&a.address?a.address:void 0,y=(typeof a.status=="number"?a.status===3:void 0)??false;f&&(l.address=f),l.show=y;let h={symbol:u,currency:u,address:f,show:y,type:"CHAIN",meta:l},S=[];for(let[x,P]of Object.entries(p))typeof x=="string"&&(da.has(x)||typeof P!="string"||!P||/^[A-Z0-9]{2,10}$/.test(x)&&S.push({symbol:x,currency:x,address:P,show:y,type:"CHAIN",meta:{address:P,show:y}}));return [h,...S]}):[];return {exist:o.length>0,tokens:o.length?o:void 0,wallets:o.length?o:void 0}},refetchOnMount:true})}function ii(e,t){return queryOptions({queryKey:c.accounts.relations(e,t),enabled:!!e&&!!t,refetchOnMount:false,refetchInterval:36e5,queryFn:async()=>{let r={follows:false,ignores:false,blacklists:false,follows_muted:false,follows_blacklists:false};return !e||!t?r:await g("bridge.get_relationship_between_accounts",[e,t])??r}})}function qy(e){return queryOptions({queryKey:c.accounts.subscriptions(e),enabled:!!e,queryFn:async({signal:t})=>await g("bridge.list_all_subscriptions",{account:e},void 0,void 0,t)??[]})}function By(e,t){return queryOptions({queryKey:c.accounts.bookmarks(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Bookmarks] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/bookmarks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function My(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.bookmarksInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch bookmarks: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Uy(e,t){return queryOptions({queryKey:c.accounts.favorites(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Vy(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.favoritesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/favorites?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch favorites: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Wy(e,t,r){return queryOptions({queryKey:c.accounts.checkFavorite(e,r),enabled:!!e&&!!t&&!!r,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");if(!r)throw new Error("[SDK][Accounts][Favorites] \u2013 no target username");let i=await w()(d.privateApiHost+"/private-api/favorites-check",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:r})});if(!i.ok)throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check failed with status ${i.status}: ${i.statusText}`);let o=await i.json();if(typeof o!="boolean")throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check returned invalid type: expected boolean, got ${typeof o}`);return o}})}function Yy(e,t){return queryOptions({enabled:!!e&&!!t,queryKey:c.accounts.recoveries(e),queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts] Missing username or access token");return (await w()(d.privateApiHost+"/private-api/recoveries",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function rh(e){return queryOptions({enabled:!!e,queryKey:c.accounts.pendingRecovery(e),queryFn:()=>g("database_api.find_change_recovery_account_requests",{accounts:[e]})})}function ah(e,t=50){return queryOptions({queryKey:c.accounts.reputations(e,t),enabled:!!e,queryFn:async()=>e?g("condenser_api.get_account_reputations",[e,t]):[]})}var K=ie.operations,oi={transfers:[K.transfer,K.transfer_to_savings,K.transfer_from_savings,K.cancel_transfer_from_savings,K.recurrent_transfer,K.fill_recurrent_transfer,K.escrow_transfer,K.fill_recurrent_transfer],"market-orders":[K.fill_convert_request,K.fill_order,K.fill_collateralized_convert_request,K.limit_order_create2,K.limit_order_create,K.limit_order_cancel],interests:[K.interest],"stake-operations":[K.return_vesting_delegation,K.withdraw_vesting,K.transfer_to_vesting,K.set_withdraw_vesting_route,K.update_proposal_votes,K.fill_vesting_withdraw,K.account_witness_proxy,K.delegate_vesting_shares],rewards:[K.author_reward,K.curation_reward,K.producer_reward,K.claim_reward_balance,K.comment_benefactor_reward,K.liquidity_reward,K.proposal_pay]},Oa=[...Object.values(oi)].reduce((e,t)=>e.concat(t),[]);function xa(e){return e.block*1e7+e.trx_in_block*100+e.op_pos}function Ea(e){return e.replace(/_operation$/,"")}function Sa(e){return typeof e=="object"&&e!==null&&"nai"in e&&"amount"in e&&"precision"in e}function ka(e){if(!Sa(e))return e;let t=T(e),r=kt[e.nai]??"UNKNOWN";return `${t.amount.toFixed(e.precision)} ${r}`}function Ca(e){let t={};for(let[r,n]of Object.entries(e))t[r]=ka(n);return t}function gh(e,t=20,r=""){let n=r?oi[r]:Oa;return infiniteQueryOptions({queryKey:c.accounts.transactions(e??"",r,t),initialPageParam:null,queryFn:async({pageParam:i,signal:o})=>{if(!e)return {entries:[],currentPage:0};let s={"account-name":e,"operation-types":n.join(","),"page-size":t};i!==null&&(s.page=i);let a=await re("hafah","/accounts/{account-name}/operations",s,void 0,void 0,o);return {entries:a.operations_result.map(p=>{let l=Ea(p.op.type);return {...Ca(p.op.value),num:xa(p),type:l,timestamp:p.timestamp,trx_id:p.trx_id}}),currentPage:i??a.total_pages}},getNextPageParam:i=>{let o=i.currentPage-1;return o>=1?o:void 0}})}function _h(){return queryOptions({queryKey:c.accounts.bots(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/public/bots",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch bots: ${e.status}`);return e.json()},refetchOnMount:true,staleTime:1/0})}function Ph(e){return infiniteQueryOptions({queryKey:c.accounts.referrals(e),initialPageParam:{maxId:void 0},queryFn:async({pageParam:t})=>{let{maxId:r}=t??{},n=N.getValidatedBaseUrl(),i=new URL(`/private-api/referrals/${e}`,n);r!==void 0&&i.searchParams.set("max_id",r.toString());let o=await fetch(i.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`Failed to fetch referrals: ${o.status}`);return o.json()},getNextPageParam:t=>{let r=t?.[t.length-1]?.id;return typeof r=="number"?{maxId:r}:void 0}})}function Sh(e){return queryOptions({queryKey:c.accounts.referralsStats(e),queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/referrals/${e}/stats`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch referral stats: ${t.status}`);let r=await t.json();if(!r)throw new Error("No Referrals for this user!");return {total:r.total??0,rewarded:r.rewarded??0}}})}function qh(e,t,r){let{followType:n="blog",limit:i=100,enabled:o=true}=r??{};return infiniteQueryOptions({queryKey:c.accounts.friends(e,t,n,i),initialPageParam:{startFollowing:""},enabled:o,refetchOnMount:true,queryFn:async({pageParam:s})=>{let{startFollowing:a}=s,l=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,a===""?null:a,n,i])).map(y=>t==="following"?y.following:y.follower);return (await g("bridge.get_profiles",{accounts:l,observer:void 0})??[]).map(y=>({name:y.name,reputation:y.reputation,active:y.active}))},getNextPageParam:s=>s&&s.length===i?{startFollowing:s[s.length-1].name}:void 0})}var Da=30;function Mh(e,t,r){return queryOptions({queryKey:c.accounts.searchFriends(e,t,r),refetchOnMount:false,enabled:false,queryFn:async()=>{if(!r)return [];let n=r.slice(0,-1),s=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,n,"blog",1e3])).map(u=>t==="following"?u.following:u.follower).filter(u=>u.toLowerCase().includes(r.toLowerCase())).slice(0,Da);return (await g("bridge.get_profiles",{accounts:s,observer:void 0}))?.map(u=>({name:u.name,full_name:u.metadata.profile?.name||"",reputation:u.reputation,active:u.active}))??[]}})}function Vh(e=20){return infiniteQueryOptions({queryKey:c.posts.trendingTags(),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!n.name.startsWith("hive-")).map(n=>n.name)),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length>0?{afterTag:t[t.length-1]}:void 0,staleTime:3600*1e3})}function zh(e=250){return infiniteQueryOptions({queryKey:c.posts.trendingTagsWithStats(e),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!Jn(n.name))),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length?{afterTag:t[t.length-1].name}:void 0,staleTime:1/0})}function Le(e,t){return queryOptions({queryKey:c.posts.fragments(e),queryFn:async()=>t?(await w()(d.privateApiHost+"/private-api/fragments",{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json():[],enabled:!!e&&!!t})}function Zh(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.fragmentsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/fragments?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch fragments: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function nw(e="feed"){return queryOptions({queryKey:c.posts.promoted(e),queryFn:async()=>{let t=N.getValidatedBaseUrl(),r=new URL("/private-api/promoted-entries",t);return e==="waves"&&r.searchParams.append("short_content","1"),await(await w()(r.toString(),{method:"GET",headers:{"Content-Type":"application/json"}})).json()}})}function cw(e){return queryOptions({queryKey:c.posts.entryActiveVotes(e?.author,e?.permlink),queryFn:async()=>g("condenser_api.get_active_votes",[e?.author,e?.permlink]),enabled:!!e})}function fw(e,t,r){return queryOptions({queryKey:c.posts.userPostVote(e,t,r),queryFn:async()=>(await g("database_api.list_votes",{start:[e,t,r],limit:1,order:"by_voter_comment"}))?.votes?.[0]||null,enabled:!!e&&!!t&&!!r})}function ww(e,t){return queryOptions({queryKey:c.posts.content(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content",[e,t])})}function Pw(e,t){return queryOptions({queryKey:c.posts.contentReplies(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content_replies",{author:e,permlink:t})})}function kw(e,t){return queryOptions({queryKey:c.posts.postHeader(e,t),queryFn:async()=>g("bridge.get_post_header",{author:e,permlink:t}),initialData:null})}function ne(e){return Array.isArray(e)?e.map(t=>si(t)):si(e)}function si(e){if(!e)return e;let t=`@${e.author}/${e.permlink}`;return d.dmcaPatterns.includes(t)||d.dmcaPatternRegexes.some(n=>n.test(t))?{...e,body:"This post is not available due to a copyright/fraudulent claim.",title:""}:e}async function ai(e,t,r){try{let n=await Ot("bridge.get_post",{author:e,permlink:t,observer:r},1);if(n&&typeof n=="object"&&n.author===e&&n.permlink===t)return n}catch{}return null}function ci(e,t,r="",n){let i=t?.trim(),o=`/@${e}/${i??""}`;return queryOptions({queryKey:c.posts.entry(o),queryFn:async()=>{if(!i||i==="undefined")return null;let s=await g("bridge.get_post",{author:e,permlink:i,observer:r});if(!s){let u=await ai(e,i,r);if(!u)return null;let p=n!==void 0?{...u,num:n}:u;return ne(p)}let a=n!==void 0?{...s,num:n}:s;return ne(a)},enabled:!!e&&!!t&&t.trim()!==""&&t.trim()!=="undefined"})}function ce(e,t,r){return g(`bridge.${e}`,t,void 0,void 0,r)}async function ui(e,t,r,n){let{json_metadata:i}=e;if(i?.original_author&&i?.original_permlink&&i.tags?.[0]==="cross-post")try{let o=await Wa(i.original_author,i.original_permlink,t,r,n);return o?{...e,original_entry:o,num:r}:e}catch{return e}return {...e,num:r}}async function pi(e,t,r){let n=e.map(it),i=await Promise.all(n.map(o=>ui(o,t,void 0,r)));return ne(i)}async function li(e,t="",r="",n=20,i="",o="",s){let a=await ce("get_ranked_posts",{sort:e,start_author:t,start_permlink:r,limit:n,tag:i,observer:o},s);return Array.isArray(a)?pi(a,o,s):(a!=null&&console.warn(`[SDK] get_ranked_posts returned ${typeof a} instead of an array for sort=${e}; treating as no results.`),null)}async function fr(e,t,r="",n="",i=20,o="",s){if(d.dmcaAccounts.includes(t))return [];let a=await ce("get_account_posts",{sort:e,account:t,start_author:r,start_permlink:n,limit:i,observer:o},s);return Array.isArray(a)?pi(a,o,s):(a!=null&&console.warn(`[SDK] get_account_posts returned ${typeof a} instead of an array for account=${t}, sort=${e}; treating as no results.`),null)}function it(e){let t={...e,active_votes:Array.isArray(e.active_votes)?[...e.active_votes]:[],beneficiaries:Array.isArray(e.beneficiaries)?[...e.beneficiaries]:[],blacklists:Array.isArray(e.blacklists)?[...e.blacklists]:[],replies:Array.isArray(e.replies)?[...e.replies]:[],stats:e.stats?{...e.stats}:null},r=["author","title","body","created","category","permlink","url","updated"];for(let n of r)t[n]==null&&(t[n]="");return t.author_reputation==null&&(t.author_reputation=0),t.children==null&&(t.children=0),t.depth==null&&(t.depth=0),t.net_rshares==null&&(t.net_rshares=0),t.payout==null&&(t.payout=0),t.percent_hbd==null&&(t.percent_hbd=0),t.stats||(t.stats={flag_weight:0,gray:false,hide:false,total_votes:0}),t.author_payout_value==null&&(t.author_payout_value="0.000 HBD"),t.curator_payout_value==null&&(t.curator_payout_value="0.000 HBD"),t.max_accepted_payout==null&&(t.max_accepted_payout="1000000.000 HBD"),t.payout_at==null&&(t.payout_at=""),t.pending_payout_value==null&&(t.pending_payout_value="0.000 HBD"),t.promoted==null&&(t.promoted="0.000 HBD"),t.is_paidout==null&&(t.is_paidout=false),t}async function Wa(e="",t="",r="",n,i){let o=await ce("get_post",{author:e,permlink:t,observer:r},i);if(o){let s=it(o),a=await ui(s,r,n,i);return ne(a)}}async function Vw(e="",t=""){let r=await ce("get_post_header",{author:e,permlink:t});return r&&it(r)}async function di(e,t,r){let n=await ce("get_discussion",{author:e,permlink:t,observer:r||e});if(n){let i={};for(let[o,s]of Object.entries(n))i[o]=it(s);return i}return n}async function fi(e,t=""){return ce("get_community",{name:e,observer:t})}async function jw(e="",t=100,r,n="rank",i=""){return ce("list_communities",{last:e,limit:t,query:r,sort:n,observer:i})}async function mi(e){let t=await ce("normalize_post",{post:e});return t&&it(t)}async function Lw(e){return ce("list_all_subscriptions",{account:e})}async function $w(e){return ce("list_subscribers",{community:e})}async function Ww(e,t){return ce("get_relationship_between_accounts",[e,t])}async function Rt(e,t){return ce("get_profiles",{accounts:e,observer:t})}var yi=(i=>(i.trending="trending",i.author_reputation="author_reputation",i.votes="votes",i.created="created",i))(yi||{});function mr(e){let t=e.match(/^(\d+\.?\d*)\s*([A-Z]+)$/);return t?{amount:parseFloat(t[1]),symbol:t[2]}:{amount:0,symbol:""}}function Ga(e,t,r){let n=l=>mr(l.pending_payout_value).amount+mr(l.author_payout_value).amount+mr(l.curator_payout_value).amount,i=l=>l.net_rshares<0,o=l=>e.json_metadata?.pinned_reply===`${l.author}/${l.permlink}`,s={trending:(l,f)=>{if(i(l))return 1;if(i(f))return -1;let m=n(l),y=n(f);return m!==y?y-m:0},author_reputation:(l,f)=>{let m=l.author_reputation,y=f.author_reputation;return m>y?-1:m{let m=l.children,y=f.children;return m>y?-1:m{if(i(l))return 1;if(i(f))return -1;let m=Date.parse(l.created),y=Date.parse(f.created);return m>y?-1:mo(l)),p=a[u];return u>=0&&(a.splice(u,1),a.unshift(p)),a}function hi(e,t="created",r=true,n){let i=n||d.defaultObserver;return queryOptions({queryKey:c.posts.discussions(e?.author,e?.permlink,t,i),queryFn:async()=>{if(!e)return [];let o=await g("bridge.get_discussion",{author:e.author,permlink:e.permlink,observer:i}),s=o?Array.from(Object.values(o)):[];return ne(s)},enabled:r&&!!e,select:o=>Ga(e,o,t),structuralSharing:(o,s)=>{if(!o||!s)return s;let a=o.filter(l=>l.is_optimistic===true),u=new Set(s.map(l=>`${l.author}/${l.permlink}`)),p=a.filter(l=>!u.has(`${l.author}/${l.permlink}`));return p.length>0?[...s,...p]:s}})}function e_(e,t,r,n=true){let i=r||d.defaultObserver;return queryOptions({queryKey:c.posts.discussion(e,t,i),enabled:n&&!!e&&!!t,queryFn:async()=>di(e,t,i)})}function a_(e,t="posts",r=20,n="",i=true){return infiniteQueryOptions({queryKey:c.posts.accountPosts(e??"",t,r,n),enabled:!!e&&i,initialPageParam:{author:void 0,permlink:void 0,hasNextPage:true},queryFn:async({pageParam:o,signal:s})=>{if(!o?.hasNextPage||!e)return [];let a=await fr(t,e,o.author??"",o.permlink??"",r,n,s);return ne(a??[])},getNextPageParam:o=>{let s=o?.[o.length-1],a=(o?.length??0)===r;if(a)return {author:s?.author,permlink:s?.permlink,hasNextPage:a}}})}function c_(e,t="posts",r="",n="",i=20,o="",s=true){return queryOptions({queryKey:c.posts.accountPostsPage(e??"",t,r,n,i,o),enabled:!!e&&s,queryFn:async({signal:a}={})=>{if(!e)return [];let u=await fr(t,e,r,n,i,o,a);return ne(u??[])}})}var wi=new Map;function Za(e){let t=wi.get(e);return t||(t=r=>({...r,pages:r.pages.map(n=>ec(n,e))}),wi.set(e,t)),t}function ec(e,t){let r=e.filter(o=>o.stats?.is_pinned),n=e.filter(o=>!o.stats?.is_pinned);if(t==="hot")return [...r,...n];let i=[...n].sort((o,s)=>new Date(s.created).getTime()-new Date(o.created).getTime());return [...r,...i]}function y_(e,t,r=20,n="",i=true,o={}){return infiniteQueryOptions({queryKey:c.posts.postsRanked(e,t,r,n),queryFn:async({pageParam:s,signal:a})=>{let u=t;d.dmcaTagRegexes.some(l=>l.test(t))&&(u="");let p=await g("bridge.get_ranked_posts",{sort:e,start_author:s.author,start_permlink:s.permlink,limit:r,tag:u,observer:n},void 0,void 0,a);if(p==null)return [];if(!Array.isArray(p))throw new Error(`[SDK] get_ranked_posts returned ${typeof p} for sort=${e}`);return ne(p)},select:Za(e),enabled:i,initialPageParam:{author:void 0,permlink:void 0},getNextPageParam:s=>{let a=s?.[s.length-1];if(a)return {author:a.author,permlink:a.permlink}}})}function h_(e,t="",r="",n=20,i="",o="",s=true){return queryOptions({queryKey:c.posts.postsRankedPage(e,t,r,n,i,o),enabled:s,queryFn:async({signal:a}={})=>{let u=i;d.dmcaTagRegexes.some(l=>l.test(i))&&(u="");let p=await li(e,t,r,n,u,o,a);return ne(p??[])}})}function A_(e,t,r=200){return queryOptions({queryKey:c.posts.reblogs(e??"",r),queryFn:async()=>(await g("condenser_api.get_blog_entries",[e??t,0,r])).filter(i=>i.author!==t&&!i.reblogged_on.startsWith("1970-")).map(i=>({author:i.author,permlink:i.permlink})),enabled:!!e})}function S_(e,t){return queryOptions({queryKey:c.posts.rebloggedBy(e??"",t??""),queryFn:async()=>{if(!e||!t)return [];let r=await g("condenser_api.get_reblogged_by",[e,t]);return Array.isArray(r)?r:[]},enabled:!!e&&!!t})}function R_(e,t){return queryOptions({queryKey:c.posts.schedules(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/schedules",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch schedules: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function F_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.schedulesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/schedules?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch schedules: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function K_(e,t){return queryOptions({queryKey:c.posts.drafts(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch drafts: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function B_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.draftsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/drafts?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch drafts: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}async function bi(e){let r=await w()(d.privateApiHost+"/private-api/images",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch images: ${r.status}`);return r.json()}function H_(e,t){return queryOptions({queryKey:c.posts.images(e),queryFn:async()=>!e||!t?[]:bi(t),enabled:!!e&&!!t})}function U_(e,t){return queryOptions({queryKey:c.posts.galleryImages(e),queryFn:async()=>!e||!t?[]:bi(t),enabled:!!e&&!!t})}function V_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.imagesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/images?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch images: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function W_(e,t,r=false){return queryOptions({queryKey:c.posts.commentHistory(e,t,r),queryFn:async({signal:n})=>{let i=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:t,onlyMeta:r?"1":""}),signal:n});if(!i.ok)throw new Error(`Failed to fetch comment history: ${i.status}`);return i.json()},enabled:!!e&&!!t})}function pc(e,t){let r=e?.trim(),n=t?.trim();if(!r||!n)throw new Error("Invalid entry path: author and permlink are required");let i=r.replace(/^@+/,""),o=n.replace(/^\/+/,"");if(!i||!o)throw new Error("Invalid entry path: author and permlink cannot be empty after normalization");return `@${i}/${o}`}function Y_(e,t){let r=t?.trim(),n=e?.trim(),i=!!n&&!!r&&r!=="undefined",o=i?pc(n,r):"";return queryOptions({queryKey:c.posts.deletedEntry(o),queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:r||""}),signal:s});if(!a.ok)throw new Error(`Failed to fetch comment history: ${a.status}`);return a.json()},select:s=>{if(!s?.list?.[0])return null;let{body:a,title:u,tags:p}=s.list[0];return {body:a,title:u,tags:p}},enabled:i})}function tb(e,t,r=true){return queryOptions({queryKey:c.posts.tips(e,t),queryFn:async()=>{let n=`/private-api/post-tips/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,i=await fetch(d.privateApiHost+n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch post tips: ${i.status}`);return i.json()},enabled:!!e&&!!t&&r,staleTime:60*1e3})}function dc(e,t){return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,host:t}}function fc(e){return {...e,id:e.id??e.post_id}}function ye(e,t){if(!e)return null;let r=e.container??e,n=dc(r,t),i=e.parent?fc(e.parent):void 0;return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,max_accepted_payout:e.max_accepted_payout||"1000000.000 HBD",pending_payout_value:e.pending_payout_value||"0.000 HBD",author_payout_value:e.author_payout_value||"0.000 HBD",curator_payout_value:e.curator_payout_value||"0.000 HBD",host:t,container:n,parent:i}}function mc(e){return Array.isArray(e)?e:[]}async function vi(e){let t=hi(e,"created",true),r=await d.queryClient.fetchQuery(t),n=mc(r);if(n.length<=1)return [];let i=n.filter(({parent_author:s,parent_permlink:a})=>s===e.author&&a===e.permlink);return i.length===0?[]:i.filter(s=>!s.stats?.gray)}function Ai(e,t,r){return e.length===0?[]:e.map(n=>{let i=e.find(o=>o.author===n.parent_author&&o.permlink===n.parent_permlink&&o.author!==r);return {...n,id:n.post_id,host:r,container:t,parent:i}}).filter(n=>n.container.post_id!==n.post_id).sort((n,i)=>new Date(i.created).getTime()-new Date(n.created).getTime())}var hc=20;function Pi(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,following:e.following?.trim().toLowerCase()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??hc}}async function Oi({containers:e,tag:t,following:r,author:n,observer:i,limit:o},s,a){let u=N.getValidatedBaseUrl(),p=new URL("/private-api/waves/feed",u);p.searchParams.set("limit",String(o)),s&&p.searchParams.set("cursor",s),e.forEach(m=>p.searchParams.append("container",m)),t&&p.searchParams.set("tag",t),r&&p.searchParams.set("following",r),n&&p.searchParams.set("author",n),i&&p.searchParams.set("observer",i);let l=await fetch(p.toString(),{method:"GET",signal:a});if(!l.ok)throw new Error(`Failed to fetch waves feed: ${l.status}`);let f=await l.json();return !Array.isArray(f)||f.length===0?[]:f.map(m=>{let y=ye(m,m.host??"");return y?{...y,_cursor:m._cursor}:null}).filter(m=>!!m)}function ub(e={}){let t=Pi(e),{containers:r,tag:n,following:i,author:o,observer:s,limit:a}=t;return infiniteQueryOptions({queryKey:c.posts.wavesFeed({containers:r,tag:n,following:i,author:o,observer:s,limit:a}),initialPageParam:void 0,queryFn:({pageParam:u,signal:p})=>Oi(t,u,p),getNextPageParam:u=>{if(!(u.lengthOi(t,void 0,u)})}var _c=20;function bc(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??_c}}async function vc({containers:e,tag:t,author:r,observer:n,limit:i},o,s){let a=N.getValidatedBaseUrl(),u=new URL("/private-api/waves/shorts",a);u.searchParams.set("limit",String(i)),o&&u.searchParams.set("cursor",o),e.forEach(f=>u.searchParams.append("container",f)),t&&u.searchParams.set("tag",t),r&&u.searchParams.set("author",r),n&&u.searchParams.set("observer",n);let p=await fetch(u.toString(),{method:"GET",signal:s});if(!p.ok)throw new Error(`Failed to fetch shorts feed: ${p.status}`);let l=await p.json();return !Array.isArray(l)||l.length===0?[]:l.map(f=>{let m=ye(f,f.host??"");return m?{...m,active_votes:m.active_votes??[],video:f.video,_cursor:f._cursor}:null}).filter(f=>!!f)}function gb(e={}){let t=bc(e),{containers:r,tag:n,author:i,observer:o,limit:s}=t;return infiniteQueryOptions({queryKey:c.posts.shortsFeed({containers:r,tag:n,author:i,observer:o,limit:s}),initialPageParam:void 0,queryFn:({pageParam:a,signal:u})=>vc(t,a,u),getNextPageParam:a=>{if(!(a.length(l.id=l.post_id,l.host=e,l));for(let l of u){if(o&&l.post_id===o){o=void 0;continue}if(i+=1,l.stats?.gray){r=l.author,n=l.permlink;continue}let f;try{f=await vi(l);}catch(m){console.error("[SDK] getThreads get_discussion error:",m),r=l.author,n=l.permlink;continue}if(f.length===0){r=l.author,n=l.permlink;continue}return {entries:Ai(f,l,e)}}let p=u[u.length-1];if(!p)return null;r=p.author,n=p.permlink;}return null}function Ab(e){return infiniteQueryOptions({queryKey:c.posts.wavesByHost(e),initialPageParam:void 0,queryFn:async({pageParam:t})=>{let r=await xc(e,t);return r?r.entries:[]},getNextPageParam:t=>t?.[0]?.container})}var Sc=40;function Sb(e,t,r=Sc){return infiniteQueryOptions({queryKey:c.posts.wavesByTag(e,t),initialPageParam:void 0,queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/tags",i);o.searchParams.set("container",e),o.searchParams.set("tag",t);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves by tag: ${s.status}`);return (await s.json()).slice(0,r).map(p=>ye(p,e)).filter(p=>!!p).sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves by tag",i),[]}},getNextPageParam:()=>{}})}function Fb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesFollowing(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/following",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves following feed: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>ye(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves following feed",i),[]}},getNextPageParam:()=>{}})}function Kb(e,t=24){let r=e?.trim()||void 0;return queryOptions({queryKey:c.posts.wavesTrendingTags(r??"",t),queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/trending/tags",i);r&&o.searchParams.set("container",r),o.searchParams.set("hours",t.toString());let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves trending tags: ${s.status}`);return (await s.json()).map(({tag:u,posts:p})=>({tag:u,posts:p}))}catch(i){return console.error("[SDK] Failed to fetch waves trending tags",i),[]}}})}function Hb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesByAccount(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/account",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves for account: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>ye(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){throw console.error("[SDK] Failed to fetch waves for account",i),i}},getNextPageParam:()=>{}})}function Lb(e){return queryOptions({queryKey:c.posts.wavesTrendingAuthors(e),queryFn:async({signal:t})=>{try{let r=N.getValidatedBaseUrl(),n=new URL("/private-api/waves/trending/authors",r);n.searchParams.set("container",e);let i=await fetch(n.toString(),{method:"GET",signal:t});if(!i.ok)throw new Error(`Failed to fetch waves trending authors: ${i.status}`);return (await i.json()).map(({author:s,posts:a})=>({author:s,posts:a}))}catch(r){throw console.error("[SDK] Failed to fetch waves trending authors",r),r}}})}function Jb(e,t=true){return queryOptions({queryKey:c.posts.normalize(e?.author??"",e?.permlink??""),enabled:t&&!!e,queryFn:async()=>mi(e)})}function Ic(e){return !!e&&typeof e=="object"&&"author"in e&&"permlink"in e&&"active_votes"in e}function xi(e){let t=new Date(e);return (new Date().getTime()-t.getTime())/(1e3*60*60*24)}function iv(e,t){let{limit:r=20,filters:n=[],dayLimit:i=7}=t??{};return infiniteQueryOptions({queryKey:c.accounts.voteHistory(e,r),initialPageParam:{start:-1},queryFn:async({pageParam:o})=>{let{start:s}=o,a=await g("condenser_api.get_account_history",[e,s,r,...n]),p=a.map(([m,y])=>({...y.op[1],num:m,timestamp:y.timestamp})).filter(m=>m.voter===e&&m.weight!==0&&xi(m.timestamp)<=i),l=[];for(let m of p){let y=await d.queryClient.fetchQuery(ci(m.author,m.permlink));Ic(y)&&l.push(y);}let[f]=a;return {lastDate:f?xi(f[1].timestamp):0,lastItemFetched:f?f[0]:s,entries:l}},getNextPageParam:o=>({start:o.lastItemFetched})})}function uv(e,t,r=true){return queryOptions({queryKey:c.accounts.profiles(e,t??""),enabled:r&&e.length>0,queryFn:async()=>Rt(e,t)})}function gv(e,t="HIVE",r=200){return infiniteQueryOptions({queryKey:c.wallet.balanceHistory(e??"",t,r),initialPageParam:null,queryFn:async({pageParam:n,signal:i})=>{if(!e)return {entries:[],currentPage:0};let o={"account-name":e,"coin-type":t,"page-size":r,direction:"desc"};n!==null&&(o.page=n);let s=await re("balance","/accounts/{account-name}/balance-history",o,void 0,void 0,i);return {entries:s.operations_result,currentPage:n??s.total_pages}},getNextPageParam:n=>{let i=n.currentPage-1;return i>=1?i:void 0},enabled:!!e})}function bv(e,t="HIVE",r="yearly"){return queryOptions({queryKey:c.wallet.aggregatedHistory(e??"",t,r),queryFn:async()=>e?await re("balance","/accounts/{account-name}/aggregated-history",{"account-name":e,"coin-type":t,granularity:r}):[],enabled:!!e,staleTime:6e4})}function Ov(){return queryOptions({queryKey:c.accounts.proMembers(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/pro-members",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch pro members: ${e.status}`);return e.json()},staleTime:300*1e3})}function xv(e){return new Set((e??[]).map(t=>t.toLowerCase()))}function Rv(e,t,r){let n=useQueryClient(),{data:i}=useQuery(Q(e));return v(["accounts","update"],e,o=>{let s=ti(n.getQueryData(Q(e).queryKey),i);if(!s)throw new Error("[SDK][Accounts] \u2013 cannot update not existing account");return [["account_update2",{account:e,json_metadata:"",extensions:[],posting_json_metadata:ri({existingPostingJsonMetadata:s.posting_json_metadata,profile:o.profile,tokens:o.tokens})}]]},async(o,s)=>{n.setQueryData(Q(e).queryKey,a=>{if(!a)return a;let u=JSON.parse(JSON.stringify(a));return u.profile=dr({existingProfile:ei(a),profile:s.profile,tokens:s.tokens}),u}),await k(t?.adapter,r,[c.accounts.full(e)]);},t,void 0,{broadcastMode:r,onMutate:async()=>{if(e)try{await n.fetchQuery({...Q(e),staleTime:0});}catch{}}})}function Kv(e,t,r,n,i){return useMutation({mutationKey:["accounts","relation","update",e,t],mutationFn:async o=>{let s=ii(e,t);await b().prefetchQuery(s);let a=b().getQueryData(s.queryKey);return await $n(e,"follow",["follow",{follower:e,following:t,what:[...o==="toggle-ignore"&&!a?.ignores?["ignore"]:[],...o==="toggle-follow"&&!a?.follows?["blog"]:[]]}],r),{...a,ignores:o==="toggle-ignore"?!a?.ignores:a?.ignores,follows:o==="toggle-follow"?!a?.follows:a?.follows}},onError:i,onSuccess(o){n(o),b().setQueryData(c.accounts.relations(e,t),o),t&&b().invalidateQueries(Q(t));}})}function gr(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildVoteOp] Missing required parameters");if(n<-1e4||n>1e4)throw new Error("[SDK][buildVoteOp] Weight must be between -10000 and 10000");return ["vote",{voter:e,author:t,permlink:r,weight:n}]}function Be(e,t,r,n,i,o,s){if(!e||!t||n===void 0||!o)throw new Error("[SDK][buildCommentOp] Missing required parameters");return ["comment",{parent_author:r,parent_permlink:n,author:e,permlink:t,title:i,body:o,json_metadata:JSON.stringify(s)}]}function Me(e,t,r,n,i,o,s){if(!e||!t)throw new Error("[SDK][buildCommentOptionsOp] Missing required parameters");return ["comment_options",{author:e,permlink:t,max_accepted_payout:r,percent_hbd:n,allow_votes:i,allow_curation_rewards:o,extensions:s}]}function yr(e,t){if(!e||!t)throw new Error("[SDK][buildDeleteCommentOp] Missing required parameters");return ["delete_comment",{author:e,permlink:t}]}function hr(e,t,r,n=false){if(!e||!t||!r)throw new Error("[SDK][buildReblogOp] Missing required parameters");let i={account:e,author:t,permlink:r};return n&&(i.delete="delete"),["custom_json",{id:"follow",json:JSON.stringify(["reblog",i]),required_auths:[],required_posting_auths:[e]}]}function Ne(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferOp] Missing required parameters");return ["transfer",{from:e,to:t,amount:r,memo:n||""}]}function Uc(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiTransferOps] Missing required parameters");return t.trim().split(/[\s,]+/).filter(Boolean).map(o=>Ne(e,o.trim(),r,n))}function Vc(e,t,r,n,i,o){if(!e||!t||!r)throw new Error("[SDK][buildRecurrentTransferOp] Missing required parameters");if(i<24)throw new Error("[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours");return ["recurrent_transfer",{from:e,to:t,amount:r,memo:n||"",recurrence:i,executions:o,extensions:[]}]}function $e(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferToSavingsOp] Missing required parameters");return ["transfer_to_savings",{from:e,to:t,amount:r,memo:n||""}]}function Qe(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildTransferFromSavingsOp] Missing required parameters");return ["transfer_from_savings",{from:e,to:t,amount:r,memo:n||"",request_id:i}]}function Ei(e,t){if(!e||t===void 0)throw new Error("[SDK][buildCancelTransferFromSavingsOp] Missing required parameters");return ["cancel_transfer_from_savings",{from:e,request_id:t}]}function ot(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildClaimInterestOps] Missing required parameters");return [Qe(e,t,r,n,i),Ei(e,i)]}function st(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildTransferToVestingOp] Missing required parameters");return ["transfer_to_vesting",{from:e,to:t,amount:r}]}function at(e,t){if(!e||!t)throw new Error("[SDK][buildWithdrawVestingOp] Missing required parameters");return ["withdraw_vesting",{account:e,vesting_shares:t}]}function ct(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildDelegateVestingSharesOp] Missing required parameters");return ["delegate_vesting_shares",{delegator:e,delegatee:t,vesting_shares:r}]}function ut(e,t,r,n){if(!e||!t||r===void 0)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters");if(r<0||r>1e4)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");return ["set_withdraw_vesting_route",{from_account:e,to_account:t,percent:r,auto_vest:n}]}function pt(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildConvertOp] Missing required parameters");return ["convert",{owner:e,amount:t,requestid:r}]}function wr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildCollateralizedConvertOp] Missing required parameters");return ["collateralized_convert",{owner:e,amount:t,requestid:r}]}function He(e,t,r,n="tokens"){return ["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:JSON.stringify({contractName:n,contractAction:t,contractPayload:r})}]}function _r(e,t){return ["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:JSON.stringify(t.map(r=>({symbol:r})))}]}function br(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildDelegateRcOp] Missing required parameters");let n=t.includes(",")?t.split(",").map(i=>i.trim()):[t];return ["custom_json",{id:"rc",json:JSON.stringify(["delegate_rc",{from:e,delegatees:n,max_rc:r}]),required_auths:[],required_posting_auths:[e]}]}function vr(e,t){if(!e||!t)throw new Error("[SDK][buildFollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["blog"]}]),required_auths:[],required_posting_auths:[e]}]}function Ft(e,t){if(!e||!t)throw new Error("[SDK][buildUnfollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:[]}]),required_auths:[],required_posting_auths:[e]}]}function jc(e,t){if(!e||!t)throw new Error("[SDK][buildIgnoreOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["ignore"]}]),required_auths:[],required_posting_auths:[e]}]}function Lc(e,t){if(!e||!t)throw new Error("[SDK][buildUnignoreOp] Missing required parameters");return Ft(e,t)}function Ar(e,t){if(!e)throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");let r=t||new Date().toISOString().split(".")[0],n=["custom_json",{id:"notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}],i=["custom_json",{id:"ecency_notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}];return [n,i]}function Pr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");return ["account_witness_vote",{account:e,witness:t,approve:r}]}function Or(e,t){if(!e||t===void 0)throw new Error("[SDK][buildWitnessProxyOp] Missing required parameters");return ["account_witness_proxy",{account:e,proxy:t}]}function xr(e,t){if(!e||!t.receiver||!t.subject||!t.permlink||!t.start||!t.end||!t.dailyPay)throw new Error("[SDK][buildProposalCreateOp] Missing required parameters");let r=new Date(t.start),n=new Date(t.end);if(r.toString()==="Invalid Date"||n.toString()==="Invalid Date")throw new Error("[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings");return ["create_proposal",{creator:e,receiver:t.receiver,start_date:t.start,end_date:t.end,daily_pay:t.dailyPay,subject:t.subject,permlink:t.permlink,extensions:[]}]}function Er(e,t,r){if(!e||!t||t.length===0||r===void 0)throw new Error("[SDK][buildProposalVoteOp] Missing required parameters");return ["update_proposal_votes",{voter:e,proposal_ids:t,approve:r,extensions:[]}]}function $c(e,t){if(!e||!t||t.length===0)throw new Error("[SDK][buildRemoveProposalOp] Missing required parameters");return ["remove_proposal",{proposal_owner:e,proposal_ids:t,extensions:[]}]}function Wc(e,t,r,n,i){if(e==null||typeof e!="number"||!t||!r||!n||!i)throw new Error("[SDK][buildUpdateProposalOp] Missing required parameters");return ["update_proposal",{proposal_id:e,creator:t,daily_pay:r,subject:n,permlink:i,extensions:[]}]}function Sr(e,t){if(!e||!t)throw new Error("[SDK][buildSubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["subscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function kr(e,t){if(!e||!t)throw new Error("[SDK][buildUnsubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["unsubscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Cr(e,t,r,n){if(!e||!t||!r||!n)throw new Error(`[SDK][buildSetRoleOp] Missing required parameters: username=${e}, community=${t}, account=${r}, role=${n}`);return ["custom_json",{id:"community",json:JSON.stringify(["setRole",{community:t,account:r,role:n}]),required_auths:[],required_posting_auths:[e]}]}function Tr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildUpdateCommunityOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["updateProps",{community:t,props:r}]),required_auths:[],required_posting_auths:[e]}]}function Rr(e,t,r,n,i){if(!e||!t||!r||!n||i===void 0)throw new Error("[SDK][buildPinPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"pinPost":"unpinPost",{community:t,account:r,permlink:n}]),required_auths:[],required_posting_auths:[e]}]}function Fr(e,t,r,n,i,o){if(!e||!t||!r||!n||o===void 0)throw new Error("[SDK][buildMutePostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([o?"mutePost":"unmutePost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}function Gc(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildMuteUserOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"muteUser":"unmuteUser",{community:t,account:r,notes:n}]),required_auths:[],required_posting_auths:[e]}]}function zc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildFlagPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["flagPost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}var Si=(r=>(r.Buy="buy",r.Sell="sell",r))(Si||{}),ki=(r=>(r.EMPTY="",r.SWAP="9",r))(ki||{});function It(e,t,r,n,i,o){if(!e||!t||!r||!i||o===void 0)throw new Error("[SDK][buildLimitOrderCreateOp] Missing required parameters");return ["limit_order_create",{owner:e,orderid:o,amount_to_sell:t,min_to_receive:r,fill_or_kill:n,expiration:i}]}function qt(e,t=3){return e.toFixed(t)}function Jc(e,t,r,n,i=""){if(!e||n===void 0||!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new Error("[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters");let o=new Date(Date.now());o.setDate(o.getDate()+27);let s=o.toISOString().split(".")[0],a=+`${i}${Math.floor(Date.now()/1e3).toString().slice(2)}`,u=n==="buy"?`${qt(t,3)} HBD`:`${qt(t,3)} HIVE`,p=n==="buy"?`${qt(r,3)} HIVE`:`${qt(r,3)} HBD`;return It(e,u,p,false,s,a)}function qr(e,t){if(!e||t===void 0)throw new Error("[SDK][buildLimitOrderCancelOp] Missing required parameters");return ["limit_order_cancel",{owner:e,orderid:t}]}function Ir(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildClaimRewardBalanceOp] Missing required parameters");return ["claim_reward_balance",{account:e,reward_hive:t,reward_hbd:r,reward_vests:n}]}function Yc(e,t,r,n,i,o){if(!e||!i)throw new Error("[SDK][buildAccountUpdateOp] Missing required parameters");return ["account_update",{account:e,owner:t,active:r,posting:n,memo_key:i,json_metadata:o}]}function Xc(e,t,r,n){if(!e||r===void 0)throw new Error("[SDK][buildAccountUpdate2Op] Missing required parameters");return ["account_update2",{account:e,json_metadata:t||"",posting_json_metadata:r,extensions:n||[]}]}function Dr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildAccountCreateOp] Missing required parameters");let i={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},o={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},s={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["account_create",{creator:e,new_account_name:t,owner:i,active:o,posting:s,memo_key:r.memoPublicKey,json_metadata:"",fee:n}]}function Kr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildCreateClaimedAccountOp] Missing required parameters");let n={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},i={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},o={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["create_claimed_account",{creator:e,new_account_name:t,owner:n,active:i,posting:o,memo_key:r.memoPublicKey,json_metadata:"",extensions:[]}]}function Br(e,t){if(!e||!t)throw new Error("[SDK][buildClaimAccountOp] Missing required parameters");return ["claim_account",{creator:e,fee:t,extensions:[]}]}function Mr(e,t,r,n,i,o){if(!e||!t||!r||!i)throw new Error("[SDK][buildGrantPostingPermissionOp] Missing required parameters");let s=t.account_auths.findIndex(([p])=>p===r),a=[...t.account_auths];s>=0?a[s]=[r,n]:a.push([r,n]);let u={...t,account_auths:a};return u.account_auths.sort((p,l)=>p[0]>l[0]?1:-1),["account_update",{account:e,posting:u,memo_key:i,json_metadata:o}]}function Zc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildRevokePostingPermissionOp] Missing required parameters");let o={...t,account_auths:t.account_auths.filter(([s])=>s!==r)};return ["account_update",{account:e,posting:o,memo_key:n,json_metadata:i}]}function eu(e,t,r=[]){if(!e||!t)throw new Error("[SDK][buildChangeRecoveryAccountOp] Missing required parameters");return ["change_recovery_account",{account_to_recover:e,new_recovery_account:t,extensions:r}]}function tu(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");return ["request_account_recovery",{recovery_account:e,account_to_recover:t,new_owner_authority:r,extensions:n}]}function ru(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRecoverAccountOp] Missing required parameters");return ["recover_account",{account_to_recover:e,new_owner_authority:t,recent_owner_authority:r,extensions:n}]}function Nr(e,t,r){if(!e||!t||!Number.isFinite(r))throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");return ["custom_json",{id:"ecency_boost_plus",json:JSON.stringify({user:e,account:t,duration:r}),required_auths:[e],required_posting_auths:[]}]}function Qr(e,t){if(!e||!Number.isInteger(t)||t<=0)throw new Error("[SDK][buildRcDelegationOp] Missing or invalid parameters");return ["custom_json",{id:"ecency_rc_delegation",json:JSON.stringify({user:e,duration:t}),required_auths:[e],required_posting_auths:[]}]}function Hr(e,t,r,n){if(!e||!t||!r||!Number.isFinite(n))throw new Error("[SDK][buildPromoteOp] Missing required parameters");return ["custom_json",{id:"ecency_promote",json:JSON.stringify({user:e,author:t,permlink:r,duration:n}),required_auths:[e],required_posting_auths:[]}]}function We(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildPointTransferOp] Missing required parameters");let i=r.replace(/POINTS\b/,"POINT");return ["custom_json",{id:"ecency_point_transfer",json:JSON.stringify({sender:e,receiver:t,amount:i,memo:n||""}),required_auths:[e],required_posting_auths:[]}]}function nu(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");let i=t.trim().split(/[\s,]+/).filter(Boolean);if(i.length===0)throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");return i.map(o=>We(e,o.trim(),r,n))}function Ur(e){if(!e)throw new Error("[SDK][buildCommunityRegistrationOp] Missing required parameters");return ["custom_json",{id:"ecency_registration",json:JSON.stringify({name:e}),required_auths:[e],required_posting_auths:[]}]}function iu(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildActiveCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[e],required_posting_auths:[]}]}function ou(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildPostingCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[],required_posting_auths:[e]}]}function nA(e,t,r){return v(["accounts","follow"],e,({following:n})=>[vr(e,n)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function aA(e,t,r){return v(["accounts","unfollow"],e,({following:n})=>[Ft(e,n)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function lA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","add",e],mutationFn:async({author:i,permlink:o})=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:i,permlink:o,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function gA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:i,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function _A(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","add",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/favorites-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})})).json()},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:n})}function OA(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");let s=await w()(d.privateApiHost+"/private-api/favorites-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})});if(!s.ok)throw new Error(`Failed to delete favorite: ${s.status}`);return s.json()},onMutate:async i=>{if(!e)return;let o=b(),s=c.accounts.favorites(e),a=c.accounts.favoritesInfinite(e),u=c.accounts.checkFavorite(e,i);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a}),o.cancelQueries({queryKey:u})]);let p=o.getQueryData(s);p&&o.setQueryData(s,p.filter(y=>y.account!==i));let l=o.getQueryData(u);o.setQueryData(u,false);let f=o.getQueriesData({queryKey:a}),m=new Map(f);for(let[y,h]of f)h&&o.setQueryData(y,{...h,pages:h.pages.map(S=>({...S,data:S.data.filter(x=>x.account!==i)}))});return {previousList:p,previousInfinite:m,previousCheck:l}},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.accounts.favorites(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);s?.previousCheck!==void 0&&a.setQueryData(c.accounts.checkFavorite(e,o),s.previousCheck),n(i);}})}function du(e,t){let r=new Map;return e.forEach(([n,i])=>{r.set(n.toString(),i);}),t.forEach(([n,i])=>{r.set(n.toString(),i);}),Array.from(r.entries()).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i])}function Ci(e,t){let{data:r}=useQuery(Q(e));return useMutation({mutationKey:["accounts","keys-update",e],mutationFn:async({keys:n,keepCurrent:i=false,currentKey:o,keysToRevoke:s=[],keysToRevokeByAuthority:a={}})=>{if(n.length===0)throw new Error("[SDK][Update password] \u2013 no new keys provided");if(!r)throw new Error("[SDK][Update password] \u2013 cannot update keys for anon user");let u=p=>{let l=JSON.parse(JSON.stringify(r[p])),m=[...a[p]||[],...a[p]===void 0?s:[]],y=i?l.key_auths.filter(([h])=>!m.includes(h.toString())):[];return l.key_auths=du(y,n.map((h,S)=>[h[p].createPublic().toString(),S+1])),l};return te([["account_update",{account:e,json_metadata:r.json_metadata,owner:u("owner"),active:u("active"),posting:u("posting"),memo_key:n[0].memo_key.createPublic().toString()}]],o)},...t})}function IA(e,t){let{data:r}=useQuery(Q(e)),{mutateAsync:n}=Ci(e);return useMutation({mutationKey:["accounts","password-update",e],mutationFn:async({newPassword:i,currentPassword:o,keepCurrent:s})=>{if(!r)throw new Error("[SDK][Update password] \u2013 cannot update password for anon user");let a=U.fromLogin(e,o,"owner");return n({currentKey:a,keepCurrent:s,keys:[{owner:U.fromLogin(e,i,"owner"),active:U.fromLogin(e,i,"active"),posting:U.fromLogin(e,i,"posting"),memo_key:U.fromLogin(e,i,"memo")}]})},...t})}function QA(e,t,r){let n=useQueryClient(),{data:i}=useQuery(Q(e));return useMutation({mutationKey:["accounts","revoke-posting",i?.name],mutationFn:async({accountName:o,type:s,key:a})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user");let u=JSON.parse(JSON.stringify(i.posting));u.account_auths=u.account_auths.filter(([l])=>l!==o);let p={account:i.name,posting:u,memo_key:i.memo_key,json_metadata:i.json_metadata};if(s==="key"&&a)return te([["account_update",p]],a);if(s==="keychain"){if(!r?.broadcast)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return r.broadcast([["account_update",p]],"active")}else return t.hsCallbackUrl,Ln.sendOperation(["account_update",p],t.hsCallbackUrl?{callback:t.hsCallbackUrl}:{},()=>{})},onError:t.onError,onSuccess:(o,s,a)=>{t.onSuccess?.(o,s,a),n.setQueryData(Q(e).queryKey,u=>({...u,posting:{...u?.posting,account_auths:u?.posting?.account_auths?.filter(([p])=>p!==s.accountName)??[]}}));}})}function WA(e,t,r,n){let{data:i}=useQuery(Q(e));return useMutation({mutationKey:["accounts","recovery",i?.name],mutationFn:async({accountName:o,type:s,key:a,email:u})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user");let p={account_to_recover:i.name,new_recovery_account:o,extensions:[]};if(s==="ecency"){if(!t)throw new Error("[SDK][Accounts] \u2013 missing access token");let f=await w()(d.privateApiHost+"/private-api/recoveries-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,email:u,publicKeys:[...i.owner.key_auths,...i.active.key_auths,...i.posting.key_auths,i.memo_key]})});if(!f.ok)throw new Error(`[SDK][Accounts] Failed to add recovery: ${f.status}`);return f}else {if(s==="key"&&a)return te([["change_recovery_account",p]],a);if(s==="keychain"){if(!n?.broadcast)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return n.broadcast([["change_recovery_account",p]],"owner")}else return r.hsCallbackUrl,Ln.sendOperation(["change_recovery_account",p],r.hsCallbackUrl?{callback:r.hsCallbackUrl}:{},()=>{})}},onError:r.onError,onSuccess:r.onSuccess})}function zA(e,t){let r=e.key_auths.filter(([i])=>!t.has(String(i))).reduce((i,[,o])=>i+o,0),n=(e.account_auths??[]).reduce((i,[,o])=>i+o,0);return r+n>=e.weight_threshold}function Ti(e,t){let r=new Set(t.map(s=>s.toString())),n=s=>s.key_auths.some(([a])=>r.has(String(a))),i=s=>{let a=JSON.parse(JSON.stringify(s));return a.key_auths=a.key_auths.filter(([u])=>!r.has(u.toString())),a},o=n(e.owner);return {account:e.name,json_metadata:e.json_metadata,owner:o?i(e.owner):void 0,active:i(e.active),posting:i(e.posting),memo_key:e.memo_key}}function tP(e,t){let{data:r}=useQuery(Q(e));return useMutation({mutationKey:["accounts","revoke-key",r?.name],mutationFn:async({currentKey:n,revokingKey:i})=>{if(!r)throw new Error("[SDK][Revoke key] \u2013 cannot update keys for anon user");let o=Array.isArray(i)?i:[i],s=Ti(r,o);return te([["account_update",s]],n)},...t})}function oP(e,t,r){return v(["accounts","claimAccount"],e,({creator:n,fee:i="0.000 HIVE"})=>[Br(n,i)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(i.creator)]);},t,"active",{broadcastMode:r})}function uP(e,t,r){return v(["accounts","grant-posting-permission"],e,n=>[Mr(e,n.currentPosting,n.grantedAccount,n.weightThreshold,n.memoKey,n.jsonMetadata)],async()=>{await k(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}function fP(e,t,r){return v(["accounts","create"],e,n=>[n.useClaimed?Kr(e,n.newAccountName,n.keys):Dr(e,n.newAccountName,n.keys,n.fee)],async()=>{await k(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}var Vr=300*60*24,Ou=1e4,xu=5e7;function Ri(e){let t=T(e.vesting_shares).amount,r=T(e.received_vesting_shares).amount,n=T(e.delegated_vesting_shares).amount,i=T(e.vesting_withdraw_rate).amount,o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t+r-n-s}function Eu(e,t,r){let n=e*1e6;return (t*r/1e4/50+1)*n/1e4}function Su(e){if(Number.isFinite(e.lastHardfork))return e.lastHardfork>=28;let[t="0",r="0"]=(e.currentHardforkVersion??"0.0.0").split(".");return Number(t)>1||Number(t)===1&&Number(r)>=28}function ku(e,t,r){let n=t.votePowerReserveRate||Number(t.raw?.globalDynamic?.vote_power_reserve_rate??0);if(!Number.isFinite(n)||n<=0)return 0;let i=Ri(e);if(!Number.isFinite(i)||i<=0)return 0;let o=i*1e6,s=Math.ceil(o*r*60*60*24/Ou/(n*Vr)),a=ur(e),u=Math.min(a.current_mana,a.max_mana);return !Number.isFinite(u)||s>u?0:Math.max(s-xu,0)}function Cu(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;if(Su(t))return ku(e,t,n);let i=0;try{if(i=Ri(e),!Number.isFinite(i))return 0}catch{return 0}return Eu(i,r,n)}function hP(e){return ur(e).percentage/100}function wP(e){if(!Number.isFinite(e))throw new TypeError("Voting power must be a finite number");if(e<0||e>100)throw new RangeError("Voting power must be between 0 and 100");return (100-e)*100*Vr/1e4}function _P(e){let t=parseFloat(e.vesting_shares)+parseFloat(e.received_vesting_shares)-parseFloat(e.delegated_vesting_shares),r=Math.floor(Date.now()/1e3)-e.downvote_manabar.last_update_time,n=t*1e6/4;if(n<=0)return 0;let i=parseFloat(e.downvote_manabar.current_mana.toString())+r*n/Vr;i>n&&(i=n);let o=i*100/n;return isNaN(o)?0:o>100?100:o}function bP(e){return Et(e).percentage/100}function vP(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;let{fundRecentClaims:i,fundRewardBalance:o,base:s,quote:a}=t;if(!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(a)||i===0||a===0)return 0;let u=Cu(e,t,r,n);return Number.isFinite(u)?u/i*o*(s/a):0}var Tu={vote:"posting",comment:"posting",delete_comment:"posting",comment_options:"posting",claim_reward_balance:"posting",cancel_transfer_from_savings:"active",collateralized_convert:"active",convert:"active",delegate_vesting_shares:"active",recurrent_transfer:"active",set_withdraw_vesting_route:"active",transfer:"active",transfer_from_savings:"active",transfer_to_savings:"active",transfer_to_vesting:"active",withdraw_vesting:"active",limit_order_create:"active",limit_order_cancel:"active",account_update:"active",account_update2:"active",claim_account:"active",create_claimed_account:"active",account_witness_proxy:"active",account_witness_vote:"active",remove_proposal:"active",update_proposal_votes:"active",change_recovery_account:"owner",request_account_recovery:"owner",recover_account:"owner",reset_account:"owner",set_reset_account:"owner"};function Ru(e){let t=e[0],r=e[1];if(t!=="custom_json")throw new Error("Operation is not a custom_json operation");let n=r;return n.required_auths&&n.required_auths.length>0?"active":(n.required_posting_auths&&n.required_posting_auths.length>0,"posting")}function Fu(e){let t=e[0];if(t!=="create_proposal"&&t!=="update_proposal")throw new Error("Operation is not a proposal operation");return "active"}function qu(e){let t=e[0];return t==="custom_json"?Ru(e):t==="create_proposal"||t==="update_proposal"?Fu(e):Tu[t]??"posting"}function PP(e){let t="posting";for(let r of e){let n=qu(r);if(n==="owner")return "owner";n==="active"&&t==="posting"&&(t="active");}return t}function kP(e){return useMutation({mutationKey:["operations","sign",e],mutationFn:({operation:t,keyOrSeed:r})=>{if(!e)throw new Error("[Operations][Sign] \u2013 cannot sign op with anon user");let n;return r.split(" ").length===12?n=U.fromLogin(e,r,"active"):Hn(r)?n=U.fromString(r):n=U.from(r),te([t],n)}})}function RP(e,t,r="active"){return useMutation({mutationKey:["operations","sign-keychain",e],mutationFn:({operation:n})=>{if(!e)throw new Error("[SDK][Keychain] \u2013\xA0cannot sign operation with anon user");if(!t?.broadcast)throw new Error("[SDK][Keychain] \u2013 missing keychain broadcaster");return t.broadcast([n],r)}})}function DP(e="/"){return useMutation({mutationKey:["operations","sign-hivesigner",e],mutationFn:async({operation:t})=>Ln.sendOperation(t,{callback:e},()=>{})})}function NP(){return queryOptions({queryKey:["operations","chain-properties"],queryFn:async()=>await g("condenser_api.get_chain_properties",[])})}function Fi(e,t,r){return {...e,...t??{},title:r.title,body:r.body}}function qi(e,t){return {...e??{},title:t.title,body:t.body}}function WP(e,t){return useMutation({mutationKey:["posts","add-fragment",e],mutationFn:async({title:r,body:n})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let o=await w()(d.privateApiHost+"/private-api/fragments-add",{method:"POST",body:JSON.stringify({code:t,title:r,body:n}),headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`[SDK][Posts] Failed to add fragment: ${o.status}`);return o.json()},onSuccess(r,n){let i=b(),o=qi(r,n);i.setQueryData(Le(e,t).queryKey,s=>[o,...s??[]]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map((a,u)=>u===0?{...a,data:[o,...a.data]}:a)});}})}function e0(e,t){return useMutation({mutationKey:["posts","edit-fragment",e],mutationFn:async({fragmentId:r,title:n,body:i})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let s=await w()(d.privateApiHost+"/private-api/fragments-update",{method:"POST",body:JSON.stringify({code:t,id:r,title:n,body:i}),headers:{"Content-Type":"application/json"}});if(!s.ok)throw new Error(`[SDK][Posts] Failed to update fragment: ${s.status}`);return s.json()},onSuccess(r,n){let i=b(),o=s=>Fi(s,r,n);i.setQueryData(Le(e,t).queryKey,s=>s?.map(a=>a.id===n.fragmentId?o(a):a)??[]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map(a=>({...a,data:a.data.map(u=>u.id===n.fragmentId?o(u):u)}))});}})}function s0(e,t){return useMutation({mutationKey:["posts","remove-fragment",e],mutationFn:async({fragmentId:r})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let i=await w()(d.privateApiHost+"/private-api/fragments-delete",{method:"POST",body:JSON.stringify({code:t,id:r}),headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`[SDK][Posts] Failed to delete fragment: ${i.status}`);return i},onSuccess(r,n){let i=b();i.setQueryData(Le(e,t).queryKey,o=>[...o??[]].filter(({id:s})=>s!==n.fragmentId)),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},o=>o&&{...o,pages:o.pages.map(s=>({...s,data:s.data.filter(a=>a.id!==n.fragmentId)}))});}})}async function J(e){if(!e.ok){let r;try{r=await e.json();}catch{r=void 0;}let n=new Error(`Request failed with status ${e.status}`);throw n.status=e.status,n.data=r,n}let t=await e.text();if(!t||t.trim()==="")return "";try{return JSON.parse(t)}catch(r){return console.warn("[SDK] Failed to parse JSON response:",r,"Response:",t),""}}async function u0(e,t,r,n){let o=await w()(d.privateApiHost+"/private-api/account-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,email:t,referral:r,captcha_token:n})}),s=await J(o);return {status:o.status,data:s}}async function p0(e){let r=await w()(d.privateApiHost+"/private-api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e})}),n=await J(r);return {status:r.status,data:n}}async function l0(e,t,r="",n=""){let i={code:e,ty:t};r&&(i.bl=r),n&&(i.tx=n);let s=await w()(d.privateApiHost+"/private-api/usr-activity",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});await J(s);}async function d0(e,t,r=null,n=null){let i={code:e};t&&(i.filter=t),r&&(i.since=r),n&&(i.user=n);let s=await w()(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return J(s)}async function f0(e,t,r,n,i,o){let s={code:e,username:t,token:o,system:r,allows_notify:n,notify_types:i},u=await w()(d.privateApiHost+"/private-api/register-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return J(u)}async function m0(e,t,r){let n={code:e,username:t,token:r},o=await w()(d.privateApiHost+"/private-api/detail-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return J(o)}async function Ii(e,t){let r={code:e};t&&(r.id=t);let i=await w()(d.privateApiHost+"/private-api/notifications/mark",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Di(e,t){let r={code:e,url:t},i=await w()(d.privateApiHost+"/private-api/images-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}var Uu="https://i.ecency.com";async function Ki(e,t,r){let n=w(),i=new FormData;i.append("file",e);let o=await n(`${Uu}/hs/${t}`,{method:"POST",body:i,signal:r});return J(o)}async function g0(e,t,r,n){let i=w(),o=new FormData;o.append("file",e);let s=await i(`${d.imageHost}/${t}/${r}`,{method:"POST",body:o,signal:n});return J(s)}async function Bi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/images-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Mi(e,t,r,n,i){let o={code:e,title:t,body:r,tags:n,meta:i},a=await w()(d.privateApiHost+"/private-api/drafts-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});return J(a)}async function Ni(e,t,r,n,i,o){let s={code:e,id:t,title:r,body:n,tags:i,meta:o},u=await w()(d.privateApiHost+"/private-api/drafts-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return J(u)}async function Qi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/drafts-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Hi(e,t,r,n,i,o,s,a){let u={code:e,permlink:t,title:r,body:n,meta:i,schedule:s,reblog:a};o&&(u.options=o);let l=await w()(d.privateApiHost+"/private-api/schedules-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return J(l)}async function Ui(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Vi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function y0(e,t,r){let n={code:e,author:t,permlink:r},o=await w()(d.privateApiHost+"/private-api/promoted-post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return J(o)}async function h0(e,t,r){let n={username:e,email:t,friend:r},o=await w()(d.privateApiHost+"/private-api/account-create-friend",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return J(o)}function A0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","add",e],mutationFn:async({title:i,body:o,tags:s,meta:a})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addDraft");return Mi(t,i,o,s,a)},onSuccess:i=>{r?.();let o=b();i?.drafts?o.setQueryData(c.posts.drafts(e),i.drafts):o.invalidateQueries({queryKey:c.posts.drafts(e)}),o.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function S0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","update",e],mutationFn:async({draftId:i,title:o,body:s,tags:a,meta:u})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for updateDraft");return Ni(t,i,o,s,a,u)},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function q0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","delete",e],mutationFn:async({draftId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteDraft");return Qi(t,i)},onMutate:async({draftId:i})=>{if(!e)return;let o=b(),s=c.posts.drafts(e),a=c.posts.draftsInfinite(e);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a})]);let u=o.getQueryData(s);u&&o.setQueryData(s,u.filter(f=>f._id!==i));let p=o.getQueriesData({queryKey:a}),l=new Map(p);for(let[f,m]of p)m&&o.setQueryData(f,{...m,pages:m.pages.map(y=>({...y,data:y.data.filter(h=>h._id!==i)}))});return {previousList:u,previousInfinite:l}},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.posts.drafts(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);n?.(i);}})}function M0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","add",e],mutationFn:async({permlink:i,title:o,body:s,meta:a,options:u,schedule:p,reblog:l})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addSchedule");return Hi(t,i,o,s,a,u,p,l)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function V0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","delete",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteSchedule");return Ui(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function G0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","move",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for moveSchedule");return Vi(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)}),o.invalidateQueries({queryKey:c.posts.drafts(e)});},onError:n})}function Z0(e,t,r,n){return useMutation({mutationKey:["posts","images","add",e],mutationFn:async({url:i,code:o})=>{let s=o??t;if(!e||!s)throw new Error("[SDK][Posts] \u2013 missing auth for addImage");return Di(s,i)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.images(e)});},onError:n})}function iO(e,t,r,n){return useMutation({mutationKey:["posts","images","delete",e],mutationFn:async({imageId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteImage");return Bi(t,i)},onSuccess:(i,o)=>{r?.();let s=b(),{imageId:a}=o;s.setQueryData(["posts","images",e],u=>u?.filter(p=>p._id!==a)),s.setQueriesData({queryKey:["posts","images","infinite",e]},u=>u&&{...u,pages:u.pages.map(p=>({...p,data:p.data.filter(l=>l._id!==a)}))});},onError:n})}function cO(e,t){return useMutation({mutationKey:["posts","images","upload"],mutationFn:async({file:r,token:n,signal:i})=>Ki(r,n,i),onSuccess:e,onError:t})}function Kt(e,t){return `/@${e}/${t}`}function Xu(e,t,r){return (r??b()).getQueryData(c.posts.entry(Kt(e,t)))}function Zu(e,t){(t??b()).setQueryData(c.posts.entry(Kt(e.author,e.permlink)),e);}function Dt(e,t,r,n){let i=n??b(),o=Kt(e,t),s=i.getQueryData(c.posts.entry(o));if(!s)return;let a=r(s);return i.setQueryData(c.posts.entry(o),a),s}var Se;(a=>{function e(u,p,l,f,m){Dt(u,p,y=>({...y,active_votes:l,stats:{...y.stats||{gray:false,hide:false,flag_weight:0,total_votes:0},total_votes:l.length,flag_weight:y.stats?.flag_weight||0},total_votes:l.length,payout:f,pending_payout_value:String(f)}),m);}a.updateVotes=e;function t(u,p,l,f){Dt(u,p,m=>({...m,reblogs:l}),f);}a.updateReblogsCount=t;function r(u,p,l,f){Dt(u,p,m=>({...m,children:l}),f);}a.updateRepliesCount=r;function n(u,p,l,f){Dt(p,l,m=>({...m,children:m.children+1,replies:[u,...m.replies]}),f);}a.addReply=n;function i(u,p){u.forEach(l=>Zu(l,p));}a.updateEntries=i;function o(u,p,l){(l??b()).invalidateQueries({queryKey:c.posts.entry(Kt(u,p))});}a.invalidateEntry=o;function s(u,p,l){return Xu(u,p,l)}a.getEntry=s;})(Se||(Se={}));function ep(e,t,r){let n=e.some(i=>i.voter===t);return r!==0?n:!n}function tp(e,t,r){let n=Se.getEntry(t.author,t.permlink,r);if(!n?.active_votes||ep(n.active_votes,e,t.weight))return;let i=[...n.active_votes.filter(s=>s.voter!==e),...t.weight!==0?[{rshares:t.weight,voter:e}]:[]],o=n.payout+(t.estimated??0);Se.updateVotes(t.author,t.permlink,i,o,r);}function gO(e,t,r){return v(["posts","vote"],e,({author:n,permlink:i,weight:o})=>[gr(e,n,i,o)],async(n,i)=>{tp(e,i);let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(120,o,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let s=()=>{t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.accounts.full(e)]);};(r??"async")==="async"?setTimeout(s,4e3):s();}},t,"posting",{broadcastMode:r??"async"})}function bO(e,t,r){return v(["posts","reblog"],e,({author:n,permlink:i,deleteReblog:o})=>[hr(e,n,i,o??false)],async(n,i)=>{let o=Se.getEntry(i.author,i.permlink);if(o){let p=Math.max(0,(o.reblogs??0)+(i.deleteReblog?-1:1));Se.updateReblogsCount(i.author,i.permlink,p);}let s=n?.id??n?.tx_id;t?.adapter?.recordActivity&&s&&t.adapter.recordActivity(130,s,n?.block_num).catch(()=>{});let a=()=>{b().invalidateQueries({queryKey:c.posts.accountPostsBlogPrefix(e)}),t?.adapter?.invalidateQueries&&t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.posts.rebloggedBy(i.author,i.permlink)]);};(r??"async")==="async"?setTimeout(a,4e3):a();},t,"posting",{broadcastMode:r??"async"})}function OO(e,t,r){return v(["posts","comment"],e,n=>{let i=[];if(i.push(Be(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(Me(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=!i.parentAuthor,s=o?100:110,a=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&a&&t.adapter.recordActivity(s,a,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let u=[c.accounts.full(e),c.resourceCredits.account(e)];if(!o){u.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let p=i.rootAuthor||i.parentAuthor,l=i.rootPermlink||i.parentPermlink;u.push({predicate:f=>{let m=f.queryKey;return Array.isArray(m)&&m[0]==="posts"&&m[1]==="discussions"&&m[2]===p&&m[3]===l}});}await t.adapter.invalidateQueries(u);}},t,"posting",{broadcastMode:r})}function SO(e,t,r,n){let i=n??b(),o=i.getQueriesData({predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="discussions"&&a[2]===t&&a[3]===r}});for(let[s,a]of o)a&&i.setQueryData(s,[e,...a]);}function ji(e,t,r,n,i){let o=i??b(),s=new Map,a=o.getQueriesData({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===r&&p[3]===n}});for(let[u,p]of a)p&&(s.set(u,p),o.setQueryData(u,p.filter(l=>l.author!==e||l.permlink!==t)));return s}function Li(e,t){let r=t??b();for(let[n,i]of e)r.setQueryData(n,i);}function kO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`,s=i.getQueryData(c.posts.entry(o));return s&&i.setQueryData(c.posts.entry(o),{...s,...r}),s}function CO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`;i.setQueryData(c.posts.entry(o),r);}function IO(e,t,r){return v(["posts","deleteComment"],e,({author:n,permlink:i})=>[yr(n,i)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e)];if(i.parentAuthor&&i.parentPermlink){o.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let s=i.rootAuthor||i.parentAuthor,a=i.rootPermlink||i.parentPermlink;o.push({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===s&&p[3]===a}});}await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r,onMutate:async n=>{let i=n.rootAuthor||n.parentAuthor,o=n.rootPermlink||n.parentPermlink;return i&&o?{snapshots:ji(n.author,n.permlink,i,o)}:{}},onError:(n,i,o)=>{let{snapshots:s}=o??{};s&&Li(s);}})}function MO(e,t,r){return v(["posts","cross-post"],e,n=>{let i=[];if(i.push(Be(n.author,n.permlink,"",n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true}=n.options;i.push(Me(n.author,n.permlink,o,s,a,u,[]));}return i},async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e),{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.parentPermlink}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"async"})}function UO(e,t,r){return v(["posts","update-reply"],e,n=>{let i=[];if(i.push(Be(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(Me(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(110,o,n?.block_num).catch(s=>{console.debug("[SDK][Posts][useUpdateReply] recordActivity failed",{activityType:110,blockNum:n?.block_num,transactionId:o,error:s});}),t?.adapter?.invalidateQueries){let s=[c.resourceCredits.account(e)];s.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let a=i.rootAuthor||i.parentAuthor,u=i.rootPermlink||i.parentPermlink;s.push({predicate:p=>{let l=p.queryKey;return Array.isArray(l)&&l[0]==="posts"&&l[1]==="discussions"&&l[2]===a&&l[3]===u}}),await t.adapter.invalidateQueries(s);}},t,"posting",{broadcastMode:r})}function $O(e,t,r){return v(["ecency","promote"],e,({author:n,permlink:i,duration:o})=>[Hr(e,n,i,o)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.posts._promotedPrefix],[...c.points._prefix(e)],c.posts.entry(`/@${i.author}/${i.permlink}`)]);},t,"active",{broadcastMode:r})}var rp=[3e3,3e3,3e3],np=e=>new Promise(t=>setTimeout(t,e));async function ip(e,t){return g("condenser_api.get_content",[e,t])}async function op(e,t,r=0,n){let i=n?.delays??rp,o;try{o=await ip(e,t);}catch{o=void 0;}if(o||r>=i.length)return;let s=i[r];return s>0&&await np(s),op(e,t,r+1,n)}var Ge={};gt(Ge,{useRecordActivity:()=>jr});function ap(){return typeof window<"u"&&window.location?{url:window.location.href,domain:window.location.host}:{url:"",domain:""}}function jr(e,t,r){return useMutation({mutationKey:["analytics",t],mutationFn:async()=>{if(!t)throw new Error("[SDK][Analytics] \u2013 no activity type provided");let n=w(),i=ap(),o=r?.url??i.url,s=r?.domain??i.domain;try{await n(d.plausibleHost+"/api/event",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,url:o,domain:s,props:{username:e}})});}catch{}}})}function rx(e){return queryOptions({queryKey:["analytics","discover-leaderboard",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/leaderboard/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch leaderboard: ${r.status}`);return r.json()}})}function ax(e){return queryOptions({queryKey:["analytics","discover-curation",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/curation/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch curation data: ${r.status}`);let n=await r.json(),i=n.map(s=>s.account),o=await g("condenser_api.get_accounts",[i]);for(let s=0;sa.efficiency-s.efficiency),n}})}function lx(e,t=[],r=["visitors","pageviews","visit_duration"],n){let i=[...t].sort(),o=[...r].sort();return queryOptions({queryKey:["analytics","page-stats",e,i,o,n],queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/api/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,date_range:n}),signal:s});if(!a.ok)throw new Error(`Failed to fetch page stats: ${a.status}`);return a.json()},enabled:!!e,staleTime:0})}var Bt="threespeakfund",hx=1100;function lp(e){return /https?:\/\/([a-z0-9-]+\.)*3speak\.tv\/embed[?/]/i.test(e)}function wx(e,t){if(!lp(t))return e;let r=e.find(n=>n.account===Bt);return r&&r.weight===1100?e:r?e.map(n=>n.account===Bt?{...n,weight:1100}:n):[...e,{account:Bt,weight:1100}]}function _x(e){return e===Bt}var Wr={};gt(Wr,{getAccountTokenQueryOptions:()=>$r,getAccountVideosQueryOptions:()=>hp});var Lr={};gt(Lr,{getDecodeMemoQueryOptions:()=>mp});function mp(e,t,r){return queryOptions({queryKey:["integrations","hivesigner","decode-memo",e],queryFn:async()=>{if(r)return new Ln.Client({accessToken:r}).decode(t)}})}var $i={queries:Lr};function $r(e,t){return queryOptions({queryKey:["integrations","3speak","authenticate",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let n=await w()(`https://studio.3speak.tv/mobile/login?username=${e}&hivesigner=true`,{headers:{"Content-Type":"application/json"}}),i=$i.queries.getDecodeMemoQueryOptions(e,(await n.json()).memo,t);await b().prefetchQuery(i);let{memoDecoded:o}=b().getQueryData(i.queryKey);return o.replace("#","")}})}function hp(e,t){return queryOptions({queryKey:["integrations","3speak","videos",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let r=$r(e,t);await b().prefetchQuery(r);let n=b().getQueryData(r.queryKey);if(!n)throw new Error("[SDK][Integrations][3Speak] \u2013 missing account token");return await(await w()("https://studio.3speak.tv/mobile/api/my-videos",{headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}})).json()}})}var Kx={queries:Wr};function Ux(e){return queryOptions({queryKey:["integrations","hiveposh","links",e],retry:false,queryFn:async()=>{try{let r=await w()(`https://hiveposh.com/api/v0/linked-accounts/${e}`,{headers:{"Content-Type":"application/json"}});if(r.status===400&&(await r.json().catch(()=>({})))?.message==="User Not Connected"||!r.ok)return null;let n=await r.json();return {twitter:{username:n.twitter_username,profile:n.twitter_profile},reddit:{username:n.reddit_username,profile:n.reddit_profile}}}catch{return null}}})}function $x({url:e,dimensions:t=[],metrics:r=["visitors","pageviews","visit_duration"],filterBy:n="event:page",dateRange:i,enabled:o=true}){return queryOptions({queryKey:["integrations","plausible",e,t,r,n,i],queryFn:async()=>{let a=await w()(`${d.privateApiHost}/api/stats`,{method:"POST",body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,filterBy:n,...i?{date_range:i}:{}}),headers:{"Content-Type":"application/json"}});if(!a.ok)throw new Error(`Failed to fetch Plausible stats: ${a.status}`);return await a.json()},enabled:!!e&&o,retry:1})}function Jx(){return queryOptions({queryKey:["resource-credits","stats"],queryFn:async()=>(await g("rc_api.get_rc_stats",{})).rc_stats})}function eE(e){return queryOptions({queryKey:["resource-credits","account",e],queryFn:async()=>(await g("rc_api.find_rc_accounts",{accounts:[e]})).rc_accounts,enabled:!!e})}var Wi={ready:false,currentMana:0,maxMana:0,avgCost:0,estimatedCost:0,willLikelyFail:false,deficit:0,remaining:0};function nE({rcAccount:e,rcStats:t,operation:r,buffer:n=1.2}){if(!e||!t?.ops)return Wi;let{current_mana:i,max_mana:o}=Et(e),s=Number(t.ops[r]?.avg_cost??0);if(!(s>0))return {...Wi,ready:true,currentMana:i,maxMana:o};let a=Number.isFinite(n)&&n>0?n:1.2,u=s*a,p=i{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/get-game",{method:"POST",body:JSON.stringify({game_type:r,code:t}),headers:{"Content-Type":"application/json"}})).json()}})}function dE(e,t,r,n){let{mutateAsync:i}=jr(e,"spin-rolled");return useMutation({mutationKey:["games","post",r,e],mutationFn:async()=>{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/post-game",{method:"POST",body:JSON.stringify({game_type:r,code:t,key:n}),headers:{"Content-Type":"application/json"}})).json()},onSuccess(){i();}})}function yE(e){let t=e?.replace("@","");return queryOptions({queryKey:c.quests.status(t),enabled:!!t,queryFn:async()=>{if(!t)throw new Error("[SDK][Quests] \u2013 username wasn't provided");let n=await w()(d.privateApiHost+"/private-api/quests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t})});if(!n.ok)throw new Error(`Failed to fetch quests: ${n.status}`);return await n.json()},staleTime:3e4,refetchOnMount:true})}var xp=[{id:"checkin",tier:"daily",goal:1,i18nKey:"checkin",icon:"check-circle"},{id:"post",tier:"daily",goal:1,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"daily",goal:3,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"daily",goal:10,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"daily",goal:1,i18nKey:"reblog",icon:"repeat"},{id:"spin",tier:"daily",goal:1,i18nKey:"spin",icon:"gift"},{id:"post",tier:"weekly",goal:5,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"weekly",goal:15,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"weekly",goal:50,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"weekly",goal:5,i18nKey:"reblog",icon:"repeat"},{id:"post",tier:"monthly",goal:20,i18nKey:"post",icon:"pencil"}];function wE(e,t){return xp.find(r=>r.tier===e&&r.id===t)}var _E=300,bE=2;function kp(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}async function Cp(e){let r=await w()(d.privateApiHost+"/private-api/streak-freeze/buy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,idempotency_key:kp()})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to buy streak freeze: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function OE(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["streak-freeze","buy",n],mutationFn:async()=>{if(!n||!t)throw new Error("[SDK][StreakFreeze] \u2013 missing auth");return Cp(t)},onSuccess(){n&&r.invalidateQueries({queryKey:c.points._prefix(n)});},onSettled(){n&&r.invalidateQueries({queryKey:c.quests.status(n)});}})}function kE(e,t,r){return v(["communities","subscribe"],e,({community:n})=>[Sr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"async"})}function FE(e,t,r){return v(["communities","unsubscribe"],e,({community:n})=>[kr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"sync"})}function KE(e,t,r){return v(["communities","mutePost"],e,({community:n,author:i,permlink:o,notes:s,mute:a})=>[Fr(e,n,i,o,s,a)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.posts.entry(`/@${i.author}/${i.permlink}`),["community","single",i.community],{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.community}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"sync"})}function QE(e,t,r,n){return v(["communities","set-role",e],t,({account:i,role:o})=>[Cr(t,e,i,o)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>{if(!a)return a;let u=[...a.team??[]],p=u.findIndex(([l])=>l===o.account);return p>=0?u[p]=[u[p][0],o.role,u[p][2]??""]:u.push([o.account,o.role,""]),{...a,team:u}}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)],c.communities.context(o.account,e)]);},r,"posting",{broadcastMode:n??"async"})}function jE(e,t,r,n){return v(["communities","update",e],t,i=>[Tr(t,e,i)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>a&&{...a,...o}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)]]);},r,"posting",{broadcastMode:n??"async"})}function GE(e,t,r){return v(["communities","registerRewards"],e,({name:n})=>[Ur(n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.communities.singlePrefix(i.name)],[...c.points._prefix(e)]]);},t,"active",{broadcastMode:r})}function XE(e,t,r){return v(["communities","pin-post"],e,({community:n,account:i,permlink:o,pin:s})=>[Rr(e,n,i,o,s)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.posts.entry(`/@${i.account}/${i.permlink}`),[...c.communities.singlePrefix(i.community)]]);},t,"posting",{broadcastMode:r??"async"})}function nS(e,t,r=100,n=void 0,i=true){return queryOptions({queryKey:c.communities.list(e,t??"",r),enabled:i,queryFn:async()=>{let o=await g("bridge.list_communities",{last:"",limit:r,sort:e==="hot"?"rank":e,query:t||null,observer:n});return o?e==="hot"?o.sort(()=>Math.random()-.5):o:[]}})}function cS(e,t){return queryOptions({queryKey:c.communities.context(e,t),enabled:!!e&&!!t,queryFn:async()=>{let r=await g("bridge.get_community_context",{account:e,name:t});return {role:r?.role??"guest",subscribed:r?.subscribed??false}}})}function fS(e,t="",r=true){return queryOptions({queryKey:c.communities.single(e,t),enabled:r&&!!e,queryFn:async()=>fi(e??"",t)})}var Gi=100;async function zi(e,t){return await g("bridge.list_subscribers",{community:e,limit:Gi,...t?{last:t}:{}})??[]}function _S(e){return queryOptions({queryKey:c.communities.subscribers(e),queryFn:async()=>zi(e,null),staleTime:6e4})}function bS(e){return infiniteQueryOptions({queryKey:c.communities.subscribersInfinite(e),initialPageParam:null,queryFn:async({pageParam:t})=>zi(e,t),getNextPageParam:t=>t?.length>=Gi?t[t.length-1]?.[0]??null:null,staleTime:6e4})}function ES(e,t){return infiniteQueryOptions({queryKey:c.communities.accountNotifications(e,t),initialPageParam:null,queryFn:async({pageParam:r})=>await g("bridge.account_notifications",{account:e,limit:t,last_id:r??void 0})??[],getNextPageParam:r=>r?.length>=t?r[r.length-1].id:null})}function TS(){return queryOptions({queryKey:c.communities.rewarded(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/rewarded-communities",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch rewarded communities: ${e.status}`);return e.json()}})}var Bp=(s=>(s.OWNER="owner",s.ADMIN="admin",s.MOD="mod",s.MEMBER="member",s.GUEST="guest",s.MUTED="muted",s))(Bp||{}),FS={owner:["admin","mod","member","guest","muted"],admin:["mod","member","guest","muted"],mod:["member","guest","muted"]};function IS(e,t){return e.startsWith("hive-3")||t===3?"Council":e.startsWith("hive-2")||t===2?"Journal":"Topic"}function DS({communityType:e,userRole:t,subscribed:r}){let n=t==="muted"?false:e==="Topic"?true:["owner","admin","mod","member"].includes(t),i=(()=>{if(t==="muted")return false;switch(e){case "Topic":return true;case "Journal":return t!=="guest"||r;case "Council":return n}})(),o=["owner","admin","mod"].includes(t);return {canPost:n,canComment:i,isModerator:o}}function NS(e,t){return queryOptions({queryKey:c.notifications.unreadCount(e),queryFn:async()=>t?(await(await fetch(`${d.privateApiHost}/private-api/notifications/unread`,{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json()).count:0,enabled:!!e&&!!t,initialData:0,refetchInterval:6e4})}function VS(e,t,r=void 0){return infiniteQueryOptions({queryKey:c.notifications.list(e,r),queryFn:async({pageParam:n})=>{if(!t)return [];let i={code:t,filter:r,since:n,user:void 0},o=await fetch(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!o.ok)return [];try{return await o.json()}catch{return []}},enabled:!!e&&!!t,initialData:{pages:[],pageParams:[]},initialPageParam:"",getNextPageParam:n=>n?.[n.length-1]?.id??"",refetchOnMount:true})}var Qp=(y=>(y.VOTES="rvotes",y.MENTIONS="mentions",y.FAVORITES="nfavorites",y.BOOKMARKS="nbookmarks",y.FOLLOWS="follows",y.REPLIES="replies",y.REBLOGS="reblogs",y.TRANSFERS="transfers",y.DELEGATIONS="delegations",y.PAYOUTS="payouts",y.SCHEDULED_PUBLISHED="scheduled_published",y.ACCOUNT_UPDATES="account_updates",y.WEEKLY_EARNINGS="weekly_earnings",y))(Qp||{});var Hp=(h=>(h[h.VOTE=1]="VOTE",h[h.MENTION=2]="MENTION",h[h.FOLLOW=3]="FOLLOW",h[h.COMMENT=4]="COMMENT",h[h.RE_BLOG=5]="RE_BLOG",h[h.TRANSFERS=6]="TRANSFERS",h[h.DELEGATIONS=10]="DELEGATIONS",h[h.FAVORITES=13]="FAVORITES",h[h.BOOKMARKS=15]="BOOKMARKS",h[h.PAYOUTS=19]="PAYOUTS",h[h.ACCOUNT_UPDATE=20]="ACCOUNT_UPDATE",h[h.WEEKLY_EARNINGS=21]="WEEKLY_EARNINGS",h[h.SCHEDULED_PUBLISHED=22]="SCHEDULED_PUBLISHED",h.ALLOW_NOTIFY="ALLOW_NOTIFY",h))(Hp||{}),Ji=[1,2,3,4,5,6,10,13,15,19,20,21,22],Up=(n=>(n.ALL="All",n.UNREAD="Unread",n.READ="Read",n))(Up||{});function JS(e,t,r){return queryOptions({queryKey:c.notifications.settings(e),queryFn:async()=>{let n=e+"-web";if(!t)throw new Error("Missing access token");let i=await fetch(d.privateApiHost+"/private-api/detail-device",{body:JSON.stringify({code:t,username:e,token:n}),method:"POST",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch notification settings: ${i.status}`);return i.json()},enabled:!!e&&!!t,refetchOnMount:false,initialData:()=>({status:0,system:"web",allows_notify:0,notify_types:r?[]:[...Ji]})})}function ek(){return queryOptions({queryKey:c.notifications.announcements(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/announcements",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch announcements: ${e.status}`);return await e.json()||[]},staleTime:36e5})}function ik(e){return queryOptions({queryKey:c.notifications.spotlights(),queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/spotlights",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch spotlights: ${t.status}`);return await t.json()||[]},staleTime:36e5})}function Wp(e,t){return {...e,read:!t||t===e.id?1:e.read}}function Yi(e){return typeof e=="object"&&e!==null&&"pages"in e&&"pageParams"in e&&Array.isArray(e.pages)}function lk(e,t,r,n){let i=b();return useMutation({mutationKey:["notifications","mark-read",e],mutationFn:async({id:o})=>{if(!(!e||!t))return Ii(t,o)},onMutate:async({id:o})=>{if(!e||!t)return {previousData:[]};await i.cancelQueries({queryKey:c.notifications._prefix});let s=[],a=i.getQueriesData({queryKey:c.notifications._prefix,predicate:l=>{let f=l.state.data;return Yi(f)}});a.forEach(([l,f])=>{if(f&&Yi(f)){s.push([l,f]);let m={...f,pages:f.pages.map(y=>y.map(h=>Wp(h,o)))};i.setQueryData(l,m);}});let u=c.notifications.unreadCount(e),p=i.getQueryData(u);return typeof p=="number"&&p>0&&(s.push([u,p]),o?a.some(([,f])=>f?.pages.some(m=>m.some(y=>y.id===o&&y.read===0)))&&i.setQueryData(u,p-1):i.setQueryData(u,0)),{previousData:s}},onSuccess:o=>{let s=typeof o=="object"&&o!==null?o.unread:void 0;typeof s=="number"&&i.setQueryData(c.notifications.unreadCount(e),s),r?.(s);},onError:(o,s,a)=>{a?.previousData&&a.previousData.forEach(([u,p])=>{i.setQueryData(u,p);}),n?.(o);},onSettled:()=>{i.invalidateQueries({queryKey:c.notifications._prefix});}})}function gk(e,t,r){return v(["notifications","set-last-read"],e,({date:n})=>Ar(e,n),async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.notifications.unreadCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function _k(e){return queryOptions({queryKey:["proposals","proposal",e],queryFn:async()=>{let r=(await g("condenser_api.find_proposals",[[e]]))[0];return new Date(r.start_date)=new Date?r.status="active":new Date(r.end_date){let t=(await g("database_api.list_proposals",{start:[-1],limit:500,order:"by_total_votes",order_direction:"descending",status:"all"})).proposals,r=t.filter(i=>i.status==="expired");return [...t.filter(i=>i.status!=="expired"),...r]}})}function Ck(e,t,r){return infiniteQueryOptions({queryKey:["proposals","votes",e,t,r],initialPageParam:t,refetchOnMount:true,staleTime:0,queryFn:async({pageParam:n})=>{let s=(await g("condenser_api.list_proposal_votes",[[e,n??t],r,"by_proposal_voter"])).filter(l=>l.proposal?.proposal_id===e).map(l=>({id:l.id,voter:l.voter})),a=await g("condenser_api.get_accounts",[s.map(l=>l.voter)]),u=Tt(a);return s.map(l=>({...l,voterAccount:u.find(f=>l.voter===f.name)}))},getNextPageParam:n=>n?.[n.length-1]?.voter??void 0})}function qk(e){return queryOptions({queryKey:["proposals","votes","by-user",e],enabled:!!e&&e!=="",staleTime:60*1e3,queryFn:async()=>!e||e===""?[]:((await g("database_api.list_proposal_votes",{start:[e],limit:1e3,order:"by_voter_proposal",order_direction:"ascending",status:"votable"})).proposal_votes||[]).filter(n=>n.voter===e)})}function Bk(e,t,r){return v(["proposals","vote"],e,({proposalIds:n,approve:i})=>[Er(e,n,i)],async n=>{try{let i=n?.id??n?.tx_id;t?.adapter?.recordActivity&&i&&t.adapter.recordActivity(150,i,n?.block_num).catch(o=>{console.debug("[SDK][Proposals][useProposalVote] recordActivity failed",{activityType:150,blockNum:n?.block_num,transactionId:i,error:o});}),t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.proposals.list(),c.proposals.votesByUser(e)]);}catch(i){console.warn("[useProposalVote] Post-broadcast side-effect failed:",i);}},t,"active",{broadcastMode:r})}function Hk(e,t,r){return v(["proposals","create"],e,n=>[xr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.proposals.list()]);},t,"active",{broadcastMode:r})}function Lk(e,t=50){return infiniteQueryOptions({queryKey:["wallet","vesting-delegations",e,t],initialPageParam:"",queryFn:async({pageParam:r})=>{let n=r?t+1:t,i=await g("condenser_api.get_vesting_delegations",[e,r||"",n]);return r&&i.length>0&&i[0]?.delegatee===r?i.slice(1,t+1):i},getNextPageParam:r=>!r||r.lengthre("balance","/accounts/{account-name}/delegations",{"account-name":e},void 0,void 0,t)})}function Zk(e){return queryOptions({queryKey:["wallet","vesting-delegation-expirations",e],queryFn:async()=>e?(await g("database_api.find_vesting_delegation_expirations",{account:e})).delegations:[],enabled:!!e})}function nC(e){return queryOptions({queryKey:["wallet","conversion-requests",e],queryFn:()=>g("condenser_api.get_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function aC(e){return queryOptions({queryKey:["wallet","collateralized-conversion-requests",e],queryFn:()=>g("condenser_api.get_collateralized_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function lC(e){return queryOptions({queryKey:["wallet","savings-withdraw",e],queryFn:()=>g("condenser_api.get_savings_withdraw_from",[e]),select:t=>t.sort((r,n)=>r.request_id-n.request_id)})}function gC(e){return queryOptions({queryKey:["wallet","withdraw-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"])})}function _C(e){return queryOptions({queryKey:["wallet","open-orders",e],queryFn:()=>g("condenser_api.get_open_orders",[e]),select:t=>t.sort((r,n)=>r.orderid-n.orderid),enabled:!!e})}function OC(e,t=100){return infiniteQueryOptions({queryKey:["wallet","outgoing-rc-delegations",e,t],initialPageParam:null,queryFn:async({pageParam:r})=>{let i=(await g("rc_api.list_rc_direct_delegations",{start:[e,r??""],limit:t}).then(o=>o)).rc_direct_delegations||[];return r&&(i=i.filter(o=>o.to!==r)),i},getNextPageParam:r=>r.length===t?r[r.length-1].to:null})}function kC(e){return queryOptions({queryKey:["wallet","incoming-rc",e],enabled:!!e,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] - Missing username for incoming RC");let r=await w()(`${d.privateApiHost}/private-api/received-rc/${e}`);if(!r.ok)throw new Error(`Failed to fetch incoming RC: ${r.status}`);return r.json()}})}function FC(e){return queryOptions({queryKey:["wallet","received-vesting-shares",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`);if(!t.ok)throw new Error(`Failed to fetch received vesting shares: ${t.status}`);return (await t.json()).list}})}function KC(e){return queryOptions({queryKey:["wallet","recurrent-transfers",e],queryFn:()=>g("condenser_api.find_recurrent_transfers",[e]),enabled:!!e})}function fe(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}}function ue(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return;let r=Number.parseFloat(t);if(Number.isFinite(r))return r;let i=t.replace(/,/g,"").match(/[-+]?\d+(?:\.\d+)?/);if(i){let o=Number.parseFloat(i[0]);if(Number.isFinite(o))return o}}}function ll(e){if(!e||typeof e!="object")return;let t=e;return {name:fe(t.name)??"",symbol:fe(t.symbol)??"",layer:fe(t.layer)??"hive",balance:ue(t.balance)??0,fiatRate:ue(t.fiatRate)??0,currency:fe(t.currency)??"usd",precision:ue(t.precision)??3,address:fe(t.address),error:fe(t.error),pendingRewards:ue(t.pendingRewards),pendingRewardsFiat:ue(t.pendingRewardsFiat),liquid:ue(t.liquid),liquidFiat:ue(t.liquidFiat),savings:ue(t.savings),savingsFiat:ue(t.savingsFiat),staked:ue(t.staked),stakedFiat:ue(t.stakedFiat),iconUrl:fe(t.iconUrl),actions:t.actions??[],extraData:t.extraData??[],apr:ue(t.apr)}}function dl(e){if(!e||typeof e!="object")return [];let t=[e],r=e;r.data&&typeof r.data=="object"&&t.push(r.data),r.result&&typeof r.result=="object"&&t.push(r.result),r.portfolio&&typeof r.portfolio=="object"&&t.push(r.portfolio);for(let n of t){if(Array.isArray(n))return n;if(n&&typeof n=="object")for(let i of ["wallets","tokens","assets","items","portfolio","balances"]){let o=n[i];if(Array.isArray(o))return o}}return []}function fl(e){if(!e||typeof e!="object")return;let t=e;return fe(t.username)??fe(t.name)??fe(t.account)}function Xi(e,t="usd",r=true){return queryOptions({queryKey:["wallet","portfolio","v2",e,r?"only-enabled":"all",t],enabled:!!e,staleTime:6e4,refetchInterval:12e4,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] \u2013 username is required");let n=`${N.getValidatedBaseUrl()}/wallet-api/portfolio-v2`,i=await fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({username:e,onlyEnabled:r,currency:t})});if(!i.ok)throw new Error(`[SDK][Wallet] \u2013 Portfolio request failed (${i.status})`);let o=await i.json(),s=dl(o).map(a=>ll(a)).filter(a=>!!a).filter(a=>a.layer!=="spk");if(!s.length)throw new Error("[SDK][Wallet] \u2013 Portfolio payload contained no tokens");return {username:fl(o)??e,currency:fe(o?.fiatCurrency??o?.currency)?.toUpperCase(),wallets:s}}})}function Mt(e){return queryOptions({queryKey:["assets","hive","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(Ae()),await b().prefetchQuery(Q(e));let t=b().getQueryData(Ae().queryKey),r=b().getQueryData(Q(e).queryKey),n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??"");if(!r)return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:0};let o=T(r.balance).amount,s=T(r.savings_balance).amount;return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:o+s,parts:[{name:"current",balance:o},{name:"savings",balance:s}]}}})}function Zi(e){return queryOptions({queryKey:["assets","hbd","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(Ae()),await b().prefetchQuery(Q(e));let t=b().getQueryData(Q(e).queryKey),r=b().getQueryData(Ae().queryKey),n=1;return t?{name:"HBD",title:"Hive Dollar",price:n,accountBalance:T(t.hbd_balance).amount+T(t?.savings_hbd_balance).amount,apr:((r?.hbdInterestRate??0)/100).toFixed(3),parts:[{name:"current",balance:T(t.hbd_balance).amount},{name:"savings",balance:T(t.savings_hbd_balance).amount}]}:{name:"HBD",title:"Hive Dollar",price:n,accountBalance:0}}})}function hl(e){let u=9.5-(e.headBlock-7e6)/25e4*.01;u<.95&&(u=.95);let p=e.vestingRewardPercent/1e4,l=e.virtualSupply,f=e.totalVestingFund;return (l*u*p/f).toFixed(3)}function eo(e){return queryOptions({queryKey:["assets","hive-power","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(Ae()),await b().prefetchQuery(Q(e));let t=b().getQueryData(Ae().queryKey),r=b().getQueryData(Q(e).queryKey);if(!t||!r)return {name:"HP",title:"Hive Power",price:0,accountBalance:0};let n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??""),o=Number.isFinite(i)?i:t.base/t.quote,s=T(r.vesting_shares).amount,a=T(r.delegated_vesting_shares).amount,u=T(r.received_vesting_shares).amount,p=T(r.vesting_withdraw_rate).amount,l=Math.max((Number(r.to_withdraw)-Number(r.withdrawn))/1e6,0),f=Yn(r.next_vesting_withdrawal)?0:Math.min(p,l),m=+je(s,t.hivePerMVests).toFixed(3),y=+je(a,t.hivePerMVests).toFixed(3),h=+je(u,t.hivePerMVests).toFixed(3),S=+je(l,t.hivePerMVests).toFixed(3),x=+je(f,t.hivePerMVests).toFixed(3),P=Math.max(m-S,0),O=Math.max(m-y,0);return {name:"HP",title:"Hive Power",price:o,accountBalance:+P.toFixed(3),apr:hl(t),parts:[{name:"hp_balance",balance:m},{name:"available",balance:+O.toFixed(3)},{name:"outgoing_delegations",balance:y},{name:"incoming_delegations",balance:h},...S>0?[{name:"pending_power_down",balance:+S.toFixed(3)}]:[],...x>0&&x!==S?[{name:"next_power_down",balance:+x.toFixed(3)}]:[]]}}})}var B=ie.operations,Gr={transfers:[B.transfer,B.transfer_to_savings,B.transfer_from_savings,B.cancel_transfer_from_savings,B.recurrent_transfer,B.fill_recurrent_transfer,B.escrow_transfer,B.fill_recurrent_transfer],"market-orders":[B.fill_convert_request,B.fill_order,B.fill_collateralized_convert_request,B.limit_order_create2,B.limit_order_create,B.limit_order_cancel],interests:[B.interest],"stake-operations":[B.return_vesting_delegation,B.withdraw_vesting,B.transfer_to_vesting,B.set_withdraw_vesting_route,B.update_proposal_votes,B.fill_vesting_withdraw,B.account_witness_proxy,B.delegate_vesting_shares],rewards:[B.author_reward,B.curation_reward,B.producer_reward,B.claim_reward_balance,B.comment_benefactor_reward,B.liquidity_reward,B.proposal_pay],"":[]};var aT=Object.keys(ie.operations);var to=ie.operations,pT=to,lT=Object.entries(to).reduce((e,[t,r])=>(e[r]=t,e),{});var ro=ie.operations;function _l(e){return Object.prototype.hasOwnProperty.call(ro,e)}function lt(e){let t=Array.isArray(e)?e:[e],r=t.includes(""),n=Array.from(new Set(t.filter(a=>a!=null&&a!==""))),i=r||n.length===0?"all":n.map(a=>a.toString()).sort().join("|"),o=new Set;r||n.forEach(a=>{if(a in Gr){Gr[a].forEach(u=>o.add(u));return}_l(a)&&o.add(ro[a]);});let s=bl(Array.from(o));return {filterKey:i,filterArgs:s}}function bl(e){let t=0n,r=0n;return e.forEach(n=>{n<64?t|=1n<o?+(o[o.length-1]?.num??0)-1:-1,queryFn:async({pageParam:o})=>(await g("condenser_api.get_account_history",[e,o,t,...n])).map(a=>({num:a[0],type:a[1].op[0],timestamp:a[1].timestamp,trx_id:a[1].trx_id,...a[1].op[1]})),select:({pages:o,pageParams:s})=>({pageParams:s,pages:o.map(a=>a.filter(u=>{switch(u.type){case "author_reward":case "comment_benefactor_reward":return T(u.hive_payout).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return T(u.amount).symbol==="HIVE";case "transfer_from_savings":return T(u.amount).symbol==="HIVE";case "fill_recurrent_transfer":let l=T(u.amount);return ["HIVE"].includes(l.symbol);case "claim_reward_balance":return T(u.reward_hive).amount>0;case "curation_reward":case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":return true;case "limit_order_create2":return true;default:return false}}))})})}function AT(e,t=20,r=[]){let{filterKey:n}=lt(r);return infiniteQueryOptions({...Nt(e,t,r),queryKey:["assets","hbd","transactions",e,t,n],select:({pages:i,pageParams:o})=>({pageParams:o,pages:i.map(s=>s.filter(a=>{switch(a.type){case "author_reward":case "comment_benefactor_reward":return T(a.hbd_payout).amount>0;case "claim_reward_balance":return T(a.reward_hbd).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return T(a.amount).symbol==="HBD";case "transfer_from_savings":return T(a.amount).symbol==="HBD";case "fill_recurrent_transfer":let l=T(a.amount);return ["HBD"].includes(l.symbol);case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":case "proposal_pay":case "interest":return true;case "limit_order_create2":return true;default:return false}}))})})}function ST(e,t=20,r=[]){let{filterKey:n}=lt(r),i=new Set(Array.isArray(r)?r:[r]),o=i.has("")||i.size===0;return infiniteQueryOptions({...Nt(e,t,r),queryKey:["assets","hive-power","transactions",e,t,n],select:({pages:s,pageParams:a})=>({pageParams:a,pages:s.map(u=>u.filter(p=>{switch(p.type){case "author_reward":case "comment_benefactor_reward":return T(p.vesting_payout).amount>0;case "claim_reward_balance":return T(p.reward_vests).amount>0;case "transfer_to_vesting":return true;case "transfer":case "transfer_to_savings":case "recurrent_transfer":return ["VESTS","HP"].includes(T(p.amount).symbol);case "fill_recurrent_transfer":let m=T(p.amount);return ["VESTS","HP"].includes(m.symbol);case "curation_reward":case "withdraw_vesting":case "delegate_vesting_shares":case "fill_vesting_withdraw":case "return_vesting_delegation":case "producer_reward":case "set_withdraw_vesting_route":return true;default:return o||i.has(p.type)}}))})})}function no(e){let t=r=>r.toString().padStart(2,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function zr(e,t){return new Date(e.getTime()-t*1e3)}function RT(e=86400){return infiniteQueryOptions({queryKey:["assets","hive","metrics",e],queryFn:async({pageParam:[t,r]})=>(await g("condenser_api.get_market_history",[e,no(t),no(r)])).map(({hive:i,non_hive:o,open:s})=>({close:o.close/i.close,open:o.open/i.open,low:o.low/i.low,high:o.high/i.high,volume:i.volume,time:new Date(s)})),initialPageParam:[zr(new Date,Math.max(100*e,28800)),new Date],getNextPageParam:(t,r,[n])=>[zr(n,Math.max(100*e,28800)),zr(n,e)]})}function DT(e){return queryOptions({queryKey:["assets","hive","withdrawal-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"]),enabled:!!e})}function NT(e,t=50){return queryOptions({queryKey:["assets","hive-power","delegates",e],enabled:!!e,queryFn:()=>g("condenser_api.get_vesting_delegations",[e,"",t])})}function jT(e){return queryOptions({queryKey:["assets","hive-power","delegatings",e],queryFn:async()=>(await(await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`,{headers:{"Content-Type":"application/json"}})).json()).list,select:t=>t.sort((r,n)=>T(n.vesting_shares).amount-T(r.vesting_shares).amount)})}function GT(e=500){return queryOptions({queryKey:["market","order-book",e],queryFn:()=>g("condenser_api.get_order_book",[e])})}function XT(){return queryOptions({queryKey:["market","statistics"],queryFn:()=>g("condenser_api.get_ticker",[])})}function rR(e,t,r){let n=i=>i.toISOString().replace(/\.\d{3}Z$/,"");return queryOptions({queryKey:["market","history",e,t.getTime(),r.getTime()],queryFn:()=>g("condenser_api.get_market_history",[e,n(t),n(r)])})}function sR(){return queryOptions({queryKey:["market","hive-hbd-stats"],queryFn:async()=>{let e=await g("condenser_api.get_ticker",[]),t=new Date,r=new Date(t.getTime()-864e5),n=s=>s.toISOString().replace(/\.\d{3}Z$/,""),i=await g("condenser_api.get_market_history",[86400,n(r),n(t)]);return {price:+e.latest,close:i[0]?i[0].non_hive.open/i[0].hive.open:0,high:i[0]?i[0].non_hive.high/i[0].hive.high:0,low:i[0]?i[0].non_hive.low/i[0].hive.low:0,percent:i[0]?100-i[0].non_hive.open/i[0].hive.open*100/+e.latest:0,totalFromAsset:e.hive_volume.split(" ")[0],totalToAsset:e.hbd_volume.split(" ")[0]}}})}function pR(e,t,r,n){return queryOptions({queryKey:["market","data",e,t,r,n],queryFn:async({signal:i})=>{let o=w(),s=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,a=await o(s,{signal:i});if(!a.ok)throw new Error(`Failed to fetch market data: ${a.status}`);return a.json()}})}function io(e){return e.toISOString().replace(/\.\d{3}Z$/,"")}function mR(e=1e3,t,r){let n=r??new Date,i=t??new Date(n.getTime()-600*60*1e3);return queryOptions({queryKey:["market","trade-history",e,i.getTime(),n.getTime()],queryFn:()=>g("condenser_api.get_trade_history",[io(i),io(n),e])})}function wR(){return queryOptions({queryKey:["market","feed-history"],queryFn:async()=>{try{return await g("condenser_api.get_feed_history",[])}catch(e){throw e}}})}function AR(){return queryOptions({queryKey:["market","current-median-history-price"],queryFn:async()=>{try{return await g("condenser_api.get_current_median_history_price",[])}catch(e){throw e}}})}function ER(e,t,r){return v(["market","limit-order-create"],e,n=>[It(e,n.amountToSell,n.minToReceive,n.fillOrKill,n.expiration,n.orderId)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function TR(e,t,r){return v(["market","limit-order-cancel"],e,({orderId:n})=>[qr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}async function dt(e){let t=await e.json();if(!e.ok){let r=new Error(`Request failed with status ${e.status}`);throw r.status=e.status,r.data=t,r}return t}async function qR(e,t,r,n){let i=w(),o=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,s=await i(o);return dt(s)}async function oo(e){if(e==="hbd")return 1;let t=w(),r=`https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${e}`,n=await t(r);return (await dt(n)).hive_dollar[e]}async function IR(e,t){let n=await w()(d.privateApiHost+`/private-api/market-data/${e==="hbd"?"usd":e}/${t}`);return dt(n)}async function DR(){let t=await w()(d.privateApiHost+"/private-api/market-data/latest");return dt(t)}async function KR(){let t=await w()("https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd");return dt(t)}var Dl={"Content-type":"application/json"};async function Kl(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-api`,{method:"POST",body:JSON.stringify(e),headers:Dl});if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 request failed with ${n.status}`);return (await n.json()).result}async function ke(e,t){try{return await Kl(e)}catch{return t}}async function NR(e,t=50){let r={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:e},limit:t,offset:0},id:1},[n,i]=await Promise.all([ke({...r,params:{...r.params,table:"buyBook",indexes:[{index:"price",descending:true}]}},[]),ke({...r,params:{...r.params,table:"sellBook",indexes:[{index:"price",descending:false}]}},[])]),o=a=>a.sort((u,p)=>{let l=Number(u.price??0);return Number(p.price??0)-l}),s=a=>a.sort((u,p)=>{let l=Number(u.price??0),f=Number(p.price??0);return l-f});return {buy:o(n),sell:s(i)}}async function QR(e,t=50){return ke({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"tradesHistory",query:{symbol:e},limit:t,offset:0,indexes:[{index:"timestamp",descending:true}]},id:1},[])}async function HR(e,t,r=100){let n={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:t,account:e},limit:r,offset:0},id:1},[i,o]=await Promise.all([ke({...n,params:{...n.params,table:"buyBook",indexes:[{index:"timestamp",descending:true}]}},[]),ke({...n,params:{...n.params,table:"sellBook",indexes:[{index:"timestamp",descending:true}]}},[])]),s=(p,l)=>(Number(p||0)*Number(l||0)).toFixed(8),a=i.map(p=>({id:p.txId,type:"buy",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:p.tokensLocked??s(p.quantity,p.price),timestamp:Number(p.timestamp??0)})),u=o.map(p=>({id:p.txId,type:"sell",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:s(p.quantity,p.price),timestamp:Number(p.timestamp??0)}));return [...a,...u].sort((p,l)=>l.timestamp-p.timestamp)}async function Bl(e,t){if(Array.isArray(e)&&e.length===0)return [];let r=Array.isArray(e)?{symbol:{$in:e}}:e?{symbol:e}:{};return ke({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"metrics",query:{...r,...t?{account:t}:{}}},id:1},[])}async function ze(e,t){return Bl(t,e)}async function Qt(e){return ke({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"balances",query:{account:e}},id:1},[])}async function Ht(e){return ke({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"tokens",query:{symbol:{$in:e}}},id:2},[])}async function so(e,t,r,n){let i=w(),o=N.getValidatedBaseUrl(),s=new URL("/private-api/engine-account-history",o);s.searchParams.set("account",e),s.searchParams.set("symbol",t),s.searchParams.set("limit",r.toString()),s.searchParams.set("offset",n.toString());let a=await i(s.toString(),{method:"GET",headers:{"Content-type":"application/json"}});if(!a.ok)throw new Error(`[SDK][HiveEngine] \u2013 account history failed with ${a.status}`);return await a.json()}async function ao(e,t="daily"){let r=w(),n=N.getValidatedBaseUrl(),i=new URL("/private-api/engine-chart-api",n);i.searchParams.set("symbol",e),i.searchParams.set("interval",t);let o=await r(i.toString(),{headers:{"Content-type":"application/json"}});if(!o.ok)throw new Error(`[SDK][HiveEngine] \u2013 chart failed with ${o.status}`);return await o.json()}async function co(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-reward-api/${e}?hive=1`);if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 rewards failed with ${n.status}`);return await n.json()}function Ut(e){return queryOptions({queryKey:["assets","hive-engine","balances",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Qt(e)})}function GR(){return queryOptions({queryKey:["assets","hive-engine","markets"],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>ze()})}function uo(e){return queryOptions({queryKey:["assets","hive-engine","metadata-list",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Ht(e)})}function tF(e,t,r=20){return infiniteQueryOptions({queryKey:["assets","hive-engine",t,"transactions",e],enabled:!!t&&!!e,initialPageParam:0,queryFn:async({pageParam:n})=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");return so(e,t,r,n)},getNextPageParam:(n,i,o)=>(n?.length??0)===r?o+r:void 0,getPreviousPageParam:(n,i,o)=>o>0?o-r:void 0})}function oF(e,t="daily"){return queryOptions({queryKey:["assets","hive-engine",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>ao(e,t)})}function uF(e){return queryOptions({queryKey:["assets","hive-engine","unclaimed",e],staleTime:6e4,refetchInterval:9e4,enabled:!!e,queryFn:async()=>{try{let t=await co(e);return Object.values(t).filter(({pending_token:r})=>r>0)}catch{return []}}})}function po(e,t){return queryOptions({queryKey:["assets","hive-engine","all-tokens",e,t],queryFn:async()=>ze(e,t)})}function Je(e,t=void 0){let r={fractionDigits:3,prefix:"",suffix:""};t&&(r={...r,...t});let{fractionDigits:n,prefix:i,suffix:o}=r,s="";i&&(s+=i+" ");let a=Math.abs(parseFloat(e.toString()))<1e-4?0:e,u=typeof a=="string"?parseFloat(a):a;return s+=u.toLocaleString("en-US",{minimumFractionDigits:n,maximumFractionDigits:n,useGrouping:true}),o&&(s+=" "+o),s}var Vt=class{constructor(t){A(this,"symbol");A(this,"name");A(this,"icon");A(this,"precision");A(this,"stakingEnabled");A(this,"delegationEnabled");A(this,"balance");A(this,"stake");A(this,"stakedBalance");A(this,"delegationsIn");A(this,"delegationsOut");A(this,"usdValue");A(this,"hasDelegations",()=>this.delegationEnabled?this.delegationsIn>0&&this.delegationsOut>0:false);A(this,"delegations",()=>this.hasDelegations()?`(${Je(this.stake,{fractionDigits:this.precision})} + ${Je(this.delegationsIn,{fractionDigits:this.precision})} - ${Je(this.delegationsOut,{fractionDigits:this.precision})})`:"");A(this,"staked",()=>this.stakingEnabled?this.stakedBalance<1e-4?this.stakedBalance.toString():Je(this.stakedBalance,{fractionDigits:this.precision}):"-");A(this,"balanced",()=>this.balance<1e-4?this.balance.toString():Je(this.balance,{fractionDigits:this.precision}));this.symbol=t.symbol,this.name=t.name||"",this.icon=t.icon||"",this.precision=t.precision||0,this.stakingEnabled=t.stakingEnabled||false,this.delegationEnabled=t.delegationEnabled||false,this.balance=parseFloat(t.balance)||0,this.stake=parseFloat(t.stake)||0,this.delegationsIn=parseFloat(t.delegationsIn)||0,this.delegationsOut=parseFloat(t.delegationsOut)||0,this.stakedBalance=this.stake+this.delegationsIn-this.delegationsOut,this.usdValue=t.usdValue;}};function vF(e,t,r){return queryOptions({queryKey:["assets","hive-engine","balances-with-usd",e,t,r],queryFn:async()=>{if(!e)throw new Error("[HiveEngine] No account in a balances query");let n=await Qt(e),i=await Ht(n.map(p=>p.symbol)),o=t?t.base/t.quote:0,s=Array.isArray(r)?r:[],a=n.map(p=>p.symbol).filter(p=>p!=="SWAP.HIVE"&&!s.some(l=>l.symbol===p)),u=[...s,...a.length?await ze(void 0,a):[]];return n.map(p=>{let l=i.find(x=>x.symbol===p.symbol),f;if(l?.metadata)try{f=JSON.parse(l.metadata);}catch{f=void 0;}let m=u.find(x=>x.symbol===p.symbol),y=Number(m?.lastPrice??"0"),h=Number(p.balance),S=p.symbol==="SWAP.HIVE"?o*h:y===0?0:Number((y*o*h).toFixed(10));return new Vt({symbol:p.symbol,name:l?.name??p.symbol,icon:f?.icon??"",precision:l?.precision??0,stakingEnabled:l?.stakingEnabled??false,delegationEnabled:l?.delegationEnabled??false,balance:p.balance,stake:p.stake,delegationsIn:p.delegationsIn,delegationsOut:p.delegationsOut,usdValue:S})})},enabled:!!e})}function lo(e,t){return queryOptions({queryKey:["assets","hive-engine",t,"general-info",e],enabled:!!t&&!!e,staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");let r=b(),n=Mt(e);await r.prefetchQuery(n);let i=r.getQueryData(n.queryKey),o=await r.ensureQueryData(uo([t])),s=await r.ensureQueryData(Ut(e)),a=await r.ensureQueryData(po(void 0,t)),u=o?.find(x=>x.symbol===t),p=s?.find(x=>x.symbol===t),f=+(a?.find(x=>x.symbol===t)?.lastPrice??"0"),m=parseFloat(p?.balance??"0"),y=parseFloat(p?.stake??"0"),h=parseFloat(p?.pendingUnstake??"0"),S=[{name:"liquid",balance:m},{name:"staked",balance:y}];return h>0&&S.push({name:"unstaking",balance:h}),{name:t,title:u?.name??"",price:f===0?0:Number(f*(i?.price??0)),accountBalance:m+y,layer:"ENGINE",parts:S}}})}function ft(e,t=0){return queryOptions({queryKey:["points",e,t],queryFn:async()=>{if(!e)throw new Error("Get points query \u2013 username wasn't provided");let r=e.replace("@",""),n=await fetch(d.privateApiHost+"/private-api/points",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r})});if(!n.ok)throw new Error(`Failed to fetch points: ${n.status}`);let i=await n.json(),o=await fetch(d.privateApiHost+"/private-api/point-list",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,type:t})});if(!o.ok)throw new Error(`Failed to fetch point transactions: ${o.status}`);let s=await o.json();return {points:i.points,uPoints:i.unclaimed_points,transactions:s}},staleTime:3e4,refetchOnMount:true,enabled:!!e})}function fo(e){return queryOptions({queryKey:["assets","points","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>(await b().prefetchQuery(ft(e)),{name:"POINTS",title:"Ecency Points",price:.002,accountBalance:+(b().getQueryData(ft(e).queryKey)?.points??0)})})}function NF(e,t){return queryOptions({queryKey:["assets","points","transactions",e,t],queryFn:async()=>(await(await fetch(`${d.privateApiHost}/private-api/point-list`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,type:t??0})})).json()).map(({created:i,type:o,amount:s,id:a,sender:u,receiver:p,memo:l})=>({created:new Date(i),type:o,results:[{amount:parseFloat(s),asset:"POINTS"}],id:a,from:u??void 0,to:p??void 0,memo:l??void 0}))})}function YF(e,t,r={refetch:false}){let n=b(),i=r.currency??"usd",o=async p=>(r.refetch?await n.fetchQuery(p):await n.prefetchQuery(p),n.getQueryData(p.queryKey)),s=async p=>{if(!p||i==="usd")return p;try{let l=await oo(i);return {...p,price:p.price*l}}catch(l){return console.warn(`Failed to convert price from USD to ${i}:`,l),p}},a=Xi(e,i,true),u=async()=>{try{let l=(await n.fetchQuery(a)).wallets.find(m=>m.symbol.toUpperCase()===t.toUpperCase());if(!l)return;let f=[];if(l.liquid!==void 0&&l.liquid!==null&&f.push({name:"liquid",balance:l.liquid}),l.staked!==void 0&&l.staked!==null&&l.staked>0&&f.push({name:"staked",balance:l.staked}),l.savings!==void 0&&l.savings!==null&&l.savings>0&&f.push({name:"savings",balance:l.savings}),l.extraData&&Array.isArray(l.extraData))for(let m of l.extraData){if(!m||typeof m!="object")continue;let y=m.dataKey,h=m.value;if(typeof h=="string"){let x=h.replace(/,/g,"").match(/[+-]?\s*(\d+(?:\.\d+)?)/);if(x){let P=Math.abs(Number.parseFloat(x[1]));y==="delegated_hive_power"?f.push({name:"outgoing_delegations",balance:P}):y==="received_hive_power"?f.push({name:"incoming_delegations",balance:P}):y==="powering_down_hive_power"&&f.push({name:"pending_power_down",balance:P});}}}return {name:l.symbol,title:l.name,price:l.fiatRate,accountBalance:l.balance,apr:l.apr?.toString(),layer:l.layer,pendingRewards:l.pendingRewards,parts:f}}catch{return}};return queryOptions({queryKey:["ecency-wallets","asset-info",e,t,i],queryFn:async()=>{let p=await u();if(p&&p.price>0)return p;let l;if(t==="HIVE")l=await o(Mt(e));else if(t==="HP")l=await o(eo(e));else if(t==="HBD")l=await o(Zi(e));else if(t==="POINTS")l=await o(fo(e));else if((await n.ensureQueryData(Ut(e))).some(m=>m.symbol===t))l=await o(lo(e,t));else {if(p)return p;throw new Error(`[SDK][Wallet] \u2013 unrecognized asset "${t}"`)}if(p&&l&&l.price>0){let f=await s(l);return {...p,price:f.price}}return await s(l)}})}var Yl=(P=>(P.Transfer="transfer",P.TransferToSavings="transfer-saving",P.WithdrawFromSavings="withdraw-saving",P.Delegate="delegate",P.PowerUp="power-up",P.PowerDown="power-down",P.WithdrawRoutes="withdraw-routes",P.ClaimInterest="claim-interest",P.Swap="swap",P.Convert="convert",P.Gift="gift",P.Promote="promote",P.Claim="claim",P.Buy="buy",P.Stake="stake",P.Unstake="unstake",P.Undelegate="undelegate",P))(Yl||{});function nq(e,t,r){return v(["wallet","transfer"],e,n=>[Ne(e,n.to,n.amount,n.memo)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function cq(e,t,r){return v(["wallet","transfer-point"],e,n=>[We(e,n.to,n.amount,n.memo)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function fq(e,t,r){return v(["wallet","delegate-vesting-shares"],e,n=>[ct(e,n.delegatee,n.vestingShares)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.delegatee),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function wq(e,t,r){return v(["wallet","set-withdraw-vesting-route"],e,n=>[ut(e,n.toAccount,n.percent,n.autoVest)],async(n,i)=>{await k(t?.adapter,r,[c.wallet.withdrawRoutes(e),c.accounts.full(e),c.accounts.full(i.toAccount)]);},t,"active",{broadcastMode:r})}function Aq(e,t,r){return v(["wallet","transfer-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"transfer",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity,memo:n.memo}});return [["custom_json",{required_auths:[e],required_posting_auths:[],id:"ssc-mainnet-hive",json:i}]]},async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Sq(e,t,r){return v(["wallet","transfer-to-savings"],e,n=>[$e(e,n.to,n.amount,n.memo)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Fq(e,t,r){return v(["wallet","transfer-from-savings"],e,n=>[Qe(e,n.to,n.amount,n.memo,n.requestId)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Bq(e,t,r){return v(["wallet","transfer-to-vesting"],e,n=>[st(e,n.to,n.amount)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Uq(e,t,r){return v(["wallet","withdraw-vesting"],e,n=>[at(e,n.vestingShares)],async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Wq(e,t,r){return v(["wallet","convert"],e,n=>[n.collateralized?wr(e,n.amount,n.requestId):pt(e,n.amount,n.requestId)],async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Xq(e,t,r){return v(["wallet","claim-interest"],e,n=>ot(e,n.to,n.amount,n.memo,n.requestId),async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}var Xl=5e3,jt=new Map;function nI(e,t,r){return v(["wallet","claim-rewards"],e,n=>[Ir(e,n.rewardHive,n.rewardHbd,n.rewardVests)],()=>{let n=e??"__anonymous__",i=[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e],c.assets.hiveGeneralInfo(e),c.assets.hbdGeneralInfo(e),c.assets.hivePowerGeneralInfo(e)],o=jt.get(n);o&&(clearTimeout(o),jt.delete(n));let s=setTimeout(async()=>{try{let a=b(),p=(await Promise.allSettled(i.map(l=>a.invalidateQueries({queryKey:l})))).filter(l=>l.status==="rejected");p.length>0&&console.error("[SDK][Wallet][useClaimRewards] delayed invalidation rejected",{username:e,rejectedCount:p.length,rejected:p});}catch(a){console.error("[SDK][Wallet][useClaimRewards] delayed invalidation failed",{username:e,error:a});}finally{jt.delete(n);}},Xl);jt.set(n,s);},t,"posting",{broadcastMode:r})}function aI(e,t,r){return v(["wallet","delegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"delegate",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function lI(e,t,r){return v(["wallet","undelegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"undelegate",contractPayload:{symbol:n.symbol,from:n.from,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function gI(e,t,r){return v(["wallet","stake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"stake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function _I(e,t,r){return v(["wallet","unstake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"unstake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function PI(e,t,r){return v(["wallet","claim-engine-rewards"],e,n=>{let i=JSON.stringify(n.tokens.map(o=>({symbol:o})));return [["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:i}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"posting",{broadcastMode:r})}function SI(e,t,r){return v(["wallet","engine-market-order"],e,n=>{let i,o;n.action==="cancel"?(o="cancel",i={type:n.orderType,id:n.orderId}):(o=n.action,i={symbol:n.symbol,quantity:n.quantity,price:n.price});let s=JSON.stringify({contractName:"market",contractAction:o,contractPayload:i});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:s}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Zl(e,t,r){let{from:n,to:i="",amount:o="",memo:s=""}=r,a=r.request_id??Date.now()>>>0;switch(e){case "HIVE":switch(t){case "transfer":return [Ne(n,i,o,s)];case "transfer-saving":return [$e(n,i,o,s)];case "withdraw-saving":return [Qe(n,i,o,s,a)];case "power-up":return [st(n,i,o)]}break;case "HBD":switch(t){case "transfer":return [Ne(n,i,o,s)];case "transfer-saving":return [$e(n,i,o,s)];case "withdraw-saving":return [Qe(n,i,o,s,a)];case "claim-interest":return ot(n,i,o,s,a);case "convert":return [pt(n,o,Math.floor(Date.now()/1e3))]}break;case "HP":switch(t){case "power-down":return [at(n,o)];case "delegate":return [ct(n,i,o)];case "withdraw-routes":return [ut(r.from_account??n,r.to_account??i,r.percent??0,r.auto_vest??false)]}break;case "POINTS":if(t==="transfer"||t==="gift")return [We(n,i,o,s)];break}return null}function ed(e,t,r){let{from:n,to:i="",amount:o=""}=r,s=typeof o=="string"&&o.includes(" ")?o.split(" ")[0]:String(o);switch(t){case "transfer":return [He(n,"transfer",{symbol:e,to:i,quantity:s,memo:r.memo??""})];case "stake":return [He(n,"stake",{symbol:e,to:i,quantity:s})];case "unstake":return [He(n,"unstake",{symbol:e,to:i,quantity:s})];case "delegate":return [He(n,"delegate",{symbol:e,to:i,quantity:s})];case "undelegate":return [He(n,"undelegate",{symbol:e,from:i,quantity:s})];case "claim":return [_r(n,[e])]}return null}function td(e){return e==="claim"?"posting":"active"}function qI(e,t,r,n,i){let{mutateAsync:o}=Ge.useRecordActivity(e,r);return v(["ecency-wallets",t,r],e,s=>{let a=Zl(t,r,s);if(a)return a;let u=ed(t,r,s);if(u)return u;throw new Error(`[SDK][Wallet] \u2013 no operation builder for asset="${t}" operation="${r}"`)},()=>{o();let s=[];s.push(["ecency-wallets","asset-info",e,t]),t==="HIVE"&&s.push(["ecency-wallets","asset-info",e,"HP"]),s.push(["wallet","portfolio","v2",e]),setTimeout(()=>{s.forEach(a=>{b().invalidateQueries({queryKey:a});});},5e3);},n,td(r),{broadcastMode:i})}function BI(e,t,r){return v(["wallet","delegate-rc"],e,({to:n,maxRc:i})=>[br(e,n,i)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),c.resourceCredits.account(e),c.resourceCredits.account(i.to)]);},t,"active",{broadcastMode:r})}function HI(e,t,r){return v(["witnesses","vote"],e,({witness:n,approve:i})=>[Pr(e,n,i)],async()=>{try{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.votes(e)]);}catch(n){console.warn("[useWitnessVote] Post-broadcast side-effect failed:",n);}},t,"active",{broadcastMode:r})}function LI(e,t,r){return v(["witnesses","proxy"],e,({proxy:n})=>[Or(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.proxy()]);},t,"active",{broadcastMode:r})}function nd(e){return {owner:e.witness_name,total_missed:e.missed_blocks,url:e.url,props:{account_creation_fee:`${(e.account_creation_fee/1e3).toFixed(3)} HIVE`,account_subsidy_budget:0,maximum_block_size:e.block_size},hbd_exchange_rate:{base:`${e.price_feed.toFixed(3)} HBD`},available_witness_account_subsidies:0,running_version:e.version,signing_key:e.signing_key,last_hbd_exchange_update:e.feed_updated_at,rank:e.rank,vests:e.vests,voters_num:e.voters_num,voters_num_daily_change:e.voters_num_daily_change,price_feed:e.price_feed,hbd_interest_rate:e.hbd_interest_rate,last_confirmed_block_num:e.last_confirmed_block_num}}function YI(e){return infiniteQueryOptions({queryKey:c.witnesses.list(e),initialPageParam:1,queryFn:async({pageParam:t})=>(await re("hafbe","/witnesses",{"page-size":e,page:t})).witnesses.map(nd),getNextPageParam:(t,r,n)=>t.length===e?n+1:void 0})}function XI(e,t,r,n="vests",i="desc"){return queryOptions({queryKey:c.witnesses.voters(e,t,r,n,i),queryFn:async({signal:o})=>await re("hafbe","/witnesses/{witness-name}/voters",{"witness-name":e,"page-size":r,page:t,sort:n,direction:i},void 0,void 0,o),enabled:!!e,staleTime:6e4})}function ZI(e){return queryOptions({queryKey:c.witnesses.voterCount(e),queryFn:async()=>await re("hafbe","/witnesses/{witness-name}/voters/count",{"witness-name":e}),enabled:!!e,staleTime:6e4})}var id=(h=>(h[h.CHECKIN=10]="CHECKIN",h[h.LOGIN=20]="LOGIN",h[h.CHECKIN_EXTRA=30]="CHECKIN_EXTRA",h[h.POST=100]="POST",h[h.COMMENT=110]="COMMENT",h[h.VOTE=120]="VOTE",h[h.REBLOG=130]="REBLOG",h[h.DELEGATION=150]="DELEGATION",h[h.REFERRAL=160]="REFERRAL",h[h.COMMUNITY=170]="COMMUNITY",h[h.TRANSFER_SENT=998]="TRANSFER_SENT",h[h.TRANSFER_INCOMING=999]="TRANSFER_INCOMING",h[h.MINTED=991]="MINTED",h[h.BURNED=997]="BURNED",h))(id||{});async function sd(e,t){if(!e)throw new Error("[SDK][Points][Claim] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][Points][Claim] \u2013 access token wasn't found");let n=await w()(d.privateApiHost+"/private-api/points-claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})}),i=(n.headers.get("content-type")??"").split(";")[0].trim().toLowerCase(),o=await n.text();if(!n.ok){if(n.status===406)try{return JSON.parse(o)}catch{return {message:o,code:n.status}}let s=o&&i.includes("json")?`: ${o.slice(0,200)}`:"";throw new Error(`[SDK][Points][Claim] \u2013 failed with status ${n.status}${s}`)}if(!i.includes("json"))throw new Error(`[SDK][Points][Claim] \u2013 expected JSON but received "${i||"empty"}" response (status ${n.status})`);try{return JSON.parse(o)}catch{throw new Error(`[SDK][Points][Claim] \u2013 malformed JSON response (status ${n.status})`)}}function sD(e,t,r,n){let{mutateAsync:i}=Ge.useRecordActivity(e,"points-claimed");return useMutation({mutationFn:()=>sd(e,t),onError:n,onSuccess:()=>{i(),b().setQueryData(ft(e).queryKey,o=>o&&{...o,points:(parseFloat(o.points)+parseFloat(o.uPoints)).toFixed(3),uPoints:"0"}),r?.();}})}var go=/(^|\s)author:([^\s]+)/g,yo=/(^|\s)type:([^\s]+)/g,ho=/(^|\s)category:([^\s]+)/g,wo=/(^|\s)tag:([^\s]+)/g;var bo=(n=>(n.ALL="",n.POST="post",n.COMMENT="comment",n))(bo||{}),cD=5,uD=100;function vo(e){return e.trim().split(/\s+/)[0]??""}function ad(e){return vo(e).replace(/^@+/,"").toLowerCase()}function cd(e){return vo(e).replace(/^#+/,"").toLowerCase()}function ud(e){let t=new Set;return e.split(/[\s,]+/).map(r=>r.replace(/^#+/,"").toLowerCase()).filter(r=>r===""||t.has(r)?false:(t.add(r),true))}function pD({search:e="",author:t="",type:r="",category:n="",tags:i=[]}){let o=e.trim().replace(/\s+/g," "),s=ad(t),a=cd(n),u=ud(Array.isArray(i)?i.join(","):i),p=[o];return s&&p.push(`author:${s}`),r&&p.push(`type:${r}`),a&&p.push(`category:${a}`),u.length>0&&p.push(`tag:${u.join(",")}`),{q:p.filter(l=>l!=="").join(" "),search:o,author:s,type:r,category:a,tags:u}}var _o=class{constructor(t){A(this,"query","");A(this,"search","");A(this,"author","");A(this,"type","");A(this,"category","");A(this,"tags",[]);A(this,"grab",t=>{let r=[...this.query.matchAll(t)];return r.length>0?r[0][2].trim():""});A(this,"grabAuthor",()=>{this.author=this.grab(go);});A(this,"grabType",()=>{let t=this.grab(yo);Object.values(bo).includes(t)&&(this.type=t);});A(this,"grabCategory",()=>{this.category=this.grab(ho);});A(this,"grabTags",()=>{let t=new Set;this.tags=[...this.query.matchAll(wo)].flatMap(r=>r[2].split(",")).map(r=>r.trim()).filter(r=>r===""||t.has(r)?false:(t.add(r),true));});A(this,"grabSearch",()=>{for([go,yo,ho,wo].forEach(t=>{this.search=this.search.replace(t,"$1");});this.search.indexOf(" ")!==-1;)this.search=this.search.replace(" "," ");this.search=this.search.trim();});this.query=t,this.search=t,this.grabAuthor(),this.grabType(),this.grabCategory(),this.grabTags(),this.grabSearch();}};async function Pe(e,t){let n=await(async()=>{let i;try{i=await e.text();}catch{return}if(i!=="")try{return JSON.parse(i)}catch{return e.ok?void 0:i}})();if(!e.ok){let i=new Error(`Request failed with status ${e.status}`);throw i.status=e.status,i.data=n,i}if(n===void 0||t!==void 0&&!t(n))throw new Error("Response body was empty, invalid JSON, or not the expected shape");return n}function Ce(e){return typeof e=="object"&&e!==null&&Array.isArray(e.results)}var ld=isServer?0:3;function mt(e,t){let{status:r}=t,n=r===408||r===429;return r!==void 0&&r>=400&&r<500&&!n?false:e{let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let u=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:be(ve,s)});return Pe(u,Ce)},retry:mt})}function AD(e,t,r=true){return infiniteQueryOptions({queryKey:c.search.controversialRising(e,t),initialPageParam:{sid:void 0,hasNextPage:true},queryFn:async({pageParam:n,signal:i})=>{if(!n.hasNextPage)return {hits:0,took:0,results:[]};let o,s=new Date;switch(t){case "today":o=new Date(s.getTime()-1440*60*1e3);break;case "week":o=new Date(s.getTime()-10080*60*1e3);break;case "month":o=new Date(s.getTime()-720*60*60*1e3);break;case "year":o=new Date(s.getTime()-365*24*60*60*1e3);break;default:o=void 0;}let a="* type:post",u=e==="rising"?"children":e,p=o?o.toISOString().split(".")[0]:void 0,l="0",f=t==="today"?50:200,m={q:a,sort:u,hide_low:l};p&&(m.since=p),n.sid&&(m.scroll_id=n.sid),(m.votes=f);let y=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(m),signal:be(ve,i)});return Pe(y,Ce)},getNextPageParam:n=>({sid:n?.scroll_id,hasNextPage:n.results.length>0}),enabled:r,retry:mt})}async function ED(e,t,r,n,i,o,s){let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let p=await w()(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:be(ve,s)});return Pe(p,Ce)}async function Ao(e,t,r=ve){let i=await w()(d.privateApiHost+"/search-api/similar",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(e),signal:be(r,t)});return Pe(i,Ce)}async function SD(e,t){let n=await w()(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e}),signal:be(ve,t)}),i=await Pe(n,Array.isArray);return i?.length>0?i:[e]}var gd=4368*60*60*1e3,yd=4,hd=3e3,wd=2e3,_d=4e3,FD=2;function bd(e,t){return e.replace(/!\[[^\]]*\]\([^)]*\)/g," ").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim().slice(0,t)}function vd(e){let t=5381;for(let r=0;r>>0).toString(36)}function qD(e){let t=e.title??"",r=e.json_metadata?.tags,n=(Array.isArray(r)?r:[]).filter(s=>typeof s=="string"&&s!==""),i=bd(e.body??"",hd),o=vd(`${t}|${n.join(",")}|${i}`);return queryOptions({queryKey:c.search.similarEntries(e.author,e.permlink,o),queryFn:async({signal:s})=>{let a=new Date(Date.now()-gd).toISOString().slice(0,19),u=await Ao({author:e.author,permlink:e.permlink,title:t,body:i,tags:n,since:a},s,typeof window>"u"?wd:_d),p=[],l=new Set;for(let f of u.results){if(p.length>=yd)break;f.permlink!==e.permlink&&(f.tags??[]).indexOf("nsfw")===-1&&(l.has(f.author)||(l.add(f.author),p.push(f)));}return p},staleTime:300*1e3,retry:false})}function ND(e,t=5){let r=e.trim();return queryOptions({queryKey:c.search.account(r,t),queryFn:async()=>{let n=await g("condenser_api.lookup_accounts",[r,t]);return n.length===0?[]:Rt(n)},enabled:!!r})}function jD(e,t=10){let r=e.trim();return queryOptions({queryKey:c.search.topics(r,t),queryFn:async()=>(await g("condenser_api.get_trending_tags",[r,t+1])).map(i=>i.name).filter(i=>i!==""&&!i.startsWith("hive-")).slice(0,t),enabled:!!r})}function JD(e,t,r,n,i,o){return infiniteQueryOptions({queryKey:c.search.api(e,t,r,n,i,o),queryFn:async({pageParam:s,signal:a})=>{let u={q:e,sort:t,hide_low:r};n&&(u.since=n),s&&(u.scroll_id=s),i!==void 0&&(u.votes=i),o&&(u.include_nsfw=1);let p=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(u),signal:be(ve,a)});return Pe(p,Ce)},initialPageParam:void 0,getNextPageParam:s=>s?.scroll_id,enabled:!!e,retry:mt})}function eK(e){return queryOptions({queryKey:["search","path",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e})});if(!t.ok)throw new Error(`Search path failed: ${t.status}`);let r=await t.json();return r?.length>0?r:[e]}})}async function Sd(e){let r=await w()(d.privateApiHost+"/private-api/support-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to fetch support settings: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function iK(e,t){let r=e?.replace("@","");return queryOptions({queryKey:c.support.settings(r),queryFn:()=>{if(!t)throw new Error("[SDK][Support] missing auth");return Sd(t)},enabled:!!r&&!!t})}async function Td(e,t){let n=await w()(d.privateApiHost+"/private-api/support-settings-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,beneficiary_percent:t.beneficiary_percent,curation_percent:t.curation_percent})});if(!n.ok){let i;try{i=await n.json();}catch{}let o=i?.message??`Failed to update support settings: ${n.status}`,s=new Error(o);throw s.status=n.status,s.data=i,s}return await n.json()}function Rd(e,t,r){return e.setQueryData(c.support.settings(t),r),e.invalidateQueries({queryKey:c.support.settings(t)})}function uK(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["support","settings-update",n],mutationFn:async i=>{if(!n||!t)throw new Error("[SDK][Support] missing auth");return Td(t,i)},onSuccess(i){n&&Rd(r,n,i);}})}function fK(e){return queryOptions({queryKey:["promotions","boost-plus-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/boost-plus-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch boost plus prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function hK(e){return queryOptions({queryKey:["promotions","rc-delegation-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/rc-delegation-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch RC delegation prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function vK(e,t){return queryOptions({queryKey:["promotions","rc-delegation-active",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/rc-delegation-active",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,username:e})});if(!r.ok)throw new Error(`Failed to fetch RC delegation active: ${r.status}`);let n=await r.json();return n&&n.expires&&n.user?{user:n.user,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function xK(e){return queryOptions({queryKey:["promotions","promote-price"],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/promote-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch promote prices: ${t.status}`);return await t.json()},enabled:!!e})}function CK(e,t){return queryOptions({queryKey:["promotions","boost-plus-accounts",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/boosted-plus-account",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:e})});if(!r.ok)throw new Error(`Failed to fetch boost plus account prices: ${r.status}`);let n=await r.json();return n?{account:n.account,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function qK(e,t,r){return v(["promotions","boost-plus"],e,({account:n,duration:i})=>[Nr(e,n,i)],async(n,{account:i})=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.promotions.boostPlusAccounts(i)]);},t,"active",{broadcastMode:r})}function BK(e,t,r){return v(["promotions","rc-delegation"],e,({duration:n})=>[Qr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.resourceCredits.account(e),["promotions","rc-delegation-active",e]]);},t,"active",{broadcastMode:r})}async function QK(e){let r=await w()(d.privateApiHost+"/auth-api/hs-token-refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let i;try{i=await r.json();}catch{i=void 0;}let o=new Error(`Failed to refresh token: ${r.status}`);throw o.status=r.status,o.data=i,o}return await r.json()}var Md="https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt";function jK(){return queryOptions({queryKey:c.badActors.list(),queryFn:async({signal:e})=>{let t=await fetch(Md,{signal:e});if(!t.ok)throw new Error(`Failed to fetch bad actors list: ${t.status}`);let r=await t.text();return new Set(r.split(` +import {useQuery,useInfiniteQuery,useMutation,QueryClient,queryOptions,infiniteQueryOptions,useQueryClient,isServer}from'@tanstack/react-query';import {hexToBytes,bytesToHex}from'@noble/hashes/utils.js';import {ripemd160}from'@noble/hashes/legacy.js';import nn from'bs58';import {secp256k1}from'@noble/curves/secp256k1.js';import {sha256,sha512}from'@noble/hashes/sha2.js';import {cbc}from'@noble/ciphers/aes.js';import Ln from'hivesigner';var Jr=Object.defineProperty;var Oo=(e,t,r)=>t in e?Jr(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var gt=(e,t)=>{for(var r in t)Jr(e,r,{get:t[r],enumerable:true});};var A=(e,t,r)=>Oo(e,typeof t!="symbol"?t+"":t,r);var yt=new ArrayBuffer(0),ht=null,wt=null;function xo(){return ht||(typeof TextEncoder<"u"?ht=new TextEncoder:ht={encode(e){let t=[];for(let r=0;r>6,128|n&63);else if(n>=55296&&n<=56319&&r+1>18,128|n>>12&63,128|n>>6&63,128|n&63);}else t.push(224|n>>12,128|n>>6&63,128|n&63);}return new Uint8Array(t)}}),ht}function Yr(){return wt||(typeof TextDecoder<"u"?wt=new TextDecoder:wt={decode(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r="";for(let n=0;n>10),56320+(o&1023)));}return r}}),wt}var j=class j{constructor(t=j.DEFAULT_CAPACITY,r=j.DEFAULT_ENDIAN){A(this,"buffer");A(this,"view");A(this,"offset");A(this,"markedOffset");A(this,"limit");A(this,"littleEndian");A(this,"readUInt32",this.readUint32);this.buffer=t===0?yt:new ArrayBuffer(t),this.view=t===0?new DataView(yt):new DataView(this.buffer),this.offset=0,this.markedOffset=-1,this.limit=t,this.littleEndian=r;}static allocate(t,r){return new j(t,r)}static concat(t,r){let n=0;for(let a=0;a0&&(n.buffer=t.buffer,n.offset=t.byteOffset,n.limit=t.byteOffset+t.byteLength,n.view=new DataView(t.buffer));else if(t instanceof ArrayBuffer)n=new j(0,r),t.byteLength>0&&(n.buffer=t,n.offset=0,n.limit=t.byteLength,n.view=t.byteLength>0?new DataView(t):new DataView(yt));else if(Array.isArray(t))n=new j(t.length,r),n.limit=t.length,new Uint8Array(n.buffer).set(t);else throw TypeError("Illegal buffer");return n}writeBytes(t,r){return this.append(t,r)}writeInt8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setInt8(r,t),n&&(this.offset+=1),this}writeByte(t,r){return this.writeInt8(t,r)}writeUint8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setUint8(r,t),n&&(this.offset+=1),this}writeUInt8(t,r){return this.writeUint8(t,r)}readUint8(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint8(t);return r&&(this.offset+=1),n}readUInt8(t){return this.readUint8(t)}writeInt16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setInt16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeShort(t,r){return this.writeInt16(t,r)}writeUint16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setUint16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeUInt16(t,r){return this.writeUint16(t,r)}writeInt32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setInt32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeInt(t,r){return this.writeInt32(t,r)}writeUint32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setUint32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeUInt32(t,r){return this.writeUint32(t,r)}readUint32(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint32(t,this.littleEndian);return r&&(this.offset+=4),n}append(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i;return t instanceof j?(i=new Uint8Array(t.buffer,t.offset,t.limit-t.offset),t.offset+=i.length):t instanceof Uint8Array?i=t:t instanceof ArrayBuffer?i=new Uint8Array(t):i=new Uint8Array(t),i.length<=0?this:(r+i.length>this.buffer.byteLength&&this.resize(r+i.length),new Uint8Array(this.buffer).set(i,r),n&&(this.offset+=i.length),this)}clone(t){let r=new j(0,this.littleEndian);return t?(r.buffer=new ArrayBuffer(this.buffer.byteLength),new Uint8Array(r.buffer).set(new Uint8Array(this.buffer)),r.view=new DataView(r.buffer)):(r.buffer=this.buffer,r.view=this.view),r.offset=this.offset,r.markedOffset=this.markedOffset,r.limit=this.limit,r}copy(t,r){if(t===void 0&&(t=this.offset),r===void 0&&(r=this.limit),t===r)return new j(0,this.littleEndian);let n=r-t,i=new j(n,this.littleEndian);return i.offset=0,i.limit=n,new Uint8Array(i.buffer).set(new Uint8Array(this.buffer).subarray(t,r),0),i}copyTo(t,r,n,i){let o=typeof r>"u",s=typeof n>"u";r=o?t.offset:r,n=s?this.offset:n,i=i===void 0?this.limit:i;let a=i-n;return a===0?t:(t.ensureCapacity(r+a),new Uint8Array(t.buffer).set(new Uint8Array(this.buffer).subarray(n,i),r),s&&(this.offset+=a),o&&(t.offset+=a),this)}ensureCapacity(t){let r=this.buffer.byteLength;return rt?r:t):this}flip(){return this.limit=this.offset,this.offset=0,this}resize(t){if(this.buffer.byteLength"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigInt64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeLong(t,r){return this.writeInt64(t,r)}readInt64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigInt64(t,this.littleEndian);return r&&(this.offset+=8),n}readLong(t){return this.readInt64(t)}writeUint64(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigUint64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeUInt64(t,r){return this.writeUint64(t,r)}readUint64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigUint64(t,this.littleEndian);return r&&(this.offset+=8),n}readUInt64(t){return this.readUint64(t)}toBuffer(t){let r=this.offset,n=this.limit;return !t&&r===0&&n===this.buffer.byteLength?this.buffer:r===n?yt:this.buffer.slice(r,n)}toArrayBuffer(t){return this.toBuffer(t)}writeVarint32(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=this.calculateVarint32(t);for(r+i>this.buffer.byteLength&&this.resize(r+i),t>>>=0;t>=128;)this.view.setUint8(r++,t&127|128),t>>>=7;return this.view.setUint8(r++,t),n?(this.offset=r,this):i}readVarint32(t){let r=typeof t>"u";typeof t>"u"&&(t=this.offset);let n=0,i=0,o;do o=this.view.getUint8(t++),n<5&&(i|=(o&127)<<7*n),++n;while((o&128)!==0);return i|=0,r?(this.offset=t,i):{value:i,length:n}}calculateVarint32(t){return t=t>>>0,t<128?1:t<16384?2:t<1<<21?3:t<1<<28?4:5}writeVString(t,r){let n=typeof r>"u",i=n?this.offset:r,o=xo().encode(t),s=o.length,a=this.calculateVarint32(s);return i+a+s>this.buffer.byteLength&&this.resize(i+a+s),this.writeVarint32(s,i),i+=a,new Uint8Array(this.buffer).set(o,i),i+=s,n?(this.offset=i,this):i-(r||0)}readVString(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=t,i=this.readVarint32(t),o=i.value,s=i.length;t+=s;let a=Yr().decode(new Uint8Array(this.buffer,t,o));return t+=o,r?(this.offset=t,a):{string:a,length:t-n}}readUTF8String(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=Yr().decode(new Uint8Array(this.buffer,r,t));return n?(this.offset+=t,i):{string:i,length:t}}};A(j,"LITTLE_ENDIAN",true),A(j,"BIG_ENDIAN",false),A(j,"DEFAULT_CAPACITY",16),A(j,"DEFAULT_ENDIAN",j.BIG_ENDIAN);var D=j;var E={nodes:["https://api.hive.blog","https://api.deathwing.me","https://api.openhive.network","https://techcoderx.com","https://api.syncad.com","https://rpc.mahdiyari.info"],restNodes:["https://api.hive.blog","https://rpc.mahdiyari.info","https://api.syncad.com","https://hiveapi.actifit.io","https://api.c0ff33a.uk"],restNodesByApi:{hivesense:["https://api.hive.blog","https://api.syncad.com"]},userAgent:"ecency-sdk",chain_id:"beeab0de00000000000000000000000000000000000000000000000000000000",address_prefix:"STM",timeout:5e3,broadcastTimeout:15e3,retry:5,resilience:{adaptiveTimeout:true,adaptiveTimeoutFloorMs:2e3,adaptiveTimeoutFactor:4,hedge:false,hedgeDelayFloorMs:750,hedgeDelayFactor:2,hedgeBucketCapacity:10,hedgeRefillPerSuccess:.1,totalBudgetFactor:2}},Wt=e=>Array.isArray(e)?[...new Set(e.filter(t=>typeof t=="string").map(t=>t.trim().replace(/\/+$/,"")).filter(t=>t.length>0&&/^https?:\/\/.+/.test(t)))]:[],Gt=e=>{let t=Wt(e);t.length&&(E.nodes=t);},zt=e=>{let t=Wt(e);t.length&&(E.restNodes=t);},Jt=e=>{if(!e||typeof e!="object")return;let t={...E.restNodesByApi};for(let[r,n]of Object.entries(e)){let i=Wt(n);i.length?t[r]=i:delete t[r];}E.restNodesByApi=t;},Yt=e=>{if(typeof e!="string")return;let t=e.trim();!t||/[\u0000-\u001f\u007f]/.test(t)||(E.userAgent=t);},Xt=e=>{if(!e||typeof e!="object")return;let t=E.resilience,r=i=>typeof i=="boolean",n=i=>typeof i=="number"&&Number.isFinite(i)&&i>0;r(e.adaptiveTimeout)&&(t.adaptiveTimeout=e.adaptiveTimeout),n(e.adaptiveTimeoutFloorMs)&&(t.adaptiveTimeoutFloorMs=Math.max(e.adaptiveTimeoutFloorMs,2e3)),n(e.adaptiveTimeoutFactor)&&(t.adaptiveTimeoutFactor=e.adaptiveTimeoutFactor),r(e.hedge)&&(t.hedge=e.hedge),n(e.hedgeDelayFloorMs)&&(t.hedgeDelayFloorMs=e.hedgeDelayFloorMs),n(e.hedgeDelayFactor)&&(t.hedgeDelayFactor=e.hedgeDelayFactor),n(e.hedgeBucketCapacity)&&(t.hedgeBucketCapacity=e.hedgeBucketCapacity),n(e.hedgeRefillPerSuccess)&&(t.hedgeRefillPerSuccess=Math.min(e.hedgeRefillPerSuccess,1)),n(e.totalBudgetFactor)&&(t.totalBudgetFactor=Math.max(e.totalBudgetFactor,1));};var Oe=class e{constructor(t,r,n){A(this,"data");A(this,"recovery");A(this,"compressed");this.data=t,this.recovery=r,this.compressed=n??true;}static from(t){if(typeof t=="string"){let r=hexToBytes(t),n=parseInt(bytesToHex(r.subarray(0,1)),16)-31,i=true;n<0&&(i=false,n=n+4);let o=r.subarray(1);return new e(o,n,i)}else throw new Error("Expected string for data")}toBuffer(){let t=new Uint8Array(65).fill(0);return this.compressed?t[0]=this.recovery+31&255:t[0]=this.recovery+27&255,t.set(this.data,1),t}customToString(){return bytesToHex(this.toBuffer())}toString(){return this.customToString()}getPublicKey(t){if(t instanceof Uint8Array&&t.length!==32||typeof t=="string"&&t.length!==64)throw new Error("Expected a valid sha256 hash as message");typeof t=="string"&&(t=hexToBytes(t));let r=secp256k1.Signature.fromBytes(this.data,"compact"),n=new secp256k1.Signature(r.r,r.s,this.recovery);return new X(n.recoverPublicKey(t).toBytes())}};var X=class e{constructor(t,r){A(this,"key");A(this,"prefix");this.key=t,this.prefix=r??E.address_prefix;}static fromString(t){let r=E.address_prefix;if(typeof t!="string"||t.length<=r.length)throw new Error("Invalid public key");let n=t.slice(0,r.length);if(n!==r)throw new Error(`Public key must start with ${r}`);let i;try{i=nn.decode(t.slice(r.length));}catch{throw new Error("Invalid public key encoding")}if(i.length!==37)throw new Error("Invalid public key length");let o=i.subarray(0,33),s=i.subarray(33,37),a=ripemd160(o).subarray(0,4);if(!So(s,a))throw new Error("Public key checksum mismatch");try{secp256k1.Point.fromBytes(o);}catch{throw new Error("Invalid public key")}return new e(o,n)}static from(t){return t instanceof e?t:e.fromString(t)}verify(t,r){return typeof r=="string"&&(r=Oe.from(r)),secp256k1.verify(r.data,t,this.key,{prehash:false,format:"compact"})}toString(){return Eo(this.key,this.prefix)}toJSON(){return this.toString()}inspect(){return `PublicKey: ${this.toString()}`}},Eo=(e,t)=>{let r=ripemd160(e);return t+nn.encode(new Uint8Array([...e,...r.subarray(0,4)]))},So=(e,t)=>{if(e.byteLength!==t.byteLength)return false;for(let r=0;r{throw new Error("Void can not be serialized")},_=(e,t)=>{e.writeVString(t);},To=(e,t)=>{e.writeInt16(t);},sn=(e,t)=>{e.writeInt64(t);},on=(e,t)=>{e.writeUint8(t);},pe=(e,t)=>{e.writeUint16(t);},Z=(e,t)=>{e.writeUint32(t);},an=(e,t)=>{e.writeUint64(t);},he=(e,t)=>{e.writeByte(t?1:0);},cn=e=>(t,r)=>{let[n,i]=r;t.writeVarint32(n),e[n](t,i);},I=(e,t)=>{let r=_t.from(t),n=r.getPrecision();e.writeInt64(Math.round(r.amount*Math.pow(10,n))),e.writeUint8(n);for(let i=0;i<7;i++)e.writeUint8(r.symbol.charCodeAt(i)||0);},xe=(e,t)=>{e.writeUint32(Math.floor(new Date(t+"Z").getTime()/1e3));},ge=(e,t)=>{t===null||typeof t=="string"&&t.slice(-39)==="1111111111111111111111111111111114T1Anm"?e.append(new Uint8Array(33).fill(0)):e.append(X.from(t).key);},un=(e=null)=>(t,r)=>{r=bt.from(r);let n=r.buffer.length;if(e){if(n!==e)throw new Error(`Unable to serialize binary. Expected ${e} bytes, got ${n}`)}else t.writeVarint32(n);t.append(r.buffer);},pn=un(),Zt=(e,t)=>(r,n)=>{r.writeVarint32(n.length);for(let[i,o]of n)e(r,i),t(r,o);},L=e=>(t,r)=>{t.writeVarint32(r.length);for(let n of r)e(t,n);},le=e=>(t,r)=>{for(let[n,i]of e)try{i(t,r[n]);}catch(o){throw o.message=`${n}: ${o.message}`,o}},Re=e=>(t,r)=>{r!==void 0?(t.writeByte(1),e(t,r)):t.writeByte(0);},z=le([["weight_threshold",Z],["account_auths",Zt(_,pe)],["key_auths",Zt(ge,pe)]]),Ro=le([["account",_],["weight",pe]]),er=le([["base",I],["quote",I]]),Fo=le([["account_creation_fee",I],["maximum_block_size",Z],["hbd_interest_rate",pe]]),F=(e,t)=>{let r=le(t);return (n,i)=>{n.writeVarint32(e),r(n,i);}},C={};C.account_create=F(R.account_create,[["fee",I],["creator",_],["new_account_name",_],["owner",z],["active",z],["posting",z],["memo_key",ge],["json_metadata",_]]);C.account_create_with_delegation=F(R.account_create_with_delegation,[["fee",I],["delegation",I],["creator",_],["new_account_name",_],["owner",z],["active",z],["posting",z],["memo_key",ge],["json_metadata",_],["extensions",L(se)]]);C.account_update=F(R.account_update,[["account",_],["owner",Re(z)],["active",Re(z)],["posting",Re(z)],["memo_key",ge],["json_metadata",_]]);C.account_witness_proxy=F(R.account_witness_proxy,[["account",_],["proxy",_]]);C.account_witness_vote=F(R.account_witness_vote,[["account",_],["witness",_],["approve",he]]);C.cancel_transfer_from_savings=F(R.cancel_transfer_from_savings,[["from",_],["request_id",Z]]);C.change_recovery_account=F(R.change_recovery_account,[["account_to_recover",_],["new_recovery_account",_],["extensions",L(se)]]);C.claim_account=F(R.claim_account,[["creator",_],["fee",I],["extensions",L(se)]]);C.claim_reward_balance=F(R.claim_reward_balance,[["account",_],["reward_hive",I],["reward_hbd",I],["reward_vests",I]]);C.comment=F(R.comment,[["parent_author",_],["parent_permlink",_],["author",_],["permlink",_],["title",_],["body",_],["json_metadata",_]]);C.comment_options=F(R.comment_options,[["author",_],["permlink",_],["max_accepted_payout",I],["percent_hbd",pe],["allow_votes",he],["allow_curation_rewards",he],["extensions",L(cn([le([["beneficiaries",L(Ro)]])]))]]);C.convert=F(R.convert,[["owner",_],["requestid",Z],["amount",I]]);C.create_claimed_account=F(R.create_claimed_account,[["creator",_],["new_account_name",_],["owner",z],["active",z],["posting",z],["memo_key",ge],["json_metadata",_],["extensions",L(se)]]);C.custom=F(R.custom,[["required_auths",L(_)],["id",pe],["data",pn]]);C.custom_json=F(R.custom_json,[["required_auths",L(_)],["required_posting_auths",L(_)],["id",_],["json",_]]);C.decline_voting_rights=F(R.decline_voting_rights,[["account",_],["decline",he]]);C.delegate_vesting_shares=F(R.delegate_vesting_shares,[["delegator",_],["delegatee",_],["vesting_shares",I]]);C.delete_comment=F(R.delete_comment,[["author",_],["permlink",_]]);C.escrow_approve=F(R.escrow_approve,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Z],["approve",he]]);C.escrow_dispute=F(R.escrow_dispute,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Z]]);C.escrow_release=F(R.escrow_release,[["from",_],["to",_],["agent",_],["who",_],["receiver",_],["escrow_id",Z],["hbd_amount",I],["hive_amount",I]]);C.escrow_transfer=F(R.escrow_transfer,[["from",_],["to",_],["hbd_amount",I],["hive_amount",I],["escrow_id",Z],["agent",_],["fee",I],["json_meta",_],["ratification_deadline",xe],["escrow_expiration",xe]]);C.feed_publish=F(R.feed_publish,[["publisher",_],["exchange_rate",er]]);C.limit_order_cancel=F(R.limit_order_cancel,[["owner",_],["orderid",Z]]);C.limit_order_create=F(R.limit_order_create,[["owner",_],["orderid",Z],["amount_to_sell",I],["min_to_receive",I],["fill_or_kill",he],["expiration",xe]]);C.limit_order_create2=F(R.limit_order_create2,[["owner",_],["orderid",Z],["amount_to_sell",I],["exchange_rate",er],["fill_or_kill",he],["expiration",xe]]);C.recover_account=F(R.recover_account,[["account_to_recover",_],["new_owner_authority",z],["recent_owner_authority",z],["extensions",L(se)]]);C.request_account_recovery=F(R.request_account_recovery,[["recovery_account",_],["account_to_recover",_],["new_owner_authority",z],["extensions",L(se)]]);C.reset_account=F(R.reset_account,[["reset_account",_],["account_to_reset",_],["new_owner_authority",z]]);C.set_reset_account=F(R.set_reset_account,[["account",_],["current_reset_account",_],["reset_account",_]]);C.set_withdraw_vesting_route=F(R.set_withdraw_vesting_route,[["from_account",_],["to_account",_],["percent",pe],["auto_vest",he]]);C.transfer=F(R.transfer,[["from",_],["to",_],["amount",I],["memo",_]]);C.transfer_from_savings=F(R.transfer_from_savings,[["from",_],["request_id",Z],["to",_],["amount",I],["memo",_]]);C.transfer_to_savings=F(R.transfer_to_savings,[["from",_],["to",_],["amount",I],["memo",_]]);C.transfer_to_vesting=F(R.transfer_to_vesting,[["from",_],["to",_],["amount",I]]);C.vote=F(R.vote,[["voter",_],["author",_],["permlink",_],["weight",To]]);C.withdraw_vesting=F(R.withdraw_vesting,[["account",_],["vesting_shares",I]]);C.witness_update=F(R.witness_update,[["owner",_],["url",_],["block_signing_key",ge],["props",Fo],["fee",I]]);C.witness_set_properties=F(R.witness_set_properties,[["owner",_],["props",Zt(_,pn)],["extensions",L(se)]]);C.account_update2=F(R.account_update2,[["account",_],["owner",Re(z)],["active",Re(z)],["posting",Re(z)],["memo_key",Re(ge)],["json_metadata",_],["posting_json_metadata",_],["extensions",L(se)]]);C.create_proposal=F(R.create_proposal,[["creator",_],["receiver",_],["start_date",xe],["end_date",xe],["daily_pay",I],["subject",_],["permlink",_],["extensions",L(se)]]);C.update_proposal_votes=F(R.update_proposal_votes,[["voter",_],["proposal_ids",L(sn)],["approve",he],["extensions",L(se)]]);C.remove_proposal=F(R.remove_proposal,[["proposal_owner",_],["proposal_ids",L(sn)],["extensions",L(se)]]);var qo=le([["end_date",xe]]);C.update_proposal=F(R.update_proposal,[["proposal_id",an],["creator",_],["daily_pay",I],["subject",_],["permlink",_],["extensions",L(cn([se,qo]))]]);C.collateralized_convert=F(R.collateralized_convert,[["owner",_],["requestid",Z],["amount",I]]);C.recurrent_transfer=F(R.recurrent_transfer,[["from",_],["to",_],["amount",I],["memo",_],["recurrence",pe],["executions",pe],["extensions",L(le([["type",on],["value",le([["pair_id",on]])]]))]]);var Io=(e,t)=>{let r=C[t[0]];if(!r)throw new Error(`No serializer for operation: ${t[0]}`);try{r(e,t[1]);}catch(n){throw n.message=`${t[0]}: ${n.message}`,n}},Do=le([["ref_block_num",pe],["ref_block_prefix",Z],["expiration",xe],["operations",L(Io)],["extensions",L(_)]]),Ko=le([["from",ge],["to",ge],["nonce",an],["check",Z],["encrypted",un()]]),de={Asset:I,Memo:Ko,Price:er,PublicKey:ge,String:_,Transaction:Do,UInt16:pe,UInt32:Z};var Ze=e=>new Promise(t=>setTimeout(t,e));var Bo=(()=>{try{return !(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof process<"u"&&process.versions!=null&&process.versions.node!=null}catch{return false}})();function mn(){return Bo?{"User-Agent":E.userAgent}:{}}var ee=class extends Error{constructor(r){super(r.message);A(this,"name","RPCError");A(this,"data");A(this,"code");A(this,"stack");this.code=r.code,"data"in r&&(this.data=r.data);}},Fe=class extends Error{constructor(r,n,i={}){super(n);A(this,"node");A(this,"rateLimitMs");A(this,"isRateLimit");this.node=r,this.rateLimitMs=i.rateLimitMs??0,this.isRateLimit=i.isRateLimit??false;}};function gn(e){if(!e)return 0;let t=Number(e);if(Number.isFinite(t))return t>0?t*1e3:0;let r=Date.parse(e);if(Number.isFinite(r)){let n=r-Date.now();return n>0?n:0}return 0}var Mo=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],No=["Failed to fetch","NetworkError when attempting to fetch","Load failed","fetch failed"];function Qo(e){if(!e)return "";let t=[String(e.name||""),String(e.message||""),String(e.code||"")],r=e.cause;for(let n=0;r&&n<5;n++)t.push(String(r.code||""),String(r.message||"")),r=r.cause;return t.join(" ")}function Ho(e){if(!e)return false;if(e instanceof Fe)return true;if(e instanceof ee)return false;let t=Qo(e);return !!(Mo.some(r=>t.includes(r))||No.some(r=>t.includes(r))||e instanceof SyntaxError||/Unexpected token|JSON\.parse|Unexpected end of JSON/i.test(t))}function tr(e,t){return !!(e===-32603||e<=-32e3&&e>=-32099||e===-32601||e===-32602&&/unable to parse|endpoint data|internal/i.test(t))}function yn(e){let t=e.indexOf(".");return t>0?e.slice(0,t):e}var Uo=1e4,Vo=6e4,jo=12e4,ln=2,dn=6e4,fn=12e4,Lo=30,et=.3,rr=3,tt=5*6e4,hn=6e4,wn=1e3,_n=2e3,At=class{constructor(){A(this,"health",new Map);}getOrCreate(t){let r=this.health.get(t);return r||(r={consecutiveFailures:0,lastFailureTime:0,rateLimitedUntil:0,rateLimitStreak:0,lastRateLimitAt:0,apiFailures:new Map,headBlock:0,headBlockUpdatedAt:0,ewmaLatencyMs:void 0,latencySampleCount:0,latencyUpdatedAt:0,lastProbeAt:Date.now(),apiLatency:new Map},this.health.set(t,r)),r}recordSuccess(t,r,n,i){let o=this.getOrCreate(t);if(o.consecutiveFailures=0,o.rateLimitStreak=0,r){let s=o.apiFailures.get(r);(!s||!(s.defective&&s.cooldownUntil>Date.now()))&&o.apiFailures.delete(r);}typeof n=="number"&&Number.isFinite(n)&&n>=0&&this.recordLatency(o,n,i??r);}recordSlowFailure(t,r,n){!Number.isFinite(r)||r<_n||this.recordLatency(this.getOrCreate(t),r,n);}getUsableLatencyMs(t,r){let n=this.health.get(t);if(!n)return;let i=Date.now();if(r!==void 0){let o=n.apiLatency.get(r);return o&&o.sampleCount>=rr&&i-o.updatedAt<=tt?o.ewmaMs:void 0}return this.isLatencyUsable(n,i)?n.ewmaLatencyMs:void 0}recordCensoredLatency(t,r,n){!Number.isFinite(r)||r<50||this.recordLatency(this.getOrCreate(t),r,n);}recordLatency(t,r,n){let i=Date.now();if(t.latencyUpdatedAt>0&&i-t.latencyUpdatedAt>tt&&(t.ewmaLatencyMs=void 0,t.latencySampleCount=0,t.apiLatency.clear()),t.ewmaLatencyMs=t.ewmaLatencyMs===void 0?r:et*r+(1-et)*t.ewmaLatencyMs,t.latencySampleCount++,t.latencyUpdatedAt=i,n!==void 0){let o=t.apiLatency.get(n);!o||i-o.updatedAt>tt?t.apiLatency.set(n,{ewmaMs:r,sampleCount:1,updatedAt:i}):(o.ewmaMs=et*r+(1-et)*o.ewmaMs,o.sampleCount++,o.updatedAt=i);}}recordFailure(t,r){let n=this.getOrCreate(t);if(r){let i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};(o.cooldownUntil>0&&o.cooldownUntil<=i||o.lastFailureTime>0&&i-o.lastFailureTime>3e4)&&(o.count=0,o.cooldownUntil=0),o.count++,o.lastFailureTime=i,o.count>=ln&&(o.cooldownUntil=i+dn),n.apiFailures.set(r,o);}else n.consecutiveFailures++,n.lastFailureTime=Date.now();}recordDefectiveResponse(t,r){let n=this.getOrCreate(t),i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};o.count=Math.max(o.count+1,ln),o.lastFailureTime=i,o.cooldownUntil=i+dn,o.defective=true,n.apiFailures.set(r,o);}recordRateLimit(t,r){let n=this.getOrCreate(t),i=Date.now();n.rateLimitStreak>0&&i-n.lastRateLimitAt>jo&&(n.rateLimitStreak=0);let o=typeof r=="number"&&Number.isFinite(r)&&r>0,s=o?r:Math.min(Uo*2**n.rateLimitStreak,Vo);o||n.rateLimitStreak++,n.lastRateLimitAt=i,n.rateLimitedUntil=o?i+s:Math.max(n.rateLimitedUntil,i+s),n.consecutiveFailures++,n.lastFailureTime=i;}recordHeadBlock(t,r){if(!r||!Number.isFinite(r))return;let n=this.getOrCreate(t);n.headBlock=r,n.headBlockUpdatedAt=Date.now();}consensusHeadBlock(){let t=Date.now(),r=[];for(let n of this.health.values())n.headBlock>0&&t-n.headBlockUpdatedAt<=fn&&r.push(n.headBlock);return r.length<2?0:(r.sort((n,i)=>n-i),r[Math.floor((r.length-1)/2)])}isNodeHealthy(t,r){let n=this.health.get(t);if(!n)return true;let i=Date.now();if(n.rateLimitedUntil>i||n.consecutiveFailures>=3&&i-n.lastFailureTime<3e4)return false;if(r){let s=n.apiFailures.get(r);if(s&&s.cooldownUntil>i)return false}let o=this.consensusHeadBlock();return !(o>0&&n.headBlock>0&&i-n.headBlockUpdatedAt<=fn&&o-n.headBlock>Lo)}getOrderedNodes(t,r){let n=[],i=[];for(let u of t)this.isNodeHealthy(u,r)?n.push(u):i.push(u);if(n.length<=1)return [...n,...i];let o=Date.now(),s=n.map((u,p)=>({node:u,i:p,score:this.scoreNode(u,o)})).sort((u,p)=>u.score-p.score||u.i-p.i).map(u=>u.node),a=this.pickReprobeCandidate(n,o);return a&&s[0]!==a?[a,...s.filter(u=>u!==a),...i]:[...s,...i]}isLatencyUsable(t,r){return !!t&&t.ewmaLatencyMs!==void 0&&t.latencySampleCount>=rr&&r-t.latencyUpdatedAt<=tt}scoreNode(t,r){let n=this.health.get(t);return this.isLatencyUsable(n,r)?n.ewmaLatencyMs:wn}pickReprobeCandidate(t,r){let n=r-hn,i,o=1/0;for(let s of t){let a=this.getOrCreate(s),u=Math.max(a.latencyUpdatedAt,a.lastProbeAt);u<=n&&u=1-1e-9?(this.tokens-=1,true):false}refill(){this.clamp(),this.tokens=Math.min(E.resilience.hedgeBucketCapacity,this.tokens+E.resilience.hedgeRefillPerSuccess);}clamp(){this.tokens>E.resilience.hedgeBucketCapacity&&(this.tokens=E.resilience.hedgeBucketCapacity);}get available(){return this.tokens}reset(t=E.resilience.hedgeBucketCapacity){this.tokens=t;}},ir=new nr;function Pt(e,t,r,n,i){let o=E.resilience;if(!o.adaptiveTimeout||i)return n;let s=e.getUsableLatencyMs(t,r);return s===void 0?n:Math.ceil(Math.min(n,Math.max(o.adaptiveTimeoutFloorMs,o.adaptiveTimeoutFactor*s)))}function or(e,t,r,n){r instanceof Fe?r.isRateLimit?e.recordRateLimit(t,r.rateLimitMs||void 0):e.recordFailure(t,n):r instanceof ee?e.recordFailure(t,n):e.recordFailure(t);}function bn(e,t,r,n){if(!n||typeof n!="object"||!r.includes("get_dynamic_global_properties"))return;let i=n.head_block_number;typeof i=="number"&&e.recordHeadBlock(t,i);}function $o(){if(typeof DOMException<"u")return new DOMException("The operation was aborted due to timeout","TimeoutError");let e=new Error("The operation was aborted due to timeout");return e.name="TimeoutError",e}function vn(e){if(e=Math.ceil(e),typeof AbortSignal.timeout=="function")return {signal:AbortSignal.timeout(e),cleanup:()=>{}};let t=new AbortController,r=setTimeout(()=>t.abort($o()),e);return {signal:t.signal,cleanup:()=>clearTimeout(r)}}function sr(e,t){if(!t)return {signal:e,cleanup:()=>{}};if(typeof AbortSignal.any=="function")return {signal:AbortSignal.any([e,t]),cleanup:()=>{}};let r=new AbortController;if(e.aborted)return r.abort(e.reason),{signal:r.signal,cleanup:()=>{}};if(t.aborted)return r.abort(t.reason),{signal:r.signal,cleanup:()=>{}};let n=()=>r.abort(e.reason),i=()=>r.abort(t.reason);e.addEventListener("abort",n,{once:true}),t.addEventListener("abort",i,{once:true});let o=()=>{e.removeEventListener("abort",n),t.removeEventListener("abort",i);};return {signal:r.signal,cleanup:o}}var rt=async(e,t,r,n=E.timeout,i=false,o)=>{let s=Math.floor(Math.random()*1e8),a={jsonrpc:"2.0",method:t,params:r,id:s},{signal:u,cleanup:p}=vn(n),{signal:l,cleanup:f}=sr(u,o),m=()=>{p(),f();};try{let y=await fetch(e,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",...mn()},signal:l});if(y.status===429)throw new Fe(e,"HTTP 429 Rate Limited",{rateLimitMs:gn(y.headers.get("Retry-After")),isRateLimit:!0});if(y.status>=500&&y.status<600)throw new Fe(e,`HTTP ${y.status} from ${e}`);let h=await y.json();if(!h||typeof h.id>"u"||h.id!==s||h.jsonrpc!=="2.0")throw new Error("JSONRPC id mismatch");if("result"in h)return h.result;if("error"in h){let S=h.error;throw "message"in S&&"code"in S?new ee(S):h.error}throw h}catch(y){if(y instanceof ee||y instanceof Fe||o?.aborted)throw y;if(i)return rt(e,t,r,n,false,o);throw y}finally{m();}};function vt(){return Ze(50+Math.random()*50)}function Wo(e){let{method:t,params:r,api:n,primary:i,hedgePool:o,callerTimeout:s,explicitTimeout:a,deadlineAt:u,externalSignal:p,onHedgeFired:l,validate:f}=e;return new Promise((m,y)=>{let h=false,S=0,x=false,P=false,O,W,V=0,M=[],H=Y=>{if(!h){h=true,W!==void 0&&(clearTimeout(W),W=void 0);for(let q of M)q.signal.aborted||q.abort();Y();}},G=(Y,q)=>{S++;let me=new AbortController;M.push(me);let Xe=sr(me.signal,p),Po=Pt($,Y,t,s,a),$t=Date.now();q||(V=$t),rt(Y,t,r,Po,false,Xe.signal).then(oe=>{if(Xe.cleanup(),S--,q||(P=true),!h){if(f&&!f(oe)){if($.recordDefectiveResponse(Y,n),O=new Error(`[hive-tx] response validation failed for ${t} from ${Y}`),!q&&!x){H(()=>y(O));return}S===0&&H(()=>y(O));return}$.recordSuccess(Y,n,Date.now()-$t,t),bn($,Y,t,oe),q?P||$.recordCensoredLatency(i,Date.now()-V,t):x||ir.refill(),H(()=>m(oe));}}).catch(oe=>{if(Xe.cleanup(),S--,q||(P=true),!h){if(p?.aborted){H(()=>y(oe));return}if(oe instanceof ee&&!tr(oe.code,oe.message)){H(()=>y(oe));return}if(or($,Y,oe,n),$.recordSlowFailure(Y,Date.now()-$t,t),O=oe,!q&&!x){H(()=>y(oe));return}S===0&&H(()=>y(O));}});};G(i,false);let Te=$.getUsableLatencyMs(i,t)??0,Ye=Pt($,i,t,s,a),Lt=Math.min(Math.max(E.resilience.hedgeDelayFloorMs,E.resilience.hedgeDelayFactor*Te),.8*Ye);W=setTimeout(()=>{if(W=void 0,h||p?.aborted||Date.now()>=u)return;let Y=o.filter(me=>$.isNodeHealthy(me,n));if(Y.length===0)return;let q=Y[Math.floor(Math.random()*Y.length)];ir.trySpend()&&(x=true,l(q),G(q,true));},Lt);})}var g=async(e,t=[],r,n=E.retry,i,o)=>{if(!Array.isArray(E.nodes))throw new Error("config.nodes is not an array");if(E.nodes.length===0)throw new Error("config.nodes is empty");let s=r!==void 0,a=r??E.timeout,u=yn(e),p=Date.now()+E.resilience.totalBudgetFactor*a,l=new Set,f;for(let m=0;m<=n&&!(m>0&&Date.now()>=p);m++){let y=$.getOrderedNodes(E.nodes,u),h=y.find(P=>!l.has(P));h||(l.clear(),h=y[0]),l.add(h);let S=[];if(E.resilience.hedge&&$.getUsableLatencyMs(h,e)!==void 0&&(S=y.filter(P=>!l.has(P)&&$.isNodeHealthy(P,u)).slice(0,3)),S.length>0)try{return await Wo({method:e,params:t,api:u,primary:h,hedgePool:S,callerTimeout:a,explicitTimeout:s,deadlineAt:p,externalSignal:i,onHedgeFired:P=>l.add(P),validate:o})}catch(P){if(P instanceof ee&&!tr(P.code,P.message)||i?.aborted)throw P;f=P,m{if(!Array.isArray(E.nodes))throw new Error("config.nodes is not an array");if(E.nodes.length===0)throw new Error("config.nodes is empty");let i=yn(e),o=new Set,s;for(let a=0;a!o.has(l));if(!p)break;if(o.add(p),n?.aborted)throw new Error("Aborted");try{let l=await rt(p,e,t,r,!1,n);return $.recordSuccess(p,i),l}catch(l){if(l instanceof ee||n?.aborted||(or($,p,l,i),s=l,!Ho(l)))throw l}}throw s},Go={balance:"/balance-api",hafah:"/hafah-api",hafbe:"/hafbe-api",hivemind:"/hivemind-api",hivesense:"/hivesense-api",reputation:"/reputation-api","nft-tracker":"/nft-tracker-api",hafsql:"/hafsql",status:"/status-api"};async function re(e,t,r,n,i=E.retry,o){if(!Array.isArray(E.restNodes))throw new Error("config.restNodes is not an array");if(E.restNodes.length===0)throw new Error("config.restNodes is empty");let s=n!==void 0,a=n??E.timeout,u=Date.now()+E.resilience.totalBudgetFactor*a,p=`${e}:${t}`,l=E.restNodesByApi?.[e]?.length?E.restNodesByApi[e]:E.restNodes,f=new Set,m,y=false;for(let h=0;h<=i&&!(h>0&&Date.now()>=u);h++){let S=Ee.getOrderedNodes(l,e),x=S.find(q=>!f.has(q));x||(f.clear(),x=S[0]),f.add(x);let P=x+Go[e],O=t,W=r||{},V=new Set;Object.entries(W).forEach(([q,me])=>{O.includes(`{${q}}`)&&(O=O.replace(`{${q}}`,encodeURIComponent(String(me))),V.add(q));});let M=new URL(P+O);if(Object.entries(W).forEach(([q,me])=>{V.has(q)||(Array.isArray(me)?me.forEach(Xe=>M.searchParams.append(q,String(Xe))):M.searchParams.set(q,String(me)));}),o?.aborted)throw new Error("Aborted");y=false;let{signal:H,cleanup:G}=vn(Pt(Ee,x,p,a,s)),{signal:Te,cleanup:Ye}=sr(H,o),Lt=()=>{G(),Ye();},Y=Date.now();try{let q=await fetch(M.toString(),{signal:Te,headers:mn()});if(q.status===404)throw new Error("HTTP 404 - Hint: can happen on wrong params");if(q.status===429)throw Ee.recordRateLimit(x,gn(q.headers.get("Retry-After"))||void 0),y=!0,new Error(`HTTP 429 Rate Limited by ${x}`);if(q.status===503)throw Ee.recordFailure(x,e),y=!0,new Error(`HTTP 503 Service Unavailable from ${x}`);if(!q.ok)throw Ee.recordFailure(x,e),y=!0,new Error(`HTTP ${q.status} from ${x}`);return Ee.recordSuccess(x,e,Date.now()-Y,p),q.json()}catch(q){if(q?.message?.includes("HTTP 404")||o?.aborted)throw q;y||Ee.recordFailure(x,e),Ee.recordSlowFailure(x,Date.now()-Y,p),m=q,h{if(!Array.isArray(E.nodes))throw new Error("config.nodes is not an Array");if(r>E.nodes.length)throw new Error("quorum > config.nodes.length");let o=(u=>{let p=[...u];for(let l=p.length-1;l>0;l--){let f=Math.floor(Math.random()*(l+1));[p[l],p[f]]=[p[f],p[l]];}return p})(E.nodes),s=Math.min(r,o.length),a=[];for(;s>0&&o.length>0;){let u=o.splice(0,s),p=[],l=[];for(let m=0;ml.push(y)).catch(()=>{}));await Promise.all(p),a.push(...l);let f=zo(a,r);if(f)return f;if(s=Math.min(r,o.length),s===0)throw new Error("No more nodes available.")}throw new Error("Couldn't reach quorum.")};function zo(e,t){let r=new Map;for(let i of e){let o=JSON.stringify(i);r.has(o)||r.set(o,[]),r.get(o).push(i);}let n=Array.from(r.values()).find(i=>i.length>=t);return n?n[0]:null}var Yo=hexToBytes(E.chain_id),qe=class e{constructor(t){A(this,"transaction");A(this,"expiration",6e4);A(this,"txId");A(this,"createTransaction",async t=>{let r=await g("condenser_api.get_dynamic_global_properties",[]),n=hexToBytes(r.head_block_id),i=Number(new Uint32Array(n.buffer,n.byteOffset+4,1)[0]),o=new Date(Date.now()+t).toISOString().slice(0,-5);this.transaction={expiration:o,extensions:[],operations:[],ref_block_num:r.head_block_number&65535,ref_block_prefix:i,signatures:[]};});t?.transaction&&(t.transaction instanceof e?(this.transaction=t.transaction.transaction,this.expiration=t.transaction.expiration):this.transaction=t.transaction,this.transaction&&!Array.isArray(this.transaction.signatures)&&(this.transaction.signatures=[]),this.txId=this.digest().txId),t?.expiration&&(this.expiration=t.expiration);}async addOperation(t,r){this.transaction||await this.createTransaction(this.expiration),this.transaction.operations.push([t,r]);}sign(t){if(!this.transaction)throw new Error("First create a transaction by .addOperation()");if(this.transaction){let{digest:r,txId:n}=this.digest();Array.isArray(t)||(t=[t]);for(let i of t){let o=i.sign(r);this.transaction.signatures.push(o.customToString());}return this.txId=n,this.transaction}else throw new Error("No transaction to sign")}async broadcast(t=false){if(!this.transaction)throw new Error("Attempted to broadcast an empty transaction. Add operations by .addOperation()");if(this.transaction.signatures.length===0)throw new Error("Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)");try{await Ue("condenser_api.broadcast_transaction",[this.transaction]);}catch(o){if(!(o instanceof ee&&o.message.includes("Duplicate transaction check failed")))throw o}if(this.txId||(this.txId=this.digest().txId),!t)return {tx_id:this.txId,status:"unknown"};let r=60;await Ze(1e3);let n=await this.checkStatus(),i=1;for(;n?.status!=="within_irreversible_block"&&n?.status!=="expired_irreversible"&&n?.status!=="too_old"&&i>6,128|o&63);else if(o>=55296&&o<=56319&&i+1>18,128|o>>12&63,128|o>>6&63,128|o&63);}else n.push(224|o>>12,128|o>>6&63,128|o&63);}t=new Uint8Array(n);}return new e(sha256(t))}static fromLogin(t,r,n="active"){let i=t+n+r;return e.fromSeed(i)}sign(t){let r=secp256k1.sign(t,this.key,{extraEntropy:true,format:"recovered",prehash:false}),n=parseInt(bytesToHex(r.subarray(0,1)),16);return Oe.from((n+31).toString(16)+bytesToHex(r.subarray(1)))}createPublic(t){return new X(secp256k1.getPublicKey(this.key),t)}toString(){return es(new Uint8Array([...Sn,...this.key]))}inspect(){let t=this.toString();return `PrivateKey: ${t.slice(0,6)}...${t.slice(-6)}`}getSharedSecret(t){let r=secp256k1.getSharedSecret(this.key,t.key);return sha512(r.subarray(1))}static randomKey(){return new e(secp256k1.keygen().secretKey)}},kn=e=>sha256(sha256(e)),es=e=>{let t=kn(e);return nn.encode(new Uint8Array([...e,...t.slice(0,4)]))},ts=e=>{let t=nn.decode(e);if(!xn(t.slice(0,1),Sn))throw new Error("Private key network id mismatch");let r=t.slice(-4),n=t.slice(0,-4),i=kn(n).slice(0,4);if(!xn(r,i))throw new Error("Private key checksum mismatch");return n},xn=(e,t)=>{if(e===t)return true;if(e.byteLength!==t.byteLength)return false;let r=e.byteLength,n=0;for(;nFn(e,t,n,r),Rn=(e,t,r,n,i)=>Fn(e,t,r,n,i).message,Fn=(e,t,r,n,i)=>{let o=r,s=e.getSharedSecret(t),a=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);a.writeUint64(o),a.append(s),a.flip();let u=sha512(new Uint8Array(a.toBuffer())),p=u.subarray(32,48),l=u.subarray(0,32),f=sha256(u).subarray(0,4),m=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);m.append(f),m.flip();let y=m.readUint32();if(i!==void 0){if(y!==i)throw new Error("Invalid key");n=os(n,l,p);}else n=ss(n,l,p);return {nonce:o,message:n,checksum:y}},os=(e,t,r)=>{let n=e;return n=cbc(t,r).decrypt(n),n},ss=(e,t,r)=>{let n=e;return n=cbc(t,r).encrypt(n),n},cr=null,as=()=>{if(cr===null){let r=secp256k1.utils.randomSecretKey();cr=r[0]<<8|r[1];}let e=BigInt(Date.now()),t=++cr%65536;return e=e<{let t=fs(e,33);return new X(t)},us=e=>e.readUint64(),ps=e=>e.readUint32(),ls=e=>{let t=e.readVarint32(),r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())},ds=e=>t=>{let r={},n=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);n.append(t),n.flip();for(let[i,o]of e)try{r[i]=o(n);}catch(s){throw s.message=`${i}: ${s.message}`,s}return r};function fs(e,t){if(e){let r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())}else throw Error("No buffer found on first parameter")}var ms=ds([["from",qn],["to",qn],["nonce",us],["check",ps],["encrypted",ls]]),In={Memo:ms};var Kn=(e,t,r,n)=>{if(!r.startsWith("#"))return r;r=r.substring(1),Mn(),e=Nn(e),t=gs(t);let i=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);i.writeVString(r);let o=new Uint8Array(i.copy(0,i.offset).toBuffer()),{nonce:s,message:a,checksum:u}=Tn(e,t,o,n),p=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);de.Memo(p,{check:u,encrypted:a,from:e.createPublic(),nonce:s,to:t}),p.flip();let l=new Uint8Array(p.toBuffer());return "#"+nn.encode(l)},Bn=(e,t)=>{if(!t.startsWith("#"))return t;t=t.substring(1),Mn(),e=Nn(e);let r=In.Memo(nn.decode(t)),{from:n,to:i,nonce:o,check:s,encrypted:a}=r,p=e.createPublic().toString()===new X(n.key).toString()?new X(i.key):new X(n.key);r=Rn(e,p,o,a,s);let l=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);return l.append(r),l.flip(),"#"+l.readVString()},xt,Mn=()=>{if(xt===void 0){let e;xt=true;try{let t="5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw",n=Kn(t,"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA","#memo\u7231");e=Bn(t,n);}finally{xt=e==="#memo\u7231";}}if(xt===false)throw new Error("This environment does not support encryption.")},Nn=e=>typeof e=="string"?U.fromString(e):e,gs=e=>typeof e=="string"?X.fromString(e):e,Qn={decode:Bn,encode:Kn};var ie={};gt(ie,{buildWitnessSetProperties:()=>vs,makeBitMaskFilter:()=>_s,operations:()=>ws,validateUsername:()=>hs});var hs=e=>{let t="Account name should ";if(!e)return t+"not be empty.";let r=e.length;if(r<3)return t+"be longer.";if(r>16)return t+"be shorter.";/\./.test(e)&&(t="Each account segment should ");let n=e.split("."),i=n.length;for(let o=0;oe.reduce(bs,[BigInt(0),BigInt(0)]).map(t=>t!==BigInt(0)?t.toString():null),bs=([e,t],r)=>r<64?[e|BigInt(1)<{let r={extensions:[],owner:e,props:[]};for(let n of Object.keys(t)){if(t[n]===void 0)continue;let i;switch(n){case "key":case "new_signing_key":i=de.PublicKey;break;case "account_subsidy_budget":case "account_subsidy_decay":case "maximum_block_size":i=de.UInt32;break;case "hbd_interest_rate":i=de.UInt16;break;case "url":i=de.String;break;case "hbd_exchange_rate":i=de.Price;break;case "account_creation_fee":i=de.Asset;break;default:throw new Error(`Unknown witness prop: ${n}`)}r.props.push([n,As(i,t[n])]);}return r.props.sort((n,i)=>n[0].localeCompare(i[0])),["witness_set_properties",r]},As=(e,t)=>{let r=new D(D.DEFAULT_CAPACITY,D.LITTLE_ENDIAN);return e(r,t),r.flip(),bytesToHex(new Uint8Array(r.toBuffer()))};function dm(e){let t;if(typeof e=="string"){let r=[];for(let n=0;n>6,128|i&63);else if(i>=55296&&i<=56319&&n+1>18,128|i>>12&63,128|i>>6&63,128|i&63);}else r.push(224|i>>12,128|i>>6&63,128|i&63);}t=new Uint8Array(r);}else t=e;return sha256(t)}function Hn(e){try{return U.fromString(e),!0}catch{return false}}async function te(e,t){let r=new qe;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),Ue("condenser_api.broadcast_transaction_synchronous",[r.transaction])}async function Un(e,t){let r=new qe;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),r.broadcast(false)}var Os=432e3;function Vn(e,t){let r=Date.now()/1e3-t.last_update_time,n=Number(t.current_mana)+r*e/Os,i=Math.round(n/e*1e4);return !isFinite(i)||i<0?i=0:i>1e4&&(i=1e4),{current_mana:n,max_mana:e,percentage:i}}function xs(e){let t=parseFloat(e.vesting_shares),r=parseFloat(e.delegated_vesting_shares),n=parseFloat(e.received_vesting_shares),i=parseFloat(e.vesting_withdraw_rate),o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t-s-r+n}function ur(e){let t=xs(e)*1e6;return Vn(t,e.voting_manabar)}function Et(e){return Vn(Number(e.max_rc),e.rc_manabar)}var jn=(u=>(u.COMMON="common",u.INFO="info",u.INSUFFICIENT_RESOURCE_CREDITS="insufficient_resource_credits",u.MISSING_AUTHORITY="missing_authority",u.TOKEN_EXPIRED="token_expired",u.NETWORK="network",u.TIMEOUT="timeout",u.VALIDATION="validation",u))(jn||{});function Ve(e){let t=e?.error_description?String(e.error_description):"",r=e?.message?String(e.message):"",n=e?.error?String(e.error):"",i=t||r||String(e||""),o=a=>!!(n&&a.test(n)||t&&a.test(t)||r&&a.test(r)||i&&a.test(i));if(o(/please wait to transact/i)||o(/insufficient rc/i)||o(/rc mana|rc account|resource credits/i))return {message:"Insufficient Resource Credits. Please wait or power up.",type:"insufficient_resource_credits",originalError:e};if(o(/you may only post once every/i))return {message:"Please wait before posting again (minimum 3 second interval between comments).",type:"common",originalError:e};if(o(/your current vote on this comment is identical/i))return {message:"You have already voted with the same weight.",type:"info",originalError:e};if(o(/must claim something/i))return {message:"You must claim rewards before performing this action.",type:"info",originalError:e};if(o(/cannot claim that much vests/i))return {message:"Cannot claim that amount. Please check your pending rewards.",type:"info",originalError:e};if(o(/cannot delete a comment with net positive/i))return {message:"Cannot delete a comment with positive votes.",type:"info",originalError:e};if(o(/children == 0/i))return {message:"Cannot delete a comment with replies.",type:"common",originalError:e};if(o(/comment_cashout/i))return {message:"Cannot modify a comment that has already been paid out.",type:"common",originalError:e};if(o(/votes evaluating for comment that is paid out is forbidden/i))return {message:"Cannot vote on posts that have already been paid out.",type:"common",originalError:e};if(o(/no (active|owner|posting|memo) key available/i))return {message:"Key not available. Please provide your key to sign this operation.",type:"missing_authority",originalError:e};if(o(/missing (required )?active authority/i))return {message:"Missing active authority. This operation requires your active key.",type:"missing_authority",originalError:e};if(o(/missing (required )?owner authority/i))return {message:"Missing owner authority. This operation requires your owner key.",type:"missing_authority",originalError:e};if(o(/missing (required )?posting authority/i))return {message:"Missing posting authority. Please check your login method.",type:"missing_authority",originalError:e};if(n==="invalid_grant"||n==="unauthorized_access"||o(/token expired/i)||o(/invalid token/i)||o(/\bunauthorized\b/i)||o(/\bforbidden\b/i))return {message:"Authentication token expired. Please log in again.",type:"token_expired",originalError:e};if(o(/has already reblogged/i)||o(/already reblogged this post/i))return {message:"You have already reblogged this post.",type:"info",originalError:e};if(o(/duplicate transaction/i))return {message:"This transaction has already been processed.",type:"info",originalError:e};if(o(/econnrefused/i)||o(/connection refused/i)||o(/failed to fetch/i)||o(/\bnetwork[-\s]?(request|error|timeout|unreachable|down|failed)\b/i))return {message:"Network error. Please check your connection and try again.",type:"network",originalError:e};if(o(/timeout/i)||o(/timed out/i))return {message:"Request timed out. Please try again.",type:"timeout",originalError:e};if(o(/account.*does not exist/i)||o(/account not found/i))return {message:"Account not found. Please check the username.",type:"validation",originalError:e};if(o(/invalid memo key/i))return {message:"Invalid memo key. Cannot encrypt message.",type:"validation",originalError:e};if(o(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i))return {message:"Insufficient funds for this transaction.",type:"validation",originalError:e};if(o(/\b(invalid|validation)\b/i))return {message:(e?.message||i).substring(0,150)||"Validation error occurred",type:"validation",originalError:e};if(e?.error_description&&typeof e.error_description=="string")return {message:e.error_description.substring(0,150),type:"common",originalError:e};if(e?.message&&typeof e.message=="string")return {message:e.message.substring(0,150),type:"common",originalError:e};let s;return typeof e=="object"&&e!==null?e.error_description?s=String(e.error_description):e.code?s=`Error code: ${e.code}`:i&&i!=="[object Object]"?s=i.substring(0,150):s="Unknown error occurred":s=i.substring(0,150)||"Unknown error occurred",{message:s,type:"common",originalError:e}}function Es(e){let t=Ve(e);return [t.message,t.type]}function we(e){let{type:t}=Ve(e);return t==="missing_authority"||t==="token_expired"}function Ss(e){let{type:t}=Ve(e);return t==="insufficient_resource_credits"}function ks(e){let{type:t}=Ve(e);return t==="info"}function Cs(e){let{type:t}=Ve(e);return t==="network"||t==="timeout"}async function _e(e,t,r,n,i="posting",o,s,a="async"){let u=n?.adapter;switch(e){case "key":{if(!u)throw new Error("No adapter provided for key-based auth");let p=o;if(p===void 0)switch(i){case "owner":if(u.getOwnerKey)p=await u.getOwnerKey(t);else throw new Error("Owner key not supported by adapter. Owner operations (like account recovery) require master password login or manual key entry.");break;case "active":u.getActiveKey&&(p=await u.getActiveKey(t));break;case "memo":if(u.getMemoKey)p=await u.getMemoKey(t);else throw new Error("Memo key not supported by adapter. Use memo encryption methods instead.");break;default:p=await u.getPostingKey(t);break}if(!p)throw new Error(`No ${i} key available for ${t}`);let l=U.fromString(p);return a==="async"?await Un(r,l):await te(r,l)}case "hiveauth":{if(!u?.broadcastWithHiveAuth)throw new Error("HiveAuth not supported by adapter");return await u.broadcastWithHiveAuth(t,r,i)}case "hivesigner":{if(!u)throw new Error("No adapter provided for HiveSigner auth");if(i!=="posting"){if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`HiveSigner access token cannot sign ${i} operations. No platform broadcast available.`)}let p=s!==void 0?s:await u.getAccessToken(t);if(p)try{return (await new Ln.Client({accessToken:p}).broadcast(r)).result}catch(l){if(u.broadcastWithHiveSigner&&we(l))return await u.broadcastWithHiveSigner(t,r,i);throw l}if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`No access token available for ${t}`)}case "keychain":{if(!u?.broadcastWithKeychain)throw new Error("Keychain not supported by adapter");return await u.broadcastWithKeychain(t,r,i)}case "custom":{if(!n?.broadcast)throw new Error("No custom broadcast function provided");return await n.broadcast(r,i)}default:throw new Error(`Unknown auth method: ${e}`)}}async function Rs(e,t,r,n="posting",i="async"){let o=r?.adapter;if(o?.getLoginType){let l=await o.getLoginType(e,n);if(l){let f=o.hasPostingAuthorization?await o.hasPostingAuthorization(e):false;if(n==="posting"&&f&&l==="key")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!we(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to key:",m);}if(n==="posting"&&f&&l==="keychain")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!we(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to keychain/snap:",m);}if(n==="posting"&&f&&l==="hiveauth")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!we(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to HiveAuth:",m);}try{return await _e(l,e,t,r,n,void 0,void 0,i)}catch(m){if(we(m)&&o.showAuthUpgradeUI&&(n==="posting"||n==="active")){let y=t.length>0?t[0][0]:"unknown",h=await o.showAuthUpgradeUI(n,y);if(!h)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await _e(h,e,t,r,n,void 0,void 0,i)}throw m}}if(n==="posting")try{return await _e("hivesigner",e,t,r,n,void 0,void 0,i)}catch(f){if(we(f)&&o.showAuthUpgradeUI){let m=t.length>0?t[0][0]:"unknown",y=await o.showAuthUpgradeUI(n,m);if(!y)throw new Error(`No login type available for ${e}. Please log in again.`);return await _e(y,e,t,r,n,void 0,void 0,i)}throw f}else if(n==="active"&&o.showAuthUpgradeUI){let f=t.length>0?t[0][0]:"unknown",m=await o.showAuthUpgradeUI(n,f);if(!m)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await _e(m,e,t,r,n,void 0,void 0,i)}}let s=r?.fallbackChain??["key","hiveauth","hivesigner","keychain","custom"],a=new Map;for(let l of s)try{let f=!1,m="",y,h;switch(l){case "key":if(!o)f=!0,m="No adapter provided";else {let S;switch(n){case "owner":o.getOwnerKey&&(S=await o.getOwnerKey(e));break;case "active":o.getActiveKey&&(S=await o.getActiveKey(e));break;case "memo":o.getMemoKey&&(S=await o.getMemoKey(e));break;default:S=await o.getPostingKey(e);break}S?y=S:(f=!0,m=`No ${n} key available`);}break;case "hiveauth":o?.broadcastWithHiveAuth||(f=!0,m="HiveAuth not supported by adapter");break;case "hivesigner":if(!o)f=!0,m="No adapter provided";else {let S=await o.getAccessToken(e);S&&(h=S);}break;case "keychain":o?.broadcastWithKeychain||(f=!0,m="Keychain not supported by adapter");break;case "custom":r?.broadcast||(f=!0,m="No custom broadcast function provided");break}if(f){a.set(l,new Error(`Skipped: ${m}`));continue}return await _e(l,e,t,r,n,y,h,i)}catch(f){if(a.set(l,f),!we(f))throw f}if(!Array.from(a.values()).some(l=>!l.message.startsWith("Skipped:"))){let l=Array.from(a.entries()).map(([f,m])=>`${f}: ${m.message}`).join(", ");throw new Error(`[SDK][Broadcast] No auth methods attempted for ${e}. ${l}`)}let p=Array.from(a.entries()).map(([l,f])=>`${l}: ${f.message}`).join(", ");throw new Error(`[SDK][Broadcast] All auth methods failed for ${e}. Errors: ${p}`)}function v(e=[],t,r,n=()=>{},i,o="posting",s){let a=s?.broadcastMode??"async";return useMutation({onSuccess:n,onMutate:s?.onMutate,onError:s?.onError,onSettled:s?.onSettled,mutationKey:[...e,t],mutationFn:async u=>{if(!t)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let p=r(u);try{if(i?.enableFallback!==!1&&i?.adapter)return await Rs(t,p,i,o,a);if(i?.broadcast)return await i.broadcast(p,o);let l=i?.postingKey;if(l){if(o!=="posting")throw new Error(`[SDK][Broadcast] Legacy auth only supports posting authority, but '${o}' was requested. Use AuthContextV2 with an adapter for ${o} operations.`);let m=U.fromString(l);return await te(p,m)}let f=i?.accessToken;if(f)return (await new Ln.Client({accessToken:f}).broadcast(p)).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}catch(l){throw l instanceof ee?new Error(l.message):l}}})}async function $n(e,t,r,n){if(!e)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let i={id:t,required_auths:[],required_posting_auths:[e],json:JSON.stringify(r)};if(n?.broadcast)return n.broadcast([["custom_json",i]],"posting");let o=n?.postingKey;if(o){let u=U.fromString(o);return te([["custom_json",i]],u)}let s=n?.accessToken;if(s)return (await new Ln.Client({accessToken:s}).customJson([],[e],t,JSON.stringify(r))).result;let a=n?.adapter;if(a){let u=[["custom_json",i]];if(n?.loginType==="keychain"&&a.broadcastWithKeychain)return a.broadcastWithKeychain(e,u,"posting");if(n?.loginType==="hiveauth"&&a.broadcastWithHiveAuth)return a.broadcastWithHiveAuth(e,u,"posting")}throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}var km=4e3;function k(e,t,r){if(e?.invalidateQueries){if(t==="sync")return e.invalidateQueries(r);setTimeout(()=>e.invalidateQueries?.(r),4e3);}}function be(e,t){let r=AbortSignal.timeout(e);if(!t)return r;if(typeof AbortSignal.any=="function")return AbortSignal.any([t,r]);let n=new AbortController,i=()=>{let o=t.aborted?t.reason:r.reason;n.abort(o),t.removeEventListener("abort",i),r.removeEventListener("abort",i);};return t.aborted?n.abort(t.reason):r.aborted?n.abort(r.reason):(t.addEventListener("abort",i,{once:true}),r.addEventListener("abort",i,{once:true})),n.signal}var Ie=(()=>{try{return !1}catch{return false}})(),Is=()=>{try{return ""}catch{return}},ve=1e4,Wn=120*1e3,St,Ds;function Ks(){return St?St():Ds??(Ds=new QueryClient)}var d={privateApiHost:"https://ecency.com",defaultObserver:"ecency",clientId:"ecency-sdk",imageHost:"https://i.ecency.com",get hiveNodes(){return E.nodes},heliusApiKey:Is(),get queryClient(){return Ks()},set queryClient(e){St=()=>e;},pollsApiHost:"https://poll.ecency.com",plausibleHost:"https://pl.ecency.com",dmcaAccounts:[],dmcaTags:[],dmcaPatterns:[],dmcaTagRegexes:[],dmcaPatternRegexes:[],_dmcaInitialized:false},N;(P=>{function e(O){d.queryClient=O;}P.setQueryClient=e;function t(O){St=O;}P.setQueryClientResolver=t;function r(O){d.privateApiHost=O;}P.setPrivateApiHost=r;function n(O){d.clientId=O;}P.setClientId=n;function i(O){if(typeof O!="string"||O.trim()==="")throw new Error("setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; observer resolution would fall back to the post author while caching under an empty key.");d.defaultObserver=O;}P.setDefaultObserver=i;function o(){return d.privateApiHost?d.privateApiHost:typeof window<"u"&&window.location?.origin?window.location.origin:"https://ecency.com"}P.getValidatedBaseUrl=o;function s(O){d.pollsApiHost=O;}P.setPollsApiHost=s;function a(O){d.imageHost=O;}P.setImageHost=a;function u(O){Gt(O);}P.setHiveNodes=u;function p(O){zt(O);}P.setRestNodes=p;function l(O){Jt(O);}P.setRestNodesByApi=l;function f(O){Yt(O);}P.setUserAgent=f;function m(O){Xt(O);}P.setResilience=m;function y(O){if(/(\([^)]*[*+{][^)]*\))[*+{]/.test(O))return {safe:false,reason:"nested quantifiers detected"};if(/\([^|)]*\|[^)]*\)[*+{]/.test(O))return {safe:false,reason:"alternation with quantifier (potential overlap)"};if(/\([^)]*[*+][^)]*\)[*+]/.test(O))return {safe:false,reason:"repeated quantifiers (catastrophic backtracking risk)"};if(/\.\*\.\*/.test(O)||/\.\+\.\+/.test(O))return {safe:false,reason:"multiple greedy quantifiers on wildcards"};let W=/\.?\{(\d+),(\d+)\}/g,V;for(;(V=W.exec(O))!==null;){let[,M,H]=V;if(parseInt(H,10)-parseInt(M,10)>1e3)return {safe:false,reason:`excessive range: {${M},${H}}`}}return {safe:true}}function h(O){let W=["a".repeat(50)+"x","ab".repeat(50)+"x","x".repeat(100),"aaa".repeat(30)+"bbb".repeat(30)+"x"],V=5;for(let M of W){let H=Date.now();try{O.test(M);let G=Date.now()-H;if(G>V)return {safe:!1,reason:`runtime test exceeded ${V}ms (took ${G}ms on input length ${M.length})`}}catch(G){return {safe:false,reason:`runtime test threw error: ${G}`}}}return {safe:true}}function S(O,W=200){try{if(!O)return Ie&&console.warn("[SDK] DMCA pattern rejected: empty pattern"),null;if(O.length>W)return Ie&&console.warn(`[SDK] DMCA pattern rejected: length ${O.length} exceeds max ${W} - pattern: ${O.substring(0,50)}...`),null;let V=y(O);if(!V.safe)return Ie&&console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${V.reason}) - pattern: ${O.substring(0,50)}...`),null;let M;try{M=new RegExp(O);}catch(G){return Ie&&console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${O.substring(0,50)}...`,G),null}let H=h(M);return H.safe?M:(Ie&&console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${H.reason}) - pattern: ${O.substring(0,50)}...`),null)}catch(V){return Ie&&console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${O.substring(0,50)}...`,V),null}}function x(O={}){let W=G=>Array.isArray(G)?G.filter(Te=>typeof Te=="string"):[],V=O||{},M={accounts:W(V.accounts),tags:W(V.tags),patterns:W(V.posts)};d.dmcaAccounts=M.accounts,d.dmcaTags=M.tags,d.dmcaPatterns=M.patterns,d.dmcaTagRegexes=M.tags.map(G=>S(G)).filter(G=>G!==null),d.dmcaPatternRegexes=[];let H=M.tags.length-d.dmcaTagRegexes.length;!d._dmcaInitialized&&Ie&&(console.log("[SDK] DMCA configuration loaded:"),console.log(` - Accounts: ${M.accounts.length}`),console.log(` - Tag patterns: ${d.dmcaTagRegexes.length}/${M.tags.length} compiled (${H} rejected)`),console.log(` - Post patterns: ${M.patterns.length} (using exact string matching)`),H>0&&console.warn(`[SDK] ${H} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`)),d._dmcaInitialized=true;}P.setDmcaLists=x;})(N||(N={}));function Qm(){return new QueryClient({defaultOptions:{queries:{refetchOnWindowFocus:false,refetchOnMount:false}}})}var b=()=>d.queryClient,Gn;(s=>{function e(a){return b().getQueryData(a)}s.getQueryData=e;function t(a){return b().getQueryData(a)}s.getInfiniteQueryData=t;async function r(a){return await b().prefetchQuery(a),e(a.queryKey)}s.prefetchQuery=r;async function n(a){return await b().prefetchInfiniteQuery(a),t(a.queryKey)}s.prefetchInfiniteQuery=n;function i(a){return {prefetch:()=>r(a),getData:()=>e(a.queryKey),useClientQuery:()=>useQuery(a),fetchAndGet:()=>b().fetchQuery(a)}}s.generateClientServerQuery=i;function o(a){return {prefetch:()=>n(a),getData:()=>t(a.queryKey),useClientQuery:()=>useInfiniteQuery(a),fetchAndGet:()=>b().fetchInfiniteQuery(a)}}s.generateClientServerInfiniteQuery=o;})(Gn||(Gn={}));function Um(e){return btoa(JSON.stringify(e))}function Vm(e){let t=atob(e);if(t[0]==="{")return JSON.parse(t)}var zn=(n=>(n.HIVE="HIVE",n.HBD="HBD",n.VESTS="VESTS",n))(zn||{}),kt=(e=>(e["@@000000021"]="HIVE",e["@@000000013"]="HBD",e["@@000000037"]="VESTS",e))(kt||{});function T(e){if(typeof e=="string"){let t=e.split(" ");return {amount:parseFloat(t[0]),symbol:zn[t[1]]}}else return {amount:parseFloat(e.amount.toString())/Math.pow(10,e.precision),symbol:kt[e.nai]}}var pr;function w(){if(!pr){if(typeof globalThis.fetch!="function")throw new Error("[Ecency][SDK] - global fetch is not available");pr=globalThis.fetch.bind(globalThis);}return pr}function Jn(e){return typeof e=="string"?/^hive-\d+$/.test(e):false}function Qs(e){return e&&typeof e=="object"&&"data"in e&&"pagination"in e&&Array.isArray(e.data)}function ae(e,t){return Qs(e)?e:{data:Array.isArray(e)?e:[],pagination:{total:Array.isArray(e)?e.length:0,limit:t,offset:0,has_next:false}}}function je(e,t){return e/1e6*t}function Yn(e){return e===void 0?true:parseInt(e.split("-")[0],10)<1980}var Xn=60*1e3;function Ae(){return queryOptions({queryKey:c.core.dynamicProps(),refetchInterval:Xn,staleTime:Xn,queryFn:async({signal:e})=>{let[t,r,n,i,o]=await Promise.all([g("condenser_api.get_dynamic_global_properties",[],void 0,void 0,e),g("condenser_api.get_feed_history",[],void 0,void 0,e),g("condenser_api.get_chain_properties",[],void 0,void 0,e),g("condenser_api.get_reward_fund",["post"],void 0,void 0,e),g("database_api.get_hardfork_properties",{},void 0,void 0,e).catch(()=>({current_hardfork_version:"1.28.0",last_hardfork:28}))]),s=T(t.total_vesting_shares).amount,a=T(t.total_vesting_fund_hive).amount,u=0;Number.isFinite(s)&&s!==0&&Number.isFinite(a)&&(u=a/s*1e6);let p=T(r.current_median_history.base).amount,l=T(r.current_median_history.quote).amount,f=parseFloat(i.recent_claims),m=T(i.reward_balance).amount,y=Number(t.vote_power_reserve_rate??0),h=i.author_reward_curve??"linear",S=Number(i.content_constant??0),x=String(o.current_hardfork_version??"0.0.0"),P=Number(o.last_hardfork??0),O=t.hbd_print_rate,W=t.hbd_interest_rate,V=t.head_block_number,M=a,H=s,G=T(t.virtual_supply).amount,Te=t.vesting_reward_percent||0,Ye=n.account_creation_fee;return {hivePerMVests:u,base:p,quote:l,fundRecentClaims:f,fundRewardBalance:m,votePowerReserveRate:y,authorRewardCurve:h,contentConstant:S,currentHardforkVersion:x,lastHardfork:P,hbdPrintRate:O,hbdInterestRate:W,headBlock:V,totalVestingFund:M,totalVestingShares:H,virtualSupply:G,vestingRewardPercent:Te,accountCreationFee:Ye,raw:{globalDynamic:t,feedHistory:r,chainProps:n,rewardFund:i,hardforkProps:o}}}})}function og(e="post"){return queryOptions({queryKey:c.core.rewardFund(e),queryFn:()=>g("condenser_api.get_reward_fund",[e])})}function De(...e){let t=e.length;for(;t>0&&e[t-1]===void 0;)t--;return e.slice(0,t)}var c={posts:{entry:e=>["posts","entry",e],postHeader:(e,t)=>["posts","post-header",e,t],content:(e,t)=>["posts","content",e,t],contentReplies:(e,t)=>["posts","content-replies",e,t],accountPosts:(e,t,r,n)=>["posts","account-posts",e,t,r,n],accountPostsPage:(e,t,r,n,i,o)=>["posts","account-posts-page",e,t,r,n,i,o],userPostVote:(e,t,r)=>["posts","user-vote",e,t,r],reblogs:(e,t)=>["posts","reblogs",e,t],entryActiveVotes:(e,t)=>["posts","entry-active-votes",e,t],rebloggedBy:(e,t)=>["posts","reblogged-by",e,t],tips:(e,t)=>["posts","tips",e,t],normalize:(e,t)=>["posts","normalize",e,t],drafts:e=>["posts","drafts",e],draftsInfinite:(e,t)=>De("posts","drafts","infinite",e,t),schedules:e=>["posts","schedules",e],schedulesInfinite:(e,t)=>De("posts","schedules","infinite",e,t),fragments:e=>["posts","fragments",e],fragmentsInfinite:(e,t)=>De("posts","fragments","infinite",e,t),images:e=>["posts","images",e],galleryImages:e=>["posts","gallery-images",e],imagesInfinite:(e,t)=>De("posts","images","infinite",e,t),promoted:e=>["posts","promoted",e],_promotedPrefix:["posts","promoted"],accountPostsBlogPrefix:e=>["posts","account-posts",e,"blog"],postsRanked:(e,t,r,n)=>["posts","posts-ranked",e,t,r,n],postsRankedPage:(e,t,r,n,i,o)=>["posts","posts-ranked-page",e,t,r,n,i,o],discussions:(e,t,r,n)=>["posts","discussions",e,t,r,n],discussion:(e,t,r)=>["posts","discussion",e,t,r],deletedEntry:e=>["posts","deleted-entry",e],commentHistory:(e,t,r)=>["posts","comment-history",e,t,r],trendingTags:()=>["posts","trending-tags"],trendingTagsWithStats:e=>["posts","trending-tags","stats",e],wavesFeed:(e={})=>["posts","waves","feed",e.tag??"",e.following??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],shortsFeed:(e={})=>["posts","waves","shorts",e.tag??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],wavesByHost:e=>["posts","waves","by-host",e],wavesByTag:(e,t)=>["posts","waves","by-tag",e,t],wavesFollowing:(e,t)=>["posts","waves","following",e,t],wavesTrendingTags:(e,t)=>["posts","waves","trending-tags",e,t],wavesByAccount:(e,t)=>["posts","waves","by-account",e,t],wavesTrendingAuthors:e=>["posts","waves","trending-authors",e],_prefix:["posts"]},accounts:{full:e=>["get-account-full",e],list:(...e)=>["accounts","list",...e],friends:(e,t,r,n)=>["accounts","friends",e,t,r,n],searchFriends:(e,t,r)=>["accounts","friends","search",e,t,r],subscriptions:e=>["accounts","subscriptions",e],followCount:e=>["accounts","follow-count",e],recoveries:e=>["accounts","recoveries",e],pendingRecovery:e=>["accounts","recoveries",e,"pending-request"],checkWalletPending:(e,t)=>["accounts","check-wallet-pending",e,t],mutedUsers:e=>["accounts","muted-users",e],following:(e,t,r,n)=>["accounts","following",e,t,r,n],followers:(e,t,r,n)=>["accounts","followers",e,t,r,n],search:(e,t)=>["accounts","search",e,t],profiles:(e,t)=>["accounts","profiles",e,t],lookup:(e,t)=>["accounts","lookup",e,t],transactions:(e,t,r)=>["accounts","transactions",e,t,r],favorites:e=>["accounts","favorites",e],favoritesInfinite:(e,t)=>De("accounts","favorites","infinite",e,t),checkFavorite:(e,t)=>["accounts","favorites","check",e,t],relations:(e,t)=>["accounts","relations",e,t],bots:()=>["accounts","bots"],voteHistory:(e,t)=>["accounts","vote-history",e,t],reputations:(e,t)=>["accounts","reputations",e,t],bookmarks:e=>["accounts","bookmarks",e],bookmarksInfinite:(e,t)=>De("accounts","bookmarks","infinite",e,t),referrals:e=>["accounts","referrals",e],referralsStats:e=>["accounts","referrals-stats",e],proMembers:()=>["accounts","pro-members"],_prefix:["accounts"]},notifications:{announcements:()=>["notifications","announcements"],spotlights:()=>["notifications","spotlights"],list:(e,t)=>["notifications",e,t],unreadCount:e=>["notifications","unread",e],settings:e=>["notifications","settings",e],_prefix:["notifications"]},core:{rewardFund:e=>["core","reward-fund",e],dynamicProps:()=>["core","dynamic-props"],chainProperties:()=>["core","chain-properties"],_prefix:["core"]},communities:{single:(e,t)=>["community","single",e,t],singlePrefix:e=>["community","single",e],context:(e,t)=>["community","context",e,t],rewarded:()=>["communities","rewarded"],list:(e,t,r)=>["communities","list",e,t,r],subscribers:e=>["communities","subscribers",e],subscribersInfinite:e=>["communities","subscribers","infinite",e],accountNotifications:(e,t)=>["communities","account-notifications",e,t]},proposals:{list:()=>["proposals","list"],proposal:e=>["proposals","proposal",e],votes:(e,t,r)=>["proposals","votes",e,t,r],votesPrefix:e=>["proposals","votes",e],votesByUser:e=>["proposals","votes","by-user",e]},search:{topics:(e,t)=>["search","topics",e,t],path:e=>["search","path",e],account:(e,t)=>["search","account",e,t],results:(e,t,r,n,i,o)=>["search",e,t,typeof r=="string"?r==="1"||r==="true":r,n,i,o],controversialRising:(e,t)=>["search","controversial-rising",e,t],similarEntries:(e,t,r)=>r?["search","similar-entries",e,t,r]:["search","similar-entries",e,t],api:(e,t,r,n,i,o)=>De("search","api",e,t,r,n,i,o)},witnesses:{list:e=>["witnesses","list",e],votes:e=>["witnesses","votes",e],proxy:()=>["witnesses","proxy"],voters:(e,t,r,n,i)=>["witnesses","voters",e,t,r,n,i],voterCount:e=>["witnesses","voter-count",e]},wallet:{outgoingRcDelegations:(e,t)=>["wallet","outgoing-rc-delegations",e,t],vestingDelegations:(e,t)=>["wallet","vesting-delegations",e,t],withdrawRoutes:e=>["wallet","withdraw-routes",e],incomingRc:e=>["wallet","incoming-rc",e],conversionRequests:e=>["wallet","conversion-requests",e],receivedVestingShares:e=>["wallet","received-vesting-shares",e],savingsWithdraw:e=>["wallet","savings-withdraw",e],openOrders:e=>["wallet","open-orders",e],collateralizedConversionRequests:e=>["wallet","collateralized-conversion-requests",e],recurrentTransfers:e=>["wallet","recurrent-transfers",e],balanceHistory:(e,t,r)=>["wallet","balance-history",e,t,r],aggregatedHistory:(e,t,r)=>r===void 0?["wallet","aggregated-history",e,t]:["wallet","aggregated-history",e,t,r],portfolio:(e,t,r)=>["wallet","portfolio","v2",e,t,r]},assets:{hiveGeneralInfo:e=>["assets","hive","general-info",e],hiveTransactions:(e,t,r)=>["assets","hive","transactions",e,t,r],hiveWithdrawalRoutes:e=>["assets","hive","withdrawal-routes",e],hiveMetrics:e=>["assets","hive","metrics",e],hbdGeneralInfo:e=>["assets","hbd","general-info",e],hbdTransactions:(e,t,r)=>["assets","hbd","transactions",e,t,r],hivePowerGeneralInfo:e=>["assets","hive-power","general-info",e],hivePowerDelegates:e=>["assets","hive-power","delegates",e],hivePowerDelegatings:e=>["assets","hive-power","delegatings",e],hivePowerTransactions:(e,t,r)=>["assets","hive-power","transactions",e,t,r],pointsGeneralInfo:e=>["assets","points","general-info",e],pointsTransactions:(e,t)=>["assets","points","transactions",e,t],ecencyAssetInfo:(e,t,r)=>["ecency-wallets","asset-info",e,t,r]},market:{statistics:()=>["market","statistics"],orderBook:e=>["market","order-book",e],history:(e,t,r)=>["market","history",e,t,r],feedHistory:()=>["market","feed-history"],hiveHbdStats:()=>["market","hive-hbd-stats"],data:(e,t,r,n)=>["market","data",e,t,r,n],tradeHistory:(e,t,r)=>["market","trade-history",e,t,r],currentMedianHistoryPrice:()=>["market","current-median-history-price"]},analytics:{discoverCuration:e=>["analytics","discover-curation",e],pageStats:(e,t,r,n)=>["analytics","page-stats",e,t,r,n],discoverLeaderboard:e=>["analytics","discover-leaderboard",e]},promotions:{promotePrice:()=>["promotions","promote-price"],boostPlusPrices:()=>["promotions","boost-plus-prices"],boostPlusAccounts:e=>["promotions","boost-plus-accounts",e]},resourceCredits:{account:e=>["resource-credits","account",e],stats:()=>["resource-credits","stats"]},points:{points:(e,t)=>["points",e,t],_prefix:e=>["points",e]},polls:{details:(e,t)=>["polls","details",e,t],vote:(e,t)=>e&&t?["polls","vote",e,t]:["polls","vote"],_prefix:["polls"]},operations:{chainProperties:()=>["operations","chain-properties"]},games:{statusCheck:(e,t)=>["games","status-check",e,t]},quests:{status:e=>["quests","status",e]},support:{settings:e=>["support","settings",e],_prefix:["support"]},badActors:{list:()=>["bad-actors","list"],_prefix:["bad-actors"]},ai:{prices:()=>["ai","prices"],assistPrices:e=>["ai","assist-prices",e],transcribePrice:e=>["ai","transcribe-price",e],_prefix:["ai"]}};function pg(e){return queryOptions({queryKey:c.ai.prices(),queryFn:async()=>{let r=await w()(d.privateApiHost+"/private-api/ai-generate-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch AI generation prices: ${r.status}`);return await r.json()},staleTime:3e5,enabled:!!e})}function mg(e,t){return queryOptions({queryKey:c.ai.assistPrices(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-assist-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI assist prices: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function wg(e,t){return queryOptions({queryKey:c.ai.transcribePrice(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-transcribe-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI transcribe price: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function Ws(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function Ag(e,t){return useMutation({mutationKey:["ai","generate-image"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][GenerateImage] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][GenerateImage] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-generate-image",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,us:e,prompt:r.prompt,aspect_ratio:r.aspect_ratio??"1:1",power:r.power??1,idempotency_key:r.idempotency_key??Ws()})});if(!i.ok){let s=await i.text(),a={};try{a=JSON.parse(s);}catch{}let u=new Error(`[SDK][AI][GenerateImage] \u2013 failed with status ${i.status}${s?`: ${s}`:""}`);throw u.status=i.status,u.data=a,u}if(i.status===202){let s={};try{s=await i.json();}catch{}let a=new Error("[SDK][AI][GenerateImage] \u2013 delivery pending");throw a.status=202,a.data=s,a}return await i.json()},onSuccess:()=>{e&&b().invalidateQueries({queryKey:c.points._prefix(e)});}})}function zs(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function Eg(e,t){return useMutation({mutationKey:["ai","assist"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Assist] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][Assist] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-assist",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r.code??t,us:e,action:r.action,text:r.text,idempotency_key:zs()})});if(!i.ok){let o=await i.text(),s={};try{s=JSON.parse(o);}catch{}let a=new Error(`[SDK][AI][Assist] \u2013 failed with status ${i.status}${o?`: ${o}`:""}`);throw a.status=i.status,a.data=s,a}return await i.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.assistPrices(e)}));}})}function Ys(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function Tg(e,t){return useMutation({mutationKey:["ai","transcribe"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Transcribe] \u2013 username wasn't provided");let n=r.code??t;if(!n)throw new Error("[SDK][AI][Transcribe] \u2013 access token wasn't found");let i=new FormData;i.append("code",n),i.append("duration_ms",String(Math.round(r.durationMs))),i.append("idempotency_key",r.idempotency_key??Ys()),i.append("audio",r.audio,r.fileName??"clip.webm");let s=await w()(d.privateApiHost+"/private-api/ai-transcribe",{method:"POST",body:i});if(!s.ok){let a=await s.text(),u={};try{u=JSON.parse(a);}catch{}throw Object.assign(new Error(`[SDK][AI][Transcribe] \u2013 failed with status ${s.status}${a?`: ${a}`:""}`),{status:s.status,data:u})}return await s.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.transcribePrice(e)}));}})}function lr(e){return !e.posting_json_metadata&&!e.json_metadata}function Zs(e){return e?Object.values(e).some(t=>typeof t=="string"?t.length>0:t!=null):false}function Q(e){return queryOptions({queryKey:c.accounts.full(e),queryFn:async({signal:t})=>{if(!e)return null;let[r,n]=await Promise.all([g("condenser_api.get_accounts",[[e]],void 0,void 0,t,p=>Array.isArray(p)),g("bridge.get_profile",{account:e},void 0,void 0,t).catch(p=>{if(t?.aborted)throw p;return null})]);if(!r?.[0])return null;let i=r[0];if(lr(i)&&Zs(n?.metadata?.profile)){let p=await g("condenser_api.get_accounts",[[e]],void 0,void 0,t,l=>Array.isArray(l)&&(!l[0]||!lr(l[0])));if(p[0]&&!lr(p[0]))i=p[0];else throw new Error(`[SDK][Accounts] \u2013 inconsistent account row for ${e}: empty json metadata while hivemind profile is populated`)}let o=Ke(i.posting_json_metadata),s=n?.stats,a=s?{account:i.name,follower_count:s.followers??0,following_count:s.following??0}:void 0,u=n?.reputation??0;return {name:i.name,owner:i.owner,active:i.active,posting:i.posting,memo_key:i.memo_key,post_count:i.post_count,created:i.created,posting_json_metadata:i.posting_json_metadata,last_vote_time:i.last_vote_time,last_post:i.last_post,json_metadata:i.json_metadata,reward_hive_balance:i.reward_hive_balance,reward_hbd_balance:i.reward_hbd_balance,reward_vesting_hive:i.reward_vesting_hive,reward_vesting_balance:i.reward_vesting_balance,balance:i.balance,hbd_balance:i.hbd_balance,savings_balance:i.savings_balance,savings_hbd_balance:i.savings_hbd_balance,savings_hbd_last_interest_payment:i.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:i.savings_hbd_seconds_last_update,savings_hbd_seconds:i.savings_hbd_seconds,next_vesting_withdrawal:i.next_vesting_withdrawal,pending_claimed_accounts:i.pending_claimed_accounts,vesting_shares:i.vesting_shares,delegated_vesting_shares:i.delegated_vesting_shares,received_vesting_shares:i.received_vesting_shares,vesting_withdraw_rate:i.vesting_withdraw_rate,to_withdraw:i.to_withdraw,withdrawn:i.withdrawn,witness_votes:i.witness_votes,proxy:i.proxy,recovery_account:i.recovery_account,proxied_vsf_votes:i.proxied_vsf_votes,voting_manabar:i.voting_manabar,voting_power:i.voting_power,downvote_manabar:i.downvote_manabar,follow_stats:a,reputation:u,profile:o}},enabled:!!e,staleTime:6e4})}var ea=new Set(["__proto__","constructor","prototype"]);function Ct(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function Zn(e,t){let r={...e};for(let n of Object.keys(t)){if(ea.has(n))continue;let i=t[n],o=r[n];Ct(i)&&Ct(o)?r[n]=Zn(o,i):r[n]=i;}return r}function ta(e){if(!(!e||!Array.isArray(e)))return e.map(({meta:t,...r})=>{if(!t||typeof t!="object")return {...r,meta:t};let{privateKey:n,username:i,...o}=t;return {...r,meta:o}})}function Ke(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.profile&&typeof t.profile=="object")return t.profile}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata:",t,{length:e?.length??0});}return {}}function ei(e){return Ke(e?.posting_json_metadata)}function ti(e,t){if(!e)return t;if(!t)return e;let r=Object.keys(Ke(e.posting_json_metadata)).length;return Object.keys(Ke(t.posting_json_metadata)).length>r?t:e}function ra(e){if(!e)return {};try{let t=JSON.parse(e);if(Ct(t))return t}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata root:",t,{length:e?.length??0});}return {}}function ri({existingPostingJsonMetadata:e,profile:t,tokens:r}){let n=ra(e),i=Ct(n.profile)?n.profile:{},o=dr({existingProfile:i,profile:t,tokens:r});return JSON.stringify({...n,profile:o})}function dr({existingProfile:e,profile:t,tokens:r}){let{tokens:n,version:i,...o}=t??{},s=Zn(e??{},o);return s.tokens&&!Array.isArray(s.tokens)&&(s.tokens=void 0),r!==void 0?s.tokens=r&&r.length>0?r:[]:n!==void 0&&(s.tokens=n),s.tokens=ta(s.tokens),s.version=2,s}function Tt(e){return e.map(t=>{let r={name:t.name,owner:t.owner,active:t.active,posting:t.posting,memo_key:t.memo_key,post_count:t.post_count,created:t.created,reputation:t.reputation,posting_json_metadata:t.posting_json_metadata,last_vote_time:t.last_vote_time,last_post:t.last_post,json_metadata:t.json_metadata,reward_hive_balance:t.reward_hive_balance,reward_hbd_balance:t.reward_hbd_balance,reward_vesting_hive:t.reward_vesting_hive,reward_vesting_balance:t.reward_vesting_balance,balance:t.balance,hbd_balance:t.hbd_balance,savings_balance:t.savings_balance,savings_hbd_balance:t.savings_hbd_balance,savings_hbd_last_interest_payment:t.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:t.savings_hbd_seconds_last_update,savings_hbd_seconds:t.savings_hbd_seconds,next_vesting_withdrawal:t.next_vesting_withdrawal,pending_claimed_accounts:t.pending_claimed_accounts,vesting_shares:t.vesting_shares,delegated_vesting_shares:t.delegated_vesting_shares,received_vesting_shares:t.received_vesting_shares,vesting_withdraw_rate:t.vesting_withdraw_rate,to_withdraw:t.to_withdraw,withdrawn:t.withdrawn,witness_votes:t.witness_votes,proxy:t.proxy,recovery_account:t.recovery_account,proxied_vsf_votes:t.proxied_vsf_votes,voting_manabar:t.voting_manabar,voting_power:t.voting_power,downvote_manabar:t.downvote_manabar},n=Ke(t.posting_json_metadata);if(!n||Object.keys(n).length===0)try{let i=JSON.parse(t.json_metadata||"{}");i.profile&&(n=i.profile);}catch{}return (!n||Object.keys(n).length===0)&&(n={about:"",cover_image:"",location:"",name:"",profile_image:"",website:""}),{...r,profile:n}})}function jg(e){return queryOptions({queryKey:c.accounts.list(...e),enabled:e.length>0,queryFn:async()=>{let t=await g("condenser_api.get_accounts",[e],void 0,void 0,void 0,r=>Array.isArray(r));return Tt(t??[])}})}function zg(e){return queryOptions({queryKey:c.accounts.followCount(e),queryFn:()=>g("condenser_api.get_follow_count",[e])})}function ey(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.followers(e,t,r,n),queryFn:()=>g("condenser_api.get_followers",[e,t,r,n]),enabled:!!e})}function oy(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.following(e,t,r,n),queryFn:()=>g("condenser_api.get_following",[e,t,r,n]),enabled:!!e})}var ni=1e3,ca=20;function py(e){return queryOptions({queryKey:c.accounts.mutedUsers(e),queryFn:async()=>{let t=[],r="";for(let n=0;ns.following);if(o[0]===r&&(o=o.slice(1)),!o.length||(t.push(...o),i.lengthg("condenser_api.lookup_accounts",[e,t]),enabled:!!e,staleTime:1/0})}function by(e,t=5,r=[]){return queryOptions({queryKey:c.accounts.search(e,r),enabled:!!e,queryFn:async()=>(await g("condenser_api.lookup_accounts",[e,t])).filter(i=>r.length>0?!r.includes(i):true)})}var da=new Set(["ownerPublicKey","activePublicKey","postingPublicKey","memoPublicKey"]);function Oy(e,t){return queryOptions({queryKey:c.accounts.checkWalletPending(e,t??null),queryFn:async()=>{if(!e||!t)return {exist:false};let n=await w()(d.privateApiHost+"/private-api/wallets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,code:t})});if(!n.ok)return {exist:false};let i=await n.json(),o=Array.isArray(i)?i.flatMap(s=>{if(!s||typeof s!="object")return [];let a=s,u=typeof a.token=="string"?a.token:void 0;if(!u)return [];let p=a.meta&&typeof a.meta=="object"?{...a.meta}:{},l={},f=typeof a.address=="string"&&a.address?a.address:void 0,y=(typeof a.status=="number"?a.status===3:void 0)??false;f&&(l.address=f),l.show=y;let h={symbol:u,currency:u,address:f,show:y,type:"CHAIN",meta:l},S=[];for(let[x,P]of Object.entries(p))typeof x=="string"&&(da.has(x)||typeof P!="string"||!P||/^[A-Z0-9]{2,10}$/.test(x)&&S.push({symbol:x,currency:x,address:P,show:y,type:"CHAIN",meta:{address:P,show:y}}));return [h,...S]}):[];return {exist:o.length>0,tokens:o.length?o:void 0,wallets:o.length?o:void 0}},refetchOnMount:true})}function ii(e,t){return queryOptions({queryKey:c.accounts.relations(e,t),enabled:!!e&&!!t,refetchOnMount:false,refetchInterval:36e5,queryFn:async()=>{let r={follows:false,ignores:false,blacklists:false,follows_muted:false,follows_blacklists:false};return !e||!t?r:await g("bridge.get_relationship_between_accounts",[e,t])??r}})}function qy(e){return queryOptions({queryKey:c.accounts.subscriptions(e),enabled:!!e,queryFn:async({signal:t})=>await g("bridge.list_all_subscriptions",{account:e},void 0,void 0,t)??[]})}function By(e,t){return queryOptions({queryKey:c.accounts.bookmarks(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Bookmarks] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/bookmarks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function My(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.bookmarksInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch bookmarks: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Uy(e,t){return queryOptions({queryKey:c.accounts.favorites(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Vy(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.favoritesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/favorites?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch favorites: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Wy(e,t,r){return queryOptions({queryKey:c.accounts.checkFavorite(e,r),enabled:!!e&&!!t&&!!r,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");if(!r)throw new Error("[SDK][Accounts][Favorites] \u2013 no target username");let i=await w()(d.privateApiHost+"/private-api/favorites-check",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:r})});if(!i.ok)throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check failed with status ${i.status}: ${i.statusText}`);let o=await i.json();if(typeof o!="boolean")throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check returned invalid type: expected boolean, got ${typeof o}`);return o}})}function Yy(e,t){return queryOptions({enabled:!!e&&!!t,queryKey:c.accounts.recoveries(e),queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts] Missing username or access token");return (await w()(d.privateApiHost+"/private-api/recoveries",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function rh(e){return queryOptions({enabled:!!e,queryKey:c.accounts.pendingRecovery(e),queryFn:()=>g("database_api.find_change_recovery_account_requests",{accounts:[e]})})}function ah(e,t=50){return queryOptions({queryKey:c.accounts.reputations(e,t),enabled:!!e,queryFn:async()=>e?g("condenser_api.get_account_reputations",[e,t]):[]})}var K=ie.operations,oi={transfers:[K.transfer,K.transfer_to_savings,K.transfer_from_savings,K.cancel_transfer_from_savings,K.recurrent_transfer,K.fill_recurrent_transfer,K.escrow_transfer,K.fill_recurrent_transfer],"market-orders":[K.fill_convert_request,K.fill_order,K.fill_collateralized_convert_request,K.limit_order_create2,K.limit_order_create,K.limit_order_cancel],interests:[K.interest],"stake-operations":[K.return_vesting_delegation,K.withdraw_vesting,K.transfer_to_vesting,K.set_withdraw_vesting_route,K.update_proposal_votes,K.fill_vesting_withdraw,K.account_witness_proxy,K.delegate_vesting_shares],rewards:[K.author_reward,K.curation_reward,K.producer_reward,K.claim_reward_balance,K.comment_benefactor_reward,K.liquidity_reward,K.proposal_pay]},Oa=[...Object.values(oi)].reduce((e,t)=>e.concat(t),[]);function xa(e){return e.block*1e7+e.trx_in_block*100+e.op_pos}function Ea(e){return e.replace(/_operation$/,"")}function Sa(e){return typeof e=="object"&&e!==null&&"nai"in e&&"amount"in e&&"precision"in e}function ka(e){if(!Sa(e))return e;let t=T(e),r=kt[e.nai]??"UNKNOWN";return `${t.amount.toFixed(e.precision)} ${r}`}function Ca(e){let t={};for(let[r,n]of Object.entries(e))t[r]=ka(n);return t}function gh(e,t=20,r=""){let n=r?oi[r]:Oa;return infiniteQueryOptions({queryKey:c.accounts.transactions(e??"",r,t),initialPageParam:null,queryFn:async({pageParam:i,signal:o})=>{if(!e)return {entries:[],currentPage:0};let s={"account-name":e,"operation-types":n.join(","),"page-size":t};i!==null&&(s.page=i);let a=await re("hafah","/accounts/{account-name}/operations",s,void 0,void 0,o);return {entries:a.operations_result.map(p=>{let l=Ea(p.op.type);return {...Ca(p.op.value),num:xa(p),type:l,timestamp:p.timestamp,trx_id:p.trx_id}}),currentPage:i??a.total_pages}},getNextPageParam:i=>{let o=i.currentPage-1;return o>=1?o:void 0}})}function _h(){return queryOptions({queryKey:c.accounts.bots(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/public/bots",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch bots: ${e.status}`);return e.json()},refetchOnMount:true,staleTime:1/0})}function Ph(e){return infiniteQueryOptions({queryKey:c.accounts.referrals(e),initialPageParam:{maxId:void 0},queryFn:async({pageParam:t})=>{let{maxId:r}=t??{},n=N.getValidatedBaseUrl(),i=new URL(`/private-api/referrals/${e}`,n);r!==void 0&&i.searchParams.set("max_id",r.toString());let o=await fetch(i.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`Failed to fetch referrals: ${o.status}`);return o.json()},getNextPageParam:t=>{let r=t?.[t.length-1]?.id;return typeof r=="number"?{maxId:r}:void 0}})}function Sh(e){return queryOptions({queryKey:c.accounts.referralsStats(e),queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/referrals/${e}/stats`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch referral stats: ${t.status}`);let r=await t.json();if(!r)throw new Error("No Referrals for this user!");return {total:r.total??0,rewarded:r.rewarded??0}}})}function qh(e,t,r){let{followType:n="blog",limit:i=100,enabled:o=true}=r??{};return infiniteQueryOptions({queryKey:c.accounts.friends(e,t,n,i),initialPageParam:{startFollowing:""},enabled:o,refetchOnMount:true,queryFn:async({pageParam:s})=>{let{startFollowing:a}=s,l=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,a===""?null:a,n,i])).map(y=>t==="following"?y.following:y.follower);return (await g("bridge.get_profiles",{accounts:l,observer:void 0})??[]).map(y=>({name:y.name,reputation:y.reputation,active:y.active}))},getNextPageParam:s=>s&&s.length===i?{startFollowing:s[s.length-1].name}:void 0})}var Da=30;function Mh(e,t,r){return queryOptions({queryKey:c.accounts.searchFriends(e,t,r),refetchOnMount:false,enabled:false,queryFn:async()=>{if(!r)return [];let n=r.slice(0,-1),s=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,n,"blog",1e3])).map(u=>t==="following"?u.following:u.follower).filter(u=>u.toLowerCase().includes(r.toLowerCase())).slice(0,Da);return (await g("bridge.get_profiles",{accounts:s,observer:void 0}))?.map(u=>({name:u.name,full_name:u.metadata.profile?.name||"",reputation:u.reputation,active:u.active}))??[]}})}function Vh(e=20){return infiniteQueryOptions({queryKey:c.posts.trendingTags(),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!n.name.startsWith("hive-")).map(n=>n.name)),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length>0?{afterTag:t[t.length-1]}:void 0,staleTime:3600*1e3})}function zh(e=250){return infiniteQueryOptions({queryKey:c.posts.trendingTagsWithStats(e),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!Jn(n.name))),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length?{afterTag:t[t.length-1].name}:void 0,staleTime:1/0})}function Le(e,t){return queryOptions({queryKey:c.posts.fragments(e),queryFn:async()=>t?(await w()(d.privateApiHost+"/private-api/fragments",{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json():[],enabled:!!e&&!!t})}function Zh(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.fragmentsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/fragments?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch fragments: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function nw(e="feed"){return queryOptions({queryKey:c.posts.promoted(e),queryFn:async()=>{let t=N.getValidatedBaseUrl(),r=new URL("/private-api/promoted-entries",t);return e==="waves"&&r.searchParams.append("short_content","1"),await(await w()(r.toString(),{method:"GET",headers:{"Content-Type":"application/json"}})).json()}})}function cw(e){return queryOptions({queryKey:c.posts.entryActiveVotes(e?.author,e?.permlink),queryFn:async()=>g("condenser_api.get_active_votes",[e?.author,e?.permlink]),enabled:!!e})}function fw(e,t,r){return queryOptions({queryKey:c.posts.userPostVote(e,t,r),queryFn:async()=>(await g("database_api.list_votes",{start:[e,t,r],limit:1,order:"by_voter_comment"}))?.votes?.[0]||null,enabled:!!e&&!!t&&!!r})}function ww(e,t){return queryOptions({queryKey:c.posts.content(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content",[e,t])})}function Pw(e,t){return queryOptions({queryKey:c.posts.contentReplies(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content_replies",{author:e,permlink:t})})}function kw(e,t){return queryOptions({queryKey:c.posts.postHeader(e,t),queryFn:async()=>g("bridge.get_post_header",{author:e,permlink:t}),initialData:null})}function ne(e){return Array.isArray(e)?e.map(t=>si(t)):si(e)}function si(e){if(!e)return e;let t=`@${e.author}/${e.permlink}`;return d.dmcaPatterns.includes(t)||d.dmcaPatternRegexes.some(n=>n.test(t))?{...e,body:"This post is not available due to a copyright/fraudulent claim.",title:""}:e}async function ai(e,t,r){try{let n=await Ot("bridge.get_post",{author:e,permlink:t,observer:r},1);if(n&&typeof n=="object"&&n.author===e&&n.permlink===t)return n}catch{}return null}function ci(e,t,r="",n){let i=t?.trim(),o=`/@${e}/${i??""}`;return queryOptions({queryKey:c.posts.entry(o),queryFn:async()=>{if(!i||i==="undefined")return null;let s=await g("bridge.get_post",{author:e,permlink:i,observer:r});if(!s){let u=await ai(e,i,r);if(!u)return null;let p=n!==void 0?{...u,num:n}:u;return ne(p)}let a=n!==void 0?{...s,num:n}:s;return ne(a)},enabled:!!e&&!!t&&t.trim()!==""&&t.trim()!=="undefined"})}function ce(e,t,r){return g(`bridge.${e}`,t,void 0,void 0,r)}async function ui(e,t,r,n){let{json_metadata:i}=e;if(i?.original_author&&i?.original_permlink&&i.tags?.[0]==="cross-post")try{let o=await Wa(i.original_author,i.original_permlink,t,r,n);return o?{...e,original_entry:o,num:r}:e}catch{return e}return {...e,num:r}}async function pi(e,t,r){let n=e.map(it),i=await Promise.all(n.map(o=>ui(o,t,void 0,r)));return ne(i)}async function li(e,t="",r="",n=20,i="",o="",s){let a=await ce("get_ranked_posts",{sort:e,start_author:t,start_permlink:r,limit:n,tag:i,observer:o},s);return Array.isArray(a)?pi(a,o,s):(a!=null&&console.warn(`[SDK] get_ranked_posts returned ${typeof a} instead of an array for sort=${e}; treating as no results.`),null)}async function fr(e,t,r="",n="",i=20,o="",s){if(d.dmcaAccounts.includes(t))return [];let a=await ce("get_account_posts",{sort:e,account:t,start_author:r,start_permlink:n,limit:i,observer:o},s);return Array.isArray(a)?pi(a,o,s):(a!=null&&console.warn(`[SDK] get_account_posts returned ${typeof a} instead of an array for account=${t}, sort=${e}; treating as no results.`),null)}function it(e){let t={...e,active_votes:Array.isArray(e.active_votes)?[...e.active_votes]:[],beneficiaries:Array.isArray(e.beneficiaries)?[...e.beneficiaries]:[],blacklists:Array.isArray(e.blacklists)?[...e.blacklists]:[],replies:Array.isArray(e.replies)?[...e.replies]:[],stats:e.stats?{...e.stats}:null},r=["author","title","body","created","category","permlink","url","updated"];for(let n of r)t[n]==null&&(t[n]="");return t.author_reputation==null&&(t.author_reputation=0),t.children==null&&(t.children=0),t.depth==null&&(t.depth=0),t.net_rshares==null&&(t.net_rshares=0),t.payout==null&&(t.payout=0),t.percent_hbd==null&&(t.percent_hbd=0),t.stats||(t.stats={flag_weight:0,gray:false,hide:false,total_votes:0}),t.author_payout_value==null&&(t.author_payout_value="0.000 HBD"),t.curator_payout_value==null&&(t.curator_payout_value="0.000 HBD"),t.max_accepted_payout==null&&(t.max_accepted_payout="1000000.000 HBD"),t.payout_at==null&&(t.payout_at=""),t.pending_payout_value==null&&(t.pending_payout_value="0.000 HBD"),t.promoted==null&&(t.promoted="0.000 HBD"),t.is_paidout==null&&(t.is_paidout=false),t}async function Wa(e="",t="",r="",n,i){let o=await ce("get_post",{author:e,permlink:t,observer:r},i);if(o){let s=it(o),a=await ui(s,r,n,i);return ne(a)}}async function Vw(e="",t=""){let r=await ce("get_post_header",{author:e,permlink:t});return r&&it(r)}async function di(e,t,r){let n=await ce("get_discussion",{author:e,permlink:t,observer:r||e});if(n){let i={};for(let[o,s]of Object.entries(n))i[o]=it(s);return i}return n}async function fi(e,t=""){return ce("get_community",{name:e,observer:t})}async function jw(e="",t=100,r,n="rank",i=""){return ce("list_communities",{last:e,limit:t,query:r,sort:n,observer:i})}async function mi(e){let t=await ce("normalize_post",{post:e});return t&&it(t)}async function Lw(e){return ce("list_all_subscriptions",{account:e})}async function $w(e){return ce("list_subscribers",{community:e})}async function Ww(e,t){return ce("get_relationship_between_accounts",[e,t])}async function Rt(e,t){return ce("get_profiles",{accounts:e,observer:t})}var yi=(i=>(i.trending="trending",i.author_reputation="author_reputation",i.votes="votes",i.created="created",i))(yi||{});function mr(e){let t=e.match(/^(\d+\.?\d*)\s*([A-Z]+)$/);return t?{amount:parseFloat(t[1]),symbol:t[2]}:{amount:0,symbol:""}}function Ga(e,t,r){let n=l=>mr(l.pending_payout_value).amount+mr(l.author_payout_value).amount+mr(l.curator_payout_value).amount,i=l=>l.net_rshares<0,o=l=>e.json_metadata?.pinned_reply===`${l.author}/${l.permlink}`,s={trending:(l,f)=>{if(i(l))return 1;if(i(f))return -1;let m=n(l),y=n(f);return m!==y?y-m:0},author_reputation:(l,f)=>{let m=l.author_reputation,y=f.author_reputation;return m>y?-1:m{let m=l.children,y=f.children;return m>y?-1:m{if(i(l))return 1;if(i(f))return -1;let m=Date.parse(l.created),y=Date.parse(f.created);return m>y?-1:mo(l)),p=a[u];return u>=0&&(a.splice(u,1),a.unshift(p)),a}function hi(e,t="created",r=true,n){let i=n||d.defaultObserver;return queryOptions({queryKey:c.posts.discussions(e?.author,e?.permlink,t,i),queryFn:async()=>{if(!e)return [];let o=await g("bridge.get_discussion",{author:e.author,permlink:e.permlink,observer:i}),s=o?Array.from(Object.values(o)):[];return ne(s)},enabled:r&&!!e,select:o=>Ga(e,o,t),structuralSharing:(o,s)=>{if(!o||!s)return s;let a=o.filter(l=>l.is_optimistic===true),u=new Set(s.map(l=>`${l.author}/${l.permlink}`)),p=a.filter(l=>!u.has(`${l.author}/${l.permlink}`));return p.length>0?[...s,...p]:s}})}function e_(e,t,r,n=true){let i=r||d.defaultObserver;return queryOptions({queryKey:c.posts.discussion(e,t,i),enabled:n&&!!e&&!!t,queryFn:async()=>di(e,t,i)})}function a_(e,t="posts",r=20,n="",i=true){return infiniteQueryOptions({queryKey:c.posts.accountPosts(e??"",t,r,n),enabled:!!e&&i,initialPageParam:{author:void 0,permlink:void 0,hasNextPage:true},queryFn:async({pageParam:o,signal:s})=>{if(!o?.hasNextPage||!e)return [];let a=await fr(t,e,o.author??"",o.permlink??"",r,n,s);return ne(a??[])},getNextPageParam:o=>{let s=o?.[o.length-1],a=(o?.length??0)===r;if(a)return {author:s?.author,permlink:s?.permlink,hasNextPage:a}}})}function c_(e,t="posts",r="",n="",i=20,o="",s=true){return queryOptions({queryKey:c.posts.accountPostsPage(e??"",t,r,n,i,o),enabled:!!e&&s,queryFn:async({signal:a}={})=>{if(!e)return [];let u=await fr(t,e,r,n,i,o,a);return ne(u??[])}})}var wi=new Map;function Za(e){let t=wi.get(e);return t||(t=r=>({...r,pages:r.pages.map(n=>ec(n,e))}),wi.set(e,t)),t}function ec(e,t){let r=e.filter(o=>o.stats?.is_pinned),n=e.filter(o=>!o.stats?.is_pinned);if(t==="hot")return [...r,...n];let i=[...n].sort((o,s)=>new Date(s.created).getTime()-new Date(o.created).getTime());return [...r,...i]}function y_(e,t,r=20,n="",i=true,o={}){return infiniteQueryOptions({queryKey:c.posts.postsRanked(e,t,r,n),queryFn:async({pageParam:s,signal:a})=>{let u=t;d.dmcaTagRegexes.some(l=>l.test(t))&&(u="");let p=await g("bridge.get_ranked_posts",{sort:e,start_author:s.author,start_permlink:s.permlink,limit:r,tag:u,observer:n},void 0,void 0,a);if(p==null)return [];if(!Array.isArray(p))throw new Error(`[SDK] get_ranked_posts returned ${typeof p} for sort=${e}`);return ne(p)},select:Za(e),enabled:i,initialPageParam:{author:void 0,permlink:void 0},getNextPageParam:s=>{let a=s?.[s.length-1];if(a)return {author:a.author,permlink:a.permlink}}})}function h_(e,t="",r="",n=20,i="",o="",s=true){return queryOptions({queryKey:c.posts.postsRankedPage(e,t,r,n,i,o),enabled:s,queryFn:async({signal:a}={})=>{let u=i;d.dmcaTagRegexes.some(l=>l.test(i))&&(u="");let p=await li(e,t,r,n,u,o,a);return ne(p??[])}})}function A_(e,t,r=200){return queryOptions({queryKey:c.posts.reblogs(e??"",r),queryFn:async()=>(await g("condenser_api.get_blog_entries",[e??t,0,r])).filter(i=>i.author!==t&&!i.reblogged_on.startsWith("1970-")).map(i=>({author:i.author,permlink:i.permlink})),enabled:!!e})}function S_(e,t){return queryOptions({queryKey:c.posts.rebloggedBy(e??"",t??""),queryFn:async()=>{if(!e||!t)return [];let r=await g("condenser_api.get_reblogged_by",[e,t]);return Array.isArray(r)?r:[]},enabled:!!e&&!!t})}function R_(e,t){return queryOptions({queryKey:c.posts.schedules(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/schedules",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch schedules: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function F_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.schedulesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/schedules?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch schedules: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function K_(e,t){return queryOptions({queryKey:c.posts.drafts(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch drafts: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function B_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.draftsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/drafts?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch drafts: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}async function bi(e){let r=await w()(d.privateApiHost+"/private-api/images",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch images: ${r.status}`);return r.json()}function H_(e,t){return queryOptions({queryKey:c.posts.images(e),queryFn:async()=>!e||!t?[]:bi(t),enabled:!!e&&!!t})}function U_(e,t){return queryOptions({queryKey:c.posts.galleryImages(e),queryFn:async()=>!e||!t?[]:bi(t),enabled:!!e&&!!t})}function V_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.imagesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/images?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch images: ${o.status}`);let s=await o.json();return ae(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function W_(e,t,r=false){return queryOptions({queryKey:c.posts.commentHistory(e,t,r),queryFn:async({signal:n})=>{let i=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:t,onlyMeta:r?"1":""}),signal:n});if(!i.ok)throw new Error(`Failed to fetch comment history: ${i.status}`);return i.json()},enabled:!!e&&!!t})}function pc(e,t){let r=e?.trim(),n=t?.trim();if(!r||!n)throw new Error("Invalid entry path: author and permlink are required");let i=r.replace(/^@+/,""),o=n.replace(/^\/+/,"");if(!i||!o)throw new Error("Invalid entry path: author and permlink cannot be empty after normalization");return `@${i}/${o}`}function Y_(e,t){let r=t?.trim(),n=e?.trim(),i=!!n&&!!r&&r!=="undefined",o=i?pc(n,r):"";return queryOptions({queryKey:c.posts.deletedEntry(o),queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:r||""}),signal:s});if(!a.ok)throw new Error(`Failed to fetch comment history: ${a.status}`);return a.json()},select:s=>{if(!s?.list?.[0])return null;let{body:a,title:u,tags:p}=s.list[0];return {body:a,title:u,tags:p}},enabled:i})}function tb(e,t,r=true){return queryOptions({queryKey:c.posts.tips(e,t),queryFn:async()=>{let n=`/private-api/post-tips/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,i=await fetch(d.privateApiHost+n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch post tips: ${i.status}`);return i.json()},enabled:!!e&&!!t&&r,staleTime:60*1e3})}function dc(e,t){return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,host:t}}function fc(e){return {...e,id:e.id??e.post_id}}function ye(e,t){if(!e)return null;let r=e.container??e,n=dc(r,t),i=e.parent?fc(e.parent):void 0;return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,max_accepted_payout:e.max_accepted_payout||"1000000.000 HBD",pending_payout_value:e.pending_payout_value||"0.000 HBD",author_payout_value:e.author_payout_value||"0.000 HBD",curator_payout_value:e.curator_payout_value||"0.000 HBD",host:t,container:n,parent:i}}function mc(e){return Array.isArray(e)?e:[]}async function vi(e){let t=hi(e,"created",true),r=await d.queryClient.fetchQuery(t),n=mc(r);if(n.length<=1)return [];let i=n.filter(({parent_author:s,parent_permlink:a})=>s===e.author&&a===e.permlink);return i.length===0?[]:i.filter(s=>!s.stats?.gray)}function Ai(e,t,r){return e.length===0?[]:e.map(n=>{let i=e.find(o=>o.author===n.parent_author&&o.permlink===n.parent_permlink&&o.author!==r);return {...n,id:n.post_id,host:r,container:t,parent:i}}).filter(n=>n.container.post_id!==n.post_id).sort((n,i)=>new Date(i.created).getTime()-new Date(n.created).getTime())}var hc=20;function Pi(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,following:e.following?.trim().toLowerCase()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??hc}}async function Oi({containers:e,tag:t,following:r,author:n,observer:i,limit:o},s,a){let u=N.getValidatedBaseUrl(),p=new URL("/private-api/waves/feed",u);p.searchParams.set("limit",String(o)),s&&p.searchParams.set("cursor",s),e.forEach(m=>p.searchParams.append("container",m)),t&&p.searchParams.set("tag",t),r&&p.searchParams.set("following",r),n&&p.searchParams.set("author",n),i&&p.searchParams.set("observer",i);let l=await fetch(p.toString(),{method:"GET",signal:a});if(!l.ok)throw new Error(`Failed to fetch waves feed: ${l.status}`);let f=await l.json();return !Array.isArray(f)||f.length===0?[]:f.map(m=>{let y=ye(m,m.host??"");return y?{...y,_cursor:m._cursor}:null}).filter(m=>!!m)}function ub(e={}){let t=Pi(e),{containers:r,tag:n,following:i,author:o,observer:s,limit:a}=t;return infiniteQueryOptions({queryKey:c.posts.wavesFeed({containers:r,tag:n,following:i,author:o,observer:s,limit:a}),initialPageParam:void 0,queryFn:({pageParam:u,signal:p})=>Oi(t,u,p),getNextPageParam:u=>{if(!(u.lengthOi(t,void 0,u)})}var _c=20;function bc(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??_c}}async function vc({containers:e,tag:t,author:r,observer:n,limit:i},o,s){let a=N.getValidatedBaseUrl(),u=new URL("/private-api/waves/shorts",a);u.searchParams.set("limit",String(i)),o&&u.searchParams.set("cursor",o),e.forEach(f=>u.searchParams.append("container",f)),t&&u.searchParams.set("tag",t),r&&u.searchParams.set("author",r),n&&u.searchParams.set("observer",n);let p=await fetch(u.toString(),{method:"GET",signal:s});if(!p.ok)throw new Error(`Failed to fetch shorts feed: ${p.status}`);let l=await p.json();return !Array.isArray(l)||l.length===0?[]:l.map(f=>{let m=ye(f,f.host??"");return m?{...m,active_votes:m.active_votes??[],video:f.video,_cursor:f._cursor}:null}).filter(f=>!!f)}function gb(e={}){let t=bc(e),{containers:r,tag:n,author:i,observer:o,limit:s}=t;return infiniteQueryOptions({queryKey:c.posts.shortsFeed({containers:r,tag:n,author:i,observer:o,limit:s}),initialPageParam:void 0,queryFn:({pageParam:a,signal:u})=>vc(t,a,u),getNextPageParam:a=>{if(!(a.length(l.id=l.post_id,l.host=e,l));for(let l of u){if(o&&l.post_id===o){o=void 0;continue}if(i+=1,l.stats?.gray){r=l.author,n=l.permlink;continue}let f;try{f=await vi(l);}catch(m){console.error("[SDK] getThreads get_discussion error:",m),r=l.author,n=l.permlink;continue}if(f.length===0){r=l.author,n=l.permlink;continue}return {entries:Ai(f,l,e)}}let p=u[u.length-1];if(!p)return null;r=p.author,n=p.permlink;}return null}function Ab(e){return infiniteQueryOptions({queryKey:c.posts.wavesByHost(e),initialPageParam:void 0,queryFn:async({pageParam:t})=>{let r=await xc(e,t);return r?r.entries:[]},getNextPageParam:t=>t?.[0]?.container})}var Sc=40;function Sb(e,t,r=Sc){return infiniteQueryOptions({queryKey:c.posts.wavesByTag(e,t),initialPageParam:void 0,queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/tags",i);o.searchParams.set("container",e),o.searchParams.set("tag",t);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves by tag: ${s.status}`);return (await s.json()).slice(0,r).map(p=>ye(p,e)).filter(p=>!!p).sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves by tag",i),[]}},getNextPageParam:()=>{}})}function Fb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesFollowing(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/following",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves following feed: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>ye(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves following feed",i),[]}},getNextPageParam:()=>{}})}function Kb(e,t=24){let r=e?.trim()||void 0;return queryOptions({queryKey:c.posts.wavesTrendingTags(r??"",t),queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/trending/tags",i);r&&o.searchParams.set("container",r),o.searchParams.set("hours",t.toString());let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves trending tags: ${s.status}`);return (await s.json()).map(({tag:u,posts:p})=>({tag:u,posts:p}))}catch(i){return console.error("[SDK] Failed to fetch waves trending tags",i),[]}}})}function Hb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesByAccount(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/account",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves for account: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>ye(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){throw console.error("[SDK] Failed to fetch waves for account",i),i}},getNextPageParam:()=>{}})}function Lb(e){return queryOptions({queryKey:c.posts.wavesTrendingAuthors(e),queryFn:async({signal:t})=>{try{let r=N.getValidatedBaseUrl(),n=new URL("/private-api/waves/trending/authors",r);n.searchParams.set("container",e);let i=await fetch(n.toString(),{method:"GET",signal:t});if(!i.ok)throw new Error(`Failed to fetch waves trending authors: ${i.status}`);return (await i.json()).map(({author:s,posts:a})=>({author:s,posts:a}))}catch(r){throw console.error("[SDK] Failed to fetch waves trending authors",r),r}}})}function Jb(e,t=true){return queryOptions({queryKey:c.posts.normalize(e?.author??"",e?.permlink??""),enabled:t&&!!e,queryFn:async()=>mi(e)})}function Ic(e){return !!e&&typeof e=="object"&&"author"in e&&"permlink"in e&&"active_votes"in e}function xi(e){let t=new Date(e);return (new Date().getTime()-t.getTime())/(1e3*60*60*24)}function iv(e,t){let{limit:r=20,filters:n=[],dayLimit:i=7}=t??{};return infiniteQueryOptions({queryKey:c.accounts.voteHistory(e,r),initialPageParam:{start:-1},queryFn:async({pageParam:o})=>{let{start:s}=o,a=await g("condenser_api.get_account_history",[e,s,r,...n]),p=a.map(([m,y])=>({...y.op[1],num:m,timestamp:y.timestamp})).filter(m=>m.voter===e&&m.weight!==0&&xi(m.timestamp)<=i),l=[];for(let m of p){let y=await d.queryClient.fetchQuery(ci(m.author,m.permlink));Ic(y)&&l.push(y);}let[f]=a;return {lastDate:f?xi(f[1].timestamp):0,lastItemFetched:f?f[0]:s,entries:l}},getNextPageParam:o=>({start:o.lastItemFetched})})}function uv(e,t,r=true){return queryOptions({queryKey:c.accounts.profiles(e,t??""),enabled:r&&e.length>0,queryFn:async()=>Rt(e,t)})}function gv(e,t="HIVE",r=200){return infiniteQueryOptions({queryKey:c.wallet.balanceHistory(e??"",t,r),initialPageParam:null,queryFn:async({pageParam:n,signal:i})=>{if(!e)return {entries:[],currentPage:0};let o={"account-name":e,"coin-type":t,"page-size":r,direction:"desc"};n!==null&&(o.page=n);let s=await re("balance","/accounts/{account-name}/balance-history",o,void 0,void 0,i);return {entries:s.operations_result,currentPage:n??s.total_pages}},getNextPageParam:n=>{let i=n.currentPage-1;return i>=1?i:void 0},enabled:!!e})}function bv(e,t="HIVE",r="yearly"){return queryOptions({queryKey:c.wallet.aggregatedHistory(e??"",t,r),queryFn:async()=>e?await re("balance","/accounts/{account-name}/aggregated-history",{"account-name":e,"coin-type":t,granularity:r}):[],enabled:!!e,staleTime:6e4})}function Ov(){return queryOptions({queryKey:c.accounts.proMembers(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/pro-members",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch pro members: ${e.status}`);return e.json()},staleTime:300*1e3})}function xv(e){return new Set((e??[]).map(t=>t.toLowerCase()))}function Rv(e,t,r){let n=useQueryClient(),{data:i}=useQuery(Q(e));return v(["accounts","update"],e,o=>{let s=ti(n.getQueryData(Q(e).queryKey),i);if(!s)throw new Error("[SDK][Accounts] \u2013 cannot update not existing account");return [["account_update2",{account:e,json_metadata:"",extensions:[],posting_json_metadata:ri({existingPostingJsonMetadata:s.posting_json_metadata,profile:o.profile,tokens:o.tokens})}]]},async(o,s)=>{n.setQueryData(Q(e).queryKey,a=>{if(!a)return a;let u=JSON.parse(JSON.stringify(a));return u.profile=dr({existingProfile:ei(a),profile:s.profile,tokens:s.tokens}),u}),await k(t?.adapter,r,[c.accounts.full(e)]);},t,void 0,{broadcastMode:r,onMutate:async()=>{if(e)try{await n.fetchQuery({...Q(e),staleTime:0});}catch{}}})}function Kv(e,t,r,n,i){return useMutation({mutationKey:["accounts","relation","update",e,t],mutationFn:async o=>{let s=ii(e,t);await b().prefetchQuery(s);let a=b().getQueryData(s.queryKey);return await $n(e,"follow",["follow",{follower:e,following:t,what:[...o==="toggle-ignore"&&!a?.ignores?["ignore"]:[],...o==="toggle-follow"&&!a?.follows?["blog"]:[]]}],r),{...a,ignores:o==="toggle-ignore"?!a?.ignores:a?.ignores,follows:o==="toggle-follow"?!a?.follows:a?.follows}},onError:i,onSuccess(o){n(o),b().setQueryData(c.accounts.relations(e,t),o),t&&b().invalidateQueries(Q(t));}})}function gr(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildVoteOp] Missing required parameters");if(n<-1e4||n>1e4)throw new Error("[SDK][buildVoteOp] Weight must be between -10000 and 10000");return ["vote",{voter:e,author:t,permlink:r,weight:n}]}function Be(e,t,r,n,i,o,s){if(!e||!t||n===void 0||!o)throw new Error("[SDK][buildCommentOp] Missing required parameters");return ["comment",{parent_author:r,parent_permlink:n,author:e,permlink:t,title:i,body:o,json_metadata:JSON.stringify(s)}]}function Me(e,t,r,n,i,o,s){if(!e||!t)throw new Error("[SDK][buildCommentOptionsOp] Missing required parameters");return ["comment_options",{author:e,permlink:t,max_accepted_payout:r,percent_hbd:n,allow_votes:i,allow_curation_rewards:o,extensions:s}]}function yr(e,t){if(!e||!t)throw new Error("[SDK][buildDeleteCommentOp] Missing required parameters");return ["delete_comment",{author:e,permlink:t}]}function hr(e,t,r,n=false){if(!e||!t||!r)throw new Error("[SDK][buildReblogOp] Missing required parameters");let i={account:e,author:t,permlink:r};return n&&(i.delete="delete"),["custom_json",{id:"follow",json:JSON.stringify(["reblog",i]),required_auths:[],required_posting_auths:[e]}]}function Ne(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferOp] Missing required parameters");return ["transfer",{from:e,to:t,amount:r,memo:n||""}]}function Uc(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiTransferOps] Missing required parameters");return t.trim().split(/[\s,]+/).filter(Boolean).map(o=>Ne(e,o.trim(),r,n))}function Vc(e,t,r,n,i,o){if(!e||!t||!r)throw new Error("[SDK][buildRecurrentTransferOp] Missing required parameters");if(i<24)throw new Error("[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours");return ["recurrent_transfer",{from:e,to:t,amount:r,memo:n||"",recurrence:i,executions:o,extensions:[]}]}function $e(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferToSavingsOp] Missing required parameters");return ["transfer_to_savings",{from:e,to:t,amount:r,memo:n||""}]}function Qe(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildTransferFromSavingsOp] Missing required parameters");return ["transfer_from_savings",{from:e,to:t,amount:r,memo:n||"",request_id:i}]}function Ei(e,t){if(!e||t===void 0)throw new Error("[SDK][buildCancelTransferFromSavingsOp] Missing required parameters");return ["cancel_transfer_from_savings",{from:e,request_id:t}]}function ot(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildClaimInterestOps] Missing required parameters");return [Qe(e,t,r,n,i),Ei(e,i)]}function st(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildTransferToVestingOp] Missing required parameters");return ["transfer_to_vesting",{from:e,to:t,amount:r}]}function at(e,t){if(!e||!t)throw new Error("[SDK][buildWithdrawVestingOp] Missing required parameters");return ["withdraw_vesting",{account:e,vesting_shares:t}]}function ct(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildDelegateVestingSharesOp] Missing required parameters");return ["delegate_vesting_shares",{delegator:e,delegatee:t,vesting_shares:r}]}function ut(e,t,r,n){if(!e||!t||r===void 0)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters");if(r<0||r>1e4)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");return ["set_withdraw_vesting_route",{from_account:e,to_account:t,percent:r,auto_vest:n}]}function pt(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildConvertOp] Missing required parameters");return ["convert",{owner:e,amount:t,requestid:r}]}function wr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildCollateralizedConvertOp] Missing required parameters");return ["collateralized_convert",{owner:e,amount:t,requestid:r}]}function He(e,t,r,n="tokens"){return ["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:JSON.stringify({contractName:n,contractAction:t,contractPayload:r})}]}function _r(e,t){return ["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:JSON.stringify(t.map(r=>({symbol:r})))}]}function br(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildDelegateRcOp] Missing required parameters");let n=t.includes(",")?t.split(",").map(i=>i.trim()):[t];return ["custom_json",{id:"rc",json:JSON.stringify(["delegate_rc",{from:e,delegatees:n,max_rc:r}]),required_auths:[],required_posting_auths:[e]}]}function vr(e,t){if(!e||!t)throw new Error("[SDK][buildFollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["blog"]}]),required_auths:[],required_posting_auths:[e]}]}function Ft(e,t){if(!e||!t)throw new Error("[SDK][buildUnfollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:[]}]),required_auths:[],required_posting_auths:[e]}]}function jc(e,t){if(!e||!t)throw new Error("[SDK][buildIgnoreOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["ignore"]}]),required_auths:[],required_posting_auths:[e]}]}function Lc(e,t){if(!e||!t)throw new Error("[SDK][buildUnignoreOp] Missing required parameters");return Ft(e,t)}function Ar(e,t){if(!e)throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");let r=t||new Date().toISOString().split(".")[0],n=["custom_json",{id:"notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}],i=["custom_json",{id:"ecency_notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}];return [n,i]}function Pr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");return ["account_witness_vote",{account:e,witness:t,approve:r}]}function Or(e,t){if(!e||t===void 0)throw new Error("[SDK][buildWitnessProxyOp] Missing required parameters");return ["account_witness_proxy",{account:e,proxy:t}]}function xr(e,t){if(!e||!t.receiver||!t.subject||!t.permlink||!t.start||!t.end||!t.dailyPay)throw new Error("[SDK][buildProposalCreateOp] Missing required parameters");let r=new Date(t.start),n=new Date(t.end);if(r.toString()==="Invalid Date"||n.toString()==="Invalid Date")throw new Error("[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings");return ["create_proposal",{creator:e,receiver:t.receiver,start_date:t.start,end_date:t.end,daily_pay:t.dailyPay,subject:t.subject,permlink:t.permlink,extensions:[]}]}function Er(e,t,r){if(!e||!t||t.length===0||r===void 0)throw new Error("[SDK][buildProposalVoteOp] Missing required parameters");return ["update_proposal_votes",{voter:e,proposal_ids:t,approve:r,extensions:[]}]}function $c(e,t){if(!e||!t||t.length===0)throw new Error("[SDK][buildRemoveProposalOp] Missing required parameters");return ["remove_proposal",{proposal_owner:e,proposal_ids:t,extensions:[]}]}function Wc(e,t,r,n,i){if(e==null||typeof e!="number"||!t||!r||!n||!i)throw new Error("[SDK][buildUpdateProposalOp] Missing required parameters");return ["update_proposal",{proposal_id:e,creator:t,daily_pay:r,subject:n,permlink:i,extensions:[]}]}function Sr(e,t){if(!e||!t)throw new Error("[SDK][buildSubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["subscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function kr(e,t){if(!e||!t)throw new Error("[SDK][buildUnsubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["unsubscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Cr(e,t,r,n){if(!e||!t||!r||!n)throw new Error(`[SDK][buildSetRoleOp] Missing required parameters: username=${e}, community=${t}, account=${r}, role=${n}`);return ["custom_json",{id:"community",json:JSON.stringify(["setRole",{community:t,account:r,role:n}]),required_auths:[],required_posting_auths:[e]}]}function Tr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildUpdateCommunityOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["updateProps",{community:t,props:r}]),required_auths:[],required_posting_auths:[e]}]}function Rr(e,t,r,n,i){if(!e||!t||!r||!n||i===void 0)throw new Error("[SDK][buildPinPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"pinPost":"unpinPost",{community:t,account:r,permlink:n}]),required_auths:[],required_posting_auths:[e]}]}function Fr(e,t,r,n,i,o){if(!e||!t||!r||!n||o===void 0)throw new Error("[SDK][buildMutePostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([o?"mutePost":"unmutePost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}function Gc(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildMuteUserOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"muteUser":"unmuteUser",{community:t,account:r,notes:n}]),required_auths:[],required_posting_auths:[e]}]}function zc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildFlagPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["flagPost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}var Si=(r=>(r.Buy="buy",r.Sell="sell",r))(Si||{}),ki=(r=>(r.EMPTY="",r.SWAP="9",r))(ki||{});function It(e,t,r,n,i,o){if(!e||!t||!r||!i||o===void 0)throw new Error("[SDK][buildLimitOrderCreateOp] Missing required parameters");return ["limit_order_create",{owner:e,orderid:o,amount_to_sell:t,min_to_receive:r,fill_or_kill:n,expiration:i}]}function qt(e,t=3){return e.toFixed(t)}function Jc(e,t,r,n,i=""){if(!e||n===void 0||!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new Error("[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters");let o=new Date(Date.now());o.setDate(o.getDate()+27);let s=o.toISOString().split(".")[0],a=+`${i}${Math.floor(Date.now()/1e3).toString().slice(2)}`,u=n==="buy"?`${qt(t,3)} HBD`:`${qt(t,3)} HIVE`,p=n==="buy"?`${qt(r,3)} HIVE`:`${qt(r,3)} HBD`;return It(e,u,p,false,s,a)}function qr(e,t){if(!e||t===void 0)throw new Error("[SDK][buildLimitOrderCancelOp] Missing required parameters");return ["limit_order_cancel",{owner:e,orderid:t}]}function Ir(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildClaimRewardBalanceOp] Missing required parameters");return ["claim_reward_balance",{account:e,reward_hive:t,reward_hbd:r,reward_vests:n}]}function Yc(e,t,r,n,i,o){if(!e||!i)throw new Error("[SDK][buildAccountUpdateOp] Missing required parameters");return ["account_update",{account:e,owner:t,active:r,posting:n,memo_key:i,json_metadata:o}]}function Xc(e,t,r,n){if(!e||r===void 0)throw new Error("[SDK][buildAccountUpdate2Op] Missing required parameters");return ["account_update2",{account:e,json_metadata:t||"",posting_json_metadata:r,extensions:n||[]}]}function Dr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildAccountCreateOp] Missing required parameters");let i={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},o={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},s={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["account_create",{creator:e,new_account_name:t,owner:i,active:o,posting:s,memo_key:r.memoPublicKey,json_metadata:"",fee:n}]}function Kr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildCreateClaimedAccountOp] Missing required parameters");let n={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},i={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},o={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["create_claimed_account",{creator:e,new_account_name:t,owner:n,active:i,posting:o,memo_key:r.memoPublicKey,json_metadata:"",extensions:[]}]}function Br(e,t){if(!e||!t)throw new Error("[SDK][buildClaimAccountOp] Missing required parameters");return ["claim_account",{creator:e,fee:t,extensions:[]}]}function Mr(e,t,r,n,i,o){if(!e||!t||!r||!i)throw new Error("[SDK][buildGrantPostingPermissionOp] Missing required parameters");let s=t.account_auths.findIndex(([p])=>p===r),a=[...t.account_auths];s>=0?a[s]=[r,n]:a.push([r,n]);let u={...t,account_auths:a};return u.account_auths.sort((p,l)=>p[0]>l[0]?1:-1),["account_update",{account:e,posting:u,memo_key:i,json_metadata:o}]}function Zc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildRevokePostingPermissionOp] Missing required parameters");let o={...t,account_auths:t.account_auths.filter(([s])=>s!==r)};return ["account_update",{account:e,posting:o,memo_key:n,json_metadata:i}]}function eu(e,t,r=[]){if(!e||!t)throw new Error("[SDK][buildChangeRecoveryAccountOp] Missing required parameters");return ["change_recovery_account",{account_to_recover:e,new_recovery_account:t,extensions:r}]}function tu(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");return ["request_account_recovery",{recovery_account:e,account_to_recover:t,new_owner_authority:r,extensions:n}]}function ru(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRecoverAccountOp] Missing required parameters");return ["recover_account",{account_to_recover:e,new_owner_authority:t,recent_owner_authority:r,extensions:n}]}function Nr(e,t,r){if(!e||!t||!Number.isFinite(r))throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");return ["custom_json",{id:"ecency_boost_plus",json:JSON.stringify({user:e,account:t,duration:r}),required_auths:[e],required_posting_auths:[]}]}function Qr(e,t){if(!e||!Number.isInteger(t)||t<=0)throw new Error("[SDK][buildRcDelegationOp] Missing or invalid parameters");return ["custom_json",{id:"ecency_rc_delegation",json:JSON.stringify({user:e,duration:t}),required_auths:[e],required_posting_auths:[]}]}function Hr(e,t,r,n){if(!e||!t||!r||!Number.isFinite(n))throw new Error("[SDK][buildPromoteOp] Missing required parameters");return ["custom_json",{id:"ecency_promote",json:JSON.stringify({user:e,author:t,permlink:r,duration:n}),required_auths:[e],required_posting_auths:[]}]}function We(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildPointTransferOp] Missing required parameters");let i=r.replace(/POINTS\b/,"POINT");return ["custom_json",{id:"ecency_point_transfer",json:JSON.stringify({sender:e,receiver:t,amount:i,memo:n||""}),required_auths:[e],required_posting_auths:[]}]}function nu(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");let i=t.trim().split(/[\s,]+/).filter(Boolean);if(i.length===0)throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");return i.map(o=>We(e,o.trim(),r,n))}function Ur(e){if(!e)throw new Error("[SDK][buildCommunityRegistrationOp] Missing required parameters");return ["custom_json",{id:"ecency_registration",json:JSON.stringify({name:e}),required_auths:[e],required_posting_auths:[]}]}function iu(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildActiveCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[e],required_posting_auths:[]}]}function ou(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildPostingCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[],required_posting_auths:[e]}]}function nA(e,t,r){return v(["accounts","follow"],e,({following:n})=>[vr(e,n)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function aA(e,t,r){return v(["accounts","unfollow"],e,({following:n})=>[Ft(e,n)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function lA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","add",e],mutationFn:async({author:i,permlink:o})=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:i,permlink:o,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function gA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:i,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function _A(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","add",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/favorites-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})})).json()},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:n})}function OA(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");let s=await w()(d.privateApiHost+"/private-api/favorites-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})});if(!s.ok)throw new Error(`Failed to delete favorite: ${s.status}`);return s.json()},onMutate:async i=>{if(!e)return;let o=b(),s=c.accounts.favorites(e),a=c.accounts.favoritesInfinite(e),u=c.accounts.checkFavorite(e,i);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a}),o.cancelQueries({queryKey:u})]);let p=o.getQueryData(s);p&&o.setQueryData(s,p.filter(y=>y.account!==i));let l=o.getQueryData(u);o.setQueryData(u,false);let f=o.getQueriesData({queryKey:a}),m=new Map(f);for(let[y,h]of f)h&&o.setQueryData(y,{...h,pages:h.pages.map(S=>({...S,data:S.data.filter(x=>x.account!==i)}))});return {previousList:p,previousInfinite:m,previousCheck:l}},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.accounts.favorites(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);s?.previousCheck!==void 0&&a.setQueryData(c.accounts.checkFavorite(e,o),s.previousCheck),n(i);}})}function du(e,t){let r=new Map;return e.forEach(([n,i])=>{r.set(n.toString(),i);}),t.forEach(([n,i])=>{r.set(n.toString(),i);}),Array.from(r.entries()).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i])}function Ci(e,t){let{data:r}=useQuery(Q(e));return useMutation({mutationKey:["accounts","keys-update",e],mutationFn:async({keys:n,keepCurrent:i=false,currentKey:o,keysToRevoke:s=[],keysToRevokeByAuthority:a={}})=>{if(n.length===0)throw new Error("[SDK][Update password] \u2013 no new keys provided");if(!r)throw new Error("[SDK][Update password] \u2013 cannot update keys for anon user");let u=p=>{let l=JSON.parse(JSON.stringify(r[p])),m=[...a[p]||[],...a[p]===void 0?s:[]],y=i?l.key_auths.filter(([h])=>!m.includes(h.toString())):[];return l.key_auths=du(y,n.map((h,S)=>[h[p].createPublic().toString(),S+1])),l};return te([["account_update",{account:e,json_metadata:r.json_metadata,owner:u("owner"),active:u("active"),posting:u("posting"),memo_key:n[0].memo_key.createPublic().toString()}]],o)},...t})}function IA(e,t){let{data:r}=useQuery(Q(e)),{mutateAsync:n}=Ci(e);return useMutation({mutationKey:["accounts","password-update",e],mutationFn:async({newPassword:i,currentPassword:o,keepCurrent:s})=>{if(!r)throw new Error("[SDK][Update password] \u2013 cannot update password for anon user");let a=U.fromLogin(e,o,"owner");return n({currentKey:a,keepCurrent:s,keys:[{owner:U.fromLogin(e,i,"owner"),active:U.fromLogin(e,i,"active"),posting:U.fromLogin(e,i,"posting"),memo_key:U.fromLogin(e,i,"memo")}]})},...t})}function QA(e,t,r){let n=useQueryClient(),{data:i}=useQuery(Q(e));return useMutation({mutationKey:["accounts","revoke-posting",i?.name],mutationFn:async({accountName:o,type:s,key:a})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user");let u=JSON.parse(JSON.stringify(i.posting));u.account_auths=u.account_auths.filter(([l])=>l!==o);let p={account:i.name,posting:u,memo_key:i.memo_key,json_metadata:i.json_metadata};if(s==="key"&&a)return te([["account_update",p]],a);if(s==="keychain"){if(!r?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return r.adapter.broadcastWithKeychain(i.name,[["account_update",p]],"active")}else return t.hsCallbackUrl,Ln.sendOperation(["account_update",p],t.hsCallbackUrl?{callback:t.hsCallbackUrl}:{},()=>{})},onError:t.onError,onSuccess:(o,s,a)=>{t.onSuccess?.(o,s,a),n.setQueryData(Q(e).queryKey,u=>({...u,posting:{...u?.posting,account_auths:u?.posting?.account_auths?.filter(([p])=>p!==s.accountName)??[]}}));}})}function WA(e,t,r,n){let{data:i}=useQuery(Q(e));return useMutation({mutationKey:["accounts","recovery",i?.name],mutationFn:async({accountName:o,type:s,key:a,email:u})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user");let p={account_to_recover:i.name,new_recovery_account:o,extensions:[]};if(s==="ecency"){if(!t)throw new Error("[SDK][Accounts] \u2013 missing access token");let f=await w()(d.privateApiHost+"/private-api/recoveries-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,email:u,publicKeys:[...i.owner.key_auths,...i.active.key_auths,...i.posting.key_auths,i.memo_key]})});if(!f.ok)throw new Error(`[SDK][Accounts] Failed to add recovery: ${f.status}`);return f}else {if(s==="key"&&a)return te([["change_recovery_account",p]],a);if(s==="keychain"){if(!n?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return n.adapter.broadcastWithKeychain(i.name,[["change_recovery_account",p]],"owner")}else return r.hsCallbackUrl,Ln.sendOperation(["change_recovery_account",p],r.hsCallbackUrl?{callback:r.hsCallbackUrl}:{},()=>{})}},onError:r.onError,onSuccess:r.onSuccess})}function zA(e,t){let r=e.key_auths.filter(([i])=>!t.has(String(i))).reduce((i,[,o])=>i+o,0),n=(e.account_auths??[]).reduce((i,[,o])=>i+o,0);return r+n>=e.weight_threshold}function Ti(e,t){let r=new Set(t.map(s=>s.toString())),n=s=>s.key_auths.some(([a])=>r.has(String(a))),i=s=>{let a=JSON.parse(JSON.stringify(s));return a.key_auths=a.key_auths.filter(([u])=>!r.has(u.toString())),a},o=n(e.owner);return {account:e.name,json_metadata:e.json_metadata,owner:o?i(e.owner):void 0,active:i(e.active),posting:i(e.posting),memo_key:e.memo_key}}function tP(e,t){let{data:r}=useQuery(Q(e));return useMutation({mutationKey:["accounts","revoke-key",r?.name],mutationFn:async({currentKey:n,revokingKey:i})=>{if(!r)throw new Error("[SDK][Revoke key] \u2013 cannot update keys for anon user");let o=Array.isArray(i)?i:[i],s=Ti(r,o);return te([["account_update",s]],n)},...t})}function oP(e,t,r){return v(["accounts","claimAccount"],e,({creator:n,fee:i="0.000 HIVE"})=>[Br(n,i)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(i.creator)]);},t,"active",{broadcastMode:r})}function uP(e,t,r){return v(["accounts","grant-posting-permission"],e,n=>[Mr(e,n.currentPosting,n.grantedAccount,n.weightThreshold,n.memoKey,n.jsonMetadata)],async()=>{await k(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}function fP(e,t,r){return v(["accounts","create"],e,n=>[n.useClaimed?Kr(e,n.newAccountName,n.keys):Dr(e,n.newAccountName,n.keys,n.fee)],async()=>{await k(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}var Vr=300*60*24,Ou=1e4,xu=5e7;function Ri(e){let t=T(e.vesting_shares).amount,r=T(e.received_vesting_shares).amount,n=T(e.delegated_vesting_shares).amount,i=T(e.vesting_withdraw_rate).amount,o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t+r-n-s}function Eu(e,t,r){let n=e*1e6;return (t*r/1e4/50+1)*n/1e4}function Su(e){if(Number.isFinite(e.lastHardfork))return e.lastHardfork>=28;let[t="0",r="0"]=(e.currentHardforkVersion??"0.0.0").split(".");return Number(t)>1||Number(t)===1&&Number(r)>=28}function ku(e,t,r){let n=t.votePowerReserveRate||Number(t.raw?.globalDynamic?.vote_power_reserve_rate??0);if(!Number.isFinite(n)||n<=0)return 0;let i=Ri(e);if(!Number.isFinite(i)||i<=0)return 0;let o=i*1e6,s=Math.ceil(o*r*60*60*24/Ou/(n*Vr)),a=ur(e),u=Math.min(a.current_mana,a.max_mana);return !Number.isFinite(u)||s>u?0:Math.max(s-xu,0)}function Cu(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;if(Su(t))return ku(e,t,n);let i=0;try{if(i=Ri(e),!Number.isFinite(i))return 0}catch{return 0}return Eu(i,r,n)}function hP(e){return ur(e).percentage/100}function wP(e){if(!Number.isFinite(e))throw new TypeError("Voting power must be a finite number");if(e<0||e>100)throw new RangeError("Voting power must be between 0 and 100");return (100-e)*100*Vr/1e4}function _P(e){let t=parseFloat(e.vesting_shares)+parseFloat(e.received_vesting_shares)-parseFloat(e.delegated_vesting_shares),r=Math.floor(Date.now()/1e3)-e.downvote_manabar.last_update_time,n=t*1e6/4;if(n<=0)return 0;let i=parseFloat(e.downvote_manabar.current_mana.toString())+r*n/Vr;i>n&&(i=n);let o=i*100/n;return isNaN(o)?0:o>100?100:o}function bP(e){return Et(e).percentage/100}function vP(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;let{fundRecentClaims:i,fundRewardBalance:o,base:s,quote:a}=t;if(!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(a)||i===0||a===0)return 0;let u=Cu(e,t,r,n);return Number.isFinite(u)?u/i*o*(s/a):0}var Tu={vote:"posting",comment:"posting",delete_comment:"posting",comment_options:"posting",claim_reward_balance:"posting",cancel_transfer_from_savings:"active",collateralized_convert:"active",convert:"active",delegate_vesting_shares:"active",recurrent_transfer:"active",set_withdraw_vesting_route:"active",transfer:"active",transfer_from_savings:"active",transfer_to_savings:"active",transfer_to_vesting:"active",withdraw_vesting:"active",limit_order_create:"active",limit_order_cancel:"active",account_update:"active",account_update2:"active",claim_account:"active",create_claimed_account:"active",account_witness_proxy:"active",account_witness_vote:"active",remove_proposal:"active",update_proposal_votes:"active",change_recovery_account:"owner",request_account_recovery:"owner",recover_account:"owner",reset_account:"owner",set_reset_account:"owner"};function Ru(e){let t=e[0],r=e[1];if(t!=="custom_json")throw new Error("Operation is not a custom_json operation");let n=r;return n.required_auths&&n.required_auths.length>0?"active":(n.required_posting_auths&&n.required_posting_auths.length>0,"posting")}function Fu(e){let t=e[0];if(t!=="create_proposal"&&t!=="update_proposal")throw new Error("Operation is not a proposal operation");return "active"}function qu(e){let t=e[0];return t==="custom_json"?Ru(e):t==="create_proposal"||t==="update_proposal"?Fu(e):Tu[t]??"posting"}function PP(e){let t="posting";for(let r of e){let n=qu(r);if(n==="owner")return "owner";n==="active"&&t==="posting"&&(t="active");}return t}function kP(e){return useMutation({mutationKey:["operations","sign",e],mutationFn:({operation:t,keyOrSeed:r})=>{if(!e)throw new Error("[Operations][Sign] \u2013 cannot sign op with anon user");let n;return r.split(" ").length===12?n=U.fromLogin(e,r,"active"):Hn(r)?n=U.fromString(r):n=U.from(r),te([t],n)}})}function RP(e,t,r="active"){return useMutation({mutationKey:["operations","sign-keychain",e],mutationFn:({operation:n})=>{if(!e)throw new Error("[SDK][Keychain] \u2013\xA0cannot sign operation with anon user");if(!t?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Keychain] \u2013 missing keychain broadcaster");return t.adapter.broadcastWithKeychain(e,[n],r)}})}function DP(e="/"){return useMutation({mutationKey:["operations","sign-hivesigner",e],mutationFn:async({operation:t})=>Ln.sendOperation(t,{callback:e},()=>{})})}function NP(){return queryOptions({queryKey:["operations","chain-properties"],queryFn:async()=>await g("condenser_api.get_chain_properties",[])})}function Fi(e,t,r){return {...e,...t??{},title:r.title,body:r.body}}function qi(e,t){return {...e??{},title:t.title,body:t.body}}function WP(e,t){return useMutation({mutationKey:["posts","add-fragment",e],mutationFn:async({title:r,body:n})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let o=await w()(d.privateApiHost+"/private-api/fragments-add",{method:"POST",body:JSON.stringify({code:t,title:r,body:n}),headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`[SDK][Posts] Failed to add fragment: ${o.status}`);return o.json()},onSuccess(r,n){let i=b(),o=qi(r,n);i.setQueryData(Le(e,t).queryKey,s=>[o,...s??[]]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map((a,u)=>u===0?{...a,data:[o,...a.data]}:a)});}})}function e0(e,t){return useMutation({mutationKey:["posts","edit-fragment",e],mutationFn:async({fragmentId:r,title:n,body:i})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let s=await w()(d.privateApiHost+"/private-api/fragments-update",{method:"POST",body:JSON.stringify({code:t,id:r,title:n,body:i}),headers:{"Content-Type":"application/json"}});if(!s.ok)throw new Error(`[SDK][Posts] Failed to update fragment: ${s.status}`);return s.json()},onSuccess(r,n){let i=b(),o=s=>Fi(s,r,n);i.setQueryData(Le(e,t).queryKey,s=>s?.map(a=>a.id===n.fragmentId?o(a):a)??[]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map(a=>({...a,data:a.data.map(u=>u.id===n.fragmentId?o(u):u)}))});}})}function s0(e,t){return useMutation({mutationKey:["posts","remove-fragment",e],mutationFn:async({fragmentId:r})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let i=await w()(d.privateApiHost+"/private-api/fragments-delete",{method:"POST",body:JSON.stringify({code:t,id:r}),headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`[SDK][Posts] Failed to delete fragment: ${i.status}`);return i},onSuccess(r,n){let i=b();i.setQueryData(Le(e,t).queryKey,o=>[...o??[]].filter(({id:s})=>s!==n.fragmentId)),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},o=>o&&{...o,pages:o.pages.map(s=>({...s,data:s.data.filter(a=>a.id!==n.fragmentId)}))});}})}async function J(e){if(!e.ok){let r;try{r=await e.json();}catch{r=void 0;}let n=new Error(`Request failed with status ${e.status}`);throw n.status=e.status,n.data=r,n}let t=await e.text();if(!t||t.trim()==="")return "";try{return JSON.parse(t)}catch(r){return console.warn("[SDK] Failed to parse JSON response:",r,"Response:",t),""}}async function u0(e,t,r,n){let o=await w()(d.privateApiHost+"/private-api/account-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,email:t,referral:r,captcha_token:n})}),s=await J(o);return {status:o.status,data:s}}async function p0(e){let r=await w()(d.privateApiHost+"/private-api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e})}),n=await J(r);return {status:r.status,data:n}}async function l0(e,t,r="",n=""){let i={code:e,ty:t};r&&(i.bl=r),n&&(i.tx=n);let s=await w()(d.privateApiHost+"/private-api/usr-activity",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});await J(s);}async function d0(e,t,r=null,n=null){let i={code:e};t&&(i.filter=t),r&&(i.since=r),n&&(i.user=n);let s=await w()(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return J(s)}async function f0(e,t,r,n,i,o){let s={code:e,username:t,token:o,system:r,allows_notify:n,notify_types:i},u=await w()(d.privateApiHost+"/private-api/register-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return J(u)}async function m0(e,t,r){let n={code:e,username:t,token:r},o=await w()(d.privateApiHost+"/private-api/detail-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return J(o)}async function Ii(e,t){let r={code:e};t&&(r.id=t);let i=await w()(d.privateApiHost+"/private-api/notifications/mark",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Di(e,t){let r={code:e,url:t},i=await w()(d.privateApiHost+"/private-api/images-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}var Uu="https://i.ecency.com";async function Ki(e,t,r){let n=w(),i=new FormData;i.append("file",e);let o=await n(`${Uu}/hs/${t}`,{method:"POST",body:i,signal:r});return J(o)}async function g0(e,t,r,n){let i=w(),o=new FormData;o.append("file",e);let s=await i(`${d.imageHost}/${t}/${r}`,{method:"POST",body:o,signal:n});return J(s)}async function Bi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/images-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Mi(e,t,r,n,i){let o={code:e,title:t,body:r,tags:n,meta:i},a=await w()(d.privateApiHost+"/private-api/drafts-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});return J(a)}async function Ni(e,t,r,n,i,o){let s={code:e,id:t,title:r,body:n,tags:i,meta:o},u=await w()(d.privateApiHost+"/private-api/drafts-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return J(u)}async function Qi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/drafts-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Hi(e,t,r,n,i,o,s,a){let u={code:e,permlink:t,title:r,body:n,meta:i,schedule:s,reblog:a};o&&(u.options=o);let l=await w()(d.privateApiHost+"/private-api/schedules-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return J(l)}async function Ui(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function Vi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return J(i)}async function y0(e,t,r){let n={code:e,author:t,permlink:r},o=await w()(d.privateApiHost+"/private-api/promoted-post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return J(o)}async function h0(e,t,r){let n={username:e,email:t,friend:r},o=await w()(d.privateApiHost+"/private-api/account-create-friend",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return J(o)}function A0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","add",e],mutationFn:async({title:i,body:o,tags:s,meta:a})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addDraft");return Mi(t,i,o,s,a)},onSuccess:i=>{r?.();let o=b();i?.drafts?o.setQueryData(c.posts.drafts(e),i.drafts):o.invalidateQueries({queryKey:c.posts.drafts(e)}),o.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function S0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","update",e],mutationFn:async({draftId:i,title:o,body:s,tags:a,meta:u})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for updateDraft");return Ni(t,i,o,s,a,u)},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function q0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","delete",e],mutationFn:async({draftId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteDraft");return Qi(t,i)},onMutate:async({draftId:i})=>{if(!e)return;let o=b(),s=c.posts.drafts(e),a=c.posts.draftsInfinite(e);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a})]);let u=o.getQueryData(s);u&&o.setQueryData(s,u.filter(f=>f._id!==i));let p=o.getQueriesData({queryKey:a}),l=new Map(p);for(let[f,m]of p)m&&o.setQueryData(f,{...m,pages:m.pages.map(y=>({...y,data:y.data.filter(h=>h._id!==i)}))});return {previousList:u,previousInfinite:l}},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.posts.drafts(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);n?.(i);}})}function M0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","add",e],mutationFn:async({permlink:i,title:o,body:s,meta:a,options:u,schedule:p,reblog:l})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addSchedule");return Hi(t,i,o,s,a,u,p,l)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function V0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","delete",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteSchedule");return Ui(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function G0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","move",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for moveSchedule");return Vi(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)}),o.invalidateQueries({queryKey:c.posts.drafts(e)});},onError:n})}function Z0(e,t,r,n){return useMutation({mutationKey:["posts","images","add",e],mutationFn:async({url:i,code:o})=>{let s=o??t;if(!e||!s)throw new Error("[SDK][Posts] \u2013 missing auth for addImage");return Di(s,i)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.images(e)});},onError:n})}function iO(e,t,r,n){return useMutation({mutationKey:["posts","images","delete",e],mutationFn:async({imageId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteImage");return Bi(t,i)},onSuccess:(i,o)=>{r?.();let s=b(),{imageId:a}=o;s.setQueryData(["posts","images",e],u=>u?.filter(p=>p._id!==a)),s.setQueriesData({queryKey:["posts","images","infinite",e]},u=>u&&{...u,pages:u.pages.map(p=>({...p,data:p.data.filter(l=>l._id!==a)}))});},onError:n})}function cO(e,t){return useMutation({mutationKey:["posts","images","upload"],mutationFn:async({file:r,token:n,signal:i})=>Ki(r,n,i),onSuccess:e,onError:t})}function Kt(e,t){return `/@${e}/${t}`}function Xu(e,t,r){return (r??b()).getQueryData(c.posts.entry(Kt(e,t)))}function Zu(e,t){(t??b()).setQueryData(c.posts.entry(Kt(e.author,e.permlink)),e);}function Dt(e,t,r,n){let i=n??b(),o=Kt(e,t),s=i.getQueryData(c.posts.entry(o));if(!s)return;let a=r(s);return i.setQueryData(c.posts.entry(o),a),s}var Se;(a=>{function e(u,p,l,f,m){Dt(u,p,y=>({...y,active_votes:l,stats:{...y.stats||{gray:false,hide:false,flag_weight:0,total_votes:0},total_votes:l.length,flag_weight:y.stats?.flag_weight||0},total_votes:l.length,payout:f,pending_payout_value:String(f)}),m);}a.updateVotes=e;function t(u,p,l,f){Dt(u,p,m=>({...m,reblogs:l}),f);}a.updateReblogsCount=t;function r(u,p,l,f){Dt(u,p,m=>({...m,children:l}),f);}a.updateRepliesCount=r;function n(u,p,l,f){Dt(p,l,m=>({...m,children:m.children+1,replies:[u,...m.replies]}),f);}a.addReply=n;function i(u,p){u.forEach(l=>Zu(l,p));}a.updateEntries=i;function o(u,p,l){(l??b()).invalidateQueries({queryKey:c.posts.entry(Kt(u,p))});}a.invalidateEntry=o;function s(u,p,l){return Xu(u,p,l)}a.getEntry=s;})(Se||(Se={}));function ep(e,t,r){let n=e.some(i=>i.voter===t);return r!==0?n:!n}function tp(e,t,r){let n=Se.getEntry(t.author,t.permlink,r);if(!n?.active_votes||ep(n.active_votes,e,t.weight))return;let i=[...n.active_votes.filter(s=>s.voter!==e),...t.weight!==0?[{rshares:t.weight,voter:e}]:[]],o=n.payout+(t.estimated??0);Se.updateVotes(t.author,t.permlink,i,o,r);}function gO(e,t,r){return v(["posts","vote"],e,({author:n,permlink:i,weight:o})=>[gr(e,n,i,o)],async(n,i)=>{tp(e,i);let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(120,o,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let s=()=>{t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.accounts.full(e)]);};(r??"async")==="async"?setTimeout(s,4e3):s();}},t,"posting",{broadcastMode:r??"async"})}function bO(e,t,r){return v(["posts","reblog"],e,({author:n,permlink:i,deleteReblog:o})=>[hr(e,n,i,o??false)],async(n,i)=>{let o=Se.getEntry(i.author,i.permlink);if(o){let p=Math.max(0,(o.reblogs??0)+(i.deleteReblog?-1:1));Se.updateReblogsCount(i.author,i.permlink,p);}let s=n?.id??n?.tx_id;t?.adapter?.recordActivity&&s&&t.adapter.recordActivity(130,s,n?.block_num).catch(()=>{});let a=()=>{b().invalidateQueries({queryKey:c.posts.accountPostsBlogPrefix(e)}),t?.adapter?.invalidateQueries&&t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.posts.rebloggedBy(i.author,i.permlink)]);};(r??"async")==="async"?setTimeout(a,4e3):a();},t,"posting",{broadcastMode:r??"async"})}function OO(e,t,r){return v(["posts","comment"],e,n=>{let i=[];if(i.push(Be(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(Me(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=!i.parentAuthor,s=o?100:110,a=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&a&&t.adapter.recordActivity(s,a,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let u=[c.accounts.full(e),c.resourceCredits.account(e)];if(!o){u.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let p=i.rootAuthor||i.parentAuthor,l=i.rootPermlink||i.parentPermlink;u.push({predicate:f=>{let m=f.queryKey;return Array.isArray(m)&&m[0]==="posts"&&m[1]==="discussions"&&m[2]===p&&m[3]===l}});}await t.adapter.invalidateQueries(u);}},t,"posting",{broadcastMode:r})}function SO(e,t,r,n){let i=n??b(),o=i.getQueriesData({predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="discussions"&&a[2]===t&&a[3]===r}});for(let[s,a]of o)a&&i.setQueryData(s,[e,...a]);}function ji(e,t,r,n,i){let o=i??b(),s=new Map,a=o.getQueriesData({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===r&&p[3]===n}});for(let[u,p]of a)p&&(s.set(u,p),o.setQueryData(u,p.filter(l=>l.author!==e||l.permlink!==t)));return s}function Li(e,t){let r=t??b();for(let[n,i]of e)r.setQueryData(n,i);}function kO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`,s=i.getQueryData(c.posts.entry(o));return s&&i.setQueryData(c.posts.entry(o),{...s,...r}),s}function CO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`;i.setQueryData(c.posts.entry(o),r);}function IO(e,t,r){return v(["posts","deleteComment"],e,({author:n,permlink:i})=>[yr(n,i)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e)];if(i.parentAuthor&&i.parentPermlink){o.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let s=i.rootAuthor||i.parentAuthor,a=i.rootPermlink||i.parentPermlink;o.push({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===s&&p[3]===a}});}await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r,onMutate:async n=>{let i=n.rootAuthor||n.parentAuthor,o=n.rootPermlink||n.parentPermlink;return i&&o?{snapshots:ji(n.author,n.permlink,i,o)}:{}},onError:(n,i,o)=>{let{snapshots:s}=o??{};s&&Li(s);}})}function MO(e,t,r){return v(["posts","cross-post"],e,n=>{let i=[];if(i.push(Be(n.author,n.permlink,"",n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true}=n.options;i.push(Me(n.author,n.permlink,o,s,a,u,[]));}return i},async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e),{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.parentPermlink}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"async"})}function UO(e,t,r){return v(["posts","update-reply"],e,n=>{let i=[];if(i.push(Be(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(Me(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(110,o,n?.block_num).catch(s=>{console.debug("[SDK][Posts][useUpdateReply] recordActivity failed",{activityType:110,blockNum:n?.block_num,transactionId:o,error:s});}),t?.adapter?.invalidateQueries){let s=[c.resourceCredits.account(e)];s.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let a=i.rootAuthor||i.parentAuthor,u=i.rootPermlink||i.parentPermlink;s.push({predicate:p=>{let l=p.queryKey;return Array.isArray(l)&&l[0]==="posts"&&l[1]==="discussions"&&l[2]===a&&l[3]===u}}),await t.adapter.invalidateQueries(s);}},t,"posting",{broadcastMode:r})}function $O(e,t,r){return v(["ecency","promote"],e,({author:n,permlink:i,duration:o})=>[Hr(e,n,i,o)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.posts._promotedPrefix],[...c.points._prefix(e)],c.posts.entry(`/@${i.author}/${i.permlink}`)]);},t,"active",{broadcastMode:r})}var rp=[3e3,3e3,3e3],np=e=>new Promise(t=>setTimeout(t,e));async function ip(e,t){return g("condenser_api.get_content",[e,t])}async function op(e,t,r=0,n){let i=n?.delays??rp,o;try{o=await ip(e,t);}catch{o=void 0;}if(o||r>=i.length)return;let s=i[r];return s>0&&await np(s),op(e,t,r+1,n)}var Ge={};gt(Ge,{useRecordActivity:()=>jr});function ap(){return typeof window<"u"&&window.location?{url:window.location.href,domain:window.location.host}:{url:"",domain:""}}function jr(e,t,r){return useMutation({mutationKey:["analytics",t],mutationFn:async()=>{if(!t)throw new Error("[SDK][Analytics] \u2013 no activity type provided");let n=w(),i=ap(),o=r?.url??i.url,s=r?.domain??i.domain;try{await n(d.plausibleHost+"/api/event",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,url:o,domain:s,props:{username:e}})});}catch{}}})}function rx(e){return queryOptions({queryKey:["analytics","discover-leaderboard",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/leaderboard/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch leaderboard: ${r.status}`);return r.json()}})}function ax(e){return queryOptions({queryKey:["analytics","discover-curation",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/curation/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch curation data: ${r.status}`);let n=await r.json(),i=n.map(s=>s.account),o=await g("condenser_api.get_accounts",[i]);for(let s=0;sa.efficiency-s.efficiency),n}})}function lx(e,t=[],r=["visitors","pageviews","visit_duration"],n){let i=[...t].sort(),o=[...r].sort();return queryOptions({queryKey:["analytics","page-stats",e,i,o,n],queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/api/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,date_range:n}),signal:s});if(!a.ok)throw new Error(`Failed to fetch page stats: ${a.status}`);return a.json()},enabled:!!e,staleTime:0})}var Bt="threespeakfund",hx=1100;function lp(e){return /https?:\/\/([a-z0-9-]+\.)*3speak\.tv\/embed[?/]/i.test(e)}function wx(e,t){if(!lp(t))return e;let r=e.find(n=>n.account===Bt);return r&&r.weight===1100?e:r?e.map(n=>n.account===Bt?{...n,weight:1100}:n):[...e,{account:Bt,weight:1100}]}function _x(e){return e===Bt}var Wr={};gt(Wr,{getAccountTokenQueryOptions:()=>$r,getAccountVideosQueryOptions:()=>hp});var Lr={};gt(Lr,{getDecodeMemoQueryOptions:()=>mp});function mp(e,t,r){return queryOptions({queryKey:["integrations","hivesigner","decode-memo",e],queryFn:async()=>{if(r)return new Ln.Client({accessToken:r}).decode(t)}})}var $i={queries:Lr};function $r(e,t){return queryOptions({queryKey:["integrations","3speak","authenticate",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let n=await w()(`https://studio.3speak.tv/mobile/login?username=${e}&hivesigner=true`,{headers:{"Content-Type":"application/json"}}),i=$i.queries.getDecodeMemoQueryOptions(e,(await n.json()).memo,t);await b().prefetchQuery(i);let{memoDecoded:o}=b().getQueryData(i.queryKey);return o.replace("#","")}})}function hp(e,t){return queryOptions({queryKey:["integrations","3speak","videos",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let r=$r(e,t);await b().prefetchQuery(r);let n=b().getQueryData(r.queryKey);if(!n)throw new Error("[SDK][Integrations][3Speak] \u2013 missing account token");return await(await w()("https://studio.3speak.tv/mobile/api/my-videos",{headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}})).json()}})}var Kx={queries:Wr};function Ux(e){return queryOptions({queryKey:["integrations","hiveposh","links",e],retry:false,queryFn:async()=>{try{let r=await w()(`https://hiveposh.com/api/v0/linked-accounts/${e}`,{headers:{"Content-Type":"application/json"}});if(r.status===400&&(await r.json().catch(()=>({})))?.message==="User Not Connected"||!r.ok)return null;let n=await r.json();return {twitter:{username:n.twitter_username,profile:n.twitter_profile},reddit:{username:n.reddit_username,profile:n.reddit_profile}}}catch{return null}}})}function $x({url:e,dimensions:t=[],metrics:r=["visitors","pageviews","visit_duration"],filterBy:n="event:page",dateRange:i,enabled:o=true}){return queryOptions({queryKey:["integrations","plausible",e,t,r,n,i],queryFn:async()=>{let a=await w()(`${d.privateApiHost}/api/stats`,{method:"POST",body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,filterBy:n,...i?{date_range:i}:{}}),headers:{"Content-Type":"application/json"}});if(!a.ok)throw new Error(`Failed to fetch Plausible stats: ${a.status}`);return await a.json()},enabled:!!e&&o,retry:1})}function Jx(){return queryOptions({queryKey:["resource-credits","stats"],queryFn:async()=>(await g("rc_api.get_rc_stats",{})).rc_stats})}function eE(e){return queryOptions({queryKey:["resource-credits","account",e],queryFn:async()=>(await g("rc_api.find_rc_accounts",{accounts:[e]})).rc_accounts,enabled:!!e})}var Wi={ready:false,currentMana:0,maxMana:0,avgCost:0,estimatedCost:0,willLikelyFail:false,deficit:0,remaining:0};function nE({rcAccount:e,rcStats:t,operation:r,buffer:n=1.2}){if(!e||!t?.ops)return Wi;let{current_mana:i,max_mana:o}=Et(e),s=Number(t.ops[r]?.avg_cost??0);if(!(s>0))return {...Wi,ready:true,currentMana:i,maxMana:o};let a=Number.isFinite(n)&&n>0?n:1.2,u=s*a,p=i{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/get-game",{method:"POST",body:JSON.stringify({game_type:r,code:t}),headers:{"Content-Type":"application/json"}})).json()}})}function dE(e,t,r,n){let{mutateAsync:i}=jr(e,"spin-rolled");return useMutation({mutationKey:["games","post",r,e],mutationFn:async()=>{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/post-game",{method:"POST",body:JSON.stringify({game_type:r,code:t,key:n}),headers:{"Content-Type":"application/json"}})).json()},onSuccess(){i();}})}function yE(e){let t=e?.replace("@","");return queryOptions({queryKey:c.quests.status(t),enabled:!!t,queryFn:async()=>{if(!t)throw new Error("[SDK][Quests] \u2013 username wasn't provided");let n=await w()(d.privateApiHost+"/private-api/quests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t})});if(!n.ok)throw new Error(`Failed to fetch quests: ${n.status}`);return await n.json()},staleTime:3e4,refetchOnMount:true})}var xp=[{id:"checkin",tier:"daily",goal:1,i18nKey:"checkin",icon:"check-circle"},{id:"post",tier:"daily",goal:1,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"daily",goal:3,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"daily",goal:10,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"daily",goal:1,i18nKey:"reblog",icon:"repeat"},{id:"spin",tier:"daily",goal:1,i18nKey:"spin",icon:"gift"},{id:"post",tier:"weekly",goal:5,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"weekly",goal:15,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"weekly",goal:50,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"weekly",goal:5,i18nKey:"reblog",icon:"repeat"},{id:"post",tier:"monthly",goal:20,i18nKey:"post",icon:"pencil"}];function wE(e,t){return xp.find(r=>r.tier===e&&r.id===t)}var _E=300,bE=2;function kp(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}async function Cp(e){let r=await w()(d.privateApiHost+"/private-api/streak-freeze/buy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,idempotency_key:kp()})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to buy streak freeze: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function OE(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["streak-freeze","buy",n],mutationFn:async()=>{if(!n||!t)throw new Error("[SDK][StreakFreeze] \u2013 missing auth");return Cp(t)},onSuccess(){n&&r.invalidateQueries({queryKey:c.points._prefix(n)});},onSettled(){n&&r.invalidateQueries({queryKey:c.quests.status(n)});}})}function kE(e,t,r){return v(["communities","subscribe"],e,({community:n})=>[Sr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"async"})}function FE(e,t,r){return v(["communities","unsubscribe"],e,({community:n})=>[kr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"sync"})}function KE(e,t,r){return v(["communities","mutePost"],e,({community:n,author:i,permlink:o,notes:s,mute:a})=>[Fr(e,n,i,o,s,a)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.posts.entry(`/@${i.author}/${i.permlink}`),["community","single",i.community],{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.community}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"sync"})}function QE(e,t,r,n){return v(["communities","set-role",e],t,({account:i,role:o})=>[Cr(t,e,i,o)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>{if(!a)return a;let u=[...a.team??[]],p=u.findIndex(([l])=>l===o.account);return p>=0?u[p]=[u[p][0],o.role,u[p][2]??""]:u.push([o.account,o.role,""]),{...a,team:u}}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)],c.communities.context(o.account,e)]);},r,"posting",{broadcastMode:n??"async"})}function jE(e,t,r,n){return v(["communities","update",e],t,i=>[Tr(t,e,i)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>a&&{...a,...o}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)]]);},r,"posting",{broadcastMode:n??"async"})}function GE(e,t,r){return v(["communities","registerRewards"],e,({name:n})=>[Ur(n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.communities.singlePrefix(i.name)],[...c.points._prefix(e)]]);},t,"active",{broadcastMode:r})}function XE(e,t,r){return v(["communities","pin-post"],e,({community:n,account:i,permlink:o,pin:s})=>[Rr(e,n,i,o,s)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.posts.entry(`/@${i.account}/${i.permlink}`),[...c.communities.singlePrefix(i.community)]]);},t,"posting",{broadcastMode:r??"async"})}function nS(e,t,r=100,n=void 0,i=true){return queryOptions({queryKey:c.communities.list(e,t??"",r),enabled:i,queryFn:async()=>{let o=await g("bridge.list_communities",{last:"",limit:r,sort:e==="hot"?"rank":e,query:t||null,observer:n});return o?e==="hot"?o.sort(()=>Math.random()-.5):o:[]}})}function cS(e,t){return queryOptions({queryKey:c.communities.context(e,t),enabled:!!e&&!!t,queryFn:async()=>{let r=await g("bridge.get_community_context",{account:e,name:t});return {role:r?.role??"guest",subscribed:r?.subscribed??false}}})}function fS(e,t="",r=true){return queryOptions({queryKey:c.communities.single(e,t),enabled:r&&!!e,queryFn:async()=>fi(e??"",t)})}var Gi=100;async function zi(e,t){return await g("bridge.list_subscribers",{community:e,limit:Gi,...t?{last:t}:{}})??[]}function _S(e){return queryOptions({queryKey:c.communities.subscribers(e),queryFn:async()=>zi(e,null),staleTime:6e4})}function bS(e){return infiniteQueryOptions({queryKey:c.communities.subscribersInfinite(e),initialPageParam:null,queryFn:async({pageParam:t})=>zi(e,t),getNextPageParam:t=>t?.length>=Gi?t[t.length-1]?.[0]??null:null,staleTime:6e4})}function ES(e,t){return infiniteQueryOptions({queryKey:c.communities.accountNotifications(e,t),initialPageParam:null,queryFn:async({pageParam:r})=>await g("bridge.account_notifications",{account:e,limit:t,last_id:r??void 0})??[],getNextPageParam:r=>r?.length>=t?r[r.length-1].id:null})}function TS(){return queryOptions({queryKey:c.communities.rewarded(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/rewarded-communities",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch rewarded communities: ${e.status}`);return e.json()}})}var Bp=(s=>(s.OWNER="owner",s.ADMIN="admin",s.MOD="mod",s.MEMBER="member",s.GUEST="guest",s.MUTED="muted",s))(Bp||{}),FS={owner:["admin","mod","member","guest","muted"],admin:["mod","member","guest","muted"],mod:["member","guest","muted"]};function IS(e,t){return e.startsWith("hive-3")||t===3?"Council":e.startsWith("hive-2")||t===2?"Journal":"Topic"}function DS({communityType:e,userRole:t,subscribed:r}){let n=t==="muted"?false:e==="Topic"?true:["owner","admin","mod","member"].includes(t),i=(()=>{if(t==="muted")return false;switch(e){case "Topic":return true;case "Journal":return t!=="guest"||r;case "Council":return n}})(),o=["owner","admin","mod"].includes(t);return {canPost:n,canComment:i,isModerator:o}}function NS(e,t){return queryOptions({queryKey:c.notifications.unreadCount(e),queryFn:async()=>t?(await(await fetch(`${d.privateApiHost}/private-api/notifications/unread`,{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json()).count:0,enabled:!!e&&!!t,initialData:0,refetchInterval:6e4})}function VS(e,t,r=void 0){return infiniteQueryOptions({queryKey:c.notifications.list(e,r),queryFn:async({pageParam:n})=>{if(!t)return [];let i={code:t,filter:r,since:n,user:void 0},o=await fetch(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!o.ok)return [];try{return await o.json()}catch{return []}},enabled:!!e&&!!t,initialData:{pages:[],pageParams:[]},initialPageParam:"",getNextPageParam:n=>n?.[n.length-1]?.id??"",refetchOnMount:true})}var Qp=(y=>(y.VOTES="rvotes",y.MENTIONS="mentions",y.FAVORITES="nfavorites",y.BOOKMARKS="nbookmarks",y.FOLLOWS="follows",y.REPLIES="replies",y.REBLOGS="reblogs",y.TRANSFERS="transfers",y.DELEGATIONS="delegations",y.PAYOUTS="payouts",y.SCHEDULED_PUBLISHED="scheduled_published",y.ACCOUNT_UPDATES="account_updates",y.WEEKLY_EARNINGS="weekly_earnings",y))(Qp||{});var Hp=(h=>(h[h.VOTE=1]="VOTE",h[h.MENTION=2]="MENTION",h[h.FOLLOW=3]="FOLLOW",h[h.COMMENT=4]="COMMENT",h[h.RE_BLOG=5]="RE_BLOG",h[h.TRANSFERS=6]="TRANSFERS",h[h.DELEGATIONS=10]="DELEGATIONS",h[h.FAVORITES=13]="FAVORITES",h[h.BOOKMARKS=15]="BOOKMARKS",h[h.PAYOUTS=19]="PAYOUTS",h[h.ACCOUNT_UPDATE=20]="ACCOUNT_UPDATE",h[h.WEEKLY_EARNINGS=21]="WEEKLY_EARNINGS",h[h.SCHEDULED_PUBLISHED=22]="SCHEDULED_PUBLISHED",h.ALLOW_NOTIFY="ALLOW_NOTIFY",h))(Hp||{}),Ji=[1,2,3,4,5,6,10,13,15,19,20,21,22],Up=(n=>(n.ALL="All",n.UNREAD="Unread",n.READ="Read",n))(Up||{});function JS(e,t,r){return queryOptions({queryKey:c.notifications.settings(e),queryFn:async()=>{let n=e+"-web";if(!t)throw new Error("Missing access token");let i=await fetch(d.privateApiHost+"/private-api/detail-device",{body:JSON.stringify({code:t,username:e,token:n}),method:"POST",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch notification settings: ${i.status}`);return i.json()},enabled:!!e&&!!t,refetchOnMount:false,initialData:()=>({status:0,system:"web",allows_notify:0,notify_types:r?[]:[...Ji]})})}function ek(){return queryOptions({queryKey:c.notifications.announcements(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/announcements",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch announcements: ${e.status}`);return await e.json()||[]},staleTime:36e5})}function ik(e){return queryOptions({queryKey:c.notifications.spotlights(),queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/spotlights",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch spotlights: ${t.status}`);return await t.json()||[]},staleTime:36e5})}function Wp(e,t){return {...e,read:!t||t===e.id?1:e.read}}function Yi(e){return typeof e=="object"&&e!==null&&"pages"in e&&"pageParams"in e&&Array.isArray(e.pages)}function lk(e,t,r,n){let i=b();return useMutation({mutationKey:["notifications","mark-read",e],mutationFn:async({id:o})=>{if(!(!e||!t))return Ii(t,o)},onMutate:async({id:o})=>{if(!e||!t)return {previousData:[]};await i.cancelQueries({queryKey:c.notifications._prefix});let s=[],a=i.getQueriesData({queryKey:c.notifications._prefix,predicate:l=>{let f=l.state.data;return Yi(f)}});a.forEach(([l,f])=>{if(f&&Yi(f)){s.push([l,f]);let m={...f,pages:f.pages.map(y=>y.map(h=>Wp(h,o)))};i.setQueryData(l,m);}});let u=c.notifications.unreadCount(e),p=i.getQueryData(u);return typeof p=="number"&&p>0&&(s.push([u,p]),o?a.some(([,f])=>f?.pages.some(m=>m.some(y=>y.id===o&&y.read===0)))&&i.setQueryData(u,p-1):i.setQueryData(u,0)),{previousData:s}},onSuccess:o=>{let s=typeof o=="object"&&o!==null?o.unread:void 0;typeof s=="number"&&i.setQueryData(c.notifications.unreadCount(e),s),r?.(s);},onError:(o,s,a)=>{a?.previousData&&a.previousData.forEach(([u,p])=>{i.setQueryData(u,p);}),n?.(o);},onSettled:()=>{i.invalidateQueries({queryKey:c.notifications._prefix});}})}function gk(e,t,r){return v(["notifications","set-last-read"],e,({date:n})=>Ar(e,n),async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.notifications.unreadCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function _k(e){return queryOptions({queryKey:["proposals","proposal",e],queryFn:async()=>{let r=(await g("condenser_api.find_proposals",[[e]]))[0];return new Date(r.start_date)=new Date?r.status="active":new Date(r.end_date){let t=(await g("database_api.list_proposals",{start:[-1],limit:500,order:"by_total_votes",order_direction:"descending",status:"all"})).proposals,r=t.filter(i=>i.status==="expired");return [...t.filter(i=>i.status!=="expired"),...r]}})}function Ck(e,t,r){return infiniteQueryOptions({queryKey:["proposals","votes",e,t,r],initialPageParam:t,refetchOnMount:true,staleTime:0,queryFn:async({pageParam:n})=>{let s=(await g("condenser_api.list_proposal_votes",[[e,n??t],r,"by_proposal_voter"])).filter(l=>l.proposal?.proposal_id===e).map(l=>({id:l.id,voter:l.voter})),a=await g("condenser_api.get_accounts",[s.map(l=>l.voter)]),u=Tt(a);return s.map(l=>({...l,voterAccount:u.find(f=>l.voter===f.name)}))},getNextPageParam:n=>n?.[n.length-1]?.voter??void 0})}function qk(e){return queryOptions({queryKey:["proposals","votes","by-user",e],enabled:!!e&&e!=="",staleTime:60*1e3,queryFn:async()=>!e||e===""?[]:((await g("database_api.list_proposal_votes",{start:[e],limit:1e3,order:"by_voter_proposal",order_direction:"ascending",status:"votable"})).proposal_votes||[]).filter(n=>n.voter===e)})}function Bk(e,t,r){return v(["proposals","vote"],e,({proposalIds:n,approve:i})=>[Er(e,n,i)],async n=>{try{let i=n?.id??n?.tx_id;t?.adapter?.recordActivity&&i&&t.adapter.recordActivity(150,i,n?.block_num).catch(o=>{console.debug("[SDK][Proposals][useProposalVote] recordActivity failed",{activityType:150,blockNum:n?.block_num,transactionId:i,error:o});}),t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.proposals.list(),c.proposals.votesByUser(e)]);}catch(i){console.warn("[useProposalVote] Post-broadcast side-effect failed:",i);}},t,"active",{broadcastMode:r})}function Hk(e,t,r){return v(["proposals","create"],e,n=>[xr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.proposals.list()]);},t,"active",{broadcastMode:r})}function Lk(e,t=50){return infiniteQueryOptions({queryKey:["wallet","vesting-delegations",e,t],initialPageParam:"",queryFn:async({pageParam:r})=>{let n=r?t+1:t,i=await g("condenser_api.get_vesting_delegations",[e,r||"",n]);return r&&i.length>0&&i[0]?.delegatee===r?i.slice(1,t+1):i},getNextPageParam:r=>!r||r.lengthre("balance","/accounts/{account-name}/delegations",{"account-name":e},void 0,void 0,t)})}function Zk(e){return queryOptions({queryKey:["wallet","vesting-delegation-expirations",e],queryFn:async()=>e?(await g("database_api.find_vesting_delegation_expirations",{account:e})).delegations:[],enabled:!!e})}function nC(e){return queryOptions({queryKey:["wallet","conversion-requests",e],queryFn:()=>g("condenser_api.get_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function aC(e){return queryOptions({queryKey:["wallet","collateralized-conversion-requests",e],queryFn:()=>g("condenser_api.get_collateralized_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function lC(e){return queryOptions({queryKey:["wallet","savings-withdraw",e],queryFn:()=>g("condenser_api.get_savings_withdraw_from",[e]),select:t=>t.sort((r,n)=>r.request_id-n.request_id)})}function gC(e){return queryOptions({queryKey:["wallet","withdraw-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"])})}function _C(e){return queryOptions({queryKey:["wallet","open-orders",e],queryFn:()=>g("condenser_api.get_open_orders",[e]),select:t=>t.sort((r,n)=>r.orderid-n.orderid),enabled:!!e})}function OC(e,t=100){return infiniteQueryOptions({queryKey:["wallet","outgoing-rc-delegations",e,t],initialPageParam:null,queryFn:async({pageParam:r})=>{let i=(await g("rc_api.list_rc_direct_delegations",{start:[e,r??""],limit:t}).then(o=>o)).rc_direct_delegations||[];return r&&(i=i.filter(o=>o.to!==r)),i},getNextPageParam:r=>r.length===t?r[r.length-1].to:null})}function kC(e){return queryOptions({queryKey:["wallet","incoming-rc",e],enabled:!!e,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] - Missing username for incoming RC");let r=await w()(`${d.privateApiHost}/private-api/received-rc/${e}`);if(!r.ok)throw new Error(`Failed to fetch incoming RC: ${r.status}`);return r.json()}})}function FC(e){return queryOptions({queryKey:["wallet","received-vesting-shares",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`);if(!t.ok)throw new Error(`Failed to fetch received vesting shares: ${t.status}`);return (await t.json()).list}})}function KC(e){return queryOptions({queryKey:["wallet","recurrent-transfers",e],queryFn:()=>g("condenser_api.find_recurrent_transfers",[e]),enabled:!!e})}function fe(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}}function ue(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return;let r=Number.parseFloat(t);if(Number.isFinite(r))return r;let i=t.replace(/,/g,"").match(/[-+]?\d+(?:\.\d+)?/);if(i){let o=Number.parseFloat(i[0]);if(Number.isFinite(o))return o}}}function ll(e){if(!e||typeof e!="object")return;let t=e;return {name:fe(t.name)??"",symbol:fe(t.symbol)??"",layer:fe(t.layer)??"hive",balance:ue(t.balance)??0,fiatRate:ue(t.fiatRate)??0,currency:fe(t.currency)??"usd",precision:ue(t.precision)??3,address:fe(t.address),error:fe(t.error),pendingRewards:ue(t.pendingRewards),pendingRewardsFiat:ue(t.pendingRewardsFiat),liquid:ue(t.liquid),liquidFiat:ue(t.liquidFiat),savings:ue(t.savings),savingsFiat:ue(t.savingsFiat),staked:ue(t.staked),stakedFiat:ue(t.stakedFiat),iconUrl:fe(t.iconUrl),actions:t.actions??[],extraData:t.extraData??[],apr:ue(t.apr)}}function dl(e){if(!e||typeof e!="object")return [];let t=[e],r=e;r.data&&typeof r.data=="object"&&t.push(r.data),r.result&&typeof r.result=="object"&&t.push(r.result),r.portfolio&&typeof r.portfolio=="object"&&t.push(r.portfolio);for(let n of t){if(Array.isArray(n))return n;if(n&&typeof n=="object")for(let i of ["wallets","tokens","assets","items","portfolio","balances"]){let o=n[i];if(Array.isArray(o))return o}}return []}function fl(e){if(!e||typeof e!="object")return;let t=e;return fe(t.username)??fe(t.name)??fe(t.account)}function Xi(e,t="usd",r=true){return queryOptions({queryKey:["wallet","portfolio","v2",e,r?"only-enabled":"all",t],enabled:!!e,staleTime:6e4,refetchInterval:12e4,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] \u2013 username is required");let n=`${N.getValidatedBaseUrl()}/wallet-api/portfolio-v2`,i=await fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({username:e,onlyEnabled:r,currency:t})});if(!i.ok)throw new Error(`[SDK][Wallet] \u2013 Portfolio request failed (${i.status})`);let o=await i.json(),s=dl(o).map(a=>ll(a)).filter(a=>!!a).filter(a=>a.layer!=="spk");if(!s.length)throw new Error("[SDK][Wallet] \u2013 Portfolio payload contained no tokens");return {username:fl(o)??e,currency:fe(o?.fiatCurrency??o?.currency)?.toUpperCase(),wallets:s}}})}function Mt(e){return queryOptions({queryKey:["assets","hive","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(Ae()),await b().prefetchQuery(Q(e));let t=b().getQueryData(Ae().queryKey),r=b().getQueryData(Q(e).queryKey),n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??"");if(!r)return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:0};let o=T(r.balance).amount,s=T(r.savings_balance).amount;return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:o+s,parts:[{name:"current",balance:o},{name:"savings",balance:s}]}}})}function Zi(e){return queryOptions({queryKey:["assets","hbd","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(Ae()),await b().prefetchQuery(Q(e));let t=b().getQueryData(Q(e).queryKey),r=b().getQueryData(Ae().queryKey),n=1;return t?{name:"HBD",title:"Hive Dollar",price:n,accountBalance:T(t.hbd_balance).amount+T(t?.savings_hbd_balance).amount,apr:((r?.hbdInterestRate??0)/100).toFixed(3),parts:[{name:"current",balance:T(t.hbd_balance).amount},{name:"savings",balance:T(t.savings_hbd_balance).amount}]}:{name:"HBD",title:"Hive Dollar",price:n,accountBalance:0}}})}function hl(e){let u=9.5-(e.headBlock-7e6)/25e4*.01;u<.95&&(u=.95);let p=e.vestingRewardPercent/1e4,l=e.virtualSupply,f=e.totalVestingFund;return (l*u*p/f).toFixed(3)}function eo(e){return queryOptions({queryKey:["assets","hive-power","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(Ae()),await b().prefetchQuery(Q(e));let t=b().getQueryData(Ae().queryKey),r=b().getQueryData(Q(e).queryKey);if(!t||!r)return {name:"HP",title:"Hive Power",price:0,accountBalance:0};let n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??""),o=Number.isFinite(i)?i:t.base/t.quote,s=T(r.vesting_shares).amount,a=T(r.delegated_vesting_shares).amount,u=T(r.received_vesting_shares).amount,p=T(r.vesting_withdraw_rate).amount,l=Math.max((Number(r.to_withdraw)-Number(r.withdrawn))/1e6,0),f=Yn(r.next_vesting_withdrawal)?0:Math.min(p,l),m=+je(s,t.hivePerMVests).toFixed(3),y=+je(a,t.hivePerMVests).toFixed(3),h=+je(u,t.hivePerMVests).toFixed(3),S=+je(l,t.hivePerMVests).toFixed(3),x=+je(f,t.hivePerMVests).toFixed(3),P=Math.max(m-S,0),O=Math.max(m-y,0);return {name:"HP",title:"Hive Power",price:o,accountBalance:+P.toFixed(3),apr:hl(t),parts:[{name:"hp_balance",balance:m},{name:"available",balance:+O.toFixed(3)},{name:"outgoing_delegations",balance:y},{name:"incoming_delegations",balance:h},...S>0?[{name:"pending_power_down",balance:+S.toFixed(3)}]:[],...x>0&&x!==S?[{name:"next_power_down",balance:+x.toFixed(3)}]:[]]}}})}var B=ie.operations,Gr={transfers:[B.transfer,B.transfer_to_savings,B.transfer_from_savings,B.cancel_transfer_from_savings,B.recurrent_transfer,B.fill_recurrent_transfer,B.escrow_transfer,B.fill_recurrent_transfer],"market-orders":[B.fill_convert_request,B.fill_order,B.fill_collateralized_convert_request,B.limit_order_create2,B.limit_order_create,B.limit_order_cancel],interests:[B.interest],"stake-operations":[B.return_vesting_delegation,B.withdraw_vesting,B.transfer_to_vesting,B.set_withdraw_vesting_route,B.update_proposal_votes,B.fill_vesting_withdraw,B.account_witness_proxy,B.delegate_vesting_shares],rewards:[B.author_reward,B.curation_reward,B.producer_reward,B.claim_reward_balance,B.comment_benefactor_reward,B.liquidity_reward,B.proposal_pay],"":[]};var aT=Object.keys(ie.operations);var to=ie.operations,pT=to,lT=Object.entries(to).reduce((e,[t,r])=>(e[r]=t,e),{});var ro=ie.operations;function _l(e){return Object.prototype.hasOwnProperty.call(ro,e)}function lt(e){let t=Array.isArray(e)?e:[e],r=t.includes(""),n=Array.from(new Set(t.filter(a=>a!=null&&a!==""))),i=r||n.length===0?"all":n.map(a=>a.toString()).sort().join("|"),o=new Set;r||n.forEach(a=>{if(a in Gr){Gr[a].forEach(u=>o.add(u));return}_l(a)&&o.add(ro[a]);});let s=bl(Array.from(o));return {filterKey:i,filterArgs:s}}function bl(e){let t=0n,r=0n;return e.forEach(n=>{n<64?t|=1n<o?+(o[o.length-1]?.num??0)-1:-1,queryFn:async({pageParam:o})=>(await g("condenser_api.get_account_history",[e,o,t,...n])).map(a=>({num:a[0],type:a[1].op[0],timestamp:a[1].timestamp,trx_id:a[1].trx_id,...a[1].op[1]})),select:({pages:o,pageParams:s})=>({pageParams:s,pages:o.map(a=>a.filter(u=>{switch(u.type){case "author_reward":case "comment_benefactor_reward":return T(u.hive_payout).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return T(u.amount).symbol==="HIVE";case "transfer_from_savings":return T(u.amount).symbol==="HIVE";case "fill_recurrent_transfer":let l=T(u.amount);return ["HIVE"].includes(l.symbol);case "claim_reward_balance":return T(u.reward_hive).amount>0;case "curation_reward":case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":return true;case "limit_order_create2":return true;default:return false}}))})})}function AT(e,t=20,r=[]){let{filterKey:n}=lt(r);return infiniteQueryOptions({...Nt(e,t,r),queryKey:["assets","hbd","transactions",e,t,n],select:({pages:i,pageParams:o})=>({pageParams:o,pages:i.map(s=>s.filter(a=>{switch(a.type){case "author_reward":case "comment_benefactor_reward":return T(a.hbd_payout).amount>0;case "claim_reward_balance":return T(a.reward_hbd).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return T(a.amount).symbol==="HBD";case "transfer_from_savings":return T(a.amount).symbol==="HBD";case "fill_recurrent_transfer":let l=T(a.amount);return ["HBD"].includes(l.symbol);case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":case "proposal_pay":case "interest":return true;case "limit_order_create2":return true;default:return false}}))})})}function ST(e,t=20,r=[]){let{filterKey:n}=lt(r),i=new Set(Array.isArray(r)?r:[r]),o=i.has("")||i.size===0;return infiniteQueryOptions({...Nt(e,t,r),queryKey:["assets","hive-power","transactions",e,t,n],select:({pages:s,pageParams:a})=>({pageParams:a,pages:s.map(u=>u.filter(p=>{switch(p.type){case "author_reward":case "comment_benefactor_reward":return T(p.vesting_payout).amount>0;case "claim_reward_balance":return T(p.reward_vests).amount>0;case "transfer_to_vesting":return true;case "transfer":case "transfer_to_savings":case "recurrent_transfer":return ["VESTS","HP"].includes(T(p.amount).symbol);case "fill_recurrent_transfer":let m=T(p.amount);return ["VESTS","HP"].includes(m.symbol);case "curation_reward":case "withdraw_vesting":case "delegate_vesting_shares":case "fill_vesting_withdraw":case "return_vesting_delegation":case "producer_reward":case "set_withdraw_vesting_route":return true;default:return o||i.has(p.type)}}))})})}function no(e){let t=r=>r.toString().padStart(2,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function zr(e,t){return new Date(e.getTime()-t*1e3)}function RT(e=86400){return infiniteQueryOptions({queryKey:["assets","hive","metrics",e],queryFn:async({pageParam:[t,r]})=>(await g("condenser_api.get_market_history",[e,no(t),no(r)])).map(({hive:i,non_hive:o,open:s})=>({close:o.close/i.close,open:o.open/i.open,low:o.low/i.low,high:o.high/i.high,volume:i.volume,time:new Date(s)})),initialPageParam:[zr(new Date,Math.max(100*e,28800)),new Date],getNextPageParam:(t,r,[n])=>[zr(n,Math.max(100*e,28800)),zr(n,e)]})}function DT(e){return queryOptions({queryKey:["assets","hive","withdrawal-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"]),enabled:!!e})}function NT(e,t=50){return queryOptions({queryKey:["assets","hive-power","delegates",e],enabled:!!e,queryFn:()=>g("condenser_api.get_vesting_delegations",[e,"",t])})}function jT(e){return queryOptions({queryKey:["assets","hive-power","delegatings",e],queryFn:async()=>(await(await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`,{headers:{"Content-Type":"application/json"}})).json()).list,select:t=>t.sort((r,n)=>T(n.vesting_shares).amount-T(r.vesting_shares).amount)})}function GT(e=500){return queryOptions({queryKey:["market","order-book",e],queryFn:()=>g("condenser_api.get_order_book",[e])})}function XT(){return queryOptions({queryKey:["market","statistics"],queryFn:()=>g("condenser_api.get_ticker",[])})}function rR(e,t,r){let n=i=>i.toISOString().replace(/\.\d{3}Z$/,"");return queryOptions({queryKey:["market","history",e,t.getTime(),r.getTime()],queryFn:()=>g("condenser_api.get_market_history",[e,n(t),n(r)])})}function sR(){return queryOptions({queryKey:["market","hive-hbd-stats"],queryFn:async()=>{let e=await g("condenser_api.get_ticker",[]),t=new Date,r=new Date(t.getTime()-864e5),n=s=>s.toISOString().replace(/\.\d{3}Z$/,""),i=await g("condenser_api.get_market_history",[86400,n(r),n(t)]);return {price:+e.latest,close:i[0]?i[0].non_hive.open/i[0].hive.open:0,high:i[0]?i[0].non_hive.high/i[0].hive.high:0,low:i[0]?i[0].non_hive.low/i[0].hive.low:0,percent:i[0]?100-i[0].non_hive.open/i[0].hive.open*100/+e.latest:0,totalFromAsset:e.hive_volume.split(" ")[0],totalToAsset:e.hbd_volume.split(" ")[0]}}})}function pR(e,t,r,n){return queryOptions({queryKey:["market","data",e,t,r,n],queryFn:async({signal:i})=>{let o=w(),s=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,a=await o(s,{signal:i});if(!a.ok)throw new Error(`Failed to fetch market data: ${a.status}`);return a.json()}})}function io(e){return e.toISOString().replace(/\.\d{3}Z$/,"")}function mR(e=1e3,t,r){let n=r??new Date,i=t??new Date(n.getTime()-600*60*1e3);return queryOptions({queryKey:["market","trade-history",e,i.getTime(),n.getTime()],queryFn:()=>g("condenser_api.get_trade_history",[io(i),io(n),e])})}function wR(){return queryOptions({queryKey:["market","feed-history"],queryFn:async()=>{try{return await g("condenser_api.get_feed_history",[])}catch(e){throw e}}})}function AR(){return queryOptions({queryKey:["market","current-median-history-price"],queryFn:async()=>{try{return await g("condenser_api.get_current_median_history_price",[])}catch(e){throw e}}})}function ER(e,t,r){return v(["market","limit-order-create"],e,n=>[It(e,n.amountToSell,n.minToReceive,n.fillOrKill,n.expiration,n.orderId)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function TR(e,t,r){return v(["market","limit-order-cancel"],e,({orderId:n})=>[qr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}async function dt(e){let t=await e.json();if(!e.ok){let r=new Error(`Request failed with status ${e.status}`);throw r.status=e.status,r.data=t,r}return t}async function qR(e,t,r,n){let i=w(),o=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,s=await i(o);return dt(s)}async function oo(e){if(e==="hbd")return 1;let t=w(),r=`https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${e}`,n=await t(r);return (await dt(n)).hive_dollar[e]}async function IR(e,t){let n=await w()(d.privateApiHost+`/private-api/market-data/${e==="hbd"?"usd":e}/${t}`);return dt(n)}async function DR(){let t=await w()(d.privateApiHost+"/private-api/market-data/latest");return dt(t)}async function KR(){let t=await w()("https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd");return dt(t)}var Dl={"Content-type":"application/json"};async function Kl(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-api`,{method:"POST",body:JSON.stringify(e),headers:Dl});if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 request failed with ${n.status}`);return (await n.json()).result}async function ke(e,t){try{return await Kl(e)}catch{return t}}async function NR(e,t=50){let r={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:e},limit:t,offset:0},id:1},[n,i]=await Promise.all([ke({...r,params:{...r.params,table:"buyBook",indexes:[{index:"price",descending:true}]}},[]),ke({...r,params:{...r.params,table:"sellBook",indexes:[{index:"price",descending:false}]}},[])]),o=a=>a.sort((u,p)=>{let l=Number(u.price??0);return Number(p.price??0)-l}),s=a=>a.sort((u,p)=>{let l=Number(u.price??0),f=Number(p.price??0);return l-f});return {buy:o(n),sell:s(i)}}async function QR(e,t=50){return ke({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"tradesHistory",query:{symbol:e},limit:t,offset:0,indexes:[{index:"timestamp",descending:true}]},id:1},[])}async function HR(e,t,r=100){let n={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:t,account:e},limit:r,offset:0},id:1},[i,o]=await Promise.all([ke({...n,params:{...n.params,table:"buyBook",indexes:[{index:"timestamp",descending:true}]}},[]),ke({...n,params:{...n.params,table:"sellBook",indexes:[{index:"timestamp",descending:true}]}},[])]),s=(p,l)=>(Number(p||0)*Number(l||0)).toFixed(8),a=i.map(p=>({id:p.txId,type:"buy",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:p.tokensLocked??s(p.quantity,p.price),timestamp:Number(p.timestamp??0)})),u=o.map(p=>({id:p.txId,type:"sell",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:s(p.quantity,p.price),timestamp:Number(p.timestamp??0)}));return [...a,...u].sort((p,l)=>l.timestamp-p.timestamp)}async function Bl(e,t){if(Array.isArray(e)&&e.length===0)return [];let r=Array.isArray(e)?{symbol:{$in:e}}:e?{symbol:e}:{};return ke({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"metrics",query:{...r,...t?{account:t}:{}}},id:1},[])}async function ze(e,t){return Bl(t,e)}async function Qt(e){return ke({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"balances",query:{account:e}},id:1},[])}async function Ht(e){return ke({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"tokens",query:{symbol:{$in:e}}},id:2},[])}async function so(e,t,r,n){let i=w(),o=N.getValidatedBaseUrl(),s=new URL("/private-api/engine-account-history",o);s.searchParams.set("account",e),s.searchParams.set("symbol",t),s.searchParams.set("limit",r.toString()),s.searchParams.set("offset",n.toString());let a=await i(s.toString(),{method:"GET",headers:{"Content-type":"application/json"}});if(!a.ok)throw new Error(`[SDK][HiveEngine] \u2013 account history failed with ${a.status}`);return await a.json()}async function ao(e,t="daily"){let r=w(),n=N.getValidatedBaseUrl(),i=new URL("/private-api/engine-chart-api",n);i.searchParams.set("symbol",e),i.searchParams.set("interval",t);let o=await r(i.toString(),{headers:{"Content-type":"application/json"}});if(!o.ok)throw new Error(`[SDK][HiveEngine] \u2013 chart failed with ${o.status}`);return await o.json()}async function co(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-reward-api/${e}?hive=1`);if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 rewards failed with ${n.status}`);return await n.json()}function Ut(e){return queryOptions({queryKey:["assets","hive-engine","balances",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Qt(e)})}function GR(){return queryOptions({queryKey:["assets","hive-engine","markets"],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>ze()})}function uo(e){return queryOptions({queryKey:["assets","hive-engine","metadata-list",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Ht(e)})}function tF(e,t,r=20){return infiniteQueryOptions({queryKey:["assets","hive-engine",t,"transactions",e],enabled:!!t&&!!e,initialPageParam:0,queryFn:async({pageParam:n})=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");return so(e,t,r,n)},getNextPageParam:(n,i,o)=>(n?.length??0)===r?o+r:void 0,getPreviousPageParam:(n,i,o)=>o>0?o-r:void 0})}function oF(e,t="daily"){return queryOptions({queryKey:["assets","hive-engine",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>ao(e,t)})}function uF(e){return queryOptions({queryKey:["assets","hive-engine","unclaimed",e],staleTime:6e4,refetchInterval:9e4,enabled:!!e,queryFn:async()=>{try{let t=await co(e);return Object.values(t).filter(({pending_token:r})=>r>0)}catch{return []}}})}function po(e,t){return queryOptions({queryKey:["assets","hive-engine","all-tokens",e,t],queryFn:async()=>ze(e,t)})}function Je(e,t=void 0){let r={fractionDigits:3,prefix:"",suffix:""};t&&(r={...r,...t});let{fractionDigits:n,prefix:i,suffix:o}=r,s="";i&&(s+=i+" ");let a=Math.abs(parseFloat(e.toString()))<1e-4?0:e,u=typeof a=="string"?parseFloat(a):a;return s+=u.toLocaleString("en-US",{minimumFractionDigits:n,maximumFractionDigits:n,useGrouping:true}),o&&(s+=" "+o),s}var Vt=class{constructor(t){A(this,"symbol");A(this,"name");A(this,"icon");A(this,"precision");A(this,"stakingEnabled");A(this,"delegationEnabled");A(this,"balance");A(this,"stake");A(this,"stakedBalance");A(this,"delegationsIn");A(this,"delegationsOut");A(this,"usdValue");A(this,"hasDelegations",()=>this.delegationEnabled?this.delegationsIn>0&&this.delegationsOut>0:false);A(this,"delegations",()=>this.hasDelegations()?`(${Je(this.stake,{fractionDigits:this.precision})} + ${Je(this.delegationsIn,{fractionDigits:this.precision})} - ${Je(this.delegationsOut,{fractionDigits:this.precision})})`:"");A(this,"staked",()=>this.stakingEnabled?this.stakedBalance<1e-4?this.stakedBalance.toString():Je(this.stakedBalance,{fractionDigits:this.precision}):"-");A(this,"balanced",()=>this.balance<1e-4?this.balance.toString():Je(this.balance,{fractionDigits:this.precision}));this.symbol=t.symbol,this.name=t.name||"",this.icon=t.icon||"",this.precision=t.precision||0,this.stakingEnabled=t.stakingEnabled||false,this.delegationEnabled=t.delegationEnabled||false,this.balance=parseFloat(t.balance)||0,this.stake=parseFloat(t.stake)||0,this.delegationsIn=parseFloat(t.delegationsIn)||0,this.delegationsOut=parseFloat(t.delegationsOut)||0,this.stakedBalance=this.stake+this.delegationsIn-this.delegationsOut,this.usdValue=t.usdValue;}};function vF(e,t,r){return queryOptions({queryKey:["assets","hive-engine","balances-with-usd",e,t,r],queryFn:async()=>{if(!e)throw new Error("[HiveEngine] No account in a balances query");let n=await Qt(e),i=await Ht(n.map(p=>p.symbol)),o=t?t.base/t.quote:0,s=Array.isArray(r)?r:[],a=n.map(p=>p.symbol).filter(p=>p!=="SWAP.HIVE"&&!s.some(l=>l.symbol===p)),u=[...s,...a.length?await ze(void 0,a):[]];return n.map(p=>{let l=i.find(x=>x.symbol===p.symbol),f;if(l?.metadata)try{f=JSON.parse(l.metadata);}catch{f=void 0;}let m=u.find(x=>x.symbol===p.symbol),y=Number(m?.lastPrice??"0"),h=Number(p.balance),S=p.symbol==="SWAP.HIVE"?o*h:y===0?0:Number((y*o*h).toFixed(10));return new Vt({symbol:p.symbol,name:l?.name??p.symbol,icon:f?.icon??"",precision:l?.precision??0,stakingEnabled:l?.stakingEnabled??false,delegationEnabled:l?.delegationEnabled??false,balance:p.balance,stake:p.stake,delegationsIn:p.delegationsIn,delegationsOut:p.delegationsOut,usdValue:S})})},enabled:!!e})}function lo(e,t){return queryOptions({queryKey:["assets","hive-engine",t,"general-info",e],enabled:!!t&&!!e,staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");let r=b(),n=Mt(e);await r.prefetchQuery(n);let i=r.getQueryData(n.queryKey),o=await r.ensureQueryData(uo([t])),s=await r.ensureQueryData(Ut(e)),a=await r.ensureQueryData(po(void 0,t)),u=o?.find(x=>x.symbol===t),p=s?.find(x=>x.symbol===t),f=+(a?.find(x=>x.symbol===t)?.lastPrice??"0"),m=parseFloat(p?.balance??"0"),y=parseFloat(p?.stake??"0"),h=parseFloat(p?.pendingUnstake??"0"),S=[{name:"liquid",balance:m},{name:"staked",balance:y}];return h>0&&S.push({name:"unstaking",balance:h}),{name:t,title:u?.name??"",price:f===0?0:Number(f*(i?.price??0)),accountBalance:m+y,layer:"ENGINE",parts:S}}})}function ft(e,t=0){return queryOptions({queryKey:["points",e,t],queryFn:async()=>{if(!e)throw new Error("Get points query \u2013 username wasn't provided");let r=e.replace("@",""),n=await fetch(d.privateApiHost+"/private-api/points",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r})});if(!n.ok)throw new Error(`Failed to fetch points: ${n.status}`);let i=await n.json(),o=await fetch(d.privateApiHost+"/private-api/point-list",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,type:t})});if(!o.ok)throw new Error(`Failed to fetch point transactions: ${o.status}`);let s=await o.json();return {points:i.points,uPoints:i.unclaimed_points,transactions:s}},staleTime:3e4,refetchOnMount:true,enabled:!!e})}function fo(e){return queryOptions({queryKey:["assets","points","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>(await b().prefetchQuery(ft(e)),{name:"POINTS",title:"Ecency Points",price:.002,accountBalance:+(b().getQueryData(ft(e).queryKey)?.points??0)})})}function NF(e,t){return queryOptions({queryKey:["assets","points","transactions",e,t],queryFn:async()=>(await(await fetch(`${d.privateApiHost}/private-api/point-list`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,type:t??0})})).json()).map(({created:i,type:o,amount:s,id:a,sender:u,receiver:p,memo:l})=>({created:new Date(i),type:o,results:[{amount:parseFloat(s),asset:"POINTS"}],id:a,from:u??void 0,to:p??void 0,memo:l??void 0}))})}function YF(e,t,r={refetch:false}){let n=b(),i=r.currency??"usd",o=async p=>(r.refetch?await n.fetchQuery(p):await n.prefetchQuery(p),n.getQueryData(p.queryKey)),s=async p=>{if(!p||i==="usd")return p;try{let l=await oo(i);return {...p,price:p.price*l}}catch(l){return console.warn(`Failed to convert price from USD to ${i}:`,l),p}},a=Xi(e,i,true),u=async()=>{try{let l=(await n.fetchQuery(a)).wallets.find(m=>m.symbol.toUpperCase()===t.toUpperCase());if(!l)return;let f=[];if(l.liquid!==void 0&&l.liquid!==null&&f.push({name:"liquid",balance:l.liquid}),l.staked!==void 0&&l.staked!==null&&l.staked>0&&f.push({name:"staked",balance:l.staked}),l.savings!==void 0&&l.savings!==null&&l.savings>0&&f.push({name:"savings",balance:l.savings}),l.extraData&&Array.isArray(l.extraData))for(let m of l.extraData){if(!m||typeof m!="object")continue;let y=m.dataKey,h=m.value;if(typeof h=="string"){let x=h.replace(/,/g,"").match(/[+-]?\s*(\d+(?:\.\d+)?)/);if(x){let P=Math.abs(Number.parseFloat(x[1]));y==="delegated_hive_power"?f.push({name:"outgoing_delegations",balance:P}):y==="received_hive_power"?f.push({name:"incoming_delegations",balance:P}):y==="powering_down_hive_power"&&f.push({name:"pending_power_down",balance:P});}}}return {name:l.symbol,title:l.name,price:l.fiatRate,accountBalance:l.balance,apr:l.apr?.toString(),layer:l.layer,pendingRewards:l.pendingRewards,parts:f}}catch{return}};return queryOptions({queryKey:["ecency-wallets","asset-info",e,t,i],queryFn:async()=>{let p=await u();if(p&&p.price>0)return p;let l;if(t==="HIVE")l=await o(Mt(e));else if(t==="HP")l=await o(eo(e));else if(t==="HBD")l=await o(Zi(e));else if(t==="POINTS")l=await o(fo(e));else if((await n.ensureQueryData(Ut(e))).some(m=>m.symbol===t))l=await o(lo(e,t));else {if(p)return p;throw new Error(`[SDK][Wallet] \u2013 unrecognized asset "${t}"`)}if(p&&l&&l.price>0){let f=await s(l);return {...p,price:f.price}}return await s(l)}})}var Yl=(P=>(P.Transfer="transfer",P.TransferToSavings="transfer-saving",P.WithdrawFromSavings="withdraw-saving",P.Delegate="delegate",P.PowerUp="power-up",P.PowerDown="power-down",P.WithdrawRoutes="withdraw-routes",P.ClaimInterest="claim-interest",P.Swap="swap",P.Convert="convert",P.Gift="gift",P.Promote="promote",P.Claim="claim",P.Buy="buy",P.Stake="stake",P.Unstake="unstake",P.Undelegate="undelegate",P))(Yl||{});function nq(e,t,r){return v(["wallet","transfer"],e,n=>[Ne(e,n.to,n.amount,n.memo)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function cq(e,t,r){return v(["wallet","transfer-point"],e,n=>[We(e,n.to,n.amount,n.memo)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function fq(e,t,r){return v(["wallet","delegate-vesting-shares"],e,n=>[ct(e,n.delegatee,n.vestingShares)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.delegatee),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function wq(e,t,r){return v(["wallet","set-withdraw-vesting-route"],e,n=>[ut(e,n.toAccount,n.percent,n.autoVest)],async(n,i)=>{await k(t?.adapter,r,[c.wallet.withdrawRoutes(e),c.accounts.full(e),c.accounts.full(i.toAccount)]);},t,"active",{broadcastMode:r})}function Aq(e,t,r){return v(["wallet","transfer-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"transfer",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity,memo:n.memo}});return [["custom_json",{required_auths:[e],required_posting_auths:[],id:"ssc-mainnet-hive",json:i}]]},async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Sq(e,t,r){return v(["wallet","transfer-to-savings"],e,n=>[$e(e,n.to,n.amount,n.memo)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Fq(e,t,r){return v(["wallet","transfer-from-savings"],e,n=>[Qe(e,n.to,n.amount,n.memo,n.requestId)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Bq(e,t,r){return v(["wallet","transfer-to-vesting"],e,n=>[st(e,n.to,n.amount)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Uq(e,t,r){return v(["wallet","withdraw-vesting"],e,n=>[at(e,n.vestingShares)],async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Wq(e,t,r){return v(["wallet","convert"],e,n=>[n.collateralized?wr(e,n.amount,n.requestId):pt(e,n.amount,n.requestId)],async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Xq(e,t,r){return v(["wallet","claim-interest"],e,n=>ot(e,n.to,n.amount,n.memo,n.requestId),async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}var Xl=5e3,jt=new Map;function nI(e,t,r){return v(["wallet","claim-rewards"],e,n=>[Ir(e,n.rewardHive,n.rewardHbd,n.rewardVests)],()=>{let n=e??"__anonymous__",i=[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e],c.assets.hiveGeneralInfo(e),c.assets.hbdGeneralInfo(e),c.assets.hivePowerGeneralInfo(e)],o=jt.get(n);o&&(clearTimeout(o),jt.delete(n));let s=setTimeout(async()=>{try{let a=b(),p=(await Promise.allSettled(i.map(l=>a.invalidateQueries({queryKey:l})))).filter(l=>l.status==="rejected");p.length>0&&console.error("[SDK][Wallet][useClaimRewards] delayed invalidation rejected",{username:e,rejectedCount:p.length,rejected:p});}catch(a){console.error("[SDK][Wallet][useClaimRewards] delayed invalidation failed",{username:e,error:a});}finally{jt.delete(n);}},Xl);jt.set(n,s);},t,"posting",{broadcastMode:r})}function aI(e,t,r){return v(["wallet","delegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"delegate",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function lI(e,t,r){return v(["wallet","undelegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"undelegate",contractPayload:{symbol:n.symbol,from:n.from,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function gI(e,t,r){return v(["wallet","stake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"stake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function _I(e,t,r){return v(["wallet","unstake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"unstake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function PI(e,t,r){return v(["wallet","claim-engine-rewards"],e,n=>{let i=JSON.stringify(n.tokens.map(o=>({symbol:o})));return [["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:i}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"posting",{broadcastMode:r})}function SI(e,t,r){return v(["wallet","engine-market-order"],e,n=>{let i,o;n.action==="cancel"?(o="cancel",i={type:n.orderType,id:n.orderId}):(o=n.action,i={symbol:n.symbol,quantity:n.quantity,price:n.price});let s=JSON.stringify({contractName:"market",contractAction:o,contractPayload:i});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:s}]]},async()=>{await k(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Zl(e,t,r){let{from:n,to:i="",amount:o="",memo:s=""}=r,a=r.request_id??Date.now()>>>0;switch(e){case "HIVE":switch(t){case "transfer":return [Ne(n,i,o,s)];case "transfer-saving":return [$e(n,i,o,s)];case "withdraw-saving":return [Qe(n,i,o,s,a)];case "power-up":return [st(n,i,o)]}break;case "HBD":switch(t){case "transfer":return [Ne(n,i,o,s)];case "transfer-saving":return [$e(n,i,o,s)];case "withdraw-saving":return [Qe(n,i,o,s,a)];case "claim-interest":return ot(n,i,o,s,a);case "convert":return [pt(n,o,Math.floor(Date.now()/1e3))]}break;case "HP":switch(t){case "power-down":return [at(n,o)];case "delegate":return [ct(n,i,o)];case "withdraw-routes":return [ut(r.from_account??n,r.to_account??i,r.percent??0,r.auto_vest??false)]}break;case "POINTS":if(t==="transfer"||t==="gift")return [We(n,i,o,s)];break}return null}function ed(e,t,r){let{from:n,to:i="",amount:o=""}=r,s=typeof o=="string"&&o.includes(" ")?o.split(" ")[0]:String(o);switch(t){case "transfer":return [He(n,"transfer",{symbol:e,to:i,quantity:s,memo:r.memo??""})];case "stake":return [He(n,"stake",{symbol:e,to:i,quantity:s})];case "unstake":return [He(n,"unstake",{symbol:e,to:i,quantity:s})];case "delegate":return [He(n,"delegate",{symbol:e,to:i,quantity:s})];case "undelegate":return [He(n,"undelegate",{symbol:e,from:i,quantity:s})];case "claim":return [_r(n,[e])]}return null}function td(e){return e==="claim"?"posting":"active"}function qI(e,t,r,n,i){let{mutateAsync:o}=Ge.useRecordActivity(e,r);return v(["ecency-wallets",t,r],e,s=>{let a=Zl(t,r,s);if(a)return a;let u=ed(t,r,s);if(u)return u;throw new Error(`[SDK][Wallet] \u2013 no operation builder for asset="${t}" operation="${r}"`)},()=>{o();let s=[];s.push(["ecency-wallets","asset-info",e,t]),t==="HIVE"&&s.push(["ecency-wallets","asset-info",e,"HP"]),s.push(["wallet","portfolio","v2",e]),setTimeout(()=>{s.forEach(a=>{b().invalidateQueries({queryKey:a});});},5e3);},n,td(r),{broadcastMode:i})}function BI(e,t,r){return v(["wallet","delegate-rc"],e,({to:n,maxRc:i})=>[br(e,n,i)],async(n,i)=>{await k(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),c.resourceCredits.account(e),c.resourceCredits.account(i.to)]);},t,"active",{broadcastMode:r})}function HI(e,t,r){return v(["witnesses","vote"],e,({witness:n,approve:i})=>[Pr(e,n,i)],async()=>{try{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.votes(e)]);}catch(n){console.warn("[useWitnessVote] Post-broadcast side-effect failed:",n);}},t,"active",{broadcastMode:r})}function LI(e,t,r){return v(["witnesses","proxy"],e,({proxy:n})=>[Or(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.proxy()]);},t,"active",{broadcastMode:r})}function nd(e){return {owner:e.witness_name,total_missed:e.missed_blocks,url:e.url,props:{account_creation_fee:`${(e.account_creation_fee/1e3).toFixed(3)} HIVE`,account_subsidy_budget:0,maximum_block_size:e.block_size},hbd_exchange_rate:{base:`${e.price_feed.toFixed(3)} HBD`},available_witness_account_subsidies:0,running_version:e.version,signing_key:e.signing_key,last_hbd_exchange_update:e.feed_updated_at,rank:e.rank,vests:e.vests,voters_num:e.voters_num,voters_num_daily_change:e.voters_num_daily_change,price_feed:e.price_feed,hbd_interest_rate:e.hbd_interest_rate,last_confirmed_block_num:e.last_confirmed_block_num}}function YI(e){return infiniteQueryOptions({queryKey:c.witnesses.list(e),initialPageParam:1,queryFn:async({pageParam:t})=>(await re("hafbe","/witnesses",{"page-size":e,page:t})).witnesses.map(nd),getNextPageParam:(t,r,n)=>t.length===e?n+1:void 0})}function XI(e,t,r,n="vests",i="desc"){return queryOptions({queryKey:c.witnesses.voters(e,t,r,n,i),queryFn:async({signal:o})=>await re("hafbe","/witnesses/{witness-name}/voters",{"witness-name":e,"page-size":r,page:t,sort:n,direction:i},void 0,void 0,o),enabled:!!e,staleTime:6e4})}function ZI(e){return queryOptions({queryKey:c.witnesses.voterCount(e),queryFn:async()=>await re("hafbe","/witnesses/{witness-name}/voters/count",{"witness-name":e}),enabled:!!e,staleTime:6e4})}var id=(h=>(h[h.CHECKIN=10]="CHECKIN",h[h.LOGIN=20]="LOGIN",h[h.CHECKIN_EXTRA=30]="CHECKIN_EXTRA",h[h.POST=100]="POST",h[h.COMMENT=110]="COMMENT",h[h.VOTE=120]="VOTE",h[h.REBLOG=130]="REBLOG",h[h.DELEGATION=150]="DELEGATION",h[h.REFERRAL=160]="REFERRAL",h[h.COMMUNITY=170]="COMMUNITY",h[h.TRANSFER_SENT=998]="TRANSFER_SENT",h[h.TRANSFER_INCOMING=999]="TRANSFER_INCOMING",h[h.MINTED=991]="MINTED",h[h.BURNED=997]="BURNED",h))(id||{});async function sd(e,t){if(!e)throw new Error("[SDK][Points][Claim] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][Points][Claim] \u2013 access token wasn't found");let n=await w()(d.privateApiHost+"/private-api/points-claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})}),i=(n.headers.get("content-type")??"").split(";")[0].trim().toLowerCase(),o=await n.text();if(!n.ok){if(n.status===406)try{return JSON.parse(o)}catch{return {message:o,code:n.status}}let s=o&&i.includes("json")?`: ${o.slice(0,200)}`:"";throw new Error(`[SDK][Points][Claim] \u2013 failed with status ${n.status}${s}`)}if(!i.includes("json"))throw new Error(`[SDK][Points][Claim] \u2013 expected JSON but received "${i||"empty"}" response (status ${n.status})`);try{return JSON.parse(o)}catch{throw new Error(`[SDK][Points][Claim] \u2013 malformed JSON response (status ${n.status})`)}}function sD(e,t,r,n){let{mutateAsync:i}=Ge.useRecordActivity(e,"points-claimed");return useMutation({mutationFn:()=>sd(e,t),onError:n,onSuccess:()=>{i(),b().setQueryData(ft(e).queryKey,o=>o&&{...o,points:(parseFloat(o.points)+parseFloat(o.uPoints)).toFixed(3),uPoints:"0"}),r?.();}})}var go=/(^|\s)author:([^\s]+)/g,yo=/(^|\s)type:([^\s]+)/g,ho=/(^|\s)category:([^\s]+)/g,wo=/(^|\s)tag:([^\s]+)/g;var bo=(n=>(n.ALL="",n.POST="post",n.COMMENT="comment",n))(bo||{}),cD=5,uD=100;function vo(e){return e.trim().split(/\s+/)[0]??""}function ad(e){return vo(e).replace(/^@+/,"").toLowerCase()}function cd(e){return vo(e).replace(/^#+/,"").toLowerCase()}function ud(e){let t=new Set;return e.split(/[\s,]+/).map(r=>r.replace(/^#+/,"").toLowerCase()).filter(r=>r===""||t.has(r)?false:(t.add(r),true))}function pD({search:e="",author:t="",type:r="",category:n="",tags:i=[]}){let o=e.trim().replace(/\s+/g," "),s=ad(t),a=cd(n),u=ud(Array.isArray(i)?i.join(","):i),p=[o];return s&&p.push(`author:${s}`),r&&p.push(`type:${r}`),a&&p.push(`category:${a}`),u.length>0&&p.push(`tag:${u.join(",")}`),{q:p.filter(l=>l!=="").join(" "),search:o,author:s,type:r,category:a,tags:u}}var _o=class{constructor(t){A(this,"query","");A(this,"search","");A(this,"author","");A(this,"type","");A(this,"category","");A(this,"tags",[]);A(this,"grab",t=>{let r=[...this.query.matchAll(t)];return r.length>0?r[0][2].trim():""});A(this,"grabAuthor",()=>{this.author=this.grab(go);});A(this,"grabType",()=>{let t=this.grab(yo);Object.values(bo).includes(t)&&(this.type=t);});A(this,"grabCategory",()=>{this.category=this.grab(ho);});A(this,"grabTags",()=>{let t=new Set;this.tags=[...this.query.matchAll(wo)].flatMap(r=>r[2].split(",")).map(r=>r.trim()).filter(r=>r===""||t.has(r)?false:(t.add(r),true));});A(this,"grabSearch",()=>{for([go,yo,ho,wo].forEach(t=>{this.search=this.search.replace(t,"$1");});this.search.indexOf(" ")!==-1;)this.search=this.search.replace(" "," ");this.search=this.search.trim();});this.query=t,this.search=t,this.grabAuthor(),this.grabType(),this.grabCategory(),this.grabTags(),this.grabSearch();}};async function Pe(e,t){let n=await(async()=>{let i;try{i=await e.text();}catch{return}if(i!=="")try{return JSON.parse(i)}catch{return e.ok?void 0:i}})();if(!e.ok){let i=new Error(`Request failed with status ${e.status}`);throw i.status=e.status,i.data=n,i}if(n===void 0||t!==void 0&&!t(n))throw new Error("Response body was empty, invalid JSON, or not the expected shape");return n}function Ce(e){return typeof e=="object"&&e!==null&&Array.isArray(e.results)}var ld=isServer?0:3;function mt(e,t){let{status:r}=t,n=r===408||r===429;return r!==void 0&&r>=400&&r<500&&!n?false:e{let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let u=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:be(ve,s)});return Pe(u,Ce)},retry:mt})}function AD(e,t,r=true){return infiniteQueryOptions({queryKey:c.search.controversialRising(e,t),initialPageParam:{sid:void 0,hasNextPage:true},queryFn:async({pageParam:n,signal:i})=>{if(!n.hasNextPage)return {hits:0,took:0,results:[]};let o,s=new Date;switch(t){case "today":o=new Date(s.getTime()-1440*60*1e3);break;case "week":o=new Date(s.getTime()-10080*60*1e3);break;case "month":o=new Date(s.getTime()-720*60*60*1e3);break;case "year":o=new Date(s.getTime()-365*24*60*60*1e3);break;default:o=void 0;}let a="* type:post",u=e==="rising"?"children":e,p=o?o.toISOString().split(".")[0]:void 0,l="0",f=t==="today"?50:200,m={q:a,sort:u,hide_low:l};p&&(m.since=p),n.sid&&(m.scroll_id=n.sid),(m.votes=f);let y=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(m),signal:be(ve,i)});return Pe(y,Ce)},getNextPageParam:n=>({sid:n?.scroll_id,hasNextPage:n.results.length>0}),enabled:r,retry:mt})}async function ED(e,t,r,n,i,o,s){let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let p=await w()(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:be(ve,s)});return Pe(p,Ce)}async function Ao(e,t,r=ve){let i=await w()(d.privateApiHost+"/search-api/similar",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(e),signal:be(r,t)});return Pe(i,Ce)}async function SD(e,t){let n=await w()(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e}),signal:be(ve,t)}),i=await Pe(n,Array.isArray);return i?.length>0?i:[e]}var gd=4368*60*60*1e3,yd=4,hd=3e3,wd=2e3,_d=4e3,FD=2;function bd(e,t){return e.replace(/!\[[^\]]*\]\([^)]*\)/g," ").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim().slice(0,t)}function vd(e){let t=5381;for(let r=0;r>>0).toString(36)}function qD(e){let t=e.title??"",r=e.json_metadata?.tags,n=(Array.isArray(r)?r:[]).filter(s=>typeof s=="string"&&s!==""),i=bd(e.body??"",hd),o=vd(`${t}|${n.join(",")}|${i}`);return queryOptions({queryKey:c.search.similarEntries(e.author,e.permlink,o),queryFn:async({signal:s})=>{let a=new Date(Date.now()-gd).toISOString().slice(0,19),u=await Ao({author:e.author,permlink:e.permlink,title:t,body:i,tags:n,since:a},s,typeof window>"u"?wd:_d),p=[],l=new Set;for(let f of u.results){if(p.length>=yd)break;f.permlink!==e.permlink&&(f.tags??[]).indexOf("nsfw")===-1&&(l.has(f.author)||(l.add(f.author),p.push(f)));}return p},staleTime:300*1e3,retry:false})}function ND(e,t=5){let r=e.trim();return queryOptions({queryKey:c.search.account(r,t),queryFn:async()=>{let n=await g("condenser_api.lookup_accounts",[r,t]);return n.length===0?[]:Rt(n)},enabled:!!r})}function jD(e,t=10){let r=e.trim();return queryOptions({queryKey:c.search.topics(r,t),queryFn:async()=>(await g("condenser_api.get_trending_tags",[r,t+1])).map(i=>i.name).filter(i=>i!==""&&!i.startsWith("hive-")).slice(0,t),enabled:!!r})}function JD(e,t,r,n,i,o){return infiniteQueryOptions({queryKey:c.search.api(e,t,r,n,i,o),queryFn:async({pageParam:s,signal:a})=>{let u={q:e,sort:t,hide_low:r};n&&(u.since=n),s&&(u.scroll_id=s),i!==void 0&&(u.votes=i),o&&(u.include_nsfw=1);let p=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(u),signal:be(ve,a)});return Pe(p,Ce)},initialPageParam:void 0,getNextPageParam:s=>s?.scroll_id,enabled:!!e,retry:mt})}function eK(e){return queryOptions({queryKey:["search","path",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e})});if(!t.ok)throw new Error(`Search path failed: ${t.status}`);let r=await t.json();return r?.length>0?r:[e]}})}async function Sd(e){let r=await w()(d.privateApiHost+"/private-api/support-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to fetch support settings: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function iK(e,t){let r=e?.replace("@","");return queryOptions({queryKey:c.support.settings(r),queryFn:()=>{if(!t)throw new Error("[SDK][Support] missing auth");return Sd(t)},enabled:!!r&&!!t})}async function Td(e,t){let n=await w()(d.privateApiHost+"/private-api/support-settings-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,beneficiary_percent:t.beneficiary_percent,curation_percent:t.curation_percent})});if(!n.ok){let i;try{i=await n.json();}catch{}let o=i?.message??`Failed to update support settings: ${n.status}`,s=new Error(o);throw s.status=n.status,s.data=i,s}return await n.json()}function Rd(e,t,r){return e.setQueryData(c.support.settings(t),r),e.invalidateQueries({queryKey:c.support.settings(t)})}function uK(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["support","settings-update",n],mutationFn:async i=>{if(!n||!t)throw new Error("[SDK][Support] missing auth");return Td(t,i)},onSuccess(i){n&&Rd(r,n,i);}})}function fK(e){return queryOptions({queryKey:["promotions","boost-plus-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/boost-plus-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch boost plus prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function hK(e){return queryOptions({queryKey:["promotions","rc-delegation-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/rc-delegation-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch RC delegation prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function vK(e,t){return queryOptions({queryKey:["promotions","rc-delegation-active",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/rc-delegation-active",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,username:e})});if(!r.ok)throw new Error(`Failed to fetch RC delegation active: ${r.status}`);let n=await r.json();return n&&n.expires&&n.user?{user:n.user,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function xK(e){return queryOptions({queryKey:["promotions","promote-price"],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/promote-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch promote prices: ${t.status}`);return await t.json()},enabled:!!e})}function CK(e,t){return queryOptions({queryKey:["promotions","boost-plus-accounts",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/boosted-plus-account",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:e})});if(!r.ok)throw new Error(`Failed to fetch boost plus account prices: ${r.status}`);let n=await r.json();return n?{account:n.account,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function qK(e,t,r){return v(["promotions","boost-plus"],e,({account:n,duration:i})=>[Nr(e,n,i)],async(n,{account:i})=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.promotions.boostPlusAccounts(i)]);},t,"active",{broadcastMode:r})}function BK(e,t,r){return v(["promotions","rc-delegation"],e,({duration:n})=>[Qr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.resourceCredits.account(e),["promotions","rc-delegation-active",e]]);},t,"active",{broadcastMode:r})}async function QK(e){let r=await w()(d.privateApiHost+"/auth-api/hs-token-refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let i;try{i=await r.json();}catch{i=void 0;}let o=new Error(`Failed to refresh token: ${r.status}`);throw o.status=r.status,o.data=i,o}return await r.json()}var Md="https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt";function jK(){return queryOptions({queryKey:c.badActors.list(),queryFn:async({signal:e})=>{let t=await fetch(Md,{signal:e});if(!t.ok)throw new Error(`Failed to fetch bad actors list: ${t.status}`);let r=await t.text();return new Set(r.split(` `).filter(Boolean))},staleTime:1440*60*1e3,gcTime:1/0})}var $K=1.1,Nd=(r=>(r.NUMBER_OF_VOTES="number_of_votes",r.TOKENS="tokens",r))(Nd||{});function WK(e){return e?e.map((t,r)=>({choice_num:r+1,choice_text:t,votes:{total_votes:0,hive_hp:0,hive_proxied_hp:0,hive_hp_incl_proxied:0}})):[]}function Ud(e){let t=e.poll_choices??[],r=e.poll_voters??[],n=e.poll_stats,i=t.map(a=>{let u=a.votes;return {choice_num:a.choice_num??0,choice_text:a.choice_text??"",votes:u?{total_votes:u.total_votes??0,hive_hp:u.hive_hp,hive_proxied_hp:u.hive_proxied_hp,hive_hp_incl_proxied:u.hive_hp_incl_proxied??null}:void 0}}),o=r.map(a=>({name:a.name??"",choices:a.choices??[],hive_hp:a.hive_hp,hive_proxied_hp:a.hive_proxied_hp,hive_hp_incl_proxied:a.hive_hp_incl_proxied})),s=n?{total_voting_accounts_num:n.total_voting_accounts_num??0,total_hive_hp:n.total_hive_hp,total_hive_proxied_hp:n.total_hive_proxied_hp,total_hive_hp_incl_proxied:n.total_hive_hp_incl_proxied??null}:void 0;return {author:e.author??"",permlink:e.permlink??"",question:e.question??"",poll_choices:i,poll_voters:o,poll_stats:s,poll_trx_id:e.poll_trx_id??"",status:e.status??"",end_time:e.end_time??"",preferred_interpretation:e.preferred_interpretation??"number_of_votes",max_choices_voted:e.max_choices_voted??1,filter_account_age_days:e.filter_account_age_days??0,protocol_version:e.protocol_version??0,created:e.created??"",post_title:e.post_title??"",post_body:e.post_body??"",parent_permlink:e.parent_permlink??"",tags:e.tags??[],image:e.image??[],token:e.token,community_membership:e.community_membership,allow_vote_changes:e.allow_vote_changes,ui_hide_res_until_voted:e.ui_hide_res_until_voted??false,platform:e.platform}}function XK(e,t){return queryOptions({queryKey:c.polls.details(e??"",t??""),enabled:!!e&&!!t,gcTime:isServer?Wn:1800*1e3,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Polls] \u2013 missing author or permlink");let r=w(),n=`${d.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(e)}&permlink=eq.${encodeURIComponent(t)}`,i=await r(n);if(!i.ok)throw new Error(`[SDK][Polls] \u2013 fetch failed: ${i.status}`);let o=await i.json();if(!Array.isArray(o)||!o[0])throw new Error("[SDK][Polls] \u2013 no poll data found");return Ud(o[0])}})}function tB(e,t,r){return v(c.polls.vote(),e??"",({pollTrxId:n,choices:i})=>{if(!e)throw new Error("[SDK][Polls] Cannot vote without an authenticated username");return [["custom_json",{id:"polls",required_auths:[],required_posting_auths:[e],json:JSON.stringify({poll:n,action:"vote",choices:i})}]]},void 0,t,"posting",{broadcastMode:r??"async"})}/** * @license bytebuffer.ts (c) 2015 Daniel Wirtz * Backing buffer: ArrayBuffer, Accessor: DataView diff --git a/packages/sdk/dist/browser/index.js.map b/packages/sdk/dist/browser/index.js.map index 5ba5770d17..82f1ac81d9 100644 --- a/packages/sdk/dist/browser/index.js.map +++ b/packages/sdk/dist/browser/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/hive-tx/helpers/ByteBuffer.ts","../../src/hive-tx/config.ts","../../src/hive-tx/helpers/Signature.ts","../../src/hive-tx/helpers/PublicKey.ts","../../src/hive-tx/helpers/Asset.ts","../../src/hive-tx/helpers/HexBuffer.ts","../../src/hive-tx/helpers/serializer.ts","../../src/hive-tx/helpers/sleep.ts","../../src/hive-tx/helpers/call.ts","../../src/hive-tx/Transaction.ts","../../src/hive-tx/helpers/PrivateKey.ts","../../src/hive-tx/helpers/aes.ts","../../src/hive-tx/helpers/deserializer.ts","../../src/hive-tx/helpers/memo.ts","../../src/hive-tx/helpers/utils.ts","../../src/modules/core/hive-tx.ts","../../src/modules/core/errors/chain-errors.ts","../../src/modules/core/mutations/use-broadcast-mutation.ts","../../src/modules/core/mutations/broadcast-json.ts","../../src/modules/core/mutations/invalidate-after-broadcast.ts","../../src/modules/core/abort-signal.ts","../../src/modules/core/config.ts","../../src/modules/core/queries-manager.ts","../../src/modules/core/utils/decoder-encoder.ts","../../src/modules/core/utils/parse-asset.ts","../../src/modules/core/utils/get-bound-fetch.ts","../../src/modules/core/utils/is-community.ts","../../src/modules/core/utils/pagination-helpers.ts","../../src/modules/core/utils/vests-to-hp.ts","../../src/modules/core/utils/is-empty-date.ts","../../src/modules/core/queries/get-dynamic-props-query-options.ts","../../src/modules/core/queries/get-reward-fund-query-options.ts","../../src/modules/core/query-keys.ts","../../src/modules/ai/queries/get-ai-generate-price-query-options.ts","../../src/modules/ai/queries/get-ai-assist-price-query-options.ts","../../src/modules/ai/queries/get-ai-transcribe-price-query-options.ts","../../src/modules/ai/mutations/use-generate-image.ts","../../src/modules/ai/mutations/use-ai-assist.ts","../../src/modules/ai/mutations/use-ai-transcribe.ts","../../src/modules/accounts/queries/get-account-full-query-options.ts","../../src/modules/accounts/utils/profile-metadata.ts","../../src/modules/accounts/utils/parse-accounts.ts","../../src/modules/accounts/queries/get-accounts-query-options.ts","../../src/modules/accounts/queries/get-follow-count-query-options.ts","../../src/modules/accounts/queries/get-followers-query-options.ts","../../src/modules/accounts/queries/get-following-query-options.ts","../../src/modules/accounts/queries/get-muted-users-query-options.ts","../../src/modules/accounts/queries/lookup-accounts-query-options.ts","../../src/modules/accounts/queries/search-accounts-by-username-query-options.ts","../../src/modules/accounts/queries/check-username-wallets-pending-query-options.ts","../../src/modules/accounts/queries/get-relationship-between-accounts-query-options.ts","../../src/modules/accounts/queries/get-account-subscriptions-query-options.ts","../../src/modules/accounts/queries/get-bookmarks-query-options.ts","../../src/modules/accounts/queries/get-favorites-query-options.ts","../../src/modules/accounts/queries/check-favorite-query-options.ts","../../src/modules/accounts/queries/get-account-recoveries-query-options.ts","../../src/modules/accounts/queries/get-account-pending-recovery-query-options.ts","../../src/modules/accounts/queries/get-account-reputations-query-options.ts","../../src/modules/accounts/queries/get-transactions-infinite-query-options.ts","../../src/modules/accounts/queries/get-bots-query-options.ts","../../src/modules/accounts/queries/get-referrals-infinite-query-options.ts","../../src/modules/accounts/queries/get-referrals-stats-query-options.ts","../../src/modules/accounts/queries/get-friends-infinite-query-options.ts","../../src/modules/accounts/queries/get-search-friends-query-options.ts","../../src/modules/posts/queries/get-trending-tags-query-options.ts","../../src/modules/posts/queries/get-trending-tags-with-stats-query-options.ts","../../src/modules/posts/queries/get-fragments-query-options.ts","../../src/modules/posts/queries/get-promoted-posts-query-options.ts","../../src/modules/posts/queries/get-entry-active-votes-query-options.ts","../../src/modules/posts/queries/get-user-post-vote-query-options.ts","../../src/modules/posts/queries/get-content-query-options.ts","../../src/modules/posts/queries/get-content-replies-query-options.ts","../../src/modules/posts/queries/get-post-header-query-options.ts","../../src/modules/posts/utils/filter-dmca-entries.ts","../../src/modules/bridge/verify-on-alternate-node.ts","../../src/modules/posts/queries/get-post-query-options.ts","../../src/modules/bridge/requests.ts","../../src/modules/posts/queries/get-discussions-query-options.ts","../../src/modules/posts/queries/get-account-posts-query-options.ts","../../src/modules/posts/queries/get-posts-ranked-query-options.ts","../../src/modules/posts/queries/get-reblogs-query-options.ts","../../src/modules/posts/queries/get-reblogged-by-query-options.ts","../../src/modules/posts/queries/get-schedules-query-options.ts","../../src/modules/posts/queries/get-drafts-query-options.ts","../../src/modules/posts/queries/get-images-query-options.ts","../../src/modules/posts/queries/get-comment-history-query-options.ts","../../src/modules/posts/queries/get-deleted-entry-query-options.ts","../../src/modules/posts/queries/get-post-tips-query-options.ts","../../src/modules/posts/utils/waves-helpers.ts","../../src/modules/posts/queries/get-waves-feed-query-options.ts","../../src/modules/posts/queries/get-shorts-feed-query-options.ts","../../src/modules/posts/queries/get-waves-by-host-query-options.ts","../../src/modules/posts/queries/get-waves-by-tag-query-options.ts","../../src/modules/posts/queries/get-waves-following-query-options.ts","../../src/modules/posts/queries/get-waves-trending-tags-query-options.ts","../../src/modules/posts/queries/get-waves-by-account-query-options.ts","../../src/modules/posts/queries/get-waves-trending-authors-query-options.ts","../../src/modules/posts/queries/get-normalize-post-query-options.ts","../../src/modules/accounts/queries/get-account-vote-history-infinite-query-options.ts","../../src/modules/accounts/queries/get-profiles-query-options.ts","../../src/modules/accounts/queries/get-balance-history-query-options.ts","../../src/modules/accounts/queries/get-aggregated-balance-query-options.ts","../../src/modules/accounts/queries/get-pro-members-query-options.ts","../../src/modules/accounts/mutations/use-account-update.ts","../../src/modules/accounts/mutations/use-account-relations-update.ts","../../src/modules/operations/builders/content.ts","../../src/modules/operations/builders/wallet.ts","../../src/modules/operations/builders/social.ts","../../src/modules/operations/builders/governance.ts","../../src/modules/operations/builders/community.ts","../../src/modules/operations/builders/market.ts","../../src/modules/operations/builders/account.ts","../../src/modules/operations/builders/ecency.ts","../../src/modules/accounts/mutations/use-follow.ts","../../src/modules/accounts/mutations/use-unfollow.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-add.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-delete.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-add.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-delete.ts","../../src/modules/accounts/mutations/use-account-update-key-auths.ts","../../src/modules/accounts/mutations/use-account-update-password.ts","../../src/modules/accounts/mutations/use-account-revoke-posting.ts","../../src/modules/accounts/mutations/use-account-update-recovery.ts","../../src/modules/accounts/mutations/build-revoke-keys-op.ts","../../src/modules/accounts/mutations/use-account-revoke-key.ts","../../src/modules/accounts/mutations/use-claim-account.ts","../../src/modules/accounts/mutations/use-grant-posting-permission.ts","../../src/modules/accounts/mutations/use-create-account.ts","../../src/modules/accounts/utils/account-power.ts","../../src/modules/operations/authority-map.ts","../../src/modules/operations/mutations/sign-operation-by-key.ts","../../src/modules/operations/mutations/sign-operation-by-keychain.ts","../../src/modules/operations/mutations/sign-operation-by-hivesigner.ts","../../src/modules/operations/queries/get-chain-properties-query-options.ts","../../src/modules/posts/utils/fragment-cache-helpers.ts","../../src/modules/posts/mutations/add-fragment.ts","../../src/modules/posts/mutations/edit-fragment.ts","../../src/modules/posts/mutations/remove-fragment.ts","../../src/modules/private-api/requests.ts","../../src/modules/posts/mutations/use-add-draft.ts","../../src/modules/posts/mutations/use-update-draft.ts","../../src/modules/posts/mutations/use-delete-draft.ts","../../src/modules/posts/mutations/use-add-schedule.ts","../../src/modules/posts/mutations/use-delete-schedule.ts","../../src/modules/posts/mutations/use-move-schedule.ts","../../src/modules/posts/mutations/use-add-image.ts","../../src/modules/posts/mutations/use-delete-image.ts","../../src/modules/posts/mutations/use-upload-image.ts","../../src/modules/posts/cache/entries-cache-management.ts","../../src/modules/posts/mutations/use-vote.ts","../../src/modules/posts/mutations/use-reblog.ts","../../src/modules/posts/mutations/use-comment.ts","../../src/modules/posts/cache/discussions-cache-utils.ts","../../src/modules/posts/mutations/use-delete-comment.ts","../../src/modules/posts/mutations/use-cross-post.ts","../../src/modules/posts/mutations/use-update-reply.ts","../../src/modules/posts/mutations/use-promote.ts","../../src/modules/posts/utils/validate-post-creating.ts","../../src/modules/analytics/mutations/index.ts","../../src/modules/analytics/mutations/use-record-activity.ts","../../src/modules/analytics/queries/get-discover-leaderboard-query-options.ts","../../src/modules/analytics/queries/get-discover-curation-query-options.ts","../../src/modules/analytics/queries/get-page-stats-query-options.ts","../../src/modules/integrations/3speak/functions/beneficiary.ts","../../src/modules/integrations/3speak/queries/index.ts","../../src/modules/integrations/hivesigner/queries/index.ts","../../src/modules/integrations/hivesigner/queries/get-decode-memo-query-options.ts","../../src/modules/integrations/hivesigner/index.ts","../../src/modules/integrations/3speak/queries/get-account-token-query-options.ts","../../src/modules/integrations/3speak/queries/get-account-videos-query-options.ts","../../src/modules/integrations/3speak/index.ts","../../src/modules/integrations/hiveposh/queries/get-hiveposh-links-query-options.ts","../../src/modules/integrations/plausible/queries/get-stats-query-options.ts","../../src/modules/resource-credits/queries/get-rc-stats-query-options.ts","../../src/modules/resource-credits/queries/get-account-rc-query-options.ts","../../src/modules/resource-credits/utils/estimate-rc-precheck.ts","../../src/modules/games/queries/game-status-check-query-options.ts","../../src/modules/games/mutations/game-claim.ts","../../src/modules/quests/queries/get-quests-query-options.ts","../../src/modules/quests/catalog.ts","../../src/modules/quests/mutations/buy-streak-freeze.ts","../../src/modules/communities/mutations/use-subscribe-community.ts","../../src/modules/communities/mutations/use-unsubscribe-community.ts","../../src/modules/communities/mutations/use-mute-post.ts","../../src/modules/communities/mutations/use-set-community-role.ts","../../src/modules/communities/mutations/use-update-community.ts","../../src/modules/communities/mutations/use-register-community-rewards.ts","../../src/modules/communities/mutations/use-pin-post.ts","../../src/modules/communities/queries/get-communities-query-options.ts","../../src/modules/communities/queries/get-community-context-query-options.ts","../../src/modules/communities/queries/get-community-query-options.ts","../../src/modules/communities/queries/get-community-subscribers-query-options.ts","../../src/modules/communities/queries/get-account-notifications-infinite-query-options.ts","../../src/modules/communities/queries/get-rewarded-communities-query-options.ts","../../src/modules/communities/types/community.ts","../../src/modules/communities/utils/index.ts","../../src/modules/notifications/queries/get-notifications-unread-count-query-options.ts","../../src/modules/notifications/queries/get-notifications-infinite-query-options.ts","../../src/modules/notifications/enums/notification-filter.ts","../../src/modules/notifications/enums/notify-types.ts","../../src/modules/notifications/queries/get-notifications-settings-query-options.ts","../../src/modules/notifications/queries/get-announcements-query-options.ts","../../src/modules/notifications/queries/get-spotlights-query-options.ts","../../src/modules/notifications/mutations/use-mark-notifications-read.ts","../../src/modules/notifications/mutations/use-set-last-read.ts","../../src/modules/proposals/queries/get-proposal-query-options.ts","../../src/modules/proposals/queries/get-proposals-query-options.ts","../../src/modules/proposals/queries/get-proposal-votes-query-options.ts","../../src/modules/proposals/queries/get-user-proposal-votes-query-options.ts","../../src/modules/proposals/mutations/use-proposal-vote.ts","../../src/modules/proposals/mutations/use-proposal-create.ts","../../src/modules/wallet/queries/get-vesting-delegations-query-options.ts","../../src/modules/wallet/queries/get-account-delegations-query-options.ts","../../src/modules/wallet/queries/get-vesting-delegation-expirations-query-options.ts","../../src/modules/wallet/queries/get-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-collateralized-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-savings-withdraw-from-query-options.ts","../../src/modules/wallet/queries/get-withdraw-routes-query-options.ts","../../src/modules/wallet/queries/get-open-orders-query-options.ts","../../src/modules/wallet/queries/get-outgoing-rc-delegations-infinite-query-options.ts","../../src/modules/wallet/queries/get-incoming-rc-query-options.ts","../../src/modules/wallet/queries/get-received-vesting-shares-query-options.ts","../../src/modules/wallet/queries/get-recurrent-transfers-query-options.ts","../../src/modules/wallet/queries/get-portfolio-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-general-info-query-options.ts","../../src/modules/wallet/consts/hive-account-operation-groups.ts","../../src/modules/wallet/consts/hive-operation-list.ts","../../src/modules/wallet/consts/hive-operation-orders.ts","../../src/modules/wallet/queries/get-hive-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-metric-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-withdrawal-routes-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegates-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegatings-query-options.ts","../../src/modules/market/queries/get-order-book-query-options.ts","../../src/modules/market/queries/get-market-statistics-query-options.ts","../../src/modules/market/queries/get-market-history-query-options.ts","../../src/modules/market/queries/get-hive-hbd-stats-query-options.ts","../../src/modules/market/queries/get-market-data-query-options.ts","../../src/modules/market/queries/get-trade-history-query-options.ts","../../src/modules/market/queries/get-feed-history-query-options.ts","../../src/modules/market/queries/get-current-median-history-price-query-options.ts","../../src/modules/market/mutations/use-limit-order-create.ts","../../src/modules/market/mutations/use-limit-order-cancel.ts","../../src/modules/market/requests.ts","../../src/modules/hive-engine/requests.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-balances-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-market-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-metadata-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-transactions-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-metrics-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-unclaimed-rewards-query-options.ts","../../src/modules/hive-engine/queries/get-all-hive-engine-tokens-query-options.ts","../../src/modules/hive-engine/utils/formatted-number.ts","../../src/modules/hive-engine/utils/hive-engine-token.ts","../../src/modules/hive-engine/queries/get-hive-engine-balances-with-usd-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-general-info-query-options.ts","../../src/modules/points/queries/get-points-query-options.ts","../../src/modules/points/queries/get-points-asset-general-info-query-options.ts","../../src/modules/points/queries/get-points-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-account-wallet-asset-info-query-options.ts","../../src/modules/wallet/types/asset-operation.ts","../../src/modules/wallet/mutations/use-transfer.ts","../../src/modules/wallet/mutations/use-transfer-point.ts","../../src/modules/wallet/mutations/use-delegate-vesting-shares.ts","../../src/modules/wallet/mutations/use-set-withdraw-vesting-route.ts","../../src/modules/wallet/mutations/use-transfer-engine-token.ts","../../src/modules/wallet/mutations/use-transfer-to-savings.ts","../../src/modules/wallet/mutations/use-transfer-from-savings.ts","../../src/modules/wallet/mutations/use-transfer-to-vesting.ts","../../src/modules/wallet/mutations/use-withdraw-vesting.ts","../../src/modules/wallet/mutations/use-convert.ts","../../src/modules/wallet/mutations/use-claim-interest.ts","../../src/modules/wallet/mutations/use-claim-rewards.ts","../../src/modules/wallet/mutations/use-delegate-engine-token.ts","../../src/modules/wallet/mutations/use-undelegate-engine-token.ts","../../src/modules/wallet/mutations/use-stake-engine-token.ts","../../src/modules/wallet/mutations/use-unstake-engine-token.ts","../../src/modules/wallet/mutations/use-claim-engine-rewards.ts","../../src/modules/wallet/mutations/use-engine-market-order.ts","../../src/modules/wallet/mutations/use-wallet-operation.ts","../../src/modules/wallet/mutations/use-delegate-rc.ts","../../src/modules/witnesses/mutations/use-witness-vote.ts","../../src/modules/witnesses/mutations/use-witness-proxy.ts","../../src/modules/witnesses/queries/get-witnesses-query-options.ts","../../src/modules/points/types/point-transaction-type.ts","../../src/modules/points/mutations/use-claim-points.ts","../../src/modules/search/query-builder.ts","../../src/modules/search/parse-json-response.ts","../../src/modules/search/retry-policy.ts","../../src/modules/search/queries/get-search-query-options.ts","../../src/modules/search/requests.ts","../../src/modules/search/queries/get-similar-entries-query-options.ts","../../src/modules/search/queries/get-search-account-query-options.ts","../../src/modules/search/queries/get-search-topics-query-options.ts","../../src/modules/search/queries/get-search-api-infinite-query-options.ts","../../src/modules/search/queries/get-search-path-query-options.ts","../../src/modules/support/queries/get-support-settings-query-options.ts","../../src/modules/support/mutations/update-support-settings.ts","../../src/modules/promotions/queries/get-boost-plus-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-active-query-options.ts","../../src/modules/promotions/queries/get-promote-price-query-options.ts","../../src/modules/promotions/queries/get-boost-plus-account-prices-query-options.ts","../../src/modules/promotions/mutations/use-boost-plus.ts","../../src/modules/promotions/mutations/use-rc-delegation.ts","../../src/modules/auth/requests.ts","../../src/modules/bad-actors/queries/get-bad-actors-query-options.ts","../../src/modules/polls/types/poll.ts","../../src/modules/polls/queries/get-poll-query-options.ts","../../src/modules/polls/mutations/use-poll-vote.ts"],"names":["EMPTY_BUFFER","_encoder","_decoder","getEncoder","s","utf8","i","c","next","getDecoder","b","bytes","result","byte","codePoint","_ByteBuffer","capacity","littleEndian","__publicField","buffers","buf","bb","view","offset","buffer","source","value","relative","src","copy","begin","end","target","targetOffset","sourceOffset","sourceLimit","targetRelative","len","current","length","forceCopy","limit","size","str","currentOffset","encoded","lenVarintSize","start","lenResult","lenValue","lenLength","ByteBuffer","config","sanitizeNodeList","nodes","n","setNodes","validNodes","setRestNodes","valid","setRestNodesByApi","map","api","list","setUserAgent","ua","setResilience","opts","r","bool","v","pos","Signature","_Signature","data","recovery","compressed","string","temp","hexToBytes","bytesToHex","message","sig","secp256k1","PublicKey","_PublicKey","key","prefix","wif","expectedPrefix","bs58","checksum","expectedChecksum","ripemd160","isUint8ArrayEqual","signature","encodePublic","a","Asset","_Asset","amount","symbol","expectedSymbol","amountString","HexBuffer","_HexBuffer","OPERATION_IDS","VoidSerializer","StringSerializer","Int16Serializer","Int64Serializer","UInt8Serializer","UInt16Serializer","UInt32Serializer","UInt64Serializer","BooleanSerializer","StaticVariantSerializer","itemSerializers","id","item","AssetSerializer","asset","precision","DateSerializer","PublicKeySerializer","BinarySerializer","VariableBinarySerializer","FlatMapSerializer","keySerializer","valueSerializer","ArraySerializer","itemSerializer","ObjectSerializer","keySerializers","serializer","error","OptionalSerializer","AuthoritySerializer","BeneficiarySerializer","PriceSerializer","ChainPropertiesSerializer","OperationDataSerializer","operationId","definitions","objectSerializer","OperationSerializers","ProposalUpdateSerializer","OperationSerializer","operation","TransactionSerializer","EncryptedMemoSerializer","Serializer","sleep","ms","resolve","isNodeRuntime","serverIdentityHeaders","RPCError","rpcError","NodeError","node","parseRetryAfterMs","header","secs","dateMs","delta","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","RATE_LIMIT_BASE_MS","RATE_LIMIT_MAX_MS","RATE_LIMIT_STREAK_RESET_MS","MAX_API_FAILURES_BEFORE_COOLDOWN","API_COOLDOWN_MS","HEAD_BLOCK_MAX_AGE_MS","STALE_BLOCK_THRESHOLD","LATENCY_EWMA_ALPHA","LATENCY_MIN_SAMPLES","LATENCY_MAX_AGE_MS","LATENCY_REPROBE_MS","LATENCY_UNPROVEN_PRIOR_MS","LATENCY_SLOW_FAILURE_MS","NodeHealthTracker","h","durationMs","profileKey","apiFail","now","p","elapsedMs","existing","retryAfterMs","hasHeader","cooldown","blockNum","recent","best","healthy","unhealthy","ordered","d","probe","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","HedgeBudget","tokens","rpcHedgeBudget","adaptiveAttemptTimeout","tracker","callerTimeout","explicit","ewma","recordError","e","tryRecordHeadBlock","block","createTimeoutReason","err","createTimeoutSignal","controller","timer","mergeSignals","primary","secondary","onPrimaryAbort","onSecondaryAbort","cleanup","jsonRPCCall","url","params","timeout","shouldRetry","externalSignal","body","tSignal","cleanupTimeout","signal","cleanupMerge","res","jitterDelay","hedgedRpcAttempt","hedgePool","explicitTimeout","deadlineAt","onHedgeFired","validate","reject","done","pendingLegs","hedgeFired","primarySettled","lastError","hedgeTimer","primaryStart","controllers","finish","settle","startLeg","isHedge","merged","legTimeout","primaryWindow","delay","live","callRPC","retry","ceiling","deadline","triedInRound","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","restProfileKey","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","restSignal","restCleanup","restCallStart","response","callWithQuorum","quorum","allNodes","arr","j","currentBatchSize","allResults","batchNodes","promises","batchResults","consensusResult","findConsensus","results","resultGroups","consensusGroup","group","chainId","Transaction","_Transaction","options","expiration","props","refBlockPrefix","expirationIso","operationName","operationBody","keys","digest","txId","checkStatus","maxPollAttempts","status","transactionData","sha256","NETWORK_ID","PrivateKey","_PrivateKey","decodePrivate","seed","username","password","role","rv","encodePrivate","publicKey","sha512","doubleSha256","input","encodedKey","checksumVerify","encrypt","privateKey","nonce","uniqueNonce","crypt","decrypt","nonceL","S","ebuf","encryptionKey","iv","tag","check","cbuf","check32","cryptoJsDecrypt","cryptoJsEncrypt","messageBuffer","AESCBC","uniqueNonceEntropy","randomPrivateKey","long","entropy","PublicKeyDeserializer","fixedBuf","UInt64Deserializer","UInt32Deserializer","BinaryDeserializer","bCopy","BufferDeserializer","keyDeserializers","obj","deserializer","EncryptedMemoDeserializer","Deserializer","encode","memo","testNonce","checkEncryption","toPrivateObj","toPublicObj","mbuf","memoBuffer","mbuf2","decode","from","to","encrypted","otherpub","encodeTest","plaintext","cyphertext","o","Memo","utils_exports","__export","buildWitnessSetProperties","makeBitMaskFilter","operations","validateUsername","suffix","ref","label","allowedOperations","reduceFunction","low","high","allowedOperation","owner","type","serialize","nobleSha256","isWif","broadcastOperations","ops","tx","op","broadcastOperationsAsync","MANA_REGENERATION_SECONDS","calculateManabar","maxMana","manabar","currentMana","percentage","getVests","account","vests","delegated","received","withdrawRate","alreadyWithdrawn","withdrawVests","calculateVPMana","calculateRCMana","rcAccount","ErrorType","parseChainError","errorDescription","errorMessage","errorCode","errorString","testPattern","pattern","formatError","parsed","shouldTriggerAuthFallback","isResourceCreditsError","isInfoError","isNetworkError","broadcastWithMethod","auth","authority","fetchedKey","fetchedToken","broadcastMode","adapter","token","hs","tokenError","broadcastWithFallback","loginType","hasPostingAuth","selectedMethod","hsError","chain","errors","shouldSkip","skipReason","prefetchedKey","prefetchedToken","skipReasons","errorMessages","useBroadcastMutation","mutationKey","onSuccess","useMutation","payload","postingKey","accessToken","broadcastJson","jjson","BROADCAST_INCLUSION_DELAY_MS","invalidateAfterBroadcast","withTimeoutSignal","timeoutMs","timeoutSignal","ac","onAbort","reason","isDevelopment","getHeliusApiKey","INTERNAL_API_TIMEOUT_MS","SERVER_GC_TIME_MS","queryClientResolver","fallbackQueryClient","resolveQueryClient","QueryClient","CONFIG","client","ConfigManager","setQueryClient","setQueryClientResolver","setPrivateApiHost","host","setClientId","clientId","setDefaultObserver","observer","getValidatedBaseUrl","setPollsApiHost","setImageHost","setHiveNodes","userAgent","analyzeRedosRisk","unboundedRange","match","min","max","testRegexPerformance","regex","adversarialInputs","maxExecutionTime","duration","safeCompileRegex","maxLength","staticAnalysis","compileErr","runtimeTest","setDmcaLists","lists","coerceList","resolved","rejectedTagCount","makeQueryClient","getQueryClient","EcencyQueriesManager","getQueryData","queryKey","getInfiniteQueryData","prefetchQuery","prefetchInfiniteQuery","generateClientServerQuery","useQuery","generateClientServerInfiniteQuery","useInfiniteQuery","encodeObj","decodeObj","dataToParse","Symbol","NaiMap","parseAsset","sval","sp","cachedFetch","getBoundFetch","isCommunity","isWrappedResponse","normalizeToWrappedResponse","vestsToHp","hivePerMVests","isEmptyDate","DYNAMIC_PROPS_REFRESH_MS","getDynamicPropsQueryOptions","queryOptions","QueryKeys","rawGlobalDynamic","rawFeedHistory","rawChainProps","rawRewardFund","rawHardforkProps","totalVestingSharesAmount","totalVestingFundAmount","base","quote","fundRecentClaims","fundRewardBalance","votePowerReserveRate","authorRewardCurve","contentConstant","currentHardforkVersion","lastHardfork","hbdPrintRate","hbdInterestRate","headBlock","totalVestingFund","totalVestingShares","virtualSupply","vestingRewardPercent","accountCreationFee","getRewardFundQueryOptions","fundName","entryPath","author","permlink","filter","startAuthor","startPermlink","activeUsername","sort","order","onlyMeta","hours","usernames","following","mode","followType","query","follower","startFollowing","startFollower","excludeList","accounts","targetUsername","reference","name","communityName","proposalId","voter","q","hideLow","since","scrollId","votes","what","content","includeNsfw","witness","page","pageSize","direction","user","coinType","granularity","onlyEnabled","currency","filterKey","bucketSeconds","seconds","startDate","endDate","coin","vsCurrency","fromTs","toTs","dimensions","metrics","dateRange","gameType","getAiGeneratePriceQueryOptions","getAiAssistPriceQueryOptions","getAiTranscribePriceQueryOptions","makeIdempotencyKey","useGenerateImage","pendingData","useAiAssist","useAiTranscribe","form","isMetadataStripped","hasProfileValues","profile","getAccountFullQueryOptions","bridgeProfile","rows","chainAccount","reread","parseProfileMetadata","stats","follow_stats","reputationValue","DENIED_KEYS","isPlainObject","proto","deepMerge","srcVal","tgtVal","sanitizeTokens","meta","rest","safeMeta","postingJsonMetadata","extractAccountProfile","pickRicherMetadataSnapshot","preferred","fallback","preferredKeys","parsePostingMetadataRoot","buildPostingJsonMetadata","existingPostingJsonMetadata","root","existingProfile","mergedProfile","buildProfileMetadata","profileTokens","_ignoredVersion","profileRest","metadata","parseAccounts","rawAccounts","x","jsonMetadata","getAccountsQueryOptions","getFollowCountQueryOptions","getFollowersQueryOptions","getFollowingQueryOptions","MUTED_USERS_PAGE_SIZE","MUTED_USERS_MAX_PAGES","getMutedUsersQueryOptions","muted","names","lookupAccountsQueryOptions","getSearchAccountsByUsernameQueryOptions","RESERVED_META_KEYS","checkUsernameWalletsPendingQueryOptions","wallets","walletItem","sanitizedMeta","address","showFlag","baseCandidate","metaTokenCandidates","metaSymbol","metaValue","getRelationshipBetweenAccountsQueryOptions","getAccountSubscriptionsQueryOptions","getBookmarksQueryOptions","getBookmarksInfiniteQueryOptions","infiniteQueryOptions","pageParam","json","lastPage","getFavoritesQueryOptions","getFavoritesInfiniteQueryOptions","checkFavoriteQueryOptions","getAccountRecoveriesQueryOptions","getAccountPendingRecoveryQueryOptions","getAccountReputationsQueryOptions","ACCOUNT_OPERATION_GROUPS","ALL_ACCOUNT_OPERATIONS","acc","val","deriveNum","entry","normalizeOpType","restType","isNaiAsset","naiToString","normalizeOpValue","k","getTransactionsInfiniteQueryOptions","operationTypes","nextPage","getBotsQueryOptions","getReferralsInfiniteQueryOptions","maxId","nextMaxId","getReferralsStatsQueryOptions","getFriendsInfiniteQueryOptions","enabled","accountNames","SEARCH_LIMIT","getSearchFriendsQueryOptions","getTrendingTagsQueryOptions","afterTag","tags","getTrendingTagsWithStatsQueryOptions","getFragmentsQueryOptions","getFragmentsInfiniteQueryOptions","getPromotedPostsQuery","getEntryActiveVotesQueryOptions","getUserPostVoteQueryOptions","getContentQueryOptions","getContentRepliesQueryOptions","getPostHeaderQueryOptions","filterDmcaEntry","entryOrEntries","applyFilter","verifyPostOnAlternateNode","getPostQueryOptions","num","cleanPermlink","verified","verifiedEntry","bridgeApiCall","resolvePost","post","resp","getPost","resolvePosts","posts","validatedPosts","validateEntry","getPostsRanked","start_author","start_permlink","getAccountPosts","newEntry","requiredStringProps","prop","validatedEntry","getPostHeader","getDiscussion","validatedResp","getCommunity","getCommunities","last","normalizePost","getSubscriptions","getSubscribers","community","getRelationshipBetweenAccounts","getProfiles","SortOrder","sortDiscussions","discussion","allPayout","absNegative","isPinned","sortOrders","_a","_b","keyA","keyB","sorted","pinnedIndex","pinned","getDiscussionsQueryOptions","resolvedObserver","oldData","newData","optimisticEntries","fetchedPermlinks","missingOptimistic","opt","getDiscussionQueryOptions","getAccountPostsInfiniteQueryOptions","hasNextPage","getAccountPostsQueryOptions","displaySelects","displaySelect","select","orderForDisplay","byCreated","getPostsRankedInfiniteQueryOptions","_options","sanitizedTag","getPostsRankedQueryOptions","getReblogsQueryOptions","getRebloggedByQueryOptions","getSchedulesQueryOptions","getSchedulesInfiniteQueryOptions","getDraftsQueryOptions","getDraftsInfiniteQueryOptions","fetchUserImages","getImagesQueryOptions","getGalleryImagesQueryOptions","getImagesInfiniteQueryOptions","getCommentHistoryQueryOptions","makeEntryPath","cleanAuthor","normalizedAuthor","normalizedPermlink","getDeletedEntryQueryOptions","isValid","history","title","getPostTipsQueryOptions","isEnabled","normalizeContainer","normalizeParent","normalizeWaveEntryFromApi","containerSource","container","parent","toEntryArray","getVisibleFirstLevelThreadItems","discussionItemsRaw","discussionItems","firstLevelItems","parent_author","parent_permlink","mapThreadItemsToWaveEntries","items","DEFAULT_FEED_LIMIT","normalizeParams","fetchWavesFeedPage","containers","cursor","row","getWavesFeedQueryOptions","normalized","getWavesLatestFeedQueryOptions","fetchShortsFeedPage","getShortsFeedQueryOptions","THREAD_CONTAINER_BATCH_SIZE","MAX_CONTAINERS_TO_SCAN","getThreads","scannedContainers","skipContainerId","rpcParams","normalizedContainers","visibleItems","lastContainer","getWavesByHostQueryOptions","DEFAULT_TAG_FEED_LIMIT","getWavesByTagQueryOptions","getWavesFollowingQueryOptions","normalizedUsername","flattened","getWavesTrendingTagsQueryOptions","getWavesByAccountQueryOptions","getWavesTrendingAuthorsQueryOptions","getNormalizePostQueryOptions","isEntry","getDays","createdDate","past","getAccountVoteHistoryInfiniteQueryOptions","filters","dayLimit","historyObj","filtered","entries","firstHistory","getProfilesQueryOptions","getBalanceHistoryInfiniteQueryOptions","getAggregatedBalanceQueryOptions","getProMembersQueryOptions","proMembersSet","members","m","useAccountUpdate","queryClient","useQueryClient","_data","variables","useAccountRelationsUpdate","onError","kind","relationsQuery","actualRelation","buildVoteOp","weight","buildCommentOp","parentAuthor","parentPermlink","buildCommentOptionsOp","maxAcceptedPayout","percentHbd","allowVotes","allowCurationRewards","extensions","buildDeleteCommentOp","buildReblogOp","deleteReblog","buildTransferOp","buildMultiTransferOps","destinations","dest","buildRecurrentTransferOp","recurrence","executions","buildTransferToSavingsOp","buildTransferFromSavingsOp","requestId","buildCancelTransferFromSavingsOp","buildClaimInterestOps","buildTransferToVestingOp","buildWithdrawVestingOp","vestingShares","buildDelegateVestingSharesOp","delegator","delegatee","buildSetWithdrawVestingRouteOp","fromAccount","toAccount","percent","autoVest","buildConvertOp","buildCollateralizedConvertOp","buildEngineOp","contractAction","contractPayload","contractName","buildEngineClaimOp","buildDelegateRcOp","delegatees","maxRc","delegateeArray","buildFollowOp","buildUnfollowOp","buildIgnoreOp","buildUnignoreOp","buildSetLastReadOps","date","lastReadDate","notifyOp","ecencyNotifyOp","buildWitnessVoteOp","approve","buildWitnessProxyOp","proxy","buildProposalCreateOp","creator","buildProposalVoteOp","proposalIds","buildRemoveProposalOp","proposalOwner","buildUpdateProposalOp","dailyPay","subject","buildSubscribeOp","buildUnsubscribeOp","buildSetRoleOp","buildUpdateCommunityOp","buildPinPostOp","pin","buildMutePostOp","notes","mute","buildMuteUserOp","buildFlagPostOp","BuySellTransactionType","OrderIdPrefix","buildLimitOrderCreateOp","amountToSell","minToReceive","fillOrKill","orderId","formatNumber","decimals","buildLimitOrderCreateOpWithType","orderType","idPrefix","expirationStr","formattedAmountToSell","formattedMinToReceive","buildLimitOrderCancelOp","buildClaimRewardBalanceOp","rewardHive","rewardHbd","rewardVests","buildAccountUpdateOp","active","posting","memoKey","buildAccountUpdate2Op","buildAccountCreateOp","newAccountName","fee","buildCreateClaimedAccountOp","buildClaimAccountOp","buildGrantPostingPermissionOp","currentPosting","grantedAccount","weightThreshold","existingIndex","newAccountAuths","newPosting","buildRevokePostingPermissionOp","revokedAccount","buildChangeRecoveryAccountOp","accountToRecover","newRecoveryAccount","buildRequestAccountRecoveryOp","recoveryAccount","newOwnerAuthority","buildRecoverAccountOp","recentOwnerAuthority","buildBoostPlusOp","buildRcDelegationOp","buildPromoteOp","buildPointTransferOp","sender","receiver","normalizedAmount","buildMultiPointTransferOps","destArray","buildCommunityRegistrationOp","buildActiveCustomJsonOp","buildPostingCustomJsonOp","useFollow","_result","useUnfollow","useBookmarkAdd","useBookmarkDelete","bookmarkId","useAccountFavoriteAdd","qc","useAccountFavoriteDelete","listKey","infinitePrefix","checkKey","previousList","f","previousCheck","infiniteQueries","previousInfinite","context","dedupeAndSortKeyAuths","additions","useAccountUpdateKeyAuths","accountData","keepCurrent","currentKey","keysToRevoke","keysToRevokeByAuthority","prepareAuth","keyName","allKeysToRevoke","existingKeys","values","useAccountUpdatePassword","updateKeys","newPassword","currentPassword","useAccountRevokePosting","accountName","ctx","useAccountUpdateRecovery","email","canRevokeFromAuthority","revokingKeyStrs","remainingWeight","sum","accountWeight","buildRevokeKeysOp","revokingKeys","hasAnyKeyInAuth","clone","needsOwnerUpdate","useAccountRevokeKey","revokingKey","useClaimAccount","useGrantPostingPermission","useCreateAccount","HIVE_VOTING_MANA_REGENERATION_SECONDS","HIVE_100_PERCENT","HIVE_VOTE_DUST_THRESHOLD","getEffectiveVests","vesting","vestsToRshares","votingPowerValue","votePerc","hasStableVoteHardfork","dynamicProps","major","minor","stableVoteRshares","reserveRate","effectiveVests","usedMana","mana","votingRshares","totalVests","votingPower","powerRechargeTime","power","downVotingPower","totalShares","elapsed","currentManaPerc","rcPower","votingValue","rShares","OPERATION_AUTHORITY_MAP","getCustomJsonAuthority","customJsonOp","opType","customJson","getProposalAuthority","proposalOp","getOperationAuthority","getRequiredAuthority","highestAuthority","useSignOperationByKey","keyOrSeed","useSignOperationByKeychain","keyType","useSignOperationByHivesigner","callbackUri","getChainPropertiesQueryOptions","applyFragmentUpdate","vars","buildAddedFragment","useAddFragment","newFragment","index","useEditFragment","fragmentId","applyUpdate","fragment","useRemoveFragment","parseJsonResponse","errorData","signUp","referral","captchaToken","subscribeEmail","usrActivity","ty","bl","getNotifications","saveNotificationSetting","system","allows_notify","notify_types","getNotificationSetting","markNotifications","addImage","UPLOAD_HOST","uploadImage","file","fetchApi","formData","uploadImageWithSignature","deleteImage","imageId","addDraft","updateDraft","draftId","deleteDraft","addSchedule","schedule","reblog","deleteSchedule","moveSchedule","getPromotedPost","onboardEmail","friend","dataBody","useAddDraft","useUpdateDraft","useDeleteDraft","_variables","useAddSchedule","useDeleteSchedule","useMoveSchedule","useAddImage","nextCode","effectiveCode","useDeleteImage","prev","img","useUploadImage","getEntryFromCache","setEntryInCache","mutateEntry","updater","updated","EntriesCacheManagement","updateVotes","payout","updateReblogsCount","count","updateRepliesCount","addReply","reply","updateEntries","invalidateEntry","getEntry","isVoteAlreadyReflected","activeVotes","hasVoterRecord","applyVoteCacheUpdate","newVotes","newPayout","useVote","doInvalidate","useReblog","newCount","invalidate","useComment","beneficiaries","sortedBeneficiaries","isPost","activityType","queriesToInvalidate","discussionsAuthor","discussionsPermlink","addOptimisticDiscussionEntry","rootAuthor","rootPermlink","queries","removeOptimisticDiscussionEntry","snapshots","restoreDiscussionSnapshots","updateEntryInCache","updates","previous","restoreEntryInCache","useDeleteComment","_error","useCrossPost","useUpdateReply","usePromote","DEFAULT_VALIDATE_POST_DELAYS","getContent","validatePostCreating","attempts","delays","waitMs","mutations_exports","useRecordActivity","getLocationInfo","locationInfo","domain","getDiscoverLeaderboardQueryOptions","getDiscoverCurationQueryOptions","accountsResponse","element","curator","receivedVestingShares","delegatedVestingShares","vestingWithdrawRate","effectiveVest","getPageStatsQueryOptions","sortedDimensions","sortedMetrics","THREESPEAK_BENEFICIARY_ACCOUNT","THREESPEAK_BENEFICIARY_WEIGHT","hasThreeSpeakEmbed","enforceThreeSpeakBeneficiary","isThreeSpeakBeneficiary","queries_exports","getAccountTokenQueryOptions","getAccountVideosQueryOptions","getDecodeMemoQueryOptions","HiveSignerIntegration","memoQueryOptions","memoDecoded","tokenQueryOptions","ThreeSpeakIntegration","getHivePoshLinksQueryOptions","getStatsQueryOptions","filterBy","getRcStatsQueryOptions","getAccountRcQueryOptions","EMPTY","estimateRcPrecheck","rcStats","avgCost","safeBuffer","estimatedCost","willLikelyFail","getGameStatusCheckQueryOptions","useGameClaim","recordActivity","getQuestsQueryOptions","QUEST_CATALOG","getQuestCatalogEntry","tier","STREAK_FREEZE_PRICE","STREAK_FREEZE_MAX_OWNED","genIdempotencyKey","buyStreakFreezeRequest","useBuyStreakFreeze","useSubscribeCommunity","useUnsubscribeCommunity","useMutePost","useSetCommunityRole","team","idx","useUpdateCommunity","useRegisterCommunityRewards","usePinPost","getCommunitiesQueryOptions","getCommunityContextQueryOptions","getCommunityQueryOptions","SUBSCRIBERS_PAGE_SIZE","fetchSubscribersPage","getCommunitySubscribersQueryOptions","getCommunitySubscribersInfiniteQueryOptions","getAccountNotificationsInfiniteQueryOptions","getRewardedCommunitiesQueryOptions","ROLES","roleMap","getCommunityType","type_id","getCommunityPermissions","communityType","userRole","subscribed","canPost","canComment","isModerator","getNotificationsUnreadCountQueryOptions","getNotificationsInfiniteQueryOptions","NotificationFilter","NotifyTypes","ALL_NOTIFY_TYPES","NotificationViewType","getNotificationsSettingsQueryOptions","initialMuted","getAnnouncementsQueryOptions","getSpotlightsQueryOptions","_accessToken","markNotificationRead","isInfiniteData","useMarkNotificationsRead","previousData","updatedData","unreadKey","currentUnread","unreadCount","useSetLastRead","getProposalQueryOptions","proposal","getProposalsQueryOptions","proposals","expired","getProposalVotesInfiniteQueryOptions","getUserProposalVotesQueryOptions","vote","useProposalVote","useProposalCreate","getVestingDelegationsQueryOptions","fetchLimit","getAccountDelegationsQueryOptions","getVestingDelegationExpirationsQueryOptions","getConversionRequestsQueryOptions","getCollateralizedConversionRequestsQueryOptions","getSavingsWithdrawFromQueryOptions","getWithdrawRoutesQueryOptions","getOpenOrdersQueryOptions","getOutgoingRcDelegationsInfiniteQueryOptions","delegations","delegation","getIncomingRcQueryOptions","getReceivedVestingSharesQueryOptions","getRecurrentTransfersQueryOptions","normalizeString","trimmed","normalizeNumber","direct","parseToken","rawToken","extractTokens","record","resolveUsername","getPortfolioQueryOptions","getHiveAssetGeneralInfoQueryOptions","marketTicker","marketPrice","liquidBalance","savingsBalance","getHbdAssetGeneralInfoQueryOptions","price","getAPR","currentInflationRate","totalVestingFunds","getHivePowerAssetGeneralInfoQueryOptions","delegatedVests","receivedVests","withdrawRateVests","remainingToWithdrawVests","nextWithdrawalVests","hpBalance","outgoingDelegationsHp","incomingDelegationsHp","pendingPowerDownHp","nextPowerDownHp","totalBalance","availableHp","HIVE_ACCOUNT_OPERATION_GROUPS","HIVE_OPERATION_LIST","operationOrders","HIVE_OPERATION_ORDERS","HIVE_OPERATION_NAME_BY_ID","isHiveOperationName","resolveHiveOperationFilters","rawValues","hasAll","uniqueValues","operationIds","filterArgs","getHiveAssetTransactionsQueryOptions","__","pages","pageParams","getHbdAssetTransactionsQueryOptions","getHivePowerAssetTransactionsQueryOptions","userSelectedOperations","hasAllFilter","formatDate","pad","subtractSeconds","getHiveAssetMetricQueryOptions","hive","non_hive","open","_","prevStartDate","getHiveAssetWithdrawalRoutesQueryOptions","getHivePowerDelegatesInfiniteQueryOptions","getHivePowerDelegatingsQueryOptions","getOrderBookQueryOptions","getMarketStatisticsQueryOptions","getMarketHistoryQueryOptions","getHiveHbdStatsQueryOptions","oneDayAgo","dayChange","getMarketDataQueryOptions","getTradeHistoryQueryOptions","getFeedHistoryQueryOptions","getCurrentMedianHistoryPriceQueryOptions","useLimitOrderCreate","useLimitOrderCancel","getMarketData","getCurrencyRate","cur","getCurrencyTokenRate","getCurrencyRates","getHivePrice","ENGINE_RPC_HEADERS","engineRpc","engineRpcSafe","getHiveEngineOrderBook","baseParams","buy","sell","sortByPriceDesc","left","sortByPriceAsc","right","getHiveEngineTradeHistory","getHiveEngineOpenOrders","buyRaw","sellRaw","formatTotal","quantity","getHiveEngineMetrics","symbolQuery","getHiveEngineTokensMarket","getHiveEngineTokensBalances","getHiveEngineTokensMetadata","getHiveEngineTokenTransactions","getHiveEngineTokenMetrics","interval","getHiveEngineUnclaimedRewards","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMarketQueryOptions","getHiveEngineTokensMetadataQueryOptions","getHiveEngineTokenTransactionsQueryOptions","_allPages","lastPageParam","_firstPage","firstPageParam","getHiveEngineTokensMetricsQueryOptions","getHiveEngineUnclaimedRewardsQueryOptions","pending_token","getAllHiveEngineTokensQueryOptions","formattedNumber","fractionDigits","out","av","HiveEngineToken","getHiveEngineBalancesWithUsdQueryOptions","allTokens","balances","t","pricePerHive","providedMetrics","unpricedSymbols","balance","metric","tokenMetadata","lastPrice","balanceAmount","usdValue","getHiveEngineTokenGeneralInfoQueryOptions","hiveQuery","hiveData","metadataList","balanceList","marketList","stakedBalance","unstakingBalance","getPointsQueryOptions","pointsResponse","points","transactionsResponse","transactions","getPointsAssetGeneralInfoQueryOptions","getPointsAssetTransactionsQueryOptions","created","getAccountWalletAssetInfoQueryOptions","fetchQuery","qo","convertPriceToUserCurrency","assetInfo","conversionRate","portfolioQuery","getPortfolioAssetInfo","assetItem","extraItem","dataKey","numValue","portfolioAssetInfo","converted","AssetOperation","useTransfer","useTransferPoint","useDelegateVestingShares","useSetWithdrawVestingRoute","useTransferEngineToken","useTransferToSavings","useTransferFromSavings","useTransferToVesting","useWithdrawVesting","useConvert","useClaimInterest","CLAIM_REWARDS_INVALIDATION_DELAY_MS","pendingInvalidationTimers","useClaimRewards","timerKey","keysToInvalidate","existingTimer","rejected","useDelegateEngineToken","useUndelegateEngineToken","useStakeEngineToken","useUnstakeEngineToken","useClaimEngineRewards","useEngineMarketOrder","buildHiveOperations","buildEngineOperations","getWalletOperationAuthority","useWalletOperation","hiveOps","engineOps","useDelegateRc","useWitnessVote","useWitnessProxy","mapRestWitness","w","getWitnessesInfiniteQueryOptions","getWitnessVotersPageQueryOptions","getWitnessVoterCountQueryOptions","PointTransactionType","claimPointsRequest","contentType","detail","useClaimPoints","author_re","type_re","category_re","tag_re","SearchType","MAX_SEARCH_TAGS","MAX_SEARCH_QUERY_LENGTH","firstToken","normalizeSearchAuthor","normalizeSearchCategory","normalizeSearchTags","seen","buildSearchQuery","search","category","normalizedSearch","normalizedCategory","normalizedTags","part","SearchQuery","_query","re","matches","raw","isSearchResponse","MAX_RETRIES","isServer","searchRetryPolicy","failureCount","isTransient","searchQueryOptions","scroll_id","getControversialRisingInfiniteQueryOptions","sinceDate","similar","searchPath","SIMILAR_ENTRIES_SINCE_MS","SIMILAR_ENTRIES_TARGET","SIMILAR_ENTRIES_BODY_LIMIT","SIMILAR_ENTRIES_SSR_TIMEOUT_MS","SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS","SIMILAR_ENTRIES_MIN_RENDER","toMltExcerpt","fingerprint","getSimilarEntriesQueryOptions","rawTags","contentKey","collected","seenAuthors","getSearchAccountQueryOptions","getSearchTopicsQueryOptions","getSearchApiInfiniteQueryOptions","getSearchPathQueryOptions","getSupportSettingsRequest","getSupportSettingsQueryOptions","updateSupportSettingsRequest","applySupportSettingsUpdate","useUpdateSupportSettings","getBoostPlusPricesQueryOptions","getRcDelegationPricesQueryOptions","getRcDelegationActiveQueryOptions","responseData","getPromotePriceQueryOptions","getBoostPlusAccountPricesQueryOptions","useBoostPlus","useRcDelegation","hsTokenRenew","BAD_ACTORS_URL","getBadActorsQueryOptions","POLLS_PROTOCOL_VERSION","PollPreferredInterpretation","mapMetaChoicesToPollChoices","metaChoices","choice","normalizePoll","pollChoices","pollVoters","rawStats","choices","voters","getPollQueryOptions","usePollVote","pollTrxId"],"mappings":"yqBASA,IAAMA,EAAAA,CAAe,IAAI,YAAY,CAAC,CAAA,CAIlCC,EAAAA,CAAqD,IAAA,CACrDC,EAAAA,CAAuD,IAAA,CAE3D,SAASC,EAAAA,EAAgD,CACvD,OAAKF,EAAAA,GACC,OAAO,YAAgB,GAAA,CACzBA,EAAAA,CAAW,IAAI,WAAA,CAEfA,EAAAA,CAAW,CACT,OAAOG,CAAAA,CAAuB,CAE5B,IAAMC,CAAAA,CAAiB,GACvB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAE,MAAA,CAAQE,IAAK,CACjC,IAAIC,EAAIH,CAAAA,CAAE,UAAA,CAAWE,CAAC,CAAA,CACtB,GAAIC,EAAI,GAAA,CACNF,CAAAA,CAAK,KAAKE,CAAC,CAAA,CAAA,KAAA,GACFA,EAAI,IAAA,CACbF,CAAAA,CAAK,KAAK,GAAA,CAAQE,CAAAA,EAAK,CAAA,CAAI,GAAA,CAAQA,CAAAA,CAAI,EAAK,UACnCA,CAAAA,EAAK,KAAA,EAAUA,GAAK,KAAA,EAAUD,CAAAA,CAAI,EAAIF,CAAAA,CAAE,MAAA,CAAQ,CACzD,IAAMI,CAAAA,CAAOJ,CAAAA,CAAE,WAAW,EAAEE,CAAC,EAC7BC,CAAAA,CAAI,KAAA,EAAA,CAAYA,EAAI,IAAA,GAAU,EAAA,CAAA,EAAOC,CAAAA,CAAO,IAAA,CAAA,CAC5CH,CAAAA,CAAK,IAAA,CAAK,IAAQE,CAAAA,EAAK,EAAA,CAAK,IAASA,CAAAA,EAAK,EAAA,CAAM,GAAO,GAAA,CAASA,CAAAA,EAAK,EAAK,EAAA,CAAO,GAAA,CAAQA,EAAI,EAAK,EACpG,MACEF,CAAAA,CAAK,IAAA,CAAK,IAAQE,CAAAA,EAAK,EAAA,CAAK,GAAA,CAASA,CAAAA,EAAK,CAAA,CAAK,EAAA,CAAO,IAAQA,CAAAA,CAAI,EAAK,EAE3E,CACA,OAAO,IAAI,UAAA,CAAWF,CAAI,CAC5B,CACF,CAAA,CAAA,CAGGJ,EACT,CAEA,SAASQ,EAAAA,EAAkD,CACzD,OAAKP,EAAAA,GACC,OAAO,WAAA,CAAgB,GAAA,CACzBA,EAAAA,CAAW,IAAI,WAAA,CAEfA,EAAAA,CAAW,CACT,MAAA,CAAOQ,CAAAA,CAAyB,CAC9B,IAAMC,CAAAA,CAAQD,aAAa,WAAA,CAAc,IAAI,WAAWA,CAAC,CAAA,CAAI,IAAI,UAAA,CAAYA,CAAAA,CAAsB,OAASA,CAAAA,CAAsB,UAAA,CAAaA,EAAsB,UAAU,CAAA,CAC3KE,CAAAA,CAAS,EAAA,CACb,IAAA,IAASN,CAAAA,CAAI,EAAGA,CAAAA,CAAIK,CAAAA,CAAM,QAAU,CAClC,IAAME,EAAOF,CAAAA,CAAML,CAAC,CAAA,CAChBQ,CAAAA,CACAD,CAAAA,CAAO,GAAA,EAAQC,EAAYD,CAAAA,CAAMP,CAAAA,EAAK,IAChCO,CAAAA,CAAO,GAAA,IAAU,KAAQC,CAAAA,CAAAA,CAAcD,CAAAA,CAAO,EAAA,GAAS,CAAA,CAAMF,CAAAA,CAAML,CAAAA,CAAI,CAAC,CAAA,CAAI,EAAA,CAAOA,GAAK,CAAA,EAAA,CACxFO,CAAAA,CAAO,OAAU,GAAA,EAAQC,CAAAA,CAAAA,CAAcD,EAAO,EAAA,GAAS,EAAA,CAAA,CAAQF,EAAML,CAAAA,CAAI,CAAC,EAAI,EAAA,GAAS,CAAA,CAAMK,EAAML,CAAAA,CAAI,CAAC,CAAA,CAAI,EAAA,CAAOA,CAAAA,EAAK,CAAA,GAC3HQ,GAAcD,CAAAA,CAAO,CAAA,GAAS,IAAQF,CAAAA,CAAML,CAAAA,CAAI,CAAC,CAAA,CAAI,EAAA,GAAS,EAAA,CAAA,CAAQK,CAAAA,CAAML,CAAAA,CAAI,CAAC,EAAI,EAAA,GAAS,CAAA,CAAMK,EAAML,CAAAA,CAAI,CAAC,EAAI,EAAA,CAAOA,CAAAA,EAAK,CAAA,CAAA,CAClIQ,CAAAA,EAAa,KAAA,CAAUF,CAAAA,EAAU,OAAO,YAAA,CAAaE,CAAS,GAC3DA,CAAAA,EAAa,KAAA,CAASF,GAAU,MAAA,CAAO,YAAA,CAAa,OAAUE,CAAAA,EAAa,EAAA,CAAA,CAAK,OAAUA,CAAAA,CAAY,IAAA,CAAM,GACrH,CACA,OAAOF,CACT,CACF,CAAA,CAAA,CAGGV,EACT,CAEO,IAAMa,CAAAA,CAAN,MAAMA,CAAW,CAatB,YACEC,CAAAA,CAAmBD,CAAAA,CAAW,iBAC9BE,CAAAA,CAAwBF,CAAAA,CAAW,cAAA,CACnC,CAVFG,CAAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CACAA,EAAA,IAAA,CAAA,MAAA,CAAA,CACAA,CAAAA,CAAA,eACAA,CAAAA,CAAA,IAAA,CAAA,cAAA,CAAA,CACAA,EAAA,IAAA,CAAA,OAAA,CAAA,CACAA,CAAAA,CAAA,IAAA,CAAA,cAAA,CAAA,CA8PAA,CAAAA,CAAA,IAAA,CAAA,YAAA,CAAa,IAAA,CAAK,YAxPhB,IAAA,CAAK,MAAA,CAASF,IAAa,CAAA,CAAIhB,EAAAA,CAAe,IAAI,WAAA,CAAYgB,CAAQ,EACtE,IAAA,CAAK,IAAA,CAAOA,IAAa,CAAA,CAAI,IAAI,SAAShB,EAAY,CAAA,CAAI,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,CAClF,IAAA,CAAK,MAAA,CAAS,EACd,IAAA,CAAK,YAAA,CAAe,GACpB,IAAA,CAAK,KAAA,CAAQgB,EACb,IAAA,CAAK,YAAA,CAAeC,EACtB,CAEA,OAAO,QAAA,CAASD,EAAmBC,CAAAA,CAAoC,CACrE,OAAO,IAAIF,CAAAA,CAAWC,EAAUC,CAAY,CAC9C,CAEA,OAAO,MAAA,CACLE,CAAAA,CACAF,EACY,CACZ,IAAID,EAAW,CAAA,CACf,IAAA,IAASV,EAAI,CAAA,CAAGA,CAAAA,CAAIa,EAAQ,MAAA,CAAQ,EAAEb,EAAG,CACvC,IAAMc,EAAMD,CAAAA,CAAQb,CAAC,EACrB,GAAIc,CAAAA,YAAeL,CAAAA,CACjBC,CAAAA,EAAYI,CAAAA,CAAI,KAAA,CAAQA,EAAI,MAAA,CAAA,KAAA,GACnBA,CAAAA,YAAe,WACxBJ,CAAAA,EAAYI,CAAAA,CAAI,eACPA,CAAAA,YAAe,WAAA,CACxBJ,CAAAA,EAAYI,CAAAA,CAAI,UAAA,CAAA,KAAA,GACP,KAAA,CAAM,QAAQA,CAAG,CAAA,CAC1BJ,GAAYI,CAAAA,CAAI,MAAA,CAAA,WAEV,SAAA,CAAU,gBAAgB,CAEpC,CAEA,GAAIJ,CAAAA,GAAa,EACf,OAAO,IAAID,EAAW,CAAA,CAAGE,CAAY,EAGvC,IAAMI,CAAAA,CAAK,IAAIN,CAAAA,CAAWC,CAAAA,CAAUC,CAAY,CAAA,CAC1CK,CAAAA,CAAO,IAAI,UAAA,CAAWD,CAAAA,CAAG,MAAM,CAAA,CACjCE,CAAAA,CAAS,CAAA,CAEb,IAAA,IAASjB,CAAAA,CAAI,CAAA,CAAGA,EAAIa,CAAAA,CAAQ,MAAA,CAAQ,EAAEb,CAAAA,CAAG,CACvC,IAAIc,CAAAA,CAAMD,CAAAA,CAAQb,CAAC,CAAA,CACfc,CAAAA,YAAeL,CAAAA,EACjBO,EAAK,GAAA,CAAI,IAAI,WAAWF,CAAAA,CAAI,MAAA,CAAQA,EAAI,MAAA,CAAQA,CAAAA,CAAI,KAAA,CAAQA,CAAAA,CAAI,MAAM,CAAA,CAAGG,CAAM,CAAA,CAC/EA,CAAAA,EAAUH,EAAI,KAAA,CAAQA,CAAAA,CAAI,QACjBA,CAAAA,YAAe,UAAA,EACxBE,EAAK,GAAA,CAAIF,CAAAA,CAAKG,CAAM,CAAA,CACpBA,CAAAA,EAAUH,EAAI,MAAA,EACLA,CAAAA,YAAe,aACxBE,CAAAA,CAAK,GAAA,CAAI,IAAI,UAAA,CAAWF,CAAG,CAAA,CAAGG,CAAM,CAAA,CACpCA,CAAAA,EAAUH,EAAI,UAAA,GAGdE,CAAAA,CAAK,IAAIF,CAAAA,CAAiBG,CAAM,CAAA,CAChCA,CAAAA,EAAWH,CAAAA,CAAiB,MAAA,EAEhC,CAEA,OAAAC,CAAAA,CAAG,MAAQA,CAAAA,CAAG,MAAA,CAASE,EACvBF,CAAAA,CAAG,MAAA,CAAS,CAAA,CACLA,CACT,CAEA,OAAO,KACLG,CAAAA,CACAP,CAAAA,CACY,CACZ,GAAIO,CAAAA,YAAkBT,EAAY,CAChC,IAAMM,EAAKG,CAAAA,CAAO,KAAA,GAClB,OAAAH,CAAAA,CAAG,aAAe,EAAA,CACXA,CACT,CAEA,IAAIA,CAAAA,CACJ,GAAIG,CAAAA,YAAkB,UAAA,CACpBH,CAAAA,CAAK,IAAIN,CAAAA,CAAW,CAAA,CAAGE,CAAY,CAAA,CAC/BO,CAAAA,CAAO,OAAS,CAAA,GAClBH,CAAAA,CAAG,MAAA,CAASG,CAAAA,CAAO,MAAA,CACnBH,CAAAA,CAAG,OAASG,CAAAA,CAAO,UAAA,CACnBH,EAAG,KAAA,CAAQG,CAAAA,CAAO,WAAaA,CAAAA,CAAO,UAAA,CACtCH,CAAAA,CAAG,IAAA,CAAO,IAAI,QAAA,CAASG,EAAO,MAAM,CAAA,CAAA,CAAA,KAAA,GAE7BA,aAAkB,WAAA,CAC3BH,CAAAA,CAAK,IAAIN,CAAAA,CAAW,CAAA,CAAGE,CAAY,CAAA,CAC/BO,CAAAA,CAAO,WAAa,CAAA,GACtBH,CAAAA,CAAG,OAASG,CAAAA,CACZH,CAAAA,CAAG,OAAS,CAAA,CACZA,CAAAA,CAAG,KAAA,CAAQG,CAAAA,CAAO,UAAA,CAClBH,CAAAA,CAAG,KAAOG,CAAAA,CAAO,UAAA,CAAa,EAAI,IAAI,QAAA,CAASA,CAAM,CAAA,CAAI,IAAI,QAAA,CAASxB,EAAY,CAAA,CAAA,CAAA,KAAA,GAE3E,KAAA,CAAM,QAAQwB,CAAM,CAAA,CAC7BH,EAAK,IAAIN,CAAAA,CAAWS,EAAO,MAAA,CAAQP,CAAY,CAAA,CAC/CI,CAAAA,CAAG,KAAA,CAAQG,CAAAA,CAAO,OAClB,IAAI,UAAA,CAAWH,EAAG,MAAM,CAAA,CAAE,IAAIG,CAAM,CAAA,CAAA,WAE9B,SAAA,CAAU,gBAAgB,EAGlC,OAAOH,CACT,CAEA,UAAA,CACEI,CAAAA,CACAF,EACY,CACZ,OAAO,IAAA,CAAK,MAAA,CAAOE,CAAAA,CAAQF,CAAM,CACnC,CAEA,SAAA,CAAUG,EAAeH,CAAAA,CAA6B,CACpD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEVA,CAAAA,CAAS,EAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAC3B,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,KAAK,OAAA,CAAQA,CAAAA,CAAQG,CAAK,CAAA,CAE3BC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,SAAA,CAAUD,EAAeH,CAAAA,CAA6B,CACpD,OAAO,IAAA,CAAK,SAAA,CAAUG,CAAAA,CAAOH,CAAM,CACrC,CAEA,WAAWG,CAAAA,CAAeH,CAAAA,CAA6B,CACrD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEVA,EAAS,CAAA,CAAI,IAAA,CAAK,OAAO,UAAA,EAC3B,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,KAAK,IAAA,CAAK,QAAA,CAASA,EAAQG,CAAK,CAAA,CAE5BC,IAAU,IAAA,CAAK,MAAA,EAAU,GACtB,IACT,CAEA,WAAWD,CAAAA,CAAeH,CAAAA,CAA6B,CACrD,OAAO,IAAA,CAAK,WAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,SAAA,CAAUA,CAAAA,CAAyB,CACjC,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,EAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAMG,EAAQ,IAAA,CAAK,IAAA,CAAK,SAASH,CAAM,CAAA,CACvC,OAAII,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,CAAA,CAAA,CACtBD,CACT,CAEA,UAAUH,CAAAA,CAAyB,CACjC,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAM,CAC9B,CAEA,WAAWG,CAAAA,CAAeH,CAAAA,CAA6B,CACrD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAEVA,EAAS,CAAA,CAAI,IAAA,CAAK,OAAO,UAAA,EAC3B,IAAA,CAAK,OAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,IAAA,CAAK,QAAA,CAASA,EAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAE/CC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,UAAA,CAAWD,CAAAA,CAAeH,EAA6B,CACrD,OAAO,KAAK,UAAA,CAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,YAAYG,CAAAA,CAAeH,CAAAA,CAA6B,CACtD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAEVA,EAAS,CAAA,CAAI,IAAA,CAAK,OAAO,UAAA,EAC3B,IAAA,CAAK,OAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,EAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAEhDC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,WAAA,CAAYD,CAAAA,CAAeH,EAA6B,CACtD,OAAO,KAAK,WAAA,CAAYG,CAAAA,CAAOH,CAAM,CACvC,CAEA,WAAWG,CAAAA,CAAeH,CAAAA,CAA6B,CACrD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAEVA,EAAS,CAAA,CAAI,IAAA,CAAK,OAAO,UAAA,EAC3B,IAAA,CAAK,OAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,IAAA,CAAK,QAAA,CAASA,EAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAE/CC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,QAAA,CAASD,CAAAA,CAAeH,EAA6B,CACnD,OAAO,KAAK,UAAA,CAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,YAAYG,CAAAA,CAAeH,CAAAA,CAA6B,CACtD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAEVA,EAAS,CAAA,CAAI,IAAA,CAAK,OAAO,UAAA,EAC3B,IAAA,CAAK,OAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,EAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAEhDC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,WAAA,CAAYD,CAAAA,CAAeH,EAA6B,CACtD,OAAO,KAAK,WAAA,CAAYG,CAAAA,CAAOH,CAAM,CACvC,CAEA,WAAWA,CAAAA,CAAyB,CAClC,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BI,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAMG,CAAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAUH,EAAQ,IAAA,CAAK,YAAY,EAC3D,OAAII,CAAAA,GACF,IAAA,CAAK,MAAA,EAAU,CAAA,CAAA,CAEVD,CACT,CAIA,MAAA,CAAOD,CAAAA,CAA0DF,EAA6B,CAC5F,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAIK,CAAAA,CAYJ,OAXIH,aAAkBV,CAAAA,EACpBa,CAAAA,CAAM,IAAI,UAAA,CAAWH,CAAAA,CAAO,OAAQA,CAAAA,CAAO,MAAA,CAAQA,EAAO,KAAA,CAAQA,CAAAA,CAAO,MAAM,CAAA,CAC/EA,CAAAA,CAAO,MAAA,EAAUG,CAAAA,CAAI,MAAA,EACZH,CAAAA,YAAkB,WAC3BG,CAAAA,CAAMH,CAAAA,CACGA,aAAkB,WAAA,CAC3BG,CAAAA,CAAM,IAAI,UAAA,CAAWH,CAAM,CAAA,CAE3BG,CAAAA,CAAM,IAAI,UAAA,CAAWH,CAAM,CAAA,CAGzBG,CAAAA,CAAI,QAAU,CAAA,CAAU,IAAA,EAExBL,EAASK,CAAAA,CAAI,MAAA,CAAS,IAAA,CAAK,MAAA,CAAO,UAAA,EACpC,IAAA,CAAK,OAAOL,CAAAA,CAASK,CAAAA,CAAI,MAAM,CAAA,CAGjC,IAAI,WAAW,IAAA,CAAK,MAAM,EAAE,GAAA,CAAIA,CAAAA,CAAKL,CAAM,CAAA,CAEvCI,CAAAA,GAAU,KAAK,MAAA,EAAUC,CAAAA,CAAI,QAC1B,IAAA,CACT,CAEA,KAAA,CAAMC,CAAAA,CAA4B,CAChC,IAAMR,EAAK,IAAIN,CAAAA,CAAW,EAAG,IAAA,CAAK,YAAY,EAC9C,OAAIc,CAAAA,EACFR,CAAAA,CAAG,MAAA,CAAS,IAAI,WAAA,CAAY,KAAK,MAAA,CAAO,UAAU,EAClD,IAAI,UAAA,CAAWA,EAAG,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CACzDA,EAAG,IAAA,CAAO,IAAI,SAASA,CAAAA,CAAG,MAAM,IAEhCA,CAAAA,CAAG,MAAA,CAAS,KAAK,MAAA,CACjBA,CAAAA,CAAG,KAAO,IAAA,CAAK,IAAA,CAAA,CAEjBA,EAAG,MAAA,CAAS,IAAA,CAAK,MAAA,CACjBA,CAAAA,CAAG,YAAA,CAAe,IAAA,CAAK,aACvBA,CAAAA,CAAG,KAAA,CAAQ,KAAK,KAAA,CACTA,CACT,CAEA,IAAA,CAAKS,CAAAA,CAAgBC,CAAAA,CAA0B,CAI7C,GAHID,CAAAA,GAAU,SAAWA,CAAAA,CAAQ,IAAA,CAAK,QAClCC,CAAAA,GAAQ,MAAA,GAAWA,EAAM,IAAA,CAAK,KAAA,CAAA,CAE9BD,CAAAA,GAAUC,CAAAA,CACZ,OAAO,IAAIhB,EAAW,CAAA,CAAG,IAAA,CAAK,YAAY,CAAA,CAG5C,IAAMC,EAAWe,CAAAA,CAAMD,CAAAA,CACjBT,EAAK,IAAIN,CAAAA,CAAWC,EAAU,IAAA,CAAK,YAAY,EACrD,OAAAK,CAAAA,CAAG,OAAS,CAAA,CACZA,CAAAA,CAAG,KAAA,CAAQL,CAAAA,CAEX,IAAI,UAAA,CAAWK,EAAG,MAAM,CAAA,CAAE,IAAI,IAAI,UAAA,CAAW,KAAK,MAAM,CAAA,CAAE,QAAA,CAASS,CAAAA,CAAOC,CAAG,CAAA,CAAG,CAAC,CAAA,CAC1EV,CACT,CAEA,MAAA,CACEW,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAiB,OAAOH,EAAiB,GAAA,CACzCN,CAAAA,CAAW,OAAOO,CAAAA,CAAiB,GAAA,CACzCD,EAAeG,CAAAA,CAAiBJ,CAAAA,CAAO,OAASC,CAAAA,CAChDC,CAAAA,CAAeP,EAAW,IAAA,CAAK,MAAA,CAASO,EACxCC,CAAAA,CAAcA,CAAAA,GAAgB,OAAY,IAAA,CAAK,KAAA,CAAQA,CAAAA,CAEvD,IAAME,CAAAA,CAAMF,CAAAA,CAAcD,EAC1B,OAAIG,CAAAA,GAAQ,EAAUL,CAAAA,EAEtBA,CAAAA,CAAO,eAAeC,CAAAA,CAAeI,CAAG,CAAA,CACxC,IAAI,UAAA,CAAWL,CAAAA,CAAO,MAAM,CAAA,CAAE,GAAA,CAC5B,IAAI,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,CAAE,QAAA,CAASE,CAAAA,CAAcC,CAAW,CAAA,CAC9DF,CACF,EAEIN,CAAAA,GAAU,IAAA,CAAK,QAAUU,CAAAA,CAAAA,CACzBD,CAAAA,GAAgBJ,EAAO,MAAA,EAAUK,CAAAA,CAAAA,CAC9B,KACT,CAEA,cAAA,CAAerB,EAA8B,CAC3C,IAAIsB,EAAU,IAAA,CAAK,MAAA,CAAO,WAC1B,OAAIA,CAAAA,CAAUtB,CAAAA,CACL,IAAA,CAAK,MAAA,CAAA,CAAQsB,CAAAA,EAAW,GAAKtB,CAAAA,CAAWsB,CAAAA,CAAUtB,CAAQ,CAAA,CAE5D,IACT,CAEA,IAAA,EAAmB,CACjB,OAAA,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,MAAA,CAClB,KAAK,MAAA,CAAS,CAAA,CACP,IACT,CAEA,MAAA,CAAOA,EAA8B,CACnC,GAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAaA,CAAAA,CAAU,CACrC,IAAMQ,CAAAA,CAAS,IAAI,WAAA,CAAYR,CAAQ,EACvC,IAAI,UAAA,CAAWQ,CAAM,CAAA,CAAE,GAAA,CAAI,IAAI,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CACtD,KAAK,MAAA,CAASA,CAAAA,CACd,IAAA,CAAK,IAAA,CAAO,IAAI,QAAA,CAASA,CAAM,EACjC,CACA,OAAO,IACT,CAEA,KAAKe,CAAAA,CAA4B,CAC/B,OAAA,IAAA,CAAK,MAAA,EAAUA,CAAAA,CACR,IACT,CAEA,UAAA,CAAWb,CAAAA,CAAwBH,EAA6B,CAC9D,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAEV,OAAOG,CAAAA,EAAU,WAAUA,CAAAA,CAAQ,MAAA,CAAOA,CAAK,CAAA,CAAA,CAE/CH,CAAAA,CAAS,EAAI,IAAA,CAAK,MAAA,CAAO,YAC3B,IAAA,CAAK,MAAA,CAAOA,EAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,IAAA,CAAK,WAAA,CAAYA,CAAAA,CAAQG,EAAO,IAAA,CAAK,YAAY,EAElDC,CAAAA,GAAU,IAAA,CAAK,QAAU,CAAA,CAAA,CACtB,IACT,CAEA,SAAA,CAAUD,CAAAA,CAAwBH,CAAAA,CAA6B,CAC7D,OAAO,IAAA,CAAK,WAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,SAAA,CAAUA,CAAAA,CAAyB,CACjC,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,EAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAMG,CAAAA,CAAQ,IAAA,CAAK,KAAK,WAAA,CAAYH,CAAAA,CAAQ,KAAK,YAAY,CAAA,CAC7D,OAAII,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,CAAA,CAAA,CACtBD,CACT,CAEA,SAASH,CAAAA,CAAyB,CAChC,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAM,CAC9B,CAEA,WAAA,CAAYG,CAAAA,CAAwBH,CAAAA,CAA6B,CAC/D,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CACnC,OAAII,EAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAEV,OAAOG,GAAU,QAAA,GAAUA,CAAAA,CAAQ,OAAOA,CAAK,CAAA,CAAA,CAE/CH,EAAS,CAAA,CAAI,IAAA,CAAK,OAAO,UAAA,EAC3B,IAAA,CAAK,OAAOA,CAAAA,CAAS,CAAC,EAGxB,IAAA,CAAK,IAAA,CAAK,aAAaA,CAAAA,CAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAEnDC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,WAAA,CAAYD,EAAwBH,CAAAA,CAA6B,CAC/D,OAAO,IAAA,CAAK,WAAA,CAAYG,CAAAA,CAAOH,CAAM,CACvC,CAEA,WAAWA,CAAAA,CAAyB,CAClC,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAEd,IAAMG,CAAAA,CAAQ,KAAK,IAAA,CAAK,YAAA,CAAaH,EAAQ,IAAA,CAAK,YAAY,EAC9D,OAAII,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtBD,CACT,CAEA,UAAA,CAAWH,CAAAA,CAAyB,CAClC,OAAO,IAAA,CAAK,WAAWA,CAAM,CAC/B,CAEA,QAAA,CAASiB,CAAAA,CAAsC,CAC7C,IAAMjB,CAAAA,CAAS,IAAA,CAAK,MAAA,CACdkB,CAAAA,CAAQ,IAAA,CAAK,MACnB,OAAI,CAACD,GAAajB,CAAAA,GAAW,CAAA,EAAKkB,IAAU,IAAA,CAAK,MAAA,CAAO,UAAA,CAC/C,IAAA,CAAK,MAAA,CAEVlB,CAAAA,GAAWkB,EAAczC,EAAAA,CACtB,IAAA,CAAK,OAAO,KAAA,CAAMuB,CAAAA,CAAQkB,CAAK,CACxC,CAEA,cAAcD,CAAAA,CAAsC,CAClD,OAAO,IAAA,CAAK,QAAA,CAASA,CAAS,CAChC,CAEA,cAAcd,CAAAA,CAAeH,CAAAA,CAAsC,CACjE,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BI,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEd,IAAMmB,CAAAA,CAAO,IAAA,CAAK,iBAAA,CAAkBhB,CAAK,EAMzC,IALIH,CAAAA,CAASmB,EAAO,IAAA,CAAK,MAAA,CAAO,YAC9B,IAAA,CAAK,MAAA,CAAOnB,CAAAA,CAASmB,CAAI,CAAA,CAG3BhB,CAAAA,IAAW,EACJA,CAAAA,EAAS,GAAA,EACd,KAAK,IAAA,CAAK,QAAA,CAASH,IAAWG,CAAAA,CAAQ,GAAA,CAAQ,GAAI,CAAA,CAClDA,CAAAA,IAAW,EAIb,OAFA,IAAA,CAAK,KAAK,QAAA,CAASH,CAAAA,EAAAA,CAAUG,CAAK,CAAA,CAE9BC,CAAAA,EACF,IAAA,CAAK,MAAA,CAASJ,CAAAA,CACP,IAAA,EAEFmB,CACT,CAEA,YAAA,CAAanB,EAA6D,CACxE,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/B,OAAOA,CAAAA,CAAW,GAAA,GACpBA,EAAS,IAAA,CAAK,MAAA,CAAA,CAEhB,IAAIhB,CAAAA,CAAI,CAAA,CACJmB,EAAQ,CAAA,CACRhB,CAAAA,CACJ,GACEA,CAAAA,CAAI,IAAA,CAAK,IAAA,CAAK,SAASa,CAAAA,EAAQ,CAAA,CAC3BhB,EAAI,CAAA,GACNmB,CAAAA,EAAAA,CAAUhB,EAAI,GAAA,GAAU,CAAA,CAAIH,GAE9B,EAAEA,CAAAA,CAAAA,MAAAA,CACMG,EAAI,GAAA,IAAU,CAAA,EAGxB,OAFAgB,CAAAA,EAAS,CAAA,CAELC,GACF,IAAA,CAAK,MAAA,CAASJ,CAAAA,CACPG,CAAAA,EAEF,CAAE,KAAA,CAAAA,EAAO,MAAA,CAAQnB,CAAE,CAC5B,CAEA,iBAAA,CAAkBmB,EAAuB,CAEvC,OADAA,CAAAA,CAAQA,CAAAA,GAAU,CAAA,CACdA,CAAAA,CAAQ,IAAe,CAAA,CAClBA,CAAAA,CAAQ,MAAgB,CAAA,CACxBA,CAAAA,CAAQ,GAAK,EAAA,CAAW,CAAA,CACxBA,CAAAA,CAAQ,CAAA,EAAK,EAAA,CAAW,CAAA,CACrB,CACd,CAEA,YAAA,CAAaiB,EAAapB,CAAAA,CAAsC,CAC9D,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BqB,CAAAA,CAAgBjB,EAAW,IAAA,CAAK,MAAA,CAASJ,EAEvCsB,CAAAA,CAAU1C,EAAAA,GAAa,MAAA,CAAOwC,CAAG,CAAA,CACjCN,CAAAA,CAAMQ,CAAAA,CAAQ,MAAA,CACdC,EAAgB,IAAA,CAAK,iBAAA,CAAkBT,CAAG,CAAA,CAYhD,OAVIO,EAAgBE,CAAAA,CAAgBT,CAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EACpD,IAAA,CAAK,OAAOO,CAAAA,CAAgBE,CAAAA,CAAgBT,CAAG,CAAA,CAGjD,IAAA,CAAK,cAAcA,CAAAA,CAAKO,CAAa,CAAA,CACrCA,CAAAA,EAAiBE,CAAAA,CAEjB,IAAI,WAAW,IAAA,CAAK,MAAM,EAAE,GAAA,CAAID,CAAAA,CAASD,CAAa,CAAA,CACtDA,CAAAA,EAAiBP,EAEbV,CAAAA,EACF,IAAA,CAAK,OAASiB,CAAAA,CACP,IAAA,EAEFA,GAAiBrB,CAAAA,EAAU,CAAA,CACpC,CAEA,WAAA,CAAYA,CAAAA,CAA8D,CACxE,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BI,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEd,IAAMwB,CAAAA,CAAQxB,CAAAA,CACRyB,CAAAA,CAAY,IAAA,CAAK,aAAazB,CAAM,CAAA,CACpC0B,EAAWD,CAAAA,CAAU,KAAA,CACrBE,EAAYF,CAAAA,CAAU,MAAA,CAE5BzB,CAAAA,EAAU2B,CAAAA,CAGV,IAAMP,CAAAA,CAAMlC,IAAW,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW,IAAA,CAAK,OAAuBc,CAAAA,CAAQ0B,CAAQ,CAAC,CAAA,CAG5F,OAFA1B,GAAU0B,CAAAA,CAENtB,CAAAA,EACF,KAAK,MAAA,CAASJ,CAAAA,CACPoB,GAEA,CACL,MAAA,CAAQA,CAAAA,CACR,MAAA,CAAQpB,CAAAA,CAASwB,CACnB,CAEJ,CAEA,cAAA,CAAeR,EAAgBhB,CAAAA,CAA8D,CAC3F,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAMd,IAAMoB,CAAAA,CAAMlC,IAAW,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,CAAuBc,EAAQgB,CAAM,CAAC,EAE1F,OAAIZ,CAAAA,EACF,KAAK,MAAA,EAAUY,CAAAA,CACRI,GAEA,CACL,MAAA,CAAQA,EACR,MAAA,CAAAJ,CACF,CAEJ,CACF,CAAA,CArlBErB,EADWH,CAAAA,CACJ,eAAA,CAAgB,IAAA,CAAA,CACvBG,CAAAA,CAFWH,CAAAA,CAEJ,YAAA,CAAa,OACpBG,CAAAA,CAHWH,CAAAA,CAGJ,mBAAmB,EAAA,CAAA,CAC1BG,CAAAA,CAJWH,EAIJ,gBAAA,CAAiBA,CAAAA,CAAW,UAAA,CAAA,CAJ9B,IAAMoC,CAAAA,CAANpC,CAAAA,CCnEA,IAAMqC,CAAAA,CAAS,CAIpB,KAAA,CAAO,CACL,uBAAA,CACA,2BACA,8BAAA,CACA,wBAAA,CACA,yBACA,4BACF,CAAA,CAMA,UAAW,CACT,uBAAA,CACA,6BACA,wBAAA,CACA,4BAAA,CACA,wBACF,CAAA,CAcA,cAAA,CAAgB,CACd,SAAA,CAAW,CAAC,wBAAyB,wBAAwB,CAC/D,CAAA,CAaA,SAAA,CAAW,YAAA,CAKX,QAAA,CAAU,mEAKV,cAAA,CAAgB,KAAA,CAMhB,QAAS,GAAA,CAQT,gBAAA,CAAkB,KASlB,KAAA,CAAO,CAAA,CAyBP,UAAA,CAAY,CACV,eAAA,CAAiB,IAAA,CACjB,uBAAwB,GAAA,CACxB,qBAAA,CAAuB,EACvB,KAAA,CAAO,KAAA,CACP,kBAAmB,GAAA,CACnB,gBAAA,CAAkB,CAAA,CAClB,mBAAA,CAAqB,EAAA,CACrB,qBAAA,CAAuB,GAWvB,iBAAA,CAAmB,CACrB,CACF,CAAA,CAuBMC,EAAAA,CAAoBC,GACxB,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACf,CACE,GAAG,IAAI,GAAA,CACLA,EACG,MAAA,CAAQC,CAAAA,EAAmB,OAAOA,CAAAA,EAAM,QAAQ,CAAA,CAKhD,GAAA,CAAKA,CAAAA,EAAMA,CAAAA,CAAE,MAAK,CAAE,OAAA,CAAQ,OAAQ,EAAE,CAAC,EACvC,MAAA,CAAQA,CAAAA,EAAMA,CAAAA,CAAE,MAAA,CAAS,CAAA,EAAK,gBAAA,CAAiB,KAAKA,CAAC,CAAC,CAC3D,CACF,CAAA,CACA,EAAC,CAEMC,EAAAA,CAAYF,CAAAA,EAA0B,CACjD,IAAMG,CAAAA,CAAaJ,GAAiBC,CAAK,CAAA,CACpCG,EAAW,MAAA,GAChBL,CAAAA,CAAO,MAAQK,CAAAA,EACjB,CAAA,CAYaC,GAAgBJ,CAAAA,EAA0B,CACrD,IAAMK,CAAAA,CAAQN,EAAAA,CAAiBC,CAAK,CAAA,CAC/BK,CAAAA,CAAM,SACXP,CAAAA,CAAO,SAAA,CAAYO,CAAAA,EACrB,CAAA,CAUaC,EAAAA,CACXC,CAAAA,EACS,CACT,GAAI,CAACA,GAAO,OAAOA,CAAAA,EAAQ,SAAU,OACrC,IAAMrD,CAAAA,CAA8C,CAAE,GAAG4C,CAAAA,CAAO,cAAe,CAAA,CAC/E,IAAA,GAAW,CAACU,CAAAA,CAAKC,CAAI,IAAK,MAAA,CAAO,OAAA,CAAQF,CAAG,CAAA,CAAG,CAC7C,IAAMF,EAAQN,EAAAA,CAAiBU,CAAI,EAC/BJ,CAAAA,CAAM,MAAA,CACRnD,EAAKsD,CAAiB,CAAA,CAAIH,EAE1B,OAAOnD,CAAAA,CAAKsD,CAAiB,EAEjC,CACAV,EAAO,cAAA,CAAiB5C,EAC1B,EASawD,EAAAA,CAAgBC,CAAAA,EAAqB,CAGhD,GAAI,OAAOA,CAAAA,EAAO,SAAU,OAC5B,IAAMvC,EAAQuC,CAAAA,CAAG,IAAA,GAKb,CAACvC,CAAAA,EAAS,uBAAA,CAAwB,IAAA,CAAKA,CAAK,CAAA,GAChD0B,EAAO,SAAA,CAAY1B,CAAAA,EACrB,EAaawC,EAAAA,CAAiBC,CAAAA,EAA2C,CACvE,GAAI,CAACA,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAAU,OACvC,IAAMC,CAAAA,CAAIhB,EAAO,UAAA,CACXiB,CAAAA,CAAQC,GAA6B,OAAOA,CAAAA,EAAM,UAClDC,CAAAA,CAAOD,CAAAA,EACX,OAAOA,CAAAA,EAAM,QAAA,EAAY,OAAO,QAAA,CAASA,CAAC,GAAKA,CAAAA,CAAI,CAAA,CACjDD,CAAAA,CAAKF,CAAAA,CAAK,eAAe,CAAA,GAAGC,EAAE,eAAA,CAAkBD,CAAAA,CAAK,iBAMrDI,CAAAA,CAAIJ,CAAAA,CAAK,sBAAsB,CAAA,GACjCC,CAAAA,CAAE,sBAAA,CAAyB,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAK,uBAAwB,GAAK,CAAA,CAAA,CAEpEI,EAAIJ,CAAAA,CAAK,qBAAqB,IAAGC,CAAAA,CAAE,qBAAA,CAAwBD,CAAAA,CAAK,qBAAA,CAAA,CAChEE,CAAAA,CAAKF,CAAAA,CAAK,KAAK,CAAA,GAAGC,CAAAA,CAAE,MAAQD,CAAAA,CAAK,KAAA,CAAA,CACjCI,EAAIJ,CAAAA,CAAK,iBAAiB,IAAGC,CAAAA,CAAE,iBAAA,CAAoBD,EAAK,iBAAA,CAAA,CACxDI,CAAAA,CAAIJ,EAAK,gBAAgB,CAAA,GAAGC,EAAE,gBAAA,CAAmBD,CAAAA,CAAK,gBAAA,CAAA,CACtDI,CAAAA,CAAIJ,CAAAA,CAAK,mBAAmB,IAAGC,CAAAA,CAAE,mBAAA,CAAsBD,EAAK,mBAAA,CAAA,CAI5DI,CAAAA,CAAIJ,EAAK,qBAAqB,CAAA,GAChCC,CAAAA,CAAE,qBAAA,CAAwB,IAAA,CAAK,GAAA,CAAID,EAAK,qBAAA,CAAuB,CAAC,GAG9DI,CAAAA,CAAIJ,CAAAA,CAAK,iBAAiB,CAAA,GAC5BC,CAAAA,CAAE,iBAAA,CAAoB,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAK,kBAAmB,CAAC,CAAA,EAE5D,MCxRaK,EAAAA,CAAN,MAAMC,CAAU,CAWrB,WAAA,CAAYC,CAAAA,CAAkBC,EAAkBC,CAAAA,CAAsB,CAVtE1D,EAAA,IAAA,CAAA,MAAA,CAAA,CACAA,CAAAA,CAAA,iBACAA,CAAAA,CAAA,IAAA,CAAQ,YAAA,CAAA,CASN,IAAA,CAAK,IAAA,CAAOwD,CAAAA,CACZ,KAAK,QAAA,CAAWC,CAAAA,CAChB,KAAK,UAAA,CAAaC,CAAAA,EAAc,KAClC,CAQA,OAAO,IAAA,CAAKC,CAAAA,CAAgB,CAC1B,GAAI,OAAOA,CAAAA,EAAW,QAAA,CAAU,CAC9B,IAAMC,CAAAA,CAAOC,WAAWF,CAAM,CAAA,CAC1BF,EAAW,QAAA,CAASK,UAAAA,CAAWF,EAAK,QAAA,CAAS,CAAA,CAAG,CAAC,CAAC,CAAA,CAAG,EAAE,CAAA,CAAI,EAAA,CAC3DF,CAAAA,CAAa,IAAA,CAGbD,CAAAA,CAAW,CAAA,GACbC,EAAa,KAAA,CACbD,CAAAA,CAAWA,EAAW,CAAA,CAAA,CAExB,IAAMD,EAAOI,CAAAA,CAAK,QAAA,CAAS,CAAC,CAAA,CAC5B,OAAO,IAAIL,EAAUC,CAAAA,CAAMC,CAAAA,CAAUC,CAAU,CACjD,CAAA,WACQ,IAAI,KAAA,CAAM,0BAA0B,CAE9C,CAMA,QAAA,EAAW,CACT,IAAMpD,CAAAA,CAAS,IAAI,UAAA,CAAW,EAAE,EAAE,IAAA,CAAK,CAAC,EACxC,OAAI,IAAA,CAAK,WACPA,CAAAA,CAAO,CAAC,EAAK,IAAA,CAAK,QAAA,CAAW,GAAM,GAAA,CAEnCA,CAAAA,CAAO,CAAC,CAAA,CAAK,IAAA,CAAK,QAAA,CAAW,GAAM,GAAA,CAErCA,CAAAA,CAAO,IAAI,IAAA,CAAK,IAAA,CAAM,CAAC,CAAA,CAChBA,CACT,CAMA,cAAA,EAAiB,CACf,OAAOwD,WAAW,IAAA,CAAK,QAAA,EAAU,CACnC,CAQA,UAAW,CACT,OAAO,IAAA,CAAK,cAAA,EACd,CAQA,aAAaC,CAAAA,CAAyC,CACpD,GACGA,CAAAA,YAAmB,UAAA,EAAcA,EAAQ,MAAA,GAAW,EAAA,EACpD,OAAOA,CAAAA,EAAY,QAAA,EAAYA,EAAQ,MAAA,GAAW,EAAA,CAEnD,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA,CAEvD,OAAOA,CAAAA,EAAY,QAAA,GACrBA,CAAAA,CAAUF,UAAAA,CAAWE,CAAO,CAAA,CAAA,CAE9B,IAAMC,EAAMC,SAAAA,CAAU,SAAA,CAAU,UAAU,IAAA,CAAK,IAAA,CAAM,SAAS,CAAA,CACxDL,CAAAA,CAAO,IAAIK,UAAU,SAAA,CAAUD,CAAAA,CAAI,EAAGA,CAAAA,CAAI,CAAA,CAAG,KAAK,QAAQ,CAAA,CAChE,OAAO,IAAIE,CAAAA,CAAUN,CAAAA,CAAK,iBAAiBG,CAAO,CAAA,CAAE,SAAS,CAC/D,CACF,EC5FO,IAAMG,EAAN,MAAMC,CAAU,CASrB,WAAA,CAAYC,CAAAA,CAAiBC,EAAiB,CAR9CrE,CAAAA,CAAA,YACAA,CAAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CAQE,IAAA,CAAK,GAAA,CAAMoE,CAAAA,CAGX,IAAA,CAAK,OAASC,CAAAA,EAAUnC,CAAAA,CAAO,eACjC,CAUA,OAAO,WAAWoC,CAAAA,CAAwB,CACxC,IAAMC,CAAAA,CAAiBrC,CAAAA,CAAO,cAAA,CAC9B,GAAI,OAAOoC,CAAAA,EAAQ,UAAYA,CAAAA,CAAI,MAAA,EAAUC,EAAe,MAAA,CAC1D,MAAM,IAAI,KAAA,CAAM,oBAAoB,CAAA,CAEtC,IAAMF,CAAAA,CAASC,CAAAA,CAAI,MAAM,CAAA,CAAGC,CAAAA,CAAe,MAAM,CAAA,CACjD,GAAIF,IAAWE,CAAAA,CACb,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAc,CAAA,CAAE,CAAA,CAEhE,IAAIjE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAASkE,EAAAA,CAAK,MAAA,CAAOF,EAAI,KAAA,CAAMC,CAAAA,CAAe,MAAM,CAAC,EACvD,MAAQ,CACN,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAC/C,CAEA,GAAIjE,CAAAA,CAAO,SAAW,EAAA,CACpB,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA,CAE7C,IAAM8D,CAAAA,CAAM9D,CAAAA,CAAO,SAAS,CAAA,CAAG,EAAE,EAC3BmE,CAAAA,CAAWnE,CAAAA,CAAO,SAAS,EAAA,CAAI,EAAE,EACjCoE,CAAAA,CAAmBC,SAAAA,CAAUP,CAAG,CAAA,CAAE,QAAA,CAAS,EAAG,CAAC,CAAA,CACrD,GAAI,CAACQ,EAAAA,CAAkBH,CAAAA,CAAUC,CAAgB,CAAA,CAC/C,MAAM,IAAI,KAAA,CAAM,8BAA8B,EAEhD,GAAI,CACFT,UAAU,KAAA,CAAM,SAAA,CAAUG,CAAG,EAC/B,CAAA,KAAQ,CACN,MAAM,IAAI,KAAA,CAAM,oBAAoB,CACtC,CACA,OAAO,IAAID,CAAAA,CAAUC,CAAAA,CAAKC,CAAM,CAClC,CAOA,OAAO,IAAA,CAAK7D,CAAAA,CAAsC,CAChD,OAAIA,CAAAA,YAAiB2D,EACZ3D,CAAAA,CAEA2D,CAAAA,CAAU,WAAW3D,CAAe,CAE/C,CAQA,MAAA,CAAOuD,CAAAA,CAAqBc,EAAwC,CAClE,OAAI,OAAOA,CAAAA,EAAc,QAAA,GACvBA,CAAAA,CAAYvB,EAAAA,CAAU,IAAA,CAAKuB,CAAS,GAE/BZ,SAAAA,CAAU,MAAA,CAAOY,EAAU,IAAA,CAAMd,CAAAA,CAAS,KAAK,GAAA,CAAK,CACzD,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,SACV,CAAC,CACH,CAMA,UAAmB,CACjB,OAAOe,GAAa,IAAA,CAAK,GAAA,CAAK,IAAA,CAAK,MAAM,CAC3C,CAMA,QAAiB,CACf,OAAO,KAAK,QAAA,EACd,CAMA,OAAA,EAAkB,CAChB,OAAO,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,CACtC,CACF,CAAA,CAEMA,EAAAA,CAAe,CAACV,CAAAA,CAAiBC,CAAAA,GAA2B,CAChE,IAAMI,CAAAA,CAAWE,SAAAA,CAAUP,CAAG,CAAA,CAC9B,OAAOC,EAASG,EAAAA,CAAK,MAAA,CAAO,IAAI,UAAA,CAAW,CAAC,GAAGJ,CAAAA,CAAK,GAAGK,CAAAA,CAAS,SAAS,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAClF,CAAA,CAEMG,EAAAA,CAAoB,CAACG,CAAAA,CAAevF,CAAAA,GAA2B,CACnE,GAAIuF,CAAAA,CAAE,UAAA,GAAevF,EAAE,UAAA,CAAY,OAAO,OAC1C,IAAA,IAASJ,CAAAA,CAAI,EAAGA,CAAAA,CAAI2F,CAAAA,CAAE,WAAY3F,CAAAA,EAAAA,CAChC,GAAI2F,EAAE3F,CAAC,CAAA,GAAMI,EAAEJ,CAAC,CAAA,CAAG,OAAO,MAAA,CAE5B,OAAO,KACT,EC9HO,IAAM4F,EAAAA,CAAN,MAAMC,CAAM,CAIjB,YAAYC,CAAAA,CAAgBC,CAAAA,CAAgB,CAH5CnF,CAAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CACAA,CAAAA,CAAA,eAGE,IAAA,CAAK,MAAA,CAASkF,EACd,IAAA,CAAK,MAAA,CAASC,IAAW,MAAA,CAAS,OAAA,CAAUA,CAAAA,GAAW,KAAA,CAAQ,KAAA,CAAQA,EACzE,CAGA,OAAO,UAAA,CAAWxB,EAAgByB,CAAAA,CAAgC,IAAA,CAAa,CAC7E,GAAM,CAACC,EAAcF,CAAM,CAAA,CAAIxB,EAAO,KAAA,CAAM,GAAG,EAC/C,GAAI,CAAC,QAAS,OAAA,CAAS,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,MAAA,CAAQ,KAAK,EAAE,OAAA,CAAQwB,CAAM,IAAM,EAAA,CAC/E,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyBA,CAAM,CAAA,CAAE,CAAA,CAEnD,GAAIC,GAAkBD,CAAAA,GAAWC,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,mCAAmCA,CAAc,CAAA,MAAA,EAASD,CAAM,CAAA,CAAE,CAAA,CAEpF,IAAMD,EAAS,MAAA,CAAO,UAAA,CAAWG,CAAY,CAAA,CAC7C,GAAI,CAAC,MAAA,CAAO,QAAA,CAASH,CAAM,CAAA,CACzB,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyBG,CAAY,CAAA,CAAE,CAAA,CAEzD,OAAO,IAAIJ,CAAAA,CAAMC,CAAAA,CAAQC,CAAM,CACjC,CAOA,OAAO,IAAA,CAAK3E,CAAAA,CAAgC2E,EAA+B,CACzE,GAAI3E,aAAiByE,CAAAA,CAAO,CAC1B,GAAIE,CAAAA,EAAU3E,CAAAA,CAAM,MAAA,GAAW2E,EAC7B,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmCA,CAAM,SAAS3E,CAAAA,CAAM,MAAM,CAAA,CAAE,CAAA,CAElF,OAAOA,CACT,MAAO,CAAA,GAAI,OAAOA,GAAU,QAAA,EAAY,MAAA,CAAO,SAASA,CAAK,CAAA,CAC3D,OAAO,IAAIyE,CAAAA,CAAMzE,EAAO2E,CAAAA,EAAU,OAAO,EACpC,GAAI,OAAO3E,GAAU,QAAA,CAC1B,OAAOyE,CAAAA,CAAM,UAAA,CAAWzE,CAAAA,CAAO2E,CAAM,EAErC,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkB,MAAA,CAAO3E,CAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAEtD,CAKA,YAAA,EAAe,CACb,OAAQ,IAAA,CAAK,MAAA,EACX,KAAK,OAAA,CACL,KAAK,KAAA,CACL,KAAK,OAAA,CACL,KAAK,KAAA,CACL,KAAK,MACL,KAAK,MAAA,CACH,OAAO,CAAA,CACT,KAAK,QACH,OAAO,CAAA,CACT,QACE,OAAO,CACX,CACF,CAGA,QAAA,EAAW,CACT,OAAO,CAAA,EAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,YAAA,EAAc,CAAC,IAAI,IAAA,CAAK,MAAM,EACnE,CAEA,MAAA,EAAS,CACP,OAAO,IAAA,CAAK,QAAA,EACd,CACF,CAAA,CCvEO,IAAM8E,EAAAA,CAAN,MAAMC,CAAU,CAerB,WAAA,CAAYjF,CAAAA,CAAoB,CAdhCN,CAAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CAeE,KAAK,MAAA,CAASM,EAChB,CAdA,OAAO,IAAA,CAAKE,EAAwC,CAClD,OAAIA,aAAiB+E,CAAAA,CACZ/E,CAAAA,CACEA,aAAiB,UAAA,CACnB,IAAI+E,EAAU/E,CAAK,CAAA,CACjB,OAAOA,CAAAA,EAAU,QAAA,CACnB,IAAI+E,EAAU1B,UAAAA,CAAWrD,CAAK,CAAC,CAAA,CAE/B,IAAI+E,EAAU,IAAI,UAAA,CAAW/E,CAAK,CAAC,CAE9C,CAMA,UAAW,CACT,OAAOsD,WAAW,IAAA,CAAK,MAAM,CAC/B,CAEA,MAAA,EAAS,CACP,OAAO,IAAA,CAAK,QAAA,EACd,CACF,CAAA,CCtBA,IAAM0B,CAAAA,CAAgB,CACpB,KAAM,CAAA,CACN,OAAA,CAAS,EACT,QAAA,CAAU,CAAA,CACV,oBAAqB,CAAA,CACrB,gBAAA,CAAkB,EAClB,kBAAA,CAAoB,CAAA,CACpB,mBAAoB,CAAA,CACpB,YAAA,CAAc,CAAA,CACd,OAAA,CAAS,CAAA,CACT,cAAA,CAAgB,EAChB,cAAA,CAAgB,EAAA,CAChB,eAAgB,EAAA,CAChB,oBAAA,CAAsB,GACtB,qBAAA,CAAuB,EAAA,CAEvB,MAAA,CAAQ,EAAA,CAER,cAAA,CAAgB,EAAA,CAChB,YAAa,EAAA,CACb,eAAA,CAAiB,GACjB,0BAAA,CAA4B,EAAA,CAC5B,oBAAqB,EAAA,CACrB,aAAA,CAAe,EAAA,CACf,sBAAA,CAAwB,EAAA,CACxB,wBAAA,CAA0B,GAC1B,eAAA,CAAiB,EAAA,CACjB,wBAAyB,EAAA,CACzB,eAAA,CAAiB,GACjB,cAAA,CAAgB,EAAA,CAChB,eAAgB,EAAA,CAEhB,cAAA,CAAgB,GAChB,mBAAA,CAAqB,EAAA,CACrB,sBAAuB,EAAA,CACvB,4BAAA,CAA8B,GAE9B,qBAAA,CAAuB,EAAA,CACvB,aAAA,CAAe,EAAA,CACf,iBAAA,CAAmB,EAAA,CACnB,qBAAsB,EAAA,CACtB,uBAAA,CAAyB,GACzB,8BAAA,CAAgC,EAAA,CAChC,uBAAwB,EAAA,CACxB,eAAA,CAAiB,EAAA,CACjB,eAAA,CAAiB,EAAA,CACjB,qBAAA,CAAuB,GACvB,eAAA,CAAiB,EAAA,CACjB,gBAAiB,EAAA,CACjB,sBAAA,CAAwB,GACxB,kBAAA,CAAoB,EACtB,CAAA,CAIMC,EAAAA,CAAiB,IAAM,CAC3B,MAAM,IAAI,KAAA,CAAM,4BAA4B,CAC9C,CAAA,CACMC,EAAmB,CAACpF,CAAAA,CAAoBkD,IAAiB,CAC7DlD,CAAAA,CAAO,aAAakD,CAAI,EAC1B,EAEMmC,EAAAA,CAAkB,CAACrF,EAAoBkD,CAAAA,GAAiB,CAC5DlD,CAAAA,CAAO,UAAA,CAAWkD,CAAI,EACxB,EAEMoC,EAAAA,CAAkB,CAACtF,EAAoBkD,CAAAA,GAA0B,CACrElD,EAAO,UAAA,CAAWkD,CAAI,EACxB,CAAA,CAEMqC,EAAAA,CAAkB,CAACvF,EAAoBkD,CAAAA,GAAiB,CAC5DlD,EAAO,UAAA,CAAWkD,CAAI,EACxB,CAAA,CAEMsC,EAAAA,CAAmB,CAACxF,CAAAA,CAAoBkD,CAAAA,GAAiB,CAC7DlD,EAAO,WAAA,CAAYkD,CAAI,EACzB,CAAA,CAEMuC,CAAAA,CAAmB,CAACzF,CAAAA,CAAoBkD,CAAAA,GAAiB,CAC7DlD,CAAAA,CAAO,WAAA,CAAYkD,CAAI,EACzB,CAAA,CAEMwC,GAAmB,CAAC1F,CAAAA,CAAoBkD,IAA0B,CACtElD,CAAAA,CAAO,WAAA,CAAYkD,CAAI,EACzB,CAAA,CAEMyC,GAAoB,CAAC3F,CAAAA,CAAoBkD,IAA2B,CACxElD,CAAAA,CAAO,UAAUkD,CAAAA,CAAO,CAAA,CAAI,CAAC,EAC/B,CAAA,CAEM0C,EAAAA,CAA2BC,GAgCxB,CAAC7F,CAAAA,CAAoBkD,IAAc,CACxC,GAAM,CAAC4C,CAAAA,CAAIC,CAAI,CAAA,CAAI7C,CAAAA,CACnBlD,CAAAA,CAAO,aAAA,CAAc8F,CAAE,CAAA,CACvBD,CAAAA,CAAgBC,CAAE,CAAA,CAAE9F,CAAAA,CAAQ+F,CAAI,EAClC,CAAA,CAQIC,EAAkB,CAAChG,CAAAA,CAAoBkD,IAAyB,CACpE,IAAM+C,EAAQvB,EAAAA,CAAM,IAAA,CAAKxB,CAAI,CAAA,CACvBgD,CAAAA,CAAYD,CAAAA,CAAM,YAAA,EAAa,CACrCjG,CAAAA,CAAO,WAAW,IAAA,CAAK,KAAA,CAAMiG,EAAM,MAAA,CAAS,IAAA,CAAK,IAAI,EAAA,CAAIC,CAAS,CAAC,CAAC,CAAA,CACpElG,CAAAA,CAAO,WAAWkG,CAAS,CAAA,CAC3B,QAAS,CAAA,CAAI,CAAA,CAAG,EAAI,CAAA,CAAG,CAAA,EAAA,CACrBlG,CAAAA,CAAO,UAAA,CAAWiG,CAAAA,CAAM,MAAA,CAAO,WAAW,CAAC,CAAA,EAAK,CAAC,EAErD,CAAA,CAEME,GAAiB,CAACnG,CAAAA,CAAoBkD,IAAiB,CAC3DlD,CAAAA,CAAO,YAAY,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAKkD,CAAAA,CAAO,GAAG,CAAA,CAAE,OAAA,EAAQ,CAAI,GAAI,CAAC,EACtE,EAEMkD,EAAAA,CAAsB,CAACpG,EAAoBkD,CAAAA,GAA6B,CAE1EA,IAAS,IAAA,EACR,OAAOA,CAAAA,EAAS,QAAA,EAAYA,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAM,yCAAA,CAEjDlD,EAAO,MAAA,CAAO,IAAI,WAAW,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA,CAExCA,EAAO,MAAA,CAAO4D,CAAAA,CAAU,KAAKV,CAAI,CAAA,CAAE,GAAG,EAE1C,CAAA,CAEMmD,GAAmB,CAACnF,CAAAA,CAAsB,OACvC,CAAClB,CAAAA,CAAoBkD,IAA0C,CACpEA,CAAAA,CAAO8B,GAAU,IAAA,CAAK9B,CAAI,CAAA,CAC1B,IAAMrC,CAAAA,CAAMqC,CAAAA,CAAK,OAAO,MAAA,CACxB,GAAIhC,GACF,GAAIL,CAAAA,GAAQK,EACV,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwCA,CAAI,CAAA,YAAA,EAAeL,CAAG,CAAA,CAAE,CAAA,CAAA,KAGlFb,EAAO,aAAA,CAAca,CAAG,EAE1Bb,CAAAA,CAAO,MAAA,CAAOkD,CAAAA,CAAK,MAAM,EAC3B,CAAA,CAGIoD,GAA2BD,EAAAA,EAAiB,CAE5CE,GAAoB,CAACC,CAAAA,CAAoBC,IACtC,CAACzG,CAAAA,CAAoBkD,IAAc,CACxClD,CAAAA,CAAO,cAAckD,CAAAA,CAAK,MAAM,EAChC,IAAA,GAAW,CAACY,EAAK5D,CAAK,CAAA,GAAKgD,CAAAA,CACzBsD,CAAAA,CAAcxG,CAAAA,CAAQ8D,CAAG,EACzB2C,CAAAA,CAAgBzG,CAAAA,CAAQE,CAAK,EAEjC,CAAA,CAGIwG,EAAmBC,CAAAA,EAChB,CAAC3G,CAAAA,CAAoBkD,CAAAA,GAAgB,CAC1ClD,CAAAA,CAAO,cAAckD,CAAAA,CAAK,MAAM,EAChC,IAAA,IAAW6C,CAAAA,IAAQ7C,EACjByD,CAAAA,CAAe3G,CAAAA,CAAQ+F,CAAI,EAE/B,CAAA,CAGIa,EAAAA,CAAoBC,GACjB,CAAC7G,CAAAA,CAAoBkD,IAAc,CACxC,IAAA,GAAW,CAACY,CAAAA,CAAKgD,CAAU,IAAKD,CAAAA,CAC9B,GAAI,CACFC,CAAAA,CAAW9G,CAAAA,CAAQkD,EAAKY,CAAG,CAAC,EAC9B,CAAA,MAASiD,CAAAA,CAAY,CACnB,MAAAA,CAAAA,CAAM,OAAA,CAAU,GAAGjD,CAAG,CAAA,EAAA,EAAKiD,EAAM,OAAO,CAAA,CAAA,CAClCA,CACR,CAEJ,CAAA,CAGIC,EAAAA,CAAsBP,CAAAA,EACnB,CAACzG,CAAAA,CAAoBkD,IAA0B,CAChDA,CAAAA,GAAS,QACXlD,CAAAA,CAAO,SAAA,CAAU,CAAC,CAAA,CAClByG,CAAAA,CAAgBzG,CAAAA,CAAQkD,CAAI,CAAA,EAE5BlD,CAAAA,CAAO,UAAU,CAAC,EAEtB,EAGIiH,CAAAA,CAAsBL,EAAAA,CAAiB,CAC3C,CAAC,kBAAA,CAAoBnB,CAAgB,CAAA,CACrC,CAAC,gBAAiBc,EAAAA,CAAkBnB,CAAAA,CAAkBI,EAAgB,CAAC,CAAA,CACvE,CAAC,WAAA,CAAae,EAAAA,CAAkBH,EAAAA,CAAqBZ,EAAgB,CAAC,CACxE,CAAC,CAAA,CAEK0B,EAAAA,CAAwBN,GAAiB,CAC7C,CAAC,UAAWxB,CAAgB,CAAA,CAC5B,CAAC,QAAA,CAAUI,EAAgB,CAC7B,CAAC,CAAA,CAEK2B,EAAAA,CAAkBP,GAAiB,CACvC,CAAC,OAAQZ,CAAe,CAAA,CACxB,CAAC,OAAA,CAASA,CAAe,CAC3B,CAAC,CAAA,CAWKoB,EAAAA,CAA4BR,GAAiB,CACjD,CAAC,uBAAwBZ,CAAe,CAAA,CACxC,CAAC,oBAAA,CAAsBP,CAAgB,EACvC,CAAC,mBAAA,CAAqBD,EAAgB,CACxC,CAAC,EAEK6B,CAAAA,CAA0B,CAACC,CAAAA,CAA0BC,CAAAA,GAAqB,CAC9E,IAAMC,EAAmBZ,EAAAA,CAAiBW,CAAW,EACrD,OAAO,CAACvH,EAAoBkD,CAAAA,GAAc,CACxClD,CAAAA,CAAO,aAAA,CAAcsH,CAAW,CAAA,CAChCE,EAAiBxH,CAAAA,CAAQkD,CAAI,EAC/B,CACF,CAAA,CAEMuE,EAAmF,EAAC,CAE1FA,CAAAA,CAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,CAAAA,CAAc,eAAgB,CAC1F,CAAC,MAAOc,CAAe,CAAA,CACvB,CAAC,SAAA,CAAWZ,CAAgB,EAC5B,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,CAAC,QAAS6B,CAAmB,CAAA,CAC7B,CAAC,QAAA,CAAUA,CAAmB,CAAA,CAC9B,CAAC,SAAA,CAAWA,CAAmB,EAC/B,CAAC,UAAA,CAAYb,EAAmB,CAAA,CAChC,CAAC,gBAAiBhB,CAAgB,CACpC,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,8BAAA,CAAiCJ,EACpDnC,CAAAA,CAAc,8BAAA,CACd,CACE,CAAC,KAAA,CAAOc,CAAe,CAAA,CACvB,CAAC,YAAA,CAAcA,CAAe,CAAA,CAC9B,CAAC,UAAWZ,CAAgB,CAAA,CAC5B,CAAC,kBAAA,CAAoBA,CAAgB,EACrC,CAAC,OAAA,CAAS6B,CAAmB,CAAA,CAC7B,CAAC,SAAUA,CAAmB,CAAA,CAC9B,CAAC,SAAA,CAAWA,CAAmB,EAC/B,CAAC,UAAA,CAAYb,EAAmB,CAAA,CAChC,CAAC,eAAA,CAAiBhB,CAAgB,CAAA,CAClC,CAAC,aAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,CAAAA,CAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,EAAc,cAAA,CAAgB,CAC1F,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,OAAA,CAAS4B,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CACjD,CAAC,QAAA,CAAUD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CAClD,CAAC,SAAA,CAAWD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CACnD,CAAC,UAAA,CAAYb,EAAmB,EAChC,CAAC,eAAA,CAAiBhB,CAAgB,CACpC,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,qBAAA,CAAwBJ,CAAAA,CAC3CnC,EAAc,qBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,OAAA,CAASA,CAAgB,CAC5B,CACF,CAAA,CAEAqC,EAAqB,oBAAA,CAAuBJ,CAAAA,CAC1CnC,EAAc,oBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,SAAA,CAAWA,CAAgB,EAC5B,CAAC,SAAA,CAAWO,EAAiB,CAC/B,CACF,EAEA8B,CAAAA,CAAqB,4BAAA,CAA+BJ,EAClDnC,CAAAA,CAAc,4BAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,aAAcK,CAAgB,CACjC,CACF,CAAA,CAEAgC,CAAAA,CAAqB,uBAAA,CAA0BJ,EAC7CnC,CAAAA,CAAc,uBAAA,CACd,CACE,CAAC,oBAAA,CAAsBE,CAAgB,CAAA,CACvC,CAAC,sBAAA,CAAwBA,CAAgB,CAAA,CACzC,CAAC,aAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,EAEAsC,CAAAA,CAAqB,aAAA,CAAgBJ,CAAAA,CAAwBnC,CAAAA,CAAc,aAAA,CAAe,CACxF,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,KAAA,CAAOY,CAAe,CAAA,CACvB,CAAC,aAAcU,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,EAEDsC,CAAAA,CAAqB,oBAAA,CAAuBJ,EAC1CnC,CAAAA,CAAc,oBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,aAAA,CAAeY,CAAe,CAAA,CAC/B,CAAC,aAAcA,CAAe,CAAA,CAC9B,CAAC,cAAA,CAAgBA,CAAe,CAClC,CACF,CAAA,CAEAyB,CAAAA,CAAqB,QAAUJ,CAAAA,CAAwBnC,CAAAA,CAAc,QAAS,CAC5E,CAAC,eAAA,CAAiBE,CAAgB,CAAA,CAClC,CAAC,kBAAmBA,CAAgB,CAAA,CACpC,CAAC,QAAA,CAAUA,CAAgB,EAC3B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,QAASA,CAAgB,CAAA,CAC1B,CAAC,MAAA,CAAQA,CAAgB,EACzB,CAAC,eAAA,CAAiBA,CAAgB,CACpC,CAAC,CAAA,CAEDqC,EAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,EAAc,eAAA,CAAiB,CAC5F,CAAC,QAAA,CAAUE,CAAgB,CAAA,CAC3B,CAAC,UAAA,CAAYA,CAAgB,EAC7B,CAAC,qBAAA,CAAuBY,CAAe,CAAA,CACvC,CAAC,cAAeR,EAAgB,CAAA,CAChC,CAAC,aAAA,CAAeG,EAAiB,CAAA,CACjC,CAAC,wBAAA,CAA0BA,EAAiB,EAC5C,CACE,YAAA,CACAe,EACEd,EAAAA,CAAwB,CACtBgB,GAAiB,CAAC,CAAC,gBAAiBF,CAAAA,CAAgBQ,EAAqB,CAAC,CAAC,CAAC,CAC9E,CAAC,CACH,CACF,CACF,CAAC,CAAA,CAEDO,EAAqB,OAAA,CAAUJ,CAAAA,CAAwBnC,EAAc,OAAA,CAAS,CAC5E,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,WAAA,CAAaK,CAAgB,EAC9B,CAAC,QAAA,CAAUO,CAAe,CAC5B,CAAC,EAEDyB,CAAAA,CAAqB,sBAAA,CAAyBJ,CAAAA,CAC5CnC,CAAAA,CAAc,sBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,CAAC,QAAS6B,CAAmB,CAAA,CAC7B,CAAC,QAAA,CAAUA,CAAmB,EAC9B,CAAC,SAAA,CAAWA,CAAmB,CAAA,CAC/B,CAAC,UAAA,CAAYb,EAAmB,CAAA,CAChC,CAAC,gBAAiBhB,CAAgB,CAAA,CAClC,CAAC,YAAA,CAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,CAAAA,CAAqB,MAAA,CAASJ,EAAwBnC,CAAAA,CAAc,MAAA,CAAQ,CAC1E,CAAC,gBAAA,CAAkBwB,EAAgBtB,CAAgB,CAAC,CAAA,CACpD,CAAC,IAAA,CAAMI,EAAgB,EACvB,CAAC,MAAA,CAAQc,EAAwB,CACnC,CAAC,EAYDmB,CAAAA,CAAqB,WAAA,CAAcJ,EAAwBnC,CAAAA,CAAc,WAAA,CAAa,CACpF,CAAC,gBAAA,CAAkBwB,EAAgBtB,CAAgB,CAAC,EACpD,CAAC,wBAAA,CAA0BsB,CAAAA,CAAgBtB,CAAgB,CAAC,CAAA,CAC5D,CAAC,IAAA,CAAMA,CAAgB,EACvB,CAAC,MAAA,CAAQA,CAAgB,CAC3B,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,qBAAA,CAAwBJ,CAAAA,CAC3CnC,EAAc,qBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,SAAA,CAAWO,EAAiB,CAC/B,CACF,CAAA,CAEA8B,EAAqB,uBAAA,CAA0BJ,CAAAA,CAC7CnC,EAAc,uBAAA,CACd,CACE,CAAC,WAAA,CAAaE,CAAgB,EAC9B,CAAC,WAAA,CAAaA,CAAgB,CAAA,CAC9B,CAAC,iBAAkBY,CAAe,CACpC,CACF,CAAA,CAEAyB,CAAAA,CAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,QAAA,CAAUE,CAAgB,CAAA,CAC3B,CAAC,WAAYA,CAAgB,CAC/B,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,cAAA,CAAiBJ,EAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,QAASA,CAAgB,CAAA,CAC1B,CAAC,KAAA,CAAOA,CAAgB,EACxB,CAAC,WAAA,CAAaK,CAAgB,CAAA,CAC9B,CAAC,UAAWE,EAAiB,CAC/B,CAAC,CAAA,CAED8B,CAAAA,CAAqB,eAAiBJ,CAAAA,CAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,OAAA,CAASA,CAAgB,CAAA,CAC1B,CAAC,KAAA,CAAOA,CAAgB,EACxB,CAAC,WAAA,CAAaK,CAAgB,CAChC,CAAC,EAEDgC,CAAAA,CAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,MAAA,CAAQE,CAAgB,EACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,QAASA,CAAgB,CAAA,CAC1B,CAAC,KAAA,CAAOA,CAAgB,EACxB,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,WAAA,CAAaK,CAAgB,CAAA,CAC9B,CAAC,aAAcO,CAAe,CAAA,CAC9B,CAAC,aAAA,CAAeA,CAAe,CACjC,CAAC,CAAA,CAEDyB,CAAAA,CAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,gBAAiB,CAC5F,CAAC,OAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,YAAA,CAAcY,CAAe,EAC9B,CAAC,aAAA,CAAeA,CAAe,CAAA,CAC/B,CAAC,YAAaP,CAAgB,CAAA,CAC9B,CAAC,OAAA,CAASL,CAAgB,EAC1B,CAAC,KAAA,CAAOY,CAAe,CAAA,CACvB,CAAC,YAAaZ,CAAgB,CAAA,CAC9B,CAAC,uBAAA,CAAyBe,EAAc,CAAA,CACxC,CAAC,mBAAA,CAAqBA,EAAc,CACtC,CAAC,CAAA,CAEDsB,EAAqB,YAAA,CAAeJ,CAAAA,CAAwBnC,CAAAA,CAAc,YAAA,CAAc,CACtF,CAAC,YAAaE,CAAgB,CAAA,CAC9B,CAAC,eAAA,CAAiB+B,EAAe,CACnC,CAAC,CAAA,CAEDM,CAAAA,CAAqB,kBAAA,CAAqBJ,CAAAA,CACxCnC,CAAAA,CAAc,mBACd,CACE,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,SAAA,CAAWK,CAAgB,CAC9B,CACF,CAAA,CAEAgC,EAAqB,kBAAA,CAAqBJ,CAAAA,CACxCnC,EAAc,kBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,SAAA,CAAWK,CAAgB,EAC5B,CAAC,gBAAA,CAAkBO,CAAe,CAAA,CAClC,CAAC,iBAAkBA,CAAe,CAAA,CAClC,CAAC,cAAA,CAAgBL,EAAiB,CAAA,CAClC,CAAC,YAAA,CAAcQ,EAAc,CAC/B,CACF,CAAA,CAEAsB,EAAqB,mBAAA,CAAsBJ,CAAAA,CACzCnC,CAAAA,CAAc,mBAAA,CACd,CACE,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,SAAA,CAAWK,CAAgB,EAC5B,CAAC,gBAAA,CAAkBO,CAAe,CAAA,CAClC,CAAC,gBAAiBmB,EAAe,CAAA,CACjC,CAAC,cAAA,CAAgBxB,EAAiB,EAClC,CAAC,YAAA,CAAcQ,EAAc,CAC/B,CACF,CAAA,CAEAsB,EAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,EAAc,eAAA,CAAiB,CAC5F,CAAC,oBAAA,CAAsBE,CAAgB,CAAA,CACvC,CAAC,qBAAA,CAAuB6B,CAAmB,EAC3C,CAAC,wBAAA,CAA0BA,CAAmB,CAAA,CAC9C,CAAC,aAAcP,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAYDsC,EAAqB,wBAAA,CAA2BJ,CAAAA,CAC9CnC,EAAc,wBAAA,CACd,CACE,CAAC,kBAAA,CAAoBE,CAAgB,EACrC,CAAC,oBAAA,CAAsBA,CAAgB,CAAA,CACvC,CAAC,sBAAuB6B,CAAmB,CAAA,CAC3C,CAAC,YAAA,CAAcP,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,EAEAsC,CAAAA,CAAqB,aAAA,CAAgBJ,EAAwBnC,CAAAA,CAAc,aAAA,CAAe,CACxF,CAAC,eAAA,CAAiBE,CAAgB,CAAA,CAClC,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,CAAC,sBAAuB6B,CAAmB,CAC7C,CAAC,CAAA,CAEDQ,CAAAA,CAAqB,iBAAA,CAAoBJ,CAAAA,CAAwBnC,CAAAA,CAAc,iBAAA,CAAmB,CAChG,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,wBAAyBA,CAAgB,CAAA,CAC1C,CAAC,eAAA,CAAiBA,CAAgB,CACpC,CAAC,CAAA,CAEDqC,EAAqB,0BAAA,CAA6BJ,CAAAA,CAChDnC,EAAc,0BAAA,CACd,CACE,CAAC,cAAA,CAAgBE,CAAgB,CAAA,CACjC,CAAC,YAAA,CAAcA,CAAgB,EAC/B,CAAC,SAAA,CAAWI,EAAgB,CAAA,CAC5B,CAAC,WAAA,CAAaG,EAAiB,CACjC,CACF,EAEA8B,CAAAA,CAAqB,QAAA,CAAWJ,EAAwBnC,CAAAA,CAAc,QAAA,CAAU,CAC9E,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,SAAUY,CAAe,CAAA,CAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAC3B,CAAC,CAAA,CAEDqC,EAAqB,qBAAA,CAAwBJ,CAAAA,CAC3CnC,EAAc,qBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,YAAA,CAAcK,CAAgB,EAC/B,CAAC,IAAA,CAAML,CAAgB,CAAA,CACvB,CAAC,SAAUY,CAAe,CAAA,CAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAC3B,CACF,CAAA,CAEAqC,CAAAA,CAAqB,oBAAsBJ,CAAAA,CACzCnC,CAAAA,CAAc,oBACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,QAAA,CAAUY,CAAe,EAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAC3B,CACF,EAEAqC,CAAAA,CAAqB,mBAAA,CAAsBJ,EACzCnC,CAAAA,CAAc,mBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,SAAUY,CAAe,CAC5B,CACF,CAAA,CAEAyB,CAAAA,CAAqB,IAAA,CAAOJ,CAAAA,CAAwBnC,CAAAA,CAAc,IAAA,CAAM,CACtE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,SAAUA,CAAgB,CAAA,CAC3B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,QAAA,CAAUC,EAAe,CAC5B,CAAC,CAAA,CAEDoC,EAAqB,gBAAA,CAAmBJ,CAAAA,CAAwBnC,EAAc,gBAAA,CAAkB,CAC9F,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,gBAAA,CAAkBY,CAAe,CACpC,CAAC,CAAA,CAEDyB,CAAAA,CAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,EAAc,cAAA,CAAgB,CAC1F,CAAC,OAAA,CAASE,CAAgB,EAC1B,CAAC,KAAA,CAAOA,CAAgB,CAAA,CACxB,CAAC,mBAAA,CAAqBgB,EAAmB,CAAA,CACzC,CAAC,QAASgB,EAAyB,CAAA,CACnC,CAAC,KAAA,CAAOpB,CAAe,CACzB,CAAC,CAAA,CAEDyB,CAAAA,CAAqB,uBAAyBJ,CAAAA,CAC5CnC,CAAAA,CAAc,uBACd,CACE,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,OAAA,CAASmB,EAAAA,CAAkBnB,EAAkBkB,EAAwB,CAAC,EACvE,CAAC,YAAA,CAAcI,EAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,CAAAA,CAAqB,gBAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,gBAAiB,CAC5F,CAAC,UAAWE,CAAgB,CAAA,CAC5B,CAAC,OAAA,CAAS4B,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CACjD,CAAC,SAAUD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CAClD,CAAC,SAAA,CAAWD,EAAAA,CAAmBC,CAAmB,CAAC,EACnD,CAAC,UAAA,CAAYD,GAAmBZ,EAAmB,CAAC,EACpD,CAAC,eAAA,CAAiBhB,CAAgB,CAAA,CAClC,CAAC,wBAAyBA,CAAgB,CAAA,CAC1C,CAAC,YAAA,CAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAEDsC,CAAAA,CAAqB,eAAA,CAAkBJ,EAAwBnC,CAAAA,CAAc,eAAA,CAAiB,CAC5F,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,aAAce,EAAc,CAAA,CAC7B,CAAC,UAAA,CAAYA,EAAc,EAC3B,CAAC,WAAA,CAAaH,CAAe,CAAA,CAC7B,CAAC,SAAA,CAAWZ,CAAgB,CAAA,CAC5B,CAAC,WAAYA,CAAgB,CAAA,CAC7B,CAAC,YAAA,CAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAEDsC,CAAAA,CAAqB,sBAAwBJ,CAAAA,CAC3CnC,CAAAA,CAAc,sBACd,CACE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,eAAgBsB,CAAAA,CAAgBpB,EAAe,CAAC,CAAA,CACjD,CAAC,UAAWK,EAAiB,CAAA,CAC7B,CAAC,YAAA,CAAce,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,EAEAsC,CAAAA,CAAqB,eAAA,CAAkBJ,EAAwBnC,CAAAA,CAAc,eAAA,CAAiB,CAC5F,CAAC,gBAAA,CAAkBE,CAAgB,EACnC,CAAC,cAAA,CAAgBsB,EAAgBpB,EAAe,CAAC,EACjD,CAAC,YAAA,CAAcoB,EAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAED,IAAMuC,EAAAA,CAA2Bd,EAAAA,CAAiB,CAAC,CAAC,UAAA,CAAYT,EAAc,CAAC,CAAC,CAAA,CAEhFsB,EAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,EAAc,eAAA,CAAiB,CAC5F,CAAC,aAAA,CAAeQ,EAAgB,CAAA,CAChC,CAAC,SAAA,CAAWN,CAAgB,EAC5B,CAAC,WAAA,CAAaY,CAAe,CAAA,CAC7B,CAAC,UAAWZ,CAAgB,CAAA,CAC5B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CACE,YAAA,CACAsB,CAAAA,CAAgBd,GAAwB,CAACT,EAAAA,CAAgBuC,EAAwB,CAAC,CAAC,CACrF,CACF,CAAC,EAEDD,CAAAA,CAAqB,sBAAA,CAAyBJ,EAC5CnC,CAAAA,CAAc,sBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,WAAA,CAAaK,CAAgB,CAAA,CAC9B,CAAC,SAAUO,CAAe,CAC5B,CACF,CAAA,CAEAyB,CAAAA,CAAqB,kBAAA,CAAqBJ,CAAAA,CACxCnC,CAAAA,CAAc,kBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,QAAA,CAAUY,CAAe,CAAA,CAC1B,CAAC,MAAA,CAAQZ,CAAgB,EACzB,CAAC,YAAA,CAAcI,EAAgB,CAAA,CAC/B,CAAC,aAAcA,EAAgB,CAAA,CAC/B,CACE,YAAA,CACAkB,CAAAA,CACEE,GAAiB,CACf,CAAC,OAAQrB,EAAe,CAAA,CACxB,CAAC,OAAA,CAASqB,EAAAA,CAAiB,CAAC,CAAC,SAAA,CAAWrB,EAAe,CAAC,CAAC,CAAC,CAC5D,CAAC,CACH,CACF,CACF,CACF,CAAA,CAEA,IAAMoC,EAAAA,CAAsB,CAAC3H,EAAoB4H,CAAAA,GAAyB,CACxE,IAAMd,CAAAA,CAAaW,CAAAA,CAAqBG,CAAAA,CAAU,CAAC,CAAC,CAAA,CACpD,GAAI,CAACd,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,gCAAgCc,CAAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAA,CAEhE,GAAI,CACFd,CAAAA,CAAW9G,EAAQ4H,CAAAA,CAAU,CAAC,CAAC,EACjC,CAAA,MAASb,CAAAA,CAAY,CACnB,MAAAA,CAAAA,CAAM,QAAU,CAAA,EAAGa,CAAAA,CAAU,CAAC,CAAC,CAAA,EAAA,EAAKb,EAAM,OAAO,CAAA,CAAA,CAC3CA,CACR,CACF,CAAA,CAEMc,EAAAA,CAAwBjB,GAAiB,CAC7C,CAAC,gBAAiBpB,EAAgB,CAAA,CAClC,CAAC,kBAAA,CAAoBC,CAAgB,CAAA,CACrC,CAAC,YAAA,CAAcU,EAAc,EAC7B,CAAC,YAAA,CAAcO,EAAgBiB,EAAmB,CAAC,EACnD,CAAC,YAAA,CAAcjB,EAAgBtB,CAAgB,CAAC,CAClD,CAAC,CAAA,CAEK0C,GAA0BlB,EAAAA,CAAiB,CAC/C,CAAC,MAAA,CAAQR,EAAmB,CAAA,CAC5B,CAAC,IAAA,CAAMA,EAAmB,EAC1B,CAAC,OAAA,CAASV,EAAgB,CAAA,CAC1B,CAAC,QAASD,CAAgB,CAAA,CAC1B,CAAC,WAAA,CAAaY,EAAAA,EAAkB,CAClC,CAAC,CAAA,CAEY0B,GAAa,CAExB,KAAA,CAAO/B,EAUP,IAAA,CAAM8B,EAAAA,CAIN,KAAA,CAAOX,EAAAA,CACP,SAAA,CAAWf,EAAAA,CAEX,OAAQhB,CAAAA,CACR,WAAA,CAAayC,GACb,MAAA,CAAQrC,EAAAA,CACR,OAAQC,CAIV,CAAA,CCvwBO,IAAMuC,EAAAA,CAASC,GACb,IAAI,OAAA,CAASC,GAAY,UAAA,CAAWA,CAAAA,CAASD,CAAE,CAAC,CAAA,CCmBzD,IAAME,IAA0B,IAAM,CACpC,GAAI,CAGF,OACE,EAFA,OAAO,SAAA,CAAc,GAAA,EAAgB,SAAA,CAAkB,OAAA,GAAY,aAAA,CAAA,EAGnE,OAAO,OAAA,CAAY,GAAA,EACnB,QAAQ,QAAA,EAAY,IAAA,EACpB,QAAQ,QAAA,CAAS,IAAA,EAAQ,IAE7B,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CAAA,IAOA,SAASC,EAAAA,EAAgD,CACvD,OAAOD,EAAAA,CAAgB,CAAE,YAAA,CAAcvG,CAAAA,CAAO,SAAU,CAAA,CAAI,EAC9D,CAIO,IAAMyG,GAAN,cAAuB,KAAM,CAKlC,WAAA,CAAYC,CAAAA,CAAyD,CACnE,MAAMA,CAAAA,CAAS,OAAO,EALxB5I,CAAAA,CAAA,IAAA,CAAA,MAAA,CAAO,YACPA,CAAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CACAA,CAAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CACAA,CAAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAGE,KAAK,IAAA,CAAO4I,CAAAA,CAAS,KACjB,MAAA,GAAUA,CAAAA,GACZ,KAAK,IAAA,CAAOA,CAAAA,CAAS,IAAA,EAEzB,CACF,CAAA,CAOMC,EAAAA,CAAN,cAAwB,KAAM,CAQ5B,YACEC,CAAAA,CACA/E,CAAAA,CACAd,EAAwD,EAAC,CACzD,CACA,KAAA,CAAMc,CAAO,EAZf/D,CAAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAEAA,EAAA,IAAA,CAAA,aAAA,CAAA,CAIAA,CAAAA,CAAA,oBAOE,IAAA,CAAK,IAAA,CAAO8I,CAAAA,CACZ,IAAA,CAAK,WAAA,CAAc7F,CAAAA,CAAK,aAAe,CAAA,CACvC,IAAA,CAAK,YAAcA,CAAAA,CAAK,WAAA,EAAe,MACzC,CACF,CAAA,CAQA,SAAS8F,EAAAA,CAAkBC,CAAAA,CAA+B,CACxD,GAAI,CAACA,CAAAA,CAAQ,OAAO,CAAA,CACpB,IAAMC,EAAO,MAAA,CAAOD,CAAM,CAAA,CAC1B,GAAI,MAAA,CAAO,QAAA,CAASC,CAAI,CAAA,CAAG,OAAOA,EAAO,CAAA,CAAIA,CAAAA,CAAO,IAAO,CAAA,CAC3D,IAAMC,EAAS,IAAA,CAAK,KAAA,CAAMF,CAAM,CAAA,CAChC,GAAI,OAAO,QAAA,CAASE,CAAM,EAAG,CAC3B,IAAMC,CAAAA,CAAQD,CAAAA,CAAS,IAAA,CAAK,GAAA,GAC5B,OAAOC,CAAAA,CAAQ,EAAIA,CAAAA,CAAQ,CAC7B,CACA,OAAO,CACT,CAGA,IAAMC,EAAAA,CAAwB,CAAC,eAAgB,WAAA,CAAa,cAAA,CAAgB,WAAW,CAAA,CAOjFC,EAAAA,CAAyB,CAC7B,iBAAA,CACA,uCAAA,CACA,aAAA,CACA,cACF,CAAA,CASA,SAASC,GAAiB,CAAA,CAAgB,CACxC,GAAI,CAAC,CAAA,CAAG,OAAO,EAAA,CACf,IAAMC,EAAkB,CAAC,MAAA,CAAO,EAAE,IAAA,EAAQ,EAAE,EAAG,MAAA,CAAO,CAAA,CAAE,SAAW,EAAE,CAAA,CAAG,MAAA,CAAO,CAAA,CAAE,IAAA,EAAQ,EAAE,CAAC,CAAA,CACxFC,CAAAA,CAAQ,EAAE,KAAA,CACd,IAAA,IAASC,EAAQ,CAAA,CAAGD,CAAAA,EAASC,CAAAA,CAAQ,CAAA,CAAGA,CAAAA,EAAAA,CACtCF,CAAAA,CAAM,KAAK,MAAA,CAAOC,CAAAA,CAAM,MAAQ,EAAE,CAAA,CAAG,OAAOA,CAAAA,CAAM,OAAA,EAAW,EAAE,CAAC,CAAA,CAChEA,CAAAA,CAAQA,EAAM,KAAA,CAEhB,OAAOD,EAAM,IAAA,CAAK,GAAG,CACvB,CAmBA,SAASG,GAAuB,CAAA,CAAiB,CAC/C,GAAI,CAAC,CAAA,CAAG,OAAO,MAAA,CACf,GAAI,aAAab,EAAAA,CAAW,OAAO,KAAA,CACnC,GAAI,CAAA,YAAaF,EAAAA,CAAU,OAAO,MAAA,CAElC,IAAMgB,EAAOL,EAAAA,CAAiB,CAAC,EAQ/B,OAPI,CAAA,EAAAF,EAAAA,CAAsB,IAAA,CAAMQ,CAAAA,EAASD,CAAAA,CAAK,SAASC,CAAI,CAAC,GACxDP,EAAAA,CAAuB,IAAA,CAAMQ,GAAQF,CAAAA,CAAK,QAAA,CAASE,CAAG,CAAC,CAAA,EAIvD,CAAA,YAAa,aAEb,sDAAA,CAAuD,IAAA,CAAKF,CAAI,CAAA,CAGtE,CAwEA,SAASG,EAAAA,CAAoBF,CAAAA,CAAc7F,EAA0B,CASnE,OAPI,GAAA6F,CAAAA,GAAS,MAAA,EAETA,GAAQ,KAAA,EAAUA,CAAAA,EAAQ,QAE1BA,CAAAA,GAAS,MAAA,EAGTA,CAAAA,GAAS,MAAA,EAAU,yCAAA,CAA0C,IAAA,CAAK7F,CAAO,CAAA,CAE/E,CAGA,SAASgG,EAAAA,CAAMC,CAAAA,CAAwB,CACrC,IAAMC,CAAAA,CAAMD,CAAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAC9B,OAAOC,CAAAA,CAAM,CAAA,CAAID,EAAO,KAAA,CAAM,CAAA,CAAGC,CAAG,CAAA,CAAID,CAC1C,CAKA,IAAME,EAAAA,CAAqB,GAAA,CAGrBC,GAAoB,GAAA,CAGpBC,EAAAA,CAA6B,KAG7BC,EAAAA,CAAmC,CAAA,CAEnCC,GAAkB,GAAA,CAElBC,EAAAA,CAAwB,KAExBC,EAAAA,CAAwB,EAAA,CAKxBC,GAAqB,EAAA,CAIrBC,EAAAA,CAAsB,EAGtBC,EAAAA,CAAqB,CAAA,CAAI,IAKzBC,EAAAA,CAAqB,GAAA,CAKrBC,EAAAA,CAA4B,GAAA,CAK5BC,EAAAA,CAA0B,GAAA,CAiBnBC,EAAAA,CAAN,KAAwB,CAAxB,WAAA,EAAA,CACL/K,CAAAA,CAAA,IAAA,CAAQ,QAAA,CAAS,IAAI,MAEb,WAAA,CAAY8I,CAAAA,CAA0B,CAC5C,IAAIkC,CAAAA,CAAI,KAAK,MAAA,CAAO,GAAA,CAAIlC,CAAI,CAAA,CAC5B,OAAKkC,IACHA,CAAAA,CAAI,CACF,oBAAqB,CAAA,CACrB,eAAA,CAAiB,EACjB,gBAAA,CAAkB,CAAA,CAClB,eAAA,CAAiB,CAAA,CACjB,eAAA,CAAiB,CAAA,CACjB,YAAa,IAAI,GAAA,CACjB,UAAW,CAAA,CACX,kBAAA,CAAoB,EACpB,aAAA,CAAe,MAAA,CACf,kBAAA,CAAoB,CAAA,CACpB,gBAAA,CAAkB,CAAA,CASlB,YAAa,IAAA,CAAK,GAAA,GAClB,UAAA,CAAY,IAAI,GAClB,CAAA,CACA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAIlC,CAAAA,CAAMkC,CAAC,GAElBA,CACT,CAEA,cAAclC,CAAAA,CAAclG,CAAAA,CAAcqI,EAAqBC,CAAAA,CAA2B,CACxF,IAAMF,CAAAA,CAAI,IAAA,CAAK,YAAYlC,CAAI,CAAA,CAU/B,GATAkC,CAAAA,CAAE,mBAAA,CAAsB,EAQxBA,CAAAA,CAAE,eAAA,CAAkB,CAAA,CAChBpI,CAAAA,CAAK,CAMP,IAAMuI,EAAUH,CAAAA,CAAE,WAAA,CAAY,IAAIpI,CAAG,CAAA,CAAA,CACjC,CAACuI,CAAAA,EAAW,EAAEA,CAAAA,CAAQ,SAAA,EAAaA,CAAAA,CAAQ,aAAA,CAAgB,KAAK,GAAA,EAAI,CAAA,GACtEH,EAAE,WAAA,CAAY,MAAA,CAAOpI,CAAG,EAE5B,CACI,OAAOqI,CAAAA,EAAe,QAAA,EAAY,MAAA,CAAO,SAASA,CAAU,CAAA,EAAKA,GAAc,CAAA,EAIjF,IAAA,CAAK,cAAcD,CAAAA,CAAGC,CAAAA,CAAYC,GAActI,CAAG,EAEvD,CAUA,iBAAA,CAAkBkG,CAAAA,CAAcmC,EAAoBC,CAAAA,CAA2B,CACzE,CAAC,MAAA,CAAO,QAAA,CAASD,CAAU,CAAA,EAAKA,CAAAA,CAAaH,EAAAA,EACjD,KAAK,aAAA,CAAc,IAAA,CAAK,YAAYhC,CAAI,CAAA,CAAGmC,EAAYC,CAAU,EACnE,CAaA,kBAAA,CAAmBpC,CAAAA,CAAcoC,CAAAA,CAAyC,CACxE,IAAMF,CAAAA,CAAI,KAAK,MAAA,CAAO,GAAA,CAAIlC,CAAI,CAAA,CAC9B,GAAI,CAACkC,CAAAA,CAAG,OACR,IAAMI,EAAM,IAAA,CAAK,GAAA,GACjB,GAAIF,CAAAA,GAAe,OAAW,CAC5B,IAAMG,EAAIL,CAAAA,CAAE,UAAA,CAAW,IAAIE,CAAU,CAAA,CACrC,OAAOG,CAAAA,EACLA,CAAAA,CAAE,aAAeX,EAAAA,EACjBU,CAAAA,CAAMC,CAAAA,CAAE,SAAA,EAAaV,EAAAA,CACnBU,CAAAA,CAAE,OACF,MACN,CACA,OAAO,IAAA,CAAK,eAAA,CAAgBL,EAAGI,CAAG,CAAA,CAAIJ,CAAAA,CAAE,aAAA,CAAgB,MAC1D,CAkBA,sBAAsBlC,CAAAA,CAAcwC,CAAAA,CAAmBJ,EAA2B,CAC5E,CAAC,OAAO,QAAA,CAASI,CAAS,CAAA,EAAKA,CAAAA,CAAY,EAAA,EAC/C,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA,CAAYxC,CAAI,CAAA,CAAGwC,CAAAA,CAAWJ,CAAU,EAClE,CAOQ,cAAcF,CAAAA,CAAeC,CAAAA,CAAoBC,EAA2B,CAClF,IAAME,EAAM,IAAA,CAAK,GAAA,GAkBjB,GAZIJ,CAAAA,CAAE,gBAAA,CAAmB,CAAA,EAAKI,CAAAA,CAAMJ,CAAAA,CAAE,iBAAmBL,EAAAA,GACvDK,CAAAA,CAAE,cAAgB,MAAA,CAClBA,CAAAA,CAAE,mBAAqB,CAAA,CACvBA,CAAAA,CAAE,UAAA,CAAW,KAAA,EAAM,CAAA,CAErBA,CAAAA,CAAE,cACAA,CAAAA,CAAE,aAAA,GAAkB,OAChBC,CAAAA,CACAR,EAAAA,CAAqBQ,GAAc,CAAA,CAAIR,EAAAA,EAAsBO,CAAAA,CAAE,aAAA,CACrEA,CAAAA,CAAE,kBAAA,EAAA,CACFA,EAAE,gBAAA,CAAmBI,CAAAA,CAEjBF,IAAe,MAAA,CAAW,CAC5B,IAAMG,CAAAA,CAAIL,CAAAA,CAAE,WAAW,GAAA,CAAIE,CAAU,EACjC,CAACG,CAAAA,EAAKD,EAAMC,CAAAA,CAAE,SAAA,CAAYV,GAC5BK,CAAAA,CAAE,UAAA,CAAW,GAAA,CAAIE,CAAAA,CAAY,CAAE,MAAA,CAAQD,EAAY,WAAA,CAAa,CAAA,CAAG,UAAWG,CAAI,CAAC,GAEnFC,CAAAA,CAAE,MAAA,CAASZ,EAAAA,CAAqBQ,CAAAA,CAAAA,CAAc,CAAA,CAAIR,EAAAA,EAAsBY,EAAE,MAAA,CAC1EA,CAAAA,CAAE,cACFA,CAAAA,CAAE,SAAA,CAAYD,GAElB,CACF,CAEA,aAAA,CAActC,CAAAA,CAAclG,CAAAA,CAAoB,CAC9C,IAAMoI,CAAAA,CAAI,IAAA,CAAK,YAAYlC,CAAI,CAAA,CAC/B,GAAIlG,CAAAA,CAAK,CAIP,IAAMwI,CAAAA,CAAM,IAAA,CAAK,KAAI,CACfG,CAAAA,CAKFP,EAAE,WAAA,CAAY,GAAA,CAAIpI,CAAG,CAAA,EAAK,CAAE,KAAA,CAAO,CAAA,CAAG,aAAA,CAAe,CAAA,CAAG,gBAAiB,CAAE,CAAA,CAAA,CAI5E2I,EAAS,aAAA,CAAgB,CAAA,EAAKA,EAAS,aAAA,EAAiBH,CAAAA,EACxDG,CAAAA,CAAS,eAAA,CAAkB,CAAA,EAAKH,CAAAA,CAAMG,EAAS,eAAA,CAAkB,GAAA,IAElEA,EAAS,KAAA,CAAQ,CAAA,CACjBA,EAAS,aAAA,CAAgB,CAAA,CAAA,CAE3BA,CAAAA,CAAS,KAAA,EAAA,CACTA,CAAAA,CAAS,eAAA,CAAkBH,EACvBG,CAAAA,CAAS,KAAA,EAASlB,KACpBkB,CAAAA,CAAS,aAAA,CAAgBH,EAAMd,EAAAA,CAAAA,CAEjCU,CAAAA,CAAE,YAAY,GAAA,CAAIpI,CAAAA,CAAK2I,CAAQ,EACjC,CAAA,KAEEP,EAAE,mBAAA,EAAA,CACFA,CAAAA,CAAE,gBAAkB,IAAA,CAAK,GAAA,GAE7B,CAaA,uBAAA,CAAwBlC,CAAAA,CAAclG,EAAmB,CACvD,IAAMoI,EAAI,IAAA,CAAK,WAAA,CAAYlC,CAAI,CAAA,CACzBsC,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CACfG,CAAAA,CAKFP,EAAE,WAAA,CAAY,GAAA,CAAIpI,CAAG,CAAA,EAAK,CAAE,MAAO,CAAA,CAAG,aAAA,CAAe,CAAA,CAAG,eAAA,CAAiB,CAAE,CAAA,CAC/E2I,EAAS,KAAA,CAAQ,IAAA,CAAK,IAAIA,CAAAA,CAAS,KAAA,CAAQ,EAAGlB,EAAgC,CAAA,CAC9EkB,EAAS,eAAA,CAAkBH,CAAAA,CAC3BG,EAAS,aAAA,CAAgBH,CAAAA,CAAMd,GAC/BiB,CAAAA,CAAS,SAAA,CAAY,KACrBP,CAAAA,CAAE,WAAA,CAAY,GAAA,CAAIpI,CAAAA,CAAK2I,CAAQ,EACjC,CAWA,eAAA,CAAgBzC,CAAAA,CAAc0C,EAA6B,CACzD,IAAMR,EAAI,IAAA,CAAK,WAAA,CAAYlC,CAAI,CAAA,CACzBsC,CAAAA,CAAM,IAAA,CAAK,KAAI,CAEjBJ,CAAAA,CAAE,gBAAkB,CAAA,EAAKI,CAAAA,CAAMJ,EAAE,eAAA,CAAkBZ,EAAAA,GACrDY,CAAAA,CAAE,eAAA,CAAkB,CAAA,CAAA,CAEtB,IAAMS,EAAY,OAAOD,CAAAA,EAAiB,UAAY,MAAA,CAAO,QAAA,CAASA,CAAY,CAAA,EAAKA,CAAAA,CAAe,EAChGE,CAAAA,CAAWD,CAAAA,CACbD,EACA,IAAA,CAAK,GAAA,CAAItB,GAAqB,CAAA,EAAKc,CAAAA,CAAE,gBAAiBb,EAAiB,CAAA,CAItEsB,CAAAA,EAAWT,CAAAA,CAAE,eAAA,EAAA,CAClBA,CAAAA,CAAE,gBAAkBI,CAAAA,CAMpBJ,CAAAA,CAAE,iBAAmBS,CAAAA,CACjBL,CAAAA,CAAMM,EACN,IAAA,CAAK,GAAA,CAAIV,CAAAA,CAAE,gBAAA,CAAkBI,CAAAA,CAAMM,CAAQ,EAC/CV,CAAAA,CAAE,mBAAA,EAAA,CACFA,EAAE,eAAA,CAAkBI,EACtB,CAGA,eAAA,CAAgBtC,CAAAA,CAAc6C,CAAAA,CAAwB,CACpD,GAAI,CAACA,GAAY,CAAC,MAAA,CAAO,SAASA,CAAQ,CAAA,CAAG,OAC7C,IAAMX,CAAAA,CAAI,KAAK,WAAA,CAAYlC,CAAI,EAC/BkC,CAAAA,CAAE,SAAA,CAAYW,EACdX,CAAAA,CAAE,kBAAA,CAAqB,KAAK,GAAA,GAC9B,CAQQ,kBAAA,EAA6B,CACnC,IAAMI,EAAM,IAAA,CAAK,GAAA,GACXQ,CAAAA,CAAmB,GACzB,IAAA,IAAWZ,CAAAA,IAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAC7BA,EAAE,SAAA,CAAY,CAAA,EAAKI,EAAMJ,CAAAA,CAAE,kBAAA,EAAsBT,IACnDqB,CAAAA,CAAO,IAAA,CAAKZ,CAAAA,CAAE,SAAS,CAAA,CAG3B,OAAIY,EAAO,MAAA,CAAS,CAAA,CAAU,GAC9BA,CAAAA,CAAO,IAAA,CAAK,CAAC7G,CAAAA,CAAGvF,CAAAA,GAAMuF,EAAIvF,CAAC,CAAA,CAEpBoM,EAAO,IAAA,CAAK,KAAA,CAAA,CAAOA,EAAO,MAAA,CAAS,CAAA,EAAK,CAAC,CAAC,CAAA,CACnD,CAGA,aAAA,CAAc9C,CAAAA,CAAclG,CAAAA,CAAuB,CACjD,IAAMoI,CAAAA,CAAI,KAAK,MAAA,CAAO,GAAA,CAAIlC,CAAI,CAAA,CAC9B,GAAI,CAACkC,CAAAA,CAAG,OAAO,KAAA,CACf,IAAMI,CAAAA,CAAM,IAAA,CAAK,KAAI,CAMrB,GAHIJ,EAAE,gBAAA,CAAmBI,CAAAA,EAGrBJ,CAAAA,CAAE,mBAAA,EAAuB,CAAA,EAAKI,CAAAA,CAAMJ,EAAE,eAAA,CAAkB,GAAA,CAAQ,OAAO,MAAA,CAG3E,GAAIpI,EAAK,CACP,IAAMuI,EAAUH,CAAAA,CAAE,WAAA,CAAY,IAAIpI,CAAG,CAAA,CACrC,GAAIuI,CAAAA,EAAWA,CAAAA,CAAQ,cAAgBC,CAAAA,CAAK,OAAO,MACrD,CAGA,IAAMS,CAAAA,CAAO,KAAK,kBAAA,EAAmB,CACrC,OACE,EAAAA,CAAAA,CAAO,GACPb,CAAAA,CAAE,SAAA,CAAY,CAAA,EACdI,CAAAA,CAAMJ,CAAAA,CAAE,kBAAA,EAAsBT,IAC9BsB,CAAAA,CAAOb,CAAAA,CAAE,UAAYR,EAAAA,CAMzB,CAeA,gBAAgBpI,CAAAA,CAAiBQ,CAAAA,CAAwB,CACvD,IAAMkJ,CAAAA,CAAoB,GACpBC,CAAAA,CAAsB,GAC5B,IAAA,IAAWjD,CAAAA,IAAQ1G,EACb,IAAA,CAAK,aAAA,CAAc0G,EAAMlG,CAAG,CAAA,CAC9BkJ,EAAQ,IAAA,CAAKhD,CAAI,EAEjBiD,CAAAA,CAAU,IAAA,CAAKjD,CAAI,CAAA,CAGvB,GAAIgD,CAAAA,CAAQ,MAAA,EAAU,CAAA,CACpB,OAAO,CAAC,GAAGA,CAAAA,CAAS,GAAGC,CAAS,CAAA,CAElC,IAAMX,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAGfY,CAAAA,CAAUF,CAAAA,CACb,IAAI,CAAChD,CAAAA,CAAM1J,KAAO,CAAE,IAAA,CAAA0J,EAAM,CAAA,CAAA1J,CAAAA,CAAG,KAAA,CAAO,IAAA,CAAK,SAAA,CAAU0J,CAAAA,CAAMsC,CAAG,CAAE,CAAA,CAAE,EAChE,IAAA,CAAK,CAACrG,EAAGvF,CAAAA,GAAMuF,CAAAA,CAAE,MAAQvF,CAAAA,CAAE,KAAA,EAASuF,EAAE,CAAA,CAAIvF,CAAAA,CAAE,CAAC,CAAA,CAC7C,GAAA,CAAKyM,GAAMA,CAAAA,CAAE,IAAI,CAAA,CACdC,CAAAA,CAAQ,IAAA,CAAK,oBAAA,CAAqBJ,EAASV,CAAG,CAAA,CACpD,OAAIc,CAAAA,EAASF,CAAAA,CAAQ,CAAC,CAAA,GAAME,CAAAA,CACnB,CAACA,CAAAA,CAAO,GAAGF,CAAAA,CAAQ,OAAQ3J,CAAAA,EAAMA,CAAAA,GAAM6J,CAAK,CAAA,CAAG,GAAGH,CAAS,CAAA,CAE7D,CAAC,GAAGC,CAAAA,CAAS,GAAGD,CAAS,CAClC,CAGQ,eAAA,CAAgBf,EAA2BI,CAAAA,CAAsB,CACvE,OACE,CAAC,CAACJ,GACFA,CAAAA,CAAE,aAAA,GAAkB,QACpBA,CAAAA,CAAE,kBAAA,EAAsBN,IACxBU,CAAAA,CAAMJ,CAAAA,CAAE,kBAAoBL,EAEhC,CAOQ,SAAA,CAAU7B,CAAAA,CAAcsC,CAAAA,CAAqB,CACnD,IAAMJ,CAAAA,CAAI,IAAA,CAAK,OAAO,GAAA,CAAIlC,CAAI,EAC9B,OAAK,IAAA,CAAK,eAAA,CAAgBkC,CAAAA,CAAGI,CAAG,CAAA,CACzBJ,EAAG,aAAA,CADgCH,EAE5C,CAaQ,oBAAA,CAAqBiB,CAAAA,CAAmBV,EAAiC,CAC/E,IAAMe,CAAAA,CAAYf,CAAAA,CAAMR,EAAAA,CACpBwB,CAAAA,CACAC,EAAY,CAAA,CAAA,CAAA,CAChB,IAAA,IAAWhK,KAAKyJ,CAAAA,CAAS,CACvB,IAAMd,CAAAA,CAAI,IAAA,CAAK,YAAY3I,CAAC,CAAA,CACtBiK,EAAQ,IAAA,CAAK,GAAA,CAAItB,EAAE,gBAAA,CAAkBA,CAAAA,CAAE,WAAW,CAAA,CACpDsB,CAAAA,EAASH,CAAAA,EAAaG,CAAAA,CAAQD,CAAAA,GAChCD,CAAAA,CAAO/J,EACPgK,CAAAA,CAAYC,CAAAA,EAEhB,CACA,OAAIF,CAAAA,GAAM,KAAK,WAAA,CAAYA,CAAI,CAAA,CAAE,WAAA,CAAchB,CAAAA,CAAAA,CACxCgB,CACT,CACF,CAAA,CAKaG,CAAAA,CAAmB,IAAIxB,EAAAA,CAEvByB,EAAAA,CAAoB,IAAIzB,EAAAA,CAkBxB0B,EAAAA,CAAN,KAAkB,CAAlB,WAAA,EAAA,CACLzM,CAAAA,CAAA,KAAQ,QAAA,CAASkC,CAAAA,CAAO,WAAW,mBAAA,EAAA,CAEnC,QAAA,EAAoB,CAGlB,OAFA,IAAA,CAAK,OAAM,CAEP,IAAA,CAAK,QAAU,CAAA,CAAI,IAAA,EACrB,KAAK,MAAA,EAAU,CAAA,CACR,MAEF,KACT,CAEA,MAAA,EAAe,CACb,IAAA,CAAK,KAAA,GACL,IAAA,CAAK,MAAA,CAAS,KAAK,GAAA,CACjBA,CAAAA,CAAO,WAAW,mBAAA,CAClB,IAAA,CAAK,MAAA,CAASA,CAAAA,CAAO,UAAA,CAAW,qBAClC,EACF,CAGQ,KAAA,EAAc,CAChB,IAAA,CAAK,MAAA,CAASA,EAAO,UAAA,CAAW,mBAAA,GAClC,IAAA,CAAK,MAAA,CAASA,CAAAA,CAAO,UAAA,CAAW,qBAEpC,CAGA,IAAI,WAAoB,CACtB,OAAO,KAAK,MACd,CAGA,MAAMwK,CAAAA,CAASxK,CAAAA,CAAO,WAAW,mBAAA,CAA2B,CAC1D,KAAK,MAAA,CAASwK,EAChB,CACF,CAAA,CAGaC,EAAAA,CAAiB,IAAIF,GAqBlC,SAASG,EAAAA,CACPC,EACA/D,CAAAA,CACAoC,CAAAA,CACA4B,EACAC,CAAAA,CACQ,CACR,IAAM7J,CAAAA,CAAIhB,CAAAA,CAAO,UAAA,CACjB,GAAI,CAACgB,CAAAA,CAAE,iBAAmB6J,CAAAA,CAAU,OAAOD,EAC3C,IAAME,CAAAA,CAAOH,EAAQ,kBAAA,CAAmB/D,CAAAA,CAAMoC,CAAU,CAAA,CACxD,OAAI8B,CAAAA,GAAS,OAAkBF,CAAAA,CAGxB,IAAA,CAAK,KACV,IAAA,CAAK,GAAA,CAAIA,EAAe,IAAA,CAAK,GAAA,CAAI5J,EAAE,sBAAA,CAAwBA,CAAAA,CAAE,sBAAwB8J,CAAI,CAAC,CAC5F,CACF,CAKA,SAASC,EAAAA,CAAYJ,CAAAA,CAA4B/D,CAAAA,CAAcoE,CAAAA,CAAQtK,CAAAA,CAAoB,CACrFsK,aAAarE,EAAAA,CACXqE,CAAAA,CAAE,YAEJL,CAAAA,CAAQ,eAAA,CAAgB/D,EAAMoE,CAAAA,CAAE,WAAA,EAAe,MAAS,CAAA,CAExDL,CAAAA,CAAQ,aAAA,CAAc/D,EAAMlG,CAAG,CAAA,CAExBsK,aAAavE,EAAAA,CAEtBkE,CAAAA,CAAQ,cAAc/D,CAAAA,CAAMlG,CAAG,CAAA,CAG/BiK,CAAAA,CAAQ,aAAA,CAAc/D,CAAI,EAE9B,CAOA,SAASqE,GACPN,CAAAA,CACA/D,CAAAA,CACAkB,EACAtK,CAAAA,CACM,CAEN,GADI,CAACA,CAAAA,EAAU,OAAOA,CAAAA,EAAW,QAAA,EAC7B,CAACsK,CAAAA,CAAO,QAAA,CAAS,+BAA+B,CAAA,CAAG,OACvD,IAAMoD,CAAAA,CAAS1N,CAAAA,CAAe,iBAAA,CAC1B,OAAO0N,CAAAA,EAAU,QAAA,EACnBP,EAAQ,eAAA,CAAgB/D,CAAAA,CAAMsE,CAAK,EAEvC,CAWA,SAASC,EAAAA,EAA6B,CACpC,GAAI,OAAO,YAAA,CAAiB,GAAA,CAC1B,OAAO,IAAI,YAAA,CAAa,2CAA4C,cAAc,CAAA,CAEpF,IAAMC,CAAAA,CAAM,IAAI,KAAA,CAAM,0CAA0C,CAAA,CAChE,OAAAA,EAAI,IAAA,CAAO,cAAA,CACJA,CACT,CAKA,SAASC,GAAoBhF,CAAAA,CAA0D,CAIrF,GADAA,CAAAA,CAAK,IAAA,CAAK,KAAKA,CAAE,CAAA,CACb,OAAO,WAAA,CAAY,OAAA,EAAY,UAAA,CACjC,OAAO,CAAE,MAAA,CAAQ,YAAY,OAAA,CAAQA,CAAE,EAAG,OAAA,CAAS,IAAM,CAAC,CAAE,CAAA,CAE9D,IAAMiF,CAAAA,CAAa,IAAI,eAAA,CACjBC,EAAQ,UAAA,CAAW,IAAMD,EAAW,KAAA,CAAMH,EAAAA,EAAqB,CAAA,CAAG9E,CAAE,CAAA,CAC1E,OAAO,CAAE,MAAA,CAAQiF,EAAW,MAAA,CAAQ,OAAA,CAAS,IAAM,YAAA,CAAaC,CAAK,CAAE,CACzE,CAMA,SAASC,EAAAA,CACPC,CAAAA,CACAC,EAC8C,CAC9C,GAAI,CAACA,CAAAA,CAAW,OAAO,CAAE,MAAA,CAAQD,CAAAA,CAAS,OAAA,CAAS,IAAM,CAAC,CAAE,EAC5D,GAAI,OAAO,YAAY,GAAA,EAAQ,UAAA,CAC7B,OAAO,CAAE,MAAA,CAAQ,WAAA,CAAY,GAAA,CAAI,CAACA,CAAAA,CAASC,CAAS,CAAC,CAAA,CAAG,QAAS,IAAM,CAAC,CAAE,CAAA,CAG5E,IAAMJ,CAAAA,CAAa,IAAI,eAAA,CACvB,GAAIG,EAAQ,OAAA,CACV,OAAAH,EAAW,KAAA,CAAMG,CAAAA,CAAQ,MAAM,CAAA,CACxB,CAAE,OAAQH,CAAAA,CAAW,MAAA,CAAQ,QAAS,IAAM,CAAC,CAAE,CAAA,CAExD,GAAII,EAAU,OAAA,CACZ,OAAAJ,CAAAA,CAAW,KAAA,CAAMI,CAAAA,CAAU,MAAM,EAC1B,CAAE,MAAA,CAAQJ,EAAW,MAAA,CAAQ,OAAA,CAAS,IAAM,CAAC,CAAE,CAAA,CAGxD,IAAMK,CAAAA,CAAiB,IAAML,EAAW,KAAA,CAAMG,CAAAA,CAAQ,MAAM,CAAA,CACtDG,CAAAA,CAAmB,IAAMN,CAAAA,CAAW,KAAA,CAAMI,CAAAA,CAAU,MAAM,CAAA,CAChED,CAAAA,CAAQ,iBAAiB,OAAA,CAASE,CAAAA,CAAgB,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAChED,CAAAA,CAAU,iBAAiB,OAAA,CAASE,CAAAA,CAAkB,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAEpE,IAAMC,EAAU,IAAM,CACpBJ,CAAAA,CAAQ,mBAAA,CAAoB,OAAA,CAASE,CAAc,EACnDD,CAAAA,CAAU,mBAAA,CAAoB,QAASE,CAAgB,EACzD,EACA,OAAO,CAAE,MAAA,CAAQN,CAAAA,CAAW,MAAA,CAAQ,OAAA,CAAAO,CAAQ,CAC9C,CAQA,IAAMC,EAAAA,CAAc,MAClBC,EACAjE,CAAAA,CACAkE,CAAAA,CACAC,CAAAA,CAAUjM,CAAAA,CAAO,OAAA,CACjBkM,CAAAA,CAAc,MACdC,CAAAA,GACG,CACH,IAAMjI,CAAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAW,GAAW,CAAA,CAC3CkI,EAAO,CACX,OAAA,CAAS,MACT,MAAA,CAAAtE,CAAAA,CACA,OAAAkE,CAAAA,CACA,EAAA,CAAA9H,CACF,CAAA,CAKM,CAAE,MAAA,CAAQmI,EAAS,OAAA,CAASC,CAAe,EAAIjB,EAAAA,CAAoBY,CAAO,EAC1E,CAAE,MAAA,CAAAM,CAAAA,CAAQ,OAAA,CAASC,CAAa,CAAA,CAAIhB,GAAaa,CAAAA,CAASF,CAAc,EACxEN,CAAAA,CAAU,IAAM,CACpBS,CAAAA,EAAe,CACfE,CAAAA,GACF,CAAA,CAEA,GAAI,CACF,IAAMC,CAAAA,CAAM,MAAM,KAAA,CAAMV,CAAAA,CAAK,CAC3B,MAAA,CAAQ,MAAA,CACR,KAAM,IAAA,CAAK,SAAA,CAAUK,CAAI,CAAA,CACzB,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAA,CAAoB,GAAG5F,EAAAA,EAAwB,CAAA,CAC1E,MAAA,CAAA+F,CACF,CAAC,EAID,GAAIE,CAAAA,CAAI,SAAW,GAAA,CACjB,MAAM,IAAI9F,EAAAA,CAAUoF,CAAAA,CAAK,uBAAA,CAAyB,CAChD,WAAA,CAAalF,EAAAA,CAAkB4F,EAAI,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,CAC7D,YAAa,CAAA,CACf,CAAC,CAAA,CAUH,GAAIA,CAAAA,CAAI,MAAA,EAAU,KAAOA,CAAAA,CAAI,MAAA,CAAS,IACpC,MAAM,IAAI9F,GAAUoF,CAAAA,CAAK,CAAA,KAAA,EAAQU,EAAI,MAAM,CAAA,MAAA,EAASV,CAAG,CAAA,CAAE,CAAA,CAG3D,IAAMvO,CAAAA,CAAU,MAAMiP,EAAI,IAAA,EAAK,CAC/B,GACE,CAACjP,CAAAA,EACD,OAAOA,EAAO,EAAA,CAAO,GAAA,EACrBA,EAAO,EAAA,GAAO0G,CAAAA,EACd1G,EAAO,OAAA,GAAY,KAAA,CAEnB,MAAM,IAAI,KAAA,CAAM,qBAAqB,EAEvC,GAAI,QAAA,GAAYA,EACd,OAAOA,CAAAA,CAAO,OAEhB,GAAI,OAAA,GAAWA,CAAAA,CAAQ,CACrB,IAAMwN,CAAAA,CAAIxN,EAAO,KAAA,CACjB,MAAI,YAAawN,CAAAA,EAAK,MAAA,GAAUA,EACxB,IAAIvE,EAAAA,CAASuE,CAAC,CAAA,CAEhBxN,CAAAA,CAAO,KACf,CAEA,MAAMA,CACR,CAAA,MAASwN,CAAAA,CAAG,CAQV,GAPIA,CAAAA,YAAavE,EAAAA,EAIbuE,CAAAA,YAAarE,EAAAA,EAGbwF,CAAAA,EAAgB,QAClB,MAAMnB,CAAAA,CAER,GAAIkB,CAAAA,CACF,OAAOJ,GAAYC,CAAAA,CAAKjE,CAAAA,CAAQkE,CAAAA,CAAQC,CAAAA,CAAS,KAAA,CAAOE,CAAc,EAExE,MAAMnB,CACR,QAAE,CACAa,CAAAA,GACF,CACF,CAAA,CAGA,SAASa,EAAAA,EAA6B,CACpC,OAAOtG,GAAM,EAAA,CAAK,IAAA,CAAK,QAAO,CAAI,EAAE,CACtC,CA4BA,SAASuG,GAAoB5L,CAAAA,CA0Bd,CACb,GAAM,CACJ,MAAA,CAAA+G,EACA,MAAA,CAAAkE,CAAAA,CACA,IAAAtL,CAAAA,CACA,OAAA,CAAA+K,CAAAA,CACA,SAAA,CAAAmB,CAAAA,CACA,aAAA,CAAAhC,EACA,eAAA,CAAAiC,CAAAA,CACA,WAAAC,CAAAA,CACA,cAAA,CAAAX,EACA,YAAA,CAAAY,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,CAAIjM,CAAAA,CACJ,OAAO,IAAI,OAAA,CAAW,CAACuF,CAAAA,CAAS2G,CAAAA,GAAW,CACzC,IAAIC,CAAAA,CAAO,KAAA,CACPC,CAAAA,CAAc,CAAA,CACdC,CAAAA,CAAa,MAKbC,CAAAA,CAAiB,KAAA,CACjBC,EACAC,CAAAA,CACAC,CAAAA,CAAe,EACbC,CAAAA,CAAiC,GAIjCC,CAAAA,CAAUC,CAAAA,EAAuB,CACrC,GAAI,CAAAT,EACJ,CAAAA,CAAAA,CAAO,KACHK,CAAAA,GAAe,MAAA,GACjB,YAAA,CAAaA,CAAU,CAAA,CACvBA,CAAAA,CAAa,QAEf,IAAA,IAAWpQ,CAAAA,IAAKsQ,EACTtQ,CAAAA,CAAE,MAAA,CAAO,SAASA,CAAAA,CAAE,KAAA,EAAM,CAEjCwQ,CAAAA,GAAO,CACT,CAAA,CAEMC,EAAW,CAAChH,CAAAA,CAAciH,IAAqB,CACnDV,CAAAA,EAAAA,CACA,IAAM7B,EAAAA,CAAa,IAAI,eAAA,CACvBmC,CAAAA,CAAY,IAAA,CAAKnC,EAAU,EAG3B,IAAMwC,EAAAA,CAAStC,GAAaF,EAAAA,CAAW,MAAA,CAAQa,CAAc,CAAA,CACvD4B,EAAAA,CAAarD,GACjBL,CAAAA,CACAzD,CAAAA,CACAkB,EACA8C,CAAAA,CACAiC,CACF,EACMlN,EAAAA,CAAQ,IAAA,CAAK,KAAI,CAClBkO,CAAAA,GAASL,CAAAA,CAAe7N,EAAAA,CAAAA,CAC7BmM,EAAAA,CAAYlF,CAAAA,CAAMkB,EAAQkE,CAAAA,CAAQ+B,EAAAA,CAAY,MAAOD,EAAAA,CAAO,MAAM,EAC/D,IAAA,CAAMrB,EAAAA,EAAQ,CAIb,GAHAqB,EAAAA,CAAO,OAAA,GACPX,CAAAA,EAAAA,CACKU,CAAAA,GAASR,EAAiB,IAAA,CAAA,CAC3B,CAAAH,EACJ,CAAA,GAAIF,CAAAA,EAAY,CAACA,CAAAA,CAASP,EAAG,CAAA,CAAG,CAS9B,GAJApC,CAAAA,CAAiB,wBAAwBzD,CAAAA,CAAMlG,CAAG,EAClD4M,CAAAA,CAAY,IAAI,MACd,CAAA,yCAAA,EAA4CxF,CAAM,SAASlB,CAAI,CAAA,CACjE,EACI,CAACiH,CAAAA,EAAW,CAACT,CAAAA,CAAY,CAC3BM,CAAAA,CAAO,IAAMT,CAAAA,CAAOK,CAAS,CAAC,CAAA,CAC9B,MACF,CACIH,CAAAA,GAAgB,CAAA,EAClBO,EAAO,IAAMT,CAAAA,CAAOK,CAAS,CAAC,CAAA,CAEhC,MACF,CACAjD,CAAAA,CAAiB,aAAA,CAAczD,EAAMlG,CAAAA,CAAK,IAAA,CAAK,KAAI,CAAIf,EAAAA,CAAOmI,CAAM,CAAA,CACpEmD,EAAAA,CAAmBZ,CAAAA,CAAkBzD,EAAMkB,CAAAA,CAAQ2E,EAAG,EAClDoB,CAAAA,CACGR,CAAAA,EAKHhD,EAAiB,qBAAA,CAAsBoB,CAAAA,CAAS,KAAK,GAAA,EAAI,CAAI+B,EAAc1F,CAAM,CAAA,CAEzEsF,GACV3C,EAAAA,CAAe,MAAA,GAEjBiD,CAAAA,CAAO,IAAMpH,CAAAA,CAAQmG,EAAQ,CAAC,EAAA,CAChC,CAAC,CAAA,CACA,KAAA,CAAOzB,IAAM,CAIZ,GAHA8C,GAAO,OAAA,EAAQ,CACfX,CAAAA,EAAAA,CACKU,CAAAA,GAASR,CAAAA,CAAiB,IAAA,CAAA,CAC3B,CAAAH,CAAAA,CACJ,CAAA,GAAIf,GAAgB,OAAA,CAAS,CAE3BuB,EAAO,IAAMT,CAAAA,CAAOjC,EAAC,CAAC,CAAA,CACtB,MACF,CACA,GAAIA,EAAAA,YAAavE,IAAY,CAACmB,EAAAA,CAAoBoD,GAAE,IAAA,CAAMA,EAAAA,CAAE,OAAO,CAAA,CAAG,CAEpE0C,EAAO,IAAMT,CAAAA,CAAOjC,EAAC,CAAC,CAAA,CACtB,MACF,CAKA,GAHAD,EAAAA,CAAYV,CAAAA,CAAkBzD,CAAAA,CAAMoE,EAAAA,CAAGtK,CAAG,CAAA,CAC1C2J,CAAAA,CAAiB,kBAAkBzD,CAAAA,CAAM,IAAA,CAAK,KAAI,CAAIjH,EAAAA,CAAOmI,CAAM,CAAA,CACnEwF,CAAAA,CAAYtC,EAAAA,CACR,CAAC6C,CAAAA,EAAW,CAACT,EAAY,CAE3BM,CAAAA,CAAO,IAAMT,CAAAA,CAAOjC,EAAC,CAAC,CAAA,CACtB,MACF,CACImC,IAAgB,CAAA,EAClBO,CAAAA,CAAO,IAAMT,CAAAA,CAAOK,CAAS,CAAC,EAAA,CAGlC,CAAC,EACL,CAAA,CAEAM,CAAAA,CAASnC,EAAS,KAAK,CAAA,CAUvB,IAAMX,EAAAA,CAAOT,CAAAA,CAAiB,mBAAmBoB,CAAAA,CAAS3D,CAAM,CAAA,EAAK,CAAA,CAC/DkG,EAAAA,CAAgBtD,EAAAA,CACpBL,EACAoB,CAAAA,CACA3D,CAAAA,CACA8C,EACAiC,CACF,CAAA,CACMoB,GAAQ,IAAA,CAAK,GAAA,CACjB,IAAA,CAAK,GAAA,CAAIjO,CAAAA,CAAO,UAAA,CAAW,kBAAmBA,CAAAA,CAAO,UAAA,CAAW,iBAAmB8K,EAAI,CAAA,CACvF,GAAMkD,EACR,CAAA,CACAT,CAAAA,CAAa,UAAA,CAAW,IAAM,CAK5B,GAJAA,CAAAA,CAAa,MAAA,CACTL,GAAQf,CAAAA,EAAgB,OAAA,EAGxB,KAAK,GAAA,EAAI,EAAKW,EAAY,OAK9B,IAAMoB,EAAOtB,CAAAA,CAAU,MAAA,CAAQzM,IAAMkK,CAAAA,CAAiB,aAAA,CAAclK,GAAGO,CAAG,CAAC,CAAA,CAC3E,GAAIwN,CAAAA,CAAK,MAAA,GAAW,EAAG,OACvB,IAAMtP,EAASsP,CAAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,EAAO,CAAIA,CAAAA,CAAK,MAAM,CAAC,EAEtDzD,EAAAA,CAAe,QAAA,KACpB2C,CAAAA,CAAa,IAAA,CACbL,EAAanO,CAAM,CAAA,CACnBgP,CAAAA,CAAShP,CAAAA,CAAQ,IAAI,CAAA,EACvB,EAAGqP,EAAK,EACV,CAAC,CACH,KA4CaE,CAAAA,CAAU,MACrBrG,EACAkE,CAAAA,CAAyB,GACzBC,CAAAA,CACAmC,CAAAA,CAAQpO,EAAO,KAAA,CACfuM,CAAAA,CACAS,IACe,CACf,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQhN,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,EAEhD,GAAIA,CAAAA,CAAO,KAAA,CAAM,MAAA,GAAW,CAAA,CAC1B,MAAM,IAAI,KAAA,CAAM,uBAAuB,EAKzC,IAAM6M,CAAAA,CAAkBZ,IAAY,MAAA,CAC9BoC,CAAAA,CAAUpC,CAAAA,EAAWjM,CAAAA,CAAO,OAAA,CAC5BU,CAAAA,CAAMmH,GAAMC,CAAM,CAAA,CAWlBwG,EAAW,IAAA,CAAK,GAAA,GAAQtO,CAAAA,CAAO,UAAA,CAAW,kBAAoBqO,CAAAA,CAG9DE,CAAAA,CAAe,IAAI,GAAA,CACrBjB,CAAAA,CAEJ,QAASkB,CAAAA,CAAU,CAAA,CAAGA,GAAWJ,CAAAA,EAC3B,EAAAI,CAAAA,CAAU,CAAA,EAAK,IAAA,CAAK,GAAA,IAASF,CAAAA,CAAAA,CADKE,CAAAA,EAAAA,CAAW,CAMjD,IAAMC,CAAAA,CAAepE,EAAiB,eAAA,CAAgBrK,CAAAA,CAAO,KAAA,CAAOU,CAAG,CAAA,CAEnEkG,CAAAA,CAAO6H,EAAa,IAAA,CAAMtO,CAAAA,EAAM,CAACoO,CAAAA,CAAa,GAAA,CAAIpO,CAAC,CAAC,CAAA,CACnDyG,CAAAA,GACH2H,CAAAA,CAAa,KAAA,EAAM,CACnB3H,EAAO6H,CAAAA,CAAa,CAAC,GAEvBF,CAAAA,CAAa,GAAA,CAAI3H,CAAI,CAAA,CAKrB,IAAIgG,EAAsB,EAAC,CAU3B,GARE5M,CAAAA,CAAO,UAAA,CAAW,OAClBqK,CAAAA,CAAiB,kBAAA,CAAmBzD,EAAMkB,CAAM,CAAA,GAAM,MAAA,GAEtD8E,CAAAA,CAAY6B,CAAAA,CACT,MAAA,CAAQtO,GAAM,CAACoO,CAAAA,CAAa,IAAIpO,CAAC,CAAA,EAAKkK,EAAiB,aAAA,CAAclK,CAAAA,CAAGO,CAAG,CAAC,CAAA,CAC5E,KAAA,CAAM,EAAG,CAAC,CAAA,CAAA,CAGXkM,EAAU,MAAA,CAAS,CAAA,CACrB,GAAI,CAGF,OAAO,MAAMD,EAAAA,CAAoB,CAC/B,MAAA,CAAA7E,EACA,MAAA,CAAAkE,CAAAA,CACA,IAAAtL,CAAAA,CACA,OAAA,CAASkG,EACT,SAAA,CAAAgG,CAAAA,CACA,cAAeyB,CAAAA,CACf,eAAA,CAAAxB,EACA,UAAA,CAAYyB,CAAAA,CACZ,eAAgB/B,CAAAA,CAChB,YAAA,CAAepM,GAAMoO,CAAAA,CAAa,GAAA,CAAIpO,CAAC,CAAA,CACvC,QAAA,CAAA6M,CACF,CAAC,CACH,CAAA,MAAShC,EAAQ,CAIf,GAHIA,aAAavE,EAAAA,EAAY,CAACmB,EAAAA,CAAoBoD,CAAAA,CAAE,IAAA,CAAMA,CAAAA,CAAE,OAAO,CAAA,EAG/DuB,CAAAA,EAAQ,QACV,MAAMvB,CAAAA,CAERsC,EAAYtC,CAAAA,CACRwD,CAAAA,CAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,EAAY,CAEpB,QACF,CAGF,IAAMgC,EAAY,IAAA,CAAK,GAAA,GACvB,GAAI,CACF,IAAMjC,CAAAA,CAAM,MAAMX,GAChBlF,CAAAA,CACAkB,CAAAA,CACAkE,EACAtB,EAAAA,CAAuBL,CAAAA,CAAkBzD,EAAMkB,CAAAA,CAAQuG,CAAAA,CAASxB,CAAe,CAAA,CAC/E,CAAA,CAAA,CACAN,CACF,EACA,GAAIS,CAAAA,EAAY,CAACA,CAAAA,CAASP,CAAG,EAAG,CAK9BpC,CAAAA,CAAiB,uBAAA,CAAwBzD,CAAAA,CAAMlG,CAAG,CAAA,CAClD4M,EAAY,IAAI,KAAA,CAAM,4CAA4CxF,CAAM,CAAA,MAAA,EAASlB,CAAI,CAAA,CAAE,CAAA,CACnF4H,CAAAA,CAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,GAER,QACF,CACA,OAAArC,CAAAA,CAAiB,aAAA,CAAczD,EAAMlG,CAAAA,CAAK,IAAA,CAAK,KAAI,CAAIgO,CAAAA,CAAW5G,CAAM,CAAA,CAExE2C,EAAAA,CAAe,QAAO,CACtBQ,EAAAA,CAAmBZ,EAAkBzD,CAAAA,CAAMkB,CAAAA,CAAQ2E,CAAG,CAAA,CAC/CA,CACT,CAAA,MAASzB,EAAQ,CAYf,GAPIA,aAAavE,EAAAA,EACX,CAACmB,GAAoBoD,CAAAA,CAAE,IAAA,CAAMA,CAAAA,CAAE,OAAO,CAAA,EAMxCuB,CAAAA,EAAQ,QACV,MAAMvB,CAAAA,CAERD,GAAYV,CAAAA,CAAkBzD,CAAAA,CAAMoE,EAAGtK,CAAG,CAAA,CAK1C2J,CAAAA,CAAiB,iBAAA,CAAkBzD,CAAAA,CAAM,IAAA,CAAK,KAAI,CAAI8H,CAAAA,CAAW5G,CAAM,CAAA,CACvEwF,CAAAA,CAAYtC,EAGRwD,CAAAA,CAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,GAEV,CACF,CAEA,MAAMY,CACR,CAAA,CAcaqB,EAAAA,CAAmB,MAC9B7G,CAAAA,CACAkE,CAAAA,CAAyB,EAAC,CAC1BC,CAAAA,CAAUjM,CAAAA,CAAO,iBACjBuM,CAAAA,GACe,CACf,GAAI,CAAC,KAAA,CAAM,QAAQvM,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA,CAEhD,GAAIA,EAAO,KAAA,CAAM,MAAA,GAAW,EAC1B,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAAA,CAEzC,IAAMU,EAAMmH,EAAAA,CAAMC,CAAM,EAElB8G,CAAAA,CAAa,IAAI,IACnBtB,CAAAA,CAEJ,IAAA,IAASkB,EAAU,CAAA,CAAGA,CAAAA,CAAUxO,EAAO,KAAA,CAAM,MAAA,CAAQwO,IAAW,CAG9D,IAAM5H,EADeyD,CAAAA,CAAiB,eAAA,CAAgBrK,CAAAA,CAAO,KAAA,CAAOU,CAAG,CAAA,CAC7C,KAAMP,CAAAA,EAAM,CAACyO,EAAW,GAAA,CAAIzO,CAAC,CAAC,CAAA,CACxD,GAAI,CAACyG,CAAAA,CAAM,MAEX,GADAgI,EAAW,GAAA,CAAIhI,CAAI,EACf2F,CAAAA,EAAQ,OAAA,CACV,MAAM,IAAI,KAAA,CAAM,SAAS,CAAA,CAE3B,GAAI,CACF,IAAME,CAAAA,CAAM,MAAMX,GAAYlF,CAAAA,CAAMkB,CAAAA,CAAQkE,EAAQC,CAAAA,CAAS,CAAA,CAAA,CAAOM,CAAM,CAAA,CAM1E,OAAAlC,EAAiB,aAAA,CAAczD,CAAAA,CAAMlG,CAAG,CAAA,CACjC+L,CACT,OAASzB,CAAAA,CAAQ,CAgBf,GAdIA,CAAAA,YAAavE,EAAAA,EAGb8F,CAAAA,EAAQ,UAGZxB,EAAAA,CAAYV,CAAAA,CAAkBzD,EAAMoE,CAAAA,CAAGtK,CAAG,EAC1C4M,CAAAA,CAAYtC,CAAAA,CAOR,CAACxD,EAAAA,CAAuBwD,CAAC,CAAA,CAAA,CAC3B,MAAMA,CAEV,CACF,CAEA,MAAMsC,CACR,EAIMuB,EAAAA,CAAyC,CAC7C,OAAA,CAAS,cAAA,CACT,KAAA,CAAO,YAAA,CACP,MAAO,YAAA,CACP,QAAA,CAAU,gBACV,SAAA,CAAW,gBAAA,CACX,WAAY,iBAAA,CACZ,aAAA,CAAe,mBACf,MAAA,CAAQ,SAAA,CACR,OAAQ,aACV,EAgCA,eAAsBC,EAAAA,CACpBpO,CAAAA,CACAqO,EACA/C,CAAAA,CACAC,CAAAA,CACAmC,CAAAA,CAAQpO,CAAAA,CAAO,KAAA,CACfuM,CAAAA,CACc,CACd,GAAI,CAAC,MAAM,OAAA,CAAQvM,CAAAA,CAAO,SAAS,CAAA,CACjC,MAAM,IAAI,KAAA,CAAM,kCAAkC,CAAA,CAEpD,GAAIA,CAAAA,CAAO,SAAA,CAAU,SAAW,CAAA,CAC9B,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA,CAK7C,IAAM6M,CAAAA,CAAkBZ,CAAAA,GAAY,OAC9BoC,CAAAA,CAAUpC,CAAAA,EAAWjM,EAAO,OAAA,CAC5BsO,CAAAA,CAAW,KAAK,GAAA,EAAI,CAAItO,EAAO,UAAA,CAAW,iBAAA,CAAoBqO,EAI9DW,CAAAA,CAAiB,CAAA,EAAGtO,CAAG,CAAA,CAAA,EAAIqO,CAAQ,GAKnCE,CAAAA,CACJjP,CAAAA,CAAO,cAAA,GAAiBU,CAAG,CAAA,EAAG,MAAA,CAC1BV,EAAO,cAAA,CAAeU,CAAG,EACzBV,CAAAA,CAAO,SAAA,CACPuO,EAAe,IAAI,GAAA,CACrBjB,CAAAA,CAEA4B,CAAAA,CAAkB,KAAA,CAEtB,IAAA,IAASV,EAAU,CAAA,CAAGA,CAAAA,EAAWJ,GAC3B,EAAAI,CAAAA,CAAU,GAAK,IAAA,CAAK,GAAA,EAAI,EAAKF,CAAAA,CAAAA,CADKE,CAAAA,EAAAA,CAAW,CAMjD,IAAMC,CAAAA,CAAenE,EAAAA,CAAkB,gBAAgB2E,CAAAA,CAAUvO,CAAG,EAChEkG,CAAAA,CAAO6H,CAAAA,CAAa,KAAMtO,CAAAA,EAAM,CAACoO,EAAa,GAAA,CAAIpO,CAAC,CAAC,CAAA,CACnDyG,CAAAA,GACH2H,EAAa,KAAA,EAAM,CACnB3H,CAAAA,CAAO6H,CAAAA,CAAa,CAAC,CAAA,CAAA,CAEvBF,EAAa,GAAA,CAAI3H,CAAI,EACrB,IAAMuI,CAAAA,CAAUvI,EAAOiI,EAAAA,CAAWnO,CAAG,CAAA,CACjC0O,CAAAA,CAAOL,CAAAA,CACLM,CAAAA,CAAWrD,GAAW,EAAC,CACvBsD,EAAsB,IAAI,GAAA,CAGhC,OAAO,OAAA,CAAQD,CAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACnN,EAAK5D,EAAK,CAAA,GAAM,CAC7C8Q,CAAAA,CAAK,QAAA,CAAS,IAAIlN,CAAG,CAAA,CAAA,CAAG,IAC1BkN,CAAAA,CAAOA,CAAAA,CAAK,QAAQ,CAAA,CAAA,EAAIlN,CAAG,IAAK,kBAAA,CAAmB,MAAA,CAAO5D,EAAK,CAAC,CAAC,CAAA,CACjEgR,CAAAA,CAAoB,GAAA,CAAIpN,CAAG,GAE/B,CAAC,CAAA,CACD,IAAM6J,CAAAA,CAAM,IAAI,IAAIoD,CAAAA,CAAUC,CAAI,CAAA,CAYlC,GAVA,MAAA,CAAO,OAAA,CAAQC,CAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACnN,CAAAA,CAAK5D,EAAK,CAAA,GAAM,CAC5CgR,CAAAA,CAAoB,GAAA,CAAIpN,CAAG,CAAA,GAC1B,MAAM,OAAA,CAAQ5D,EAAK,EACrBA,EAAAA,CAAM,OAAA,CAAS4C,IAAM6K,CAAAA,CAAI,YAAA,CAAa,OAAO7J,CAAAA,CAAK,MAAA,CAAOhB,EAAC,CAAC,CAAC,EAE5D6K,CAAAA,CAAI,YAAA,CAAa,IAAI7J,CAAAA,CAAK,MAAA,CAAO5D,EAAK,CAAC,CAAA,EAG7C,CAAC,EAEGiO,CAAAA,EAAQ,OAAA,CACV,MAAM,IAAI,KAAA,CAAM,SAAS,CAAA,CAE3B2C,CAAAA,CAAkB,KAAA,CAGlB,GAAM,CAAE,MAAA,CAAQ7C,EAAS,OAAA,CAASC,CAAe,EAAIjB,EAAAA,CACnDX,EAAAA,CAAuBJ,GAAmB1D,CAAAA,CAAMoI,CAAAA,CAAgBX,CAAAA,CAASxB,CAAe,CAC1F,CAAA,CACM,CAAE,MAAA,CAAQ0C,EAAAA,CAAY,QAAS/C,EAAa,CAAA,CAAIhB,GAAaa,CAAAA,CAASE,CAAM,EAC5EiD,EAAAA,CAAc,IAAM,CAAElD,CAAAA,EAAe,CAAGE,KAAe,CAAA,CACvDiD,EAAgB,IAAA,CAAK,GAAA,EAAI,CAC/B,GAAI,CACF,IAAMC,EAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQwD,EAAAA,CACR,OAAA,CAAS/I,EAAAA,EACX,CAAC,EACD,GAAIkJ,CAAAA,CAAS,SAAW,GAAA,CACtB,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA,CAE/D,GAAIA,CAAAA,CAAS,MAAA,GAAW,IAEtB,MAAApF,EAAAA,CAAkB,gBAChB1D,CAAAA,CACAC,EAAAA,CAAkB6I,EAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,EAAK,MAC5D,CAAA,CACAR,CAAAA,CAAkB,GACZ,IAAI,KAAA,CAAM,4BAA4BtI,CAAI,CAAA,CAAE,CAAA,CAEpD,GAAI8I,CAAAA,CAAS,MAAA,GAAW,IACtB,MAAApF,EAAAA,CAAkB,cAAc1D,CAAAA,CAAMlG,CAAG,EACzCwO,CAAAA,CAAkB,CAAA,CAAA,CACZ,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqCtI,CAAI,EAAE,CAAA,CAE7D,GAAI,CAAC8I,CAAAA,CAAS,EAAA,CACZ,MAAApF,EAAAA,CAAkB,aAAA,CAAc1D,CAAAA,CAAMlG,CAAG,CAAA,CACzCwO,CAAAA,CAAkB,GACZ,IAAI,KAAA,CAAM,QAAQQ,CAAAA,CAAS,MAAM,SAAS9I,CAAI,CAAA,CAAE,EAExD,OAAA0D,EAAAA,CAAkB,cAAc1D,CAAAA,CAAMlG,CAAAA,CAAK,KAAK,GAAA,EAAI,CAAI+O,EAAeT,CAAc,CAAA,CAC9EU,CAAAA,CAAS,IAAA,EAClB,CAAA,MAAS1E,EAAQ,CASf,GAPIA,GAAG,OAAA,EAAS,QAAA,CAAS,UAAU,CAAA,EAO/BuB,CAAAA,EAAQ,OAAA,CACV,MAAMvB,CAAAA,CAGHkE,CAAAA,EACH5E,GAAkB,aAAA,CAAc1D,CAAAA,CAAMlG,CAAG,CAAA,CAM3C4J,EAAAA,CAAkB,kBAAkB1D,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAAI6I,CAAAA,CAAeT,CAAc,EACpF1B,CAAAA,CAAYtC,CAAAA,CAERwD,EAAUJ,CAAAA,EACZ,MAAM1B,KAEV,CAAA,OAAE,CACA8C,EAAAA,GACF,CACF,CAEA,MAAMlC,CACR,CAWO,IAAMqC,GAAiB,MAC5B7H,CAAAA,CACAkE,CAAAA,CAAyB,EAAC,CAC1B4D,CAAAA,CAAS,EACTrD,CAAAA,GACe,CACf,GAAI,CAAC,KAAA,CAAM,QAAQvM,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA,CAEhD,GAAI4P,EAAS5P,CAAAA,CAAO,KAAA,CAAM,OACxB,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA,CAWhD,IAAI6P,GARkBC,CAAAA,EAAkB,CACtC,IAAMjN,CAAAA,CAAI,CAAC,GAAGiN,CAAG,CAAA,CACjB,QAAS5S,CAAAA,CAAI2F,CAAAA,CAAE,OAAS,CAAA,CAAG3F,CAAAA,CAAI,EAAGA,CAAAA,EAAAA,CAAK,CACrC,IAAM6S,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,EAAK7S,EAAI,CAAA,CAAE,CAAA,CAC5C,CAAC2F,CAAAA,CAAE3F,CAAC,EAAG2F,CAAAA,CAAEkN,CAAC,CAAC,CAAA,CAAI,CAAClN,CAAAA,CAAEkN,CAAC,CAAA,CAAGlN,CAAAA,CAAE3F,CAAC,CAAC,EAC5B,CACA,OAAO2F,CACT,CAAA,EAC4B7C,CAAAA,CAAO,KAAK,CAAA,CACpCgQ,EAAmB,IAAA,CAAK,GAAA,CAAIJ,EAAQC,CAAAA,CAAS,MAAM,EACnDI,CAAAA,CAAoB,GACxB,KAAOD,CAAAA,CAAmB,GAAKH,CAAAA,CAAS,MAAA,CAAS,GAAG,CAElD,IAAMK,EAAaL,CAAAA,CAAS,MAAA,CAAO,CAAA,CAAGG,CAAgB,CAAA,CAChDG,CAAAA,CAA2B,EAAC,CAC5BC,CAAAA,CAAsB,EAAC,CAE7B,IAAA,IAASlT,EAAI,CAAA,CAAGA,CAAAA,CAAIgT,CAAAA,CAAW,MAAA,CAAQhT,CAAAA,EAAAA,CACrCiT,CAAAA,CAAS,KACPrE,EAAAA,CAAYoE,CAAAA,CAAWhT,CAAC,CAAA,CAAG4K,CAAAA,CAAQkE,EAAQ,MAAA,CAAW,IAAA,CAAMO,CAAM,CAAA,CAC/D,IAAA,CAAMjL,CAAAA,EAAS8O,EAAa,IAAA,CAAK9O,CAAI,CAAC,CAAA,CACtC,KAAA,CAAM,IAAM,CAAC,CAAC,CACnB,CAAA,CAEF,MAAM,QAAQ,GAAA,CAAI6O,CAAQ,EAC1BF,CAAAA,CAAW,IAAA,CAAK,GAAGG,CAAY,CAAA,CAE/B,IAAMC,CAAAA,CAAkBC,EAAAA,CAAcL,CAAAA,CAAYL,CAAM,CAAA,CACxD,GAAIS,EACF,OAAOA,CAAAA,CAIT,GADAL,CAAAA,CAAmB,IAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAQC,CAAAA,CAAS,MAAM,EAC/CG,CAAAA,GAAqB,CAAA,CACvB,MAAM,IAAI,KAAA,CAAM,0BAA0B,CAE9C,CACA,MAAM,IAAI,KAAA,CAAM,wBAAwB,CAC1C,EAEA,SAASM,GAAcC,CAAAA,CAAgBX,CAAAA,CAAgB,CACrD,IAAMY,CAAAA,CAAe,IAAI,GAAA,CACzB,IAAA,IAAWhT,KAAU+S,CAAAA,CAAS,CAC5B,IAAMrO,CAAAA,CAAM,IAAA,CAAK,UAAU1E,CAAM,CAAA,CAC5BgT,CAAAA,CAAa,GAAA,CAAItO,CAAG,CAAA,EACvBsO,EAAa,GAAA,CAAItO,CAAAA,CAAK,EAAE,CAAA,CAE1BsO,EAAa,GAAA,CAAItO,CAAG,CAAA,CAAG,IAAA,CAAK1E,CAAM,EACpC,CACA,IAAMiT,CAAAA,CAAiB,MAAM,IAAA,CAAKD,CAAAA,CAAa,QAAQ,CAAA,CAAE,IAAA,CAAME,CAAAA,EAAUA,CAAAA,CAAM,MAAA,EAAUd,CAAM,CAAA,CAC/F,OAAOa,EAAiBA,CAAAA,CAAe,CAAC,EAAI,IAC9C,KC7vDME,EAAAA,CAAUhP,UAAAA,CAAW3B,EAAO,QAAQ,CAAA,CAW7B4Q,GAAN,MAAMC,CAAY,CAOvB,WAAA,CAAYC,CAAAA,CAA8B,CAN1ChT,CAAAA,CAAA,IAAA,CAAA,aAAA,CAAA,CAEAA,CAAAA,CAAA,kBAAqB,GAAA,CAAA,CAErBA,CAAAA,CAAA,KAAQ,MAAA,CAAA,CA6LRA,CAAAA,CAAA,KAAQ,mBAAA,CAAoB,MAAOiT,CAAAA,EAAuB,CACxD,IAAMC,CAAAA,CAAQ,MAAM7C,CAAAA,CAAQ,6CAAA,CAA+C,EAAE,CAAA,CACvE5Q,EAAQoE,UAAAA,CAAWqP,CAAAA,CAAM,aAAa,CAAA,CACtCC,CAAAA,CAAiB,MAAA,CAAO,IAAI,WAAA,CAAY1T,CAAAA,CAAM,OAAQA,CAAAA,CAAM,UAAA,CAAa,EAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CACjF2T,EAAgB,IAAI,IAAA,CAAK,KAAK,GAAA,EAAI,CAAIH,CAAU,CAAA,CAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,EACjF,IAAA,CAAK,WAAA,CAAc,CACjB,UAAA,CAAYG,CAAAA,CACZ,WAAY,EAAC,CACb,UAAA,CAAY,EAAC,CACb,aAAA,CAAeF,EAAM,iBAAA,CAAoB,KAAA,CACzC,iBAAkBC,CAAAA,CAClB,UAAA,CAAY,EACd,EACF,CAAA,CAAA,CAvMMH,CAAAA,EAAS,WAAA,GACPA,CAAAA,CAAQ,uBAAuBD,CAAAA,EACjC,IAAA,CAAK,YAAcC,CAAAA,CAAQ,WAAA,CAAY,YACvC,IAAA,CAAK,UAAA,CAAaA,EAAQ,WAAA,CAAY,UAAA,EAEtC,KAAK,WAAA,CAAcA,CAAAA,CAAQ,YAMzB,IAAA,CAAK,WAAA,EAAe,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA,GAChE,KAAK,WAAA,CAAY,UAAA,CAAa,EAAC,CAAA,CAEjC,IAAA,CAAK,KAAO,IAAA,CAAK,MAAA,EAAO,CAAE,IAAA,CAAA,CAExBA,CAAAA,EAAS,UAAA,GACX,KAAK,UAAA,CAAaA,CAAAA,CAAQ,YAE9B,CAUA,MAAM,aACJK,CAAAA,CACAC,CAAAA,CACe,CACV,IAAA,CAAK,WAAA,EACR,MAAM,KAAK,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA,CAE9C,IAAA,CAAK,YAAa,UAAA,CAAW,IAAA,CAAK,CAACD,CAAAA,CAAeC,CAAa,CAAC,EAClE,CASA,KAAKC,CAAAA,CAAkD,CACrD,GAAI,CAAC,IAAA,CAAK,WAAA,CACR,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAEjE,GAAI,KAAK,WAAA,CAAa,CACpB,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,IAAA,CAAAC,CAAK,CAAA,CAAI,KAAK,MAAA,EAAO,CAChC,MAAM,OAAA,CAAQF,CAAI,IACrBA,CAAAA,CAAO,CAACA,CAAI,CAAA,CAAA,CAEd,IAAA,IAAWnP,CAAAA,IAAOmP,EAAM,CACtB,IAAM1O,EAAYT,CAAAA,CAAI,IAAA,CAAKoP,CAAM,CAAA,CACjC,IAAA,CAAK,YAAY,UAAA,CAAW,IAAA,CAAK3O,EAAU,cAAA,EAAgB,EAC7D,CACA,OAAA,IAAA,CAAK,KAAO4O,CAAAA,CACL,IAAA,CAAK,WACd,CAAA,KACE,MAAM,IAAI,MAAM,wBAAwB,CAE5C,CAYA,MAAM,SAAA,CAAUC,EAAc,KAAA,CAAiC,CAC7D,GAAI,CAAC,IAAA,CAAK,WAAA,CACR,MAAM,IAAI,KAAA,CACR,gFACF,CAAA,CAEF,GAAI,KAAK,WAAA,CAAY,UAAA,CAAW,MAAA,GAAW,CAAA,CACzC,MAAM,IAAI,MACR,iFACF,CAAA,CAEF,GAAI,CACF,MAAM7C,GAAiB,qCAAA,CAAuC,CAAC,KAAK,WAAW,CAAC,EAClF,CAAA,MAAS3D,CAAAA,CAAG,CACV,GAAI,EAAAA,aAAavE,EAAAA,EAAYuE,CAAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,oCAAoC,CAAA,CAAA,CAGlF,MAAMA,CAEV,CAIA,GAHK,IAAA,CAAK,IAAA,GACR,KAAK,IAAA,CAAO,IAAA,CAAK,MAAA,EAAO,CAAE,IAAA,CAAA,CAExB,CAACwG,EACH,OAAO,CAAE,MAAO,IAAA,CAAK,IAAA,CAAM,OAAQ,SAAU,CAAA,CAI/C,IAAMC,CAAAA,CAAkB,EAAA,CACxB,MAAMrL,GAAM,GAAI,CAAA,CAChB,IAAIsL,CAAAA,CAAS,MAAM,KAAK,WAAA,EAAY,CAChC,EAAI,CAAA,CACR,KACEA,GAAQ,MAAA,GAAW,2BAAA,EACnBA,GAAQ,MAAA,GAAW,sBAAA,EACnBA,GAAQ,MAAA,GAAW,SAAA,EACnB,CAAA,CAAID,CAAAA,EAEJ,MAAMrL,EAAAA,CAAM,IAAO,CAAA,CAAI,GAAG,EAC1BsL,CAAAA,CAAS,MAAM,KAAK,WAAA,EAAY,CAChC,CAAA,EAAA,CAEF,OAAO,CACL,KAAA,CAAO,KAAK,IAAA,CACZ,MAAA,CAASA,GAAQ,MAAA,EAAU,SAC7B,CACF,CAQA,MAAA,EAAqB,CACnB,GAAI,CAAC,IAAA,CAAK,YACR,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAEjE,IAAMtT,CAAAA,CAAS,IAAI2B,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CAC7E2B,EAAO,CAAE,GAAG,KAAK,WAAY,CAAA,CACnC,GAAI,CACFyE,EAAAA,CAAW,WAAA,CAAY/H,EAAQsD,CAAI,EACrC,OAAS4F,CAAAA,CAAO,CACd,MAAM,IAAI,KAAA,CAAM,mCAAA,CAAsCA,CAAK,CAC7D,CACAlJ,EAAO,IAAA,EAAK,CACZ,IAAMuT,CAAAA,CAAkB,IAAI,WAAWvT,CAAAA,CAAO,QAAA,EAAU,CAAA,CAClDmT,CAAAA,CAAO3P,UAAAA,CAAWgQ,OAAOD,CAAe,CAAC,EAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAE5D,OAAO,CAAE,MAAA,CADMC,MAAAA,CAAO,IAAI,UAAA,CAAW,CAAC,GAAGjB,EAAAA,CAAS,GAAGgB,CAAe,CAAC,CAAC,CAAA,CACrD,IAAA,CAAAJ,CAAK,CACxB,CASA,YAAA,CAAa5O,CAAAA,CAAoC,CAC/C,GAAI,CAAC,KAAK,WAAA,CACR,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAErE,GAAI,OAAOA,CAAAA,EAAc,SACvB,MAAM,IAAI,MAAM,0BAA0B,CAAA,CAE5C,GAAIA,CAAAA,CAAU,MAAA,GAAW,GAAA,CACvB,MAAM,IAAI,KAAA,CAAM,uCAAuC,CAAA,CAEzD,OAAA,IAAA,CAAK,YAAY,UAAA,CAAW,IAAA,CAAKA,CAAS,CAAA,CACnC,IAAA,CAAK,WACd,CAGA,MAAM,aAA0C,CAC9C,OAAK,KAAK,IAAA,GACR,IAAA,CAAK,IAAA,CAAO,IAAA,CAAK,MAAA,EAAO,CAAE,MAErBwL,CAAAA,CAAQ,yCAAA,CAA2C,CACxD,cAAA,CAAgB,IAAA,CAAK,KACrB,UAAA,CAAY,IAAA,CAAK,WAAA,EAAa,UAChC,CAAC,CACH,CAsBF,ECnOA,IAAM0D,GAAa,IAAI,UAAA,CAAW,CAAC,GAAI,CAAC,EA2B3BC,CAAAA,CAAN,MAAMC,CAAW,CAGtB,WAAA,CAAY7P,CAAAA,CAAiB,CAF7BpE,CAAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAGE,KAAK,GAAA,CAAMoE,CAAAA,CACX,GAAI,CACFH,SAAAA,CAAU,aAAaG,CAAG,EAC5B,CAAA,KAAY,CACV,MAAM,IAAI,MAAM,qBAAqB,CACvC,CACF,CAUA,OAAO,KAAK5D,CAAAA,CAAwC,CAClD,OAAI,OAAOA,CAAAA,EAAU,QAAA,CACZyT,EAAW,UAAA,CAAWzT,CAAK,EAE3B,IAAIyT,CAAAA,CAAWzT,CAAK,CAE/B,CASA,OAAO,UAAA,CAAW8D,CAAAA,CAAyB,CACzC,OAAO,IAAI2P,EAAWC,EAAAA,CAAc5P,CAAG,EAAE,QAAA,CAAS,CAAC,CAAC,CACtD,CASA,OAAO,SAAS6P,CAAAA,CAAuC,CACrD,GAAI,OAAOA,CAAAA,EAAS,SAElB,GADc,gBAAA,CAAiB,IAAA,CAAKA,CAAI,CAAA,CAEtCA,CAAAA,CAAOtQ,WAAWsQ,CAAI,CAAA,CAAA,KACjB,CAGL,IAAM1U,CAAAA,CAAkB,EAAC,CACzB,IAAA,IAAS,CAAA,CAAI,CAAA,CAAG,CAAA,CAAI0U,CAAAA,CAAK,OAAQ,CAAA,EAAA,CAAK,CACpC,IAAI9U,CAAAA,CAAI8U,CAAAA,CAAK,WAAW,CAAC,CAAA,CACzB,GAAI9U,CAAAA,CAAI,GAAA,CACNI,EAAM,IAAA,CAAKJ,CAAC,UACHA,CAAAA,CAAI,IAAA,CACbI,EAAM,IAAA,CAAK,GAAA,CAAQJ,CAAAA,EAAK,CAAA,CAAI,GAAA,CAAQA,CAAAA,CAAI,EAAK,CAAA,CAAA,KAAA,GACpCA,CAAAA,EAAK,OAAUA,CAAAA,EAAK,KAAA,EAAU,EAAI,CAAA,CAAI8U,CAAAA,CAAK,MAAA,CAAQ,CAC5D,IAAM7U,CAAAA,CAAO6U,EAAK,UAAA,CAAW,EAAE,CAAC,CAAA,CAChC9U,CAAAA,CAAI,QAAYA,CAAAA,CAAI,IAAA,GAAU,EAAA,CAAA,EAAOC,CAAAA,CAAO,IAAA,CAAA,CAC5CG,CAAAA,CAAM,KAAK,GAAA,CAAQJ,CAAAA,EAAK,GAAK,GAAA,CAASA,CAAAA,EAAK,GAAM,EAAA,CAAO,GAAA,CAASA,GAAK,CAAA,CAAK,EAAA,CAAO,IAAQA,CAAAA,CAAI,EAAK,EACrG,CAAA,KACEI,CAAAA,CAAM,KAAK,GAAA,CAAQJ,CAAAA,EAAK,EAAA,CAAK,GAAA,CAASA,CAAAA,EAAK,CAAA,CAAK,GAAO,GAAA,CAAQA,CAAAA,CAAI,EAAK,EAE5E,CACA8U,EAAO,IAAI,UAAA,CAAW1U,CAAK,EAC7B,CAEF,OAAO,IAAIwU,CAAAA,CAAWH,MAAAA,CAAOK,CAAI,CAAC,CACpC,CAWA,OAAO,SAAA,CAAUC,CAAAA,CAAkBC,CAAAA,CAAkBC,CAAAA,CAAgB,QAAA,CAAsB,CACzF,IAAMH,CAAAA,CAAOC,EAAWE,CAAAA,CAAOD,CAAAA,CAC/B,OAAOJ,CAAAA,CAAW,QAAA,CAASE,CAAI,CACjC,CASA,KAAKpQ,CAAAA,CAAgC,CACnC,IAAMwQ,CAAAA,CAAKtQ,SAAAA,CAAU,KAAKF,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAK,CAC3C,YAAA,CAAc,IAAA,CACd,OAAQ,WAAA,CACR,OAAA,CAAS,KACX,CAAC,CAAA,CACKN,EAAW,QAAA,CAASK,UAAAA,CAAWyQ,CAAAA,CAAG,QAAA,CAAS,CAAA,CAAG,CAAC,CAAC,CAAA,CAAG,EAAE,EAC3D,OAAOjR,EAAAA,CAAU,MAAMG,CAAAA,CAAW,EAAA,EAAI,QAAA,CAAS,EAAE,CAAA,CAAIK,UAAAA,CAAWyQ,EAAG,QAAA,CAAS,CAAC,CAAC,CAAC,CACjF,CAQA,YAAA,CAAalQ,CAAAA,CAA4B,CACvC,OAAO,IAAIH,EAAUD,SAAAA,CAAU,YAAA,CAAa,KAAK,GAAG,CAAA,CAAGI,CAAM,CAC/D,CAQA,QAAA,EAAmB,CACjB,OAAOmQ,EAAAA,CAAc,IAAI,UAAA,CAAW,CAAC,GAAGT,EAAAA,CAAY,GAAG,KAAK,GAAG,CAAC,CAAC,CACnE,CASA,OAAA,EAAkB,CAChB,IAAM3P,CAAAA,CAAM,KAAK,QAAA,EAAS,CAC1B,OAAO,CAAA,YAAA,EAAeA,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,MAAMA,CAAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAC1D,CASA,eAAA,CAAgBqQ,CAAAA,CAAkC,CAChD,IAAMvV,CAAAA,CAAI+E,UAAU,eAAA,CAAgB,IAAA,CAAK,IAAKwQ,CAAAA,CAAU,GAAG,EAE3D,OAAOC,MAAAA,CAAOxV,CAAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAC7B,CASA,OAAO,WAAwB,CAC7B,OAAO,IAAI+U,CAAAA,CAAWhQ,SAAAA,CAAU,MAAA,EAAO,CAAE,SAAS,CACpD,CACF,CAAA,CAEM0Q,EAAAA,CAAgBC,GACRd,MAAAA,CAAOA,MAAAA,CAAOc,CAAK,CAAC,CAAA,CAK5BJ,EAAAA,CAAiBpQ,CAAAA,EAAoB,CAEzC,IAAMK,EAAWkQ,EAAAA,CAAavQ,CAAG,EACjC,OAAOI,EAAAA,CAAK,OAAO,IAAI,UAAA,CAAW,CAAC,GAAGJ,CAAAA,CAAK,GAAGK,CAAAA,CAAS,KAAA,CAAM,EAAG,CAAC,CAAC,CAAC,CAAC,CACtE,CAAA,CAGMyP,EAAAA,CAAiBW,CAAAA,EAAuB,CAC5C,IAAMvU,CAAAA,CAASkE,EAAAA,CAAK,OAAOqQ,CAAU,CAAA,CACrC,GAAI,CAACjQ,EAAAA,CAAkBtE,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAG,CAAC,EAAGyT,EAAU,CAAA,CACnD,MAAM,IAAI,KAAA,CAAM,iCAAiC,CAAA,CAEnD,IAAMtP,CAAAA,CAAWnE,CAAAA,CAAO,KAAA,CAAM,EAAE,EAC1B8D,CAAAA,CAAM9D,CAAAA,CAAO,MAAM,CAAA,CAAG,EAAE,EACxBwU,CAAAA,CAAiBH,EAAAA,CAAavQ,CAAG,CAAA,CAAE,KAAA,CAAM,EAAG,CAAC,CAAA,CACnD,GAAI,CAACQ,EAAAA,CAAkBH,EAAUqQ,CAAc,CAAA,CAC7C,MAAM,IAAI,KAAA,CAAM,+BAA+B,EAEjD,OAAO1Q,CACT,EAEMQ,EAAAA,CAAoB,CAACG,EAAevF,CAAAA,GAAkB,CAC1D,GAAIuF,CAAAA,GAAMvF,CAAAA,CAAG,OAAO,MACpB,GAAIuF,CAAAA,CAAE,aAAevF,CAAAA,CAAE,UAAA,CAAY,OAAO,MAAA,CAC1C,IAAM2B,CAAAA,CAAM4D,CAAAA,CAAE,UAAA,CACV3F,CAAAA,CAAI,EACR,KAAOA,CAAAA,CAAI+B,GAAO4D,CAAAA,CAAE3F,CAAC,IAAMI,CAAAA,CAAEJ,CAAC,GAAGA,CAAAA,EAAAA,CACjC,OAAOA,IAAM+B,CACf,EClOO,IAAM4T,EAAAA,CAAU,CACrBC,CAAAA,CACAP,CAAAA,CACA1Q,CAAAA,CACAkR,EAAgBC,EAAAA,EAAY,GACzBC,GAAMH,CAAAA,CAAYP,CAAAA,CAAWQ,EAAOlR,CAAO,CAAA,CAEnCqR,EAAAA,CAAU,CACrBJ,CAAAA,CACAP,CAAAA,CACAQ,EACAlR,CAAAA,CACAU,CAAAA,GAEU0Q,GAAMH,CAAAA,CAAYP,CAAAA,CAAWQ,EAAOlR,CAAAA,CAASU,CAAQ,EACtD,OAAA,CAOL0Q,EAAAA,CAAQ,CACZH,CAAAA,CACAP,CAAAA,CACAQ,EACAlR,CAAAA,CACAU,CAAAA,GAC6D,CAC7D,IAAM4Q,CAAAA,CAASJ,CAAAA,CACTK,CAAAA,CAAIN,CAAAA,CAAW,eAAA,CAAgBP,CAAS,CAAA,CAC1Cc,CAAAA,CAAO,IAAItT,CAAAA,CAAWA,CAAAA,CAAW,iBAAkBA,CAAAA,CAAW,aAAa,CAAA,CAC/EsT,CAAAA,CAAK,WAAA,CAAYF,CAAM,EACvBE,CAAAA,CAAK,MAAA,CAAOD,CAAC,CAAA,CACbC,CAAAA,CAAK,MAAK,CAEV,IAAMC,CAAAA,CAAgBd,MAAAA,CAAO,IAAI,UAAA,CAAWa,EAAK,QAAA,EAAU,CAAC,CAAA,CACtDE,CAAAA,CAAKD,EAAc,QAAA,CAAS,EAAA,CAAI,EAAE,CAAA,CAClCE,CAAAA,CAAMF,EAAc,QAAA,CAAS,CAAA,CAAG,EAAE,CAAA,CAGlCG,CAAAA,CAAQ7B,OAAO0B,CAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,CAAC,CAAA,CAC3CI,EAAO,IAAI3T,CAAAA,CAAWA,EAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACjF2T,CAAAA,CAAK,MAAA,CAAOD,CAAK,CAAA,CACjBC,CAAAA,CAAK,MAAK,CACV,IAAMC,EAAUD,CAAAA,CAAK,UAAA,GACrB,GAAInR,CAAAA,GAAa,MAAA,CAAW,CAC1B,GAAIoR,CAAAA,GAAYpR,EACd,MAAM,IAAI,MAAM,aAAa,CAAA,CAE/BV,EAAU+R,EAAAA,CAAgB/R,CAAAA,CAAS2R,EAAKD,CAAE,EAC5C,MACE1R,CAAAA,CAAUgS,EAAAA,CAAgBhS,EAAS2R,CAAAA,CAAKD,CAAE,EAE5C,OAAO,CAAE,KAAA,CAAOJ,CAAAA,CAAQ,OAAA,CAAAtR,CAAAA,CAAS,SAAU8R,CAAQ,CACrD,EAOMC,EAAAA,CAAkB,CAAC/R,EAAqB2R,CAAAA,CAAiBD,CAAAA,GAA+B,CAC5F,IAAIO,CAAAA,CAAgBjS,CAAAA,CAEpB,OAAAiS,CAAAA,CADiBC,GAAAA,CAAOP,EAAKD,CAAE,CAAA,CACN,QAAQO,CAAa,CAAA,CACvCA,CACT,CAAA,CAOaD,EAAAA,CAAkB,CAC7BhS,EACA2R,CAAAA,CACAD,CAAAA,GACe,CACf,IAAIO,CAAAA,CAAgBjS,EAEpB,OAAAiS,CAAAA,CADeC,IAAOP,CAAAA,CAAKD,CAAE,EACN,OAAA,CAAQO,CAAa,EACrCA,CACT,CAAA,CAEIE,GAAoC,IAAA,CAElChB,EAAAA,CAAc,IAAc,CAChC,GAAIgB,EAAAA,GAAuB,KAAM,CAC/B,IAAMC,EAAmBlS,SAAAA,CAAU,KAAA,CAAM,iBAAgB,CACzDiS,EAAAA,CAAsBC,CAAAA,CAAiB,CAAC,CAAA,EAAK,CAAA,CAAKA,EAAiB,CAAC,EACtE,CACA,IAAIC,CAAAA,CAAO,OAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CACtBC,CAAAA,CAAU,EAAEH,GAAqB,KAAA,CACvC,OAAAE,EAAQA,CAAAA,EAAQ,MAAA,CAAO,EAAE,CAAA,CAAK,MAAA,CAAOC,CAAO,CAAA,CACrCD,CACT,ECpGA,IAAME,EAAAA,CAAyBpW,GAAoB,CACjD,IAAMb,EAAIkX,EAAAA,CAASrW,CAAAA,CAAK,EAAE,CAAA,CAC1B,OAAO,IAAIgE,EAAU7E,CAAC,CACxB,EAEMmX,EAAAA,CAAsBhX,CAAAA,EACnBA,EAAE,UAAA,EAAW,CAGhBiX,EAAAA,CAAsBjX,CAAAA,EACnBA,CAAAA,CAAE,UAAA,GAGLkX,EAAAA,CAAsBlX,CAAAA,EAAkB,CAC5C,IAAM2B,CAAAA,CAAc3B,EAAE,YAAA,EAAa,CAC7BmX,CAAAA,CAAQnX,CAAAA,CAAE,IAAA,CAAKA,CAAAA,CAAE,OAAQA,CAAAA,CAAE,MAAA,CAAS2B,CAAG,CAAA,CAC7C,OAAA3B,EAAE,IAAA,CAAK2B,CAAG,EACH,IAAI,UAAA,CAAWwV,EAAM,QAAA,EAAU,CACxC,CAAA,CAEMC,EAAAA,CAAsBC,GAA2B3W,CAAAA,EAAoB,CACzE,IAAM4W,CAAAA,CAAW,EAAC,CACZxW,EAAS,IAAI2B,CAAAA,CAAWA,EAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACnF3B,CAAAA,CAAO,MAAA,CAAOJ,CAAG,CAAA,CACjBI,CAAAA,CAAO,MAAK,CACZ,IAAA,GAAW,CAAC8D,CAAAA,CAAK2S,CAAY,IAAKF,CAAAA,CAChC,GAAI,CACFC,CAAAA,CAAI1S,CAAG,CAAA,CAAI2S,EAAazW,CAAM,EAChC,OAAS+G,CAAAA,CAAY,CACnB,MAAAA,CAAAA,CAAM,OAAA,CAAU,GAAGjD,CAAG,CAAA,EAAA,EAAKiD,EAAM,OAAO,CAAA,CAAA,CAClCA,CACR,CAEF,OAAOyP,CACT,CAAA,CAEA,SAASP,EAAAA,CAAS/W,CAAAA,CAAe2B,CAAAA,CAAa,CAC5C,GAAK3B,CAAAA,CAEE,CACL,IAAMmX,CAAAA,CAAQnX,CAAAA,CAAE,KAAKA,CAAAA,CAAE,MAAA,CAAQA,CAAAA,CAAE,MAAA,CAAS2B,CAAG,CAAA,CAC7C,OAAA3B,CAAAA,CAAE,IAAA,CAAK2B,CAAG,CAAA,CACH,IAAI,WAAWwV,CAAAA,CAAM,QAAA,EAAU,CACxC,CAAA,KALE,MAAM,MAAM,oCAAoC,CAMpD,CAEA,IAAMK,EAAAA,CAA4BJ,GAAmB,CACnD,CAAC,OAAQN,EAAqB,CAAA,CAC9B,CAAC,IAAA,CAAMA,EAAqB,EAC5B,CAAC,OAAA,CAASE,EAAkB,CAAA,CAC5B,CAAC,OAAA,CAASC,EAAkB,CAAA,CAC5B,CAAC,YAAaC,EAAkB,CAClC,CAAC,CAAA,CAEYO,EAAAA,CAAe,CAC1B,IAAA,CAAMD,EACR,CAAA,CCvBA,IAAME,EAAAA,CAAS,CACblC,EACAP,CAAAA,CACA0C,CAAAA,CACAC,IACW,CACX,GAAI,CAACD,CAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,CACtB,OAAOA,CAAAA,CAETA,EAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CACvBE,EAAAA,GACArC,CAAAA,CAAasC,EAAAA,CAAatC,CAAU,CAAA,CACpCP,CAAAA,CAAY8C,GAAY9C,CAAS,CAAA,CACjC,IAAM+C,CAAAA,CAAO,IAAIvV,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACjFuV,CAAAA,CAAK,aAAaL,CAAI,CAAA,CACtB,IAAMM,CAAAA,CAAa,IAAI,WAAWD,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,MAAM,CAAA,CAAE,UAAU,CAAA,CAChE,CAAE,KAAA,CAAAvC,CAAAA,CAAO,QAAAlR,CAAAA,CAAS,QAAA,CAAAU,CAAS,CAAA,CAAQsQ,EAAAA,CAAQC,CAAAA,CAAYP,EAAWgD,CAAAA,CAAYL,CAAS,EACvFM,CAAAA,CAAQ,IAAIzV,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CAClFoG,GAAW,IAAA,CAAKqP,CAAAA,CAAO,CACrB,KAAA,CAAOjT,CAAAA,CACP,UAAWV,CAAAA,CACX,IAAA,CAAMiR,CAAAA,CAAW,YAAA,EAAa,CAC9B,KAAA,CAAAC,EACA,EAAA,CAAIR,CACN,CAAC,CAAA,CACDiD,CAAAA,CAAM,MAAK,CACX,IAAMlU,CAAAA,CAAO,IAAI,UAAA,CAAWkU,CAAAA,CAAM,UAAU,CAAA,CAC5C,OAAO,GAAA,CAAMlT,EAAAA,CAAK,OAAOhB,CAAI,CAC/B,CAAA,CAWMmU,EAAAA,CAAS,CAAC3C,CAAAA,CAAiCmC,IAAyB,CACxE,GAAI,CAACA,CAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,CACtB,OAAOA,EAETA,CAAAA,CAAOA,CAAAA,CAAK,UAAU,CAAC,CAAA,CACvBE,IAAgB,CAChBrC,CAAAA,CAAasC,GAAatC,CAAU,CAAA,CAEpC,IAAIyC,CAAAA,CAAaR,EAAAA,CAAa,IAAA,CAAKzS,GAAK,MAAA,CAAO2S,CAAI,CAAC,CAAA,CAC9C,CAAE,KAAAS,CAAAA,CAAM,EAAA,CAAAC,CAAAA,CAAI,KAAA,CAAA5C,CAAAA,CAAO,KAAA,CAAAU,EAAO,SAAA,CAAAmC,CAAU,EAAIL,CAAAA,CAExCM,CAAAA,CADS/C,EAAW,YAAA,EAAa,CAAE,QAAA,EAAS,GAErC,IAAI9Q,CAAAA,CAAU0T,EAAK,GAAG,CAAA,CAAE,UAAS,CAAI,IAAI1T,EAAU2T,CAAAA,CAAG,GAAG,EAAI,IAAI3T,CAAAA,CAAU0T,EAAK,GAAG,CAAA,CAChGH,EAAiBrC,EAAAA,CAAQJ,CAAAA,CAAY+C,EAAU9C,CAAAA,CAAO6C,CAAAA,CAAWnC,CAAK,CAAA,CACtE,IAAM6B,CAAAA,CAAO,IAAIvV,CAAAA,CAAWA,CAAAA,CAAW,iBAAkBA,CAAAA,CAAW,aAAa,EACjF,OAAAuV,CAAAA,CAAK,MAAA,CAAOC,CAAU,CAAA,CACtBD,CAAAA,CAAK,MAAK,CACH,GAAA,CAAMA,EAAK,WAAA,EACpB,EAEIQ,EAAAA,CACEX,EAAAA,CAAkB,IAAM,CAC5B,GAAIW,EAAAA,GAAe,OAAW,CAC5B,IAAIC,EACJD,EAAAA,CAAa,IAAA,CACb,GAAI,CACF,IAAM1T,EAAM,qDAAA,CAEN4T,CAAAA,CAAahB,GAAO5S,CAAAA,CADX,uDAAA,CACwB,aAAQ,CAAA,CAC/C2T,CAAAA,CAAYN,GAAOrT,CAAAA,CAAK4T,CAAU,EACpC,CAAA,OAAE,CACAF,EAAAA,CAAaC,IAAc,cAC7B,CACF,CACA,GAAID,EAAAA,GAAe,MACjB,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAEnE,CAAA,CAEMV,GAAgBa,CAAAA,EAChB,OAAOA,GAAM,QAAA,CACRnE,CAAAA,CAAW,WAAWmE,CAAC,CAAA,CAEvBA,CAAAA,CAGLZ,EAAAA,CAAeY,CAAAA,EACf,OAAOA,GAAM,QAAA,CACRjU,CAAAA,CAAU,WAAWiU,CAAC,CAAA,CAEtBA,EAuBEC,EAAAA,CAAO,CAClB,OAAAT,EAAAA,CACA,MAAA,CAAAT,EACF,ECvJA,IAAAmB,GAAA,GAAAC,EAAAA,CAAAD,GAAA,CAAA,yBAAA,CAAA,IAAAE,EAAAA,CAAA,iBAAA,CAAA,IAAAC,EAAAA,CAAA,UAAA,CAAA,IAAAC,EAAAA,CAAA,qBAAAC,EAAAA,CAAAA,CAAAA,CAkBO,IAAMA,EAAAA,CAAoBtE,CAAAA,EAAoC,CACnE,IAAIuE,CAAAA,CAAS,sBAAA,CACb,GAAI,CAACvE,CAAAA,CACH,OAAOuE,CAAAA,CAAS,eAAA,CAElB,IAAMtX,CAAAA,CAAS+S,CAAAA,CAAS,MAAA,CACxB,GAAI/S,CAAAA,CAAS,CAAA,CACX,OAAOsX,CAAAA,CAAS,YAAA,CAElB,GAAItX,CAAAA,CAAS,EAAA,CACX,OAAOsX,CAAAA,CAAS,aAAA,CAEd,KAAK,IAAA,CAAKvE,CAAQ,IACpBuE,CAAAA,CAAS,8BAAA,CAAA,CAEX,IAAMC,CAAAA,CAAMxE,CAAAA,CAAS,MAAM,GAAG,CAAA,CACxBjT,CAAAA,CAAMyX,CAAAA,CAAI,MAAA,CAChB,IAAA,IAASxZ,EAAI,CAAA,CAAGA,CAAAA,CAAI+B,EAAK/B,CAAAA,EAAAA,CAAK,CAC5B,IAAMyZ,CAAAA,CAAQD,CAAAA,CAAIxZ,CAAC,CAAA,CACnB,GAAI,CAAC,SAAS,IAAA,CAAKyZ,CAAK,EACtB,OAAOF,CAAAA,CAAS,iCAElB,GAAI,CAAC,cAAA,CAAe,IAAA,CAAKE,CAAK,CAAA,CAC5B,OAAOF,CAAAA,CAAS,iDAAA,CAElB,GAAI,CAAC,WAAA,CAAY,KAAKE,CAAK,CAAA,CACzB,OAAOF,CAAAA,CAAS,uCAAA,CAElB,GAAIE,CAAAA,CAAM,MAAA,CAAS,EACjB,OAAOF,CAAAA,CAAS,YAEpB,CACA,OAAO,IACT,CAAA,CAEaF,EAAAA,CAAa,CACxB,KAAM,CAAA,CACN,OAAA,CAAS,EACT,QAAA,CAAU,CAAA,CACV,oBAAqB,CAAA,CACrB,gBAAA,CAAkB,CAAA,CAClB,kBAAA,CAAoB,CAAA,CACpB,kBAAA,CAAoB,EACpB,YAAA,CAAc,CAAA,CACd,QAAS,CAAA,CACT,cAAA,CAAgB,EAChB,cAAA,CAAgB,EAAA,CAChB,cAAA,CAAgB,EAAA,CAChB,oBAAA,CAAsB,EAAA,CACtB,sBAAuB,EAAA,CACvB,GAAA,CAAK,GACL,MAAA,CAAQ,EAAA,CACR,uBAAwB,EAAA,CACxB,cAAA,CAAgB,GAChB,WAAA,CAAa,EAAA,CACb,gBAAiB,EAAA,CACjB,0BAAA,CAA4B,GAC5B,mBAAA,CAAqB,EAAA,CACrB,cAAe,EAAA,CACf,sBAAA,CAAwB,EAAA,CACxB,wBAAA,CAA0B,EAAA,CAC1B,eAAA,CAAiB,GACjB,uBAAA,CAAyB,EAAA,CACzB,gBAAiB,EAAA,CACjB,cAAA,CAAgB,GAChB,cAAA,CAAgB,EAAA,CAChB,IAAA,CAAM,EAAA,CACN,cAAA,CAAgB,EAAA,CAChB,oBAAqB,EAAA,CACrB,qBAAA,CAAuB,GACvB,4BAAA,CAA8B,EAAA,CAC9B,cAAe,EAAA,CACf,qBAAA,CAAuB,EAAA,CACvB,aAAA,CAAe,EAAA,CACf,iBAAA,CAAmB,GACnB,oBAAA,CAAsB,EAAA,CACtB,wBAAyB,EAAA,CACzB,8BAAA,CAAgC,GAChC,sBAAA,CAAwB,EAAA,CACxB,gBAAiB,EAAA,CACjB,eAAA,CAAiB,GACjB,qBAAA,CAAuB,EAAA,CACvB,gBAAiB,EAAA,CACjB,eAAA,CAAiB,GACjB,sBAAA,CAAwB,EAAA,CACxB,kBAAA,CAAoB,EAAA,CAEpB,oBAAA,CAAsB,EAAA,CACtB,cAAe,EAAA,CACf,eAAA,CAAiB,GACjB,cAAA,CAAgB,EAAA,CAChB,iBAAkB,EAAA,CAClB,QAAA,CAAU,EAAA,CACV,qBAAA,CAAuB,EAAA,CACvB,UAAA,CAAY,GACZ,gBAAA,CAAkB,EAAA,CAClB,2BAA4B,EAAA,CAC5B,QAAA,CAAU,GACV,qBAAA,CAAuB,EAAA,CACvB,yBAAA,CAA2B,EAAA,CAC3B,yBAAA,CAA2B,EAAA,CAC3B,gBAAiB,EAAA,CACjB,0BAAA,CAA4B,GAC5B,YAAA,CAAc,EAAA,CACd,SAAU,EAAA,CACV,aAAA,CAAe,GACf,qBAAA,CAAuB,EAAA,CACvB,eAAgB,EAAA,CAChB,4BAAA,CAA8B,GAC9B,sBAAA,CAAwB,EAAA,CACxB,2BAA4B,EAAA,CAC5B,WAAA,CAAa,EAAA,CACb,4BAAA,CAA8B,EAAA,CAC9B,wBAAA,CAA0B,GAC1B,6BAAA,CAA+B,EAAA,CAC/B,WAAY,EAAA,CACZ,oBAAA,CAAsB,GACtB,eAAA,CAAiB,EAAA,CACjB,mCAAA,CAAqC,EAAA,CACrC,cAAA,CAAgB,EAAA,CAChB,wBAAyB,EAAA,CACzB,yBAAA,CAA2B,GAC3B,qBAAA,CAAuB,EAAA,CACvB,gBAAiB,EAAA,CACjB,YAAA,CAAc,EAAA,CACd,2CAAA,CAA6C,EAAA,CAC7C,eAAA,CAAiB,GACjB,eAAA,CAAiB,EAAA,CACjB,cAAe,EAAA,CACf,sBAAA,CAAwB,EAC1B,CAAA,CAKaD,EAAAA,CAAqBM,GACzBA,CAAAA,CACJ,MAAA,CAAOC,GAAgB,CAAC,MAAA,CAAO,CAAC,CAAA,CAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAC7C,GAAA,CAAKvY,CAAAA,EAAmBA,CAAAA,GAAU,OAAO,CAAC,CAAA,CAAIA,EAAM,QAAA,EAAS,CAAI,IAAK,CAAA,CAErEuY,EAAAA,CAAiB,CACrB,CAACC,CAAAA,CAAKC,CAAI,EACVC,CAAAA,GAEIA,CAAAA,CAAmB,GACd,CAACF,CAAAA,CAAO,OAAO,CAAC,CAAA,EAAK,MAAA,CAAOE,CAAgB,CAAA,CAAID,CAAI,EAEpD,CAACD,CAAAA,CAAKC,EAAQ,MAAA,CAAO,CAAC,GAAK,MAAA,CAAOC,CAAAA,CAAmB,EAAE,CAAE,CAAA,CAIvDX,GAA4B,CACvCY,CAAAA,CACAjG,IACmF,CACnF,IAAM1P,EAAO,CACX,UAAA,CAAY,EAAC,CACb,KAAA,CAAA2V,CAAAA,CACA,MAAY,EACd,EACA,IAAA,IAAW/U,CAAAA,IAAO,OAAO,IAAA,CAAK8O,CAAK,CAAA,CAAG,CACpC,GAAKA,CAAAA,CAAc9O,CAAG,CAAA,GAAM,MAAA,CAAW,SACvC,IAAIgV,CAAAA,CACJ,OAAQhV,CAAAA,EACN,KAAK,KAAA,CACL,KAAK,iBAAA,CACHgV,EAAO/Q,EAAAA,CAAW,SAAA,CAClB,MACF,KAAK,wBAAA,CACL,KAAK,uBAAA,CACL,KAAK,qBACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,OAClB,MACF,KAAK,oBACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,OAClB,MACF,KAAK,KAAA,CACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,MAAA,CAClB,MACF,KAAK,mBAAA,CACH+Q,EAAO/Q,EAAAA,CAAW,KAAA,CAClB,MACF,KAAK,sBAAA,CACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,KAAA,CAClB,MACF,QACE,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyBjE,CAAG,EAAE,CAClD,CACAZ,CAAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAACY,EAAKiV,EAAAA,CAAUD,CAAAA,CAAMlG,EAAM9O,CAAG,CAAC,CAAC,CAAC,EACpD,CACA,OAAAZ,CAAAA,CAAK,MAAM,IAAA,CAAK,CAACuB,EAAQvF,CAAAA,GAAWuF,CAAAA,CAAE,CAAC,CAAA,CAAE,aAAA,CAAcvF,CAAAA,CAAE,CAAC,CAAC,CAAC,EACrD,CAAC,wBAAA,CAA0BgE,CAAI,CACxC,CAAA,CAEM6V,GAAY,CAACjS,CAAAA,CAAiB5D,CAAAA,GAAc,CAChD,IAAMlD,CAAAA,CAAS,IAAI2B,CAAAA,CAAWA,CAAAA,CAAW,iBAAkBA,CAAAA,CAAW,aAAa,EACnF,OAAAmF,CAAAA,CAAW9G,CAAAA,CAAQkD,CAAI,CAAA,CACvBlD,CAAAA,CAAO,MAAK,CAELwD,UAAAA,CAAW,IAAI,UAAA,CAAWxD,CAAAA,CAAO,UAAU,CAAC,CACrD,CAAA,CCpIO,SAASwT,EAAAA,CAAOc,CAAAA,CAAwC,CAC7D,IAAIpR,CAAAA,CACJ,GAAI,OAAOoR,CAAAA,EAAU,QAAA,CAAU,CAG7B,IAAMnV,CAAAA,CAAkB,EAAC,CACzB,IAAA,IAASL,EAAI,CAAA,CAAGA,CAAAA,CAAIwV,CAAAA,CAAM,MAAA,CAAQxV,CAAAA,EAAAA,CAAK,CACrC,IAAIC,CAAAA,CAAIuV,CAAAA,CAAM,WAAWxV,CAAC,CAAA,CAC1B,GAAIC,CAAAA,CAAI,GAAA,CACNI,CAAAA,CAAM,IAAA,CAAKJ,CAAC,CAAA,CAAA,KAAA,GACHA,EAAI,IAAA,CACbI,CAAAA,CAAM,KAAK,GAAA,CAAQJ,CAAAA,EAAK,EAAI,GAAA,CAAQA,CAAAA,CAAI,EAAK,CAAA,CAAA,KAAA,GACpCA,CAAAA,EAAK,OAAUA,CAAAA,EAAK,KAAA,EAAUD,EAAI,CAAA,CAAIwV,CAAAA,CAAM,OAAQ,CAC7D,IAAMtV,CAAAA,CAAOsV,CAAAA,CAAM,UAAA,CAAW,EAAExV,CAAC,CAAA,CACjCC,CAAAA,CAAI,QAAYA,CAAAA,CAAI,IAAA,GAAU,KAAOC,CAAAA,CAAO,IAAA,CAAA,CAC5CG,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAQJ,CAAAA,EAAK,GAAK,GAAA,CAASA,CAAAA,EAAK,GAAM,EAAA,CAAO,GAAA,CAASA,GAAK,CAAA,CAAK,EAAA,CAAO,GAAA,CAAQA,CAAAA,CAAI,EAAK,EACrG,MACEI,CAAAA,CAAM,IAAA,CAAK,IAAQJ,CAAAA,EAAK,EAAA,CAAK,IAASA,CAAAA,EAAK,CAAA,CAAK,GAAO,GAAA,CAAQA,CAAAA,CAAI,EAAK,EAE5E,CACAmE,EAAO,IAAI,UAAA,CAAW/D,CAAK,EAC7B,CAAA,KACE+D,CAAAA,CAAOoR,CAAAA,CAET,OAAO0E,MAAAA,CAAY9V,CAAI,CACzB,CAGO,SAAS+V,EAAAA,CAAMnV,CAAAA,CAAsB,CAC1C,GAAI,CACF,OAAA4P,CAAAA,CAAW,UAAA,CAAW5P,CAAG,EAClB,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CAaA,eAAsBoV,EAAAA,CACpBC,CAAAA,CACArV,CAAAA,CACkC,CAClC,IAAMsV,CAAAA,CAAK,IAAI5G,GACf,IAAA,IAAW6G,CAAAA,IAAMF,EACf,MAAMC,CAAAA,CAAG,aACPC,CAAAA,CAAG,CAAC,EACJA,CAAAA,CAAG,CAAC,CACN,CAAA,CAEF,OAAAD,EAAG,IAAA,CAAKtV,CAAG,CAAA,CACJyM,EAAAA,CAAiB,iDAAA,CAAmD,CACzE6I,EAAG,WACL,CAAC,CACH,CAmBA,eAAsBE,GACpBH,CAAAA,CACArV,CAAAA,CAC0B,CAC1B,IAAMsV,CAAAA,CAAK,IAAI5G,GACf,IAAA,IAAW6G,CAAAA,IAAMF,EACf,MAAMC,CAAAA,CAAG,aACPC,CAAAA,CAAG,CAAC,CAAA,CACJA,CAAAA,CAAG,CAAC,CACN,EAEF,OAAAD,CAAAA,CAAG,KAAKtV,CAAG,CAAA,CACJsV,EAAG,SAAA,CAAU,KAAK,CAC3B,CAeA,IAAMG,GAA4B,KAAA,CAElC,SAASC,GAAiBC,CAAAA,CAAiBC,CAAAA,CAA8B,CACvE,IAAM7Q,CAAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,CAAI,GAAA,CAAO6Q,EAAQ,gBAAA,CACtCC,CAAAA,CACF,OAAOD,CAAAA,CAAQ,YAAY,EAC1B7Q,CAAAA,CAAQ4Q,CAAAA,CAAWF,EAAAA,CAClBK,CAAAA,CAAa,IAAA,CAAK,KAAA,CAAOD,EAAcF,CAAAA,CAAW,GAAK,EAC3D,OAAI,CAAC,SAASG,CAAU,CAAA,EAAKA,CAAAA,CAAa,CAAA,CACxCA,CAAAA,CAAa,CAAA,CACJA,EAAa,GAAA,GACtBA,CAAAA,CAAa,KAER,CAAE,YAAA,CAAcD,EAAa,QAAA,CAAUF,CAAAA,CAAS,WAAAG,CAAW,CACpE,CAMA,SAASC,EAAAA,CAASC,EAAsB,CACtC,IAAMC,EAAQ,UAAA,CAAWD,CAAAA,CAAQ,cAAc,CAAA,CACzCE,CAAAA,CAAY,UAAA,CAAWF,EAAQ,wBAAwB,CAAA,CACvDG,EAAW,UAAA,CAAWH,CAAAA,CAAQ,uBAAuB,CAAA,CACrDI,CAAAA,CAAe,UAAA,CAAWJ,CAAAA,CAAQ,qBAAqB,CAAA,CACvDK,GACH,MAAA,CAAOL,CAAAA,CAAQ,WAAW,CAAA,CAAI,MAAA,CAAOA,EAAQ,SAAS,CAAA,EAAK,GAAA,CACxDM,CAAAA,CAAgB,IAAA,CAAK,GAAA,CAAIF,EAAcC,CAAgB,CAAA,CAC7D,OAAOJ,CAAAA,CAAQK,CAAAA,CAAgBJ,EAAYC,CAC7C,CAGO,SAASI,EAAAA,CAAgBP,CAAAA,CAA0B,CACxD,IAAML,CAAAA,CAAUI,GAASC,CAAO,CAAA,CAAI,IACpC,OAAON,EAAAA,CAAiBC,CAAAA,CAASK,CAAAA,CAAQ,cAAc,CACzD,CAGO,SAASQ,EAAAA,CAAgBC,EAAkC,CAChE,OAAOf,GACL,MAAA,CAAOe,CAAAA,CAAU,MAAM,CAAA,CACvBA,CAAAA,CAAU,UACZ,CACF,CC1OO,IAAKC,QACVA,CAAAA,CAAA,MAAA,CAAS,SACTA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,6BAAA,CAAgC,+BAAA,CAChCA,EAAA,iBAAA,CAAoB,mBAAA,CACpBA,EAAA,aAAA,CAAgB,eAAA,CAChBA,EAAA,OAAA,CAAU,SAAA,CACVA,EAAA,OAAA,CAAU,SAAA,CACVA,EAAA,UAAA,CAAa,YAAA,CARHA,QAAA,EAAA,EAmCL,SAASC,GAAgB1T,CAAAA,CAA8B,CAG5D,IAAM2T,CAAAA,CAAmB3T,CAAAA,EAAO,iBAAA,CAAoB,OAAOA,CAAAA,CAAM,iBAAiB,EAAI,EAAA,CAChF4T,CAAAA,CAAe5T,GAAO,OAAA,CAAU,MAAA,CAAOA,CAAAA,CAAM,OAAO,CAAA,CAAI,EAAA,CAExD6T,EAAY7T,CAAAA,EAAO,KAAA,CAAQ,OAAOA,CAAAA,CAAM,KAAK,EAAI,EAAA,CACjD8T,CAAAA,CAAcH,CAAAA,EAAoBC,CAAAA,EAAgB,MAAA,CAAO5T,CAAAA,EAAS,EAAE,CAAA,CAGpE+T,CAAAA,CAAeC,GAEf,CAAA,EAAAH,CAAAA,EAAaG,EAAQ,IAAA,CAAKH,CAAS,GAEnCF,CAAAA,EAAoBK,CAAAA,CAAQ,KAAKL,CAAgB,CAAA,EAEjDC,GAAgBI,CAAAA,CAAQ,IAAA,CAAKJ,CAAY,CAAA,EAEzCE,CAAAA,EAAeE,CAAAA,CAAQ,IAAA,CAAKF,CAAW,CAAA,CAAA,CAK7C,GACEC,CAAAA,CAAY,0BAA0B,GACtCA,CAAAA,CAAY,kBAAkB,GAC9BA,CAAAA,CAAY,sCAAsC,CAAA,CAElD,OAAO,CACL,OAAA,CAAS,0DACT,IAAA,CAAM,+BAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,+BAA+B,CAAA,CAC7C,OAAO,CACL,OAAA,CAAS,iFACT,IAAA,CAAM,QAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,iDAAiD,EAC/D,OAAO,CACL,QAAS,8CAAA,CACT,IAAA,CAAM,OACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,uBAAuB,CAAA,CACrC,OAAO,CACL,QAAS,uDAAA,CACT,IAAA,CAAM,OACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,+BAA+B,CAAA,CAC7C,OAAO,CACL,QAAS,8DAAA,CACT,IAAA,CAAM,OACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,4CAA4C,CAAA,CAC1D,OAAO,CACL,QAAS,8CAAA,CACT,IAAA,CAAM,OACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,gBAAgB,CAAA,CAC9B,OAAO,CACL,OAAA,CAAS,uCAAA,CACT,KAAM,QAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,kBAAkB,CAAA,CAChC,OAAO,CACL,OAAA,CAAS,yDAAA,CACT,KAAM,QAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,6DAA6D,CAAA,CAC3E,OAAO,CACL,OAAA,CAAS,uDAAA,CACT,KAAM,QAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,+CAA+C,CAAA,CAC7D,OAAO,CACL,OAAA,CAAS,oEAAA,CACT,KAAM,mBAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAOF,GAAI+T,EAAY,uCAAuC,CAAA,CACrD,OAAO,CACL,OAAA,CAAS,qEACT,IAAA,CAAM,mBAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,sCAAsC,CAAA,CACpD,OAAO,CACL,OAAA,CAAS,mEACT,IAAA,CAAM,mBAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,wCAAwC,CAAA,CACtD,OAAO,CACL,OAAA,CAAS,6DACT,IAAA,CAAM,mBAAA,CACN,cAAe/T,CACjB,CAAA,CAMF,GACE6T,CAAAA,GAAc,eAAA,EACdA,CAAAA,GAAc,uBACdE,CAAAA,CAAY,gBAAgB,GAC5BA,CAAAA,CAAY,gBAAgB,GAC5BA,CAAAA,CAAY,mBAAmB,GAC/BA,CAAAA,CAAY,gBAAgB,EAE5B,OAAO,CACL,QAAS,oDAAA,CACT,IAAA,CAAM,gBACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,wBAAwB,GAAKA,CAAAA,CAAY,8BAA8B,EACrF,OAAO,CACL,QAAS,uCAAA,CACT,IAAA,CAAM,MAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,wBAAwB,EACtC,OAAO,CACL,QAAS,8CAAA,CACT,IAAA,CAAM,MAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GACE+T,CAAAA,CAAY,eAAe,GAC3BA,CAAAA,CAAY,qBAAqB,GACjCA,CAAAA,CAAY,kBAAkB,GAC9BA,CAAAA,CAAY,mEAAmE,EAE/E,OAAO,CACL,QAAS,4DAAA,CACT,IAAA,CAAM,UACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,UAAU,GAAKA,CAAAA,CAAY,YAAY,EACrD,OAAO,CACL,QAAS,sCAAA,CACT,IAAA,CAAM,SAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,0BAA0B,GAAKA,CAAAA,CAAY,oBAAoB,EAC7E,OAAO,CACL,OAAA,CAAS,+CAAA,CACT,IAAA,CAAM,YAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,mBAAmB,EACjC,OAAO,CACL,QAAS,2CAAA,CACT,IAAA,CAAM,aACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,sEAAsE,CAAA,CACpF,OAAO,CACL,OAAA,CAAS,0CAAA,CACT,IAAA,CAAM,aACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,2BAA2B,CAAA,CAGzC,OAAO,CACL,OAAA,CAAA,CAFe/T,CAAAA,EAAO,OAAA,EAAW8T,GAAa,SAAA,CAAU,CAAA,CAAG,GAAG,CAAA,EAAK,2BAAA,CAGnE,KAAM,YAAA,CACN,aAAA,CAAe9T,CACjB,CAAA,CAKF,GAAIA,CAAAA,EAAO,mBAAqB,OAAOA,CAAAA,CAAM,mBAAsB,QAAA,CACjE,OAAO,CACL,OAAA,CAASA,CAAAA,CAAM,kBAAkB,SAAA,CAAU,CAAA,CAAG,GAAG,CAAA,CACjD,IAAA,CAAM,SACN,aAAA,CAAeA,CACjB,EAIF,GAAIA,CAAAA,EAAO,OAAA,EAAW,OAAOA,CAAAA,CAAM,OAAA,EAAY,SAC7C,OAAO,CACL,QAASA,CAAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,CAAG,GAAG,CAAA,CACvC,IAAA,CAAM,QAAA,CACN,aAAA,CAAeA,CACjB,CAAA,CAIF,IAAItD,EACJ,OAAI,OAAOsD,GAAU,QAAA,EAAYA,CAAAA,GAAU,IAAA,CAErCA,CAAAA,CAAM,iBAAA,CACRtD,CAAAA,CAAU,OAAOsD,CAAAA,CAAM,iBAAiB,EAC/BA,CAAAA,CAAM,IAAA,CACftD,EAAU,CAAA,YAAA,EAAesD,CAAAA,CAAM,IAAI,CAAA,CAAA,CAC1B8T,CAAAA,EAAeA,IAAgB,iBAAA,CACxCpX,CAAAA,CAAUoX,EAAY,SAAA,CAAU,CAAA,CAAG,GAAG,CAAA,CAEtCpX,CAAAA,CAAU,wBAAA,CAGZA,CAAAA,CAAUoX,CAAAA,CAAY,SAAA,CAAU,EAAG,GAAG,CAAA,EAAK,yBAGtC,CACL,OAAA,CAAApX,EACA,IAAA,CAAM,QAAA,CACN,aAAA,CAAesD,CACjB,CACF,CAsBO,SAASiU,EAAAA,CAAYjU,CAAAA,CAAiC,CAC3D,IAAMkU,CAAAA,CAASR,GAAgB1T,CAAK,CAAA,CACpC,OAAO,CAACkU,CAAAA,CAAO,OAAA,CAASA,EAAO,IAAI,CACrC,CAsBO,SAASC,EAAAA,CAA0BnU,EAAqB,CAC7D,GAAM,CAAE,IAAA,CAAA+R,CAAK,EAAI2B,EAAAA,CAAgB1T,CAAK,EACtC,OAAO+R,CAAAA,GAAS,qBAA+BA,CAAAA,GAAS,eAC1D,CAoBO,SAASqC,EAAAA,CAAuBpU,CAAAA,CAAqB,CAC1D,GAAM,CAAE,KAAA+R,CAAK,CAAA,CAAI2B,GAAgB1T,CAAK,CAAA,CACtC,OAAO+R,CAAAA,GAAS,+BAClB,CASO,SAASsC,EAAAA,CAAYrU,CAAAA,CAAqB,CAC/C,GAAM,CAAE,KAAA+R,CAAK,CAAA,CAAI2B,EAAAA,CAAgB1T,CAAK,CAAA,CACtC,OAAO+R,IAAS,MAClB,CAQO,SAASuC,EAAAA,CAAetU,CAAAA,CAAqB,CAClD,GAAM,CAAE,KAAA+R,CAAK,CAAA,CAAI2B,GAAgB1T,CAAK,CAAA,CACtC,OAAO+R,CAAAA,GAAS,SAAA,EAAqBA,IAAS,SAChD,CC3XA,eAAewC,GACb5R,CAAAA,CACAoK,CAAAA,CACAqF,EACAoC,CAAAA,CACAC,CAAAA,CAA4B,UAC5BC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAA+B,OAAA,CACqB,CACpD,IAAMC,EAAUL,CAAAA,EAAM,OAAA,CAEtB,OAAQ7R,CAAAA,EACN,KAAK,KAAA,CAAO,CACV,GAAI,CAACkS,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wCAAwC,EAI1D,IAAI9X,CAAAA,CAAiC2X,EAErC,GAAI3X,CAAAA,GAAQ,OAEV,OAAQ0X,CAAAA,EACN,KAAK,OAAA,CACH,GAAII,CAAAA,CAAQ,WAAA,CACV9X,EAAM,MAAM8X,CAAAA,CAAQ,WAAA,CAAY9H,CAAQ,CAAA,CAAA,KAExC,MAAM,IAAI,KAAA,CACR,iIAEF,EAEF,MAEF,KAAK,SACC8H,CAAAA,CAAQ,YAAA,GACV9X,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,YAAA,CAAa9H,CAAQ,CAAA,CAAA,CAE3C,MAEF,KAAK,MAAA,CACH,GAAI8H,EAAQ,UAAA,CACV9X,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,UAAA,CAAW9H,CAAQ,OAEvC,MAAM,IAAI,MACR,yEACF,CAAA,CAEF,MAGF,QACEhQ,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,aAAA,CAAc9H,CAAQ,CAAA,CAC1C,KACJ,CAGF,GAAI,CAAChQ,EACH,MAAM,IAAI,KAAA,CAAM,CAAA,GAAA,EAAM0X,CAAS,CAAA,mBAAA,EAAsB1H,CAAQ,CAAA,CAAE,CAAA,CAIjE,IAAMY,CAAAA,CAAahB,CAAAA,CAAW,WAAW5P,CAAG,CAAA,CAC5C,OAAI6X,CAAAA,GAAkB,OAAA,CACb,MAAMrC,GAAyBH,CAAAA,CAAKzE,CAAU,EAEhD,MAAMwE,EAAAA,CAAoBC,EAAKzE,CAAU,CAClD,CAEA,KAAK,UAAA,CAAY,CACf,GAAI,CAACkH,CAAAA,EAAS,sBACZ,MAAM,IAAI,MAAM,mCAAmC,CAAA,CAErD,OAAO,MAAMA,CAAAA,CAAQ,sBAAsB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CACrE,CAEA,KAAK,YAAA,CAAc,CACjB,GAAI,CAACI,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,yCAAyC,EAK3D,GAAIJ,CAAAA,GAAc,UAAW,CAC3B,GAAII,CAAAA,CAAQ,uBAAA,CACV,OAAO,MAAMA,EAAQ,uBAAA,CAAwB9H,CAAAA,CAAUqF,EAAKqC,CAAS,CAAA,CAEvE,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuCA,CAAS,CAAA,6CAAA,CAA+C,CACjH,CAGA,IAAMK,CAAAA,CAAQH,IAAiB,MAAA,CAC3BA,CAAAA,CACA,MAAME,CAAAA,CAAQ,cAAA,CAAe9H,CAAQ,CAAA,CAEzC,GAAI+H,EACF,GAAI,CAGF,QADiB,MADF,IAAIC,GAAG,MAAA,CAAO,CAAE,WAAA,CAAaD,CAAM,CAAC,CAAA,CACrB,UAAU1C,CAAG,CAAA,EAC3B,MAClB,CAAA,MAAS4C,CAAAA,CAAY,CAEnB,GAAIH,CAAAA,CAAQ,uBAAA,EAA2BV,EAAAA,CAA0Ba,CAAU,CAAA,CACzE,OAAO,MAAMH,CAAAA,CAAQ,wBAAwB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CAAA,CAEvE,MAAMO,CACR,CAIF,GAAIH,CAAAA,CAAQ,wBACV,OAAO,MAAMA,EAAQ,uBAAA,CAAwB9H,CAAAA,CAAUqF,EAAKqC,CAAS,CAAA,CAGvE,MAAM,IAAI,KAAA,CAAM,iCAAiC1H,CAAQ,CAAA,CAAE,CAC7D,CAEA,KAAK,WAAY,CACf,GAAI,CAAC8H,CAAAA,EAAS,qBAAA,CACZ,MAAM,IAAI,KAAA,CAAM,mCAAmC,EAErD,OAAO,MAAMA,EAAQ,qBAAA,CAAsB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CACrE,CAEA,KAAK,QAAA,CAAU,CACb,GAAI,CAACD,CAAAA,EAAM,UACT,MAAM,IAAI,KAAA,CAAM,uCAAuC,CAAA,CAEzD,OAAQ,MAAMA,CAAAA,CAAK,SAAA,CAAUpC,EAAKqC,CAAS,CAC7C,CAEA,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB9R,CAAM,CAAA,CAAE,CACpD,CACF,CAuCA,eAAesS,GACblI,CAAAA,CACAqF,CAAAA,CACAoC,CAAAA,CACAC,CAAAA,CAA4B,SAAA,CAC5BG,CAAAA,CAA+B,QACqB,CACpD,IAAMC,EAAUL,CAAAA,EAAM,OAAA,CAItB,GAAIK,CAAAA,EAAS,YAAA,CAAc,CACzB,IAAMK,CAAAA,CAAY,MAAML,EAAQ,YAAA,CAAa9H,CAAAA,CAAU0H,CAAS,CAAA,CAEhE,GAAIS,EAAW,CAIb,IAAMC,CAAAA,CAAiBN,CAAAA,CAAQ,uBAAA,CAC3B,MAAMA,EAAQ,uBAAA,CAAwB9H,CAAQ,EAC9C,KAAA,CAIJ,GACE0H,IAAc,SAAA,EACdU,CAAAA,EACAD,IAAc,KAAA,CAEd,GAAI,CAEF,OAAO,MAAMX,GAAoB,YAAA,CAAcxH,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,OAAS5U,CAAAA,CAAO,CAGd,GAAI,CAACmU,EAAAA,CAA0BnU,CAAK,CAAA,CAClC,MAAMA,CAAAA,CAGR,OAAA,CAAQ,IAAA,CAAK,0DAAA,CAA4DA,CAAK,EAChF,CAIF,GACEyU,CAAAA,GAAc,SAAA,EACdU,GACAD,CAAAA,GAAc,UAAA,CAEd,GAAI,CACF,OAAO,MAAMX,GAAoB,YAAA,CAAcxH,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAW,OAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,CAAA,MAAS5U,CAAAA,CAAO,CACd,GAAI,CAACmU,GAA0BnU,CAAK,CAAA,CAClC,MAAMA,CAAAA,CAER,OAAA,CAAQ,IAAA,CAAK,oEAAA,CAAsEA,CAAK,EAC1F,CAIF,GACEyU,CAAAA,GAAc,WACdU,CAAAA,EACAD,CAAAA,GAAc,WAEd,GAAI,CAEF,OAAO,MAAMX,EAAAA,CAAoB,YAAA,CAAcxH,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,CAAA,MAAS5U,CAAAA,CAAO,CAGd,GAAI,CAACmU,GAA0BnU,CAAK,CAAA,CAClC,MAAMA,CAAAA,CAGR,OAAA,CAAQ,KAAK,+DAAA,CAAiEA,CAAK,EACrF,CAIF,GAAI,CACF,OAAO,MAAMuU,GAAoBW,CAAAA,CAAWnI,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACjH,OAAS5U,CAAAA,CAAO,CAEd,GAAImU,EAAAA,CAA0BnU,CAAK,GAG/B6U,CAAAA,CAAQ,iBAAA,GACPJ,CAAAA,GAAc,SAAA,EAAaA,CAAAA,GAAc,QAAA,CAAA,CAC1C,CAEA,IAAMzI,CAAAA,CAAgBoG,EAAI,MAAA,CAAS,CAAA,CAAIA,EAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAI,SAAA,CAC7CgD,CAAAA,CAAiB,MAAMP,CAAAA,CAAQ,iBAAA,CAAkBJ,EAAWzI,CAAa,CAAA,CAC/E,GAAI,CAACoJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sBAAsBX,CAAS,CAAA,yCAAA,CAA2C,EAM5F,OAAO,MAAMF,GAAoBa,CAAAA,CAAgBrI,CAAAA,CAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,CAAAA,CAAW,MAAA,CAAW,OAAWG,CAAa,CACtH,CAIF,MAAM5U,CACR,CACF,CAGA,GAAIyU,CAAAA,GAAc,SAAA,CAEhB,GAAI,CACF,OAAO,MAAMF,EAAAA,CAAoB,aAAcxH,CAAAA,CAAUqF,CAAAA,CAAKoC,EAAMC,CAAAA,CAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,CAAA,MAASS,EAAS,CAChB,GAAIlB,GAA0BkB,CAAO,CAAA,EAAKR,EAAQ,iBAAA,CAAmB,CACnE,IAAM7I,CAAAA,CAAgBoG,CAAAA,CAAI,OAAS,CAAA,CAAIA,CAAAA,CAAI,CAAC,CAAA,CAAE,CAAC,EAAI,SAAA,CAC7CgD,CAAAA,CAAiB,MAAMP,CAAAA,CAAQ,iBAAA,CAAkBJ,CAAAA,CAAWzI,CAAa,CAAA,CAC/E,GAAI,CAACoJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+BrI,CAAQ,CAAA,sBAAA,CAAwB,CAAA,CAEjF,OAAO,MAAMwH,EAAAA,CAAoBa,CAAAA,CAAgBrI,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,MAAA,CAAW,MAAA,CAAWG,CAAa,CACtH,CACA,MAAMS,CACR,CAAA,KAAA,GACSZ,CAAAA,GAAc,UAAYI,CAAAA,CAAQ,iBAAA,CAAmB,CAE9D,IAAM7I,CAAAA,CAAgBoG,EAAI,MAAA,CAAS,CAAA,CAAIA,EAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAI,SAAA,CAC7CgD,EAAiB,MAAMP,CAAAA,CAAQ,iBAAA,CAAkBJ,CAAAA,CAAWzI,CAAa,CAAA,CAC/E,GAAI,CAACoJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sBAAsBX,CAAS,CAAA,yCAAA,CAA2C,CAAA,CAE5F,OAAO,MAAMF,EAAAA,CAAoBa,EAAgBrI,CAAAA,CAAUqF,CAAAA,CAAKoC,EAAMC,CAAAA,CAAW,MAAA,CAAW,OAAWG,CAAa,CACtH,CACF,CAIA,IAAMU,CAAAA,CAAQd,GAAM,aAAA,EAAiB,CAAC,MAAO,UAAA,CAAY,YAAA,CAAc,WAAY,QAAQ,CAAA,CACrFe,EAA6B,IAAI,GAAA,CAEvC,QAAW5S,CAAAA,IAAU2S,CAAAA,CACnB,GAAI,CAEF,IAAIE,EAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,EAAA,CACbC,CAAAA,CACAC,CAAAA,CAEJ,OAAQhT,GACN,KAAK,MACH,GAAI,CAACkS,EACHW,CAAAA,CAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,qBAAA,CAAA,KACR,CAEL,IAAI1Y,EAEJ,OAAQ0X,CAAAA,EACN,KAAK,OAAA,CACCI,EAAQ,WAAA,GACV9X,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,WAAA,CAAY9H,CAAQ,GAE1C,MACF,KAAK,SACC8H,CAAAA,CAAQ,YAAA,GACV9X,EAAM,MAAM8X,CAAAA,CAAQ,aAAa9H,CAAQ,CAAA,CAAA,CAE3C,MACF,KAAK,MAAA,CACC8H,EAAQ,UAAA,GACV9X,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,UAAA,CAAW9H,CAAQ,CAAA,CAAA,CAEzC,MAEF,QACEhQ,EAAM,MAAM8X,CAAAA,CAAQ,cAAc9H,CAAQ,CAAA,CAC1C,KACJ,CAEKhQ,CAAAA,CAIH2Y,CAAAA,CAAgB3Y,CAAAA,EAHhByY,CAAAA,CAAa,CAAA,CAAA,CACbC,EAAa,CAAA,GAAA,EAAMhB,CAAS,kBAIhC,CACA,MACF,KAAK,UAAA,CACEI,CAAAA,EAAS,qBAAA,GACZW,CAAAA,CAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,qCAEf,MACF,KAAK,aACH,GAAI,CAACZ,EACHW,CAAAA,CAAa,CAAA,CAAA,CACbC,EAAa,qBAAA,CAAA,KACR,CAEL,IAAMX,CAAAA,CAAQ,MAAMD,EAAQ,cAAA,CAAe9H,CAAQ,EAC/C+H,CAAAA,GACFa,CAAAA,CAAkBb,CAAAA,EAItB,CACA,MACF,KAAK,WACED,CAAAA,EAAS,qBAAA,GACZW,EAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,qCAEf,MACF,KAAK,QAAA,CACEjB,CAAAA,EAAM,SAAA,GACTgB,CAAAA,CAAa,GACbC,CAAAA,CAAa,uCAAA,CAAA,CAEf,KACJ,CAEA,GAAID,EAAY,CACdD,CAAAA,CAAO,GAAA,CAAI5S,CAAAA,CAAQ,IAAI,KAAA,CAAM,YAAY8S,CAAU,CAAA,CAAE,CAAC,CAAA,CACtD,QACF,CAGA,OAAO,MAAMlB,GAAoB5R,CAAAA,CAAQoK,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAWiB,EAAeC,CAAAA,CAAiBf,CAAa,CACxH,CAAA,MAAS5U,CAAAA,CAAO,CAKd,GAHAuV,CAAAA,CAAO,GAAA,CAAI5S,EAAQ3C,CAAc,CAAA,CAG7B,CAACmU,EAAAA,CAA0BnU,CAAK,EAElC,MAAMA,CAEV,CAQF,GAAI,CAJoB,KAAA,CAAM,KAAKuV,CAAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,IAAA,CAClDvV,GAAS,CAACA,CAAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,UAAU,CAC/C,EAEsB,CAEpB,IAAM4V,EAAc,KAAA,CAAM,IAAA,CAAKL,EAAO,OAAA,EAAS,EAC5C,GAAA,CAAI,CAAC,CAAC5S,CAAAA,CAAQ3C,CAAK,IAAM,CAAA,EAAG2C,CAAM,KAAK3C,CAAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACtD,IAAA,CAAK,IAAI,EACZ,MAAM,IAAI,MACR,CAAA,+CAAA,EAAkD+M,CAAQ,KAAK6I,CAAW,CAAA,CAC5E,CACF,CAGA,IAAMC,CAAAA,CAAgB,MAAM,IAAA,CAAKN,CAAAA,CAAO,SAAS,CAAA,CAC9C,IAAI,CAAC,CAAC5S,CAAAA,CAAQ3C,CAAK,CAAA,GAAM,CAAA,EAAG2C,CAAM,CAAA,EAAA,EAAK3C,CAAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACtD,KAAK,IAAI,CAAA,CAEZ,MAAM,IAAI,KAAA,CACR,gDAAgD+M,CAAQ,CAAA,UAAA,EAAa8I,CAAa,CAAA,CACpF,CACF,CA6DO,SAASC,CAAAA,CACdC,CAAAA,CAA2B,EAAC,CAC5BhJ,CAAAA,CACAqE,EACA4E,CAAAA,CAAgE,IAAM,CAAC,CAAA,CACvExB,CAAAA,CACAC,EAA4B,SAAA,CAC5B9I,CAAAA,CAeA,CACA,IAAMiJ,CAAAA,CAAgBjJ,CAAAA,EAAS,eAAiB,OAAA,CAEhD,OAAOsK,YAAY,CACjB,SAAA,CAAAD,EACA,QAAA,CAAUrK,CAAAA,EAAS,QAAA,CACnB,OAAA,CAASA,CAAAA,EAAS,OAAA,CAClB,UAAWA,CAAAA,EAAS,SAAA,CACpB,YAAa,CAAC,GAAGoK,EAAahJ,CAAQ,CAAA,CACtC,WAAY,MAAOmJ,CAAAA,EAAe,CAChC,GAAI,CAACnJ,EACH,MAAM,IAAI,MACR,kEACF,CAAA,CAGF,IAAMqF,CAAAA,CAAMhB,CAAAA,CAAW8E,CAAO,EAE9B,GAAI,CAEF,GAAI1B,CAAAA,EAAM,cAAA,GAAmB,IAASA,CAAAA,EAAM,OAAA,CAC1C,OAAO,MAAMS,EAAAA,CAAsBlI,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAWG,CAAa,CAAA,CAIlF,GAAIJ,GAAM,SAAA,CACR,OAAO,MAAMA,CAAAA,CAAK,SAAA,CAAUpC,CAAAA,CAAKqC,CAAS,CAAA,CAG5C,IAAM0B,EAAa3B,CAAAA,EAAM,UAAA,CACzB,GAAI2B,CAAAA,CAAY,CAEd,GAAI1B,CAAAA,GAAc,SAAA,CAChB,MAAM,IAAI,KAAA,CACR,sEAAsEA,CAAS,CAAA,uDAAA,EACtCA,CAAS,CAAA,YAAA,CACpD,CAAA,CAGF,IAAM9G,CAAAA,CAAahB,CAAAA,CAAW,UAAA,CAAWwJ,CAAU,CAAA,CAEnD,OAAO,MAAMhE,EAAAA,CACXC,CAAAA,CACAzE,CACF,CACF,CAEA,IAAMyI,CAAAA,CAAc5B,CAAAA,EAAM,WAAA,CAC1B,GAAI4B,CAAAA,CAGF,OAAA,CADiB,MADF,IAAIrB,EAAAA,CAAG,OAAO,CAAE,WAAA,CAAAqB,CAAY,CAAC,CAAA,CACd,SAAA,CAAUhE,CAAG,CAAA,EAC3B,MAAA,CAGlB,MAAM,IAAI,KAAA,CACR,mEACF,CACF,CAAA,MAASvM,EAAG,CACV,MAAIA,aAAavE,EAAAA,CAKT,IAAI,MAAMuE,CAAAA,CAAE,OAAO,EAErBA,CACR,CACF,CACF,CAAC,CACH,CClnBA,eAAsBwQ,EAAAA,CACpBtJ,CAAAA,CACAhO,EACAmX,CAAAA,CACA1B,CAAAA,CACA,CACA,GAAI,CAACzH,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,kEACF,CAAA,CAEF,IAAMuJ,EAAQ,CACZ,EAAA,CAAAvX,CAAAA,CACA,cAAA,CAAgB,EAAC,CACjB,uBAAwB,CAACgO,CAAQ,EACjC,IAAA,CAAM,IAAA,CAAK,UAAUmJ,CAAO,CAC9B,EAEA,GAAI1B,CAAAA,EAAM,UACR,OAAOA,CAAAA,CAAK,UAAU,CAAC,CAAC,cAAe8B,CAAK,CAAC,CAAA,CAAG,SAAS,CAAA,CAG3D,IAAMH,EAAa3B,CAAAA,EAAM,UAAA,CACzB,GAAI2B,CAAAA,CAAY,CACd,IAAMxI,CAAAA,CAAahB,CAAAA,CAAW,UAAA,CAAWwJ,CAAU,CAAA,CAEnD,OAAOhE,GACL,CAAC,CAAC,cAAemE,CAAK,CAAC,EACvB3I,CACF,CACF,CAGA,IAAMyI,CAAAA,CAAc5B,CAAAA,EAAM,YAC1B,GAAI4B,CAAAA,CAIF,QAHiB,MAAM,IAAIrB,GAAG,MAAA,CAAO,CACnC,YAAAqB,CACF,CAAC,EAAE,UAAA,CAAW,GAAI,CAACrJ,CAAQ,EAAGhO,CAAAA,CAAI,IAAA,CAAK,SAAA,CAAUmX,CAAO,CAAC,CAAA,EACzC,OAGlB,MAAM,IAAI,MACR,mEACF,CACF,CCxCO,IAAMK,EAAAA,CAA+B,IAYrC,SAASC,CAAAA,CACd3B,CAAAA,CACAD,EACA1I,CAAAA,CACsB,CACtB,GAAK2I,CAAAA,EAAS,iBAAA,CACd,IAAID,CAAAA,GAAkB,MAAA,CAEpB,OAAOC,CAAAA,CAAQ,iBAAA,CAAkB3I,CAAI,EAEvC,UAAA,CAAW,IAAM2I,EAAQ,iBAAA,GAAoB3I,CAAI,EAAG,GAA4B,EAAA,CAClF,CChCO,SAASuK,EAAAA,CAAkBC,EAAmBtP,CAAAA,CAAmC,CACtF,IAAMuP,CAAAA,CAAgB,WAAA,CAAY,QAAQD,CAAS,CAAA,CACnD,GAAI,CAACtP,CAAAA,CAAQ,OAAOuP,EAIpB,GAAI,OAAO,YAAY,GAAA,EAAQ,UAAA,CAC7B,OAAO,WAAA,CAAY,GAAA,CAAI,CAACvP,CAAAA,CAAQuP,CAAa,CAAC,EAGhD,IAAMC,CAAAA,CAAK,IAAI,eAAA,CACTC,CAAAA,CAAU,IAAM,CACpB,IAAMC,CAAAA,CAAS1P,CAAAA,CAAO,OAAA,CAAUA,CAAAA,CAAO,OAASuP,CAAAA,CAAc,MAAA,CAC9DC,EAAG,KAAA,CAAME,CAAM,EACf1P,CAAAA,CAAO,mBAAA,CAAoB,QAASyP,CAAO,CAAA,CAC3CF,EAAc,mBAAA,CAAoB,OAAA,CAASE,CAAO,EACpD,CAAA,CACA,OAAIzP,CAAAA,CAAO,OAAA,CACTwP,CAAAA,CAAG,KAAA,CAAMxP,CAAAA,CAAO,MAAM,EACbuP,CAAAA,CAAc,OAAA,CACvBC,EAAG,KAAA,CAAMD,CAAAA,CAAc,MAAM,CAAA,EAE7BvP,CAAAA,CAAO,gBAAA,CAAiB,OAAA,CAASyP,CAAAA,CAAS,CAAE,KAAM,IAAK,CAAC,EACxDF,CAAAA,CAAc,gBAAA,CAAiB,QAASE,CAAAA,CAAS,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAAA,CAE1DD,EAAG,MACZ,CCZA,IAAMG,EAAAA,CAAAA,CAAiB,IAAM,CAC3B,GAAI,CACF,OAAO,CAAA,CACT,MAAQ,CACN,OAAO,MACT,CACF,CAAA,GAAG,CAEGC,EAAAA,CAAkB,IAAM,CAC5B,GAAI,CACF,OAAO,EACT,CAAA,KAAQ,CACN,MACF,CACF,CAAA,CAGaC,EAAAA,CAA0B,GAAA,CAsB1BC,EAAAA,CAAoB,GAAA,CAAS,IAsBtCC,EAAAA,CAGAC,GAEJ,SAASC,EAAAA,EAAkC,CACzC,OAAIF,EAAAA,CACKA,EAAAA,EAAoB,CAErBC,EAAAA,GAAAA,EAAAA,CAAwB,IAAIE,WAAAA,CACtC,CAEO,IAAMC,CAAAA,CAAS,CACpB,cAAA,CAAgB,oBAAA,CAYhB,gBAAiB,QAAA,CASjB,QAAA,CAAU,aACV,SAAA,CAAW,sBAAA,CAEX,IAAI,SAAA,EAAsB,CACxB,OAAO1c,CAAAA,CAAa,KACtB,EACA,YAAA,CAAcmc,EAAAA,EAAgB,CAQ9B,IAAI,WAAA,EAA2B,CAC7B,OAAOK,EAAAA,EACT,EACA,IAAI,WAAA,CAAYG,EAAqB,CACnCL,EAAAA,CAAsB,IAAMK,EAC9B,CAAA,CACA,YAAA,CAAc,0BACd,aAAA,CAAe,uBAAA,CAEf,aAAc,EAAC,CACf,SAAU,EAAC,CACX,YAAA,CAAc,EAAC,CAEf,cAAA,CAAgB,EAAC,CACjB,kBAAA,CAAoB,EAAC,CAErB,gBAAA,CAAkB,KACpB,CAAA,CAQiBC,EAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CAAeF,EAAqB,CAClDD,CAAAA,CAAO,YAAcC,EACvB,CAFOC,EAAS,cAAA,CAAAC,CAAAA,CAsBT,SAASC,CAAAA,CAAuBxW,CAAAA,CAA4B,CACjEgW,GAAsBhW,EACxB,CAFOsW,EAAS,sBAAA,CAAAE,CAAAA,CAQT,SAASC,CAAAA,CAAkBC,CAAAA,CAAc,CAC9CN,CAAAA,CAAO,cAAA,CAAiBM,EAC1B,CAFOJ,CAAAA,CAAS,iBAAA,CAAAG,EAWT,SAASE,CAAAA,CAAYC,EAAkB,CAC5CR,CAAAA,CAAO,QAAA,CAAWQ,EACpB,CAFON,CAAAA,CAAS,YAAAK,CAAAA,CAiBT,SAASE,EAAmBC,CAAAA,CAAkB,CACnD,GAAI,OAAOA,CAAAA,EAAa,UAAYA,CAAAA,CAAS,IAAA,KAAW,EAAA,CACtD,MAAM,IAAI,KAAA,CACR,kLAEF,EAGFV,CAAAA,CAAO,eAAA,CAAkBU,EAC3B,CATOR,CAAAA,CAAS,kBAAA,CAAAO,EAuBT,SAASE,CAAAA,EAA8B,CAC5C,OAAIX,CAAAA,CAAO,eACFA,CAAAA,CAAO,cAAA,CAGZ,OAAO,MAAA,CAAW,GAAA,EAAe,MAAA,CAAO,UAAU,MAAA,CAC7C,MAAA,CAAO,SAAS,MAAA,CAIlB,oBACT,CAXOE,CAAAA,CAAS,mBAAA,CAAAS,CAAAA,CAiBT,SAASC,CAAAA,CAAgBN,CAAAA,CAAc,CAC5CN,CAAAA,CAAO,YAAA,CAAeM,EACxB,CAFOJ,CAAAA,CAAS,gBAAAU,CAAAA,CAQT,SAASC,EAAaP,CAAAA,CAAc,CACzCN,EAAO,SAAA,CAAYM,EACrB,CAFOJ,CAAAA,CAAS,YAAA,CAAAW,EAWT,SAASC,CAAAA,CAAatd,CAAAA,CAAiB,CAC5CE,EAAAA,CAAeF,CAAK,EACtB,CAFO0c,CAAAA,CAAS,aAAAY,CAAAA,CAWT,SAASld,EAAaJ,CAAAA,CAAiB,CAC5CI,EAAAA,CAAmBJ,CAAK,EAC1B,CAFO0c,EAAS,YAAA,CAAAtc,CAAAA,CAYT,SAASE,CAAAA,CAAkBC,CAAAA,CAA4C,CAC5ED,EAAAA,CAAwBC,CAAG,EAC7B,CAFOmc,CAAAA,CAAS,iBAAA,CAAApc,EAWT,SAASI,CAAAA,CAAa6c,EAAmB,CAC9C7c,EAAAA,CAAmB6c,CAAS,EAC9B,CAFOb,EAAS,YAAA,CAAAhc,CAAAA,CAaT,SAASE,CAAAA,CAAcC,CAAAA,CAAkC,CAC9DD,EAAAA,CAAoBC,CAAI,EAC1B,CAFO6b,CAAAA,CAAS,aAAA,CAAA9b,CAAAA,CAShB,SAAS4c,CAAAA,CAAiBvE,EAAqD,CAE7E,GAAI,6BAA6B,IAAA,CAAKA,CAAO,EAC3C,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,MAAA,CAAQ,6BAA8B,EAI9D,GAAI,wBAAA,CAAyB,KAAKA,CAAO,CAAA,CACvC,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,MAAA,CAAQ,iDAAkD,CAAA,CAIlF,GAAI,wBAAA,CAAyB,IAAA,CAAKA,CAAO,CAAA,CACvC,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,OAAQ,uDAAwD,CAAA,CAIxF,GAAI,UAAA,CAAW,IAAA,CAAKA,CAAO,CAAA,EAAK,UAAA,CAAW,KAAKA,CAAO,CAAA,CACrD,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,OAAQ,0CAA2C,CAAA,CAI3E,IAAMwE,CAAAA,CAAiB,qBAAA,CACnBC,EACJ,KAAA,CAAQA,CAAAA,CAAQD,CAAAA,CAAe,IAAA,CAAKxE,CAAO,CAAA,IAAO,MAAM,CACtD,GAAM,EAAG0E,CAAAA,CAAKC,CAAG,CAAA,CAAIF,CAAAA,CAErB,GADc,QAAA,CAASE,CAAAA,CAAK,EAAE,EAAI,QAAA,CAASD,CAAAA,CAAK,EAAE,CAAA,CACtC,GAAA,CACV,OAAO,CAAE,IAAA,CAAM,MAAO,MAAA,CAAQ,CAAA,kBAAA,EAAqBA,CAAG,CAAA,CAAA,EAAIC,CAAG,GAAI,CAErE,CAEA,OAAO,CAAE,IAAA,CAAM,IAAK,CACtB,CAOA,SAASC,EAAqBC,CAAAA,CAAmD,CAE/E,IAAMC,CAAAA,CAAoB,CAExB,IAAI,MAAA,CAAO,EAAE,CAAA,CAAI,GAAA,CAEjB,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA,CAAI,GAAA,CAElB,IAAI,MAAA,CAAO,GAAG,EAEd,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,CAAI,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,CAAI,GACxC,EAEMC,CAAAA,CAAmB,CAAA,CAEzB,QAAWxL,CAAAA,IAASuL,CAAAA,CAAmB,CACrC,IAAMte,CAAAA,CAAQ,KAAK,GAAA,EAAI,CACvB,GAAI,CACFqe,CAAAA,CAAM,KAAKtL,CAAK,CAAA,CAChB,IAAMyL,CAAAA,CAAW,IAAA,CAAK,GAAA,GAAQxe,CAAAA,CAE9B,GAAIwe,EAAWD,CAAAA,CACb,OAAO,CACL,IAAA,CAAM,CAAA,CAAA,CACN,MAAA,CAAQ,CAAA,sBAAA,EAAyBA,CAAgB,CAAA,SAAA,EAAYC,CAAQ,CAAA,mBAAA,EAAsBzL,CAAAA,CAAM,MAAM,CAAA,CAAA,CACzG,CAEJ,OAAStH,CAAAA,CAAK,CACZ,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,OAAQ,CAAA,0BAAA,EAA6BA,CAAG,EAAG,CACnE,CACF,CAEA,OAAO,CAAE,KAAM,IAAK,CACtB,CAQA,SAASgT,CAAAA,CAAiBjF,EAAiBkF,CAAAA,CAAY,GAAA,CAAoB,CAGzE,GAAI,CAEF,GAAI,CAAClF,CAAAA,CACH,OAAI+C,IACF,OAAA,CAAQ,IAAA,CAAK,4CAA4C,CAAA,CAEpD,IAAA,CAGT,GAAI/C,CAAAA,CAAQ,MAAA,CAASkF,CAAAA,CACnB,OAAInC,EAAAA,EACF,OAAA,CAAQ,KAAK,CAAA,oCAAA,EAAuC/C,CAAAA,CAAQ,MAAM,CAAA,aAAA,EAAgBkF,CAAS,eAAelF,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAK,EAElI,IAAA,CAIT,IAAMmF,EAAiBZ,CAAAA,CAAiBvE,CAAO,EAC/C,GAAI,CAACmF,EAAe,IAAA,CAClB,OAAIpC,IACF,OAAA,CAAQ,IAAA,CAAK,wDAAwDoC,CAAAA,CAAe,MAAM,gBAAgBnF,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAK,EAElI,IAAA,CAIT,IAAI6E,EACJ,GAAI,CACFA,EAAQ,IAAI,MAAA,CAAO7E,CAAO,EAC5B,CAAA,MAASoF,CAAAA,CAAY,CACnB,OAAIrC,EAAAA,EACF,QAAQ,IAAA,CAAK,CAAA,2DAAA,EAA8D/C,EAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAA,CAAOoF,CAAU,EAE/G,IACT,CAGA,IAAMC,CAAAA,CAAcT,CAAAA,CAAqBC,CAAK,CAAA,CAC9C,OAAKQ,EAAY,IAAA,CAOVR,CAAAA,EAND9B,IACF,OAAA,CAAQ,IAAA,CAAK,qDAAqDsC,CAAAA,CAAY,MAAM,gBAAgBrF,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAK,EAE5H,IAAA,CAIX,CAAA,MAAS/N,EAAK,CACZ,OAAI8Q,IACF,OAAA,CAAQ,IAAA,CAAK,CAAA,yDAAA,EAA4D/C,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAA,CAAO/N,CAAG,CAAA,CAEtG,IACT,CACF,CAMO,SAASqT,CAAAA,CACdC,CAAAA,CAAwB,EAAC,CACzB,CACA,IAAMC,CAAAA,CAAcrgB,GAClB,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAAIA,CAAAA,CAAM,OAAQ6F,EAAAA,EAAyB,OAAOA,IAAS,QAAQ,CAAA,CAAI,EAAC,CAGvFuO,CAAAA,CAAQgM,GAAS,EAAC,CAElBE,CAAAA,CAAW,CACf,QAAA,CAAUD,CAAAA,CAAWjM,EAAM,QAAQ,CAAA,CACnC,KAAMiM,CAAAA,CAAWjM,CAAAA,CAAM,IAAI,CAAA,CAC3B,QAAA,CAAUiM,CAAAA,CAAWjM,CAAAA,CAAM,KAAK,CAClC,EAEAgK,CAAAA,CAAO,YAAA,CAAekC,EAAS,QAAA,CAC/BlC,CAAAA,CAAO,SAAWkC,CAAAA,CAAS,IAAA,CAC3BlC,CAAAA,CAAO,YAAA,CAAekC,CAAAA,CAAS,QAAA,CAG/BlC,EAAO,cAAA,CAAiBkC,CAAAA,CAAS,KAC9B,GAAA,CAAKzF,CAAAA,EAAYiF,EAAiBjF,CAAO,CAAC,EAC1C,MAAA,CAAQnY,CAAAA,EAAmBA,IAAM,IAAI,CAAA,CAIxC0b,EAAO,kBAAA,CAAqB,GAE5B,IAAMmC,CAAAA,CAAmBD,CAAAA,CAAS,IAAA,CAAK,MAAA,CAASlC,CAAAA,CAAO,eAAe,MAAA,CAMlE,CAACA,EAAO,gBAAA,EAAoBR,EAAAA,GAC9B,QAAQ,GAAA,CAAI,kCAAkC,CAAA,CAC9C,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB0C,EAAS,QAAA,CAAS,MAAM,EAAE,CAAA,CACvD,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqBlC,CAAAA,CAAO,cAAA,CAAe,MAAM,CAAA,CAAA,EAAIkC,CAAAA,CAAS,KAAK,MAAM,CAAA,WAAA,EAAcC,CAAgB,CAAA,UAAA,CAAY,CAAA,CAC/H,QAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsBD,EAAS,QAAA,CAAS,MAAM,gCAAgC,CAAA,CAEtFC,CAAAA,CAAmB,GACrB,OAAA,CAAQ,IAAA,CAAK,SAASA,CAAgB,CAAA,8FAAA,CAAgG,CAAA,CAAA,CAI1InC,CAAAA,CAAO,gBAAA,CAAmB,KAC5B,CA9COE,CAAAA,CAAS,YAAA,CAAA6B,KA5TD7B,CAAAA,GAAAA,CAAAA,CAAA,EAAA,CAAA,CAAA,CCpIV,SAASkC,EAAAA,EAAkB,CAChC,OAAO,IAAIrC,YAAY,CACrB,cAAA,CAAgB,CACd,OAAA,CAAS,CAIP,oBAAA,CAAsB,MACtB,cAAA,CAAgB,KAClB,CACF,CACF,CAAC,CACH,CACO,IAAMsC,EAAiB,IAAMrC,CAAAA,CAAO,YAE1BsC,GAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CAAgBC,CAAAA,CAAoB,CAElD,OADoBH,CAAAA,EAAe,CAChB,YAAA,CAAgBG,CAAQ,CAC7C,CAHOF,CAAAA,CAAS,YAAA,CAAAC,EAKT,SAASE,CAAAA,CAAwBD,EAAoB,CAE1D,OADoBH,CAAAA,EAAe,CAChB,YAAA,CAA8BG,CAAQ,CAC3D,CAHOF,CAAAA,CAAS,qBAAAG,CAAAA,CAKhB,eAAsBC,EAAiBtO,CAAAA,CAA6B,CAElE,OAAA,MADoBiO,CAAAA,EAAe,CACjB,aAAA,CAAcjO,CAAO,CAAA,CAChCmO,CAAAA,CAAgBnO,EAAQ,QAAQ,CACzC,CAJAkO,CAAAA,CAAsB,aAAA,CAAAI,EAMtB,eAAsBC,CAAAA,CACpBvO,EAOA,CAEA,OAAA,MADoBiO,GAAe,CACjB,qBAAA,CAAsBjO,CAAO,CAAA,CACxCqO,CAAAA,CAAwBrO,CAAAA,CAAQ,QAAQ,CACjD,CAZAkO,EAAsB,qBAAA,CAAAK,CAAAA,CAcf,SAASC,CAAAA,CAA6BxO,CAAAA,CAA6B,CACxE,OAAO,CACL,QAAA,CAAU,IAAMsO,CAAAA,CAActO,CAAO,EACrC,OAAA,CAAS,IAAMmO,EAAgBnO,CAAAA,CAAQ,QAAQ,EAC/C,cAAA,CAAgB,IAAMyO,QAAAA,CAASzO,CAAO,CAAA,CACtC,WAAA,CAAa,IAAMiO,CAAAA,EAAe,CAAE,WAAWjO,CAAO,CACxD,CACF,CAPOkO,CAAAA,CAAS,0BAAAM,CAAAA,CAST,SAASE,EACd1O,CAAAA,CAOA,CACA,OAAO,CACL,QAAA,CAAU,IAAMuO,CAAAA,CAAsBvO,CAAO,CAAA,CAC7C,OAAA,CAAS,IAAMqO,CAAAA,CAAwBrO,EAAQ,QAAQ,CAAA,CACvD,eAAgB,IAAM2O,gBAAAA,CAAiB3O,CAAO,CAAA,CAC9C,WAAA,CAAa,IAAMiO,CAAAA,EAAe,CAAE,kBAAA,CAAmBjO,CAAO,CAChE,CACF,CAfOkO,CAAAA,CAAS,iCAAA,CAAAQ,KAxCDR,EAAAA,GAAAA,EAAAA,CAAA,EAAA,CAAA,CAAA,CC/BV,SAASU,EAAAA,CAAUzJ,CAAAA,CAAgB,CACxC,OAAO,IAAA,CAAK,KAAK,SAAA,CAAUA,CAAC,CAAC,CAC/B,CAEO,SAAS0J,EAAAA,CAAU1J,CAAAA,CAAa,CACrC,IAAI2J,CAAAA,CAAc,KAAK3J,CAAC,CAAA,CACxB,GAAI2J,CAAAA,CAAY,CAAC,CAAA,GAAM,IAGvB,OAAO,IAAA,CAAK,MAAMA,CAAW,CAC/B,CCRO,IAAKC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,IAAM,KAAA,CACNA,CAAAA,CAAA,MAAQ,OAAA,CAHEA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IAMAC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,aAAA,CAAA,CAAgB,MAAA,CAChBA,CAAAA,CAAA,aAAA,CAAA,CAAgB,MAChBA,CAAAA,CAAA,aAAA,CAAA,CAAgB,QAHNA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EAWL,SAASC,CAAAA,CAAWC,CAAAA,CAAgC,CACzD,GAAI,OAAOA,GAAS,QAAA,CAAU,CAC5B,IAAMC,CAAAA,CAAKD,CAAAA,CAAK,MAAM,GAAG,CAAA,CACzB,OAAO,CACL,MAAA,CAAQ,UAAA,CAAWC,EAAG,CAAC,CAAC,EAExB,MAAA,CAAQJ,EAAAA,CAAOI,EAAG,CAAC,CAAC,CACtB,CACF,CAAA,KACE,OAAO,CACL,MAAA,CAAQ,UAAA,CAAWD,EAAK,MAAA,CAAO,QAAA,EAAU,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAIA,CAAAA,CAAK,SAAS,EAExE,MAAA,CAAQF,EAAAA,CAAOE,EAAK,GAAG,CACzB,CAEJ,CClCA,IAAIE,GAEG,SAASC,CAAAA,EAAgB,CAC9B,GAAI,CAACD,GAAa,CAChB,GAAI,OAAO,UAAA,CAAW,KAAA,EAAU,UAAA,CAC9B,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAGjEA,EAAAA,CAAc,WAAW,KAAA,CAAM,IAAA,CAAK,UAAU,EAChD,CAEA,OAAOA,EACT,CCZO,SAASE,GAAY9hB,CAAAA,CAAgB,CAC1C,OAAO,OAAOA,CAAAA,EAAU,SAAW,YAAA,CAAa,IAAA,CAAKA,CAAK,CAAA,CAAI,KAChE,CCGO,SAAS+hB,EAAAA,CAAqB3Q,CAAAA,CAA+C,CAClF,OACEA,CAAAA,EACA,OAAOA,CAAAA,EAAa,QAAA,EACpB,SAAUA,CAAAA,EACV,YAAA,GAAgBA,GAChB,KAAA,CAAM,OAAA,CAAQA,EAAS,IAAI,CAE/B,CAMO,SAAS4Q,EAAAA,CACd5Q,CAAAA,CACArQ,CAAAA,CACoB,CACpB,OAAIghB,GAAqB3Q,CAAQ,CAAA,CACxBA,EAKF,CACL,IAAA,CAAM,MAAM,OAAA,CAAQA,CAAQ,CAAA,CAAIA,CAAAA,CAAW,EAAC,CAC5C,WAAY,CACV,KAAA,CAAO,MAAM,OAAA,CAAQA,CAAQ,EAAIA,CAAAA,CAAS,MAAA,CAAS,CAAA,CACnD,KAAA,CAAArQ,CAAAA,CACA,MAAA,CAAQ,EACR,QAAA,CAAU,KACZ,CACF,CACF,CCtCO,SAASkhB,EAAAA,CAAUpI,CAAAA,CAAeqI,EAA+B,CACtE,OAAQrI,EAAQ,GAAA,CAAOqI,CACzB,CCFO,SAASC,EAAAA,CAAYzjB,EAAgC,CAC1D,OAAIA,CAAAA,GAAM,MAAA,CACD,IAAA,CAGF,QAAA,CAASA,EAAE,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAG,EAAE,CAAA,CAAI,IACzC,CCEA,IAAM0jB,EAAAA,CAA2B,EAAA,CAAK,IAE/B,SAASC,EAAAA,EAA8B,CAC5C,OAAOC,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,IAAA,CAAK,YAAA,EAAa,CACtC,eAAA,CAAiBH,GACjB,SAAA,CAAWA,EAAAA,CACX,QAAS,MAAO,CAAE,OAAAnU,CAAO,CAAA,GAA6B,CAGpD,GAAM,CAACuU,EAAkBC,CAAAA,CAAgBC,CAAAA,CAAeC,EAAeC,CAAgB,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAC3G/S,CAAAA,CAAQ,6CAAA,CAA+C,GAAI,MAAA,CAAW,MAAA,CAAW5B,CAAM,CAAA,CACvF4B,CAAAA,CAAQ,iCAAkC,EAAC,CAAG,MAAA,CAAW,MAAA,CAAW5B,CAAM,CAAA,CAC1E4B,EAAQ,oCAAA,CAAsC,GAAI,MAAA,CAAW,MAAA,CAAW5B,CAAM,CAAA,CAC9E4B,CAAAA,CAAQ,+BAAA,CAAiC,CAAC,MAAM,CAAA,CAAG,OAAW,MAAA,CAAW5B,CAAM,EAC/E4B,CAAAA,CAAQ,sCAAA,CAAwC,EAAC,CAAG,MAAA,CAAW,OAAW5B,CAAM,CAAA,CAC7E,MAAM,KAAO,CAAE,yBAA0B,QAAA,CAAU,aAAA,CAAe,EAAG,CAAA,CAAE,CAC5E,CAAC,CAAA,CAIK4U,CAAAA,CAA2BpB,CAAAA,CAAWe,EAAiB,oBAAoB,CAAA,CAAE,OAC7EM,CAAAA,CAAyBrB,CAAAA,CAAWe,EAAiB,uBAAuB,CAAA,CAAE,MAAA,CAGhFN,CAAAA,CAAgB,CAAA,CAElB,MAAA,CAAO,SAASW,CAAwB,CAAA,EACxCA,IAA6B,CAAA,EAC7B,MAAA,CAAO,SAASC,CAAsB,CAAA,GAEtCZ,CAAAA,CAAiBY,CAAAA,CAAyBD,CAAAA,CAA4B,GAAA,CAAA,CAExE,IAAME,CAAAA,CAAOtB,CAAAA,CAAWgB,EAAe,sBAAA,CAAuB,IAAI,EAAE,MAAA,CAC9DO,CAAAA,CAAQvB,EAAWgB,CAAAA,CAAe,sBAAA,CAAuB,KAAK,CAAA,CAAE,MAAA,CAChEQ,EAAmB,UAAA,CAAWN,CAAAA,CAAc,aAAa,CAAA,CACzDO,CAAAA,CAAoBzB,CAAAA,CAAWkB,CAAAA,CAAc,cAAc,CAAA,CAAE,OAC7DQ,CAAAA,CAAuB,MAAA,CAAOX,EAAiB,uBAAA,EAA2B,CAAC,EAC3EY,CAAAA,CAAoBT,CAAAA,CAAc,mBAAA,EAAuB,QAAA,CACzDU,CAAAA,CAAkB,MAAA,CAAOV,EAAc,gBAAA,EAAoB,CAAC,EAC5DW,CAAAA,CAAyB,MAAA,CAAOV,EAAiB,wBAAA,EAA4B,OAAO,CAAA,CACpFW,CAAAA,CAAe,MAAA,CAAOX,CAAAA,CAAiB,eAAiB,CAAC,CAAA,CACzDY,EAAehB,CAAAA,CAAiB,cAAA,CAChCiB,EAAkBjB,CAAAA,CAAiB,iBAAA,CACnCkB,EAAYlB,CAAAA,CAAiB,iBAAA,CAC7BmB,EAAmBb,CAAAA,CACnBc,CAAAA,CAAqBf,EACrBgB,CAAAA,CAAgBpC,CAAAA,CAAWe,EAAiB,cAAc,CAAA,CAAE,MAAA,CAC5DsB,EAAAA,CAAuBtB,CAAAA,CAAiB,sBAAA,EAA0B,EAClEuB,EAAAA,CAAqBrB,CAAAA,CAAc,qBAEzC,OAAO,CAEL,cAAAR,CAAAA,CACA,IAAA,CAAAa,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,EACA,iBAAA,CAAAC,CAAAA,CACA,qBAAAC,CAAAA,CACA,iBAAA,CAAAC,EACA,eAAA,CAAAC,CAAAA,CACA,sBAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,aAAAC,CAAAA,CACA,eAAA,CAAAC,EACA,SAAA,CAAAC,CAAAA,CACA,iBAAAC,CAAAA,CACA,kBAAA,CAAAC,EACA,aAAA,CAAAC,CAAAA,CACA,qBAAAC,EAAAA,CACA,kBAAA,CAAAC,GAIA,GAAA,CAAK,CACH,cAAevB,CAAAA,CACf,WAAA,CAAaC,CAAAA,CACb,UAAA,CAAYC,CAAAA,CACZ,UAAA,CAAYC,EACZ,aAAA,CAAeC,CACjB,CACF,CACF,CACF,CAAC,CACH,CCvEO,SAASoB,EAAAA,CAA0BC,CAAAA,CAAW,OAAQ,CAC3D,OAAO3B,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,IAAA,CAAK,UAAA,CAAW0B,CAAQ,EAC5C,OAAA,CAAS,IACPpU,EAAQ,+BAAA,CAAiC,CACvCoU,CACF,CAAC,CACL,CAAC,CACH,CCVA,SAASrgB,EAAAA,CAAAA,GAAOmF,CAAAA,CAA6B,CAC3C,IAAI1I,CAAAA,CAAM0I,EAAM,MAAA,CAChB,KAAO1I,CAAAA,CAAM,CAAA,EAAK0I,CAAAA,CAAM1I,CAAAA,CAAM,CAAC,CAAA,GAAM,MAAA,EACnCA,IAEF,OAAO0I,CAAAA,CAAM,MAAM,CAAA,CAAG1I,CAAG,CAC3B,CAEO,IAAMkiB,CAAAA,CAAY,CAIvB,KAAA,CAAO,CACL,MAAQ2B,CAAAA,EAAsB,CAAC,QAAS,OAAA,CAASA,CAAS,CAAA,CAC1D,UAAA,CAAY,CAACC,CAAAA,CAAgBC,IAC3B,CAAC,OAAA,CAAS,cAAeD,CAAAA,CAAQC,CAAQ,EAC3C,OAAA,CAAS,CAACD,EAAgBC,CAAAA,GACxB,CAAC,QAAS,SAAA,CAAWD,CAAAA,CAAQC,CAAQ,CAAA,CACvC,cAAA,CAAgB,CAACD,CAAAA,CAAgBC,CAAAA,GAC/B,CAAC,OAAA,CAAS,iBAAA,CAAmBD,CAAAA,CAAQC,CAAQ,CAAA,CAC/C,YAAA,CAAc,CACZxQ,CAAAA,CACAyQ,CAAAA,CACAtjB,EACA+d,CAAAA,GACG,CAAC,OAAA,CAAS,eAAA,CAAiBlL,CAAAA,CAAUyQ,CAAAA,CAAQtjB,EAAO+d,CAAQ,CAAA,CACjE,iBAAkB,CAChBlL,CAAAA,CACAyQ,EACAC,CAAAA,CACAC,CAAAA,CACAxjB,CAAAA,CACA+d,CAAAA,GAEA,CACE,OAAA,CACA,qBACAlL,CAAAA,CACAyQ,CAAAA,CACAC,EACAC,CAAAA,CACAxjB,CAAAA,CACA+d,CACF,CAAA,CACF,YAAA,CAAc,CAAClL,CAAAA,CAAkBuQ,CAAAA,CAAgBC,IAC/C,CAAC,OAAA,CAAS,YAAaxQ,CAAAA,CAAUuQ,CAAAA,CAAQC,CAAQ,CAAA,CACnD,OAAA,CAAS,CAACxQ,CAAAA,CAAkB7S,CAAAA,GAC1B,CAAC,QAAS,SAAA,CAAW6S,CAAAA,CAAU7S,CAAK,CAAA,CACtC,gBAAA,CAAkB,CAACojB,CAAAA,CAAiBC,CAAAA,GAClC,CAAC,OAAA,CAAS,oBAAA,CAAsBD,CAAAA,CAAQC,CAAQ,CAAA,CAClD,WAAA,CAAa,CAACD,CAAAA,CAAgBC,CAAAA,GAC5B,CAAC,OAAA,CAAS,cAAA,CAAgBD,CAAAA,CAAQC,CAAQ,CAAA,CAC5C,IAAA,CAAM,CAACD,CAAAA,CAAgBC,CAAAA,GACrB,CAAC,OAAA,CAAS,MAAA,CAAQD,EAAQC,CAAQ,CAAA,CACpC,UAAW,CAACD,CAAAA,CAAgBC,IAC1B,CAAC,OAAA,CAAS,YAAaD,CAAAA,CAAQC,CAAQ,EACzC,MAAA,CAASI,CAAAA,EACP,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAc,EACpC,cAAA,CAAgB,CAACA,EAAyBzjB,CAAAA,GACxC6C,EAAAA,CAAI,QAAS,QAAA,CAAU,UAAA,CAAY4gB,CAAAA,CAAgBzjB,CAAK,CAAA,CAC1D,SAAA,CAAYyjB,GACV,CAAC,OAAA,CAAS,YAAaA,CAAc,CAAA,CACvC,kBAAmB,CAACA,CAAAA,CAAyBzjB,CAAAA,GAC3C6C,EAAAA,CAAI,OAAA,CAAS,WAAA,CAAa,WAAY4gB,CAAAA,CAAgBzjB,CAAK,EAC7D,SAAA,CAAY6S,CAAAA,EACV,CAAC,OAAA,CAAS,WAAA,CAAaA,CAAQ,CAAA,CACjC,iBAAA,CAAmB,CAACA,CAAAA,CAAmB7S,CAAAA,GACrC6C,GAAI,OAAA,CAAS,WAAA,CAAa,WAAYgQ,CAAAA,CAAU7S,CAAK,CAAA,CACvD,MAAA,CAAS6S,CAAAA,EAAsB,CAAC,QAAS,QAAA,CAAUA,CAAQ,EAC3D,aAAA,CAAgB4Q,CAAAA,EACd,CAAC,OAAA,CAAS,gBAAA,CAAkBA,CAAc,CAAA,CAC5C,cAAA,CAAgB,CAAC5Q,EAAmB7S,CAAAA,GAClC6C,EAAAA,CAAI,QAAS,QAAA,CAAU,UAAA,CAAYgQ,EAAU7S,CAAK,CAAA,CACpD,QAAA,CAAW6X,CAAAA,EAAiB,CAAC,OAAA,CAAS,WAAYA,CAAI,CAAA,CACtD,gBAAiB,CAAC,OAAA,CAAS,UAAU,CAAA,CACrC,sBAAA,CAAyBhF,GACvB,CAAC,OAAA,CAAS,gBAAiBA,CAAAA,CAAU,MAAM,EAC7C,WAAA,CAAa,CACX6Q,EACAvP,CAAAA,CACAnU,CAAAA,CACA+d,CAAAA,GACG,CAAC,OAAA,CAAS,cAAA,CAAgB2F,EAAMvP,CAAAA,CAAKnU,CAAAA,CAAO+d,CAAQ,CAAA,CACzD,eAAA,CAAiB,CACf2F,CAAAA,CACAH,CAAAA,CACAC,CAAAA,CACAxjB,CAAAA,CACAmU,CAAAA,CACA4J,CAAAA,GAEA,CACE,OAAA,CACA,mBAAA,CACA2F,EACAH,CAAAA,CACAC,CAAAA,CACAxjB,EACAmU,CAAAA,CACA4J,CACF,CAAA,CACF,WAAA,CAAa,CACXqF,CAAAA,CACAC,EACAM,CAAAA,CACA5F,CAAAA,GACG,CAAC,OAAA,CAAS,aAAA,CAAeqF,EAAQC,CAAAA,CAAUM,CAAAA,CAAO5F,CAAQ,CAAA,CAC/D,UAAA,CAAY,CAACqF,CAAAA,CAAgBC,CAAAA,CAAkBtF,IAC7C,CAAC,OAAA,CAAS,aAAcqF,CAAAA,CAAQC,CAAAA,CAAUtF,CAAQ,CAAA,CACpD,YAAA,CAAeoF,CAAAA,EACb,CAAC,OAAA,CAAS,eAAA,CAAiBA,CAAS,CAAA,CACtC,cAAA,CAAgB,CACdC,CAAAA,CACAC,CAAAA,CACAO,CAAAA,GACG,CAAC,OAAA,CAAS,iBAAA,CAAmBR,EAAQC,CAAAA,CAAUO,CAAQ,EAC5D,YAAA,CAAc,IAAM,CAAC,OAAA,CAAS,eAAe,CAAA,CAC7C,qBAAA,CAAwB5jB,CAAAA,EACtB,CAAC,QAAS,eAAA,CAAiB,OAAA,CAASA,CAAK,CAAA,CAC3C,SAAA,CAAW,CACT2M,CAAAA,CAOI,KACD,CACH,OAAA,CACA,QACA,MAAA,CACAA,CAAAA,CAAO,KAAO,EAAA,CACdA,CAAAA,CAAO,WAAa,EAAA,CACpBA,CAAAA,CAAO,MAAA,EAAU,EAAA,CACjBA,CAAAA,CAAO,QAAA,EAAY,GACnBA,CAAAA,CAAO,KAAA,EAAS,EAChB,CAAC,GAAIA,EAAO,UAAA,EAAc,EAAG,CAAA,CAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAChD,EACA,UAAA,CAAY,CACVA,EAMI,EAAC,GACF,CACH,OAAA,CACA,OAAA,CACA,QAAA,CACAA,EAAO,GAAA,EAAO,EAAA,CACdA,EAAO,MAAA,EAAU,EAAA,CACjBA,EAAO,QAAA,EAAY,EAAA,CACnBA,EAAO,KAAA,EAAS,CAAA,CAChB,CAAC,GAAIA,CAAAA,CAAO,YAAc,EAAG,EAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAChD,CAAA,CACA,YAAcgR,CAAAA,EACZ,CAAC,QAAS,OAAA,CAAS,SAAA,CAAWA,CAAI,CAAA,CACpC,UAAA,CAAY,CAACA,CAAAA,CAAcxJ,CAAAA,GACzB,CAAC,QAAS,OAAA,CAAS,QAAA,CAAUwJ,EAAMxJ,CAAG,CAAA,CACxC,eAAgB,CAACwJ,CAAAA,CAAc9K,CAAAA,GAC7B,CAAC,OAAA,CAAS,OAAA,CAAS,YAAa8K,CAAAA,CAAM9K,CAAQ,EAChD,iBAAA,CAAmB,CAAC8K,EAAckG,CAAAA,GAChC,CAAC,QAAS,OAAA,CAAS,eAAA,CAAiBlG,EAAMkG,CAAK,CAAA,CACjD,eAAgB,CAAClG,CAAAA,CAAc9K,IAC7B,CAAC,OAAA,CAAS,OAAA,CAAS,YAAA,CAAc8K,CAAAA,CAAM9K,CAAQ,EACjD,oBAAA,CAAuB8K,CAAAA,EACrB,CAAC,OAAA,CAAS,OAAA,CAAS,mBAAoBA,CAAI,CAAA,CAC7C,OAAA,CAAS,CAAC,OAAO,CACnB,EAKA,QAAA,CAAU,CACR,KAAO9K,CAAAA,EAAsB,CAAC,mBAAoBA,CAAQ,CAAA,CAC1D,IAAA,CAAM,CAAA,GAAIiR,CAAAA,GACR,CAAC,WAAY,MAAA,CAAQ,GAAGA,CAAS,CAAA,CACnC,OAAA,CAAS,CACPC,CAAAA,CACAC,CAAAA,CACAC,EACAjkB,CAAAA,GACG,CAAC,WAAY,SAAA,CAAW+jB,CAAAA,CAAWC,EAAMC,CAAAA,CAAYjkB,CAAK,EAC/D,aAAA,CAAe,CAAC6S,CAAAA,CAAkBmR,CAAAA,CAAcE,CAAAA,GAC9C,CAAC,WAAY,SAAA,CAAW,QAAA,CAAUrR,EAAUmR,CAAAA,CAAME,CAAK,EACzD,aAAA,CAAgBrR,CAAAA,EACd,CAAC,UAAA,CAAY,eAAA,CAAiBA,CAAQ,EACxC,WAAA,CAAcA,CAAAA,EACZ,CAAC,UAAA,CAAY,cAAA,CAAgBA,CAAQ,CAAA,CACvC,UAAA,CAAaA,CAAAA,EACX,CAAC,UAAA,CAAY,YAAA,CAAcA,CAAQ,CAAA,CACrC,eAAA,CAAkBA,GAChB,CAAC,UAAA,CAAY,aAAcA,CAAAA,CAAU,iBAAiB,EACxD,kBAAA,CAAoB,CAACA,EAAkBxK,CAAAA,GACrC,CAAC,WAAY,sBAAA,CAAwBwK,CAAAA,CAAUxK,CAAI,CAAA,CACrD,UAAA,CAAawK,CAAAA,EACX,CAAC,UAAA,CAAY,aAAA,CAAeA,CAAQ,CAAA,CACtC,SAAA,CAAW,CACTsR,CAAAA,CACAC,CAAAA,CACAH,EACAjkB,CAAAA,GAEA,CACE,UAAA,CACA,WAAA,CACAmkB,CAAAA,CACAC,CAAAA,CACAH,EACAjkB,CACF,CAAA,CACF,UAAW,CACT+jB,CAAAA,CACAM,EACAJ,CAAAA,CACAjkB,CAAAA,GAEA,CACE,UAAA,CACA,WAAA,CACA+jB,CAAAA,CACAM,EACAJ,CAAAA,CACAjkB,CACF,EACF,MAAA,CAAQ,CAACkkB,EAAeI,CAAAA,GACtB,CAAC,WAAY,QAAA,CAAUJ,CAAAA,CAAOI,CAAW,CAAA,CAC3C,QAAA,CAAU,CAACC,CAAAA,CAAoBxG,CAAAA,GAC7B,CAAC,UAAA,CAAY,UAAA,CAAYwG,CAAAA,CAAUxG,CAAQ,CAAA,CAC7C,MAAA,CAAQ,CAACmG,CAAAA,CAAelkB,CAAAA,GACtB,CAAC,UAAA,CAAY,QAAA,CAAUkkB,EAAOlkB,CAAK,CAAA,CACrC,YAAA,CAAc,CAAC6S,CAAAA,CAAkBxB,CAAAA,CAAerR,IAC9C,CAAC,UAAA,CAAY,eAAgB6S,CAAAA,CAAUxB,CAAAA,CAAOrR,CAAK,CAAA,CACrD,SAAA,CAAYyjB,CAAAA,EACV,CAAC,UAAA,CAAY,WAAA,CAAaA,CAAc,CAAA,CAC1C,iBAAA,CAAmB,CAACA,CAAAA,CAAyBzjB,CAAAA,GAC3C6C,GAAI,UAAA,CAAY,WAAA,CAAa,WAAY4gB,CAAAA,CAAgBzjB,CAAK,EAChE,aAAA,CAAe,CAACyjB,EAAwBe,CAAAA,GACtC,CACE,WACA,WAAA,CACA,OAAA,CACAf,CAAAA,CACAe,CACF,CAAA,CACF,SAAA,CAAW,CAACC,CAAAA,CAA+BllB,CAAAA,GACzC,CAAC,UAAA,CAAY,WAAA,CAAaklB,EAAWllB,CAAM,CAAA,CAC7C,IAAA,CAAM,IAAM,CAAC,UAAA,CAAY,MAAM,CAAA,CAC/B,WAAA,CAAa,CAACsT,CAAAA,CAAkB7S,CAAAA,GAC9B,CAAC,UAAA,CAAY,cAAA,CAAgB6S,CAAAA,CAAU7S,CAAK,CAAA,CAC9C,WAAA,CAAa,CAACkkB,CAAAA,CAAelkB,CAAAA,GAC3B,CAAC,UAAA,CAAY,aAAA,CAAekkB,EAAOlkB,CAAK,CAAA,CAC1C,UAAYyjB,CAAAA,EACV,CAAC,WAAY,WAAA,CAAaA,CAAc,EAC1C,iBAAA,CAAmB,CAACA,EAAyBzjB,CAAAA,GAC3C6C,EAAAA,CAAI,UAAA,CAAY,WAAA,CAAa,UAAA,CAAY4gB,CAAAA,CAAgBzjB,CAAK,CAAA,CAChE,SAAA,CAAY6S,GACV,CAAC,UAAA,CAAY,YAAaA,CAAQ,CAAA,CACpC,cAAA,CAAiBA,CAAAA,EACf,CAAC,UAAA,CAAY,kBAAmBA,CAAQ,CAAA,CAC1C,WAAY,IAAM,CAAC,WAAY,aAAa,CAAA,CAC5C,OAAA,CAAS,CAAC,UAAU,CACtB,EAKA,aAAA,CAAe,CACb,cAAe,IAAM,CAAC,gBAAiB,eAAe,CAAA,CACtD,WAAY,IAAM,CAAC,gBAAiB,YAAY,CAAA,CAChD,KAAM,CAAC4Q,CAAAA,CAAyBH,IAC9B,CAAC,eAAA,CAAiBG,CAAAA,CAAgBH,CAAM,CAAA,CAC1C,WAAA,CAAcG,GACZ,CAAC,eAAA,CAAiB,SAAUA,CAAc,CAAA,CAC5C,SAAWA,CAAAA,EACT,CAAC,eAAA,CAAiB,UAAA,CAAYA,CAAc,CAAA,CAC9C,QAAS,CAAC,eAAe,CAC3B,CAAA,CAKA,IAAA,CAAM,CACJ,UAAA,CAAaP,CAAAA,EACX,CAAC,MAAA,CAAQ,aAAA,CAAeA,CAAQ,EAClC,YAAA,CAAc,IAAM,CAAC,MAAA,CAAQ,eAAe,EAC5C,eAAA,CAAiB,IAAM,CAAC,MAAA,CAAQ,kBAAkB,EAClD,OAAA,CAAS,CAAC,MAAM,CAClB,CAAA,CAKA,YAAa,CACX,MAAA,CAAQ,CAACwB,CAAAA,CAAe3G,CAAAA,GACtB,CAAC,YAAa,QAAA,CAAU2G,CAAAA,CAAM3G,CAAQ,CAAA,CAExC,YAAA,CAAe2G,GACb,CAAC,WAAA,CAAa,QAAA,CAAUA,CAAI,CAAA,CAC9B,OAAA,CAAS,CAAC7R,CAAAA,CAAkB8R,CAAAA,GAC1B,CAAC,WAAA,CAAa,SAAA,CAAW9R,EAAU8R,CAAa,CAAA,CAClD,QAAA,CAAU,IAAM,CAAC,aAAA,CAAe,UAAU,CAAA,CAC1C,IAAA,CAAM,CAACjB,CAAAA,CAAcQ,CAAAA,CAAelkB,IAClC,CAAC,aAAA,CAAe,OAAQ0jB,CAAAA,CAAMQ,CAAAA,CAAOlkB,CAAK,CAAA,CAC5C,WAAA,CAAc2kB,GACZ,CAAC,aAAA,CAAe,cAAeA,CAAa,CAAA,CAC9C,mBAAA,CAAsBA,CAAAA,EACpB,CAAC,aAAA,CAAe,cAAe,UAAA,CAAYA,CAAa,EAC1D,oBAAA,CAAsB,CAAC9L,EAAiB7Y,CAAAA,GACtC,CAAC,aAAA,CAAe,uBAAA,CAAyB6Y,CAAAA,CAAS7Y,CAAK,CAC3D,CAAA,CAKA,SAAA,CAAW,CACT,IAAA,CAAM,IAAM,CAAC,WAAA,CAAa,MAAM,CAAA,CAChC,QAAA,CAAW6E,CAAAA,EAAe,CAAC,YAAa,UAAA,CAAYA,CAAE,EACtD,KAAA,CAAO,CAAC+f,EAAoBC,CAAAA,CAAe7kB,CAAAA,GACzC,CAAC,WAAA,CAAa,OAAA,CAAS4kB,EAAYC,CAAAA,CAAO7kB,CAAK,EACjD,WAAA,CAAc4kB,CAAAA,EACZ,CAAC,WAAA,CAAa,OAAA,CAASA,CAAU,CAAA,CACnC,WAAA,CAAcC,CAAAA,EACZ,CAAC,WAAA,CAAa,OAAA,CAAS,UAAWA,CAAK,CAC3C,EAKA,MAAA,CAAQ,CACN,MAAA,CAAQ,CAACC,CAAAA,CAAW9kB,CAAAA,GAAkB,CAAC,QAAA,CAAU,QAAA,CAAU8kB,EAAG9kB,CAAK,CAAA,CACnE,KAAO8kB,CAAAA,EAAc,CAAC,QAAA,CAAU,MAAA,CAAQA,CAAC,CAAA,CACzC,QAAS,CAACA,CAAAA,CAAW9kB,IACnB,CAAC,QAAA,CAAU,UAAW8kB,CAAAA,CAAG9kB,CAAK,EAChC,OAAA,CAAS,CACP8kB,EACApB,CAAAA,CACAqB,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,GAGO,CAAC,QAAA,CAAUJ,CAAAA,CAAGpB,CAAAA,CADK,OAAOqB,CAAAA,EAAY,QAAA,CAAWA,IAAY,GAAA,EAAOA,CAAAA,GAAY,OAASA,CAAAA,CAClDC,CAAAA,CAAOC,EAAUC,CAAK,CAAA,CAEtE,mBAAA,CAAqB,CAACC,CAAAA,CAAchR,CAAAA,GAClC,CAAC,QAAA,CAAU,sBAAA,CAAwBgR,EAAMhR,CAAG,CAAA,CAC9C,eAAgB,CAACiP,CAAAA,CAAgBC,CAAAA,CAAkB+B,CAAAA,GACjDA,CAAAA,CACI,CAAC,SAAU,iBAAA,CAAmBhC,CAAAA,CAAQC,EAAU+B,CAAO,CAAA,CACvD,CAAC,QAAA,CAAU,iBAAA,CAAmBhC,EAAQC,CAAQ,CAAA,CACpD,IAAK,CACHyB,CAAAA,CACApB,EACAqB,CAAAA,CACAC,CAAAA,CACAE,EACAG,CAAAA,GACGxiB,EAAAA,CAAI,QAAA,CAAU,KAAA,CAAOiiB,CAAAA,CAAGpB,CAAAA,CAAMqB,EAASC,CAAAA,CAAOE,CAAAA,CAAOG,CAAW,CACvE,CAAA,CAKA,UAAW,CACT,IAAA,CAAOrlB,CAAAA,EAAkB,CAAC,WAAA,CAAa,MAAA,CAAQA,CAAK,CAAA,CACpD,KAAA,CAAQ6S,GAAiC,CAAC,WAAA,CAAa,QAASA,CAAQ,CAAA,CACxE,KAAA,CAAO,IAAM,CAAC,WAAA,CAAa,OAAO,CAAA,CAClC,MAAA,CAAQ,CACNyS,CAAAA,CACAC,CAAAA,CACAC,EACA9B,CAAAA,CACA+B,CAAAA,GACG,CAAC,WAAA,CAAa,QAAA,CAAUH,EAASC,CAAAA,CAAMC,CAAAA,CAAU9B,EAAM+B,CAAS,CAAA,CACrE,WAAaH,CAAAA,EACX,CAAC,WAAA,CAAa,aAAA,CAAeA,CAAO,CACxC,EAKA,MAAA,CAAQ,CACN,sBAAuB,CAACzS,CAAAA,CAAkB7S,IACxC,CAAC,QAAA,CAAU,yBAAA,CAA2B6S,CAAAA,CAAU7S,CAAK,CAAA,CACvD,mBAAoB,CAAC6S,CAAAA,CAAkB7S,IACrC,CAAC,QAAA,CAAU,sBAAuB6S,CAAAA,CAAU7S,CAAK,CAAA,CACnD,cAAA,CAAiB6Y,CAAAA,EACf,CAAC,SAAU,iBAAA,CAAmBA,CAAO,EACvC,UAAA,CAAahG,CAAAA,EACX,CAAC,QAAA,CAAU,aAAA,CAAeA,CAAQ,CAAA,CACpC,kBAAA,CAAqBgG,GACnB,CAAC,QAAA,CAAU,sBAAuBA,CAAO,CAAA,CAC3C,sBAAwBhG,CAAAA,EACtB,CAAC,QAAA,CAAU,yBAAA,CAA2BA,CAAQ,CAAA,CAChD,gBAAkBgG,CAAAA,EAChB,CAAC,SAAU,kBAAA,CAAoBA,CAAO,EACxC,UAAA,CAAa6M,CAAAA,EACX,CAAC,QAAA,CAAU,aAAA,CAAeA,CAAI,EAChC,gCAAA,CAAmC7M,CAAAA,EACjC,CAAC,QAAA,CAAU,oCAAA,CAAsCA,CAAO,CAAA,CAC1D,kBAAA,CAAqBhG,CAAAA,EACnB,CAAC,QAAA,CAAU,qBAAA,CAAuBA,CAAQ,CAAA,CAC5C,cAAA,CAAgB,CAACA,CAAAA,CAAkB8S,CAAAA,CAAkBH,IACnD,CAAC,QAAA,CAAU,kBAAmB3S,CAAAA,CAAU8S,CAAAA,CAAUH,CAAQ,CAAA,CAC5D,iBAAA,CAAmB,CACjB3S,CAAAA,CACA8S,CAAAA,CACAC,IAEAA,CAAAA,GAAgB,MAAA,CACZ,CAAC,QAAA,CAAU,oBAAA,CAAsB/S,CAAAA,CAAU8S,CAAQ,CAAA,CACnD,CAAC,SAAU,oBAAA,CAAsB9S,CAAAA,CAAU8S,EAAUC,CAAW,CAAA,CACtE,SAAA,CAAW,CACT/S,CAAAA,CACAgT,CAAAA,CACAC,IAEA,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMjT,CAAAA,CAAUgT,EAAaC,CAAQ,CACjE,CAAA,CAKA,MAAA,CAAQ,CACN,eAAA,CAAkBjT,GAChB,CAAC,QAAA,CAAU,OAAQ,cAAA,CAAgBA,CAAQ,EAC7C,gBAAA,CAAkB,CAACA,EAAkB7S,CAAAA,CAAe+lB,CAAAA,GAClD,CAAC,QAAA,CAAU,MAAA,CAAQ,eAAgBlT,CAAAA,CAAU7S,CAAAA,CAAO+lB,CAAS,CAAA,CAC/D,oBAAA,CAAuBlT,CAAAA,EACrB,CAAC,QAAA,CAAU,MAAA,CAAQ,oBAAqBA,CAAQ,CAAA,CAClD,YAAcmT,CAAAA,EACZ,CAAC,SAAU,MAAA,CAAQ,SAAA,CAAWA,CAAa,CAAA,CAC7C,cAAA,CAAiBnT,CAAAA,EACf,CAAC,QAAA,CAAU,KAAA,CAAO,eAAgBA,CAAQ,CAAA,CAC5C,gBAAiB,CACfA,CAAAA,CACA7S,CAAAA,CACA+lB,CAAAA,GACG,CAAC,QAAA,CAAU,MAAO,cAAA,CAAgBlT,CAAAA,CAAU7S,EAAO+lB,CAAS,CAAA,CACjE,qBAAuBlT,CAAAA,EACrB,CAAC,SAAU,YAAA,CAAc,cAAA,CAAgBA,CAAQ,CAAA,CACnD,kBAAA,CAAqBA,GACnB,CAAC,QAAA,CAAU,aAAc,WAAA,CAAaA,CAAQ,CAAA,CAChD,oBAAA,CAAuBA,CAAAA,EACrB,CAAC,SAAU,YAAA,CAAc,aAAA,CAAeA,CAAQ,CAAA,CAClD,qBAAA,CAAuB,CACrBA,CAAAA,CACA7S,CAAAA,CACA+lB,CAAAA,GAEA,CACE,QAAA,CACA,YAAA,CACA,eACAlT,CAAAA,CACA7S,CAAAA,CACA+lB,CACF,CAAA,CACF,iBAAA,CAAoBlT,GAClB,CAAC,QAAA,CAAU,QAAA,CAAU,cAAA,CAAgBA,CAAQ,CAAA,CAC/C,mBAAoB,CAACA,CAAAA,CAAkBgF,IACrC,CAAC,QAAA,CAAU,SAAU,cAAA,CAAgBhF,CAAAA,CAAUgF,CAAI,CAAA,CACrD,eAAA,CAAiB,CAAChF,CAAAA,CAAkB7N,CAAAA,CAAe8gB,IACjD,CAAC,gBAAA,CAAkB,aAAcjT,CAAAA,CAAU7N,CAAAA,CAAO8gB,CAAQ,CAC9D,CAAA,CAKA,MAAA,CAAQ,CACN,UAAA,CAAY,IAAM,CAAC,QAAA,CAAU,YAAY,EACzC,SAAA,CAAY9lB,CAAAA,EAAkB,CAAC,QAAA,CAAU,YAAA,CAAcA,CAAK,EAC5D,OAAA,CAAS,CAACimB,EAAiBC,CAAAA,CAAmBC,CAAAA,GAC5C,CAAC,QAAA,CAAU,SAAA,CAAWF,CAAAA,CAASC,CAAAA,CAAWC,CAAO,CAAA,CACnD,YAAa,IAAM,CAAC,SAAU,cAAc,CAAA,CAC5C,aAAc,IAAM,CAAC,SAAU,gBAAgB,CAAA,CAC/C,KAAM,CACJC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,GACG,CAAC,QAAA,CAAU,MAAA,CAAQH,CAAAA,CAAMC,CAAAA,CAAYC,CAAAA,CAAQC,CAAI,EACtD,YAAA,CAAc,CAACvmB,EAAeM,CAAAA,CAAehB,CAAAA,GAC3C,CAAC,QAAA,CAAU,eAAA,CAAiBU,CAAAA,CAAOM,CAAAA,CAAOhB,CAAG,CAAA,CAC/C,0BAA2B,IACzB,CAAC,SAAU,8BAA8B,CAC7C,EAKA,SAAA,CAAW,CACT,gBAAA,CAAmBwf,CAAAA,EACjB,CAAC,WAAA,CAAa,oBAAqBA,CAAQ,CAAA,CAC7C,UAAW,CACTpS,CAAAA,CACA8Z,EACAC,CAAAA,CACAC,CAAAA,GAEA,CAAC,WAAA,CAAa,YAAA,CAAcha,EAAK8Z,CAAAA,CAAYC,CAAAA,CAASC,CAAS,CAAA,CACjE,mBAAA,CAAsB5H,GACpB,CAAC,WAAA,CAAa,sBAAA,CAAwBA,CAAQ,CAClD,CAAA,CAKA,WAAY,CACV,YAAA,CAAc,IAAM,CAAC,YAAA,CAAc,eAAe,CAAA,CAClD,eAAA,CAAiB,IAAM,CAAC,YAAA,CAAc,mBAAmB,EACzD,iBAAA,CAAoBjG,CAAAA,EAClB,CAAC,YAAA,CAAc,qBAAA,CAAuBA,CAAO,CACjD,CAAA,CAKA,eAAA,CAAiB,CACf,OAAA,CAAUhG,CAAAA,EACR,CAAC,kBAAA,CAAoB,SAAA,CAAWA,CAAQ,CAAA,CAC1C,KAAA,CAAO,IAAM,CAAC,kBAAA,CAAoB,OAAO,CAC3C,CAAA,CAKA,OAAQ,CACN,MAAA,CAAQ,CAACA,CAAAA,CAAkByQ,CAAAA,GACzB,CAAC,QAAA,CAAUzQ,CAAAA,CAAUyQ,CAAM,CAAA,CAC7B,OAAA,CAAUzQ,CAAAA,EAAqB,CAAC,QAAA,CAAUA,CAAQ,CACpD,CAAA,CAKA,KAAA,CAAO,CACL,OAAA,CAAS,CAACuQ,CAAAA,CAAgBC,CAAAA,GACxB,CAAC,OAAA,CAAS,UAAWD,CAAAA,CAAQC,CAAQ,EACvC,IAAA,CAAM,CAACD,EAAiBC,CAAAA,GACtBD,CAAAA,EAAUC,CAAAA,CACN,CAAC,OAAA,CAAS,MAAA,CAAQD,EAAQC,CAAQ,CAAA,CAClC,CAAC,OAAA,CAAS,MAAM,EACtB,OAAA,CAAS,CAAC,OAAO,CACnB,CAAA,CAKA,WAAY,CACV,eAAA,CAAiB,IAAM,CAAC,YAAA,CAAc,kBAAkB,CAC1D,CAAA,CAKA,KAAA,CAAO,CACL,WAAA,CAAa,CAACsD,EAAkB9T,CAAAA,GAC9B,CAAC,QAAS,cAAA,CAAgB8T,CAAAA,CAAU9T,CAAQ,CAChD,CAAA,CAEA,MAAA,CAAQ,CACN,MAAA,CAASA,CAAAA,EAAiC,CAAC,QAAA,CAAU,QAAA,CAAUA,CAAQ,CACzE,CAAA,CAKA,QAAS,CACP,QAAA,CAAWA,CAAAA,EAAiC,CAAC,SAAA,CAAW,UAAA,CAAYA,CAAQ,CAAA,CAC5E,OAAA,CAAS,CAAC,SAAS,CACrB,EAKA,SAAA,CAAW,CACT,KAAM,IAAM,CAAC,aAAc,MAAM,CAAA,CACjC,QAAS,CAAC,YAAY,CACxB,CAAA,CAKA,EAAA,CAAI,CACF,MAAA,CAAQ,IAAM,CAAC,KAAM,QAAQ,CAAA,CAC7B,aAAeA,CAAAA,EAAsB,CAAC,KAAM,eAAA,CAAiBA,CAAQ,CAAA,CACrE,eAAA,CAAkBA,CAAAA,EAAsB,CAAC,KAAM,kBAAA,CAAoBA,CAAQ,EAC3E,OAAA,CAAS,CAAC,IAAI,CAChB,CACF,EChmBO,SAAS+T,EAAAA,CAA+B1K,CAAAA,CAAqB,CAClE,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,GAAG,MAAA,EAAO,CAC9B,QAAS,SAAY,CAEnB,IAAMnR,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,gCAAA,CAAkC,CACxF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG5E,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAAA,CACA,SAAA,CAAW,IACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCtBO,SAAS2K,EAAAA,CAA6BhU,CAAAA,CAA8BqJ,CAAAA,CAAqB,CAC9F,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,GAAG,YAAA,CAAa3O,CAAQ,EAC5C,OAAA,CAAS,SAAY,CAEnB,IAAMxC,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,8BAAA,CAAgC,CACtF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,EAED,GAAI,CAAC7L,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqCA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGxE,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAAA,CACA,UAAW,GAAA,CACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCbO,SAAS4K,EAAAA,CACdjU,CAAAA,CACAqJ,EACA,CACA,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,GAAG,eAAA,CAAgB3O,CAAQ,EAC/C,OAAA,CAAS,SAAY,CAEnB,IAAMxC,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,kCAAA,CAAoC,CAC1F,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwCA,EAAS,MAAM,CAAA,CAAE,EAG3E,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAAA,CACA,UAAW,GAAA,CACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCxBA,SAAS6K,EAAAA,EAA6B,CACpC,GAAI,OAAO,OAAW,GAAA,EAAe,OAAO,MAAA,CAAO,UAAA,EAAe,UAAA,CAChE,OAAO,OAAO,UAAA,EAAW,CAE3B,IAAMtW,CAAAA,CAAM,IAAI,WAAW,EAAE,CAAA,CAC7B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,eAAA,EAAoB,WACrE,MAAA,CAAO,eAAA,CAAgBA,CAAG,CAAA,CAAA,KAE1B,IAAA,IAAS5S,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI4S,CAAAA,CAAI,OAAQ5S,CAAAA,EAAAA,CAAK4S,CAAAA,CAAI5S,CAAC,CAAA,CAAI,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAW,GAAG,CAAA,CAE9E,OAAO,KAAA,CAAM,IAAA,CAAK4S,CAAG,CAAA,CAClB,GAAA,CAAKxS,GAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CACZ,CAEO,SAAS+oB,EAAAA,CACdnU,CAAAA,CACAqJ,CAAAA,CACA,CACA,OAAOH,YAAY,CACjB,WAAA,CAAa,CAAC,IAAA,CAAM,gBAAgB,EACpC,UAAA,CAAY,MAAOpP,CAAAA,EAA+D,CAChF,GAAI,CAACkG,EACH,MAAM,IAAI,MACR,0DACF,CAAA,CAGF,GAAI,CAACqJ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,2DACF,CAAA,CAIF,IAAM7L,EAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,gCAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,IAAA,CAAMnB,CAAAA,CACN,EAAA,CAAIrJ,CAAAA,CACJ,OAAQlG,CAAAA,CAAO,MAAA,CACf,aAAcA,CAAAA,CAAO,YAAA,EAAgB,MACrC,KAAA,CAAOA,CAAAA,CAAO,KAAA,EAAS,CAAA,CACvB,eAAA,CAAiBA,CAAAA,CAAO,iBAAmBoa,EAAAA,EAC7C,CAAC,CACH,CACF,EAEA,GAAI,CAAC1W,EAAS,EAAA,CAAI,CAChB,IAAMtD,CAAAA,CAAO,MAAMsD,EAAS,IAAA,EAAK,CAC7B2J,EAAkC,EAAC,CACvC,GAAI,CACFA,CAAAA,CAAS,IAAA,CAAK,MAAMjN,CAAI,EAC1B,MAAQ,CAER,CAEA,IAAMhB,CAAAA,CAAM,IAAI,KAAA,CACd,CAAA,mDAAA,EAAiDsE,CAAAA,CAAS,MAAM,GAAGtD,CAAAA,CAAO,CAAA,EAAA,EAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,EAC5F,CAAA,CACA,MAAChB,CAAAA,CAAY,MAAA,CAASsE,CAAAA,CAAS,MAAA,CAC9BtE,EAAY,IAAA,CAAOiO,CAAAA,CACdjO,CACR,CAMA,GAAIsE,EAAS,MAAA,GAAW,GAAA,CAAK,CAC3B,IAAI4W,CAAAA,CAAuC,EAAC,CAC5C,GAAI,CACFA,CAAAA,CAAc,MAAM5W,EAAS,IAAA,GAC/B,CAAA,KAAQ,CAER,CACA,IAAMtE,EAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CACnE,MAACA,EAAY,MAAA,CAAS,GAAA,CACrBA,CAAAA,CAAY,IAAA,CAAOkb,CAAAA,CACdlb,CACR,CAIA,OAFc,MAAMsE,EAAS,IAAA,EAG/B,EACA,SAAA,CAAW,IAAM,CAEXwC,CAAAA,EACF6M,CAAAA,EAAe,CAAE,kBAAkB,CACjC,QAAA,CAAU8B,EAAU,MAAA,CAAO,OAAA,CAAQ3O,CAAQ,CAC7C,CAAC,EAEL,CACF,CAAC,CACH,CCrGA,SAASkU,EAAAA,EAA6B,CACpC,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,UAAA,EAAe,WAChE,OAAO,MAAA,CAAO,YAAW,CAE3B,IAAMtW,CAAAA,CAAM,IAAI,UAAA,CAAW,EAAE,EAC7B,GAAI,OAAO,OAAW,GAAA,EAAe,OAAO,OAAO,eAAA,EAAoB,UAAA,CACrE,MAAA,CAAO,eAAA,CAAgBA,CAAG,CAAA,CAAA,aAEjB5S,CAAAA,CAAI,CAAA,CAAGA,EAAI4S,CAAAA,CAAI,MAAA,CAAQ5S,IAAK4S,CAAAA,CAAI5S,CAAC,EAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,CAAI,GAAG,CAAA,CAE9E,OAAO,MAAM,IAAA,CAAK4S,CAAG,CAAA,CAClB,GAAA,CAAKxS,CAAAA,EAAMA,CAAAA,CAAE,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CACZ,CAEO,SAASipB,GACdrU,CAAAA,CACAqJ,CAAAA,CACA,CACA,OAAOH,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,IAAA,CAAM,QAAQ,CAAA,CAC5B,UAAA,CAAY,MAAOpP,CAAAA,EAAsD,CACvE,GAAI,CAACkG,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,mDACF,CAAA,CAGF,GAAI,CAACqJ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,oDACF,EAIF,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,eAAiB,wBAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAM1Q,CAAAA,CAAO,MAAQuP,CAAAA,CACrB,EAAA,CAAIrJ,EACJ,MAAA,CAAQlG,CAAAA,CAAO,MAAA,CACf,IAAA,CAAMA,CAAAA,CAAO,IAAA,CACb,gBAAiBoa,EAAAA,EACnB,CAAC,CACH,CACF,EAEA,GAAI,CAAC1W,EAAS,EAAA,CAAI,CAChB,IAAMtD,CAAAA,CAAO,MAAMsD,EAAS,IAAA,EAAK,CAC7B2J,EAAkC,EAAC,CACvC,GAAI,CACFA,CAAAA,CAAS,IAAA,CAAK,MAAMjN,CAAI,EAC1B,MAAQ,CAER,CAEA,IAAMhB,CAAAA,CAAM,IAAI,KAAA,CACd,CAAA,4CAAA,EAA0CsE,CAAAA,CAAS,MAAM,GAAGtD,CAAAA,CAAO,CAAA,EAAA,EAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,EACrF,CAAA,CACA,MAAChB,CAAAA,CAAY,MAAA,CAASsE,CAAAA,CAAS,MAAA,CAC9BtE,EAAY,IAAA,CAAOiO,CAAAA,CACdjO,CACR,CAEA,OAAQ,MAAMsE,CAAAA,CAAS,IAAA,EACzB,CAAA,CACA,SAAA,CAAYpO,GAAS,CACf4Q,CAAAA,GAEE5Q,EAAK,IAAA,CAAO,CAAA,EACdyd,GAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,MAAA,CAAO,QAAQ3O,CAAQ,CAC7C,CAAC,CAAA,CAGH6M,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,EAAA,CAAG,YAAA,CAAa3O,CAAQ,CAC9C,CAAC,GAEL,CACF,CAAC,CACH,CC5FA,SAASkU,IAA6B,CACpC,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,UAAA,EAAe,WAChE,OAAO,MAAA,CAAO,YAAW,CAE3B,IAAMtW,EAAM,IAAI,UAAA,CAAW,EAAE,CAAA,CAC7B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,OAAO,eAAA,EAAoB,UAAA,CACrE,OAAO,eAAA,CAAgBA,CAAG,OAE1B,IAAA,IAAS5S,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI4S,CAAAA,CAAI,MAAA,CAAQ5S,IAAK4S,CAAAA,CAAI5S,CAAC,EAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,CAAI,GAAG,CAAA,CAE9E,OAAO,KAAA,CAAM,KAAK4S,CAAG,CAAA,CAClB,IAAKxS,CAAAA,EAAMA,CAAAA,CAAE,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CACZ,CASO,SAASkpB,EAAAA,CAAgBtU,CAAAA,CAA8BqJ,CAAAA,CAAiC,CAC7F,OAAOH,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,KAAM,YAAY,CAAA,CAChC,WAAY,MAAOpP,CAAAA,EAA8D,CAC/E,GAAI,CAACkG,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,uDAAkD,CAAA,CAMpE,IAAMxK,EAAOsE,CAAAA,CAAO,IAAA,EAAQuP,CAAAA,CAC5B,GAAI,CAAC7T,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wDAAmD,CAAA,CAGrE,IAAM+e,EAAO,IAAI,QAAA,CACjBA,EAAK,MAAA,CAAO,MAAA,CAAQ/e,CAAI,CAAA,CAGxB+e,CAAAA,CAAK,OAAO,aAAA,CAAe,MAAA,CAAO,KAAK,KAAA,CAAMza,CAAAA,CAAO,UAAU,CAAC,CAAC,CAAA,CAKhEya,EAAK,MAAA,CAAO,iBAAA,CAAmBza,EAAO,eAAA,EAAmBoa,EAAAA,EAAoB,CAAA,CAC7EK,CAAAA,CAAK,MAAA,CAAO,OAAA,CAASza,CAAAA,CAAO,KAAA,CAAOA,EAAO,QAAA,EAAY,WAAW,EAKjE,IAAM0D,CAAAA,CAAW,MAHAyQ,CAAAA,EAAc,CAGCzD,CAAAA,CAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,OAAQ,MAAA,CACR,IAAA,CAAM+J,CACR,CAAC,CAAA,CAED,GAAI,CAAC/W,CAAAA,CAAS,GAAI,CAChB,IAAMtD,EAAO,MAAMsD,CAAAA,CAAS,MAAK,CAC7B2J,CAAAA,CAAkC,EAAC,CACvC,GAAI,CACFA,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMjN,CAAI,EAC1B,CAAA,KAAQ,CAER,CAKA,MAAM,OAAO,MAAA,CACX,IAAI,KAAA,CACF,CAAA,gDAAA,EAA8CsD,CAAAA,CAAS,MAAM,GAAGtD,CAAAA,CAAO,CAAA,EAAA,EAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,EACzF,CAAA,CACA,CAAE,MAAA,CAAQsD,CAAAA,CAAS,MAAA,CAAQ,IAAA,CAAM2J,CAAO,CAC1C,CACF,CAEA,OAAQ,MAAM3J,EAAS,IAAA,EACzB,EACA,SAAA,CAAYpO,CAAAA,EAAS,CACf4Q,CAAAA,GACE5Q,CAAAA,CAAK,KAAO,CAAA,EACdyd,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,MAAA,CAAO,OAAA,CAAQ3O,CAAQ,CAC7C,CAAC,EAGH6M,CAAAA,EAAe,CAAE,kBAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,EAAA,CAAG,eAAA,CAAgB3O,CAAQ,CACjD,CAAC,CAAA,EAEL,CACF,CAAC,CACH,CC5EA,SAASwU,EAAAA,CAAmBxO,EAA8B,CACxD,OAAO,CAACA,CAAAA,CAAQ,qBAAA,EAAyB,CAACA,CAAAA,CAAQ,aACpD,CAKA,SAASyO,EAAAA,CAAiBC,EAAmD,CAC3E,OAAKA,CAAAA,CACE,MAAA,CAAO,MAAA,CAAOA,CAAO,EAAE,IAAA,CAAMtoB,CAAAA,EAClC,OAAOA,CAAAA,EAAU,QAAA,CAAWA,EAAM,MAAA,CAAS,CAAA,CAAIA,CAAAA,EAAS,IAC1D,CAAA,CAHqB,KAIvB,CAEO,SAASuoB,CAAAA,CAA2B3U,EAA8B,CACvE,OAAO0O,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAC1C,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA3F,CAAO,IAAM,CAC7B,GAAI,CAAC2F,CAAAA,CACH,OAAO,KAUT,GAAM,CAACxC,EAAUoX,CAAa,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAClD3Y,CAAAA,CACE,4BAAA,CACA,CAAC,CAAC+D,CAAQ,CAAC,EACX,MAAA,CACA,MAAA,CACA3F,EAKCwa,CAAAA,EAAS,KAAA,CAAM,OAAA,CAAQA,CAAI,CAC9B,CAAA,CACA5Y,EACE,oBAAA,CACA,CAAE,QAAS+D,CAAS,CAAA,CACpB,OACA,MAAA,CACA3F,CACF,CAAA,CAAE,KAAA,CAAOvB,CAAAA,EAA4B,CAGnC,GAAIuB,CAAAA,EAAQ,OAAA,CAAS,MAAMvB,CAAAA,CAC3B,OAAO,IACT,CAAC,CACH,CAAC,CAAA,CACD,GAAI,CAAC0E,CAAAA,GAAW,CAAC,EAKf,OAAO,IAAA,CAGT,IAAIsX,CAAAA,CAAetX,CAAAA,CAAS,CAAC,CAAA,CAW7B,GACEgX,EAAAA,CAAmBM,CAAY,CAAA,EAC/BL,EAAAA,CAAiBG,GAAe,QAAA,EAAU,OAAO,EACjD,CAKA,IAAMG,CAAAA,CAAS,MAAM9Y,CAAAA,CACnB,4BAAA,CACA,CAAC,CAAC+D,CAAQ,CAAC,CAAA,CACX,MAAA,CACA,OACA3F,CAAAA,CACCwa,CAAAA,EACC,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,GACjB,CAACA,CAAAA,CAAK,CAAC,GAAK,CAACL,EAAAA,CAAmBK,EAAK,CAAC,CAAe,EAC1D,CAAA,CACA,GAAIE,EAAO,CAAC,CAAA,EAAK,CAACP,EAAAA,CAAmBO,CAAAA,CAAO,CAAC,CAAC,CAAA,CAC5CD,CAAAA,CAAeC,CAAAA,CAAO,CAAC,CAAA,CAAA,WAEjB,IAAI,KAAA,CACR,uDAAkD/U,CAAQ,CAAA,yDAAA,CAC5D,CAEJ,CAEA,IAAM0U,CAAAA,CAAUM,EAAAA,CAAqBF,CAAAA,CAAa,qBAAqB,EAMjEG,CAAAA,CAAQL,CAAAA,EAAe,MACvBM,CAAAA,CAA+CD,CAAAA,CACjD,CACE,OAAA,CAASH,CAAAA,CAAa,IAAA,CACtB,cAAA,CAAgBG,CAAAA,CAAM,SAAA,EAAa,EACnC,eAAA,CAAiBA,CAAAA,CAAM,WAAa,CACtC,CAAA,CACA,OACEE,CAAAA,CAA0BP,CAAAA,EAAe,YAAc,CAAA,CAE7D,OAAO,CACL,IAAA,CAAME,CAAAA,CAAa,KACnB,KAAA,CAAOA,CAAAA,CAAa,MACpB,MAAA,CAAQA,CAAAA,CAAa,MAAA,CACrB,OAAA,CAASA,CAAAA,CAAa,OAAA,CACtB,SAAUA,CAAAA,CAAa,QAAA,CACvB,WAAYA,CAAAA,CAAa,UAAA,CACzB,QAASA,CAAAA,CAAa,OAAA,CACtB,qBAAA,CAAuBA,CAAAA,CAAa,qBAAA,CACpC,cAAA,CAAgBA,EAAa,cAAA,CAC7B,SAAA,CAAWA,EAAa,SAAA,CACxB,aAAA,CAAeA,EAAa,aAAA,CAC5B,mBAAA,CAAqBA,CAAAA,CAAa,mBAAA,CAClC,kBAAA,CAAoBA,CAAAA,CAAa,mBACjC,mBAAA,CAAqBA,CAAAA,CAAa,oBAClC,sBAAA,CAAwBA,CAAAA,CAAa,uBACrC,OAAA,CAASA,CAAAA,CAAa,QACtB,WAAA,CAAaA,CAAAA,CAAa,YAC1B,eAAA,CAAiBA,CAAAA,CAAa,gBAC9B,mBAAA,CAAqBA,CAAAA,CAAa,oBAClC,iCAAA,CACEA,CAAAA,CAAa,iCAAA,CACf,+BAAA,CACEA,CAAAA,CAAa,+BAAA,CACf,oBAAqBA,CAAAA,CAAa,mBAAA,CAClC,wBAAyBA,CAAAA,CAAa,uBAAA,CACtC,yBAA0BA,CAAAA,CAAa,wBAAA,CACvC,cAAA,CAAgBA,CAAAA,CAAa,cAAA,CAC7B,wBAAA,CAA0BA,EAAa,wBAAA,CACvC,uBAAA,CAAyBA,EAAa,uBAAA,CACtC,qBAAA,CAAuBA,EAAa,qBAAA,CACpC,WAAA,CAAaA,CAAAA,CAAa,WAAA,CAC1B,SAAA,CAAWA,CAAAA,CAAa,UACxB,aAAA,CAAeA,CAAAA,CAAa,cAC5B,KAAA,CAAOA,CAAAA,CAAa,MACpB,gBAAA,CAAkBA,CAAAA,CAAa,iBAC/B,iBAAA,CAAmBA,CAAAA,CAAa,kBAChC,cAAA,CAAgBA,CAAAA,CAAa,eAC7B,YAAA,CAAcA,CAAAA,CAAa,aAC3B,gBAAA,CAAkBA,CAAAA,CAAa,gBAAA,CAC/B,YAAA,CAAAI,CAAAA,CACA,UAAA,CAAYC,EACZ,OAAA,CAAAT,CACF,CACF,CAAA,CACA,OAAA,CAAS,CAAC,CAAC1U,CAAAA,CACX,SAAA,CAAW,GACb,CAAC,CACH,CC1LA,IAAMoV,GAAc,IAAI,GAAA,CAAI,CAAC,WAAA,CAAa,aAAA,CAAe,WAAW,CAAC,CAAA,CAErE,SAASC,GAAcjpB,CAAAA,CAAkD,CACvE,GAAI,CAACA,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,MAAM,OAAA,CAAQA,CAAK,EAC5D,OAAO,MAAA,CAET,IAAMkpB,CAAAA,CAAQ,MAAA,CAAO,cAAA,CAAelpB,CAAK,CAAA,CACzC,OAAOkpB,IAAU,IAAA,EAAQA,CAAAA,GAAU,OAAO,SAC5C,CAEA,SAASC,EAAAA,CAA6C7oB,CAAAA,CAAWP,CAAAA,CAAoC,CACnG,IAAMb,CAAAA,CAAS,CAAE,GAAGoB,CAAO,EAC3B,IAAA,IAAWsD,CAAAA,IAAO,OAAO,IAAA,CAAK7D,CAAM,CAAA,CAAG,CACrC,GAAIipB,EAAAA,CAAY,IAAIplB,CAAG,CAAA,CACrB,SAEF,IAAMwlB,CAAAA,CAASrpB,EAAO6D,CAAG,CAAA,CACnBylB,EAASnqB,CAAAA,CAAO0E,CAAG,EACrBqlB,EAAAA,CAAcG,CAAM,GAAKH,EAAAA,CAAcI,CAAM,EAC/CnqB,CAAAA,CAAO0E,CAAG,CAAA,CAAIulB,EAAAA,CAAUE,CAAAA,CAAQD,CAAM,EAEtClqB,CAAAA,CAAO0E,CAAG,EAAIwlB,EAElB,CACA,OAAOlqB,CACT,CAQA,SAASoqB,EAAAA,CACPpd,CAAAA,CAC2B,CAE3B,GAAI,EAAA,CAACA,CAAAA,EAAU,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAM,CAAA,CAAA,CAIpC,OAAOA,CAAAA,CAAO,GAAA,CAAI,CAAC,CAAE,KAAAqd,CAAAA,CAAM,GAAGC,CAAK,CAAA,GAAM,CACvC,GAAI,CAACD,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC3B,OAAO,CAAE,GAAGC,EAAM,IAAA,CAAAD,CAAK,EAGzB,GAAM,CAAE,UAAA,CAAA/U,CAAAA,CAAY,QAAA,CAAAZ,CAAAA,CAAU,GAAG6V,CAAS,CAAA,CAAIF,EAC9C,OAAO,CAAE,GAAGC,CAAAA,CAAM,IAAA,CAAMC,CAAS,CACnC,CAAC,CACH,CAEO,SAASb,EAAAA,CACdc,EACgB,CAChB,GAAI,CAACA,CAAAA,CACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAM3O,CAAAA,CAAS,IAAA,CAAK,MAAM2O,CAAmB,CAAA,CAC7C,GACE3O,CAAAA,EACA,OAAOA,GAAW,QAAA,EAClBA,CAAAA,CAAO,SACP,OAAOA,CAAAA,CAAO,SAAY,QAAA,CAE1B,OAAOA,EAAO,OAElB,CAAA,MAASjO,CAAAA,CAAK,CACZ,OAAA,CAAQ,IAAA,CAAK,+CAAgDA,CAAAA,CAAK,CAAE,OAAQ4c,CAAAA,EAAqB,MAAA,EAAU,CAAE,CAAC,EAChH,CAEA,OAAO,EACT,CAEO,SAASC,EAAAA,CACd3mB,EACgB,CAChB,OAAO4lB,GAAqB5lB,CAAAA,EAAM,qBAAqB,CACzD,CAUO,SAAS4mB,EAAAA,CAGdC,EACAC,CAAAA,CACsB,CACtB,GAAI,CAACD,CAAAA,CAAW,OAAOC,CAAAA,CACvB,GAAI,CAACA,CAAAA,CAAU,OAAOD,EACtB,IAAME,CAAAA,CAAgB,OAAO,IAAA,CAC3BnB,EAAAA,CAAqBiB,EAAU,qBAAqB,CACtD,CAAA,CAAE,MAAA,CAIF,OAHqB,MAAA,CAAO,KAC1BjB,EAAAA,CAAqBkB,CAAAA,CAAS,qBAAqB,CACrD,CAAA,CAAE,OACoBC,CAAAA,CAAgBD,CAAAA,CAAWD,CACnD,CAWO,SAASG,EAAAA,CACdN,EACyB,CACzB,GAAI,CAACA,CAAAA,CACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAM3O,CAAAA,CAAS,IAAA,CAAK,MAAM2O,CAAmB,CAAA,CAC7C,GAAIT,EAAAA,CAAclO,CAAM,EACtB,OAAOA,CAEX,OAASjO,CAAAA,CAAK,CACZ,QAAQ,IAAA,CAAK,mDAAA,CAAqDA,EAAK,CACrE,MAAA,CAAQ4c,GAAqB,MAAA,EAAU,CACzC,CAAC,EACH,CAEA,OAAO,EACT,CASO,SAASO,EAAAA,CAAyB,CACvC,4BAAAC,CAAAA,CACA,OAAA,CAAA5B,CAAAA,CACA,MAAA,CAAApc,CACF,CAAA,CAIW,CACT,IAAMie,CAAAA,CAAOH,GAAyBE,CAA2B,CAAA,CAC3DE,EAAkBnB,EAAAA,CAAckB,CAAAA,CAAK,OAAO,CAAA,CAC7CA,CAAAA,CAAK,OAAA,CACL,EAAC,CAEAE,CAAAA,CAAgBC,GAAqB,CACzC,eAAA,CAAAF,EACA,OAAA,CAAA9B,CAAAA,CACA,OAAApc,CACF,CAAC,EAED,OAAO,IAAA,CAAK,UAAU,CAAE,GAAGie,EAAM,OAAA,CAASE,CAAc,CAAC,CAC3D,CAEO,SAASC,GAAqB,CACnC,eAAA,CAAAF,EACA,OAAA,CAAA9B,CAAAA,CACA,OAAApc,CACF,CAAA,CAA6C,CAC3C,GAAM,CAAE,MAAA,CAAQqe,EAAe,OAAA,CAASC,CAAAA,CAAiB,GAAGC,CAAY,CAAA,CACtEnC,GAAW,EAAC,CAERoC,CAAAA,CAAWvB,EAAAA,CACdiB,CAAAA,EAAmB,GACpBK,CACF,CAAA,CAGA,OAAIC,CAAAA,CAAS,MAAA,EAAU,CAAC,KAAA,CAAM,OAAA,CAAQA,EAAS,MAAM,CAAA,GACnDA,EAAS,MAAA,CAAS,MAAA,CAAA,CAOhBxe,IAAW,MAAA,CAEbwe,CAAAA,CAAS,OAASxe,CAAAA,EAAUA,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAS,GAChDqe,CAAAA,GAAkB,MAAA,GAE3BG,EAAS,MAAA,CAASH,CAAAA,CAAAA,CAGpBG,EAAS,MAAA,CAASpB,EAAAA,CAAeoB,CAAAA,CAAS,MAAM,CAAA,CAChDA,CAAAA,CAAS,QAAU,CAAA,CAEZA,CACT,CCrMO,SAASC,EAAAA,CAAcC,EAAmC,CAC/D,OAAOA,CAAAA,CAAY,GAAA,CAAKC,CAAAA,EAAM,CAC5B,IAAMjR,CAAAA,CAAuB,CAC3B,KAAMiR,CAAAA,CAAE,IAAA,CACR,MAAOA,CAAAA,CAAE,KAAA,CACT,OAAQA,CAAAA,CAAE,MAAA,CACV,QAASA,CAAAA,CAAE,OAAA,CACX,SAAUA,CAAAA,CAAE,QAAA,CACZ,WAAYA,CAAAA,CAAE,UAAA,CACd,OAAA,CAASA,CAAAA,CAAE,OAAA,CACX,UAAA,CAAYA,EAAE,UAAA,CACd,qBAAA,CAAuBA,EAAE,qBAAA,CACzB,cAAA,CAAgBA,EAAE,cAAA,CAClB,SAAA,CAAWA,CAAAA,CAAE,SAAA,CACb,aAAA,CAAeA,CAAAA,CAAE,cACjB,mBAAA,CAAqBA,CAAAA,CAAE,oBACvB,kBAAA,CAAoBA,CAAAA,CAAE,mBACtB,mBAAA,CAAqBA,CAAAA,CAAE,mBAAA,CACvB,sBAAA,CAAwBA,CAAAA,CAAE,sBAAA,CAC1B,QAASA,CAAAA,CAAE,OAAA,CACX,YAAaA,CAAAA,CAAE,WAAA,CACf,gBAAiBA,CAAAA,CAAE,eAAA,CACnB,oBAAqBA,CAAAA,CAAE,mBAAA,CACvB,kCAAmCA,CAAAA,CAAE,iCAAA,CACrC,gCAAiCA,CAAAA,CAAE,+BAAA,CACnC,oBAAqBA,CAAAA,CAAE,mBAAA,CACvB,uBAAA,CAAyBA,CAAAA,CAAE,uBAAA,CAC3B,wBAAA,CAA0BA,EAAE,wBAAA,CAC5B,cAAA,CAAgBA,EAAE,cAAA,CAClB,wBAAA,CAA0BA,EAAE,wBAAA,CAC5B,uBAAA,CAAyBA,CAAAA,CAAE,uBAAA,CAC3B,qBAAA,CAAuBA,CAAAA,CAAE,sBACzB,WAAA,CAAaA,CAAAA,CAAE,YACf,SAAA,CAAWA,CAAAA,CAAE,UACb,aAAA,CAAeA,CAAAA,CAAE,aAAA,CACjB,KAAA,CAAOA,CAAAA,CAAE,KAAA,CACT,iBAAkBA,CAAAA,CAAE,gBAAA,CACpB,kBAAmBA,CAAAA,CAAE,iBAAA,CACrB,eAAgBA,CAAAA,CAAE,cAAA,CAClB,aAAcA,CAAAA,CAAE,YAAA,CAChB,iBAAkBA,CAAAA,CAAE,gBACtB,EAGIvC,CAAAA,CAAsCM,EAAAA,CACxCiC,EAAE,qBACJ,CAAA,CAGA,GAAI,CAACvC,CAAAA,EAAW,MAAA,CAAO,KAAKA,CAAO,CAAA,CAAE,SAAW,CAAA,CAC9C,GAAI,CACF,IAAMwC,CAAAA,CAAe,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAE,aAAA,EAAiB,IAAI,CAAA,CACnDC,CAAAA,CAAa,UACfxC,CAAAA,CAAUwC,CAAAA,CAAa,SAE3B,CAAA,KAAY,CAEZ,CAIF,OAAA,CAAI,CAACxC,CAAAA,EAAW,OAAO,IAAA,CAAKA,CAAO,EAAE,MAAA,GAAW,CAAA,IAC9CA,EAAU,CACR,KAAA,CAAO,GACP,WAAA,CAAa,EAAA,CACb,SAAU,EAAA,CACV,IAAA,CAAM,GACN,aAAA,CAAe,EAAA,CACf,QAAS,EACX,CAAA,CAAA,CAGK,CAAE,GAAG1O,CAAAA,CAAS,OAAA,CAAA0O,CAAQ,CAC/B,CAAC,CACH,CC3EO,SAASyC,GAAwBlG,CAAAA,CAAqB,CAC3D,OAAOvC,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,IAAA,CAAK,GAAGsC,CAAS,CAAA,CAC9C,QAASA,CAAAA,CAAU,MAAA,CAAS,CAAA,CAC5B,OAAA,CAAS,SAAoC,CAK3C,IAAMzT,CAAAA,CAAY,MAAMvB,EACtB,4BAAA,CACA,CAACgV,CAAS,CAAA,CACV,MAAA,CACA,OACA,MAAA,CACC4D,CAAAA,EAAS,MAAM,OAAA,CAAQA,CAAI,CAC9B,CAAA,CACA,OAAOkC,GAAcvZ,CAAAA,EAAY,EAAE,CACrC,CACF,CAAC,CACH,CClBO,SAAS4Z,EAAAA,CAA2BpX,CAAAA,CAAkB,CAC3D,OAAO0O,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,YAAY3O,CAAQ,CAAA,CACjD,QAAS,IACP/D,CAAAA,CAAQ,gCAAA,CAAkC,CACxC+D,CACF,CAAC,CACL,CAAC,CACH,CCHO,SAASqX,GACdnG,CAAAA,CACAM,CAAAA,CACAJ,EAAa,MAAA,CACbjkB,CAAAA,CAAQ,IACR,CACA,OAAOuhB,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,SAAA,CAAUuC,CAAAA,CAAYM,EAAeJ,CAAAA,CAAYjkB,CAAK,EACnF,OAAA,CAAS,IACP8O,EAAQ,6BAAA,CAA+B,CACrCiV,CAAAA,CACAM,CAAAA,CACAJ,CAAAA,CACAjkB,CACF,CAAC,CAAA,CACH,OAAA,CAAS,CAAC,CAAC+jB,CACb,CAAC,CACH,CCjBO,SAASoG,EAAAA,CACdhG,CAAAA,CACAC,EACAH,CAAAA,CAAa,MAAA,CACbjkB,EAAQ,GAAA,CACR,CACA,OAAOuhB,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,UAAU2C,CAAAA,CAAUC,CAAAA,CAAgBH,EAAYjkB,CAAK,CAAA,CAClF,OAAA,CAAS,IACP8O,CAAAA,CAAQ,6BAAA,CAA+B,CACrCqV,CAAAA,CACAC,CAAAA,CACAH,EACAjkB,CACF,CAAC,EACH,OAAA,CAAS,CAAC,CAACmkB,CACb,CAAC,CACH,CCxBA,IAAMiG,GAAwB,GAAA,CAQxBC,EAAAA,CAAwB,EAAA,CAiBvB,SAASC,EAAAA,CAA0BzX,CAAAA,CAA8B,CACtE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,UAAA,CAAW3O,CAAS,EACjD,OAAA,CAAS,SAAY,CACnB,IAAM0X,CAAAA,CAAkB,EAAC,CACrBjqB,CAAAA,CAAQ,GAEZ,IAAA,IAASilB,CAAAA,CAAO,CAAA,CAAGA,CAAAA,CAAO8E,EAAAA,CAAuB9E,CAAAA,EAAAA,CAAQ,CACvD,IAAMlV,CAAAA,CAAY,MAAMvB,CAAAA,CAAQ,6BAAA,CAA+B,CAC7D+D,CAAAA,CACAvS,CAAAA,CACA,QAAA,CACA8pB,EACF,CAAC,CAAA,CAED,GAAI,CAAC/Z,CAAAA,EAAU,OACb,MAGF,IAAIma,EAAQna,CAAAA,CAAS,GAAA,CAAKqV,CAAAA,EAASA,CAAAA,CAAK,SAAS,CAAA,CAgBjD,GAVI8E,CAAAA,CAAM,CAAC,IAAMlqB,CAAAA,GACfkqB,CAAAA,CAAQA,EAAM,KAAA,CAAM,CAAC,GAGnB,CAACA,CAAAA,CAAM,SAIXD,CAAAA,CAAM,IAAA,CAAK,GAAGC,CAAK,CAAA,CAEfna,EAAS,MAAA,CAAS+Z,EAAAA,CAAAA,CACpB,MAGF9pB,CAAAA,CAAQkqB,CAAAA,CAAMA,CAAAA,CAAM,OAAS,CAAC,EAChC,CAEA,OAAOD,CACT,EACA,OAAA,CAAS,CAAC,CAAC1X,CACb,CAAC,CACH,CCnEO,SAAS4X,GAA2BvG,CAAAA,CAAelkB,CAAAA,CAAQ,EAAA,CAAI,CACpE,OAAOuhB,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,MAAA,CAAO0C,CAAAA,CAAOlkB,CAAK,CAAA,CAChD,OAAA,CAAS,IACP8O,CAAAA,CAAQ,+BAAA,CAAiC,CACvCoV,CAAAA,CACAlkB,CACF,CAAC,CAAA,CACH,OAAA,CAAS,CAAC,CAACkkB,CAAAA,CACX,SAAA,CAAW,CAAA,CAAA,CACb,CAAC,CACH,CCjBO,SAASwG,GACdxG,CAAAA,CACAlkB,CAAAA,CAAQ,CAAA,CACRskB,CAAAA,CAAwB,EAAC,CACzB,CACA,OAAO/C,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,MAAA,CAAO0C,CAAAA,CAAOI,CAAW,CAAA,CACtD,OAAA,CAAS,CAAC,CAACJ,CAAAA,CACX,OAAA,CAAS,UACW,MAAMpV,CAAAA,CAAQ,gCAAiC,CAACoV,CAAAA,CAAOlkB,CAAK,CAAC,CAAA,EAC/D,OAAQ8E,CAAAA,EACtBwf,CAAAA,CAAY,OAAS,CAAA,CAAI,CAACA,EAAY,QAAA,CAASxf,CAAI,CAAA,CAAI,IACzD,CAEJ,CAAC,CACH,CCEA,IAAM6lB,EAAAA,CAAqB,IAAI,GAAA,CAAI,CACjC,gBAAA,CACA,iBAAA,CACA,mBACA,eACF,CAAC,EAUM,SAASC,EAAAA,CACd/X,EACAxK,CAAAA,CACA,CACA,OAAOkZ,YAAAA,CAAkD,CACvD,QAAA,CAAUC,EAAU,QAAA,CAAS,kBAAA,CAAmB3O,EAAUxK,CAAAA,EAAQ,IAAI,EACtE,OAAA,CAAS,SAAY,CACnB,GAAI,CAACwK,GAAY,CAACxK,CAAAA,CAChB,OAAO,CAAE,KAAA,CAAO,KAAM,CAAA,CAIxB,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,sBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,QAAA,CAAAxK,EACA,IAAA,CAAAxK,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,GACZ,OAAO,CAAE,MAAO,KAAM,CAAA,CAGxB,IAAM2L,CAAAA,CAAW,MAAM3L,EAAS,IAAA,EAAK,CAE/Bwa,EAAqC,KAAA,CAAM,OAAA,CAAQ7O,CAAO,CAAA,CAC5DA,CAAAA,CAAQ,QAASlX,CAAAA,EAAS,CACxB,GAAI,CAACA,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC3B,OAAO,EAAC,CAGV,IAAMgmB,EAAahmB,CAAAA,CAEblB,CAAAA,CACJ,OAAOknB,CAAAA,CAAW,KAAA,EAAU,QAAA,CACxBA,EAAW,KAAA,CACX,MAAA,CAEN,GAAI,CAAClnB,CAAAA,CACH,OAAO,EAAC,CAGV,IAAM4kB,CAAAA,CACJsC,CAAAA,CAAW,IAAA,EAAQ,OAAOA,CAAAA,CAAW,IAAA,EAAS,SAC1C,CAAE,GAAIA,EAAW,IAAiC,CAAA,CAClD,EAAC,CAEDC,CAAAA,CAAyC,EAAC,CAE1CC,CAAAA,CACJ,OAAOF,CAAAA,CAAW,OAAA,EAAY,UAAYA,CAAAA,CAAW,OAAA,CACjDA,CAAAA,CAAW,OAAA,CACX,MAAA,CAOAG,CAAAA,CAAAA,CAJJ,OAAOH,CAAAA,CAAW,MAAA,EAAW,SACzBA,CAAAA,CAAW,MAAA,GAAW,EACtB,MAAA,GAEyB,KAAA,CAE3BE,CAAAA,GACFD,CAAAA,CAAc,OAAA,CAAUC,CAAAA,CAAAA,CAG1BD,EAAc,IAAA,CAAOE,CAAAA,CAErB,IAAMC,CAAAA,CAAgB,CACpB,OAAAtnB,CAAAA,CACA,QAAA,CAAUA,CAAAA,CACV,OAAA,CAAAonB,CAAAA,CACA,IAAA,CAAMC,EACN,IAAA,CAAM,OAAA,CACN,KAAMF,CACR,CAAA,CAEMI,EAAiD,EAAC,CAExD,OAAW,CAACC,CAAAA,CAAYC,CAAS,CAAA,GAAK,MAAA,CAAO,QAAQ7C,CAAI,CAAA,CACnD,OAAO4C,CAAAA,EAAe,QAAA,GAItBT,EAAAA,CAAmB,GAAA,CAAIS,CAAU,CAAA,EAIjC,OAAOC,CAAAA,EAAc,QAAA,EAAY,CAACA,CAAAA,EAIjC,kBAAA,CAAmB,KAAKD,CAAU,CAAA,EAIvCD,CAAAA,CAAoB,IAAA,CAAK,CACvB,MAAA,CAAQC,EACR,QAAA,CAAUA,CAAAA,CACV,QAASC,CAAAA,CACT,IAAA,CAAMJ,EACN,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,CAAE,OAAA,CAASI,CAAAA,CAAW,KAAMJ,CAAS,CAC7C,CAAC,CAAA,CAAA,CAGH,OAAO,CAACC,CAAAA,CAAe,GAAGC,CAAmB,CAC/C,CAAC,EACD,EAAC,CAEL,OAAO,CACL,KAAA,CAAON,EAAQ,MAAA,CAAS,CAAA,CACxB,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAASA,CAAAA,CAAU,OACnC,OAAA,CAASA,CAAAA,CAAQ,OAASA,CAAAA,CAAU,MACtC,CACF,CAAA,CACA,cAAA,CAAgB,IAClB,CAAC,CACH,CC3JO,SAASS,EAAAA,CACd7G,EACAllB,CAAAA,CACA,CACA,OAAOgiB,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,SAAA,CAAUiD,EAAWllB,CAAM,CAAA,CACxD,QAAS,CAAC,CAACklB,GAAa,CAAC,CAACllB,EAC1B,cAAA,CAAgB,KAAA,CAChB,gBAAiB,IAAA,CACjB,OAAA,CAAS,SAAY,CACnB,IAAMwpB,CAAAA,CAAgC,CACpC,OAAA,CAAS,KAAA,CACT,QAAS,KAAA,CACT,UAAA,CAAY,MACZ,aAAA,CAAe,KAAA,CACf,mBAAoB,KACtB,CAAA,CAKA,OAAI,CAACtE,CAAAA,EAAa,CAACllB,EACVwpB,CAAAA,CAGM,MAAMja,EAAQ,0CAAA,CAA4C,CAAC2V,EAAWllB,CAAM,CAAC,CAAA,EAC1EwpB,CACpB,CACF,CAAC,CACH,CC5BO,SAASwC,EAAAA,CACd1Y,CAAAA,CACA,CACA,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,aAAA,CAAc3O,CAAS,EACpD,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA3F,CAAO,IACN,MAAM4B,CAAAA,CAAQ,gCAAiC,CAC5D,OAAA,CAAS+D,CACX,CAAA,CAAG,MAAA,CAAW,MAAA,CAAW3F,CAAM,CAAA,EACb,EAExB,CAAC,CACH,CCfO,SAASse,EAAAA,CACd/H,CAAAA,CACApb,EACA,CACA,OAAOkZ,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,SAAA,CAAUiC,CAAc,CAAA,CACrD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,OAAA,CAAS,SAAY,CACnB,GAAI,CAACob,CAAAA,EAAkB,CAACpb,EACtB,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAa7D,OAAQ,KAAA,CAVS,MADAyY,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,yBACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAAhV,CAAK,CAAC,CAC/B,CACF,CAAA,EACuB,MACzB,CACF,CAAC,CACH,CAEO,SAASojB,EAAAA,CACdhI,CAAAA,CACApb,EACArI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAO0rB,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,QAAA,CAAS,kBAAkBiC,CAAAA,CAAgBzjB,CAAK,EACpE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAAA,CAAY,CAAE,IAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,EACtB,OAAO,CACL,IAAA,CAAM,EAAC,CACP,UAAA,CAAY,CACV,KAAA,CAAO,CAAA,CACP,MAAArI,CAAAA,CACA,MAAA,CAAQ,EACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMqQ,EAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,CAAA,OAAA,EAAU3rB,CAAK,CAAA,CAAA,CAChG,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAqI,CAAK,CAAC,CAC/B,CACF,EAEA,GAAI,CAACgI,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,IAAMub,CAAAA,CAAO,MAAMvb,EAAS,IAAA,EAAK,CACjC,OAAO4Q,EAAAA,CAA4C2K,CAAAA,CAAM5rB,CAAK,CAChE,CAAA,CACA,iBAAkB,CAAA,CAClB,gBAAA,CAAmB6rB,GAAa,CAC9B,GAAIA,CAAAA,CAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,EAAS,UAAA,CAAW,MAAA,CAASA,EAAS,UAAA,CAAW,KAG5D,EACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CC3EO,SAASyjB,EAAAA,CACdrI,CAAAA,CACApb,EACA,CACA,OAAOkZ,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,SAAA,CAAUiC,CAAc,CAAA,CACrD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,QAAS,SAAY,CACnB,GAAI,CAACob,CAAAA,EAAkB,CAACpb,EACtB,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAa7D,OAAQ,KAAA,CAVS,MADAyY,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,yBACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,KAAAhV,CAAK,CAAC,CAC/B,CACF,CAAA,EACuB,MACzB,CACF,CAAC,CACH,CAEO,SAAS0jB,EAAAA,CACdtI,CAAAA,CACApb,EACArI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAO0rB,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,QAAA,CAAS,kBAAkBiC,CAAAA,CAAgBzjB,CAAK,EACpE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,EACtB,OAAO,CACL,KAAM,EAAC,CACP,UAAA,CAAY,CACV,KAAA,CAAO,CAAA,CACP,MAAArI,CAAAA,CACA,MAAA,CAAQ,EACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMqQ,EAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,UAAU3rB,CAAK,CAAA,CAAA,CAChG,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAAqI,CAAK,CAAC,CAC/B,CACF,EAEA,GAAI,CAACgI,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,IAAMub,CAAAA,CAAO,MAAMvb,EAAS,IAAA,EAAK,CACjC,OAAO4Q,EAAAA,CAA4C2K,CAAAA,CAAM5rB,CAAK,CAChE,CAAA,CACA,iBAAkB,CAAA,CAClB,gBAAA,CAAmB6rB,GAAa,CAC9B,GAAIA,EAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,MAAA,CAASA,EAAS,UAAA,CAAW,KAG5D,EACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CCrEO,SAAS2jB,GACdvI,CAAAA,CACApb,CAAAA,CACAmc,CAAAA,CACA,CACA,OAAOjD,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,aAAA,CAAciC,CAAAA,CAAiBe,CAAe,CAAA,CAC3E,OAAA,CAAS,CAAC,CAACf,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,EAAQ,CAAC,CAACmc,CAAAA,CACzC,QAAS,SAAY,CACnB,GAAI,CAACf,CAAAA,EAAkB,CAACpb,EACtB,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAE7D,GAAI,CAACmc,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAiD,EAGnE,IAAMnU,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,8BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,EACA,OAAA,CAASmc,CACX,CAAC,CACH,CACF,EAEA,GAAI,CAACnU,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,qEAAA,EAAmEA,CAAAA,CAAS,MAAM,CAAA,EAAA,EAAKA,CAAAA,CAAS,UAAU,CAAA,CAC5G,CAAA,CAGF,IAAMlS,CAAAA,CAAS,MAAMkS,CAAAA,CAAS,IAAA,EAAK,CACnC,GAAI,OAAOlS,CAAAA,EAAW,SAAA,CACpB,MAAM,IAAI,KAAA,CACR,kGAA6F,OAAOA,CAAM,CAAA,CAC5G,CAAA,CAGF,OAAOA,CACT,CACF,CAAC,CACH,CCpDO,SAAS8tB,GACdpZ,CAAAA,CACAxK,CAAAA,CACA,CACA,OAAOkZ,YAAAA,CAAa,CAClB,OAAA,CAAS,CAAC,CAAC1O,CAAAA,EAAY,CAAC,CAACxK,CAAAA,CACzB,QAAA,CAAUmZ,CAAAA,CAAU,SAAS,UAAA,CAAW3O,CAAS,EACjD,OAAA,CAAS,SAAY,CACnB,GAAI,CAACA,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAAkD,EAcpE,OAAA,CAXiB,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,yBAAA,CACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAC/B,CACF,GAEgB,IAAA,EAClB,CACF,CAAC,CACH,CC1BO,SAAS6jB,EAAAA,CACdrZ,EACA,CACA,OAAO0O,aAAa,CAClB,OAAA,CAAS,CAAC,CAAC1O,CAAAA,CACX,QAAA,CAAU2O,EAAU,QAAA,CAAS,eAAA,CAAgB3O,CAAS,CAAA,CACtD,OAAA,CAAS,IACP/D,CAAAA,CAAQ,oDAAA,CAAsD,CAAE,QAAA,CAAU,CAAC+D,CAAQ,CAAE,CAAC,CAC1F,CAAC,CACH,CCRO,SAASsZ,EAAAA,CAAkCjI,EAAelkB,CAAAA,CAAQ,EAAA,CAAI,CAC3E,OAAOuhB,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,WAAA,CAAY0C,CAAAA,CAAOlkB,CAAK,EACrD,OAAA,CAAS,CAAC,CAACkkB,CAAAA,CACX,OAAA,CAAS,SACFA,CAAAA,CAIEpV,CAAAA,CAAQ,uCAAA,CAAyC,CAACoV,CAAAA,CAAOlkB,CAAK,CAAC,CAAA,CAH7D,EAKb,CAAC,CACH,CCVA,IAAMkY,CAAAA,CAAMpB,GAAM,UAAA,CAELsV,EAAAA,CAA6D,CACxE,SAAA,CAAW,CACTlU,EAAI,QAAA,CACJA,CAAAA,CAAI,oBACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,4BAAA,CACJA,CAAAA,CAAI,mBACJA,CAAAA,CAAI,uBAAA,CACJA,EAAI,eAAA,CACJA,CAAAA,CAAI,uBACN,CAAA,CACA,eAAA,CAAiB,CACfA,EAAI,oBAAA,CACJA,CAAAA,CAAI,WACJA,CAAAA,CAAI,mCAAA,CACJA,EAAI,mBAAA,CACJA,CAAAA,CAAI,kBAAA,CACJA,CAAAA,CAAI,kBACN,CAAA,CACA,UAAW,CAACA,CAAAA,CAAI,QAAQ,CAAA,CACxB,kBAAA,CAAoB,CAClBA,CAAAA,CAAI,yBAAA,CACJA,CAAAA,CAAI,gBAAA,CACJA,CAAAA,CAAI,mBAAA,CACJA,EAAI,0BAAA,CACJA,CAAAA,CAAI,sBACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,qBAAA,CACJA,CAAAA,CAAI,uBACN,CAAA,CACA,OAAA,CAAS,CACPA,CAAAA,CAAI,aAAA,CACJA,EAAI,eAAA,CACJA,CAAAA,CAAI,gBACJA,CAAAA,CAAI,oBAAA,CACJA,CAAAA,CAAI,yBAAA,CACJA,CAAAA,CAAI,gBAAA,CACJA,EAAI,YACN,CACF,EAEamU,EAAAA,CAAyB,CAAC,GAAG,MAAA,CAAO,MAAA,CAAOD,EAAwB,CAAC,CAAA,CAAE,MAAA,CACjF,CAACE,CAAAA,CAAKC,CAAAA,GAAQD,EAAI,MAAA,CAAOC,CAAG,EAC5B,EACF,EA2CA,SAASC,EAAAA,CAAUC,CAAAA,CAA+B,CAChD,OAAOA,CAAAA,CAAM,MAAQ,GAAA,CAAaA,CAAAA,CAAM,aAAe,GAAA,CAAMA,CAAAA,CAAM,MACrE,CAMA,SAASC,GAAgBC,CAAAA,CAA0B,CACjD,OAAOA,CAAAA,CAAS,OAAA,CAAQ,cAAe,EAAE,CAC3C,CAKA,SAASC,EAAAA,CAAW/qB,CAAAA,CAAqE,CACvF,OAAO,OAAOA,GAAM,QAAA,EAAYA,CAAAA,GAAM,MAAQ,KAAA,GAASA,CAAAA,EAAK,QAAA,GAAYA,CAAAA,EAAK,WAAA,GAAeA,CAC9F,CAMA,SAASgrB,EAAAA,CAAYhrB,EAAqB,CACxC,GAAI,CAAC+qB,EAAAA,CAAW/qB,CAAC,CAAA,CAAG,OAAOA,CAAAA,CAC3B,IAAMmY,EAAS0G,CAAAA,CAAW7e,CAAC,EACrB+B,CAAAA,CAAS6c,EAAAA,CAAO5e,EAAE,GAA0B,CAAA,EAAK,UACvD,OAAO,CAAA,EAAGmY,EAAO,MAAA,CAAO,OAAA,CAAQnY,EAAE,SAAS,CAAC,IAAI+B,CAAM,CAAA,CACxD,CAMA,SAASkpB,EAAAA,CAAiB7tB,CAAAA,CAAyD,CACjF,IAAMd,CAAAA,CAAkC,EAAC,CACzC,IAAA,GAAW,CAAC4uB,CAAAA,CAAGlrB,CAAC,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ5C,CAAK,EACvCd,CAAAA,CAAO4uB,CAAC,EAAIF,EAAAA,CAAYhrB,CAAC,EAE3B,OAAO1D,CACT,CAWO,SAAS6uB,EAAAA,CACdna,CAAAA,CACA7S,EAAQ,EAAA,CACRqR,CAAAA,CAA6B,GAC7B,CACA,IAAM4b,EAAiB5b,CAAAA,CACnB+a,EAAAA,CAAyB/a,CAAK,CAAA,CAC9Bgb,EAAAA,CAEJ,OAAOX,oBAAAA,CAML,CACA,SAAUlK,CAAAA,CAAU,QAAA,CAAS,aAAa3O,CAAAA,EAAY,EAAA,CAAIxB,CAAAA,CAAOrR,CAAK,CAAA,CACtE,gBAAA,CAAkB,KAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAAA,CAAW,OAAAze,CAAO,CAAA,GAAqD,CACvF,GAAI,CAAC2F,CAAAA,CACH,OAAO,CAAE,OAAA,CAAS,EAAC,CAAG,WAAA,CAAa,CAAE,CAAA,CAGvC,IAAMlG,CAAAA,CAA0C,CAC9C,cAAA,CAAgBkG,CAAAA,CAChB,kBAAmBoa,CAAAA,CAAe,IAAA,CAAK,GAAG,CAAA,CAC1C,WAAA,CAAajtB,CACf,CAAA,CAII2rB,CAAAA,GAAc,OAChBhf,CAAAA,CAAO,IAAA,CAAOgf,GAGhB,IAAMtb,CAAAA,CAAY,MAAMZ,EAAAA,CACtB,OAAA,CACA,sCACA9C,CAAAA,CACA,MAAA,CACA,MAAA,CACAO,CACF,CAAA,CAcA,OAAO,CACL,OAAA,CAbcmD,CAAAA,CAAS,kBAAkB,GAAA,CAAKoc,CAAAA,EAAU,CACxD,IAAM5U,CAAAA,CAAO6U,EAAAA,CAAgBD,CAAAA,CAAM,EAAA,CAAG,IAAI,EAE1C,OAAO,CACL,GAFYK,EAAAA,CAAiBL,CAAAA,CAAM,GAAG,KAAK,CAAA,CAG3C,GAAA,CAAKD,EAAAA,CAAUC,CAAK,CAAA,CACpB,KAAA5U,CAAAA,CACA,SAAA,CAAW4U,EAAM,SAAA,CACjB,MAAA,CAAQA,EAAM,MAChB,CACF,CAAC,CAAA,CAIC,WAAA,CAAad,GAAatb,CAAAA,CAAS,WACrC,CACF,CAAA,CAEA,gBAAA,CAAmBwb,GAAa,CAC9B,IAAMqB,CAAAA,CAAWrB,CAAAA,CAAS,WAAA,CAAc,CAAA,CACxC,OAAOqB,CAAAA,EAAY,CAAA,CAAIA,EAAW,MACpC,CACF,CAAC,CACH,CCpNO,SAASC,EAAAA,EAAsB,CACpC,OAAO5L,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,IAAA,EAAK,CAClC,OAAA,CAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,0BAAA,CAA4B,CAC/E,OAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,yBAAyBA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG5D,OAAOA,EAAS,IAAA,EAClB,CAAA,CACA,cAAA,CAAgB,IAAA,CAChB,SAAA,CAAW,GACb,CAAC,CACH,CCjBO,SAAS+c,EAAAA,CAAiCva,CAAAA,CAAkB,CACjE,OAAO6Y,qBAAqB,CAC1B,QAAA,CAAUlK,EAAU,QAAA,CAAS,SAAA,CAAU3O,CAAQ,CAAA,CAC/C,gBAAA,CAAkB,CAAE,KAAA,CAAO,MAAU,EACrC,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA8Y,CAAU,IAAgC,CAC1D,GAAM,CAAE,KAAA,CAAA0B,CAAM,CAAA,CAAI1B,GAAa,EAAC,CAC1B7b,EAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,CAAA,uBAAA,EAA0BmG,CAAQ,CAAA,CAAA,CAAI/C,CAAO,CAAA,CAE7Dud,CAAAA,GAAU,QACZ3gB,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAU2gB,CAAAA,CAAM,QAAA,EAAU,CAAA,CAGjD,IAAMhd,EAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,EAED,GAAI,CAAC2D,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,gBAAA,CAAmBwb,CAAAA,EAA6B,CAC9C,IAAMyB,CAAAA,CAAYzB,IAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,EAAA,CACnD,OAAO,OAAOyB,CAAAA,EAAc,QAAA,CAAY,CAAE,KAAA,CAAOA,CAAU,EAAkB,MAC/E,CACF,CAAC,CACH,CC5BO,SAASC,EAAAA,CAA8B1a,EAAkB,CAC9D,OAAO0O,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,cAAA,CAAe3O,CAAQ,CAAA,CACpD,OAAA,CAAS,SAAY,CACnB,IAAMxC,CAAAA,CAAW,MAAM,KAAA,CACrBgN,CAAAA,CAAO,eAAiB,CAAA,uBAAA,EAA0BxK,CAAQ,CAAA,MAAA,CAAA,CAC1D,CACE,MAAA,CAAQ,KAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,EAEA,GAAI,CAACxC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGtE,IAAMpO,CAAAA,CAAO,MAAMoO,EAAS,IAAA,EAAK,CAEjC,GAAI,CAACpO,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAAA,CAG/C,OAAO,CACL,KAAA,CAAOA,CAAAA,CAAK,KAAA,EAAS,EACrB,QAAA,CAAUA,CAAAA,CAAK,UAAY,CAC7B,CACF,CACF,CAAC,CACH,CCnBO,SAASurB,EAAAA,CACdzJ,EACAC,CAAAA,CACAvS,CAAAA,CAKA,CACA,GAAM,CAAE,UAAA,CAAAwS,CAAAA,CAAa,MAAA,CAAQ,KAAA,CAAAjkB,EAAQ,GAAA,CAAK,OAAA,CAAAytB,EAAU,IAAK,CAAA,CAAIhc,GAAW,EAAC,CAEzE,OAAOia,oBAAAA,CAML,CACA,SAAUlK,CAAAA,CAAU,QAAA,CAAS,QAAQuC,CAAAA,CAAWC,CAAAA,CAAMC,EAAYjkB,CAAK,CAAA,CACvE,gBAAA,CAAkB,CAAE,cAAA,CAAgB,EAAG,EACvC,OAAA,CAAAytB,CAAAA,CACA,eAAgB,IAAA,CAEhB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA9B,CAAU,CAAA,GAAuC,CACjE,GAAM,CAAE,cAAA,CAAAvH,CAAe,EAAIuH,CAAAA,CAKrB+B,CAAAA,CAAAA,CAFY,MAAM5e,CAAAA,CAAQ,CAAA,cAAA,EADjBkV,CAAAA,GAAS,WAAA,CAAc,eAAA,CAAkB,eACD,GAAI,CAACD,CAAAA,CAAWK,IAAmB,EAAA,CAAK,IAAA,CAAOA,EAAgBH,CAAAA,CAAYjkB,CAAK,CAAC,CAAA,EAE1G,GAAA,CAAK2L,GACjCqY,CAAAA,GAAS,WAAA,CAAcrY,EAAE,SAAA,CAAYA,CAAAA,CAAE,QACzC,CAAA,CAcA,OAAA,CAXkB,MAAMmD,CAAAA,CAAQ,qBAAA,CAAuB,CACrD,SAAU4e,CAAAA,CACV,QAAA,CAAU,MACZ,CAAC,CAAA,EAEsC,EAAC,EAAG,GAAA,CAAKlqB,CAAAA,GAAO,CACrD,IAAA,CAAMA,CAAAA,CAAE,KACR,UAAA,CAAYA,CAAAA,CAAE,WACd,MAAA,CAAQA,CAAAA,CAAE,MACZ,CAAA,CAAE,CAGJ,CAAA,CAEA,gBAAA,CAAmBqoB,CAAAA,EACjBA,CAAAA,EAAYA,EAAS,MAAA,GAAW7rB,CAAAA,CAC5B,CAAE,cAAA,CAAgB6rB,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,EAAE,IAAK,CAAA,CACrD,MACR,CAAC,CACH,CCpEA,IAAM8B,EAAAA,CAAe,EAAA,CASd,SAASC,EAAAA,CACd/a,EACAmR,CAAAA,CACAE,CAAAA,CACA,CACA,OAAO3C,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc3O,CAAAA,CAAUmR,CAAAA,CAAME,CAAK,CAAA,CAChE,cAAA,CAAgB,MAChB,OAAA,CAAS,KAAA,CACT,QAAS,SAA2C,CAClD,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAC,CAEpB,IAAM5jB,EAAQ4jB,CAAAA,CAAM,KAAA,CAAM,EAAG,EAAE,CAAA,CAIzBwJ,GAFY,MAAM5e,CAAAA,CAAQ,iBADjBkV,CAAAA,GAAS,WAAA,CAAc,gBAAkB,eACD,CAAA,CAAA,CAAI,CAACnR,CAAAA,CAAUvS,CAAAA,CAAO,MAAA,CAAQ,GAAI,CAAC,CAAA,EAGvF,IAAKqL,CAAAA,EAAOqY,CAAAA,GAAS,YAAcrY,CAAAA,CAAE,SAAA,CAAYA,EAAE,QAAS,CAAA,CAC5D,MAAA,CAAQ+Y,CAAAA,EAASA,CAAAA,CAAK,WAAA,GAAc,QAAA,CAASR,CAAAA,CAAM,aAAa,CAAC,EACjE,KAAA,CAAM,CAAA,CAAGyJ,EAAY,CAAA,CAQxB,OAAA,CALkB,MAAM7e,EAAQ,qBAAA,CAAuB,CACrD,SAAU4e,CAAAA,CACV,QAAA,CAAU,MACZ,CAAC,CAAA,GAGW,IAAKlqB,CAAAA,GAAO,CACpB,KAAMA,CAAAA,CAAE,IAAA,CACR,UAAWA,CAAAA,CAAE,QAAA,CAAS,SAAS,IAAA,EAAQ,EAAA,CACvC,UAAA,CAAYA,CAAAA,CAAE,UAAA,CACd,MAAA,CAAQA,EAAE,MACZ,CAAA,CAAE,GAAK,EAEX,CACF,CAAC,CACH,CC9CO,SAASqqB,GAA4B7tB,CAAAA,CAAQ,EAAA,CAAI,CACtD,OAAO0rB,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,cAAa,CACvC,OAAA,CAAS,MAAO,CAAE,SAAA,CAAW,CAAE,QAAA,CAAAsM,CAAS,CAAE,CAAA,GACxChf,CAAAA,CAAQ,kCAAmC,CAACgf,CAAAA,CAAU9tB,CAAK,CAAC,CAAA,CACzD,IAAA,CAAM+tB,CAAAA,EACLA,CAAAA,CACG,MAAA,CAAQjE,GAAMA,CAAAA,CAAE,IAAA,GAAS,EAAE,CAAA,CAC3B,MAAA,CAAQA,GAAM,CAACA,CAAAA,CAAE,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,EACzC,GAAA,CAAKA,CAAAA,EAAMA,EAAE,IAAI,CACtB,EACJ,gBAAA,CAAkB,CAAE,QAAA,CAAU,EAAG,CAAA,CACjC,gBAAA,CAAmB+B,GACjBA,CAAAA,EAAU,MAAA,CAAS,EACf,CAAE,QAAA,CAAUA,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAE,CAAA,CAC1C,OACN,SAAA,CAAW,IAAA,CAAU,GACvB,CAAC,CACH,CCjBO,SAASmC,EAAAA,CAAqChuB,EAAQ,GAAA,CAAK,CAChE,OAAO0rB,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,qBAAA,CAAsBxhB,CAAK,CAAA,CACrD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAW,CAAE,QAAA,CAAA8tB,CAAS,CAAE,CAAA,GACxChf,CAAAA,CAAQ,iCAAA,CAAmC,CAACgf,CAAAA,CAAU9tB,CAAK,CAAC,CAAA,CACzD,IAAA,CAAM+tB,GACLA,CAAAA,CAAK,MAAA,CAAQ5Z,GAAQA,CAAAA,CAAI,IAAA,GAAS,EAAE,CAAA,CAAE,MAAA,CAAQA,GAAQ,CAAC4M,EAAAA,CAAY5M,EAAI,IAAI,CAAC,CAC9E,CAAA,CACJ,gBAAA,CAAkB,CAAE,QAAA,CAAU,EAAG,CAAA,CACjC,iBAAmB0X,CAAAA,EACjBA,CAAAA,EAAU,OAAS,CAAE,QAAA,CAAUA,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAAE,IAAK,CAAA,CAAI,OACxE,SAAA,CAAW,CAAA,CAAA,CACb,CAAC,CACH,CCfO,SAASoC,GAAyBpb,CAAAA,CAAkBxK,CAAAA,CAAe,CACxE,OAAOkZ,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,SAAA,CAAU3O,CAAQ,EAC5C,OAAA,CAAS,SACFxK,GAIY,MADAyY,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,wBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EAEgB,IAAA,GAhBP,EAAC,CAkBZ,QAAS,CAAC,CAACwK,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CAEO,SAAS6lB,EAAAA,CACdrb,CAAAA,CACAxK,EACArI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAO0rB,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,iBAAA,CAAkB3O,CAAAA,CAAU7S,CAAK,CAAA,CAC3D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAC9Y,CAAAA,EAAY,CAACxK,CAAAA,CAChB,OAAO,CACL,IAAA,CAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,EACP,KAAA,CAAArI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMqQ,EAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,UAAU3rB,CAAK,CAAA,CAAA,CAChG,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAqI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,EAAS,MAAM,CAAA,CAAE,EAGjE,IAAMub,CAAAA,CAAO,MAAMvb,CAAAA,CAAS,IAAA,EAAK,CACjC,OAAO4Q,EAAAA,CAAqC2K,CAAAA,CAAM5rB,CAAK,CACzD,CAAA,CACA,iBAAkB,CAAA,CAClB,gBAAA,CAAmB6rB,GAAa,CAC9B,GAAIA,EAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,OAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,CAAA,CACA,OAAA,CAAS,CAAC,CAAChZ,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CC7EO,SAAS8lB,EAAAA,CACdtW,CAAAA,CAAyB,MAAA,CACzB,CACA,OAAO0J,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,QAAA,CAAS3J,CAAI,CAAA,CACvC,OAAA,CAAS,SAAY,CACnB,IAAM/H,CAAAA,CAAUyN,CAAAA,CAAc,qBAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,+BAAA,CAAiCoD,CAAO,CAAA,CAC5D,OAAI+H,IAAS,OAAA,EACXnL,CAAAA,CAAI,aAAa,MAAA,CAAO,eAAA,CAAiB,GAAG,CAAA,CAUjC,KAAA,CANI,MADAoU,CAAAA,EAAc,CACCpU,CAAAA,CAAI,UAAS,CAAG,CAC9C,OAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,EAC2B,IAAA,EAE9B,CACF,CAAC,CACH,CCtBO,SAAS0hB,EAAAA,CAAgC3B,CAAAA,CAAe,CAC7D,OAAOlL,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,iBAAiBiL,CAAAA,EAAO,MAAA,CAAQA,GAAO,QAAQ,CAAA,CACzE,QAAS,SACA3d,CAAAA,CAAQ,iCAAkC,CAC/C2d,CAAAA,EAAO,OACPA,CAAAA,EAAO,QACT,CAAC,CAAA,CAEH,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CCHO,SAAS4B,EAAAA,CACdxb,CAAAA,CACAuQ,CAAAA,CACAC,EACA,CACA,OAAO9B,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,YAAA,CAAa3O,CAAAA,CAAWuQ,CAAAA,CAASC,CAAS,CAAA,CACpE,QAAS,SAAA,CACQ,MAAMvU,EAAQ,yBAAA,CAA2B,CACtD,MAAO,CAAC+D,CAAAA,CAAUuQ,EAAQC,CAAQ,CAAA,CAClC,MAAO,CAAA,CACP,KAAA,CAAO,kBACT,CAAC,CAAA,GAGe,QAAQ,CAAC,CAAA,EAAK,IAAA,CAEhC,OAAA,CAAS,CAAC,CAACxQ,GAAY,CAAC,CAACuQ,GAAU,CAAC,CAACC,CACvC,CAAC,CACH,CC3BO,SAASiL,EAAAA,CAAuBlL,EAAgBC,CAAAA,CAAkB,CACvE,OAAO9B,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,OAAA,CAAQ4B,EAAQC,CAAQ,CAAA,CAClD,QAAS,CAAC,CAACD,GAAU,CAAC,CAACC,EACvB,OAAA,CAAS,SACPvU,EAAQ,2BAAA,CAA6B,CACnCsU,EACAC,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAASkL,EAAAA,CAA8BnL,EAAgBC,CAAAA,CAAkB,CAC9E,OAAO9B,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe4B,EAAQC,CAAQ,CAAA,CACzD,QAAS,CAAC,CAACD,GAAU,CAAC,CAACC,CAAAA,CACvB,OAAA,CAAS,SACPvU,CAAAA,CAAQ,oCAAqC,CAC3C,MAAA,CAAAsU,EACA,QAAA,CAAAC,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAASmL,EAAAA,CAA0BpL,CAAAA,CAAgBC,EAAkB,CAC1E,OAAO9B,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,UAAA,CAAW4B,CAAAA,CAAQC,CAAQ,CAAA,CACrD,OAAA,CAAS,SACAvU,CAAAA,CAAQ,wBAAA,CAA0B,CACvC,MAAA,CAAAsU,CAAAA,CACA,QAAA,CAAAC,CACF,CAAC,CAAA,CAEH,YAAa,IACf,CAAC,CACH,CCLO,SAASoL,GAAgBC,CAAAA,CAAwF,CACtH,OAAI,KAAA,CAAM,OAAA,CAAQA,CAAc,CAAA,CAEvBA,CAAAA,CAAe,IAAKjC,CAAAA,EAAUkC,EAAAA,CAAYlC,CAAK,CAAC,CAAA,CAElDkC,GAAYD,CAAc,CACnC,CAEA,SAASC,EAAAA,CAAYlC,CAAAA,CAA2D,CAC9E,GAAI,CAACA,EAAO,OAAOA,CAAAA,CAEnB,IAAMtJ,CAAAA,CAAY,CAAA,CAAA,EAAIsJ,EAAM,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAM,QAAQ,CAAA,CAAA,CAKpD,OAHEpP,EAAO,YAAA,CAAa,QAAA,CAAS8F,CAAS,CAAA,EACtC9F,CAAAA,CAAO,mBAAmB,IAAA,CAAMsB,CAAAA,EAAUA,CAAAA,CAAM,IAAA,CAAKwE,CAAS,CAAC,EAGxD,CACL,GAAGsJ,EACH,IAAA,CAAM,iEAAA,CACN,MAAO,EACT,CAAA,CAGKA,CACT,CCxBA,eAAsBmC,GACpBxL,CAAAA,CACAC,CAAAA,CACAtF,EACuB,CACvB,GAAI,CACF,IAAM1N,CAAAA,CAAW,MAAMC,EAAAA,CAAe,iBAAA,CAAmB,CACvD,OAAA8S,CAAAA,CACA,QAAA,CAAAC,EACA,QAAA,CAAAtF,CACF,EAAG,CAAC,CAAA,CAEJ,GACE1N,CAAAA,EACA,OAAOA,CAAAA,EAAa,UACnBA,CAAAA,CAAmB,MAAA,GAAW+S,GAC9B/S,CAAAA,CAAmB,QAAA,GAAagT,EAEjC,OAAOhT,CAEX,CAAA,KAAQ,CAER,CAEA,OAAO,IACT,CC9BO,SAASwe,GACdzL,CAAAA,CACAC,CAAAA,CACAtF,EAAW,EAAA,CACX+Q,CAAAA,CACA,CACA,IAAMC,CAAAA,CAAgB1L,GAAU,IAAA,EAAK,CAC/BF,EAAY,CAAA,EAAA,EAAKC,CAAM,IAAI2L,CAAAA,EAAiB,EAAE,CAAA,CAAA,CAEpD,OAAOxN,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,MAAM2B,CAAS,CAAA,CACzC,QAAS,SAAY,CACnB,GAAI,CAAC4L,CAAAA,EAAiBA,CAAAA,GAAkB,YACtC,OAAO,IAAA,CAKT,IAAM1e,CAAAA,CAAW,MAAMvB,EAAQ,iBAAA,CAAmB,CAChD,MAAA,CAAAsU,CAAAA,CACA,QAAA,CAAU2L,CAAAA,CACV,SAAAhR,CACF,CAAC,EAED,GAAI,CAAC1N,EAAU,CAGb,IAAM2e,EAAW,MAAMJ,EAAAA,CAA0BxL,EAAQ2L,CAAAA,CAAehR,CAAQ,EAChF,GAAI,CAACiR,EACH,OAAO,IAAA,CAET,IAAMC,CAAAA,CAAgBH,CAAAA,GAAQ,MAAA,CAAY,CAAE,GAAGE,CAAAA,CAAU,IAAAF,CAAI,CAAA,CAAaE,EAC1E,OAAOP,EAAAA,CAAgBQ,CAAa,CACtC,CAEA,IAAMxC,EAAQqC,CAAAA,GAAQ,MAAA,CAAY,CAAE,GAAGze,CAAAA,CAAU,IAAAye,CAAI,CAAA,CAAaze,CAAAA,CAClE,OAAOoe,EAAAA,CAAgBhC,CAAK,CAC9B,CAAA,CACA,OAAA,CACE,CAAC,CAACrJ,CAAAA,EACF,CAAC,CAACC,CAAAA,EACFA,EAAS,IAAA,EAAK,GAAM,IACpBA,CAAAA,CAAS,IAAA,KAAW,WACxB,CAAC,CACH,CCzCO,SAAS6L,GAAiBxf,CAAAA,CAAkB/C,CAAAA,CAAsBO,EAAkC,CACzG,OAAO4B,EAAQ,CAAA,OAAA,EAAUY,CAAQ,CAAA,CAAA,CAAI/C,CAAAA,CAAQ,MAAA,CAAW,MAAA,CAAWO,CAAM,CAC3E,CAEA,eAAsBiiB,EAAAA,CACpBC,CAAAA,CACArR,EACA+Q,CAAAA,CACA5hB,CAAAA,CACgB,CAChB,GAAM,CAAE,aAAA,CAAe0e,CAAK,CAAA,CAAIwD,CAAAA,CAEhC,GAAIxD,CAAAA,EAAM,eAAA,EAAmBA,GAAM,iBAAA,EAAqBA,CAAAA,CAAK,OAAO,CAAC,CAAA,GAAM,aACzE,GAAI,CACF,IAAMyD,CAAAA,CAAO,MAAMC,GACjB1D,CAAAA,CAAK,eAAA,CACLA,CAAAA,CAAK,iBAAA,CACL7N,CAAAA,CACA+Q,CAAAA,CACA5hB,CACF,CAAA,CACA,OAAImiB,EACK,CACL,GAAGD,EACH,cAAA,CAAgBC,CAAAA,CAChB,GAAA,CAAAP,CACF,CAAA,CAEKM,CACT,MAAQ,CACN,OAAOA,CACT,CAGF,OAAO,CAAE,GAAGA,CAAAA,CAAM,GAAA,CAAAN,CAAI,CACxB,CAEA,eAAeS,EAAAA,CAAaC,CAAAA,CAAgBzR,EAAkB7Q,CAAAA,CAAwC,CACpG,IAAMuiB,CAAAA,CAAiBD,CAAAA,CAAM,IAAIE,EAAa,CAAA,CACxCnQ,EAAW,MAAM,OAAA,CAAQ,IAAIkQ,CAAAA,CAAe,GAAA,CAAK3lB,GAAMqlB,EAAAA,CAAYrlB,CAAAA,CAAGiU,CAAAA,CAAU,MAAA,CAAW7Q,CAAM,CAAC,CAAC,CAAA,CACzG,OAAOuhB,GAAgBlP,CAAQ,CACjC,CAEA,eAAsBoQ,EAAAA,CACpBjM,CAAAA,CACAkM,CAAAA,CAAuB,EAAA,CACvBC,CAAAA,CAAyB,GACzB7vB,CAAAA,CAAgB,EAAA,CAChBmU,EAAc,EAAA,CACd4J,CAAAA,CAAmB,GACnB7Q,CAAAA,CACyB,CACzB,IAAMmiB,CAAAA,CAAO,MAAMH,EAAAA,CAA8B,mBAAoB,CACnE,IAAA,CAAAxL,EACA,YAAA,CAAAkM,CAAAA,CACA,eAAAC,CAAAA,CACA,KAAA,CAAA7vB,EACA,GAAA,CAAAmU,CAAAA,CACA,SAAA4J,CACF,CAAA,CAAG7Q,CAAM,CAAA,CAET,OAAI,MAAM,OAAA,CAAQmiB,CAAI,CAAA,CACbE,EAAAA,CAAaF,CAAAA,CAAMtR,CAAAA,CAAU7Q,CAAM,CAAA,EAGxCmiB,CAAAA,EAAQ,MACV,OAAA,CAAQ,IAAA,CACN,mCAAmC,OAAOA,CAAI,CAAA,8BAAA,EAAiC3L,CAAI,CAAA,yBAAA,CACrF,CAAA,CAGK,KACT,CAEA,eAAsBoM,GACpBpM,CAAAA,CACA7K,CAAAA,CACA+W,EAAuB,EAAA,CACvBC,CAAAA,CAAyB,EAAA,CACzB7vB,CAAAA,CAAgB,EAAA,CAChB+d,CAAAA,CAAmB,GACnB7Q,CAAAA,CACyB,CACzB,GAAImQ,CAAAA,CAAO,YAAA,CAAa,SAASxE,CAAO,CAAA,CACtC,OAAO,EAAC,CAGV,IAAMwW,CAAAA,CAAO,MAAMH,GAA8B,mBAAA,CAAqB,CACpE,KAAAxL,CAAAA,CACA,OAAA,CAAA7K,CAAAA,CACA,YAAA,CAAA+W,CAAAA,CACA,cAAA,CAAAC,EACA,KAAA,CAAA7vB,CAAAA,CACA,SAAA+d,CACF,CAAA,CAAG7Q,CAAM,CAAA,CAET,OAAI,KAAA,CAAM,OAAA,CAAQmiB,CAAI,CAAA,CACbE,GAAaF,CAAAA,CAAMtR,CAAAA,CAAU7Q,CAAM,CAAA,EAGxCmiB,CAAAA,EAAQ,MACV,OAAA,CAAQ,IAAA,CACN,CAAA,iCAAA,EAAoC,OAAOA,CAAI,CAAA,iCAAA,EAAoCxW,CAAO,CAAA,OAAA,EAAU6K,CAAI,2BAC1G,CAAA,CAGK,IAAA,CACT,CAKA,SAASgM,EAAAA,CAAcjD,EAAqB,CAC1C,IAAMsD,EAAkB,CACtB,GAAGtD,EACH,YAAA,CAAc,KAAA,CAAM,QAAQA,CAAAA,CAAM,YAAY,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,YAAY,CAAA,CAAI,GAC5E,aAAA,CAAe,KAAA,CAAM,QAAQA,CAAAA,CAAM,aAAa,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,aAAa,CAAA,CAAI,GAC/E,UAAA,CAAY,KAAA,CAAM,QAAQA,CAAAA,CAAM,UAAU,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,UAAU,CAAA,CAAI,GACtE,OAAA,CAAS,KAAA,CAAM,QAAQA,CAAAA,CAAM,OAAO,EAAI,CAAC,GAAGA,EAAM,OAAO,CAAA,CAAI,EAAC,CAC9D,KAAA,CAAOA,EAAM,KAAA,CAAQ,CAAE,GAAGA,CAAAA,CAAM,KAAM,CAAA,CAAI,IAC5C,CAAA,CAEMuD,CAAAA,CAAuC,CAC3C,QAAA,CACA,OAAA,CACA,OACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,KAAA,CACA,SACF,CAAA,CAEA,QAAWC,CAAAA,IAAQD,CAAAA,CACbD,EAASE,CAAI,CAAA,EAAK,OACnBF,CAAAA,CAAiBE,CAAI,CAAA,CAAI,EAAA,CAAA,CAI9B,OAAIF,CAAAA,CAAS,mBAAqB,IAAA,GAChCA,CAAAA,CAAS,kBAAoB,CAAA,CAAA,CAE3BA,CAAAA,CAAS,UAAY,IAAA,GACvBA,CAAAA,CAAS,SAAW,CAAA,CAAA,CAElBA,CAAAA,CAAS,OAAS,IAAA,GACpBA,CAAAA,CAAS,MAAQ,CAAA,CAAA,CAEfA,CAAAA,CAAS,aAAe,IAAA,GAC1BA,CAAAA,CAAS,WAAA,CAAc,CAAA,CAAA,CAErBA,CAAAA,CAAS,MAAA,EAAU,OACrBA,CAAAA,CAAS,MAAA,CAAS,GAEhBA,CAAAA,CAAS,WAAA,EAAe,OAC1BA,CAAAA,CAAS,WAAA,CAAc,CAAA,CAAA,CAGpBA,CAAAA,CAAS,KAAA,GACZA,CAAAA,CAAS,MAAQ,CACf,WAAA,CAAa,EACb,IAAA,CAAM,KAAA,CACN,KAAM,KAAA,CACN,WAAA,CAAa,CACf,CAAA,CAAA,CAGEA,CAAAA,CAAS,mBAAA,EAAuB,OAClCA,CAAAA,CAAS,mBAAA,CAAsB,aAE7BA,CAAAA,CAAS,oBAAA,EAAwB,OACnCA,CAAAA,CAAS,oBAAA,CAAuB,aAE9BA,CAAAA,CAAS,mBAAA,EAAuB,OAClCA,CAAAA,CAAS,mBAAA,CAAsB,mBAE7BA,CAAAA,CAAS,SAAA,EAAa,OACxBA,CAAAA,CAAS,SAAA,CAAY,EAAA,CAAA,CAEnBA,CAAAA,CAAS,oBAAA,EAAwB,IAAA,GACnCA,EAAS,oBAAA,CAAuB,WAAA,CAAA,CAE9BA,EAAS,QAAA,EAAY,IAAA,GACvBA,EAAS,QAAA,CAAW,WAAA,CAAA,CAGlBA,CAAAA,CAAS,UAAA,EAAc,IAAA,GACzBA,CAAAA,CAAS,WAAa,KAAA,CAAA,CAGjBA,CACT,CAEA,eAAsBT,EAAAA,CACpBlM,EAAiB,EAAA,CACjBC,CAAAA,CAAmB,EAAA,CACnBtF,CAAAA,CAAmB,EAAA,CACnB+Q,CAAAA,CACA5hB,EAC4B,CAC5B,IAAMmiB,EAAO,MAAMH,EAAAA,CAA4B,WAAY,CACzD,MAAA,CAAA9L,EACA,QAAA,CAAAC,CAAAA,CACA,SAAAtF,CACF,CAAA,CAAG7Q,CAAM,CAAA,CAET,GAAImiB,EAAM,CACR,IAAMa,CAAAA,CAAiBR,EAAAA,CAAcL,CAAI,CAAA,CACnCD,EAAO,MAAMD,EAAAA,CAAYe,EAAgBnS,CAAAA,CAAU+Q,CAAAA,CAAK5hB,CAAM,CAAA,CACpE,OAAOuhB,EAAAA,CAAgBW,CAAI,CAC7B,CAGF,CAEA,eAAsBe,EAAAA,CACpB/M,EAAiB,EAAA,CACjBC,CAAAA,CAAmB,GACI,CACvB,IAAMgM,CAAAA,CAAO,MAAMH,EAAAA,CAA4B,iBAAA,CAAmB,CAChE,MAAA,CAAA9L,CAAAA,CACA,SAAAC,CACF,CAAC,EACD,OAAOgM,CAAAA,EAAOK,GAAcL,CAAI,CAClC,CAEA,eAAsBe,EAAAA,CACpBhN,EACAC,CAAAA,CACAtF,CAAAA,CACuC,CACvC,IAAMsR,CAAAA,CAAO,MAAMH,EAAAA,CAA4C,gBAAA,CAAkB,CAC/E,OAAA9L,CAAAA,CACA,QAAA,CAAAC,EACA,QAAA,CAAUtF,CAAAA,EAAYqF,CACxB,CAAC,CAAA,CAED,GAAIiM,CAAAA,CAAM,CACR,IAAMgB,EAAuC,EAAC,CAC9C,OAAW,CAACxtB,CAAAA,CAAK4pB,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ4C,CAAI,CAAA,CAC5CgB,CAAAA,CAAcxtB,CAAG,CAAA,CAAI6sB,EAAAA,CAAcjD,CAAK,CAAA,CAE1C,OAAO4D,CACT,CACA,OAAOhB,CACT,CAEA,eAAsBiB,GACpB5L,CAAAA,CACA3G,CAAAA,CAA+B,GACJ,CAC3B,OAAOmR,GAAgC,eAAA,CAAiB,CAAE,IAAA,CAAAxK,CAAAA,CAAM,QAAA,CAAA3G,CAAS,CAAC,CAC5E,CAEA,eAAsBwS,EAAAA,CACpBC,CAAAA,CAAe,GACfxwB,CAAAA,CAAgB,GAAA,CAChBkkB,CAAAA,CACAR,CAAAA,CAAe,MAAA,CACf3F,CAAAA,CAAmB,GACU,CAC7B,OAAOmR,GAAkC,kBAAA,CAAoB,CAC3D,KAAAsB,CAAAA,CACA,KAAA,CAAAxwB,CAAAA,CACA,KAAA,CAAAkkB,CAAAA,CACA,IAAA,CAAAR,EACA,QAAA,CAAA3F,CACF,CAAC,CACH,CAEA,eAAsB0S,EAAAA,CAAcrB,CAAAA,CAAsC,CACxE,IAAMC,CAAAA,CAAO,MAAMH,EAAAA,CAA4B,gBAAA,CAAkB,CAAE,IAAA,CAAAE,CAAK,CAAC,CAAA,CACzE,OAAOC,CAAAA,EAAOK,EAAAA,CAAcL,CAAI,CAClC,CAEA,eAAsBqB,EAAAA,CAAiB7X,EAAiD,CACtF,OAAOqW,GAAqC,wBAAA,CAA0B,CAAE,OAAA,CAAArW,CAAQ,CAAC,CACnF,CAEA,eAAsB8X,EAAAA,CAAeC,EAAmD,CACtF,OAAO1B,GAAqC,kBAAA,CAAoB,CAAE,SAAA,CAAA0B,CAAU,CAAC,CAC/E,CAEA,eAAsBC,EAAAA,CACpB1M,EACAJ,CAAAA,CACqC,CACrC,OAAOmL,EAAAA,CAA0C,mCAAA,CAAqC,CACpF/K,CAAAA,CACAJ,CACF,CAAC,CACH,CAEA,eAAsB+M,EAAAA,CACpBvM,CAAAA,CACAxG,EACoB,CACpB,OAAOmR,EAAAA,CAAyB,cAAA,CAAgB,CAAE,QAAA,CAAA3K,EAAU,QAAA,CAAAxG,CAAS,CAAC,CACxE,KC7SYgT,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,CAAAA,CAAA,iBAAA,CAAoB,oBACpBA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,OAAA,CAAU,UAJAA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EAOZ,SAASrQ,EAAAA,CAAWzhB,CAAAA,CAAmD,CACrE,IAAMsf,CAAAA,CAAQtf,CAAAA,CAAM,MAAM,0BAA0B,CAAA,CACpD,OAAKsf,CAAAA,CACE,CACL,OAAQ,UAAA,CAAWA,CAAAA,CAAM,CAAC,CAAC,CAAA,CAC3B,OAAQA,CAAAA,CAAM,CAAC,CACjB,CAAA,CAJmB,CAAE,MAAA,CAAQ,CAAA,CAAG,MAAA,CAAQ,EAAG,CAK7C,CAEO,SAASyS,GACdvE,CAAAA,CACAwE,CAAAA,CACAtN,EACA,CACA,IAAMuN,CAAAA,CAAapzB,CAAAA,EACjB4iB,EAAAA,CAAW5iB,CAAAA,CAAE,oBAAoB,CAAA,CAAE,MAAA,CACnC4iB,GAAW5iB,CAAAA,CAAE,mBAAmB,EAAE,MAAA,CAClC4iB,EAAAA,CAAW5iB,CAAAA,CAAE,oBAAoB,CAAA,CAAE,MAAA,CAE/BqzB,EAAe3tB,CAAAA,EAAaA,CAAAA,CAAE,YAAc,CAAA,CAC5C4tB,CAAAA,CAAY5tB,GAChBipB,CAAAA,CAAM,aAAA,EAAe,eAAiB,CAAA,EAAGjpB,CAAAA,CAAE,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,QAAQ,CAAA,CAAA,CAE3D6tB,CAAAA,CAAa,CACjB,QAAA,CAAU,CAAC7tB,CAAAA,CAAUvF,CAAAA,GAAa,CAChC,GAAIkzB,EAAY3tB,CAAC,CAAA,CACf,OAAO,CAAA,CAGT,GAAI2tB,EAAYlzB,CAAC,CAAA,CACf,OAAO,GAAA,CAGT,IAAMqzB,CAAAA,CAAKJ,EAAU1tB,CAAC,CAAA,CAChB+tB,EAAKL,CAAAA,CAAUjzB,CAAC,EACtB,OAAIqzB,CAAAA,GAAOC,CAAAA,CACFA,CAAAA,CAAKD,CAAAA,CAGP,CACT,EACA,iBAAA,CAAmB,CAAC9tB,EAAUvF,CAAAA,GAAa,CACzC,IAAMuzB,CAAAA,CAAOhuB,CAAAA,CAAE,kBACTiuB,CAAAA,CAAOxzB,CAAAA,CAAE,kBAEf,OAAIuzB,CAAAA,CAAOC,EAAa,EAAA,CACpBD,CAAAA,CAAOC,EAAa,CAAA,CAEjB,CACT,CAAA,CACA,KAAA,CAAO,CAACjuB,CAAAA,CAAUvF,IAAa,CAC7B,IAAMuzB,EAAOhuB,CAAAA,CAAE,QAAA,CACTiuB,EAAOxzB,CAAAA,CAAE,QAAA,CAEf,OAAIuzB,CAAAA,CAAOC,CAAAA,CAAa,EAAA,CACpBD,EAAOC,CAAAA,CAAa,CAAA,CAEjB,CACT,CAAA,CACA,OAAA,CAAS,CAACjuB,CAAAA,CAAUvF,CAAAA,GAAa,CAC/B,GAAIkzB,CAAAA,CAAY3tB,CAAC,EACf,OAAO,CAAA,CAGT,GAAI2tB,CAAAA,CAAYlzB,CAAC,EACf,OAAO,GAAA,CAGT,IAAMuzB,CAAAA,CAAO,IAAA,CAAK,MAAMhuB,CAAAA,CAAE,OAAO,EAC3BiuB,CAAAA,CAAO,IAAA,CAAK,MAAMxzB,CAAAA,CAAE,OAAO,CAAA,CAEjC,OAAIuzB,CAAAA,CAAOC,CAAAA,CAAa,GACpBD,CAAAA,CAAOC,CAAAA,CAAa,EAEjB,CACT,CACF,EAEMC,CAAAA,CAAST,CAAAA,CAAW,IAAA,CAAKI,CAAAA,CAAW1N,CAAK,CAAC,EAC1CgO,CAAAA,CAAcD,CAAAA,CAAO,UAAW7zB,CAAAA,EAAMuzB,CAAAA,CAASvzB,CAAC,CAAC,CAAA,CACjD+zB,CAAAA,CAASF,CAAAA,CAAOC,CAAW,CAAA,CACjC,OAAIA,CAAAA,EAAe,CAAA,GACjBD,EAAO,MAAA,CAAOC,CAAAA,CAAa,CAAC,CAAA,CAC5BD,CAAAA,CAAO,QAAQE,CAAM,CAAA,CAAA,CAEhBF,CACT,CAEO,SAASG,GACdpF,CAAAA,CACA9I,CAAAA,CAAmB,UACnB8J,CAAAA,CAAmB,IAAA,CACnB1P,CAAAA,CACA,CAKA,IAAM+T,CAAAA,CAAmB/T,GAAYV,CAAAA,CAAO,eAAA,CAE5C,OAAOkE,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,WAAA,CAAYiL,CAAAA,EAAO,MAAA,CAAQA,CAAAA,EAAO,SAAU9I,CAAAA,CAAOmO,CAAgB,EAC7F,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrF,CAAAA,CACH,OAAO,EAAC,CAGV,IAAMpc,CAAAA,CAAW,MAAMvB,EAAQ,uBAAA,CAAyB,CACtD,OAAQ2d,CAAAA,CAAM,MAAA,CACd,SAAUA,CAAAA,CAAM,QAAA,CAChB,SAAUqF,CACZ,CAAC,EAEK5gB,CAAAA,CAAUb,CAAAA,CACZ,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAOA,CAAiC,CAAC,CAAA,CAC3D,EAAC,CACL,OAAOoe,GAAgBvd,CAAO,CAChC,EACA,OAAA,CAASuc,CAAAA,EAAW,CAAC,CAAChB,CAAAA,CACtB,MAAA,CAASxqB,GAAkB+uB,EAAAA,CAAgBvE,CAAAA,CAAOxqB,EAAM0hB,CAAK,CAAA,CAI7D,kBAAmB,CAACoO,CAAAA,CAASC,CAAAA,GAAY,CACvC,GAAI,CAACD,GAAW,CAACC,CAAAA,CAAS,OAAOA,CAAAA,CAGjC,IAAMC,EAAqBF,CAAAA,CAAoB,MAAA,CAC5CtF,GAAiBA,CAAAA,CAAM,aAAA,GAAkB,IAC5C,CAAA,CAEMyF,CAAAA,CAAmB,IAAI,GAAA,CAC1BF,CAAAA,CAAoB,IAAKrmB,CAAAA,EAAa,CAAA,EAAGA,CAAAA,CAAE,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,QAAQ,CAAA,CAAE,CACpE,EAEMwmB,CAAAA,CAAoBF,CAAAA,CAAkB,OACzCG,CAAAA,EAAe,CAACF,CAAAA,CAAiB,GAAA,CAAI,CAAA,EAAGE,CAAAA,CAAI,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAI,QAAQ,CAAA,CAAE,CACvE,EAGA,OAAID,CAAAA,CAAkB,MAAA,CAAS,CAAA,CACtB,CAAC,GAAIH,EAAqB,GAAGG,CAAiB,EAGhDH,CACT,CACF,CAAC,CACH,CAEO,SAASK,EAAAA,CACdjP,CAAAA,CACAC,EACAtF,CAAAA,CACA0P,CAAAA,CAAU,KACV,CACA,IAAMqE,EAAmB/T,CAAAA,EAAYV,CAAAA,CAAO,eAAA,CAE5C,OAAOkE,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,WAAW4B,CAAAA,CAAQC,CAAAA,CAAUyO,CAAgB,CAAA,CACvE,OAAA,CAASrE,CAAAA,EAAW,CAAC,CAACrK,CAAAA,EAAU,CAAC,CAACC,CAAAA,CAClC,QAAS,SACP+M,EAAAA,CAAchN,EAAQC,CAAAA,CAAUyO,CAAgB,CAIpD,CAAC,CACH,CCvKO,SAASQ,EAAAA,CACdzf,CAAAA,CACAyQ,EAAS,OAAA,CACTtjB,CAAAA,CAAQ,GACR+d,CAAAA,CAAW,EAAA,CACX0P,EAAU,IAAA,CACV,CACA,OAAO/B,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,YAAA,CAAa3O,GAAY,EAAA,CAAIyQ,CAAAA,CAAQtjB,EAAO+d,CAAQ,CAAA,CAC9E,QAAS,CAAC,CAAClL,CAAAA,EAAY4a,CAAAA,CACvB,gBAAA,CAAkB,CAChB,OAAQ,MAAA,CACR,QAAA,CAAU,OACV,WAAA,CAAa,IACf,EAEA,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA9B,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAM,CACxC,GAAI,CAACye,CAAAA,EAAW,aAAe,CAAC9Y,CAAAA,CAAU,OAAO,EAAC,CAElD,IAAMxC,CAAAA,CAAW,MAAMyf,GACrBxM,CAAAA,CACAzQ,CAAAA,CACA8Y,EAAU,MAAA,EAAU,EAAA,CACpBA,CAAAA,CAAU,QAAA,EAAY,EAAA,CACtB3rB,CAAAA,CACA+d,EACA7Q,CACF,CAAA,CAEA,OAAOuhB,EAAAA,CAAgBpe,CAAAA,EAAY,EAAE,CACvC,CAAA,CAEA,gBAAA,CAAmBwb,CAAAA,EAA0C,CAC3D,IAAM2E,CAAAA,CAAO3E,CAAAA,GAAWA,EAAS,MAAA,CAAS,CAAC,EAGrC0G,CAAAA,CAAAA,CAAe1G,CAAAA,EAAU,MAAA,EAAU,CAAA,IAAO7rB,CAAAA,CAEhD,GAAKuyB,EAIL,OAAO,CACL,OAAQ/B,CAAAA,EAAM,MAAA,CACd,SAAUA,CAAAA,EAAM,QAAA,CAChB,YAAA+B,CACF,CACF,CACF,CAAC,CACH,CAEO,SAASC,EAAAA,CACd3f,EACAyQ,CAAAA,CAAS,OAAA,CACTsM,CAAAA,CAAuB,EAAA,CACvBC,CAAAA,CAAyB,EAAA,CACzB7vB,EAAQ,EAAA,CACR+d,CAAAA,CAAW,GACX0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,iBAAiB3O,CAAAA,EAAY,EAAA,CAAIyQ,EAAQsM,CAAAA,CAAcC,CAAAA,CAAgB7vB,EAAO+d,CAAQ,CAAA,CAChH,OAAA,CAAS,CAAC,CAAClL,CAAAA,EAAY4a,EACvB,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAvgB,CAAO,EAAI,EAAC,GAAa,CACzC,GAAI,CAAC2F,EACH,OAAO,GAGT,IAAMxC,CAAAA,CAAW,MAAMyf,EAAAA,CACrBxM,CAAAA,CACAzQ,CAAAA,CACA+c,CAAAA,CACAC,CAAAA,CACA7vB,CAAAA,CACA+d,EACA7Q,CACF,CAAA,CAEA,OAAOuhB,EAAAA,CAAgBpe,CAAAA,EAAY,EAAE,CACvC,CACF,CAAC,CACH,CC7EA,IAAMoiB,EAAAA,CAAiB,IAAI,GAAA,CAK3B,SAASC,EAAAA,CAAchP,CAAAA,CAAc,CACnC,IAAIiP,CAAAA,CAASF,GAAe,GAAA,CAAI/O,CAAI,EACpC,OAAKiP,CAAAA,GACHA,EAAU1wB,CAAAA,GAAU,CAClB,GAAGA,CAAAA,CACH,KAAA,CAAOA,EAAK,KAAA,CAAM,GAAA,CAAKsjB,GAASqN,EAAAA,CAAgBrN,CAAAA,CAAM7B,CAAI,CAAC,CAC7D,CAAA,CAAA,CACA+O,GAAe,GAAA,CAAI/O,CAAAA,CAAMiP,CAAM,CAAA,CAAA,CAE1BA,CACT,CAeA,SAASC,EAAAA,CAAgBrN,CAAAA,CAAe7B,CAAAA,CAAuB,CAC7D,IAAMkO,EAASrM,CAAAA,CAAK,MAAA,CAAQkH,GAAUA,CAAAA,CAAM,KAAA,EAAO,SAAS,CAAA,CACtDhE,CAAAA,CAAOlD,CAAAA,CAAK,MAAA,CAAQkH,CAAAA,EAAU,CAACA,EAAM,KAAA,EAAO,SAAS,EAE3D,GAAI/I,CAAAA,GAAS,MACX,OAAO,CAAC,GAAGkO,CAAAA,CAAQ,GAAGnJ,CAAI,CAAA,CAG5B,IAAMoK,EAAY,CAAC,GAAGpK,CAAI,CAAA,CAAE,IAAA,CAC1B,CAACjlB,CAAAA,CAAGvF,CAAAA,GAAM,IAAI,KAAKA,CAAAA,CAAE,OAAO,EAAE,OAAA,EAAQ,CAAI,IAAI,IAAA,CAAKuF,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAChE,EACA,OAAO,CAAC,GAAGouB,CAAAA,CAAQ,GAAGiB,CAAS,CACjC,CAEO,SAASC,EAAAA,CACdpP,CAAAA,CACAvP,CAAAA,CACAnU,EAAQ,EAAA,CACR+d,CAAAA,CAAW,GACX0P,CAAAA,CAAU,IAAA,CACVsF,EAAkC,EAAC,CACnC,CACA,OAAOrH,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,MAAM,WAAA,CAAYkC,CAAAA,CAAMvP,EAAKnU,CAAAA,CAAO+d,CAAQ,CAAA,CAChE,OAAA,CAAS,MAAO,CAAE,UAAA4N,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAqD,CACvF,IAAI8lB,CAAAA,CAAe7e,CAAAA,CACfkJ,CAAAA,CAAO,cAAA,CAAe,IAAA,CAAMsB,CAAAA,EAAUA,EAAM,IAAA,CAAKxK,CAAG,CAAC,CAAA,GACvD6e,CAAAA,CAAe,IAGjB,IAAM3iB,CAAAA,CAAW,MAAMvB,CAAAA,CAAQ,yBAAA,CAA2B,CACxD,KAAA4U,CAAAA,CACA,YAAA,CAAciI,EAAU,MAAA,CACxB,cAAA,CAAgBA,EAAU,QAAA,CAC1B,KAAA,CAAA3rB,EACA,GAAA,CAAKgzB,CAAAA,CACL,SAAAjV,CACF,CAAA,CAAG,OAAW,MAAA,CAAW7Q,CAAM,EAE/B,GAAImD,CAAAA,EAAa,IAAA,CACf,OAAO,EAAC,CAGV,GAAI,CAAC,KAAA,CAAM,QAAQA,CAAQ,CAAA,CACzB,MAAM,IAAI,KAAA,CACR,CAAA,gCAAA,EAAmC,OAAOA,CAAQ,CAAA,UAAA,EAAaqT,CAAI,CAAA,CACrE,CAAA,CAUF,OAAO+K,EAAAA,CAAgBpe,CAAmB,CAC5C,CAAA,CACA,MAAA,CAAQqiB,EAAAA,CAAchP,CAAI,CAAA,CAC1B,OAAA,CAAA+J,EACA,gBAAA,CAAkB,CAChB,OAAQ,MAAA,CACR,QAAA,CAAU,MACZ,CAAA,CACA,gBAAA,CAAmB5B,GAAsB,CAMvC,IAAM2E,EAAO3E,CAAAA,GAAWA,CAAAA,CAAS,OAAS,CAAC,CAAA,CAC3C,GAAK2E,CAAAA,CAIL,OAAO,CAAE,MAAA,CAAQA,CAAAA,CAAK,MAAA,CAAQ,SAAUA,CAAAA,CAAK,QAAS,CACxD,CACF,CAAC,CACH,CAEO,SAASyC,EAAAA,CACdvP,CAAAA,CACAkM,CAAAA,CAAuB,EAAA,CACvBC,EAAyB,EAAA,CACzB7vB,CAAAA,CAAgB,GAChBmU,CAAAA,CAAc,EAAA,CACd4J,EAAmB,EAAA,CACnB0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,eAAA,CAAgBkC,CAAAA,CAAMkM,EAAcC,CAAAA,CAAgB7vB,CAAAA,CAAOmU,EAAK4J,CAAQ,CAAA,CAClG,QAAA0P,CAAAA,CACA,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAvgB,CAAO,CAAA,CAAI,EAAC,GAAa,CACzC,IAAI8lB,CAAAA,CAAe7e,EACfkJ,CAAAA,CAAO,cAAA,CAAe,KAAMsB,CAAAA,EAAUA,CAAAA,CAAM,KAAKxK,CAAG,CAAC,CAAA,GACvD6e,CAAAA,CAAe,EAAA,CAAA,CAGjB,IAAM3iB,EAAW,MAAMsf,EAAAA,CACrBjM,EACAkM,CAAAA,CACAC,CAAAA,CACA7vB,EACAgzB,CAAAA,CACAjV,CAAAA,CACA7Q,CACF,CAAA,CAEA,OAAOuhB,EAAAA,CAAgBpe,GAAY,EAAE,CACvC,CACF,CAAC,CACH,CCxJO,SAAS6iB,EAAAA,CACdrgB,CAAAA,CACA4Q,EACAzjB,CAAAA,CAAQ,GAAA,CACR,CACA,OAAOuhB,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,QAAQ3O,CAAAA,EAAY,EAAA,CAAI7S,CAAK,CAAA,CACvD,OAAA,CAAS,UACW,MAAM8O,CAAAA,CAAQ,gCAAA,CAAkC,CAChE+D,CAAAA,EAAY4Q,CAAAA,CACZ,EACAzjB,CACF,CAAC,GAGE,MAAA,CACE,CAAA,EACC,EAAE,MAAA,GAAWyjB,CAAAA,EACb,CAAC,CAAA,CAAE,YAAA,CAAa,UAAA,CAAW,OAAO,CACtC,CAAA,CACC,IAAK,CAAA,GAAO,CAAE,OAAQ,CAAA,CAAE,MAAA,CAAQ,SAAU,CAAA,CAAE,QAAS,EAAE,CAAA,CAE5D,OAAA,CAAS,CAAC,CAAC5Q,CACb,CAAC,CACH,CCnCO,SAASsgB,EAAAA,CAA2B/P,CAAAA,CAAiBC,EAAmB,CAC7E,OAAO9B,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,WAAA,CAAY4B,CAAAA,EAAU,GAAIC,CAAAA,EAAY,EAAE,EAClE,OAAA,CAAS,SAAY,CACnB,GAAI,CAACD,CAAAA,EAAU,CAACC,CAAAA,CACd,OAAO,EAAC,CAGV,IAAMhT,EAAY,MAAMvB,CAAAA,CAAQ,iCAAkC,CAACsU,CAAAA,CAAQC,CAAQ,CAAC,CAAA,CAEpF,OAAO,KAAA,CAAM,OAAA,CAAQhT,CAAQ,CAAA,CAAIA,CAAAA,CAAW,EAC9C,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CACzB,CAAC,CACH,CCjBO,SAAS+P,GAAyB3P,CAAAA,CAAoCpb,CAAAA,CAAe,CAC1F,OAAOkZ,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,SAAA,CAAUiC,CAAc,CAAA,CAClD,QAAS,SAAY,CACnB,GAAI,CAACA,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,EAAC,CAIV,IAAMgI,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,yBAA0B,CAChF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAhV,CACF,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,8BAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,QAAS,CAAC,CAACoT,GAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CAEO,SAASgrB,EAAAA,CACd5P,EACApb,CAAAA,CACArI,CAAAA,CAAgB,GAChB,CACA,OAAO0rB,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,iBAAA,CAAkBiC,CAAAA,CAAgBzjB,CAAK,CAAA,CACjE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,CACL,IAAA,CAAM,EAAC,CACP,UAAA,CAAY,CACV,KAAA,CAAO,EACP,KAAA,CAAArI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMqQ,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,EAAGzD,EAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,CAAA,OAAA,EAAU3rB,CAAK,CAAA,CAAA,CAChG,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,IAAA,CAAAqI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGjE,IAAMub,CAAAA,CAAO,MAAMvb,CAAAA,CAAS,IAAA,GAC5B,OAAO4Q,EAAAA,CAAqC2K,EAAM5rB,CAAK,CACzD,EACA,gBAAA,CAAkB,CAAA,CAClB,iBAAmB6rB,CAAAA,EAAa,CAC9B,GAAIA,CAAAA,CAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,OAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,CAAA,CACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CC/EO,SAASirB,EAAAA,CAAsB7P,CAAAA,CAAoCpb,CAAAA,CAAe,CACvF,OAAOkZ,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,OAAOiC,CAAc,CAAA,CAC/C,QAAS,SAAY,CACnB,GAAI,CAACA,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,EAAC,CAIV,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,qBAAA,CAAuB,CAC7E,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,CACF,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,EAAS,MAAM,CAAA,CAAE,EAG9D,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,QAAS,CAAC,CAACoT,GAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CAEO,SAASkrB,EAAAA,CACd9P,CAAAA,CACApb,EACArI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAO0rB,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAeiC,CAAAA,CAAgBzjB,CAAK,EAC9D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,EACtB,OAAO,CACL,KAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,EACP,KAAA,CAAArI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMqQ,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7B,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,0CAAA,EAA6CsO,CAAS,UAAU3rB,CAAK,CAAA,CAAA,CAC7F,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAqI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,EAAS,MAAM,CAAA,CAAE,EAG9D,IAAMub,CAAAA,CAAO,MAAMvb,CAAAA,CAAS,IAAA,GAG5B,OAAO4Q,EAAAA,CAAkC2K,EAAM5rB,CAAK,CACtD,CAAA,CACA,gBAAA,CAAkB,CAAA,CAClB,gBAAA,CAAmB6rB,GAAa,CAC9B,GAAIA,EAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,MAAA,CAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,EACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CCjFA,eAAemrB,EAAAA,CAAgBnrB,EAAgD,CAE7E,IAAMgI,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,sBAAuB,CAC7E,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAhV,CACF,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,2BAA2BA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG9D,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAEO,SAASojB,EAAAA,CAAsB5gB,CAAAA,CAAmBxK,EAAe,CACtE,OAAOkZ,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAA,CACzC,OAAA,CAAS,SACH,CAACA,CAAAA,EAAY,CAACxK,CAAAA,CACT,EAAC,CAEHmrB,EAAAA,CAAgBnrB,CAAI,CAAA,CAE7B,QAAS,CAAC,CAACwK,GAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CAEO,SAASqrB,EAAAA,CAA6BjQ,CAAAA,CAAoCpb,EAAe,CAC9F,OAAOkZ,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,aAAA,CAAciC,CAAc,CAAA,CACtD,OAAA,CAAS,SACH,CAACA,CAAAA,EAAkB,CAACpb,EACf,EAAC,CAEHmrB,GAAgBnrB,CAAI,CAAA,CAE7B,QAAS,CAAC,CAACob,GAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CAEO,SAASsrB,EAAAA,CACd9gB,CAAAA,CACAxK,CAAAA,CACArI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAO0rB,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,cAAA,CAAe3O,CAAAA,CAAU7S,CAAK,CAAA,CACxD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAC9Y,CAAAA,EAAY,CAACxK,CAAAA,CAChB,OAAO,CACL,KAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,EACP,KAAA,CAAArI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMqQ,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,0CAAA,EAA6CsO,CAAS,UAAU3rB,CAAK,CAAA,CAAA,CAC7F,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAqI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,EAAS,MAAM,CAAA,CAAE,EAG9D,IAAMub,CAAAA,CAAO,MAAMvb,CAAAA,CAAS,IAAA,GAC5B,OAAO4Q,EAAAA,CAAsC2K,EAAM5rB,CAAK,CAC1D,EACA,gBAAA,CAAkB,CAAA,CAClB,gBAAA,CAAmB6rB,CAAAA,EAAa,CAC9B,GAAIA,EAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,OAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,CAAA,CACA,OAAA,CAAS,CAAC,CAAChZ,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CC/FO,SAASurB,GAA8BxQ,CAAAA,CAAgBC,CAAAA,CAAkBO,EAAW,KAAA,CAAO,CAChG,OAAOrC,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,eAAe4B,CAAAA,CAAQC,CAAAA,CAAUO,CAAQ,CAAA,CACnE,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA1W,CAAO,CAAA,GAAM,CAC7B,IAAMmD,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,8BAAA,CAAgC,CACnF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,MAAA,CAAA+F,EACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAUO,CAAAA,CAAW,GAAA,CAAM,EAC7B,CAAC,CAAA,CACD,MAAA,CAAA1W,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGvE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CACzB,CAAC,CACH,CCzBA,SAASwQ,GAAczQ,CAAAA,CAAgBC,CAAAA,CAA0B,CAC/D,IAAMyQ,CAAAA,CAAc1Q,GAAQ,IAAA,EAAK,CAC3B2L,CAAAA,CAAgB1L,CAAAA,EAAU,IAAA,EAAK,CAErC,GAAI,CAACyQ,CAAAA,EAAe,CAAC/E,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,sDAAsD,EAIxE,IAAMgF,CAAAA,CAAmBD,EAAY,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAChDE,CAAAA,CAAqBjF,EAAc,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAAA,CAE3D,GAAI,CAACgF,GAAoB,CAACC,CAAAA,CACxB,MAAM,IAAI,KAAA,CAAM,6EAA6E,CAAA,CAG/F,OAAO,CAAA,CAAA,EAAID,CAAgB,CAAA,CAAA,EAAIC,CAAkB,EACnD,CAQO,SAASC,GAA4B7Q,CAAAA,CAAgBC,CAAAA,CAAkB,CAC5E,IAAM0L,CAAAA,CAAgB1L,CAAAA,EAAU,IAAA,EAAK,CAC/ByQ,CAAAA,CAAc1Q,GAAQ,IAAA,EAAK,CAC3B8Q,EACJ,CAAC,CAACJ,GAAe,CAAC,CAAC/E,GAAiBA,CAAAA,GAAkB,WAAA,CAElD5L,EAAY+Q,CAAAA,CAAUL,EAAAA,CAAcC,EAAa/E,CAAa,CAAA,CAAI,GAExE,OAAOxN,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,aAAa2B,CAAS,CAAA,CAChD,QAAS,MAAO,CAAE,OAAAjW,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,+BAAgC,CACnF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,OAAA+F,CAAAA,CACA,QAAA,CAAU2L,GAAiB,EAC7B,CAAC,EACD,MAAA,CAAA7hB,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGvE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,OAAS8jB,CAAAA,EAAiC,CACxC,GAAI,CAACA,CAAAA,EAAS,IAAA,GAAO,CAAC,CAAA,CACpB,OAAO,KAET,GAAM,CAAE,KAAApnB,CAAAA,CAAM,KAAA,CAAAqnB,CAAAA,CAAO,IAAA,CAAArG,CAAK,CAAA,CAAIoG,EAAQ,IAAA,CAAK,CAAC,EAC5C,OAAO,CACL,KAAApnB,CAAAA,CACA,KAAA,CAAAqnB,EACA,IAAA,CAAArG,CACF,CACF,CAAA,CACA,OAAA,CAASmG,CACX,CAAC,CACH,CCpDO,SAASG,EAAAA,CAAwBjR,EAAgBC,CAAAA,CAAkBiR,CAAAA,CAAY,KAAM,CAC1F,OAAO/S,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,IAAA,CAAK4B,CAAAA,CAAQC,CAAQ,CAAA,CAC/C,OAAA,CAAS,SAAY,CACnB,IAAMtT,EAAO,CAAA,uBAAA,EAA0B,kBAAA,CAAmBqT,CAAM,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmBC,CAAQ,CAAC,CAAA,CAAA,CAC3FhT,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiBtN,CAAAA,CAAM,CACzD,MAAA,CAAQ,KAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,EAED,GAAI,CAACM,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CAAAA,EAAYiR,CAAAA,CACnC,UAAW,EAAA,CAAK,GAClB,CAAC,CACH,CClCA,SAASC,GAAmB9H,CAAAA,CAAwB9O,CAAAA,CAAyB,CAC3E,OAAO,CACL,GAAG8O,CAAAA,CACH,EAAA,CAAIA,EAAM,EAAA,EAAMA,CAAAA,CAAM,QAEtB,OAAA,CAASA,CAAAA,CAAM,OAAA,EAAYA,CAAAA,CAA4C,SAAA,CACvE,IAAA,CAAA9O,CACF,CACF,CAEA,SAAS6W,EAAAA,CAAgB/H,CAAAA,CAA+B,CACtD,OAAO,CACL,GAAGA,CAAAA,CACH,EAAA,CAAIA,CAAAA,CAAM,IAAMA,CAAAA,CAAM,OACxB,CACF,CAEO,SAASgI,GACdhI,CAAAA,CAIA9O,CAAAA,CACkB,CAClB,GAAI,CAAC8O,CAAAA,CACH,OAAO,IAAA,CAGT,IAAMiI,EAAkBjI,CAAAA,CAAM,SAAA,EAAaA,EACrCkI,CAAAA,CAAYJ,EAAAA,CAAmBG,EAAiB/W,CAAI,CAAA,CAEpDiX,EAASnI,CAAAA,CAAM,MAAA,CAAS+H,GAAgB/H,CAAAA,CAAM,MAAM,EAAI,MAAA,CAE9D,OAAO,CACL,GAAGA,CAAAA,CACH,EAAA,CAAIA,EAAM,EAAA,EAAMA,CAAAA,CAAM,QAItB,OAAA,CAASA,CAAAA,CAAM,SAAYA,CAAAA,CAA4C,SAAA,CAIvE,mBAAA,CAAqBA,CAAAA,CAAM,mBAAA,EAAuB,iBAAA,CAClD,qBAAsBA,CAAAA,CAAM,oBAAA,EAAwB,YACpD,mBAAA,CAAqBA,CAAAA,CAAM,qBAAuB,WAAA,CAClD,oBAAA,CAAsBA,CAAAA,CAAM,oBAAA,EAAwB,WAAA,CACpD,IAAA,CAAA9O,EACA,SAAA,CAAAgX,CAAAA,CACA,OAAAC,CACF,CACF,CAEO,SAASC,EAAAA,CAAa/K,EAAqB,CAChD,OAAO,MAAM,OAAA,CAAQA,CAAC,EAAKA,CAAAA,CAAgB,EAC7C,CAEA,eAAsBgL,EAAAA,CACpBH,CAAAA,CACkB,CAClB,IAAMpT,EAAesQ,EAAAA,CAA2B8C,CAAAA,CAAAA,SAAAA,CAA8B,IAAI,CAAA,CAC5EI,CAAAA,CAAqB,MAAM1X,CAAAA,CAAO,WAAA,CAAY,UAAA,CAAWkE,CAAY,CAAA,CACrEyT,CAAAA,CAAkBH,GAAaE,CAAkB,CAAA,CAEvD,GAAIC,CAAAA,CAAgB,MAAA,EAAU,EAC5B,OAAO,EAAC,CAGV,IAAMC,CAAAA,CAAkBD,CAAAA,CAAgB,OACtC,CAAC,CAAE,cAAAE,CAAAA,CAAe,eAAA,CAAAC,CAAgB,CAAA,GAChCD,CAAAA,GAAkBP,EAAU,MAAA,EAAUQ,CAAAA,GAAoBR,EAAU,QACxE,CAAA,CAEA,OAAIM,CAAAA,CAAgB,MAAA,GAAW,EACtB,EAAC,CAGWA,CAAAA,CAAgB,MAAA,CAAQnwB,CAAAA,EAAS,CAACA,EAAK,KAAA,EAAO,IAAI,CAGzE,CAEO,SAASswB,GACdC,CAAAA,CACAV,CAAAA,CACAhX,CAAAA,CACa,CACb,OAAI0X,CAAAA,CAAM,SAAW,CAAA,CACZ,GAGFA,CAAAA,CACJ,GAAA,CAAKvwB,GAAS,CACb,IAAM8vB,CAAAA,CAASS,CAAAA,CAAM,IAAA,CAClBx3B,CAAAA,EACCA,EAAE,MAAA,GAAWiH,CAAAA,CAAK,eAClBjH,CAAAA,CAAE,QAAA,GAAaiH,EAAK,eAAA,EACpBjH,CAAAA,CAAE,SAAW8f,CACjB,CAAA,CAEA,OAAO,CACL,GAAG7Y,EACH,EAAA,CAAIA,CAAAA,CAAK,QACT,IAAA,CAAA6Y,CAAAA,CACA,SAAA,CAAAgX,CAAAA,CACA,MAAA,CAAAC,CACF,CACF,CAAC,CAAA,CACA,OAAQnI,CAAAA,EAAUA,CAAAA,CAAM,UAAU,OAAA,GAAYA,CAAAA,CAAM,OAAO,CAAA,CAC3D,IAAA,CACC,CAACjpB,EAAGvF,CAAAA,GAAM,IAAI,KAAKA,CAAAA,CAAE,OAAO,EAAE,OAAA,EAAQ,CAAI,IAAI,IAAA,CAAKuF,CAAAA,CAAE,OAAO,EAAE,OAAA,EAChE,CACJ,CCjHA,IAAM8xB,GAAqB,EAAA,CAuC3B,SAASC,GAAgB5oB,CAAAA,CAA+C,CACtE,OAAO,CACL,UAAA,CAAYA,EAAO,UAAA,EAAc,GACjC,GAAA,CAAKA,CAAAA,CAAO,GAAA,EAAK,IAAA,EAAK,EAAK,MAAA,CAC3B,UAAWA,CAAAA,CAAO,SAAA,EAAW,MAAK,CAAE,WAAA,IAAiB,MAAA,CACrD,MAAA,CAAQA,CAAAA,CAAO,MAAA,EAAQ,IAAA,EAAK,CAAE,aAAY,EAAK,MAAA,CAC/C,SAAUA,CAAAA,CAAO,QAAA,EAAU,MAAK,CAAE,WAAA,EAAY,EAAK,MAAA,CACnD,KAAA,CAAOA,CAAAA,CAAO,OAAS2oB,EACzB,CACF,CAEA,eAAeE,EAAAA,CACb,CAAE,UAAA,CAAAC,CAAAA,CAAY,IAAAthB,CAAAA,CAAK,SAAA,CAAA4P,EAAW,MAAA,CAAAX,CAAAA,CAAQ,SAAArF,CAAAA,CAAU,KAAA,CAAA/d,CAAM,CAAA,CACtD01B,CAAAA,CACAxoB,CAAAA,CAC2B,CAC3B,IAAM4C,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5C7Q,EAAM,IAAI,GAAA,CAAI,0BAA2BoD,CAAO,CAAA,CACtDpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,CAAS,OAAO1M,CAAK,CAAC,EACvC01B,CAAAA,EACFhpB,CAAAA,CAAI,aAAa,GAAA,CAAI,QAAA,CAAUgpB,CAAM,CAAA,CAEvCD,CAAAA,CAAW,OAAA,CAASd,GAAcjoB,CAAAA,CAAI,YAAA,CAAa,OAAO,WAAA,CAAaioB,CAAS,CAAC,CAAA,CAC7ExgB,CAAAA,EACFzH,EAAI,YAAA,CAAa,GAAA,CAAI,MAAOyH,CAAG,CAAA,CAE7B4P,GACFrX,CAAAA,CAAI,YAAA,CAAa,IAAI,WAAA,CAAaqX,CAAS,CAAA,CAEzCX,CAAAA,EACF1W,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAU0W,CAAM,EAEnCrF,CAAAA,EACFrR,CAAAA,CAAI,aAAa,GAAA,CAAI,UAAA,CAAYqR,CAAQ,CAAA,CAG3C,IAAM1N,CAAAA,CAAW,MAAM,KAAA,CAAM3D,CAAAA,CAAI,UAAS,CAAG,CAC3C,OAAQ,KAAA,CACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,+BAA+BA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGlE,IAAMpO,EAAQ,MAAMoO,CAAAA,CAAS,MAAK,CAElC,OAAI,CAAC,KAAA,CAAM,OAAA,CAAQpO,CAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,EACnC,EAAC,CAGHA,EACJ,GAAA,CAAK0zB,CAAAA,EAAQ,CACZ,IAAMlJ,CAAAA,CAAQgI,EAAAA,CAA0BkB,CAAAA,CAAKA,CAAAA,CAAI,IAAA,EAAQ,EAAE,CAAA,CAC3D,OAAKlJ,EAGE,CAAE,GAAGA,EAAO,OAAA,CAASkJ,CAAAA,CAAI,OAAQ,CAAA,CAF/B,IAGX,CAAC,EACA,MAAA,CAAQlJ,CAAAA,EAAmC,EAAQA,CAAM,CAC9D,CAWO,SAASmJ,EAAAA,CAAyBjpB,EAA0B,EAAC,CAAG,CACrE,IAAMkpB,CAAAA,CAAaN,GAAgB5oB,CAAM,CAAA,CACnC,CAAE,UAAA,CAAA8oB,CAAAA,CAAY,GAAA,CAAAthB,CAAAA,CAAK,SAAA,CAAA4P,CAAAA,CAAW,OAAAX,CAAAA,CAAQ,QAAA,CAAArF,EAAU,KAAA,CAAA/d,CAAM,EAAI61B,CAAAA,CAEhE,OAAOnK,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,SAAA,CAAU,CAAE,WAAAiU,CAAAA,CAAY,GAAA,CAAAthB,EAAK,SAAA,CAAA4P,CAAAA,CAAW,MAAA,CAAAX,CAAAA,CAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA/d,CAAM,CAAC,EAC3F,gBAAA,CAAkB,MAAA,CAElB,QAAS,CAAC,CAAE,UAAA2rB,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAMsoB,EAAAA,CAAmBK,EAAYlK,CAAAA,CAAWze,CAAM,EAMpF,gBAAA,CAAmB2e,CAAAA,EAA+B,CAChD,GAAI,EAAAA,CAAAA,CAAS,OAAS7rB,CAAAA,CAAAA,CAGtB,OAAO6rB,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,OACxC,CACF,CAAC,CACH,CAOO,SAASiK,EAAAA,CAA+BnpB,CAAAA,CAA0B,EAAC,CAAG,CAC3E,IAAMkpB,CAAAA,CAAaN,EAAAA,CAAgB5oB,CAAM,CAAA,CACnC,CAAE,UAAA,CAAA8oB,EAAY,GAAA,CAAAthB,CAAAA,CAAK,UAAA4P,CAAAA,CAAW,MAAA,CAAAX,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA/d,CAAM,CAAA,CAAI61B,EAEhE,OAAOtU,YAAAA,CAAa,CAClB,QAAA,CAAU,CACR,GAAGC,CAAAA,CAAU,KAAA,CAAM,SAAA,CAAU,CAAE,UAAA,CAAAiU,CAAAA,CAAY,IAAAthB,CAAAA,CAAK,SAAA,CAAA4P,EAAW,MAAA,CAAAX,CAAAA,CAAQ,SAAArF,CAAAA,CAAU,KAAA,CAAA/d,CAAM,CAAC,CAAA,CACpF,QACF,EACA,SAAA,CAAW,CAAA,CACX,QAAS,CAAC,CAAE,OAAAkN,CAAO,CAAA,GAAMsoB,EAAAA,CAAmBK,CAAAA,CAAY,MAAA,CAAW3oB,CAAM,CAC3E,CAAC,CACH,CCtJA,IAAMooB,GAAqB,EAAA,CAgD3B,SAASC,GAAgB5oB,CAAAA,CAAkD,CACzE,OAAO,CACL,UAAA,CAAYA,EAAO,UAAA,EAAc,EAAC,CAClC,GAAA,CAAKA,CAAAA,CAAO,GAAA,EAAK,MAAK,EAAK,MAAA,CAC3B,OAAQA,CAAAA,CAAO,MAAA,EAAQ,MAAK,CAAE,WAAA,EAAY,EAAK,MAAA,CAC/C,QAAA,CAAUA,CAAAA,CAAO,UAAU,IAAA,EAAK,CAAE,aAAY,EAAK,MAAA,CACnD,MAAOA,CAAAA,CAAO,KAAA,EAAS2oB,EACzB,CACF,CAEA,eAAeS,GACb,CAAE,UAAA,CAAAN,EAAY,GAAA,CAAAthB,CAAAA,CAAK,OAAAiP,CAAAA,CAAQ,QAAA,CAAArF,EAAU,KAAA,CAAA/d,CAAM,EAC3C01B,CAAAA,CACAxoB,CAAAA,CAC4B,CAC5B,IAAM4C,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,2BAAA,CAA6BoD,CAAO,CAAA,CACxDpD,CAAAA,CAAI,aAAa,GAAA,CAAI,OAAA,CAAS,OAAO1M,CAAK,CAAC,CAAA,CACvC01B,CAAAA,EACFhpB,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAUgpB,CAAM,EAEvCD,CAAAA,CAAW,OAAA,CAASd,GAAcjoB,CAAAA,CAAI,YAAA,CAAa,MAAA,CAAO,WAAA,CAAaioB,CAAS,CAAC,EAC7ExgB,CAAAA,EACFzH,CAAAA,CAAI,aAAa,GAAA,CAAI,KAAA,CAAOyH,CAAG,CAAA,CAE7BiP,CAAAA,EACF1W,EAAI,YAAA,CAAa,GAAA,CAAI,SAAU0W,CAAM,CAAA,CAEnCrF,GACFrR,CAAAA,CAAI,YAAA,CAAa,IAAI,UAAA,CAAYqR,CAAQ,CAAA,CAG3C,IAAM1N,CAAAA,CAAW,MAAM,MAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQ,MACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,IAAMpO,CAAAA,CAAQ,MAAMoO,EAAS,IAAA,EAAK,CAElC,OAAI,CAAC,KAAA,CAAM,QAAQpO,CAAI,CAAA,EAAKA,EAAK,MAAA,GAAW,CAAA,CACnC,EAAC,CAGHA,CAAAA,CACJ,IAAK0zB,CAAAA,EAAQ,CACZ,IAAMlJ,CAAAA,CAAQgI,EAAAA,CAA0BkB,CAAAA,CAAKA,CAAAA,CAAI,IAAA,EAAQ,EAAE,EAC3D,OAAKlJ,CAAAA,CAGE,CACL,GAAGA,CAAAA,CAIH,aAAcA,CAAAA,CAAM,YAAA,EAAgB,EAAC,CACrC,KAAA,CAAOkJ,CAAAA,CAAI,MACX,OAAA,CAASA,CAAAA,CAAI,OACf,CAAA,CAVS,IAWX,CAAC,CAAA,CACA,MAAA,CAAQlJ,CAAAA,EAAoC,CAAA,CAAQA,CAAM,CAC/D,CAUO,SAASuJ,EAAAA,CAA0BrpB,EAA2B,EAAC,CAAG,CACvE,IAAMkpB,CAAAA,CAAaN,GAAgB5oB,CAAM,CAAA,CACnC,CAAE,UAAA,CAAA8oB,CAAAA,CAAY,IAAAthB,CAAAA,CAAK,MAAA,CAAAiP,EAAQ,QAAA,CAAArF,CAAAA,CAAU,KAAA,CAAA/d,CAAM,CAAA,CAAI61B,CAAAA,CAErD,OAAOnK,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,WAAW,CAAE,UAAA,CAAAiU,CAAAA,CAAY,GAAA,CAAAthB,CAAAA,CAAK,MAAA,CAAAiP,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA/d,CAAM,CAAC,EACjF,gBAAA,CAAkB,MAAA,CAElB,OAAA,CAAS,CAAC,CAAE,SAAA,CAAA2rB,EAAW,MAAA,CAAAze,CAAO,IAAM6oB,EAAAA,CAAoBF,CAAAA,CAAYlK,EAAWze,CAAM,CAAA,CAIrF,iBAAmB2e,CAAAA,EAAgC,CACjD,GAAI,EAAAA,CAAAA,CAAS,OAAS7rB,CAAAA,CAAAA,CAGtB,OAAO6rB,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,OACxC,CACF,CAAC,CACH,CCzIA,IAAMoK,EAAAA,CAA8B,CAAA,CAC9BC,EAAAA,CAAyB,EAAA,CAM/B,eAAeC,GACbxY,CAAAA,CACAgO,CAAAA,CAC+B,CAC/B,IAAIpI,CAAAA,CAAcoI,GAAW,MAAA,CACzBnI,CAAAA,CAAgBmI,CAAAA,EAAW,QAAA,CAC3ByK,CAAAA,CAAoB,CAAA,CACpBC,EAAkB1K,CAAAA,EAAW,OAAA,CAEjC,KAAOyK,CAAAA,CAAoBF,EAAAA,EAAwB,CASjD,IAAMI,CAAAA,CAAgC,CACpC,IAAA,CAAM,OAAA,CACN,QAAS3Y,CAAAA,CACT,KAAA,CAAOsY,GACP,GAAI1S,CAAAA,CAAc,CAAE,YAAA,CAAcA,CAAY,CAAA,CAAI,EAAC,CACnD,GAAIC,EAAgB,CAAE,cAAA,CAAgBA,CAAc,CAAA,CAAI,EAC1D,CAAA,CAEIiS,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAc,MAAM3mB,EAAQ,0BAAA,CAA4BwnB,CAAS,EACnE,CAAA,MAASvqB,CAAAA,CAAK,CACZ,OAAA,OAAA,CAAQ,KAAA,CAAM,2CAAA,CAA6CA,CAAG,CAAA,CACvD,IACT,CAEA,GAAI,CAAC0pB,GAAcA,CAAAA,CAAW,MAAA,GAAW,EACvC,OAAO,IAAA,CAGT,IAAMc,CAAAA,CAAuBd,CAAAA,CAAW,IAAKd,CAAAA,GAC3CA,CAAAA,CAAU,GAAKA,CAAAA,CAAU,OAAA,CACzBA,EAAU,IAAA,CAAOhX,CAAAA,CACVgX,CAAAA,CACR,CAAA,CAED,IAAA,IAAWA,CAAAA,IAAa4B,EAAsB,CAC5C,GAAIF,GAAmB1B,CAAAA,CAAU,OAAA,GAAY0B,EAAiB,CAC5DA,CAAAA,CAAkB,MAAA,CAClB,QACF,CAIA,GAFAD,GAAqB,CAAA,CAEjBzB,CAAAA,CAAU,OAAO,IAAA,CAAM,CACzBpR,EAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,CAAAA,CAAU,QAAA,CAC1B,QACF,CAEA,IAAI6B,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAe,MAAM1B,EAAAA,CAAgCH,CAAS,EAChE,CAAA,MAAS5oB,CAAAA,CAAK,CAMZ,OAAA,CAAQ,KAAA,CAAM,yCAA0CA,CAAG,CAAA,CAC3DwX,EAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,CAAAA,CAAU,QAAA,CAC1B,QACF,CAEA,GAAI6B,CAAAA,CAAa,SAAW,CAAA,CAAG,CAC7BjT,EAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,CAAAA,CAAU,QAAA,CAC1B,QACF,CAEA,OAAO,CACL,QAASS,EAAAA,CAA4BoB,CAAAA,CAAc7B,EAAWhX,CAAI,CACpE,CACF,CAEA,IAAM8Y,CAAAA,CAAgBF,EAAqBA,CAAAA,CAAqB,MAAA,CAAS,CAAC,CAAA,CAE1E,GAAI,CAACE,CAAAA,CACH,OAAO,KAGTlT,CAAAA,CAAckT,CAAAA,CAAc,OAC5BjT,CAAAA,CAAgBiT,CAAAA,CAAc,SAChC,CAEA,OAAO,IACT,CAMO,SAASC,EAAAA,CAA2B/Y,CAAAA,CAAc,CACvD,OAAO+N,qBAML,CACA,QAAA,CAAUlK,EAAU,KAAA,CAAM,WAAA,CAAY7D,CAAI,CAAA,CAC1C,gBAAA,CAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,UAAAgO,CAAU,CAAA,GAAkC,CAC5D,IAAMxtB,CAAAA,CAAS,MAAMg4B,EAAAA,CAAWxY,CAAAA,CAAMgO,CAAS,CAAA,CAC/C,OAAKxtB,CAAAA,CAEEA,EAAO,OAAA,CAFM,EAGtB,CAAA,CAEA,gBAAA,CAAmB0tB,GAAqCA,CAAAA,GAAW,CAAC,GAAG,SACzE,CAAC,CACH,CC9HA,IAAM8K,EAAAA,CAAyB,EAAA,CAExB,SAASC,EAAAA,CAA0BjZ,CAAAA,CAAcxJ,CAAAA,CAAanU,EAAQ22B,EAAAA,CAAwB,CACnG,OAAOjL,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,UAAA,CAAW7D,CAAAA,CAAMxJ,CAAG,CAAA,CAC9C,iBAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAjH,CAAO,CAAA,GAAM,CAC7B,GAAI,CACF,IAAM4C,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5C7Q,EAAM,IAAI,GAAA,CAAI,0BAA2BoD,CAAO,CAAA,CACtDpD,EAAI,YAAA,CAAa,GAAA,CAAI,YAAaiR,CAAI,CAAA,CACtCjR,EAAI,YAAA,CAAa,GAAA,CAAI,MAAOyH,CAAG,CAAA,CAE/B,IAAM9D,CAAAA,CAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAUpE,OAAA,CAPa,MAAMA,EAAS,IAAA,EAAK,EAG9B,MAAM,CAAA,CAAGrQ,CAAK,EACd,GAAA,CAAKysB,CAAAA,EAAUgI,GAA0BhI,CAAAA,CAAO9O,CAAI,CAAC,CAAA,CACrD,MAAA,CAAQ8O,GAA8B,CAAA,CAAQA,CAAM,CAAA,CAEzC,IAAA,CACZ,CAACjpB,CAAAA,CAAGvF,IAAM,IAAI,IAAA,CAAKA,EAAE,OAAO,CAAA,CAAE,SAAQ,CAAI,IAAI,IAAA,CAAKuF,CAAAA,CAAE,OAAO,CAAA,CAAE,SAChE,CACF,OAASsC,CAAAA,CAAO,CACd,eAAQ,KAAA,CAAM,oCAAA,CAAsCA,CAAK,CAAA,CAClD,EACT,CACF,CAAA,CAEA,gBAAA,CAAkB,IAAG,CAAA,CACvB,CAAC,CACH,CC5CO,SAAS+wB,EAAAA,CAA8BlZ,CAAAA,CAAc9K,EAAmB,CAC7E,IAAMikB,EAAqBjkB,CAAAA,EAAU,IAAA,EAAK,CAAE,WAAA,EAAY,CAExD,OAAO6Y,qBAAqB,CAC1B,QAAA,CAAUlK,EAAU,KAAA,CAAM,cAAA,CAAe7D,EAAMmZ,CAAAA,EAAsB,EAAE,CAAA,CACvE,OAAA,CAAS,CAAA,CAAQA,CAAAA,CACjB,iBAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA5pB,CAAO,CAAA,GAAM,CAC7B,GAAI,CAAC4pB,CAAAA,CACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAMhnB,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5C7Q,EAAM,IAAI,GAAA,CAAI,+BAAgCoD,CAAO,CAAA,CAC3DpD,EAAI,YAAA,CAAa,GAAA,CAAI,YAAaiR,CAAI,CAAA,CACtCjR,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,CAAYoqB,CAAkB,CAAA,CAEnD,IAAMzmB,EAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyCA,EAAS,MAAM,CAAA,CAAE,EAG5E,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,GAE5B,GAAI,CAAC,MAAM,OAAA,CAAQpO,CAAI,GAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAC1C,OAAO,EAAC,CAGV,IAAM80B,CAAAA,CAAY90B,CAAAA,CACf,IAAKwqB,CAAAA,EAAUgI,EAAAA,CAA0BhI,EAAO9O,CAAI,CAAC,CAAA,CACrD,MAAA,CAAQ8O,CAAAA,EAA8B,CAAA,CAAQA,CAAM,CAAA,CAEvD,OAAIsK,EAAU,MAAA,GAAW,CAAA,CAChB,EAAC,CAGHA,CAAAA,CAAU,IAAA,CACf,CAACvzB,CAAAA,CAAGvF,CAAAA,GAAM,IAAI,IAAA,CAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,GAAY,IAAI,IAAA,CAAKuF,EAAE,OAAO,CAAA,CAAE,SAChE,CACF,OAASsC,CAAAA,CAAO,CACd,eAAQ,KAAA,CAAM,4CAAA,CAA8CA,CAAK,CAAA,CAC1D,EACT,CACF,CAAA,CAEA,gBAAA,CAAkB,IAAG,CAAA,CACvB,CAAC,CACH,CC1DO,SAASkxB,GAAiCrZ,CAAAA,CAAekG,CAAAA,CAAQ,GAAI,CAE1E,IAAM8Q,EAAYhX,CAAAA,EAAM,IAAA,EAAK,EAAK,MAAA,CAElC,OAAO4D,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,iBAAA,CAAkBmT,CAAAA,EAAa,GAAI9Q,CAAK,CAAA,CAClE,QAAS,MAAO,CAAE,OAAA3W,CAAO,CAAA,GAAkC,CACzD,GAAI,CACF,IAAM4C,CAAAA,CAAUyN,CAAAA,CAAc,mBAAA,EAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,IAAI,kCAAA,CAAoCoD,CAAO,EAC3D6kB,CAAAA,EACFjoB,CAAAA,CAAI,aAAa,GAAA,CAAI,WAAA,CAAaioB,CAAS,CAAA,CAE7CjoB,CAAAA,CAAI,YAAA,CAAa,IAAI,OAAA,CAASmX,CAAAA,CAAM,UAAU,CAAA,CAE9C,IAAMxT,CAAAA,CAAW,MAAM,KAAA,CAAM3D,CAAAA,CAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,OAAAQ,CACF,CAAC,EAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwCA,EAAS,MAAM,CAAA,CAAE,EAK3E,OAAA,CAFa,MAAMA,CAAAA,CAAS,IAAA,EAAK,EAErB,GAAA,CAAI,CAAC,CAAE,GAAA,CAAA8D,EAAK,KAAA,CAAAqb,CAAM,KAAO,CAAE,GAAA,CAAArb,CAAAA,CAAK,KAAA,CAAAqb,CAAM,CAAA,CAAE,CACtD,CAAA,MAAS1pB,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,4CAA6CA,CAAK,CAAA,CACzD,EACT,CACF,CACF,CAAC,CACH,CC/BO,SAASmxB,EAAAA,CAA8BtZ,EAAc9K,CAAAA,CAAmB,CAC7E,IAAMikB,CAAAA,CAAqBjkB,CAAAA,EAAU,MAAK,CAAE,WAAA,GAE5C,OAAO6Y,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,eAAe7D,CAAAA,CAAMmZ,CAAAA,EAAsB,EAAE,CAAA,CACvE,OAAA,CAAS,EAAQA,CAAAA,CACjB,gBAAA,CAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,OAAA5pB,CAAO,CAAA,GAAM,CAC7B,GAAI,CAAC4pB,EACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAMhnB,EAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,4BAAA,CAA8BoD,CAAO,EACzDpD,CAAAA,CAAI,YAAA,CAAa,IAAI,WAAA,CAAaiR,CAAI,EACtCjR,CAAAA,CAAI,YAAA,CAAa,IAAI,UAAA,CAAYoqB,CAAkB,CAAA,CAEnD,IAAMzmB,CAAAA,CAAW,MAAM,MAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQ,MACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsCA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGzE,IAAMpO,CAAAA,CAAO,MAAMoO,EAAS,IAAA,EAAK,CAEjC,GAAI,CAAC,KAAA,CAAM,QAAQpO,CAAI,CAAA,EAAKA,EAAK,MAAA,GAAW,CAAA,CAC1C,OAAO,EAAC,CAGV,IAAM80B,CAAAA,CAAY90B,CAAAA,CACf,IAAKwqB,CAAAA,EAAUgI,EAAAA,CAA0BhI,CAAAA,CAAO9O,CAAI,CAAC,CAAA,CACrD,OAAQ8O,CAAAA,EAA8B,CAAA,CAAQA,CAAM,CAAA,CAEvD,OAAIsK,EAAU,MAAA,GAAW,CAAA,CAChB,EAAC,CAGHA,CAAAA,CAAU,IAAA,CACf,CAACvzB,CAAAA,CAAGvF,CAAAA,GAAM,IAAI,IAAA,CAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAAQ,CAAI,IAAI,IAAA,CAAKuF,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAChE,CACF,CAAA,MAASsC,EAAO,CACd,MAAA,OAAA,CAAQ,MAAM,yCAAA,CAA2CA,CAAK,EACxDA,CACR,CACF,EAEA,gBAAA,CAAkB,IAAG,EACvB,CAAC,CACH,CC5DO,SAASoxB,EAAAA,CAAoCvZ,EAAc,CAChE,OAAO4D,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,oBAAA,CAAqB7D,CAAI,EACnD,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAzQ,CAAO,IAAqC,CAC5D,GAAI,CACF,IAAM4C,CAAAA,CAAUyN,CAAAA,CAAc,qBAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,qCAAA,CAAuCoD,CAAO,CAAA,CAClEpD,CAAAA,CAAI,aAAa,GAAA,CAAI,WAAA,CAAaiR,CAAI,CAAA,CAEtC,IAAMtN,EAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,GACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2CA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAK9E,OAAA,CAFa,MAAMA,CAAAA,CAAS,IAAA,IAEhB,GAAA,CAAI,CAAC,CAAE,MAAA,CAAA+S,CAAAA,CAAQ,KAAA,CAAAoM,CAAM,CAAA,IAAO,CAAE,OAAApM,CAAAA,CAAQ,KAAA,CAAAoM,CAAM,CAAA,CAAE,CAC5D,OAAS1pB,CAAAA,CAAO,CACd,cAAQ,KAAA,CAAM,8CAAA,CAAgDA,CAAK,CAAA,CAC7DA,CACR,CACF,CACF,CAAC,CACH,CC1BO,SAASqxB,GACd/H,CAAAA,CACA3B,CAAAA,CAAU,KACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,SAAA,CAAU4N,CAAAA,EAAM,QAAU,EAAA,CAAIA,CAAAA,EAAM,UAAY,EAAE,CAAA,CAC5E,OAAA,CAAS3B,CAAAA,EAAW,CAAC,CAAC2B,EACtB,OAAA,CAAS,SAAYqB,GAAcrB,CAAI,CACzC,CAAC,CACH,CCsBA,SAASgI,EAAAA,CAAQtN,CAAAA,CAAwB,CACvC,OACE,CAAC,CAACA,CAAAA,EACF,OAAOA,GAAM,QAAA,EACb,QAAA,GAAYA,CAAAA,EACZ,UAAA,GAAcA,CAAAA,EACd,cAAA,GAAkBA,CAEtB,CAKA,SAASuN,GAAQC,CAAAA,CAA6B,CAC5C,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAKD,CAAW,CAAA,CAGjC,OAAA,CAFY,IAAI,IAAA,EAAK,CACF,SAAQ,CAAIC,CAAAA,CAAK,SAAQ,GAC3B,GAAA,CAAO,EAAA,CAAK,EAAA,CAAK,EAAA,CACpC,CAUO,SAASC,EAAAA,CACd3kB,CAAAA,CACApB,EAKA,CACA,GAAM,CAAE,KAAA,CAAAzR,CAAAA,CAAQ,GAAI,OAAA,CAAAy3B,CAAAA,CAAU,EAAC,CAAG,QAAA,CAAAC,EAAW,CAAI,CAAA,CAAIjmB,GAAW,EAAC,CAEjE,OAAOia,oBAAAA,CAML,CACA,QAAA,CAAUlK,EAAU,QAAA,CAAS,WAAA,CAAY3O,EAAU7S,CAAK,CAAA,CACxD,iBAAkB,CAAE,KAAA,CAAO,EAAG,CAAA,CAE9B,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAU,IAA2C,CACrE,GAAM,CAAE,KAAA,CAAArrB,CAAM,CAAA,CAAIqrB,CAAAA,CAEZtb,CAAAA,CAAY,MAAMvB,EAAQ,mCAAA,CAAqC,CAAC+D,EAAUvS,CAAAA,CAAON,CAAAA,CAAO,GAAGy3B,CAAO,CAAC,EAQnGt5B,CAAAA,CANqCkS,CAAAA,CAAS,IAAI,CAAC,CAACye,EAAK6I,CAAU,CAAA,IAAO,CAC9E,GAAGA,CAAAA,CAAW,EAAA,CAAG,CAAC,CAAA,CAClB,GAAA,CAAA7I,EACA,SAAA,CAAW6I,CAAAA,CAAW,SACxB,CAAA,CAAE,CAAA,CAE2B,OAC1BC,CAAAA,EACCA,CAAAA,CAAS,KAAA,GAAU/kB,CAAAA,EACnB+kB,CAAAA,CAAS,MAAA,GAAW,GACpBP,EAAAA,CAAQO,CAAAA,CAAS,SAAS,CAAA,EAAKF,CACnC,EAEMG,CAAAA,CAAmB,EAAC,CAC1B,IAAA,IAAWtiB,CAAAA,IAAOpX,CAAAA,CAAQ,CACxB,IAAMixB,CAAAA,CAAO,MAAM/R,CAAAA,CAAO,WAAA,CAAY,WACpCwR,EAAAA,CAAoBtZ,CAAAA,CAAI,OAAQA,CAAAA,CAAI,QAAQ,CAC9C,CAAA,CACI6hB,EAAAA,CAAQhI,CAAI,CAAA,EAAGyI,CAAAA,CAAQ,KAAKzI,CAAI,EACtC,CAEA,GAAM,CAAC0I,CAAY,EAAIznB,CAAAA,CAEvB,OAAO,CACL,QAAA,CAAUynB,CAAAA,CAAeT,GAAQS,CAAAA,CAAa,CAAC,CAAA,CAAE,SAAS,CAAA,CAAI,CAAA,CAC9D,gBAAiBA,CAAAA,CAAeA,CAAAA,CAAa,CAAC,CAAA,CAAIx3B,CAAAA,CAClD,QAAAu3B,CACF,CACF,CAAA,CAEA,gBAAA,CAAmBhM,CAAAA,GAAqD,CACtE,MAAOA,CAAAA,CAAS,eAClB,EACF,CAAC,CACH,CCtHO,SAASkM,GACdxT,CAAAA,CACAxG,CAAAA,CACA0P,EAAU,IAAA,CACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,QAAA,CAAS+C,EAAUxG,CAAAA,EAAY,EAAE,EAC9D,OAAA,CAAS0P,CAAAA,EAAWlJ,EAAS,MAAA,CAAS,CAAA,CACtC,OAAA,CAAS,SAAYuM,EAAAA,CAAYvM,CAAAA,CAAUxG,CAAQ,CACrD,CAAC,CACH,CCkBO,SAASia,EAAAA,CACdnlB,CAAAA,CACA8S,CAAAA,CAA4B,OAC5BH,CAAAA,CAAW,GAAA,CACX,CACA,OAAOkG,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,OAAO,cAAA,CACzB3O,CAAAA,EAAY,GACZ8S,CAAAA,CACAH,CACF,EACA,gBAAA,CAAkB,IAAA,CAElB,QAAS,MAAO,CAAE,SAAA,CAAAmG,CAAAA,CAAW,MAAA,CAAAze,CAAO,IAAM,CACxC,GAAI,CAAC2F,CAAAA,CACH,OAAO,CAAE,OAAA,CAAS,EAAC,CAAG,WAAA,CAAa,CAAE,CAAA,CAGvC,IAAMlG,CAAAA,CAA0C,CAC9C,eAAgBkG,CAAAA,CAChB,WAAA,CAAa8S,EACb,WAAA,CAAaH,CAAAA,CACb,SAAA,CAAW,MACb,CAAA,CAIImG,CAAAA,GAAc,OAChBhf,CAAAA,CAAO,IAAA,CAAOgf,GAGhB,IAAMtb,CAAAA,CAAY,MAAMZ,EAAAA,CACtB,SAAA,CACA,2CACA9C,CAAAA,CACA,MAAA,CACA,OACAO,CACF,CAAA,CAEA,OAAO,CACL,OAAA,CAASmD,EAAS,iBAAA,CAClB,WAAA,CAAasb,CAAAA,EAAatb,CAAAA,CAAS,WACrC,CACF,EAEA,gBAAA,CAAmBwb,CAAAA,EAAa,CAE9B,IAAMqB,CAAAA,CAAWrB,EAAS,WAAA,CAAc,CAAA,CACxC,OAAOqB,CAAAA,EAAY,CAAA,CAAIA,CAAAA,CAAW,MACpC,CAAA,CAEA,OAAA,CAAS,CAAC,CAACra,CACb,CAAC,CACH,CC7EO,SAASolB,EAAAA,CACdplB,CAAAA,CACA8S,EAA4B,MAAA,CAC5BC,CAAAA,CAA6C,SAC7C,CACA,OAAOrE,aAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,iBAAA,CACzB3O,GAAY,EAAA,CACZ8S,CAAAA,CACAC,CACF,CAAA,CAEA,OAAA,CAAS,SACF/S,CAAAA,CAIG,MAAMpD,EAAAA,CACZ,UACA,6CAAA,CACA,CACE,eAAgBoD,CAAAA,CAChB,WAAA,CAAa8S,EACb,WAAA,CAAAC,CACF,CACF,CAAA,CAXS,EAAC,CAcZ,QAAS,CAAC,CAAC/S,EACX,SAAA,CAAW,GACb,CAAC,CACH,CC1BO,SAASqlB,EAAAA,EAA4B,CAC1C,OAAO3W,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,YAAW,CACxC,OAAA,CAAS,SAAY,CACnB,IAAMnR,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,0BAAA,CAA4B,CAC/E,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,gCAAgCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGnE,OAAOA,EAAS,IAAA,EAClB,CAAA,CACA,SAAA,CAAW,GAAA,CAAS,GACtB,CAAC,CACH,CAGO,SAAS8nB,EAAAA,CAAcC,CAAAA,CAAiC,CAC7D,OAAO,IAAI,KAAKA,CAAAA,EAAW,IAAI,GAAA,CAAKC,CAAAA,EAAMA,EAAE,WAAA,EAAa,CAAC,CAC5D,CCmBO,SAASC,EAAAA,CACdzlB,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,IAAM6d,EAAcC,cAAAA,EAAe,CAE7B,CAAE,IAAA,CAAAv2B,CAAK,CAAA,CAAIie,QAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE9D,OAAO+I,EACL,CAAC,UAAA,CAAY,QAAQ,CAAA,CACrB/I,CAAAA,CACCmJ,CAAAA,EAA8B,CAQ7B,IAAMnD,CAAAA,CAAUgQ,GACd0P,CAAAA,CAAY,YAAA,CACV/Q,EAA2B3U,CAAQ,CAAA,CAAE,QACvC,CAAA,CACA5Q,CACF,EAEA,GAAI,CAAC4W,EACH,MAAM,IAAI,MAAM,2DAAsD,CAAA,CAGxE,OAAO,CACL,CACE,iBAAA,CACA,CACE,OAAA,CAAShG,CAAAA,CACT,cAAe,EAAA,CACf,UAAA,CAAY,EAAC,CAIb,qBAAA,CAAuBqW,GAAyB,CAC9C,2BAAA,CAA6BrQ,CAAAA,CAAQ,qBAAA,CACrC,OAAA,CAASmD,CAAAA,CAAQ,QACjB,MAAA,CAAQA,CAAAA,CAAQ,MAClB,CAAC,CACH,CACF,CACF,CACF,CAAA,CACA,MAAOyc,CAAAA,CAAgBC,CAAAA,GAAgC,CAErDH,CAAAA,CAAY,YAAA,CACV/Q,EAA2B3U,CAAQ,CAAA,CAAE,SACpC5Q,CAAAA,EAAS,CACR,GAAI,CAACA,CAAAA,CACH,OAAOA,CAAAA,CAGT,IAAMsT,EAAM,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAUtT,CAAI,CAAC,CAAA,CAC3C,OAAAsT,CAAAA,CAAI,QAAUgU,EAAAA,CAAqB,CACjC,gBAAiBX,EAAAA,CAAsB3mB,CAAI,EAC3C,OAAA,CAASy2B,CAAAA,CAAU,OAAA,CACnB,MAAA,CAAQA,CAAAA,CAAU,MACpB,CAAC,CAAA,CAEMnjB,CACT,CACF,CAAA,CAGA,MAAM+G,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CACAyH,EACA,MAAA,CACA,CACE,cAAAI,CAAAA,CAMA,QAAA,CAAU,SAAY,CACpB,GAAK7H,EAGL,GAAI,CACF,MAAM0lB,CAAAA,CAAY,UAAA,CAAW,CAC3B,GAAG/Q,CAAAA,CAA2B3U,CAAQ,EACtC,SAAA,CAAW,CACb,CAAC,EACH,CAAA,KAAQ,CAER,CACF,CACF,CACF,CACF,CC3JO,SAAS8lB,EAAAA,CACdlU,CAAAA,CACAllB,EACA+a,CAAAA,CACAwB,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAY,UAAA,CAAY,QAAA,CAAU0I,EAAWllB,CAAM,CAAA,CACjE,WAAY,MAAOs5B,CAAAA,EAAe,CAChC,IAAMC,CAAAA,CAAiBxN,GACrB7G,CAAAA,CACAllB,CACF,EACA,MAAMmgB,CAAAA,EAAe,CAAE,aAAA,CAAcoZ,CAAc,CAAA,CACnD,IAAMC,CAAAA,CAAiBrZ,CAAAA,GAAiB,YAAA,CACtCoZ,CAAAA,CAAe,QACjB,CAAA,CAEA,OAAA,MAAM3c,EAAAA,CACJsI,CAAAA,CACA,QAAA,CACA,CACA,SACA,CACE,QAAA,CAAUA,EACV,SAAA,CAAWllB,CAAAA,CACX,KAAM,CACJ,GAAIs5B,CAAAA,GAAS,eAAA,EAAmB,CAACE,CAAAA,EAAgB,QAC7C,CAAC,QAAQ,EACT,EAAC,CACL,GAAIF,CAAAA,GAAS,eAAA,EAAmB,CAACE,CAAAA,EAAgB,OAAA,CAC7C,CAAC,MAAM,CAAA,CACP,EACN,CACF,CACA,CAAA,CACAze,CACF,CAAA,CAEO,CACL,GAAGye,CAAAA,CACH,QACEF,CAAAA,GAAS,eAAA,CACL,CAACE,CAAAA,EAAgB,OAAA,CACjBA,GAAgB,OAAA,CACtB,OAAA,CACEF,CAAAA,GAAS,eAAA,CACL,CAACE,CAAAA,EAAgB,QACjBA,CAAAA,EAAgB,OACxB,CACF,CAAA,CACA,OAAA,CAAAH,EACA,SAAA,CAAU32B,CAAAA,CAAM,CACd6Z,CAAAA,CAAU7Z,CAAI,CAAA,CAEdyd,GAAe,CAAE,YAAA,CACf8B,EAAU,QAAA,CAAS,SAAA,CAAUiD,EAAYllB,CAAO,CAAA,CAChD0C,CACF,CAAA,CAII1C,CAAAA,EACFmgB,GAAe,CAAE,iBAAA,CACf8H,EAA2BjoB,CAAM,CACnC,EAEJ,CACF,CAAC,CACH,CC/DO,SAASy5B,EAAAA,CACdnU,EACAzB,CAAAA,CACAC,CAAAA,CACA4V,EACW,CACX,GAAI,CAACpU,CAAAA,EAAS,CAACzB,CAAAA,EAAU,CAACC,CAAAA,CACxB,MAAM,IAAI,KAAA,CAAM,gDAAgD,EAElE,GAAI4V,CAAAA,CAAS,MAAUA,CAAAA,CAAS,GAAA,CAC9B,MAAM,IAAI,KAAA,CAAM,4DAA4D,EAG9E,OAAO,CACL,OACA,CACE,KAAA,CAAApU,EACA,MAAA,CAAAzB,CAAAA,CACA,SAAAC,CAAAA,CACA,MAAA,CAAA4V,CACF,CACF,CACF,CAaO,SAASC,EAAAA,CACd9V,EACAC,CAAAA,CACA8V,CAAAA,CACAC,CAAAA,CACAhF,CAAAA,CACArnB,CAAAA,CACAgd,CAAAA,CACW,CAEX,GAAI,CAAC3G,GAAU,CAACC,CAAAA,EAAY+V,IAAmB,MAAA,EAAa,CAACrsB,CAAAA,CAC3D,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAGrE,OAAO,CACL,SAAA,CACA,CACE,cAAeosB,CAAAA,CACf,eAAA,CAAiBC,CAAAA,CACjB,MAAA,CAAAhW,CAAAA,CACA,QAAA,CAAAC,EACA,KAAA,CAAA+Q,CAAAA,CACA,KAAArnB,CAAAA,CACA,aAAA,CAAe,KAAK,SAAA,CAAUgd,CAAY,CAC5C,CACF,CACF,CAaO,SAASsP,EAAAA,CACdjW,EACAC,CAAAA,CACAiW,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACtW,GAAU,CAACC,CAAAA,CACd,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,MAAA,CAAAD,EACA,QAAA,CAAAC,CAAAA,CACA,oBAAqBiW,CAAAA,CACrB,WAAA,CAAaC,EACb,WAAA,CAAaC,CAAAA,CACb,sBAAA,CAAwBC,CAAAA,CACxB,UAAA,CAAAC,CACF,CACF,CACF,CAQO,SAASC,EAAAA,CAAqBvW,CAAAA,CAAgBC,EAA6B,CAChF,GAAI,CAACD,CAAAA,EAAU,CAACC,EACd,MAAM,IAAI,MAAM,yDAAyD,CAAA,CAG3E,OAAO,CACL,gBAAA,CACA,CACE,MAAA,CAAAD,CAAAA,CACA,QAAA,CAAAC,CACF,CACF,CACF,CAUO,SAASuW,EAAAA,CACd/gB,EACAuK,CAAAA,CACAC,CAAAA,CACAwW,CAAAA,CAAwB,KAAA,CACb,CACX,GAAI,CAAChhB,CAAAA,EAAW,CAACuK,GAAU,CAACC,CAAAA,CAC1B,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAGpE,IAAMuI,CAAAA,CAAY,CAChB,OAAA,CAAA/S,CAAAA,CACA,OAAAuK,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,CAEA,OAAIwW,IACFjO,CAAAA,CAAK,MAAA,CAAS,UAGT,CACL,aAAA,CACA,CACE,EAAA,CAAI,QAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,QAAA,CAAUA,CAAI,CAAC,EACrC,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAAC/S,CAAO,CAClC,CACF,CACF,CC9JO,SAASihB,EAAAA,CACdzjB,EACAC,CAAAA,CACA3S,CAAAA,CACAiS,EACW,CACX,GAAI,CAACS,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,oDAAoD,EAGtE,OAAO,CACL,WACA,CACE,IAAA,CAAA0S,EACA,EAAA,CAAAC,CAAAA,CACA,OAAA3S,CAAAA,CACA,IAAA,CAAMiS,GAAQ,EAChB,CACF,CACF,CAUO,SAASmkB,EAAAA,CACd1jB,CAAAA,CACA2jB,CAAAA,CACAr2B,CAAAA,CACAiS,EACa,CACb,GAAI,CAACS,CAAAA,EAAQ,CAAC2jB,GAAgB,CAACr2B,CAAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,0DAA0D,EAU5E,OANkBq2B,CAAAA,CACf,MAAK,CACL,KAAA,CAAM,QAAQ,CAAA,CACd,MAAA,CAAO,OAAO,CAAA,CAGA,GAAA,CAAKC,CAAAA,EACpBH,GAAgBzjB,CAAAA,CAAM4jB,CAAAA,CAAK,MAAK,CAAGt2B,CAAAA,CAAQiS,CAAI,CACjD,CACF,CAYO,SAASskB,EAAAA,CACd7jB,EACAC,CAAAA,CACA3S,CAAAA,CACAiS,EACAukB,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAAC/jB,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,EACnB,MAAM,IAAI,MAAM,6DAA6D,CAAA,CAE/E,GAAIw2B,CAAAA,CAAa,EAAA,CACf,MAAM,IAAI,KAAA,CAAM,sEAAsE,EAGxF,OAAO,CACL,qBACA,CACE,IAAA,CAAA9jB,EACA,EAAA,CAAAC,CAAAA,CACA,MAAA,CAAA3S,CAAAA,CACA,IAAA,CAAMiS,CAAAA,EAAQ,GACd,UAAA,CAAAukB,CAAAA,CACA,WAAAC,CAAAA,CACA,UAAA,CAAY,EACd,CACF,CACF,CAUO,SAASC,GACdhkB,CAAAA,CACAC,CAAAA,CACA3S,EACAiS,CAAAA,CACW,CACX,GAAI,CAACS,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA,CAG/E,OAAO,CACL,qBAAA,CACA,CACE,IAAA,CAAA0S,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,OAAA3S,CAAAA,CACA,IAAA,CAAMiS,GAAQ,EAChB,CACF,CACF,CAWO,SAAS0kB,EAAAA,CACdjkB,CAAAA,CACAC,CAAAA,CACA3S,CAAAA,CACAiS,EACA2kB,CAAAA,CACW,CACX,GAAI,CAAClkB,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,GAAU42B,CAAAA,GAAc,MAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,+DAA+D,CAAA,CAGjF,OAAO,CACL,uBAAA,CACA,CACE,IAAA,CAAAlkB,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,OAAA3S,CAAAA,CACA,IAAA,CAAMiS,GAAQ,EAAA,CACd,UAAA,CAAY2kB,CACd,CACF,CACF,CAQO,SAASC,EAAAA,CACdnkB,CAAAA,CACAkkB,EACW,CACX,GAAI,CAAClkB,CAAAA,EAAQkkB,CAAAA,GAAc,OACzB,MAAM,IAAI,KAAA,CAAM,qEAAqE,CAAA,CAGvF,OAAO,CACL,8BAAA,CACA,CACE,KAAAlkB,CAAAA,CACA,UAAA,CAAYkkB,CACd,CACF,CACF,CAYO,SAASE,EAAAA,CACdpkB,EACAC,CAAAA,CACA3S,CAAAA,CACAiS,EACA2kB,CAAAA,CACa,CACb,GAAI,CAAClkB,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,EAAU42B,IAAc,MAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,0DAA0D,EAG5E,OAAO,CACLD,EAAAA,CAA2BjkB,CAAAA,CAAMC,CAAAA,CAAI3S,CAAAA,CAAQiS,EAAM2kB,CAAS,CAAA,CAC5DC,GAAiCnkB,CAAAA,CAAMkkB,CAAS,CAClD,CACF,CASO,SAASG,EAAAA,CACdrkB,CAAAA,CACAC,CAAAA,CACA3S,EACW,CACX,GAAI,CAAC0S,CAAAA,EAAQ,CAACC,GAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA,CAG/E,OAAO,CACL,qBAAA,CACA,CACE,KAAA0S,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,MAAA,CAAA3S,CACF,CACF,CACF,CAQO,SAASg3B,GACd9hB,CAAAA,CACA+hB,CAAAA,CACW,CACX,GAAI,CAAC/hB,CAAAA,EAAW,CAAC+hB,CAAAA,CACf,MAAM,IAAI,KAAA,CAAM,2DAA2D,EAG7E,OAAO,CACL,mBACA,CACE,OAAA,CAAA/hB,CAAAA,CACA,cAAA,CAAgB+hB,CAClB,CACF,CACF,CASO,SAASC,GACdC,CAAAA,CACAC,CAAAA,CACAH,EACW,CACX,GAAI,CAACE,CAAAA,EAAa,CAACC,GAAa,CAACH,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,yBAAA,CACA,CACE,SAAA,CAAAE,EACA,SAAA,CAAAC,CAAAA,CACA,eAAgBH,CAClB,CACF,CACF,CAUO,SAASI,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,EACW,CACX,GAAI,CAACH,CAAAA,EAAe,CAACC,GAAaC,CAAAA,GAAY,MAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,mEAAmE,EAErF,GAAIA,CAAAA,CAAU,GAAKA,CAAAA,CAAU,GAAA,CAC3B,MAAM,IAAI,KAAA,CAAM,2EAA2E,CAAA,CAG7F,OAAO,CACL,4BAAA,CACA,CACE,aAAcF,CAAAA,CACd,UAAA,CAAYC,EACZ,OAAA,CAAAC,CAAAA,CACA,SAAA,CAAWC,CACb,CACF,CACF,CASO,SAASC,EAAAA,CACdzjB,EACAjU,CAAAA,CACA42B,CAAAA,CACW,CACX,GAAI,CAAC3iB,CAAAA,EAAS,CAACjU,CAAAA,EAAU42B,CAAAA,GAAc,OACrC,MAAM,IAAI,MAAM,mDAAmD,CAAA,CAGrE,OAAO,CACL,SAAA,CACA,CACE,KAAA,CAAA3iB,CAAAA,CACA,MAAA,CAAAjU,EACA,SAAA,CAAW42B,CACb,CACF,CACF,CASO,SAASe,EAAAA,CACd1jB,CAAAA,CACAjU,EACA42B,CAAAA,CACW,CACX,GAAI,CAAC3iB,CAAAA,EAAS,CAACjU,CAAAA,EAAU42B,CAAAA,GAAc,OACrC,MAAM,IAAI,KAAA,CAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,wBAAA,CACA,CACE,MAAA3iB,CAAAA,CACA,MAAA,CAAAjU,EACA,SAAA,CAAW42B,CACb,CACF,CACF,CAUO,SAASgB,GACdllB,CAAAA,CACAmlB,CAAAA,CACAC,EACAC,CAAAA,CAAe,QAAA,CACJ,CACX,OAAO,CAAC,aAAA,CAAe,CACrB,EAAA,CAAI,kBAAA,CACJ,eAAgB,CAACrlB,CAAI,EACrB,sBAAA,CAAwB,GACxB,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,YAAA,CAAAqlB,EAAc,cAAA,CAAAF,CAAAA,CAAgB,gBAAAC,CAAgB,CAAC,CACxE,CAAC,CACH,CAQO,SAASE,EAAAA,CACd9iB,CAAAA,CACA1N,EACW,CACX,OAAO,CAAC,aAAA,CAAe,CACrB,GAAI,kBAAA,CACJ,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAC0N,CAAO,CAAA,CAChC,IAAA,CAAM,KAAK,SAAA,CAAU1N,CAAAA,CAAO,IAAKvH,CAAAA,GAAY,CAAE,MAAA,CAAAA,CAAO,CAAA,CAAE,CAAC,CAC3D,CAAC,CACH,CASO,SAASg4B,EAAAA,CACdvlB,EACAwlB,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACzlB,GAAQ,CAACwlB,CAAAA,EAAcC,IAAU,MAAA,CACpC,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA,CAGxE,IAAMC,CAAAA,CAAiBF,CAAAA,CAAW,SAAS,GAAG,CAAA,CAC1CA,EAAW,KAAA,CAAM,GAAG,EAAE,GAAA,CAAKnxB,CAAAA,EAAMA,CAAAA,CAAE,IAAA,EAAM,CAAA,CACzC,CAACmxB,CAAU,CAAA,CAEf,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,IAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,cACA,CACE,IAAA,CAAAxlB,EACA,UAAA,CAAY0lB,CAAAA,CACZ,OAAQD,CACV,CACF,CAAC,CAAA,CACD,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACzlB,CAAI,CAC/B,CACF,CACF,CCtbO,SAAS2lB,EAAAA,CAAc7X,CAAAA,CAAkBJ,CAAAA,CAA8B,CAC5E,GAAI,CAACI,GAAY,CAACJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAGpE,OAAO,CACL,cACA,CACE,EAAA,CAAI,SACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,QAAA,CACA,CACE,QAAA,CAAAI,CAAAA,CACA,SAAA,CAAAJ,EACA,IAAA,CAAM,CAAC,MAAM,CACf,CACF,CAAC,CAAA,CACD,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAAS8X,EAAAA,CAAgB9X,CAAAA,CAAkBJ,CAAAA,CAA8B,CAC9E,GAAI,CAACI,GAAY,CAACJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAGtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,SACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,QAAA,CACA,CACE,QAAA,CAAAI,CAAAA,CACA,SAAA,CAAAJ,CAAAA,CACA,IAAA,CAAM,EACR,CACF,CAAC,EACD,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAAS+X,GAAc/X,CAAAA,CAAkBJ,CAAAA,CAA8B,CAC5E,GAAI,CAACI,CAAAA,EAAY,CAACJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAAkD,EAGpE,OAAO,CACL,cACA,CACE,EAAA,CAAI,QAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,QAAA,CACA,CACE,SAAAI,CAAAA,CACA,SAAA,CAAAJ,EACA,IAAA,CAAM,CAAC,QAAQ,CACjB,CACF,CAAC,EACD,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAASgY,GAAgBhY,CAAAA,CAAkBJ,CAAAA,CAA8B,CAC9E,GAAI,CAACI,GAAY,CAACJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,oDAAoD,EAGtE,OAAOkY,EAAAA,CAAgB9X,EAAUJ,CAAS,CAC5C,CAQO,SAASqY,EAAAA,CAAoBvpB,CAAAA,CAAkBwpB,CAAAA,CAA4B,CAChF,GAAI,CAACxpB,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wDAAwD,EAG1E,IAAMypB,CAAAA,CAAeD,CAAAA,EAAQ,IAAI,IAAA,EAAK,CAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAE5DE,CAAAA,CAAsB,CAC1B,cACA,CACE,EAAA,CAAI,SACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CAAC,aAAA,CAAe,CAAE,IAAA,CAAMD,CAAa,CAAC,CAAC,CAAA,CAC5D,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACzpB,CAAQ,CACnC,CACF,CAAA,CAEM2pB,CAAAA,CAA4B,CAChC,aAAA,CACA,CACE,EAAA,CAAI,gBACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CAAC,aAAA,CAAe,CAAE,IAAA,CAAMF,CAAa,CAAC,CAAC,CAAA,CAC5D,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACzpB,CAAQ,CACnC,CACF,CAAA,CAEA,OAAO,CAAC0pB,CAAAA,CAAUC,CAAc,CAClC,CChIO,SAASC,GACd5jB,CAAAA,CACAyM,CAAAA,CACAoX,EACW,CACX,GAAI,CAAC7jB,CAAAA,EAAW,CAACyM,CAAAA,EAAWoX,IAAY,MAAA,CACtC,MAAM,IAAI,KAAA,CAAM,uDAAuD,EAGzE,OAAO,CACL,sBAAA,CACA,CACE,OAAA,CAAA7jB,CAAAA,CACA,QAAAyM,CAAAA,CACA,OAAA,CAAAoX,CACF,CACF,CACF,CAQO,SAASC,EAAAA,CAAoB9jB,CAAAA,CAAiB+jB,CAAAA,CAA0B,CAC7E,GAAI,CAAC/jB,CAAAA,EAAW+jB,CAAAA,GAAU,OACxB,MAAM,IAAI,MAAM,wDAAwD,CAAA,CAG1E,OAAO,CACL,uBAAA,CACA,CACE,OAAA,CAAA/jB,CAAAA,CACA,MAAA+jB,CACF,CACF,CACF,CAoBO,SAASC,EAAAA,CACdC,CAAAA,CACA9gB,CAAAA,CACW,CAEX,GACE,CAAC8gB,CAAAA,EACD,CAAC9gB,CAAAA,CAAQ,QAAA,EACT,CAACA,CAAAA,CAAQ,OAAA,EACT,CAACA,CAAAA,CAAQ,QAAA,EACT,CAACA,EAAQ,KAAA,EACT,CAACA,EAAQ,GAAA,EACT,CAACA,EAAQ,QAAA,CAET,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAI5E,IAAMkK,CAAAA,CAAY,IAAI,KAAKlK,CAAAA,CAAQ,KAAK,EAClCmK,CAAAA,CAAU,IAAI,KAAKnK,CAAAA,CAAQ,GAAG,EACpC,GAAIkK,CAAAA,CAAU,UAAS,GAAM,cAAA,EAAkBC,EAAQ,QAAA,EAAS,GAAM,cAAA,CACpE,MAAM,IAAI,KAAA,CACR,gGACF,CAAA,CAGF,OAAO,CACL,iBAAA,CACA,CACE,QAAA2W,CAAAA,CACA,QAAA,CAAU9gB,CAAAA,CAAQ,QAAA,CAClB,UAAA,CAAYA,CAAAA,CAAQ,MACpB,QAAA,CAAUA,CAAAA,CAAQ,IAClB,SAAA,CAAWA,CAAAA,CAAQ,SACnB,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,QAAA,CAAUA,CAAAA,CAAQ,QAAA,CAClB,WAAY,EACd,CACF,CACF,CASO,SAAS+gB,EAAAA,CACdlY,CAAAA,CACAmY,EACAN,CAAAA,CACW,CACX,GAAI,CAAC7X,CAAAA,EAAS,CAACmY,CAAAA,EAAeA,CAAAA,CAAY,SAAW,CAAA,EAAKN,CAAAA,GAAY,MAAA,CACpE,MAAM,IAAI,KAAA,CAAM,wDAAwD,CAAA,CAG1E,OAAO,CACL,uBAAA,CACA,CACE,MAAA7X,CAAAA,CACA,YAAA,CAAcmY,CAAAA,CACd,OAAA,CAAAN,CAAAA,CACA,UAAA,CAAY,EACd,CACF,CACF,CAQO,SAASO,GACdC,CAAAA,CACAF,CAAAA,CACW,CACX,GAAI,CAACE,CAAAA,EAAiB,CAACF,CAAAA,EAAeA,CAAAA,CAAY,SAAW,CAAA,CAC3D,MAAM,IAAI,KAAA,CAAM,0DAA0D,EAG5E,OAAO,CACL,kBACA,CACE,cAAA,CAAgBE,EAChB,YAAA,CAAcF,CAAAA,CACd,WAAY,EACd,CACF,CACF,CAWO,SAASG,GACdvY,CAAAA,CACAkY,CAAAA,CACAM,EACAC,CAAAA,CACAha,CAAAA,CACW,CAGX,GAEEuB,CAAAA,EAAe,IAAA,EACf,OAAOA,CAAAA,EAAe,QAAA,EACtB,CAACkY,CAAAA,EACD,CAACM,GACD,CAACC,CAAAA,EACD,CAACha,CAAAA,CAED,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,WAAA,CAAauB,CAAAA,CACb,QAAAkY,CAAAA,CACA,SAAA,CAAWM,EACX,OAAA,CAAAC,CAAAA,CACA,SAAAha,CAAAA,CACA,UAAA,CAAY,EACd,CACF,CACF,CC/LO,SAASia,EAAAA,CAAiBzqB,CAAAA,CAAkB+d,CAAAA,CAA8B,CAC/E,GAAI,CAAC/d,CAAAA,EAAY,CAAC+d,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAGvE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,WAAA,CAAa,CAAE,SAAA,CAAAA,CAAU,CAAC,CAAC,EACjD,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAAC/d,CAAQ,CACnC,CACF,CACF,CAQO,SAAS0qB,GAAmB1qB,CAAAA,CAAkB+d,CAAAA,CAA8B,CACjF,GAAI,CAAC/d,GAAY,CAAC+d,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,uDAAuD,EAGzE,OAAO,CACL,cACA,CACE,EAAA,CAAI,YACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,aAAA,CAAe,CAAE,UAAAA,CAAU,CAAC,CAAC,CAAA,CACnD,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAC/d,CAAQ,CACnC,CACF,CACF,CAUO,SAAS2qB,GACd3qB,CAAAA,CACA+d,CAAAA,CACA/X,EACA9F,CAAAA,CACW,CACX,GAAI,CAACF,CAAAA,EAAY,CAAC+d,CAAAA,EAAa,CAAC/X,GAAW,CAAC9F,CAAAA,CAC1C,MAAM,IAAI,KAAA,CACR,CAAA,4DAAA,EAA+DF,CAAQ,CAAA,YAAA,EAAe+d,CAAS,aAAa/X,CAAO,CAAA,OAAA,EAAU9F,CAAI,CAAA,CACnI,CAAA,CAGF,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CAAC,UAAW,CAAE,SAAA,CAAA6d,EAAW,OAAA,CAAA/X,CAAAA,CAAS,IAAA,CAAA9F,CAAK,CAAC,CAAC,EAC9D,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACF,CAAQ,CACnC,CACF,CACF,CAqBO,SAAS4qB,GACd5qB,CAAAA,CACA+d,CAAAA,CACAjf,EACW,CACX,GAAI,CAACkB,CAAAA,EAAY,CAAC+d,CAAAA,EAAa,CAACjf,CAAAA,CAC9B,MAAM,IAAI,KAAA,CAAM,2DAA2D,EAG7E,OAAO,CACL,cACA,CACE,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,aAAA,CAAe,CAAE,UAAAif,CAAAA,CAAW,KAAA,CAAAjf,CAAM,CAAC,CAAC,CAAA,CAC1D,cAAA,CAAgB,EAAC,CACjB,uBAAwB,CAACkB,CAAQ,CACnC,CACF,CACF,CAWO,SAAS6qB,EAAAA,CACd7qB,EACA+d,CAAAA,CACA/X,CAAAA,CACAwK,EACAsa,CAAAA,CACW,CACX,GAAI,CAAC9qB,CAAAA,EAAY,CAAC+d,CAAAA,EAAa,CAAC/X,CAAAA,EAAW,CAACwK,CAAAA,EAAYsa,CAAAA,GAAQ,OAC9D,MAAM,IAAI,MAAM,mDAAmD,CAAA,CAKrE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CANVA,EAAM,SAAA,CAAY,WAAA,CAMC,CAAE,SAAA,CAAA/M,CAAAA,CAAW,OAAA,CAAA/X,CAAAA,CAAS,QAAA,CAAAwK,CAAS,CAAC,CAAC,CAAA,CAC/D,eAAgB,EAAC,CACjB,uBAAwB,CAACxQ,CAAQ,CACnC,CACF,CACF,CAYO,SAAS+qB,EAAAA,CACd/qB,EACA+d,CAAAA,CACA/X,CAAAA,CACAwK,EACAwa,CAAAA,CACAC,CAAAA,CACW,CACX,GACE,CAACjrB,CAAAA,EACD,CAAC+d,CAAAA,EACD,CAAC/X,GACD,CAACwK,CAAAA,EACDya,IAAS,MAAA,CAET,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAKtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CANVA,CAAAA,CAAO,UAAA,CAAa,YAAA,CAMD,CAAE,SAAA,CAAAlN,CAAAA,CAAW,QAAA/X,CAAAA,CAAS,QAAA,CAAAwK,EAAU,KAAA,CAAAwa,CAAM,CAAC,CAAC,CAAA,CACtE,eAAgB,EAAC,CACjB,uBAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CAWO,SAASkrB,EAAAA,CACdlrB,CAAAA,CACA+d,EACA/X,CAAAA,CACAglB,CAAAA,CACAC,EACW,CACX,GAAI,CAACjrB,CAAAA,EAAY,CAAC+d,CAAAA,EAAa,CAAC/X,CAAAA,EAAWilB,CAAAA,GAAS,OAClD,MAAM,IAAI,MAAM,oDAAoD,CAAA,CAKtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CANVA,EAAO,UAAA,CAAa,YAAA,CAMD,CAAE,SAAA,CAAAlN,CAAAA,CAAW,QAAA/X,CAAAA,CAAS,KAAA,CAAAglB,CAAM,CAAC,CAAC,EAC5D,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CAWO,SAASmrB,EAAAA,CACdnrB,EACA+d,CAAAA,CACA/X,CAAAA,CACAwK,EACAwa,CAAAA,CACW,CACX,GAAI,CAAChrB,CAAAA,EAAY,CAAC+d,GAAa,CAAC/X,CAAAA,EAAW,CAACwK,CAAAA,CAC1C,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAGtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,UAAA,CAAY,CAAE,UAAAuN,CAAAA,CAAW,OAAA,CAAA/X,EAAS,QAAA,CAAAwK,CAAAA,CAAU,MAAAwa,CAAM,CAAC,CAAC,CAAA,CAC1E,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CCvPO,IAAKorB,QACVA,CAAAA,CAAA,GAAA,CAAM,KAAA,CACNA,CAAAA,CAAA,IAAA,CAAO,MAAA,CAFGA,QAAA,EAAA,CAAA,CAQAC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,KAAA,CAAQ,EAAA,CACRA,EAAA,IAAA,CAAO,GAAA,CAFGA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EAeL,SAASC,EAAAA,CACdvmB,EACAwmB,CAAAA,CACAC,CAAAA,CACAC,EACA5sB,CAAAA,CACA6sB,CAAAA,CACW,CACX,GAAI,CAAC3mB,GAAS,CAACwmB,CAAAA,EAAgB,CAACC,CAAAA,EAAgB,CAAC3sB,GAAc6sB,CAAAA,GAAY,MAAA,CACzE,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,qBACA,CACE,KAAA,CAAA3mB,EACA,OAAA,CAAS2mB,CAAAA,CACT,eAAgBH,CAAAA,CAChB,cAAA,CAAgBC,CAAAA,CAChB,YAAA,CAAcC,CAAAA,CACd,UAAA,CAAA5sB,CACF,CACF,CACF,CAKA,SAAS8sB,EAAAA,CAAav/B,EAAew/B,CAAAA,CAAmB,CAAA,CAAW,CACjE,OAAOx/B,CAAAA,CAAM,OAAA,CAAQw/B,CAAQ,CAC/B,CAqBO,SAASC,EAAAA,CACd9mB,CAAAA,CACAwmB,EACAC,CAAAA,CACAM,CAAAA,CACAC,EAA0B,EAAA,CACf,CAEX,GACE,CAAChnB,CAAAA,EACD+mB,IAAc,MAAA,EACd,CAAC,OAAO,QAAA,CAASP,CAAY,CAAA,EAC7BA,CAAAA,EAAgB,CAAA,EAChB,CAAC,OAAO,QAAA,CAASC,CAAY,GAC7BA,CAAAA,EAAgB,CAAA,CAEhB,MAAM,IAAI,KAAA,CAAM,sEAAsE,CAAA,CAIxF,IAAM3sB,CAAAA,CAAa,IAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CACtCA,EAAW,OAAA,CAAQA,CAAAA,CAAW,OAAA,EAAQ,CAAI,EAAE,CAAA,CAC5C,IAAMmtB,CAAAA,CAAgBntB,CAAAA,CAAW,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAGrD6sB,CAAAA,CAAU,CACd,GAAGK,CAAQ,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,KAAI,CAAI,GAAI,CAAA,CACvC,QAAA,EAAS,CACT,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAMPE,EACJH,CAAAA,GAAc,KAAA,CACV,GAAGH,EAAAA,CAAaJ,CAAAA,CAAc,CAAC,CAAC,CAAA,IAAA,CAAA,CAChC,CAAA,EAAGI,GAAaJ,CAAAA,CAAc,CAAC,CAAC,CAAA,KAAA,CAAA,CAEhCW,CAAAA,CACJJ,IAAc,KAAA,CACV,CAAA,EAAGH,EAAAA,CAAaH,CAAAA,CAAc,CAAC,CAAC,QAChC,CAAA,EAAGG,EAAAA,CAAaH,EAAc,CAAC,CAAC,OAEtC,OAAOF,EAAAA,CACLvmB,EACAknB,CAAAA,CACAC,CAAAA,CACA,MACAF,CAAAA,CACAN,CACF,CACF,CAQO,SAASS,GAAwBpnB,CAAAA,CAAe2mB,CAAAA,CAA4B,CACjF,GAAI,CAAC3mB,CAAAA,EAAS2mB,IAAY,MAAA,CACxB,MAAM,IAAI,KAAA,CAAM,4DAA4D,EAG9E,OAAO,CACL,oBAAA,CACA,CACE,KAAA,CAAA3mB,CAAAA,CACA,QAAS2mB,CACX,CACF,CACF,CAUO,SAASU,GACdpmB,CAAAA,CACAqmB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACvmB,CAAAA,EAAW,CAACqmB,GAAc,CAACC,CAAAA,EAAa,CAACC,CAAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,8DAA8D,EAGhF,OAAO,CACL,uBACA,CACE,OAAA,CAAAvmB,EACA,WAAA,CAAaqmB,CAAAA,CACb,UAAA,CAAYC,CAAAA,CACZ,YAAA,CAAcC,CAChB,CACF,CACF,CCtKO,SAASC,EAAAA,CACdxmB,CAAAA,CACAjB,EACA0nB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAzV,CAAAA,CACW,CACX,GAAI,CAAClR,CAAAA,EAAW,CAAC2mB,EACf,MAAM,IAAI,MAAM,yDAAyD,CAAA,CAG3E,OAAO,CACL,gBAAA,CACA,CACE,QAAA3mB,CAAAA,CACA,KAAA,CAAAjB,EACA,MAAA,CAAA0nB,CAAAA,CACA,QAAAC,CAAAA,CACA,QAAA,CAAUC,EACV,aAAA,CAAezV,CACjB,CACF,CACF,CAUO,SAAS0V,EAAAA,CACd5mB,CAAAA,CACAkR,EACApB,CAAAA,CACA+Q,CAAAA,CACW,CACX,GAAI,CAAC7gB,CAAAA,EAAW8P,IAAwB,MAAA,CACtC,MAAM,IAAI,KAAA,CAAM,0DAA0D,EAG5E,OAAO,CACL,iBAAA,CACA,CACE,OAAA,CAAA9P,CAAAA,CACA,cAAekR,CAAAA,EAAgB,EAAA,CAC/B,sBAAuBpB,CAAAA,CACvB,UAAA,CAAa+Q,GAAc,EAC7B,CACF,CACF,CAoBO,SAASgG,GACd5C,CAAAA,CACA6C,CAAAA,CACA3tB,EACA4tB,CAAAA,CACW,CACX,GAAI,CAAC9C,CAAAA,EAAW,CAAC6C,CAAAA,EAAkB,CAAC3tB,GAAQ,CAAC4tB,CAAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAG3E,IAAMhoB,CAAAA,CAAmB,CACvB,gBAAA,CAAkB,CAAA,CAClB,cAAe,EAAC,CAChB,UAAW,CAAC,CAAC5F,EAAK,cAAA,CAAgB,CAAC,CAAC,CACtC,CAAA,CAEMstB,CAAAA,CAAoB,CACxB,gBAAA,CAAkB,CAAA,CAClB,cAAe,EAAC,CAChB,UAAW,CAAC,CAACttB,CAAAA,CAAK,eAAA,CAAiB,CAAC,CAAC,CACvC,CAAA,CAEMutB,CAAAA,CAAqB,CACzB,gBAAA,CAAkB,CAAA,CAClB,cAAe,CAAC,CAAC,aAAc,CAAC,CAAC,EACjC,SAAA,CAAW,CAAC,CAACvtB,CAAAA,CAAK,gBAAA,CAAkB,CAAC,CAAC,CACxC,CAAA,CAEA,OAAO,CACL,gBAAA,CACA,CACE,OAAA,CAAA8qB,CAAAA,CACA,iBAAkB6C,CAAAA,CAClB,KAAA,CAAA/nB,EACA,MAAA,CAAA0nB,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAUvtB,CAAAA,CAAK,cACf,aAAA,CAAe,EAAA,CACf,IAAA4tB,CACF,CACF,CACF,CASO,SAASC,EAAAA,CACd/C,CAAAA,CACA6C,CAAAA,CACA3tB,CAAAA,CACW,CACX,GAAI,CAAC8qB,GAAW,CAAC6C,CAAAA,EAAkB,CAAC3tB,CAAAA,CAClC,MAAM,IAAI,KAAA,CAAM,gEAAgE,EAGlF,IAAM4F,CAAAA,CAAmB,CACvB,gBAAA,CAAkB,CAAA,CAClB,cAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAAC5F,CAAAA,CAAK,eAAgB,CAAC,CAAC,CACtC,CAAA,CAEMstB,CAAAA,CAAoB,CACxB,gBAAA,CAAkB,CAAA,CAClB,aAAA,CAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAACttB,CAAAA,CAAK,gBAAiB,CAAC,CAAC,CACvC,CAAA,CAEMutB,CAAAA,CAAqB,CACzB,gBAAA,CAAkB,CAAA,CAClB,aAAA,CAAe,CAAC,CAAC,YAAA,CAAc,CAAC,CAAC,CAAA,CACjC,UAAW,CAAC,CAACvtB,EAAK,gBAAA,CAAkB,CAAC,CAAC,CACxC,CAAA,CAEA,OAAO,CACL,wBAAA,CACA,CACE,OAAA,CAAA8qB,CAAAA,CACA,gBAAA,CAAkB6C,CAAAA,CAClB,KAAA,CAAA/nB,CAAAA,CACA,OAAA0nB,CAAAA,CACA,OAAA,CAAAC,EACA,QAAA,CAAUvtB,CAAAA,CAAK,cACf,aAAA,CAAe,EAAA,CACf,UAAA,CAAY,EACd,CACF,CACF,CAQO,SAAS8tB,GAAoBhD,CAAAA,CAAiB8C,CAAAA,CAAwB,CAC3E,GAAI,CAAC9C,CAAAA,EAAW,CAAC8C,CAAAA,CACf,MAAM,IAAI,KAAA,CAAM,wDAAwD,EAG1E,OAAO,CACL,gBACA,CACE,OAAA,CAAA9C,EACA,GAAA,CAAA8C,CAAAA,CACA,WAAY,EACd,CACF,CACF,CAaO,SAASG,EAAAA,CACdlnB,CAAAA,CACAmnB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAV,CAAAA,CACAzV,EACW,CACX,GAAI,CAAClR,CAAAA,EAAW,CAACmnB,GAAkB,CAACC,CAAAA,EAAkB,CAACT,CAAAA,CACrD,MAAM,IAAI,MAAM,kEAAkE,CAAA,CAIpF,IAAMW,CAAAA,CAAgBH,CAAAA,CAAe,cAAc,SAAA,CACjD,CAAC,CAAC1T,CAAG,CAAA,GAAMA,CAAAA,GAAQ2T,CACrB,CAAA,CAEMG,CAAAA,CAAkB,CAAC,GAAGJ,CAAAA,CAAe,aAAa,CAAA,CACpDG,CAAAA,EAAiB,EAEnBC,CAAAA,CAAgBD,CAAa,EAAI,CAACF,CAAAA,CAAgBC,CAAe,CAAA,CAGjEE,CAAAA,CAAgB,KAAK,CAACH,CAAAA,CAAgBC,CAAe,CAAC,CAAA,CAGxD,IAAMG,EAAwB,CAC5B,GAAGL,EACH,aAAA,CAAeI,CACjB,EAGA,OAAAC,CAAAA,CAAW,aAAA,CAAc,IAAA,CAAK,CAAC78B,CAAAA,CAAGvF,IAAOuF,CAAAA,CAAE,CAAC,EAAIvF,CAAAA,CAAE,CAAC,EAAI,CAAA,CAAI,EAAG,CAAA,CAEvD,CACL,gBAAA,CACA,CACE,QAAA4a,CAAAA,CACA,OAAA,CAASwnB,EACT,QAAA,CAAUb,CAAAA,CACV,cAAezV,CACjB,CACF,CACF,CAYO,SAASuW,GACdznB,CAAAA,CACAmnB,CAAAA,CACAO,EACAf,CAAAA,CACAzV,CAAAA,CACW,CACX,GAAI,CAAClR,CAAAA,EAAW,CAACmnB,CAAAA,EAAkB,CAACO,GAAkB,CAACf,CAAAA,CACrD,MAAM,IAAI,KAAA,CAAM,mEAAmE,CAAA,CAGrF,IAAMa,CAAAA,CAAwB,CAC5B,GAAGL,CAAAA,CACH,cAAeA,CAAAA,CAAe,aAAA,CAAc,OAC1C,CAAC,CAAC1T,CAAG,CAAA,GAAMA,CAAAA,GAAQiU,CACrB,CACF,CAAA,CAEA,OAAO,CACL,gBAAA,CACA,CACE,QAAA1nB,CAAAA,CACA,OAAA,CAASwnB,EACT,QAAA,CAAUb,CAAAA,CACV,cAAezV,CACjB,CACF,CACF,CASO,SAASyW,GACdC,CAAAA,CACAC,CAAAA,CACAhH,EAAoB,EAAC,CACV,CACX,GAAI,CAAC+G,CAAAA,EAAoB,CAACC,CAAAA,CACxB,MAAM,IAAI,KAAA,CAAM,iEAAiE,EAGnF,OAAO,CACL,yBAAA,CACA,CACE,kBAAA,CAAoBD,CAAAA,CACpB,qBAAsBC,CAAAA,CACtB,UAAA,CAAYhH,CACd,CACF,CACF,CAUO,SAASiH,EAAAA,CACdC,CAAAA,CACAH,CAAAA,CACAI,CAAAA,CACAnH,CAAAA,CAAoB,EAAC,CACV,CACX,GAAI,CAACkH,CAAAA,EAAmB,CAACH,CAAAA,EAAoB,CAACI,EAC5C,MAAM,IAAI,MAAM,kEAAkE,CAAA,CAGpF,OAAO,CACL,0BAAA,CACA,CACE,gBAAA,CAAkBD,CAAAA,CAClB,kBAAA,CAAoBH,CAAAA,CACpB,mBAAA,CAAqBI,CAAAA,CACrB,WAAYnH,CACd,CACF,CACF,CAUO,SAASoH,GACdL,CAAAA,CACAI,CAAAA,CACAE,CAAAA,CACArH,CAAAA,CAAoB,EAAC,CACV,CACX,GAAI,CAAC+G,GAAoB,CAACI,CAAAA,EAAqB,CAACE,CAAAA,CAC9C,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,kBAAA,CAAoBN,CAAAA,CACpB,oBAAqBI,CAAAA,CACrB,sBAAA,CAAwBE,EACxB,UAAA,CAAYrH,CACd,CACF,CACF,CC/WO,SAASsH,EAAAA,CACdtb,CAAAA,CACA7M,EACAiG,CAAAA,CACW,CAEX,GAAI,CAAC4G,CAAAA,EAAQ,CAAC7M,GAAW,CAAC,MAAA,CAAO,SAASiG,CAAQ,CAAA,CAChD,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAGvE,OAAO,CACL,cACA,CACE,EAAA,CAAI,oBACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAA4G,CAAAA,CACA,OAAA,CAAA7M,CAAAA,CACA,QAAA,CAAAiG,CACF,CAAC,CAAA,CACD,eAAgB,CAAC4G,CAAI,EACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAaO,SAASub,EAAAA,CAAoBvb,EAAc5G,CAAAA,CAA6B,CAC7E,GAAI,CAAC4G,CAAAA,EAAQ,CAAC,MAAA,CAAO,SAAA,CAAU5G,CAAQ,GAAKA,CAAAA,EAAY,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,uBACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAA4G,EACA,QAAA,CAAA5G,CACF,CAAC,CAAA,CACD,cAAA,CAAgB,CAAC4G,CAAI,CAAA,CACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASwb,GACdxb,CAAAA,CACAtC,CAAAA,CACAC,EACAvE,CAAAA,CACW,CAEX,GAAI,CAAC4G,CAAAA,EAAQ,CAACtC,CAAAA,EAAU,CAACC,CAAAA,EAAY,CAAC,MAAA,CAAO,QAAA,CAASvE,CAAQ,CAAA,CAC5D,MAAM,IAAI,KAAA,CAAM,mDAAmD,EAGrE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,gBAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAA4G,CAAAA,CACA,OAAAtC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAvE,CACF,CAAC,EACD,cAAA,CAAgB,CAAC4G,CAAI,CAAA,CACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASyb,GACdC,CAAAA,CACAC,CAAAA,CACA19B,EACAiS,CAAAA,CACW,CACX,GAAI,CAACwrB,CAAAA,EAAU,CAACC,CAAAA,EAAY,CAAC19B,CAAAA,CAC3B,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAI3E,IAAM29B,EAAmB39B,CAAAA,CAAO,OAAA,CAAQ,UAAA,CAAY,OAAO,CAAA,CAE3D,OAAO,CACL,aAAA,CACA,CACE,GAAI,uBAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,MAAA,CAAAy9B,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,OAAQC,CAAAA,CACR,IAAA,CAAM1rB,GAAQ,EAChB,CAAC,EACD,cAAA,CAAgB,CAACwrB,CAAM,CAAA,CACvB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASG,GACdH,CAAAA,CACApH,CAAAA,CACAr2B,CAAAA,CACAiS,CAAAA,CACa,CACb,GAAI,CAACwrB,CAAAA,EAAU,CAACpH,GAAgB,CAACr2B,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,+DAA+D,CAAA,CAIjF,IAAM69B,CAAAA,CAAYxH,EACf,IAAA,EAAK,CACL,MAAM,QAAQ,CAAA,CACd,OAAO,OAAO,CAAA,CAGjB,GAAIwH,CAAAA,CAAU,MAAA,GAAW,CAAA,CACvB,MAAM,IAAI,KAAA,CAAM,8DAA8D,CAAA,CAIhF,OAAOA,EAAU,GAAA,CAAKvH,CAAAA,EACpBkH,GAAqBC,CAAAA,CAAQnH,CAAAA,CAAK,MAAK,CAAGt2B,CAAAA,CAAQiS,CAAI,CACxD,CACF,CAOO,SAAS6rB,EAAAA,CAA6B/c,CAAAA,CAAyB,CACpE,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,qBAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAA,CACF,CAAC,EACD,cAAA,CAAgB,CAACA,CAAI,CAAA,CACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASgd,EAAAA,CACd7uB,EACAxM,CAAAA,CACAulB,CAAAA,CACW,CACX,GAAI,CAAC/Y,GAAY,CAACxM,CAAAA,EAAe,CAACulB,CAAAA,CAChC,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAIvlB,CAAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAUulB,CAAI,CAAA,CACzB,cAAA,CAAgB,CAAC/Y,CAAQ,CAAA,CACzB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAAS8uB,GACd9uB,CAAAA,CACAxM,CAAAA,CACAulB,CAAAA,CACW,CACX,GAAI,CAAC/Y,GAAY,CAACxM,CAAAA,EAAe,CAACulB,CAAAA,CAChC,MAAM,IAAI,KAAA,CAAM,6DAA6D,EAG/E,OAAO,CACL,cACA,CACE,EAAA,CAAIvlB,EACJ,IAAA,CAAM,IAAA,CAAK,UAAUulB,CAAI,CAAA,CACzB,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAC/Y,CAAQ,CACnC,CACF,CACF,CClNO,SAAS+uB,EAAAA,CACd/uB,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,EACL,CAAC,UAAA,CAAY,QAAQ,CAAA,CACrB/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAAkR,CAAU,CAAA,GAAM,CACjBiY,EAAAA,CAAcnpB,EAAWkR,CAAS,CACpC,EACA,MAAO8d,CAAAA,CAAcnJ,IAAc,CAEjC,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,SAAA,CAAU3O,CAAAA,CAAW6lB,EAAU,SAAS,CAAA,CAC3DlX,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,SAAS,CAAA,CAC3ClX,CAAAA,CAAU,SAAS,WAAA,CAAYkX,CAAAA,CAAU,SAAS,CAAA,CAClDlX,CAAAA,CAAU,QAAA,CAAS,WAAA,CAAY3O,CAAS,CAC1C,CAAC,EACH,CAAA,CACAyH,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCxBO,SAASonB,GACdjvB,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,UAAA,CAAY,UAAU,CAAA,CACvB/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAAkR,CAAU,CAAA,GAAM,CACjBkY,GAAgBppB,CAAAA,CAAWkR,CAAS,CACtC,CAAA,CACA,MAAO8d,CAAAA,CAAcnJ,IAAc,CAEjC,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,SAAA,CAAU3O,CAAAA,CAAW6lB,CAAAA,CAAU,SAAS,CAAA,CAC3DlX,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,SAAS,CAAA,CAC3ClX,CAAAA,CAAU,QAAA,CAAS,WAAA,CAAYkX,CAAAA,CAAU,SAAS,EAClDlX,CAAAA,CAAU,QAAA,CAAS,YAAY3O,CAAS,CAC1C,CAAC,EACH,CAAA,CACAyH,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC3DO,SAASqnB,EAAAA,CACdlvB,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,WAAA,CAAa,KAAA,CAAOlJ,CAAQ,EACtD,UAAA,CAAY,MAAO,CAAE,MAAA,CAAAuQ,CAAAA,CAAQ,SAAAC,CAAS,CAAA,GAAe,CACnD,GAAI,CAACxQ,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,EAkB5D,OAAA,CAdiB,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,4BAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,MAAA,CAAA+F,CAAAA,CACA,SAAAC,CAAAA,CACA,IAAA,CAAAhb,CACF,CAAC,CACH,CACF,CAAA,EACgB,IAAA,EAClB,EACA,SAAA,CAAW,IAAM,CACfyT,CAAAA,EAAU,CACV4D,GAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU,CAAC,UAAA,CAAY,YAAa7M,CAAQ,CAC9C,CAAC,EACH,CAAA,CACA,QAAA+lB,CACF,CAAC,CACH,CC3CO,SAASoJ,EAAAA,CACdnvB,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,YAAa,CAAC,UAAA,CAAY,YAAa,QAAA,CAAUlJ,CAAQ,EACzD,UAAA,CAAY,MAAOovB,CAAAA,EAAuB,CACxC,GAAI,CAACpvB,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAiB5D,OAAA,CAbiB,MADAyY,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,eAAiB,+BAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,EAAA,CAAI4kB,EACJ,IAAA,CAAA55B,CACF,CAAC,CACH,CACF,CAAA,EACgB,IAAA,EAClB,CAAA,CACA,UAAW,IAAM,CACfyT,GAAU,CACV4D,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,QAAA,CAAU,CAAC,UAAA,CAAY,WAAA,CAAa7M,CAAQ,CAC9C,CAAC,EACH,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCrCO,SAASsJ,EAAAA,CACdrvB,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,EACA,CACA,OAAO7c,YAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,WAAA,CAAa,MAAOlJ,CAAQ,CAAA,CACtD,WAAY,MAAOgG,CAAAA,EAAoB,CACrC,GAAI,CAAChG,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,EAiB5D,OAAA,CAbiB,MADAyY,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,6BACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,QAAAxE,CAAAA,CACA,IAAA,CAAAxQ,CACF,CAAC,CACH,CACF,CAAA,EACgB,IAAA,EAClB,CAAA,CACA,SAAA,CAAW,CAACowB,CAAAA,CAAO5f,CAAAA,GAAY,CAC7BiD,CAAAA,EAAU,CACV,IAAMqmB,CAAAA,CAAKziB,CAAAA,EAAe,CAC1ByiB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,QAAA,CAAS,UAAU3O,CAAQ,CAAE,CAAC,CAAA,CACzEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,SAAS,iBAAA,CAAkB3O,CAAQ,CAAE,CAAC,CAAA,CACjFsvB,EAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc3O,EAAWgG,CAAO,CAAE,CAAC,EACzF,CAAA,CACA,QAAA+f,CACF,CAAC,CACH,CCpCO,SAASwJ,EAAAA,CACdvvB,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,YAAa,CAAC,UAAA,CAAY,YAAa,QAAA,CAAUlJ,CAAQ,EACzD,UAAA,CAAY,MAAOgG,CAAAA,EAAoB,CACrC,GAAI,CAAChG,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAI5D,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,+BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,QAAAxE,CAAAA,CACA,IAAA,CAAAxQ,CACF,CAAC,CACH,CACF,CAAA,CACA,GAAI,CAACgI,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,EAAS,MAAM,CAAA,CAAE,CAAA,CAEjE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,QAAA,CAAU,MAAOwI,CAAAA,EAAoB,CACnC,GAAI,CAAChG,CAAAA,CACH,OAGF,IAAMsvB,CAAAA,CAAKziB,CAAAA,GACL2iB,CAAAA,CAAU7gB,CAAAA,CAAU,SAAS,SAAA,CAAU3O,CAAQ,EAC/CyvB,CAAAA,CAAiB9gB,CAAAA,CAAU,SAAS,iBAAA,CAAkB3O,CAAQ,EAC9D0vB,CAAAA,CAAW/gB,CAAAA,CAAU,SAAS,aAAA,CAAc3O,CAAAA,CAAUgG,CAAO,CAAA,CAEnE,MAAM,OAAA,CAAQ,GAAA,CAAI,CAChBspB,CAAAA,CAAG,cAAc,CAAE,QAAA,CAAUE,CAAQ,CAAC,CAAA,CACtCF,EAAG,aAAA,CAAc,CAAE,QAAA,CAAUG,CAAe,CAAC,CAAA,CAC7CH,EAAG,aAAA,CAAc,CAAE,SAAUI,CAAS,CAAC,CACzC,CAAC,CAAA,CAED,IAAMC,CAAAA,CAAeL,CAAAA,CAAG,YAAA,CAAgCE,CAAO,CAAA,CAC3DG,CAAAA,EACFL,EAAG,YAAA,CACDE,CAAAA,CACAG,EAAa,MAAA,CAAQC,CAAAA,EAAMA,EAAE,OAAA,GAAY5pB,CAAO,CAClD,CAAA,CAGF,IAAM6pB,EAAgBP,CAAAA,CAAG,YAAA,CAAsBI,CAAQ,CAAA,CACvDJ,CAAAA,CAAG,YAAA,CAAsBI,CAAAA,CAAU,KAAK,CAAA,CAExC,IAAMI,CAAAA,CAAkBR,CAAAA,CAAG,eAA+D,CACxF,QAAA,CAAUG,CACZ,CAAC,CAAA,CACKM,CAAAA,CAAmB,IAAI,GAAA,CAAID,CAAe,EAChD,IAAA,GAAW,CAAC9/B,EAAKZ,CAAI,CAAA,GAAK0gC,EACpB1gC,CAAAA,EACFkgC,CAAAA,CAAG,YAAA,CAAat/B,CAAAA,CAAK,CACnB,GAAGZ,EACH,KAAA,CAAOA,CAAAA,CAAK,MAAM,GAAA,CAAKsjB,CAAAA,GAAU,CAC/B,GAAGA,CAAAA,CACH,KAAMA,CAAAA,CAAK,IAAA,CAAK,OAAQkd,CAAAA,EAAMA,CAAAA,CAAE,UAAY5pB,CAAO,CACrD,EAAE,CACJ,CAAC,CAAA,CAIL,OAAO,CAAE,YAAA,CAAA2pB,EAAc,gBAAA,CAAAI,CAAAA,CAAkB,cAAAF,CAAc,CACzD,EACA,SAAA,CAAW,CAACjK,CAAAA,CAAO5f,CAAAA,GAAY,CAC7BiD,CAAAA,GACA,IAAMqmB,CAAAA,CAAKziB,GAAe,CAC1ByiB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,QAAA,CAAS,SAAA,CAAU3O,CAAQ,CAAE,CAAC,CAAA,CACzEsvB,EAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,QAAA,CAAS,kBAAkB3O,CAAQ,CAAE,CAAC,CAAA,CACjFsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,QAAA,CAAS,aAAA,CAAc3O,CAAAA,CAAWgG,CAAO,CAAE,CAAC,EACzF,CAAA,CACA,OAAA,CAAS,CAAC9M,CAAAA,CAAK8M,CAAAA,CAASgqB,IAAY,CAClC,IAAMV,CAAAA,CAAKziB,CAAAA,EAAe,CAI1B,GAHImjB,GAAS,YAAA,EACXV,CAAAA,CAAG,aAAa3gB,CAAAA,CAAU,QAAA,CAAS,UAAU3O,CAAQ,CAAA,CAAGgwB,CAAAA,CAAQ,YAAY,CAAA,CAE1EA,CAAAA,EAAS,iBACX,IAAA,GAAW,CAAChgC,EAAKZ,CAAI,CAAA,GAAK4gC,EAAQ,gBAAA,CAChCV,CAAAA,CAAG,aAAat/B,CAAAA,CAAKZ,CAAI,EAGzB4gC,CAAAA,EAAS,aAAA,GAAkB,QAC7BV,CAAAA,CAAG,YAAA,CACD3gB,EAAU,QAAA,CAAS,aAAA,CAAc3O,CAAAA,CAAWgG,CAAO,CAAA,CACnDgqB,CAAAA,CAAQ,aACV,CAAA,CAEFjK,CAAAA,CAAQ7sB,CAAG,EACb,CACF,CAAC,CACH,CCnFO,SAAS+2B,GACd94B,CAAAA,CACA+4B,CAAAA,CACwB,CACxB,IAAMt0B,CAAAA,CAAS,IAAI,GAAA,CAEnB,OAAAzE,CAAAA,CAAS,QAAQ,CAAC,CAACnH,EAAKo2B,CAAM,CAAA,GAAM,CAClCxqB,CAAAA,CAAO,GAAA,CAAI5L,EAAI,QAAA,EAAS,CAAGo2B,CAAM,EACnC,CAAC,EAED8J,CAAAA,CAAU,OAAA,CAAQ,CAAC,CAAClgC,CAAAA,CAAKo2B,CAAM,CAAA,GAAM,CACnCxqB,CAAAA,CAAO,IAAI5L,CAAAA,CAAI,QAAA,GAAYo2B,CAAM,EACnC,CAAC,CAAA,CAEM,KAAA,CAAM,IAAA,CAAKxqB,CAAAA,CAAO,OAAA,EAAS,EAC/B,IAAA,CAAK,CAAC,CAAC+iB,CAAI,CAAA,CAAG,CAACC,CAAI,CAAA,GAAMD,CAAAA,CAAK,aAAA,CAAcC,CAAI,CAAC,EACjD,GAAA,CAAI,CAAC,CAAC5uB,CAAAA,CAAKo2B,CAAM,IAAM,CAACp2B,CAAAA,CAAKo2B,CAAM,CAAqB,CAC7D,CAOO,SAAS+J,EAAAA,CACdnwB,EACApB,CAAAA,CACA,CACA,GAAM,CAAE,IAAA,CAAMwxB,CAAY,CAAA,CAAI/iB,QAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE3E,OAAOkJ,WAAAA,CAAY,CACjB,YAAa,CAAC,UAAA,CAAY,aAAA,CAAelJ,CAAQ,CAAA,CACjD,UAAA,CAAY,MAAO,CACjB,IAAA,CAAAb,EACA,WAAA,CAAAkxB,CAAAA,CAAc,MACd,UAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CAAe,EAAC,CAChB,wBAAAC,CAAAA,CAA0B,EAC5B,CAAA,GAAe,CACb,GAAIrxB,CAAAA,CAAK,MAAA,GAAW,EAClB,MAAM,IAAI,MACR,oDACF,CAAA,CAGF,GAAI,CAACixB,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,gEACF,CAAA,CAGF,IAAMK,CAAAA,CAAeC,GAAwB,CAC3C,IAAMjpB,EAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAU2oB,CAAAA,CAAYM,CAAO,CAAC,CAAC,CAAA,CAKjEC,EAAkB,CACtB,GAH+BH,EAAwBE,CAAO,CAAA,EAAK,EAAC,CAIpE,GAAIF,CAAAA,CAAwBE,CAAO,CAAA,GAAM,MAAA,CAAYH,EAAe,EACtE,EAGMK,CAAAA,CAAeP,CAAAA,CACjB5oB,EAAK,SAAA,CAAU,MAAA,CAAO,CAAC,CAACzX,CAAG,IAAM,CAAC2gC,CAAAA,CAAgB,SAAS3gC,CAAAA,CAAI,QAAA,EAAU,CAAC,CAAA,CAC1E,EAAC,CAEL,OAAAyX,CAAAA,CAAK,UAAYwoB,EAAAA,CACfW,CAAAA,CACAzxB,EAAK,GAAA,CACH,CAAC0xB,EAAQ7lC,CAAAA,GACP,CAAC6lC,CAAAA,CAAOH,CAAO,CAAA,CAAE,YAAA,GAAe,QAAA,EAAS,CAAG1lC,EAAI,CAAC,CAIrD,CACF,CAAA,CAEOyc,CACT,CAAA,CAEA,OAAOrC,EAAAA,CACL,CAAC,CAAC,gBAAA,CAAkB,CAClB,QAASpF,CAAAA,CACT,aAAA,CAAeowB,EAAY,aAAA,CAC3B,KAAA,CAAOK,EAAY,OAAO,CAAA,CAC1B,OAAQA,CAAAA,CAAY,QAAQ,EAC5B,OAAA,CAASA,CAAAA,CAAY,SAAS,CAAA,CAE9B,QAAA,CAAUtxB,CAAAA,CAAK,CAAC,CAAA,CAAE,QAAA,CAAS,cAAa,CAAE,QAAA,EAC5C,CAAC,CAAC,EACFmxB,CACF,CACF,CAAA,CACA,GAAG1xB,CACL,CAAC,CACH,CCjGO,SAASkyB,EAAAA,CACd9wB,CAAAA,CACApB,CAAAA,CACA,CACA,GAAM,CAAE,IAAA,CAAMwxB,CAAY,CAAA,CAAI/iB,QAAAA,CAASsH,EAA2B3U,CAAQ,CAAC,EAErE,CAAE,WAAA,CAAa+wB,CAAW,CAAA,CAAIZ,EAAAA,CAAyBnwB,CAAQ,CAAA,CAErE,OAAOkJ,YAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,iBAAA,CAAmBlJ,CAAQ,EACrD,UAAA,CAAY,MAAO,CACjB,WAAA,CAAAgxB,CAAAA,CACA,gBAAAC,CAAAA,CACA,WAAA,CAAAZ,CACF,CAAA,GAAe,CACb,GAAI,CAACD,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,oEACF,EAEF,IAAME,CAAAA,CAAa1wB,CAAAA,CAAW,SAAA,CAC5BI,CAAAA,CACAixB,CAAAA,CACA,OACF,CAAA,CAEA,OAAOF,EAAW,CAChB,UAAA,CAAAT,EACA,WAAA,CAAAD,CAAAA,CACA,KAAM,CACJ,CACE,MAAOzwB,CAAAA,CAAW,SAAA,CAAUI,EAAUgxB,CAAAA,CAAa,OAAO,EAC1D,MAAA,CAAQpxB,CAAAA,CAAW,SAAA,CAAUI,CAAAA,CAAUgxB,CAAAA,CAAa,QAAQ,EAC5D,OAAA,CAASpxB,CAAAA,CAAW,UAAUI,CAAAA,CAAUgxB,CAAAA,CAAa,SAAS,CAAA,CAC9D,QAAA,CAAUpxB,CAAAA,CAAW,SAAA,CAAUI,CAAAA,CAAUgxB,CAAAA,CAAa,MAAM,CAC9D,CACF,CACF,CAAC,CACH,EACA,GAAGpyB,CACL,CAAC,CACH,CCrCO,SAASsyB,EAAAA,CACdlxB,EACApB,CAAAA,CACA6I,CAAAA,CACA,CACA,IAAMie,CAAAA,CAAcC,gBAAe,CAE7B,CAAE,IAAA,CAAAv2B,CAAK,CAAA,CAAIie,QAAAA,CAASsH,EAA2B3U,CAAQ,CAAC,EAE9D,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,gBAAA,CAAkB9Z,CAAAA,EAAM,IAAI,EACtD,UAAA,CAAY,MAAO,CAAE,WAAA,CAAA+hC,CAAAA,CAAa,KAAAnsB,CAAAA,CAAM,GAAA,CAAAhV,CAAI,CAAA,GAAqB,CAC/D,GAAI,CAACZ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,oEACF,EAGF,IAAMs9B,CAAAA,CAAU,KAAK,KAAA,CAAM,IAAA,CAAK,UAAUt9B,CAAAA,CAAK,OAAO,CAAC,CAAA,CAEvDs9B,CAAAA,CAAQ,cAAgBA,CAAAA,CAAQ,aAAA,CAAc,MAAA,CAC5C,CAAC,CAAC1mB,CAAO,IAAMA,CAAAA,GAAYmrB,CAC7B,EAEA,IAAMjyB,CAAAA,CAAgB,CACpB,OAAA,CAAS9P,CAAAA,CAAK,IAAA,CACd,OAAA,CAAAs9B,CAAAA,CACA,QAAA,CAAUt9B,EAAK,QAAA,CACf,aAAA,CAAeA,EAAK,aACtB,CAAA,CAEA,GAAI4V,CAAAA,GAAS,KAAA,EAAShV,CAAAA,CACpB,OAAOoV,EAAAA,CAAoB,CAAC,CAAC,gBAAA,CAAkBlG,CAAa,CAAC,CAAA,CAAGlP,CAAG,EAC9D,GAAIgV,CAAAA,GAAS,WAAY,CAC9B,GAAI,CAACyC,CAAAA,EAAM,SAAA,CACT,MAAM,IAAI,KAAA,CAAM,qDAAgD,CAAA,CAElE,OAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAC,iBAAkBvI,CAAa,CAAC,EAAG,QAAQ,CACrE,MACM,OAACN,CAAAA,CAAQ,aAAA,CAGNoJ,EAAAA,CAAG,aAAA,CACR,CAAC,iBAAkB9I,CAAa,CAAA,CAChCN,EAAQ,aAAA,CAAgB,CAAE,SAAUA,CAAAA,CAAQ,aAAc,CAAA,CAAI,EAAC,CAC/D,IAAM,CAAC,CACT,CAEJ,EACA,OAAA,CAASA,CAAAA,CAAQ,QACjB,SAAA,CAAW,CAAC4d,EAAMrT,CAAAA,CAASioB,CAAAA,GAAQ,CAChCxyB,CAAAA,CAAQ,SAAA,GAEQ4d,EAAMrT,CAAAA,CAASioB,CAAG,EACnC1L,CAAAA,CAAY,YAAA,CACV/Q,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QAAA,CACpC5Q,IACE,CACC,GAAGA,EACH,OAAA,CAAS,CACP,GAAGA,CAAAA,EAAM,OAAA,CACT,aAAA,CACEA,CAAAA,EAAM,OAAA,EAAS,aAAA,EAAe,OAC5B,CAAC,CAAC4W,CAAO,CAAA,GAAMA,CAAAA,GAAYmD,EAAQ,WACrC,CAAA,EAAK,EACT,CACF,CAAA,CACJ,EACF,CACF,CAAC,CACH,CCtEO,SAASkoB,GACdrxB,CAAAA,CACAxK,CAAAA,CACAoJ,EACA6I,CAAAA,CACA,CACA,GAAM,CAAE,IAAA,CAAArY,CAAK,EAAIie,QAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE9D,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,UAAA,CAAY9Z,GAAM,IAAI,CAAA,CAChD,WAAY,MAAO,CAAE,YAAA+hC,CAAAA,CAAa,IAAA,CAAAnsB,CAAAA,CAAM,GAAA,CAAAhV,CAAAA,CAAK,KAAA,CAAAshC,CAAM,CAAA,GAAqB,CACtE,GAAI,CAACliC,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,qEACF,CAAA,CAGF,IAAM8P,EAAgB,CACpB,kBAAA,CAAoB9P,EAAK,IAAA,CACzB,oBAAA,CAAsB+hC,EACtB,UAAA,CAAY,EACd,CAAA,CAEA,GAAInsB,CAAAA,GAAS,SAAU,CACrB,GAAI,CAACxP,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,6CAAwC,CAAA,CAI1D,IAAMgI,CAAAA,CAAW,MAFAyQ,GAAc,CAECzD,CAAAA,CAAO,eAAiB,6BAAA,CAA+B,CACrF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,MAAA87B,CAAAA,CACA,UAAA,CAAY,CACV,GAAGliC,CAAAA,CAAK,MAAM,SAAA,CACd,GAAGA,EAAK,MAAA,CAAO,SAAA,CACf,GAAGA,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAChBA,CAAAA,CAAK,QACP,CACF,CAAC,CACH,CAAC,EAKD,GAAI,CAACoO,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2CA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG9E,OAAOA,CACT,CAAA,KAAO,IAAIwH,CAAAA,GAAS,KAAA,EAAShV,CAAAA,CAC3B,OAAOoV,EAAAA,CACL,CAAC,CAAC,yBAAA,CAA2BlG,CAAa,CAAC,CAAA,CAC3ClP,CACF,EACK,GAAIgV,CAAAA,GAAS,WAAY,CAC9B,GAAI,CAACyC,CAAAA,EAAM,SAAA,CACT,MAAM,IAAI,KAAA,CAAM,qDAAgD,CAAA,CAElE,OAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAC,0BAA2BvI,CAAa,CAAC,EAAG,OAAO,CAC7E,MACM,OAACN,CAAAA,CAAQ,aAAA,CAGNoJ,EAAAA,CAAG,aAAA,CACR,CAAC,0BAA2B9I,CAAa,CAAA,CACzCN,EAAQ,aAAA,CAAgB,CAAE,SAAUA,CAAAA,CAAQ,aAAc,CAAA,CAAI,EAAC,CAC/D,IAAM,CAAC,CACT,CAAA,CAEJ,EACA,OAAA,CAASA,CAAAA,CAAQ,QACjB,SAAA,CAAWA,CAAAA,CAAQ,SACrB,CAAC,CACH,CCjGO,SAAS2yB,EAAAA,CACd9pB,CAAAA,CACA+pB,CAAAA,CACS,CACT,IAAMC,EAAkBhqB,CAAAA,CAAK,SAAA,CAC1B,OAAO,CAAC,CAACzX,CAAG,CAAA,GAAM,CAACwhC,CAAAA,CAAgB,GAAA,CAAI,MAAA,CAAOxhC,CAAG,CAAC,CAAC,CAAA,CACnD,OAAO,CAAC0hC,CAAAA,CAAK,EAAGtL,CAAM,CAAA,GAAMsL,CAAAA,CAAMtL,CAAAA,CAAQ,CAAC,EAGxCuL,CAAAA,CAAAA,CAAiBlqB,CAAAA,CAAK,eAAiB,EAAC,EAAG,OAC/C,CAACiqB,CAAAA,CAAa,EAAGtL,CAAM,IAAwBsL,CAAAA,CAAMtL,CAAAA,CACrD,CACF,CAAA,CAEA,OAAQqL,EAAkBE,CAAAA,EAAkBlqB,CAAAA,CAAK,gBACnD,CAYO,SAASmqB,EAAAA,CACdxB,EACAyB,CAAAA,CACA,CACA,IAAML,CAAAA,CAAkB,IAAI,IAAIK,CAAAA,CAAa,GAAA,CAAK3X,CAAAA,EAAMA,CAAAA,CAAE,QAAA,EAAU,CAAC,CAAA,CAE/D4X,CAAAA,CAAmBrqB,GACvBA,CAAAA,CAAK,SAAA,CAAU,KACb,CAAC,CAACzX,CAAG,CAAA,GAAoCwhC,CAAAA,CAAgB,GAAA,CAAI,OAAOxhC,CAAG,CAAC,CAC1E,CAAA,CAEIygC,CAAAA,CAAehpB,GAA+B,CAClD,IAAMsqB,EAAmB,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAUtqB,CAAI,CAAC,CAAA,CACxD,OAAAsqB,EAAM,SAAA,CAAYA,CAAAA,CAAM,SAAA,CAAU,MAAA,CAChC,CAAC,CAAC/hC,CAAG,CAAA,GAAM,CAACwhC,EAAgB,GAAA,CAAIxhC,CAAAA,CAAI,UAAU,CAChD,CAAA,CACO+hC,CACT,CAAA,CAEMC,CAAAA,CAAmBF,EAAgB1B,CAAAA,CAAY,KAAK,EAE1D,OAAO,CACL,QAASA,CAAAA,CAAY,IAAA,CACrB,aAAA,CAAeA,CAAAA,CAAY,aAAA,CAC3B,KAAA,CAAO4B,EAAmBvB,CAAAA,CAAYL,CAAAA,CAAY,KAAK,CAAA,CAAI,MAAA,CAC3D,OAAQK,CAAAA,CAAYL,CAAAA,CAAY,MAAM,CAAA,CACtC,OAAA,CAASK,EAAYL,CAAAA,CAAY,OAAO,EACxC,QAAA,CAAUA,CAAAA,CAAY,QACxB,CACF,CCrCO,SAAS6B,EAAAA,CACdjyB,CAAAA,CACApB,CAAAA,CACA,CACA,GAAM,CAAE,KAAMwxB,CAAY,CAAA,CAAI/iB,SAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE3E,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAY,YAAA,CAAcknB,CAAAA,EAAa,IAAI,CAAA,CACzD,UAAA,CAAY,MAAO,CAAE,UAAA,CAAAE,CAAAA,CAAY,YAAA4B,CAAY,CAAA,GAAe,CAC1D,GAAI,CAAC9B,EACH,MAAM,IAAI,MACR,2DACF,CAAA,CAGF,IAAMyB,CAAAA,CAAe,KAAA,CAAM,QAAQK,CAAW,CAAA,CAAIA,EAAc,CAACA,CAAW,CAAA,CACtE3sB,CAAAA,CAAKqsB,EAAAA,CAAkBxB,CAAAA,CAAayB,CAAY,CAAA,CAEtD,OAAOzsB,GAAoB,CAAC,CAAC,iBAAkBG,CAAE,CAAC,CAAA,CAAG+qB,CAAU,CACjE,CAAA,CACA,GAAG1xB,CACL,CAAC,CACH,CCaO,SAASuzB,GACdnyB,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,UAAA,CAAY,cAAc,EAC3B/I,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAiqB,CAAAA,CAAS,IAAA8C,CAAAA,CAAM,YAAa,IAAM,CACnCE,EAAAA,CAAoBhD,EAAS8C,CAAG,CAClC,EACA,MAAOiC,CAAAA,CAAcnJ,CAAAA,GAAc,CACjC,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAKkX,CAAAA,CAAU,OAAO,CAC3C,CAAC,EACH,CAAA,CACApe,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCtEO,SAASuqB,EAAAA,CACdpyB,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,UAAA,CAAY,0BAA0B,EACvC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX+jB,EAAAA,CACEltB,CAAAA,CACAmJ,EAAQ,cAAA,CACRA,CAAAA,CAAQ,eACRA,CAAAA,CAAQ,eAAA,CACRA,EAAQ,OAAA,CACRA,CAAAA,CAAQ,YACV,CACF,CAAA,CACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC3BO,SAASwqB,EAAAA,CACdryB,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,WAAY,QAAQ,CAAA,CACrB/I,EACCmJ,CAAAA,EAAY,CACXA,EAAQ,UAAA,CACJ6jB,EAAAA,CAA4BhtB,EAAWmJ,CAAAA,CAAQ,cAAA,CAAgBA,EAAQ,IAAI,CAAA,CAC3E0jB,EAAAA,CAAqB7sB,CAAAA,CAAWmJ,CAAAA,CAAQ,cAAA,CAAgBA,EAAQ,IAAA,CAAMA,CAAAA,CAAQ,GAAG,CACvF,CAAA,CACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC7BA,IAAMyqB,EAAAA,CAAwC,IAAS,EAAA,CAAK,EAAA,CACtDC,GAAmB,GAAA,CACnBC,EAAAA,CAA2B,IAEjC,SAASC,EAAAA,CAAkBzsB,EAA8B,CACvD,IAAM0sB,EAAU7kB,CAAAA,CAAW7H,CAAAA,CAAQ,cAAc,CAAA,CAAE,MAAA,CAC7CG,CAAAA,CAAW0H,EAAW7H,CAAAA,CAAQ,uBAAuB,EAAE,MAAA,CACvDE,CAAAA,CAAY2H,EAAW7H,CAAAA,CAAQ,wBAAwB,CAAA,CAAE,MAAA,CACzDI,CAAAA,CAAeyH,CAAAA,CAAW7H,EAAQ,qBAAqB,CAAA,CAAE,OACzDK,CAAAA,CAAAA,CACH,MAAA,CAAOL,EAAQ,WAAW,CAAA,CAAI,MAAA,CAAOA,CAAAA,CAAQ,SAAS,CAAA,EAAK,IACxDM,CAAAA,CAAgB,IAAA,CAAK,IAAIF,CAAAA,CAAcC,CAAgB,EAE7D,OAAOqsB,CAAAA,CAAUvsB,EAAWD,CAAAA,CAAYI,CAC1C,CAEA,SAASqsB,EAAAA,CAAe1sB,EAAe2sB,CAAAA,CAA0BC,CAAAA,CAA0B,CACzF,IAAM9K,CAAAA,CAAgB9hB,CAAAA,CAAQ,GAAA,CAE9B,OAAA,CADe2sB,CAAAA,CAAmBC,EAAY,GAAA,CAAM,EAAA,CAAK,GACzC9K,CAAAA,CAAiB,GACnC,CAEA,SAAS+K,EAAAA,CAAsBC,CAAAA,CAAqC,CAClE,GAAI,MAAA,CAAO,SAASA,CAAAA,CAAa,YAAY,EAC3C,OAAOA,CAAAA,CAAa,cAAgB,EAAA,CAGtC,GAAM,CAACC,CAAAA,CAAQ,GAAA,CAAKC,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAAKF,CAAAA,CAAa,wBAA0B,OAAA,EAAS,KAAA,CAAM,GAAG,CAAA,CAC7F,OAAO,OAAOC,CAAK,CAAA,CAAI,GAAM,MAAA,CAAOA,CAAK,IAAM,CAAA,EAAK,MAAA,CAAOC,CAAK,CAAA,EAAK,EACvE,CAEA,SAASC,EAAAA,CACPltB,CAAAA,CACA+sB,EACA3M,CAAAA,CACQ,CACR,IAAM+M,CAAAA,CACJJ,CAAAA,CAAa,sBACb,MAAA,CAAOA,CAAAA,CAAa,GAAA,EAAK,aAAA,EAAe,uBAAA,EAA2B,CAAC,EAEtE,GAAI,CAAC,OAAO,QAAA,CAASI,CAAW,GAAKA,CAAAA,EAAe,CAAA,CAClD,OAAO,CAAA,CAGT,IAAMC,CAAAA,CAAiBX,GAAkBzsB,CAAO,CAAA,CAChD,GAAI,CAAC,MAAA,CAAO,SAASotB,CAAc,CAAA,EAAKA,GAAkB,CAAA,CACxD,SAGF,IAAMrL,CAAAA,CAAgBqL,EAAiB,GAAA,CACjCC,CAAAA,CACJ,KAAK,IAAA,CACFtL,CAAAA,CAAgB3B,CAAAA,CAAS,EAAA,CAAK,EAAA,CAAK,EAAA,CACpCmM,IACCY,CAAAA,CAAcb,EAAAA,CACjB,EAEIgB,CAAAA,CAAO/sB,EAAAA,CAAgBP,CAAO,CAAA,CAC9BH,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAIytB,CAAAA,CAAK,YAAA,CAAcA,EAAK,QAAQ,CAAA,CAE7D,OAAI,CAAC,MAAA,CAAO,SAASztB,CAAW,CAAA,EAAKwtB,CAAAA,CAAWxtB,CAAAA,CACvC,CAAA,CAGF,IAAA,CAAK,IAAIwtB,CAAAA,CAAWb,EAAAA,CAA0B,CAAC,CACxD,CAEO,SAASe,EAAAA,CACdvtB,CAAAA,CACA+sB,EACAH,CAAAA,CACAxM,CAAAA,CAAiB,IACT,CACR,GAAI,CAAC,MAAA,CAAO,QAAA,CAASwM,CAAgB,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASxM,CAAM,CAAA,CAC/D,OAAO,CAAA,CAGT,GAAI0M,GAAsBC,CAAY,CAAA,CACpC,OAAOG,EAAAA,CAAkBltB,CAAAA,CAAS+sB,CAAAA,CAAc3M,CAAM,CAAA,CAGxD,IAAIoN,EAAa,CAAA,CACjB,GAAI,CAEF,GADAA,CAAAA,CAAaf,GAAkBzsB,CAAO,CAAA,CAClC,CAAC,MAAA,CAAO,QAAA,CAASwtB,CAAU,EAC7B,OAAO,CAEX,MAAQ,CACN,QACF,CAEA,OAAOb,GAAea,CAAAA,CAAYZ,CAAAA,CAAkBxM,CAAM,CAC5D,CAEO,SAASqN,EAAAA,CAAYztB,CAAAA,CAA8B,CAExD,OADaO,EAAAA,CAAgBP,CAAO,CAAA,CACxB,UAAA,CAAa,GAC3B,CAEO,SAAS0tB,EAAAA,CAAkBC,EAAe,CAC/C,GAAI,CAAC,MAAA,CAAO,QAAA,CAASA,CAAK,CAAA,CACxB,MAAM,IAAI,UAAU,sCAAsC,CAAA,CAE5D,GAAIA,CAAAA,CAAQ,CAAA,EAAKA,EAAQ,GAAA,CACvB,MAAM,IAAI,UAAA,CAAW,wCAAwC,CAAA,CAG/D,QADqB,GAAA,CAAMA,CAAAA,EAET,IAAMrB,EAAAA,CAAyC,GAEnE,CAEO,SAASsB,EAAAA,CAAgB5tB,EAA8B,CAC5D,IAAM6tB,EACJ,UAAA,CAAW7tB,CAAAA,CAAQ,cAAc,CAAA,CACjC,UAAA,CAAWA,EAAQ,uBAAuB,CAAA,CAC1C,UAAA,CAAWA,CAAAA,CAAQ,wBAAwB,CAAA,CACvC8tB,EAAU,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CAAI9tB,CAAAA,CAAQ,gBAAA,CAAiB,gBAAA,CACnEL,CAAAA,CAAWkuB,CAAAA,CAAc,IAAW,CAAA,CAE1C,GAAIluB,GAAW,CAAA,CACb,SAGF,IAAIE,CAAAA,CACF,UAAA,CAAWG,CAAAA,CAAQ,gBAAA,CAAiB,YAAA,CAAa,UAAU,CAAA,CAC1D8tB,EAAUnuB,CAAAA,CAAW2sB,EAAAA,CAEpBzsB,EAAcF,CAAAA,GAChBE,CAAAA,CAAcF,GAEhB,IAAMouB,CAAAA,CAAmBluB,EAAc,GAAA,CAAOF,CAAAA,CAE9C,OAAI,KAAA,CAAMouB,CAAe,EAChB,CAAA,CAGLA,CAAAA,CAAkB,GAAA,CACb,GAAA,CAEFA,CACT,CAEO,SAASC,EAAAA,CAAQhuB,CAAAA,CAA4B,CAElD,OADaQ,EAAAA,CAAgBR,CAAO,CAAA,CACxB,UAAA,CAAa,GAC3B,CAEO,SAASiuB,EAAAA,CACdjuB,EACA+sB,CAAAA,CACAH,CAAAA,CACAxM,EAAiB,GAAA,CACT,CACR,GAAI,CAAC,MAAA,CAAO,QAAA,CAASwM,CAAgB,CAAA,EAAK,CAAC,OAAO,QAAA,CAASxM,CAAM,EAC/D,OAAO,CAAA,CAET,GAAM,CAAE,gBAAA,CAAA/W,EAAkB,iBAAA,CAAAC,CAAAA,CAAmB,KAAAH,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAA,CAAI2jB,CAAAA,CAW7D,GARE,CAAC,MAAA,CAAO,QAAA,CAAS1jB,CAAgB,CAAA,EACjC,CAAC,OAAO,QAAA,CAASC,CAAiB,GAClC,CAAC,MAAA,CAAO,SAASH,CAAI,CAAA,EACrB,CAAC,MAAA,CAAO,QAAA,CAASC,CAAK,GAKpBC,CAAAA,GAAqB,CAAA,EAAKD,IAAU,CAAA,CACtC,SAGF,IAAM8kB,CAAAA,CAAUX,EAAAA,CAAcvtB,CAAAA,CAAS+sB,CAAAA,CAAcH,CAAAA,CAAkBxM,CAAM,CAAA,CAE7E,OAAK,OAAO,QAAA,CAAS8N,CAAO,EAIpBA,CAAAA,CAAU7kB,CAAAA,CAAoBC,GAAqBH,CAAAA,CAAOC,CAAAA,CAAAA,CAHzD,CAIX,CCjKO,IAAM+kB,GAA0D,CAErE,IAAA,CAAM,UACN,OAAA,CAAS,SAAA,CACT,cAAA,CAAgB,SAAA,CAChB,eAAA,CAAiB,SAAA,CACjB,qBAAsB,SAAA,CAGtB,4BAAA,CAA8B,SAC9B,sBAAA,CAAwB,QAAA,CACxB,QAAS,QAAA,CACT,uBAAA,CAAyB,QAAA,CACzB,kBAAA,CAAoB,QAAA,CACpB,0BAAA,CAA4B,SAC5B,QAAA,CAAU,QAAA,CACV,sBAAuB,QAAA,CACvB,mBAAA,CAAqB,SACrB,mBAAA,CAAqB,QAAA,CACrB,gBAAA,CAAkB,QAAA,CAGlB,kBAAA,CAAoB,QAAA,CACpB,mBAAoB,QAAA,CAGpB,cAAA,CAAgB,SAChB,eAAA,CAAiB,QAAA,CACjB,cAAe,QAAA,CACf,sBAAA,CAAwB,SAGxB,qBAAA,CAAuB,QAAA,CACvB,qBAAsB,QAAA,CACtB,eAAA,CAAiB,SACjB,qBAAA,CAAuB,QAAA,CAGvB,wBAAyB,OAAA,CACzB,wBAAA,CAA0B,OAAA,CAC1B,eAAA,CAAiB,OAAA,CACjB,aAAA,CAAe,QACf,iBAAA,CAAmB,OAKrB,EAkCO,SAASC,EAAAA,CAAuBC,EAAyC,CAC9E,IAAMC,CAAAA,CAASD,CAAAA,CAAa,CAAC,CAAA,CACvBlrB,EAAUkrB,CAAAA,CAAa,CAAC,EAE9B,GAAIC,CAAAA,GAAW,cACb,MAAM,IAAI,KAAA,CAAM,0CAA0C,CAAA,CAI5D,IAAMC,EAAaprB,CAAAA,CAQnB,OAAIorB,EAAW,cAAA,EAAkBA,CAAAA,CAAW,eAAe,MAAA,CAAS,CAAA,CAC3D,UAILA,CAAAA,CAAW,sBAAA,EAA0BA,EAAW,sBAAA,CAAuB,MAAA,CAAS,EAC3E,SAAA,CAKX,CA+BO,SAASC,EAAAA,CAAqBC,CAAAA,CAAuC,CAC1E,IAAMH,CAAAA,CAASG,CAAAA,CAAW,CAAC,CAAA,CAE3B,GAAIH,IAAW,iBAAA,EAAqBA,CAAAA,GAAW,kBAC7C,MAAM,IAAI,KAAA,CAAM,uCAAuC,CAAA,CAIzD,OAAO,QACT,CAoBO,SAASI,GAAsBnvB,CAAAA,CAA+B,CACnE,IAAM+uB,CAAAA,CAAS/uB,CAAAA,CAAG,CAAC,CAAA,CAGnB,OAAI+uB,CAAAA,GAAW,cACNF,EAAAA,CAAuB7uB,CAAE,EAI9B+uB,CAAAA,GAAW,iBAAA,EAAqBA,IAAW,iBAAA,CACtCE,EAAAA,CAAqBjvB,CAAE,CAAA,CAIzB4uB,EAAAA,CAAwBG,CAAM,CAAA,EAAK,SAC5C,CAkCO,SAASK,EAAAA,CAAqBtvB,EAAkC,CACrE,IAAIuvB,CAAAA,CAAmC,SAAA,CAEvC,IAAA,IAAWrvB,CAAAA,IAAMF,EAAK,CACpB,IAAMqC,EAAYgtB,EAAAA,CAAsBnvB,CAAE,EAG1C,GAAImC,CAAAA,GAAc,OAAA,CAChB,OAAO,OAAA,CAILA,CAAAA,GAAc,UAAYktB,CAAAA,GAAqB,SAAA,GACjDA,EAAmB,QAAA,EAKvB,CAEA,OAAOA,CACT,CClQO,SAASC,EAAAA,CAAsB70B,CAAAA,CAA8B,CAClE,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,aAAc,MAAA,CAAQlJ,CAAQ,EAC5C,UAAA,CAAY,CAAC,CACX,SAAA,CAAAlM,CAAAA,CACA,UAAAghC,CACF,CAAA,GAGM,CACJ,GAAI,CAAC90B,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,yDAAoD,CAAA,CAGtE,IAAIY,EACJ,OAAIk0B,CAAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAW,GAClCl0B,CAAAA,CAAahB,CAAAA,CAAW,UAAUI,CAAAA,CAAU80B,CAAAA,CAAW,QAAQ,CAAA,CACtD3vB,EAAAA,CAAM2vB,CAAS,CAAA,CACxBl0B,CAAAA,CAAahB,CAAAA,CAAW,WAAWk1B,CAAS,CAAA,CAE5Cl0B,EAAahB,CAAAA,CAAW,IAAA,CAAKk1B,CAAS,CAAA,CAGjC1vB,EAAAA,CACL,CAACtR,CAAS,CAAA,CACV8M,CACF,CACF,CACF,CAAC,CACH,CC9BO,SAASm0B,EAAAA,CACd/0B,CAAAA,CACAyH,EACAutB,CAAAA,CAAmD,QAAA,CACnD,CACA,OAAO9rB,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,YAAA,CAAc,eAAA,CAAiBlJ,CAAQ,CAAA,CACrD,WAAY,CAAC,CAAE,UAAAlM,CAAU,CAAA,GAAgC,CACvD,GAAI,CAACkM,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,gEACF,CAAA,CAEF,GAAI,CAACyH,CAAAA,EAAM,SAAA,CACT,MAAM,IAAI,KAAA,CAAM,qDAAgD,CAAA,CAGlE,OAAOA,EAAK,SAAA,CAAU,CAAC3T,CAAS,CAAA,CAAGkhC,CAAO,CAC5C,CACF,CAAC,CACH,CCpBO,SAASC,GAA6BC,CAAAA,CAAc,GAAA,CAAK,CAC9D,OAAOhsB,WAAAA,CAAY,CACjB,YAAa,CAAC,YAAA,CAAc,kBAAmBgsB,CAAW,CAAA,CAC1D,WAAY,MAAO,CAAE,SAAA,CAAAphC,CAAU,CAAA,GACtBkU,EAAAA,CAAG,cAAclU,CAAAA,CAAW,CAAE,SAAUohC,CAAY,CAAA,CAAG,IAAM,CAAC,CAAC,CAE1E,CAAC,CACH,CCRO,SAASC,IAAiC,CAC/C,OAAOzmB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,aAAc,kBAAkB,CAAA,CAC3C,QAAS,SACA,MAAMzS,EAAQ,oCAAA,CAAsC,EAAE,CAEjE,CAAC,CACH,CCEO,SAASm5B,GACdj+B,CAAAA,CACAqG,CAAAA,CACA63B,CAAAA,CACU,CACV,OAAO,CACL,GAAGl+B,CAAAA,CACH,GAAIqG,GAAY,EAAC,CACjB,MAAO63B,CAAAA,CAAK,KAAA,CACZ,KAAMA,CAAAA,CAAK,IACb,CACF,CAQO,SAASC,GACd93B,CAAAA,CACA63B,CAAAA,CACU,CACV,OAAO,CACL,GAAI73B,CAAAA,EAAY,EAAC,CACjB,MAAO63B,CAAAA,CAAK,KAAA,CACZ,KAAMA,CAAAA,CAAK,IACb,CACF,CCjCO,SAASE,EAAAA,CAAev1B,CAAAA,CAAkBxK,CAAAA,CAA0B,CACzE,OAAO0T,WAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,eAAgBlJ,CAAQ,CAAA,CAC/C,UAAA,CAAY,MAAO,CAAE,KAAA,CAAAuhB,EAAO,IAAA,CAAArnB,CAAK,IAAuC,CACtE,GAAI,CAAC1E,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mCAAmC,EAGrD,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,4BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAhV,CAAAA,CACA,KAAA,CAAA+rB,EACA,IAAA,CAAArnB,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CACF,CAAA,CAGA,GAAI,CAACsD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwCA,EAAS,MAAM,CAAA,CAAE,EAE3E,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,UAAUA,CAAAA,CAAUqoB,CAAAA,CAAW,CAC7B,IAAMH,CAAAA,CAAc7Y,GAAe,CAK7B2oB,CAAAA,CAAcF,GAAmB93B,CAAAA,CAAUqoB,CAAS,CAAA,CAG1DH,CAAAA,CAAY,YAAA,CACVtK,EAAAA,CAAyBpb,EAAUxK,CAAI,CAAA,CAAE,SACxCpG,CAAAA,EAAS,CAAComC,EAAa,GAAIpmC,CAAAA,EAAQ,EAAG,CACzC,CAAA,CAGAs2B,EAAY,cAAA,CACV,CAAE,SAAU,CAAC,OAAA,CAAS,YAAa,UAAA,CAAY1lB,CAAQ,CAAE,CAAA,CACxDkf,CAAAA,EACMA,CAAAA,EAEE,CACL,GAAGA,CAAAA,CACH,MAAOA,CAAAA,CAAQ,KAAA,CAAM,IAAI,CAACxM,CAAAA,CAAM+iB,IAC9BA,CAAAA,GAAU,CAAA,CACN,CAAE,GAAG/iB,CAAAA,CAAM,KAAM,CAAC8iB,CAAAA,CAAa,GAAG9iB,CAAAA,CAAK,IAAI,CAAE,CAAA,CAC7CA,CACN,CACF,CAEJ,EACF,CACF,CAAC,CACH,CC7DO,SAASgjB,EAAAA,CACd11B,CAAAA,CACAxK,EACA,CACA,OAAO0T,YAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,eAAA,CAAiBlJ,CAAQ,CAAA,CAChD,UAAA,CAAY,MAAO,CACjB,UAAA,CAAA21B,CAAAA,CACA,MAAApU,CAAAA,CACA,IAAA,CAAArnB,CACF,CAAA,GAIM,CACJ,GAAI,CAAC1E,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAGrD,IAAMgI,EAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,+BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,EAAA,CAAImgC,CAAAA,CACJ,KAAA,CAAApU,CAAAA,CACA,KAAArnB,CACF,CAAC,EACD,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CACF,CAAA,CAGA,GAAI,CAACsD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2CA,EAAS,MAAM,CAAA,CAAE,EAE9E,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,UAAUA,CAAAA,CAAUqoB,CAAAA,CAAW,CAC7B,IAAMH,CAAAA,CAAc7Y,CAAAA,EAAe,CAK7B+oB,CAAAA,CAAeC,CAAAA,EACnBT,GAAoBS,CAAAA,CAAUr4B,CAAAA,CAAUqoB,CAAS,CAAA,CAGnDH,CAAAA,CAAY,aACVtK,EAAAA,CAAyBpb,CAAAA,CAAUxK,CAAI,CAAA,CAAE,QAAA,CACxCpG,CAAAA,EACCA,GAAM,GAAA,CAAKymC,CAAAA,EACTA,EAAS,EAAA,GAAOhQ,CAAAA,CAAU,WAAa+P,CAAAA,CAAYC,CAAQ,CAAA,CAAIA,CACjE,CAAA,EAAK,EACT,CAAA,CAGAnQ,CAAAA,CAAY,eACV,CAAE,QAAA,CAAU,CAAC,OAAA,CAAS,WAAA,CAAa,WAAY1lB,CAAQ,CAAE,EACxDkf,CAAAA,EACMA,CAAAA,EAEE,CACL,GAAGA,CAAAA,CACH,MAAOA,CAAAA,CAAQ,KAAA,CAAM,GAAA,CAAKxM,CAAAA,GAAU,CAClC,GAAGA,EACH,IAAA,CAAMA,CAAAA,CAAK,KAAK,GAAA,CAAKmjB,CAAAA,EACnBA,EAAS,EAAA,GAAOhQ,CAAAA,CAAU,UAAA,CAAa+P,CAAAA,CAAYC,CAAQ,CAAA,CAAIA,CACjE,CACF,CAAA,CAAE,CACJ,CAEJ,EACF,CACF,CAAC,CACH,CC/EO,SAASC,EAAAA,CACd91B,EACAxK,CAAAA,CACA,CACA,OAAO0T,WAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,kBAAmBlJ,CAAQ,CAAA,CAClD,WAAY,MAAO,CAAE,WAAA21B,CAAW,CAAA,GAA8B,CAC5D,GAAI,CAACngC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAIrD,IAAMgI,EAAW,MAFAyQ,CAAAA,EAAc,CAECzD,CAAAA,CAAO,cAAA,CAAiB,+BAAA,CAAiC,CACvF,MAAA,CAAQ,MAAA,CACR,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,EAAA,CAAImgC,CACN,CAAC,CAAA,CACD,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,EAKD,GAAI,CAACn4B,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2CA,EAAS,MAAM,CAAA,CAAE,EAG9E,OAAOA,CACT,CAAA,CACA,SAAA,CAAUooB,CAAAA,CAAOC,CAAAA,CAAW,CAC1B,IAAMH,CAAAA,CAAc7Y,GAAe,CAGnC6Y,CAAAA,CAAY,aACVtK,EAAAA,CAAyBpb,CAAAA,CAAUxK,CAAI,CAAA,CAAE,QAAA,CACxCpG,CAAAA,EAAS,CAAC,GAAIA,CAAAA,EAAQ,EAAG,CAAA,CAAE,OAAO,CAAC,CAAE,EAAA,CAAA4C,CAAG,CAAA,GAAMA,CAAAA,GAAO6zB,EAAU,UAAU,CAC5E,EAGAH,CAAAA,CAAY,cAAA,CACV,CAAE,QAAA,CAAU,CAAC,QAAS,WAAA,CAAa,UAAA,CAAY1lB,CAAQ,CAAE,CAAA,CACxDkf,GACMA,CAAAA,EAEE,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CAAM,GAAA,CAAKxM,CAAAA,GAAU,CAClC,GAAGA,CAAAA,CACH,KAAMA,CAAAA,CAAK,IAAA,CAAK,OAAQmjB,CAAAA,EAAaA,CAAAA,CAAS,EAAA,GAAOhQ,CAAAA,CAAU,UAAU,CAC3E,EAAE,CACJ,CAEJ,EACF,CACF,CAAC,CACH,CCxDA,eAAekQ,EAAqBv4B,CAAAA,CAAgC,CAClE,GAAI,CAACA,CAAAA,CAAS,GAAI,CAChB,IAAIw4B,EACJ,GAAI,CACFA,EAAY,MAAMx4B,CAAAA,CAAS,OAC7B,CAAA,KAAQ,CACNw4B,CAAAA,CAAY,OACd,CACA,IAAM/iC,CAAAA,CAAQ,IAAI,MAAM,CAAA,2BAAA,EAA8BuK,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CACvE,MAAAvK,CAAAA,CAAM,MAAA,CAASuK,CAAAA,CAAS,MAAA,CACxBvK,CAAAA,CAAM,IAAA,CAAO+iC,EACP/iC,CACR,CAGA,IAAMsC,CAAAA,CAAO,MAAMiI,EAAS,IAAA,EAAK,CACjC,GAAI,CAACjI,CAAAA,EAAQA,CAAAA,CAAK,MAAK,GAAM,EAAA,CAC3B,OAAO,EAAA,CAGT,GAAI,CACF,OAAO,IAAA,CAAK,MAAMA,CAAI,CACxB,OAASuD,CAAAA,CAAG,CAEV,eAAQ,IAAA,CAAK,sCAAA,CAAwCA,EAAG,WAAA,CAAavD,CAAI,CAAA,CAClE,EACT,CACF,CAEA,eAAsB0gC,EAAAA,CACpBj2B,CAAAA,CACAsxB,EACA4E,CAAAA,CACAC,CAAAA,CAC+C,CAE/C,IAAM34B,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,eAAiB,6BAAA,CAA+B,CACrF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,QAAA,CAAAxK,CAAAA,CAAU,MAAAsxB,CAAAA,CAAO,QAAA,CAAA4E,EAAU,aAAA,CAAeC,CAAa,CAAC,CACjF,CAAC,EAEK/mC,CAAAA,CAAO,MAAM2mC,EAA2Cv4B,CAAQ,CAAA,CACtE,OAAO,CAAE,MAAA,CAAQA,CAAAA,CAAS,MAAA,CAAQ,IAAA,CAAApO,CAAK,CACzC,CAEA,eAAsBgnC,GACpB9E,CAAAA,CAC+C,CAE/C,IAAM9zB,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,yBAA0B,CAChF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA8mB,CAAM,CAAC,CAChC,CAAC,CAAA,CAEKliC,EAAO,MAAM2mC,CAAAA,CAA2Cv4B,CAAQ,CAAA,CACtE,OAAO,CAAE,MAAA,CAAQA,CAAAA,CAAS,OAAQ,IAAA,CAAApO,CAAK,CACzC,CAEA,eAAsBinC,EAAAA,CACpB7gC,CAAAA,CACA8gC,CAAAA,CACAC,CAAAA,CAAsB,GACtBjxB,CAAAA,CAAsB,EAAA,CACP,CACf,IAAMxL,CAAAA,CAKF,CAAE,IAAA,CAAAtE,CAAAA,CAAM,EAAA,CAAA8gC,CAAG,CAAA,CAEXC,CAAAA,GACFz8B,EAAO,EAAA,CAAKy8B,CAAAA,CAAAA,CAEVjxB,IACFxL,CAAAA,CAAO,EAAA,CAAKwL,GAId,IAAM9H,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,eAAiB,2BAAA,CAA6B,CACnF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU1Q,CAAM,CAC7B,CAAC,CAAA,CAED,MAAMi8B,EAAkBv4B,CAAQ,EAClC,CAEA,eAAsBg5B,EAAAA,CACpBhhC,CAAAA,CACAib,EACA0B,CAAAA,CAAuB,IAAA,CACvBU,EAAsB,IAAA,CACM,CAC5B,IAAMzjB,CAAAA,CAAqF,CACzF,IAAA,CAAAoG,CACF,CAAA,CAEIib,CAAAA,GACFrhB,EAAK,MAAA,CAASqhB,CAAAA,CAAAA,CAGZ0B,IACF/iB,CAAAA,CAAK,KAAA,CAAQ+iB,GAGXU,CAAAA,GACFzjB,CAAAA,CAAK,IAAA,CAAOyjB,CAAAA,CAAAA,CAId,IAAMrV,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAAqCv4B,CAAQ,CACtD,CAEA,eAAsBi5B,EAAAA,CACpBjhC,EACAwK,CAAAA,CACA02B,CAAAA,CACAC,EACAC,CAAAA,CACA7uB,CAAAA,CACiC,CACjC,IAAM3Y,CAAAA,CAAO,CACX,KAAAoG,CAAAA,CACA,QAAA,CAAAwK,EACA,KAAA,CAAA+H,CAAAA,CACA,OAAA2uB,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CACF,CAAA,CAGMp5B,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,+BAAgC,CACtF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA0Cv4B,CAAQ,CAC3D,CAEA,eAAsBq5B,GACpBrhC,CAAAA,CACAwK,CAAAA,CACA+H,EACiC,CACjC,IAAM3Y,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,SAAAwK,CAAAA,CAAU,KAAA,CAAA+H,CAAM,CAAA,CAE/BvK,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,EAA0Cv4B,CAAQ,CAC3D,CAEA,eAAsBs5B,EAAAA,CACpBthC,CAAAA,CACAxD,CAAAA,CACkC,CAClC,IAAM5C,EAAkD,CACtD,IAAA,CAAAoG,CACF,CAAA,CACIxD,CAAAA,GACF5C,EAAK,EAAA,CAAK4C,CAAAA,CAAAA,CAIZ,IAAMwL,CAAAA,CAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,kCAAmC,CACzF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBu5B,GAASvhC,CAAAA,CAA0BqE,CAAAA,CAA+C,CACtG,IAAMzK,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,GAAA,CAAAqE,CAAI,CAAA,CAEnB2D,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,yBAAA,CAA2B,CACjF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAOA,IAAMw5B,EAAAA,CAAc,sBAAA,CAEpB,eAAsBC,EAAAA,CACpBC,CAAAA,CACAnvB,EACA1N,CAAAA,CAC0B,CAC1B,IAAM88B,CAAAA,CAAWlpB,CAAAA,GACXmpB,CAAAA,CAAW,IAAI,SACrBA,CAAAA,CAAS,MAAA,CAAO,OAAQF,CAAI,CAAA,CAE5B,IAAM15B,CAAAA,CAAW,MAAM25B,CAAAA,CAAS,GAAGH,EAAW,CAAA,IAAA,EAAOjvB,CAAK,CAAA,CAAA,CAAI,CAC5D,OAAQ,MAAA,CACR,IAAA,CAAMqvB,CAAAA,CACN,MAAA,CAAA/8B,CACF,CAAC,EAED,OAAO07B,CAAAA,CAAmCv4B,CAAQ,CACpD,CAOA,eAAsB65B,EAAAA,CACpBH,CAAAA,CACAl3B,CAAAA,CACAvP,CAAAA,CACA4J,CAAAA,CAC0B,CAC1B,IAAM88B,CAAAA,CAAWlpB,CAAAA,GACXmpB,CAAAA,CAAW,IAAI,SACrBA,CAAAA,CAAS,MAAA,CAAO,OAAQF,CAAI,CAAA,CAE5B,IAAM15B,CAAAA,CAAW,MAAM25B,EAAS,CAAA,EAAG3sB,CAAAA,CAAO,SAAS,CAAA,CAAA,EAAIxK,CAAQ,CAAA,CAAA,EAAIvP,CAAS,CAAA,CAAA,CAAI,CAC9E,OAAQ,MAAA,CACR,IAAA,CAAM2mC,EACN,MAAA,CAAA/8B,CACF,CAAC,CAAA,CAED,OAAO07B,CAAAA,CAAmCv4B,CAAQ,CACpD,CAEA,eAAsB85B,EAAAA,CACpB9hC,CAAAA,CACA+hC,EACkC,CAClC,IAAMnoC,EAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,EAAA,CAAI+hC,CAAQ,CAAA,CAE3B/5B,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACpF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBg6B,GACpBhiC,CAAAA,CACA+rB,CAAAA,CACArnB,EACAghB,CAAAA,CACAvF,CAAAA,CAC8B,CAC9B,IAAMvmB,CAAAA,CAAO,CAAE,KAAAoG,CAAAA,CAAM,KAAA,CAAA+rB,EAAO,IAAA,CAAArnB,CAAAA,CAAM,KAAAghB,CAAAA,CAAM,IAAA,CAAAvF,CAAK,CAAA,CAEvCnY,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,yBAAA,CAA2B,CACjF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAAuCv4B,CAAQ,CACxD,CAEA,eAAsBi6B,EAAAA,CACpBjiC,CAAAA,CACAkiC,EACAnW,CAAAA,CACArnB,CAAAA,CACAghB,EACAvF,CAAAA,CAC8B,CAC9B,IAAMvmB,CAAAA,CAAO,CAAE,IAAA,CAAAoG,EAAM,EAAA,CAAIkiC,CAAAA,CAAS,MAAAnW,CAAAA,CAAO,IAAA,CAAArnB,EAAM,IAAA,CAAAghB,CAAAA,CAAM,IAAA,CAAAvF,CAAK,CAAA,CAEpDnY,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAAuCv4B,CAAQ,CACxD,CAEA,eAAsBm6B,EAAAA,CACpBniC,EACAkiC,CAAAA,CACkC,CAClC,IAAMtoC,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,EAAA,CAAIkiC,CAAQ,EAE3Bl6B,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBo6B,EAAAA,CACpBpiC,CAAAA,CACAgb,EACA+Q,CAAAA,CACArnB,CAAAA,CACAyb,CAAAA,CACA/W,CAAAA,CACAi5B,CAAAA,CACAC,CAAAA,CACkC,CAClC,IAAM1oC,CAAAA,CAAgC,CACpC,IAAA,CAAAoG,CAAAA,CACA,SAAAgb,CAAAA,CACA,KAAA,CAAA+Q,CAAAA,CACA,IAAA,CAAArnB,CAAAA,CACA,IAAA,CAAAyb,EACA,QAAA,CAAAkiB,CAAAA,CACA,OAAAC,CACF,CAAA,CAEIl5B,IACFxP,CAAAA,CAAK,OAAA,CAAUwP,CAAAA,CAAAA,CAIjB,IAAMpB,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,4BAAA,CAA8B,CACpF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBu6B,EAAAA,CACpBviC,CAAAA,CACAxD,EACkC,CAClC,IAAM5C,EAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,EAAA,CAAAxD,CAAG,CAAA,CAElBwL,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,gCAAiC,CACvF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBw6B,GAAaxiC,CAAAA,CAA0BxD,CAAAA,CAAiC,CAC5F,IAAM5C,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,EAAA,CAAAxD,CAAG,CAAA,CAElBwL,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,6BAAA,CAA+B,CACrF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA8Bv4B,CAAQ,CAC/C,CAEA,eAAsBy6B,EAAAA,CACpBziC,CAAAA,CACA+a,EACAC,CAAAA,CACoD,CACpD,IAAMphB,CAAAA,CAAO,CAAE,KAAAoG,CAAAA,CAAM,MAAA,CAAA+a,EAAQ,QAAA,CAAAC,CAAS,EAEhChT,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACpF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA6Dv4B,CAAQ,CAC9E,CAEA,eAAsB06B,EAAAA,CACpBl4B,CAAAA,CACAsxB,CAAAA,CACA6G,CAAAA,CACkC,CAClC,IAAMC,CAAAA,CAAW,CACf,QAAA,CAAAp4B,CAAAA,CACA,MAAAsxB,CAAAA,CACA,MAAA,CAAA6G,CACF,CAAA,CAEM36B,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,oCAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU4tB,CAAQ,CAC/B,CACF,CAAA,CAEA,OAAOrC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CCjcO,SAAS66B,EAAAA,CACdr4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,SAAU,KAAA,CAAOlJ,CAAQ,EAChD,UAAA,CAAY,MAAO,CACjB,KAAA,CAAAuhB,CAAAA,CACA,KAAArnB,CAAAA,CACA,IAAA,CAAAghB,EACA,IAAA,CAAAvF,CACF,IAKM,CACJ,GAAI,CAAC3V,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAE5D,OAAOgiC,GAAShiC,CAAAA,CAAM+rB,CAAAA,CAAOrnB,EAAMghB,CAAAA,CAAMvF,CAAI,CAC/C,CAAA,CACA,SAAA,CAAYvmB,CAAAA,EAAS,CACnB6Z,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,GAEPzd,CAAAA,EAAM,MAAA,CACRkgC,CAAAA,CAAG,YAAA,CAAa3gB,CAAAA,CAAU,KAAA,CAAM,OAAO3O,CAAQ,CAAA,CAAG5Q,EAAK,MAAM,CAAA,CAE7DkgC,EAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,OAAO3O,CAAQ,CAAE,CAAC,CAAA,CAGrEsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe3O,CAAQ,CAAE,CAAC,EAC7E,EACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCtCO,SAASuS,EAAAA,CACdt4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,SAAU,QAAA,CAAUlJ,CAAQ,EACnD,UAAA,CAAY,MAAO,CACjB,OAAA,CAAA03B,CAAAA,CACA,MAAAnW,CAAAA,CACA,IAAA,CAAArnB,EACA,IAAA,CAAAghB,CAAAA,CACA,KAAAvF,CACF,CAAA,GAMM,CACJ,GAAI,CAAC3V,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,EAE/D,OAAOiiC,EAAAA,CAAYjiC,EAAMkiC,CAAAA,CAASnW,CAAAA,CAAOrnB,CAAAA,CAAMghB,CAAAA,CAAMvF,CAAI,CAC3D,EACA,SAAA,CAAW,IAAM,CACf1M,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,EAAe,CAC1ByiB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,OAAO3O,CAAQ,CAAE,CAAC,CAAA,CACnEsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,KAAA,CAAM,cAAA,CAAe3O,CAAQ,CAAE,CAAC,EAC7E,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCjCO,SAASwS,EAAAA,CACdv4B,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,QAAA,CAAU,QAAA,CAAUlJ,CAAQ,CAAA,CACnD,UAAA,CAAY,MAAO,CAAE,OAAA,CAAA03B,CAAQ,IAA2B,CACtD,GAAI,CAAC13B,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,MAAM,kDAA6C,CAAA,CAE/D,OAAOmiC,EAAAA,CAAYniC,CAAAA,CAAMkiC,CAAO,CAClC,CAAA,CACA,SAAU,MAAO,CAAE,OAAA,CAAAA,CAAQ,CAAA,GAAM,CAC/B,GAAI,CAAC13B,CAAAA,CACH,OAGF,IAAMsvB,CAAAA,CAAKziB,GAAe,CACpB2iB,CAAAA,CAAU7gB,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,EACzCyvB,CAAAA,CAAiB9gB,CAAAA,CAAU,MAAM,cAAA,CAAe3O,CAAQ,EAE9D,MAAM,OAAA,CAAQ,GAAA,CAAI,CAChBsvB,CAAAA,CAAG,aAAA,CAAc,CAAE,QAAA,CAAUE,CAAQ,CAAC,CAAA,CACtCF,CAAAA,CAAG,cAAc,CAAE,QAAA,CAAUG,CAAe,CAAC,CAC/C,CAAC,CAAA,CAED,IAAME,EAAeL,CAAAA,CAAG,YAAA,CAAsBE,CAAO,CAAA,CACjDG,CAAAA,EACFL,CAAAA,CAAG,YAAA,CACDE,CAAAA,CACAG,CAAAA,CAAa,OAAQ93B,CAAAA,EAAMA,CAAAA,CAAE,MAAQ6/B,CAAO,CAC9C,EAGF,IAAM5H,CAAAA,CAAkBR,CAAAA,CAAG,cAAA,CAAqD,CAC9E,QAAA,CAAUG,CACZ,CAAC,CAAA,CACKM,EAAmB,IAAI,GAAA,CAAID,CAAe,CAAA,CAChD,IAAA,GAAW,CAAC9/B,CAAAA,CAAKZ,CAAI,CAAA,GAAK0gC,EACpB1gC,CAAAA,EACFkgC,CAAAA,CAAG,aAAat/B,CAAAA,CAAK,CACnB,GAAGZ,CAAAA,CACH,KAAA,CAAOA,EAAK,KAAA,CAAM,GAAA,CAAKsjB,IAAU,CAC/B,GAAGA,EACH,IAAA,CAAMA,CAAAA,CAAK,KAAK,MAAA,CAAQ7a,CAAAA,EAAMA,CAAAA,CAAE,GAAA,GAAQ6/B,CAAO,CACjD,EAAE,CACJ,CAAC,EAIL,OAAO,CAAE,aAAA/H,CAAAA,CAAc,gBAAA,CAAAI,CAAiB,CAC1C,CAAA,CACA,SAAA,CAAW,IAAM,CACf9mB,CAAAA,KACA,IAAMqmB,CAAAA,CAAKziB,GAAe,CAC1ByiB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,MAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,CAAA,CACnEsvB,EAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,eAAe3O,CAAQ,CAAE,CAAC,EAC7E,CAAA,CACA,QAAS,CAAC9G,CAAAA,CAAKs/B,CAAAA,CAAYxI,CAAAA,GAAY,CACrC,IAAMV,EAAKziB,CAAAA,EAAe,CAI1B,GAHImjB,CAAAA,EAAS,YAAA,EACXV,EAAG,YAAA,CAAa3gB,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAA,CAAGgwB,EAAQ,YAAY,CAAA,CAEpEA,GAAS,gBAAA,CACX,IAAA,GAAW,CAAChgC,CAAAA,CAAKZ,CAAI,CAAA,GAAK4gC,CAAAA,CAAQ,gBAAA,CAChCV,CAAAA,CAAG,aAAat/B,CAAAA,CAAKZ,CAAI,EAG7B22B,CAAAA,GAAU7sB,CAAG,EACf,CACF,CAAC,CACH,CC3EO,SAASu/B,EAAAA,CACdz4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,YAAa,KAAA,CAAOlJ,CAAQ,EACnD,UAAA,CAAY,MAAO,CACjB,QAAA,CAAAwQ,CAAAA,CACA,KAAA,CAAA+Q,EACA,IAAA,CAAArnB,CAAAA,CACA,KAAAyb,CAAAA,CACA,OAAA,CAAA/W,EACA,QAAA,CAAAi5B,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,GAQM,CACJ,GAAI,CAAC93B,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,EAE/D,OAAOoiC,EAAAA,CAAYpiC,EAAMgb,CAAAA,CAAU+Q,CAAAA,CAAOrnB,EAAMyb,CAAAA,CAAM/W,CAAAA,CAASi5B,EAAUC,CAAM,CACjF,CAAA,CACA,SAAA,CAAW,IAAM,CACf7uB,KAAY,CACZ4D,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,SAAU8B,CAAAA,CAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAC9C,CAAC,EACH,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCtCO,SAAS2S,EAAAA,CACd14B,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,EACA,CACA,OAAO7c,YAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,WAAA,CAAa,SAAUlJ,CAAQ,CAAA,CACtD,WAAY,MAAO,CAAE,GAAAhO,CAAG,CAAA,GAAsB,CAC5C,GAAI,CAACgO,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,qDAAgD,EAElE,OAAOuiC,EAAAA,CAAeviC,CAAAA,CAAMxD,CAAE,CAChC,CAAA,CACA,UAAY5C,CAAAA,EAAS,CACnB6Z,KAAY,CACZ,IAAMqmB,EAAKziB,CAAAA,EAAe,CAEtBzd,CAAAA,CACFkgC,CAAAA,CAAG,YAAA,CAAa3gB,CAAAA,CAAU,MAAM,SAAA,CAAU3O,CAAQ,EAAG5Q,CAAI,CAAA,CAEzDkgC,EAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,UAAU3O,CAAQ,CAAE,CAAC,EAE1E,CAAA,CACA,QAAA+lB,CACF,CAAC,CACH,CC1BO,SAAS4S,GACd34B,CAAAA,CACAxK,CAAAA,CACAyT,EACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,WAAA,CAAa,OAAQlJ,CAAQ,CAAA,CACpD,WAAY,MAAO,CAAE,EAAA,CAAAhO,CAAG,CAAA,GAAsB,CAC5C,GAAI,CAACgO,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,mDAA8C,EAEhE,OAAOwiC,EAAAA,CAAaxiC,EAAMxD,CAAE,CAC9B,EACA,SAAA,CAAY5C,CAAAA,EAAS,CACnB6Z,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,EAAe,CAEtBzd,EACFkgC,CAAAA,CAAG,YAAA,CAAa3gB,EAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAAA,CAAG5Q,CAAI,CAAA,CAEzDkgC,CAAAA,CAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,UAAU3O,CAAQ,CAAE,CAAC,CAAA,CAGxEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,MAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,EACrE,EACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CChBO,SAAS6S,EAAAA,CACd54B,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,QAAA,CAAU,KAAA,CAAOlJ,CAAQ,CAAA,CAChD,UAAA,CAAY,MAAO,CAAE,GAAA,CAAAnG,CAAAA,CAAK,KAAMg/B,CAAS,CAAA,GAAsC,CAC7E,IAAMC,CAAAA,CAAgBD,GAAYrjC,CAAAA,CAElC,GAAI,CAACwK,CAAAA,EAAY,CAAC84B,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAE5D,OAAO/B,GAAS+B,CAAAA,CAAej/B,CAAG,CACpC,CAAA,CACA,SAAA,CAAW,IAAM,CACfoP,CAAAA,KACA4D,CAAAA,EAAe,CAAE,kBAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAC3C,CAAC,EACH,EACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCtBO,SAASgT,EAAAA,CACd/4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,SAAU,QAAA,CAAUlJ,CAAQ,EACnD,UAAA,CAAY,MAAO,CAAE,OAAA,CAAAu3B,CAAQ,IAA2B,CACtD,GAAI,CAACv3B,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,MAAM,kDAA6C,CAAA,CAE/D,OAAO8hC,EAAAA,CAAY9hC,CAAAA,CAAM+hC,CAAO,CAClC,CAAA,CACA,SAAA,CAAW,CAAC3R,CAAAA,CAAOC,CAAAA,GAAc,CAC/B5c,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,EAAe,CACpB,CAAE,OAAA,CAAA0qB,CAAQ,EAAI1R,CAAAA,CAGpByJ,CAAAA,CAAG,aACD,CAAC,OAAA,CAAS,QAAA,CAAUtvB,CAAQ,CAAA,CAC3Bg5B,CAAAA,EAASA,GAAM,MAAA,CAAQC,CAAAA,EAAQA,EAAI,GAAA,GAAQ1B,CAAO,CACrD,CAAA,CAGAjI,CAAAA,CAAG,eACD,CAAE,QAAA,CAAU,CAAC,OAAA,CAAS,QAAA,CAAU,WAAYtvB,CAAQ,CAAE,EACrDkf,CAAAA,EACMA,CAAAA,EACE,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOA,EAAQ,KAAA,CAAM,GAAA,CAAKxM,IAAU,CAClC,GAAGA,EACH,IAAA,CAAMA,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQumB,CAAAA,EAAQA,CAAAA,CAAI,MAAQ1B,CAAO,CACrD,EAAE,CACJ,CAEJ,EACF,CAAA,CACA,OAAA,CAAAxR,CACF,CAAC,CACH,CC1CO,SAASmT,EAAAA,CACdjwB,EACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,SAAU,QAAQ,CAAA,CACzC,WAAY,MAAO,CACjB,IAAA,CAAAguB,CAAAA,CACA,KAAA,CAAAnvB,CAAAA,CACA,OAAA1N,CACF,CAAA,GAKS48B,GAAYC,CAAAA,CAAMnvB,CAAAA,CAAO1N,CAAM,CAAA,CAExC,SAAA,CAAA4O,CAAAA,CACA,OAAA,CAAA8c,CACF,CAAC,CACH,CClCA,SAAS/E,GAAczQ,CAAAA,CAAgBC,CAAAA,CAAkB,CACvD,OAAO,CAAA,EAAA,EAAKD,CAAM,CAAA,CAAA,EAAIC,CAAQ,CAAA,CAChC,CAEA,SAAS2oB,EAAAA,CACP5oB,EACAC,CAAAA,CACA8e,CAAAA,CACmB,CAEnB,OAAA,CADoBA,CAAAA,EAAMziB,GAAe,EACtB,YAAA,CACjB8B,EAAU,KAAA,CAAM,KAAA,CAAMqS,GAAczQ,CAAAA,CAAQC,CAAQ,CAAC,CACvD,CACF,CAEA,SAAS4oB,EAAAA,CAAgBxf,CAAAA,CAAc0V,EAAkB,CAAA,CACnCA,CAAAA,EAAMziB,GAAe,EAC7B,YAAA,CACV8B,EAAU,KAAA,CAAM,KAAA,CAAMqS,EAAAA,CAAcpH,CAAAA,CAAM,MAAA,CAAQA,CAAAA,CAAM,QAAQ,CAAC,CAAA,CACjEA,CACF,EACF,CAEA,SAASyf,EAAAA,CACP9oB,CAAAA,CACAC,CAAAA,CACA8oB,CAAAA,CACAhK,CAAAA,CACmB,CACnB,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,GAAe,CACnC3P,CAAAA,CAAO8jB,GAAczQ,CAAAA,CAAQC,CAAQ,EACrCrZ,CAAAA,CAAWuuB,CAAAA,CAAY,aAAoB/W,CAAAA,CAAU,KAAA,CAAM,MAAMzR,CAAI,CAAC,EAC5E,GAAI,CAAC/F,CAAAA,CAAU,OAEf,IAAMoiC,CAAAA,CAAUD,EAAQniC,CAAQ,CAAA,CAChC,OAAAuuB,CAAAA,CAAY,YAAA,CAAoB/W,EAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAA,CAAGq8B,CAAO,CAAA,CAC7DpiC,CACT,CASO,IAAUqiC,OAAV,CACE,SAASC,EACdlpB,CAAAA,CACAC,CAAAA,CACA6B,CAAAA,CACAqnB,CAAAA,CACApK,CAAAA,CACA,CACA+J,GACE9oB,CAAAA,CACAC,CAAAA,CACCoJ,IAAW,CACV,GAAGA,EACH,YAAA,CAAcvH,CAAAA,CACd,MAAO,CACL,GAAIuH,EAAM,KAAA,EAAS,CACjB,KAAM,KAAA,CACN,IAAA,CAAM,MACN,WAAA,CAAa,CAAA,CACb,WAAA,CAAa,CACf,CAAA,CACA,WAAA,CAAavH,EAAM,MAAA,CACnB,WAAA,CAAauH,EAAM,KAAA,EAAO,WAAA,EAAe,CAC3C,CAAA,CACA,WAAA,CAAavH,CAAAA,CAAM,MAAA,CACnB,MAAA,CAAAqnB,CAAAA,CACA,qBAAsB,MAAA,CAAOA,CAAM,CACrC,CAAA,CAAA,CACApK,CACF,EACF,CA7BOkK,CAAAA,CAAS,WAAA,CAAAC,CAAAA,CA+BT,SAASE,CAAAA,CACdppB,EACAC,CAAAA,CACAopB,CAAAA,CACAtK,EACA,CACA+J,EAAAA,CACE9oB,EACAC,CAAAA,CACCoJ,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,QAASggB,CACX,CAAA,CAAA,CACAtK,CACF,EACF,CAfOkK,EAAS,kBAAA,CAAAG,CAAAA,CAiBT,SAASE,CAAAA,CACdtpB,CAAAA,CACAC,CAAAA,CACAopB,EACAtK,CAAAA,CACA,CACA+J,GACE9oB,CAAAA,CACAC,CAAAA,CACCoJ,IAAW,CACV,GAAGA,CAAAA,CACH,QAAA,CAAUggB,CACZ,CAAA,CAAA,CACAtK,CACF,EACF,CAfOkK,EAAS,kBAAA,CAAAK,CAAAA,CAiBT,SAASC,CAAAA,CACdC,CAAAA,CACAzT,CAAAA,CACAC,CAAAA,CACA+I,CAAAA,CACA,CACA+J,GACE/S,CAAAA,CACAC,CAAAA,CACC3M,IAAW,CACV,GAAGA,EACH,QAAA,CAAUA,CAAAA,CAAM,SAAW,CAAA,CAC3B,OAAA,CAAS,CAACmgB,CAAAA,CAAO,GAAGngB,EAAM,OAAO,CACnC,GACA0V,CACF,EACF,CAhBOkK,CAAAA,CAAS,QAAA,CAAAM,CAAAA,CAkBT,SAASE,CAAAA,CAAchV,CAAAA,CAAkBsK,EAAkB,CAChEtK,CAAAA,CAAQ,QAASpL,CAAAA,EAAUwf,EAAAA,CAAgBxf,CAAAA,CAAO0V,CAAE,CAAC,EACvD,CAFOkK,CAAAA,CAAS,aAAA,CAAAQ,EAIT,SAASC,CAAAA,CACd1pB,EACAC,CAAAA,CACA8e,CAAAA,CACA,CAAA,CACoBA,CAAAA,EAAMziB,CAAAA,EAAe,EAC7B,kBAAkB,CAC5B,QAAA,CAAU8B,EAAU,KAAA,CAAM,KAAA,CAAMqS,GAAczQ,CAAAA,CAAQC,CAAQ,CAAC,CACjE,CAAC,EACH,CATOgpB,CAAAA,CAAS,gBAAAS,CAAAA,CAWT,SAASC,EACd3pB,CAAAA,CACAC,CAAAA,CACA8e,CAAAA,CACmB,CACnB,OAAO6J,EAAAA,CAAkB5oB,EAAQC,CAAAA,CAAU8e,CAAE,CAC/C,CANOkK,CAAAA,CAAS,SAAAU,EAAAA,CAAAA,EAnGDV,EAAAA,GAAAA,EAAAA,CAAA,EAAA,CAAA,CAAA,CCrCV,SAASW,EAAAA,CACdC,CAAAA,CACApoB,EACAoU,CAAAA,CACS,CACT,IAAMiU,CAAAA,CAAiBD,CAAAA,CAAY,KAAMprC,CAAAA,EAAMA,CAAAA,CAAE,KAAA,GAAUgjB,CAAK,CAAA,CAChE,OAAOoU,IAAW,CAAA,CAAIiU,CAAAA,CAAiB,CAACA,CAC1C,CAyBO,SAASC,EAAAA,CACdt6B,CAAAA,CACA6lB,EACAyJ,CAAAA,CACM,CACN,IAAM1V,CAAAA,CAAQ4f,EAAAA,CAAuB,SAAS3T,CAAAA,CAAU,MAAA,CAAQA,EAAU,QAAA,CAAUyJ,CAAE,CAAA,CACtF,GACE,CAAC1V,CAAAA,EAAO,cACRugB,EAAAA,CAAuBvgB,CAAAA,CAAM,aAAc5Z,CAAAA,CAAU6lB,CAAAA,CAAU,MAAM,CAAA,CAErE,OAEF,IAAM0U,CAAAA,CAAW,CACf,GAAG3gB,EAAM,YAAA,CAAa,MAAA,CAAQ5qB,GAAMA,CAAAA,CAAE,KAAA,GAAUgR,CAAQ,CAAA,CACxD,GAAI6lB,CAAAA,CAAU,MAAA,GAAW,CAAA,CAAI,CAAC,CAAE,OAAA,CAASA,CAAAA,CAAU,OAAQ,KAAA,CAAO7lB,CAAU,CAAC,CAAA,CAAI,EACnF,CAAA,CACMw6B,CAAAA,CAAY5gB,EAAM,MAAA,EAAUiM,CAAAA,CAAU,WAAa,CAAA,CAAA,CACzD2T,EAAAA,CAAuB,YACrB3T,CAAAA,CAAU,MAAA,CACVA,CAAAA,CAAU,QAAA,CACV0U,CAAAA,CACAC,CAAAA,CACAlL,CACF,EACF,CA0DO,SAASmL,EAAAA,CACdz6B,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,OAAA,CAAS,MAAM,CAAA,CAChB/I,CAAAA,CACA,CAAC,CAAE,MAAA,CAAAuQ,EAAQ,QAAA,CAAAC,CAAAA,CAAU,MAAA,CAAA4V,CAAO,CAAA,GAAM,CAChCD,GAAYnmB,CAAAA,CAAWuQ,CAAAA,CAAQC,EAAU4V,CAAM,CACjD,EACA,MAAO96B,CAAAA,CAAau6B,IAAc,CAGhCyU,EAAAA,CAAqBt6B,EAAU6lB,CAAS,CAAA,CAKxC,IAAMxmB,CAAAA,CAAO/T,CAAAA,EAAQ,IAAMA,CAAAA,EAAQ,KAAA,CAOnC,GANImc,CAAAA,EAAM,OAAA,EAAS,cAAA,EAAkBpI,GACnCoI,CAAAA,CAAK,OAAA,CAAQ,eAAe,GAAA,CAAKpI,CAAAA,CAAM/T,GAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,EAKtEmc,CAAAA,EAAM,OAAA,EAAS,kBAAmB,CACpC,IAAMizB,EAAe,IAAM,CACzBjzB,CAAAA,CAAK,OAAA,CAAS,iBAAA,CAAmB,CAC/BkH,EAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,MAAM,IAAIA,CAAAA,CAAU,QAAQ,EAAE,CAAA,CACnElX,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAC,EACH,GACa6H,CAAAA,EAAiB,OAAA,IACjB,OAAA,CACX,UAAA,CAAW6yB,CAAAA,CAAc,GAAI,EAE7BA,CAAAA,GAEJ,CACF,CAAA,CACAjzB,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC/GO,SAAS8yB,EAAAA,CACd36B,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,OAAA,CAAS,QAAQ,CAAA,CAClB/I,EACA,CAAC,CAAE,OAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,EAAU,YAAA,CAAAwW,CAAa,IAAM,CACtCD,EAAAA,CAAc/mB,EAAWuQ,CAAAA,CAAQC,CAAAA,CAAUwW,GAAgB,KAAK,CAClE,EACA,MAAO17B,CAAAA,CAAau6B,CAAAA,GAAc,CAEhC,IAAMjM,CAAAA,CAAQ4f,GAAuB,QAAA,CAAS3T,CAAAA,CAAU,OAAQA,CAAAA,CAAU,QAAQ,EAClF,GAAIjM,CAAAA,CAAO,CACT,IAAMghB,CAAAA,CAAW,IAAA,CAAK,IAAI,CAAA,CAAA,CAAIhhB,CAAAA,CAAM,SAAW,CAAA,GAAMiM,CAAAA,CAAU,aAAe,EAAA,CAAK,CAAA,CAAE,CAAA,CACrF2T,EAAAA,CAAuB,kBAAA,CAAmB3T,CAAAA,CAAU,OAAQA,CAAAA,CAAU,QAAA,CAAU+U,CAAQ,EAC1F,CAKA,IAAMv7B,CAAAA,CAAO/T,CAAAA,EAAQ,IAAMA,CAAAA,EAAQ,KAAA,CAC/Bmc,GAAM,OAAA,EAAS,cAAA,EAAkBpI,GACnCoI,CAAAA,CAAK,OAAA,CAAQ,eAAe,GAAA,CAAKpI,CAAAA,CAAM/T,CAAAA,EAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,EAK1E,IAAMuvC,CAAAA,CAAa,IAAM,CACZhuB,CAAAA,EAAe,CACvB,iBAAA,CAAkB,CACnB,QAAA,CAAU8B,EAAU,KAAA,CAAM,sBAAA,CAAuB3O,CAAS,CAC5D,CAAC,EACGyH,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjBA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CAC7BkH,CAAAA,CAAU,KAAA,CAAM,MAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,CAAA,CACnElX,EAAU,KAAA,CAAM,WAAA,CAAYkX,EAAU,MAAA,CAAQA,CAAAA,CAAU,QAAQ,CAClE,CAAC,EAEL,CAAA,CAAA,CACahe,CAAAA,EAAiB,OAAA,IACjB,QACX,UAAA,CAAWgzB,CAAAA,CAAY,GAAI,CAAA,CAE3BA,CAAAA,GAEJ,CAAA,CACApzB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCIO,SAASizB,EAAAA,CACd96B,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAS,SAAS,CAAA,CACnB/I,EACCmJ,CAAAA,EAAY,CACX,IAAM9E,CAAAA,CAA0B,GAgBhC,GAbAA,CAAAA,CAAW,KACTgiB,EAAAA,CACEld,CAAAA,CAAQ,OACRA,CAAAA,CAAQ,QAAA,CACRA,EAAQ,YAAA,CACRA,CAAAA,CAAQ,cAAA,CACRA,CAAAA,CAAQ,KAAA,CACRA,CAAAA,CAAQ,KACRA,CAAAA,CAAQ,YACV,CACF,CAAA,CAGIA,CAAAA,CAAQ,QAAS,CACnB,GAAM,CACJ,iBAAA,CAAAsd,CAAAA,CAAoB,iBAAA,CACpB,WAAAC,CAAAA,CAAa,GAAA,CACb,WAAAC,CAAAA,CAAa,IAAA,CACb,qBAAAC,CAAAA,CAAuB,IAAA,CACvB,aAAA,CAAAmU,CAAAA,CAAgB,EAClB,EAAI5xB,CAAAA,CAAQ,OAAA,CAEN0d,EAAoB,EAAC,CAG3B,GAAIkU,CAAAA,CAAc,MAAA,CAAS,EAAG,CAE5B,IAAMC,EAAsB,CAAC,GAAGD,CAAa,CAAA,CAAE,IAAA,CAAK,CAACpqC,CAAAA,CAAGvF,CAAAA,GACtDuF,CAAAA,CAAE,OAAA,CAAQ,aAAA,CAAcvF,CAAAA,CAAE,OAAO,CACnC,CAAA,CAEAy7B,EAAW,IAAA,CAAK,CACd,EACA,CACE,aAAA,CAAemU,CAAAA,CAAoB,GAAA,CAAI5vC,CAAAA,GAAM,CAC3C,QAASA,CAAAA,CAAE,OAAA,CACX,OAAQA,CAAAA,CAAE,MACZ,EAAE,CACJ,CACF,CAAC,EACH,CAEAiZ,CAAAA,CAAW,KACTmiB,EAAAA,CACErd,CAAAA,CAAQ,OACRA,CAAAA,CAAQ,QAAA,CACRsd,EACAC,CAAAA,CACAC,CAAAA,CACAC,EACAC,CACF,CACF,EACF,CAEA,OAAOxiB,CACT,CAAA,CACA,MAAO/Y,EAAau6B,CAAAA,GAAc,CAEhC,IAAMoV,CAAAA,CAAS,CAACpV,CAAAA,CAAU,aACpBqV,CAAAA,CAAeD,CAAAA,CAAS,IAAM,GAAA,CAK9B57B,CAAAA,CAAO/T,GAAQ,EAAA,EAAMA,CAAAA,EAAQ,KAAA,CAMnC,GALImc,CAAAA,EAAM,OAAA,EAAS,gBAAkBpI,CAAAA,EACnCoI,CAAAA,CAAK,QAAQ,cAAA,CAAeyzB,CAAAA,CAAc77B,EAAM/T,CAAAA,EAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,CAAA,CAI/Emc,CAAAA,EAAM,SAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,gBAAgB,OAAA,CAAQ3O,CAAS,CAC7C,CAAA,CAGA,GAAI,CAACi7B,CAAAA,CAAQ,CAEXE,CAAAA,CAAoB,KAClBxsB,CAAAA,CAAU,KAAA,CAAM,MAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,YAAY,CAAA,CAAA,EAAIA,CAAAA,CAAU,cAAc,CAAA,CAAE,CACjF,CAAA,CAMA,IAAMuV,CAAAA,CAAoBvV,CAAAA,CAAU,YAAcA,CAAAA,CAAU,YAAA,CACtDwV,EAAsBxV,CAAAA,CAAU,YAAA,EAAgBA,CAAAA,CAAU,cAAA,CAEhEsV,CAAAA,CAAoB,IAAA,CAAK,CACvB,SAAA,CAAY9pB,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,EAAM,QAAA,CAClB,OACE,MAAM,OAAA,CAAQrhB,CAAG,GACjBA,CAAAA,CAAI,CAAC,IAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAMorC,CAAAA,EACXprC,EAAI,CAAC,CAAA,GAAMqrC,CAEf,CACF,CAAC,EACH,CAEA,MAAM5zB,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,EACA,SAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCzOO,SAASyzB,EAAAA,CACd1hB,EACA2hB,CAAAA,CACAC,CAAAA,CACAlM,EACA,CACA,IAAM5J,EAAc4J,CAAAA,EAAMziB,CAAAA,GACpB4uB,CAAAA,CAAU/V,CAAAA,CAAY,eAAwB,CAClD,SAAA,CAAYrU,GAAU,CACpB,IAAMrhB,EAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,GACjBA,CAAAA,CAAI,CAAC,IAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAMurC,CAAAA,EACXvrC,EAAI,CAAC,CAAA,GAAMwrC,CAEf,CACF,CAAC,EAED,IAAA,GAAW,CAACxuB,CAAAA,CAAU5d,CAAI,CAAA,GAAKqsC,CAAAA,CACzBrsC,GACFs2B,CAAAA,CAAY,YAAA,CAAsB1Y,EAAU,CAAC4M,CAAAA,CAAO,GAAGxqB,CAAI,CAAC,EAGlE,CAMO,SAASssC,GACdnrB,CAAAA,CACAC,CAAAA,CACA+qB,EACAC,CAAAA,CACAlM,CAAAA,CACkC,CAClC,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACnC8uB,CAAAA,CAAY,IAAI,GAAA,CAEhBF,CAAAA,CAAU/V,EAAY,cAAA,CAAwB,CAClD,UAAYrU,CAAAA,EAAU,CACpB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,aAAA,EACXA,EAAI,CAAC,CAAA,GAAMurC,GACXvrC,CAAAA,CAAI,CAAC,IAAMwrC,CAEf,CACF,CAAC,CAAA,CAED,IAAA,GAAW,CAACxuB,CAAAA,CAAU5d,CAAI,IAAKqsC,CAAAA,CACzBrsC,CAAAA,GACFusC,EAAU,GAAA,CAAI3uB,CAAAA,CAAU5d,CAAI,CAAA,CAC5Bs2B,CAAAA,CAAY,YAAA,CACV1Y,EACA5d,CAAAA,CAAK,MAAA,CACF0J,GAAMA,CAAAA,CAAE,MAAA,GAAWyX,GAAUzX,CAAAA,CAAE,QAAA,GAAa0X,CAC/C,CACF,CAAA,CAAA,CAIJ,OAAOmrB,CACT,CAKO,SAASC,GACdD,CAAAA,CACArM,CAAAA,CACA,CACA,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACzC,IAAA,GAAW,CAACG,CAAAA,CAAU5d,CAAI,IAAKusC,CAAAA,CAC7BjW,CAAAA,CAAY,aAAsB1Y,CAAAA,CAAU5d,CAAI,EAEpD,CAMO,SAASysC,GACdtrB,CAAAA,CACAC,CAAAA,CACAsrB,EACAxM,CAAAA,CACmB,CACnB,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACnC3P,CAAAA,CAAO,CAAA,EAAA,EAAKqT,CAAM,CAAA,CAAA,EAAIC,CAAQ,GAC9BurB,CAAAA,CAAWrW,CAAAA,CAAY,aAAoB/W,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAC,CAAA,CAE5E,OAAI6+B,CAAAA,EACFrW,CAAAA,CAAY,aAAoB/W,CAAAA,CAAU,KAAA,CAAM,MAAMzR,CAAI,CAAA,CAAG,CAC3D,GAAG6+B,CAAAA,CACH,GAAGD,CACL,CAAC,CAAA,CAGIC,CACT,CAKO,SAASC,GACdzrB,CAAAA,CACAC,CAAAA,CACAoJ,EACA0V,CAAAA,CACA,CACA,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,GAAe,CACnC3P,CAAAA,CAAO,KAAKqT,CAAM,CAAA,CAAA,EAAIC,CAAQ,CAAA,CAAA,CACpCkV,CAAAA,CAAY,YAAA,CAAoB/W,EAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAA,CAAG0c,CAAK,EACpE,CCvFO,SAASqiB,EAAAA,CACdj8B,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,OAAA,CAAS,eAAe,EACzB/I,CAAAA,CACA,CAAC,CAAE,MAAA,CAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,CAAS,CAAA,GAAM,CACxBsW,GAAqBvW,CAAAA,CAAQC,CAAQ,CACvC,CAAA,CACA,MAAOwe,EAAcnJ,CAAAA,GAAc,CAEjC,GAAIpe,CAAAA,EAAM,OAAA,EAAS,kBAAmB,CACpC,IAAM0zB,EAA6B,CACjCxsB,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAClC,EAGA,GAAI6lB,CAAAA,CAAU,cAAgBA,CAAAA,CAAU,cAAA,CAAgB,CACtDsV,CAAAA,CAAoB,IAAA,CAClBxsB,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,EAAU,YAAY,CAAA,CAAA,EAAIA,EAAU,cAAc,CAAA,CAAE,CACjF,CAAA,CAEA,IAAMuV,CAAAA,CAAoBvV,CAAAA,CAAU,UAAA,EAAcA,CAAAA,CAAU,aACtDwV,CAAAA,CAAsBxV,CAAAA,CAAU,cAAgBA,CAAAA,CAAU,cAAA,CAEhEsV,EAAoB,IAAA,CAAK,CACvB,UAAY9pB,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,SAClB,OACE,KAAA,CAAM,QAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,OAAA,EACXA,EAAI,CAAC,CAAA,GAAM,eACXA,CAAAA,CAAI,CAAC,IAAMorC,CAAAA,EACXprC,CAAAA,CAAI,CAAC,CAAA,GAAMqrC,CAEf,CACF,CAAC,EACH,CAEA,MAAM5zB,CAAAA,CAAK,OAAA,CAAQ,kBAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,CAAAA,CACA,SAAA,CACA,CACE,aAAA,CAAAI,CAAAA,CAEA,SAAU,MAAOge,CAAAA,EAAc,CAC7B,IAAM0V,CAAAA,CAAa1V,EAAU,UAAA,EAAcA,CAAAA,CAAU,aAC/C2V,CAAAA,CAAe3V,CAAAA,CAAU,cAAgBA,CAAAA,CAAU,cAAA,CAEzD,OAAI0V,CAAAA,EAAcC,CAAAA,CAOT,CAAE,SAAA,CANSE,EAAAA,CAChB7V,CAAAA,CAAU,OACVA,CAAAA,CAAU,QAAA,CACV0V,EACAC,CACF,CACmB,EAEd,EACT,CAAA,CAEA,OAAA,CAAS,CAACU,CAAAA,CAAQ1D,EAAYxI,CAAAA,GAAY,CACxC,GAAM,CAAE,SAAA,CAAA2L,CAAU,CAAA,CAAK3L,CAAAA,EAAgE,EAAC,CACpF2L,CAAAA,EACFC,EAAAA,CAA2BD,CAAS,EAExC,CACF,CACF,CACF,CCvBO,SAASQ,EAAAA,CACdn8B,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAS,YAAY,CAAA,CACtB/I,EACCmJ,CAAAA,EAAY,CACX,IAAM9E,CAAAA,CAA0B,EAAC,CAgBjC,GAbAA,CAAAA,CAAW,IAAA,CACTgiB,GACEld,CAAAA,CAAQ,MAAA,CACRA,EAAQ,QAAA,CACR,EAAA,CACAA,CAAAA,CAAQ,cAAA,CACRA,CAAAA,CAAQ,KAAA,CACRA,EAAQ,IAAA,CACRA,CAAAA,CAAQ,YACV,CACF,CAAA,CAGIA,EAAQ,OAAA,CAAS,CACnB,GAAM,CACJ,iBAAA,CAAAsd,CAAAA,CAAoB,kBACpB,UAAA,CAAAC,CAAAA,CAAa,IACb,UAAA,CAAAC,CAAAA,CAAa,KACb,oBAAA,CAAAC,CAAAA,CAAuB,IACzB,CAAA,CAAIzd,CAAAA,CAAQ,QAEZ9E,CAAAA,CAAW,IAAA,CACTmiB,GACErd,CAAAA,CAAQ,MAAA,CACRA,EAAQ,QAAA,CACRsd,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,EACF,CACF,EACF,CAEA,OAAOviB,CACT,EACA,MAAO2qB,CAAAA,CAAcnJ,CAAAA,GAAc,CAEjC,GAAIpe,CAAAA,EAAM,SAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAEhC,CACE,SAAA,CAAYqR,GAAe,CACzB,IAAMrhB,EAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,OAAA,EACXA,EAAI,CAAC,CAAA,GAAM,gBACXA,CAAAA,CAAI,CAAC,CAAA,GAAM61B,CAAAA,CAAU,cAEzB,CACF,CACF,CAAA,CACA,MAAMpe,EAAK,OAAA,CAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,CAAAA,CACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CClEO,SAASu0B,EAAAA,CACdp8B,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,EACL,CAAC,OAAA,CAAS,cAAc,CAAA,CACxB/I,CAAAA,CACCmJ,GAAY,CACX,IAAM9E,EAA0B,EAAC,CAgBjC,GAbAA,CAAAA,CAAW,IAAA,CACTgiB,GACEld,CAAAA,CAAQ,MAAA,CACRA,EAAQ,QAAA,CACRA,CAAAA,CAAQ,YAAA,CACRA,CAAAA,CAAQ,cAAA,CACRA,CAAAA,CAAQ,MACRA,CAAAA,CAAQ,IAAA,CACRA,EAAQ,YACV,CACF,EAGIA,CAAAA,CAAQ,OAAA,CAAS,CACnB,GAAM,CACJ,iBAAA,CAAAsd,EAAoB,iBAAA,CACpB,UAAA,CAAAC,EAAa,GAAA,CACb,UAAA,CAAAC,EAAa,IAAA,CACb,oBAAA,CAAAC,CAAAA,CAAuB,IAAA,CACvB,aAAA,CAAAmU,CAAAA,CAAgB,EAClB,CAAA,CAAI5xB,EAAQ,OAAA,CAEN0d,CAAAA,CAAoB,EAAC,CAG3B,GAAIkU,EAAc,MAAA,CAAS,CAAA,CAAG,CAE5B,IAAMC,CAAAA,CAAsB,CAAC,GAAGD,CAAa,EAAE,IAAA,CAAK,CAACpqC,CAAAA,CAAGvF,CAAAA,GACtDuF,CAAAA,CAAE,OAAA,CAAQ,cAAcvF,CAAAA,CAAE,OAAO,CACnC,CAAA,CAEAy7B,CAAAA,CAAW,KAAK,CACd,CAAA,CACA,CACE,aAAA,CAAemU,CAAAA,CAAoB,GAAA,CAAI5vC,IAAM,CAC3C,OAAA,CAASA,EAAE,OAAA,CACX,MAAA,CAAQA,EAAE,MACZ,CAAA,CAAE,CACJ,CACF,CAAC,EACH,CAEAiZ,CAAAA,CAAW,IAAA,CACTmiB,GACErd,CAAAA,CAAQ,MAAA,CACRA,EAAQ,QAAA,CACRsd,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACAC,CACF,CACF,EACF,CAEA,OAAOxiB,CACT,EACA,MAAO2qB,CAAAA,CAAcnJ,CAAAA,GAAc,CAIjC,IAAMxmB,CAAAA,CAAO2vB,GAAS,EAAA,EAAMA,CAAAA,EAAS,MAarC,GAZIvnB,CAAAA,EAAM,SAAS,cAAA,EAAkBpI,CAAAA,EACnCoI,CAAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAKpI,EAAM2vB,CAAAA,EAAS,SAAS,EAAE,KAAA,CAAO/7B,CAAAA,EAAU,CAC1E,OAAA,CAAQ,KAAA,CAAM,oDAAA,CAAsD,CAClE,YAAA,CAAc,GAAA,CACd,SAAU+7B,CAAAA,EAAS,SAAA,CACnB,cAAe3vB,CAAAA,CACf,KAAA,CAAApM,CACF,CAAC,EACH,CAAC,CAAA,CAICwU,CAAAA,EAAM,SAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,EAAU,eAAA,CAAgB,OAAA,CAAQ3O,CAAS,CAC7C,CAAA,CAGAm7B,CAAAA,CAAoB,KAClBxsB,CAAAA,CAAU,KAAA,CAAM,MAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,YAAY,CAAA,CAAA,EAAIA,CAAAA,CAAU,cAAc,CAAA,CAAE,CACjF,CAAA,CAMA,IAAMuV,CAAAA,CAAoBvV,CAAAA,CAAU,YAAcA,CAAAA,CAAU,YAAA,CACtDwV,EAAsBxV,CAAAA,CAAU,YAAA,EAAgBA,CAAAA,CAAU,cAAA,CAEhEsV,CAAAA,CAAoB,IAAA,CAAK,CACvB,SAAA,CAAY9pB,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,EAAM,QAAA,CAClB,OACE,MAAM,OAAA,CAAQrhB,CAAG,GACjBA,CAAAA,CAAI,CAAC,IAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAMorC,CAAAA,EACXprC,EAAI,CAAC,CAAA,GAAMqrC,CAEf,CACF,CAAC,EAED,MAAM5zB,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,CAAAA,CACA,UACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC/JO,SAASw0B,EAAAA,CACdr8B,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,SAAS,CAAA,CACpB/I,EACA,CAAC,CAAE,OAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,EAAU,QAAA,CAAAvE,CAAS,IAAM,CAClCoiB,EAAAA,CAAeruB,CAAAA,CAAWuQ,CAAAA,CAAQC,CAAAA,CAAUvE,CAAQ,CACtD,CAAA,CACA,MAAO+iB,EAAcnJ,CAAAA,GAAc,CAE7Bpe,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CAEnC,CAAC,GAAGkH,EAAU,KAAA,CAAM,eAAe,EAEnC,CAAC,GAAGA,CAAAA,CAAU,MAAA,CAAO,OAAA,CAAQ3O,CAAS,CAAC,CAAA,CAEvC2O,CAAAA,CAAU,MAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,EAAU,MAAM,CAAA,CAAA,EAAIA,EAAU,QAAQ,CAAA,CAAE,CACrE,CAAC,EAEL,EACApe,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCjFA,IAAMy0B,GAA+B,CAAC,GAAA,CAAM,IAAM,GAAI,CAAA,CAEhDvgC,GAAS5H,CAAAA,EAAe,IAAI,OAAA,CAASC,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAASD,CAAE,CAAC,CAAA,CAE9E,eAAeooC,EAAAA,CAAWhsB,CAAAA,CAAgBC,EAAkC,CAC1E,OAAOvU,CAAAA,CAAQ,2BAAA,CAA6B,CAC1CsU,CAAAA,CACAC,CACF,CAAC,CACH,CAEA,eAAsBgsB,EAAAA,CACpBjsB,EACAC,CAAAA,CACAisB,CAAAA,CAAW,EACX79B,CAAAA,CACA,CACA,IAAM89B,CAAAA,CAAS99B,CAAAA,EAAS,QAAU09B,EAAAA,CAE9B9+B,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAW,MAAM++B,EAAAA,CAAWhsB,CAAAA,CAAQC,CAAQ,EAC9C,CAAA,KAAY,CACVhT,EAAW,OACb,CAEA,GAAIA,CAAAA,EAAYi/B,CAAAA,EAAYC,CAAAA,CAAO,MAAA,CACjC,OAGF,IAAMC,EAASD,CAAAA,CAAOD,CAAQ,EAC9B,OAAIE,CAAAA,CAAS,GACX,MAAM5gC,EAAAA,CAAM4gC,CAAM,CAAA,CAGbH,EAAAA,CAAqBjsB,CAAAA,CAAQC,EAAUisB,CAAAA,CAAW,CAAA,CAAG79B,CAAO,CACrE,KC3CAg+B,EAAAA,CAAA,GAAA14B,GAAA04B,EAAAA,CAAA,CAAA,iBAAA,CAAA,IAAAC,KCuCA,SAASC,IAAmD,CAC1D,OAAI,OAAO,MAAA,CAAW,GAAA,EAAe,MAAA,CAAO,SACnC,CACL,GAAA,CAAK,OAAO,QAAA,CAAS,IAAA,CACrB,OAAQ,MAAA,CAAO,QAAA,CAAS,IAC1B,CAAA,CAEK,CAAE,GAAA,CAAK,GAAI,MAAA,CAAQ,EAAG,CAC/B,CAEO,SAASD,GACd78B,CAAAA,CACAk7B,CAAAA,CACAt8B,CAAAA,CACA,CACA,OAAOsK,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,YAAagyB,CAAY,CAAA,CACvC,WAAY,SAAY,CACtB,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mDAA8C,CAAA,CAEhE,IAAM/D,EAAWlpB,CAAAA,EAAc,CAIzB8uB,CAAAA,CAAeD,EAAAA,EAAgB,CAC/BjjC,CAAAA,CAAM+E,GAAS,GAAA,EAAOm+B,CAAAA,CAAa,IACnCC,CAAAA,CAASp+B,CAAAA,EAAS,QAAUm+B,CAAAA,CAAa,MAAA,CAE/C,GAAI,CACF,MAAM5F,CAAAA,CAAS3sB,EAAO,aAAA,CAAgB,YAAA,CAAc,CAClD,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAM0wB,EACN,GAAA,CAAArhC,CAAAA,CACA,OAAAmjC,CAAAA,CACA,KAAA,CAAO,CACL,QAAA,CAAAh9B,CACF,CACF,CAAC,CACH,CAAC,EACH,CAAA,KAAQ,CAGR,CACF,CACF,CAAC,CACH,CCrFO,SAASi9B,EAAAA,CAAmChxB,CAAAA,CAA+B,CAChF,OAAOyC,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,uBAAwBzC,CAAQ,CAAA,CACxD,QAAS,MAAO,CAAE,OAAA5R,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,4BAA4ByB,CAAQ,CAAA,CAAA,CAC5D,CAAE,MAAA,CAAA5R,CAAO,CACX,CAAA,CAEA,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,gCAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,OAAOA,CAAAA,CAAS,MAClB,CACF,CAAC,CACH,CCfO,SAAS0/B,EAAAA,CAAgCjxB,CAAAA,CAA4B,CAC1E,OAAOyC,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAa,mBAAA,CAAqBzC,CAAQ,CAAA,CACrD,OAAA,CAAS,MAAO,CAAE,OAAA5R,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,KAAA,CACrBgN,CAAAA,CAAO,eAAiB,CAAA,sBAAA,EAAyByB,CAAQ,GACzD,CAAE,MAAA,CAAA5R,CAAO,CACX,CAAA,CAEA,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,kCAAkCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGrE,IAAMpO,EAAQ,MAAMoO,CAAAA,CAAS,IAAA,EAAK,CAG5BkU,CAAAA,CAAWtiB,CAAAA,CAAK,IAAK6C,CAAAA,EAASA,CAAAA,CAAK,OAAO,CAAA,CAC1CkrC,CAAAA,CAAmB,MAAMlhC,CAAAA,CAAQ,4BAAA,CAA8B,CAACyV,CAAQ,CAAC,CAAA,CAG/E,QAAS+jB,CAAAA,CAAQ,CAAA,CAAGA,EAAQ0H,CAAAA,CAAiB,MAAA,CAAQ1H,IAAS,CAC5D,IAAM2H,EAAUD,CAAAA,CAAiB1H,CAAK,EAChC4H,CAAAA,CAAUjuC,CAAAA,CAAKqmC,CAAK,CAAA,CAGpB1N,CAAAA,CAAgB,OAAOqV,CAAAA,CAAQ,cAAA,EAAmB,QAAA,CACpDA,CAAAA,CAAQ,cAAA,CACRA,CAAAA,CAAQ,eAAe,QAAA,EAAS,CAC9BE,EAAwB,OAAOF,CAAAA,CAAQ,yBAA4B,QAAA,CACrEA,CAAAA,CAAQ,uBAAA,CACRA,CAAAA,CAAQ,uBAAA,CAAwB,QAAA,GAC9BG,CAAAA,CAAyB,OAAOH,EAAQ,wBAAA,EAA6B,QAAA,CACvEA,EAAQ,wBAAA,CACRA,CAAAA,CAAQ,wBAAA,CAAyB,QAAA,EAAS,CACxCI,CAAAA,CAAsB,OAAOJ,CAAAA,CAAQ,qBAAA,EAA0B,SACjEA,CAAAA,CAAQ,qBAAA,CACRA,EAAQ,qBAAA,CAAsB,QAAA,GAE5BK,CAAAA,CACJ,UAAA,CAAW1V,CAAa,CAAA,CACxB,UAAA,CAAWuV,CAAqB,CAAA,CAChC,UAAA,CAAWC,CAAsB,CAAA,CACjC,UAAA,CAAWC,CAAmB,CAAA,CAIhCH,CAAAA,CAAQ,UAAA,CAAaA,EAAQ,EAAA,CAAKI,EACpC,CAGA,OAAAruC,CAAAA,CAAK,KAAK,CAACuB,CAAAA,CAAiBvF,CAAAA,GAAoBA,CAAAA,CAAE,UAAA,CAAauF,CAAAA,CAAE,UAAU,CAAA,CAEpEvB,CACT,CACF,CAAC,CACH,CChDO,SAASsuC,EAAAA,CACd7jC,EACA8Z,CAAAA,CAAuB,GACvBC,CAAAA,CAAoB,CAAC,WAAY,WAAA,CAAa,gBAAgB,EAC9DC,CAAAA,CACA,CAEA,IAAM8pB,CAAAA,CAAmB,CAAC,GAAGhqB,CAAU,CAAA,CAAE,MAAK,CACxCiqB,CAAAA,CAAgB,CAAC,GAAGhqB,CAAO,CAAA,CAAE,MAAK,CAExC,OAAOlF,aAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,YAAA,CAAc7U,CAAAA,CAAK8jC,CAAAA,CAAkBC,CAAAA,CAAe/pB,CAAS,EACrF,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAxZ,CAAO,IAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,YAAA,CAAc,CACjE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAAoJ,EACA,GAAA,CAAK,kBAAA,CAAmB/Z,CAAG,CAAA,CAC3B,UAAA,CAAA8Z,CAAAA,CACA,UAAA,CAAYE,CACd,CAAC,EACD,MAAA,CAAAxZ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+BA,EAAS,MAAM,CAAA,CAAE,EAGlE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC3D,CAAAA,CAEX,UAAW,CACb,CAAC,CACH,CCjCO,IAAMgkC,GAAiC,gBAAA,CAGjCC,EAAAA,CAAgC,KAmBtC,SAASC,EAAAA,CAAmB7jC,EAAuB,CACxD,OAAO,mDAAmD,IAAA,CAAKA,CAAI,CACrE,CAQO,SAAS8jC,EAAAA,CACdjD,CAAAA,CACA7gC,CAAAA,CACoC,CACpC,GAAI,CAAC6jC,EAAAA,CAAmB7jC,CAAI,CAAA,CAC1B,OAAO6gC,EAGT,IAAM5jC,CAAAA,CAAW4jC,CAAAA,CAAc,IAAA,CAAM3vC,CAAAA,EAAMA,CAAAA,CAAE,UAAYyyC,EAA8B,CAAA,CAEvF,OAAI1mC,CAAAA,EAAYA,CAAAA,CAAS,SAAW,IAAA,CAC3B4jC,CAAAA,CAGL5jC,CAAAA,CACK4jC,CAAAA,CAAc,GAAA,CAAK3vC,CAAAA,EACxBA,EAAE,OAAA,GAAYyyC,EAAAA,CACV,CAAE,GAAGzyC,CAAAA,CAAG,OAAQ,IAA8B,CAAA,CAC9CA,CACN,CAAA,CAGK,CACL,GAAG2vC,CAAAA,CACH,CAAE,QAAS8C,EAAAA,CAAgC,MAAA,CAAQ,IAA8B,CACnF,CACF,CAGO,SAASI,EAAAA,CAAwBj4B,CAAAA,CAA0B,CAChE,OAAOA,CAAAA,GAAY63B,EACrB,CC/EA,IAAAK,GAAA,EAAA,CAAAh6B,EAAAA,CAAAg6B,EAAAA,CAAA,CAAA,2BAAA,CAAA,IAAAC,EAAAA,CAAA,4BAAA,CAAA,IAAAC,KCAA,IAAAF,GAAA,EAAA,CAAAh6B,EAAAA,CAAAg6B,EAAAA,CAAA,CAAA,yBAAA,CAAA,IAAAG,EAAAA,CAAAA,CAAAA,CCGO,SAASA,EAAAA,CACdr+B,CAAAA,CACA+C,EACAsG,CAAAA,CACA,CACA,OAAOqF,YAAAA,CAAa,CAClB,SAAU,CAAC,cAAA,CAAgB,aAAc,aAAA,CAAe1O,CAAQ,CAAA,CAChE,OAAA,CAAS,SAAY,CACnB,GAAIqJ,CAAAA,CAIF,OAHiB,IAAIrB,EAAAA,CAAG,MAAA,CAAO,CAC7B,WAAA,CAAAqB,CACF,CAAC,CAAA,CACe,MAAA,CAAOtG,CAAI,CAE/B,CACF,CAAC,CACH,CCjBA,IAAMu7B,GAAwB,CAC5B,OAAA,CAAAJ,EACF,ECAO,SAASC,EAAAA,CACdn+B,EACAqJ,CAAAA,CACA,CACA,OAAOqF,YAAAA,CAAa,CAClB,SAAU,CAAC,cAAA,CAAgB,SAAU,cAAA,CAAgB1O,CAAQ,EAC7D,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACqJ,CAAAA,CACzB,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrJ,GAAY,CAACqJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,iDAAyC,CAAA,CAI3D,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7B,kDAAkDjO,CAAQ,CAAA,gBAAA,CAAA,CAC1D,CACE,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CACF,CAAA,CAEMu+B,CAAAA,CACJD,EAAAA,CAAsB,QAAQ,yBAAA,CAC5Bt+B,CAAAA,CAAAA,CACC,MAAMxC,CAAAA,CAAS,IAAA,IAAQ,IAAA,CACxB6L,CACF,EACF,MAAMwD,CAAAA,GAAiB,aAAA,CAAc0xB,CAAgB,EACrD,GAAM,CAAE,YAAAC,CAAY,CAAA,CAAI3xB,CAAAA,EAAe,CAAE,YAAA,CACvC0xB,CAAAA,CAAiB,QACnB,CAAA,CAEA,OAAOC,EAAY,OAAA,CAAQ,GAAA,CAAK,EAAE,CACpC,CACF,CAAC,CACH,CCnCO,SAASJ,EAAAA,CACdp+B,CAAAA,CACAqJ,EACA,CACA,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,eAAgB,QAAA,CAAU,QAAA,CAAU1O,CAAQ,CAAA,CACvD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACqJ,CAAAA,CACzB,QAAS,SAAY,CACnB,GAAI,CAACrJ,CAAAA,EAAY,CAACqJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,iDAAyC,CAAA,CAG3D,IAAMo1B,CAAAA,CAAoBN,EAAAA,CACxBn+B,EACAqJ,CACF,CAAA,CAEA,MAAMwD,CAAAA,EAAe,CAAE,aAAA,CAAc4xB,CAAiB,CAAA,CACtD,IAAM12B,EAAQ8E,CAAAA,EAAe,CAAE,aAAa4xB,CAAAA,CAAkB,QAAQ,EACtE,GAAI,CAAC12B,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,0DAAqD,CAAA,CAavE,OAAQ,MATS,MADAkG,CAAAA,GAEf,+CAAA,CACA,CACE,QAAS,CACP,cAAA,CAAgB,mBAChB,aAAA,CAAe,CAAA,OAAA,EAAUlG,CAAK,CAAA,CAChC,CACF,CACF,CAAA,EACuB,IAAA,EACzB,CACF,CAAC,CACH,CCrCA,IAAM22B,EAAAA,CAAwB,CAC5B,OAAA,CAAAR,EACF,ECHO,SAASS,EAAAA,CAA6B3+B,EAA8B,CACzE,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,cAAA,CAAgB,UAAA,CAAY,OAAA,CAAS1O,CAAQ,CAAA,CACxD,KAAA,CAAO,MACP,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,IAAMxC,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,4CAAA,EAA+CjO,CAAQ,CAAA,CAAA,CACvD,CACE,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAWA,GARIxC,CAAAA,CAAS,MAAA,GAAW,MACJ,MAAMA,CAAAA,CAAS,MAAK,CAAE,KAAA,CAAM,KAAO,EAAC,CAAE,CAAA,GAEzC,OAAA,GAAY,oBAAA,EAKzB,CAACA,EAAS,EAAA,CACZ,OAAO,KAGT,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,EAAK,CAEjC,OAAO,CACL,OAAA,CAAS,CACP,QAAA,CAAUpO,CAAAA,CAAK,iBACf,OAAA,CAASA,CAAAA,CAAK,eAChB,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAUA,CAAAA,CAAK,gBACf,OAAA,CAASA,CAAAA,CAAK,cAChB,CACF,CAIF,MAAc,CAEZ,OAAO,IACT,CACF,CACF,CAAC,CACH,CCbO,SAASwvC,EAAAA,CAAqB,CACnC,GAAA,CAAA/kC,CAAAA,CACA,UAAA,CAAA8Z,CAAAA,CAAa,EAAC,CACd,OAAA,CAAAC,EAAU,CAAC,UAAA,CAAY,YAAa,gBAAgB,CAAA,CACpD,QAAA,CAAAirB,CAAAA,CAAW,YAAA,CACX,SAAA,CAAAhrB,EACA,OAAA,CAAA+G,CAAAA,CAAU,IACZ,CAAA,CAAyB,CACvB,OAAOlM,YAAAA,CAAa,CAClB,SAAU,CAAC,cAAA,CAAgB,YAAa7U,CAAAA,CAAK8Z,CAAAA,CAAYC,EAASirB,CAAAA,CAAUhrB,CAAS,EACrF,OAAA,CAAS,SAAY,CAEnB,IAAMrW,CAAAA,CAAW,MADAyQ,GAAc,CACC,CAAA,EAAGzD,EAAO,cAAc,CAAA,UAAA,CAAA,CAAc,CACpE,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,QAAAoJ,CAAAA,CACA,GAAA,CAAK,mBAAmB/Z,CAAG,CAAA,CAC3B,WAAA8Z,CAAAA,CACA,QAAA,CAAAkrB,CAAAA,CAEA,GAAIhrB,CAAAA,CAAY,CAAE,WAAYA,CAAU,CAAA,CAAI,EAC9C,CAAC,EACD,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CAAC,CAAA,CAOD,GAAI,CAACrW,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGvE,OAAQ,MAAMA,EAAS,IAAA,EACzB,EACA,OAAA,CAAS,CAAC,CAAC3D,CAAAA,EAAO+gB,CAAAA,CAGlB,KAAA,CAAO,CACT,CAAC,CACH,CChFO,SAASkkB,EAAAA,EAAyB,CACvC,OAAOpwB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,mBAAoB,OAAO,CAAA,CACtC,QAAS,SAAA,CACU,MAAMzS,EAAQ,qBAAA,CAAuB,EAAE,CAAA,EACxC,QAEpB,CAAC,CACH,CCPO,SAAS8iC,EAAAA,CAAyB/+B,CAAAA,CAAkB,CACzD,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,mBAAoB,SAAA,CAAW1O,CAAQ,CAAA,CAClD,OAAA,CAAS,SAAA,CACQ,MAAM/D,EAAQ,yBAAA,CAA2B,CACtD,SAAU,CAAC+D,CAAQ,CACrB,CAAC,CAAA,EACa,WAAA,CAEhB,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CC6BA,IAAMg/B,EAAAA,CAA0B,CAC9B,KAAA,CAAO,KAAA,CACP,YAAa,CAAA,CACb,OAAA,CAAS,EACT,OAAA,CAAS,CAAA,CACT,cAAe,CAAA,CACf,cAAA,CAAgB,MAChB,OAAA,CAAS,CAAA,CACT,SAAA,CAAW,CACb,CAAA,CAWO,SAASC,GAAmB,CACjC,SAAA,CAAAx4B,EACA,OAAA,CAAAy4B,CAAAA,CACA,UAAAprC,CAAAA,CACA,MAAA,CAAA5H,CAAAA,CAAS,GACX,CAAA,CAAsC,CACpC,GAAI,CAACua,CAAAA,EAAa,CAACy4B,CAAAA,EAAS,GAAA,CAC1B,OAAOF,EAAAA,CAGT,GAAM,CAAE,YAAA,CAAcn5B,CAAAA,CAAa,QAAA,CAAUF,CAAQ,CAAA,CAAIa,EAAAA,CAAgBC,CAAS,CAAA,CAC5E04B,CAAAA,CAAU,OAAOD,CAAAA,CAAQ,GAAA,CAAIprC,CAAS,CAAA,EAAG,QAAA,EAAY,CAAC,CAAA,CAE5D,GAAI,EAAEqrC,CAAAA,CAAU,CAAA,CAAA,CACd,OAAO,CAAE,GAAGH,EAAAA,CAAO,KAAA,CAAO,IAAA,CAAM,WAAA,CAAAn5B,EAAa,OAAA,CAAAF,CAAQ,EAGvD,IAAMy5B,CAAAA,CAAa,OAAO,QAAA,CAASlzC,CAAM,CAAA,EAAKA,CAAAA,CAAS,CAAA,CAAIA,CAAAA,CAAS,IAC9DmzC,CAAAA,CAAgBF,CAAAA,CAAUC,EAC1BE,CAAAA,CAAiBz5B,CAAAA,CAAcw5B,EAErC,OAAO,CACL,KAAA,CAAO,IAAA,CACP,WAAA,CAAAx5B,CAAAA,CACA,QAAAF,CAAAA,CACA,OAAA,CAAAw5B,EACA,aAAA,CAAAE,CAAAA,CACA,eAAAC,CAAAA,CACA,OAAA,CAASA,EAAiB,IAAA,CAAK,IAAA,CAAKD,EAAgBx5B,CAAW,CAAA,CAAI,EACnE,SAAA,CAAW,IAAA,CAAK,MAAMA,CAAAA,CAAcs5B,CAAO,CAC7C,CACF,CC3FO,SAASI,EAAAA,CACdv/B,CAAAA,CACAxK,EACAse,CAAAA,CACA,CACA,OAAOpF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,OAAA,CAAS,cAAA,CAAgBoF,EAAU9T,CAAQ,CAAA,CACtD,QAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACxK,CAAAA,CACzB,QAAS,SAAY,CACnB,GAAI,CAACwK,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kCAA6B,EAgB/C,OAAQ,KAAA,CAbS,MADAyY,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,uBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,UAAWsJ,CAAAA,CACX,IAAA,CAAAte,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EACuB,MACzB,CACF,CAAC,CACH,CC5BO,SAASgqC,EAAAA,CACdx/B,CAAAA,CACAxK,EACAse,CAAAA,CACA9jB,CAAAA,CACA,CACA,GAAM,CAAE,YAAayvC,CAAe,CAAA,CAAI5C,GACtC78B,CAAAA,CACA,aACF,EAEA,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,MAAA,CAAQ4K,CAAAA,CAAU9T,CAAQ,EACjD,UAAA,CAAY,SAAY,CACtB,GAAI,CAACA,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kCAA6B,EAmB/C,OAAQ,KAAA,CAfS,MADAyY,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,wBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,UAAWsJ,CAAAA,CACX,IAAA,CAAAte,EACA,GAAA,CAAAxF,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EAEuB,MACzB,CAAA,CACA,SAAA,EAAY,CACVyvC,CAAAA,GACF,CACF,CAAC,CACH,CCrCO,SAASC,EAAAA,CAAsB1/B,CAAAA,CAA8B,CAClE,IAAM6R,EAAO7R,CAAAA,EAAU,OAAA,CAAQ,IAAK,EAAE,CAAA,CACtC,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAA,CAAO,MAAA,CAAOkD,CAAI,CAAA,CACtC,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,QAAS,SAAY,CACnB,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAI5D,IAAMrU,EAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,qBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,QAAA,CAAUqH,CAAK,CAAC,CACzC,CACF,CAAA,CAEA,GAAI,CAACrU,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,EAAS,MAAM,CAAA,CAAE,EAG9D,OAAQ,MAAMA,EAAS,IAAA,EACzB,EACA,SAAA,CAAW,GAAA,CACX,eAAgB,IAClB,CAAC,CACH,CCbO,IAAMmiC,GAAqC,CAEhD,CAAE,EAAA,CAAI,SAAA,CAAW,IAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAAG,OAAA,CAAS,UAAW,IAAA,CAAM,cAAe,EAClF,CAAE,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,OAAA,CAAS,IAAA,CAAM,EAAG,OAAA,CAAS,MAAA,CAAQ,KAAM,QAAS,CAAA,CACtE,CAAE,EAAA,CAAI,SAAA,CAAW,IAAA,CAAM,OAAA,CAAS,IAAA,CAAM,CAAA,CAAG,QAAS,SAAA,CAAW,IAAA,CAAM,SAAU,CAAA,CAC7E,CAAE,GAAI,MAAA,CAAQ,IAAA,CAAM,QAAS,IAAA,CAAM,EAAA,CAAI,QAAS,MAAA,CAAQ,IAAA,CAAM,mBAAoB,CAAA,CAClF,CAAE,GAAI,QAAA,CAAU,IAAA,CAAM,OAAA,CAAS,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS,SAAU,IAAA,CAAM,QAAS,EAC1E,CAAE,EAAA,CAAI,OAAQ,IAAA,CAAM,OAAA,CAAS,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS,MAAA,CAAQ,KAAM,MAAO,CAAA,CAEpE,CAAE,EAAA,CAAI,MAAA,CAAQ,KAAM,QAAA,CAAU,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS,MAAA,CAAQ,IAAA,CAAM,QAAS,CAAA,CACvE,CAAE,GAAI,SAAA,CAAW,IAAA,CAAM,SAAU,IAAA,CAAM,EAAA,CAAI,QAAS,SAAA,CAAW,IAAA,CAAM,SAAU,CAAA,CAC/E,CAAE,GAAI,MAAA,CAAQ,IAAA,CAAM,SAAU,IAAA,CAAM,EAAA,CAAI,OAAA,CAAS,MAAA,CAAQ,IAAA,CAAM,mBAAoB,EACnF,CAAE,EAAA,CAAI,SAAU,IAAA,CAAM,QAAA,CAAU,KAAM,CAAA,CAAG,OAAA,CAAS,QAAA,CAAU,IAAA,CAAM,QAAS,CAAA,CAE3E,CAAE,EAAA,CAAI,MAAA,CAAQ,KAAM,SAAA,CAAW,IAAA,CAAM,GAAI,OAAA,CAAS,MAAA,CAAQ,IAAA,CAAM,QAAS,CAC3E,EAEO,SAASC,EAAAA,CAAqBC,CAAAA,CAAiB7tC,EAAY,CAChE,OAAO2tC,GAAc,IAAA,CAAM1tB,CAAAA,EAAMA,EAAE,IAAA,GAAS4tB,CAAAA,EAAQ5tB,EAAE,EAAA,GAAOjgB,CAAE,CACjE,CAMO,IAAM8tC,GAAsB,GAAA,CACtBC,EAAAA,CAA0B,EC7CvC,SAASC,EAAAA,EAA4B,CACnC,OAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,UAAA,EAAe,WACzD,MAAA,CAAO,UAAA,GAET,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAC7D,CAOA,eAAsBC,EAAAA,CACpBzqC,EACgC,CAEhC,IAAMgI,EAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,iCACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAAhV,CAAAA,CAAM,eAAA,CAAiBwqC,EAAAA,EAAoB,CAAC,CACrE,CACF,CAAA,CAEA,GAAI,CAACxiC,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAIpO,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,MAAMoO,EAAS,IAAA,GACxB,MAAQ,CAER,CACA,IAAM7N,CAAAA,CACHP,CAAAA,EAA+B,SAChC,CAAA,6BAAA,EAAgCoO,CAAAA,CAAS,MAAM,CAAA,CAAA,CAC3CtE,CAAAA,CAAM,IAAI,KAAA,CAAMvJ,CAAO,EAC7B,MAAAuJ,CAAAA,CAAI,MAAA,CAASsE,CAAAA,CAAS,MAAA,CACtBtE,CAAAA,CAAI,KAAO9J,CAAAA,CACL8J,CACR,CAEA,OAAQ,MAAMsE,EAAS,IAAA,EACzB,CAQO,SAAS0iC,EAAAA,CACdlgC,CAAAA,CACAxK,EACA,CACA,IAAMkwB,EAAcC,cAAAA,EAAe,CAC7B9T,EAAO7R,CAAAA,EAAU,OAAA,CAAQ,GAAA,CAAK,EAAE,CAAA,CAEtC,OAAOkJ,YAAY,CACjB,WAAA,CAAa,CAAC,eAAA,CAAiB,KAAA,CAAO2I,CAAI,CAAA,CAC1C,UAAA,CAAY,SAAY,CACtB,GAAI,CAACA,CAAAA,EAAQ,CAACrc,EACZ,MAAM,IAAI,MAAM,yCAAoC,CAAA,CAEtD,OAAOyqC,EAAAA,CAAuBzqC,CAAI,CACpC,EACA,SAAA,EAAY,CAENqc,GACF6T,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAU/W,CAAAA,CAAU,MAAA,CAAO,OAAA,CAAQkD,CAAI,CAAE,CAAC,EAE9E,CAAA,CACA,WAAY,CAINA,CAAAA,EACF6T,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAU/W,CAAAA,CAAU,MAAA,CAAO,MAAA,CAAOkD,CAAI,CAAE,CAAC,EAE7E,CACF,CAAC,CACH,CCrCO,SAASsuB,GACdngC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,WAAW,CAAA,CAC3B/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAA+d,CAAU,IAAM,CACjB0M,EAAAA,CAAiBzqB,EAAW+d,CAAS,CACvC,EACA,MAAOiR,CAAAA,CAAcnJ,CAAAA,GAAc,CAE7Bpe,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,EAAU,QAAA,CAAS,aAAA,CAAc3O,CAAS,CAAA,CAC1C,CAAC,GAAG2O,EAAU,WAAA,CAAY,YAAA,CAAakX,EAAU,SAAS,CAAC,EAC3DlX,CAAAA,CAAU,WAAA,CAAY,QAAQ3O,CAAAA,CAAW6lB,CAAAA,CAAU,SAAS,CAC9D,CAAC,EAEL,CAAA,CACApe,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCzBO,SAASu4B,EAAAA,CACdpgC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,aAAa,CAAA,CAC7B/I,EACA,CAAC,CAAE,UAAA+d,CAAU,CAAA,GAAM,CACjB2M,EAAAA,CAAmB1qB,CAAAA,CAAW+d,CAAS,CACzC,CAAA,CACA,MAAOiR,EAAcnJ,CAAAA,GAAc,CAE7Bpe,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnCkH,CAAAA,CAAU,SAAS,aAAA,CAAc3O,CAAS,EAC1C,CAAC,GAAG2O,EAAU,WAAA,CAAY,YAAA,CAAakX,CAAAA,CAAU,SAAS,CAAC,CAAA,CAC3DlX,EAAU,WAAA,CAAY,OAAA,CAAQ3O,EAAW6lB,CAAAA,CAAU,SAAS,CAC9D,CAAC,EAEL,CAAA,CACApe,CAAAA,CACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,MAAO,CAC3C,CACF,CCMO,SAASw4B,EAAAA,CACdrgC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,UAAU,CAAA,CAC1B/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAA+d,EAAW,MAAA,CAAAxN,CAAAA,CAAQ,SAAAC,CAAAA,CAAU,KAAA,CAAAwa,EAAO,IAAA,CAAAC,CAAK,IAAM,CAChDF,EAAAA,CAAgB/qB,CAAAA,CAAW+d,CAAAA,CAAWxN,CAAAA,CAAQC,CAAAA,CAAUwa,EAAOC,CAAI,CACrE,EACA,MAAO+D,CAAAA,CAAcnJ,IAAc,CAEjC,GAAIpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CAEjCxsB,EAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,EAEnE,CAAC,WAAA,CAAa,SAAUA,CAAAA,CAAU,SAAS,EAE3C,CACE,SAAA,CAAYxU,GAAe,CACzB,IAAMrhB,EAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,cAAA,EACXA,EAAI,CAAC,CAAA,GAAM61B,EAAU,SAEzB,CACF,CACF,CAAA,CACA,MAAMpe,CAAAA,CAAK,QAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,EACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,MAAO,CAC3C,CACF,CCpDO,SAASy4B,GACdviB,CAAAA,CACA/d,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,cAAe,UAAA,CAAYgV,CAAS,EACrC/d,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAgG,CAAAA,CAAS,IAAA,CAAA9F,CAAK,CAAA,GAAM,CACrByqB,GAAe3qB,CAAAA,CAAW+d,CAAAA,CAAW/X,EAAS9F,CAAI,CACpD,EACA,MAAO8uB,CAAAA,CAAcnJ,CAAAA,GAAc,CAGtBhZ,CAAAA,EAAe,CACvB,eACD,CAAE,QAAA,CAAU8B,EAAU,WAAA,CAAY,YAAA,CAAaoP,CAAS,CAAE,CAAA,CACzDib,CAAAA,EAAS,CACR,GAAI,CAACA,EAAM,OAAOA,CAAAA,CAClB,IAAMuH,CAAAA,CAAsB,CAAC,GAAIvH,CAAAA,CAAK,IAAA,EAAQ,EAAG,CAAA,CAC3CwH,EAAMD,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAC1uB,CAAI,IAAMA,CAAAA,GAASgU,CAAAA,CAAU,OAAO,CAAA,CACjE,OAAI2a,CAAAA,EAAO,EACTD,CAAAA,CAAKC,CAAG,EAAI,CAACD,CAAAA,CAAKC,CAAG,CAAA,CAAE,CAAC,CAAA,CAAG3a,CAAAA,CAAU,IAAA,CAAM0a,CAAAA,CAAKC,CAAG,CAAA,CAAE,CAAC,GAAK,EAAE,CAAA,CAE7DD,EAAK,IAAA,CAAK,CAAC1a,CAAAA,CAAU,OAAA,CAASA,CAAAA,CAAU,IAAA,CAAM,EAAE,CAAC,CAAA,CAE5C,CAAE,GAAGmT,CAAAA,CAAM,KAAAuH,CAAK,CACzB,CACF,CAAA,CAGI94B,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnC,CAAC,GAAGkH,CAAAA,CAAU,WAAA,CAAY,YAAA,CAAaoP,CAAS,CAAC,CAAA,CACjDpP,CAAAA,CAAU,YAAY,OAAA,CAAQkX,CAAAA,CAAU,QAAS9H,CAAS,CAC5D,CAAC,EAEL,CAAA,CACAtW,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CChDO,SAAS44B,EAAAA,CACd1iB,CAAAA,CACA/d,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,SAAUgV,CAAS,CAAA,CACnC/d,EACClB,CAAAA,EAAU,CACT8rB,GAAuB5qB,CAAAA,CAAW+d,CAAAA,CAAWjf,CAAK,CACpD,CAAA,CACA,MAAOkwB,CAAAA,CAAcnJ,CAAAA,GAAc,CAGtBhZ,CAAAA,EAAe,CACvB,cAAA,CACD,CAAE,QAAA,CAAU8B,CAAAA,CAAU,YAAY,YAAA,CAAaoP,CAAS,CAAE,CAAA,CACzDib,CAAAA,EACMA,CAAAA,EACE,CAAE,GAAGA,CAAAA,CAAM,GAAInT,CAA4C,CAEtE,EAGIpe,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnC,CAAC,GAAGkH,CAAAA,CAAU,WAAA,CAAY,aAAaoP,CAAS,CAAC,CACnD,CAAC,EAEL,EACAtW,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC3CO,SAAS64B,EAAAA,CACd1gC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,cAAe,iBAAiB,CAAA,CACjC/I,EACA,CAAC,CAAE,IAAA,CAAA6R,CAAK,CAAA,GAAM,CACZ+c,GAA6B/c,CAAI,CACnC,EACA,MAAOmd,CAAAA,CAAcnJ,IAAc,CAE7Bpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CAEnC,CAAC,GAAGkH,CAAAA,CAAU,YAAY,YAAA,CAAakX,CAAAA,CAAU,IAAI,CAAC,CAAA,CAEtD,CAAC,GAAGlX,CAAAA,CAAU,OAAO,OAAA,CAAQ3O,CAAS,CAAC,CACzC,CAAC,EAEL,CAAA,CACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnEO,SAAS84B,EAAAA,CACd3gC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,UAAU,CAAA,CAC1B/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAA+d,CAAAA,CAAW,OAAA,CAAA/X,CAAAA,CAAS,QAAA,CAAAwK,EAAU,GAAA,CAAAsa,CAAI,IAAM,CACzCD,EAAAA,CAAe7qB,EAAW+d,CAAAA,CAAW/X,CAAAA,CAASwK,EAAUsa,CAAG,CAC7D,EACA,MAAOkE,CAAAA,CAASnJ,IAAc,CACxBpe,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,EAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,OAAO,IAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,CAAA,CACpE,CAAC,GAAGlX,EAAU,WAAA,CAAY,YAAA,CAAakX,EAAU,SAAS,CAAC,CAC7D,CAAC,EAEL,CAAA,CACApe,CAAAA,CACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC9BO,SAAS+4B,EAAAA,CACd/vB,EACAQ,CAAAA,CACAlkB,CAAAA,CAAQ,IACR+d,CAAAA,CAA+B,MAAA,CAC/B0P,EAAU,IAAA,CACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,WAAA,CAAY,IAAA,CAAKkC,EAAMQ,CAAAA,EAAS,EAAA,CAAIlkB,CAAK,CAAA,CAC7D,OAAA,CAAAytB,CAAAA,CACA,OAAA,CAAS,SAAY,CACnB,IAAMpd,CAAAA,CAAW,MAAMvB,EAAQ,yBAAA,CAA2B,CACtD,KAAM,EAAA,CACN,KAAA,CAAA9O,CAAAA,CACA,IAAA,CAAM0jB,CAAAA,GAAS,KAAA,CAAQ,OAASA,CAAAA,CAChC,KAAA,CAAOQ,GAAgB,IAAA,CACvB,QAAA,CAAAnG,CACF,CAAC,CAAA,CACH,OACE1N,CAAAA,CACIqT,CAAAA,GAAS,MACPrT,CAAAA,CAAS,IAAA,CAAK,IAAM,IAAA,CAAK,MAAA,GAAW,EAAG,CAAA,CACvCA,CAAAA,CACF,EAER,CACF,CAAC,CACH,CC3BO,SAASqjC,EAAAA,CACd7gC,CAAAA,CACA8R,CAAAA,CACA,CACA,OAAOpD,aAAa,CAClB,QAAA,CAAUC,EAAU,WAAA,CAAY,OAAA,CAAQ3O,EAAW8R,CAAc,CAAA,CACjE,OAAA,CAAS,CAAC,CAAC9R,CAAAA,EAAY,CAAC,CAAC8R,CAAAA,CACzB,QAAS,SAAY,CACnB,IAAMtU,CAAAA,CAAW,MAAMvB,EAAQ,8BAAA,CAAgC,CAC3D,QAAS+D,CAAAA,CACT,IAAA,CAAM8R,CACR,CAAC,CAAA,CAEH,OAAO,CACL,IAAA,CAAMtU,CAAAA,EAAU,IAAA,EAAQ,OAAA,CACxB,UAAA,CAAYA,GAAU,UAAA,EAAc,KACtC,CAIF,CACF,CAAC,CACH,CCtBO,SAASsjC,GACdjvB,CAAAA,CACA3G,CAAAA,CAA+B,GAC/B0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,WAAA,CAAY,OAAOkD,CAAAA,CAAM3G,CAAQ,EACrD,OAAA,CAAS0P,CAAAA,EAAW,CAAC,CAAC/I,CAAAA,CACtB,QAAS,SAAY4L,EAAAA,CAAa5L,GAAQ,EAAA,CAAI3G,CAAQ,CACxD,CAAC,CACH,KCFa61B,EAAAA,CAAwB,IAYrC,eAAeC,EAAAA,CACblvB,CAAAA,CACA6L,EAC0B,CAM1B,OALiB,MAAM1hB,CAAAA,CAAQ,yBAAA,CAA2B,CACxD,UAAW6V,CAAAA,CACX,KAAA,CAAOivB,GACP,GAAIpjB,CAAAA,CAAO,CAAE,IAAA,CAAAA,CAAK,CAAA,CAAI,EACxB,CAAC,GAC6C,EAChD,CAYO,SAASsjB,EAAAA,CAAoCnvB,EAAuB,CACzE,OAAOpD,aAAa,CAClB,QAAA,CAAUC,EAAU,WAAA,CAAY,WAAA,CAAYmD,CAAa,CAAA,CACzD,OAAA,CAAS,SAAYkvB,EAAAA,CAAqBlvB,CAAAA,CAAe,IAAI,CAAA,CAC7D,SAAA,CAAW,GACb,CAAC,CACH,CAOO,SAASovB,EAAAA,CACdpvB,CAAAA,CACA,CACA,OAAO+G,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,WAAA,CAAY,oBAAoBmD,CAAa,CAAA,CACjE,iBAAkB,IAAA,CAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAgH,CAAU,CAAA,GAC1BkoB,EAAAA,CAAqBlvB,CAAAA,CAAegH,CAAS,CAAA,CAG/C,gBAAA,CAAmBE,GACjBA,CAAAA,EAAU,MAAA,EAAU+nB,GAChB/nB,CAAAA,CAASA,CAAAA,CAAS,OAAS,CAAC,CAAA,GAAI,CAAC,CAAA,EAAK,IAAA,CACtC,KACN,SAAA,CAAW,GACb,CAAC,CACH,CCpEO,SAASmoB,EAAAA,CACdn7B,CAAAA,CACA7Y,EACA,CACA,OAAO0rB,qBAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,WAAA,CAAY,oBAAA,CAAqB3I,CAAAA,CAAS7Y,CAAK,CAAA,CACnE,gBAAA,CAAkB,KAOlB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAU,CAAA,GACT,MAAM7c,CAAAA,CAAQ,8BAAA,CAAgC,CAC7D,OAAA,CAAA+J,CAAAA,CACA,MAAA7Y,CAAAA,CACA,OAAA,CAAS2rB,GAAa,MACxB,CAAC,GACoD,EAAC,CAKxD,iBAAmBE,CAAAA,EACjBA,CAAAA,EAAU,QAAU7rB,CAAAA,CAAQ6rB,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,CAAA,CAAE,EAAA,CAAK,IACnE,CAAC,CACH,CC3CO,SAASooB,EAAAA,EAAqC,CACnD,OAAO1yB,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,WAAA,CAAY,QAAA,GAChC,OAAA,CAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,KAAA,CACrBgN,CAAAA,CAAO,cAAA,CAAiB,oCACxB,CACE,MAAA,CAAQ,MACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CACF,CAAA,CAEA,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,yCAAyCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG5E,OAAOA,CAAAA,CAAS,MAClB,CACF,CAAC,CACH,KCzBY6jC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,GAAA,CAAM,MACNA,CAAAA,CAAA,MAAA,CAAS,SACTA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CANEA,QAAA,EAAA,CAAA,CASCC,EAAAA,CAAoC,CAC9C,KAAA,CAAc,CACb,QACA,KAAA,CACA,QAAA,CACA,QACA,OACF,CAAA,CACC,MAAc,CAAC,KAAA,CAAW,SAAc,OAAA,CAAa,OAAW,EAChE,GAAA,CAAY,CAAC,QAAA,CAAc,OAAA,CAAa,OAAW,CACtD,ECjBO,SAASC,EAAAA,CAAiB1vB,EAAc2vB,CAAAA,CAAgC,CAC7E,OAAI3vB,CAAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAK2vB,CAAAA,GAAY,CAAA,CAAU,UACnD3vB,CAAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAK2vB,CAAAA,GAAY,EAAU,SAAA,CAChD,OACT,CAEO,SAASC,EAAAA,CAAwB,CACtC,cAAAC,CAAAA,CACA,QAAA,CAAAC,EACA,UAAA,CAAAC,CACF,EAIG,CACD,IAAMC,EACAF,CAAAA,GAAa,OAAA,CAAoB,MAEjCD,CAAAA,GAAkB,OAAA,CAAgB,KAG/B,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,QAAkD,CAAA,CAAE,SACzDC,CACF,CAAA,CAGIG,CAAAA,CAAAA,CAAc,IAAM,CACxB,GAAIH,IAAa,OAAA,CAAa,OAAO,OAErC,OAAQD,CAAAA,EACN,KAAK,OAAA,CACH,OAAO,KAAA,CACT,KAAK,SAAA,CACH,OAAOC,CAAAA,GAAa,OAAA,EAAeC,EACrC,KAAK,SAAA,CACH,OAAOC,CACX,CACF,CAAA,GAAG,CAEGE,CAAAA,CAAc,CAAA,OAAA,CAAA,OAAA,CAAA,KAAoC,EAAE,QAAA,CAASJ,CAAQ,EAE3E,OAAO,CACL,QAAAE,CAAAA,CACA,UAAA,CAAAC,EACA,WAAA,CAAAC,CACF,CACF,CC7CO,SAASC,EAAAA,CACdpxB,CAAAA,CACApb,CAAAA,CACA,CACA,OAAOkZ,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,cAAc,WAAA,CAAYiC,CAAc,EAC5D,OAAA,CAAS,SACFpb,CAAAA,CAAAA,CAaS,KAAA,CAVG,MAAM,KAAA,CACrB,GAAGgV,CAAAA,CAAO,cAAc,oCACxB,CACE,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAAA,CAC7B,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EAC6B,MAAK,EACtB,KAAA,CAbH,EAeX,OAAA,CAAS,CAAC,CAACob,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,WAAA,CAAa,CAAA,CACb,eAAA,CAAiB,GACnB,CAAC,CACH,CCzBO,SAASysC,EAAAA,CACdrxB,CAAAA,CACApb,CAAAA,CACAib,CAAAA,CAAyC,MAAA,CACzC,CACA,OAAOoI,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,aAAA,CAAc,KAAKiC,CAAAA,CAAgBH,CAAM,CAAA,CAC7D,OAAA,CAAS,MAAO,CAAE,UAAAqI,CAAU,CAAA,GAAM,CAChC,GAAI,CAACtjB,EACH,OAAO,GAET,IAAMpG,CAAAA,CAAO,CACX,IAAA,CAAAoG,CAAAA,CACA,OAAAib,CAAAA,CACA,KAAA,CAAOqI,EACP,IAAA,CAAM,MACR,CAAA,CAEMtb,CAAAA,CAAW,MAAM,KAAA,CACrBgN,EAAO,cAAA,CAAiB,4BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CACF,CAAA,CAEA,GAAI,CAACoO,CAAAA,CAAS,EAAA,CACZ,OAAO,EAAC,CAGV,GAAI,CACF,OAAQ,MAAMA,EAAS,IAAA,EACzB,MAAQ,CACN,OAAO,EACT,CACF,EACA,OAAA,CAAS,CAAC,CAACoT,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,WAAA,CAAa,CAAE,KAAA,CAAO,EAAC,CAAG,WAAY,EAAG,EACzC,gBAAA,CAAkB,EAAA,CAClB,iBAAmBwjB,CAAAA,EAAaA,CAAAA,GAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,IAAM,EAAA,CACvE,cAAA,CAAgB,IAClB,CAAC,CACH,CClDO,IAAKkpB,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,KAAA,CAAQ,QAAA,CACRA,EAAA,QAAA,CAAW,UAAA,CACXA,EAAA,SAAA,CAAY,YAAA,CACZA,EAAA,SAAA,CAAY,YAAA,CACZA,EAAA,OAAA,CAAU,SAAA,CACVA,EAAA,OAAA,CAAU,SAAA,CACVA,EAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,SAAA,CAAY,WAAA,CACZA,CAAAA,CAAA,YAAc,aAAA,CACdA,CAAAA,CAAA,QAAU,SAAA,CACVA,CAAAA,CAAA,oBAAsB,qBAAA,CAGtBA,CAAAA,CAAA,eAAA,CAAkB,iBAAA,CAClBA,CAAAA,CAAA,eAAA,CAAkB,kBAfRA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,MCGAC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAAA,CAAAA,CAAA,KAAO,CAAA,CAAA,CAAP,MAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,CAAA,CAAA,CAAV,SAAA,CACAA,IAAA,MAAA,CAAS,CAAA,CAAA,CAAT,SACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,GAAV,SAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,QAAU,CAAA,CAAA,CAAV,SAAA,CACAA,IAAA,SAAA,CAAY,CAAA,CAAA,CAAZ,YACAA,CAAAA,CAAAA,CAAAA,CAAA,WAAA,CAAc,IAAd,aAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,SAAA,CAAY,EAAA,CAAA,CAAZ,WAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,UAAY,EAAA,CAAA,CAAZ,WAAA,CACAA,IAAA,OAAA,CAAU,EAAA,CAAA,CAAV,UACAA,CAAAA,CAAAA,CAAAA,CAAA,cAAA,CAAiB,EAAA,CAAA,CAAjB,gBAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,eAAA,CAAkB,IAAlB,iBAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,oBAAsB,EAAA,CAAA,CAAtB,qBAAA,CACAA,EAAA,YAAA,CAAe,cAAA,CAdLA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,CAAA,CAiBCC,EAAAA,CAAmB,CAC9B,EACA,CAAA,CACA,CAAA,CACA,EACA,CAAA,CACA,CAAA,CACA,GACA,EAAA,CACA,EAAA,CACA,GACA,EAAA,CACA,EAAA,CACA,EACF,CAAA,CAEYC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,GAAA,CAAM,KAAA,CACNA,EAAA,MAAA,CAAS,QAAA,CACTA,CAAAA,CAAA,IAAA,CAAO,MAAA,CAHGA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IC/BL,SAASC,EAAAA,CACd1xB,EACApb,CAAAA,CACA+sC,CAAAA,CACA,CACA,OAAO7zB,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,aAAA,CAAc,SAASiC,CAAc,CAAA,CACzD,QAAS,SAAY,CACnB,IAAI7I,CAAAA,CAAQ6I,CAAAA,CAAiB,MAAA,CAC7B,GAAI,CAACpb,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sBAAsB,CAAA,CAExC,IAAMgI,EAAW,MAAM,KAAA,CACrBgN,EAAO,cAAA,CAAiB,4BAAA,CACxB,CACE,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,EACA,QAAA,CAAUob,CAAAA,CACV,KAAA,CAAA7I,CACF,CAAC,CAAA,CACD,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CACA,GAAI,CAACvK,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,0CAA0CA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAE7E,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,QAAS,CAAC,CAACoT,GAAkB,CAAC,CAACpb,EAC/B,cAAA,CAAgB,KAAA,CAChB,YAAa,KACJ,CACL,OAAQ,CAAA,CACR,MAAA,CAAQ,MACR,aAAA,CAAe,CAAA,CACf,aAAc+sC,CAAAA,CAAe,EAAC,CAAK,CAAC,GAAGH,EAAgB,CACzD,CAAA,CAEJ,CAAC,CACH,CC3CO,SAASI,EAAAA,EAA+B,CAC7C,OAAO9zB,aAAa,CAClB,QAAA,CAAUC,EAAU,aAAA,CAAc,aAAA,GAClC,OAAA,CAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACjF,MAAA,CAAQ,MACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAIrE,OADa,MAAMA,EAAS,IAAA,EAAK,EAClB,EACjB,CAAA,CACA,SAAA,CAAW,IACb,CAAC,CACH,CClBO,SAASilC,GAA0BC,CAAAA,CAAuB,CAC/D,OAAOh0B,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,aAAA,CAAc,UAAA,GAClC,OAAA,CAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,yBAAA,CAA2B,CAC9E,OAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,+BAA+BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAIlE,OADc,MAAMA,EAAS,IAAA,EAAK,EACnB,EACjB,CAAA,CACA,UAAW,IACb,CAAC,CACH,CClBA,SAASmlC,GAAqB1wC,CAAAA,CAAuBD,CAAAA,CAA8B,CACjF,OAAO,CACL,GAAGC,CAAAA,CACH,IAAA,CAAO,CAACD,CAAAA,EAAMA,CAAAA,GAAOC,EAAK,EAAA,CAAK,CAAA,CAAIA,EAAK,IAC1C,CACF,CAEA,SAAS2wC,EAAAA,CAAexzC,CAAAA,CAAiD,CACvE,OACE,OAAOA,GAAS,QAAA,EAChBA,CAAAA,GAAS,MACT,OAAA,GAAWA,CAAAA,EACX,YAAA,GAAgBA,CAAAA,EAChB,KAAA,CAAM,OAAA,CAASA,EAAkC,KAAK,CAE1D,CAuBO,SAASyzC,EAAAA,CACd7iC,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,IAAML,CAAAA,CAAc7Y,GAAe,CAEnC,OAAO3D,YAAY,CACjB,WAAA,CAAa,CAAC,eAAA,CAAiB,WAAA,CAAalJ,CAAQ,CAAA,CAEpD,UAAA,CAAY,MAAO,CAAE,EAAA,CAAAhO,CAAG,CAAA,GAAuB,CAC7C,GAAI,EAAA,CAACgO,CAAAA,EAAY,CAACxK,CAAAA,CAAAA,CAMlB,OAAOshC,EAAAA,CAAkBthC,EAAMxD,CAAE,CACnC,EAGA,QAAA,CAAU,MAAO,CAAE,EAAA,CAAAA,CAAG,CAAA,GAAuB,CAE3C,GAAI,CAACgO,GAAY,CAACxK,CAAAA,CAChB,OAAO,CAAE,YAAA,CAAc,EAAG,CAAA,CAI5B,MAAMkwB,CAAAA,CAAY,aAAA,CAAc,CAAE,SAAU/W,CAAAA,CAAU,aAAA,CAAc,OAAQ,CAAC,CAAA,CAG7E,IAAMm0B,CAAAA,CAA2C,GAG3ChT,CAAAA,CAAkBpK,CAAAA,CAAY,eAAyC,CAC3E,QAAA,CAAU/W,EAAU,aAAA,CAAc,OAAA,CAClC,UAAY0C,CAAAA,EAAU,CACpB,IAAMjiB,CAAAA,CAAOiiB,CAAAA,CAAM,KAAA,CAAM,KACzB,OAAOuxB,EAAAA,CAAexzC,CAAI,CAC5B,CACF,CAAC,CAAA,CAED0gC,CAAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC9iB,CAAAA,CAAU5d,CAAI,CAAA,GAAM,CAC5C,GAAIA,CAAAA,EAAQwzC,EAAAA,CAAexzC,CAAI,CAAA,CAAG,CAChC0zC,CAAAA,CAAa,IAAA,CAAK,CAAC91B,CAAAA,CAAU5d,CAAI,CAAC,CAAA,CAElC,IAAM2zC,CAAAA,CAAwC,CAC5C,GAAG3zC,CAAAA,CACH,KAAA,CAAOA,EAAK,KAAA,CAAM,GAAA,CAAKsjB,GACrBA,CAAAA,CAAK,GAAA,CAAKzgB,GAAS0wC,EAAAA,CAAqB1wC,CAAAA,CAAMD,CAAE,CAAC,CACnD,CACF,CAAA,CAEA0zB,CAAAA,CAAY,YAAA,CAAa1Y,EAAU+1B,CAAW,EAChD,CACF,CAAC,CAAA,CAGD,IAAMC,CAAAA,CAAYr0B,CAAAA,CAAU,aAAA,CAAc,WAAA,CAAY3O,CAAQ,CAAA,CACxDijC,EAAgBvd,CAAAA,CAAY,YAAA,CAAqBsd,CAAS,CAAA,CAChE,OAAI,OAAOC,CAAAA,EAAkB,QAAA,EAAYA,CAAAA,CAAgB,CAAA,GACvDH,CAAAA,CAAa,IAAA,CAAK,CAACE,CAAAA,CAAWC,CAAa,CAAC,CAAA,CAEvCjxC,CAAAA,CAKc89B,EAAgB,IAAA,CAAK,CAAC,EAAGj4B,CAAC,IACzCA,CAAAA,EAAG,KAAA,CAAM,KAAM6a,CAAAA,EACbA,CAAAA,CAAK,KAAMzgB,CAAAA,EAASA,CAAAA,CAAK,EAAA,GAAOD,CAAAA,EAAMC,CAAAA,CAAK,IAAA,GAAS,CAAC,CACvD,CACF,GAEEyzB,CAAAA,CAAY,YAAA,CAAasd,EAAWC,CAAAA,CAAgB,CAAC,CAAA,CATvDvd,CAAAA,CAAY,YAAA,CAAasd,CAAAA,CAAW,CAAC,CAAA,CAAA,CAelC,CAAE,aAAAF,CAAa,CACxB,EAEA,SAAA,CAAYtlC,CAAAA,EAAa,CAEvB,IAAM0lC,CAAAA,CAAc,OAAO1lC,GAAa,QAAA,EAAYA,CAAAA,GAAa,KAC5DA,CAAAA,CAAiC,MAAA,CAClC,OAGA,OAAO0lC,CAAAA,EAAgB,UACzBxd,CAAAA,CAAY,YAAA,CACV/W,EAAU,aAAA,CAAc,WAAA,CAAY3O,CAAQ,CAAA,CAC5CkjC,CACF,EAGFj6B,CAAAA,GAAYi6B,CAAW,EACzB,CAAA,CAGA,OAAA,CAAS,CAACjwC,EAAOulC,CAAAA,CAAYxI,CAAAA,GAAY,CAEnCA,CAAAA,EAAS,YAAA,EACXA,EAAQ,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAChjB,CAAAA,CAAU5d,CAAI,IAAM,CACjDs2B,CAAAA,CAAY,aAAa1Y,CAAAA,CAAU5d,CAAI,EACzC,CAAC,CAAA,CAGH22B,CAAAA,GAAU9yB,CAAc,EAC1B,CAAA,CAGA,UAAW,IAAM,CACfyyB,EAAY,iBAAA,CAAkB,CAC5B,SAAU/W,CAAAA,CAAU,aAAA,CAAc,OACpC,CAAC,EACH,CACF,CAAC,CACH,CC7JO,SAASw0B,EAAAA,CACdnjC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,gBAAiB,eAAe,CAAA,CACjC/I,EACA,CAAC,CAAE,KAAAwpB,CAAK,CAAA,GAAMD,EAAAA,CAAoBvpB,CAAAA,CAAWwpB,CAAI,CAAA,CACjD,SAAY,CACN/hB,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,aAAA,CAAc,WAAA,CAAY3O,CAAQ,CAC9C,CAAC,EAEL,CAAA,CACAyH,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CCtBO,SAASu7B,EAAAA,CAAwBpxC,CAAAA,CAAY,CAClD,OAAO0c,YAAAA,CAAa,CAClB,SAAU,CAAC,WAAA,CAAa,WAAY1c,CAAE,CAAA,CACtC,QAAS,SAAY,CAEnB,IAAMqxC,CAAAA,CAAAA,CADI,MAAMpnC,CAAAA,CAAQ,+BAAgC,CAAC,CAACjK,CAAE,CAAC,CAAC,GAC3C,CAAC,CAAA,CAGpB,OAAI,IAAI,IAAA,CAAKqxC,CAAAA,CAAS,UAAU,CAAA,CAAI,IAAI,MAAU,IAAI,IAAA,CAAKA,EAAS,QAAQ,CAAA,EAAK,IAAI,IAAA,CACnFA,CAAAA,CAAS,OAAS,QAAA,CACT,IAAI,KAAKA,CAAAA,CAAS,QAAQ,EAAI,IAAI,IAAA,CAC3CA,CAAAA,CAAS,MAAA,CAAS,SAAA,CAElBA,CAAAA,CAAS,OAAS,UAAA,CAGbA,CACT,CACF,CAAC,CACH,CCnBO,SAASC,EAAAA,EAA2B,CACzC,OAAO50B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAa,MAAM,CAAA,CAC9B,OAAA,CAAS,SAAY,CASnB,IAAM60B,GARY,MAAMtnC,CAAAA,CAAQ,8BAA+B,CAC7D,KAAA,CAAO,CAAC,EAAE,CAAA,CACV,MAAO,GAAA,CACP,KAAA,CAAO,iBACP,eAAA,CAAiB,YAAA,CACjB,OAAQ,KACV,CAAC,GAE0B,SAAA,CACrBunC,CAAAA,CAAUD,CAAAA,CAAU,MAAA,CAAQtsB,CAAAA,EAAMA,CAAAA,CAAE,SAAW,SAAS,CAAA,CAG9D,OAAO,CAAC,GAFOssB,EAAU,MAAA,CAAQtsB,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAW,SAAS,CAAA,CAE1C,GAAGusB,CAAO,CAC/B,CACF,CAAC,CACH,CCJO,SAASC,EAAAA,CACd1xB,EACAC,CAAAA,CACA7kB,CAAAA,CACA,CACA,OAAO0rB,oBAAAA,CAML,CACA,QAAA,CAAU,CAAC,YAAa,OAAA,CAAS9G,CAAAA,CAAYC,EAAO7kB,CAAK,CAAA,CACzD,iBAAkB6kB,CAAAA,CAClB,cAAA,CAAgB,KAChB,SAAA,CAAW,CAAA,CAEX,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA8G,CAAU,CAAA,GAA6B,CASvD,IAAMrqB,CAAAA,CAAAA,CANY,MAAMwN,EAAQ,mCAAA,CAAqC,CACnE,CAAC8V,CAAAA,CAHgB+G,CAAAA,EAAa9G,CAGP,EACvB7kB,CAAAA,CACA,mBACF,CAAC,CAAA,EAGE,MAAA,CAAQ8pB,GAAMA,CAAAA,CAAE,QAAA,EAAU,WAAA,GAAgBlF,CAAU,CAAA,CACpD,GAAA,CAAKkF,IAAO,CAAE,EAAA,CAAIA,EAAE,EAAA,CAAI,KAAA,CAAOA,EAAE,KAAM,CAAA,CAAE,EAEtCD,CAAAA,CAAc,MAAM/a,EAAQ,4BAAA,CAA8B,CAACxN,EAAK,GAAA,CAAK,CAAA,EAAM,EAAE,KAAK,CAAC,CAAC,CAAA,CACpFijB,CAAAA,CAAWqF,EAAAA,CAAcC,CAAW,CAAA,CAO1C,OALgCvoB,EAAK,GAAA,CAAKzD,CAAAA,GAAO,CAC/C,GAAGA,CAAAA,CACH,YAAA,CAAc0mB,CAAAA,CAAS,IAAA,CAAM/gB,CAAAA,EAAM3F,EAAE,KAAA,GAAU2F,CAAAA,CAAE,IAAI,CACvD,CAAA,CAAE,CAGJ,CAAA,CAEA,gBAAA,CAAmBqoB,CAAAA,EACJA,CAAAA,GAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAC9B,KAAA,EAAS,MAE1B,CAAC,CACH,CC3DO,SAAS0qB,GAAiC1xB,CAAAA,CAAe,CAC9D,OAAOtD,YAAAA,CAAa,CAClB,SAAU,CAAC,WAAA,CAAa,OAAA,CAAS,SAAA,CAAWsD,CAAK,CAAA,CACjD,QAAS,CAAC,CAACA,GAASA,CAAAA,GAAU,EAAA,CAC9B,UAAW,EAAA,CAAK,GAAA,CAChB,OAAA,CAAS,SACH,CAACA,CAAAA,EAASA,IAAU,EAAA,CACf,KAGS,MAAM/V,CAAAA,CAAQ,mCAAoC,CAClE,KAAA,CAAO,CAAC+V,CAAK,CAAA,CACb,KAAA,CAAO,IACP,KAAA,CAAO,mBAAA,CACP,gBAAiB,WAAA,CACjB,MAAA,CAAQ,SACV,CAAC,CAAA,EAG2B,gBAAkB,EAAC,EAAG,OAAQ2xB,CAAAA,EAASA,CAAAA,CAAK,QAAU3xB,CAAK,CAI3F,CAAC,CACH,CCmCO,SAAS4xB,EAAAA,CACd5jC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,WAAA,CAAa,MAAM,CAAA,CACpB/I,CAAAA,CACA,CAAC,CAAE,WAAA,CAAAmqB,CAAAA,CAAa,QAAAN,CAAQ,CAAA,GAAM,CAC5BK,EAAAA,CAAoBlqB,CAAAA,CAAWmqB,EAAaN,CAAO,CACrD,CAAA,CACA,MAAOv+B,CAAAA,EAAgB,CAErB,GAAI,CAIF,IAAM+T,EAAO/T,CAAAA,EAAQ,EAAA,EAAMA,GAAQ,KAAA,CAC/Bmc,CAAAA,EAAM,SAAS,cAAA,EAAkBpI,CAAAA,EACnCoI,EAAK,OAAA,CAAQ,cAAA,CAAe,IAAKpI,CAAAA,CAAM/T,CAAAA,EAAQ,SAAS,CAAA,CAAE,KAAA,CAAO2H,CAAAA,EAAU,CACzE,OAAA,CAAQ,KAAA,CAAM,0DAA2D,CACvE,YAAA,CAAc,IACd,QAAA,CAAU3H,CAAAA,EAAQ,UAClB,aAAA,CAAe+T,CAAAA,CACf,KAAA,CAAApM,CACF,CAAC,EACH,CAAC,CAAA,CAICwU,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,SAAA,CAAU,IAAA,GACpBA,CAAAA,CAAU,SAAA,CAAU,YAAY3O,CAAS,CAC3C,CAAC,EAEL,CAAA,MAAS/M,EAAO,CAEd,OAAA,CAAQ,KAAK,sDAAA,CAAwDA,CAAK,EAC5E,CACF,CAAA,CACAwU,EACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC1GO,SAASg8B,EAAAA,CACd7jC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,WAAA,CAAa,QAAQ,CAAA,CACtB/I,EACCmJ,CAAAA,EAAY,CACX6gB,GAAsBhqB,CAAAA,CAAWmJ,CAAO,CAC1C,CAAA,CACA,SAAY,CACN1B,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnCkH,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,SAAA,CAAU,MACtB,CAAC,EAEL,CAAA,CACAlH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCpBO,SAASi8B,EAAAA,CACd9jC,EACA7S,CAAAA,CAAQ,EAAA,CACR,CACA,OAAO0rB,oBAAAA,CAAqB,CAC1B,SAAU,CAAC,QAAA,CAAU,sBAAuB7Y,CAAAA,CAAU7S,CAAK,EAC3D,gBAAA,CAAkB,EAAA,CAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAU,CAAA,GAA6B,CAEvD,IAAMirB,CAAAA,CAAajrB,CAAAA,CAAY3rB,EAAQ,CAAA,CAAIA,CAAAA,CAErC7B,EAAS,MAAM2Q,CAAAA,CAAQ,wCAAyC,CACpE+D,CAAAA,CACA8Y,GAAa,EAAA,CACbirB,CACF,CAAC,CAAA,CAID,OAAIjrB,CAAAA,EAAaxtB,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAKA,EAAO,CAAC,CAAA,EAAG,YAAcwtB,CAAAA,CAEtDxtB,CAAAA,CAAO,MAAM,CAAA,CAAG6B,CAAAA,CAAQ,CAAC,CAAA,CAG3B7B,CACT,CAAA,CACA,iBAAmB0tB,CAAAA,EAEb,CAACA,GAAYA,CAAAA,CAAS,MAAA,CAAS7rB,EACjC,MAAA,CAIqB6rB,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAC5B,UAEzB,OAAA,CAAS,CAAC,CAAChZ,CACb,CAAC,CACH,CCnCO,SAASgkC,EAAAA,CAAkChkC,CAAAA,CAA8B,CAC9E,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,qBAAA,CAAuB1O,CAAQ,CAAA,CACpD,QAAS,CAAC,CAACA,EACX,OAAA,CAAS,CAAC,CAAE,MAAA,CAAA3F,CAAO,CAAA,GACjBuC,EAAAA,CACE,SAAA,CACA,sCAAA,CACA,CAAE,cAAA,CAAgBoD,CAAS,EAC3B,MAAA,CACA,MAAA,CACA3F,CACF,CACJ,CAAC,CACH,CCXO,SAAS4pC,GAA4CjkC,CAAAA,CAAmB,CAC7E,OAAO0O,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,iCAAkC1O,CAAQ,CAAA,CAC/D,QAAS,SACFA,CAAAA,CAAAA,CACU,MAAM/D,CAAAA,CAAQ,kDAAA,CAAoD,CAAE,OAAA,CAAS+D,CAAS,CAAC,GACxF,WAAA,CAFQ,GAIxB,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CCjBO,SAASkkC,GAAkCl+B,CAAAA,CAAiB,CACjE,OAAO0I,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,qBAAA,CAAuB1I,CAAO,CAAA,CACnD,OAAA,CAAS,IACP/J,CAAAA,CAAQ,uCAAA,CAAyC,CAC/C+J,CACF,CAAC,EACH,MAAA,CAAS5W,CAAAA,EAASA,EAAK,IAAA,CAAK,CAACuB,EAAGvF,CAAAA,GAAMuF,CAAAA,CAAE,UAAYvF,CAAAA,CAAE,SAAS,CACjE,CAAC,CACH,CCTO,SAAS+4C,EAAAA,CAAgDn+B,EAAiB,CAC/E,OAAO0I,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,oCAAA,CAAsC1I,CAAO,EAClE,OAAA,CAAS,IACP/J,EAAQ,sDAAA,CAAwD,CAC9D+J,CACF,CAAC,CAAA,CACH,MAAA,CAAS5W,GAASA,CAAAA,CAAK,IAAA,CAAK,CAACuB,CAAAA,CAAGvF,CAAAA,GAAMuF,EAAE,SAAA,CAAYvF,CAAAA,CAAE,SAAS,CACjE,CAAC,CACH,CCTO,SAASg5C,EAAAA,CAAmCp+B,CAAAA,CAAiB,CAClE,OAAO0I,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,mBAAoB1I,CAAO,CAAA,CAChD,QAAS,IACP/J,CAAAA,CAAQ,yCAAA,CAA2C,CACjD+J,CACF,CAAC,EACH,MAAA,CAAS5W,CAAAA,EAASA,EAAK,IAAA,CAAK,CAACuB,EAAGvF,CAAAA,GAAMuF,CAAAA,CAAE,UAAA,CAAavF,CAAAA,CAAE,UAAU,CACnE,CAAC,CACH,CCTO,SAASi5C,EAAAA,CAA8Br+B,EAAiB,CAC7D,OAAO0I,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,iBAAA,CAAmB1I,CAAO,CAAA,CAC/C,OAAA,CAAS,IACP/J,CAAAA,CAAQ,mCAAA,CAAqC,CAC3C+J,EACA,UACF,CAAC,CACL,CAAC,CACH,CCTO,SAASs+B,EAAAA,CAA0BzxB,EAAc,CACtD,OAAOnE,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAemE,CAAI,CAAA,CACxC,OAAA,CAAS,IACP5W,EAAQ,+BAAA,CAAiC,CACvC4W,CACF,CAAC,CAAA,CACH,OAASzjB,CAAAA,EAASA,CAAAA,CAAK,KAAK,CAACuB,CAAAA,CAAGvF,IAAMuF,CAAAA,CAAE,OAAA,CAAUvF,EAAE,OAAO,CAAA,CAC3D,QAAS,CAAC,CAACynB,CACb,CAAC,CACH,CCNO,SAAS0xB,EAAAA,CAA6CvkC,EAAkB7S,CAAAA,CAAQ,GAAA,CAAK,CAC1F,OAAO0rB,oBAAAA,CAML,CACA,SAAU,CAAC,QAAA,CAAU,0BAA2B7Y,CAAAA,CAAU7S,CAAK,EAC/D,gBAAA,CAAkB,IAAA,CAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA2rB,CAAU,CAAA,GAA+B,CAOzD,IAAI0rB,CAAAA,CAAAA,CANa,MAAMvoC,EAAQ,mCAAA,CAAqC,CAChE,MAAO,CAAC+D,CAAAA,CAAU8Y,GAAa,EAAE,CAAA,CACjC,MAAA3rB,CACF,CAAC,EACA,IAAA,CAAM2B,CAAAA,EAAWA,CAAgC,CAAA,EAEH,qBAAA,EAAyB,GAG1E,OAAIgqB,CAAAA,GACF0rB,EAAcA,CAAAA,CAAY,MAAA,CAAQC,GAAeA,CAAAA,CAAW,EAAA,GAAO3rB,CAAS,CAAA,CAAA,CAGvE0rB,CACT,CAAA,CAEA,iBAAmBxrB,CAAAA,EACjBA,CAAAA,CAAS,SAAW7rB,CAAAA,CAAQ6rB,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,CAAA,CAAE,EAAA,CAAK,IACnE,CAAC,CACH,CCxCO,SAAS0rB,EAAAA,CAA0B1kC,CAAAA,CAA8B,CACtE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,aAAA,CAAe1O,CAAQ,EAC5C,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,SAAyC,CAChD,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,kDAAkD,CAAA,CAIpE,IAAMxC,CAAAA,CAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,yBAAA,EAA4BxK,CAAQ,EAC9D,CAAA,CAEA,GAAI,CAACxC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,EAAS,MAAM,CAAA,CAAE,EAGnE,OAAOA,CAAAA,CAAS,MAClB,CACF,CAAC,CACH,CCrBO,SAASmnC,EAAAA,CAAqC3kC,CAAAA,CAAkB,CACrE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,yBAAA,CAA2B1O,CAAQ,EACxD,OAAA,CAAS,SAAY,CACnB,IAAMxC,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,iCAAiCxK,CAAQ,CAAA,CACnE,EAEA,GAAI,CAACxC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,yCAAA,EAA4CA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAI/E,QADc,MAAMA,CAAAA,CAAS,MAAK,EACtB,IACd,CACF,CAAC,CACH,CCXO,SAASonC,EAAAA,CAAkC5kC,CAAAA,CAAkB,CAClE,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,qBAAA,CAAuB1O,CAAQ,CAAA,CACpD,OAAA,CAAS,IACP/D,CAAAA,CAAQ,wCAAA,CAA0C,CAChD+D,CACF,CAAC,CAAA,CACH,QAAS,CAAC,CAACA,CACb,CAAC,CACH,CCsBA,SAAS6kC,EAAAA,CAAgBz4C,EAAoC,CAC3D,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAC7B,IAAM04C,CAAAA,CAAU14C,EAAM,IAAA,EAAK,CAC3B,OAAO04C,CAAAA,CAAQ,MAAA,CAAS,EAAIA,CAAAA,CAAU,MACxC,CAGF,CAEA,SAASC,EAAAA,CAAgB34C,EAAoC,CAC3D,GAAI,OAAOA,CAAAA,EAAU,QAAA,EAAY,OAAO,QAAA,CAASA,CAAK,CAAA,CACpD,OAAOA,CAAAA,CAGT,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAC7B,IAAM04C,CAAAA,CAAU14C,EAAM,IAAA,EAAK,CAC3B,GAAI,CAAC04C,CAAAA,CACH,OAGF,IAAME,CAAAA,CAAS,MAAA,CAAO,WAAWF,CAAO,CAAA,CACxC,GAAI,MAAA,CAAO,QAAA,CAASE,CAAM,CAAA,CACxB,OAAOA,EAIT,IAAMt5B,CAAAA,CADYo5B,EAAQ,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAClB,KAAA,CAAM,oBAAoB,CAAA,CAClD,GAAIp5B,CAAAA,CAAO,CACT,IAAMvE,CAAAA,CAAS,OAAO,UAAA,CAAWuE,CAAAA,CAAM,CAAC,CAAC,CAAA,CACzC,GAAI,MAAA,CAAO,QAAA,CAASvE,CAAM,EACxB,OAAOA,CAEX,CACF,CAGF,CAEA,SAAS89B,EAAAA,CAAWC,CAAAA,CAAoD,CACtE,GAAI,CAACA,CAAAA,EAAY,OAAOA,CAAAA,EAAa,QAAA,CACnC,OAGF,IAAMn9B,CAAAA,CAAQm9B,EAGd,OAAO,CACL,KAAML,EAAAA,CAAgB98B,CAAAA,CAAM,IAAI,CAAA,EAAK,EAAA,CACrC,OAAQ88B,EAAAA,CAAgB98B,CAAAA,CAAM,MAAM,CAAA,EAAK,EAAA,CACzC,KAAA,CAAQ88B,EAAAA,CAAgB98B,CAAAA,CAAM,KAAK,GAAK,MAAA,CACxC,OAAA,CAASg9B,GAAgBh9B,CAAAA,CAAM,OAAO,GAAK,CAAA,CAC3C,QAAA,CAAUg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,QAAQ,CAAA,EAAK,EAC7C,QAAA,CAAU88B,EAAAA,CAAgB98B,EAAM,QAAQ,CAAA,EAAK,MAC7C,SAAA,CAAWg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,SAAS,CAAA,EAAK,CAAA,CAC/C,QAAS88B,EAAAA,CAAgB98B,CAAAA,CAAM,OAAO,CAAA,CACtC,KAAA,CAAO88B,GAAgB98B,CAAAA,CAAM,KAAK,EAClC,cAAA,CAAgBg9B,EAAAA,CAAgBh9B,EAAM,cAAc,CAAA,CACpD,mBAAoBg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,kBAAkB,CAAA,CAC5D,MAAA,CAAQg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,MAAM,CAAA,CACpC,WAAYg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,UAAU,CAAA,CAC5C,OAAA,CAASg9B,GAAgBh9B,CAAAA,CAAM,OAAO,CAAA,CACtC,WAAA,CAAag9B,EAAAA,CAAgBh9B,CAAAA,CAAM,WAAW,CAAA,CAC9C,MAAA,CAAQg9B,GAAgBh9B,CAAAA,CAAM,MAAM,EACpC,UAAA,CAAYg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,UAAU,CAAA,CAC5C,OAAA,CAAS88B,GAAgB98B,CAAAA,CAAM,OAAO,EACtC,OAAA,CAAUA,CAAAA,CAAM,SAAW,EAAC,CAC5B,UAAYA,CAAAA,CAAM,SAAA,EAAa,EAAC,CAChC,GAAA,CAAKg9B,GAAgBh9B,CAAAA,CAAM,GAAG,CAChC,CACF,CAEA,SAASo9B,EAAAA,CAAch8B,CAAAA,CAA6B,CAClD,GAAI,CAACA,CAAAA,EAAW,OAAOA,CAAAA,EAAY,QAAA,CACjC,OAAO,EAAC,CAGV,IAAMyZ,CAAAA,CAAa,CAACzZ,CAAO,EACrBi8B,CAAAA,CAASj8B,CAAAA,CACXi8B,EAAO,IAAA,EAAQ,OAAOA,EAAO,IAAA,EAAS,QAAA,EACxCxiB,CAAAA,CAAW,IAAA,CAAKwiB,CAAAA,CAAO,IAA+B,EAEpDA,CAAAA,CAAO,MAAA,EAAU,OAAOA,CAAAA,CAAO,MAAA,EAAW,UAC5CxiB,CAAAA,CAAW,IAAA,CAAKwiB,EAAO,MAAiC,CAAA,CAEtDA,EAAO,SAAA,EAAa,OAAOA,EAAO,SAAA,EAAc,QAAA,EAClDxiB,EAAW,IAAA,CAAKwiB,CAAAA,CAAO,SAAoC,CAAA,CAG7D,IAAA,IAAWtjB,CAAAA,IAAac,EAAY,CAClC,GAAI,MAAM,OAAA,CAAQd,CAAS,EACzB,OAAOA,CAAAA,CAGT,GAAIA,CAAAA,EAAa,OAAOA,CAAAA,EAAc,SACpC,IAAA,IAAW9xB,CAAAA,IAAO,CAChB,SAAA,CACA,QAAA,CACA,SACA,OAAA,CACA,WAAA,CACA,UACF,CAAA,CAAG,CACD,IAAM5D,EAAS01B,CAAAA,CAAsC9xB,CAAG,EACxD,GAAI,KAAA,CAAM,QAAQ5D,CAAK,CAAA,CACrB,OAAOA,CAEX,CAEJ,CAEA,OAAO,EACT,CAEA,SAASi5C,GAAgBl8B,CAAAA,CAAsC,CAC7D,GAAI,CAACA,CAAAA,EAAW,OAAOA,GAAY,QAAA,CACjC,OAGF,IAAMi8B,CAAAA,CAASj8B,CAAAA,CACf,OACE07B,EAAAA,CAAgBO,CAAAA,CAAO,QAAQ,CAAA,EAC/BP,EAAAA,CAAgBO,CAAAA,CAAO,IAAI,CAAA,EAC3BP,EAAAA,CAAgBO,EAAO,OAAO,CAElC,CASO,SAASE,EAAAA,CACdtlC,CAAAA,CACAiT,CAAAA,CAAmB,KAAA,CACnBD,CAAAA,CAAuB,KACvB,CACA,OAAOtE,aAAa,CAClB,QAAA,CAAU,CACR,QAAA,CACA,WAAA,CACA,KACA1O,CAAAA,CACAgT,CAAAA,CAAc,eAAiB,KAAA,CAC/BC,CACF,EACA,OAAA,CAAS,CAAA,CAAQjT,EACjB,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,IAAA,CACjB,OAAA,CAAS,SAAwC,CAC/C,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,2CAAsC,CAAA,CAGxD,IAAMnD,CAAAA,CAAW,CAAA,EAAG6N,CAAAA,CAAc,qBAAqB,CAAA,wBAAA,CAAA,CACjDlN,EAAW,MAAM,KAAA,CAAMX,EAAU,CACrC,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,MAAA,CAAQ,mBACR,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,QAAA,CAAAmD,EAAU,WAAA,CAAAgT,CAAAA,CAAa,SAAAC,CAAS,CAAC,CAC1D,CAAC,CAAA,CAED,GAAI,CAACzV,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,kDAA6CA,CAAAA,CAAS,MAAM,GAC9D,CAAA,CAGF,IAAM2L,EAAW,MAAM3L,CAAAA,CAAS,IAAA,EAAK,CAC/BlF,CAAAA,CAAS6sC,EAAAA,CAAch8B,CAAO,CAAA,CACjC,GAAA,CAAKlX,GAASgzC,EAAAA,CAAWhzC,CAAI,CAAC,CAAA,CAC9B,MAAA,CAAQA,CAAAA,EAAsC,CAAA,CAAQA,CAAK,CAAA,CAE3D,OAAQA,CAAAA,EAAUA,CAAAA,CAAK,QAAqB,KAAK,CAAA,CAEpD,GAAI,CAACqG,CAAAA,CAAO,OACV,MAAM,IAAI,MACR,4DACF,CAAA,CAGF,OAAO,CACL,QAAA,CAAU+sC,GAAgBl8B,CAAO,CAAA,EAAKnJ,CAAAA,CACtC,QAAA,CAAU6kC,EAAAA,CACP17B,CAAAA,EAAiD,cACjDA,CAAAA,EAAiD,QACpD,GAAG,WAAA,EAAY,CACf,QAAS7Q,CACX,CACF,CACF,CAAC,CACH,CCjOO,SAASitC,EAAAA,CAAoCvlC,EAAkB,CACpE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,MAAA,CAAQ,cAAA,CAAgB1O,CAAQ,CAAA,CACrD,SAAA,CAAW,IACX,eAAA,CAAiB,GAAA,CACjB,QAAS,SAAY,CACnB,MAAM6M,CAAAA,EAAe,CAAE,cAAc4B,EAAAA,EAA6B,EAClE,MAAM5B,CAAAA,EAAe,CAAE,aAAA,CACrB8H,CAAAA,CAA2B3U,CAAQ,CACrC,CAAA,CAEA,IAAM+yB,EAAelmB,CAAAA,EAAe,CAAE,aACpC4B,EAAAA,EAA4B,CAAE,QAChC,CAAA,CACM2hB,CAAAA,CAAcvjB,CAAAA,GAAiB,YAAA,CACnC8H,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QACvC,EAEMwlC,CAAAA,CAAgB,MAAMvpC,CAAAA,CAAQ,0BAAA,CAA4B,EAAE,EAC/D,KAAA,CAAM,IAAG,EAAY,CAAA,CAElBwpC,CAAAA,CAAc,OAAO,UAAA,CAAWD,CAAAA,EAAc,QAAU,EAAE,CAAA,CAEhE,GAAI,CAACpV,CAAAA,CACH,OAAO,CACL,IAAA,CAAM,OACN,KAAA,CAAO,MAAA,CACP,KAAA,CAAO,MAAA,CAAO,QAAA,CAASqV,CAAW,EAC9BA,CAAAA,CACA1S,CAAAA,CACEA,EAAa,IAAA,CAAOA,CAAAA,CAAa,MACjC,CAAA,CACN,cAAA,CAAgB,CAClB,CAAA,CAGF,IAAM2S,CAAAA,CAAgB73B,EAAWuiB,CAAAA,CAAY,OAAO,EAAE,MAAA,CAChDuV,CAAAA,CAAiB93B,EAAWuiB,CAAAA,CAAY,eAAe,CAAA,CAAE,MAAA,CAE/D,OAAO,CACL,KAAM,MAAA,CACN,KAAA,CAAO,OACP,KAAA,CAAO,MAAA,CAAO,SAASqV,CAAW,CAAA,CAC9BA,EACA1S,CAAAA,CACEA,CAAAA,CAAa,KAAOA,CAAAA,CAAa,KAAA,CACjC,EACN,cAAA,CAAgB2S,CAAAA,CAAgBC,EAChC,KAAA,CAAO,CACL,CACE,IAAA,CAAM,SAAA,CACN,OAAA,CAASD,CACX,CAAA,CACA,CACE,KAAM,SAAA,CACN,OAAA,CAASC,CACX,CACF,CACF,CACF,CACF,CAAC,CACH,CC9DO,SAASC,GAAmC5lC,CAAAA,CAAkB,CACnE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,KAAA,CAAO,eAAgB1O,CAAQ,CAAA,CACpD,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SAAY,CACnB,MAAM6M,CAAAA,GAAiB,aAAA,CAAc4B,EAAAA,EAA6B,CAAA,CAClE,MAAM5B,CAAAA,EAAe,CAAE,aAAA,CACrB8H,CAAAA,CAA2B3U,CAAQ,CACrC,CAAA,CAEA,IAAMowB,CAAAA,CAAcvjB,CAAAA,GAAiB,YAAA,CACnC8H,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QACvC,CAAA,CACM+yB,EAAelmB,CAAAA,EAAe,CAAE,aACpC4B,EAAAA,EAA4B,CAAE,QAChC,CAAA,CAEMo3B,CAAAA,CAAQ,CAAA,CAEd,OAAKzV,CAAAA,CASE,CACL,KAAM,KAAA,CACN,KAAA,CAAO,cACP,KAAA,CAAAyV,CAAAA,CACA,eACEh4B,CAAAA,CAAWuiB,CAAAA,CAAY,WAAW,CAAA,CAAE,MAAA,CACpCviB,EAAWuiB,CAAAA,EAAa,mBAAmB,EAAE,MAAA,CAC/C,GAAA,CAAA,CAAA,CAAO2C,GAAc,eAAA,EAAmB,CAAA,EAAK,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAC3D,MAAO,CACL,CACE,KAAM,SAAA,CACN,OAAA,CAASllB,EAAWuiB,CAAAA,CAAY,WAAW,CAAA,CAAE,MAC/C,CAAA,CACA,CACE,KAAM,SAAA,CACN,OAAA,CAASviB,EAAWuiB,CAAAA,CAAY,mBAAmB,EAAE,MACvD,CACF,CACF,CAAA,CA1BS,CACL,IAAA,CAAM,MACN,KAAA,CAAO,aAAA,CACP,MAAAyV,CAAAA,CACA,cAAA,CAAgB,CAClB,CAsBJ,CACF,CAAC,CACH,CCjDA,SAASC,EAAAA,CAAO/S,EAA4B,CAU1C,IAAIgT,CAAAA,CACF,GAAA,CAAA,CALgBhT,CAAAA,CAAa,SAAA,CACC,KACS,IAAA,CAGK,GAAA,CAE1CgT,EAAuB,GAAA,GACzBA,CAAAA,CAAuB,KAGzB,IAAM71B,CAAAA,CAAuB6iB,CAAAA,CAAa,oBAAA,CAAuB,GAAA,CAC3D9iB,CAAAA,CAAgB8iB,EAAa,aAAA,CAC7BiT,CAAAA,CAAoBjT,EAAa,gBAAA,CAEvC,OAAA,CACG9iB,EAAgB81B,CAAAA,CAAuB71B,CAAAA,CACxC81B,CAAAA,EACA,OAAA,CAAQ,CAAC,CACb,CAEO,SAASC,EAAAA,CAAyCjmC,EAAkB,CACzE,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,YAAA,CAAc,eAAgB1O,CAAQ,CAAA,CAC3D,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SAAY,CACnB,MAAM6M,CAAAA,EAAe,CAAE,cAAc4B,EAAAA,EAA6B,EAClE,MAAM5B,CAAAA,GAAiB,aAAA,CACrB8H,CAAAA,CAA2B3U,CAAQ,CACrC,CAAA,CAEA,IAAM+yB,EAAelmB,CAAAA,EAAe,CAAE,aACpC4B,EAAAA,EAA4B,CAAE,QAChC,CAAA,CACM2hB,CAAAA,CAAcvjB,CAAAA,EAAe,CAAE,YAAA,CACnC8H,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QACvC,EAEA,GAAI,CAAC+yB,GAAgB,CAAC3C,CAAAA,CACpB,OAAO,CACL,IAAA,CAAM,KACN,KAAA,CAAO,YAAA,CACP,MAAO,CAAA,CACP,cAAA,CAAgB,CAClB,CAAA,CAGF,IAAMoV,CAAAA,CAAgB,MAAMvpC,CAAAA,CAAQ,0BAAA,CAA4B,EAAE,CAAA,CAC/D,MAAM,IAAG,CAAA,CAAY,EAElBwpC,CAAAA,CAAc,MAAA,CAAO,UAAA,CAAWD,CAAAA,EAAc,MAAA,EAAU,EAAE,EAC1DK,CAAAA,CAAQ,MAAA,CAAO,SAASJ,CAAW,CAAA,CACrCA,EACA1S,CAAAA,CAAa,IAAA,CAAOA,CAAAA,CAAa,KAAA,CAE/BhL,CAAAA,CAAgBla,CAAAA,CAAWuiB,EAAY,cAAc,CAAA,CAAE,OACvD8V,CAAAA,CAAiBr4B,CAAAA,CACrBuiB,EAAY,wBACd,CAAA,CAAE,OACI+V,CAAAA,CAAgBt4B,CAAAA,CACpBuiB,EAAY,uBACd,CAAA,CAAE,OACIgW,CAAAA,CAAoBv4B,CAAAA,CACxBuiB,EAAY,qBACd,CAAA,CAAE,MAAA,CACIiW,CAAAA,CAA2B,IAAA,CAAK,GAAA,CAAA,CACnC,OAAOjW,CAAAA,CAAY,WAAW,EAAI,MAAA,CAAOA,CAAAA,CAAY,SAAS,CAAA,EAC7D,GAAA,CACF,CACF,CAAA,CACMkW,CAAAA,CAAuB/3B,EAAAA,CAC3B6hB,EAAY,uBACd,CAAA,CAEI,EADA,IAAA,CAAK,GAAA,CAAIgW,EAAmBC,CAAwB,CAAA,CAGlDE,CAAAA,CAAY,CAACl4B,EAAAA,CACjB0Z,CAAAA,CACAgL,EAAa,aACf,CAAA,CAAE,QAAQ,CAAC,CAAA,CACLyT,EAAwB,CAACn4B,EAAAA,CAC7B63B,EACAnT,CAAAA,CAAa,aACf,EAAE,OAAA,CAAQ,CAAC,EACL0T,CAAAA,CAAwB,CAACp4B,GAC7B83B,CAAAA,CACApT,CAAAA,CAAa,aACf,CAAA,CAAE,OAAA,CAAQ,CAAC,EACL2T,CAAAA,CAAqB,CAACr4B,GAC1Bg4B,CAAAA,CACAtT,CAAAA,CAAa,aACf,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CACL4T,CAAAA,CAAkB,CAACt4B,GACvBi4B,CAAAA,CACAvT,CAAAA,CAAa,aACf,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CACL6T,CAAAA,CAAe,IAAA,CAAK,GAAA,CAAIL,CAAAA,CAAYG,CAAAA,CAAoB,CAAC,CAAA,CACzDG,CAAAA,CAAc,KAAK,GAAA,CAAIN,CAAAA,CAAYC,EAAuB,CAAC,CAAA,CAEjE,OAAO,CACL,IAAA,CAAM,KACN,KAAA,CAAO,YAAA,CACP,MAAAX,CAAAA,CACA,cAAA,CAAgB,CAACe,CAAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,CACvC,GAAA,CAAKd,EAAAA,CAAO/S,CAAY,CAAA,CACxB,KAAA,CAAO,CACL,CACE,IAAA,CAAM,aACN,OAAA,CAASwT,CACX,CAAA,CACA,CACE,IAAA,CAAM,WAAA,CACN,QAAS,CAACM,CAAAA,CAAY,QAAQ,CAAC,CACjC,EACA,CACE,IAAA,CAAM,sBAAA,CACN,OAAA,CAASL,CACX,CAAA,CACA,CACE,IAAA,CAAM,sBAAA,CACN,QAASC,CACX,CAAA,CACA,GAAIC,CAAAA,CAAqB,CAAA,CACrB,CACE,CACE,IAAA,CAAM,qBACN,OAAA,CAAS,CAACA,EAAmB,OAAA,CAAQ,CAAC,CACxC,CACF,CAAA,CACA,EAAC,CACL,GAAIC,CAAAA,CAAkB,GAAKA,CAAAA,GAAoBD,CAAAA,CAC3C,CACE,CACE,IAAA,CAAM,kBACN,OAAA,CAAS,CAACC,CAAAA,CAAgB,OAAA,CAAQ,CAAC,CACrC,CACF,CAAA,CACA,EACN,CACF,CACF,CACF,CAAC,CACH,CC5JA,IAAMthC,CAAAA,CAAMpB,GAAM,UAAA,CAEL6iC,EAAAA,CAGT,CACF,SAAA,CAAW,CACTzhC,EAAI,QAAA,CACJA,CAAAA,CAAI,oBACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,4BAAA,CACJA,CAAAA,CAAI,mBACJA,CAAAA,CAAI,uBAAA,CACJA,CAAAA,CAAI,eAAA,CACJA,CAAAA,CAAI,uBACN,EACA,eAAA,CAAiB,CACfA,EAAI,oBAAA,CACJA,CAAAA,CAAI,WACJA,CAAAA,CAAI,mCAAA,CACJA,CAAAA,CAAI,mBAAA,CACJA,CAAAA,CAAI,kBAAA,CACJA,EAAI,kBACN,CAAA,CACA,UAAW,CAACA,CAAAA,CAAI,QAAQ,CAAA,CACxB,kBAAA,CAAoB,CAClBA,CAAAA,CAAI,yBAAA,CACJA,CAAAA,CAAI,iBACJA,CAAAA,CAAI,mBAAA,CACJA,EAAI,0BAAA,CACJA,CAAAA,CAAI,sBACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,qBAAA,CACJA,CAAAA,CAAI,uBACN,CAAA,CACA,OAAA,CAAS,CACPA,CAAAA,CAAI,aAAA,CACJA,EAAI,eAAA,CACJA,CAAAA,CAAI,eAAA,CACJA,CAAAA,CAAI,oBAAA,CACJA,CAAAA,CAAI,0BACJA,CAAAA,CAAI,gBAAA,CACJA,EAAI,YACN,CAAA,CACA,GAAI,EACN,EC5CO,IAAM0hC,EAAAA,CAAsB,MAAA,CAAO,KACxC9iC,EAAAA,CAAM,UACR,ECFA,IAAM+iC,EAAAA,CAAkB/iC,GAAM,UAAA,CAKjBgjC,EAAAA,CAAwBD,EAAAA,CAExBE,EAAAA,CACX,MAAA,CAAO,OAAA,CAAQF,EAAe,CAAA,CAAE,MAAA,CAAO,CAACvtB,CAAAA,CAAK,CAAC5H,EAAM7f,CAAE,CAAA,IACpDynB,EAAIznB,CAAE,CAAA,CAAI6f,EACH4H,CAAAA,CAAAA,CACN,EAAuC,ECE5C,IAAMutB,GAAkB/iC,EAAAA,CAAM,UAAA,CAE9B,SAASkjC,EAAAA,CAAoB/6C,CAAAA,CAA2C,CACtE,OAAO,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK46C,EAAAA,CAAiB56C,CAAK,CACpE,CAEO,SAASg7C,EAAAA,CAA4BxiB,CAAAA,CAG1C,CACA,IAAMyiB,CAAAA,CAAwC,KAAA,CAAM,QAAQziB,CAAO,CAAA,CAC/DA,EACA,CAACA,CAAO,CAAA,CAEN0iB,CAAAA,CAASD,CAAAA,CAAU,QAAA,CAAS,EAAwB,CAAA,CAEpDE,CAAAA,CAAe,MAAM,IAAA,CACzB,IAAI,IACFF,CAAAA,CAAU,MAAA,CACPj7C,GAECA,CAAAA,EAAU,IAAA,EACVA,IAAW,EACf,CACF,CACF,CAAA,CAEM8mB,CAAAA,CACJo0B,GAAUC,CAAAA,CAAa,MAAA,GAAW,CAAA,CAC9B,KAAA,CACAA,CAAAA,CACG,GAAA,CAAKn7C,GAAUA,CAAAA,CAAM,QAAA,EAAU,CAAA,CAC/B,IAAA,GACA,IAAA,CAAK,GAAG,CAAA,CAEXo7C,CAAAA,CAAe,IAAI,GAAA,CAEpBF,GACHC,CAAAA,CAAa,OAAA,CAASn7C,GAAU,CAC9B,GAAIA,KAAS06C,EAAAA,CAA+B,CAC1CA,EAAAA,CAA8B16C,CAA2B,CAAA,CAAE,OAAA,CACxD4F,GAAOw1C,CAAAA,CAAa,GAAA,CAAIx1C,CAAE,CAC7B,CAAA,CACA,MACF,CAEIm1C,EAAAA,CAAoB/6C,CAAK,CAAA,EAC3Bo7C,CAAAA,CAAa,IAAIR,EAAAA,CAAgB56C,CAAK,CAAC,EAE3C,CAAC,EAGH,IAAMq7C,CAAAA,CAAarjC,EAAAA,CAAkB,KAAA,CAAM,IAAA,CAAKojC,CAAY,CAAC,CAAA,CAE7D,OAAO,CACL,SAAA,CAAAt0B,CAAAA,CACA,WAAAu0B,CACF,CACF,CAEA,SAASrjC,EAAAA,CAAkBM,CAAAA,CAA6B,CACtD,IAAIE,CAAAA,CAAM,GACNC,CAAAA,CAAO,EAAA,CAEX,OAAAH,CAAAA,CAAkB,OAAA,CAAS5Q,CAAAA,EAAc,CACnCA,CAAAA,CAAY,EAAA,CACd8Q,GAAO,EAAA,EAAM,MAAA,CAAO9Q,CAAS,CAAA,CAE7B+Q,CAAAA,EAAQ,IAAM,MAAA,CAAO/Q,CAAAA,CAAY,EAAE,EAEvC,CAAC,EAEM,CACL8Q,CAAAA,GAAQ,GAAKA,CAAAA,CAAI,QAAA,GAAa,IAAA,CAC9BC,CAAAA,GAAS,EAAA,CAAKA,CAAAA,CAAK,QAAA,EAAS,CAAI,IAClC,CACF,CAEO,SAAS6iC,EAAAA,CACd1nC,CAAAA,CACA7S,EAAQ,EAAA,CACRy3B,CAAAA,CAA+B,EAAC,CAChC,CACA,GAAM,CAAE,UAAA,CAAA6iB,CAAAA,CAAY,UAAAv0B,CAAU,CAAA,CAAIk0B,GAA4BxiB,CAAO,CAAA,CAErE,OAAO/L,oBAAAA,CAAwC,CAC7C,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQ,eAAgB7Y,CAAAA,CAAU7S,CAAAA,CAAO+lB,CAAS,CAAA,CACvE,WAAA,CAAa,CAAE,KAAA,CAAO,GAAI,UAAA,CAAY,EAAG,CAAA,CACzC,gBAAA,CAAkB,GAClB,gBAAA,CAAkB,CAAC8F,CAAAA,CAAU2uB,CAAAA,GAC3B3uB,CAAAA,CAAW,EAAEA,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,GAAA,EAAO,GAAK,CAAA,CAAI,EAAA,CAE9D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAF,CAAU,CAAA,GAAA,CACT,MAAM7c,EACrB,mCAAA,CACA,CAAC+D,EAAU8Y,CAAAA,CAAW3rB,CAAAA,CAAO,GAAGs6C,CAAU,CAC5C,CAAA,EAEgB,IACbxwB,CAAAA,GACE,CACC,IAAKA,CAAAA,CAAE,CAAC,EACR,IAAA,CAAMA,CAAAA,CAAE,CAAC,CAAA,CAAE,EAAA,CAAG,CAAC,CAAA,CACf,SAAA,CAAWA,EAAE,CAAC,CAAA,CAAE,UAChB,MAAA,CAAQA,CAAAA,CAAE,CAAC,CAAA,CAAE,MAAA,CACb,GAAGA,EAAE,CAAC,CAAA,CAAE,GAAG,CAAC,CACd,EACJ,CAAA,CAEF,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA2wB,CAAAA,CAAO,WAAAC,CAAW,CAAA,IAAO,CAClC,UAAA,CAAAA,CAAAA,CACA,MAAOD,CAAAA,CAAM,GAAA,CAAKl1B,CAAAA,EAChBA,CAAAA,CAAK,MAAA,CAAQzgB,CAAAA,EAAS,CACpB,OAAQA,CAAAA,CAAK,MACX,KAAK,gBACL,KAAK,2BAAA,CAIH,OAHmB4b,CAAAA,CAChB5b,CAAAA,CAAsB,WACzB,CAAA,CACkB,MAAA,CAAS,EAC7B,KAAK,UAAA,CACL,KAAK,qBAAA,CACL,KAAK,qBAAA,CACL,KAAK,oBAAA,CACH,OAAO4b,EAAW5b,CAAAA,CAAK,MAAM,EAAE,MAAA,GAAW,MAAA,CAE5C,KAAK,uBAAA,CACH,OAAO4b,CAAAA,CAAY5b,CAAAA,CAAa,MAAM,CAAA,CAAE,SAAW,MAAA,CAErD,KAAK,0BACH,IAAME,CAAAA,CAAQ0b,EAAW5b,CAAAA,CAAK,MAAM,CAAA,CACpC,OAAO,CAAC,MAAM,EAAE,QAAA,CAASE,CAAAA,CAAM,MAAM,CAAA,CAEvC,KAAK,uBAIH,OAHmB0b,CAAAA,CAChB5b,EAA4B,WAC/B,CAAA,CACkB,OAAS,CAAA,CAE7B,KAAK,kBACL,KAAK,8BAAA,CACL,KAAK,YAAA,CACL,KAAK,oBAAA,CACL,KAAK,oBAAA,CACL,KAAK,uBACL,KAAK,qCAAA,CACH,OAAO,KAAA,CAET,KAAK,sBACH,OAAO,KAAA,CACT,QACE,OAAO,MACX,CACF,CAAC,CACH,CACF,EACF,CAAC,CACH,CC/JO,SAAS61C,EAAAA,CACd9nC,EACA7S,CAAAA,CAAQ,EAAA,CACRy3B,EAA+B,EAAC,CAChC,CACA,GAAM,CAAE,UAAA1R,CAAU,CAAA,CAAIk0B,GAA4BxiB,CAAO,CAAA,CAEzD,OAAO/L,oBAAAA,CAAwC,CAC7C,GAAG6uB,EAAAA,CAAqC1nC,CAAAA,CAAU7S,CAAAA,CAAOy3B,CAAO,CAAA,CAChE,QAAA,CAAU,CAAC,QAAA,CAAU,KAAA,CAAO,eAAgB5kB,CAAAA,CAAU7S,CAAAA,CAAO+lB,CAAS,CAAA,CACtE,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA00B,CAAAA,CAAO,WAAAC,CAAW,CAAA,IAAO,CAClC,UAAA,CAAAA,CAAAA,CACA,MAAOD,CAAAA,CAAM,GAAA,CAAKl1B,CAAAA,EAChBA,CAAAA,CAAK,MAAA,CAAQzgB,CAAAA,EAAS,CACpB,OAAQA,CAAAA,CAAK,MACX,KAAK,gBACL,KAAK,2BAAA,CAIH,OAHkB4b,CAAAA,CACf5b,CAAAA,CAAsB,UACzB,CAAA,CACiB,MAAA,CAAS,EAE5B,KAAK,sBAAA,CAIH,OAHkB4b,CAAAA,CACf5b,CAAAA,CAA4B,UAC/B,CAAA,CACiB,MAAA,CAAS,CAAA,CAE5B,KAAK,UAAA,CACL,KAAK,sBACL,KAAK,qBAAA,CACL,KAAK,oBAAA,CACH,OAAO4b,CAAAA,CAAW5b,CAAAA,CAAK,MAAM,CAAA,CAAE,SAAW,KAAA,CAE5C,KAAK,wBACH,OAAO4b,CAAAA,CAAY5b,EAAa,MAAM,CAAA,CAAE,MAAA,GAAW,KAAA,CAErD,KAAK,yBAAA,CACH,IAAME,CAAAA,CAAQ0b,CAAAA,CAAW5b,EAAK,MAAM,CAAA,CACpC,OAAO,CAAC,KAAK,EAAE,QAAA,CAASE,CAAAA,CAAM,MAAM,CAAA,CAEtC,KAAK,+BACL,KAAK,YAAA,CACL,KAAK,oBAAA,CACL,KAAK,oBAAA,CACL,KAAK,sBAAA,CACL,KAAK,sCACL,KAAK,cAAA,CACL,KAAK,UAAA,CACH,OAAO,MAET,KAAK,qBAAA,CACH,OAAO,KAAA,CACT,QACE,OAAO,MACX,CACF,CAAC,CACH,CACF,CAAA,CACF,CAAC,CACH,CC7DO,SAAS41C,EAAAA,CACd/nC,CAAAA,CACA7S,EAAQ,EAAA,CACRy3B,CAAAA,CAA+B,EAAC,CAChC,CACA,GAAM,CAAE,SAAA,CAAA1R,CAAU,CAAA,CAAIk0B,EAAAA,CAA4BxiB,CAAO,CAAA,CAEnDojB,CAAAA,CAAyB,IAAI,GAAA,CACjC,KAAA,CAAM,OAAA,CAAQpjB,CAAO,CAAA,CAAIA,CAAAA,CAAU,CAACA,CAAO,CAC7C,EACMqjB,CAAAA,CACJD,CAAAA,CAAuB,IAAI,EAAS,CAAA,EAAKA,CAAAA,CAAuB,IAAA,GAAS,CAAA,CAE3E,OAAOnvB,qBAAwC,CAC7C,GAAG6uB,GAAqC1nC,CAAAA,CAAU7S,CAAAA,CAAOy3B,CAAO,CAAA,CAChE,QAAA,CAAU,CACR,QAAA,CACA,YAAA,CACA,cAAA,CACA5kB,EACA7S,CAAAA,CACA+lB,CACF,EACA,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA00B,CAAAA,CAAO,WAAAC,CAAW,CAAA,IAAO,CAClC,UAAA,CAAAA,CAAAA,CACA,MAAOD,CAAAA,CAAM,GAAA,CAAKl1B,GAChBA,CAAAA,CAAK,MAAA,CAAQzgB,CAAAA,EAAS,CACpB,OAAQA,CAAAA,CAAK,MACX,KAAK,gBACL,KAAK,2BAAA,CAIH,OAHsB4b,CAAAA,CACnB5b,CAAAA,CAAsB,cACzB,CAAA,CACqB,MAAA,CAAS,CAAA,CAEhC,KAAK,sBAAA,CAIH,OAHoB4b,EACjB5b,CAAAA,CAA4B,YAC/B,EACmB,MAAA,CAAS,CAAA,CAE9B,KAAK,qBAAA,CACH,OAAO,KAAA,CACT,KAAK,UAAA,CACL,KAAK,sBACL,KAAK,oBAAA,CACH,OAAO,CAAC,OAAA,CAAS,IAAI,CAAA,CAAE,QAAA,CAAS4b,EAAW5b,CAAAA,CAAK,MAAM,EAAE,MAAM,CAAA,CAEhE,KAAK,yBAAA,CACH,IAAME,CAAAA,CAAQ0b,CAAAA,CAAW5b,CAAAA,CAAK,MAAM,EACpC,OAAO,CAAC,QAAS,IAAI,CAAA,CAAE,SAASE,CAAAA,CAAM,MAAM,CAAA,CAE9C,KAAK,iBAAA,CACL,KAAK,mBACL,KAAK,yBAAA,CACL,KAAK,uBAAA,CACL,KAAK,4BACL,KAAK,iBAAA,CACL,KAAK,4BAAA,CACH,OAAO,KAAA,CACT,QACE,OAAO81C,CAAAA,EAAgBD,EAAuB,GAAA,CAAI/1C,CAAAA,CAAK,IAAI,CAC/D,CACF,CAAC,CACH,CACF,EACF,CAAC,CACH,CC5EA,SAASi2C,EAAAA,CAAW1e,CAAAA,CAAoB,CACtC,IAAM2e,EAAOl6C,CAAAA,EAAcA,CAAAA,CAAE,UAAS,CAAE,QAAA,CAAS,EAAG,GAAG,CAAA,CACvD,OAAO,CAAA,EAAGu7B,CAAAA,CAAK,WAAA,EAAa,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,EAAK,QAAA,EAAS,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,CAAAA,CAAK,OAAA,EAAS,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,EAAK,QAAA,EAAU,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,EAAK,UAAA,EAAY,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,EAAK,UAAA,EAAY,CAAC,CAAA,CAC7J,CAEA,SAAS4e,EAAAA,CAAgB5e,CAAAA,CAAYpW,CAAAA,CAAuB,CAC1D,OAAO,IAAI,KAAKoW,CAAAA,CAAK,OAAA,GAAYpW,CAAAA,CAAU,GAAI,CACjD,CAEO,SAASi1B,EAAAA,CAA+Bl1B,EAAgB,KAAA,CAAQ,CACrE,OAAO0F,oBAAAA,CAAqB,CAC1B,SAAU,CAAC,QAAA,CAAU,MAAA,CAAQ,SAAA,CAAW1F,CAAa,CAAA,CACrD,QAAS,MAAO,CAAE,UAAW,CAACE,CAAAA,CAAWC,CAAO,CAAE,CAAA,GAAA,CACZ,MAAMrX,CAAAA,CAAQ,kCAAA,CAAoC,CAACkX,CAAAA,CAAe+0B,EAAAA,CAAW70B,CAAS,CAAA,CAAG60B,EAAAA,CAAW50B,CAAO,CAAC,CAChJ,CAAA,EAEe,GAAA,CAAI,CAAC,CAAE,KAAAg1B,CAAAA,CAAM,QAAA,CAAAC,EAAU,IAAA,CAAAC,CAAK,KAAO,CAChD,KAAA,CAAOD,CAAAA,CAAS,KAAA,CAAQD,CAAAA,CAAK,KAAA,CAC7B,KAAMC,CAAAA,CAAS,IAAA,CAAOD,EAAK,IAAA,CAC3B,GAAA,CAAKC,EAAS,GAAA,CAAMD,CAAAA,CAAK,GAAA,CACzB,IAAA,CAAMC,CAAAA,CAAS,IAAA,CAAOD,EAAK,IAAA,CAC3B,MAAA,CAAQA,EAAK,MAAA,CACb,IAAA,CAAM,IAAI,IAAA,CAAKE,CAAI,CACrB,CAAA,CAAE,CAAA,CAEJ,iBAAkB,CAChBJ,EAAAA,CAAgB,IAAI,IAAA,CAAQ,IAAA,CAAK,IAAI,GAAA,CAAMj1B,CAAAA,CAAe,KAAM,CAAC,CAAA,CACjE,IAAI,IACN,CAAA,CACA,gBAAA,CAAkB,CAACs1B,CAAAA,CAAGd,CAAAA,CAAI,CAACe,CAAa,CAAA,GAAM,CAC5CN,EAAAA,CAAgBM,CAAAA,CAAe,IAAA,CAAK,IAAI,GAAA,CAAMv1B,CAAAA,CAAe,KAAM,CAAC,CAAA,CACpEi1B,GAAgBM,CAAAA,CAAev1B,CAAa,CAC9C,CACF,CAAC,CACH,CClCO,SAASw1B,GACd3oC,CAAAA,CACA,CACA,OAAO0O,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,OAAQ,mBAAA,CAAqB1O,CAAQ,EAC1D,OAAA,CAAS,IACP/D,CAAAA,CAAQ,mCAAA,CAAqC,CAC3C+D,CAAAA,CACA,UACF,CAAC,CAAA,CACH,QAAS,CAAC,CAACA,CACb,CAAC,CACH,CCZO,SAAS4oC,EAAAA,CACd5oC,EACA7S,CAAAA,CAAQ,EAAA,CACR,CACA,OAAOuhB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAc,WAAA,CAAa1O,CAAQ,EACxD,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,IACP/D,CAAAA,CAAQ,uCAAA,CAAyC,CAC/C+D,CAAAA,CACA,EAAA,CACA7S,CACF,CAAC,CACL,CAAC,CACH,CCbO,SAAS07C,EAAAA,CAAoC7oC,CAAAA,CAAkB,CACpE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,YAAA,CAAc,aAAA,CAAe1O,CAAQ,EAC1D,OAAA,CAAS,SAAA,CASC,MARS,MAAM,KAAA,CACrBwK,EAAO,cAAA,CAAiB,CAAA,8BAAA,EAAiCxK,CAAQ,CAAA,CAAA,CACjE,CACE,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EACuB,MAAK,EAAG,IAAA,CAEjC,OAAS5Q,CAAAA,EACPA,CAAAA,CAAK,KACH,CAACuB,CAAAA,CAAGvF,IACFyiB,CAAAA,CAAWziB,CAAAA,CAAE,cAAc,CAAA,CAAE,MAAA,CAC7ByiB,CAAAA,CAAWld,CAAAA,CAAE,cAAc,CAAA,CAAE,MACjC,CACJ,CAAC,CACH,CCjBO,SAASm4C,EAAAA,CAAyB37C,CAAAA,CAAQ,GAAA,CAAK,CACpD,OAAOuhB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,YAAA,CAAcvhB,CAAK,CAAA,CACxC,OAAA,CAAS,IACP8O,CAAAA,CAAQ,+BAAgC,CACtC9O,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAAS47C,EAAAA,EAAkC,CAChD,OAAOr6B,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,YAAY,CAAA,CACjC,OAAA,CAAS,IACPzS,EAAQ,0BAAA,CAA4B,EAAE,CAC1C,CAAC,CACH,CCFO,SAAS+sC,GACd51B,CAAAA,CACAC,CAAAA,CACAC,EACA,CACA,IAAM40B,EAAc1e,CAAAA,EACXA,CAAAA,CAAK,WAAA,EAAY,CAAE,OAAA,CAAQ,WAAA,CAAa,EAAE,CAAA,CAGnD,OAAO9a,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,SAAA,CAAW0E,EAASC,CAAAA,CAAU,OAAA,GAAWC,CAAAA,CAAQ,OAAA,EAAS,CAAA,CAC/E,OAAA,CAAS,IACPrX,CAAAA,CAAQ,kCAAA,CAAoC,CAC1CmX,CAAAA,CACA80B,CAAAA,CAAW70B,CAAS,EACpB60B,CAAAA,CAAW50B,CAAO,CACpB,CAAC,CACL,CAAC,CACH,CCtBO,SAAS21B,EAAAA,EAA8B,CAC5C,OAAOv6B,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,gBAAgB,CAAA,CACrC,OAAA,CAAS,SAAY,CAEnB,IAAMuG,CAAAA,CAAS,MAAMhZ,CAAAA,CAAQ,0BAAA,CAA4B,EAAE,CAAA,CAGrDjF,EAAM,IAAI,IAAA,CACVkyC,EAAY,IAAI,IAAA,CAAKlyC,EAAI,OAAA,EAAQ,CAAI,KAAQ,CAAA,CAE7CkxC,CAAAA,CAAc1e,CAAAA,EACXA,CAAAA,CAAK,WAAA,EAAY,CAAE,QAAQ,WAAA,CAAa,EAAE,EAG7C2f,CAAAA,CAAa,MAAMltC,EAAQ,kCAAA,CAAoC,CAAC,KAAA,CAAOisC,CAAAA,CAAWgB,CAAS,CAAA,CAAGhB,EAAWlxC,CAAG,CAAC,CACnH,CAAA,CAeA,OAZ6B,CAC3B,KAAA,CAAO,CAACie,CAAAA,CAAM,MAAA,CACd,KAAA,CAAOk0B,CAAAA,CAAU,CAAC,CAAA,CAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,QAAA,CAAS,KAAOA,CAAAA,CAAU,CAAC,EAAE,IAAA,CAAK,IAAA,CAAO,EAC5E,IAAA,CAAMA,CAAAA,CAAU,CAAC,CAAA,CAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAOA,CAAAA,CAAU,CAAC,CAAA,CAAE,KAAK,IAAA,CAAO,CAAA,CAC3E,IAAKA,CAAAA,CAAU,CAAC,EAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,QAAA,CAAS,GAAA,CAAMA,CAAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,IAAM,CAAA,CACxE,OAAA,CAASA,EAAU,CAAC,CAAA,CAChB,GAAA,CAAQA,CAAAA,CAAU,CAAC,CAAA,CAAE,SAAS,IAAA,CAAOA,CAAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,KAAQ,GAAA,CAAO,CAACl0B,EAAM,MAAA,CAC7E,CAAA,CACJ,eAAgBA,CAAAA,CAAM,WAAA,CAAY,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAC9C,YAAA,CAAcA,CAAAA,CAAM,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAC7C,CAGF,CACF,CAAC,CACH,CC7BO,SAASm0B,GACd71B,CAAAA,CACAC,CAAAA,CACAC,EACAC,CAAAA,CACA,CACA,OAAOhF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQ6E,EAAMC,CAAAA,CAAYC,CAAAA,CAAQC,CAAI,CAAA,CAC3D,OAAA,CAAS,MAAO,CAAE,MAAA,CAAArZ,CAAO,CAAA,GAAM,CAC7B,IAAM88B,CAAAA,CAAWlpB,CAAAA,GACXpU,CAAAA,CAAM,CAAA,uCAAA,EAA0C0Z,CAAI,CAAA,gCAAA,EAAmCC,CAAU,CAAA,MAAA,EAASC,CAAM,CAAA,IAAA,EAAOC,CAAI,GAE3HlW,CAAAA,CAAW,MAAM25B,EAASt9B,CAAAA,CAAK,CAAE,OAAAQ,CAAO,CAAC,CAAA,CAE/C,GAAI,CAACmD,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,6BAAA,EAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CACF,CAAC,CACH,CC7BA,SAAS0qC,GAAW1e,CAAAA,CAAY,CAC9B,OAAOA,CAAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,WAAA,CAAa,EAAE,CACnD,CAEO,SAAS6f,EAAAA,CACdl8C,CAAAA,CAAQ,GAAA,CACRkmB,EACAC,CAAAA,CACA,CACA,IAAM7mB,CAAAA,CAAM6mB,CAAAA,EAAW,IAAI,IAAA,CACrB7lB,CAAAA,CACJ4lB,CAAAA,EAAa,IAAI,IAAA,CAAK5mB,CAAAA,CAAI,SAAQ,CAAI,GAAA,CAAU,GAAK,GAAI,CAAA,CAE3D,OAAOiiB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,eAAA,CAAiBvhB,EAAOM,CAAAA,CAAM,OAAA,GAAWhB,CAAAA,CAAI,OAAA,EAAS,CAAA,CAC3E,OAAA,CAAS,IACPwP,CAAAA,CAAQ,iCAAA,CAAmC,CACzCisC,EAAAA,CAAWz6C,CAAK,EAChBy6C,EAAAA,CAAWz7C,CAAG,EACdU,CACF,CAAC,CACL,CAAC,CACH,CCKO,SAASm8C,EAAAA,EAA6B,CAC3C,OAAO56B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,cAAc,CAAA,CACnC,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,OADoB,MAAMzS,CAAAA,CAAQ,gCAAA,CAAkC,EAAE,CAExE,CAAA,MAAShJ,CAAAA,CAAO,CACd,MAAMA,CACR,CACF,CACF,CAAC,CACH,CC/BO,SAASs2C,EAAAA,EAA2C,CACzD,OAAO76B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,8BAA8B,EACnD,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,OADc,MAAMzS,CAAAA,CAAQ,gDAAA,CAAkD,EAAE,CAElF,OAAShJ,CAAAA,CAAO,CACd,MAAMA,CACR,CACF,CACF,CAAC,CACH,CCXO,SAASu2C,EAAAA,CACdxpC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,oBAAoB,CAAA,CAC/B/I,EACCmJ,CAAAA,EAAY,CACXmiB,GACEtrB,CAAAA,CACAmJ,CAAAA,CAAQ,aACRA,CAAAA,CAAQ,YAAA,CACRA,EAAQ,UAAA,CACRA,CAAAA,CAAQ,UAAA,CACRA,CAAAA,CAAQ,OACV,CACF,EACA,SAAY,CACN1B,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,EAAU,MAAA,CAAO,UAAA,CAAW3O,CAAS,CAAA,CACrC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EAEL,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCpCO,SAAS4hC,GACdzpC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,oBAAoB,EAC/B/I,CAAAA,CACA,CAAC,CAAE,OAAA,CAAA0rB,CAAQ,CAAA,GAAM,CACfS,EAAAA,CAAwBnsB,CAAAA,CAAW0rB,CAAO,CAC5C,CAAA,CACA,SAAY,CACNjkB,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,OAAO,UAAA,CAAW3O,CAAS,EACrC,CAAC,gBAAA,CAAkB,aAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EAEL,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC5BA,eAAekuB,EAAAA,CAAqBv4B,CAAAA,CAAgC,CAClE,IAAMpO,CAAAA,CAAQ,MAAMoO,CAAAA,CAAS,IAAA,GAC7B,GAAI,CAACA,EAAS,EAAA,CAAI,CAChB,IAAMvK,CAAAA,CAAQ,IAAI,KAAA,CAAM,8BAA8BuK,CAAAA,CAAS,MAAM,EAAE,CAAA,CACvE,MAAAvK,EAAM,MAAA,CAASuK,CAAAA,CAAS,OACxBvK,CAAAA,CAAM,IAAA,CAAO7D,EACP6D,CACR,CAEA,OAAO7D,CACT,CAEA,eAAsBs6C,EAAAA,CACpBn2B,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACqB,CACrB,IAAMyjB,CAAAA,CAAWlpB,CAAAA,GACXpU,CAAAA,CAAM,CAAA,uCAAA,EAA0C0Z,CAAI,CAAA,gCAAA,EAAmCC,CAAU,CAAA,MAAA,EAASC,CAAM,CAAA,IAAA,EAAOC,CAAI,GAC3HlW,CAAAA,CAAW,MAAM25B,EAASt9B,CAAG,CAAA,CACnC,OAAOk8B,EAAAA,CAA8Bv4B,CAAQ,CAC/C,CAEA,eAAsBmsC,EAAAA,CAAgBC,EAA8B,CAClE,GAAIA,IAAQ,KAAA,CACV,SAGF,IAAMzS,CAAAA,CAAWlpB,GAAc,CACzBpU,CAAAA,CAAM,+EAA+E+vC,CAAG,CAAA,CAAA,CACxFpsC,EAAW,MAAM25B,CAAAA,CAASt9B,CAAG,CAAA,CAEnC,OAAA,CADa,MAAMk8B,EAAAA,CAA2Dv4B,CAAQ,CAAA,EAC1E,YAAYosC,CAAG,CAC7B,CAEA,eAAsBC,EAAAA,CAAqB52B,EAAkBlL,CAAAA,CAAgC,CAE3F,IAAMvK,CAAAA,CAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CACL,4BAA4ByI,CAAAA,GAAa,KAAA,CAAQ,MAAQA,CAAQ,CAAA,CAAA,EAAIlL,CAAK,CAAA,CAC9E,CAAA,CAEA,OAAOguB,GAA0Bv4B,CAAQ,CAC3C,CAEA,eAAsBssC,EAAAA,EAA2C,CAE/D,IAAMtsC,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,iCAAiC,EACzF,OAAOurB,EAAAA,CAAiCv4B,CAAQ,CAClD,CAEA,eAAsBusC,EAAAA,EAAmD,CAEvE,IAAMvsC,EAAW,MADAyQ,CAAAA,GAEf,0EACF,CAAA,CACA,OAAO8nB,EAAAA,CAA6Cv4B,CAAQ,CAC9D,CCnDA,IAAMwsC,GAAqB,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAEhE,eAAeC,EAAAA,CAAa9gC,CAAAA,CAA8C,CACxE,IAAMguB,EAAWlpB,CAAAA,EAAc,CACzBhR,EAAUyN,CAAAA,CAAc,mBAAA,GACxBlN,CAAAA,CAAW,MAAM25B,EAAS,CAAA,EAAGl6B,CAAO,0BAA2B,CACnE,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,UAAUkM,CAAO,CAAA,CAC5B,OAAA,CAAS6gC,EACX,CAAC,CAAA,CAED,GAAI,CAACxsC,CAAAA,CAAS,GACZ,MAAM,IAAI,MACR,CAAA,6CAAA,EAA2CA,CAAAA,CAAS,MAAM,CAAA,CAC5D,CAAA,CAIF,OAAA,CADc,MAAMA,CAAAA,CAAS,IAAA,IACjB,MACd,CAEA,eAAe0sC,EAAAA,CACb/gC,CAAAA,CACA+M,CAAAA,CACY,CACZ,GAAI,CACF,OAAO,MAAM+zB,EAAAA,CAAa9gC,CAAO,CACnC,CAAA,KAAY,CACV,OAAO+M,CACT,CACF,CAEA,eAAsBi0B,GACpBp5C,CAAAA,CACA5D,CAAAA,CAAgB,GACkB,CAClC,IAAMi9C,EAAa,CACjB,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,CACN,QAAA,CAAU,QAAA,CACV,MAAO,CAAE,MAAA,CAAAr5C,CAAO,CAAA,CAChB,KAAA,CAAA5D,CAAAA,CACA,MAAA,CAAQ,CACV,CAAA,CACA,GAAI,CACN,CAAA,CAEM,CAACk9C,CAAAA,CAAKC,CAAI,EAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CACpCJ,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,OACd,KAAA,CAAO,SAAA,CACP,QAAS,CAAC,CAAE,MAAO,OAAA,CAAS,UAAA,CAAY,IAAK,CAAC,CAChD,CACF,CAAA,CACA,EACF,CAAA,CACAF,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,OACd,KAAA,CAAO,UAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,QAAS,UAAA,CAAY,KAAM,CAAC,CACjD,CACF,EACA,EACF,CACF,CAAC,CAAA,CAEKG,CAAAA,CAAmB/nB,GACvBA,CAAAA,CAAM,IAAA,CAAK,CAAC7xB,CAAAA,CAAGvF,CAAAA,GAAM,CACnB,IAAMo/C,CAAAA,CAAO,OAAQ75C,CAAAA,CAA2B,KAAA,EAAS,CAAC,CAAA,CAE1D,OADc,OAAQvF,CAAAA,CAA2B,KAAA,EAAS,CAAC,CAAA,CAC5Co/C,CACjB,CAAC,CAAA,CACGC,CAAAA,CAAkBjoB,CAAAA,EACtBA,EAAM,IAAA,CAAK,CAAC7xB,EAAGvF,CAAAA,GAAM,CACnB,IAAMo/C,CAAAA,CAAO,MAAA,CAAQ75C,CAAAA,CAA2B,KAAA,EAAS,CAAC,CAAA,CACpD+5C,EAAQ,MAAA,CAAQt/C,CAAAA,CAA2B,OAAS,CAAC,CAAA,CAC3D,OAAOo/C,CAAAA,CAAOE,CAChB,CAAC,CAAA,CAEH,OAAO,CACL,IAAKH,CAAAA,CAAgBF,CAAG,EACxB,IAAA,CAAMI,CAAAA,CAAeH,CAAI,CAC3B,CACF,CAEA,eAAsBK,EAAAA,CACpB55C,EACA5D,CAAAA,CAAgB,EAAA,CACF,CACd,OAAO+8C,EAAAA,CACL,CACE,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,CACN,SAAU,QAAA,CACV,KAAA,CAAO,gBACP,KAAA,CAAO,CAAE,OAAAn5C,CAAO,CAAA,CAChB,KAAA,CAAA5D,CAAAA,CACA,MAAA,CAAQ,CAAA,CACR,QAAS,CAAC,CAAE,MAAO,WAAA,CAAa,UAAA,CAAY,IAAK,CAAC,CACpD,CAAA,CACA,EAAA,CAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBy9C,EAAAA,CACpB5kC,EACAjV,CAAAA,CACA5D,CAAAA,CAAgB,IACF,CACd,IAAMi9C,EAAa,CACjB,OAAA,CAAS,MACT,MAAA,CAAQ,MAAA,CACR,OAAQ,CACN,QAAA,CAAU,QAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAAr5C,EAAQ,OAAA,CAAAiV,CAAQ,EACzB,KAAA,CAAA7Y,CAAAA,CACA,OAAQ,CACV,CAAA,CACA,EAAA,CAAI,CACN,CAAA,CAEM,CAAC09C,EAAQC,CAAO,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAC1CZ,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,MAAO,SAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,YAAa,UAAA,CAAY,IAAK,CAAC,CACpD,CACF,EACA,EACF,EACAF,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,MAAO,UAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,WAAA,CAAa,UAAA,CAAY,IAAK,CAAC,CACpD,CACF,CAAA,CACA,EACF,CACF,CAAC,CAAA,CAEKW,CAAAA,CAAc,CAACC,CAAAA,CAAkBnF,CAAAA,GAAAA,CACpC,MAAA,CAAOmF,GAAY,CAAC,CAAA,CAAI,OAAOnF,CAAAA,EAAS,CAAC,GAAG,OAAA,CAAQ,CAAC,EAElDwE,CAAAA,CAA6BQ,CAAAA,CAAO,IAAK/5B,CAAAA,GAAW,CACxD,GAAIA,CAAAA,CAAM,IAAA,CACV,KAAM,KAAA,CACN,OAAA,CAASA,CAAAA,CAAM,OAAA,CACf,MAAA,CAAQA,CAAAA,CAAM,OACd,QAAA,CAAUA,CAAAA,CAAM,SAChB,KAAA,CAAOA,CAAAA,CAAM,MACb,KAAA,CAAOA,CAAAA,CAAM,YAAA,EAAgBi6B,CAAAA,CAAYj6B,CAAAA,CAAM,QAAA,CAAUA,EAAM,KAAK,CAAA,CACpE,UAAW,MAAA,CAAOA,CAAAA,CAAM,WAAa,CAAC,CACxC,CAAA,CAAE,CAAA,CAEIw5B,CAAAA,CAA8BQ,CAAAA,CAAQ,IAAKh6B,CAAAA,GAAW,CAC1D,GAAIA,CAAAA,CAAM,IAAA,CACV,KAAM,MAAA,CACN,OAAA,CAASA,EAAM,OAAA,CACf,MAAA,CAAQA,EAAM,MAAA,CACd,QAAA,CAAUA,EAAM,QAAA,CAChB,KAAA,CAAOA,EAAM,KAAA,CACb,KAAA,CAAOi6B,CAAAA,CAAYj6B,CAAAA,CAAM,QAAA,CAAUA,CAAAA,CAAM,KAAK,CAAA,CAC9C,SAAA,CAAW,OAAOA,CAAAA,CAAM,SAAA,EAAa,CAAC,CACxC,CAAA,CAAE,CAAA,CAEF,OAAO,CAAC,GAAGu5B,EAAK,GAAGC,CAAI,EAAE,IAAA,CAAK,CAAC35C,EAAGvF,CAAAA,GAAMA,CAAAA,CAAE,SAAA,CAAYuF,CAAAA,CAAE,SAAS,CACnE,CAUA,eAAsBs6C,EAAAA,CACpBl6C,EACAiV,CAAAA,CACc,CACd,GAAI,KAAA,CAAM,OAAA,CAAQjV,CAAM,CAAA,EAAKA,CAAAA,CAAO,SAAW,CAAA,CAC7C,OAAO,EAAC,CAGV,IAAMm6C,EAAc,KAAA,CAAM,OAAA,CAAQn6C,CAAM,CAAA,CACpC,CAAE,MAAA,CAAQ,CAAE,GAAA,CAAKA,CAAO,CAAE,CAAA,CAC1BA,CAAAA,CACE,CAAE,MAAA,CAAAA,CAAO,CAAA,CACT,EAAC,CAEP,OAAOm5C,GACL,CACE,OAAA,CAAS,MACT,MAAA,CAAQ,MAAA,CACR,OAAQ,CACN,QAAA,CAAU,QAAA,CACV,KAAA,CAAO,SAAA,CACP,KAAA,CAAO,CACL,GAAGgB,CAAAA,CACH,GAAIllC,CAAAA,CAAU,CAAE,QAAAA,CAAQ,CAAA,CAAI,EAC9B,CACF,EACA,EAAA,CAAI,CACN,EACA,EACF,CACF,CAEA,eAAsBmlC,EAAAA,CACpBnlC,CAAAA,CACAjV,CAAAA,CACc,CACd,OAAOk6C,EAAAA,CAAwBl6C,CAAAA,CAAQiV,CAAO,CAChD,CAEA,eAAsBolC,EAAAA,CACpBprC,CAAAA,CACc,CACd,OAAOkqC,EAAAA,CACL,CACE,QAAS,KAAA,CACT,MAAA,CAAQ,OACR,MAAA,CAAQ,CACN,SAAU,QAAA,CACV,KAAA,CAAO,UAAA,CACP,KAAA,CAAO,CACL,OAAA,CAASlqC,CACX,CACF,CAAA,CACA,GAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBqrC,EAAAA,CACpB/yC,EACc,CACd,OAAO4xC,GACL,CACE,OAAA,CAAS,MACT,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,CACN,QAAA,CAAU,QAAA,CACV,MAAO,QAAA,CACP,KAAA,CAAO,CACL,MAAA,CAAQ,CAAE,IAAK5xC,CAAO,CACxB,CACF,CAAA,CACA,EAAA,CAAI,CACN,EACA,EACF,CACF,CAEA,eAAsBgzC,GACpBtrC,CAAAA,CACAjP,CAAAA,CACA5D,CAAAA,CACAlB,CAAAA,CACc,CACd,IAAMkrC,EAAWlpB,CAAAA,EAAc,CACzBhR,EAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,qCAAA,CAAuCoD,CAAO,EAClEpD,CAAAA,CAAI,YAAA,CAAa,IAAI,SAAA,CAAWmG,CAAQ,EACxCnG,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,CAAU9I,CAAM,CAAA,CACrC8I,EAAI,YAAA,CAAa,GAAA,CAAI,QAAS1M,CAAAA,CAAM,QAAA,EAAU,CAAA,CAC9C0M,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,CAAU5N,CAAAA,CAAO,UAAU,CAAA,CAEhD,IAAMuR,CAAAA,CAAW,MAAM25B,EAASt9B,CAAAA,CAAI,QAAA,EAAS,CAAG,CAC9C,MAAA,CAAQ,KAAA,CACR,QAAS,CAAE,cAAA,CAAgB,kBAAmB,CAChD,CAAC,EAED,GAAI,CAAC2D,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,qDAAA,EAAmDA,EAAS,MAAM,CAAA,CACpE,EAGF,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAEA,eAAsB+tC,EAAAA,CACpBx6C,CAAAA,CACAy6C,EAAW,OAAA,CACG,CACd,IAAMrU,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBhR,CAAAA,CAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,+BAAA,CAAiCoD,CAAO,EAC5DpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,CAAU9I,CAAM,CAAA,CACrC8I,EAAI,YAAA,CAAa,GAAA,CAAI,WAAY2xC,CAAQ,CAAA,CAEzC,IAAMhuC,CAAAA,CAAW,MAAM25B,EAASt9B,CAAAA,CAAI,QAAA,GAAY,CAC9C,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAChD,CAAC,CAAA,CAED,GAAI,CAAC2D,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,8CAAyCA,CAAAA,CAAS,MAAM,EAC1D,CAAA,CAGF,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAEA,eAAsBiuC,EAAAA,CACpBzrC,EAC4B,CAC5B,IAAMm3B,EAAWlpB,CAAAA,EAAc,CACzBhR,CAAAA,CAAUyN,CAAAA,CAAc,mBAAA,EAAoB,CAC5ClN,EAAW,MAAM25B,CAAAA,CACrB,GAAGl6B,CAAO,CAAA,+BAAA,EAAkC+C,CAAQ,CAAA,OAAA,CACtD,CAAA,CAEA,GAAI,CAACxC,CAAAA,CAAS,GACZ,MAAM,IAAI,MACR,CAAA,6CAAA,EAA2CA,CAAAA,CAAS,MAAM,CAAA,CAC5D,CAAA,CAGF,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CC3VO,SAASkuC,EAAAA,CAAwC1rC,CAAAA,CAAkB,CACxE,OAAO0O,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,cAAe,UAAA,CAAY1O,CAAQ,EACxD,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,OAAA,CAAS,SACAorC,GAAoDprC,CAAQ,CAEvE,CAAC,CACH,CCTO,SAAS2rC,EAAAA,EAAwC,CACtD,OAAOj9B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,aAAA,CAAe,SAAS,CAAA,CAC7C,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SACAy8B,IAEX,CAAC,CACH,CCTO,SAASS,GAAwCtzC,CAAAA,CAAkB,CACxE,OAAOoW,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,aAAA,CAAe,eAAA,CAAiBpW,CAAM,CAAA,CAC3D,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SACA+yC,GAA6D/yC,CAAM,CAE9E,CAAC,CACH,CCTO,SAASuzC,EAAAA,CACd7rC,EACAjP,CAAAA,CACA5D,CAAAA,CAAQ,EAAA,CACR,CACA,OAAO0rB,oBAAAA,CAA8C,CACnD,QAAA,CAAU,CAAC,SAAU,aAAA,CAAe9nB,CAAAA,CAAQ,eAAgBiP,CAAQ,CAAA,CACpE,OAAA,CAAS,CAAC,CAACjP,CAAAA,EAAU,CAAC,CAACiP,CAAAA,CACvB,iBAAkB,CAAA,CAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA8Y,CAAU,CAAA,GAAM,CAChC,GAAI,CAAC/nB,CAAAA,EAAU,CAACiP,EACd,MAAM,IAAI,MACR,mDACF,CAAA,CAEF,OAAOsrC,EAAAA,CACLtrC,CAAAA,CACAjP,EACA5D,CAAAA,CACA2rB,CACF,CACF,CAAA,CACA,gBAAA,CAAkB,CAACE,CAAAA,CAAU8yB,CAAAA,CAAWC,CAAAA,GAAAA,CACrC/yB,CAAAA,EAAU,MAAA,EAAU,CAAA,IAAO7rB,EAAS4+C,CAAAA,CAA2B5+C,CAAAA,CAAQ,OAC1E,oBAAA,CAAsB,CAAC6+C,EAAYF,CAAAA,CAAWG,CAAAA,GAC3CA,CAAAA,CAA4B,CAAA,CAAKA,CAAAA,CAA4B9+C,CAAAA,CAAQ,MAC1E,CAAC,CACH,CC3BO,SAAS++C,EAAAA,CACdn7C,CAAAA,CACAy6C,CAAAA,CAAW,OAAA,CACX,CACA,OAAO98B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,aAAA,CAAe3d,CAAM,EAC1C,SAAA,CAAW,GAAA,CACX,gBAAiB,GAAA,CACjB,OAAA,CAAS,SACAw6C,EAAAA,CAA4Cx6C,CAAAA,CAAQy6C,CAAQ,CAEvE,CAAC,CACH,CCZO,SAASW,GACdnsC,CAAAA,CACA,CACA,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,YAAa1O,CAAQ,CAAA,CACzD,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,SAAY,CACnB,GAAI,CACF,IAAM5Q,CAAAA,CAAO,MAAMq8C,GACjBzrC,CACF,CAAA,CACA,OAAO,MAAA,CAAO,MAAA,CAAO5Q,CAAI,CAAA,CAAE,MAAA,CACzB,CAAC,CAAE,aAAA,CAAAg9C,CAAc,CAAA,GAAMA,CAAAA,CAAgB,CACzC,CACF,CAAA,KAAY,CACV,OAAO,EACT,CACF,CACF,CAAC,CACH,CCrBO,SAASC,GACdrmC,CAAAA,CACAjV,CAAAA,CACA,CACA,OAAO2d,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,YAAA,CAAc1I,CAAAA,CAASjV,CAAM,CAAA,CACjE,OAAA,CAAS,SACAo6C,EAAAA,CAA+CnlC,CAAAA,CAASjV,CAAM,CAEzE,CAAC,CACH,CCRO,SAASu7C,EAAAA,CACdlgD,CAAAA,CACAwS,EAA+B,MAAA,CAC/B,CACA,IAAI/P,CAAAA,CAAgB,CAClB,cAAA,CAAgB,EAChB,MAAA,CAAQ,EAAA,CACR,OAAQ,EACV,CAAA,CAEI+P,IACF/P,CAAAA,CAAO,CAAE,GAAGA,CAAAA,CAAM,GAAG+P,CAAQ,GAG/B,GAAM,CAAE,eAAA2tC,CAAAA,CAAgB,MAAA,CAAAt8C,EAAQ,MAAA,CAAAsU,CAAO,CAAA,CAAI1V,CAAAA,CAEvC29C,CAAAA,CAAM,EAAA,CAENv8C,IAAQu8C,CAAAA,EAAOv8C,CAAAA,CAAS,KAE5B,IAAMw8C,CAAAA,CAAK,KAAK,GAAA,CAAI,UAAA,CAAWrgD,EAAM,QAAA,EAAU,CAAC,CAAA,CAAI,IAAA,CAAS,EAAIA,CAAAA,CAC3D6vB,CAAAA,CAAM,OAAOwwB,CAAAA,EAAO,QAAA,CAAW,UAAA,CAAWA,CAAE,CAAA,CAAIA,CAAAA,CACtD,OAAAD,CAAAA,EAAOvwB,CAAAA,CAAI,eAAe,OAAA,CAAS,CACjC,sBAAuBswB,CAAAA,CACvB,qBAAA,CAAuBA,CAAAA,CACvB,WAAA,CAAa,IACf,CAAC,EACGhoC,CAAAA,GAAQioC,CAAAA,EAAO,IAAMjoC,CAAAA,CAAAA,CAElBioC,CACT,CCpBO,IAAME,EAAAA,CAAN,KAAsB,CAe3B,WAAA,CAAY5tC,CAAAA,CAA6B,CAdzClT,CAAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CACAA,EAAA,IAAA,CAAA,MAAA,CAAA,CACAA,CAAAA,CAAA,aAEAA,CAAAA,CAAA,IAAA,CAAA,WAAA,CAAA,CACAA,EAAA,IAAA,CAAA,gBAAA,CAAA,CACAA,CAAAA,CAAA,0BACAA,CAAAA,CAAA,IAAA,CAAA,SAAA,CAAA,CACAA,EAAA,IAAA,CAAA,OAAA,CAAA,CACAA,CAAAA,CAAA,sBACAA,CAAAA,CAAA,IAAA,CAAA,eAAA,CAAA,CACAA,CAAAA,CAAA,IAAA,CAAA,gBAAA,CAAA,CACAA,CAAAA,CAAA,IAAA,CAAA,UAAA,CAAA,CAmBAA,EAAA,IAAA,CAAA,gBAAA,CAAiB,IACV,KAAK,iBAAA,CAIH,IAAA,CAAK,cAAgB,CAAA,EAAK,IAAA,CAAK,cAAA,CAAiB,CAAA,CAH9C,KAAA,CAAA,CAMXA,CAAAA,CAAA,mBAAc,IACP,IAAA,CAAK,gBAAe,CAIlB,CAAA,CAAA,EAAI0gD,GAAgB,IAAA,CAAK,KAAA,CAAO,CACrC,cAAA,CAAgB,IAAA,CAAK,SACvB,CAAC,CAAC,CAAA,GAAA,EAAMA,GAAgB,IAAA,CAAK,aAAA,CAAe,CAC1C,cAAA,CAAgB,IAAA,CAAK,SACvB,CAAC,CAAC,MAAMA,EAAAA,CAAgB,IAAA,CAAK,eAAgB,CAC3C,cAAA,CAAgB,KAAK,SACvB,CAAC,CAAC,CAAA,CAAA,CAAA,CATO,EAAA,CAAA,CAYX1gD,CAAAA,CAAA,cAAS,IACF,IAAA,CAAK,eAIN,IAAA,CAAK,aAAA,CAAgB,KAChB,IAAA,CAAK,aAAA,CAAc,QAAA,EAAS,CAG9B0gD,EAAAA,CAAgB,IAAA,CAAK,cAAe,CACzC,cAAA,CAAgB,KAAK,SACvB,CAAC,EATQ,GAAA,CAAA,CAYX1gD,CAAAA,CAAA,IAAA,CAAA,UAAA,CAAW,IACL,IAAA,CAAK,OAAA,CAAU,KACV,IAAA,CAAK,OAAA,CAAQ,UAAS,CAGxB0gD,EAAAA,CAAgB,KAAK,OAAA,CAAS,CAAE,eAAgB,IAAA,CAAK,SAAU,CAAC,CAAA,CAAA,CAzDvE,IAAA,CAAK,OAASxtC,CAAAA,CAAM,MAAA,CACpB,KAAK,IAAA,CAAOA,CAAAA,CAAM,IAAA,EAAQ,EAAA,CAC1B,IAAA,CAAK,IAAA,CAAOA,EAAM,IAAA,EAAQ,EAAA,CAE1B,KAAK,SAAA,CAAYA,CAAAA,CAAM,WAAa,CAAA,CACpC,IAAA,CAAK,cAAA,CAAiBA,CAAAA,CAAM,cAAA,EAAkB,KAAA,CAC9C,KAAK,iBAAA,CAAoBA,CAAAA,CAAM,mBAAqB,KAAA,CACpD,IAAA,CAAK,QAAU,UAAA,CAAWA,CAAAA,CAAM,OAAO,CAAA,EAAK,CAAA,CAC5C,IAAA,CAAK,MAAQ,UAAA,CAAWA,CAAAA,CAAM,KAAK,CAAA,EAAK,CAAA,CACxC,KAAK,aAAA,CAAgB,UAAA,CAAWA,EAAM,aAAa,CAAA,EAAK,EACxD,IAAA,CAAK,cAAA,CAAiB,WAAWA,CAAAA,CAAM,cAAc,GAAK,CAAA,CAC1D,IAAA,CAAK,aAAA,CACH,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,cAAgB,IAAA,CAAK,cAAA,CACzC,KAAK,QAAA,CAAWA,CAAAA,CAAM,SACxB,CA6CF,ECxEO,SAAS6tC,EAAAA,CACd3mC,CAAAA,CACA+sB,CAAAA,CACA6Z,EACA,CACA,OAAOl+B,aAAa,CAClB,QAAA,CAAU,CACR,QAAA,CACA,aAAA,CACA,mBAAA,CACA1I,CAAAA,CACA+sB,CAAAA,CACA6Z,CACF,EACA,OAAA,CAAS,SAAY,CACnB,GAAI,CAAC5mC,EACH,MAAM,IAAI,MAAM,6CAA6C,CAAA,CAG/D,IAAM6mC,CAAAA,CAAW,MAAMzB,GAAoDplC,CAAO,CAAA,CAE5E1N,EAAS,MAAM+yC,EAAAA,CACnBwB,CAAAA,CAAS,GAAA,CAAKC,CAAAA,EAAMA,CAAAA,CAAE,MAAM,CAC9B,CAAA,CAEMC,EAAeha,CAAAA,CACjBA,CAAAA,CAAa,KAAOA,CAAAA,CAAa,KAAA,CACjC,CAAA,CACEia,CAAAA,CAAsD,KAAA,CAAM,OAAA,CAChEJ,CACF,CAAA,CACIA,CAAAA,CACA,EAAC,CAKCK,CAAAA,CAAkBJ,EACrB,GAAA,CAAKK,CAAAA,EAAYA,CAAAA,CAAQ,MAAM,CAAA,CAC/B,MAAA,CACEn8C,GACCA,CAAAA,GAAW,WAAA,EACX,CAACi8C,CAAAA,CAAgB,IAAA,CAAMG,GAAWA,CAAAA,CAAO,MAAA,GAAWp8C,CAAM,CAC9D,CAAA,CAEI6iB,EAA8C,CAClD,GAAGo5B,EACH,GAAIC,CAAAA,CAAgB,OAChB,MAAM9B,EAAAA,CACJ,MAAA,CACA8B,CACF,CAAA,CACA,EACN,CAAA,CAEA,OAAOJ,EAAS,GAAA,CAAKK,CAAAA,EAAY,CAC/B,IAAMnlC,CAAAA,CAAQzP,CAAAA,CAAO,IAAA,CAAMw0C,CAAAA,EAAMA,CAAAA,CAAE,SAAWI,CAAAA,CAAQ,MAAM,EACxDE,CAAAA,CAEJ,GAAIrlC,GAAO,QAAA,CACT,GAAI,CACFqlC,CAAAA,CAAgB,IAAA,CAAK,KAAA,CAAMrlC,EAAM,QAAQ,EAC3C,MAAQ,CACNqlC,CAAAA,CAAgB,OAClB,CAGF,IAAMD,EAASv5B,CAAAA,CAAQ,IAAA,CAAM4R,GAAMA,CAAAA,CAAE,MAAA,GAAW0nB,EAAQ,MAAM,CAAA,CACxDG,EAAY,MAAA,CAAOF,CAAAA,EAAQ,SAAA,EAAa,GAAG,CAAA,CAC3CG,CAAAA,CAAgB,OAAOJ,CAAAA,CAAQ,OAAO,EAEtCK,CAAAA,CACJL,CAAAA,CAAQ,SAAW,WAAA,CACfH,CAAAA,CAAeO,CAAAA,CACfD,CAAAA,GAAc,CAAA,CACZ,CAAA,CACA,QACGA,CAAAA,CAAYN,CAAAA,CAAeO,GAAe,OAAA,CAAQ,EAAE,CACvD,CAAA,CAER,OAAO,IAAIZ,EAAAA,CAAgB,CACzB,MAAA,CAAQQ,EAAQ,MAAA,CAChB,IAAA,CAAMnlC,GAAO,IAAA,EAAQmlC,CAAAA,CAAQ,OAC7B,IAAA,CAAME,CAAAA,EAAe,MAAQ,EAAA,CAC7B,SAAA,CAAWrlC,GAAO,SAAA,EAAa,CAAA,CAC/B,eAAgBA,CAAAA,EAAO,cAAA,EAAkB,MACzC,iBAAA,CAAmBA,CAAAA,EAAO,iBAAA,EAAqB,KAAA,CAC/C,OAAA,CAASmlC,CAAAA,CAAQ,QACjB,KAAA,CAAOA,CAAAA,CAAQ,MACf,aAAA,CAAeA,CAAAA,CAAQ,cACvB,cAAA,CAAgBA,CAAAA,CAAQ,cAAA,CACxB,QAAA,CAAAK,CACF,CAAC,CACH,CAAC,CACH,EACA,OAAA,CAAS,CAAC,CAACvnC,CACb,CAAC,CACH,CC5GO,SAASwnC,GACdxtC,CAAAA,CACAjP,CAAAA,CACA,CACA,OAAO2d,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,aAAA,CAAe3d,CAAAA,CAAQ,eAAgBiP,CAAQ,CAAA,CACpE,QAAS,CAAC,CAACjP,CAAAA,EAAU,CAAC,CAACiP,CAAAA,CACvB,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SAAY,CACnB,GAAI,CAACjP,CAAAA,EAAU,CAACiP,CAAAA,CACd,MAAM,IAAI,KAAA,CACR,mDACF,EAEF,IAAM0lB,CAAAA,CAAc7Y,GAAe,CAC7B4gC,CAAAA,CAAYlI,EAAAA,CAAoCvlC,CAAQ,CAAA,CAC9D,MAAM0lB,EAAY,aAAA,CAAc+nB,CAAS,EACzC,IAAMC,CAAAA,CAAWhoB,EAAY,YAAA,CAC3B+nB,CAAAA,CAAU,QACZ,CAAA,CAEME,CAAAA,CAAe,MAAMjoB,CAAAA,CAAY,eAAA,CACrCkmB,GAAwC,CAAC76C,CAAM,CAAC,CAClD,CAAA,CAEM68C,CAAAA,CAAc,MAAMloB,CAAAA,CAAY,eAAA,CACpCgmB,GAAwC1rC,CAAQ,CAClD,EAIM6tC,CAAAA,CAAa,MAAMnoB,EAAY,eAAA,CACnC2mB,EAAAA,CAAmC,MAAA,CAAWt7C,CAAM,CACtD,CAAA,CAEM+lB,EAAW62B,CAAAA,EAAc,IAAA,CAAM3iD,GAAMA,CAAAA,CAAE,MAAA,GAAW+F,CAAM,CAAA,CACxDm8C,CAAAA,CAAUU,CAAAA,EAAa,IAAA,CAAM5iD,CAAAA,EAAMA,CAAAA,CAAE,SAAW+F,CAAM,CAAA,CAGtDs8C,EAAY,EAFHQ,CAAAA,EAAY,KAAM7iD,CAAAA,EAAMA,CAAAA,CAAE,SAAW+F,CAAM,CAAA,EAE9B,WAAa,GAAA,CAAA,CAEnC20C,CAAAA,CAAgB,WAAWwH,CAAAA,EAAS,OAAA,EAAW,GAAG,CAAA,CAClDY,CAAAA,CAAgB,UAAA,CAAWZ,CAAAA,EAAS,KAAA,EAAS,GAAG,EAChDa,CAAAA,CAAmB,UAAA,CAAWb,GAAS,cAAA,EAAkB,GAAG,EAE5D/3C,CAAAA,CAAmC,CACvC,CAAE,IAAA,CAAM,QAAA,CAAU,OAAA,CAASuwC,CAAc,CAAA,CACzC,CAAE,KAAM,QAAA,CAAU,OAAA,CAASoI,CAAc,CAC3C,CAAA,CAEA,OAAIC,CAAAA,CAAmB,CAAA,EACrB54C,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAM,YAAa,OAAA,CAAS44C,CAAiB,CAAC,CAAA,CAGtD,CACL,KAAMh9C,CAAAA,CACN,KAAA,CAAO+lB,GAAU,IAAA,EAAQ,EAAA,CACzB,MAAOu2B,CAAAA,GAAc,CAAA,CAAI,EAAI,MAAA,CAAOA,CAAAA,EAAaK,CAAAA,EAAU,KAAA,EAAS,CAAA,CAAE,CAAA,CACtE,eAAgBhI,CAAAA,CAAgBoI,CAAAA,CAChC,MAAO,QAAA,CACP,KAAA,CAAA34C,CACF,CACF,CACF,CAAC,CACH,CChEO,SAAS64C,EAAAA,CAAsBhuC,CAAAA,CAAmByQ,EAAS,CAAA,CAAG,CACnE,OAAO/B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU1O,CAAAA,CAAUyQ,CAAM,CAAA,CACrC,OAAA,CAAS,SAAY,CACnB,GAAI,CAACzQ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,kDAA6C,EAG/D,IAAM6R,CAAAA,CAAO7R,EAAS,OAAA,CAAQ,GAAA,CAAK,EAAE,CAAA,CAG/BiuC,CAAAA,CAAiB,MAAM,MAAMzjC,CAAAA,CAAO,cAAA,CAAiB,sBAAuB,CAChF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,SAAUqH,CAAK,CAAC,CACzC,CAAC,CAAA,CAED,GAAI,CAACo8B,CAAAA,CAAe,EAAA,CAClB,MAAM,IAAI,KAAA,CAAM,2BAA2BA,CAAAA,CAAe,MAAM,EAAE,CAAA,CAGpE,IAAMC,EAAU,MAAMD,CAAAA,CAAe,MAAK,CAGpCE,CAAAA,CAAuB,MAAM,KAAA,CACjC3jC,CAAAA,CAAO,eAAiB,yBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,QAAA,CAAUqH,CAAAA,CAAM,IAAA,CAAMpB,CAAO,CAAC,CACvD,CACF,CAAA,CAEA,GAAI,CAAC09B,CAAAA,CAAqB,EAAA,CACxB,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuCA,CAAAA,CAAqB,MAAM,CAAA,CAAE,EAGtF,IAAMC,CAAAA,CAAgB,MAAMD,CAAAA,CAAqB,IAAA,GAEjD,OAAO,CACL,OAAQD,CAAAA,CAAO,MAAA,CACf,QAASA,CAAAA,CAAO,gBAAA,CAChB,aAAAE,CACF,CACF,EACA,SAAA,CAAW,GAAA,CACX,cAAA,CAAgB,IAAA,CAChB,OAAA,CAAS,CAAC,CAACpuC,CACb,CAAC,CACH,CCzDO,SAASquC,EAAAA,CAAsCruC,CAAAA,CAAkB,CACtE,OAAO0O,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,SAAU,cAAA,CAAgB1O,CAAQ,CAAA,CACvD,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,UACP,MAAM6M,CAAAA,EAAe,CAAE,cAAcmhC,EAAAA,CAAsBhuC,CAAQ,CAAC,CAAA,CAI7D,CACL,KAAM,QAAA,CACN,KAAA,CAAO,gBACP,KAAA,CAAO,IAAA,CACP,eAAgB,EAPL6M,CAAAA,EAAe,CAAE,YAAA,CAC5BmhC,EAAAA,CAAsBhuC,CAAQ,EAAE,QAClC,CAAA,EAK0B,QAAU,CAAA,CACpC,CAAA,CAEJ,CAAC,CACH,CCjBO,SAASsuC,EAAAA,CACdtuC,CAAAA,CACAgF,EACA,CACA,OAAO0J,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,QAAA,CAAU,cAAA,CAAgB1O,EAAUgF,CAAI,CAAA,CAC7D,QAAS,SAAA,CAcO,KAAA,CAbG,MAAM,KAAA,CACrB,CAAA,EAAGwF,EAAO,cAAc,CAAA,uBAAA,CAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,QAAA,CAAAxK,EACA,IAAA,CAAMgF,CAAAA,EAAQ,CAChB,CAAC,CACH,CACF,CAAA,EAC6B,IAAA,EAAK,EACtB,GAAA,CAAI,CAAC,CAAE,QAAAupC,CAAAA,CAAS,IAAA,CAAAvpC,EAAM,MAAA,CAAAlU,CAAAA,CAAQ,GAAAkB,CAAAA,CAAI,MAAA,CAAAu8B,CAAAA,CAAQ,QAAA,CAAAC,CAAAA,CAAU,IAAA,CAAAzrB,CAAK,CAAA,IAAO,CAC1E,QAAS,IAAI,IAAA,CAAKwrC,CAAO,CAAA,CACzB,IAAA,CAAAvpC,EACA,OAAA,CAAS,CACP,CACE,MAAA,CAAQ,UAAA,CAAWlU,CAAM,CAAA,CACzB,KAAA,CAAO,QACT,CACF,CAAA,CACA,EAAA,CAAAkB,CAAAA,CACA,IAAA,CAAMu8B,CAAAA,EAAU,OAChB,EAAA,CAAIC,CAAAA,EAAY,OAChB,IAAA,CAAMzrB,CAAAA,EAAQ,MAChB,CAAA,CAAE,CAEN,CAAC,CACH,CCtBO,SAASyrC,GACdxuC,CAAAA,CACA7N,CAAAA,CACAyM,EAAmB,CAAE,OAAA,CAAS,KAAM,CAAA,CACpC,CACA,IAAM8mB,CAAAA,CAAc7Y,CAAAA,EAAe,CAC7BoG,EAAWrU,CAAAA,CAAQ,QAAA,EAAY,MAE/B6vC,CAAAA,CAAa,MAAOC,IACpB9vC,CAAAA,CAAQ,OAAA,CACV,MAAM8mB,CAAAA,CAAY,UAAA,CAAWgpB,CAAE,CAAA,CAE/B,MAAMhpB,EAAY,aAAA,CAAcgpB,CAAE,EAE7BhpB,CAAAA,CAAY,YAAA,CAA+BgpB,CAAAA,CAAG,QAAQ,CAAA,CAAA,CAGzDC,CAAAA,CAA6B,MACjCC,CAAAA,EAC0C,CAC1C,GAAI,CAACA,CAAAA,EAAa37B,IAAa,KAAA,CAC7B,OAAO27B,CAAAA,CAGT,GAAI,CACF,IAAMC,EAAiB,MAAMlF,EAAAA,CAAgB12B,CAAQ,CAAA,CACrD,OAAO,CACL,GAAG27B,CAAAA,CACH,KAAA,CAAOA,CAAAA,CAAU,KAAA,CAAQC,CAC3B,CACF,CAAA,MAAS57C,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuCggB,CAAQ,CAAA,CAAA,CAAA,CAAKhgB,CAAK,CAAA,CAC/D27C,CACT,CACF,CAAA,CAEME,CAAAA,CAAiBxJ,GAAyBtlC,CAAAA,CAAUiT,CAAAA,CAAU,IAAI,CAAA,CAElE87B,CAAAA,CAAwB,SAAY,CACxC,GAAI,CAEF,IAAMC,CAAAA,CAAAA,CAD+B,MAAMtpB,EAAY,UAAA,CAAWopB,CAAc,GACpD,OAAA,CAAQ,IAAA,CACjC78C,CAAAA,EACCA,CAAAA,CAAK,MAAA,CAAO,WAAA,KAAkBE,CAAAA,CAAM,WAAA,EACxC,CAAA,CAEA,GAAI,CAAC68C,CAAAA,CAAW,OAEhB,IAAM75C,CAAAA,CAAkD,EAAC,CAczD,GAZI65C,CAAAA,CAAU,MAAA,GAAW,QAAaA,CAAAA,CAAU,MAAA,GAAW,MACzD75C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,QAAA,CAAU,QAAS65C,CAAAA,CAAU,MAAO,CAAC,CAAA,CAGtDA,CAAAA,CAAU,SAAW,KAAA,CAAA,EAAaA,CAAAA,CAAU,MAAA,GAAW,IAAA,EAAQA,CAAAA,CAAU,MAAA,CAAS,GACpF75C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,QAAA,CAAU,QAAS65C,CAAAA,CAAU,MAAO,CAAC,CAAA,CAGtDA,CAAAA,CAAU,OAAA,GAAY,QAAaA,CAAAA,CAAU,OAAA,GAAY,MAAQA,CAAAA,CAAU,OAAA,CAAU,GACvF75C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,SAAA,CAAW,OAAA,CAAS65C,EAAU,OAAQ,CAAC,EAGxDA,CAAAA,CAAU,SAAA,EAAa,MAAM,OAAA,CAAQA,CAAAA,CAAU,SAAS,CAAA,CAC1D,IAAA,IAAWC,KAAaD,CAAAA,CAAU,SAAA,CAAW,CAC3C,GAAI,CAACC,GAAa,OAAOA,CAAAA,EAAc,QAAA,CAAU,SAEjD,IAAMC,CAAAA,CAAUD,EAAU,OAAA,CACpB7iD,CAAAA,CAAQ6iD,EAAU,KAAA,CAExB,GAAI,OAAO7iD,CAAAA,EAAU,QAAA,CAAU,CAE7B,IAAMsf,CAAAA,CADatf,CAAAA,CAAM,QAAQ,IAAA,CAAM,EAAE,EAChB,KAAA,CAAM,yBAAyB,EACxD,GAAIsf,CAAAA,CAAO,CACT,IAAMyjC,CAAAA,CAAW,IAAA,CAAK,IAAI,MAAA,CAAO,UAAA,CAAWzjC,EAAM,CAAC,CAAC,CAAC,CAAA,CAEjDwjC,CAAAA,GAAY,uBACd/5C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,sBAAA,CAAwB,QAASg6C,CAAS,CAAC,EACrDD,CAAAA,GAAY,qBAAA,CACrB/5C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,uBAAwB,OAAA,CAASg6C,CAAS,CAAC,CAAA,CACrDD,CAAAA,GAAY,4BACrB/5C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,oBAAA,CAAsB,OAAA,CAASg6C,CAAS,CAAC,EAEhE,CACF,CACF,CAGF,OAAO,CACL,IAAA,CAAMH,CAAAA,CAAU,MAAA,CAChB,KAAA,CAAOA,CAAAA,CAAU,KACjB,KAAA,CAAOA,CAAAA,CAAU,SACjB,cAAA,CAAgBA,CAAAA,CAAU,QAC1B,GAAA,CAAKA,CAAAA,CAAU,KAAK,QAAA,EAAS,CAC7B,MAAOA,CAAAA,CAAU,KAAA,CACjB,eAAgBA,CAAAA,CAAU,cAAA,CAC1B,MAAA75C,CACF,CACF,CAAA,KAAQ,CACN,MACF,CACF,EAEA,OAAOuZ,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,iBAAkB,YAAA,CAAc1O,CAAAA,CAAU7N,CAAAA,CAAO8gB,CAAQ,CAAA,CACpE,OAAA,CAAS,SAAY,CACnB,IAAMm8B,EAAqB,MAAML,CAAAA,GAEjC,GAAIK,CAAAA,EAAsBA,CAAAA,CAAmB,KAAA,CAAQ,CAAA,CACnD,OAAOA,EAGT,IAAIR,CAAAA,CAEJ,GAAIz8C,CAAAA,GAAU,MAAA,CACZy8C,EAAY,MAAMH,CAAAA,CAAWlJ,GAAoCvlC,CAAQ,CAAC,UACjE7N,CAAAA,GAAU,IAAA,CACnBy8C,EAAY,MAAMH,CAAAA,CAAWxI,GAAyCjmC,CAAQ,CAAC,CAAA,CAAA,KAAA,GACtE7N,CAAAA,GAAU,KAAA,CACnBy8C,CAAAA,CAAY,MAAMH,CAAAA,CAAW7I,EAAAA,CAAmC5lC,CAAQ,CAAC,CAAA,CAAA,KAAA,GAChE7N,IAAU,QAAA,CACnBy8C,CAAAA,CAAY,MAAMH,CAAAA,CAAWJ,EAAAA,CAAsCruC,CAAQ,CAAC,CAAA,CAAA,KAAA,GAAA,CAG3D,MAAM0lB,EAAY,eAAA,CACjCgmB,EAAAA,CAAwC1rC,CAAQ,CAClD,CAAA,EAEa,IAAA,CAAMktC,CAAAA,EAAYA,CAAAA,CAAQ,MAAA,GAAW/6C,CAAK,CAAA,CACrDy8C,CAAAA,CAAY,MAAMH,CAAAA,CAChBjB,EAAAA,CAA0CxtC,EAAU7N,CAAK,CAC3D,OACK,CAAA,GAAIi9C,CAAAA,CAET,OAAOA,CAAAA,CAEP,MAAM,IAAI,KAAA,CACR,CAAA,yCAAA,EAAuCj9C,CAAK,CAAA,CAAA,CAC9C,CAAA,CAMJ,GAAIi9C,CAAAA,EAAsBR,CAAAA,EAAaA,CAAAA,CAAU,MAAQ,CAAA,CAAG,CAC1D,IAAMS,CAAAA,CAAY,MAAMV,EAA2BC,CAAS,CAAA,CAC5D,OAAO,CACL,GAAGQ,CAAAA,CACH,MAAOC,CAAAA,CAAW,KACpB,CACF,CAEA,OAAO,MAAMV,CAAAA,CAA2BC,CAAS,CACnD,CACF,CAAC,CACH,CC/KO,IAAKU,EAAAA,CAAAA,CAAAA,CAAAA,GAEVA,EAAA,QAAA,CAAW,UAAA,CAGXA,EAAA,iBAAA,CAAoB,iBAAA,CACpBA,EAAA,mBAAA,CAAsB,iBAAA,CACtBA,EAAA,QAAA,CAAW,UAAA,CACXA,EAAA,OAAA,CAAU,UAAA,CACVA,EAAA,SAAA,CAAY,YAAA,CACZA,CAAAA,CAAA,cAAA,CAAiB,iBAAA,CACjBA,CAAAA,CAAA,cAAgB,gBAAA,CAChBA,CAAAA,CAAA,KAAO,MAAA,CACPA,CAAAA,CAAA,QAAU,SAAA,CAGVA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,OAAA,CAAU,UACVA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,GAAA,CAAM,MAGNA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,EAAA,UAAA,CAAa,YAAA,CAxBHA,QAAA,EAAA,ECkCL,SAASC,GACdvvC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,UAAU,CAAA,CACrB/I,CAAAA,CACCmJ,GAAY,CACX8d,EAAAA,CAAgBjnB,CAAAA,CAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,CAAAA,CAAQ,OAAQA,CAAAA,CAAQ,IAAI,CACrE,CAAA,CACA,MAAO6lB,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCxCO,SAAS2nC,EAAAA,CACdxvC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,gBAAgB,CAAA,CAC3B/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXmlB,EAAAA,CAAqBtuB,EAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,EAAQ,MAAA,CAAQA,CAAAA,CAAQ,IAAI,CAC1E,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC2BO,SAAS4nC,EAAAA,CACdzvC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,yBAAyB,CAAA,CACpC/I,EACCmJ,CAAAA,EAAY,CACX6e,GACEhoB,CAAAA,CACAmJ,CAAAA,CAAQ,UACRA,CAAAA,CAAQ,aACV,CACF,CAAA,CACA,MAAO6lB,EAASnJ,CAAAA,GAAc,CAE5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,QAAA,CAAS,KAAKkX,CAAAA,CAAU,SAAS,EAC3C,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCvBO,SAAS6nC,EAAAA,CACd1vC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,4BAA4B,CAAA,CACvC/I,EACCmJ,CAAAA,EAAY,CACXgf,GACEnoB,CAAAA,CACAmJ,CAAAA,CAAQ,SAAA,CACRA,CAAAA,CAAQ,OAAA,CACRA,CAAAA,CAAQ,QACV,CACF,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAE5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,EAAU,MAAA,CAAO,cAAA,CAAe3O,CAAS,CAAA,CACzC2O,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,EAAU,SAAS,CAC7C,CAAC,EACH,CAAA,CACApe,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCvFO,SAAS8nC,GAAuB3vC,CAAAA,CAA8ByH,CAAAA,CACnEI,EACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,uBAAuB,EAClC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,KAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,cAAA,CAAgB,UAAA,CAChB,gBAAiB,CACf,MAAA,CAAQ5P,EAAQ,MAAA,CAChB,EAAA,CAAIA,EAAQ,EAAA,CACZ,QAAA,CAAUA,CAAAA,CAAQ,QAAA,CAClB,IAAA,CAAMA,CAAAA,CAAQ,IAChB,CACF,CAAC,EACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,eAAgB,CAACnJ,CAAS,EAC1B,sBAAA,CAAwB,GACxB,EAAA,CAAI,kBAAA,CACJ,KAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,MAAOiW,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,QAAA,CAAS,KAAKkX,CAAAA,CAAU,EAAE,EACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCrCO,SAAS+nC,EAAAA,CACd5vC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,qBAAqB,CAAA,CAChC/I,EACCmJ,CAAAA,EAAY,CACXqe,GAAyBxnB,CAAAA,CAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,CAAAA,CAAQ,MAAA,CAAQA,CAAAA,CAAQ,IAAI,CAC9E,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCtBO,SAASgoC,EAAAA,CACd7vC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,uBAAuB,EAClC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXse,EAAAA,CAA2BznB,CAAAA,CAAWmJ,CAAAA,CAAQ,GAAIA,CAAAA,CAAQ,MAAA,CAAQA,EAAQ,IAAA,CAAMA,CAAAA,CAAQ,SAAS,CACnG,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCzBO,SAASioC,EAAAA,CACd9vC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,qBAAqB,EAChC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX0e,EAAAA,CAAyB7nB,CAAAA,CAAWmJ,EAAQ,EAAA,CAAIA,CAAAA,CAAQ,MAAM,CAChE,CAAA,CACA,MAAO6lB,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,QAAA,CAAS,KAAKkX,CAAAA,CAAU,EAAE,EACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCxBO,SAASkoC,EAAAA,CACd/vC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,kBAAkB,CAAA,CAC7B/I,EACCmJ,CAAAA,EAAY,CACX2e,GAAuB9nB,CAAAA,CAAWmJ,CAAAA,CAAQ,aAAa,CACzD,CAAA,CACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC,CAAC,iBAAkB,YAAA,CAAcA,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCpBO,SAASmoC,EAAAA,CAAWhwC,CAAAA,CAA8ByH,CAAAA,CACvDI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,SAAS,CAAA,CACpB/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXA,CAAAA,CAAQ,cAAA,CACJsf,GAA6BzoB,CAAAA,CAAWmJ,CAAAA,CAAQ,OAAQA,CAAAA,CAAQ,SAAS,EACzEqf,EAAAA,CAAexoB,CAAAA,CAAWmJ,CAAAA,CAAQ,MAAA,CAAQA,CAAAA,CAAQ,SAAS,CACjE,CAAA,CACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCrBO,SAASooC,GAAiBjwC,CAAAA,CAA8ByH,CAAAA,CAC7DI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,gBAAgB,CAAA,CAC3B/I,CAAAA,CACCmJ,CAAAA,EAAYye,GAAsB5nB,CAAAA,CAAWmJ,CAAAA,CAAQ,GAAIA,CAAAA,CAAQ,MAAA,CAAQA,EAAQ,IAAA,CAAMA,CAAAA,CAAQ,SAAS,CAAA,CACzG,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC,CAAC,iBAAkB,YAAA,CAAcA,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCnBA,IAAMqoC,EAAAA,CAAsC,GAAA,CACtCC,EAAAA,CAA4B,IAAI,IAE/B,SAASC,EAAAA,CAAgBpwC,EAA8ByH,CAAAA,CAC5DI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,eAAe,EAC1B/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXijB,EAAAA,CAA0BpsB,CAAAA,CAAWmJ,EAAQ,UAAA,CAAYA,CAAAA,CAAQ,SAAA,CAAWA,CAAAA,CAAQ,WAAW,CACjG,EACA,IAAM,CACJ,IAAMknC,CAAAA,CAAWrwC,CAAAA,EAAY,gBACvBswC,CAAAA,CAAmB,CACvB3hC,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC,CAAC,gBAAA,CAAkB,aAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CAAA,CACtC2O,CAAAA,CAAU,OAAO,eAAA,CAAgB3O,CAAS,EAC1C2O,CAAAA,CAAU,MAAA,CAAO,eAAe3O,CAAS,CAAA,CACzC2O,EAAU,MAAA,CAAO,oBAAA,CAAqB3O,CAAS,CACjD,CAAA,CAIMuwC,EAAgBJ,EAAAA,CAA0B,GAAA,CAAIE,CAAQ,CAAA,CACxDE,CAAAA,GACF,YAAA,CAAaA,CAAa,CAAA,CAC1BJ,EAAAA,CAA0B,OAAOE,CAAQ,CAAA,CAAA,CAG3C,IAAMh3C,CAAAA,CAAQ,UAAA,CAAW,SAAY,CACnC,GAAI,CACF,IAAMi2B,CAAAA,CAAKziB,CAAAA,GAIL2jC,CAAAA,CAAAA,CAHU,MAAM,QAAQ,UAAA,CAC5BF,CAAAA,CAAiB,IAAKtgD,CAAAA,EAAQs/B,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAUt/B,CAAI,CAAC,CAAC,CACvE,GACyB,MAAA,CAAQ1E,CAAAA,EAAWA,EAAO,MAAA,GAAW,UAAU,EACpEklD,CAAAA,CAAS,MAAA,CAAS,GACpB,OAAA,CAAQ,KAAA,CAAM,+DAAgE,CAC5E,QAAA,CAAAxwC,EACA,aAAA,CAAewwC,CAAAA,CAAS,MAAA,CACxB,QAAA,CAAAA,CACF,CAAC,EAEL,CAAA,MAASv9C,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,6DAA8D,CAC1E,QAAA,CAAA+M,CAAAA,CACA,KAAA,CAAA/M,CACF,CAAC,EACH,CAAA,OAAE,CACAk9C,GAA0B,MAAA,CAAOE,CAAQ,EAC3C,CACF,CAAA,CAAGH,EAAmC,CAAA,CAEtCC,EAAAA,CAA0B,GAAA,CAAIE,EAAUh3C,CAAK,EAC/C,EACAoO,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC7DO,SAAS4oC,EAAAA,CAAuBzwC,CAAAA,CAA8ByH,EACnEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,uBAAuB,CAAA,CAClC/I,CAAAA,CACCmJ,GAAY,CACX,IAAM4P,EAAO,IAAA,CAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,cAAA,CAAgB,UAAA,CAChB,eAAA,CAAiB,CACf,OAAQ5P,CAAAA,CAAQ,MAAA,CAChB,GAAIA,CAAAA,CAAQ,EAAA,CACZ,SAAUA,CAAAA,CAAQ,QACpB,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,EAAA,CAAI,kBAAA,CACJ,eAAgB,CAACnJ,CAAS,EAC1B,sBAAA,CAAwB,GACxB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,EACA,MAAOiW,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,EACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCnCO,SAAS6oC,GAAyB1wC,CAAAA,CAA8ByH,CAAAA,CACrEI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,yBAAyB,CAAA,CACpC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,KAAK,SAAA,CAAU,CAC1B,aAAc,QAAA,CACd,cAAA,CAAgB,YAAA,CAChB,eAAA,CAAiB,CACf,MAAA,CAAQ5P,EAAQ,MAAA,CAChB,IAAA,CAAMA,EAAQ,IAAA,CACd,QAAA,CAAUA,EAAQ,QACpB,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,GAAI,kBAAA,CACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,uBAAwB,EAAC,CACzB,KAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,SAAY,CACV,MAAMtP,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CClCO,SAAS8oC,GAAoB3wC,CAAAA,CAA8ByH,CAAAA,CAChEI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,oBAAoB,CAAA,CAC/B/I,CAAAA,CACCmJ,GAAY,CACX,IAAM4P,EAAO,IAAA,CAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,cAAA,CAAgB,QAChB,eAAA,CAAiB,CACf,OAAQ5P,CAAAA,CAAQ,MAAA,CAChB,GAAIA,CAAAA,CAAQ,EAAA,CACZ,QAAA,CAAUA,CAAAA,CAAQ,QACpB,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,EAAA,CAAI,kBAAA,CACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,uBAAwB,EAAC,CACzB,KAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,MAAOiW,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnCO,SAAS+oC,EAAAA,CAAsB5wC,EAA8ByH,CAAAA,CAClEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,sBAAsB,EACjC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,KAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,cAAA,CAAgB,SAAA,CAChB,gBAAiB,CACf,MAAA,CAAQ5P,EAAQ,MAAA,CAChB,EAAA,CAAIA,EAAQ,EAAA,CACZ,QAAA,CAAUA,CAAAA,CAAQ,QACpB,CACF,CAAC,EACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,GAAI,kBAAA,CACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,sBAAA,CAAwB,EAAC,CACzB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,SAAY,CACV,MAAMtP,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCpCO,SAASgpC,GAAsB7wC,CAAAA,CAA8ByH,CAAAA,CAClEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,sBAAsB,EACjC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,KAAK,SAAA,CAAU5P,CAAAA,CAAQ,OAAO,GAAA,CAAKpY,CAAAA,GAAY,CAAE,MAAA,CAAAA,CAAO,EAAE,CAAC,CAAA,CACxE,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,EAAA,CAAI,kBAAA,CACJ,eAAgB,EAAC,CACjB,uBAAwB,CAACiP,CAAS,CAAA,CAClC,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,SAAY,CACV,MAAMtP,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,UACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCrBO,SAASipC,EAAAA,CAAqB9wC,CAAAA,CAA8ByH,EACjEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,qBAAqB,CAAA,CAChC/I,CAAAA,CACCmJ,GAAY,CACX,IAAIyf,EACAD,CAAAA,CAEAxf,CAAAA,CAAQ,SAAW,QAAA,EACrBwf,CAAAA,CAAiB,QAAA,CACjBC,CAAAA,CAAkB,CAChB,IAAA,CAAMzf,EAAQ,SAAA,CACd,EAAA,CAAIA,EAAQ,OACd,CAAA,GAEAwf,EAAiBxf,CAAAA,CAAQ,MAAA,CACzByf,EAAkB,CAChB,MAAA,CAAQzf,EAAQ,MAAA,CAChB,QAAA,CAAUA,EAAQ,QAAA,CAClB,KAAA,CAAOA,EAAQ,KACjB,CAAA,CAAA,CAGF,IAAM4P,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,eAAA4P,CAAAA,CACA,eAAA,CAAAC,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,EAAA,CAAI,kBAAA,CACJ,eAAgB,CAAC5oB,CAAS,EAC1B,sBAAA,CAAwB,EAAC,CACzB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,SAAY,CACV,MAAMtP,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC,CAAC,gBAAA,CAAkB,aAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC1BA,SAASkpC,EAAAA,CACP5+C,CAAAA,CACA2B,EACAqV,CAAAA,CACoB,CACpB,GAAM,CAAE,IAAA,CAAA3F,CAAAA,CAAM,EAAA,CAAAC,CAAAA,CAAK,EAAA,CAAI,OAAA3S,CAAAA,CAAS,EAAA,CAAI,KAAAiS,CAAAA,CAAO,EAAG,EAAIoG,CAAAA,CAC5Cue,CAAAA,CAAYve,EAAQ,UAAA,EAAe,IAAA,CAAK,KAAI,GAAM,CAAA,CAExD,OAAQhX,CAAAA,EACN,KAAK,MAAA,CACH,OAAQ2B,CAAAA,EACN,KAAA,UAAA,CACE,OAAO,CAACmzB,EAAAA,CAAgBzjB,CAAAA,CAAMC,EAAI3S,CAAAA,CAAQiS,CAAI,CAAC,CAAA,CACjD,KAAA,iBAAA,CACE,OAAO,CAACykB,EAAAA,CAAyBhkB,CAAAA,CAAMC,EAAI3S,CAAAA,CAAQiS,CAAI,CAAC,CAAA,CAC1D,KAAA,iBAAA,CACE,OAAO,CAAC0kB,EAAAA,CAA2BjkB,CAAAA,CAAMC,CAAAA,CAAI3S,CAAAA,CAAQiS,CAAAA,CAAM2kB,CAAS,CAAC,CAAA,CACvE,gBACE,OAAO,CAACG,GAAyBrkB,CAAAA,CAAMC,CAAAA,CAAI3S,CAAM,CAAC,CACtD,CACA,MAEF,KAAK,MACH,OAAQgD,CAAAA,EACN,KAAA,UAAA,CACE,OAAO,CAACmzB,EAAAA,CAAgBzjB,CAAAA,CAAMC,CAAAA,CAAI3S,EAAQiS,CAAI,CAAC,EACjD,KAAA,iBAAA,CACE,OAAO,CAACykB,EAAAA,CAAyBhkB,CAAAA,CAAMC,CAAAA,CAAI3S,CAAAA,CAAQiS,CAAI,CAAC,EAC1D,KAAA,iBAAA,CACE,OAAO,CAAC0kB,EAAAA,CAA2BjkB,CAAAA,CAAMC,EAAI3S,CAAAA,CAAQiS,CAAAA,CAAM2kB,CAAS,CAAC,CAAA,CACvE,KAAA,gBAAA,CACE,OAAOE,EAAAA,CAAsBpkB,CAAAA,CAAMC,EAAI3S,CAAAA,CAAQiS,CAAAA,CAAM2kB,CAAS,CAAA,CAChE,KAAA,SAAA,CACE,OAAO,CAACc,EAAAA,CAAehlB,EAAM1S,CAAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,GAAQ,GAAI,CAAC,CAAC,CACvE,CACA,MAEF,KAAK,IAAA,CACH,OAAQgD,GACN,KAAA,YAAA,CACE,OAAO,CAACg0B,EAAAA,CAAuBtkB,CAAAA,CAAM1S,CAAM,CAAC,CAAA,CAC9C,gBACE,OAAO,CAACk3B,GAA6BxkB,CAAAA,CAAMC,CAAAA,CAAI3S,CAAM,CAAC,CAAA,CACxD,KAAA,iBAAA,CACE,OAAO,CAACq3B,EAAAA,CACNhf,EAAQ,YAAA,EAAgB3F,CAAAA,CACxB2F,EAAQ,UAAA,EAAc1F,CAAAA,CACtB0F,EAAQ,OAAA,EAAW,CAAA,CACnBA,EAAQ,SAAA,EAAa,KACvB,CAAC,CACL,CACA,MAEF,KAAK,QAAA,CACH,GAAIrV,CAAAA,GAAc,UAAA,EAA2BA,CAAAA,GAAc,MAAA,CACzD,OAAO,CAACw6B,GAAqB9qB,CAAAA,CAAMC,CAAAA,CAAI3S,EAAQiS,CAAI,CAAC,EAEtD,KACJ,CAEA,OAAO,IACT,CAEA,SAASiuC,GACP7+C,CAAAA,CACA2B,CAAAA,CACAqV,EACoB,CACpB,GAAM,CAAE,IAAA,CAAA3F,CAAAA,CAAM,EAAA,CAAAC,CAAAA,CAAK,EAAA,CAAI,MAAA,CAAA3S,EAAS,EAAG,CAAA,CAAIqY,EACjC6hC,CAAAA,CAAW,OAAOl6C,GAAW,QAAA,EAAYA,CAAAA,CAAO,SAAS,GAAG,CAAA,CAC9DA,EAAO,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CACnB,OAAOA,CAAM,CAAA,CAEjB,OAAQgD,CAAAA,EACN,KAAA,UAAA,CACE,OAAO,CAAC40B,EAAAA,CAAcllB,EAAM,UAAA,CAAY,CACtC,OAAQrR,CAAAA,CAAO,EAAA,CAAAsR,CAAAA,CAAI,QAAA,CAAAunC,CAAAA,CAAU,IAAA,CAAM7hC,EAAQ,IAAA,EAAQ,EACrD,CAAC,CAAC,CAAA,CACJ,aACE,OAAO,CAACuf,EAAAA,CAAcllB,CAAAA,CAAM,OAAA,CAAS,CAAE,OAAQrR,CAAAA,CAAO,EAAA,CAAAsR,EAAI,QAAA,CAAAunC,CAAS,CAAC,CAAC,CAAA,CACvE,eACE,OAAO,CAACtiB,GAAcllB,CAAAA,CAAM,SAAA,CAAW,CAAE,MAAA,CAAQrR,CAAAA,CAAO,GAAAsR,CAAAA,CAAI,QAAA,CAAAunC,CAAS,CAAC,CAAC,CAAA,CACzE,gBACE,OAAO,CAACtiB,GAAcllB,CAAAA,CAAM,UAAA,CAAY,CAAE,MAAA,CAAQrR,CAAAA,CAAO,EAAA,CAAAsR,CAAAA,CAAI,QAAA,CAAAunC,CAAS,CAAC,CAAC,CAAA,CAC1E,kBACE,OAAO,CAACtiB,GAAcllB,CAAAA,CAAM,YAAA,CAAc,CAAE,MAAA,CAAQrR,CAAAA,CAAO,IAAA,CAAMsR,EAAI,QAAA,CAAAunC,CAAS,CAAC,CAAC,CAAA,CAClF,aACE,OAAO,CAACliB,GAAmBtlB,CAAAA,CAAM,CAACrR,CAAK,CAAC,CAAC,CAC7C,CAEA,OAAO,IACT,CAMA,SAAS8+C,EAAAA,CAA4Bn9C,CAAAA,CAA2C,CAC9E,OAAIA,IAAc,OAAA,CACT,SAAA,CAEF,QACT,CAaO,SAASo9C,GACdlxC,CAAAA,CACA7N,CAAAA,CACA2B,CAAAA,CACA2T,CAAAA,CACAI,CAAAA,CACA,CACA,GAAM,CAAE,WAAA,CAAa43B,CAAe,CAAA,CAAI7C,EAAAA,CAAgB,kBACtD58B,CAAAA,CACAlM,CACF,CAAA,CAEA,OAAOiV,CAAAA,CACL,CAAC,iBAAkB5W,CAAAA,CAAO2B,CAAS,EACnCkM,CAAAA,CACCmJ,CAAAA,EAAY,CAEX,IAAMgoC,CAAAA,CAAUJ,GAAoB5+C,CAAAA,CAAO2B,CAAAA,CAAWqV,CAAO,CAAA,CAC7D,GAAIgoC,EAAS,OAAOA,CAAAA,CAGpB,IAAMC,CAAAA,CAAYJ,EAAAA,CAAsB7+C,CAAAA,CAAO2B,CAAAA,CAAWqV,CAAO,CAAA,CACjE,GAAIioC,CAAAA,CAAW,OAAOA,EAEtB,MAAM,IAAI,MAAM,CAAA,qDAAA,EAAmDj/C,CAAK,CAAA,aAAA,EAAgB2B,CAAS,CAAA,CAAA,CAAG,CACtG,EACA,IAAM,CACJ2rC,GAAe,CAEf,IAAM6Q,EAA6C,EAAC,CAGpDA,CAAAA,CAAiB,IAAA,CAAK,CAAC,gBAAA,CAAkB,aAActwC,CAAAA,CAAU7N,CAAK,CAAC,CAAA,CAEnEA,CAAAA,GAAU,QACZm+C,CAAAA,CAAiB,IAAA,CAAK,CAAC,gBAAA,CAAkB,YAAA,CAActwC,EAAU,IAAI,CAAC,EAIxEswC,CAAAA,CAAiB,IAAA,CAAK,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMtwC,CAAQ,CAAC,CAAA,CAG7D,WAAW,IAAM,CACfswC,EAAiB,OAAA,CAAStgD,CAAAA,EAAQ,CAChC6c,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CAAE,QAAA,CAAU7c,CAAI,CAAC,EACtD,CAAC,EACH,CAAA,CAAG,GAAI,EACT,CAAA,CACAyX,CAAAA,CACAwpC,EAAAA,CAA4Bn9C,CAAS,CAAA,CACrC,CAAE,cAAA+T,CAAc,CAClB,CACF,CClMO,SAASwpC,GACdrxC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,aAAa,CAAA,CACxB/I,CAAAA,CACA,CAAC,CAAE,EAAA,CAAAyD,CAAAA,CAAI,KAAA,CAAAwlB,CAAM,CAAA,GAAM,CACjBF,EAAAA,CAAkB/oB,CAAAA,CAAWyD,EAAIwlB,CAAK,CACxC,EACA,MAAO+F,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpClX,CAAAA,CAAU,gBAAgB,OAAA,CAAQ3O,CAAS,EAC3C2O,CAAAA,CAAU,eAAA,CAAgB,QAAQkX,CAAAA,CAAU,EAAE,CAChD,CAAC,EACH,EACApe,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC0BO,SAASypC,GACdtxC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,WAAA,CAAa,MAAM,CAAA,CACpB/I,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAyS,CAAAA,CAAS,QAAAoX,CAAQ,CAAA,GAAM,CACxBD,EAAAA,CAAmB5pB,CAAAA,CAAWyS,CAAAA,CAASoX,CAAO,CAChD,CAAA,CACA,SAAY,CAEV,GAAI,CAEEpiB,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,UAAU,KAAA,CAAM3O,CAAQ,CACpC,CAAC,EAEL,CAAA,MAAS/M,EAAO,CAEd,OAAA,CAAQ,KAAK,qDAAA,CAAuDA,CAAK,EAC3E,CACF,CAAA,CACAwU,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CChFO,SAAS0pC,EAAAA,CACdvxC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,YAAa,OAAO,CAAA,CACrB/I,EACA,CAAC,CAAE,MAAA+pB,CAAM,CAAA,GAAM,CACbD,EAAAA,CAAoB9pB,CAAAA,CAAW+pB,CAAK,CACtC,CAAA,CACA,SAAY,CACNtiB,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,UAAU,KAAA,EACtB,CAAC,EAEL,CAAA,CACAlH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCMA,SAAS2pC,EAAAA,CAAeC,CAAAA,CAA0B,CAChD,OAAO,CACL,MAAOA,CAAAA,CAAE,YAAA,CACT,aAAcA,CAAAA,CAAE,aAAA,CAChB,IAAKA,CAAAA,CAAE,GAAA,CACP,MAAO,CACL,oBAAA,CAAsB,IAAIA,CAAAA,CAAE,oBAAA,CAAuB,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,QACnE,sBAAA,CAAwB,CAAA,CACxB,mBAAoBA,CAAAA,CAAE,UACxB,EACA,iBAAA,CAAmB,CACjB,IAAA,CAAM,CAAA,EAAGA,CAAAA,CAAE,UAAA,CAAW,QAAQ,CAAC,CAAC,MAClC,CAAA,CACA,mCAAA,CAAqC,EACrC,eAAA,CAAiBA,CAAAA,CAAE,OAAA,CACnB,WAAA,CAAaA,CAAAA,CAAE,WAAA,CACf,yBAA0BA,CAAAA,CAAE,eAAA,CAC5B,KAAMA,CAAAA,CAAE,IAAA,CACR,MAAOA,CAAAA,CAAE,KAAA,CACT,WAAYA,CAAAA,CAAE,UAAA,CACd,wBAAyBA,CAAAA,CAAE,uBAAA,CAC3B,WAAYA,CAAAA,CAAE,UAAA,CACd,kBAAmBA,CAAAA,CAAE,iBAAA,CACrB,wBAAA,CAA0BA,CAAAA,CAAE,wBAC9B,CACF,CAUO,SAASC,EAAAA,CAAiCvkD,EAAe,CAC9D,OAAO0rB,qBAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,SAAA,CAAU,IAAA,CAAKxhB,CAAK,EACxC,gBAAA,CAAkB,CAAA,CAElB,QAAS,MAAO,CAAE,UAAA2rB,CAAU,CAAA,GAAA,CACR,MAAMlc,EAAAA,CACtB,OAAA,CACA,YAAA,CACA,CACE,WAAA,CAAazP,CAAAA,CACb,KAAM2rB,CACR,CACF,GAEgB,SAAA,CAAU,GAAA,CAAI04B,EAAc,CAAA,CAG9C,gBAAA,CAAkB,CAACx4B,CAAAA,CAAU8yB,CAAAA,CAAWC,IACtC/yB,CAAAA,CAAS,MAAA,GAAW7rB,EAAQ4+C,CAAAA,CAAgB,CAAA,CAAI,MACpD,CAAC,CACH,CAuBO,SAAS4F,EAAAA,CACdl/B,CAAAA,CACAC,EACAC,CAAAA,CACA9B,CAAAA,CAA8B,QAC9B+B,CAAAA,CAAuC,MAAA,CACvC,CACA,OAAOlE,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,SAAA,CAAU,OAAO8D,CAAAA,CAASC,CAAAA,CAAMC,EAAU9B,CAAAA,CAAM+B,CAAS,CAAA,CAC7E,OAAA,CAAS,MAAO,CAAE,OAAAvY,CAAO,CAAA,GACf,MAAMuC,EAAAA,CACZ,OAAA,CACA,mCACA,CACE,cAAA,CAAgB6V,EAChB,WAAA,CAAaE,CAAAA,CACb,KAAAD,CAAAA,CACA,IAAA,CAAA7B,EACA,SAAA,CAAA+B,CACF,EACA,MAAA,CACA,MAAA,CACAvY,CACF,CAAA,CAEF,OAAA,CAAS,CAAC,CAACoY,CAAAA,CACX,SAAA,CAAW,GACb,CAAC,CACH,CAOO,SAASm/B,EAAAA,CAAiCn/B,CAAAA,CAAiB,CAChE,OAAO/D,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,UAAU,UAAA,CAAW8D,CAAO,EAChD,OAAA,CAAS,SACC,MAAM7V,EAAAA,CACZ,OAAA,CACA,wCAAA,CACA,CAAE,cAAA,CAAgB6V,CAAQ,CAC5B,CAAA,CAEF,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,UAAW,GACb,CAAC,CACH,CC3KO,IAAKo/B,QACVA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,IAAV,SAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,KAAA,CAAQ,EAAA,CAAA,CAAR,OAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,cAAgB,EAAA,CAAA,CAAhB,eAAA,CACAA,IAAA,IAAA,CAAO,GAAA,CAAA,CAAP,OACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,GAAA,CAAA,CAAV,SAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,IAAA,CAAO,KAAP,MAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAS,GAAA,CAAA,CAAT,QAAA,CACAA,IAAA,UAAA,CAAa,GAAA,CAAA,CAAb,YAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,QAAA,CAAW,GAAA,CAAA,CAAX,WACAA,CAAAA,CAAAA,CAAAA,CAAA,SAAA,CAAY,KAAZ,WAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,cAAgB,GAAA,CAAA,CAAhB,eAAA,CACAA,IAAA,iBAAA,CAAoB,GAAA,CAAA,CAApB,oBACAA,CAAAA,CAAAA,CAAAA,CAAA,MAAA,CAAS,KAAT,QAAA,CAWAA,CAAAA,CAAAA,CAAAA,CAAA,OAAS,GAAA,CAAA,CAAT,QAAA,CAxBUA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,ECiBZ,eAAsBC,GACpB9xC,CAAAA,CACAqJ,CAAAA,CACA,CACA,GAAI,CAACrJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAiD,CAAA,CAGnE,GAAI,CAACqJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,uDAAkD,CAAA,CAIpE,IAAM7L,CAAAA,CAAW,MADAyQ,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,2BAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CACF,CAAA,CAGM0oC,CAAAA,CAAAA,CAAev0C,CAAAA,CAAS,QAAQ,GAAA,CAAI,cAAc,GAAK,EAAA,EAC1D,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CACZ,IAAA,EAAK,CACL,WAAA,GACGtD,CAAAA,CAAO,MAAMsD,EAAS,IAAA,EAAK,CAEjC,GAAI,CAACA,CAAAA,CAAS,EAAA,CAAI,CAChB,GAAIA,CAAAA,CAAS,SAAW,GAAA,CACtB,GAAI,CACF,OAAO,IAAA,CAAK,MAAMtD,CAAI,CACxB,MAAQ,CACN,OAAO,CAAE,OAAA,CAASA,CAAAA,CAAM,KAAMsD,CAAAA,CAAS,MAAO,CAChD,CAKF,IAAMw0C,CAAAA,CACJ93C,CAAAA,EAAQ63C,CAAAA,CAAY,QAAA,CAAS,MAAM,CAAA,CAAI,CAAA,EAAA,EAAK73C,EAAK,KAAA,CAAM,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAK,EAAA,CACrE,MAAM,IAAI,KAAA,CACR,kDAA6CsD,CAAAA,CAAS,MAAM,GAAGw0C,CAAM,CAAA,CACvE,CACF,CAEA,GAAI,CAACD,CAAAA,CAAY,QAAA,CAAS,MAAM,EAC9B,MAAM,IAAI,MACR,CAAA,wDAAA,EAAsDA,CAAAA,EAAe,OAAO,CAAA,mBAAA,EAAsBv0C,CAAAA,CAAS,MAAM,CAAA,CAAA,CACnH,CAAA,CAGF,GAAI,CACF,OAAO,KAAK,KAAA,CAAMtD,CAAI,CACxB,CAAA,KAAQ,CACN,MAAM,IAAI,KAAA,CACR,CAAA,4DAAA,EAA0DsD,EAAS,MAAM,CAAA,CAAA,CAC3E,CACF,CACF,CAEO,SAASy0C,EAAAA,CACdjyC,CAAAA,CACAqJ,CAAAA,CACAJ,CAAAA,CACA8c,CAAAA,CACA,CACA,GAAM,CAAE,WAAA,CAAa0Z,CAAe,CAAA,CAAI7C,EAAAA,CAAgB,kBACtD58B,CAAAA,CACA,gBACF,CAAA,CAEA,OAAOkJ,WAAAA,CAAY,CACjB,WAAY,IAAM4oC,EAAAA,CAAmB9xC,EAAUqJ,CAAW,CAAA,CAC1D,QAAA0c,CAAAA,CACA,SAAA,CAAW,IAAM,CACf0Z,CAAAA,GAEA5yB,CAAAA,EAAe,CAAE,aACfmhC,EAAAA,CAAsBhuC,CAAQ,EAAE,QAAA,CAC/B5Q,CAAAA,EACMA,CAAAA,EAIE,CACL,GAAGA,CAAAA,CACH,QACE,UAAA,CAAWA,CAAAA,CAAK,MAAM,CAAA,CAAI,UAAA,CAAWA,EAAK,OAAO,CAAA,EACjD,OAAA,CAAQ,CAAC,CAAA,CACX,OAAA,CAAS,GACX,CAEJ,CAAA,CAEA6Z,MACF,CACF,CAAC,CACH,CC/GA,IAAMipC,EAAAA,CAAY,wBAAA,CACZC,EAAAA,CAAU,uBACVC,EAAAA,CAAc,0BAAA,CACdC,GAAS,qBAAA,CAKR,IAAKC,QACVA,CAAAA,CAAA,GAAA,CAAM,GACNA,CAAAA,CAAA,IAAA,CAAO,OACPA,CAAAA,CAAA,OAAA,CAAU,UAHAA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,CAAA,CAMCC,GAAkB,CAAA,CAIlBC,EAAAA,CAA0B,IAQvC,SAASC,EAAAA,CAAWrmD,CAAAA,CAAuB,CACzC,OAAOA,CAAAA,CAAM,MAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAK,EACzC,CAMO,SAASsmD,GAAsBtmD,CAAAA,CAAuB,CAC3D,OAAOqmD,EAAAA,CAAWrmD,CAAK,EAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,WAAA,EAC9C,CAEO,SAASumD,EAAAA,CAAwBvmD,EAAuB,CAG7D,OAAOqmD,GAAWrmD,CAAK,CAAA,CAAE,QAAQ,KAAA,CAAO,EAAE,EAAE,WAAA,EAC9C,CAMO,SAASwmD,EAAAA,CAAoBxmD,EAAyB,CAC3D,IAAMymD,CAAAA,CAAO,IAAI,GAAA,CAEjB,OAAOzmD,EACJ,KAAA,CAAM,QAAQ,EACd,GAAA,CAAKkV,CAAAA,EAAQA,EAAI,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,WAAA,EAAa,EACjD,MAAA,CAAQA,CAAAA,EACHA,IAAQ,EAAA,EAAMuxC,CAAAA,CAAK,IAAIvxC,CAAG,CAAA,CACrB,KAAA,EAGTuxC,CAAAA,CAAK,GAAA,CAAIvxC,CAAG,EACL,IAAA,CACR,CACL,CA0BO,SAASwxC,EAAAA,CAAiB,CAC/B,MAAA,CAAAC,CAAAA,CAAS,GACT,MAAA,CAAAxiC,CAAAA,CAAS,GACT,IAAA,CAAAvL,CAAAA,CAAO,GACP,QAAA,CAAAguC,CAAAA,CAAW,GACX,IAAA,CAAA93B,CAAAA,CAAO,EACT,CAAA,CAAuC,CACrC,IAAM+3B,CAAAA,CAAmBF,CAAAA,CAAO,MAAK,CAAE,OAAA,CAAQ,OAAQ,GAAG,CAAA,CACpD7xB,CAAAA,CAAmBwxB,EAAAA,CAAsBniC,CAAM,CAAA,CAC/C2iC,EAAqBP,EAAAA,CAAwBK,CAAQ,EACrDG,CAAAA,CAAiBP,EAAAA,CAAoB,MAAM,OAAA,CAAQ13B,CAAI,CAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,GAAG,EAAIA,CAAI,CAAA,CAEhF/lB,EAAQ,CAAC89C,CAAgB,EAE/B,OAAI/xB,CAAAA,EACF/rB,EAAM,IAAA,CAAK,CAAA,OAAA,EAAU+rB,CAAgB,CAAA,CAAE,CAAA,CAGrClc,GACF7P,CAAAA,CAAM,IAAA,CAAK,QAAQ6P,CAAI,CAAA,CAAE,CAAA,CAGvBkuC,CAAAA,EACF/9C,CAAAA,CAAM,IAAA,CAAK,YAAY+9C,CAAkB,CAAA,CAAE,EAGzCC,CAAAA,CAAe,MAAA,CAAS,GAG1Bh+C,CAAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAOg+C,CAAAA,CAAe,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA,CAGvC,CAGL,CAAA,CAAGh+C,CAAAA,CAAM,OAAQi+C,CAAAA,EAASA,CAAAA,GAAS,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,EAC/C,MAAA,CAAQH,CAAAA,CACR,OAAQ/xB,CAAAA,CACR,IAAA,CAAAlc,EACA,QAAA,CAAUkuC,CAAAA,CACV,KAAMC,CACR,CACF,CAEO,IAAME,EAAAA,CAAN,KAAkB,CAQvB,WAAA,CAAYC,EAAgB,CAP5B1nD,CAAAA,CAAA,IAAA,CAAO,OAAA,CAAgB,EAAA,CAAA,CACvBA,CAAAA,CAAA,KAAO,QAAA,CAAiB,EAAA,CAAA,CACxBA,EAAA,IAAA,CAAO,QAAA,CAAiB,IACxBA,CAAAA,CAAA,IAAA,CAAO,MAAA,CAAmB,EAAA,CAAA,CAC1BA,CAAAA,CAAA,IAAA,CAAO,WAAmB,EAAA,CAAA,CAC1BA,CAAAA,CAAA,KAAO,MAAA,CAAiB,IAaxBA,CAAAA,CAAA,IAAA,CAAQ,MAAA,CAAQ2nD,CAAAA,EAAuB,CAErC,IAAMC,EAAU,CAAC,GAAG,KAAK,KAAA,CAAM,QAAA,CAASD,CAAE,CAAC,CAAA,CAC3C,OAAIC,CAAAA,CAAQ,MAAA,CAAS,EACZA,CAAAA,CAAQ,CAAC,EAAE,CAAK,CAAA,CAAE,MAAK,CAGzB,EACT,CAAA,CAAA,CAEA5nD,CAAAA,CAAA,IAAA,CAAQ,YAAA,CAAa,IAAM,CACzB,IAAA,CAAK,OAAS,IAAA,CAAK,IAAA,CAAKsmD,EAAS,EACnC,CAAA,CAAA,CAEAtmD,CAAAA,CAAA,IAAA,CAAQ,UAAA,CAAW,IAAM,CACvB,IAAMoZ,CAAAA,CAAO,KAAK,IAAA,CAAKmtC,EAAO,EAC1B,MAAA,CAAO,MAAA,CAAOG,EAAU,CAAA,CAAE,QAAA,CAASttC,CAAI,IACzC,IAAA,CAAK,IAAA,CAAOA,GAEhB,CAAA,CAAA,CAEApZ,CAAAA,CAAA,KAAQ,cAAA,CAAe,IAAM,CAC3B,IAAA,CAAK,QAAA,CAAW,KAAK,IAAA,CAAKwmD,EAAW,EACvC,CAAA,CAAA,CAEAxmD,CAAAA,CAAA,KAAQ,UAAA,CAAW,IAAM,CAOvB,IAAMinD,CAAAA,CAAO,IAAI,IAEjB,IAAA,CAAK,IAAA,CAAO,CAAC,GAAG,IAAA,CAAK,MAAM,QAAA,CAASR,EAAM,CAAC,CAAA,CACxC,OAAA,CAAS3mC,CAAAA,EAAUA,EAAM,CAAK,CAAA,CAAE,MAAM,GAAG,CAAC,EAC1C,GAAA,CAAKpK,CAAAA,EAAQA,CAAAA,CAAI,IAAA,EAAM,CAAA,CACvB,OAAQA,CAAAA,EACHA,CAAAA,GAAQ,IAAMuxC,CAAAA,CAAK,GAAA,CAAIvxC,CAAG,CAAA,CACrB,KAAA,EAGTuxC,EAAK,GAAA,CAAIvxC,CAAG,EACL,IAAA,CACR,EACL,GAEA1V,CAAAA,CAAA,IAAA,CAAQ,aAAa,IAAM,CAOzB,IANA,CAACsmD,EAAAA,CAAWC,EAAAA,CAASC,GAAaC,EAAM,CAAA,CAAE,QAASvjD,CAAAA,EAAM,CAGvD,KAAK,MAAA,CAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQA,CAAAA,CAAG,IAAI,EAC3C,CAAC,CAAA,CAEM,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,GAAM,EAAA,EACnC,IAAA,CAAK,MAAA,CAAS,IAAA,CAAK,MAAA,CAAO,QAAQ,IAAA,CAAM,GAAG,EAG7C,IAAA,CAAK,MAAA,CAAS,KAAK,MAAA,CAAO,IAAA,GAC5B,CAAA,CAAA,CArEE,IAAA,CAAK,MAAQwkD,CAAAA,CACb,IAAA,CAAK,OAASA,CAAAA,CAEd,IAAA,CAAK,YAAW,CAChB,IAAA,CAAK,QAAA,EAAS,CACd,IAAA,CAAK,YAAA,GACL,IAAA,CAAK,QAAA,GACL,IAAA,CAAK,UAAA,GACP,CA8DF,EC5MA,eAAsBvd,GACpBv4B,CAAAA,CAQA6jB,CAAAA,CACY,CA+BZ,IAAMjyB,CAAAA,CAAO,KAAA,CA9BK,SAA8B,CAK9C,IAAIqkD,EACJ,GAAI,CACFA,EAAM,MAAMj2C,CAAAA,CAAS,OACvB,CAAA,KAAQ,CACN,MACF,CAEA,GAAIi2C,CAAAA,GAAQ,EAAA,CAIZ,GAAI,CACF,OAAO,KAAK,KAAA,CAAMA,CAAG,CACvB,CAAA,KAAQ,CAQN,OAAOj2C,EAAS,EAAA,CAAK,MAAA,CAAYi2C,CACnC,CACF,CAAA,IAGA,GAAI,CAACj2C,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMvK,EAAQ,IAAI,KAAA,CAAM,8BAA8BuK,CAAAA,CAAS,MAAM,EAAE,CAAA,CACvE,MAAAvK,CAAAA,CAAM,MAAA,CAASuK,CAAAA,CAAS,MAAA,CACxBvK,EAAM,IAAA,CAAO7D,CAAAA,CACP6D,CACR,CAEA,GAAI7D,IAAS,MAAA,EAAciyB,CAAAA,GAAY,QAAa,CAACA,CAAAA,CAAQjyB,CAAI,CAAA,CAC/D,MAAM,IAAI,KAAA,CAAM,kEAAkE,EAGpF,OAAOA,CACT,CAMO,SAASskD,EAAAA,CAAiBtkD,CAAAA,CAAwB,CACvD,OACE,OAAOA,GAAS,QAAA,EAChBA,CAAAA,GAAS,MACT,KAAA,CAAM,OAAA,CAASA,CAAAA,CAA+B,OAAO,CAEzD,CCrEA,IAAMukD,EAAAA,CAAcC,SAAW,CAAA,CAAI,CAAA,CAe5B,SAASC,EAAAA,CAAkBC,CAAAA,CAAsB7gD,CAAAA,CAAuB,CAC7E,GAAM,CAAE,OAAAuM,CAAO,CAAA,CAAIvM,EACb8gD,CAAAA,CAAcv0C,CAAAA,GAAW,KAAOA,CAAAA,GAAW,GAAA,CAEjD,OAAIA,CAAAA,GAAW,MAAA,EAAaA,GAAU,GAAA,EAAOA,CAAAA,CAAS,KAAO,CAACu0C,CAAAA,CACrD,KAAA,CAGFD,CAAAA,CAAeH,EACxB,CC7BO,SAASK,EAAAA,CACd/hC,CAAAA,CACApB,EACAqB,CAAAA,CACAC,CAAAA,CACA8hC,EACA5hC,CAAAA,CACA,CACA,OAAO3D,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,OAAA,CAAQsD,EAAGpB,CAAAA,CAAMqB,CAAAA,CAASC,EAAO8hC,CAAAA,CAAW5hC,CAAK,CAAA,CAC5E,OAAA,CAAS,MAAO,CAAE,OAAAhY,CAAO,CAAA,GAAM,CAC7B,IAAMjL,CAAAA,CAOF,CAAE,CAAA,CAAA6iB,CAAAA,CAAG,KAAApB,CAAAA,CAAM,QAAA,CAAUqB,CAAQ,CAAA,CAE7BC,CAAAA,GAAO/iB,EAAK,KAAA,CAAQ+iB,CAAAA,CAAAA,CACpB8hC,IAAW7kD,CAAAA,CAAK,SAAA,CAAY6kD,CAAAA,CAAAA,CAC5B5hC,CAAAA,GAAOjjB,CAAAA,CAAK,KAAA,CAAQijB,GAExB,IAAM7U,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,oBAAA,CAAsB,CACzE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAAA,CAChB,iBAAA,CAAmBA,EAAO,QAC5B,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAAA,CACzB,MAAA,CAAQsa,EAAAA,CAAkBQ,GAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAID,OAAO07B,GAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAAA,CACA,KAAA,CAAOG,EACT,CAAC,CACH,CAOO,SAASK,EAAAA,CACd5hC,EACAhR,CAAAA,CACAsZ,CAAAA,CAAU,IAAA,CACV,CACA,OAAO/B,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,OAAO,mBAAA,CAAoB2D,CAAAA,CAAMhR,CAAG,CAAA,CACxD,gBAAA,CAAkB,CAAE,GAAA,CAAK,MAAA,CAAW,WAAA,CAAa,IAAK,CAAA,CAEtD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAwX,EAAW,MAAA,CAAAze,CAAO,CAAA,GAAqD,CACvF,GAAI,CAACye,EAAU,WAAA,CACb,OAAO,CACL,IAAA,CAAM,CAAA,CACN,KAAM,CAAA,CACN,OAAA,CAAS,EACX,CAAA,CAGF,IAAIq7B,CAAAA,CACEn9C,CAAAA,CAAM,IAAI,IAAA,CAEhB,OAAQsK,GACN,KAAK,OAAA,CACH6yC,CAAAA,CAAY,IAAI,IAAA,CAAKn9C,EAAI,OAAA,EAAQ,CAAI,KAAU,EAAA,CAAK,GAAI,EACxD,MACF,KAAK,MAAA,CACHm9C,CAAAA,CAAY,IAAI,IAAA,CAAKn9C,EAAI,OAAA,EAAQ,CAAI,MAAc,EAAA,CAAK,GAAI,EAC5D,MACF,KAAK,OAAA,CACHm9C,CAAAA,CAAY,IAAI,IAAA,CAAKn9C,EAAI,OAAA,EAAQ,CAAI,IAAU,EAAA,CAAK,EAAA,CAAK,GAAI,CAAA,CAC7D,MACF,KAAK,MAAA,CACHm9C,CAAAA,CAAY,IAAI,IAAA,CAAKn9C,CAAAA,CAAI,SAAQ,CAAI,GAAA,CAAM,GAAK,EAAA,CAAK,EAAA,CAAK,GAAI,CAAA,CAC9D,MACF,QACEm9C,EAAY,OAChB,CAEA,IAAMliC,CAAAA,CAAI,aAAA,CACJpB,EAAOyB,CAAAA,GAAS,QAAA,CAAW,UAAA,CAAaA,CAAAA,CACxCH,CAAAA,CAAQgiC,CAAAA,CAAYA,EAAU,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAI,MAAA,CAC5DjiC,CAAAA,CAAU,GAAA,CACVG,CAAAA,CAAQ/Q,CAAAA,GAAQ,QAAU,EAAA,CAAK,GAAA,CAE/BlS,EAOF,CAAE,CAAA,CAAA6iB,EAAG,IAAA,CAAApB,CAAAA,CAAM,SAAUqB,CAAQ,CAAA,CAE7BC,IAAO/iB,CAAAA,CAAK,KAAA,CAAQ+iB,GACpB2G,CAAAA,CAAU,GAAA,GAAK1pB,EAAK,SAAA,CAAY0pB,CAAAA,CAAU,GAAA,CAAA,CAC1CzG,CAAOjjB,CAAAA,CAAK,KAAA,CAAQijB,GAExB,IAAM7U,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,oBAAA,CAAsB,CACzE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAAA,CAChB,iBAAA,CAAmBA,EAAO,QAC5B,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAAA,CACzB,MAAA,CAAQsa,EAAAA,CAAkBQ,GAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAID,OAAO07B,GAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAAA,CAEA,gBAAA,CAAmBl3B,IACV,CACL,GAAA,CAAKA,GAAM,SAAA,CACX,WAAA,CAAaA,EAAK,OAAA,CAAQ,MAAA,CAAS,CACrC,CAAA,CAAA,CAGF,OAAA,CAAA5B,CAAAA,CACA,MAAOi5B,EACT,CAAC,CACH,CCzIA,eAAsBd,EAAAA,CACpB9gC,CAAAA,CACApB,CAAAA,CACAqB,EACAC,CAAAA,CACA8hC,CAAAA,CACA5hC,EACAhY,CAAAA,CACyB,CACzB,IAAMjL,CAAAA,CAOF,CAAE,CAAA,CAAA6iB,CAAAA,CAAG,IAAA,CAAApB,CAAAA,CAAM,SAAUqB,CAAQ,CAAA,CAE7BC,IACF/iB,CAAAA,CAAK,KAAA,CAAQ+iB,GAEX8hC,CAAAA,GACF7kD,CAAAA,CAAK,UAAY6kD,CAAAA,CAAAA,CAEf5hC,CAAAA,GACFjjB,EAAK,KAAA,CAAQijB,CAAAA,CAAAA,CAIf,IAAM7U,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,oBAAA,CAAsB,CAC5E,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAAA,CAChB,iBAAA,CAAmBA,EAAO,QAC5B,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,EACzB,MAAA,CAAQsa,EAAAA,CAAkBQ,GAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAED,OAAO07B,EAAAA,CAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAEA,eAAsBU,EAAAA,CACpBt6C,EAQAO,CAAAA,CACAsP,CAAAA,CAAoBO,GACK,CAEzB,IAAM1M,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,sBAAuB,CAC7E,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,iBAAA,CAAmBA,CAAAA,CAAO,QAC5B,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU1Q,CAAM,EAC3B,MAAA,CAAQ4P,EAAAA,CAAkBC,CAAAA,CAAWtP,CAAM,CAC7C,CAAC,EAED,OAAO07B,EAAAA,CAAkCv4B,EAAUk2C,EAAgB,CACrE,CAEA,eAAsBW,EAAAA,CAAWpiC,CAAAA,CAAW5X,CAAAA,CAAyC,CAEnF,IAAMmD,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,0BAA2B,CACjF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAAA,CAChB,iBAAA,CAAmBA,EAAO,QAC5B,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,CAAA,CAAAyH,CAAE,CAAC,EAC1B,MAAA,CAAQvI,EAAAA,CAAkBQ,GAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAEKjL,CAAAA,CAAO,MAAM2mC,EAAAA,CAA4Bv4B,CAAAA,CAAU,KAAA,CAAM,OAAO,CAAA,CACtE,OAAOpO,GAAM,MAAA,CAAS,CAAA,CAAIA,EAAO,CAAC6iB,CAAC,CACrC,CC7EA,IAAMqiC,EAAAA,CAA2B,KAAW,EAAA,CAAK,EAAA,CAAK,IAGhDC,EAAAA,CAAyB,CAAA,CAIzBC,GAA6B,GAAA,CAO7BC,EAAAA,CAAiC,IASjCC,EAAAA,CAAoC,GAAA,CAI7BC,GAA6B,EAK1C,SAASC,GAAa16C,CAAAA,CAAc/M,CAAAA,CAAuB,CACzD,OAAO+M,CAAAA,CACJ,OAAA,CAAQ,uBAAA,CAAyB,GAAG,CAAA,CACpC,QAAQ,wBAAA,CAA0B,IAAI,EACtC,OAAA,CAAQ,UAAA,CAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,iBAAA,CAAmB,GAAG,CAAA,CAC9B,OAAA,CAAQ,OAAQ,GAAG,CAAA,CACnB,MAAK,CACL,KAAA,CAAM,EAAG/M,CAAK,CACnB,CAMA,SAAS0nD,EAAAA,CAAY/pD,CAAAA,CAAmB,CACtC,IAAI8L,CAAAA,CAAI,KACR,IAAA,IAAS5L,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAE,OAAQE,CAAAA,EAAAA,CAC5B4L,CAAAA,CAAAA,CAAMA,GAAK,CAAA,EAAKA,CAAAA,CAAI9L,EAAE,UAAA,CAAWE,CAAC,EAAK,CAAA,CAEzC,OAAA,CAAQ4L,CAAAA,GAAM,CAAA,EAAG,QAAA,CAAS,EAAE,CAC9B,CAgBO,SAASk+C,GAA8Bl7B,CAAAA,CAAc,CAC1D,IAAM2H,CAAAA,CAAQ3H,CAAAA,CAAM,KAAA,EAAS,EAAA,CAKvBm7B,CAAAA,CAAUn7B,CAAAA,CAAM,eAAe,IAAA,CAC/BsB,CAAAA,CAAAA,CAAQ,MAAM,OAAA,CAAQ65B,CAAO,EAAIA,CAAAA,CAAU,EAAC,EAAG,MAAA,CAClDzzC,CAAAA,EAAuB,OAAOA,GAAQ,QAAA,EAAYA,CAAAA,GAAQ,EAC7D,CAAA,CACMpH,CAAAA,CAAO06C,GAAah7B,CAAAA,CAAM,IAAA,EAAQ,GAAI46B,EAA0B,CAAA,CAChEQ,EAAaH,EAAAA,CAAY,CAAA,EAAGtzB,CAAK,CAAA,CAAA,EAAIrG,CAAAA,CAAK,KAAK,GAAG,CAAC,CAAA,CAAA,EAAIhhB,CAAI,CAAA,CAAE,CAAA,CAEnE,OAAOwU,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,MAAA,CAAO,eAAeiL,CAAAA,CAAM,MAAA,CAAQA,CAAAA,CAAM,QAAA,CAAUo7B,CAAU,CAAA,CAClF,QAAS,MAAO,CAAE,OAAA36C,CAAO,CAAA,GAAM,CAG7B,IAAM8X,CAAAA,CAAQ,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAQmiC,EAAwB,CAAA,CAAE,aAAY,CAAE,KAAA,CAAM,EAAG,EAAE,CAAA,CAMjF92C,EAAW,MAAM42C,EAAAA,CACrB,CACE,MAAA,CAAQx6B,CAAAA,CAAM,OACd,QAAA,CAAUA,CAAAA,CAAM,SAChB,KAAA,CAAA2H,CAAAA,CACA,IAAA,CAAArnB,CAAAA,CACA,IAAA,CAAAghB,CAAAA,CACA,MAAA/I,CACF,CAAA,CACA9X,EAIA,OAAO,MAAA,CAAW,IACdo6C,EAAAA,CACAC,EACN,CAAA,CAIMO,CAAAA,CAA4B,EAAC,CAC7BC,EAAc,IAAI,GAAA,CACxB,QAAWpmD,CAAAA,IAAK0O,CAAAA,CAAS,QAAS,CAChC,GAAIy3C,CAAAA,CAAU,MAAA,EAAUV,EAAAA,CAAwB,MAC5CzlD,EAAE,QAAA,GAAa8qB,CAAAA,CAAM,WACpB9qB,CAAAA,CAAE,IAAA,EAAQ,EAAC,EAAG,OAAA,CAAQ,MAAM,CAAA,GAAM,EAAA,GACnComD,EAAY,GAAA,CAAIpmD,CAAAA,CAAE,MAAM,CAAA,GAC5BomD,CAAAA,CAAY,IAAIpmD,CAAAA,CAAE,MAAM,CAAA,CACxBmmD,CAAAA,CAAU,IAAA,CAAKnmD,CAAC,IAClB,CAEA,OAAOmmD,CACT,CAAA,CAWA,SAAA,CAAW,IAAS,GAAA,CAKpB,KAAA,CAAO,KACT,CAAC,CACH,CClJO,SAASE,EAAAA,CAA6BljC,EAAW9kB,CAAAA,CAAQ,CAAA,CAAG,CACjE,IAAM61B,CAAAA,CAAa/Q,CAAAA,CAAE,MAAK,CAE1B,OAAOvD,aAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,OAAA,CAAQqU,EAAY71B,CAAK,CAAA,CACpD,QAAS,SAAgC,CACvC,IAAM8jB,CAAAA,CAAa,MAAMhV,EAAQ,+BAAA,CAAiC,CAChE+mB,CAAAA,CACA71B,CACF,CAAC,CAAA,CAED,OAAI8jB,CAAAA,CAAU,MAAA,GAAW,EAChB,EAAC,CAGHgN,GAAYhN,CAAS,CAC9B,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+R,CACb,CAAC,CACH,CCpBO,SAASoyB,EAAAA,CAA4BnjC,CAAAA,CAAW9kB,CAAAA,CAAQ,EAAA,CAAI,CACjE,IAAM61B,CAAAA,CAAa/Q,EAAE,IAAA,EAAK,CAE1B,OAAOvD,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,MAAA,CAAO,OAAOqU,CAAAA,CAAY71B,CAAK,EACnD,OAAA,CAAS,SAAA,CACO,MAAM8O,CAAAA,CAAQ,iCAAA,CAAmC,CAC7D+mB,CAAAA,CACA71B,CAAAA,CAAQ,CACV,CAAC,CAAA,EAGE,GAAA,CAAK2/C,GAAMA,CAAAA,CAAE,IAAI,EACjB,MAAA,CAAQj7B,CAAAA,EAASA,CAAAA,GAAS,EAAA,EAAM,CAACA,CAAAA,CAAK,WAAW,OAAO,CAAC,EACzD,KAAA,CAAM,CAAA,CAAG1kB,CAAK,CAAA,CAEnB,OAAA,CAAS,CAAC,CAAC61B,CACb,CAAC,CACH,CCjBO,SAASqyB,EAAAA,CACdpjC,CAAAA,CACApB,EACAqB,CAAAA,CACAC,CAAAA,CACAE,EACAG,CAAAA,CACA,CACA,OAAOqG,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,MAAA,CAAO,GAAA,CAAIsD,CAAAA,CAAGpB,CAAAA,CAAMqB,CAAAA,CAASC,EAAOE,CAAAA,CAAOG,CAAW,EAC1E,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAsG,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAA8D,CAWhG,IAAM8O,CAAAA,CAA4B,CAAE,EAAA8I,CAAAA,CAAG,IAAA,CAAApB,EAAM,QAAA,CAAUqB,CAAQ,CAAA,CAE3DC,CAAAA,GACFhJ,CAAAA,CAAQ,KAAA,CAAQgJ,GAEd2G,CAAAA,GACF3P,CAAAA,CAAQ,UAAY2P,CAAAA,CAAAA,CAElBzG,CAAAA,GAAU,SACZlJ,CAAAA,CAAQ,KAAA,CAAQkJ,GAEdG,CAAAA,GACFrJ,CAAAA,CAAQ,aAAe,CAAA,CAAA,CAGzB,IAAM3L,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,oBAAA,CAAsB,CACzE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,kBAAmBA,CAAAA,CAAO,QAC5B,EACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUrB,CAAO,CAAA,CAC5B,MAAA,CAAQO,GAAkBQ,EAAAA,CAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAID,OAAO07B,EAAAA,CAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAAA,CACA,gBAAA,CAAkB,OAClB,gBAAA,CAAmB16B,CAAAA,EAA6BA,GAAU,SAAA,CAC1D,OAAA,CAAS,CAAC,CAAC/G,CAAAA,CACX,MAAO4hC,EACT,CAAC,CACH,CC1DO,SAASyB,EAAAA,CAA0BrjC,CAAAA,CAAW,CACnD,OAAOvD,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,OAAQuD,CAAC,CAAA,CAC9B,QAAS,SAAY,CACnB,IAAMzU,CAAAA,CAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,yBAAA,CAA2B,CAC9E,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,iBAAA,CAAmBA,CAAAA,CAAO,QAC5B,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,CAAA,CAAAyH,CAAE,CAAC,CAC5B,CAAC,CAAA,CAED,GAAI,CAACzU,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,uBAAuBA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG1D,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,GAE5B,OAAIpO,CAAAA,EAAM,OAAS,CAAA,CACVA,CAAAA,CAGF,CAAC6iB,CAAC,CACX,CACF,CAAC,CACH,CCnBA,eAAsBsjC,EAAAA,CAA0B//C,CAAAA,CAAwC,CAEtF,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,+BAAA,CAAiC,CACvF,MAAA,CAAQ,MAAA,CACR,QAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAAhV,CAAK,CAAC,CAC/B,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAIpO,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,GACxB,MAAQ,CAER,CACA,IAAM7N,CAAAA,CACHP,CAAAA,EAA+B,SAChC,CAAA,kCAAA,EAAqCoO,CAAAA,CAAS,MAAM,CAAA,CAAA,CAChDtE,CAAAA,CAAM,IAAI,MAAMvJ,CAAO,CAAA,CAC7B,MAAAuJ,CAAAA,CAAI,MAAA,CAASsE,EAAS,MAAA,CACtBtE,CAAAA,CAAI,KAAO9J,CAAAA,CACL8J,CACR,CAEA,OAAQ,MAAMsE,EAAS,IAAA,EACzB,CAOO,SAASg4C,EAAAA,CACdx1C,CAAAA,CACAxK,CAAAA,CACA,CACA,IAAMqc,EAAO7R,CAAAA,EAAU,OAAA,CAAQ,IAAK,EAAE,CAAA,CAEtC,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,OAAA,CAAQ,QAAA,CAASkD,CAAI,CAAA,CACzC,OAAA,CAAS,IAAM,CACb,GAAI,CAACrc,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAAA,CAE/C,OAAO+/C,EAAAA,CAA0B//C,CAAI,CACvC,CAAA,CACA,OAAA,CAAS,CAAC,CAACqc,CAAAA,EAAQ,CAAC,CAACrc,CACvB,CAAC,CACH,CC/CA,eAAsBigD,EAAAA,CACpBjgD,CAAAA,CACA2T,CAAAA,CAC0B,CAE1B,IAAM3L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,sCAAA,CAAwC,CAC9F,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,EAC9C,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,mBAAA,CAAqB2T,CAAAA,CAAQ,mBAAA,CAC7B,iBAAkBA,CAAAA,CAAQ,gBAC5B,CAAC,CACH,CAAC,EAED,GAAI,CAAC3L,EAAS,EAAA,CAAI,CAChB,IAAIpO,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,MAAMoO,EAAS,IAAA,GACxB,CAAA,KAAQ,CAER,CACA,IAAM7N,EACHP,CAAAA,EAA+B,OAAA,EAChC,sCAAsCoO,CAAAA,CAAS,MAAM,GACjDtE,CAAAA,CAAM,IAAI,KAAA,CAAMvJ,CAAO,CAAA,CAC7B,MAAAuJ,EAAI,MAAA,CAASsE,CAAAA,CAAS,OACtBtE,CAAAA,CAAI,IAAA,CAAO9J,EACL8J,CACR,CAEA,OAAQ,MAAMsE,CAAAA,CAAS,IAAA,EACzB,CAOO,SAASk4C,GACdhwB,CAAAA,CACA1lB,CAAAA,CACA5Q,EACA,CACA,OAAAs2B,EAAY,YAAA,CAAa/W,CAAAA,CAAU,QAAQ,QAAA,CAAS3O,CAAQ,EAAG5Q,CAAI,CAAA,CAC5Ds2B,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAU/W,CAAAA,CAAU,OAAA,CAAQ,QAAA,CAAS3O,CAAQ,CAAE,CAAC,CACzF,CAQO,SAAS21C,GACd31C,CAAAA,CACAxK,CAAAA,CACA,CACA,IAAMkwB,CAAAA,CAAcC,cAAAA,GACd9T,CAAAA,CAAO7R,CAAAA,EAAU,QAAQ,GAAA,CAAK,EAAE,EAEtC,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,SAAA,CAAW,kBAAmB2I,CAAI,CAAA,CAChD,WAAY,MAAO1I,CAAAA,EAA0C,CAC3D,GAAI,CAAC0I,GAAQ,CAACrc,CAAAA,CACZ,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAAA,CAE/C,OAAOigD,GAA6BjgD,CAAAA,CAAM2T,CAAO,CACnD,CAAA,CACA,SAAA,CAAU/Z,CAAAA,CAAM,CACVyiB,CAAAA,EACF6jC,EAAAA,CAA2BhwB,EAAa7T,CAAAA,CAAMziB,CAAI,EAEtD,CACF,CAAC,CACH,CClFO,SAASwmD,GAA+BvsC,CAAAA,CAAqB,CAClE,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,mBAAmB,EAC5C,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrF,EACH,OAAO,GAGT,IAAM7L,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,+BAAA,CAAiC,CACpF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,mCAAA,EAAsCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGzE,OAAO,MAAMA,CAAAA,CAAS,IAAA,EACxB,CAAA,CACA,SAAA,CAAW,IACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCpBO,SAASwsC,EAAAA,CAAkCxsC,CAAAA,CAAqB,CACrE,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,sBAAsB,CAAA,CAC/C,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrF,CAAAA,CACH,OAAO,EAAC,CAGV,IAAM7L,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,kCAAA,CAAoC,CACvF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,EAED,GAAI,CAAC7L,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyCA,EAAS,MAAM,CAAA,CAAE,CAAA,CAG5E,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAAA,CACA,UAAW,CAAA,CAAA,CAAA,CACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCrBO,SAASysC,EAAAA,CAAkC91C,CAAAA,CAAkBqJ,EAAqB,CACvF,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,aAAc,sBAAA,CAAwB1O,CAAQ,EACzD,OAAA,CAAS,SAAgD,CACvD,GAAI,CAACqJ,GAAe,CAACrJ,CAAAA,CACnB,OAAO,IAAA,CAGT,IAAMxC,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,mCAAA,CAAqC,CACxF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAMnB,CAAAA,CAAa,QAAA,CAAArJ,CAAS,CAAC,CACtD,CAAC,CAAA,CAED,GAAI,CAACxC,CAAAA,CAAS,GACZ,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG5E,IAAMu4C,EAAgB,MAAMv4C,CAAAA,CAAS,MAAK,CAE1C,OAAOu4C,GAAgBA,CAAAA,CAAa,OAAA,EAAWA,EAAa,IAAA,CACxD,CAAE,KAAMA,CAAAA,CAAa,IAAA,CAAM,QAAS,IAAI,IAAA,CAAKA,CAAAA,CAAa,OAAO,CAAE,CAAA,CACnE,IACN,CAAA,CACA,OAAA,CAAS,CAAC,CAAC/1C,CAAAA,EAAY,CAAC,CAACqJ,CAC3B,CAAC,CACH,CCrCO,SAAS2sC,EAAAA,CAA4B3sC,CAAAA,CAAqB,CAC/D,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,eAAe,CAAA,CACxC,OAAA,CAAS,SAAY,CACnB,IAAMlR,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,4BAAA,CAA8B,CACjF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCA,EAAS,MAAM,CAAA,CAAE,EAGtE,OAAO,MAAMA,EAAS,IAAA,EACxB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CChBO,SAAS4sC,GAAsCjwC,CAAAA,CAAiBqD,CAAAA,CAAqB,CAC1F,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,aAAc,qBAAA,CAAuB1I,CAAO,CAAA,CACvD,OAAA,CAAS,SAAmD,CAC1D,GAAI,CAACqD,CAAAA,EAAe,CAACrD,CAAAA,CACnB,OAAO,KAGT,IAAMxI,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,cAAA,CAAiB,oCAAqC,CACxF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,KAAMnB,CAAAA,CAAa,OAAA,CAAArD,CAAQ,CAAC,CACrD,CAAC,CAAA,CAED,GAAI,CAACxI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,8CAA8CA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGjF,IAAMu4C,CAAAA,CAAe,MAAMv4C,CAAAA,CAAS,IAAA,GAKpC,OAAOu4C,CAAAA,CACH,CACE,OAAA,CAASA,CAAAA,CAAa,QACtB,OAAA,CAAS,IAAI,IAAA,CAAKA,CAAAA,CAAa,OAAO,CACxC,EACA,IACN,CAAA,CACA,QAAS,CAAC,CAAC/vC,GAAW,CAAC,CAACqD,CAC1B,CAAC,CACH,CChCO,SAAS6sC,EAAAA,CACdl2C,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAc,YAAY,CAAA,CAC3B/I,EACA,CAAC,CAAE,QAAAgG,CAAAA,CAAS,QAAA,CAAAiG,CAAS,CAAA,GAAM,CACzBkiB,EAAAA,CAAiBnuB,CAAAA,CAAWgG,CAAAA,CAASiG,CAAQ,CAC/C,CAAA,CACA,MAAO2Z,EAAO,CAAE,OAAA,CAAA5f,CAAQ,CAAA,GAAM,CACxByB,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,UAAA,CAAW,iBAAA,CAAkB3I,CAAO,CAChD,CAAC,EAEL,EACAyB,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CClBO,SAASsuC,EAAAA,CACdn2C,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,YAAA,CAAc,eAAe,CAAA,CAC9B/I,CAAAA,CACA,CAAC,CAAE,QAAA,CAAAiM,CAAS,CAAA,GAAM,CAACmiB,GAAoBpuB,CAAAA,CAAWiM,CAAQ,CAAC,CAAA,CAC3D,SAAY,CACNxE,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,EAAU,eAAA,CAAgB,OAAA,CAAQ3O,CAAS,CAAA,CAC3C,CAAC,aAAc,sBAAA,CAAwBA,CAAQ,CACjD,CAAC,EAEL,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CChCA,eAAsBuuC,EAAAA,CAAa5gD,CAAAA,CAA6C,CAE9E,IAAMgI,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAC/B,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,GAAI,CAChB,IAAIpO,EACJ,GAAI,CACFA,EAAO,MAAMoO,CAAAA,CAAS,OACxB,CAAA,KAAQ,CACNpO,CAAAA,CAAO,OACT,CACA,IAAM6D,CAAAA,CAAQ,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4BuK,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CACrE,MAAAvK,CAAAA,CAAM,MAAA,CAASuK,EAAS,MAAA,CACxBvK,CAAAA,CAAM,IAAA,CAAO7D,CAAAA,CACP6D,CACR,CAGA,OADc,MAAMuK,CAAAA,CAAS,MAE/B,CC3BA,IAAM64C,EAAAA,CACJ,4FAAA,CAEK,SAASC,EAAAA,EAA2B,CACzC,OAAO5nC,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,SAAA,CAAU,IAAA,EAAK,CACnC,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAtU,CAAO,IAAM,CAC7B,IAAMmD,EAAW,MAAM,KAAA,CAAM64C,EAAAA,CAAgB,CAAE,MAAA,CAAAh8C,CAAO,CAAC,CAAA,CAEvD,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGvE,IAAMjI,CAAAA,CAAO,MAAMiI,CAAAA,CAAS,IAAA,GAC5B,OAAO,IAAI,GAAA,CAAIjI,CAAAA,CAAK,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,OAAO,OAAO,CAAC,CACjD,CAAA,CACA,SAAA,CAAW,IAAA,CAAU,EAAA,CAAK,GAAA,CAY1B,MAAA,CAAQ,GACV,CAAC,CACH,CCjCO,IAAMghD,EAAAA,CAAyB,GAAA,CAE1BC,QACVA,CAAAA,CAAA,eAAA,CAAkB,iBAAA,CAClBA,CAAAA,CAAA,MAAA,CAAS,QAAA,CAFCA,QAAA,EAAA,EA4DL,SAASC,EAAAA,CAA4BC,CAAAA,CAAqC,CAC/E,OAAKA,EAIEA,CAAAA,CAAY,GAAA,CAAI,CAACC,CAAAA,CAAQlhB,CAAAA,IAAW,CACzC,WAAYA,CAAAA,CAAQ,CAAA,CACpB,WAAA,CAAakhB,CAAAA,CACb,KAAA,CAAO,CACL,YAAa,CAAA,CACb,OAAA,CAAS,CAAA,CACT,eAAA,CAAiB,CAAA,CACjB,oBAAA,CAAsB,CACxB,CACF,CAAA,CAAE,EAZO,EAaX,CCxEA,SAASC,EAAAA,CAAcnD,CAAAA,CAAoC,CACzD,IAAMoD,CAAAA,CAAepD,CAAAA,CAAI,cAA0D,EAAC,CAC9EqD,CAAAA,CAAcrD,CAAAA,CAAI,WAAA,EAAyD,GAC3EsD,CAAAA,CAAWtD,CAAAA,CAAI,UAAA,CAEfuD,CAAAA,CAAwBH,CAAAA,CAAY,GAAA,CAAK5rD,GAAM,CACnD,IAAMonB,CAAAA,CAAQpnB,CAAAA,CAAE,KAAA,CAChB,OAAO,CACL,UAAA,CAAaA,CAAAA,CAAE,UAAA,EAAyB,CAAA,CACxC,WAAA,CAAcA,CAAAA,CAAE,aAA0B,EAAA,CAC1C,KAAA,CAAOonB,CAAAA,CACH,CACE,WAAA,CAAcA,CAAAA,CAAM,aAA0B,CAAA,CAC9C,OAAA,CAASA,EAAM,OAAA,CACf,eAAA,CAAiBA,EAAM,eAAA,CACvB,oBAAA,CAAuBA,CAAAA,CAAM,oBAAA,EAA0C,IACzE,CAAA,CACA,MACN,CACF,CAAC,CAAA,CAEK4kC,CAAAA,CAAsBH,CAAAA,CAAW,GAAA,CAAK9nD,IAAO,CACjD,IAAA,CAAOA,CAAAA,CAAE,IAAA,EAAmB,EAAA,CAC5B,OAAA,CAAUA,EAAE,OAAA,EAAwB,EAAC,CACrC,OAAA,CAASA,CAAAA,CAAE,OAAA,CACX,gBAAiBA,CAAAA,CAAE,eAAA,CACnB,oBAAA,CAAsBA,CAAAA,CAAE,oBAC1B,CAAA,CAAE,EAEIimB,CAAAA,CAA+B8hC,CAAAA,CACjC,CACE,yBAAA,CAA4BA,CAAAA,CAAS,yBAAA,EAAwC,EAC7E,aAAA,CAAeA,CAAAA,CAAS,aAAA,CACxB,qBAAA,CAAuBA,CAAAA,CAAS,qBAAA,CAChC,2BAA6BA,CAAAA,CAAS,0BAAA,EAAgD,IACxF,CAAA,CACA,MAAA,CAEJ,OAAO,CACL,MAAA,CAAStD,CAAAA,CAAI,MAAA,EAAqB,EAAA,CAClC,QAAA,CAAWA,EAAI,QAAA,EAAuB,EAAA,CACtC,QAAA,CAAWA,CAAAA,CAAI,QAAA,EAAuB,EAAA,CACtC,aAAcuD,CAAAA,CACd,WAAA,CAAaC,CAAAA,CACb,UAAA,CAAYhiC,CAAAA,CACZ,WAAA,CAAcw+B,EAAI,WAAA,EAA0B,EAAA,CAC5C,MAAA,CAASA,CAAAA,CAAI,MAAA,EAAqB,EAAA,CAClC,SAAWA,CAAAA,CAAI,QAAA,EAAuB,EAAA,CACtC,wBAAA,CAA2BA,CAAAA,CAAI,wBAAA,EAAuC,kBACtE,iBAAA,CAAoBA,CAAAA,CAAI,iBAAA,EAAgC,CAAA,CACxD,uBAAA,CAA0BA,CAAAA,CAAI,yBAAsC,CAAA,CACpE,gBAAA,CAAmBA,CAAAA,CAAI,gBAAA,EAA+B,CAAA,CACtD,OAAA,CAAUA,EAAI,OAAA,EAAsB,EAAA,CACpC,WAAaA,CAAAA,CAAI,UAAA,EAAyB,GAC1C,SAAA,CAAYA,CAAAA,CAAI,SAAA,EAAwB,EAAA,CACxC,eAAA,CAAkBA,CAAAA,CAAI,iBAA8B,EAAA,CACpD,IAAA,CAAOA,CAAAA,CAAI,IAAA,EAAqB,EAAC,CACjC,MAAQA,CAAAA,CAAI,KAAA,EAAuB,EAAC,CACpC,KAAA,CAAOA,CAAAA,CAAI,MACX,oBAAA,CAAsBA,CAAAA,CAAI,oBAAA,CAC1B,kBAAA,CAAoBA,CAAAA,CAAI,kBAAA,CACxB,wBAA0BA,CAAAA,CAAI,uBAAA,EAAmD,KAAA,CACjF,QAAA,CAAUA,CAAAA,CAAI,QAChB,CACF,CAEO,SAASyD,EAAAA,CACd3mC,CAAAA,CACAC,CAAAA,CACA,CACA,OAAO9B,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,OAAA,CAAQ4B,GAAU,EAAA,CAAIC,CAAAA,EAAY,EAAE,CAAA,CAC9D,OAAA,CAAS,CAAC,CAACD,CAAAA,EAAU,CAAC,CAACC,CAAAA,CAIvB,MAAA,CAAQojC,SAAWzpC,EAAAA,CAAoB,IAAA,CAAU,GAAA,CACjD,OAAA,CAAS,SAA2B,CAClC,GAAI,CAACoG,CAAAA,EAAU,CAACC,CAAAA,CACd,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAG7D,IAAM2mB,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBpU,EAAM,CAAA,EAAG2Q,CAAAA,CAAO,YAAY,CAAA,oBAAA,EAAuB,kBAAA,CAAmB+F,CAAM,CAAC,CAAA,aAAA,EAAgB,kBAAA,CAAmBC,CAAQ,CAAC,CAAA,CAAA,CACzHhT,CAAAA,CAAW,MAAM25B,CAAAA,CAASt9B,CAAG,CAAA,CAEnC,GAAI,CAAC2D,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,kCAAA,EAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,MAAK,CAEjC,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQpO,CAAI,GAAK,CAACA,CAAAA,CAAK,CAAC,CAAA,CACjC,MAAM,IAAI,MAAM,wCAAmC,CAAA,CAGrD,OAAOwnD,EAAAA,CAAcxnD,CAAAA,CAAK,CAAC,CAAC,CAC9B,CACF,CAAC,CACH,CChGO,SAAS+nD,GACdn3C,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL4F,EAAU,KAAA,CAAM,IAAA,EAAK,CACrB3O,CAAAA,EAAY,EAAA,CACZ,CAAC,CAAE,SAAA,CAAAo3C,CAAAA,CAAW,QAAAJ,CAAQ,CAAA,GAAM,CAC1B,GAAI,CAACh3C,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAE9E,OAAO,CACL,CACE,aAAA,CACA,CACE,GAAI,OAAA,CACJ,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACA,CAAQ,CAAA,CACjC,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAMo3C,EACN,MAAA,CAAQ,MAAA,CACR,OAAA,CAAAJ,CACF,CAAC,CACH,CACF,CACF,CACF,CAAA,CACA,MAAA,CACAvvC,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF","file":"index.js","sourcesContent":["/**\n * @license bytebuffer.ts (c) 2015 Daniel Wirtz \n * Backing buffer: ArrayBuffer, Accessor: DataView\n * Released under the Apache License, Version 2.0\n * see: https://github.com/dcodeIO/bytebuffer.ts for details\n * modified by @xmcl/bytebuffer\n * And customized for hive-tx\n */\n\nconst EMPTY_BUFFER = new ArrayBuffer(0)\n\n// Lazy-init to avoid crashing on runtimes that lack TextEncoder/TextDecoder\n// (notably React Native with Hermes). Falls back to manual UTF-8 encode/decode.\nlet _encoder: { encode(s: string): Uint8Array } | null = null\nlet _decoder: { decode(b: BufferSource): string } | null = null\n\nfunction getEncoder(): { encode(s: string): Uint8Array } {\n if (!_encoder) {\n if (typeof TextEncoder !== 'undefined') {\n _encoder = new TextEncoder()\n } else {\n _encoder = {\n encode(s: string): Uint8Array {\n // Manual UTF-8 encode fallback\n const utf8: number[] = []\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i)\n if (c < 0x80) {\n utf8.push(c)\n } else if (c < 0x800) {\n utf8.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {\n const next = s.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n utf8.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n utf8.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n return new Uint8Array(utf8)\n },\n }\n }\n }\n return _encoder\n}\n\nfunction getDecoder(): { decode(b: BufferSource): string } {\n if (!_decoder) {\n if (typeof TextDecoder !== 'undefined') {\n _decoder = new TextDecoder()\n } else {\n _decoder = {\n decode(b: BufferSource): string {\n const bytes = b instanceof ArrayBuffer ? new Uint8Array(b) : new Uint8Array((b as ArrayBufferView).buffer, (b as ArrayBufferView).byteOffset, (b as ArrayBufferView).byteLength)\n let result = ''\n for (let i = 0; i < bytes.length; ) {\n const byte = bytes[i]\n let codePoint: number\n if (byte < 0x80) { codePoint = byte; i += 1 }\n else if ((byte & 0xe0) === 0xc0) { codePoint = ((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f); i += 2 }\n else if ((byte & 0xf0) === 0xe0) { codePoint = ((byte & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f); i += 3 }\n else { codePoint = ((byte & 0x07) << 18) | ((bytes[i + 1] & 0x3f) << 12) | ((bytes[i + 2] & 0x3f) << 6) | (bytes[i + 3] & 0x3f); i += 4 }\n if (codePoint <= 0xffff) { result += String.fromCharCode(codePoint) }\n else { codePoint -= 0x10000; result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff)) }\n }\n return result\n },\n }\n }\n }\n return _decoder\n}\n\nexport class ByteBuffer {\n static LITTLE_ENDIAN = true\n static BIG_ENDIAN = false\n static DEFAULT_CAPACITY = 16\n static DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN\n\n buffer: ArrayBufferLike\n view: DataView\n offset: number\n markedOffset: number\n limit: number\n littleEndian: boolean\n\n constructor(\n capacity: number = ByteBuffer.DEFAULT_CAPACITY,\n littleEndian: boolean = ByteBuffer.DEFAULT_ENDIAN\n ) {\n this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity)\n this.view = capacity === 0 ? new DataView(EMPTY_BUFFER) : new DataView(this.buffer)\n this.offset = 0\n this.markedOffset = -1\n this.limit = capacity\n this.littleEndian = littleEndian\n }\n\n static allocate(capacity?: number, littleEndian?: boolean): ByteBuffer {\n return new ByteBuffer(capacity, littleEndian)\n }\n\n static concat(\n buffers: Array,\n littleEndian?: boolean\n ): ByteBuffer {\n let capacity = 0\n for (let i = 0; i < buffers.length; ++i) {\n const buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n capacity += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n capacity += buf.length\n } else if (buf instanceof ArrayBuffer) {\n capacity += buf.byteLength\n } else if (Array.isArray(buf)) {\n capacity += buf.length\n } else {\n throw TypeError('Illegal buffer')\n }\n }\n\n if (capacity === 0) {\n return new ByteBuffer(0, littleEndian)\n }\n\n const bb = new ByteBuffer(capacity, littleEndian)\n const view = new Uint8Array(bb.buffer)\n let offset = 0\n\n for (let i = 0; i < buffers.length; ++i) {\n let buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n view.set(new Uint8Array(buf.buffer, buf.offset, buf.limit - buf.offset), offset)\n offset += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n view.set(buf, offset)\n offset += buf.length\n } else if (buf instanceof ArrayBuffer) {\n view.set(new Uint8Array(buf), offset)\n offset += buf.byteLength\n } else {\n // Array\n view.set(buf as number[], offset)\n offset += (buf as number[]).length\n }\n }\n\n bb.limit = bb.offset = offset\n bb.offset = 0\n return bb\n }\n\n static wrap(\n buffer: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n littleEndian?: boolean\n ): ByteBuffer {\n if (buffer instanceof ByteBuffer) {\n const bb = buffer.clone()\n bb.markedOffset = -1\n return bb\n }\n\n let bb: ByteBuffer\n if (buffer instanceof Uint8Array) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.length > 0) {\n bb.buffer = buffer.buffer\n bb.offset = buffer.byteOffset\n bb.limit = buffer.byteOffset + buffer.byteLength\n bb.view = new DataView(buffer.buffer)\n }\n } else if (buffer instanceof ArrayBuffer) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.byteLength > 0) {\n bb.buffer = buffer\n bb.offset = 0\n bb.limit = buffer.byteLength\n bb.view = buffer.byteLength > 0 ? new DataView(buffer) : new DataView(EMPTY_BUFFER)\n }\n } else if (Array.isArray(buffer)) {\n bb = new ByteBuffer(buffer.length, littleEndian)\n bb.limit = buffer.length\n new Uint8Array(bb.buffer).set(buffer)\n } else {\n throw TypeError('Illegal buffer')\n }\n\n return bb\n }\n\n writeBytes(\n source: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n offset?: number\n ): ByteBuffer {\n return this.append(source, offset)\n }\n\n writeInt8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setInt8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeByte(value: number, offset?: number): ByteBuffer {\n return this.writeInt8(value, offset)\n }\n\n writeUint8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setUint8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeUInt8(value: number, offset?: number): ByteBuffer {\n return this.writeUint8(value, offset)\n }\n\n readUint8(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint8(offset)\n if (relative) this.offset += 1\n return value\n }\n\n readUInt8(offset?: number): number {\n return this.readUint8(offset)\n }\n\n writeInt16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setInt16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeShort(value: number, offset?: number): ByteBuffer {\n return this.writeInt16(value, offset)\n }\n\n writeUint16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setUint16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeUInt16(value: number, offset?: number): ByteBuffer {\n return this.writeUint16(value, offset)\n }\n\n writeInt32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setInt32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeInt(value: number, offset?: number): ByteBuffer {\n return this.writeInt32(value, offset)\n }\n\n writeUint32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setUint32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeUInt32(value: number, offset?: number): ByteBuffer {\n return this.writeUint32(value, offset)\n }\n\n readUint32(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint32(offset, this.littleEndian)\n if (relative) {\n this.offset += 4\n }\n return value\n }\n\n readUInt32 = this.readUint32\n\n append(source: ByteBuffer | ArrayBuffer | Uint8Array | number[], offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n let src: Uint8Array\n if (source instanceof ByteBuffer) {\n src = new Uint8Array(source.buffer, source.offset, source.limit - source.offset)\n source.offset += src.length\n } else if (source instanceof Uint8Array) {\n src = source\n } else if (source instanceof ArrayBuffer) {\n src = new Uint8Array(source)\n } else {\n src = new Uint8Array(source)\n }\n\n if (src.length <= 0) return this\n\n if (offset + src.length > this.buffer.byteLength) {\n this.resize(offset + src.length)\n }\n\n new Uint8Array(this.buffer).set(src, offset)\n\n if (relative) this.offset += src.length\n return this\n }\n\n clone(copy?: boolean): ByteBuffer {\n const bb = new ByteBuffer(0, this.littleEndian)\n if (copy) {\n bb.buffer = new ArrayBuffer(this.buffer.byteLength)\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer))\n bb.view = new DataView(bb.buffer)\n } else {\n bb.buffer = this.buffer\n bb.view = this.view\n }\n bb.offset = this.offset\n bb.markedOffset = this.markedOffset\n bb.limit = this.limit\n return bb\n }\n\n copy(begin?: number, end?: number): ByteBuffer {\n if (begin === undefined) begin = this.offset\n if (end === undefined) end = this.limit\n\n if (begin === end) {\n return new ByteBuffer(0, this.littleEndian)\n }\n\n const capacity = end - begin\n const bb = new ByteBuffer(capacity, this.littleEndian)\n bb.offset = 0\n bb.limit = capacity\n\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer).subarray(begin, end), 0)\n return bb\n }\n\n copyTo(\n target: ByteBuffer,\n targetOffset?: number,\n sourceOffset?: number,\n sourceLimit?: number\n ): ByteBuffer {\n const targetRelative = typeof targetOffset === 'undefined'\n const relative = typeof sourceOffset === 'undefined'\n targetOffset = targetRelative ? target.offset : targetOffset!\n sourceOffset = relative ? this.offset : sourceOffset!\n sourceLimit = sourceLimit === undefined ? this.limit : sourceLimit\n\n const len = sourceLimit - sourceOffset\n if (len === 0) return target\n\n target.ensureCapacity(targetOffset + len)\n new Uint8Array(target.buffer).set(\n new Uint8Array(this.buffer).subarray(sourceOffset, sourceLimit),\n targetOffset\n )\n\n if (relative) this.offset += len\n if (targetRelative) target.offset += len\n return this\n }\n\n ensureCapacity(capacity: number): ByteBuffer {\n let current = this.buffer.byteLength\n if (current < capacity) {\n return this.resize((current *= 2) > capacity ? current : capacity)\n }\n return this\n }\n\n flip(): ByteBuffer {\n this.limit = this.offset\n this.offset = 0\n return this\n }\n\n resize(capacity: number): ByteBuffer {\n if (this.buffer.byteLength < capacity) {\n const buffer = new ArrayBuffer(capacity)\n new Uint8Array(buffer).set(new Uint8Array(this.buffer))\n this.buffer = buffer\n this.view = new DataView(buffer)\n }\n return this\n }\n\n skip(length: number): ByteBuffer {\n this.offset += length\n return this\n }\n\n writeInt64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigInt64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeLong(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeInt64(value, offset)\n }\n\n readInt64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigInt64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readLong(offset?: number): bigint {\n return this.readInt64(offset)\n }\n\n writeUint64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigUint64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeUInt64(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeUint64(value, offset)\n }\n\n readUint64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigUint64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readUInt64(offset?: number): bigint {\n return this.readUint64(offset)\n }\n\n toBuffer(forceCopy?: boolean): ArrayBufferLike {\n const offset = this.offset\n const limit = this.limit\n if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) {\n return this.buffer\n }\n if (offset === limit) return EMPTY_BUFFER\n return this.buffer.slice(offset, limit)\n }\n\n toArrayBuffer(forceCopy?: boolean): ArrayBufferLike {\n return this.toBuffer(forceCopy)\n }\n\n writeVarint32(value: number, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const size = this.calculateVarint32(value)\n if (offset + size > this.buffer.byteLength) {\n this.resize(offset + size)\n }\n\n value >>>= 0\n while (value >= 0x80) {\n this.view.setUint8(offset++, (value & 0x7f) | 0x80)\n value >>>= 7\n }\n this.view.setUint8(offset++, value)\n\n if (relative) {\n this.offset = offset\n return this\n }\n return size\n }\n\n readVarint32(offset?: number): number | { value: number; length: number } {\n const relative = typeof offset === 'undefined'\n if (typeof offset === 'undefined') {\n offset = this.offset\n }\n let c = 0\n let value = 0 >>> 0\n let b: number\n do {\n b = this.view.getUint8(offset++)\n if (c < 5) {\n value |= (b & 0x7f) << (7 * c)\n }\n ++c\n } while ((b & 0x80) !== 0)\n value |= 0\n\n if (relative) {\n this.offset = offset\n return value\n }\n return { value, length: c }\n }\n\n calculateVarint32(value: number): number {\n value = value >>> 0\n if (value < 1 << 7) return 1\n else if (value < 1 << 14) return 2\n else if (value < 1 << 21) return 3\n else if (value < 1 << 28) return 4\n else return 5\n }\n\n writeVString(str: string, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n let currentOffset = relative ? this.offset : offset!\n\n const encoded = getEncoder().encode(str)\n const len = encoded.length\n const lenVarintSize = this.calculateVarint32(len)\n\n if (currentOffset + lenVarintSize + len > this.buffer.byteLength) {\n this.resize(currentOffset + lenVarintSize + len)\n }\n\n this.writeVarint32(len, currentOffset)\n currentOffset += lenVarintSize\n\n new Uint8Array(this.buffer).set(encoded, currentOffset)\n currentOffset += len\n\n if (relative) {\n this.offset = currentOffset\n return this\n }\n return currentOffset - (offset || 0)\n }\n\n readVString(offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const start = offset\n const lenResult = this.readVarint32(offset) as { value: number; length: number }\n const lenValue = lenResult.value\n const lenLength = lenResult.length\n\n offset += lenLength\n\n // TextDecoder can take Uint8Array view directly\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, lenValue))\n offset += lenValue\n\n if (relative) {\n this.offset = offset\n return str\n } else {\n return {\n string: str,\n length: offset - start\n }\n }\n }\n\n readUTF8String(length: number, offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n // const strBuffer = this.buffer.slice(offset, end)\n // Faster to view if Shared? No, Decoder takes buffer or view.\n // Making a view is cheap.\n // But DataView vs Uint8Array. TextDecoder takes BufferSource (ArrayBuffer or ArrayBufferView).\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, length))\n\n if (relative) {\n this.offset += length\n return str\n } else {\n return {\n string: str,\n length\n }\n }\n }\n}\n","import type { APIMethods } from './api-types'\n\n/**\n * Unified configuration for Hive blockchain connectivity.\n * This is the single source of truth for node endpoints, timeouts, and chain settings.\n * Mutate this object directly or use ConfigManager.setHiveNodes() for validated updates.\n */\nexport const config = {\n /**\n * Array of Hive API node endpoints for load balancing and failover.\n */\n nodes: [\n 'https://api.hive.blog',\n 'https://api.deathwing.me',\n 'https://api.openhive.network',\n 'https://techcoderx.com',\n 'https://api.syncad.com',\n 'https://rpc.mahdiyari.info',\n ],\n\n /**\n * Array of Hive API node endpoints that support REST APIs.\n * Note: Without the trailing /\n */\n restNodes: [\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://api.syncad.com',\n 'https://hiveapi.actifit.io',\n 'https://api.c0ff33a.uk'\n ],\n\n /**\n * Per-API REST node override. Some APIs are served by only a subset of\n * nodes; list just those capable hosts here so callREST never burns its\n * (small) retry budget on nodes that 404/503 the API, and a cold start\n * hits a capable node immediately. Any API not listed falls back to\n * `restNodes`. The health tracker still orders *within* this list.\n *\n * hivesense: empirically only ~2 public nodes serve /hivesense-api (the\n * other configured nodes 404/503 it; Ecency's own was decommissioned), so\n * pin them — otherwise the health tracker keeps rediscovering incapable\n * nodes each cooldown and cold starts waste attempts.\n */\n restNodesByApi: {\n hivesense: ['https://api.hive.blog', 'https://api.syncad.com']\n } as Partial>,\n\n /**\n * User-Agent sent on server-side (Node) HTTP requests to Hive nodes.\n *\n * Node's built-in fetch (undici) sends a bare `User-Agent: node` when none is\n * set, which is indistinguishable from any random Node script in node/CDN\n * analytics. A descriptive value lets operators tell their own SSR/server\n * traffic apart from anonymous scrapers. Only applied in Node — browsers\n * forbid overriding User-Agent (it is silently dropped) and React Native sets\n * its own native UA, so client and mobile traffic are untouched. Override via\n * `ConfigManager.setUserAgent()` (or `setUserAgent()` from `@ecency/sdk/hive`).\n */\n userAgent: 'ecency-sdk',\n\n /**\n * The Hive blockchain chain ID for transaction signing and verification.\n */\n chain_id: 'beeab0de00000000000000000000000000000000000000000000000000000000',\n\n /**\n * Address prefix used for public key formatting (STM for mainnet).\n */\n address_prefix: 'STM',\n\n /**\n * Timeout in milliseconds for read API calls (get_content, get_accounts, etc.).\n * Kept short so the health tracker can fail over to another node quickly.\n */\n timeout: 5_000,\n\n /**\n * Timeout in milliseconds for broadcast API calls.\n * Longer than read timeout because broadcast_transaction_synchronous waits\n * for block inclusion, which depends on the 3-second block interval and\n * network conditions.\n */\n broadcastTimeout: 15_000,\n\n /**\n * Number of retry attempts for failed API calls before throwing an error.\n * Total attempts = retry + 1. With ~7 nodes in the list, a budget of 5\n * means callRPC iterates through 6 distinct nodes before giving up, so a\n * single sick node (or two) can't surface as an unhandled error to the\n * caller while the rest of the list is healthy.\n */\n retry: 5,\n\n /**\n * Tail-latency resilience for READ calls. Motivation: on a shared public-node\n * pool a node can slow down or throttle *mid-request*; a fixed `timeout` means\n * the caller only notices after the full window, and under SSR concurrency\n * those stalled renders pile up. Two mechanisms, both scoped to reads only\n * (broadcasts never hedge and keep their fixed `broadcastTimeout`):\n *\n * - Adaptive per-attempt timeout (`adaptiveTimeout`, default ON): when a\n * node has a usable latency profile (EWMA), the per-attempt timeout becomes\n * `min(callerTimeout, max(floorMs, factor × EWMA))` — a node running far\n * above its own baseline is abandoned early and failover starts sooner.\n * Never *raises* the caller's timeout; unprofiled nodes keep it unchanged.\n *\n * - Hedged requests (`hedge`, default OFF — opt in via `setResilience`): if\n * the primary attempt is still pending after `max(hedgeDelayFloorMs,\n * hedgeDelayFactor × EWMA)`, a duplicate request is fired at the next\n * healthy untried node and the first success wins (the loser is aborted).\n * A token bucket (`hedgeBucketCapacity` burst, refilled by\n * `hedgeRefillPerSuccess` per un-hedged success) caps hedges to roughly\n * `hedgeRefillPerSuccess` of traffic, so only the slow tail hedges — and\n * under pool-wide slowness the bucket drains and hedging auto-disables\n * instead of amplifying load into public-node rate limits.\n */\n resilience: {\n adaptiveTimeout: true,\n adaptiveTimeoutFloorMs: 2_000,\n adaptiveTimeoutFactor: 4,\n hedge: false,\n hedgeDelayFloorMs: 750,\n hedgeDelayFactor: 2,\n hedgeBucketCapacity: 10,\n hedgeRefillPerSuccess: 0.1,\n /**\n * Wall-clock budget for one read call across ALL failover attempts, as a\n * multiple of the per-attempt timeout: no NEW attempt starts past\n * `totalBudgetFactor × timeout` (an in-flight attempt still finishes its\n * own window). Bounds the pathological pool-wide-slowness walk — without\n * it a read could hold its caller for (retry+1) × timeout ≈ 30s, which\n * under SSR concurrency is a memory pile-up, the exact incident this\n * feature exists for. Applies to reads only (callRPC / callREST);\n * broadcasts keep their try-each-node-once semantics.\n */\n totalBudgetFactor: 2\n }\n}\n\n/** Shape of the `config.resilience` bag (see its doc comment). */\nexport type ResilienceOptions = typeof config.resilience\n\n/**\n * Validated setter for the Hive RPC node list — replaces `config.nodes`.\n * Trims, drops non-http(s) entries, and de-dupes (order-preserving). A no-op\n * if nothing valid remains, so a bad input can't empty the list.\n *\n * Lives here, in the React-free `hive-tx` core, on purpose: it must be\n * reachable from BOTH the full `@ecency/sdk` entry (via\n * `ConfigManager.setHiveNodes`, which delegates here) and the lean\n * `@ecency/sdk/hive` server/CLI entry — without dragging react-query or the\n * DMCA/ReDoS surface of `ConfigManager` into the lean entry. Within a single\n * bundle this mutates the one `config` instance `callRPC` reads; the\n * cross-bundle single-instance guarantee is a separate (build-level) concern.\n */\n/**\n * Trim, drop non-string / non-http(s), and de-dupe (order-preserving) a node\n * list. Shared by `setNodes` and the REST-node setters below so all three\n * normalize identically.\n */\nconst sanitizeNodeList = (nodes: unknown): string[] =>\n Array.isArray(nodes)\n ? [\n ...new Set(\n nodes\n .filter((n): n is string => typeof n === 'string')\n // Trim, then strip trailing slashes so REST paths concatenate cleanly:\n // `callREST` builds `node + '/status-api'`, and a `https://host/` node would\n // otherwise yield `https://host//status-api`, which several HAF nodes 404.\n // De-dupe AFTER normalizing so `host` and `host/` collapse to one entry.\n .map((n) => n.trim().replace(/\\/+$/, ''))\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n : []\n\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = sanitizeNodeList(nodes)\n if (!validNodes.length) return\n config.nodes = validNodes\n}\n\n/**\n * Validated setter for the REST-API node list — replaces `config.restNodes`.\n * Same shape/guarantees as `setNodes` (trim, drop non-http(s), de-dupe, no-op on\n * empty). Exists because `restNodes` is otherwise baked into the SDK: an app that\n * wants to add/remove a REST host (e.g. drop an own node it is decommissioning, or\n * widen the public pool) previously had to fork + republish the SDK. With this, the\n * REST pool is app-configurable at runtime exactly like the read pool. Lives in the\n * React-free `hive-tx` core so both the full `@ecency/sdk` entry and the lean\n * `@ecency/sdk/hive` entry can reach it.\n */\nexport const setRestNodes = (nodes: string[]): void => {\n const valid = sanitizeNodeList(nodes)\n if (!valid.length) return\n config.restNodes = valid\n}\n\n/**\n * Merge validated per-API REST node overrides into `config.restNodesByApi`.\n * For each entry: a non-empty, valid list pins that API to those hosts; an empty or\n * all-invalid list REMOVES the pin so the API falls back to `restNodes`. Other APIs'\n * existing pins (e.g. the built-in `hivesense`) are preserved. Lets an app pin the\n * APIs it actually uses to known-capable hosts (so `callREST` never burns its small\n * retry budget on a node that 404/503s the API) without an SDK republish.\n */\nexport const setRestNodesByApi = (\n map: Partial>\n): void => {\n if (!map || typeof map !== 'object') return\n const next: Partial> = { ...config.restNodesByApi }\n for (const [api, list] of Object.entries(map)) {\n const valid = sanitizeNodeList(list)\n if (valid.length) {\n next[api as APIMethods] = valid\n } else {\n delete next[api as APIMethods]\n }\n }\n config.restNodesByApi = next\n}\n\n/**\n * Validated setter for the User-Agent sent on server-side (Node) requests.\n * Trims the input and ignores an empty value so a bad input can't blank out the\n * header. Like `setNodes`, it lives in the React-free `hive-tx` core so it is\n * reachable from both the full `@ecency/sdk` entry (via\n * `ConfigManager.setUserAgent`) and the lean `@ecency/sdk/hive` server/CLI entry.\n */\nexport const setUserAgent = (ua: string): void => {\n // Defensive against plain-JS / React Native callers that may pass a non-string\n // despite the `string` type (avoids throwing on `.trim()`).\n if (typeof ua !== 'string') return\n const value = ua.trim()\n // Ignore blank values, and reject control characters (CR, LF, and other\n // C0/DEL controls). An invalid header value would otherwise be stored and make\n // every subsequent fetch throw, and rejecting CR/LF closes a header-injection\n // vector for any caller that builds the UA from untrusted input.\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return\n config.userAgent = value\n}\n\n/**\n * Validated partial setter for `config.resilience` (adaptive read timeouts +\n * hedged requests — see the field's doc comment). Booleans must be booleans;\n * numeric fields must be finite and positive, with the refill rate additionally\n * capped at 1 so a typo can't turn the tail-hedge into a traffic doubler\n * (refill ≤ 1 ⇒ hedges can never exceed un-hedged successes). Invalid values\n * are ignored field-by-field, so one bad entry can't block the rest. Lives in\n * the React-free `hive-tx` core (like the other setters) so both `@ecency/sdk`\n * (via `ConfigManager.setResilience`) and the lean `@ecency/sdk/hive` entry\n * can reach it.\n */\nexport const setResilience = (opts: Partial): void => {\n if (!opts || typeof opts !== 'object') return\n const r = config.resilience\n const bool = (v: unknown): v is boolean => typeof v === 'boolean'\n const pos = (v: unknown): v is number =>\n typeof v === 'number' && Number.isFinite(v) && v > 0\n if (bool(opts.adaptiveTimeout)) r.adaptiveTimeout = opts.adaptiveTimeout\n // Floor must stay ≥ the tracker's slow-failure recording floor (2s): the\n // safety argument for adaptive timeouts is that an abort at the window IS\n // recorded as a slow sample, growing the EWMA so the window self-corrects\n // upward. A floor below 2s would abort without recording — the window could\n // never converge and a too-tight profile would starve that call forever.\n if (pos(opts.adaptiveTimeoutFloorMs)) {\n r.adaptiveTimeoutFloorMs = Math.max(opts.adaptiveTimeoutFloorMs, 2_000)\n }\n if (pos(opts.adaptiveTimeoutFactor)) r.adaptiveTimeoutFactor = opts.adaptiveTimeoutFactor\n if (bool(opts.hedge)) r.hedge = opts.hedge\n if (pos(opts.hedgeDelayFloorMs)) r.hedgeDelayFloorMs = opts.hedgeDelayFloorMs\n if (pos(opts.hedgeDelayFactor)) r.hedgeDelayFactor = opts.hedgeDelayFactor\n if (pos(opts.hedgeBucketCapacity)) r.hedgeBucketCapacity = opts.hedgeBucketCapacity\n // Refill must stay ≤ 1: at 1 token per success the hedge rate could reach\n // 100% of traffic, defeating the \"tail only\" contract. Cap rather than reject\n // so a caller asking for \"more hedging\" gets the safe maximum.\n if (pos(opts.hedgeRefillPerSuccess)) {\n r.hedgeRefillPerSuccess = Math.min(opts.hedgeRefillPerSuccess, 1)\n }\n // Below 1 the budget could not even cover the configured per-attempt window.\n if (pos(opts.totalBudgetFactor)) {\n r.totalBudgetFactor = Math.max(opts.totalBudgetFactor, 1)\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport class Signature {\n data: Uint8Array\n recovery: number\n private compressed: boolean\n\n /**\n * Creates a new Signature instance.\n * @param data Raw signature data (64 bytes)\n * @param recovery Recovery byte (0-3)\n * @param compressed Whether signature is compressed (default: true)\n */\n constructor(data: Uint8Array, recovery: number, compressed?: boolean) {\n this.data = data\n this.recovery = recovery\n this.compressed = compressed ?? true\n }\n\n /**\n * Creates a Signature from a hex string.\n * @param string 130-character hex string containing signature and recovery data\n * @returns New Signature instance\n * @throws Error if input is not a string\n */\n static from(string: string) {\n if (typeof string === 'string') {\n const temp = hexToBytes(string)\n let recovery = parseInt(bytesToHex(temp.subarray(0, 1)), 16) - 31\n let compressed = true\n // non-compressed signatures have -4\n // https://github.com/bitcoin/bitcoin/blob/95ea54ba089610019a74c1176a2c7c0dba144b1c/src/key.cpp#L257\n if (recovery < 0) {\n compressed = false\n recovery = recovery + 4\n }\n const data = temp.subarray(1)\n return new Signature(data, recovery, compressed)\n } else {\n throw new Error('Expected string for data')\n }\n }\n\n /**\n * Converts signature to 65-byte buffer format.\n * @returns 65-byte buffer containing recovery byte + signature data\n */\n toBuffer() {\n const buffer = new Uint8Array(65).fill(0)\n if (this.compressed) {\n buffer[0] = (this.recovery + 31) & 0xff\n } else {\n buffer[0] = (this.recovery + 27) & 0xff\n }\n buffer.set(this.data, 1)\n return buffer\n }\n\n /**\n * Returns signature as 130-character hex string.\n * @returns Hex string representation of signature\n */\n customToString() {\n return bytesToHex(this.toBuffer())\n }\n\n /**\n * Returns signature as 130-character hex string.\n * Overrides Object.prototype.toString() so that String(sig) and\n * template literals produce the hex representation instead of \"[object Object]\".\n * @returns Hex string representation of signature\n */\n toString() {\n return this.customToString()\n }\n\n /**\n * Recovers the public key from this signature and message.\n * @param message 32-byte message hash (Uint8Array) or 64-character hex string\n * @returns PublicKey that created this signature\n * @throws Error if message is not a valid 32-byte SHA256 hash\n */\n getPublicKey(message: Uint8Array | string): PublicKey {\n if (\n (message instanceof Uint8Array && message.length !== 32) ||\n (typeof message === 'string' && message.length !== 64)\n ) {\n throw new Error('Expected a valid sha256 hash as message')\n }\n if (typeof message === 'string') {\n message = hexToBytes(message)\n }\n const sig = secp256k1.Signature.fromBytes(this.data, 'compact')\n const temp = new secp256k1.Signature(sig.r, sig.s, this.recovery)\n return new PublicKey(temp.recoverPublicKey(message).toBytes())\n }\n}\n","import { ripemd160 } from '@noble/hashes/legacy.js'\nimport bs58 from 'bs58'\nimport { config } from '../config'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { Signature } from './Signature'\n\nexport class PublicKey {\n key: Uint8Array\n prefix: string\n\n /**\n * Creates a new PublicKey instance from raw bytes.\n * @param key Raw public key bytes (33 bytes, compressed format)\n * @param prefix Optional address prefix (defaults to the current config.address_prefix)\n */\n constructor(key: Uint8Array, prefix?: string) {\n this.key = key\n // Read config at call time so runtime mutations to config.address_prefix\n // (e.g. switching to a non-mainnet network) take effect for new instances.\n this.prefix = prefix ?? config.address_prefix\n }\n\n /**\n * Creates a PublicKey from a string representation.\n * The expected prefix is read from config.address_prefix at call time, so\n * consumers can switch networks at runtime.\n * @param wif Public key string (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n * @returns New PublicKey instance\n * @throws Error if the prefix, length, checksum, or curve point is invalid\n */\n static fromString(wif: string): PublicKey {\n const expectedPrefix = config.address_prefix\n if (typeof wif !== 'string' || wif.length <= expectedPrefix.length) {\n throw new Error('Invalid public key')\n }\n const prefix = wif.slice(0, expectedPrefix.length)\n if (prefix !== expectedPrefix) {\n throw new Error(`Public key must start with ${expectedPrefix}`)\n }\n let buffer: Uint8Array\n try {\n buffer = bs58.decode(wif.slice(expectedPrefix.length))\n } catch {\n throw new Error('Invalid public key encoding')\n }\n // 33-byte compressed secp256k1 point + 4-byte RIPEMD160 checksum\n if (buffer.length !== 37) {\n throw new Error('Invalid public key length')\n }\n const key = buffer.subarray(0, 33)\n const checksum = buffer.subarray(33, 37)\n const expectedChecksum = ripemd160(key).subarray(0, 4)\n if (!isUint8ArrayEqual(checksum, expectedChecksum)) {\n throw new Error('Public key checksum mismatch')\n }\n try {\n secp256k1.Point.fromBytes(key)\n } catch {\n throw new Error('Invalid public key')\n }\n return new PublicKey(key, prefix)\n }\n\n /**\n * Creates a PublicKey from a string or returns the instance if already a PublicKey.\n * @param value Public key string or PublicKey instance\n * @returns New or existing PublicKey instance\n */\n static from(value: string | PublicKey): PublicKey {\n if (value instanceof PublicKey) {\n return value\n } else {\n return PublicKey.fromString(value as string)\n }\n }\n\n /**\n * Verifies a signature against a message hash.\n * @param message 32-byte message hash to verify\n * @param signature Signature to verify\n * @returns True if signature is valid, false otherwise\n */\n verify(message: Uint8Array, signature: Signature | string): boolean {\n if (typeof signature === 'string') {\n signature = Signature.from(signature)\n }\n return secp256k1.verify(signature.data, message, this.key, {\n prehash: false,\n format: 'compact'\n })\n }\n\n /**\n * Returns the public key as a string for storage or transmission.\n * @returns Public key string with prefix (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n */\n toString(): string {\n return encodePublic(this.key, this.prefix)\n }\n\n /**\n * Returns JSON representation (same as toString()).\n * @returns Public key string\n */\n toJSON(): string {\n return this.toString()\n }\n\n /**\n * Returns a string representation for debugging.\n * @returns Formatted public key string\n */\n inspect(): string {\n return `PublicKey: ${this.toString()}`\n }\n}\n\nconst encodePublic = (key: Uint8Array, prefix: string): string => {\n const checksum = ripemd160(key)\n return prefix + bs58.encode(new Uint8Array([...key, ...checksum.subarray(0, 4)]))\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array): boolean => {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n","/** Class representing a hive asset,\n * e.g. `1.000 HIVE` or `12.112233 VESTS`. */\nexport class Asset {\n amount: number\n symbol: string\n\n constructor(amount: number, symbol: string) {\n this.amount = amount\n this.symbol = symbol === 'HIVE' ? 'STEEM' : symbol === 'HBD' ? 'SBD' : symbol\n }\n\n /** Create a new Asset instance from a string, e.g. `42.000 HIVE`. */\n static fromString(string: string, expectedSymbol: string | null = null): Asset {\n const [amountString, symbol] = string.split(' ')\n if (['STEEM', 'VESTS', 'SBD', 'TESTS', 'TBD', 'HIVE', 'HBD'].indexOf(symbol) === -1) {\n throw new Error(`Invalid asset symbol: ${symbol}`)\n }\n if (expectedSymbol && symbol !== expectedSymbol) {\n throw new Error(`Invalid asset, expected symbol: ${expectedSymbol} got: ${symbol}`)\n }\n const amount = Number.parseFloat(amountString)\n if (!Number.isFinite(amount)) {\n throw new Error(`Invalid asset amount: ${amountString}`)\n }\n return new Asset(amount, symbol)\n }\n\n /**\n * Convenience to create new Asset.\n * @param symbol Symbol to use when created from number. Will also be used to validate\n * the asset, throws if the passed value has a different symbol than this.\n */\n static from(value: number | string | Asset, symbol?: string | null): Asset {\n if (value instanceof Asset) {\n if (symbol && value.symbol !== symbol) {\n throw new Error(`Invalid asset, expected symbol: ${symbol} got: ${value.symbol}`)\n }\n return value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n return new Asset(value, symbol || 'STEEM')\n } else if (typeof value === 'string') {\n return Asset.fromString(value, symbol)\n } else {\n throw new Error(`Invalid asset '${String(value)}'`)\n }\n }\n\n // We convert HIVE & HBD strings to STEEM & SBD because the serialization should be based on STEEM & SBD\n\n /** Return asset precision. */\n getPrecision() {\n switch (this.symbol) {\n case 'TESTS':\n case 'TBD':\n case 'STEEM':\n case 'SBD':\n case 'HBD':\n case 'HIVE':\n return 3\n case 'VESTS':\n return 6\n default:\n return 3\n }\n }\n\n /** Return a string representation of this asset, e.g. `42.000 HIVE`. */\n toString() {\n return `${this.amount.toFixed(this.getPrecision())} ${this.symbol}`\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\n/** Buffer wrapper that serializes to a hex-encoded string. */\nexport class HexBuffer {\n buffer: Uint8Array\n /** Convenience to create a new HexBuffer, does not copy data if value passed is already a buffer. */\n static from(value: string | Uint8Array | HexBuffer) {\n if (value instanceof HexBuffer) {\n return value\n } else if (value instanceof Uint8Array) {\n return new HexBuffer(value)\n } else if (typeof value === 'string') {\n return new HexBuffer(hexToBytes(value))\n } else {\n return new HexBuffer(new Uint8Array(value))\n }\n }\n\n constructor(buffer: Uint8Array) {\n this.buffer = buffer\n }\n\n toString() {\n return bytesToHex(this.buffer)\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { Asset } from './Asset'\nimport { HexBuffer } from './HexBuffer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Operation } from '../types'\n\n// Operation ID constants for better maintainability\nconst OPERATION_IDS = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n // pow: 14,\n custom: 15,\n // report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n // pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n // custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49\n} as const\n\ntype OperationId = (typeof OPERATION_IDS)[keyof typeof OPERATION_IDS]\n\nconst VoidSerializer = () => {\n throw new Error('Void can not be serialized')\n}\nconst StringSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeVString(data)\n}\n\nconst Int16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeInt16(data)\n}\n\nconst Int64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeInt64(data)\n}\n\nconst UInt8Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint8(data)\n}\n\nconst UInt16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint16(data)\n}\n\nconst UInt32Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint32(data)\n}\n\nconst UInt64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeUint64(data)\n}\n\nconst BooleanSerializer = (buffer: ByteBuffer, data: number | boolean) => {\n buffer.writeByte(data ? 1 : 0)\n}\n\nconst StaticVariantSerializer = (itemSerializers: any) => {\n // return (buffer: ByteBuffer, data: any[]) => {\n // let id = data[0]\n // const item = data[1]\n // // id was/is supposed to be 0 or integer here but seems to have been changed in e.g. comment_options\n // // extensions: [\n // // [\n // // \"comment_payout_beneficiaries\",\n // // {\n // // \"beneficiaries\": [\n // // {\n // // \"account\": \"vimm\",\n // // \"weight\": 1000\n // // }\n // // ]\n // // }\n // // ]\n // // ]\n // // Keep it here just in case\n // // https://gitlab.syncad.com/hive/hive/-/issues/722\n // // \"comment_payout_beneficiaries\" was 0 and at some point it got changed\n // // It should still be serialized as a 0 or an integer\n // // Now the question is, always 0? will need an example transaction to prove otherwise\n // if (typeof id === 'string') {\n // if (id === 'update_proposal_end_date') {\n // id = 1\n // } else {\n // id = 0\n // }\n // }\n // buffer.writeVarint32(id)\n // itemSerializers[id](buffer, item)\n return (buffer: ByteBuffer, data: any) => {\n const [id, item] = data\n buffer.writeVarint32(id)\n itemSerializers[id](buffer, item)\n }\n}\n\n/**\n * Serialize asset.\n * @note This looses precision for amounts larger than 2^53-1/10^precision.\n * Should not be a problem in real-word usage.\n */\nconst AssetSerializer = (buffer: ByteBuffer, data: string | Asset) => {\n const asset = Asset.from(data)\n const precision = asset.getPrecision()\n buffer.writeInt64(Math.round(asset.amount * Math.pow(10, precision)))\n buffer.writeUint8(precision)\n for (let i = 0; i < 7; i++) {\n buffer.writeUint8(asset.symbol.charCodeAt(i) || 0)\n }\n}\n\nconst DateSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeUint32(Math.floor(new Date(data + 'Z').getTime() / 1000))\n}\n\nconst PublicKeySerializer = (buffer: ByteBuffer, data: string | PublicKey) => {\n if (\n data === null ||\n (typeof data === 'string' && data.slice(-39) === '1111111111111111111111111111111114T1Anm')\n ) {\n buffer.append(new Uint8Array(33).fill(0))\n } else {\n buffer.append(PublicKey.from(data).key)\n }\n}\n\nconst BinarySerializer = (size: null | number = null) => {\n return (buffer: ByteBuffer, data: string | Uint8Array | HexBuffer) => {\n data = HexBuffer.from(data)\n const len = data.buffer.length\n if (size) {\n if (len !== size) {\n throw new Error(`Unable to serialize binary. Expected ${size} bytes, got ${len}`)\n }\n } else {\n buffer.writeVarint32(len)\n }\n buffer.append(data.buffer)\n }\n}\n\nconst VariableBinarySerializer = BinarySerializer()\n\nconst FlatMapSerializer = (keySerializer: any, valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(data.length)\n for (const [key, value] of data) {\n keySerializer(buffer, key)\n valueSerializer(buffer, value)\n }\n }\n}\n\nconst ArraySerializer = (itemSerializer: any) => {\n return (buffer: ByteBuffer, data: any[]) => {\n buffer.writeVarint32(data.length)\n for (const item of data) {\n itemSerializer(buffer, item)\n }\n }\n}\n\nconst ObjectSerializer = (keySerializers: any) => {\n return (buffer: ByteBuffer, data: any) => {\n for (const [key, serializer] of keySerializers) {\n try {\n serializer(buffer, data[key])\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n }\n}\n\nconst OptionalSerializer = (valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any | undefined) => {\n if (data !== undefined) {\n buffer.writeByte(1)\n valueSerializer(buffer, data)\n } else {\n buffer.writeByte(0)\n }\n }\n}\n\nconst AuthoritySerializer = ObjectSerializer([\n ['weight_threshold', UInt32Serializer],\n ['account_auths', FlatMapSerializer(StringSerializer, UInt16Serializer)],\n ['key_auths', FlatMapSerializer(PublicKeySerializer, UInt16Serializer)]\n])\n\nconst BeneficiarySerializer = ObjectSerializer([\n ['account', StringSerializer],\n ['weight', UInt16Serializer]\n])\n\nconst PriceSerializer = ObjectSerializer([\n ['base', AssetSerializer],\n ['quote', AssetSerializer]\n])\n\n// const SignedBlockHeaderSerializer = ObjectSerializer([\n// ['previous', BinarySerializer(20)],\n// ['timestamp', DateSerializer],\n// ['witness', StringSerializer],\n// ['transaction_merkle_root', BinarySerializer(20)],\n// ['extensions', ArraySerializer(VoidSerializer)],\n// ['witness_signature', BinarySerializer(65)]\n// ])\n\nconst ChainPropertiesSerializer = ObjectSerializer([\n ['account_creation_fee', AssetSerializer],\n ['maximum_block_size', UInt32Serializer],\n ['hbd_interest_rate', UInt16Serializer]\n])\n\nconst OperationDataSerializer = (operationId: OperationId, definitions: any) => {\n const objectSerializer = ObjectSerializer(definitions)\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(operationId)\n objectSerializer(buffer, data)\n }\n}\n\nconst OperationSerializers: Record> = {}\n\nOperationSerializers.account_create = OperationDataSerializer(OPERATION_IDS.account_create, [\n ['fee', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_create_with_delegation = OperationDataSerializer(\n OPERATION_IDS.account_create_with_delegation,\n [\n ['fee', AssetSerializer],\n ['delegation', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update = OperationDataSerializer(OPERATION_IDS.account_update, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_witness_proxy = OperationDataSerializer(\n OPERATION_IDS.account_witness_proxy,\n [\n ['account', StringSerializer],\n ['proxy', StringSerializer]\n ]\n)\n\nOperationSerializers.account_witness_vote = OperationDataSerializer(\n OPERATION_IDS.account_witness_vote,\n [\n ['account', StringSerializer],\n ['witness', StringSerializer],\n ['approve', BooleanSerializer]\n ]\n)\n\nOperationSerializers.cancel_transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.cancel_transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer]\n ]\n)\n\nOperationSerializers.change_recovery_account = OperationDataSerializer(\n OPERATION_IDS.change_recovery_account,\n [\n ['account_to_recover', StringSerializer],\n ['new_recovery_account', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.claim_account = OperationDataSerializer(OPERATION_IDS.claim_account, [\n ['creator', StringSerializer],\n ['fee', AssetSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.claim_reward_balance = OperationDataSerializer(\n OPERATION_IDS.claim_reward_balance,\n [\n ['account', StringSerializer],\n ['reward_hive', AssetSerializer],\n ['reward_hbd', AssetSerializer],\n ['reward_vests', AssetSerializer]\n ]\n)\n\nOperationSerializers.comment = OperationDataSerializer(OPERATION_IDS.comment, [\n ['parent_author', StringSerializer],\n ['parent_permlink', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['title', StringSerializer],\n ['body', StringSerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.comment_options = OperationDataSerializer(OPERATION_IDS.comment_options, [\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['max_accepted_payout', AssetSerializer],\n ['percent_hbd', UInt16Serializer],\n ['allow_votes', BooleanSerializer],\n ['allow_curation_rewards', BooleanSerializer],\n [\n 'extensions',\n ArraySerializer(\n StaticVariantSerializer([\n ObjectSerializer([['beneficiaries', ArraySerializer(BeneficiarySerializer)]])\n ])\n )\n ]\n])\n\nOperationSerializers.convert = OperationDataSerializer(OPERATION_IDS.convert, [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n])\n\nOperationSerializers.create_claimed_account = OperationDataSerializer(\n OPERATION_IDS.create_claimed_account,\n [\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.custom = OperationDataSerializer(OPERATION_IDS.custom, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['id', UInt16Serializer],\n ['data', VariableBinarySerializer]\n])\n\n// Not used on chain\n// OperationSerializers.custom_binary = OperationDataSerializer(OPERATION_IDS.custom_binary, [\n// ['required_owner_auths', ArraySerializer(StringSerializer)],\n// ['required_active_auths', ArraySerializer(StringSerializer)],\n// ['required_posting_auths', ArraySerializer(StringSerializer)],\n// ['required_auths', ArraySerializer(AuthoritySerializer)],\n// ['id', StringSerializer],\n// ['data', VariableBinarySerializer]\n// ])\n\nOperationSerializers.custom_json = OperationDataSerializer(OPERATION_IDS.custom_json, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['required_posting_auths', ArraySerializer(StringSerializer)],\n ['id', StringSerializer],\n ['json', StringSerializer]\n])\n\nOperationSerializers.decline_voting_rights = OperationDataSerializer(\n OPERATION_IDS.decline_voting_rights,\n [\n ['account', StringSerializer],\n ['decline', BooleanSerializer]\n ]\n)\n\nOperationSerializers.delegate_vesting_shares = OperationDataSerializer(\n OPERATION_IDS.delegate_vesting_shares,\n [\n ['delegator', StringSerializer],\n ['delegatee', StringSerializer],\n ['vesting_shares', AssetSerializer]\n ]\n)\n\nOperationSerializers.delete_comment = OperationDataSerializer(OPERATION_IDS.delete_comment, [\n ['author', StringSerializer],\n ['permlink', StringSerializer]\n])\n\nOperationSerializers.escrow_approve = OperationDataSerializer(OPERATION_IDS.escrow_approve, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['approve', BooleanSerializer]\n])\n\nOperationSerializers.escrow_dispute = OperationDataSerializer(OPERATION_IDS.escrow_dispute, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer]\n])\n\nOperationSerializers.escrow_release = OperationDataSerializer(OPERATION_IDS.escrow_release, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['receiver', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer]\n])\n\nOperationSerializers.escrow_transfer = OperationDataSerializer(OPERATION_IDS.escrow_transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer],\n ['escrow_id', UInt32Serializer],\n ['agent', StringSerializer],\n ['fee', AssetSerializer],\n ['json_meta', StringSerializer],\n ['ratification_deadline', DateSerializer],\n ['escrow_expiration', DateSerializer]\n])\n\nOperationSerializers.feed_publish = OperationDataSerializer(OPERATION_IDS.feed_publish, [\n ['publisher', StringSerializer],\n ['exchange_rate', PriceSerializer]\n])\n\nOperationSerializers.limit_order_cancel = OperationDataSerializer(\n OPERATION_IDS.limit_order_cancel,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer]\n ]\n)\n\nOperationSerializers.limit_order_create = OperationDataSerializer(\n OPERATION_IDS.limit_order_create,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['min_to_receive', AssetSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.limit_order_create2 = OperationDataSerializer(\n OPERATION_IDS.limit_order_create2,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['exchange_rate', PriceSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.recover_account = OperationDataSerializer(OPERATION_IDS.recover_account, [\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['recent_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\n// Not used on chain\n// OperationSerializers.report_over_production = OperationDataSerializer(\n// OPERATION_IDS.report_over_production,\n// [\n// ['reporter', StringSerializer],\n// ['first_block', SignedBlockHeaderSerializer],\n// ['second_block', SignedBlockHeaderSerializer]\n// ]\n// )\n\nOperationSerializers.request_account_recovery = OperationDataSerializer(\n OPERATION_IDS.request_account_recovery,\n [\n ['recovery_account', StringSerializer],\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.reset_account = OperationDataSerializer(OPERATION_IDS.reset_account, [\n ['reset_account', StringSerializer],\n ['account_to_reset', StringSerializer],\n ['new_owner_authority', AuthoritySerializer]\n])\n\nOperationSerializers.set_reset_account = OperationDataSerializer(OPERATION_IDS.set_reset_account, [\n ['account', StringSerializer],\n ['current_reset_account', StringSerializer],\n ['reset_account', StringSerializer]\n])\n\nOperationSerializers.set_withdraw_vesting_route = OperationDataSerializer(\n OPERATION_IDS.set_withdraw_vesting_route,\n [\n ['from_account', StringSerializer],\n ['to_account', StringSerializer],\n ['percent', UInt16Serializer],\n ['auto_vest', BooleanSerializer]\n ]\n)\n\nOperationSerializers.transfer = OperationDataSerializer(OPERATION_IDS.transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n])\n\nOperationSerializers.transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_to_savings,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_vesting = OperationDataSerializer(\n OPERATION_IDS.transfer_to_vesting,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.vote = OperationDataSerializer(OPERATION_IDS.vote, [\n ['voter', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['weight', Int16Serializer]\n])\n\nOperationSerializers.withdraw_vesting = OperationDataSerializer(OPERATION_IDS.withdraw_vesting, [\n ['account', StringSerializer],\n ['vesting_shares', AssetSerializer]\n])\n\nOperationSerializers.witness_update = OperationDataSerializer(OPERATION_IDS.witness_update, [\n ['owner', StringSerializer],\n ['url', StringSerializer],\n ['block_signing_key', PublicKeySerializer],\n ['props', ChainPropertiesSerializer],\n ['fee', AssetSerializer]\n])\n\nOperationSerializers.witness_set_properties = OperationDataSerializer(\n OPERATION_IDS.witness_set_properties,\n [\n ['owner', StringSerializer],\n ['props', FlatMapSerializer(StringSerializer, VariableBinarySerializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update2 = OperationDataSerializer(OPERATION_IDS.account_update2, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', OptionalSerializer(PublicKeySerializer)],\n ['json_metadata', StringSerializer],\n ['posting_json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.create_proposal = OperationDataSerializer(OPERATION_IDS.create_proposal, [\n ['creator', StringSerializer],\n ['receiver', StringSerializer],\n ['start_date', DateSerializer],\n ['end_date', DateSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.update_proposal_votes = OperationDataSerializer(\n OPERATION_IDS.update_proposal_votes,\n [\n ['voter', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['approve', BooleanSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.remove_proposal = OperationDataSerializer(OPERATION_IDS.remove_proposal, [\n ['proposal_owner', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nconst ProposalUpdateSerializer = ObjectSerializer([['end_date', DateSerializer]])\n\nOperationSerializers.update_proposal = OperationDataSerializer(OPERATION_IDS.update_proposal, [\n ['proposal_id', UInt64Serializer],\n ['creator', StringSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n [\n 'extensions',\n ArraySerializer(StaticVariantSerializer([VoidSerializer, ProposalUpdateSerializer]))\n ]\n])\n\nOperationSerializers.collateralized_convert = OperationDataSerializer(\n OPERATION_IDS.collateralized_convert,\n [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.recurrent_transfer = OperationDataSerializer(\n OPERATION_IDS.recurrent_transfer,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer],\n ['recurrence', UInt16Serializer],\n ['executions', UInt16Serializer],\n [\n 'extensions',\n ArraySerializer(\n ObjectSerializer([\n ['type', UInt8Serializer],\n ['value', ObjectSerializer([['pair_id', UInt8Serializer]])]\n ])\n )\n ]\n ]\n)\n\nconst OperationSerializer = (buffer: ByteBuffer, operation: Operation) => {\n const serializer = OperationSerializers[operation[0]]\n if (!serializer) {\n throw new Error(`No serializer for operation: ${operation[0]}`)\n }\n try {\n serializer(buffer, operation[1])\n } catch (error: any) {\n error.message = `${operation[0]}: ${error.message}`\n throw error\n }\n}\n\nconst TransactionSerializer = ObjectSerializer([\n ['ref_block_num', UInt16Serializer],\n ['ref_block_prefix', UInt32Serializer],\n ['expiration', DateSerializer],\n ['operations', ArraySerializer(OperationSerializer)],\n ['extensions', ArraySerializer(StringSerializer)]\n])\n\nconst EncryptedMemoSerializer = ObjectSerializer([\n ['from', PublicKeySerializer],\n ['to', PublicKeySerializer],\n ['nonce', UInt64Serializer],\n ['check', UInt32Serializer],\n ['encrypted', BinarySerializer()]\n])\n\nexport const Serializer = {\n // Array: ArraySerializer,\n Asset: AssetSerializer,\n // Authority: AuthoritySerializer,\n // Binary: BinarySerializer,\n // Boolean: BooleanSerializer,\n // Date: DateSerializer,\n // FlatMap: FlatMapSerializer,\n // Int16: Int16Serializer,\n // Int32: Int32Serializer,\n // Int64: Int64Serializer,\n // Int8: Int8Serializer,\n Memo: EncryptedMemoSerializer,\n // Object: ObjectSerializer,\n // Operation: OperationSerializer,\n // Optional: OptionalSerializer,\n Price: PriceSerializer,\n PublicKey: PublicKeySerializer,\n // StaticVariant: StaticVariantSerializer,\n String: StringSerializer,\n Transaction: TransactionSerializer,\n UInt16: UInt16Serializer,\n UInt32: UInt32Serializer\n // UInt64: UInt64Serializer,\n // UInt8: UInt8Serializer,\n // Void: VoidSerializer\n}\n","export const sleep = (ms: number): Promise => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { config } from '../config'\nimport { CallResponse } from '../types'\nimport type { APIMethods } from '../api-types'\nimport { sleep } from './sleep'\n\n// ── Server identity (User-Agent) ────────────────────────────────────────────\n\n/**\n * True only when running under Node.js (SSR / server / CLI). Computed once.\n *\n * We attach a descriptive `User-Agent` exclusively here because that is the only\n * place it (a) takes effect and (b) is wanted:\n * - Node's undici fetch otherwise sends a bare `User-Agent: node`, which is\n * indistinguishable from any anonymous script in node/CDN analytics.\n * - Browsers treat `User-Agent` as a forbidden header and silently drop any\n * override, so setting it there is pointless (and we avoid the churn).\n * - React Native sets its own native UA (e.g. the mobile app's own string);\n * overriding it would relabel real mobile traffic, so we explicitly exclude\n * it via `navigator.product === 'ReactNative'`.\n */\nconst isNodeRuntime: boolean = (() => {\n try {\n const isReactNative =\n typeof navigator !== 'undefined' && (navigator as any).product === 'ReactNative'\n return (\n !isReactNative &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null\n )\n } catch {\n return false\n }\n})()\n\n/**\n * Headers that identify the caller on server-side requests. Returns the\n * configured `User-Agent` only under Node; an empty object everywhere else so\n * browser and React Native requests are left exactly as they were.\n */\nfunction serverIdentityHeaders(): Record {\n return isNodeRuntime ? { 'User-Agent': config.userAgent } : {}\n}\n\n// ── Error Types ─────────────────────────────────────────────────────────────\n\nexport class RPCError extends Error {\n name = 'RPCError'\n data?: any\n code: number\n stack: undefined = undefined\n constructor(rpcError: { message: string; code: number; data?: any }) {\n super(rpcError.message)\n this.code = rpcError.code\n if ('data' in rpcError) {\n this.data = rpcError.data\n }\n }\n}\n\n/**\n * Transport-level error thrown by jsonRPCCall for HTTP status errors (429, 503).\n * Carries node identity and rate-limit info so callers can record health\n * exactly once without double-counting.\n */\nclass NodeError extends Error {\n node: string\n /** Explicit server `Retry-After` in ms, or 0 when the 429 carried no usable header. */\n rateLimitMs: number\n /** True for an HTTP 429 regardless of whether a `Retry-After` header was present, so\n * a header-less rate limit is still cooled down (with escalating backoff) rather than\n * mis-recorded as a plain transport failure. */\n isRateLimit: boolean\n constructor(\n node: string,\n message: string,\n opts: { rateLimitMs?: number; isRateLimit?: boolean } = {}\n ) {\n super(message)\n this.node = node\n this.rateLimitMs = opts.rateLimitMs ?? 0\n this.isRateLimit = opts.isRateLimit ?? false\n }\n}\n\n/**\n * Parse an HTTP `Retry-After` header to milliseconds. Supports both forms in the\n * spec: `` (e.g. \"120\") and ``. Returns 0 when the header\n * is absent or unparseable (including a non-numeric junk value or a past date) so the\n * caller falls back to escalating backoff instead of a NaN/negative cooldown.\n */\nfunction parseRetryAfterMs(header: string | null): number {\n if (!header) return 0\n const secs = Number(header)\n if (Number.isFinite(secs)) return secs > 0 ? secs * 1000 : 0\n const dateMs = Date.parse(header)\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now()\n return delta > 0 ? delta : 0\n }\n return 0\n}\n\n/** Errors that indicate the request definitely never reached the server. */\nconst PRE_CONNECTION_ERRORS = ['ECONNREFUSED', 'ENOTFOUND', 'EHOSTUNREACH', 'EAI_AGAIN']\n\n/** Browser fetch network-failure messages — emitted by Chromium/Firefox/Safari\n * when CORS preflight fails, DNS fails, TLS fails, or the response is blocked.\n * These map to scenarios where retrying the same signed broadcast is safe: the\n * request either never reached the node, or its response was blocked but a\n * re-broadcast of the *same* signed tx will be deduped by Hive (same trx_id). */\nconst BROWSER_NETWORK_ERRORS = [\n 'Failed to fetch', // Chromium\n 'NetworkError when attempting to fetch', // Firefox\n 'Load failed', // Safari\n 'fetch failed' // Node 18+ undici / Bun — also covered via cause chain\n]\n\n/**\n * Concatenate the error's surface text + the messages/codes from up to 5\n * levels of nested `cause`. Node.js fetch wraps connection failures as\n * `TypeError('fetch failed')` with the real `code` (ECONNREFUSED, etc.)\n * nested in the cause chain. Browser fetch failures have no cause but\n * carry their identifier in `message`.\n */\nfunction flattenErrorText(e: any): string {\n if (!e) return ''\n const parts: string[] = [String(e.name || ''), String(e.message || ''), String(e.code || '')]\n let cause = e.cause\n for (let depth = 0; cause && depth < 5; depth++) {\n parts.push(String(cause.code || ''), String(cause.message || ''))\n cause = cause.cause\n }\n return parts.join(' ')\n}\n\n/**\n * Decide whether a broadcast attempt can safely be retried on another node.\n *\n * Safe to retry (same signed tx → Hive dedupes by trx_id at the mempool layer):\n * - Pre-connection failures (ECONNREFUSED, ENOTFOUND, etc.) — request never sent.\n * - Browser fetch network failures (CORS block, TLS error, DNS) — TypeError with\n * a well-known message string.\n * - JSON parse failures — node returned an HTML error page (typical for\n * Cloudflare 1033 tunnel-down / 5xx interstitials), so the request never\n * reached the Hive RPC layer.\n * - NodeError (HTTP 429/5xx surfaced from jsonRPCCall) — already known transient.\n *\n * NOT safe to retry:\n * - RPCError — the node accepted the request and the blockchain rejected it.\n * Retrying on another node would either get the same rejection or accept\n * a different one; surface the original error instead.\n */\nfunction isBroadcastSafeToRetry(e: any): boolean {\n if (!e) return false\n if (e instanceof NodeError) return true\n if (e instanceof RPCError) return false\n\n const text = flattenErrorText(e)\n if (PRE_CONNECTION_ERRORS.some((code) => text.includes(code))) return true\n if (BROWSER_NETWORK_ERRORS.some((msg) => text.includes(msg))) return true\n\n // res.json() against an HTML body (Cloudflare/proxy interstitials) throws\n // SyntaxError. The Hive RPC layer never saw the tx, so failover is safe.\n if (e instanceof SyntaxError) return true\n // Some runtimes surface JSON parse errors as plain Error with this text.\n if (/Unexpected token|JSON\\.parse|Unexpected end of JSON/i.test(text)) return true\n\n return false\n}\n\n// ── Node Health Tracker ─────────────────────────────────────────────────────\n\n/** Node-level health state tracked by NodeHealthTracker. */\ninterface NodeHealth {\n /** Global consecutive-failure counter. Resets on success. */\n consecutiveFailures: number\n /** Timestamp of the most recent failure. Used with the 30s cooldown window. */\n lastFailureTime: number\n /** Epoch ms after which the node is no longer rate-limited. */\n rateLimitedUntil: number\n /** Count of consecutive 429s (no intervening success) with no usable Retry-After.\n * Drives escalating backoff; reset by a success or by RATE_LIMIT_STREAK_RESET_MS. */\n rateLimitStreak: number\n /** Epoch ms of the most recent 429. Used to expire the escalation streak. */\n lastRateLimitAt: number\n /** Per-API failure counters. Some nodes disable specific API plugins; tracking\n * per-API lets us deprioritize a node only for the APIs that fail, not globally.\n * `defective` marks a cooldown set by recordDefectiveResponse (payload\n * validation failure) — unlike ordinary strike cooldowns it survives\n * recordSuccess and only expires on its own. */\n apiFailures: Map<\n string,\n { count: number; cooldownUntil: number; lastFailureTime: number; defective?: boolean }\n >\n /** Most recent head_block_number observed for this node. */\n headBlock: number\n /** Epoch ms when the head_block was recorded. Used to expire stale observations. */\n headBlockUpdatedAt: number\n\n // ── Latency tracking (adaptive ordering) ────────────────────────────────\n /** EWMA of observed round-trip ms. Fed by successful calls AND by slow/timeout\n * failures (so a node that returns 200 in 15s, or aborts at the timeout, is\n * ranked on its real slowness — not treated as merely \"healthy\"). `undefined`\n * until the first sample. */\n ewmaLatencyMs?: number\n /** Number of latency samples folded into the EWMA. Gates \"warmup\": below\n * LATENCY_MIN_SAMPLES the node is unproven and keeps its config-order prior. */\n latencySampleCount: number\n /** Epoch ms of the most recent latency sample. Used for usability expiry and to\n * decide when a node is overdue for an exploratory re-probe. */\n latencyUpdatedAt: number\n /** Epoch ms of the most recent exploratory promotion. Single-flight guard so a\n * burst of concurrent orderings doesn't all re-probe the same stale node. */\n lastProbeAt: number\n\n /**\n * Per-profile-key latency (same EWMA/warmup/expiry rules as the global one).\n * The global EWMA mixes cheap calls (get_accounts ~300ms) with heavy ones\n * (get_account_history, bridge.get_discussion — legitimately seconds), so it\n * ranks nodes fine but is the WRONG baseline for per-attempt deadlines: a\n * profile dominated by cheap calls would abort every legitimately-heavy call.\n * Deadlines/hedge delays therefore key on the FULL method for RPC\n * (\"condenser_api.get_account_history\") and api+endpoint template for REST —\n * an API prefix alone still mixes cheap and heavy methods. Ranking keeps the\n * global profile. Bounded: #nodes × #distinct methods called (code-defined,\n * not user input); fully cleared whenever the node's global profile expires\n * (the global clock advances on every sample, so global-stale ⇒ all stale).\n */\n apiLatency: Map\n}\n\n/**\n * JSON-RPC error codes that indicate the node itself is unhealthy, not that the\n * client sent a bad request. These should trigger failover to another node.\n *\n * Background: Hive nodes fronted by HAF/jussi/drone return HTTP 200 with a\n * JSON-RPC error body when a backing service (hivemind, postgrest, etc.) is down.\n * The HTTP layer looks healthy, so failover never triggers — the caller just gets\n * an error and gives up. This function identifies those node-level errors.\n */\nfunction isNodeLevelRPCError(code: number, message: string): boolean {\n // -32603: Internal error — node is having problems\n if (code === -32603) return true\n // -32000 to -32099: Server error range (implementation-defined server errors)\n if (code <= -32000 && code >= -32099) return true\n // -32601: Method not found — node may be missing this API plugin\n if (code === -32601) return true\n // -32602 with node-sick indicators (vs normal \"invalid params\" from bad client input)\n // e.g. \"Unable to parse endpoint data\" from HAF when a backing service is down\n if (code === -32602 && /unable to parse|endpoint data|internal/i.test(message)) return true\n return false\n}\n\n/** Extract the API prefix from a method name like \"rc_api.find_rc_accounts\" -> \"rc_api\". */\nfunction apiOf(method: string): string {\n const dot = method.indexOf('.')\n return dot > 0 ? method.slice(0, dot) : method\n}\n\n// ── Rate-limit (429) backoff constants ───────────────────────────────────────\n/** Base cooldown applied to a 429 with no usable `Retry-After` header. Matches the\n * previous flat default so first-offence behaviour is unchanged. */\nconst RATE_LIMIT_BASE_MS = 10_000\n/** Ceiling for the escalating header-less cooldown. Prevents a node from being\n * parked far longer than a real public node's throttle window. */\nconst RATE_LIMIT_MAX_MS = 60_000\n/** No 429 from a node for this long ⇒ its escalation streak resets to 0, so an\n * occasional throttle hours apart doesn't compound into a long park. */\nconst RATE_LIMIT_STREAK_RESET_MS = 120_000\n\n/** Per-API failure threshold before the node is deprioritized for that API only. */\nconst MAX_API_FAILURES_BEFORE_COOLDOWN = 2\n/** How long a node stays deprioritized for a specific API after repeated failures. */\nconst API_COOLDOWN_MS = 60_000\n/** How long head_block observations remain valid before being treated as unknown. */\nconst HEAD_BLOCK_MAX_AGE_MS = 120_000\n/** Maximum lag (in blocks) before a node is considered stale relative to the best-known head. */\nconst STALE_BLOCK_THRESHOLD = 30\n\n// ── Adaptive latency-ordering constants ──────────────────────────────────────\n/** EWMA smoothing weight for a new latency sample. 0.3 ⇒ ~5–6 samples to converge;\n * absorbs one-off GC/TLS spikes while still reacting to a real regional shift fast. */\nconst LATENCY_EWMA_ALPHA = 0.3\n/** Samples required before a node's latency is trusted for ranking. Below this the\n * node is \"warming\" and ranks at a neutral prior (config order via tiebreak), so a\n * single fluke never reorders the list and cold start == today's behavior. */\nconst LATENCY_MIN_SAMPLES = 3\n/** How long a latency sample stays usable for ranking. Past this a node reverts to\n * warming. Must be > LATENCY_REPROBE_MS so re-probes keep a busy node's profile fresh. */\nconst LATENCY_MAX_AGE_MS = 5 * 60_000\n/** A healthy node not sampled within this window is overdue for an exploratory\n * re-probe (promoted to front of ONE ordering). This is what lets a demoted node\n * climb back when it recovers — and what profiles a node that organic traffic never\n * reaches. 60s ⇒ ~1 probe/node/min worst case = negligible cost. */\nconst LATENCY_REPROBE_MS = 60_000\n/** Neutral score (ms) for an unproven/warming node: optimistic enough to sit ahead\n * of a proven-slow node (so we explore an unknown before hammering a known-slow one)\n * but behind a proven-fast node. Fixed, so a node makes at most ONE rank transition\n * when it crosses LATENCY_MIN_SAMPLES — no churn. */\nconst LATENCY_UNPROVEN_PRIOR_MS = 1_000\n/** A failed call only feeds a latency penalty if it was actually slow (≥ this). Keeps\n * a genuine timeout / slow-5xx (a far-region node case) visible to the ranker while an\n * instant ECONNREFUSED (a *down* node, handled by consecutiveFailures) is NOT mis-read\n * as \"slow\". The penalty value is the *measured* elapsed, never a static constant. */\nconst LATENCY_SLOW_FAILURE_MS = 2_000\n\n/**\n * Latency-ranking tuning, re-exported as a frozen bag so tests assert behaviour\n * against the real numbers instead of mirroring literals that can silently drift.\n * @internal — not part of the package's public API; for the co-located spec only.\n */\nexport const __LATENCY_TUNING__ = Object.freeze({\n EWMA_ALPHA: LATENCY_EWMA_ALPHA,\n MIN_SAMPLES: LATENCY_MIN_SAMPLES,\n MAX_AGE_MS: LATENCY_MAX_AGE_MS,\n REPROBE_MS: LATENCY_REPROBE_MS,\n UNPROVEN_PRIOR_MS: LATENCY_UNPROVEN_PRIOR_MS,\n SLOW_FAILURE_MS: LATENCY_SLOW_FAILURE_MS\n})\n\n/** @internal Exported for testing only. */\nexport class NodeHealthTracker {\n private health = new Map()\n\n private getOrCreate(node: string): NodeHealth {\n let h = this.health.get(node)\n if (!h) {\n h = {\n consecutiveFailures: 0,\n lastFailureTime: 0,\n rateLimitedUntil: 0,\n rateLimitStreak: 0,\n lastRateLimitAt: 0,\n apiFailures: new Map(),\n headBlock: 0,\n headBlockUpdatedAt: 0,\n ewmaLatencyMs: undefined,\n latencySampleCount: 0,\n latencyUpdatedAt: 0,\n // Stamp the probe clock at creation so a brand-new (never-sampled) node is\n // NOT treated as \"overdue for re-probe\" on its very first ordering pass.\n // With lastProbeAt=0 the re-probe gate (touch <= now - LATENCY_REPROBE_MS)\n // fired immediately, so the 2nd+ ordering on a cold worker promoted unproven\n // nodes ahead of the configured order for no measured reason. Seeding it to\n // \"now\" preserves configured order during warmup; a genuinely slow preferred\n // node is still demoted by its EWMA score (not by epoch-zero exploration),\n // and idle nodes are still re-probed once LATENCY_REPROBE_MS has truly elapsed.\n lastProbeAt: Date.now(),\n apiLatency: new Map()\n }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number, profileKey?: string): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 0\n // A success means the node recovered — clear the escalation streak so the next\n // throttle starts from the base cooldown. We deliberately do NOT clear an active\n // rateLimitedUntil window here: under concurrency a success from a request that was\n // already in flight can resolve *after* another request recorded a fresh 429\n // Retry-After, and erasing the window would put a just-throttled node back into\n // rotation early. The window expires on its own (short for header-less; the server's\n // value for an explicit Retry-After).\n h.rateLimitStreak = 0\n if (api) {\n // A successful API call clears that API's failure counter — but never an\n // ACTIVE defective-response cooldown: the \"success\" may itself be an\n // unvalidated read from the same lying node (validated calls are the\n // minority of traffic), and re-admitting it early defeats the decisive\n // penalty. That window expires on its own, like rateLimitedUntil above.\n const apiFail = h.apiFailures.get(api)\n if (!apiFail || !(apiFail.defective && apiFail.cooldownUntil > Date.now())) {\n h.apiFailures.delete(api)\n }\n }\n if (typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0) {\n // Latency profiles use the finest key available (full method / endpoint\n // template); the API prefix is only a fallback so bare callers still\n // profile SOMETHING. Failure state above stays per-API on purpose.\n this.recordLatency(h, durationMs, profileKey ?? api)\n }\n }\n\n /**\n * Record a *slow* failed call as a latency signal. The failure counters are\n * updated separately (recordFailure/recordError); this only feeds the EWMA so a\n * node that returns 200-but-too-slow, times out, or returns a slow 5xx is ranked\n * on its real slowness. Callers pass the MEASURED elapsed ms and only call this\n * when the call was genuinely slow (≥ LATENCY_SLOW_FAILURE_MS) — an instant\n * connection failure (a *down* node) must NOT look \"slow\".\n */\n recordSlowFailure(node: string, durationMs: number, profileKey?: string): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs, profileKey)\n }\n\n /**\n * Usable latency profile (EWMA ms), or `undefined` while unproven or stale.\n * With a `profileKey` (full RPC method / REST api+endpoint template),\n * returns that (node, key) profile ONLY — deliberately no fallback to the\n * mixed global profile, because an average dominated by cheap calls is the\n * wrong deadline baseline for a heavy method (that fallback is exactly the\n * \"2s window starves get_account_history\" failure mode). Without a key,\n * returns the global ranking profile. Both follow the same \"profiled and\n * fresh\" gate as the ranker.\n * @internal\n */\n getUsableLatencyMs(node: string, profileKey?: string): number | undefined {\n const h = this.health.get(node)\n if (!h) return undefined\n const now = Date.now()\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n return p &&\n p.sampleCount >= LATENCY_MIN_SAMPLES &&\n now - p.updatedAt <= LATENCY_MAX_AGE_MS\n ? p.ewmaMs\n : undefined\n }\n return this.isLatencyUsable(h, now) ? h.ewmaLatencyMs : undefined\n }\n\n /**\n * Censored latency sample for a request that was ABORTED because a hedge\n * completed first while it was still in flight. The elapsed-at-abort is a\n * *lower bound* on the true latency, so folding it in can only move the\n * node's EWMA toward the truth, never below it — which is what lets repeated\n * hedge-wins reorder the pool. Deliberately does NOT touch the failure\n * counters or rate-limit state: the node returned no error, it was merely\n * slow, and treating cancellation as failure would flap `isNodeHealthy`.\n * Callers must NOT record this for a primary that already settled on its own\n * (its outcome was recorded normally; a second sample would be fabricated).\n * Bypasses the `recordSlowFailure` 2s floor (a hedge can win well below it).\n * By construction the elapsed is ≥ the hedge delay, so only a degenerate\n * near-zero epsilon needs rejecting — anything under one LAN round trip is\n * noise, not a latency measurement.\n * @internal\n */\n recordCensoredLatency(node: string, elapsedMs: number, profileKey?: string): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 50) return\n this.recordLatency(this.getOrCreate(node), elapsedMs, profileKey)\n }\n\n /**\n * Fold a latency sample into the node's global EWMA (warmup + usability\n * bookkeeping) and, when a profile key is given, into that (node, key)\n * profile — the global one ranks nodes, the keyed one calibrates deadlines.\n */\n private recordLatency(h: NodeHealth, durationMs: number, profileKey?: string): void {\n const now = Date.now()\n // A profile older than the usable window starts fresh, so an idled process\n // re-learns from scratch rather than ranking on hour-old data. Every keyed\n // profile shares this clock (each sample updates both), so global-stale\n // implies every keyed profile is stale too — clear the map rather than\n // leave never-again-read tombstone entries for the life of the process.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\n h.apiLatency.clear()\n }\n h.ewmaLatencyMs =\n h.ewmaLatencyMs === undefined\n ? durationMs\n : LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * h.ewmaLatencyMs\n h.latencySampleCount++\n h.latencyUpdatedAt = now\n\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n if (!p || now - p.updatedAt > LATENCY_MAX_AGE_MS) {\n h.apiLatency.set(profileKey, { ewmaMs: durationMs, sampleCount: 1, updatedAt: now })\n } else {\n p.ewmaMs = LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * p.ewmaMs\n p.sampleCount++\n p.updatedAt = now\n }\n }\n }\n\n recordFailure(node: string, api?: string): void {\n const h = this.getOrCreate(node)\n if (api) {\n // API-specific failure: only update the per-API tracker.\n // This prevents e.g. 3 rc_api failures from marking the node\n // globally unhealthy for condenser_api too.\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n // Reset counter if previous cooldown expired OR last failure was >30s ago\n // (avoids sticky penalties from sparse failures hours apart)\n if (\n (existing.cooldownUntil > 0 && existing.cooldownUntil <= now) ||\n (existing.lastFailureTime > 0 && now - existing.lastFailureTime > 30_000)\n ) {\n existing.count = 0\n existing.cooldownUntil = 0\n }\n existing.count++\n existing.lastFailureTime = now\n if (existing.count >= MAX_API_FAILURES_BEFORE_COOLDOWN) {\n existing.cooldownUntil = now + API_COOLDOWN_MS\n }\n h.apiFailures.set(api, existing)\n } else {\n // Transport-level failure (no specific API): update global counter\n h.consecutiveFailures++\n h.lastFailureTime = Date.now()\n }\n }\n\n /**\n * A response that failed the caller's payload validation is a decisive,\n * reproducible node fault — the node answered 200 with data the caller KNOWS\n * to be impossible — so it trips the per-API cooldown immediately instead of\n * accruing ordinary strikes. Deliberately its own method rather than\n * recordFailure × N: ordinary strikes are cleared by any success, and a\n * top-ranked lying node keeps recording successes on the unvalidated calls\n * between probes, which would reset its strikes forever and keep it in\n * rotation (observed live). Scope stays per-API: the node may be perfectly\n * healthy for its other API families.\n */\n recordDefectiveResponse(node: string, api: string): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n existing.count = Math.max(existing.count + 1, MAX_API_FAILURES_BEFORE_COOLDOWN)\n existing.lastFailureTime = now\n existing.cooldownUntil = now + API_COOLDOWN_MS\n existing.defective = true\n h.apiFailures.set(api, existing)\n }\n\n /**\n * Cool down a rate-limited node. Honors an explicit server `Retry-After`\n * (`retryAfterMs`) exactly — the server told us when to return. With no usable\n * header, applies escalating backoff: BASE, 2×BASE, 4×BASE … capped at\n * RATE_LIMIT_MAX_MS, indexed by the node's consecutive-429 streak (reset by a\n * success or after RATE_LIMIT_STREAK_RESET_MS of quiet). This stops a throttled\n * public node from being re-admitted every 10s and re-hammered under sustained\n * load, which matters most when the fleet's own unlimited node is removed.\n */\n recordRateLimit(node: string, retryAfterMs?: number): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n // Expire a stale streak so an occasional throttle hours apart doesn't compound.\n if (h.rateLimitStreak > 0 && now - h.lastRateLimitAt > RATE_LIMIT_STREAK_RESET_MS) {\n h.rateLimitStreak = 0\n }\n const hasHeader = typeof retryAfterMs === 'number' && Number.isFinite(retryAfterMs) && retryAfterMs > 0\n const cooldown = hasHeader\n ? retryAfterMs!\n : Math.min(RATE_LIMIT_BASE_MS * 2 ** h.rateLimitStreak, RATE_LIMIT_MAX_MS)\n // Only a header-less 429 advances the escalation streak — an explicit Retry-After is\n // honored exactly and must not compound the header-less backoff (else several\n // Retry-After 429s would push a later header-less 429 straight to the 60s cap).\n if (!hasHeader) h.rateLimitStreak++\n h.lastRateLimitAt = now\n // Explicit Retry-After is honored exactly (the server's current instruction). A\n // header-less cooldown may only move the window FORWARD — it must never truncate a\n // longer window already set, e.g. a node parked for an hour by an explicit\n // Retry-After that is later retried as a last resort and returns a header-less 429\n // must not have its 1h window cut down to the 10s base.\n h.rateLimitedUntil = hasHeader\n ? now + cooldown\n : Math.max(h.rateLimitedUntil, now + cooldown)\n h.consecutiveFailures++\n h.lastFailureTime = now\n }\n\n /** Record an observed head_block_number for this node. */\n recordHeadBlock(node: string, blockNum: number): void {\n if (!blockNum || !Number.isFinite(blockNum)) return\n const h = this.getOrCreate(node)\n h.headBlock = blockNum\n h.headBlockUpdatedAt = Date.now()\n }\n\n /**\n * Consensus head block from recent observations. Uses the median rather than the\n * max to prevent a single bad/misconfigured node from poisoning the reference.\n * A node reporting an inflated head_block won't affect the median unless the\n * majority of nodes agree on that range.\n */\n private consensusHeadBlock(): number {\n const now = Date.now()\n const recent: number[] = []\n for (const h of this.health.values()) {\n if (h.headBlock > 0 && now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS) {\n recent.push(h.headBlock)\n }\n }\n if (recent.length < 2) return 0 // Need at least 2 observations to compare\n recent.sort((a, b) => a - b)\n // Median: for even length, use the lower-middle value (conservative)\n return recent[Math.floor((recent.length - 1) / 2)]\n }\n\n /** True if this node is healthy (globally and for the given API if provided). */\n isNodeHealthy(node: string, api?: string): boolean {\n const h = this.health.get(node)\n if (!h) return true // unknown nodes assumed healthy\n const now = Date.now()\n\n // Rate-limited and cooldown hasn't expired\n if (h.rateLimitedUntil > now) return false\n\n // Too many consecutive failures within the last 30 seconds\n if (h.consecutiveFailures >= 3 && now - h.lastFailureTime < 30_000) return false\n\n // Per-API cooldown: node may be healthy overall but missing this API plugin\n if (api) {\n const apiFail = h.apiFailures.get(api)\n if (apiFail && apiFail.cooldownUntil > now) return false\n }\n\n // Head-block staleness: deprioritize nodes lagging behind the consensus head\n const best = this.consensusHeadBlock()\n if (\n best > 0 &&\n h.headBlock > 0 &&\n now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS &&\n best - h.headBlock > STALE_BLOCK_THRESHOLD\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Order nodes best-first: healthy nodes sorted by adaptive latency score, then\n * unhealthy nodes appended. Capability / staleness / rate-limit filtering stays in\n * `isNodeHealthy` and is unchanged — latency only reorders WITHIN the healthy set,\n * and only WITHIN the array it is handed (so it never leaves the configured list).\n *\n * One ordering per pass MAY promote a healthy node overdue for a re-probe (never\n * sampled, or not sampled within LATENCY_REPROBE_MS) to the front — single-flight\n * via `lastProbeAt`. This is what lets a demoted node climb back when it recovers,\n * and profiles a node that organic traffic (always served by a faster peer) never\n * reaches. Cold start: with no profiles, every node scores the neutral prior and the\n * stable config-index tiebreak yields the original order — i.e. today's behavior.\n */\n getOrderedNodes(nodes: string[], api?: string): string[] {\n const healthy: string[] = []\n const unhealthy: string[] = []\n for (const node of nodes) {\n if (this.isNodeHealthy(node, api)) {\n healthy.push(node)\n } else {\n unhealthy.push(node)\n }\n }\n if (healthy.length <= 1) {\n return [...healthy, ...unhealthy]\n }\n const now = Date.now()\n // Every score in THIS pass falls back to config index on ties → a total,\n // transitive order with no memo (so no stale-denominator inversions).\n const ordered = healthy\n .map((node, i) => ({ node, i, score: this.scoreNode(node, now) }))\n .sort((a, b) => a.score - b.score || a.i - b.i)\n .map((d) => d.node)\n const probe = this.pickReprobeCandidate(healthy, now)\n if (probe && ordered[0] !== probe) {\n return [probe, ...ordered.filter((n) => n !== probe), ...unhealthy]\n }\n return [...ordered, ...unhealthy]\n }\n\n /** A node's latency is usable for ranking only if profiled (≥ MIN_SAMPLES) and fresh. */\n private isLatencyUsable(h: NodeHealth | undefined, now: number): boolean {\n return (\n !!h &&\n h.ewmaLatencyMs !== undefined &&\n h.latencySampleCount >= LATENCY_MIN_SAMPLES &&\n now - h.latencyUpdatedAt <= LATENCY_MAX_AGE_MS\n )\n }\n\n /**\n * Ranking score (lower = better). Unproven/warming nodes get a fixed neutral prior\n * so they sit ahead of a proven-slow node but behind a proven-fast one, and make at\n * most one rank transition when they cross MIN_SAMPLES (no churn).\n */\n private scoreNode(node: string, now: number): number {\n const h = this.health.get(node)\n if (!this.isLatencyUsable(h, now)) return LATENCY_UNPROVEN_PRIOR_MS\n return h!.ewmaLatencyMs!\n }\n\n /**\n * At most one healthy node overdue for an exploratory re-probe: never sampled, or\n * neither sampled nor re-probed within LATENCY_REPROBE_MS. Returns the stalest such\n * node and stamps `lastProbeAt` to single-flight it against concurrent orderings.\n *\n * Note: `getOrCreate` here materializes a health entry per node in the passed list.\n * The node list (`config.nodes`/`restNodes`) is treated as effectively static — set\n * once via `setNodes` — so the map is bounded. If a host is ever removed from the\n * list at runtime its stale entry is simply ignored (never re-surfaced) and is a\n * negligible, bounded amount of memory.\n */\n private pickReprobeCandidate(healthy: string[], now: number): string | undefined {\n const threshold = now - LATENCY_REPROBE_MS\n let cand: string | undefined\n let candTouch = Infinity\n for (const n of healthy) {\n const h = this.getOrCreate(n)\n const touch = Math.max(h.latencyUpdatedAt, h.lastProbeAt)\n if (touch <= threshold && touch < candTouch) {\n cand = n\n candTouch = touch\n }\n }\n if (cand) this.getOrCreate(cand).lastProbeAt = now\n return cand\n }\n}\n\n// Exported for the co-located specs only (asserting the call sites' effect on\n// health). Not re-exported by hive-tx/index.ts, so NOT part of the public API.\n// @internal\nexport const rpcHealthTracker = new NodeHealthTracker()\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\n\n// ── Hedged-request budget ────────────────────────────────────────────────────\n\n/**\n * Token bucket bounding hedged (duplicated) read requests to a fraction of\n * overall traffic. A hedge spends 1 token; every un-hedged success refills\n * `config.resilience.hedgeRefillPerSuccess` (default 0.1 ⇒ steady-state hedge\n * rate ≤ ~9% of successful traffic, with bursts up to `hedgeBucketCapacity`).\n * The self-limiting property this buys: under pool-wide slowness nearly every\n * request wants to hedge while successes (the refills) stagnate, so the bucket\n * drains and hedging auto-disables instead of doubling load into public-node\n * rate limits — the standard hedged-request guard (cf. gRPC's hedging throttle;\n * Dean & Barroso, \"The Tail at Scale\"). One instance per process shared across\n * concurrent calls; plain synchronous mutation is race-free on the JS event\n * loop. Reads config live so runtime tuning via `setResilience` applies.\n * @internal Exported for testing only.\n */\nexport class HedgeBudget {\n private tokens = config.resilience.hedgeBucketCapacity\n\n trySpend(): boolean {\n this.clamp()\n // Epsilon guards fractional-refill float accumulation (10 × 0.1 < 1 in FP64).\n if (this.tokens >= 1 - 1e-9) {\n this.tokens -= 1\n return true\n }\n return false\n }\n\n refill(): void {\n this.clamp()\n this.tokens = Math.min(\n config.resilience.hedgeBucketCapacity,\n this.tokens + config.resilience.hedgeRefillPerSuccess\n )\n }\n\n /** Capacity may be lowered at runtime; never let stored tokens exceed it. */\n private clamp(): void {\n if (this.tokens > config.resilience.hedgeBucketCapacity) {\n this.tokens = config.resilience.hedgeBucketCapacity\n }\n }\n\n /** @internal test hook */\n get available(): number {\n return this.tokens\n }\n\n /** @internal test hook */\n reset(tokens = config.resilience.hedgeBucketCapacity): void {\n this.tokens = tokens\n }\n}\n\n// @internal — exported for the co-located spec only, like the trackers above.\nexport const rpcHedgeBudget = new HedgeBudget()\n\n/**\n * Per-attempt timeout for a read call. A node profiled for THIS profile key\n * (full RPC method / REST api+endpoint template) is given `factor × EWMA` —\n * floored (≥2s) so a moderate spike on a fast call is not cut off, and capped\n * at the caller's ceiling so this can only ever *shorten* the wait. The\n * effect: a node running far above its own baseline for this exact kind of\n * call is abandoned early and failover starts in seconds instead of the full\n * fixed window.\n *\n * Two deliberate exclusions:\n * - `explicit` callers (who passed a timeout argument) keep exactly what they\n * asked for — the documented meaning of the parameter is preserved, and a\n * consumer who knows their call is heavy is never second-guessed.\n * - The profile is per (node, full method) with NO fallback to the node's\n * mixed global EWMA or even the API-prefix average: a baseline dominated by\n * cheap `condenser_api.get_accounts` calls must not set the deadline for a\n * heavy `condenser_api.get_account_history`. An unprofiled (node, method)\n * pair keeps the caller's timeout unchanged (cold start == old behavior).\n */\nfunction adaptiveAttemptTimeout(\n tracker: NodeHealthTracker,\n node: string,\n profileKey: string,\n callerTimeout: number,\n explicit: boolean\n): number {\n const r = config.resilience\n if (!r.adaptiveTimeout || explicit) return callerTimeout\n const ewma = tracker.getUsableLatencyMs(node, profileKey)\n if (ewma === undefined) return callerTimeout\n // EWMAs are fractional, but the result feeds AbortSignal.timeout(), which\n // Node rejects with ERR_OUT_OF_RANGE for non-integer delays (browsers coerce).\n return Math.ceil(\n Math.min(callerTimeout, Math.max(r.adaptiveTimeoutFloorMs, r.adaptiveTimeoutFactor * ewma))\n )\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/** Record a caught error on the health tracker (handles NodeError to avoid double-counting). */\nfunction recordError(tracker: NodeHealthTracker, node: string, e: any, api?: string): void {\n if (e instanceof NodeError) {\n if (e.isRateLimit) {\n // 0 → no usable Retry-After → let recordRateLimit apply escalating backoff.\n tracker.recordRateLimit(node, e.rateLimitMs || undefined)\n } else {\n tracker.recordFailure(node, api)\n }\n } else if (e instanceof RPCError) {\n // RPC-level errors are API-specific (e.g., disabled API)\n tracker.recordFailure(node, api)\n } else {\n // Transport-level failures (DNS, TLS, timeout) affect the whole node\n tracker.recordFailure(node)\n }\n}\n\n/**\n * Passively extract head_block_number from known RPC responses\n * (e.g. `condenser_api.get_dynamic_global_properties`, `database_api.get_dynamic_global_properties`).\n * Silently ignores responses without that shape.\n */\nfunction tryRecordHeadBlock(\n tracker: NodeHealthTracker,\n node: string,\n method: string,\n result: any\n): void {\n if (!result || typeof result !== 'object') return\n if (!method.includes('get_dynamic_global_properties')) return\n const block = (result as any).head_block_number\n if (typeof block === 'number') {\n tracker.recordHeadBlock(node, block)\n }\n}\n\n// ── AbortSignal helpers (browser fallbacks) ─────────────────────────────────\n\n/**\n * Build a TimeoutError \"reason\" for an aborted signal.\n * Prefers the standard `DOMException` when available. Runtimes that ship\n * `AbortController` without `DOMException` (notably React Native / Hermes,\n * old Node < 17) fall back to a plain Error tagged with `name: 'TimeoutError'`\n * — which is what consumers actually check on `signal.reason`.\n */\nfunction createTimeoutReason(): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException('The operation was aborted due to timeout', 'TimeoutError')\n }\n const err = new Error('The operation was aborted due to timeout')\n err.name = 'TimeoutError'\n return err\n}\n\n/** AbortSignal.timeout polyfill for pre-Chrome 103 / pre-Safari 16.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to clear the dangling timer. */\nfunction createTimeoutSignal(ms: number): { signal: AbortSignal; cleanup: () => void } {\n // Node's AbortSignal.timeout throws ERR_OUT_OF_RANGE on fractional delays\n // (browsers coerce them), so guard every caller here.\n ms = Math.ceil(ms)\n if (typeof AbortSignal.timeout === 'function') {\n return { signal: AbortSignal.timeout(ms), cleanup: () => {} }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(createTimeoutReason()), ms)\n return { signal: controller.signal, cleanup: () => clearTimeout(timer) }\n}\n\n/** AbortSignal.any polyfill for pre-Chrome 116 / pre-Safari 17.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to remove listeners from the input signals (prevents leaks when the\n * same long-lived signal is reused across many callRPC invocations). */\nfunction mergeSignals(\n primary: AbortSignal,\n secondary?: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!secondary) return { signal: primary, cleanup: () => {} }\n if (typeof AbortSignal.any === 'function') {\n return { signal: AbortSignal.any([primary, secondary]), cleanup: () => {} }\n }\n // Fallback: controller that aborts with the winning signal's reason\n const controller = new AbortController()\n if (primary.aborted) {\n controller.abort(primary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n if (secondary.aborted) {\n controller.abort(secondary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n\n const onPrimaryAbort = () => controller.abort(primary.reason)\n const onSecondaryAbort = () => controller.abort(secondary.reason)\n primary.addEventListener('abort', onPrimaryAbort, { once: true })\n secondary.addEventListener('abort', onSecondaryAbort, { once: true })\n\n const cleanup = () => {\n primary.removeEventListener('abort', onPrimaryAbort)\n secondary.removeEventListener('abort', onSecondaryAbort)\n }\n return { signal: controller.signal, cleanup }\n}\n\n/**\n * Low-level JSON-RPC call to a single node. No failover.\n * Throws RPCError for blockchain rejections, NodeError for HTTP 429/5xx,\n * and generic Error for other transport failures.\n * @param shouldRetry - If true, retries once on the same node for transient errors.\n */\nconst jsonRPCCall = async (\n url: string,\n method: string,\n params: any,\n timeout = config.timeout,\n shouldRetry = false,\n externalSignal?: AbortSignal\n) => {\n const id = Math.floor(Math.random() * 100_000_000)\n const body = {\n jsonrpc: '2.0',\n method,\n params,\n id\n }\n // Merge the per-call timeout with any external abort signal (e.g., SSR\n // request cancellation). Either one firing cancels the fetch.\n // Fallbacks for browsers without AbortSignal.timeout (pre-Chrome 103)\n // or AbortSignal.any (pre-Chrome 116).\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\n const { signal, cleanup: cleanupMerge } = mergeSignals(tSignal, externalSignal)\n const cleanup = () => {\n cleanupTimeout()\n cleanupMerge()\n }\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...serverIdentityHeaders() },\n signal\n })\n\n // Handle HTTP-level errors before parsing JSON.\n // Throw NodeError so callers can record health exactly once.\n if (res.status === 429) {\n throw new NodeError(url, `HTTP 429 Rate Limited`, {\n rateLimitMs: parseRetryAfterMs(res.headers.get('Retry-After')),\n isRateLimit: true\n })\n }\n // Any other 5xx is a node-level failure. Common cases:\n // 502 Bad Gateway — upstream HAF/jussi down\n // 503 Service Unavail — node draining / maintenance\n // 504 Gateway Timeout — slow upstream\n // 520-530 — Cloudflare interstitials (1033 tunnel error → 530)\n // Without this branch, the HTML error-page body would fall into res.json()\n // and throw a generic SyntaxError downstream, making failover guess at\n // whether the request reached the node.\n if (res.status >= 500 && res.status < 600) {\n throw new NodeError(url, `HTTP ${res.status} from ${url}`)\n }\n\n const result = (await res.json()) as CallResponse\n if (\n !result ||\n typeof result.id === 'undefined' ||\n result.id !== id ||\n result.jsonrpc !== '2.0'\n ) {\n throw new Error('JSONRPC id mismatch')\n }\n if ('result' in result) {\n return result.result\n }\n if ('error' in result) {\n const e = result.error\n if ('message' in e && 'code' in e) {\n throw new RPCError(e)\n }\n throw result.error\n }\n // No result and no error?\n throw result\n } catch (e) {\n if (e instanceof RPCError) {\n throw e\n }\n // NodeError should not be retried on the same node - it's an HTTP status issue\n if (e instanceof NodeError) {\n throw e\n }\n if (externalSignal?.aborted) {\n throw e\n }\n if (shouldRetry) {\n return jsonRPCCall(url, method, params, timeout, false, externalSignal)\n }\n throw e\n } finally {\n cleanup()\n }\n}\n\n/** Small jitter delay between failover attempts to prevent thundering herd. */\nfunction jitterDelay(): Promise {\n return sleep(50 + Math.random() * 50)\n}\n\n// ── Hedged read attempt ─────────────────────────────────────────────────────\n\n/**\n * One hedged READ attempt: start the primary node, and if it is still pending\n * after `max(hedgeDelayFloorMs, hedgeDelayFactor × primary EWMA)`, race a\n * duplicate against the next healthy untried node. First success wins and the\n * loser is aborted. Resolution rules (mirroring the sequential path exactly):\n *\n * - External abort (caller cancelled): reject immediately, record nothing.\n * - Authoritative RPCError (non-node-level blockchain rejection) from either\n * leg: an answer, not a fault — abort the other leg, reject immediately.\n * - Failover-class failure: record health for that leg (recordError +\n * recordSlowFailure — identical to the sequential catch); if the other leg\n * is still running, keep waiting on it; when both have failed, reject with\n * the last error so the outer loop continues its normal failover.\n * - Primary fails BEFORE the hedge fires: reject immediately (plain failover —\n * hedging only ever races slowness, never a node that failed fast).\n *\n * Health/budget bookkeeping on a win: winner records a normal success sample;\n * if the hedge won, the primary gets a censored latency sample (elapsed at\n * abort — a lower bound on its true latency) so repeated hedge-wins reorder\n * the pool; if the primary won without the hedge ever firing, the budget\n * refills. An aborted hedge leg records nothing (it was never given a fair\n * run). Broadcasts NEVER go through this path (double-broadcast risk) — it is\n * wired into `callRPC` only.\n */\nfunction hedgedRpcAttempt(opts: {\n method: string\n params: any[] | object\n api: string\n primary: string\n /**\n * Pre-selected healthy untried peers (up to a few, in rank order). The\n * actual hedge target is drawn uniformly at random at FIRE time: with many\n * concurrent callers behind one origin IP, always duplicating to the single\n * next-ranked node would concentrate the whole hedge stream on it and could\n * trip its per-IP rate limit — spreading over the top candidates keeps the\n * same budget bound without a single-target hotspot. Marked tried only if\n * the hedge actually fires.\n */\n hedgePool: string[]\n callerTimeout: number\n /** Caller passed an explicit timeout — adaptive shortening is disabled. */\n explicitTimeout: boolean\n /** The call's wall-clock deadline: a hedge must not START past it (it would\n * be a brand-new request the outer loop itself would refuse to start). */\n deadlineAt: number\n externalSignal?: AbortSignal\n /** Lets the outer loop add the hedge node to its tried-set at fire time. */\n onHedgeFired: (node: string) => void\n /** Caller-supplied payload validation — see callRPC's `validate` param. */\n validate?: (result: unknown) => boolean\n}): Promise {\n const {\n method,\n params,\n api,\n primary,\n hedgePool,\n callerTimeout,\n explicitTimeout,\n deadlineAt,\n externalSignal,\n onHedgeFired,\n validate\n } = opts\n return new Promise((resolve, reject) => {\n let done = false\n let pendingLegs = 0\n let hedgeFired = false\n /** The primary settled on its own (success OR failure). A censored latency\n * sample is only valid for a primary that was still in flight when the\n * hedge won — recording one after the primary already failed would\n * fabricate a second sample for a request whose outcome was recorded. */\n let primarySettled = false\n let lastError: any\n let hedgeTimer: ReturnType | undefined\n let primaryStart = 0\n const controllers: AbortController[] = []\n\n /** Settle exactly once: clear the timer, abort every other in-flight leg\n * (their rejections land behind the `done` guard and are dropped). */\n const finish = (settle: () => void) => {\n if (done) return\n done = true\n if (hedgeTimer !== undefined) {\n clearTimeout(hedgeTimer)\n hedgeTimer = undefined\n }\n for (const c of controllers) {\n if (!c.signal.aborted) c.abort()\n }\n settle()\n }\n\n const startLeg = (node: string, isHedge: boolean) => {\n pendingLegs++\n const controller = new AbortController()\n controllers.push(controller)\n // Merge our cancellation handle with the caller's signal; jsonRPCCall\n // merges the result with its own per-attempt timeout signal.\n const merged = mergeSignals(controller.signal, externalSignal)\n const legTimeout = adaptiveAttemptTimeout(\n rpcHealthTracker,\n node,\n method,\n callerTimeout,\n explicitTimeout\n )\n const start = Date.now()\n if (!isHedge) primaryStart = start\n jsonRPCCall(node, method, params, legTimeout, false, merged.signal)\n .then((res) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Same handling as the catch\n // path — record the fault against this node's API health, never\n // record a success for a lie, and let the other leg still win.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(\n `[hive-tx] response validation failed for ${method} from ${node}`\n )\n if (!isHedge && !hedgeFired) {\n finish(() => reject(lastError))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n return\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - start, method)\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n if (isHedge) {\n if (!primarySettled) {\n // Primary lost the race while still in flight: censored sample\n // (lower bound of its true latency) so the ranker learns without\n // marking it as failed. A primary that already failed was fully\n // recorded by its own catch — nothing more to record.\n rpcHealthTracker.recordCensoredLatency(primary, Date.now() - primaryStart, method)\n }\n } else if (!hedgeFired) {\n rpcHedgeBudget.refill()\n }\n finish(() => resolve(res as T))\n })\n .catch((e) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return // aborted loser (or late settle) — already resolved\n if (externalSignal?.aborted) {\n // Caller cancelled — bail without recording (mirrors sequential path).\n finish(() => reject(e))\n return\n }\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n // Authoritative rejection: an answer, not a node fault.\n finish(() => reject(e))\n return\n }\n // Failover-class failure — record exactly as the sequential catch does.\n recordError(rpcHealthTracker, node, e, api)\n rpcHealthTracker.recordSlowFailure(node, Date.now() - start, method)\n lastError = e\n if (!isHedge && !hedgeFired) {\n // Primary failed fast, before the hedge delay: plain failover.\n finish(() => reject(e))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n // else: the other leg is still in flight and may still win.\n })\n }\n\n startLeg(primary, false)\n\n // Delay from the primary's per-method profile (the eligibility gate\n // ensured it is usable); a raced expiry just means the floor applies. It is\n // then clamped BELOW the primary's own attempt window: for a heavy API\n // (EWMA > window/hedgeDelayFactor) the un-clamped delay would land past\n // the primary's timeout-abort — which clears this timer — so hedging would\n // silently never fire for exactly the heavy tail it exists to protect.\n // Firing at ~80% of the window keeps the duplicate meaningful (it starts\n // while the primary is still allowed to win) for every profile shape.\n const ewma = rpcHealthTracker.getUsableLatencyMs(primary, method) ?? 0\n const primaryWindow = adaptiveAttemptTimeout(\n rpcHealthTracker,\n primary,\n method,\n callerTimeout,\n explicitTimeout\n )\n const delay = Math.min(\n Math.max(config.resilience.hedgeDelayFloorMs, config.resilience.hedgeDelayFactor * ewma),\n 0.8 * primaryWindow\n )\n hedgeTimer = setTimeout(() => {\n hedgeTimer = undefined\n if (done || externalSignal?.aborted) return\n // Never START a duplicate past the call's wall-clock deadline — it would\n // extend the hold and spend a token on work the outer loop would refuse.\n if (Date.now() >= deadlineAt) return\n // Candidates were selected before the delay elapsed — re-check health at\n // fire time (one may have been rate-limited meanwhile) BEFORE spending a\n // token, so a stale pool costs nothing. Random draw spreads concurrent\n // callers' duplicates across the top candidates (see hedgePool doc).\n const live = hedgePool.filter((n) => rpcHealthTracker.isNodeHealthy(n, api))\n if (live.length === 0) return\n const target = live[Math.floor(Math.random() * live.length)]\n // Budget check at fire time, not arm time: only actual duplicates spend.\n if (!rpcHedgeBudget.trySpend()) return\n hedgeFired = true\n onHedgeFired(target)\n startLeg(target, true)\n }, delay)\n })\n}\n\n// ── Public API: callRPC ─────────────────────────────────────────────────────\n\n/**\n * Makes API calls to Hive blockchain nodes with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, jitter between retries,\n * and HTTP status awareness (429 rate limiting, 503).\n *\n * If the current node fails, it will automatically try the next healthy node.\n * When all nodes have been tried, wraps around to give earlier nodes another chance\n * until the full retry budget (config.retry) is exhausted.\n * RPCErrors (valid blockchain rejections) are never retried.\n *\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Maximum number of retry attempts (default: config.retry). The\n * wall-clock budget (`config.resilience.totalBudgetFactor` × timeout) may end\n * the failover walk before the retry count is exhausted.\n * @param validate - Optional payload validation. Some nodes return a valid\n * JSON-RPC envelope carrying an impossible payload (e.g. account rows with\n * metadata fields stripped to \"\"), which no transport-level check can catch.\n * When the callback returns false the response is treated as a node fault:\n * recorded against that node's per-API health (repeat offenders get an API\n * cooldown and are deprioritized) and the failover walk continues to the\n * next node instead of returning the lie. Keep validators conservative —\n * reject only payloads the caller KNOWS cannot be correct, or a strict\n * validator turns every node's honest answer into a failover storm.\n * @returns Promise resolving to the API response\n * @throws {RPCError} On blockchain-level errors (bad params, missing authority, etc.)\n * @throws {Error} If all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callRPC } from 'hive-tx'\n *\n * // Get account information\n * const accounts = await callRPC('condenser_api.get_accounts', [['alice']])\n *\n * // Custom timeout and retry settings\n * const data = await callRPC('condenser_api.get_content', ['alice', 'test-post'], 10_000, 5)\n * ```\n */\nexport const callRPC = async (\n method: string,\n params: any[] | object = [],\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal,\n validate?: (result: unknown) => boolean\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n // An explicit timeout argument is authoritative: adaptive shortening only\n // applies to callers who left the window to the SDK (timeout === undefined),\n // so `callRPC(m, p, 10_000)` still means \"give each attempt 10s\" exactly.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const api = apiOf(method)\n // Wall-clock budget across ALL failover attempts. Without it the worst case\n // is (retry+1) × timeout ≈ 30s — exactly the render pile-up this feature\n // exists to prevent — whenever the WHOLE pool is slow (adaptive timeouts\n // rise with the EWMAs and hedging self-throttles, both by design). The\n // deadline is checked before each new attempt AND before a hedge fires; an\n // in-flight attempt still finishes its own window, so the true ceiling is\n // deadline + one attempt window (up to ~2× the window if a hedge fired just\n // before the deadline and the attempt then waits out the hedge leg too).\n // Note this budget also bounds callers who passed an explicit `retry`: the\n // wall clock, not the attempt count, is the stronger promise here.\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Track nodes tried in the current round. When all nodes have been tried,\n // clear the set to allow a second round (wrap-around) using the retry budget.\n const triedInRound = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so nodes with an API-specific cooldown are deprioritized.\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n // Pick the healthiest untried node. If all tried, start a new round.\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n\n // Hedge eligibility for THIS attempt: opted in, the primary has a usable\n // latency profile for this exact method (so the hedge delay is grounded in\n // data — cold starts stay sequential), and healthy untried peers exist.\n let hedgePool: string[] = []\n if (\n config.resilience.hedge &&\n rpcHealthTracker.getUsableLatencyMs(node, method) !== undefined\n ) {\n hedgePool = orderedNodes\n .filter((n) => !triedInRound.has(n) && rpcHealthTracker.isNodeHealthy(n, api))\n .slice(0, 3)\n }\n\n if (hedgePool.length > 0) {\n try {\n // All health/budget recording happens inside the hedged attempt —\n // the catch below must NOT record again (unlike the sequential path).\n return await hedgedRpcAttempt({\n method,\n params,\n api,\n primary: node,\n hedgePool,\n callerTimeout: ceiling,\n explicitTimeout,\n deadlineAt: deadline,\n externalSignal: signal,\n onHedgeFired: (n) => triedInRound.add(n),\n validate\n })\n } catch (e: any) {\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n lastError = e\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n }\n\n const callStart = Date.now()\n try {\n const res = await jsonRPCCall(\n node,\n method,\n params,\n adaptiveAttemptTimeout(rpcHealthTracker, node, method, ceiling, explicitTimeout),\n false,\n signal\n )\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Count it against this node's API\n // health (never record a success or refill the hedge budget for a\n // lie) and fail over to the next node.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(`[hive-tx] response validation failed for ${method} from ${node}`)\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart, method)\n // An un-hedged success is what earns hedge budget back (see HedgeBudget).\n rpcHedgeBudget.refill()\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n return res as T\n } catch (e: any) {\n // RPCErrors: distinguish node-level failures from genuine blockchain rejections.\n // Node-level errors (e.g. -32602 \"Unable to parse endpoint data\" from a sick\n // HAF/jussi backend) should failover; real rejections (bad params, missing\n // authority, etc.) propagate immediately.\n if (e instanceof RPCError) {\n if (!isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n // Node-level RPC error — record failure and fall through to failover\n }\n // External abort — stop retrying immediately\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n // A genuinely slow failure (timeout/abort/slow-5xx) is also a latency signal so\n // a node that 200s-but-too-slow or aborts at the timeout is demoted by the\n // ranker, not only by the (transient) failure gate. Measured elapsed, never a\n // constant; recordSlowFailure ignores instant (down-node) failures.\n rpcHealthTracker.recordSlowFailure(node, Date.now() - callStart, method)\n lastError = e\n\n // Add jitter before trying next node\n if (attempt < retry) {\n await jitterDelay()\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callRPC for broadcasts ──────────────────────────────────────\n\n/**\n * Broadcast-safe RPC call. Only retries on pre-connection errors where the\n * request definitively never reached the server (ECONNREFUSED, ENOTFOUND, etc.).\n * On timeouts, HTTP errors, or any ambiguous failure, throws immediately to\n * prevent double-broadcasting transactions.\n *\n * Tries each node once (no wrap-around) since broadcast retries are dangerous.\n *\n * @internal Used by Transaction.broadcast()\n */\nexport const callRPCBroadcast = async (\n method: string,\n params: any[] | object = [],\n timeout = config.broadcastTimeout,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n const api = apiOf(method)\n // Track which nodes we've already tried - broadcasts must never retry the same node\n const triedNodes = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt < config.nodes.length; attempt++) {\n // Re-evaluate order each attempt so health changes are respected\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n const node = orderedNodes.find((n) => !triedNodes.has(n))\n if (!node) break\n triedNodes.add(node)\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n // Deliberately no latency sample for broadcasts: broadcast_transaction_synchronous\n // blocks for block inclusion (~1.5–3s+) regardless of the node's read speed, so\n // feeding it into the shared read EWMA would wrongly demote a fast node for reads.\n // The same nodes are profiled by callRPC read traffic, so a genuinely slow node is\n // still demoted there.\n rpcHealthTracker.recordSuccess(node, api)\n return res as T\n } catch (e: any) {\n // RPCErrors are valid blockchain rejections - never retry\n if (e instanceof RPCError) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n lastError = e\n\n // Broadcast safety: only fail over when the request is safe to re-send.\n // `broadcastOperations` signs the tx exactly once and `callRPCBroadcast`\n // reuses that signed payload across nodes, so any case where the next\n // node would dedupe by trx_id is fine. RPCErrors (real blockchain\n // rejections) propagate immediately — see isBroadcastSafeToRetry.\n if (!isBroadcastSafeToRetry(e)) {\n throw e\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callREST ────────────────────────────────────────────────────\n\nconst apiMethods: Record = {\n balance: '/balance-api',\n hafah: '/hafah-api',\n hafbe: '/hafbe-api',\n hivemind: '/hivemind-api',\n hivesense: '/hivesense-api',\n reputation: '/reputation-api',\n 'nft-tracker': '/nft-tracker-api',\n hafsql: '/hafsql',\n status: '/status-api'\n}\n\n/**\n * Makes REST API calls to Hive blockchain REST endpoints with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, and timeout support.\n * Wraps around the node list to honor the full retry budget.\n *\n * @template Api - The REST API method type (e.g., 'balance', 'hafah', 'hivemind', etc.)\n * @template P - The endpoint path type for the specified API\n *\n * @param api - The REST API method name to call\n * @param endpoint - The specific endpoint path within the API\n * @param params - Optional parameters for path and query string replacement\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Number of retry attempts before throwing an error (default:\n * config.retry). The wall-clock budget (`config.resilience.totalBudgetFactor`\n * × timeout) may end the failover walk before the retry count is exhausted.\n *\n * @returns Promise resolving to the API response data with proper typing\n * @throws Error if all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callREST } from 'hive-tx'\n *\n * // Get account balance\n * const balance = await callREST('balance', '/accounts/{account-name}/balances', { \"account-name\": 'alice' })\n *\n * // Custom timeout and retry settings\n * const data = await callREST('status', '/status', undefined, 10_000, 3)\n * ```\n */\nexport async function callREST(\n api: APIMethods,\n endpoint: string,\n params?: Record,\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal\n): Promise {\n if (!Array.isArray(config.restNodes)) {\n throw new Error('config.restNodes is not an array')\n }\n if (config.restNodes.length === 0) {\n throw new Error('config.restNodes is empty')\n }\n // Same contract as callRPC: an explicit timeout argument is authoritative\n // (no adaptive shortening), and a wall-clock deadline bounds the total\n // failover walk when the whole pool is slow.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Latency-profile key: api + endpoint TEMPLATE (pre-substitution, so the\n // cardinality is code-defined) — a cheap endpoint's baseline must not set\n // the deadline for a heavy one within the same REST api.\n const restProfileKey = `${api}:${endpoint}`\n // Per-API node override: an API served by only a subset of nodes (e.g.\n // hivesense) uses its own capable-host list so the small retry budget and\n // cold starts aren't wasted on nodes that 404/503 it. Any API without an\n // override (or with an empty one) falls back to the generic restNodes.\n const apiNodes =\n config.restNodesByApi?.[api]?.length\n ? config.restNodesByApi[api]!\n : config.restNodes\n const triedInRound = new Set()\n let lastError: any\n // Track whether the error was already recorded by the HTTP status handler\n let alreadyRecorded = false\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so per-API cooldowns are respected.\n const orderedNodes = restHealthTracker.getOrderedNodes(apiNodes, api)\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n const baseUrl = node + apiMethods[api]\n let path = endpoint as string\n const paramObj = params || ({} as Record)\n const processedPathParams = new Set()\n\n // Replace path params ONLY\n Object.entries(paramObj).forEach(([key, value]) => {\n if (path.includes(`{${key}}`)) {\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)))\n processedPathParams.add(key)\n }\n })\n const url = new URL(baseUrl + path)\n // Add ONLY remaining params as query (if any)\n Object.entries(paramObj).forEach(([key, value]) => {\n if (!processedPathParams.has(key)) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n })\n\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n alreadyRecorded = false\n // Adaptive per-attempt timeout (see adaptiveAttemptTimeout): a profiled\n // REST node is abandoned at factor×EWMA instead of the full fixed window.\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(\n adaptiveAttemptTimeout(restHealthTracker, node, restProfileKey, ceiling, explicitTimeout)\n )\n const { signal: restSignal, cleanup: cleanupMerge } = mergeSignals(tSignal, signal)\n const restCleanup = () => { cleanupTimeout(); cleanupMerge() }\n const restCallStart = Date.now()\n try {\n const response = await fetch(url.toString(), {\n signal: restSignal,\n headers: serverIdentityHeaders()\n })\n if (response.status === 404) {\n throw new Error('HTTP 404 - Hint: can happen on wrong params')\n }\n if (response.status === 429) {\n // 0 (no usable Retry-After) → undefined → escalating backoff in recordRateLimit.\n restHealthTracker.recordRateLimit(\n node,\n parseRetryAfterMs(response.headers.get('Retry-After')) || undefined\n )\n alreadyRecorded = true\n throw new Error(`HTTP 429 Rate Limited by ${node}`)\n }\n if (response.status === 503) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP 503 Service Unavailable from ${node}`)\n }\n if (!response.ok) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP ${response.status} from ${node}`)\n }\n restHealthTracker.recordSuccess(node, api, Date.now() - restCallStart, restProfileKey)\n return response.json() as any\n } catch (e: any) {\n // 404 is not a node issue, don't failover\n if (e?.message?.includes('HTTP 404')) {\n throw e\n }\n // External abort (caller unmounted / React Query cancelled the request) is the\n // client's decision, NOT a node fault. Mirror callRPC: bail before recording any\n // failure or slow-latency sample so a healthy REST node (e.g. an own node) is never\n // demoted by routine navigation/cancellation.\n if (signal?.aborted) {\n throw e\n }\n // Only record if not already recorded by 429/503 handler above\n if (!alreadyRecorded) {\n restHealthTracker.recordFailure(node, api)\n }\n // A slow failure (timeout/abort/slow-5xx — e.g. an own node from a far region) is a\n // latency signal too, so it is demoted by the ranker, not only the failure gate.\n // Measured elapsed; recordSlowFailure floors at LATENCY_SLOW_FAILURE_MS so a fast\n // 404/429 or instant down-node failure is NOT mis-read as \"slow\".\n restHealthTracker.recordSlowFailure(node, Date.now() - restCallStart, restProfileKey)\n lastError = e\n\n if (attempt < retry) {\n await jitterDelay()\n }\n } finally {\n restCleanup()\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callWithQuorum ───────────────────────────────────────────────\n\n/**\n * Make a JSONRPC call with quorum. The method will cross-check the result\n * with `quorum` number of nodes before returning the result.\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param quorum - Default: 2 (recommended)\n */\nexport const callWithQuorum = async (\n method: string,\n params: any[] | object = [],\n quorum = 2,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an Array')\n }\n if (quorum > config.nodes.length) {\n throw new Error('quorum > config.nodes.length')\n }\n // We call random nodes for better security (Fisher-Yates shuffle)\n const shuffleNodes = (arr: string[]) => {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n }\n let allNodes = shuffleNodes(config.nodes)\n let currentBatchSize = Math.min(quorum, allNodes.length)\n let allResults: any[] = []\n while (currentBatchSize > 0 && allNodes.length > 0) {\n // Take next batch of nodes\n const batchNodes = allNodes.splice(0, currentBatchSize)\n const promises: Promise[] = []\n const batchResults: any[] = []\n // Launch batch calls in parallel\n for (let i = 0; i < batchNodes.length; i++) {\n promises.push(\n jsonRPCCall(batchNodes[i], method, params, undefined, true, signal)\n .then((data) => batchResults.push(data))\n .catch(() => {})\n )\n }\n await Promise.all(promises)\n allResults.push(...batchResults)\n // Check for consensus in successful results\n const consensusResult = findConsensus(allResults, quorum)\n if (consensusResult) {\n return consensusResult\n }\n // Prepare next batch\n currentBatchSize = Math.min(quorum, allNodes.length)\n if (currentBatchSize === 0) {\n throw new Error('No more nodes available.')\n }\n }\n throw new Error(\"Couldn't reach quorum.\")\n}\n\nfunction findConsensus(results: any[], quorum: number) {\n const resultGroups = new Map()\n for (const result of results) {\n const key = JSON.stringify(result)\n if (!resultGroups.has(key)) {\n resultGroups.set(key, [])\n }\n resultGroups.get(key)!.push(result)\n }\n const consensusGroup = Array.from(resultGroups.values()).find((group) => group.length >= quorum)\n return consensusGroup ? consensusGroup[0] : null\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { PrivateKey } from './helpers/PrivateKey'\nimport {\n OperationName,\n OperationBody,\n TransactionType,\n TransactionStatus,\n BroadcastResult\n} from './types'\nimport { ByteBuffer } from './helpers/ByteBuffer'\nimport { Serializer } from './helpers/serializer'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { config } from './config'\nimport { callRPC, callRPCBroadcast, RPCError } from './helpers/call'\nimport { DigestData } from './types'\nimport { sleep } from './helpers/sleep'\n\nconst chainId = hexToBytes(config.chain_id)\n\ninterface TransactionOptions {\n transaction?: TransactionType | Transaction\n /**\n * Transaction expiration in milliseconds (ms) - max 86400000 (24 hours)\n * @default 60_000\n */\n expiration?: number\n}\n\nexport class Transaction {\n transaction?: TransactionType\n\n expiration: number = 60_000\n\n private txId?: string\n\n constructor(options?: TransactionOptions) {\n if (options?.transaction) {\n if (options.transaction instanceof Transaction) {\n this.transaction = options.transaction.transaction\n this.expiration = options.transaction.expiration\n } else {\n this.transaction = options.transaction\n }\n // A transaction built externally (e.g. from a hive-uri signing request)\n // may omit the `signatures` array. sign(), addSignature() and broadcast()\n // all assume it exists, so normalize it here to avoid\n // \"Cannot read property 'push' of undefined\" on sign.\n if (this.transaction && !Array.isArray(this.transaction.signatures)) {\n this.transaction.signatures = []\n }\n this.txId = this.digest().txId\n }\n if (options?.expiration) {\n this.expiration = options.expiration\n }\n }\n\n /**\n * Adds an operation to the transaction. If no transaction exists, creates one first.\n * @template O Operation name type for type safety\n * @param operationName The name/type of the operation to add (e.g., 'transfer', 'vote', 'comment')\n * @param operationBody The operation data/body for the specified operation type\n * @returns Promise that resolves when the operation is added\n * @throws Error if transaction creation fails or global properties cannot be retrieved\n */\n async addOperation(\n operationName: O,\n operationBody: OperationBody\n ): Promise {\n if (!this.transaction) {\n await this.createTransaction(this.expiration)\n }\n this.transaction!.operations.push([operationName, operationBody])\n }\n\n /**\n * Signs the transaction with the provided key(s), supporting both single and multi-signature transactions.\n * For multi-signature, you can sign with all keys at once or sign individually by calling this method multiple times.\n * @param keys Single PrivateKey or array of PrivateKeys to sign the transaction with\n * @returns The signed transaction\n * @throws Error if no transaction exists to sign\n */\n sign(keys: PrivateKey | PrivateKey[]): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n if (this.transaction) {\n const { digest, txId } = this.digest()\n if (!Array.isArray(keys)) {\n keys = [keys]\n }\n for (const key of keys) {\n const signature = key.sign(digest)\n this.transaction.signatures.push(signature.customToString())\n }\n this.txId = txId\n return this.transaction\n } else {\n throw new Error('No transaction to sign')\n }\n }\n\n /**\n * Broadcasts the signed transaction to the Hive network.\n * Automatically handles retries and duplicate transaction detection.\n * @param checkStatus By default (false) the transaction is not guaranteed to be included in a block.\n * For example the transaction can expire while waiting in mempool.\n * If you pass true here, the function will wait for the transaction to be either included or dropped\n * before returning a result.\n * @returns Promise resolving to broadcast result\n * @throws Error if no transaction exists or transaction is not signed or transaction got rejected\n */\n async broadcast(checkStatus = false): Promise {\n if (!this.transaction) {\n throw new Error(\n 'Attempted to broadcast an empty transaction. Add operations by .addOperation()'\n )\n }\n if (this.transaction.signatures.length === 0) {\n throw new Error(\n 'Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)'\n )\n }\n try {\n await callRPCBroadcast('condenser_api.broadcast_transaction', [this.transaction])\n } catch (e) {\n if (e instanceof RPCError && e.message.includes('Duplicate transaction check failed')) {\n // ignore duplicate transaction error as this can happen when we retry the broadcast\n } else {\n throw e\n }\n }\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n if (!checkStatus) {\n return { tx_id: this.txId, status: 'unknown' }\n }\n // Poll until the transaction reaches a final state or max attempts exceeded.\n // With 60 attempts: delays grow from 1.3s to 19s, total wait ~10 minutes.\n const maxPollAttempts = 60\n await sleep(1000)\n let status = await this.checkStatus()\n let i = 1\n while (\n status?.status !== 'within_irreversible_block' &&\n status?.status !== 'expired_irreversible' &&\n status?.status !== 'too_old' &&\n i < maxPollAttempts\n ) {\n await sleep(1000 + i * 300)\n status = await this.checkStatus()\n i++\n }\n return {\n tx_id: this.txId,\n status: (status?.status ?? 'unknown') as BroadcastResult['status']\n }\n }\n\n /**\n * Returns the transaction digest containing the transaction ID and hash.\n * The digest can be used to verify signatures and for transaction identification.\n * @returns DigestData containing transaction ID and hash\n * @throws Error if no transaction exists\n */\n digest(): DigestData {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n const temp = { ...this.transaction }\n try {\n Serializer.Transaction(buffer, temp)\n } catch (cause) {\n throw new Error('Unable to serialize transaction: ' + cause)\n }\n buffer.flip()\n const transactionData = new Uint8Array(buffer.toBuffer())\n const txId = bytesToHex(sha256(transactionData)).slice(0, 40)\n const digest = sha256(new Uint8Array([...chainId, ...transactionData]))\n return { digest, txId }\n }\n\n /**\n * Adds a signature to an already created transaction. Useful when signing with external tools.\n * Multiple signatures can be added one at a time for multi-signature transactions.\n * @param signature The signature string in hex format (must be exactly 130 characters)\n * @returns The transaction with the added signature\n * @throws Error if no transaction exists or signature format is invalid\n */\n addSignature(signature: string): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .create(operations)')\n }\n if (typeof signature !== 'string') {\n throw new Error('Signature must be string')\n }\n if (signature.length !== 130) {\n throw new Error('Signature must be 130 characters long')\n }\n this.transaction.signatures.push(signature)\n return this.transaction\n }\n\n /** Get status of this transaction. Usually called internally after broadcasting. */\n async checkStatus(): Promise {\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n return callRPC('transaction_status_api.find_transaction', {\n transaction_id: this.txId,\n expiration: this.transaction?.expiration\n })\n }\n\n /**\n * Creates the transaction structure and initializes it with blockchain data.\n * Retrieves current head block information and sets up reference block data.\n * @private\n * @param expiration Transaction expiration in milliseconds\n */\n private createTransaction = async (expiration: number) => {\n const props = await callRPC('condenser_api.get_dynamic_global_properties', [])\n const bytes = hexToBytes(props.head_block_id)\n const refBlockPrefix = Number(new Uint32Array(bytes.buffer, bytes.byteOffset + 4, 1)[0])\n const expirationIso = new Date(Date.now() + expiration).toISOString().slice(0, -5)\n this.transaction = {\n expiration: expirationIso,\n extensions: [],\n operations: [],\n ref_block_num: props.head_block_number & 0xffff,\n ref_block_prefix: refBlockPrefix,\n signatures: []\n }\n }\n}\n","import bs58 from 'bs58'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PublicKey } from './PublicKey'\nimport { Signature } from './Signature'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport type KeyRole = 'owner' | 'active' | 'posting' | 'memo'\n\nconst NETWORK_ID = new Uint8Array([0x80])\n\n/**\n * ECDSA (secp256k1) private key for signing and encryption operations.\n * Handles key generation, derivation from seeds/passwords, and cryptographic operations.\n *\n * All private keys are stored internally as Uint8Array and can be converted to/from\n * Wallet Import Format (WIF) strings for storage and transmission.\n *\n * @example\n * ```typescript\n * // From WIF string\n * const key = PrivateKey.from('5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw')\n *\n * // Generate random key\n * const randomKey = PrivateKey.randomKey()\n *\n * // From username and password\n * const loginKey = PrivateKey.fromLogin('username', 'password')\n *\n * // Sign a message\n * const signature = key.sign(someHash)\n *\n * // Get public key\n * const pubKey = key.createPublic()\n * ```\n */\nexport class PrivateKey {\n key: Uint8Array\n\n constructor(key: Uint8Array) {\n this.key = key\n try {\n secp256k1.getPublicKey(key)\n } catch (e) {\n throw new Error('invalid private key')\n }\n }\n\n /**\n * Creates a PrivateKey instance from a WIF string or raw Uint8Array.\n * Automatically detects the input type and uses the appropriate method.\n *\n * @param value - WIF formatted string or raw 32-byte key as Uint8Array\n * @returns New PrivateKey instance\n * @throws Error if the key format is invalid\n */\n static from(value: string | Uint8Array): PrivateKey {\n if (typeof value === 'string') {\n return PrivateKey.fromString(value)\n } else {\n return new PrivateKey(value)\n }\n }\n\n /**\n * Creates a PrivateKey from a Wallet Import Format (WIF) encoded string.\n *\n * @param wif - WIF encoded private key string\n * @returns New PrivateKey instance\n * @throws Error if WIF format is invalid or checksum fails\n */\n static fromString(wif: string): PrivateKey {\n return new PrivateKey(decodePrivate(wif).subarray(1))\n }\n\n /**\n * Creates a PrivateKey from a seed string or Uint8Array.\n * The seed is hashed with SHA256 to produce the private key.\n *\n * @param seed - Seed string (converted to bytes) or raw byte array\n * @returns New PrivateKey instance derived from seed\n */\n static fromSeed(seed: string | Uint8Array): PrivateKey {\n if (typeof seed === 'string') {\n const isHex = /^[0-9a-fA-F]+$/.test(seed)\n if (isHex) {\n seed = hexToBytes(seed)\n } else {\n // Convert non-hex string to Uint8Array using UTF-8 encoding\n // Avoid top-level TextEncoder — not available on all runtimes (e.g. Hermes)\n const bytes: number[] = []\n for (let i = 0; i < seed.length; i++) {\n let c = seed.charCodeAt(i)\n if (c < 0x80) {\n bytes.push(c)\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < seed.length) {\n const next = seed.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n seed = new Uint8Array(bytes)\n }\n }\n return new PrivateKey(sha256(seed))\n }\n\n /**\n * Derives a PrivateKey from username, password, and role using Hive's key derivation scheme.\n * This generates the same keys that the Hive wallet uses for login-based keys.\n *\n * @param username - Hive username\n * @param password - Master password (or seed phrase)\n * @param role - Key role ('owner', 'active', 'posting', 'memo')\n * @returns New PrivateKey instance for the specified role\n */\n static fromLogin(username: string, password: string, role: KeyRole = 'active'): PrivateKey {\n const seed = username + role + password\n return PrivateKey.fromSeed(seed)\n }\n\n /**\n * Signs a 32-byte message hash using ECDSA and returns a recoverable signature.\n * The signature includes recovery information to allow public key recovery.\n *\n * @param message - 32-byte message hash to sign (Uint8Array)\n * @returns Signature object containing the signature data\n */\n sign(message: Uint8Array): Signature {\n const rv = secp256k1.sign(message, this.key, {\n extraEntropy: true,\n format: 'recovered',\n prehash: false // prehash does sha256 on the message\n })\n const recovery = parseInt(bytesToHex(rv.subarray(0, 1)), 16)\n return Signature.from((recovery + 31).toString(16) + bytesToHex(rv.subarray(1)))\n }\n\n /**\n * Derives the corresponding public key for this private key.\n *\n * @param prefix - Optional address prefix (defaults to config.address_prefix)\n * @returns PublicKey instance derived from this private key\n */\n createPublic(prefix?: string): PublicKey {\n return new PublicKey(secp256k1.getPublicKey(this.key), prefix)\n }\n\n /**\n * Returns the private key as a Wallet Import Format (WIF) encoded string.\n * This includes network ID and checksum for safe storage/transmission.\n *\n * @returns WIF encoded private key string\n */\n toString(): string {\n return encodePrivate(new Uint8Array([...NETWORK_ID, ...this.key]))\n }\n\n /**\n * Returns a masked representation of the private key for debugging/logging.\n * Shows only the first and last 6 characters to avoid accidental exposure.\n * Use toString() to get the full key for export/serialization.\n *\n * @returns Masked key representation for safe logging\n */\n inspect(): string {\n const key = this.toString()\n return `PrivateKey: ${key.slice(0, 6)}...${key.slice(-6)}`\n }\n\n /**\n * Computes a shared secret using ECDH key exchange for memo encryption.\n * The shared secret is used as a key for AES encryption/decryption.\n *\n * @param publicKey - Other party's public key\n * @returns 64-byte shared secret as Uint8Array\n */\n getSharedSecret(publicKey: PublicKey): Uint8Array {\n const s = secp256k1.getSharedSecret(this.key, publicKey.key)\n // strip the parity byte\n return sha512(s.subarray(1))\n }\n\n /**\n * Generates a new cryptographically secure random private key.\n * Uses the secp256k1 key generation algorithm for security.\n * This method may take up to 250ms due to entropy collection.\n *\n * @returns New randomly generated PrivateKey instance\n */\n static randomKey(): PrivateKey {\n return new PrivateKey(secp256k1.keygen().secretKey)\n }\n}\n\nconst doubleSha256 = (input: Uint8Array) => {\n const dbl = sha256(sha256(input))\n return dbl\n}\n\n/** Encode bs58+doubleSha256-checksum private key. */\nconst encodePrivate = (key: Uint8Array) => {\n // assert.equal(key.readUInt8(0), 0x80, 'private key network id mismatch')\n const checksum = doubleSha256(key)\n return bs58.encode(new Uint8Array([...key, ...checksum.slice(0, 4)]))\n}\n\n/** Decode bs58+doubleSha256-checksum encoded private key. */\nconst decodePrivate = (encodedKey: string) => {\n const buffer = bs58.decode(encodedKey)\n if (!isUint8ArrayEqual(buffer.slice(0, 1), NETWORK_ID)) {\n throw new Error('Private key network id mismatch')\n }\n const checksum = buffer.slice(-4)\n const key = buffer.slice(0, -4)\n const checksumVerify = doubleSha256(key).slice(0, 4)\n if (!isUint8ArrayEqual(checksum, checksumVerify)) {\n throw new Error('Private key checksum mismatch')\n }\n return key\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array) => {\n if (a === b) return true\n if (a.byteLength !== b.byteLength) return false\n const len = a.byteLength\n let i = 0\n while (i < len && a[i] === b[i]) i++\n return i === len\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { cbc as AESCBC } from '@noble/ciphers/aes.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PrivateKey } from './PrivateKey'\nimport { PublicKey } from './PublicKey'\n\nexport const encrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n message: Uint8Array,\n nonce: bigint = uniqueNonce()\n) => crypt(privateKey, publicKey, nonce, message)\n\nexport const decrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum: number\n): Uint8Array => {\n const d = crypt(privateKey, publicKey, nonce, message, checksum)\n return d.message\n}\n\n/**\n * @arg message - Encrypted or plain text message (see checksum)\n * @arg checksum - shared secret checksum (null to encrypt, non-null to decrypt)\n */\nconst crypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum?: number\n): { nonce: bigint; message: Uint8Array; checksum: number } => {\n const nonceL = nonce\n const S = privateKey.getSharedSecret(publicKey)\n let ebuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n ebuf.writeUint64(nonceL)\n ebuf.append(S)\n ebuf.flip()\n\n const encryptionKey = sha512(new Uint8Array(ebuf.toBuffer()))\n const iv = encryptionKey.subarray(32, 48)\n const tag = encryptionKey.subarray(0, 32)\n\n // check if first 64 bit of sha256 hash treated as uint64_t truncated to 32 bits.\n const check = sha256(encryptionKey).subarray(0, 4)\n const cbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n cbuf.append(check)\n cbuf.flip()\n const check32 = cbuf.readUint32()\n if (checksum !== undefined) {\n if (check32 !== checksum) {\n throw new Error('Invalid key')\n }\n message = cryptoJsDecrypt(message, tag, iv)\n } else {\n message = cryptoJsEncrypt(message, tag, iv)\n }\n return { nonce: nonceL, message, checksum: check32 }\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} ciphertext - binary format\n * @return {Uint8Array} the decrypted message\n */\nconst cryptoJsDecrypt = (message: Uint8Array, tag: Uint8Array, iv: Uint8Array): Uint8Array => {\n let messageBuffer = message\n const decipher = AESCBC(tag, iv)\n messageBuffer = decipher.decrypt(messageBuffer)\n return messageBuffer\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} plaintext - binary format\n * @return {Uint8Array} binary\n */\nexport const cryptoJsEncrypt = (\n message: Uint8Array,\n tag: Uint8Array,\n iv: Uint8Array\n): Uint8Array => {\n let messageBuffer = message\n const cipher = AESCBC(tag, iv)\n messageBuffer = cipher.encrypt(messageBuffer)\n return messageBuffer\n}\n\nlet uniqueNonceEntropy: number | null = null\n\nconst uniqueNonce = (): bigint => {\n if (uniqueNonceEntropy === null) {\n const randomPrivateKey = secp256k1.utils.randomSecretKey()\n uniqueNonceEntropy = (randomPrivateKey[0] << 8) | randomPrivateKey[1]\n }\n let long = BigInt(Date.now())\n const entropy = ++uniqueNonceEntropy % 0x10000\n long = (long << BigInt(16)) | BigInt(entropy)\n return long\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\n\nconst PublicKeyDeserializer = (buf: ByteBuffer) => {\n const c = fixedBuf(buf, 33)\n return new PublicKey(c)\n}\n\nconst UInt64Deserializer = (b: ByteBuffer) => {\n return b.readUint64()\n}\n\nconst UInt32Deserializer = (b: ByteBuffer) => {\n return b.readUint32()\n}\n\nconst BinaryDeserializer = (b: ByteBuffer) => {\n const len = b.readVarint32()\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n}\n\nconst BufferDeserializer = (keyDeserializers: any) => (buf: Uint8Array) => {\n const obj: any = {}\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n buffer.append(buf)\n buffer.flip()\n for (const [key, deserializer] of keyDeserializers) {\n try {\n obj[key] = deserializer(buffer)\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n return obj\n}\n\nfunction fixedBuf(b: ByteBuffer, len: number) {\n if (!b) {\n throw Error('No buffer found on first parameter')\n } else {\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n }\n}\n\nconst EncryptedMemoDeserializer = BufferDeserializer([\n ['from', PublicKeyDeserializer],\n ['to', PublicKeyDeserializer],\n ['nonce', UInt64Deserializer],\n ['check', UInt32Deserializer],\n ['encrypted', BinaryDeserializer]\n])\n\nexport const Deserializer = {\n Memo: EncryptedMemoDeserializer\n}\n","import bs58 from 'bs58'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Serializer } from './serializer'\nimport { PrivateKey } from './PrivateKey'\nimport * as Aes from './aes'\nimport { PublicKey } from './PublicKey'\nimport { Deserializer } from './deserializer'\n\nexport type Memo = {\n /**\n * Encrypts a memo for secure private messaging\n */\n encode(\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n ): string\n\n /**\n * Decrypts a memo message\n */\n decode(privateKey: string | PrivateKey, memo: string): string\n}\n\n/**\n * Encodes a memo using AES encryption for secure private messaging on Hive.\n * Messages must start with '#' to be encrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Sender's private memo key (string WIF format or PrivateKey instance)\n * @param publicKey - Recipient's public memo key (string or PublicKey instance)\n * @param memo - Message to encrypt (must start with '#' for encryption)\n * @param testNonce - Optional nonce for testing (advanced usage)\n * @returns Encrypted memo string prefixed with '#'\n * @throws Error if encryption is not supported in current environment\n */\nconst encode = (\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n publicKey = toPublicObj(publicKey)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.writeVString(memo)\n const memoBuffer = new Uint8Array(mbuf.copy(0, mbuf.offset).toBuffer())\n const { nonce, message, checksum } = Aes.encrypt(privateKey, publicKey, memoBuffer, testNonce)\n const mbuf2 = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n Serializer.Memo(mbuf2, {\n check: checksum,\n encrypted: message,\n from: privateKey.createPublic(),\n nonce,\n to: publicKey\n })\n mbuf2.flip()\n const data = new Uint8Array(mbuf2.toBuffer())\n return '#' + bs58.encode(data)\n}\n\n/**\n * Decrypts an encrypted memo using AES decryption.\n * Messages must start with '#' to be decrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Recipient's private memo key (string WIF format or PrivateKey instance)\n * @param memo - Encrypted memo string (must start with '#' for decryption)\n * @returns Decrypted memo content with '#' prefix\n * @throws Error if decryption fails or encryption not supported in current environment\n */\nconst decode = (privateKey: string | PrivateKey, memo: string): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n // memo = bs58.decode(memo)\n let memoBuffer = Deserializer.Memo(bs58.decode(memo))\n const { from, to, nonce, check, encrypted } = memoBuffer\n const pubkey = privateKey.createPublic().toString()\n const otherpub =\n pubkey === new PublicKey(from.key).toString() ? new PublicKey(to.key) : new PublicKey(from.key)\n memoBuffer = Aes.decrypt(privateKey, otherpub, nonce, encrypted, check)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.append(memoBuffer)\n mbuf.flip()\n return '#' + mbuf.readVString()\n}\n\nlet encodeTest: boolean | undefined\nconst checkEncryption = () => {\n if (encodeTest === undefined) {\n let plaintext\n encodeTest = true // prevent infinate looping\n try {\n const wif = '5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw'\n const pubkey = 'STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA'\n const cyphertext = encode(wif, pubkey, '#memo爱')\n plaintext = decode(wif, cyphertext)\n } finally {\n encodeTest = plaintext === '#memo爱'\n }\n }\n if (encodeTest === false) {\n throw new Error('This environment does not support encryption.')\n }\n}\n\nconst toPrivateObj = (o: string | PrivateKey): PrivateKey => {\n if (typeof o === 'string') {\n return PrivateKey.fromString(o)\n } else {\n return o\n }\n}\nconst toPublicObj = (o: string | PublicKey): PublicKey => {\n if (typeof o === 'string') {\n return PublicKey.fromString(o)\n } else {\n return o\n }\n}\n\n/**\n * Memo utilities for encrypting and decrypting private messages between Hive users.\n * Uses AES encryption with ECDH key exchange for secure communication.\n *\n * Messages must start with '#' to be encrypted/decrypted.\n * Plain text messages (without '#') are returned unchanged.\n *\n * @example\n * ```typescript\n * import { Memo, PrivateKey, PublicKey } from 'hive-tx'\n *\n * // Encrypt a message\n * const encrypted = Memo.encode(senderPrivateKey, recipientPublicKey, '#Hello World')\n *\n * // Decrypt a message\n * const decrypted = Memo.decode(recipientPrivateKey, encrypted)\n * console.log(decrypted) // '#Hello World'\n * ```\n */\nexport const Memo = {\n decode,\n encode\n}\n","import { Serializer } from './serializer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\nimport { bytesToHex } from '@noble/hashes/utils.js'\n\nexport interface WitnessProps {\n account_creation_fee?: string\n account_subsidy_budget?: number\n account_subsidy_decay?: number\n key: PublicKey | string\n maximum_block_size?: number\n new_signing_key?: PublicKey | string | null\n hbd_exchange_rate?: { base: string; quote: string }\n hbd_interest_rate?: number\n url?: string\n}\n\n/** Return null for a valid username */\nexport const validateUsername = (username: string): null | string => {\n let suffix = 'Account name should '\n if (!username) {\n return suffix + 'not be empty.'\n }\n const length = username.length\n if (length < 3) {\n return suffix + 'be longer.'\n }\n if (length > 16) {\n return suffix + 'be shorter.'\n }\n if (/\\./.test(username)) {\n suffix = 'Each account segment should '\n }\n const ref = username.split('.')\n const len = ref.length\n for (let i = 0; i < len; i++) {\n const label = ref[i]\n if (!/^[a-z]/.test(label)) {\n return suffix + 'start with a lowercase letter.'\n }\n if (!/^[a-z0-9-]*$/.test(label)) {\n return suffix + 'have only lowercase letters, digits, or dashes.'\n }\n if (!/[a-z0-9]$/.test(label)) {\n return suffix + 'end with a lowercase letter or digit.'\n }\n if (label.length < 3) {\n return suffix + 'be longer.'\n }\n }\n return null\n}\n\nexport const operations = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n pow: 14,\n custom: 15,\n report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49,\n // virtual ops\n fill_convert_request: 50,\n author_reward: 51,\n curation_reward: 52,\n comment_reward: 53,\n liquidity_reward: 54,\n interest: 55,\n fill_vesting_withdraw: 56,\n fill_order: 57,\n shutdown_witness: 58,\n fill_transfer_from_savings: 59,\n hardfork: 60,\n comment_payout_update: 61,\n return_vesting_delegation: 62,\n comment_benefactor_reward: 63,\n producer_reward: 64,\n clear_null_account_balance: 65,\n proposal_pay: 66,\n sps_fund: 67,\n hardfork_hive: 68,\n hardfork_hive_restore: 69,\n delayed_voting: 70,\n consolidate_treasury_balance: 71,\n effective_comment_vote: 72,\n ineffective_delete_comment: 73,\n sps_convert: 74,\n expired_account_notification: 75,\n changed_recovery_account: 76,\n transfer_to_vesting_completed: 77,\n pow_reward: 78,\n vesting_shares_split: 79,\n account_created: 80,\n fill_collateralized_convert_request: 81,\n system_warning: 82,\n fill_recurrent_transfer: 83,\n failed_recurrent_transfer: 84,\n limit_order_cancelled: 85,\n producer_missed: 86,\n proposal_fee: 87,\n collateralized_convert_immediate_conversion: 88,\n escrow_approved: 89,\n escrow_rejected: 90,\n proxy_cleared: 91,\n declined_voting_rights: 92\n}\n\n/**\n * Make bitmask filter to be used with get_account_history call\n */\nexport const makeBitMaskFilter = (allowedOperations: number[]): [string | null, string | null] => {\n return allowedOperations\n .reduce(reduceFunction, [BigInt(0), BigInt(0)])\n .map((value: bigint) => (value !== BigInt(0) ? value.toString() : null)) as [string | null, string | null]\n}\nconst reduceFunction = (\n [low, high]: [bigint, bigint],\n allowedOperation: number\n): [bigint, bigint] => {\n if (allowedOperation < 64) {\n return [low | (BigInt(1) << BigInt(allowedOperation)), high]\n } else {\n return [low, high | (BigInt(1) << BigInt(allowedOperation - 64))]\n }\n}\n\nexport const buildWitnessSetProperties = (\n owner: string,\n props: WitnessProps\n): ['witness_set_properties', { extensions: never[]; owner: string; props: any }] => {\n const data = {\n extensions: [],\n owner,\n props: []\n }\n for (const key of Object.keys(props)) {\n if ((props as any)[key] === undefined) continue\n let type\n switch (key) {\n case 'key':\n case 'new_signing_key':\n type = Serializer.PublicKey\n break\n case 'account_subsidy_budget':\n case 'account_subsidy_decay':\n case 'maximum_block_size':\n type = Serializer.UInt32\n break\n case 'hbd_interest_rate':\n type = Serializer.UInt16\n break\n case 'url':\n type = Serializer.String\n break\n case 'hbd_exchange_rate':\n type = Serializer.Price\n break\n case 'account_creation_fee':\n type = Serializer.Asset\n break\n default:\n throw new Error(`Unknown witness prop: ${key}`)\n }\n data.props.push([key, serialize(type, props[key])])\n }\n data.props.sort((a: any, b: any) => a[0].localeCompare(b[0]))\n return ['witness_set_properties', data]\n}\n\nconst serialize = (serializer: any, data: any) => {\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n serializer(buffer, data)\n buffer.flip()\n // `props` values must be hex\n return bytesToHex(new Uint8Array(buffer.toBuffer()))\n}\n","/**\n * Re-exports hive-tx APIs and provides helper functions that bridge\n * API differences from the legacy dhive library.\n */\n\nimport {\n PrivateKey,\n Transaction,\n callRPCBroadcast,\n type BroadcastResult,\n} from \"../../hive-tx\";\nimport type { Operation, OperationName, OperationBody } from \"../../hive-tx\";\nimport { sha256 as nobleSha256 } from \"@noble/hashes/sha2.js\";\n\n// ── Re-exports ─────────────────────────────────────────────────────────────\n\nexport {\n Transaction as HiveTxTransaction,\n PrivateKey,\n PublicKey,\n Signature,\n Memo,\n config as hiveTxConfig,\n callRPC,\n callRPCBroadcast,\n callREST,\n callWithQuorum,\n utils as hiveTxUtils,\n} from \"../../hive-tx\";\n\nexport type {\n Operation,\n OperationName,\n OperationBody,\n AssetSymbol,\n BroadcastResult,\n AccountCreateOperation,\n CustomJsonOperation,\n // Referenced in ConfigManager.setResilience's public signature — must be\n // nameable from the main entry, not only from @ecency/sdk/hive.\n ResilienceOptions,\n} from \"../../hive-tx\";\n\n// ── Compat types (matching dhive shapes used throughout the codebase) ──────\n\n/** Compatible with dhive's TransactionConfirmation from broadcast_transaction_synchronous */\nexport interface TransactionConfirmation {\n id: string;\n block_num: number;\n trx_num: number;\n expired: boolean;\n}\n\n/** Authority role type used in key management */\nexport type AuthorityType = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\n/** SMT asset format (NAI representation) used in transaction history */\nexport interface SMTAsset {\n amount: string;\n precision: number;\n nai: string;\n}\n\n/** RC account data from rc_api.find_rc_accounts */\nexport interface RCAccount {\n account: string;\n rc_manabar: {\n current_mana: string | number;\n last_update_time: number;\n };\n max_rc: string | number;\n max_rc_creation_adjustment: {\n amount: string;\n precision: number;\n nai: string;\n };\n delegated_rc: number;\n received_delegated_rc: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Compute SHA-256 hash of a string or Uint8Array.\n * Drop-in replacement for dhive's `cryptoUtils.sha256()`.\n */\nexport function sha256(input: string | Uint8Array): Uint8Array {\n let data: Uint8Array;\n if (typeof input === \"string\") {\n // Inline UTF-8 encode — avoids TextEncoder which is unavailable on some\n // runtimes (React Native / Hermes).\n const bytes: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c < 0x80) {\n bytes.push(c);\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const next = input.charCodeAt(++i);\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff);\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n }\n }\n data = new Uint8Array(bytes);\n } else {\n data = input;\n }\n return nobleSha256(data);\n}\n\n/** Check if a string is a valid WIF-encoded private key. */\nexport function isWif(key: string): boolean {\n try {\n PrivateKey.fromString(key);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sign and broadcast operations, returning a dhive-compatible TransactionConfirmation.\n *\n * Uses broadcast_transaction_synchronous so the response includes block_num/trx_num,\n * matching the shape that the rest of the codebase expects from dhive's\n * `client.broadcast.sendOperations()`.\n *\n * @deprecated Prefer {@link broadcastOperationsAsync} (the default for\n * `useBroadcastMutation`); poll `transaction_status_api` if you need block\n * confirmation. Kept only for explicit `broadcastMode: 'sync'` opt-ins.\n */\nexport async function broadcastOperations(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return callRPCBroadcast(\"condenser_api.broadcast_transaction_synchronous\", [\n tx.transaction,\n ]);\n}\n\n/**\n * Sign and broadcast operations without waiting for block inclusion.\n *\n * Uses broadcast_transaction which returns as soon as the node accepts the\n * transaction into its mempool. Transport and RPC errors (network failures,\n * invalid operations, expired transactions) are still thrown immediately -\n * the only thing skipped is the wait for the transaction to appear in a block.\n *\n * Returns { tx_id, status: 'unknown' }. To confirm block inclusion afterward,\n * poll transaction_status_api with the returned tx_id.\n *\n * Prefer this for operations where faster response matters more than\n * immediate confirmation (e.g. votes, reblogs, follows).\n *\n * Use broadcastOperations() when you need block_num/trx_num confirmation\n * (e.g. transfers, account updates, key changes).\n */\nexport async function broadcastOperationsAsync(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return tx.broadcast(false);\n}\n\n// ── Mana calculations (ported from dhive's RCAPI) ──────────────────────────\n\ninterface Manabar {\n current_mana: string | number;\n last_update_time: number;\n}\n\ninterface ManaResult {\n current_mana: number;\n max_mana: number;\n percentage: number;\n}\n\nconst MANA_REGENERATION_SECONDS = 432000; // 5 days\n\nfunction calculateManabar(maxMana: number, manabar: Manabar): ManaResult {\n const delta = Date.now() / 1000 - manabar.last_update_time;\n let currentMana =\n Number(manabar.current_mana) +\n (delta * maxMana) / MANA_REGENERATION_SECONDS;\n let percentage = Math.round((currentMana / maxMana) * 10000);\n if (!isFinite(percentage) || percentage < 0) {\n percentage = 0;\n } else if (percentage > 10000) {\n percentage = 10000;\n }\n return { current_mana: currentMana, max_mana: maxMana, percentage };\n}\n\n/**\n * Get effective vesting shares for an account (matching dhive's getVests).\n * Subtracts delegated, adds received, accounts for pending withdrawals.\n */\nfunction getVests(account: any): number {\n const vests = parseFloat(account.vesting_shares);\n const delegated = parseFloat(account.delegated_vesting_shares);\n const received = parseFloat(account.received_vesting_shares);\n const withdrawRate = parseFloat(account.vesting_withdraw_rate);\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n return vests - withdrawVests - delegated + received;\n}\n\n/** Calculate voting power mana (equivalent to dhive client.rc.calculateVPMana) */\nexport function calculateVPMana(account: any): ManaResult {\n const maxMana = getVests(account) * 1e6;\n return calculateManabar(maxMana, account.voting_manabar);\n}\n\n/** Calculate RC mana (equivalent to dhive client.rc.calculateRCMana) */\nexport function calculateRCMana(rcAccount: RCAccount): ManaResult {\n return calculateManabar(\n Number(rcAccount.max_rc),\n rcAccount.rc_manabar\n );\n}\n\n// setHiveTxNodes and initHiveTx removed — config is now unified.\n// Use hiveTxConfig directly or ConfigManager.setHiveNodes().\n","/**\n * Chain error handling utilities\n * Extracted from web's operations.ts and mobile's dhive.ts error handling patterns\n */\n\nexport enum ErrorType {\n COMMON = \"common\",\n INFO = \"info\",\n INSUFFICIENT_RESOURCE_CREDITS = \"insufficient_resource_credits\",\n MISSING_AUTHORITY = \"missing_authority\",\n TOKEN_EXPIRED = \"token_expired\",\n NETWORK = \"network\",\n TIMEOUT = \"timeout\",\n VALIDATION = \"validation\",\n}\n\nexport interface ParsedChainError {\n message: string;\n type: ErrorType;\n originalError?: any;\n}\n\n/**\n * Parses Hive blockchain errors into standardized format.\n * Extracted from web's operations.ts and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string from a blockchain operation\n * @returns Parsed error with user-friendly message and categorized type\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * const parsed = parseChainError(error);\n * console.log(parsed.message); // \"Insufficient Resource Credits. Please wait or power up.\"\n * console.log(parsed.type); // ErrorType.INSUFFICIENT_RESOURCE_CREDITS\n * }\n * ```\n */\nexport function parseChainError(error: any): ParsedChainError {\n // Extract error strings from various error formats\n // Check both error_description and message independently for pattern matching\n const errorDescription = error?.error_description ? String(error.error_description) : '';\n const errorMessage = error?.message ? String(error.message) : '';\n // HiveSigner throws plain objects like { error: \"unauthorized\", error_description: \"...\" }\n const errorCode = error?.error ? String(error.error) : '';\n const errorString = errorDescription || errorMessage || String(error || '');\n\n // Helper function to test patterns against all error fields\n const testPattern = (pattern: RegExp): boolean => {\n // Check error code first (e.g. HiveSigner's { error: \"unauthorized\" })\n if (errorCode && pattern.test(errorCode)) return true;\n // Check error_description (priority)\n if (errorDescription && pattern.test(errorDescription)) return true;\n // Then check message\n if (errorMessage && pattern.test(errorMessage)) return true;\n // Finally check fallback errorString (handles plain string inputs)\n if (errorString && pattern.test(errorString)) return true;\n return false;\n };\n\n // Resource credits (from both web and mobile patterns)\n if (\n testPattern(/please wait to transact/i) ||\n testPattern(/insufficient rc/i) ||\n testPattern(/rc mana|rc account|resource credits/i)\n ) {\n return {\n message: \"Insufficient Resource Credits. Please wait or power up.\",\n type: ErrorType.INSUFFICIENT_RESOURCE_CREDITS,\n originalError: error,\n };\n }\n\n // Min comment interval (from web operations.ts line 29)\n if (testPattern(/you may only post once every/i)) {\n return {\n message: \"Please wait before posting again (minimum 3 second interval between comments).\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Identical vote (from web operations.ts line 31)\n if (testPattern(/your current vote on this comment is identical/i)) {\n return {\n message: \"You have already voted with the same weight.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Must claim something (from web operations.ts line 33)\n if (testPattern(/must claim something/i)) {\n return {\n message: \"You must claim rewards before performing this action.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot claim that much VESTS (from web operations.ts line 35)\n if (testPattern(/cannot claim that much vests/i)) {\n return {\n message: \"Cannot claim that amount. Please check your pending rewards.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot delete comment with positive votes (from web operations.ts line 42)\n if (testPattern(/cannot delete a comment with net positive/i)) {\n return {\n message: \"Cannot delete a comment with positive votes.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Comment has children (from web operations.ts line 44)\n if (testPattern(/children == 0/i)) {\n return {\n message: \"Cannot delete a comment with replies.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Comment already paid out (from web operations.ts line 46)\n if (testPattern(/comment_cashout/i)) {\n return {\n message: \"Cannot modify a comment that has already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Voting on paid out post (from web operations.ts line 48)\n if (testPattern(/votes evaluating for comment that is paid out is forbidden/i)) {\n return {\n message: \"Cannot vote on posts that have already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // No key available (SDK internal - from broadcastWithMethod when key not stored)\n if (testPattern(/no (active|owner|posting|memo) key available/i)) {\n return {\n message: \"Key not available. Please provide your key to sign this operation.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing active authority. Hive nodes return \"missing required active\n // authority\"; web operations.ts also throws the short form. Match both so the\n // auth fallback (auth-upgrade dialog) fires instead of misclassifying as a\n // generic chain error.\n if (testPattern(/missing (required )?active authority/i)) {\n return {\n message: \"Missing active authority. This operation requires your active key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing owner authority (\"missing required owner authority\" or short form)\n if (testPattern(/missing (required )?owner authority/i)) {\n return {\n message: \"Missing owner authority. This operation requires your owner key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing posting authority (general pattern)\n if (testPattern(/missing (required )?posting authority/i)) {\n return {\n message: \"Missing posting authority. Please check your login method.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Token expired / unauthorized (HiveSigner OAuth2 errors + general patterns)\n // HiveSigner returns: { error: \"invalid_grant\" } for invalid/expired tokens,\n // { error: \"unauthorized_access\" } for IP-based access denial\n if (\n errorCode === 'invalid_grant' ||\n errorCode === 'unauthorized_access' ||\n testPattern(/token expired/i) ||\n testPattern(/invalid token/i) ||\n testPattern(/\\bunauthorized\\b/i) ||\n testPattern(/\\bforbidden\\b/i)\n ) {\n return {\n message: \"Authentication token expired. Please log in again.\",\n type: ErrorType.TOKEN_EXPIRED,\n originalError: error,\n };\n }\n\n // Already reblogged\n if (testPattern(/has already reblogged/i) || testPattern(/already reblogged this post/i)) {\n return {\n message: \"You have already reblogged this post.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Duplicate transaction\n if (testPattern(/duplicate transaction/i)) {\n return {\n message: \"This transaction has already been processed.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Network errors (more specific patterns to avoid false positives)\n if (\n testPattern(/econnrefused/i) ||\n testPattern(/connection refused/i) ||\n testPattern(/failed to fetch/i) ||\n testPattern(/\\bnetwork[-\\s]?(request|error|timeout|unreachable|down|failed)\\b/i)\n ) {\n return {\n message: \"Network error. Please check your connection and try again.\",\n type: ErrorType.NETWORK,\n originalError: error,\n };\n }\n\n // Timeout errors\n if (testPattern(/timeout/i) || testPattern(/timed out/i)) {\n return {\n message: \"Request timed out. Please try again.\",\n type: ErrorType.TIMEOUT,\n originalError: error,\n };\n }\n\n // Account doesn't exist\n if (testPattern(/account.*does not exist/i) || testPattern(/account not found/i)) {\n return {\n message: \"Account not found. Please check the username.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Invalid memo key\n if (testPattern(/invalid memo key/i)) {\n return {\n message: \"Invalid memo key. Cannot encrypt message.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Insufficient funds (require both words in same string to avoid cross-field false positives)\n if (testPattern(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i)) {\n return {\n message: \"Insufficient funds for this transaction.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Generic validation errors (use word boundaries to be more specific)\n if (testPattern(/\\b(invalid|validation)\\b/i)) {\n // Truncate to 150 chars like other branches\n const message = (error?.message || errorString).substring(0, 150) || \"Validation error occurred\";\n return {\n message,\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Default: return original error message\n // Check for error_description first (from web operations.ts line 65-72)\n if (error?.error_description && typeof error.error_description === \"string\") {\n return {\n message: error.error_description.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Then check message field\n if (error?.message && typeof error.message === \"string\") {\n return {\n message: error.message.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Handle plain objects without message property (avoid \"[object Object]\")\n let message: string;\n if (typeof error === 'object' && error !== null) {\n // Check for common error properties\n if (error.error_description) {\n message = String(error.error_description);\n } else if (error.code) {\n message = `Error code: ${error.code}`;\n } else if (errorString && errorString !== '[object Object]') {\n message = errorString.substring(0, 150);\n } else {\n message = \"Unknown error occurred\";\n }\n } else {\n message = errorString.substring(0, 150) || \"Unknown error occurred\";\n }\n\n return {\n message,\n type: ErrorType.COMMON,\n originalError: error,\n };\n}\n\n/**\n * Formats error for display to user.\n * Returns tuple of [message, type] for backward compatibility with existing code.\n *\n * This function maintains compatibility with the old formatError signature from\n * web's operations.ts (line 59-84) and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string\n * @returns Tuple of [user-friendly message, error type]\n *\n * @example\n * ```typescript\n * try {\n * await transfer(...);\n * } catch (error) {\n * const [message, type] = formatError(error);\n * showToast(message, type);\n * }\n * ```\n */\nexport function formatError(error: any): [string, ErrorType] {\n const parsed = parseChainError(error);\n return [parsed.message, parsed.type];\n}\n\n/**\n * Checks if error indicates missing authority and should trigger auth fallback.\n * Used by the SDK's useBroadcastMutation to determine if it should retry with\n * an alternate authentication method.\n *\n * @param error - The error object or string\n * @returns true if auth fallback should be attempted\n *\n * @example\n * ```typescript\n * try {\n * await broadcast(operations);\n * } catch (error) {\n * if (shouldTriggerAuthFallback(error)) {\n * // Try with alternate auth method\n * await broadcastWithHiveAuth(operations);\n * }\n * }\n * ```\n */\nexport function shouldTriggerAuthFallback(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.MISSING_AUTHORITY || type === ErrorType.TOKEN_EXPIRED;\n}\n\n/**\n * Checks if error is a resource credits (RC) error.\n * Useful for showing specific UI feedback about RC issues.\n *\n * @param error - The error object or string\n * @returns true if the error is related to insufficient RC\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * if (isResourceCreditsError(error)) {\n * showRCWarning(); // Show specific RC education/power up UI\n * }\n * }\n * ```\n */\nexport function isResourceCreditsError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INSUFFICIENT_RESOURCE_CREDITS;\n}\n\n/**\n * Checks if error is informational (not critical).\n * Informational errors typically don't need retry logic.\n *\n * @param error - The error object or string\n * @returns true if the error is informational\n */\nexport function isInfoError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INFO;\n}\n\n/**\n * Checks if error is network-related and should be retried.\n *\n * @param error - The error object or string\n * @returns true if the error is network-related\n */\nexport function isNetworkError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.NETWORK || type === ErrorType.TIMEOUT;\n}\n","import {\n useMutation,\n type MutationKey,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { PrivateKey, RPCError } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { broadcastOperations, broadcastOperationsAsync, type TransactionConfirmation } from \"@/modules/core/hive-tx\";\nimport type { BroadcastResult } from \"../../../hive-tx\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { shouldTriggerAuthFallback } from \"@/modules/core/errors\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport hs from \"hivesigner\";\n\n/**\n * Broadcast mode controls whether the SDK waits for block inclusion.\n *\n * - `'async'` (default): Uses `broadcast_transaction` — returns once the node\n * accepts the transaction into its mempool. Transport and RPC errors are\n * still thrown immediately; only the block-inclusion wait is skipped.\n *\n * - `'sync'`: Uses `broadcast_transaction_synchronous` — waits for block\n * inclusion and returns `block_num`/`trx_num`. Deprecated; prefer `'async'`\n * and poll `transaction_status_api` if you need block confirmation.\n */\nexport type BroadcastMode = 'sync' | 'async';\n\n/**\n * Broadcasts operations using a specific auth method.\n *\n * @param method - Auth method to use ('key', 'hiveauth', 'hivesigner', 'keychain', 'custom')\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and configuration\n * @param authority - Key authority to use (posting, active, owner, or memo)\n * @param fetchedKey - Optional pre-fetched key to avoid duplicate fetches\n * @param fetchedToken - Optional pre-fetched access token to avoid duplicate fetches\n * @param broadcastMode - Whether to wait for block inclusion ('sync') or just mempool acceptance ('async')\n * @returns Transaction confirmation from the blockchain\n * @throws Error if method is not available or broadcast fails\n */\nasync function broadcastWithMethod(\n method: string,\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n fetchedKey?: string | null,\n fetchedToken?: string | null,\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n switch (method) {\n case 'key': {\n if (!adapter) {\n throw new Error('No adapter provided for key-based auth');\n }\n\n // Use pre-fetched key if provided, otherwise fetch it\n let key: string | null | undefined = fetchedKey;\n\n if (key === undefined) {\n // Key not pre-fetched, fetch it now based on authority\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n } else {\n throw new Error(\n `Owner key not supported by adapter. Owner operations (like account recovery) ` +\n `require master password login or manual key entry.`\n );\n }\n break;\n\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n } else {\n throw new Error(\n `Memo key not supported by adapter. Use memo encryption methods instead.`\n );\n }\n break;\n\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n }\n\n if (!key) {\n throw new Error(`No ${authority} key available for ${username}`);\n }\n\n // Attempt broadcast with key\n const privateKey = PrivateKey.fromString(key);\n if (broadcastMode === 'async') {\n return await broadcastOperationsAsync(ops, privateKey);\n }\n return await broadcastOperations(ops, privateKey);\n }\n\n case 'hiveauth': {\n if (!adapter?.broadcastWithHiveAuth) {\n throw new Error('HiveAuth not supported by adapter');\n }\n return await adapter.broadcastWithHiveAuth(username, ops, authority);\n }\n\n case 'hivesigner': {\n if (!adapter) {\n throw new Error('No adapter provided for HiveSigner auth');\n }\n\n // Access tokens only have posting authority — for active/owner/memo ops,\n // go directly to platform-specific HiveSigner broadcast (e.g., redirect to hivesigner.com)\n if (authority !== 'posting') {\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw new Error(`HiveSigner access token cannot sign ${authority} operations. No platform broadcast available.`);\n }\n\n // Try direct API broadcast with access token first (posting ops only)\n const token = fetchedToken !== undefined\n ? fetchedToken\n : await adapter.getAccessToken(username);\n\n if (token) {\n try {\n const client = new hs.Client({ accessToken: token });\n const response = await client.broadcast(ops);\n return response.result;\n } catch (tokenError) {\n // Token broadcast failed — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner && shouldTriggerAuthFallback(tokenError)) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw tokenError;\n }\n }\n\n // No token available — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n\n throw new Error(`No access token available for ${username}`);\n }\n\n case 'keychain': {\n if (!adapter?.broadcastWithKeychain) {\n throw new Error('Keychain not supported by adapter');\n }\n return await adapter.broadcastWithKeychain(username, ops, authority);\n }\n\n case 'custom': {\n if (!auth?.broadcast) {\n throw new Error('No custom broadcast function provided');\n }\n return (await auth.broadcast(ops, authority)) as TransactionConfirmation;\n }\n\n default:\n throw new Error(`Unknown auth method: ${method}`);\n }\n}\n\n/**\n * Attempts to broadcast operations using multiple auth methods in fallback chain.\n * Implements sophisticated fallback pattern from mobile app.\n *\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and fallback configuration\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n * @returns Transaction confirmation from the blockchain\n * @throws Error if all auth methods fail or if a non-auth error occurs\n *\n * @remarks\n * **Preferred Behavior (when adapter.getLoginType exists):**\n * - Calls adapter.getLoginType() to determine user's actual auth method\n * - Uses ONLY that method (no fallbacks) - more predictable and faster\n * - If it fails, throws the error immediately\n *\n * **Fallback Behavior (for backward compatibility):**\n * - Tries each auth method in the fallback chain order\n * - Only continues to next method if error is auth-related (missing authority, token expired)\n * - Stops immediately for non-auth errors (RC exhaustion, network errors, validation errors)\n * - Collects all errors and provides detailed failure message\n *\n * @example\n * ```typescript\n * // Preferred: Adapter with getLoginType (single method, no fallbacks)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter, // includes getLoginType()\n * };\n *\n * // Legacy: Explicit fallback chain (tries multiple methods)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter,\n * fallbackChain: ['key', 'hiveauth', 'hivesigner'],\n * };\n * ```\n */\nasync function broadcastWithFallback(\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n // PREFERRED APPROACH: If adapter provides getLoginType, use smart auth strategy\n // This avoids unnecessary fallback attempts and is more predictable\n if (adapter?.getLoginType) {\n const loginType = await adapter.getLoginType(username, authority);\n\n if (loginType) {\n // SMART AUTH STRATEGY: Optimize based on login type + authority + credentials\n\n // Check if user has granted ecency.app posting authority\n const hasPostingAuth = adapter.hasPostingAuthorization\n ? await adapter.hasPostingAuthorization(username)\n : false;\n\n // OPTIMIZATION: Use HiveSigner token for posting ops when posting auth is granted\n // This is faster than direct key signing or HiveAuth for key-based logins\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'key'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to direct key signing if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to key:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for keychain/MetaMask users with posting auth (faster, no popup)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'keychain'\n ) {\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n console.warn('[SDK] HiveSigner token auth failed, falling back to keychain/snap:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for HiveAuth users with posting auth (faster)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'hiveauth'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to HiveAuth if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to HiveAuth:', error);\n }\n }\n\n // Use user's actual login method\n try {\n return await broadcastWithMethod(loginType, username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Check if error is due to missing authority (e.g., posting key trying active op)\n if (shouldTriggerAuthFallback(error)) {\n // Show auth upgrade UI if available (only for posting/active operations)\n if (\n adapter.showAuthUpgradeUI &&\n (authority === 'posting' || authority === 'active')\n ) {\n // Guard against empty operations array\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n\n // User selected a specific method - delegate to broadcastWithMethod\n // This handles all auth methods (hiveauth, hivesigner, key, keychain, custom, etc.)\n // broadcastWithMethod already contains all necessary validation and method-specific logic\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // Not an auth error, or no upgrade UI available - throw original error\n throw error;\n }\n }\n\n // loginType is null — user's auth method is unknown (e.g., incomplete login data)\n if (authority === 'posting') {\n // For posting ops, try HiveSigner — access token is usually available for all logins\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (hsError) {\n if (shouldTriggerAuthFallback(hsError) && adapter.showAuthUpgradeUI) {\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`No login type available for ${username}. Please log in again.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n throw hsError;\n }\n } else if (authority === 'active' && adapter.showAuthUpgradeUI) {\n // For active ops, show auth upgrade dialog — no silent fallback possible\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // FALLBACK APPROACH: For backward compatibility, use fallback chain\n // This is only used if adapter doesn't provide getLoginType\n const chain = auth?.fallbackChain ?? ['key', 'hiveauth', 'hivesigner', 'keychain', 'custom'];\n const errors: Map = new Map();\n\n for (const method of chain) {\n try {\n // Check if method is available before attempting\n let shouldSkip = false;\n let skipReason = '';\n let prefetchedKey: string | null | undefined;\n let prefetchedToken: string | null | undefined;\n\n switch (method) {\n case 'key':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch key to check availability (will be reused in broadcast)\n let key: string | null | undefined;\n\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n }\n break;\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n }\n break;\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n\n if (!key) {\n shouldSkip = true;\n skipReason = `No ${authority} key available`;\n } else {\n prefetchedKey = key; // Store for reuse\n }\n }\n break;\n case 'hiveauth':\n if (!adapter?.broadcastWithHiveAuth) {\n shouldSkip = true;\n skipReason = 'HiveAuth not supported by adapter';\n }\n break;\n case 'hivesigner':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch token if available (will be reused in broadcast)\n const token = await adapter.getAccessToken(username);\n if (token) {\n prefetchedToken = token; // Store for reuse\n }\n // When no token but adapter exists, don't skip —\n // broadcastWithMethod can fall back to adapter.broadcastWithHiveSigner\n }\n break;\n case 'keychain':\n if (!adapter?.broadcastWithKeychain) {\n shouldSkip = true;\n skipReason = 'Keychain not supported by adapter';\n }\n break;\n case 'custom':\n if (!auth?.broadcast) {\n shouldSkip = true;\n skipReason = 'No custom broadcast function provided';\n }\n break;\n }\n\n if (shouldSkip) {\n errors.set(method, new Error(`Skipped: ${skipReason}`));\n continue;\n }\n\n // Method is available, attempt broadcast with pre-fetched credentials\n return await broadcastWithMethod(method, username, ops, auth, authority, prefetchedKey, prefetchedToken, broadcastMode);\n } catch (error) {\n // Record actual error from failed broadcast attempt\n errors.set(method, error as Error);\n\n // Only continue fallback if error suggests trying another method\n if (!shouldTriggerAuthFallback(error)) {\n // If it's not an auth error, throw immediately (e.g., RC error, network error)\n throw error;\n }\n }\n }\n\n // FIX #2: Improved error message distinguishes between skips and real failures\n const hasRealAttempts = Array.from(errors.values()).some(\n error => !error.message.startsWith('Skipped:')\n );\n\n if (!hasRealAttempts) {\n // All methods were skipped (none attempted)\n const skipReasons = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n throw new Error(\n `[SDK][Broadcast] No auth methods attempted for ${username}. ${skipReasons}`\n );\n }\n\n // At least one method was attempted but all failed\n const errorMessages = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n\n throw new Error(\n `[SDK][Broadcast] All auth methods failed for ${username}. Errors: ${errorMessages}`\n );\n}\n\n/**\n * React Query mutation hook for broadcasting Hive operations.\n * Supports multiple authentication methods with automatic fallback.\n *\n * @template T - Type of the mutation payload\n * @param mutationKey - React Query mutation key for cache management\n * @param username - Hive username (required for broadcast)\n * @param operations - Function that converts payload to Hive operations\n * @param onSuccess - Success callback after broadcast completes\n * @param auth - Authentication context (supports both legacy AuthContext and new AuthContextV2)\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Authentication Flow:**\n *\n * 1. **With AuthContextV2 + adapter + enableFallback** (recommended for new code):\n * - Tries auth methods in fallbackChain order\n * - Smart fallback: only retries on auth errors, not RC/network errors\n * - Uses platform adapter for storage, UI, and broadcasting\n *\n * 2. **With legacy AuthContext** (backward compatible):\n * - Tries auth.broadcast() first (custom implementation)\n * - Falls back to postingKey if available\n * - Falls back to accessToken (HiveSigner) if available\n * - Throws if no auth method available\n *\n * **Backward Compatibility:**\n * - All existing code using AuthContext will continue to work\n * - AuthContextV2 extends AuthContext, so it's a drop-in replacement\n * - enableFallback defaults to false if no adapter provided\n *\n * @example\n * ```typescript\n * // New pattern with platform adapter and fallback\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * },\n * 'posting'\n * );\n *\n * // Legacy pattern (still works)\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * { postingKey: 'wif-key' }\n * );\n * ```\n */\nexport function useBroadcastMutation(\n mutationKey: MutationKey = [],\n username: string | undefined,\n operations: (payload: T) => Operation[],\n onSuccess: UseMutationOptions[\"onSuccess\"] = () => {},\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n options?: {\n onMutate?: UseMutationOptions[\"onMutate\"];\n onError?: UseMutationOptions[\"onError\"];\n onSettled?: UseMutationOptions[\"onSettled\"];\n /**\n * Controls whether to wait for block inclusion or just mempool acceptance.\n *\n * - `'async'` (default): Returns after mempool acceptance. Recommended for\n * all operations; errors are still thrown immediately.\n *\n * - `'sync'`: Waits for block inclusion, returns block_num/trx_num.\n * Deprecated; prefer `'async'`.\n */\n broadcastMode?: BroadcastMode;\n }\n) {\n const broadcastMode = options?.broadcastMode ?? 'async';\n\n return useMutation({\n onSuccess,\n onMutate: options?.onMutate,\n onError: options?.onError,\n onSettled: options?.onSettled,\n mutationKey: [...mutationKey, username],\n mutationFn: async (payload: T) => {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n\n const ops = operations(payload);\n\n try {\n // New: Try auth methods in fallback chain (if enabled)\n if (auth?.enableFallback !== false && auth?.adapter) {\n return await broadcastWithFallback(username, ops, auth, authority, broadcastMode);\n }\n\n // Legacy behavior: try methods in fixed order (backward compatible)\n if (auth?.broadcast) {\n return await auth.broadcast(ops, authority);\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n // Legacy auth only supports posting authority\n if (authority !== 'posting') {\n throw new Error(\n `[SDK][Broadcast] Legacy auth only supports posting authority, but '${authority}' was requested. ` +\n `Use AuthContextV2 with an adapter for ${authority} operations.`\n );\n }\n\n const privateKey = PrivateKey.fromString(postingKey);\n\n return await broadcastOperations(\n ops,\n privateKey\n );\n }\n\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const client = new hs.Client({ accessToken });\n const response = await client.broadcast(ops);\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n } catch (e) {\n if (e instanceof RPCError) {\n // Normalize raw blockchain rejections (missing authority, RC exhaustion,\n // validation failures) from every broadcast path — sync and async — into\n // a plain Error whose message is preserved for downstream classification\n // (formatError), so React Query captures a handled mutation error.\n throw new Error(e.message);\n }\n throw e\n }\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\nimport hs from \"hivesigner\";\nimport type { AuthContext } from \"@/modules/core/types\";\n\nexport async function broadcastJson(\n username: string | undefined,\n id: string,\n payload: T,\n auth?: AuthContext\n) {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n const jjson = {\n id,\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify(payload),\n };\n\n if (auth?.broadcast) {\n return auth.broadcast([[\"custom_json\", jjson]], \"posting\");\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n const privateKey = PrivateKey.fromString(postingKey);\n\n return broadcastOperations(\n [[\"custom_json\", jjson]],\n privateKey\n );\n }\n\n // With hivesigner access token\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const response = await new hs.Client({\n accessToken,\n }).customJson([], [username], id, JSON.stringify(payload));\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n}\n","import type { BroadcastMode } from \"./use-broadcast-mutation\";\nimport type { PlatformAdapter } from \"@/modules/core/types\";\n\n/**\n * Delay (ms) before invalidating chain-derived queries after an async\n * broadcast. ~1.3 Hive blocks (3s/block) so the just-broadcast transaction has\n * landed in a block before we refetch — otherwise the refetch returns pre-tx\n * state (e.g. a stale wallet balance).\n */\nexport const BROADCAST_INCLUSION_DELAY_MS = 4000;\n\n/**\n * Invalidate queries after a broadcast, accounting for broadcast mode.\n *\n * - `'sync'`: the transaction already waited for block inclusion, so refetch\n * immediately (returns the adapter's promise so callers may await it).\n * - `'async'` (default) / undefined: the transaction is only in the mempool, so\n * a refetch now would read pre-tx state — defer by ~1 block.\n *\n * No-ops when the adapter can't invalidate.\n */\nexport function invalidateAfterBroadcast(\n adapter: PlatformAdapter | null | undefined,\n broadcastMode: BroadcastMode | undefined,\n keys: any[][]\n): void | Promise {\n if (!adapter?.invalidateQueries) return;\n if (broadcastMode === \"sync\") {\n // Method call (not an extracted reference) so `this` stays bound to adapter.\n return adapter.invalidateQueries(keys);\n }\n setTimeout(() => adapter.invalidateQueries?.(keys), BROADCAST_INCLUSION_DELAY_MS);\n}\n","export function withTimeoutSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n if (!signal) return timeoutSignal;\n\n // AbortSignal.any is available in Chrome 116+, Safari 17.4+, Firefox 124+.\n // Fall back to manual AbortController wiring for older browsers.\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([signal, timeoutSignal]);\n }\n\n const ac = new AbortController();\n const onAbort = () => {\n const reason = signal.aborted ? signal.reason : timeoutSignal.reason;\n ac.abort(reason);\n signal.removeEventListener(\"abort\", onAbort);\n timeoutSignal.removeEventListener(\"abort\", onAbort);\n };\n if (signal.aborted) {\n ac.abort(signal.reason);\n } else if (timeoutSignal.aborted) {\n ac.abort(timeoutSignal.reason);\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n timeoutSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return ac.signal;\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport {\n config as hiveTxConfig,\n setNodes as setHiveTxNodes,\n setRestNodes as setHiveTxRestNodes,\n setRestNodesByApi as setHiveTxRestNodesByApi,\n setUserAgent as setHiveTxUserAgent,\n setResilience as setHiveTxResilience,\n type ResilienceOptions,\n} from \"../../hive-tx\";\nimport type { APIMethods } from \"../../hive-tx/api-types\";\n\n// Safe environment variable access for browser builds\n// In browser builds, tsup will replace process.env.* with literal values at compile time\nconst isDevelopment = (() => {\n try {\n return process.env?.NODE_ENV === 'development';\n } catch {\n return false;\n }\n})();\n\nconst getHeliusApiKey = () => {\n try {\n return process.env?.VITE_HELIUS_API_KEY;\n } catch {\n return undefined;\n }\n};\n\n/** Timeout for internal API calls (search, private API). */\nexport const INTERNAL_API_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on `gcTime` for any query that runs during SSR.\n *\n * A long window is fine in a browser or native app, where the cache holds one\n * user's data and lives as long as the session. It is not fine in a server\n * renderer: every query schedules a gc timer, a pending timer is a GC root, and\n * `Query` holds the whole `QueryCache` — so one long-lived entry keeps\n * everything else that request cached reachable for its entire window. A server\n * process then settles at roughly `ingest rate × gcTime`, which is how\n * ecency.com's renderers ended up aborting on the old-space cap rather than\n * levelling off (2026-07-26).\n *\n * Two minutes is far longer than any single render, which is the only window a\n * server-side entry has to be reused before it is dehydrated into the payload.\n *\n * Note this bounds SDK queries at the source. `apps/web` additionally clamps\n * every query through `defaultQueryOptions`, which is what protects it from\n * options defined outside the SDK; hosts that do not clamp get the right\n * behaviour from these defaults alone.\n */\nexport const SERVER_GC_TIME_MS = 2 * 60 * 1000;\n\n/**\n * How `CONFIG.queryClient` is resolved.\n *\n * This used to be a plain `queryClient: new QueryClient()` property — a single\n * instance created at module import and shared by every caller for the lifetime\n * of the process. That is correct in a browser (one process, one user) but wrong\n * under SSR, where one process serves every request: each server render wrote its\n * fetched data into that one cache and nothing ever removed it, so the heap grew\n * monotonically until the renderer hit its old-space limit and aborted.\n *\n * A host that renders on the server registers a resolver (see\n * `ConfigManager.setQueryClientResolver`) which returns the *current request's*\n * client, so cached data dies with the request that produced it. Hosts that\n * genuinely want one long-lived client keep using `setQueryClient`, and callers\n * that configure nothing fall back to a lazily created instance.\n *\n * The resolver is consulted on every read rather than cached here on purpose:\n * request scoping is the host's concern, and only the host can know when one\n * request ends and the next begins.\n */\nlet queryClientResolver: (() => QueryClient) | undefined;\n\n/** Created on first use, and only when no resolver has been registered. */\nlet fallbackQueryClient: QueryClient | undefined;\n\nfunction resolveQueryClient(): QueryClient {\n if (queryClientResolver) {\n return queryClientResolver();\n }\n return (fallbackQueryClient ??= new QueryClient());\n}\n\nexport const CONFIG = {\n privateApiHost: \"https://ecency.com\",\n /**\n * Observer used for bridge calls when nobody is logged in. The bridge applies\n * this account's mute list to the response, marking muted authors' posts and\n * comments `stats.gray` so clients can dim or collapse them. Anonymous\n * visitors therefore inherit Ecency's moderation instead of seeing an\n * unfiltered firehose. Apps may override via `ConfigManager.setDefaultObserver`,\n * which expects a real account rather than \"\" (see that setter).\n *\n * Note this only *marks* content: the bridge still returns muted authors'\n * posts, so an observer never shortens a feed.\n */\n defaultObserver: \"ecency\",\n /**\n * First-party client identifier sent as the `X-Ecency-Client` header on\n * search/private API requests. Lets the origin distinguish Ecency's own\n * web/mobile/SSR traffic from third-party integrators (who should use the\n * keyed api.hivesearcher.com backend instead of the public proxy). This is\n * a routing marker, not a secret. Apps may override via\n * `ConfigManager.setClientId` (e.g. \"web\" or \"mobile\") for observability.\n */\n clientId: \"ecency-sdk\",\n imageHost: \"https://i.ecency.com\",\n /** Current Hive RPC nodes. Reads from the unified hive-tx config. */\n get hiveNodes(): string[] {\n return hiveTxConfig.nodes;\n },\n heliusApiKey: getHeliusApiKey(),\n /**\n * The React Query client all SDK code reads through `getQueryClient()`.\n * Backed by a resolver so an SSR host can scope it per request — see the\n * `queryClientResolver` note above. Assigning replaces the resolver with one\n * that always returns the assigned client, preserving the previous\n * \"one client, set once\" behaviour for browser and native hosts.\n */\n get queryClient(): QueryClient {\n return resolveQueryClient();\n },\n set queryClient(client: QueryClient) {\n queryClientResolver = () => client;\n },\n pollsApiHost: \"https://poll.ecency.com\",\n plausibleHost: \"https://pl.ecency.com\",\n // DMCA filtering - can be configured by the app\n dmcaAccounts: [] as string[],\n dmcaTags: [] as string[],\n dmcaPatterns: [] as string[],\n // Pre-compiled regex patterns for performance and security\n dmcaTagRegexes: [] as RegExp[],\n dmcaPatternRegexes: [] as RegExp[],\n // Track if DMCA has been initialized to avoid duplicate logs\n _dmcaInitialized: false,\n};\n\ntype DmcaListsInput = {\n accounts?: string[];\n tags?: string[];\n posts?: string[];\n};\n\nexport namespace ConfigManager {\n export function setQueryClient(client: QueryClient) {\n CONFIG.queryClient = client;\n }\n\n /**\n * Register how the SDK should obtain its React Query client, for hosts where\n * a single shared instance is wrong — principally SSR, where one process\n * serves many requests and a shared cache both leaks memory and risks serving\n * one request's data to another.\n *\n * `resolve` is called on every SDK cache access and should return the client\n * belonging to the request currently being handled. In a Next.js App Router\n * host that means wrapping the factory in React's `cache()`, which memoises\n * per request:\n *\n * ```ts\n * ConfigManager.setQueryClientResolver(() => getQueryClient());\n * ```\n *\n * Registering a resolver supersedes any client previously passed to\n * `setQueryClient`; assigning a client afterwards supersedes the resolver.\n */\n export function setQueryClientResolver(resolve: () => QueryClient) {\n queryClientResolver = resolve;\n }\n\n /**\n * Set the private API host\n * @param host - The private API host URL (e.g., \"https://ecency.com\" or \"\" for relative URLs)\n */\n export function setPrivateApiHost(host: string) {\n CONFIG.privateApiHost = host;\n }\n\n /**\n * Set the first-party client identifier sent as the `X-Ecency-Client` header\n * on search/private API requests (e.g. \"web\" or \"mobile\"). Defaults to\n * \"ecency-sdk\". Used by the origin to tell Ecency's own apps apart from\n * third-party integrators.\n * @param clientId - Short client label\n */\n export function setClientId(clientId: string) {\n CONFIG.clientId = clientId;\n }\n\n /**\n * Set the observer used for bridge calls made without a logged-in user.\n * Defaults to \"ecency\"; a third-party integrator should point this at their\n * own moderation account.\n *\n * Must be a real account. An empty value is rejected rather than treated as\n * an opt-out: consumers resolve the observer with `||`, and `getDiscussion`\n * separately falls back to the post author, so \"\" would not disable mute\n * marking. It would silently observe as someone else while being cached under\n * \"\", leaving the request and its cache key describing different things.\n * @param observer - Hive account whose mute list applies to anonymous reads\n * @throws If given an empty or whitespace-only value\n */\n export function setDefaultObserver(observer: string) {\n if (typeof observer !== \"string\" || observer.trim() === \"\") {\n throw new Error(\n \"setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; \" +\n \"observer resolution would fall back to the post author while caching under an empty key.\"\n );\n }\n\n CONFIG.defaultObserver = observer;\n }\n\n /**\n * Get a validated base URL for API requests\n * Returns a valid base URL that can be used with new URL(path, baseUrl)\n *\n * Priority:\n * 1. CONFIG.privateApiHost if set (dev/staging or explicit config)\n * 2. window.location.origin if in browser (production with relative URLs)\n * 3. 'https://ecency.com' as fallback for SSR (production default)\n *\n * @returns A valid base URL string\n * @throws Never throws - always returns a valid URL\n */\n export function getValidatedBaseUrl(): string {\n if (CONFIG.privateApiHost) {\n return CONFIG.privateApiHost;\n }\n\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n\n // Fallback for SSR when privateApiHost is empty (production case)\n return 'https://ecency.com';\n }\n\n /**\n * Set the polls API host\n * @param host - The polls API host URL (e.g., \"https://poll.ecency.com\")\n */\n export function setPollsApiHost(host: string) {\n CONFIG.pollsApiHost = host;\n }\n\n /**\n * Set the image host\n * @param host - The image host URL (e.g., \"https://i.ecency.com\")\n */\n export function setImageHost(host: string) {\n CONFIG.imageHost = host;\n }\n\n /**\n * Set Hive RPC nodes, replacing the default list.\n * Delegates to the unified hive-tx `setNodes` (single validated setter,\n * shared with the lean `@ecency/sdk/hive` entry) so node configuration is\n * defined in exactly one place.\n * @param nodes - Array of Hive RPC node URLs\n */\n export function setHiveNodes(nodes: string[]) {\n setHiveTxNodes(nodes);\n }\n\n /**\n * Set the REST-API node list, replacing the default `restNodes`. Lets an app\n * add/remove REST hosts at runtime (e.g. drop an own node being decommissioned,\n * or widen the public pool) without forking + republishing the SDK. Delegates to\n * the unified hive-tx `setRestNodes` (validated, shared with `@ecency/sdk/hive`).\n * @param nodes - Array of REST-capable node URLs (without a trailing slash)\n */\n export function setRestNodes(nodes: string[]) {\n setHiveTxRestNodes(nodes);\n }\n\n /**\n * Merge per-API REST node overrides. For each API a non-empty valid list pins it\n * to those hosts (so `callREST` never wastes its retry budget on a node that\n * 404/503s the API); an empty list removes the pin (falls back to `restNodes`).\n * Other APIs' pins (e.g. the built-in `hivesense`) are preserved. Delegates to the\n * unified hive-tx `setRestNodesByApi`.\n * @param map - Partial map of REST API name → capable node URLs\n */\n export function setRestNodesByApi(map: Partial>) {\n setHiveTxRestNodesByApi(map);\n }\n\n /**\n * Set the User-Agent sent on server-side (Node) requests to Hive nodes.\n * Lets an app label its own SSR/server traffic (otherwise Node's fetch sends a\n * bare `node` UA). No effect in browsers (User-Agent is a forbidden header) or\n * React Native (keeps its native UA). Delegates to the unified hive-tx setter.\n * @param userAgent - The User-Agent string (e.g. \"ecency-web-ssr (+https://ecency.com)\")\n */\n export function setUserAgent(userAgent: string) {\n setHiveTxUserAgent(userAgent);\n }\n\n /**\n * Tune read-call tail-latency resilience: adaptive per-attempt timeouts\n * (default on) and hedged requests (default OFF — a duplicate request races\n * the next healthy node when the primary stalls, bounded by a token bucket so\n * only the slow tail hedges and pool-wide slowness self-disables it). Partial:\n * only the fields provided are changed; invalid values are ignored\n * field-by-field. Delegates to the unified hive-tx `setResilience`.\n * @param opts - e.g. `{ hedge: true }` to opt into hedged reads\n */\n export function setResilience(opts: Partial) {\n setHiveTxResilience(opts);\n }\n\n /**\n * Static analysis: Check for known ReDoS-vulnerable patterns\n * @param pattern - Raw regex pattern string\n * @returns Object with risk level and reason\n */\n function analyzeRedosRisk(pattern: string): { safe: boolean; reason?: string } {\n // Check 1: Nested quantifiers (e.g., (a+)+, (a*)+, (a{1,})+)\n if (/(\\([^)]*[*+{][^)]*\\))[*+{]/.test(pattern)) {\n return { safe: false, reason: \"nested quantifiers detected\" };\n }\n\n // Check 2: Alternation with overlapping terms (e.g., (a|a)+, (ab|a)+)\n if (/\\([^|)]*\\|[^)]*\\)[*+{]/.test(pattern)) {\n return { safe: false, reason: \"alternation with quantifier (potential overlap)\" };\n }\n\n // Check 3: Catastrophic backtracking patterns (e.g., (a*)*b, (a+)+b)\n if (/\\([^)]*[*+][^)]*\\)[*+]/.test(pattern)) {\n return { safe: false, reason: \"repeated quantifiers (catastrophic backtracking risk)\" };\n }\n\n // Check 4: Greedy quantifiers followed by optional patterns (e.g., .*.*x, .+.+x)\n if (/\\.\\*\\.\\*/.test(pattern) || /\\.\\+\\.\\+/.test(pattern)) {\n return { safe: false, reason: \"multiple greedy quantifiers on wildcards\" };\n }\n\n // Check 5: Unbounded ranges with wildcards (e.g., .{1,999999})\n const unboundedRange = /\\.?\\{(\\d+),(\\d+)\\}/g;\n let match;\n while ((match = unboundedRange.exec(pattern)) !== null) {\n const [, min, max] = match;\n const range = parseInt(max, 10) - parseInt(min, 10);\n if (range > 1000) {\n return { safe: false, reason: `excessive range: {${min},${max}}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Runtime test: Execute regex against adversarial inputs with timeout\n * @param regex - Compiled regex\n * @returns Object indicating if regex passed runtime test\n */\n function testRegexPerformance(regex: RegExp): { safe: boolean; reason?: string } {\n // Test inputs designed to trigger ReDoS in vulnerable patterns\n const adversarialInputs = [\n // Nested quantifier attack\n \"a\".repeat(50) + \"x\",\n // Alternation attack\n \"ab\".repeat(50) + \"x\",\n // Wildcard attack\n \"x\".repeat(100),\n // Mixed attack\n \"aaa\".repeat(30) + \"bbb\".repeat(30) + \"x\",\n ];\n\n const maxExecutionTime = 5; // 5ms hard limit per test\n\n for (const input of adversarialInputs) {\n const start = Date.now();\n try {\n regex.test(input);\n const duration = Date.now() - start;\n\n if (duration > maxExecutionTime) {\n return {\n safe: false,\n reason: `runtime test exceeded ${maxExecutionTime}ms (took ${duration}ms on input length ${input.length})`\n };\n }\n } catch (err) {\n return { safe: false, reason: `runtime test threw error: ${err}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Safely compile a regex pattern with defense-in-depth validation\n * @param pattern - Raw regex pattern string\n * @param maxLength - Maximum allowed pattern length (default 200)\n * @returns Compiled RegExp or null if invalid/unsafe\n */\n function safeCompileRegex(pattern: string, maxLength = 200): RegExp | null {\n // Use the module-level isDevelopment constant\n\n try {\n // Layer 1: Basic validation\n if (!pattern) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: empty pattern`);\n }\n return null;\n }\n\n if (pattern.length > maxLength) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: length ${pattern.length} exceeds max ${maxLength} - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 2: Static ReDoS analysis\n const staticAnalysis = analyzeRedosRisk(pattern);\n if (!staticAnalysis.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${staticAnalysis.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 3: Compilation attempt\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (compileErr) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${pattern.substring(0, 50)}...`, compileErr);\n }\n return null;\n }\n\n // Layer 4: Runtime performance testing\n const runtimeTest = testRegexPerformance(regex);\n if (!runtimeTest.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${runtimeTest.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n return regex;\n } catch (err) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${pattern.substring(0, 50)}...`, err);\n }\n return null;\n }\n }\n\n /**\n * Set DMCA filtering lists\n * @param lists - DMCA lists object containing accounts/tags/posts arrays\n */\n export function setDmcaLists(\n lists: DmcaListsInput = {}\n ) {\n const coerceList = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n // Ensure we have a valid object to work with\n const input = lists || {};\n\n const resolved = {\n accounts: coerceList(input.accounts),\n tags: coerceList(input.tags),\n patterns: coerceList(input.posts),\n };\n\n CONFIG.dmcaAccounts = resolved.accounts;\n CONFIG.dmcaTags = resolved.tags;\n CONFIG.dmcaPatterns = resolved.patterns;\n\n // Pre-compile tag regex patterns (tags can be regex)\n CONFIG.dmcaTagRegexes = resolved.tags\n .map((pattern) => safeCompileRegex(pattern))\n .filter((r): r is RegExp => r !== null);\n\n // Post patterns are plain strings for exact matching, not regex\n // No compilation needed - they will be used with simple string comparison\n CONFIG.dmcaPatternRegexes = [];\n\n const rejectedTagCount = resolved.tags.length - CONFIG.dmcaTagRegexes.length;\n\n // Only log once to avoid noise during builds/hot reloads\n // Only show in development mode to avoid cluttering production console\n // Use the module-level isDevelopment constant\n\n if (!CONFIG._dmcaInitialized && isDevelopment) {\n console.log(`[SDK] DMCA configuration loaded:`);\n console.log(` - Accounts: ${resolved.accounts.length}`);\n console.log(` - Tag patterns: ${CONFIG.dmcaTagRegexes.length}/${resolved.tags.length} compiled (${rejectedTagCount} rejected)`);\n console.log(` - Post patterns: ${resolved.patterns.length} (using exact string matching)`);\n\n if (rejectedTagCount > 0) {\n console.warn(`[SDK] ${rejectedTagCount} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`);\n }\n }\n\n CONFIG._dmcaInitialized = true;\n }\n}\n","import {\n InfiniteData,\n QueryClient,\n QueryKey,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n useQuery,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { CONFIG } from \"./config\";\n\n/**\n * Builds a client with the SDK's defaults. It is only a factory — request\n * scoping is the host's job, via `ConfigManager.setQueryClientResolver`, since\n * only the host knows where one request ends and the next begins.\n */\nexport function makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // With SSR, we usually want to set some default staleTime\n // above 0 to avoid refetching immediately on the client\n // staleTime: 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n },\n },\n });\n}\nexport const getQueryClient = () => CONFIG.queryClient;\n\nexport namespace EcencyQueriesManager {\n export function getQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData(queryKey);\n }\n\n export function getInfiniteQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData>(queryKey);\n }\n\n export async function prefetchQuery(options: UseQueryOptions) {\n const queryClient = getQueryClient();\n await queryClient.prefetchQuery(options);\n return getQueryData(options.queryKey);\n }\n\n export async function prefetchInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n const queryClient = getQueryClient();\n await queryClient.prefetchInfiniteQuery(options);\n return getInfiniteQueryData(options.queryKey);\n }\n\n export function generateClientServerQuery(options: UseQueryOptions) {\n return {\n prefetch: () => prefetchQuery(options),\n getData: () => getQueryData(options.queryKey),\n useClientQuery: () => useQuery(options),\n fetchAndGet: () => getQueryClient().fetchQuery(options),\n };\n }\n\n export function generateClientServerInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n return {\n prefetch: () => prefetchInfiniteQuery(options),\n getData: () => getInfiniteQueryData(options.queryKey),\n useClientQuery: () => useInfiniteQuery(options),\n fetchAndGet: () => getQueryClient().fetchInfiniteQuery(options),\n };\n }\n}\n","export function encodeObj(o: any): string {\n return btoa(JSON.stringify(o));\n}\n\nexport function decodeObj(o: any): any {\n let dataToParse = atob(o);\n if (dataToParse[0] !== \"{\") {\n return undefined;\n }\n return JSON.parse(dataToParse);\n}\n","import type { SMTAsset } from \"@/modules/core/hive-tx\";\n\nexport enum Symbol {\n HIVE = \"HIVE\",\n HBD = \"HBD\",\n VESTS = \"VESTS\",\n}\n\nexport enum NaiMap {\n \"@@000000021\" = \"HIVE\",\n \"@@000000013\" = \"HBD\",\n \"@@000000037\" = \"VESTS\",\n}\n\nexport interface Asset {\n amount: number;\n symbol: Symbol;\n}\n\nexport function parseAsset(sval: string | SMTAsset): Asset {\n if (typeof sval === \"string\") {\n const sp = sval.split(\" \");\n return {\n amount: parseFloat(sp[0]),\n // @ts-ignore\n symbol: Symbol[sp[1]],\n };\n } else {\n return {\n amount: parseFloat(sval.amount.toString()) / Math.pow(10, sval.precision),\n // @ts-ignore\n symbol: NaiMap[sval.nai],\n };\n }\n}\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][SDK] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","export function isCommunity(value: unknown) {\n return typeof value === \"string\" ? /^hive-\\d+$/.test(value) : false;\n}\n","import { WrappedResponse } from \"../types/pagination\";\n\n/**\n * Type guard to check if response is wrapped with pagination metadata\n */\nexport function isWrappedResponse(response: any): response is WrappedResponse {\n return (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n \"pagination\" in response &&\n Array.isArray(response.data)\n );\n}\n\n/**\n * Normalize response to wrapped format for backwards compatibility\n * If the backend returns old format (array), convert it to wrapped format\n */\nexport function normalizeToWrappedResponse(\n response: T[] | WrappedResponse,\n limit: number\n): WrappedResponse {\n if (isWrappedResponse(response)) {\n return response;\n }\n\n // Old format - just an array\n // Since we don't have pagination metadata, assume no more pages\n return {\n data: Array.isArray(response) ? response : [],\n pagination: {\n total: Array.isArray(response) ? response.length : 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n}\n","export function vestsToHp(vests: number, hivePerMVests: number): number {\n return (vests / 1e6) * hivePerMVests;\n}\n","export function isEmptyDate(s: string | undefined): boolean {\n if (s === undefined) {\n return true;\n }\n\n return parseInt(s.split(\"-\")[0], 10) < 1980;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { DynamicProps } from \"../types\";\nimport { parseAsset } from \"../utils\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// This query powers wallet/HP/reward math that should stay close to chain state.\n// Keep a short refresh cadence despite the 5 RPC calls.\nconst DYNAMIC_PROPS_REFRESH_MS = 60 * 1000;\n\nexport function getDynamicPropsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.core.dynamicProps(),\n refetchInterval: DYNAMIC_PROPS_REFRESH_MS,\n staleTime: DYNAMIC_PROPS_REFRESH_MS,\n queryFn: async ({ signal }): Promise => {\n // Get raw blockchain data — all five calls are independent, run in parallel.\n // Hardfork properties is wrapped with catch since not all nodes support it.\n const [rawGlobalDynamic, rawFeedHistory, rawChainProps, rawRewardFund, rawHardforkProps] = await Promise.all([\n callRPC(\"condenser_api.get_dynamic_global_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_feed_history\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_chain_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_reward_fund\", [\"post\"], undefined, undefined, signal),\n callRPC(\"database_api.get_hardfork_properties\", {}, undefined, undefined, signal)\n .catch(() => ({ current_hardfork_version: \"1.28.0\", last_hardfork: 28 })),\n ]) as [any, any, any, any, any];\n\n // Calculate derived values for backward compatibility\n // parseAsset handles both string format (\"200905388484 HIVE\") and NAI format ({ amount, nai, precision })\n const totalVestingSharesAmount = parseAsset(rawGlobalDynamic.total_vesting_shares).amount;\n const totalVestingFundAmount = parseAsset(rawGlobalDynamic.total_vesting_fund_hive).amount;\n\n // Guard against division by zero/NaN/Infinity\n let hivePerMVests = 0;\n if (\n Number.isFinite(totalVestingSharesAmount) &&\n totalVestingSharesAmount !== 0 &&\n Number.isFinite(totalVestingFundAmount)\n ) {\n hivePerMVests = (totalVestingFundAmount / totalVestingSharesAmount) * 1e6;\n }\n const base = parseAsset(rawFeedHistory.current_median_history.base).amount;\n const quote = parseAsset(rawFeedHistory.current_median_history.quote).amount;\n const fundRecentClaims = parseFloat(rawRewardFund.recent_claims);\n const fundRewardBalance = parseAsset(rawRewardFund.reward_balance).amount;\n const votePowerReserveRate = Number(rawGlobalDynamic.vote_power_reserve_rate ?? 0);\n const authorRewardCurve = rawRewardFund.author_reward_curve ?? \"linear\";\n const contentConstant = Number(rawRewardFund.content_constant ?? 0);\n const currentHardforkVersion = String(rawHardforkProps.current_hardfork_version ?? \"0.0.0\");\n const lastHardfork = Number(rawHardforkProps.last_hardfork ?? 0);\n const hbdPrintRate = rawGlobalDynamic.hbd_print_rate;\n const hbdInterestRate = rawGlobalDynamic.hbd_interest_rate;\n const headBlock = rawGlobalDynamic.head_block_number;\n const totalVestingFund = totalVestingFundAmount;\n const totalVestingShares = totalVestingSharesAmount;\n const virtualSupply = parseAsset(rawGlobalDynamic.virtual_supply).amount;\n const vestingRewardPercent = rawGlobalDynamic.vesting_reward_percent || 0;\n const accountCreationFee = rawChainProps.account_creation_fee;\n\n return {\n // Backward compatible transformed fields (camelCase, parsed)\n hivePerMVests,\n base,\n quote,\n fundRecentClaims,\n fundRewardBalance,\n votePowerReserveRate,\n authorRewardCurve,\n contentConstant,\n currentHardforkVersion,\n lastHardfork,\n hbdPrintRate,\n hbdInterestRate,\n headBlock,\n totalVestingFund,\n totalVestingShares,\n virtualSupply,\n vestingRewardPercent,\n accountCreationFee,\n\n // Raw blockchain data (snake_case, unparsed) for direct use\n // Includes ALL fields from the blockchain responses\n raw: {\n globalDynamic: rawGlobalDynamic,\n feedHistory: rawFeedHistory,\n chainProps: rawChainProps,\n rewardFund: rawRewardFund,\n hardforkProps: rawHardforkProps,\n },\n } as DynamicProps;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface RewardFund {\n id: number;\n name: string;\n reward_balance: string;\n recent_claims: string;\n last_update: string;\n content_constant: string;\n percent_curation_rewards: number;\n percent_content_rewards: number;\n author_reward_curve: string;\n curation_reward_curve: string;\n}\n\n/**\n * Get reward fund information from the blockchain\n * @param fundName - Name of the reward fund (default: 'post')\n */\nexport function getRewardFundQueryOptions(fundName = \"post\") {\n return queryOptions({\n queryKey: QueryKeys.core.rewardFund(fundName),\n queryFn: () =>\n callRPC(\"condenser_api.get_reward_fund\", [\n fundName,\n ]) as Promise,\n });\n}\n","/**\n * Centralized query key definitions for all SDK queries.\n *\n * These key builders are the single source of truth for React Query cache keys.\n * Both SDK query options and web app consumers should reference these\n * instead of using inline string arrays.\n *\n * @example\n * ```typescript\n * import { QueryKeys } from \"@ecency/sdk\";\n *\n * // In query options\n * queryKey: QueryKeys.posts.entry(`/@${author}/${permlink}`)\n *\n * // In cache invalidation\n * queryClient.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) })\n * ```\n */\n/** Strip trailing undefined values so the key works as a prefix for partialMatchKey */\nfunction key(...parts: unknown[]): unknown[] {\n let end = parts.length;\n while (end > 0 && parts[end - 1] === undefined) {\n end--;\n }\n return parts.slice(0, end);\n}\n\nexport const QueryKeys = {\n // ===========================================================================\n // Posts\n // ===========================================================================\n posts: {\n entry: (entryPath: string) => [\"posts\", \"entry\", entryPath],\n postHeader: (author: string, permlink?: string) =>\n [\"posts\", \"post-header\", author, permlink],\n content: (author: string, permlink: string) =>\n [\"posts\", \"content\", author, permlink],\n contentReplies: (author: string, permlink: string) =>\n [\"posts\", \"content-replies\", author, permlink],\n accountPosts: (\n username: string,\n filter: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"account-posts\", username, filter, limit, observer],\n accountPostsPage: (\n username: string,\n filter: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n observer: string\n ) =>\n [\n \"posts\",\n \"account-posts-page\",\n username,\n filter,\n startAuthor,\n startPermlink,\n limit,\n observer,\n ],\n userPostVote: (username: string, author: string, permlink: string) =>\n [\"posts\", \"user-vote\", username, author, permlink],\n reblogs: (username: string, limit: number) =>\n [\"posts\", \"reblogs\", username, limit],\n entryActiveVotes: (author?: string, permlink?: string) =>\n [\"posts\", \"entry-active-votes\", author, permlink],\n rebloggedBy: (author: string, permlink: string) =>\n [\"posts\", \"reblogged-by\", author, permlink],\n tips: (author: string, permlink: string) =>\n [\"posts\", \"tips\", author, permlink],\n normalize: (author: string, permlink: string) =>\n [\"posts\", \"normalize\", author, permlink],\n drafts: (activeUsername?: string) =>\n [\"posts\", \"drafts\", activeUsername],\n draftsInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"drafts\", \"infinite\", activeUsername, limit),\n schedules: (activeUsername?: string) =>\n [\"posts\", \"schedules\", activeUsername],\n schedulesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"schedules\", \"infinite\", activeUsername, limit),\n fragments: (username?: string) =>\n [\"posts\", \"fragments\", username],\n fragmentsInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"fragments\", \"infinite\", username, limit),\n images: (username?: string) => [\"posts\", \"images\", username],\n galleryImages: (activeUsername?: string) =>\n [\"posts\", \"gallery-images\", activeUsername],\n imagesInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"images\", \"infinite\", username, limit),\n promoted: (type: string) => [\"posts\", \"promoted\", type],\n _promotedPrefix: [\"posts\", \"promoted\"],\n accountPostsBlogPrefix: (username: string) =>\n [\"posts\", \"account-posts\", username, \"blog\"] as const,\n postsRanked: (\n sort: string,\n tag: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"posts-ranked\", sort, tag, limit, observer],\n postsRankedPage: (\n sort: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n tag: string,\n observer: string\n ) =>\n [\n \"posts\",\n \"posts-ranked-page\",\n sort,\n startAuthor,\n startPermlink,\n limit,\n tag,\n observer,\n ],\n discussions: (\n author: string,\n permlink: string,\n order: string,\n observer: string\n ) => [\"posts\", \"discussions\", author, permlink, order, observer],\n discussion: (author: string, permlink: string, observer: string) =>\n [\"posts\", \"discussion\", author, permlink, observer],\n deletedEntry: (entryPath: string) =>\n [\"posts\", \"deleted-entry\", entryPath],\n commentHistory: (\n author: string,\n permlink: string,\n onlyMeta: boolean\n ) => [\"posts\", \"comment-history\", author, permlink, onlyMeta],\n trendingTags: () => [\"posts\", \"trending-tags\"],\n trendingTagsWithStats: (limit: number) =>\n [\"posts\", \"trending-tags\", \"stats\", limit],\n wavesFeed: (\n params: {\n containers?: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"feed\",\n params.tag ?? \"\",\n params.following ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n shortsFeed: (\n params: {\n containers?: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"shorts\",\n params.tag ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n wavesByHost: (host: string) =>\n [\"posts\", \"waves\", \"by-host\", host],\n wavesByTag: (host: string, tag: string) =>\n [\"posts\", \"waves\", \"by-tag\", host, tag],\n wavesFollowing: (host: string, username: string) =>\n [\"posts\", \"waves\", \"following\", host, username],\n wavesTrendingTags: (host: string, hours: number) =>\n [\"posts\", \"waves\", \"trending-tags\", host, hours],\n wavesByAccount: (host: string, username: string) =>\n [\"posts\", \"waves\", \"by-account\", host, username],\n wavesTrendingAuthors: (host: string) =>\n [\"posts\", \"waves\", \"trending-authors\", host],\n _prefix: [\"posts\"],\n },\n\n // ===========================================================================\n // Accounts\n // ===========================================================================\n accounts: {\n full: (username?: string) => [\"get-account-full\", username],\n list: (...usernames: string[]) =>\n [\"accounts\", \"list\", ...usernames],\n friends: (\n following: string,\n mode: string,\n followType: string,\n limit: number\n ) => [\"accounts\", \"friends\", following, mode, followType, limit],\n searchFriends: (username: string, mode: string, query: string) =>\n [\"accounts\", \"friends\", \"search\", username, mode, query],\n subscriptions: (username: string) =>\n [\"accounts\", \"subscriptions\", username],\n followCount: (username: string) =>\n [\"accounts\", \"follow-count\", username],\n recoveries: (username: string) =>\n [\"accounts\", \"recoveries\", username],\n pendingRecovery: (username: string) =>\n [\"accounts\", \"recoveries\", username, \"pending-request\"],\n checkWalletPending: (username: string, code: string | null) =>\n [\"accounts\", \"check-wallet-pending\", username, code],\n mutedUsers: (username: string) =>\n [\"accounts\", \"muted-users\", username],\n following: (\n follower: string,\n startFollowing: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"following\",\n follower,\n startFollowing,\n followType,\n limit,\n ],\n followers: (\n following: string,\n startFollower: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"followers\",\n following,\n startFollower,\n followType,\n limit,\n ],\n search: (query: string, excludeList?: string[]) =>\n [\"accounts\", \"search\", query, excludeList],\n profiles: (accounts: string[], observer: string) =>\n [\"accounts\", \"profiles\", accounts, observer],\n lookup: (query: string, limit: number) =>\n [\"accounts\", \"lookup\", query, limit],\n transactions: (username: string, group: string, limit: number) =>\n [\"accounts\", \"transactions\", username, group, limit],\n favorites: (activeUsername?: string) =>\n [\"accounts\", \"favorites\", activeUsername],\n favoritesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"favorites\", \"infinite\", activeUsername, limit),\n checkFavorite: (activeUsername: string, targetUsername: string) =>\n [\n \"accounts\",\n \"favorites\",\n \"check\",\n activeUsername,\n targetUsername,\n ],\n relations: (reference: string | undefined, target: string | undefined) =>\n [\"accounts\", \"relations\", reference, target],\n bots: () => [\"accounts\", \"bots\"],\n voteHistory: (username: string, limit: number) =>\n [\"accounts\", \"vote-history\", username, limit],\n reputations: (query: string, limit: number) =>\n [\"accounts\", \"reputations\", query, limit],\n bookmarks: (activeUsername?: string) =>\n [\"accounts\", \"bookmarks\", activeUsername],\n bookmarksInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"bookmarks\", \"infinite\", activeUsername, limit),\n referrals: (username: string) =>\n [\"accounts\", \"referrals\", username],\n referralsStats: (username: string) =>\n [\"accounts\", \"referrals-stats\", username],\n proMembers: () => [\"accounts\", \"pro-members\"],\n _prefix: [\"accounts\"],\n },\n\n // ===========================================================================\n // Notifications\n // ===========================================================================\n notifications: {\n announcements: () => [\"notifications\", \"announcements\"],\n spotlights: () => [\"notifications\", \"spotlights\"],\n list: (activeUsername?: string, filter?: string) =>\n [\"notifications\", activeUsername, filter],\n unreadCount: (activeUsername?: string) =>\n [\"notifications\", \"unread\", activeUsername],\n settings: (activeUsername?: string) =>\n [\"notifications\", \"settings\", activeUsername],\n _prefix: [\"notifications\"],\n },\n\n // ===========================================================================\n // Core\n // ===========================================================================\n core: {\n rewardFund: (fundName: string) =>\n [\"core\", \"reward-fund\", fundName],\n dynamicProps: () => [\"core\", \"dynamic-props\"],\n chainProperties: () => [\"core\", \"chain-properties\"],\n _prefix: [\"core\"],\n },\n\n // ===========================================================================\n // Communities\n // ===========================================================================\n communities: {\n single: (name?: string, observer?: string) =>\n [\"community\", \"single\", name, observer],\n /** Prefix key for matching all observer variants of a community */\n singlePrefix: (name: string) =>\n [\"community\", \"single\", name] as const,\n context: (username: string, communityName: string) =>\n [\"community\", \"context\", username, communityName],\n rewarded: () => [\"communities\", \"rewarded\"],\n list: (sort: string, query: string, limit: number) =>\n [\"communities\", \"list\", sort, query, limit],\n subscribers: (communityName: string) =>\n [\"communities\", \"subscribers\", communityName],\n subscribersInfinite: (communityName: string) =>\n [\"communities\", \"subscribers\", \"infinite\", communityName],\n accountNotifications: (account: string, limit: number) =>\n [\"communities\", \"account-notifications\", account, limit],\n },\n\n // ===========================================================================\n // Proposals\n // ===========================================================================\n proposals: {\n list: () => [\"proposals\", \"list\"],\n proposal: (id: number) => [\"proposals\", \"proposal\", id],\n votes: (proposalId: number, voter: string, limit: number) =>\n [\"proposals\", \"votes\", proposalId, voter, limit],\n votesPrefix: (proposalId: number) =>\n [\"proposals\", \"votes\", proposalId] as const,\n votesByUser: (voter: string) =>\n [\"proposals\", \"votes\", \"by-user\", voter],\n },\n\n // ===========================================================================\n // Search\n // ===========================================================================\n search: {\n topics: (q: string, limit: number) => [\"search\", \"topics\", q, limit],\n path: (q: string) => [\"search\", \"path\", q],\n account: (q: string, limit: number) =>\n [\"search\", \"account\", q, limit],\n results: (\n q: string,\n sort: string,\n hideLow: boolean | string,\n since?: string,\n scrollId?: string,\n votes?: number\n ) => {\n const normalizedHideLow = typeof hideLow === \"string\" ? hideLow === \"1\" || hideLow === \"true\" : hideLow;\n return [\"search\", q, sort, normalizedHideLow, since, scrollId, votes] as const;\n },\n controversialRising: (what: string, tag: string) =>\n [\"search\", \"controversial-rising\", what, tag],\n similarEntries: (author: string, permlink: string, content?: string) =>\n content\n ? [\"search\", \"similar-entries\", author, permlink, content]\n : [\"search\", \"similar-entries\", author, permlink],\n api: (\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n ) => key(\"search\", \"api\", q, sort, hideLow, since, votes, includeNsfw),\n },\n\n // ===========================================================================\n // Witnesses\n // ===========================================================================\n witnesses: {\n list: (limit: number) => [\"witnesses\", \"list\", limit],\n votes: (username: string | undefined) => [\"witnesses\", \"votes\", username],\n proxy: () => [\"witnesses\", \"proxy\"],\n voters: (\n witness: string,\n page: number,\n pageSize: number,\n sort: string,\n direction: string\n ) => [\"witnesses\", \"voters\", witness, page, pageSize, sort, direction],\n voterCount: (witness: string) =>\n [\"witnesses\", \"voter-count\", witness],\n },\n\n // ===========================================================================\n // Wallet\n // ===========================================================================\n wallet: {\n outgoingRcDelegations: (username: string, limit: number) =>\n [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n vestingDelegations: (username: string, limit: number) =>\n [\"wallet\", \"vesting-delegations\", username, limit],\n withdrawRoutes: (account: string) =>\n [\"wallet\", \"withdraw-routes\", account],\n incomingRc: (username: string) =>\n [\"wallet\", \"incoming-rc\", username],\n conversionRequests: (account: string) =>\n [\"wallet\", \"conversion-requests\", account],\n receivedVestingShares: (username: string) =>\n [\"wallet\", \"received-vesting-shares\", username],\n savingsWithdraw: (account: string) =>\n [\"wallet\", \"savings-withdraw\", account],\n openOrders: (user: string) =>\n [\"wallet\", \"open-orders\", user],\n collateralizedConversionRequests: (account: string) =>\n [\"wallet\", \"collateralized-conversion-requests\", account],\n recurrentTransfers: (username: string) =>\n [\"wallet\", \"recurrent-transfers\", username],\n balanceHistory: (username: string, coinType: string, pageSize: number) =>\n [\"wallet\", \"balance-history\", username, coinType, pageSize],\n aggregatedHistory: (\n username: string,\n coinType: string,\n granularity?: \"yearly\" | \"monthly\" | \"daily\"\n ) =>\n granularity === undefined\n ? [\"wallet\", \"aggregated-history\", username, coinType]\n : [\"wallet\", \"aggregated-history\", username, coinType, granularity],\n portfolio: (\n username: string,\n onlyEnabled: string,\n currency: string\n ) =>\n [\"wallet\", \"portfolio\", \"v2\", username, onlyEnabled, currency],\n },\n\n // ===========================================================================\n // Assets\n // ===========================================================================\n assets: {\n hiveGeneralInfo: (username: string) =>\n [\"assets\", \"hive\", \"general-info\", username],\n hiveTransactions: (username: string, limit: number, filterKey: string) =>\n [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n hiveWithdrawalRoutes: (username: string) =>\n [\"assets\", \"hive\", \"withdrawal-routes\", username],\n hiveMetrics: (bucketSeconds: number) =>\n [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n hbdGeneralInfo: (username: string) =>\n [\"assets\", \"hbd\", \"general-info\", username],\n hbdTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) => [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n hivePowerGeneralInfo: (username: string) =>\n [\"assets\", \"hive-power\", \"general-info\", username],\n hivePowerDelegates: (username: string) =>\n [\"assets\", \"hive-power\", \"delegates\", username],\n hivePowerDelegatings: (username: string) =>\n [\"assets\", \"hive-power\", \"delegatings\", username],\n hivePowerTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) =>\n [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n pointsGeneralInfo: (username: string) =>\n [\"assets\", \"points\", \"general-info\", username],\n pointsTransactions: (username: string, type: string) =>\n [\"assets\", \"points\", \"transactions\", username, type],\n ecencyAssetInfo: (username: string, asset: string, currency: string) =>\n [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n },\n\n // ===========================================================================\n // Market\n // ===========================================================================\n market: {\n statistics: () => [\"market\", \"statistics\"],\n orderBook: (limit: number) => [\"market\", \"order-book\", limit],\n history: (seconds: number, startDate: number, endDate: number) =>\n [\"market\", \"history\", seconds, startDate, endDate],\n feedHistory: () => [\"market\", \"feed-history\"],\n hiveHbdStats: () => [\"market\", \"hive-hbd-stats\"],\n data: (\n coin: string,\n vsCurrency: string,\n fromTs: number,\n toTs: number\n ) => [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n tradeHistory: (limit: number, start: number, end: number) =>\n [\"market\", \"trade-history\", limit, start, end],\n currentMedianHistoryPrice: () =>\n [\"market\", \"current-median-history-price\"],\n },\n\n // ===========================================================================\n // Analytics\n // ===========================================================================\n analytics: {\n discoverCuration: (duration: string) =>\n [\"analytics\", \"discover-curation\", duration],\n pageStats: (\n url: string,\n dimensions: string,\n metrics: string,\n dateRange: string\n ) =>\n [\"analytics\", \"page-stats\", url, dimensions, metrics, dateRange],\n discoverLeaderboard: (duration: string) =>\n [\"analytics\", \"discover-leaderboard\", duration],\n },\n\n // ===========================================================================\n // Promotions\n // ===========================================================================\n promotions: {\n promotePrice: () => [\"promotions\", \"promote-price\"],\n boostPlusPrices: () => [\"promotions\", \"boost-plus-prices\"],\n boostPlusAccounts: (account: string) =>\n [\"promotions\", \"boost-plus-accounts\", account],\n },\n\n // ===========================================================================\n // Resource Credits\n // ===========================================================================\n resourceCredits: {\n account: (username: string) =>\n [\"resource-credits\", \"account\", username],\n stats: () => [\"resource-credits\", \"stats\"],\n },\n\n // ===========================================================================\n // Points\n // ===========================================================================\n points: {\n points: (username: string, filter: number) =>\n [\"points\", username, filter],\n _prefix: (username: string) => [\"points\", username],\n },\n\n // ===========================================================================\n // Polls\n // ===========================================================================\n polls: {\n details: (author: string, permlink: string) =>\n [\"polls\", \"details\", author, permlink],\n vote: (author?: string, permlink?: string) =>\n author && permlink\n ? [\"polls\", \"vote\", author, permlink]\n : [\"polls\", \"vote\"],\n _prefix: [\"polls\"],\n },\n\n // ===========================================================================\n // Operations\n // ===========================================================================\n operations: {\n chainProperties: () => [\"operations\", \"chain-properties\"],\n },\n\n // ===========================================================================\n // Games\n // ===========================================================================\n games: {\n statusCheck: (gameType: string, username: string) =>\n [\"games\", \"status-check\", gameType, username],\n },\n\n quests: {\n status: (username: string | undefined) => [\"quests\", \"status\", username],\n },\n\n // ===========================================================================\n // Support Ecency\n // ===========================================================================\n support: {\n settings: (username: string | undefined) => [\"support\", \"settings\", username],\n _prefix: [\"support\"],\n },\n\n // ===========================================================================\n // Bad Actors\n // ===========================================================================\n badActors: {\n list: () => [\"bad-actors\", \"list\"],\n _prefix: [\"bad-actors\"],\n },\n\n // ===========================================================================\n // AI\n // ===========================================================================\n ai: {\n prices: () => [\"ai\", \"prices\"] as const,\n assistPrices: (username?: string) => [\"ai\", \"assist-prices\", username] as const,\n transcribePrice: (username?: string) => [\"ai\", \"transcribe-price\", username] as const,\n _prefix: [\"ai\"],\n },\n} as const;\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiImagePriceResponse } from \"../types\";\n\nexport function getAiGeneratePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.prices(),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-generate-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI generation prices: ${response.status}`);\n }\n\n return (await response.json()) as AiImagePriceResponse;\n },\n staleTime: 300_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiAssistPrice } from \"../types\";\n\nexport function getAiAssistPriceQueryOptions(username: string | undefined, accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.assistPrices(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-assist-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI assist prices: ${response.status}`);\n }\n\n return (await response.json()) as AiAssistPrice[];\n },\n staleTime: 60_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiTranscribePrice } from \"../types\";\n\n/**\n * Dictation pricing. Kept on its own route rather than folded into\n * /private-api/ai-assist-price: that endpoint returns a list of flat-cost actions and\n * shipped clients render every entry as a selectable assist action, so adding a\n * metered one there would surface in older clients as an action they cannot perform.\n *\n * Everything except `free_remaining` is static, so this is cheap to hold and lets the\n * client price a clip locally while the user is still recording.\n */\nexport function getAiTranscribePriceQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.ai.transcribePrice(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI transcribe price: ${response.status}`);\n }\n\n return (await response.json()) as AiTranscribePrice;\n },\n staleTime: 60_000,\n enabled: !!accessToken\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiGenerationResponse } from \"../types\";\n\nexport interface GenerateImageParams {\n prompt: string;\n aspect_ratio?: string;\n power?: number;\n // Pass a stable key to make a retry recover the same paid generation. If omitted a\n // fresh key is generated per call (only dedupes edge/proxy retries, not user retries).\n idempotency_key?: string;\n}\n\n// Generates a key matching the eepoints validator [A-Za-z0-9_-]{8,64}.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useGenerateImage(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"generate-image\"],\n mutationFn: async (params: GenerateImageParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-generate-image\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: accessToken,\n us: username,\n prompt: params.prompt,\n aspect_ratio: params.aspect_ratio ?? \"1:1\",\n power: params.power ?? 1,\n idempotency_key: params.idempotency_key ?? makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][GenerateImage] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n // 202 = the prediction is paid for and captured but not yet delivered to our image\n // host. Detect it by HTTP status BEFORE parsing (the body may be present or empty)\n // and surface it as a typed error so the caller can retry with the SAME\n // idempotency_key to fetch it — no second prediction, no second charge.\n if (response.status === 202) {\n let pendingData: Record = {};\n try {\n pendingData = await response.json();\n } catch {\n // empty / non-JSON 202 body is fine — the status alone drives recovery\n }\n const err = new Error(\"[SDK][AI][GenerateImage] – delivery pending\");\n (err as any).status = 202;\n (err as any).data = pendingData;\n throw err;\n }\n\n const data = (await response.json()) as AiGenerationResponse;\n\n return data;\n },\n onSuccess: () => {\n // Invalidate points cache since balance changed\n if (username) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiAssistResponse } from \"../types\";\n\nexport interface AiAssistParams {\n action: string;\n text: string;\n code?: string;\n}\n\n// Generates a key that matches the eepoints validator [A-Za-z0-9_-]{8,64}.\n// Used to dedupe duplicate POSTs caused by edge/proxy retries — same key on\n// retry returns the cached AI output without re-charging or re-calling Claude.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useAiAssist(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"assist\"],\n mutationFn: async (params: AiAssistParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][Assist] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][Assist] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-assist\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: params.code ?? accessToken,\n us: username,\n action: params.action,\n text: params.text,\n idempotency_key: makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][Assist] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n return (await response.json()) as AiAssistResponse;\n },\n onSuccess: (data) => {\n if (username) {\n // Invalidate points cache if cost was charged\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n // Invalidate assist prices to refresh free_remaining counts\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.assistPrices(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiTranscribeParams, AiTranscribeResponse } from \"../types\";\n\n// Matches the eepoints validator [A-Za-z0-9_-]{8,64}. Dedupes duplicate POSTs caused\n// by edge/proxy retries -- the same key returns the cached transcript without\n// re-charging or re-calling the vendor.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Transcribe an audio clip to text, charged per 30 seconds.\n *\n * Sends multipart/form-data rather than JSON because it carries a file. Unlike the\n * other AI mutations the charge is BURNED rather than moved to the treasury, so the\n * points transaction shows up as PointTransactionType.BURNED (997).\n */\nexport function useAiTranscribe(username: string | undefined, accessToken: string | undefined) {\n return useMutation({\n mutationKey: [\"ai\", \"transcribe\"],\n mutationFn: async (params: AiTranscribeParams): Promise => {\n if (!username) {\n throw new Error(\"[SDK][AI][Transcribe] – username wasn't provided\");\n }\n\n // Validate the token actually being sent, not just the bound one. A caller\n // that resolves a fresh token per call (because the bound one can expire\n // during a long recording) legitimately has nothing at hook construction.\n const code = params.code ?? accessToken;\n if (!code) {\n throw new Error(\"[SDK][AI][Transcribe] – access token wasn't found\");\n }\n\n const form = new FormData();\n form.append(\"code\", code);\n // `us` is resolved from the code server-side and is deliberately not sent:\n // upstream burns from whoever it names.\n form.append(\"duration_ms\", String(Math.round(params.durationMs)));\n // Caller-supplied key when there is one. Generating a fresh key per attempt\n // would defeat the dedupe in the one case it exists for: a POST that reached\n // the server whose response was lost. Retrying then would transcribe and\n // charge a second time. Same contract as useGenerateImage.\n form.append(\"idempotency_key\", params.idempotency_key ?? makeIdempotencyKey());\n form.append(\"audio\", params.audio, params.fileName ?? \"clip.webm\");\n\n const fetchApi = getBoundFetch();\n // No Content-Type header: fetch sets it, including the multipart boundary.\n // Setting it by hand drops the boundary and the body becomes unparseable.\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe\", {\n method: \"POST\",\n body: form\n });\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n // Object.assign rather than `as any` casts: callers need `status` to tell a\n // 402 (out of Points) from a 429 (rate limited) from a 400 (clip too long),\n // and this keeps that shape typed.\n throw Object.assign(\n new Error(\n `[SDK][AI][Transcribe] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n ),\n { status: response.status, data: parsed }\n );\n }\n\n return (await response.json()) as AiTranscribeResponse;\n },\n onSuccess: (data) => {\n if (username) {\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username)\n });\n }\n // Refresh free_remaining, which only Pro members ever have above zero.\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.transcribePrice(username)\n });\n }\n }\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport {\n AccountFollowStats,\n FullAccount,\n} from \"../types\";\nimport { parseProfileMetadata } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** The raw `condenser_api.get_accounts` row — every FullAccount field except the three\n * this query derives separately (follow_stats + reputation from bridge, profile parsed). */\ntype RawAccount = Omit;\n\n/** Minimal shape read from `bridge.get_profile` (hivemind social profile): it carries\n * the reputation score, the follower/following counts and hivemind's parsed\n * (normalized) profile — the latter is used only to cross-validate the chain row. */\ninterface BridgeProfile {\n reputation?: number;\n stats?: { followers?: number; following?: number };\n metadata?: { profile?: Record };\n}\n\n/** True when the chain row carries no account metadata at all. Legitimate for\n * accounts that never set a profile — but combined with a populated hivemind\n * profile it identifies a node serving stripped account rows. */\nfunction isMetadataStripped(account: RawAccount): boolean {\n return !account.posting_json_metadata && !account.json_metadata;\n}\n\n/** True when a hivemind `metadata.profile` object carries at least one real\n * value. Hivemind emits its fixed profile keys with empty strings for\n * accounts without a profile, so key presence alone proves nothing. */\nfunction hasProfileValues(profile?: Record | null): boolean {\n if (!profile) return false;\n return Object.values(profile).some((value) =>\n typeof value === \"string\" ? value.length > 0 : value != null\n );\n}\n\nexport function getAccountFullQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.full(username),\n queryFn: async ({ signal }) => {\n if (!username) {\n return null;\n }\n\n // Fetch the chain account (balances/keys/vesting) and the hivemind profile in\n // parallel — both only need the username. bridge.get_profile carries BOTH the\n // follower/following counts and the reputation score, so it replaces the old\n // second-layer condenser_api.get_follow_count RPC *and* the reputation-api REST\n // call: condenser_api.get_accounts no longer returns a usable reputation (it is 0\n // since the hardfork), and there is no reason to make two extra round-trips for\n // data one profile object already carries.\n const [response, bridgeProfile] = await Promise.all([\n callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so fail over to the next node instead of misreading it as\n // \"account does not exist\".\n (rows) => Array.isArray(rows)\n ),\n callRPC(\n \"bridge.get_profile\",\n { account: username },\n undefined,\n undefined,\n signal\n ).catch((e): BridgeProfile | null => {\n // A caller cancel (aborted signal) must propagate — only genuine RPC/transport\n // failures degrade to reputation 0 / no follow_stats.\n if (signal?.aborted) throw e;\n return null;\n })\n ]);\n if (!response?.[0]) {\n // The account does not exist (e.g. not yet finalized on-chain during\n // signup). Treat absence as a recoverable null instead of throwing, so\n // consumers (useQuery hooks and fetchQuery callers) surface it as empty\n // data rather than an unhandled rejection / error-boundary crash.\n return null;\n }\n\n let chainAccount = response[0];\n\n // Cross-validate the chain row against the hivemind profile fetched in\n // the same query. Some public nodes serve account rows with BOTH\n // metadata fields stripped to \"\" (observed in the wild) while their own\n // hivemind still returns the real profile — and a merge base built from\n // such a row wipes the user's profile on the next partial\n // account_update2. When the row claims \"no metadata\" but hivemind\n // disagrees, re-read once (failover may pick another node) and otherwise\n // fail the query: an error here is recoverable, a poisoned cache entry\n // is not.\n if (\n isMetadataStripped(chainAccount) &&\n hasProfileValues(bridgeProfile?.metadata?.profile)\n ) {\n // The re-read carries a payload validator: a stripped row is treated\n // as a node fault, so the failover walk moves on to other nodes (and\n // repeat offenders earn a per-API health cooldown) instead of asking\n // the same lying node twice.\n const reread = await callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n (rows) =>\n Array.isArray(rows) &&\n (!rows[0] || !isMetadataStripped(rows[0] as RawAccount))\n );\n if (reread[0] && !isMetadataStripped(reread[0])) {\n chainAccount = reread[0];\n } else {\n throw new Error(\n `[SDK][Accounts] – inconsistent account row for ${username}: empty json metadata while hivemind profile is populated`\n );\n }\n }\n\n const profile = parseProfileMetadata(chainAccount.posting_json_metadata);\n\n // bridge.get_profile.stats → follower/following counts; `reputation` is the\n // computed score (e.g. 78.29). accountReputation() floors an in-range score, so\n // it yields the same value the reputation-api used to return. Both degrade to a\n // safe default if the profile call failed.\n const stats = bridgeProfile?.stats;\n const follow_stats: AccountFollowStats | undefined = stats\n ? {\n account: chainAccount.name,\n follower_count: stats.followers ?? 0,\n following_count: stats.following ?? 0\n }\n : undefined;\n const reputationValue: number = bridgeProfile?.reputation ?? 0;\n\n return {\n name: chainAccount.name,\n owner: chainAccount.owner,\n active: chainAccount.active,\n posting: chainAccount.posting,\n memo_key: chainAccount.memo_key,\n post_count: chainAccount.post_count,\n created: chainAccount.created,\n posting_json_metadata: chainAccount.posting_json_metadata,\n last_vote_time: chainAccount.last_vote_time,\n last_post: chainAccount.last_post,\n json_metadata: chainAccount.json_metadata,\n reward_hive_balance: chainAccount.reward_hive_balance,\n reward_hbd_balance: chainAccount.reward_hbd_balance,\n reward_vesting_hive: chainAccount.reward_vesting_hive,\n reward_vesting_balance: chainAccount.reward_vesting_balance,\n balance: chainAccount.balance,\n hbd_balance: chainAccount.hbd_balance,\n savings_balance: chainAccount.savings_balance,\n savings_hbd_balance: chainAccount.savings_hbd_balance,\n savings_hbd_last_interest_payment:\n chainAccount.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update:\n chainAccount.savings_hbd_seconds_last_update,\n savings_hbd_seconds: chainAccount.savings_hbd_seconds,\n next_vesting_withdrawal: chainAccount.next_vesting_withdrawal,\n pending_claimed_accounts: chainAccount.pending_claimed_accounts,\n vesting_shares: chainAccount.vesting_shares,\n delegated_vesting_shares: chainAccount.delegated_vesting_shares,\n received_vesting_shares: chainAccount.received_vesting_shares,\n vesting_withdraw_rate: chainAccount.vesting_withdraw_rate,\n to_withdraw: chainAccount.to_withdraw,\n withdrawn: chainAccount.withdrawn,\n witness_votes: chainAccount.witness_votes,\n proxy: chainAccount.proxy,\n recovery_account: chainAccount.recovery_account,\n proxied_vsf_votes: chainAccount.proxied_vsf_votes,\n voting_manabar: chainAccount.voting_manabar,\n voting_power: chainAccount.voting_power,\n downvote_manabar: chainAccount.downvote_manabar,\n follow_stats,\n reputation: reputationValue,\n profile,\n } satisfies FullAccount;\n },\n enabled: !!username,\n staleTime: 60000,\n });\n}\n","import { AccountProfile, FullAccount } from \"../types\";\n\nexport type ProfileTokens = AccountProfile[\"tokens\"];\n\nconst DENIED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nfunction deepMerge>(target: T, source: Record): T {\n const result = { ...target } as Record;\n for (const key of Object.keys(source)) {\n if (DENIED_KEYS.has(key)) {\n continue;\n }\n const srcVal = source[key];\n const tgtVal = result[key];\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\n result[key] = deepMerge(tgtVal, srcVal);\n } else {\n result[key] = srcVal;\n }\n }\n return result as T;\n}\n\nexport interface BuildProfileMetadataArgs {\n existingProfile?: AccountProfile;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}\n\nfunction sanitizeTokens(\n tokens?: ProfileTokens | null\n): ProfileTokens | undefined {\n // Guard against corrupted data from blockchain where tokens is not an array\n if (!tokens || !Array.isArray(tokens)) {\n return undefined;\n }\n\n return tokens.map(({ meta, ...rest }) => {\n if (!meta || typeof meta !== \"object\") {\n return { ...rest, meta };\n }\n\n const { privateKey, username, ...safeMeta } = meta;\n return { ...rest, meta: safeMeta };\n });\n}\n\nexport function parseProfileMetadata(\n postingJsonMetadata?: string | null\n): AccountProfile {\n if (!postingJsonMetadata) {\n return {} as AccountProfile;\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n parsed.profile &&\n typeof parsed.profile === \"object\"\n ) {\n return parsed.profile as AccountProfile;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata:\", err, { length: postingJsonMetadata?.length ?? 0 });\n }\n\n return {} as AccountProfile;\n}\n\nexport function extractAccountProfile(\n data?: Pick | null\n): AccountProfile {\n return parseProfileMetadata(data?.posting_json_metadata);\n}\n\n/**\n * Choose between two account snapshots for a posting-metadata merge base.\n * Prefers `preferred` (typically the freshest cache entry) unless `fallback`\n * carries strictly more profile keys — guarding read-modify-write flows\n * against a snapshot whose metadata was served stripped by a misbehaving node\n * while another snapshot still holds the real profile. A partial update must\n * never shrink the profile while any snapshot still knows the full one.\n */\nexport function pickRicherMetadataSnapshot<\n T extends Pick\n>(\n preferred: T | null | undefined,\n fallback: T | null | undefined\n): T | null | undefined {\n if (!preferred) return fallback;\n if (!fallback) return preferred;\n const preferredKeys = Object.keys(\n parseProfileMetadata(preferred.posting_json_metadata)\n ).length;\n const fallbackKeys = Object.keys(\n parseProfileMetadata(fallback.posting_json_metadata)\n ).length;\n return fallbackKeys > preferredKeys ? fallback : preferred;\n}\n\n/**\n * Parse the FULL root object of posting_json_metadata, not just its `profile`\n * key. Returns {} for missing/invalid input or a non-object root.\n *\n * `parseProfileMetadata` intentionally returns only `parsed.profile`; this\n * helper exists so writers can carry forward any sibling top-level keys that\n * live alongside `profile` (data other Hive apps may store there) instead of\n * dropping them on the next update.\n */\nexport function parsePostingMetadataRoot(\n postingJsonMetadata?: string | null\n): Record {\n if (!postingJsonMetadata) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata root:\", err, {\n length: postingJsonMetadata?.length ?? 0,\n });\n }\n\n return {};\n}\n\n/**\n * Build the serialized `posting_json_metadata` string for an account_update2\n * operation. It deep-merges the profile (via {@link buildProfileMetadata}) over\n * the account's CURRENT on-chain profile AND preserves any non-`profile`\n * top-level keys present in the existing metadata, so a partial profile update\n * (e.g. only `pinned` or only `tokens`) never clobbers unrelated fields.\n */\nexport function buildPostingJsonMetadata({\n existingPostingJsonMetadata,\n profile,\n tokens,\n}: {\n existingPostingJsonMetadata?: string | null;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}): string {\n const root = parsePostingMetadataRoot(existingPostingJsonMetadata);\n const existingProfile = isPlainObject(root.profile)\n ? (root.profile as AccountProfile)\n : ({} as AccountProfile);\n\n const mergedProfile = buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n });\n\n return JSON.stringify({ ...root, profile: mergedProfile });\n}\n\nexport function buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n}: BuildProfileMetadataArgs): AccountProfile {\n const { tokens: profileTokens, version: _ignoredVersion, ...profileRest } =\n profile ?? {};\n\n const metadata = deepMerge(\n (existingProfile ?? {}) as Record,\n profileRest as Record,\n ) as AccountProfile;\n\n // Clean up corrupted tokens data from blockchain before processing\n if (metadata.tokens && !Array.isArray(metadata.tokens)) {\n metadata.tokens = undefined;\n }\n\n // tokens semantics:\n // undefined → no change, fall back to profileTokens from profile partial\n // null or [] → explicitly clear tokens\n // non-empty array → set tokens\n if (tokens !== undefined) {\n // Explicit intent from caller: null or [] clears, non-empty array sets\n metadata.tokens = tokens && tokens.length > 0 ? tokens : [];\n } else if (profileTokens !== undefined) {\n // Fall back to tokens from profile partial (including empty array to clear)\n metadata.tokens = profileTokens;\n }\n\n metadata.tokens = sanitizeTokens(metadata.tokens);\n metadata.version = 2;\n\n return metadata;\n}\n","import { FullAccount, AccountProfile } from \"../types\";\nimport { parseProfileMetadata } from \"./profile-metadata\";\n\n/**\n * Parses raw account data from Hive API into FullAccount type\n * Handles profile metadata extraction from posting_json_metadata or json_metadata\n */\nexport function parseAccounts(rawAccounts: any[]): FullAccount[] {\n return rawAccounts.map((x) => {\n const account: FullAccount = {\n name: x.name,\n owner: x.owner,\n active: x.active,\n posting: x.posting,\n memo_key: x.memo_key,\n post_count: x.post_count,\n created: x.created,\n reputation: x.reputation,\n posting_json_metadata: x.posting_json_metadata,\n last_vote_time: x.last_vote_time,\n last_post: x.last_post,\n json_metadata: x.json_metadata,\n reward_hive_balance: x.reward_hive_balance,\n reward_hbd_balance: x.reward_hbd_balance,\n reward_vesting_hive: x.reward_vesting_hive,\n reward_vesting_balance: x.reward_vesting_balance,\n balance: x.balance,\n hbd_balance: x.hbd_balance,\n savings_balance: x.savings_balance,\n savings_hbd_balance: x.savings_hbd_balance,\n savings_hbd_last_interest_payment: x.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update: x.savings_hbd_seconds_last_update,\n savings_hbd_seconds: x.savings_hbd_seconds,\n next_vesting_withdrawal: x.next_vesting_withdrawal,\n pending_claimed_accounts: x.pending_claimed_accounts,\n vesting_shares: x.vesting_shares,\n delegated_vesting_shares: x.delegated_vesting_shares,\n received_vesting_shares: x.received_vesting_shares,\n vesting_withdraw_rate: x.vesting_withdraw_rate,\n to_withdraw: x.to_withdraw,\n withdrawn: x.withdrawn,\n witness_votes: x.witness_votes,\n proxy: x.proxy,\n recovery_account: x.recovery_account,\n proxied_vsf_votes: x.proxied_vsf_votes,\n voting_manabar: x.voting_manabar,\n voting_power: x.voting_power,\n downvote_manabar: x.downvote_manabar,\n };\n\n // Try to parse profile from posting_json_metadata first\n let profile: AccountProfile | undefined = parseProfileMetadata(\n x.posting_json_metadata\n );\n\n // Fallback to json_metadata if posting_json_metadata didn't have a profile\n if (!profile || Object.keys(profile).length === 0) {\n try {\n const jsonMetadata = JSON.parse(x.json_metadata || \"{}\");\n if (jsonMetadata.profile) {\n profile = jsonMetadata.profile;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n // Ensure we always have a profile object\n if (!profile || Object.keys(profile).length === 0) {\n profile = {\n about: \"\",\n cover_image: \"\",\n location: \"\",\n name: \"\",\n profile_image: \"\",\n website: \"\",\n };\n }\n\n return { ...account, profile };\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { parseAccounts } from \"../utils/parse-accounts\";\nimport { FullAccount } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountsQueryOptions(usernames: string[]) {\n return queryOptions({\n queryKey: QueryKeys.accounts.list(...usernames),\n enabled: usernames.length > 0,\n queryFn: async (): Promise => {\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so the validator makes callRPC fail over to the next node\n // instead of resolving with a payload parseAccounts cannot map over.\n const response = (await callRPC(\n \"condenser_api.get_accounts\",\n [usernames],\n undefined,\n undefined,\n undefined,\n (rows) => Array.isArray(rows)\n )) as any[];\n return parseAccounts(response ?? []);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountFollowStats } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get follow count (followers and following) for an account\n */\nexport function getFollowCountQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followCount(username),\n queryFn: () =>\n callRPC(\"condenser_api.get_follow_count\", [\n username,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts following a user\n *\n * @param following - The account being followed\n * @param startFollower - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowersQueryOptions(\n following: string | undefined,\n startFollower: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followers(following!, startFollower, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_followers\", [\n following,\n startFollower,\n followType,\n limit,\n ]) as Promise,\n enabled: !!following,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts that a user is following\n *\n * @param follower - The account doing the following\n * @param startFollowing - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowingQueryOptions(\n follower: string,\n startFollowing: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.following(follower, startFollowing, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_following\", [\n follower,\n startFollowing,\n followType,\n limit,\n ]) as Promise,\n enabled: !!follower,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** `condenser_api.get_following` caps a single response at 1000 rows. */\nconst MUTED_USERS_PAGE_SIZE = 1000;\n\n/**\n * Safety valve for the paging loop: 20 pages is 20k muted accounts, far past\n * any real mute list. Bounds the work if a node ever stops advancing the\n * cursor, so a malformed response degrades to a truncated list rather than an\n * endless request loop.\n */\nconst MUTED_USERS_MAX_PAGES = 20;\n\n/**\n * Get the full list of accounts a user has muted.\n *\n * Pages until the list is exhausted instead of taking the first N. That is\n * load-bearing: this result dims muted authors in feeds and collapses their\n * comments (`entry-list-item-muted-content`, `discussion-list`), so a truncated\n * list silently renders muted accounts as though they were never muted.\n *\n * Takes no limit, on purpose. `QueryKeys.accounts.mutedUsers` keys on the\n * username alone, so a limit parameter meant callers requesting different\n * amounts shared one cache entry and whichever mounted first decided how much\n * of the list every other caller saw.\n *\n * @param username - The account whose mute list to fetch\n */\nexport function getMutedUsersQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.mutedUsers(username!),\n queryFn: async () => {\n const muted: string[] = [];\n let start = \"\";\n\n for (let page = 0; page < MUTED_USERS_MAX_PAGES; page++) {\n const response = (await callRPC(\"condenser_api.get_following\", [\n username,\n start,\n \"ignore\",\n MUTED_USERS_PAGE_SIZE,\n ])) as Follow[];\n\n if (!response?.length) {\n break;\n }\n\n let names = response.map((user) => user.following);\n\n // `start` is exclusive on Hive, so a page should not repeat the cursor.\n // Drop it defensively anyway: against a node treating `start` as\n // inclusive, this loop would otherwise re-append the same account until\n // it hit the page cap.\n if (names[0] === start) {\n names = names.slice(1);\n }\n\n if (!names.length) {\n break;\n }\n\n muted.push(...names);\n\n if (response.length < MUTED_USERS_PAGE_SIZE) {\n break;\n }\n\n start = names[names.length - 1];\n }\n\n return muted;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Lookup accounts by username prefix\n *\n * @param query - Username prefix to search for\n * @param limit - Maximum number of results (default: 50)\n */\nexport function lookupAccountsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.lookup(query, limit),\n queryFn: () =>\n callRPC(\"condenser_api.lookup_accounts\", [\n query,\n limit,\n ]) as Promise,\n enabled: !!query,\n staleTime: Infinity,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountsByUsernameQueryOptions(\n query: string,\n limit = 5,\n excludeList: string[] = []\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.search(query, excludeList),\n enabled: !!query,\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.lookup_accounts\", [query, limit])) as string[];\n return response.filter((item) =>\n excludeList.length > 0 ? !excludeList.includes(item) : true\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountProfile } from \"../types\";\n\ntype AccountProfileToken = NonNullable[number];\n\nexport type WalletMetadataCandidate = Partial & {\n currency?: string;\n show?: boolean;\n address?: string;\n publicKey?: string;\n privateKey?: string;\n username?: string;\n};\n\nexport interface CheckUsernameWalletsPendingResponse {\n exist: boolean;\n tokens?: WalletMetadataCandidate[];\n wallets?: WalletMetadataCandidate[];\n}\n\nconst RESERVED_META_KEYS = new Set([\n \"ownerPublicKey\",\n \"activePublicKey\",\n \"postingPublicKey\",\n \"memoPublicKey\",\n]);\n\ninterface WalletsEndpointResponseItem {\n token?: unknown;\n address?: unknown;\n status?: unknown;\n meta?: unknown;\n username?: unknown;\n}\n\nexport function checkUsernameWalletsPendingQueryOptions(\n username: string,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkWalletPending(username, code ?? null),\n queryFn: async () => {\n if (!username || !code) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/wallets\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code,\n }),\n }\n );\n\n if (!response.ok) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const payload = (await response.json()) as unknown;\n\n const wallets: WalletMetadataCandidate[] = Array.isArray(payload)\n ? payload.flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const walletItem = item as WalletsEndpointResponseItem;\n\n const symbol =\n typeof walletItem.token === \"string\"\n ? walletItem.token\n : undefined;\n\n if (!symbol) {\n return [];\n }\n\n const meta: Record =\n walletItem.meta && typeof walletItem.meta === \"object\"\n ? { ...(walletItem.meta as Record) }\n : {};\n\n const sanitizedMeta: Record = {};\n\n const address =\n typeof walletItem.address === \"string\" && walletItem.address\n ? walletItem.address\n : undefined;\n\n const statusShow =\n typeof walletItem.status === \"number\"\n ? walletItem.status === 3\n : undefined;\n\n const showFlag = statusShow ?? false;\n\n if (address) {\n sanitizedMeta.address = address;\n }\n\n sanitizedMeta.show = showFlag;\n\n const baseCandidate = {\n symbol,\n currency: symbol,\n address,\n show: showFlag,\n type: \"CHAIN\",\n meta: sanitizedMeta,\n } satisfies WalletMetadataCandidate;\n\n const metaTokenCandidates: WalletMetadataCandidate[] = [];\n\n for (const [metaSymbol, metaValue] of Object.entries(meta)) {\n if (typeof metaSymbol !== \"string\") {\n continue;\n }\n\n if (RESERVED_META_KEYS.has(metaSymbol)) {\n continue;\n }\n\n if (typeof metaValue !== \"string\" || !metaValue) {\n continue;\n }\n\n if (!/^[A-Z0-9]{2,10}$/.test(metaSymbol)) {\n continue;\n }\n\n metaTokenCandidates.push({\n symbol: metaSymbol,\n currency: metaSymbol,\n address: metaValue,\n show: showFlag,\n type: \"CHAIN\",\n meta: { address: metaValue, show: showFlag },\n });\n }\n\n return [baseCandidate, ...metaTokenCandidates];\n })\n : [];\n\n return {\n exist: wallets.length > 0,\n tokens: wallets.length ? wallets : undefined,\n wallets: wallets.length ? wallets : undefined,\n } satisfies CheckUsernameWalletsPendingResponse;\n },\n refetchOnMount: true,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountRelationship } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRelationshipBetweenAccountsQueryOptions(\n reference: string | undefined,\n target: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.relations(reference, target),\n enabled: !!reference && !!target,\n refetchOnMount: false,\n refetchInterval: 3_600_000,\n queryFn: async () => {\n const fallback: AccountRelationship = {\n follows: false,\n ignores: false,\n blacklists: false,\n follows_muted: false,\n follows_blacklists: false,\n };\n\n // `enabled` only gates the automatic useQuery run. fetchQuery and\n // prefetchQuery invoke queryFn regardless, so guard here as well rather\n // than sending a missing account name to the RPC and caching the result.\n if (!reference || !target) {\n return fallback;\n }\n\n const result = await callRPC(\"bridge.get_relationship_between_accounts\", [reference, target]);\n return (result ?? fallback) as AccountRelationship;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype Subscriptions = string[];\n\nexport function getAccountSubscriptionsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.subscriptions(username!),\n enabled: !!username,\n queryFn: async ({ signal }) => {\n const response = await callRPC(\"bridge.list_all_subscriptions\", {\n account: username,\n }, undefined, undefined, signal);\n return (response ?? []) as Subscriptions;\n },\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountBookmark } from \"../types\";\n\nexport function getBookmarksQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.bookmarks(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Bookmarks] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountBookmark[];\n },\n });\n}\n\nexport function getBookmarksInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.bookmarksInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bookmarks: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../types\";\n\nexport function getFavoritesQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.favorites(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountFavorite[];\n },\n });\n}\n\nexport function getFavoritesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.favoritesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/favorites?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch favorites: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n/**\n * Query options to check if a specific account is in the active user's favorites\n * @param activeUsername - The logged-in user's username\n * @param code - Access token for authentication\n * @param targetUsername - The username to check if favorited\n * @returns Query options for checking if target is favorited\n */\nexport function checkFavoriteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n targetUsername: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkFavorite(activeUsername!, targetUsername!),\n enabled: !!activeUsername && !!code && !!targetUsername,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n if (!targetUsername) {\n throw new Error(\"[SDK][Accounts][Favorites] – no target username\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-check\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n account: targetUsername,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n const result = await response.json();\n if (typeof result !== \"boolean\") {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check returned invalid type: expected boolean, got ${typeof result}`\n );\n }\n\n return result;\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetRecoveriesEmailResponse } from \"../types\";\n\nexport function getAccountRecoveriesQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n enabled: !!username && !!code,\n queryKey: QueryKeys.accounts.recoveries(username!),\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Accounts] Missing username or access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/recoveries\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n return response.json() as Promise;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountPendingRecoveryQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n enabled: !!username,\n queryKey: QueryKeys.accounts.pendingRecovery(username!),\n queryFn: () =>\n callRPC(\"database_api.find_change_recovery_account_requests\", { accounts: [username] }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountReputation } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountReputationsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.reputations(query, limit),\n enabled: !!query,\n queryFn: async (): Promise => {\n if (!query) {\n return [];\n }\n\n return callRPC(\"condenser_api.get_account_reputations\", [query, limit]) as Promise;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { utils } from \"../../../hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Transaction, OperationGroup } from \"../types/transaction\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { parseAsset, NaiMap } from \"@/modules/core/utils\";\n\nconst ops = utils.operations;\n\nexport const ACCOUNT_OPERATION_GROUPS: Record = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n};\n\nexport const ALL_ACCOUNT_OPERATIONS = [...Object.values(ACCOUNT_OPERATION_GROUPS)].reduce(\n (acc, val) => acc.concat(val),\n []\n);\n\ninterface TxPageRaw {\n entries: Transaction[];\n currentPage: number;\n}\n\n/**\n * Cursor for transaction pagination.\n * null = first request (returns newest page, API omits page param).\n * number = specific page to fetch (decrementing for older data).\n */\ntype TxCursor = number | null;\n\ninterface HafahOperation {\n op: {\n type: string;\n value: Record;\n };\n block: number;\n trx_id: string;\n op_pos: number;\n op_type_id: number;\n timestamp: string;\n virtual_op: boolean;\n operation_id: string;\n trx_in_block: number;\n}\n\ninterface HafahResponse {\n total_operations: number;\n total_pages: number;\n operations_result: HafahOperation[];\n}\n\n/**\n * Derive a safe, unique, and chronologically ordered `num` from REST fields.\n *\n * Layout: block * 10_000_000 + trx_in_block * 100 + op_pos\n * - trx_in_block: up to 99_999 (Hive max block size ~65K txs)\n * - op_pos: up to 99 (operations within a single transaction)\n * - Max value: 105_000_000 * 10_000_000 = 1.05e15, within MAX_SAFE_INTEGER (9.007e15)\n */\nfunction deriveNum(entry: HafahOperation): number {\n return entry.block * 10_000_000 + entry.trx_in_block * 100 + entry.op_pos;\n}\n\n/**\n * Strip the `_operation` suffix from the REST API type name\n * to match the Transaction type discriminants (e.g. \"transfer\").\n */\nfunction normalizeOpType(restType: string): string {\n return restType.replace(/_operation$/, \"\");\n}\n\n/**\n * Check if a value is a NAI asset object (e.g. { nai: \"@@000000021\", amount: \"1000\", precision: 3 }).\n */\nfunction isNaiAsset(v: unknown): v is { nai: string; amount: string; precision: number } {\n return typeof v === \"object\" && v !== null && \"nai\" in v && \"amount\" in v && \"precision\" in v;\n}\n\n/**\n * Convert a NAI asset object to a human-readable string like \"1.000 HIVE\".\n * Returns the value unchanged if it's not a NAI object.\n */\nfunction naiToString(v: unknown): unknown {\n if (!isNaiAsset(v)) return v;\n const parsed = parseAsset(v);\n const symbol = NaiMap[v.nai as keyof typeof NaiMap] ?? \"UNKNOWN\";\n return `${parsed.amount.toFixed(v.precision)} ${symbol}`;\n}\n\n/**\n * Convert all NAI asset objects in an operation's value to human-readable strings\n * so downstream renderers that expect \"1.000 HIVE\" don't crash with object values.\n */\nfunction normalizeOpValue(value: Record): Record {\n const result: Record = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = naiToString(v);\n }\n return result;\n}\n\n/**\n * Get account transaction history with pagination and filtering.\n * Uses the hafah-api REST endpoint for server-side op-type filtering\n * and real pagination metadata.\n *\n * @param username - Account name to get transactions for\n * @param limit - Number of transactions per page\n * @param group - Filter by operation group (transfers, market-orders, etc.)\n */\nexport function getTransactionsInfiniteQueryOptions(\n username?: string,\n limit = 20,\n group: OperationGroup | \"\" = \"\"\n) {\n const operationTypes = group\n ? ACCOUNT_OPERATION_GROUPS[group]\n : ALL_ACCOUNT_OPERATIONS;\n\n return infiniteQueryOptions<\n TxPageRaw,\n Error,\n InfiniteData,\n (string | number)[],\n TxCursor\n >({\n queryKey: QueryKeys.accounts.transactions(username ?? \"\", group, limit),\n initialPageParam: null as TxCursor,\n\n queryFn: async ({ pageParam, signal }: { pageParam: TxCursor; signal?: AbortSignal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"operation-types\": operationTypes.join(\",\"),\n \"page-size\": limit,\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number (decrementing)\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"hafah\",\n \"/accounts/{account-name}/operations\",\n params,\n undefined,\n undefined,\n signal\n )) as HafahResponse;\n\n const entries = response.operations_result.map((entry) => {\n const type = normalizeOpType(entry.op.type);\n const value = normalizeOpValue(entry.op.value);\n return {\n ...value,\n num: deriveNum(entry),\n type,\n timestamp: entry.timestamp,\n trx_id: entry.trx_id,\n } as Transaction;\n });\n\n return {\n entries,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getBotsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.bots(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/public/bots\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bots: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n refetchOnMount: true,\n staleTime: Infinity,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { ReferralItem } from \"../types/referral\";\n\ntype PageParam = { maxId?: number };\n\nexport function getReferralsInfiniteQueryOptions(username: string) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.referrals(username),\n initialPageParam: { maxId: undefined } as PageParam,\n queryFn: async ({ pageParam }: { pageParam: PageParam }) => {\n const { maxId } = pageParam ?? {};\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(`/private-api/referrals/${username}`, baseUrl);\n\n if (maxId !== undefined) {\n url.searchParams.set(\"max_id\", maxId.toString());\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referrals: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n getNextPageParam: (lastPage: ReferralItem[]) => {\n const nextMaxId = lastPage?.[lastPage.length - 1]?.id;\n return typeof nextMaxId === \"number\" ? ({ maxId: nextMaxId } as PageParam) : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ReferralStat } from \"../types/referral\";\n\ninterface ReferralStatsResponse {\n total?: number;\n rewarded?: number;\n}\n\nexport function getReferralsStatsQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.referralsStats(username),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/referrals/${username}/stats`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referral stats: ${response.status}`);\n }\n\n const data = await response.json() as ReferralStatsResponse;\n\n if (!data) {\n throw new Error(\"No Referrals for this user!\");\n }\n\n return {\n total: data.total ?? 0,\n rewarded: data.rewarded ?? 0,\n } as ReferralStat;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendsRow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FriendsPageParam {\n startFollowing: string;\n}\n\ntype FriendsPage = FriendsRow[];\n\n/**\n * Get list of friends (following/followers) with profile information\n *\n * @param following - The account whose friends to get\n * @param mode - \"following\" or \"followers\"\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Number of results per page (default: 100)\n * @param enabled - Whether query is enabled (default: true)\n */\nexport function getFriendsInfiniteQueryOptions(\n following: string,\n mode: \"following\" | \"followers\",\n options?: {\n followType?: string;\n limit?: number;\n enabled?: boolean;\n }\n) {\n const { followType = \"blog\", limit = 100, enabled = true } = options ?? {};\n\n return infiniteQueryOptions<\n FriendsPage,\n Error,\n InfiniteData,\n (string | number)[],\n FriendsPageParam\n >({\n queryKey: QueryKeys.accounts.friends(following, mode, followType, limit),\n initialPageParam: { startFollowing: \"\" } as FriendsPageParam,\n enabled,\n refetchOnMount: true,\n\n queryFn: async ({ pageParam }: { pageParam: FriendsPageParam }) => {\n const { startFollowing } = pageParam;\n\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [following, startFollowing === \"\" ? null : startFollowing, followType, limit])) as Follow[];\n\n const accountNames = response.map((e) =>\n mode === \"following\" ? e.following : e.follower\n );\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n const rows: FriendsPage = (accounts ?? []).map((a) => ({\n name: a.name,\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n }));\n\n return rows;\n },\n\n getNextPageParam: (lastPage: FriendsPage): FriendsPageParam | undefined =>\n lastPage && lastPage.length === limit\n ? { startFollowing: lastPage[lastPage.length - 1].name }\n : undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendSearchResult } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst SEARCH_LIMIT = 30;\n\n/**\n * Search friends (following/followers) by query string\n *\n * @param username - The account whose friends to search\n * @param mode - \"following\" or \"followers\"\n * @param query - Search query string\n */\nexport function getSearchFriendsQueryOptions(\n username: string,\n mode: \"following\" | \"followers\",\n query: string\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.searchFriends(username, mode, query),\n refetchOnMount: false,\n enabled: false, // Manual query via refetch\n queryFn: async (): Promise => {\n if (!query) return [];\n\n const start = query.slice(0, -1);\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [username, start, \"blog\", 1000])) as Follow[];\n\n const accountNames = response\n .map((e) => (mode === \"following\" ? e.following : e.follower))\n .filter((name) => name.toLowerCase().includes(query.toLowerCase()))\n .slice(0, SEARCH_LIMIT);\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n return (\n accounts?.map((a) => ({\n name: a.name,\n full_name: a.metadata.profile?.name || \"\",\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n })) ?? []\n );\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsQueryOptions(limit = 20) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTags(),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags\n .filter((x) => x.name !== \"\")\n .filter((x) => !x.name.startsWith(\"hive-\"))\n .map((x) => x.name)\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length > 0\n ? { afterTag: lastPage[lastPage.length - 1] }\n : undefined,\n staleTime: 60 * 60 * 1000, // 1 hour — tags change slowly\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { isCommunity } from \"@/modules/core/utils\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsWithStatsQueryOptions(limit = 250) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTagsWithStats(limit),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags.filter((tag) => tag.name !== \"\").filter((tag) => !isCommunity(tag.name))\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length ? { afterTag: lastPage[lastPage.length - 1].name } : undefined,\n staleTime: Infinity,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\n\nexport function getFragmentsQueryOptions(username: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.fragments(username),\n queryFn: async () => {\n if (!code) {\n return [];\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return response.json() as Promise;\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getFragmentsInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.fragmentsInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/fragments?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch fragments: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { ConfigManager, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n// TODO: replace any with Entry\nexport function getPromotedPostsQuery(\n type: \"feed\" | \"waves\" = \"feed\"\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.promoted(type),\n queryFn: async () => {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/promoted-entries\", baseUrl);\n if (type === \"waves\") {\n url.searchParams.append(\"short_content\", \"1\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n const data = await response.json();\n return data as T[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry, Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getEntryActiveVotesQueryOptions(entry?: Entry) {\n return queryOptions({\n queryKey: QueryKeys.posts.entryActiveVotes(entry?.author, entry?.permlink),\n queryFn: async () => {\n return callRPC(\"condenser_api.get_active_votes\", [\n entry?.author,\n entry?.permlink,\n ]) as Promise;\n },\n enabled: !!entry,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a specific user's vote on a post\n * Useful when post has >1000 votes to efficiently get one user's vote\n *\n * @param username - The voter's username\n * @param author - The post author\n * @param permlink - The post permlink\n */\nexport function getUserPostVoteQueryOptions(\n username: string | undefined,\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.userPostVote(username!, author!, permlink!),\n queryFn: async () => {\n const result = await callRPC(\"database_api.list_votes\", {\n start: [username, author, permlink],\n limit: 1,\n order: \"by_voter_comment\"\n });\n\n // Return first vote if found, otherwise null\n return (result?.votes?.[0] || null) as Vote | null;\n },\n enabled: !!username && !!author && !!permlink,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.content(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentRepliesQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.contentReplies(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content_replies\", {\n author,\n permlink,\n }) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostHeaderQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.postHeader(author, permlink),\n queryFn: async () => {\n return callRPC(\"bridge.get_post_header\", {\n author,\n permlink,\n }) as Promise;\n },\n initialData: null,\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { Entry } from \"../types\";\n\n/**\n * Filters and censors entries that match DMCA patterns\n * @param entry - Single entry or array of entries to filter\n * @returns Filtered entry/entries with DMCA content censored.\n * Note: Can return null/undefined if input is falsy - callers should guard against this.\n */\nexport function filterDmcaEntry(entry: Entry): Entry | null | undefined;\nexport function filterDmcaEntry(entries: Entry[]): Entry[];\nexport function filterDmcaEntry(entryOrEntries: Entry | Entry[] | null | undefined): Entry | Entry[] | null | undefined {\n if (Array.isArray(entryOrEntries)) {\n // Array elements are non-null Entries, so applyFilter never returns nullish here.\n return entryOrEntries.map((entry) => applyFilter(entry)) as Entry[];\n }\n return applyFilter(entryOrEntries);\n}\n\nfunction applyFilter(entry: Entry | null | undefined): Entry | null | undefined {\n if (!entry) return entry;\n\n const entryPath = `@${entry.author}/${entry.permlink}`;\n const isDmca =\n CONFIG.dmcaPatterns.includes(entryPath) ||\n CONFIG.dmcaPatternRegexes.some((regex) => regex.test(entryPath));\n\n if (isDmca) {\n return {\n ...entry,\n body: \"This post is not available due to a copyright/fraudulent claim.\",\n title: \"\",\n };\n }\n\n return entry;\n}\n","import { callWithQuorum } from \"../../hive-tx\";\nimport { Entry } from \"@/modules/posts/types\";\n\n/**\n * When the primary node returns null for a get_post call,\n * verify by querying multiple random nodes. If any node\n * returns the post, it exists (the first node was lagging).\n *\n * Uses callWithQuorum(quorum=1) which shuffles and queries\n * nodes in batches. Since it shuffles, it's unlikely to hit\n * the same node that just returned null first.\n */\nexport async function verifyPostOnAlternateNode(\n author: string,\n permlink: string,\n observer: string\n): Promise {\n try {\n const response = await callWithQuorum(\"bridge.get_post\", {\n author,\n permlink,\n observer,\n }, 1);\n\n if (\n response &&\n typeof response === \"object\" &&\n (response as Entry).author === author &&\n (response as Entry).permlink === permlink\n ) {\n return response as Entry;\n }\n } catch {\n // All nodes failed or returned null\n }\n\n return null;\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { verifyPostOnAlternateNode } from \"@/modules/bridge/verify-on-alternate-node\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostQueryOptions(\n author: string,\n permlink?: string,\n observer = \"\",\n num?: number\n) {\n const cleanPermlink = permlink?.trim();\n const entryPath = `/@${author}/${cleanPermlink ?? \"\"}`;\n\n return queryOptions({\n queryKey: QueryKeys.posts.entry(entryPath),\n queryFn: async () => {\n if (!cleanPermlink || cleanPermlink === \"undefined\") {\n return null;\n }\n\n // hive-tx tries nodes in order; the first healthy node (index 0) handles this call.\n // If it returns null, verifyPostOnAlternateNode skips index 0 and tries others.\n const response = await callRPC(\"bridge.get_post\", {\n author,\n permlink: cleanPermlink,\n observer,\n });\n\n if (!response) {\n // Primary node returned null — verify on alternate nodes\n // to guard against sync lag returning null for valid posts\n const verified = await verifyPostOnAlternateNode(author, cleanPermlink, observer);\n if (!verified) {\n return null;\n }\n const verifiedEntry = num !== undefined ? { ...verified, num } as Entry : verified as Entry;\n return filterDmcaEntry(verifiedEntry);\n }\n\n const entry = num !== undefined ? { ...response, num } as Entry : response as Entry;\n return filterDmcaEntry(entry);\n },\n enabled:\n !!author &&\n !!permlink &&\n permlink.trim() !== \"\" &&\n permlink.trim() !== \"undefined\",\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { AccountRelationship, Profile } from \"@/modules/accounts/types\";\nimport { Community } from \"@/modules/communities/types/community\";\nimport { Subscription } from \"@/modules/communities/types/subscription\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { filterDmcaEntry } from \"@/modules/posts/utils/filter-dmca-entries\";\n\ntype BridgeParams = Record | unknown[];\n\nexport function bridgeApiCall(endpoint: string, params: BridgeParams, signal?: AbortSignal): Promise {\n return callRPC(`bridge.${endpoint}`, params, undefined, undefined, signal) as Promise;\n}\n\nexport async function resolvePost(\n post: Entry,\n observer: string,\n num?: number,\n signal?: AbortSignal\n): Promise {\n const { json_metadata: json } = post;\n\n if (json?.original_author && json?.original_permlink && json.tags?.[0] === \"cross-post\") {\n try {\n const resp = await getPost(\n json.original_author,\n json.original_permlink,\n observer,\n num,\n signal\n );\n if (resp) {\n return {\n ...post,\n original_entry: resp,\n num,\n };\n }\n return post;\n } catch {\n return post;\n }\n }\n\n return { ...post, num };\n}\n\nasync function resolvePosts(posts: Entry[], observer: string, signal?: AbortSignal): Promise {\n const validatedPosts = posts.map(validateEntry);\n const resolved = await Promise.all(validatedPosts.map((p) => resolvePost(p, observer, undefined, signal)));\n return filterDmcaEntry(resolved) as Entry[];\n}\n\nexport async function getPostsRanked(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_ranked_posts\", {\n sort,\n start_author,\n start_permlink,\n limit,\n tag,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_ranked_posts returned ${typeof resp} instead of an array for sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\nexport async function getAccountPosts(\n sort: string,\n account: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n if (CONFIG.dmcaAccounts.includes(account)) {\n return [];\n }\n\n const resp = await bridgeApiCall(\"get_account_posts\", {\n sort,\n account,\n start_author,\n start_permlink,\n limit,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_account_posts returned ${typeof resp} instead of an array for account=${account}, sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\n/**\n * Validates that an Entry object has required properties with non-null values.\n */\nfunction validateEntry(entry: Entry): Entry {\n const newEntry: Entry = {\n ...entry,\n active_votes: Array.isArray(entry.active_votes) ? [...entry.active_votes] : [],\n beneficiaries: Array.isArray(entry.beneficiaries) ? [...entry.beneficiaries] : [],\n blacklists: Array.isArray(entry.blacklists) ? [...entry.blacklists] : [],\n replies: Array.isArray(entry.replies) ? [...entry.replies] : [],\n stats: entry.stats ? { ...entry.stats } : null,\n };\n\n const requiredStringProps: (keyof Entry)[] = [\n \"author\",\n \"title\",\n \"body\",\n \"created\",\n \"category\",\n \"permlink\",\n \"url\",\n \"updated\",\n ];\n\n for (const prop of requiredStringProps) {\n if (newEntry[prop] == null) {\n (newEntry as any)[prop] = \"\";\n }\n }\n\n if (newEntry.author_reputation == null) {\n newEntry.author_reputation = 0;\n }\n if (newEntry.children == null) {\n newEntry.children = 0;\n }\n if (newEntry.depth == null) {\n newEntry.depth = 0;\n }\n if (newEntry.net_rshares == null) {\n newEntry.net_rshares = 0;\n }\n if (newEntry.payout == null) {\n newEntry.payout = 0;\n }\n if (newEntry.percent_hbd == null) {\n newEntry.percent_hbd = 0;\n }\n\n if (!newEntry.stats) {\n newEntry.stats = {\n flag_weight: 0,\n gray: false,\n hide: false,\n total_votes: 0,\n };\n }\n\n if (newEntry.author_payout_value == null) {\n newEntry.author_payout_value = \"0.000 HBD\";\n }\n if (newEntry.curator_payout_value == null) {\n newEntry.curator_payout_value = \"0.000 HBD\";\n }\n if (newEntry.max_accepted_payout == null) {\n newEntry.max_accepted_payout = \"1000000.000 HBD\";\n }\n if (newEntry.payout_at == null) {\n newEntry.payout_at = \"\";\n }\n if (newEntry.pending_payout_value == null) {\n newEntry.pending_payout_value = \"0.000 HBD\";\n }\n if (newEntry.promoted == null) {\n newEntry.promoted = \"0.000 HBD\";\n }\n\n if (newEntry.is_paidout == null) {\n newEntry.is_paidout = false;\n }\n\n return newEntry;\n}\n\nexport async function getPost(\n author: string = \"\",\n permlink: string = \"\",\n observer: string = \"\",\n num?: number,\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_post\", {\n author,\n permlink,\n observer,\n }, signal);\n\n if (resp) {\n const validatedEntry = validateEntry(resp);\n const post = await resolvePost(validatedEntry, observer, num, signal);\n return filterDmcaEntry(post) as Entry;\n }\n\n return undefined;\n}\n\nexport async function getPostHeader(\n author: string = \"\",\n permlink: string = \"\"\n): Promise {\n const resp = await bridgeApiCall(\"get_post_header\", {\n author,\n permlink,\n });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getDiscussion(\n author: string,\n permlink: string,\n observer?: string\n): Promise | null> {\n const resp = await bridgeApiCall | null>(\"get_discussion\", {\n author,\n permlink,\n observer: observer || author,\n });\n\n if (resp) {\n const validatedResp: Record = {};\n for (const [key, entry] of Object.entries(resp)) {\n validatedResp[key] = validateEntry(entry);\n }\n return validatedResp;\n }\n return resp;\n}\n\nexport async function getCommunity(\n name: string,\n observer: string | undefined = \"\"\n): Promise {\n return bridgeApiCall(\"get_community\", { name, observer });\n}\n\nexport async function getCommunities(\n last: string = \"\",\n limit: number = 100,\n query?: string | null,\n sort: string = \"rank\",\n observer: string = \"\"\n): Promise {\n return bridgeApiCall(\"list_communities\", {\n last,\n limit,\n query,\n sort,\n observer,\n });\n}\n\nexport async function normalizePost(post: unknown): Promise {\n const resp = await bridgeApiCall(\"normalize_post\", { post });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getSubscriptions(account: string): Promise {\n return bridgeApiCall(\"list_all_subscriptions\", { account });\n}\n\nexport async function getSubscribers(community: string): Promise {\n return bridgeApiCall(\"list_subscribers\", { community });\n}\n\nexport async function getRelationshipBetweenAccounts(\n follower: string,\n following: string\n): Promise {\n return bridgeApiCall(\"get_relationship_between_accounts\", [\n follower,\n following,\n ]);\n}\n\nexport async function getProfiles(\n accounts: string[],\n observer?: string\n): Promise {\n return bridgeApiCall(\"get_profiles\", { accounts, observer });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getDiscussion } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport enum SortOrder {\n trending = \"trending\",\n author_reputation = \"author_reputation\",\n votes = \"votes\",\n created = \"created\",\n}\n\nfunction parseAsset(value: string): { amount: number; symbol: string } {\n const match = value.match(/^(\\d+\\.?\\d*)\\s*([A-Z]+)$/);\n if (!match) return { amount: 0, symbol: \"\" };\n return {\n amount: parseFloat(match[1]),\n symbol: match[2],\n };\n}\n\nexport function sortDiscussions(\n entry: Entry,\n discussion: Entry[],\n order: SortOrder\n) {\n const allPayout = (c: Entry) =>\n parseAsset(c.pending_payout_value).amount +\n parseAsset(c.author_payout_value).amount +\n parseAsset(c.curator_payout_value).amount;\n\n const absNegative = (a: Entry) => a.net_rshares < 0;\n const isPinned = (a: Entry) =>\n entry.json_metadata?.pinned_reply === `${a.author}/${a.permlink}`;\n\n const sortOrders = {\n trending: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const _a = allPayout(a);\n const _b = allPayout(b);\n if (_a !== _b) {\n return _b - _a;\n }\n\n return 0;\n },\n author_reputation: (a: Entry, b: Entry) => {\n const keyA = a.author_reputation;\n const keyB = b.author_reputation;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n votes: (a: Entry, b: Entry) => {\n const keyA = a.children;\n const keyB = b.children;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n created: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const keyA = Date.parse(a.created);\n const keyB = Date.parse(b.created);\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n };\n\n const sorted = discussion.sort(sortOrders[order]);\n const pinnedIndex = sorted.findIndex((i) => isPinned(i));\n const pinned = sorted[pinnedIndex];\n if (pinnedIndex >= 0) {\n sorted.splice(pinnedIndex, 1);\n sorted.unshift(pinned);\n }\n return sorted;\n}\n\nexport function getDiscussionsQueryOptions(\n entry: Entry,\n order: SortOrder = SortOrder.created,\n enabled: boolean = true,\n observer?: string\n) {\n // Anonymous readers fall back to CONFIG.defaultObserver rather than the post\n // author. Author-as-observer only helps the minority of authors who curate a\n // mute list; everyone else's comment section came back unfiltered, so the\n // shared moderation account is the better default for logged-out traffic.\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussions(entry?.author, entry?.permlink, order, resolvedObserver),\n queryFn: async () => {\n if (!entry) {\n return [];\n }\n\n const response = await callRPC(\"bridge.get_discussion\", {\n author: entry.author,\n permlink: entry.permlink,\n observer: resolvedObserver,\n });\n\n const results = response\n ? Array.from(Object.values(response as Record))\n : [];\n return filterDmcaEntry(results);\n },\n enabled: enabled && !!entry,\n select: (data: Entry[]) => sortDiscussions(entry, data, order),\n // Preserve optimistic entries during refetch by using structural sharing\n // This ensures newly added comments (is_optimistic: true) aren't wiped out\n // when blockchain hasn't indexed them yet\n structuralSharing: (oldData, newData) => {\n if (!oldData || !newData) return newData;\n\n // Find optimistic entries in old data that aren't in new data yet\n const optimisticEntries = (oldData as Entry[]).filter(\n (entry: Entry) => entry.is_optimistic === true\n );\n\n const fetchedPermlinks = new Set(\n (newData as Entry[]).map((e: Entry) => `${e.author}/${e.permlink}`)\n );\n\n const missingOptimistic = optimisticEntries.filter(\n (opt: Entry) => !fetchedPermlinks.has(`${opt.author}/${opt.permlink}`)\n );\n\n // If there are optimistic entries missing from new data, preserve them\n if (missingOptimistic.length > 0) {\n return [...(newData as Entry[]), ...missingOptimistic];\n }\n\n return newData;\n },\n });\n}\n\nexport function getDiscussionQueryOptions(\n author: string,\n permlink: string,\n observer?: string,\n enabled = true\n) {\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussion(author, permlink, resolvedObserver),\n enabled: enabled && !!author && !!permlink,\n queryFn: async () =>\n getDiscussion(author, permlink, resolvedObserver) as Promise | null>,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getAccountPosts } from \"@/modules/bridge\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n hasNextPage: boolean;\n};\ntype Page = Entry[];\n\nexport function getAccountPostsInfiniteQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return infiniteQueryOptions<\n Page,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.accountPosts(username ?? \"\", filter, limit, observer),\n enabled: !!username && enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n hasNextPage: true,\n } as PageParam,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!pageParam?.hasNextPage || !username) return [];\n\n const response = await getAccountPosts(\n filter,\n username,\n pageParam.author ?? \"\",\n pageParam.permlink ?? \"\",\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n\n getNextPageParam: (lastPage: Page): PageParam | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n // Only consider there's a next page if we got a full page of results\n // A partial page means we've reached the end\n const hasNextPage = (lastPage?.length ?? 0) === limit;\n\n if (!hasNextPage) {\n return undefined;\n }\n\n return {\n author: last?.author,\n permlink: last?.permlink,\n hasNextPage,\n };\n },\n });\n}\n\nexport function getAccountPostsQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.accountPostsPage(username ?? \"\", filter, start_author, start_permlink, limit, observer),\n enabled: !!username && enabled,\n queryFn: async ({ signal } = {} as any) => {\n if (!username) {\n return [];\n }\n\n const response = await getAccountPosts(\n filter,\n username,\n start_author,\n start_permlink,\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getPostsRanked } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n};\n\ninterface GetPostsRankedOptions {\n resolvePosts?: boolean;\n}\n\n/**\n * `select` runs on every render, and React Query only reuses its previous\n * result when both the data and the select function are unchanged. These\n * options are rebuilt on each render, so an inline arrow would be a new\n * function every time and every page would be re-sorted on every render.\n * One stable function per sort keeps that memoization working.\n */\nconst displaySelects = new Map<\n string,\n (data: InfiniteData) => InfiniteData\n>();\n\nfunction displaySelect(sort: string) {\n let select = displaySelects.get(sort);\n if (!select) {\n select = (data) => ({\n ...data,\n pages: data.pages.map((page) => orderForDisplay(page, sort)),\n });\n displaySelects.set(sort, select);\n }\n return select;\n}\n\n/**\n * Display order for one page.\n *\n * Pinned entries are captured before the created-date sort: the bridge surfaces\n * them at the head of the response in the community moderators' chosen order,\n * which the sort would scatter by age. Every pin is kept, since an earlier\n * post-sort find() kept one and silently dropped the rest, so multi-pin\n * communities never displayed their other pinned posts. Pins only occur on the\n * first page, cursor pages return none, so this is a no-op elsewhere.\n *\n * Applied in `select` rather than in the query function so it cannot reach the\n * pagination cursor.\n */\nfunction orderForDisplay(page: Entry[], sort: string): Entry[] {\n const pinned = page.filter((entry) => entry.stats?.is_pinned);\n const rest = page.filter((entry) => !entry.stats?.is_pinned);\n\n if (sort === \"hot\") {\n return [...pinned, ...rest];\n }\n\n const byCreated = [...rest].sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n return [...pinned, ...byCreated];\n}\n\nexport function getPostsRankedInfiniteQueryOptions(\n sort: string,\n tag: string,\n limit = 20,\n observer = \"\",\n enabled = true,\n _options: GetPostsRankedOptions = {}\n) {\n return infiniteQueryOptions<\n Entry[],\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.postsRanked(sort, tag, limit, observer),\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await callRPC(\"bridge.get_ranked_posts\", {\n sort,\n start_author: pageParam.author,\n start_permlink: pageParam.permlink,\n limit,\n tag: sanitizedTag,\n observer,\n }, undefined, undefined, signal);\n\n if (response === null || response === undefined) {\n return [];\n }\n\n if (!Array.isArray(response)) {\n throw new Error(\n `[SDK] get_ranked_posts returned ${typeof response} for sort=${sort}`\n );\n }\n\n // Kept in the bridge's own order. getNextPageParam takes the cursor from\n // the last entry of the page this returns, and the bridge continues from\n // that entry in ITS ranking, so reordering here made the next request\n // start from the middle of the previous ranked page: for trending, payout\n // and muted the last entry by date is not the last entry by rank, and\n // scrolling repeated some posts and skipped others. Display order is\n // applied in `select`, which React Query runs after pagination.\n return filterDmcaEntry(response as Entry[]);\n },\n select: displaySelect(sort),\n enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n } as PageParam,\n getNextPageParam: (lastPage: Entry[]) => {\n // React Query reads \"there is no next page\" from undefined alone, so\n // returning an object here always left it true. An infinite list\n // then keeps calling fetchNextPage at the end of the feed, appending an\n // empty page each time: the query state churns and the cache grows for as\n // long as the reader sits at the bottom.\n const last = lastPage?.[lastPage.length - 1];\n if (!last) {\n return undefined;\n }\n\n return { author: last.author, permlink: last.permlink };\n },\n });\n}\n\nexport function getPostsRankedQueryOptions(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.postsRankedPage(sort, start_author, start_permlink, limit, tag, observer),\n enabled,\n queryFn: async ({ signal } = {} as any) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await getPostsRanked(\n sort,\n start_author,\n start_permlink,\n limit,\n sanitizedTag,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface BlogEntry {\n author: string;\n permlink: string;\n blog: string;\n reblog_on: string;\n reblogged_on: string;\n entry_id: number;\n}\n\nexport interface Reblog {\n author: string;\n permlink: string;\n}\n\nexport function getReblogsQueryOptions(\n username?: string,\n activeUsername?: string,\n limit = 200\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.reblogs(username ?? \"\", limit),\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.get_blog_entries\", [\n username ?? activeUsername,\n 0,\n limit,\n ])) as BlogEntry[];\n\n return response\n .filter(\n (i) =>\n i.author !== activeUsername &&\n !i.reblogged_on.startsWith(\"1970-\")\n )\n .map((i) => ({ author: i.author, permlink: i.permlink })) as Reblog[];\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of usernames who reblogged a specific post\n */\nexport function getRebloggedByQueryOptions(author?: string, permlink?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.rebloggedBy(author ?? \"\", permlink ?? \"\"),\n queryFn: async () => {\n if (!author || !permlink) {\n return [];\n }\n\n const response = (await callRPC(\"condenser_api.get_reblogged_by\", [author, permlink])) as string[];\n\n return Array.isArray(response) ? response : [];\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Schedule } from \"../types/schedule\";\n\nexport function getSchedulesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.schedules(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getSchedulesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.schedulesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/schedules?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Draft } from \"../types/draft\";\n\nexport function getDraftsQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.drafts(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getDraftsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.draftsInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/drafts?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n const json = await response.json();\n // Normalize response for backwards compatibility\n // If backend doesn't support wrapped format yet, it returns Draft[]\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { UserImage } from \"../types/user-image\";\n\nasync function fetchUserImages(code: string | undefined): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nexport function getImagesQueryOptions(username?: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.images(username),\n queryFn: async () => {\n if (!username || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getGalleryImagesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.galleryImages(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getImagesInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.imagesInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/images?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nexport function getCommentHistoryQueryOptions(author: string, permlink: string, onlyMeta = false) {\n return queryOptions({\n queryKey: QueryKeys.posts.commentHistory(author, permlink, onlyMeta),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n onlyMeta: onlyMeta ? \"1\" : \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nfunction makeEntryPath(author: string, permlink: string): string {\n const cleanAuthor = author?.trim();\n const cleanPermlink = permlink?.trim();\n\n if (!cleanAuthor || !cleanPermlink) {\n throw new Error(\"Invalid entry path: author and permlink are required\");\n }\n\n // Normalize by removing any leading @ or / characters\n const normalizedAuthor = cleanAuthor.replace(/^@+/, \"\");\n const normalizedPermlink = cleanPermlink.replace(/^\\/+/, \"\");\n\n if (!normalizedAuthor || !normalizedPermlink) {\n throw new Error(\"Invalid entry path: author and permlink cannot be empty after normalization\");\n }\n\n return `@${normalizedAuthor}/${normalizedPermlink}`;\n}\n\nexport interface DeletedEntry {\n body: string;\n title: string;\n tags: string[];\n}\n\nexport function getDeletedEntryQueryOptions(author: string, permlink: string) {\n const cleanPermlink = permlink?.trim();\n const cleanAuthor = author?.trim();\n const isValid =\n !!cleanAuthor && !!cleanPermlink && cleanPermlink !== \"undefined\";\n\n const entryPath = isValid ? makeEntryPath(cleanAuthor, cleanPermlink) : \"\";\n\n return queryOptions({\n queryKey: QueryKeys.posts.deletedEntry(entryPath),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink: cleanPermlink || \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n select: (history): DeletedEntry | null => {\n if (!history?.list?.[0]) {\n return null;\n }\n const { body, title, tags } = history.list[0];\n return {\n body,\n title,\n tags,\n };\n },\n enabled: isValid,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { PostTipsResponse } from \"../types/post-tip\";\n\n/**\n * Tips for a single post.\n *\n * Addressed as a GET so the response can be cached. This was a POST, which no\n * cache may store, so the same tip totals were refetched on every mount. The\n * endpoint keys off nothing but author and permlink and needs no auth, and now\n * serves a Cache-Control, so a repeat read can come from the browser instead of\n * the network.\n *\n * `staleTime` is kept at or below the endpoint's own cache window rather than\n * extending it. react-query cannot see how old a response already was when\n * `fetch` served it from the browser cache, so it restarts its window from zero\n * on a body that may already be near expiry; worst-case staleness is the two\n * windows added together.\n */\nexport function getPostTipsQueryOptions(author: string, permlink: string, isEnabled = true) {\n return queryOptions({\n queryKey: QueryKeys.posts.tips(author, permlink),\n queryFn: async () => {\n const path = `/private-api/post-tips/${encodeURIComponent(author)}/${encodeURIComponent(permlink)}`;\n const response = await fetch(CONFIG.privateApiHost + path, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post tips: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink && isEnabled,\n staleTime: 60 * 1000,\n });\n}\n","import { Entry, WaveEntry } from \"../types\";\nimport { getDiscussionsQueryOptions, SortOrder } from \"../queries/get-discussions-query-options\";\nimport { CONFIG } from \"@/modules/core\";\n\ntype EntryWithPostId = Entry & { post_id: number };\n\nfunction normalizeContainer(entry: EntryWithPostId, host: string): WaveEntry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds send the publish time as `timestamp`, not `created`.\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n host\n } as WaveEntry;\n}\n\nfunction normalizeParent(entry: EntryWithPostId): Entry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id\n } as Entry;\n}\n\nexport function normalizeWaveEntryFromApi(\n entry:\n | (Entry & { post_id: number; container?: EntryWithPostId | null; parent?: EntryWithPostId | null })\n | null\n | undefined,\n host: string\n): WaveEntry | null {\n if (!entry) {\n return null;\n }\n\n const containerSource = entry.container ?? entry;\n const container = normalizeContainer(containerSource, host);\n\n const parent = entry.parent ? normalizeParent(entry.parent) : undefined;\n\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds (following / tag / account) send the publish\n // time as `timestamp`, not `created`; map it so the relative time renders on\n // every card (the For You feed already carries a real `created` from Hive RPC).\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n // The private-api waves feeds omit max_accepted_payout; default it (and the\n // payout strings) to the Hive shape so payout-rendering consumers run their\n // pending+author+curator summation instead of treating the value as missing.\n max_accepted_payout: entry.max_accepted_payout || \"1000000.000 HBD\",\n pending_payout_value: entry.pending_payout_value || \"0.000 HBD\",\n author_payout_value: entry.author_payout_value || \"0.000 HBD\",\n curator_payout_value: entry.curator_payout_value || \"0.000 HBD\",\n host,\n container,\n parent\n } as WaveEntry;\n}\n\nexport function toEntryArray(x: unknown): Entry[] {\n return Array.isArray(x) ? (x as Entry[]) : [];\n}\n\nexport async function getVisibleFirstLevelThreadItems(\n container: WaveEntry\n): Promise {\n const queryOptions = getDiscussionsQueryOptions(container, SortOrder.created, true);\n const discussionItemsRaw = await CONFIG.queryClient.fetchQuery(queryOptions);\n const discussionItems = toEntryArray(discussionItemsRaw);\n\n if (discussionItems.length <= 1) {\n return [];\n }\n\n const firstLevelItems = discussionItems.filter(\n ({ parent_author, parent_permlink }) =>\n parent_author === container.author && parent_permlink === container.permlink\n );\n\n if (firstLevelItems.length === 0) {\n return [];\n }\n\n const visibleItems = firstLevelItems.filter((item) => !item.stats?.gray);\n\n return visibleItems;\n}\n\nexport function mapThreadItemsToWaveEntries(\n items: Entry[],\n container: WaveEntry,\n host: string\n): WaveEntry[] {\n if (items.length === 0) {\n return [];\n }\n\n return items\n .map((item) => {\n const parent = items.find(\n (i) =>\n i.author === item.parent_author &&\n i.permlink === item.parent_permlink &&\n i.author !== host\n );\n\n return {\n ...item,\n id: item.post_id,\n host,\n container,\n parent\n } as WaveEntry;\n })\n .filter((entry) => entry.container.post_id !== entry.post_id)\n .sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\ntype WavesFeedRow = Entry & {\n post_id: number;\n // The wave's container account (e.g. ecency.waves, leothreads), so a mixed\n // cross-container feed can be rendered and acted on per item.\n host?: string;\n // Opaque keyset cursor pointing just past this row.\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type WavesFeedEntry = WaveEntry & { _cursor?: string };\n\nexport interface WavesFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only waves carrying this tag (across all containers). */\n tag?: string;\n /** Only waves from accounts this user follows (across all containers). */\n following?: string;\n /** Only this author's waves (across all containers); the per-author feed. */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedFeedParams {\n containers: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: WavesFeedParams): NormalizedFeedParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n following: params.following?.trim().toLowerCase() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchWavesFeedPage(\n { containers, tag, following, author, observer, limit }: NormalizedFeedParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/feed\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (following) {\n url.searchParams.set(\"following\", following);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves feed: ${response.status}`);\n }\n\n const data = (await response.json()) as WavesFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return { ...entry, _cursor: row._cursor } as WavesFeedEntry;\n })\n .filter((entry): entry is WavesFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container waves feed (the chronological \"For You\" stream, and\n * the Following / Tag feeds via filters).\n *\n * A single esync-backed call returns the newest waves across every indexed\n * container, already merged and time-ordered, with keyset (cursor) pagination,\n * replacing the per-container chain-RPC scan. The optional `tag` / `following`\n * filters narrow the same stream without changing the cursor.\n */\nexport function getWavesFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchWavesFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination. A short page (fewer than `limit` rows) is the\n // end-of-feed signal; on a full page the server always returns the next\n // cursor on the last row. Stopping (rather than looping) is the safe\n // fallback if that cursor were ever absent.\n getNextPageParam: (lastPage: WavesFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n\n/**\n * Page-one of the combined feed as a plain (non-infinite) query under a distinct\n * key, for the \"new waves\" poll. Separate from {@link getWavesFeedQueryOptions}\n * so refreshing it never truncates the infinite feed's loaded pages.\n */\nexport function getWavesLatestFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return queryOptions({\n queryKey: [\n ...QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n \"latest\"\n ],\n staleTime: 0,\n queryFn: ({ signal }) => fetchWavesFeedPage(normalized, undefined, signal)\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\n/** The 3Speak video a short embeds, as returned by esync /api/waves/shorts. */\nexport interface ShortVideo {\n platform: string;\n author: string;\n permlink: string;\n embed_url: string;\n thumbnail_url: string | null;\n duration_secs: number | null;\n}\n\ntype ShortsFeedRow = Entry & {\n post_id: number;\n host?: string;\n video?: ShortVideo;\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type ShortsFeedEntry = WaveEntry & {\n /** The embedded 3Speak video reference for the reels player. */\n video?: ShortVideo;\n _cursor?: string;\n};\n\nexport interface ShortsFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only shorts carrying this tag (across all containers). */\n tag?: string;\n /** Only this author's shorts (across all containers). */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedShortsParams {\n containers: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: ShortsFeedParams): NormalizedShortsParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchShortsFeedPage(\n { containers, tag, author, observer, limit }: NormalizedShortsParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/shorts\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch shorts feed: ${response.status}`);\n }\n\n const data = (await response.json()) as ShortsFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return {\n ...entry,\n // A lightweight feed row may omit active_votes; EntryVoteBtn (which uses\n // this entry as React Query initialData) calls .some() on it, so default\n // to an empty array to avoid a crash before the full post query loads.\n active_votes: entry.active_votes ?? [],\n video: row.video,\n _cursor: row._cursor\n } as ShortsFeedEntry;\n })\n .filter((entry): entry is ShortsFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container shorts (reels) feed: waves that embed a 3Speak video.\n *\n * Backed by esync /api/waves/shorts (via /private-api/waves/shorts). Same shape,\n * keyset pagination and filters as {@link getWavesFeedQueryOptions}, plus a\n * `video` block per item for the vertical reels player. There is no `following`\n * filter in v1.\n */\nexport function getShortsFeedQueryOptions(params: ShortsFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.shortsFeed({ containers, tag, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchShortsFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination: a short page (fewer than `limit` rows) ends the feed;\n // on a full page the server returns the next cursor on the last row.\n getNextPageParam: (lastPage: ShortsFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport {\n getVisibleFirstLevelThreadItems,\n mapThreadItemsToWaveEntries\n} from \"../utils/waves-helpers\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst THREAD_CONTAINER_BATCH_SIZE = 5;\nconst MAX_CONTAINERS_TO_SCAN = 50;\n\ninterface ThreadsResult {\n entries: WaveEntry[];\n}\n\nasync function getThreads(\n host: string,\n pageParam?: WaveEntry\n): Promise {\n let startAuthor = pageParam?.author;\n let startPermlink = pageParam?.permlink;\n let scannedContainers = 0;\n let skipContainerId = pageParam?.post_id;\n\n while (scannedContainers < MAX_CONTAINERS_TO_SCAN) {\n interface AccountPostsParams {\n sort: string;\n account: string;\n limit: number;\n start_author?: string;\n start_permlink?: string;\n }\n\n const rpcParams: AccountPostsParams = {\n sort: \"posts\", // ProfileFilter.posts\n account: host,\n limit: THREAD_CONTAINER_BATCH_SIZE,\n ...(startAuthor ? { start_author: startAuthor } : {}),\n ...(startPermlink ? { start_permlink: startPermlink } : {})\n };\n\n let containers: WaveEntry[];\n try {\n containers = (await callRPC(\"bridge.get_account_posts\", rpcParams)) as WaveEntry[];\n } catch (err) {\n console.error(\"[SDK] getThreads get_account_posts error:\", err);\n return null;\n }\n\n if (!containers || containers.length === 0) {\n return null;\n }\n\n const normalizedContainers = containers.map((container) => {\n container.id = container.post_id;\n container.host = host;\n return container;\n });\n\n for (const container of normalizedContainers) {\n if (skipContainerId && container.post_id === skipContainerId) {\n skipContainerId = undefined;\n continue;\n }\n\n scannedContainers += 1;\n\n if (container.stats?.gray) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n let visibleItems: Entry[];\n try {\n visibleItems = await getVisibleFirstLevelThreadItems(container);\n } catch (err) {\n // A transient bridge.get_discussion failure (RPC timeout, node error, or\n // an oversized response on a large late-day container) must not collapse\n // the whole feed. Treat this container as temporarily unavailable and scan\n // the next one — mirroring the empty-container handling below and the\n // get_account_posts guard above. The query's refetch interval retries it.\n console.error(\"[SDK] getThreads get_discussion error:\", err);\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n if (visibleItems.length === 0) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n return {\n entries: mapThreadItemsToWaveEntries(visibleItems, container, host)\n };\n }\n\n const lastContainer = normalizedContainers[normalizedContainers.length - 1];\n\n if (!lastContainer) {\n return null;\n }\n\n startAuthor = lastContainer.author;\n startPermlink = lastContainer.permlink;\n }\n\n return null;\n}\n\n// Page = array of WaveEntry; Cursor = WaveEntry (container) or undefined\ntype WavesPage = WaveEntry[];\ntype WavesCursor = WaveEntry | undefined;\n\nexport function getWavesByHostQueryOptions(host: string) {\n return infiniteQueryOptions<\n WavesPage,\n Error,\n InfiniteData,\n string[],\n WavesCursor\n >({\n queryKey: QueryKeys.posts.wavesByHost(host),\n initialPageParam: undefined as WavesCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WavesCursor }) => {\n const result = await getThreads(host, pageParam);\n if (!result) return []; // no items to show for this page\n\n return result.entries;\n },\n\n getNextPageParam: (lastPage: WavesPage): WavesCursor => lastPage?.[0]?.container,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesTagEntryResponse = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nconst DEFAULT_TAG_FEED_LIMIT = 40;\n\nexport function getWavesByTagQueryOptions(host: string, tag: string, limit = DEFAULT_TAG_FEED_LIMIT) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByTag(host, tag),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/tags\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"tag\", tag);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves by tag: ${response.status}`);\n }\n\n const data = await response.json() as WavesTagEntryResponse[];\n\n const result = data\n .slice(0, limit)\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n return result.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves by tag\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesFollowingEntry = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport function getWavesFollowingQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFollowing(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/following\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves following feed: ${response.status}`);\n }\n\n const data = await response.json() as WavesFollowingEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves following feed\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingTag } from \"../types\";\n\ninterface WavesTrendingTagResponse {\n tag: string;\n posts: number;\n}\n\nexport function getWavesTrendingTagsQueryOptions(host?: string, hours = 24) {\n // Omit the container for combined trending tags across all containers.\n const container = host?.trim() || undefined;\n\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingTags(container ?? \"\", hours),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/tags\", baseUrl);\n if (container) {\n url.searchParams.set(\"container\", container);\n }\n url.searchParams.set(\"hours\", hours.toString());\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending tags: ${response.status}`);\n }\n\n const data = await response.json() as WavesTrendingTagResponse[];\n\n return data.map(({ tag, posts }) => ({ tag, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending tags\", error);\n return [];\n }\n }\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ninterface WavesAccountEntry extends Entry {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n}\n\nexport function getWavesByAccountQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByAccount(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/account\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves for account: ${response.status}`);\n }\n\n const data = await response.json() as WavesAccountEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves for account\", error);\n throw error;\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingAuthor } from \"../types\";\n\nexport function getWavesTrendingAuthorsQueryOptions(host: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingAuthors(host),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/authors\", baseUrl);\n url.searchParams.set(\"container\", host);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending authors: ${response.status}`);\n }\n\n const data = await response.json() as WaveTrendingAuthor[];\n\n return data.map(({ author, posts }) => ({ author, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending authors\", error);\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"../types\";\nimport { normalizePost } from \"@/modules/bridge\";\n\nexport function getNormalizePostQueryOptions(\n post: { author?: string; permlink?: string } | undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.normalize(post?.author ?? \"\", post?.permlink ?? \"\"),\n enabled: enabled && !!post,\n queryFn: async () => normalizePost(post) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core/config\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { getPostQueryOptions } from \"@/modules/posts/queries\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ninterface VoteOperationDetails {\n voter: string;\n author: string;\n permlink: string;\n weight: number;\n}\n\ninterface AccountVoteHistoryItem {\n timestamp: string;\n op: [string, VoteOperationDetails];\n}\n\ntype AccountVoteHistoryRecord = [number, AccountVoteHistoryItem];\n\ninterface VoteHistoryResult extends VoteOperationDetails {\n num: number;\n timestamp: string;\n}\n\nexport interface VoteHistoryPageParam {\n start: number;\n}\n\nexport interface VoteHistoryPage {\n lastDate: number;\n lastItemFetched: number;\n entries: Entry[];\n}\n\nfunction isEntry(x: unknown): x is Entry {\n return (\n !!x &&\n typeof x === \"object\" &&\n \"author\" in x &&\n \"permlink\" in x &&\n \"active_votes\" in x\n );\n}\n\n/**\n * Calculate days since a date\n */\nfunction getDays(createdDate: string): number {\n const past = new Date(createdDate);\n const now = new Date();\n const diffMs = now.getTime() - past.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Get account vote history with entries\n *\n * @param username - Account name to get vote history for\n * @param limit - Number of history items per page (default: 20)\n * @param filters - Additional filters to pass to get_account_history\n * @param dayLimit - Only include votes from last N days (default: 7)\n */\nexport function getAccountVoteHistoryInfiniteQueryOptions(\n username: string,\n options?: {\n limit?: number;\n filters?: F[];\n dayLimit?: number;\n }\n) {\n const { limit = 20, filters = [], dayLimit = 7.0 } = options ?? {};\n\n return infiniteQueryOptions<\n VoteHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n VoteHistoryPageParam\n >({\n queryKey: QueryKeys.accounts.voteHistory(username, limit),\n initialPageParam: { start: -1 },\n\n queryFn: async ({ pageParam }: { pageParam: VoteHistoryPageParam }) => {\n const { start } = pageParam;\n\n const response = (await callRPC(\"condenser_api.get_account_history\", [username, start, limit, ...filters])) as AccountVoteHistoryRecord[];\n\n const mappedResults: VoteHistoryResult[] = response.map(([num, historyObj]) => ({\n ...historyObj.op[1],\n num,\n timestamp: historyObj.timestamp,\n }));\n\n const result = mappedResults.filter(\n (filtered) =>\n filtered.voter === username &&\n filtered.weight !== 0 &&\n getDays(filtered.timestamp) <= dayLimit\n );\n\n const entries: Entry[] = [];\n for (const obj of result) {\n const post = await CONFIG.queryClient.fetchQuery(\n getPostQueryOptions(obj.author, obj.permlink)\n );\n if (isEntry(post)) entries.push(post);\n }\n\n const [firstHistory] = response;\n\n return {\n lastDate: firstHistory ? getDays(firstHistory[1].timestamp) : 0,\n lastItemFetched: firstHistory ? firstHistory[0] : start,\n entries,\n };\n },\n\n getNextPageParam: (lastPage: VoteHistoryPage): VoteHistoryPageParam => ({\n start: lastPage.lastItemFetched,\n }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Profile } from \"../types\";\nimport { getProfiles } from \"@/modules/bridge\";\n\nexport function getProfilesQueryOptions(\n accounts: string[],\n observer?: string,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.profiles(accounts, observer ?? \"\"),\n enabled: enabled && accounts.length > 0,\n queryFn: async () => getProfiles(accounts, observer) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type {\n BalanceCoinType,\n BalanceHistoryEntry,\n BalanceHistoryResponse,\n} from \"../types\";\n\ninterface BalanceHistoryPage {\n entries: BalanceHistoryEntry[];\n currentPage: number;\n}\n\n/**\n * Cursor for balance history pagination.\n * null = first request (returns the newest page).\n * number = specific page to fetch (decrementing for older data).\n */\ntype BalanceHistoryCursor = number | null;\n\n/**\n * Get balance history for an account with pagination, newest first.\n * Uses the balance-api REST endpoint with direction=desc.\n *\n * Pagination: first call omits `page` to get the newest data.\n * The response includes `total_pages` so we know the current page number.\n * Subsequent calls decrement the page number to load older data.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param pageSize - Number of entries per page\n */\nexport function getBalanceHistoryInfiniteQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n pageSize = 200\n) {\n return infiniteQueryOptions<\n BalanceHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n BalanceHistoryCursor\n >({\n queryKey: QueryKeys.wallet.balanceHistory(\n username ?? \"\",\n coinType,\n pageSize\n ),\n initialPageParam: null as BalanceHistoryCursor,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"coin-type\": coinType,\n \"page-size\": pageSize,\n direction: \"desc\",\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"balance\",\n \"/accounts/{account-name}/balance-history\",\n params,\n undefined,\n undefined,\n signal\n )) as BalanceHistoryResponse;\n\n return {\n entries: response.operations_result,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n // Decrement page to go further back in time\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type { AggregatedBalanceEntry, BalanceCoinType } from \"../types\";\n\nexport type BalanceAggregationGranularity = \"yearly\" | \"monthly\" | \"daily\";\n\n/**\n * Get aggregated balance history for an account.\n * Uses the balance-api REST endpoint - enables yearly/monthly/daily summary\n * widgets that are impossible via RPC.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param granularity - yearly (default), monthly, or daily\n */\nexport function getAggregatedBalanceQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n granularity: BalanceAggregationGranularity = \"yearly\"\n) {\n return queryOptions({\n queryKey: QueryKeys.wallet.aggregatedHistory(\n username ?? \"\",\n coinType,\n granularity\n ),\n\n queryFn: async () => {\n if (!username) {\n return [];\n }\n\n return (await callREST(\n \"balance\",\n \"/accounts/{account-name}/aggregated-history\",\n {\n \"account-name\": username,\n \"coin-type\": coinType,\n granularity,\n }\n )) as AggregatedBalanceEntry[];\n },\n\n enabled: !!username,\n staleTime: 60_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport interface ProMembersResponse {\n /** Usernames of active Ecency Pro members. */\n members: string[];\n count: number;\n}\n\n/**\n * Public, cached roster of Ecency Pro members. Backed by a lightweight private-api\n * endpoint (no auth) so any surface can decorate a username with a Pro badge without\n * a per-user request.\n *\n * `staleTime` is deliberately shorter than the endpoint's own cache window and is\n * NOT raised to match it. react-query has no idea how old a response already was\n * when `fetch` served it from the browser cache: it treats a nine-minute-old\n * cached body as freshly fetched and starts its own window from zero. Worst-case\n * staleness is therefore the endpoint's window plus this one, so raising this to\n * match the server would roughly double it rather than align it.\n */\nexport function getProMembersQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.proMembers(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/pro-members\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch pro members: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Lowercased set of member usernames for O(1), case-insensitive membership checks. */\nexport function proMembersSet(members?: string[]): Set {\n return new Set((members ?? []).map((m) => m.toLowerCase()));\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { AccountProfile, FullAccount } from \"../types\";\nimport {\n buildPostingJsonMetadata,\n buildProfileMetadata,\n extractAccountProfile,\n pickRicherMetadataSnapshot,\n} from \"../utils/profile-metadata\";\n\ninterface Payload {\n profile: Partial;\n tokens: AccountProfile[\"tokens\"];\n}\n\n/**\n * React Query mutation hook for updating account profile metadata.\n *\n * This mutation broadcasts an account_update2 operation to update the user's\n * profile information (name, about, location, avatar, cover image, etc.).\n *\n * @param username - The username to update (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Profile Fields:**\n * - name: Display name\n * - about: Bio/description\n * - location: Location\n * - website: Website URL\n * - profile_image: Avatar URL\n * - cover_image: Cover/banner URL\n * - tokens: Social tokens (Twitter, Facebook, etc.)\n * - version: Profile metadata version (auto-set to 2)\n *\n * **Authentication:**\n * - Uses posting authority (account_update2 operation)\n * - Supports all auth methods via platform adapter\n *\n * **Post-Broadcast Actions:**\n * - Optimistically updates account cache with new profile data\n * - Invalidates account cache to refetch from blockchain\n *\n * @example\n * ```typescript\n * const updateProfile = useAccountUpdate(username, {\n * adapter: myAdapter,\n * });\n *\n * // Update profile\n * updateProfile.mutate({\n * profile: {\n * name: \"John Doe\",\n * about: \"Hive enthusiast\",\n * profile_image: \"https://...\",\n * }\n * });\n * ```\n */\nexport function useAccountUpdate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useBroadcastMutation(\n [\"accounts\", \"update\"],\n username,\n (payload: Partial) => {\n // Prefer the freshest cached snapshot. onMutate has just refetched the\n // account from chain, so this usually reflects the current on-chain\n // profile rather than a possibly stale/unloaded render-time value. If\n // the cache instead holds a metadata-poorer row than the render-time\n // snapshot (e.g. a node served a stripped account row), the richer\n // snapshot wins — a partial update must never shrink the profile while\n // any snapshot still knows the full one.\n const account = pickRicherMetadataSnapshot(\n queryClient.getQueryData(\n getAccountFullQueryOptions(username).queryKey\n ),\n data\n );\n\n if (!account) {\n throw new Error(\"[SDK][Accounts] – cannot update not existing account\");\n }\n\n return [\n [\n \"account_update2\",\n {\n account: username!,\n json_metadata: \"\",\n extensions: [] as [],\n // Read-modify-write the FULL on-chain metadata: deep-merge the\n // profile and preserve any non-`profile` top-level keys, so a\n // partial update never wipes unrelated fields.\n posting_json_metadata: buildPostingJsonMetadata({\n existingPostingJsonMetadata: account.posting_json_metadata,\n profile: payload.profile,\n tokens: payload.tokens,\n }),\n },\n ],\n ];\n },\n async (_data: unknown, variables: Partial) => {\n // Optimistic cache update\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n const obj = JSON.parse(JSON.stringify(data)) as FullAccount;\n obj.profile = buildProfileMetadata({\n existingProfile: extractAccountProfile(data),\n profile: variables.profile,\n tokens: variables.tokens,\n });\n\n return obj;\n }\n );\n\n // Invalidate cache to refetch from blockchain\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username)\n ]);\n },\n auth,\n undefined,\n {\n broadcastMode,\n // Before merging, force a fresh on-chain read so a stale or unloaded\n // cached snapshot cannot cause a partial update (e.g. pinning a post,\n // which sets only `pinned`) to overwrite the existing profile with a\n // near-empty object. Best-effort: if the refetch fails, the op builder\n // falls back to the cached snapshot.\n onMutate: async () => {\n if (!username) {\n return;\n }\n try {\n await queryClient.fetchQuery({\n ...getAccountFullQueryOptions(username),\n staleTime: 0,\n });\n } catch {\n // Ignore – fall back to whatever is already cached.\n }\n },\n }\n );\n}\n","import { broadcastJson, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getRelationshipBetweenAccountsQueryOptions, getAccountFullQueryOptions } from \"../queries\";\nimport { AccountRelationship } from \"../types\";\n\ntype Kind = \"toggle-ignore\" | \"toggle-follow\";\n\nexport function useAccountRelationsUpdate(\n reference: string | undefined,\n target: string | undefined,\n auth: AuthContext | undefined,\n onSuccess: (data: Partial | undefined) => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"relation\", \"update\", reference, target],\n mutationFn: async (kind: Kind) => {\n const relationsQuery = getRelationshipBetweenAccountsQueryOptions(\n reference!,\n target!\n );\n await getQueryClient().prefetchQuery(relationsQuery);\n const actualRelation = getQueryClient().getQueryData(\n relationsQuery.queryKey\n );\n\n await broadcastJson(\n reference,\n \"follow\",\n [\n \"follow\",\n {\n follower: reference,\n following: target,\n what: [\n ...(kind === \"toggle-ignore\" && !actualRelation?.ignores\n ? [\"ignore\"]\n : []),\n ...(kind === \"toggle-follow\" && !actualRelation?.follows\n ? [\"blog\"]\n : []),\n ],\n },\n ],\n auth\n );\n\n return {\n ...actualRelation,\n ignores:\n kind === \"toggle-ignore\"\n ? !actualRelation?.ignores\n : actualRelation?.ignores,\n follows:\n kind === \"toggle-follow\"\n ? !actualRelation?.follows\n : actualRelation?.follows,\n } satisfies Partial;\n },\n onError,\n onSuccess(data) {\n onSuccess(data);\n\n getQueryClient().setQueryData(\n QueryKeys.accounts.relations(reference!, target!),\n data\n );\n\n // Invalidate account query to refetch follow stats (follower_count, following_count)\n // This is needed because profile pages use staleTime: Infinity for performance\n if (target) {\n getQueryClient().invalidateQueries(\n getAccountFullQueryOptions(target)\n );\n }\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Content Operations\n * Operations for creating, voting, and managing content on Hive blockchain\n */\n\n/**\n * Builds a vote operation.\n * @param voter - Account casting the vote\n * @param author - Author of the post/comment\n * @param permlink - Permlink of the post/comment\n * @param weight - Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote)\n * @returns Vote operation\n */\nexport function buildVoteOp(\n voter: string,\n author: string,\n permlink: string,\n weight: number\n): Operation {\n if (!voter || !author || !permlink) {\n throw new Error(\"[SDK][buildVoteOp] Missing required parameters\");\n }\n if (weight < -10000 || weight > 10000) {\n throw new Error(\"[SDK][buildVoteOp] Weight must be between -10000 and 10000\");\n }\n\n return [\n \"vote\",\n {\n voter,\n author,\n permlink,\n weight,\n },\n ];\n}\n\n/**\n * Builds a comment operation (for posts or replies).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param parentAuthor - Parent author (empty string for top-level posts)\n * @param parentPermlink - Parent permlink (category/tag for top-level posts)\n * @param title - Title of the post (empty for comments)\n * @param body - Content body (required - cannot be empty)\n * @param jsonMetadata - JSON metadata object\n * @returns Comment operation\n */\nexport function buildCommentOp(\n author: string,\n permlink: string,\n parentAuthor: string,\n parentPermlink: string,\n title: string,\n body: string,\n jsonMetadata: Record\n): Operation {\n // Validate all required parameters including body\n if (!author || !permlink || parentPermlink === undefined || !body) {\n throw new Error(\"[SDK][buildCommentOp] Missing required parameters\");\n }\n\n return [\n \"comment\",\n {\n parent_author: parentAuthor,\n parent_permlink: parentPermlink,\n author,\n permlink,\n title,\n body,\n json_metadata: JSON.stringify(jsonMetadata),\n },\n ];\n}\n\n/**\n * Builds a comment options operation (for setting beneficiaries, rewards, etc.).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param maxAcceptedPayout - Maximum accepted payout (e.g., \"1000000.000 HBD\")\n * @param percentHbd - Percent of payout in HBD (10000 = 100%)\n * @param allowVotes - Allow votes on this content\n * @param allowCurationRewards - Allow curation rewards\n * @param extensions - Extensions array (for beneficiaries, etc.)\n * @returns Comment options operation\n */\nexport function buildCommentOptionsOp(\n author: string,\n permlink: string,\n maxAcceptedPayout: string,\n percentHbd: number,\n allowVotes: boolean,\n allowCurationRewards: boolean,\n extensions: any[]\n): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildCommentOptionsOp] Missing required parameters\");\n }\n\n return [\n \"comment_options\",\n {\n author,\n permlink,\n max_accepted_payout: maxAcceptedPayout,\n percent_hbd: percentHbd,\n allow_votes: allowVotes,\n allow_curation_rewards: allowCurationRewards,\n extensions,\n },\n ];\n}\n\n/**\n * Builds a delete comment operation.\n * @param author - Author of the comment/post to delete\n * @param permlink - Permlink of the comment/post to delete\n * @returns Delete comment operation\n */\nexport function buildDeleteCommentOp(author: string, permlink: string): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildDeleteCommentOp] Missing required parameters\");\n }\n\n return [\n \"delete_comment\",\n {\n author,\n permlink,\n },\n ];\n}\n\n/**\n * Builds a reblog operation (custom_json).\n * @param account - Account performing the reblog\n * @param author - Original post author\n * @param permlink - Original post permlink\n * @param deleteReblog - If true, removes the reblog\n * @returns Custom JSON operation for reblog\n */\nexport function buildReblogOp(\n account: string,\n author: string,\n permlink: string,\n deleteReblog: boolean = false\n): Operation {\n if (!account || !author || !permlink) {\n throw new Error(\"[SDK][buildReblogOp] Missing required parameters\");\n }\n\n const json: any = {\n account,\n author,\n permlink,\n };\n\n if (deleteReblog) {\n json.delete = \"delete\";\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\"reblog\", json]),\n required_auths: [],\n required_posting_auths: [account],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Wallet Operations\n * Operations for managing tokens, savings, vesting, and conversions\n */\n\n/**\n * Builds a transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer operation\n */\nexport function buildTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferOp] Missing required parameters\");\n }\n\n return [\n \"transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds multiple transfer operations for multiple recipients.\n * @param from - Sender account\n * @param destinations - Comma or space separated list of recipient accounts\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Array of transfer operations\n */\nexport function buildMultiTransferOps(\n from: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!from || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Create a transfer operation for each destination username\n return destArray.map((dest) =>\n buildTransferOp(from, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds a recurrent transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param recurrence - Recurrence in hours\n * @param executions - Number of executions (2 = executes twice)\n * @returns Recurrent transfer operation\n */\nexport function buildRecurrentTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n recurrence: number,\n executions: number\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Missing required parameters\");\n }\n if (recurrence < 24) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours\");\n }\n\n return [\n \"recurrent_transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n recurrence,\n executions,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a transfer to savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer to savings operation\n */\nexport function buildTransferToSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds a transfer from savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID (use timestamp)\n * @returns Transfer from savings operation\n */\nexport function buildTransferFromSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_from_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds a cancel transfer from savings operation.\n * @param from - Account that initiated the savings withdrawal\n * @param requestId - Request ID to cancel\n * @returns Cancel transfer from savings operation\n */\nexport function buildCancelTransferFromSavingsOp(\n from: string,\n requestId: number\n): Operation {\n if (!from || requestId === undefined) {\n throw new Error(\"[SDK][buildCancelTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"cancel_transfer_from_savings\",\n {\n from,\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds operations to claim savings interest.\n * Creates a transfer_from_savings and immediately cancels it to claim interest.\n * @param from - Account claiming interest\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"0.001 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID\n * @returns Array of operations [transfer_from_savings, cancel_transfer_from_savings]\n */\nexport function buildClaimInterestOps(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation[] {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildClaimInterestOps] Missing required parameters\");\n }\n\n return [\n buildTransferFromSavingsOp(from, to, amount, memo, requestId),\n buildCancelTransferFromSavingsOp(from, requestId),\n ];\n}\n\n/**\n * Builds a transfer to vesting operation (power up).\n * @param from - Account sending HIVE\n * @param to - Account receiving Hive Power\n * @param amount - Amount with HIVE symbol (e.g., \"1.000 HIVE\")\n * @returns Transfer to vesting operation\n */\nexport function buildTransferToVestingOp(\n from: string,\n to: string,\n amount: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToVestingOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_vesting\",\n {\n from,\n to,\n amount,\n },\n ];\n}\n\n/**\n * Builds a withdraw vesting operation (power down).\n * @param account - Account withdrawing vesting\n * @param vestingShares - Amount of VESTS to withdraw (e.g., \"1.000000 VESTS\")\n * @returns Withdraw vesting operation\n */\nexport function buildWithdrawVestingOp(\n account: string,\n vestingShares: string\n): Operation {\n if (!account || !vestingShares) {\n throw new Error(\"[SDK][buildWithdrawVestingOp] Missing required parameters\");\n }\n\n return [\n \"withdraw_vesting\",\n {\n account,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a delegate vesting shares operation (HP delegation).\n * @param delegator - Account delegating HP\n * @param delegatee - Account receiving HP delegation\n * @param vestingShares - Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\")\n * @returns Delegate vesting shares operation\n */\nexport function buildDelegateVestingSharesOp(\n delegator: string,\n delegatee: string,\n vestingShares: string\n): Operation {\n if (!delegator || !delegatee || !vestingShares) {\n throw new Error(\"[SDK][buildDelegateVestingSharesOp] Missing required parameters\");\n }\n\n return [\n \"delegate_vesting_shares\",\n {\n delegator,\n delegatee,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a set withdraw vesting route operation.\n * @param fromAccount - Account withdrawing vesting\n * @param toAccount - Account receiving withdrawn vesting\n * @param percent - Percentage to route (0-10000, where 10000 = 100%)\n * @param autoVest - Auto convert to vesting\n * @returns Set withdraw vesting route operation\n */\nexport function buildSetWithdrawVestingRouteOp(\n fromAccount: string,\n toAccount: string,\n percent: number,\n autoVest: boolean\n): Operation {\n if (!fromAccount || !toAccount || percent === undefined) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters\");\n }\n if (percent < 0 || percent > 10000) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000\");\n }\n\n return [\n \"set_withdraw_vesting_route\",\n {\n from_account: fromAccount,\n to_account: toAccount,\n percent,\n auto_vest: autoVest,\n },\n ];\n}\n\n/**\n * Builds a convert operation (HBD to HIVE).\n * @param owner - Account converting HBD\n * @param amount - Amount of HBD to convert (e.g., \"1.000 HBD\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Convert operation\n */\nexport function buildConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildConvertOp] Missing required parameters\");\n }\n\n return [\n \"convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a collateralized convert operation (HIVE to HBD via collateral).\n * @param owner - Account converting HIVE\n * @param amount - Amount of HIVE to convert (e.g., \"1.000 HIVE\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Collateralized convert operation\n */\nexport function buildCollateralizedConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildCollateralizedConvertOp] Missing required parameters\");\n }\n\n return [\n \"collateralized_convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a Hive Engine custom_json operation.\n * @param from - Account performing the operation\n * @param contractAction - Engine contract action (e.g., \"transfer\", \"stake\")\n * @param contractPayload - Payload for the contract action\n * @param contractName - Engine contract name (defaults to \"tokens\")\n * @returns Custom JSON operation\n */\nexport function buildEngineOp(\n from: string,\n contractAction: string,\n contractPayload: Record,\n contractName = \"tokens\"\n): Operation {\n return [\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [from],\n required_posting_auths: [],\n json: JSON.stringify({ contractName, contractAction, contractPayload }),\n }];\n}\n\n/**\n * Builds a scot_claim_token operation (posting authority).\n * @param account - Account claiming rewards\n * @param tokens - Array of token symbols to claim\n * @returns Custom JSON operation\n */\nexport function buildEngineClaimOp(\n account: string,\n tokens: string[]\n): Operation {\n return [\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [account],\n json: JSON.stringify(tokens.map((symbol) => ({ symbol }))),\n }];\n}\n\n/**\n * Builds a delegate RC operation (custom_json).\n * @param from - Account delegating RC\n * @param delegatees - Single delegatee or comma-separated list\n * @param maxRc - Maximum RC to delegate (in mana units)\n * @returns Custom JSON operation for RC delegation\n */\nexport function buildDelegateRcOp(\n from: string,\n delegatees: string,\n maxRc: string | number\n): Operation {\n if (!from || !delegatees || maxRc === undefined) {\n throw new Error(\"[SDK][buildDelegateRcOp] Missing required parameters\");\n }\n\n const delegateeArray = delegatees.includes(\",\")\n ? delegatees.split(\",\").map((d) => d.trim())\n : [delegatees];\n\n return [\n \"custom_json\",\n {\n id: \"rc\",\n json: JSON.stringify([\n \"delegate_rc\",\n {\n from,\n delegatees: delegateeArray,\n max_rc: maxRc,\n },\n ]),\n required_auths: [],\n required_posting_auths: [from],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Social Operations\n * Operations for following, muting, and managing social relationships\n */\n\n/**\n * Builds a follow operation (custom_json).\n * @param follower - Account following\n * @param following - Account to follow\n * @returns Custom JSON operation for follow\n */\nexport function buildFollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildFollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"blog\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unfollow operation (custom_json).\n * @param follower - Account unfollowing\n * @param following - Account to unfollow\n * @returns Custom JSON operation for unfollow\n */\nexport function buildUnfollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnfollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an ignore/mute operation (custom_json).\n * @param follower - Account ignoring\n * @param following - Account to ignore\n * @returns Custom JSON operation for ignore\n */\nexport function buildIgnoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildIgnoreOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"ignore\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unignore/unmute operation (custom_json).\n * @param follower - Account unignoring\n * @param following - Account to unignore\n * @returns Custom JSON operation for unignore\n */\nexport function buildUnignoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnignoreOp] Missing required parameters\");\n }\n\n return buildUnfollowOp(follower, following);\n}\n\n/**\n * Builds a Hive Notify set last read operation (custom_json).\n * @param username - Account setting last read\n * @param date - ISO date string (defaults to now)\n * @returns Array of custom JSON operations for setting last read\n */\nexport function buildSetLastReadOps(username: string, date?: string): Operation[] {\n if (!username) {\n throw new Error(\"[SDK][buildSetLastReadOps] Missing required parameters\");\n }\n\n const lastReadDate = date || new Date().toISOString().split(\".\")[0];\n\n const notifyOp: Operation = [\n \"custom_json\",\n {\n id: \"notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n const ecencyNotifyOp: Operation = [\n \"custom_json\",\n {\n id: \"ecency_notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n return [notifyOp, ecencyNotifyOp];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Governance Operations\n * Operations for witness voting, proposals, and proxy management\n */\n\n/**\n * Builds an account witness vote operation.\n * @param account - Account voting\n * @param witness - Witness account name\n * @param approve - True to approve, false to disapprove\n * @returns Account witness vote operation\n */\nexport function buildWitnessVoteOp(\n account: string,\n witness: string,\n approve: boolean\n): Operation {\n if (!account || !witness || approve === undefined) {\n throw new Error(\"[SDK][buildWitnessVoteOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_vote\",\n {\n account,\n witness,\n approve,\n },\n ];\n}\n\n/**\n * Builds an account witness proxy operation.\n * @param account - Account setting proxy\n * @param proxy - Proxy account name (empty string to remove proxy)\n * @returns Account witness proxy operation\n */\nexport function buildWitnessProxyOp(account: string, proxy: string): Operation {\n if (!account || proxy === undefined) {\n throw new Error(\"[SDK][buildWitnessProxyOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_proxy\",\n {\n account,\n proxy,\n },\n ];\n}\n\n/**\n * Payload for proposal creation\n */\nexport interface ProposalCreatePayload {\n receiver: string;\n subject: string;\n permlink: string;\n start: string;\n end: string;\n dailyPay: string;\n}\n\n/**\n * Builds a create proposal operation.\n * @param creator - Account creating the proposal\n * @param payload - Proposal details (must include start, end, and dailyPay)\n * @returns Create proposal operation\n */\nexport function buildProposalCreateOp(\n creator: string,\n payload: ProposalCreatePayload\n): Operation {\n // Validate required fields including start, end, and dailyPay\n if (\n !creator ||\n !payload.receiver ||\n !payload.subject ||\n !payload.permlink ||\n !payload.start ||\n !payload.end ||\n !payload.dailyPay\n ) {\n throw new Error(\"[SDK][buildProposalCreateOp] Missing required parameters\");\n }\n\n // Validate date format by attempting to parse them\n const startDate = new Date(payload.start);\n const endDate = new Date(payload.end);\n if (startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {\n throw new Error(\n \"[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings\"\n );\n }\n\n return [\n \"create_proposal\",\n {\n creator,\n receiver: payload.receiver,\n start_date: payload.start,\n end_date: payload.end,\n daily_pay: payload.dailyPay,\n subject: payload.subject,\n permlink: payload.permlink,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal votes operation.\n * @param voter - Account voting\n * @param proposalIds - Array of proposal IDs\n * @param approve - True to approve, false to disapprove\n * @returns Update proposal votes operation\n */\nexport function buildProposalVoteOp(\n voter: string,\n proposalIds: number[],\n approve: boolean\n): Operation {\n if (!voter || !proposalIds || proposalIds.length === 0 || approve === undefined) {\n throw new Error(\"[SDK][buildProposalVoteOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal_votes\",\n {\n voter,\n proposal_ids: proposalIds,\n approve,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a remove proposal operation.\n * @param proposalOwner - Owner of the proposal\n * @param proposalIds - Array of proposal IDs to remove\n * @returns Remove proposal operation\n */\nexport function buildRemoveProposalOp(\n proposalOwner: string,\n proposalIds: number[]\n): Operation {\n if (!proposalOwner || !proposalIds || proposalIds.length === 0) {\n throw new Error(\"[SDK][buildRemoveProposalOp] Missing required parameters\");\n }\n\n return [\n \"remove_proposal\",\n {\n proposal_owner: proposalOwner,\n proposal_ids: proposalIds,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal operation.\n * @param proposalId - Proposal ID to update (must be a valid number, including 0)\n * @param creator - Account that created the proposal\n * @param dailyPay - New daily pay amount\n * @param subject - New subject\n * @param permlink - New permlink\n * @returns Update proposal operation\n */\nexport function buildUpdateProposalOp(\n proposalId: number,\n creator: string,\n dailyPay: string,\n subject: string,\n permlink: string\n): Operation {\n // Validate proposalId properly - check for undefined/null instead of falsy\n // This allows proposalId of 0 which is a valid proposal ID\n if (\n proposalId === undefined ||\n proposalId === null ||\n typeof proposalId !== 'number' ||\n !creator ||\n !dailyPay ||\n !subject ||\n !permlink\n ) {\n throw new Error(\"[SDK][buildUpdateProposalOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal\",\n {\n proposal_id: proposalId,\n creator,\n daily_pay: dailyPay,\n subject,\n permlink,\n extensions: [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Community Operations\n * Operations for managing Hive communities\n */\n\n/**\n * Builds a subscribe to community operation (custom_json).\n * @param username - Account subscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for subscribe\n */\nexport function buildSubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildSubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"subscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds an unsubscribe from community operation (custom_json).\n * @param username - Account unsubscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for unsubscribe\n */\nexport function buildUnsubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildUnsubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"unsubscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a set user role in community operation (custom_json).\n * @param username - Account setting the role (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to set role for\n * @param role - Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\")\n * @returns Custom JSON operation for setRole\n */\nexport function buildSetRoleOp(\n username: string,\n community: string,\n account: string,\n role: string\n): Operation {\n if (!username || !community || !account || !role) {\n throw new Error(\n `[SDK][buildSetRoleOp] Missing required parameters: username=${username}, community=${community}, account=${account}, role=${role}`\n );\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"setRole\", { community, account, role }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Community properties for update\n */\nexport interface CommunityProps {\n title: string;\n about: string;\n lang: string;\n description: string;\n flag_text: string;\n is_nsfw: boolean;\n}\n\n/**\n * Builds an update community properties operation (custom_json).\n * @param username - Account updating (must be community admin)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param props - Properties to update\n * @returns Custom JSON operation for updateProps\n */\nexport function buildUpdateCommunityOp(\n username: string,\n community: string,\n props: CommunityProps\n): Operation {\n if (!username || !community || !props) {\n throw new Error(\"[SDK][buildUpdateCommunityOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"updateProps\", { community, props }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a pin/unpin post in community operation (custom_json).\n * @param username - Account pinning (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param pin - True to pin, false to unpin\n * @returns Custom JSON operation for pinPost/unpinPost\n */\nexport function buildPinPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n pin: boolean\n): Operation {\n if (!username || !community || !account || !permlink || pin === undefined) {\n throw new Error(\"[SDK][buildPinPostOp] Missing required parameters\");\n }\n\n const action = pin ? \"pinPost\" : \"unpinPost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute post in community operation (custom_json).\n * @param username - Account muting (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for mutePost/unmutePost\n */\nexport function buildMutePostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string,\n mute: boolean\n): Operation {\n if (\n !username ||\n !community ||\n !account ||\n !permlink ||\n mute === undefined\n ) {\n throw new Error(\"[SDK][buildMutePostOp] Missing required parameters\");\n }\n\n const action = mute ? \"mutePost\" : \"unmutePost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute user in community operation (custom_json).\n * @param username - Account performing mute (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to mute/unmute\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for muteUser/unmuteUser\n */\nexport function buildMuteUserOp(\n username: string,\n community: string,\n account: string,\n notes: string,\n mute: boolean\n): Operation {\n if (!username || !community || !account || mute === undefined) {\n throw new Error(\"[SDK][buildMuteUserOp] Missing required parameters\");\n }\n\n const action = mute ? \"muteUser\" : \"unmuteUser\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a flag post in community operation (custom_json).\n * @param username - Account flagging\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Flag reason/notes\n * @returns Custom JSON operation for flagPost\n */\nexport function buildFlagPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string\n): Operation {\n if (!username || !community || !account || !permlink) {\n throw new Error(\"[SDK][buildFlagPostOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"flagPost\", { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Market Operations\n * Operations for trading on the internal Hive market\n */\n\n/**\n * Transaction type for buy/sell operations\n */\nexport enum BuySellTransactionType {\n Buy = \"buy\",\n Sell = \"sell\",\n}\n\n/**\n * Order ID prefix for different order types\n */\nexport enum OrderIdPrefix {\n EMPTY = \"\",\n SWAP = \"9\",\n}\n\n/**\n * Builds a limit order create operation.\n * @param owner - Account creating the order\n * @param amountToSell - Amount and asset to sell\n * @param minToReceive - Minimum amount and asset to receive\n * @param fillOrKill - If true, order must be filled immediately or cancelled\n * @param expiration - Expiration date (ISO string)\n * @param orderId - Unique order ID\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOp(\n owner: string,\n amountToSell: string,\n minToReceive: string,\n fillOrKill: boolean,\n expiration: string,\n orderId: number\n): Operation {\n if (!owner || !amountToSell || !minToReceive || !expiration || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCreateOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_create\",\n {\n owner,\n orderid: orderId,\n amount_to_sell: amountToSell,\n min_to_receive: minToReceive,\n fill_or_kill: fillOrKill,\n expiration,\n },\n ];\n}\n\n/**\n * Helper to format number to 3 decimal places\n */\nfunction formatNumber(value: number, decimals: number = 3): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Builds a limit order create operation with automatic formatting.\n * This is a convenience method that handles buy/sell logic and formatting.\n *\n * For Buy orders: You're buying HIVE with HBD\n * - amountToSell: HBD amount you're spending\n * - minToReceive: HIVE amount you want to receive\n *\n * For Sell orders: You're selling HIVE for HBD\n * - amountToSell: HIVE amount you're selling\n * - minToReceive: HBD amount you want to receive\n *\n * @param owner - Account creating the order\n * @param amountToSell - Amount to sell (number)\n * @param minToReceive - Minimum to receive (number)\n * @param orderType - Buy or Sell\n * @param idPrefix - Order ID prefix\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOpWithType(\n owner: string,\n amountToSell: number,\n minToReceive: number,\n orderType: BuySellTransactionType,\n idPrefix: OrderIdPrefix = OrderIdPrefix.EMPTY\n): Operation {\n // Validate numeric inputs\n if (\n !owner ||\n orderType === undefined ||\n !Number.isFinite(amountToSell) ||\n amountToSell <= 0 ||\n !Number.isFinite(minToReceive) ||\n minToReceive <= 0\n ) {\n throw new Error(\"[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters\");\n }\n\n // Calculate expiration (27 days from now)\n const expiration = new Date(Date.now());\n expiration.setDate(expiration.getDate() + 27);\n const expirationStr = expiration.toISOString().split(\".\")[0];\n\n // Generate order ID\n const orderId = Number(\n `${idPrefix}${Math.floor(Date.now() / 1000)\n .toString()\n .slice(2)}`\n );\n\n // Format amounts based on order type\n // Buy: Sell HBD to buy HIVE\n // Sell: Sell HIVE to buy HBD\n const formattedAmountToSell =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(amountToSell, 3)} HBD`\n : `${formatNumber(amountToSell, 3)} HIVE`;\n\n const formattedMinToReceive =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(minToReceive, 3)} HIVE`\n : `${formatNumber(minToReceive, 3)} HBD`;\n\n return buildLimitOrderCreateOp(\n owner,\n formattedAmountToSell,\n formattedMinToReceive,\n false,\n expirationStr,\n orderId\n );\n}\n\n/**\n * Builds a limit order cancel operation.\n * @param owner - Account cancelling the order\n * @param orderId - Order ID to cancel\n * @returns Limit order cancel operation\n */\nexport function buildLimitOrderCancelOp(owner: string, orderId: number): Operation {\n if (!owner || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCancelOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_cancel\",\n {\n owner,\n orderid: orderId,\n },\n ];\n}\n\n/**\n * Builds a claim reward balance operation.\n * @param account - Account claiming rewards\n * @param rewardHive - HIVE reward to claim (e.g., \"0.000 HIVE\")\n * @param rewardHbd - HBD reward to claim (e.g., \"0.000 HBD\")\n * @param rewardVests - VESTS reward to claim (e.g., \"0.000000 VESTS\")\n * @returns Claim reward balance operation\n */\nexport function buildClaimRewardBalanceOp(\n account: string,\n rewardHive: string,\n rewardHbd: string,\n rewardVests: string\n): Operation {\n if (!account || !rewardHive || !rewardHbd || !rewardVests) {\n throw new Error(\"[SDK][buildClaimRewardBalanceOp] Missing required parameters\");\n }\n\n return [\n \"claim_reward_balance\",\n {\n account,\n reward_hive: rewardHive,\n reward_hbd: rewardHbd,\n reward_vests: rewardVests,\n },\n ];\n}\n","import type { Operation, Authority } from \"../../../hive-tx\";\n\nexport type { Authority };\n\n/**\n * Account Operations\n * Operations for managing accounts, keys, and permissions\n */\n\n/**\n * Builds an account update operation.\n * @param account - Account name\n * @param owner - Owner authority (optional)\n * @param active - Active authority (optional)\n * @param posting - Posting authority (optional)\n * @param memoKey - Memo public key\n * @param jsonMetadata - Account JSON metadata\n * @returns Account update operation\n */\nexport function buildAccountUpdateOp(\n account: string,\n owner: Authority | undefined,\n active: Authority | undefined,\n posting: Authority | undefined,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !memoKey) {\n throw new Error(\"[SDK][buildAccountUpdateOp] Missing required parameters\");\n }\n\n return [\n \"account_update\",\n {\n account,\n owner,\n active,\n posting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an account update2 operation (for posting_json_metadata).\n * @param account - Account name\n * @param jsonMetadata - Account JSON metadata (legacy, usually empty)\n * @param postingJsonMetadata - Posting JSON metadata string\n * @param extensions - Extensions array\n * @returns Account update2 operation\n */\nexport function buildAccountUpdate2Op(\n account: string,\n jsonMetadata: string,\n postingJsonMetadata: string,\n extensions: any[]\n): Operation {\n if (!account || postingJsonMetadata === undefined) {\n throw new Error(\"[SDK][buildAccountUpdate2Op] Missing required parameters\");\n }\n\n return [\n \"account_update2\",\n {\n account,\n json_metadata: jsonMetadata || \"\",\n posting_json_metadata: postingJsonMetadata,\n extensions: (extensions || []) as [],\n },\n ];\n}\n\n/**\n * Public keys for account creation\n */\nexport interface AccountKeys {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n}\n\n/**\n * Builds an account create operation.\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @param fee - Creation fee (e.g., \"3.000 HIVE\")\n * @returns Account create operation\n */\nexport function buildAccountCreateOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys,\n fee: string\n): Operation {\n if (!creator || !newAccountName || !keys || !fee) {\n throw new Error(\"[SDK][buildAccountCreateOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"account_create\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n fee,\n },\n ] satisfies Operation;\n}\n\n/**\n * Builds a create claimed account operation (using account creation tokens).\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @returns Create claimed account operation\n */\nexport function buildCreateClaimedAccountOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys\n): Operation {\n if (!creator || !newAccountName || !keys) {\n throw new Error(\"[SDK][buildCreateClaimedAccountOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"create_claimed_account\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds a claim account operation.\n * @param creator - Account claiming the token\n * @param fee - Fee for claiming (usually \"0.000 HIVE\" for RC-based claims)\n * @returns Claim account operation\n */\nexport function buildClaimAccountOp(creator: string, fee: string): Operation {\n if (!creator || !fee) {\n throw new Error(\"[SDK][buildClaimAccountOp] Missing required parameters\");\n }\n\n return [\n \"claim_account\",\n {\n creator,\n fee,\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds an operation to grant posting permission to another account.\n * Helper that modifies posting authority to add an account.\n * @param account - Account granting permission\n * @param currentPosting - Current posting authority\n * @param grantedAccount - Account to grant permission to\n * @param weightThreshold - Weight threshold of the granted account\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildGrantPostingPermissionOp(\n account: string,\n currentPosting: Authority,\n grantedAccount: string,\n weightThreshold: number,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !grantedAccount || !memoKey) {\n throw new Error(\"[SDK][buildGrantPostingPermissionOp] Missing required parameters\");\n }\n\n // Find existing account or create new entry to prevent duplicates\n const existingIndex = currentPosting.account_auths.findIndex(\n ([acc]) => acc === grantedAccount\n );\n\n const newAccountAuths = [...currentPosting.account_auths];\n if (existingIndex >= 0) {\n // Update existing entry with new weight\n newAccountAuths[existingIndex] = [grantedAccount, weightThreshold];\n } else {\n // Add new entry\n newAccountAuths.push([grantedAccount, weightThreshold]);\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: newAccountAuths,\n };\n\n // Sort account_auths alphabetically for consistency\n newPosting.account_auths.sort((a, b) => (a[0] > b[0] ? 1 : -1));\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an operation to revoke posting permission from an account.\n * Helper that modifies posting authority to remove an account.\n * @param account - Account revoking permission\n * @param currentPosting - Current posting authority\n * @param revokedAccount - Account to revoke permission from\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildRevokePostingPermissionOp(\n account: string,\n currentPosting: Authority,\n revokedAccount: string,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !revokedAccount || !memoKey) {\n throw new Error(\"[SDK][buildRevokePostingPermissionOp] Missing required parameters\");\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: currentPosting.account_auths.filter(\n ([acc]) => acc !== revokedAccount\n ),\n };\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds a change recovery account operation.\n * @param accountToRecover - Account to change recovery account for\n * @param newRecoveryAccount - New recovery account name\n * @param extensions - Extensions array\n * @returns Change recovery account operation\n */\nexport function buildChangeRecoveryAccountOp(\n accountToRecover: string,\n newRecoveryAccount: string,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newRecoveryAccount) {\n throw new Error(\"[SDK][buildChangeRecoveryAccountOp] Missing required parameters\");\n }\n\n return [\n \"change_recovery_account\",\n {\n account_to_recover: accountToRecover,\n new_recovery_account: newRecoveryAccount,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a request account recovery operation.\n * @param recoveryAccount - Recovery account performing the recovery\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param extensions - Extensions array\n * @returns Request account recovery operation\n */\nexport function buildRequestAccountRecoveryOp(\n recoveryAccount: string,\n accountToRecover: string,\n newOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {\n throw new Error(\"[SDK][buildRequestAccountRecoveryOp] Missing required parameters\");\n }\n\n return [\n \"request_account_recovery\",\n {\n recovery_account: recoveryAccount,\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a recover account operation.\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param recentOwnerAuthority - Recent owner authority (for proof)\n * @param extensions - Extensions array\n * @returns Recover account operation\n */\nexport function buildRecoverAccountOp(\n accountToRecover: string,\n newOwnerAuthority: Authority,\n recentOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newOwnerAuthority || !recentOwnerAuthority) {\n throw new Error(\"[SDK][buildRecoverAccountOp] Missing required parameters\");\n }\n\n return [\n \"recover_account\",\n {\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n recent_owner_authority: recentOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Ecency-Specific Operations\n * Custom operations for Ecency platform features (Points, Boost, Promote, etc.)\n */\n\n/**\n * Builds an Ecency Boost Plus subscription operation (custom_json).\n * @param user - User account\n * @param account - Account to subscribe\n * @param duration - Subscription duration in days (must be a valid finite number)\n * @returns Custom JSON operation for boost plus\n */\nexport function buildBoostPlusOp(\n user: string,\n account: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !account || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildBoostPlusOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_boost_plus\",\n json: JSON.stringify({\n user,\n account,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency RC top-up operation (custom_json): a short-term, RC-only\n * delegation to the user's OWN account, paid for with Ecency Points. Distinct\n * from Boost Plus (which delegates Hive Power). The RC amount is fixed\n * server-side, so the user only chooses a duration. Signed with active\n * authority because it spends Points. The actual on-chain `delegate_rc` is\n * broadcast by the Ecency relay account, not here.\n * @param user - User account (payer and recipient of the RC)\n * @param duration - Delegation duration in days (must be a valid finite number)\n * @returns Custom JSON operation for the RC top-up\n */\nexport function buildRcDelegationOp(user: string, duration: number): Operation {\n if (!user || !Number.isInteger(duration) || duration <= 0) {\n throw new Error(\"[SDK][buildRcDelegationOp] Missing or invalid parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_rc_delegation\",\n json: JSON.stringify({\n user,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency promote operation (custom_json).\n * @param user - User account\n * @param author - Post author\n * @param permlink - Post permlink\n * @param duration - Promotion duration in days (must be a valid finite number)\n * @returns Custom JSON operation for promote\n */\nexport function buildPromoteOp(\n user: string,\n author: string,\n permlink: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !author || !permlink || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildPromoteOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_promote\",\n json: JSON.stringify({\n user,\n author,\n permlink,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency point transfer operation (custom_json).\n * @param sender - Sender account\n * @param receiver - Receiver account\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Custom JSON operation for point transfer\n */\nexport function buildPointTransferOp(\n sender: string,\n receiver: string,\n amount: string,\n memo: string\n): Operation {\n if (!sender || !receiver || !amount) {\n throw new Error(\"[SDK][buildPointTransferOp] Missing required parameters\");\n }\n\n // Normalize \"POINTS\" to \"POINT\" — backend expects singular form\n const normalizedAmount = amount.replace(/POINTS\\b/, \"POINT\");\n\n return [\n \"custom_json\",\n {\n id: \"ecency_point_transfer\",\n json: JSON.stringify({\n sender,\n receiver,\n amount: normalizedAmount,\n memo: memo || \"\",\n }),\n required_auths: [sender],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds multiple Ecency point transfer operations for multiple recipients.\n * @param sender - Sender account\n * @param destinations - Comma or space separated list of recipients\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Array of custom JSON operations for point transfers\n */\nexport function buildMultiPointTransferOps(\n sender: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!sender || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Validate parsed destinations\n if (destArray.length === 0) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing valid destinations\");\n }\n\n // Create a point transfer operation for each destination\n return destArray.map((dest) =>\n buildPointTransferOp(sender, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds an Ecency community rewards registration operation (custom_json).\n * @param name - Account name to register\n * @returns Custom JSON operation for community registration\n */\nexport function buildCommunityRegistrationOp(name: string): Operation {\n if (!name) {\n throw new Error(\"[SDK][buildCommunityRegistrationOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_registration\",\n json: JSON.stringify({\n name,\n }),\n required_auths: [name],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic active authority custom_json operation.\n * Used for various Ecency operations that require active authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with active authority\n */\nexport function buildActiveCustomJsonOp(\n username: string,\n operationId: string,\n json: Record\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildActiveCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [username],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic posting authority custom_json operation.\n * Used for various operations that require posting authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with posting authority\n */\nexport function buildPostingCustomJsonOp(\n username: string,\n operationId: string,\n json: Record | any[]\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildPostingCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildFollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for following an account.\n */\nexport interface FollowPayload {\n /** Account to follow */\n following: string;\n}\n\n/**\n * React Query mutation hook for following an account.\n *\n * This mutation broadcasts a follow operation to the Hive blockchain,\n * adding the target account to the follower's \"blog\" follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const followMutation = useFollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Follow an account\n * followMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useFollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"follow\"],\n username,\n ({ following }) => [\n buildFollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnfollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unfollowing an account.\n */\nexport interface UnfollowPayload {\n /** Account to unfollow */\n following: string;\n}\n\n/**\n * React Query mutation hook for unfollowing an account.\n *\n * This mutation broadcasts an unfollow operation to the Hive blockchain,\n * removing the target account from the follower's follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const unfollowMutation = useUnfollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unfollow an account\n * unfollowMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useUnfollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"unfollow\"],\n username,\n ({ following }) => [\n buildUnfollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n author: string;\n permlink: string;\n}\n\nexport function useBookmarkAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"add\", username],\n mutationFn: async ({ author, permlink }: Payload) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useBookmarkDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"delete\", username],\n mutationFn: async (bookmarkId: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: bookmarkId,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useAccountFavoriteAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"add\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation, InfiniteData } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../../types\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAccountFavoriteDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"delete\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to delete favorite: ${response.status}`);\n }\n return response.json();\n },\n onMutate: async (account: string) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.accounts.favorites(username);\n const infinitePrefix = QueryKeys.accounts.favoritesInfinite(username);\n const checkKey = QueryKeys.accounts.checkFavorite(username, account);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n qc.cancelQueries({ queryKey: checkKey }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((f) => f.account !== account)\n );\n }\n\n const previousCheck = qc.getQueryData(checkKey);\n qc.setQueryData(checkKey, false);\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((f) => f.account !== account),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite, previousCheck };\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError: (err, account, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.accounts.favorites(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n if (context?.previousCheck !== undefined) {\n qc.setQueryData(\n QueryKeys.accounts.checkFavorite(username!, account),\n context.previousCheck\n );\n }\n onError(err);\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\nexport interface Keys {\n owner: PrivateKey;\n active: PrivateKey;\n posting: PrivateKey;\n memo_key: PrivateKey;\n}\n\ninterface Payload {\n keepCurrent?: boolean;\n currentKey: PrivateKey;\n keys: Keys[];\n keysToRevoke?: string[]; // Deprecated: will be treated as revoking from all authorities\n keysToRevokeByAuthority?: Partial>; // Authority-specific revocation\n}\n\nexport function dedupeAndSortKeyAuths(\n existing: Authority[\"key_auths\"],\n additions: [string, number][]\n): Authority[\"key_auths\"] {\n const merged = new Map();\n\n existing.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n additions.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n return Array.from(merged.entries())\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, weight]) => [key, weight] as [string, number]);\n}\n\ntype UpdateKeyAuthsOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdateKeyAuths(\n username: string,\n options?: UpdateKeyAuthsOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"keys-update\", username],\n mutationFn: async ({\n keys,\n keepCurrent = false,\n currentKey,\n keysToRevoke = [],\n keysToRevokeByAuthority = {}\n }: Payload) => {\n if (keys.length === 0) {\n throw new Error(\n \"[SDK][Update password] – no new keys provided\"\n );\n }\n\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update keys for anon user\"\n );\n }\n\n const prepareAuth = (keyName: keyof Keys) => {\n const auth: Authority = JSON.parse(JSON.stringify(accountData[keyName]));\n\n // Get keys to revoke for this specific authority\n const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];\n // Fallback to global keysToRevoke for backwards compatibility\n const allKeysToRevoke = [\n ...keysToRevokeForAuthority,\n ...(keysToRevokeByAuthority[keyName] === undefined ? keysToRevoke : [])\n ];\n\n // Filter out keys to revoke from existing keys (authority-specific)\n const existingKeys = keepCurrent\n ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString()))\n : [];\n\n auth.key_auths = dedupeAndSortKeyAuths(\n existingKeys,\n keys.map(\n (values, i) =>\n [values[keyName].createPublic().toString(), i + 1] as [\n string,\n number,\n ]\n )\n );\n\n return auth;\n };\n\n return broadcastOperations(\n [[\"account_update\", {\n account: username,\n json_metadata: accountData.json_metadata,\n owner: prepareAuth(\"owner\"),\n active: prepareAuth(\"active\"),\n posting: prepareAuth(\"posting\"),\n // Always use new memo key when adding new keys\n memo_key: keys[0].memo_key.createPublic().toString(),\n }]],\n currentKey\n );\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { useAccountUpdateKeyAuths } from \"./use-account-update-key-auths\";\n\ninterface Payload {\n newPassword: string;\n currentPassword: string;\n keepCurrent?: boolean;\n}\n\n/**\n * Only native Hive and custom passwords could be updated here\n * Seed based password cannot be updated here, it will be in an account always for now\n */\ntype UpdatePasswordOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdatePassword(\n username: string,\n options?: UpdatePasswordOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);\n\n return useMutation({\n mutationKey: [\"accounts\", \"password-update\", username],\n mutationFn: async ({\n newPassword,\n currentPassword,\n keepCurrent,\n }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update password for anon user\"\n );\n }\n const currentKey = PrivateKey.fromLogin(\n username,\n currentPassword,\n \"owner\"\n );\n\n return updateKeys({\n currentKey,\n keepCurrent,\n keys: [\n {\n owner: PrivateKey.fromLogin(username, newPassword, \"owner\"),\n active: PrivateKey.fromLogin(username, newPassword, \"active\"),\n posting: PrivateKey.fromLogin(username, newPassword, \"posting\"),\n memo_key: PrivateKey.fromLogin(username, newPassword, \"memo\"),\n },\n ],\n });\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { FullAccount } from \"../types\";\nimport hs from \"hivesigner\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n}\n\ntype RevokePostingOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountRevokePosting(\n username: string | undefined,\n options: RevokePostingOptions,\n auth?: AuthContext\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-posting\", data?.name],\n mutationFn: async ({ accountName, type, key }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot revoke posting for anonymous user\"\n );\n }\n\n const posting = JSON.parse(JSON.stringify(data.posting)) as FullAccount[\"posting\"];\n\n posting.account_auths = posting.account_auths.filter(\n ([account]) => account !== accountName\n );\n\n const operationBody = {\n account: data.name,\n posting,\n memo_key: data.memo_key,\n json_metadata: data.json_metadata,\n };\n\n if (type === \"key\" && key) {\n return broadcastOperations([[\"account_update\", operationBody]], key);\n } else if (type === \"keychain\") {\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.broadcast([[\"account_update\", operationBody]], \"active\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"account_update\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: (resp, payload, ctx) => {\n (options.onSuccess as\n | ((data: unknown, variables: CommonPayload, context: unknown) => unknown)\n | undefined)?.(resp, payload, ctx);\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) =>\n ({\n ...data,\n posting: {\n ...data?.posting,\n account_auths:\n data?.posting?.account_auths?.filter(\n ([account]) => account !== payload.accountName\n ) ?? [],\n },\n }) as FullAccount\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\" | \"ecency\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n email?: string;\n}\n\ntype UpdateRecoveryOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountUpdateRecovery(\n username: string | undefined,\n code: string | undefined,\n options: UpdateRecoveryOptions,\n auth?: AuthContext\n) {\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"recovery\", data?.name],\n mutationFn: async ({ accountName, type, key, email }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot change recovery for anonymous user\"\n );\n }\n\n const operationBody = {\n account_to_recover: data.name,\n new_recovery_account: accountName,\n extensions: [] as [],\n };\n\n if (type === \"ecency\") {\n if (!code) {\n throw new Error(\"[SDK][Accounts] – missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/recoveries-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n email,\n publicKeys: [\n ...data.owner.key_auths,\n ...data.active.key_auths,\n ...data.posting.key_auths,\n data.memo_key,\n ],\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx, so guard explicitly — otherwise the\n // caller's onSuccess shows a \"recovery updated\" toast on a failed request.\n // (The missing Content-Type header also made the backend skip JSON parsing.)\n if (!response.ok) {\n throw new Error(`[SDK][Accounts] Failed to add recovery: ${response.status}`);\n }\n\n return response;\n } else if (type === \"key\" && key) {\n return broadcastOperations(\n [[\"change_recovery_account\", operationBody]],\n key\n );\n } else if (type === \"keychain\") {\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.broadcast([[\"change_recovery_account\", operationBody]], \"owner\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"change_recovery_account\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: options.onSuccess,\n });\n}\n","import { PublicKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport { FullAccount } from \"../types\";\n\n/**\n * Check whether an authority would still meet its weight_threshold\n * after removing the given keys. This prevents revoking keys that\n * would leave an authority unable to sign (especially for multisig).\n */\nexport function canRevokeFromAuthority(\n auth: Authority,\n revokingKeyStrs: Set\n): boolean {\n const remainingWeight = auth.key_auths\n .filter(([key]) => !revokingKeyStrs.has(String(key)))\n .reduce((sum, [, weight]) => sum + weight, 0);\n\n // account_auths also contribute weight\n const accountWeight = (auth.account_auths ?? []).reduce(\n (sum: number, [, weight]: [string, number]) => sum + weight,\n 0\n );\n\n return (remainingWeight + accountWeight) >= auth.weight_threshold;\n}\n\n/**\n * Build an account_update operation that removes the given public keys\n * from the relevant authorities.\n *\n * Only includes the `owner` field when a revoking key actually exists\n * in the owner authority - omitting it allows active-level signing.\n *\n * Returns the operation payload (without the \"account_update\" tag) so\n * callers can wrap it as needed for their broadcast method.\n */\nexport function buildRevokeKeysOp(\n accountData: FullAccount,\n revokingKeys: PublicKey[]\n) {\n const revokingKeyStrs = new Set(revokingKeys.map((k) => k.toString()));\n\n const hasAnyKeyInAuth = (auth: Authority) =>\n auth.key_auths.some(\n ([key]: [string | PublicKey, number]) => revokingKeyStrs.has(String(key))\n );\n\n const prepareAuth = (auth: Authority): Authority => {\n const clone: Authority = JSON.parse(JSON.stringify(auth));\n clone.key_auths = clone.key_auths.filter(\n ([key]) => !revokingKeyStrs.has(key.toString())\n );\n return clone;\n };\n\n const needsOwnerUpdate = hasAnyKeyInAuth(accountData.owner);\n\n return {\n account: accountData.name,\n json_metadata: accountData.json_metadata,\n owner: needsOwnerUpdate ? prepareAuth(accountData.owner) : undefined,\n active: prepareAuth(accountData.active),\n posting: prepareAuth(accountData.posting),\n memo_key: accountData.memo_key\n };\n}\n","import { PrivateKey, PublicKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { buildRevokeKeysOp } from \"./build-revoke-keys-op\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ninterface Payload {\n currentKey: PrivateKey;\n /** Keys to revoke. Accepts a single key or an array. */\n revokingKey: PublicKey | PublicKey[];\n}\n\n/**\n * Revoke one or more keys from an account on the Hive blockchain.\n *\n * When revoking keys that exist only in active/posting authorities,\n * the owner field is omitted from the operation so active-level\n * signing is sufficient.\n */\ntype RevokeKeyOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountRevokeKey(\n username: string | undefined,\n options?: RevokeKeyOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-key\", accountData?.name],\n mutationFn: async ({ currentKey, revokingKey }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Revoke key] – cannot update keys for anon user\"\n );\n }\n\n const revokingKeys = Array.isArray(revokingKey) ? revokingKey : [revokingKey];\n const op = buildRevokeKeysOp(accountData, revokingKeys);\n\n return broadcastOperations([[\"account_update\", op]], currentKey);\n },\n ...options,\n });\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildClaimAccountOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for claiming account creation tokens.\n */\nexport interface ClaimAccountPayload {\n /** Creator account claiming the token */\n creator: string;\n /** Fee for claiming (usually \"0.000 HIVE\" for RC-based claims) */\n fee?: string;\n}\n\n/**\n * React Query mutation hook for claiming account creation tokens.\n *\n * This mutation broadcasts a claim_account operation to claim an account\n * creation token using Resource Credits (RC). The claimed token can later\n * be used to create a new account for free using the create_claimed_account\n * operation.\n *\n * @param username - The username claiming the account token (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account cache to update pending_claimed_accounts count\n * - Updates account query data to set pending_claimed_accounts = 0 optimistically\n *\n * **Operation Details:**\n * - Uses native claim_account operation\n * - Fee: \"0.000 HIVE\" (uses RC instead of HIVE)\n * - Authority: Active key (required for claiming)\n *\n * **RC Requirements:**\n * - Requires sufficient Resource Credits (RC)\n * - RC amount varies based on network conditions\n * - Claiming without sufficient RC will fail\n *\n * **Use Case:**\n * - Claim tokens in advance when RC is available\n * - Create accounts later without paying HIVE fee\n * - Useful for onboarding services and apps\n *\n * @example\n * ```typescript\n * const claimMutation = useClaimAccount(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Claim account token using RC\n * claimMutation.mutate({\n * creator: 'alice',\n * fee: '0.000 HIVE'\n * });\n * ```\n */\nexport function useClaimAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"claimAccount\"],\n username,\n ({ creator, fee = \"0.000 HIVE\" }) => [\n buildClaimAccountOp(creator, fee)\n ],\n async (_result: any, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(variables.creator),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildGrantPostingPermissionOp, type Authority } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface GrantPostingPermissionPayload {\n currentPosting: Authority;\n grantedAccount: string;\n weightThreshold: number;\n memoKey: string;\n jsonMetadata: string;\n}\n\nexport function useGrantPostingPermission(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"grant-posting-permission\"],\n username,\n (payload) => [\n buildGrantPostingPermissionOp(\n username!,\n payload.currentPosting,\n payload.grantedAccount,\n payload.weightThreshold,\n payload.memoKey,\n payload.jsonMetadata\n )\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildAccountCreateOp, buildCreateClaimedAccountOp, type AccountKeys } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface CreateAccountPayload {\n newAccountName: string;\n keys: AccountKeys;\n fee: string;\n /** If true, uses a claimed account token instead of paying the fee */\n useClaimed?: boolean;\n}\n\nexport function useCreateAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"create\"],\n username,\n (payload) => [\n payload.useClaimed\n ? buildCreateClaimedAccountOp(username!, payload.newAccountName, payload.keys)\n : buildAccountCreateOp(username!, payload.newAccountName, payload.keys, payload.fee)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { parseAsset } from \"@/modules/core/utils\";\nimport { DynamicProps } from \"@/modules/core/types\";\nimport { FullAccount } from \"../types\";\nimport { calculateVPMana, calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\n\nconst HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24; // 5 days\nconst HIVE_100_PERCENT = 10000;\nconst HIVE_VOTE_DUST_THRESHOLD = 50_000_000;\n\nfunction getEffectiveVests(account: FullAccount): number {\n const vesting = parseAsset(account.vesting_shares).amount;\n const received = parseAsset(account.received_vesting_shares).amount;\n const delegated = parseAsset(account.delegated_vesting_shares).amount;\n const withdrawRate = parseAsset(account.vesting_withdraw_rate).amount;\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n\n return vesting + received - delegated - withdrawVests;\n}\n\nfunction vestsToRshares(vests: number, votingPowerValue: number, votePerc: number): number {\n const vestingShares = vests * 1e6;\n const power = (votingPowerValue * votePerc) / 1e4 / 50 + 1;\n return (power * vestingShares) / 1e4;\n}\n\nfunction hasStableVoteHardfork(dynamicProps: DynamicProps): boolean {\n if (Number.isFinite(dynamicProps.lastHardfork)) {\n return dynamicProps.lastHardfork >= 28;\n }\n\n const [major = \"0\", minor = \"0\"] = (dynamicProps.currentHardforkVersion ?? \"0.0.0\").split(\".\");\n return Number(major) > 1 || (Number(major) === 1 && Number(minor) >= 28);\n}\n\nfunction stableVoteRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n weight: number\n): number {\n const reserveRate =\n dynamicProps.votePowerReserveRate ||\n Number(dynamicProps.raw?.globalDynamic?.vote_power_reserve_rate ?? 0);\n\n if (!Number.isFinite(reserveRate) || reserveRate <= 0) {\n return 0;\n }\n\n const effectiveVests = getEffectiveVests(account);\n if (!Number.isFinite(effectiveVests) || effectiveVests <= 0) {\n return 0;\n }\n\n const vestingShares = effectiveVests * 1e6;\n const usedMana =\n Math.ceil(\n (vestingShares * weight * 60 * 60 * 24) /\n HIVE_100_PERCENT /\n (reserveRate * HIVE_VOTING_MANA_REGENERATION_SECONDS)\n );\n\n const mana = calculateVPMana(account);\n const currentMana = Math.min(mana.current_mana, mana.max_mana);\n\n if (!Number.isFinite(currentMana) || usedMana > currentMana) {\n return 0;\n }\n\n return Math.max(usedMana - HIVE_VOTE_DUST_THRESHOLD, 0);\n}\n\nexport function votingRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n\n if (hasStableVoteHardfork(dynamicProps)) {\n return stableVoteRshares(account, dynamicProps, weight);\n }\n\n let totalVests = 0;\n try {\n totalVests = getEffectiveVests(account);\n if (!Number.isFinite(totalVests)) {\n return 0;\n }\n } catch {\n return 0;\n }\n\n return vestsToRshares(totalVests, votingPowerValue, weight);\n}\n\nexport function votingPower(account: FullAccount): number {\n const calc = calculateVPMana(account);\n return calc.percentage / 100;\n}\n\nexport function powerRechargeTime(power: number) {\n if (!Number.isFinite(power)) {\n throw new TypeError(\"Voting power must be a finite number\");\n }\n if (power < 0 || power > 100) {\n throw new RangeError(\"Voting power must be between 0 and 100\");\n }\n const missingPower = 100 - power;\n return (\n (missingPower * 100 * HIVE_VOTING_MANA_REGENERATION_SECONDS) / 10000\n );\n}\n\nexport function downVotingPower(account: FullAccount): number {\n const totalShares =\n parseFloat(account.vesting_shares) +\n parseFloat(account.received_vesting_shares) -\n parseFloat(account.delegated_vesting_shares);\n const elapsed = Math.floor(Date.now() / 1000) - account.downvote_manabar.last_update_time;\n const maxMana = (totalShares * 1000000) / 4;\n\n if (maxMana <= 0) {\n return 0;\n }\n\n let currentMana =\n parseFloat(account.downvote_manabar.current_mana.toString()) +\n (elapsed * maxMana) / HIVE_VOTING_MANA_REGENERATION_SECONDS;\n\n if (currentMana > maxMana) {\n currentMana = maxMana;\n }\n const currentManaPerc = (currentMana * 100) / maxMana;\n\n if (isNaN(currentManaPerc)) {\n return 0;\n }\n\n if (currentManaPerc > 100) {\n return 100;\n }\n return currentManaPerc;\n}\n\nexport function rcPower(account: RCAccount): number {\n const calc = calculateRCMana(account);\n return calc.percentage / 100;\n}\n\nexport function votingValue(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n const { fundRecentClaims, fundRewardBalance, base, quote } = dynamicProps;\n\n if (\n !Number.isFinite(fundRecentClaims) ||\n !Number.isFinite(fundRewardBalance) ||\n !Number.isFinite(base) ||\n !Number.isFinite(quote)\n ) {\n return 0;\n }\n\n if (fundRecentClaims === 0 || quote === 0) {\n return 0;\n }\n\n const rShares = votingRshares(account, dynamicProps, votingPowerValue, weight);\n\n if (!Number.isFinite(rShares)) {\n return 0;\n }\n\n return (rShares / fundRecentClaims) * fundRewardBalance * (base / quote);\n}\n","import type { Operation } from \"../../hive-tx\";\n\n/**\n * Authority levels for Hive blockchain operations.\n * - posting: Social operations (voting, commenting, reblogging)\n * - active: Financial and account management operations\n * - owner: Critical security operations (key changes, account recovery)\n * - memo: Memo encryption/decryption (rarely used for signing)\n */\nexport type AuthorityLevel = 'posting' | 'active' | 'owner' | 'memo';\n\n/**\n * Maps operation types to their required authority level.\n *\n * This mapping is used to determine which key is needed to sign a transaction,\n * enabling smart auth fallback and auth upgrade UI.\n *\n * @remarks\n * - Most social operations (vote, comment, reblog) require posting authority\n * - Financial operations (transfer, withdraw) require active authority\n * - Account management operations require active authority\n * - Security operations (password change, account recovery) require owner authority\n * - custom_json requires dynamic detection based on required_auths vs required_posting_auths\n */\nexport const OPERATION_AUTHORITY_MAP: Record = {\n // Posting authority operations\n vote: 'posting',\n comment: 'posting',\n delete_comment: 'posting',\n comment_options: 'posting',\n claim_reward_balance: 'posting',\n\n // Active authority operations - Financial\n cancel_transfer_from_savings: 'active',\n collateralized_convert: 'active',\n convert: 'active',\n delegate_vesting_shares: 'active',\n recurrent_transfer: 'active',\n set_withdraw_vesting_route: 'active',\n transfer: 'active',\n transfer_from_savings: 'active',\n transfer_to_savings: 'active',\n transfer_to_vesting: 'active',\n withdraw_vesting: 'active',\n\n // Active authority operations - Market\n limit_order_create: 'active',\n limit_order_cancel: 'active',\n\n // Active authority operations - Account Management\n account_update: 'active',\n account_update2: 'active',\n claim_account: 'active',\n create_claimed_account: 'active',\n\n // Active authority operations - Governance\n account_witness_proxy: 'active',\n account_witness_vote: 'active',\n remove_proposal: 'active',\n update_proposal_votes: 'active',\n\n // Owner authority operations - Security & Account Recovery\n change_recovery_account: 'owner',\n request_account_recovery: 'owner',\n recover_account: 'owner',\n reset_account: 'owner',\n set_reset_account: 'owner',\n\n // Note: Some operations are handled separately via content inspection:\n // - custom_json: via getCustomJsonAuthority() - posting or active based on required_auths\n // - create_proposal/update_proposal: via getProposalAuthority() - typically active\n};\n\n/**\n * Determines authority required for a custom_json operation.\n *\n * Custom JSON operations can require either posting or active authority\n * depending on which field is populated:\n * - required_auths (active authority)\n * - required_posting_auths (posting authority)\n *\n * @param customJsonOp - The custom_json operation to inspect\n * @returns 'active' if requires active authority, 'posting' if requires posting authority\n *\n * @example\n * ```typescript\n * // Reblog operation (posting authority)\n * const reblogOp: Operation = ['custom_json', {\n * required_auths: [],\n * required_posting_auths: ['alice'],\n * id: 'reblog',\n * json: '...'\n * }];\n * getCustomJsonAuthority(reblogOp); // Returns 'posting'\n *\n * // Some active authority custom_json\n * const activeOp: Operation = ['custom_json', {\n * required_auths: ['alice'],\n * required_posting_auths: [],\n * id: 'some_active_op',\n * json: '...'\n * }];\n * getCustomJsonAuthority(activeOp); // Returns 'active'\n * ```\n */\nexport function getCustomJsonAuthority(customJsonOp: Operation): AuthorityLevel {\n const opType = customJsonOp[0];\n const payload = customJsonOp[1];\n\n if (opType !== 'custom_json') {\n throw new Error('Operation is not a custom_json operation');\n }\n\n // Type assertion for custom_json payload\n const customJson = payload as {\n required_auths?: string[];\n required_posting_auths?: string[];\n id: string;\n json: string;\n };\n\n // If required_auths is set and non-empty, needs active authority\n if (customJson.required_auths && customJson.required_auths.length > 0) {\n return 'active';\n }\n\n // If only required_posting_auths is set, needs posting authority\n if (customJson.required_posting_auths && customJson.required_posting_auths.length > 0) {\n return 'posting';\n }\n\n // Default to posting for custom_json (most common case)\n return 'posting';\n}\n\n/**\n * Determines authority required for a proposal operation.\n *\n * Proposal operations (create_proposal, update_proposal) typically require\n * active authority as they involve financial commitments and funding allocations.\n *\n * @param proposalOp - The proposal operation to inspect\n * @returns 'active' authority requirement\n *\n * @remarks\n * Unlike custom_json, proposal operations don't have explicit required_auths fields.\n * They always use the creator's authority, which defaults to active for financial\n * operations involving the DAO treasury.\n *\n * @example\n * ```typescript\n * const proposalOp: Operation = ['create_proposal', {\n * creator: 'alice',\n * receiver: 'bob',\n * subject: 'My Proposal',\n * permlink: 'my-proposal',\n * start: '2026-03-01T00:00:00',\n * end: '2026-04-01T00:00:00',\n * daily_pay: '100.000 HBD',\n * extensions: []\n * }];\n * getProposalAuthority(proposalOp); // Returns 'active'\n * ```\n */\nexport function getProposalAuthority(proposalOp: Operation): AuthorityLevel {\n const opType = proposalOp[0];\n\n if (opType !== 'create_proposal' && opType !== 'update_proposal') {\n throw new Error('Operation is not a proposal operation');\n }\n\n // Proposal operations require active authority for financial operations\n return 'active';\n}\n\n/**\n * Determines the required authority level for any operation.\n *\n * Uses the OPERATION_AUTHORITY_MAP for standard operations, and dynamic\n * detection for custom_json operations.\n *\n * @param op - The operation to check\n * @returns 'posting' or 'active' authority requirement\n *\n * @example\n * ```typescript\n * const voteOp: Operation = ['vote', { voter: 'alice', author: 'bob', permlink: 'post', weight: 10000 }];\n * getOperationAuthority(voteOp); // Returns 'posting'\n *\n * const transferOp: Operation = ['transfer', { from: 'alice', to: 'bob', amount: '1.000 HIVE', memo: '' }];\n * getOperationAuthority(transferOp); // Returns 'active'\n * ```\n */\nexport function getOperationAuthority(op: Operation): AuthorityLevel {\n const opType = op[0];\n\n // Special handling for custom_json - requires content inspection\n if (opType === 'custom_json') {\n return getCustomJsonAuthority(op);\n }\n\n // Special handling for proposal operations - requires content inspection\n if (opType === 'create_proposal' || opType === 'update_proposal') {\n return getProposalAuthority(op);\n }\n\n // Use mapping for standard operations, default to posting if unknown\n return OPERATION_AUTHORITY_MAP[opType] ?? 'posting';\n}\n\n/**\n * Determines the highest authority level required for a list of operations.\n *\n * Useful when broadcasting multiple operations together - the highest authority\n * level required by any operation determines what key is needed for the batch.\n *\n * Authority hierarchy: owner > active > posting > memo\n *\n * @param ops - Array of operations\n * @returns Highest authority level required ('owner', 'active', or 'posting')\n *\n * @example\n * ```typescript\n * const ops: Operation[] = [\n * ['vote', { ... }], // posting\n * ['comment', { ... }], // posting\n * ];\n * getRequiredAuthority(ops); // Returns 'posting'\n *\n * const mixedOps: Operation[] = [\n * ['comment', { ... }], // posting\n * ['transfer', { ... }], // active\n * ];\n * getRequiredAuthority(mixedOps); // Returns 'active'\n *\n * const securityOps: Operation[] = [\n * ['transfer', { ... }], // active\n * ['change_recovery_account', { ... }], // owner\n * ];\n * getRequiredAuthority(securityOps); // Returns 'owner'\n * ```\n */\nexport function getRequiredAuthority(ops: Operation[]): AuthorityLevel {\n let highestAuthority: AuthorityLevel = 'posting';\n\n for (const op of ops) {\n const authority = getOperationAuthority(op);\n\n // Owner is highest - return immediately\n if (authority === 'owner') {\n return 'owner';\n }\n\n // Active is higher than posting\n if (authority === 'active' && highestAuthority === 'posting') {\n highestAuthority = 'active';\n }\n\n // Memo is lowest (same level as posting)\n // If we see memo but only have posting, stick with posting\n }\n\n return highestAuthority;\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { isWif, broadcastOperations } from \"@/modules/core/hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useSignOperationByKey(username: string | undefined) {\n return useMutation({\n mutationKey: [\"operations\", \"sign\", username],\n mutationFn: ({\n operation,\n keyOrSeed,\n }: {\n operation: Operation;\n keyOrSeed: string;\n }) => {\n if (!username) {\n throw new Error(\"[Operations][Sign] – cannot sign op with anon user\");\n }\n\n let privateKey: PrivateKey;\n if (keyOrSeed.split(\" \").length === 12) {\n privateKey = PrivateKey.fromLogin(username, keyOrSeed, \"active\");\n } else if (isWif(keyOrSeed)) {\n privateKey = PrivateKey.fromString(keyOrSeed);\n } else {\n privateKey = PrivateKey.from(keyOrSeed);\n }\n\n return broadcastOperations(\n [operation],\n privateKey\n );\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AuthContext } from \"@/modules/core/types\";\n\nexport function useSignOperationByKeychain(\n username: string | undefined,\n auth?: AuthContext,\n keyType: \"owner\" | \"active\" | \"posting\" | \"memo\" = \"active\"\n) {\n return useMutation({\n mutationKey: [\"operations\", \"sign-keychain\", username],\n mutationFn: ({ operation }: { operation: Operation }) => {\n if (!username) {\n throw new Error(\n \"[SDK][Keychain] – cannot sign operation with anon user\"\n );\n }\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Keychain] – missing keychain broadcaster\");\n }\n\n return auth.broadcast([operation], keyType);\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function useSignOperationByHivesigner(callbackUri = \"/\") {\n return useMutation({\n mutationKey: [\"operations\", \"sign-hivesigner\", callbackUri],\n mutationFn: async ({ operation }: { operation: Operation }) => {\n return hs.sendOperation(operation, { callback: callbackUri }, () => {});\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getChainPropertiesQueryOptions() {\n return queryOptions({\n queryKey: [\"operations\", \"chain-properties\"],\n queryFn: async () => {\n return await callRPC(\"condenser_api.get_chain_properties\", []);\n },\n });\n}\n","import { Fragment } from \"../types\";\n\n/**\n * Build the cache entry for an edited fragment.\n *\n * The `/private-api/fragments-update` endpoint returns only a minimal\n * acknowledgement, not the full fragment. Writing that response straight into\n * the query cache blanked out the edited snippet (the reported bug), so the\n * updated record is built from the values the user actually submitted, merged\n * over whatever fields the response does carry, on top of the existing cached\n * fragment (preserving id/created).\n */\nexport function applyFragmentUpdate(\n existing: Fragment,\n response: Partial | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...existing,\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n };\n}\n\n/**\n * Build the cache entry for a newly added fragment. Reaffirms the submitted\n * title/body over the server acknowledgement so a fresh snippet never renders\n * blank if the response omits them, while keeping any server-provided\n * id/timestamps.\n */\nexport function buildAddedFragment(\n response: Fragment | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n } as Fragment;\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { buildAddedFragment } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAddFragment(username: string, code: string | undefined) {\n return useMutation({\n mutationKey: [\"posts\", \"add-fragment\", username],\n mutationFn: async ({ title, body }: { title: string; body: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-add\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and insert a bogus fragment into the cache. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to add fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // Reaffirm the submitted title/body over the server acknowledgement so a\n // freshly added snippet never renders blank if the response omits them,\n // while keeping any server-provided id/timestamps.\n const newFragment = buildAddedFragment(response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [newFragment, ...(data ?? [])]\n );\n\n // Update infinite query cache - add new fragment to first page\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page, index) =>\n index === 0\n ? { ...page, data: [newFragment, ...page.data] }\n : page\n ),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { applyFragmentUpdate } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useEditFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"edit-fragment\", username],\n mutationFn: async ({\n fragmentId,\n title,\n body\n }: {\n fragmentId: string;\n title: string;\n body: string;\n }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-update\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and overwrite the cached fragment with bogus data. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to update fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // The /fragments-update endpoint returns a minimal acknowledgement, not the\n // full fragment, so writing the raw response into the cache blanked out the\n // edited snippet. Rebuild the fragment from the submitted values instead.\n const applyUpdate = (fragment: Fragment): Fragment =>\n applyFragmentUpdate(fragment, response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) =>\n data?.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ) ?? []\n );\n\n // Update infinite query cache - update fragment in all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useRemoveFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"remove-fragment\", username],\n mutationFn: async ({ fragmentId }: { fragmentId: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/fragments-delete\", {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // getBoundFetch returns the raw fetch, so a 401/403/500 resolves rather than\n // rejects. Without this guard onSuccess would run and strip the fragment from\n // cache on a failed delete (false success). Throw so onError fires instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to delete fragment: ${response.status}`);\n }\n\n return response;\n },\n onSuccess(_data, variables) {\n const queryClient = getQueryClient();\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [...(data ?? [])].filter(({ id }) => id !== variables.fragmentId)\n );\n\n // Update infinite query cache - remove fragment from all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((fragment) => fragment.id !== variables.fragmentId),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { ApiNotification, ApiNotificationSetting } from \"@/modules/notifications\";\nimport { Draft, DraftMetadata } from \"@/modules/posts/types/draft\";\nimport { Schedule } from \"@/modules/posts/types/schedule\";\nimport { ApiResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n if (!response.ok) {\n let errorData: unknown = undefined;\n try {\n errorData = await response.json();\n } catch {\n errorData = undefined;\n }\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = errorData;\n throw error;\n }\n\n // Handle empty responses gracefully (e.g., 204 No Content or empty body)\n const text = await response.text();\n if (!text || text.trim() === \"\") {\n return \"\" as T;\n }\n\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n // If JSON parsing fails, return empty string as fallback\n console.warn(\"[SDK] Failed to parse JSON response:\", e, \"Response:\", text);\n return \"\" as T;\n }\n}\n\nexport async function signUp(\n username: string,\n email: string,\n referral: string,\n captchaToken?: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/account-create\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, email, referral, captcha_token: captchaToken }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function subscribeEmail(\n email: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/subscribe\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function usrActivity(\n code: string | undefined,\n ty: number,\n bl: string | number = \"\",\n tx: string | number = \"\"\n): Promise {\n const params: {\n code: string | undefined;\n ty: number;\n bl?: string | number;\n tx?: string | number;\n } = { code, ty };\n\n if (bl) {\n params.bl = bl;\n }\n if (tx) {\n params.tx = tx;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/usr-activity\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(params),\n });\n\n await parseJsonResponse(response);\n}\n\nexport async function getNotifications(\n code: string | undefined,\n filter: string | null,\n since: string | null = null,\n user: string | null = null\n): Promise {\n const data: { code: string | undefined; filter?: string; since?: string; user?: string } = {\n code,\n };\n\n if (filter) {\n data.filter = filter;\n }\n\n if (since) {\n data.since = since;\n }\n\n if (user) {\n data.user = user;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function saveNotificationSetting(\n code: string | undefined,\n username: string,\n system: string,\n allows_notify: number,\n notify_types: number[],\n token: string\n): Promise {\n const data = {\n code,\n username,\n token,\n system,\n allows_notify,\n notify_types,\n };\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/register-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getNotificationSetting(\n code: string | undefined,\n username: string,\n token: string\n): Promise {\n const data = { code, username, token };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/detail-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function markNotifications(\n code: string | undefined,\n id?: string\n): Promise> {\n const data: { code: string | undefined; id?: string } = {\n code,\n };\n if (id) {\n data.id = id;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications/mark\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addImage(code: string | undefined, url: string): Promise> {\n const data = { code, url };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\n// Upload always targets the canonical Ecency image server, even when\n// the user has changed their viewing proxy (e.g. images.hive.blog).\n// i.ecency.com is the same imagehoster endpoint as images.ecency.com\n// (identical backend / token validation); it is the canonical host\n// because some ISPs SNI-filter the images.ecency.com hostname.\nconst UPLOAD_HOST = \"https://i.ecency.com\";\n\nexport async function uploadImage(\n file: File,\n token: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${UPLOAD_HOST}/hs/${token}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\n/**\n * Upload image using posting key signature (/:username/:signature path).\n * Works with any compatible image server (images.ecency.com, images.hive.blog).\n * The signature is sha256(\"ImageSigningChallenge\" + fileData) signed with the posting key.\n */\nexport async function uploadImageWithSignature(\n file: File,\n username: string,\n signature: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${CONFIG.imageHost}/${username}/${signature}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\nexport async function deleteImage(\n code: string | undefined,\n imageId: string\n): Promise> {\n const data = { code, id: imageId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addDraft(\n code: string | undefined,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function updateDraft(\n code: string | undefined,\n draftId: string,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, id: draftId, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-update\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function deleteDraft(\n code: string | undefined,\n draftId: string\n): Promise> {\n const data = { code, id: draftId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addSchedule(\n code: string | undefined,\n permlink: string,\n title: string,\n body: string,\n meta: Record,\n options: Record | null,\n schedule: string,\n reblog: boolean\n): Promise> {\n const data: Record = {\n code,\n permlink,\n title,\n body,\n meta,\n schedule,\n reblog,\n };\n\n if (options) {\n data.options = options;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function deleteSchedule(\n code: string | undefined,\n id: string\n): Promise> {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function moveSchedule(code: string | undefined, id: string): Promise {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-move\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getPromotedPost(\n code: string | undefined,\n author: string,\n permlink: string\n): Promise<{ author: string; permlink: string } | \"\"> {\n const data = { code, author, permlink };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/promoted-post\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ author: string; permlink: string } | \"\">(response);\n}\n\nexport async function onboardEmail(\n username: string,\n email: string,\n friend: string\n): Promise> {\n const dataBody = {\n username,\n email,\n friend,\n };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/account-create-friend\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(dataBody),\n }\n );\n\n return parseJsonResponse>(response);\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useAddDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"add\", username],\n mutationFn: async ({\n title,\n body,\n tags,\n meta,\n }: {\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addDraft\");\n }\n return addDraft(code, title, body, tags, meta);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full drafts list from the response (API returns complete list)\n if (data?.drafts) {\n qc.setQueryData(QueryKeys.posts.drafts(username), data.drafts);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n }\n // Also invalidate the infinite query so the drafts list refetches\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { updateDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useUpdateDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"update\", username],\n mutationFn: async ({\n draftId,\n title,\n body,\n tags,\n meta,\n }: {\n draftId: string;\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for updateDraft\");\n }\n return updateDraft(code, draftId, title, body, tags, meta);\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteDraft } from \"@/modules/private-api/requests\";\nimport type { Draft } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useDeleteDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"delete\", username],\n mutationFn: async ({ draftId }: { draftId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteDraft\");\n }\n return deleteDraft(code, draftId);\n },\n onMutate: async ({ draftId }) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.posts.drafts(username);\n const infinitePrefix = QueryKeys.posts.draftsInfinite(username);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((d) => d._id !== draftId)\n );\n }\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((d) => d._id !== draftId),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite };\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError: (err, _variables, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.posts.drafts(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n onError?.(err);\n },\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addSchedule } from \"@/modules/private-api/requests\";\n\nexport function useAddSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"add\", username],\n mutationFn: async ({\n permlink,\n title,\n body,\n meta,\n options,\n schedule,\n reblog,\n }: {\n permlink: string;\n title: string;\n body: string;\n meta: Record;\n options: Record | null;\n schedule: string;\n reblog: boolean;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addSchedule\");\n }\n return addSchedule(code, permlink, title, body, meta, options, schedule, reblog);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.schedules(username),\n });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteSchedule } from \"@/modules/private-api/requests\";\n\nexport function useDeleteSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"delete\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteSchedule\");\n }\n return deleteSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { moveSchedule } from \"@/modules/private-api/requests\";\n\nexport function useMoveSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"move\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for moveSchedule\");\n }\n return moveSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n // Also invalidate drafts since moving a schedule creates a draft\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to add an image URL to the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful addition\n * @param onError - Optional callback on error\n *\n * @example\n * const addImageMutation = useAddImage(username, code);\n * addImageMutation.mutate({ url: 'https://...' });\n */\nexport function useAddImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"add\", username],\n mutationFn: async ({ url, code: nextCode }: { url: string; code?: string }) => {\n const effectiveCode = nextCode ?? code;\n\n if (!username || !effectiveCode) {\n throw new Error(\"[SDK][Posts] – missing auth for addImage\");\n }\n return addImage(effectiveCode, url);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.images(username),\n });\n },\n onError,\n });\n}\n","import { useMutation, type InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport { deleteImage } from \"@/modules/private-api/requests\";\nimport type { UserImage } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\n/**\n * Hook to delete an image from the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful deletion\n * @param onError - Optional callback on error\n *\n * @example\n * const deleteImageMutation = useDeleteImage(username, code);\n * deleteImageMutation.mutate({ imageId: '123' });\n */\nexport function useDeleteImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"delete\", username],\n mutationFn: async ({ imageId }: { imageId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteImage\");\n }\n return deleteImage(code, imageId);\n },\n onSuccess: (_data, variables) => {\n onSuccess?.();\n const qc = getQueryClient();\n const { imageId } = variables;\n\n // Optimistic removal from regular cache\n qc.setQueryData(\n [\"posts\", \"images\", username],\n (prev) => prev?.filter((img) => img._id !== imageId)\n );\n\n // Optimistic removal from infinite cache pages\n qc.setQueriesData>>(\n { queryKey: [\"posts\", \"images\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((img) => img._id !== imageId),\n })),\n };\n }\n );\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { uploadImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to upload an image file to Ecency image hosting\n *\n * @param onSuccess - Optional callback on successful upload, receives { url: string }\n * @param onError - Optional callback on error\n *\n * Note: This hook uploads to Ecency's image server and requires a signature token.\n * The token should be generated using the user's posting key signature.\n *\n * @example\n * const uploadMutation = useUploadImage(\n * (data) => console.log('Uploaded:', data.url)\n * );\n * uploadMutation.mutate({ file, token });\n */\nexport function useUploadImage(\n onSuccess?: (data: { url: string }) => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"upload\"],\n mutationFn: async ({\n file,\n token,\n signal,\n }: {\n file: File;\n token: string;\n signal?: AbortSignal;\n }) => {\n return uploadImage(file, token, signal);\n },\n onSuccess,\n onError,\n });\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry, EntryVote } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nfunction makeEntryPath(author: string, permlink: string) {\n return `/@${author}/${permlink}`;\n}\n\nfunction getEntryFromCache(\n author: string,\n permlink: string,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n return queryClient.getQueryData(\n QueryKeys.posts.entry(makeEntryPath(author, permlink))\n );\n}\n\nfunction setEntryInCache(entry: Entry, qc?: QueryClient) {\n const queryClient = qc ?? getQueryClient();\n queryClient.setQueryData(\n QueryKeys.posts.entry(makeEntryPath(entry.author, entry.permlink)),\n entry\n );\n}\n\nfunction mutateEntry(\n author: string,\n permlink: string,\n updater: (entry: Entry) => Entry,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = makeEntryPath(author, permlink);\n const existing = queryClient.getQueryData(QueryKeys.posts.entry(path));\n if (!existing) return undefined;\n\n const updated = updater(existing);\n queryClient.setQueryData(QueryKeys.posts.entry(path), updated);\n return existing;\n}\n\n/**\n * SDK-level entry cache utilities. These operate on SDK cache keys\n * ([\"posts\", \"entry\", \"/@author/permlink\"]).\n *\n * Web layer can bridge these to its own QueryIdentifiers.ENTRY keys\n * during the migration period.\n */\nexport namespace EntriesCacheManagement {\n export function updateVotes(\n author: string,\n permlink: string,\n votes: EntryVote[],\n payout: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n active_votes: votes,\n stats: {\n ...(entry.stats || {\n gray: false,\n hide: false,\n flag_weight: 0,\n total_votes: 0,\n }),\n total_votes: votes.length,\n flag_weight: entry.stats?.flag_weight || 0,\n },\n total_votes: votes.length,\n payout,\n pending_payout_value: String(payout),\n }),\n qc\n );\n }\n\n export function updateReblogsCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n reblogs: count,\n }),\n qc\n );\n }\n\n export function updateRepliesCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n children: count,\n }),\n qc\n );\n }\n\n export function addReply(\n reply: Entry,\n parentAuthor: string,\n parentPermlink: string,\n qc?: QueryClient\n ) {\n mutateEntry(\n parentAuthor,\n parentPermlink,\n (entry) => ({\n ...entry,\n children: entry.children + 1,\n replies: [reply, ...entry.replies],\n }),\n qc\n );\n }\n\n export function updateEntries(entries: Entry[], qc?: QueryClient) {\n entries.forEach((entry) => setEntryInCache(entry, qc));\n }\n\n export function invalidateEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ) {\n const queryClient = qc ?? getQueryClient();\n queryClient.invalidateQueries({\n queryKey: QueryKeys.posts.entry(makeEntryPath(author, permlink)),\n });\n }\n\n export function getEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ): Entry | undefined {\n return getEntryFromCache(author, permlink, qc);\n }\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Whether the cached active_votes list already reflects the broadcast vote:\n * the voter is present for a vote (weight !== 0) or absent for an unvote\n * (weight === 0). Used to avoid stacking the SDK's post-broadcast optimistic\n * update on top of a platform-level optimistic update applied at press time.\n */\nexport function isVoteAlreadyReflected(\n activeVotes: Array<{ voter: string }>,\n voter: string | undefined,\n weight: number\n): boolean {\n const hasVoterRecord = activeVotes.some((v) => v.voter === voter);\n return weight !== 0 ? hasVoterRecord : !hasVoterRecord;\n}\n\n/**\n * Payload for voting on a post or comment.\n */\nexport interface VotePayload {\n /** Author of the post/comment to vote on */\n author: string;\n /** Permlink of the post/comment to vote on */\n permlink: string;\n /** Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote) */\n weight: number;\n /** Optional estimated payout change for optimistic UI */\n estimated?: number;\n}\n\n/**\n * Post-broadcast optimistic cache update for a vote: replaces the voter's\n * active_votes record and bumps the payout by `estimated`. Skipped when the\n * cached entry already reflects this vote (voter present for a vote, absent\n * for an unvote): platforms with their own at-press optimistic layer (e.g.\n * the mobile app) have applied it by the time the broadcast resolves, and\n * stacking a second update here double-counts the payout and clobbers the\n * platform's richer vote record until the deferred invalidation.\n */\nexport function applyVoteCacheUpdate(\n username: string | undefined,\n variables: VotePayload,\n qc?: QueryClient\n): void {\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink, qc);\n if (\n !entry?.active_votes ||\n isVoteAlreadyReflected(entry.active_votes, username, variables.weight)\n ) {\n return;\n }\n const newVotes = [\n ...entry.active_votes.filter((v) => v.voter !== username),\n ...(variables.weight !== 0 ? [{ rshares: variables.weight, voter: username! }] : [])\n ];\n const newPayout = entry.payout + (variables.estimated ?? 0);\n EntriesCacheManagement.updateVotes(\n variables.author,\n variables.permlink,\n newVotes,\n newPayout,\n qc\n );\n}\n\n/**\n * React Query mutation hook for voting on posts and comments.\n *\n * This mutation broadcasts a vote operation to the Hive blockchain,\n * supporting upvotes (positive weight) and downvotes (negative weight).\n *\n * @param username - The username of the voter (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 120) if adapter.recordActivity is available\n * - Invalidates post cache to refetch updated vote data\n * - Invalidates voting power cache to show updated VP\n *\n * **Vote Weight:**\n * - 10000 = 100% upvote\n * - 0 = remove vote\n * - -10000 = 100% downvote\n *\n * @example\n * ```typescript\n * const voteMutation = useVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Upvote a post\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 10000\n * });\n *\n * // Remove vote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 0\n * });\n *\n * // Downvote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: -10000\n * });\n * ```\n *\n * @remarks\n * broadcastMode: async — Votes don't require block confirmation.\n * The vote is accepted into the mempool immediately; UI can optimistically update.\n */\nexport function useVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"vote\"],\n username,\n ({ author, permlink, weight }) => [\n buildVoteOp(username!, author, permlink, weight)\n ],\n async (result: any, variables) => {\n // Optimistic vote list + payout update (no-op when the cache already\n // reflects this vote — see applyVoteCacheUpdate).\n applyVoteCacheUpdate(username, variables);\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(120, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n if (auth?.adapter?.invalidateQueries) {\n const doInvalidate = () => {\n auth.adapter!.invalidateQueries!([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.accounts.full(username)\n ]);\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(doInvalidate, 4000);\n } else {\n doInvalidate();\n }\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildReblogOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Payload for reblogging a post.\n */\nexport interface ReblogPayload {\n /** Original post author */\n author: string;\n /** Original post permlink */\n permlink: string;\n /** If true, removes the reblog instead of creating it */\n deleteReblog?: boolean;\n}\n\n/**\n * React Query mutation hook for reblogging posts.\n *\n * This mutation broadcasts a custom_json operation to reblog (or un-reblog)\n * a post to the user's blog feed.\n *\n * @param username - The username performing the reblog (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 130) if adapter.recordActivity is available\n * - Invalidates blog feed cache to show the reblogged post\n * - Invalidates post cache to update reblog status\n *\n * **Reblog vs Delete:**\n * - deleteReblog: false (default) - Creates a reblog\n * - deleteReblog: true - Removes an existing reblog\n *\n * @example\n * ```typescript\n * const reblogMutation = useReblog(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Reblog a post\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post'\n * });\n *\n * // Remove a reblog\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * deleteReblog: true\n * });\n * ```\n */\nexport function useReblog(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"reblog\"],\n username,\n ({ author, permlink, deleteReblog }) => [\n buildReblogOp(username!, author, permlink, deleteReblog ?? false)\n ],\n async (result: any, variables) => {\n // Optimistic reblog count update\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink);\n if (entry) {\n const newCount = Math.max(0, (entry.reblogs ?? 0) + (variables.deleteReblog ? -1 : 1));\n EntriesCacheManagement.updateReblogsCount(variables.author, variables.permlink, newCount);\n }\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(130, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n const invalidate = () => {\n const qc = getQueryClient();\n qc.invalidateQueries({\n queryKey: QueryKeys.posts.accountPostsBlogPrefix(username!),\n });\n if (auth?.adapter?.invalidateQueries) {\n auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.posts.rebloggedBy(variables.author, variables.permlink),\n ]);\n }\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(invalidate, 4000);\n } else {\n invalidate();\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Beneficiary account and weight.\n */\nexport interface Beneficiary {\n /** Beneficiary account name */\n account: string;\n /** Beneficiary weight (10000 = 100%) */\n weight: number;\n}\n\n/**\n * Payload for creating a comment or post.\n */\nexport interface CommentPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post */\n permlink: string;\n /** Parent author (empty string for top-level posts) */\n parentAuthor: string;\n /** Parent permlink (category/tag for top-level posts) */\n parentPermlink: string;\n /** Title of the post (empty for comments) */\n title: string;\n /** Content body */\n body: string;\n /** JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for creating posts and comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to create a new post or reply on the Hive blockchain.\n *\n * @param username - The username creating the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 100 for posts, 110 for comments) if adapter.recordActivity is available\n * - Invalidates feed caches to show the new content\n * - Invalidates parent post cache if this is a reply\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Post vs Comment:**\n * - Post: parentAuthor = \"\", parentPermlink = category/tag\n * - Comment: parentAuthor = parent author, parentPermlink = parent permlink\n *\n * @example\n * ```typescript\n * const commentMutation = useComment(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a post\n * commentMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post-20260209',\n * parentAuthor: '',\n * parentPermlink: 'technology',\n * title: 'My Awesome Post',\n * body: 'This is the post content...',\n * jsonMetadata: {\n * tags: ['technology', 'hive'],\n * app: 'ecency/3.0.0'\n * },\n * options: {\n * beneficiaries: [\n * { account: 'ecency', weight: 500 }\n * ]\n * }\n * });\n *\n * // Create a comment\n * commentMutation.mutate({\n * author: 'bob',\n * permlink: 're-alice-my-awesome-post-20260209',\n * parentAuthor: 'alice',\n * parentPermlink: 'my-awesome-post-20260209',\n * title: '',\n * body: 'Great post!',\n * jsonMetadata: { app: 'ecency/3.0.0' }\n * });\n * ```\n */\nexport function useComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"comment\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (result: any, variables) => {\n // Determine if this is a post or comment\n const isPost = !variables.parentAuthor;\n const activityType = isPost ? 100 : 110;\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(activityType, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation (always runs regardless of recordActivity outcome)\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (!isPost) {\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * Adds an optimistic entry to all discussions caches for the given root post.\n * Uses predicate matching to find all sort order variants.\n */\nexport function addOptimisticDiscussionEntry(\n entry: Entry,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n queryClient.setQueryData(queryKey, [entry, ...data]);\n }\n }\n}\n\n/**\n * Removes an entry from all discussions caches for the given root post.\n * Returns the previous state for rollback.\n */\nexport function removeOptimisticDiscussionEntry(\n author: string,\n permlink: string,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n): Map {\n const queryClient = qc ?? getQueryClient();\n const snapshots = new Map();\n\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n snapshots.set(queryKey, data);\n queryClient.setQueryData(\n queryKey,\n data.filter(\n (e) => e.author !== author || e.permlink !== permlink\n )\n );\n }\n }\n\n return snapshots;\n}\n\n/**\n * Restores discussion cache snapshots (for rollback on error).\n */\nexport function restoreDiscussionSnapshots(\n snapshots: Map,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n for (const [queryKey, data] of snapshots) {\n queryClient.setQueryData(queryKey, data);\n }\n}\n\n/**\n * Updates a specific entry in the SDK entry cache.\n * Returns the previous entry for rollback.\n */\nexport function updateEntryInCache(\n author: string,\n permlink: string,\n updates: Partial,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n const previous = queryClient.getQueryData(QueryKeys.posts.entry(path));\n\n if (previous) {\n queryClient.setQueryData(QueryKeys.posts.entry(path), {\n ...previous,\n ...updates,\n });\n }\n\n return previous;\n}\n\n/**\n * Restores an entry in cache (for rollback on error).\n */\nexport function restoreEntryInCache(\n author: string,\n permlink: string,\n entry: Entry,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n queryClient.setQueryData(QueryKeys.posts.entry(path), entry);\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDeleteCommentOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport {\n removeOptimisticDiscussionEntry,\n restoreDiscussionSnapshots,\n} from \"../cache/discussions-cache-utils\";\nimport type { Entry } from \"../types\";\n\n/**\n * Payload for deleting a comment or post.\n */\nexport interface DeleteCommentPayload {\n /** Author of the comment/post to delete */\n author: string;\n /** Permlink of the comment/post to delete */\n permlink: string;\n /** Optional: Parent author (for cache invalidation of discussions) */\n parentAuthor?: string;\n /** Optional: Parent permlink (for cache invalidation of discussions) */\n parentPermlink?: string;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n}\n\n/**\n * React Query mutation hook for deleting posts and comments.\n *\n * This mutation broadcasts a delete_comment operation to the Hive blockchain.\n * Includes optimistic removal from discussions cache with rollback on error.\n *\n * @param username - The username deleting the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n */\nexport function useDeleteComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"deleteComment\"],\n username,\n ({ author, permlink }) => [\n buildDeleteCommentOp(author, permlink)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (variables.parentAuthor && variables.parentPermlink) {\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n {\n broadcastMode,\n // Optimistic removal: remove from discussions cache before broadcast\n onMutate: async (variables) => {\n const rootAuthor = variables.rootAuthor || variables.parentAuthor;\n const rootPermlink = variables.rootPermlink || variables.parentPermlink;\n\n if (rootAuthor && rootPermlink) {\n const snapshots = removeOptimisticDiscussionEntry(\n variables.author,\n variables.permlink,\n rootAuthor,\n rootPermlink\n );\n return { snapshots };\n }\n return {};\n },\n // Rollback on error: restore discussions cache\n onError: (_error, _variables, context) => {\n const { snapshots } = (context as { snapshots?: Map }) ?? {};\n if (snapshots) {\n restoreDiscussionSnapshots(snapshots);\n }\n },\n }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Payload for creating a cross-post.\n */\nexport interface CrossPostPayload {\n /** Author of the cross-post (current user) */\n author: string;\n /** Permlink of the cross-post (usually: original-permlink-community-id) */\n permlink: string;\n /** Community ID to cross-post to (used as parent_permlink) */\n parentPermlink: string;\n /** Title of the cross-post (same as original) */\n title: string;\n /** Body of the cross-post (includes reference to original) */\n body: string;\n /** JSON metadata (must include original_author, original_permlink, tags, app) */\n jsonMetadata: Record;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"0.000 HBD\" for declined payout) */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n };\n}\n\n/**\n * React Query mutation hook for creating cross-posts.\n *\n * A cross-post is a special type of post that references an original post\n * and publishes it to a different community.\n *\n * @param username - The username creating the cross-post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates feed/blog caches to show the new cross-post\n *\n * **Operations:**\n * - Always includes a comment operation (with empty parent_author for top-level post)\n * - Optionally includes comment_options operation for rewards/beneficiaries\n *\n * **Metadata Requirements:**\n * The jsonMetadata must include:\n * - `original_author`: Author of the original post\n * - `original_permlink`: Permlink of the original post\n * - `tags`: Tags for the cross-post (typically [\"cross-post\"])\n * - `app`: Application identifier (e.g., \"ecency/3.0.0-vision\")\n *\n * @example\n * ```typescript\n * const crossPostMutation = useCrossPost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a cross-post\n * crossPostMutation.mutate({\n * author: 'alice',\n * permlink: 'great-post-hive-123456',\n * parentPermlink: 'hive-123456', // community ID\n * title: 'Great Post',\n * body: 'This is a cross post of [@bob/great-post](/technology/@bob/great-post) by @alice.

Check this out!',\n * jsonMetadata: {\n * app: 'ecency/3.0.0-vision',\n * tags: ['cross-post'],\n * original_author: 'bob',\n * original_permlink: 'great-post'\n * },\n * options: {\n * maxAcceptedPayout: '0.000 HBD',\n * allowCurationRewards: false\n * }\n * });\n * ```\n */\nexport function useCrossPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"cross-post\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (empty parent_author for top-level post)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n \"\", // empty parent_author for top-level post\n payload.parentPermlink, // community ID\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n } = payload.options;\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n [] // No beneficiaries for cross-posts\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n // Invalidate target community feed so cross-post appears\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.parentPermlink\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\nimport type { Beneficiary } from \"./use-comment\";\n\n/**\n * Payload for updating a reply/comment.\n */\nexport interface UpdateReplyPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post being updated */\n permlink: string;\n /** Parent author */\n parentAuthor: string;\n /** Parent permlink */\n parentPermlink: string;\n /** Title (empty for comments) */\n title: string;\n /** Updated content body */\n body: string;\n /** Updated JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for updating existing replies/comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to update an existing reply/comment on the Hive blockchain.\n *\n * @param username - The username updating the comment (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates parent post cache to reflect the updated comment\n * - Invalidates discussions cache (all sort orders)\n * - Invalidates RC cache (RC decreases after updating)\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Important:**\n * - Updates use the same comment operation as creating new comments\n * - The blockchain identifies this as an update based on matching author/permlink\n * - Only the author can update their own content\n * - Content can only be updated before payout (within 7 days)\n *\n * @example\n * ```typescript\n * const updateReplyMutation = useUpdateReply(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update a reply\n * updateReplyMutation.mutate({\n * author: 'alice',\n * permlink: 're-bob-my-post-20260209',\n * parentAuthor: 'bob',\n * parentPermlink: 'my-post-20260209',\n * title: '',\n * body: 'Updated comment content!',\n * jsonMetadata: {\n * tags: ['comment'],\n * app: 'ecency/3.0.0-vision'\n * },\n * rootAuthor: 'bob',\n * rootPermlink: 'my-post-20260209'\n * });\n * ```\n */\nexport function useUpdateReply(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"update-reply\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (same operation for create and update)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = _result?.id ?? _result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(110, txId, _result?.block_num).catch((error) => {\n console.debug(\"[SDK][Posts][useUpdateReply] recordActivity failed\", {\n activityType: 110,\n blockNum: _result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPromoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for promoting a post using Ecency Points.\n */\nexport interface PromotePayload {\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Promotion duration in days */\n duration: number;\n}\n\n/**\n * React Query mutation hook for promoting posts.\n *\n * This mutation broadcasts a custom_json operation to promote a post\n * using Ecency Points. The post will appear in promoted feeds for the\n * specified duration.\n *\n * @param username - The username promoting the post (required for broadcast, deducts points from this user)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates promoted posts cache to show newly promoted content\n * - Invalidates user points balance\n * - Invalidates post cache to update promotion status\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_promote\"\n * - JSON: {\"user\": \"username\", \"author\": \"postauthor\", \"permlink\": \"postpermlink\", \"duration\": 7}\n * - Authority: Active key (required for point spending)\n *\n * **Cost:**\n * - Costs Ecency Points based on duration\n * - User must have sufficient points balance\n *\n * @example\n * ```typescript\n * const promoteMutation = usePromote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Promote a post for 7 days\n * promoteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-great-post',\n * duration: 7\n * });\n * ```\n */\nexport function usePromote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"ecency\", \"promote\"],\n username,\n ({ author, permlink, duration }) => [\n buildPromoteOp(username!, author, permlink, duration)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate promoted posts feed\n [...QueryKeys.posts._promotedPrefix],\n // Invalidate user points balance\n [...QueryKeys.points._prefix(username!)],\n // Invalidate specific post cache to update promotion status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport type ValidatePostCreatingOptions = {\n delays?: number[];\n};\n\nconst DEFAULT_VALIDATE_POST_DELAYS = [3000, 3000, 3000];\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function getContent(author: string, permlink: string): Promise {\n return callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise;\n}\n\nexport async function validatePostCreating(\n author: string,\n permlink: string,\n attempts = 0,\n options?: ValidatePostCreatingOptions\n) {\n const delays = options?.delays ?? DEFAULT_VALIDATE_POST_DELAYS;\n\n let response: Entry | undefined;\n try {\n response = await getContent(author, permlink);\n } catch (e) {\n response = undefined;\n }\n\n if (response || attempts >= delays.length) {\n return;\n }\n\n const waitMs = delays[attempts];\n if (waitMs > 0) {\n await delay(waitMs);\n }\n\n return validatePostCreating(author, permlink, attempts + 1, options);\n}\n","export * from \"./use-record-activity\";\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ntype ActivityType =\n // Editor related\n | \"post-created\"\n | \"post-updated\"\n | \"post-scheduled\"\n | \"draft-created\"\n | \"video-published\"\n\n // Legacy editor related\n | \"legacy-post-created\"\n | \"legacy-post-updated\"\n | \"legacy-post-scheduled\"\n | \"legacy-draft-created\"\n | \"legacy-video-published\"\n\n // Perks related\n | \"perks-points-by-qr\"\n | \"perks-account-boost\"\n | \"perks-promote\"\n | \"perks-boost-plus\"\n | \"points-claimed\"\n | \"spin-rolled\"\n\n // Signup related\n | \"signed-up-with-wallets\"\n | \"signed-up-with-email\";\n\nexport interface RecordActivityOptions {\n url?: string;\n domain?: string;\n}\n\n/**\n * Get current location info safely (works in browser and Node.js)\n * Returns empty strings in non-browser environments\n */\nfunction getLocationInfo(): { url: string; domain: string } {\n if (typeof window !== \"undefined\" && window.location) {\n return {\n url: window.location.href,\n domain: window.location.host,\n };\n }\n return { url: \"\", domain: \"\" };\n}\n\nexport function useRecordActivity(\n username: string | undefined,\n activityType: ActivityType,\n options?: RecordActivityOptions\n) {\n return useMutation({\n mutationKey: [\"analytics\", activityType],\n mutationFn: async () => {\n if (!activityType) {\n throw new Error(\"[SDK][Analytics] – no activity type provided\");\n }\n const fetchApi = getBoundFetch();\n\n // Use provided values or auto-detect from browser environment\n // Falls back to empty strings in non-browser environments (Node.js, React Native, etc.)\n const locationInfo = getLocationInfo();\n const url = options?.url ?? locationInfo.url;\n const domain = options?.domain ?? locationInfo.domain;\n\n try {\n await fetchApi(CONFIG.plausibleHost + \"/api/event\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: activityType,\n url,\n domain,\n props: {\n username,\n },\n }),\n });\n } catch {\n // Analytics is fire-and-forget - network failures, ad blockers,\n // and CORS issues should not bubble up as user-facing errors\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { LeaderBoardDuration, LeaderBoardItem } from \"../types\";\n\nexport function getDiscoverLeaderboardQueryOptions(duration: LeaderBoardDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-leaderboard\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/leaderboard/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch leaderboard: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { CurationDuration, CurationItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getDiscoverCurationQueryOptions(duration: CurationDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-curation\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/curation/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch curation data: ${response.status}`);\n }\n\n const data = (await response.json()) as CurationItem[];\n\n // Fetch account data for efficiency calculation\n const accounts = data.map((item) => item.account);\n const accountsResponse = await callRPC(\"condenser_api.get_accounts\", [accounts]);\n\n // Calculate efficiency for each curator\n for (let index = 0; index < accountsResponse.length; index++) {\n const element = accountsResponse[index];\n const curator = data[index];\n\n // Convert Asset to string if needed\n const vestingShares = typeof element.vesting_shares === 'string'\n ? element.vesting_shares\n : element.vesting_shares.toString();\n const receivedVestingShares = typeof element.received_vesting_shares === 'string'\n ? element.received_vesting_shares\n : element.received_vesting_shares.toString();\n const delegatedVestingShares = typeof element.delegated_vesting_shares === 'string'\n ? element.delegated_vesting_shares\n : element.delegated_vesting_shares.toString();\n const vestingWithdrawRate = typeof element.vesting_withdraw_rate === 'string'\n ? element.vesting_withdraw_rate\n : element.vesting_withdraw_rate.toString();\n\n const effectiveVest: number =\n parseFloat(vestingShares) +\n parseFloat(receivedVestingShares) -\n parseFloat(delegatedVestingShares) -\n parseFloat(vestingWithdrawRate);\n // `hp` is the reward in Hive Power; the denominator stays in VESTS, which\n // is what the ranking has always compared. Every curator is scaled the\n // same way, so the ordering is unaffected by the unit mismatch.\n curator.efficiency = curator.hp / effectiveVest;\n }\n\n // Sort by efficiency descending\n data.sort((a: CurationItem, b: CurationItem) => b.efficiency - a.efficiency);\n\n return data;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PageStatsResponse } from \"../types\";\n\n/**\n * Get page statistics from the private analytics API\n *\n * @param url - URL to get stats for\n * @param dimensions - Dimensions to query (default: [])\n * @param metrics - Metrics to query (default: [\"visitors\", \"pageviews\", \"visit_duration\"])\n * @param dateRange - Date range for the query (e.g. \"day\", \"7d\", \"30d\", \"all\")\n */\nexport function getPageStatsQueryOptions(\n url: string,\n dimensions: string[] = [],\n metrics: string[] = [\"visitors\", \"pageviews\", \"visit_duration\"],\n dateRange?: string\n) {\n // Sort arrays to ensure stable query keys regardless of input order\n const sortedDimensions = [...dimensions].sort();\n const sortedMetrics = [...metrics].sort();\n\n return queryOptions({\n queryKey: [\"analytics\", \"page-stats\", url, sortedDimensions, sortedMetrics, dateRange],\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/api/stats\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n date_range: dateRange,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch page stats: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!url,\n // Analytics data should always be fresh - users expect current stats when changing range\n staleTime: 0,\n });\n}\n","/**\n * 3Speak takes an 11% beneficiary share on posts that embed one of its videos.\n *\n * This lives in the SDK because the rule is a payout contract that both the web app and the\n * mobile app have to apply identically. It was previously duplicated in each, which meant a\n * change to the weight, or to what counts as an embed, could land on one platform and not the\n * other and silently misroute revenue.\n */\n\n/** A beneficiary route as it appears in `comment_options`. */\nexport interface ThreeSpeakBeneficiaryRoute {\n account: string;\n weight: number;\n src?: string;\n}\n\nexport const THREESPEAK_BENEFICIARY_ACCOUNT = \"threespeakfund\";\n\n/** Beneficiary weight in basis points: 1100 = 11%. */\nexport const THREESPEAK_BENEFICIARY_WEIGHT = 1100;\n\n/**\n * Whether the body embeds a 3Speak video.\n *\n * Matches an actual embed url (e.g. `https://play.3speak.tv/embed?v=user/id`), not a plain\n * text mention of \"3speak.tv/embed\", which would otherwise attach an 11% route to a post that\n * merely talks about 3Speak.\n *\n * `3speak.tv` must be the host, either bare or under dot-delimited subdomains. The previous\n * `[a-z.]*` prefix also matched a lookalike domain such as `fake3speak.tv`, which would have\n * routed 11% of a user's rewards to threespeakfund for a video 3Speak never hosted. Matching\n * is case-insensitive because hostnames are, and a missed match means the route is silently\n * not attached rather than anything failing loudly.\n *\n * Note this requires an `/embed` path segment. The embed url is not built locally, it comes\n * back from 3Speak on upload, so if that shape ever changes this predicate stops recognising\n * it and the route is silently not attached.\n */\nexport function hasThreeSpeakEmbed(body: string): boolean {\n return /https?:\\/\\/([a-z0-9-]+\\.)*3speak\\.tv\\/embed[?/]/i.test(body);\n}\n\n/**\n * Ensures the 3Speak beneficiary is present, at the correct weight, when the body embeds a\n * 3Speak video. Other beneficiaries are preserved and the input is never mutated. Returns the\n * original array reference untouched when there is nothing to change, so callers can use it as\n * a cheap equality check.\n */\nexport function enforceThreeSpeakBeneficiary(\n beneficiaries: T[],\n body: string\n): (T | ThreeSpeakBeneficiaryRoute)[] {\n if (!hasThreeSpeakEmbed(body)) {\n return beneficiaries;\n }\n\n const existing = beneficiaries.find((b) => b.account === THREESPEAK_BENEFICIARY_ACCOUNT);\n\n if (existing && existing.weight === THREESPEAK_BENEFICIARY_WEIGHT) {\n return beneficiaries;\n }\n\n if (existing) {\n return beneficiaries.map((b) =>\n b.account === THREESPEAK_BENEFICIARY_ACCOUNT\n ? { ...b, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n : b\n );\n }\n\n return [\n ...beneficiaries,\n { account: THREESPEAK_BENEFICIARY_ACCOUNT, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n ];\n}\n\n/** Whether a beneficiary entry is the 3Speak route, which the UI locks from editing. */\nexport function isThreeSpeakBeneficiary(account: string): boolean {\n return account === THREESPEAK_BENEFICIARY_ACCOUNT;\n}\n","export * from \"./get-account-token-query-options\";\nexport * from \"./get-account-videos-query-options\";\n","export * from \"./get-decode-memo-query-options\";\n","import { queryOptions } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function getDecodeMemoQueryOptions(\n username: string,\n memo: string,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"hivesigner\", \"decode-memo\", username],\n queryFn: async () => {\n if (accessToken) {\n const hsClient = new hs.Client({\n accessToken,\n });\n return hsClient.decode(memo);\n }\n },\n });\n}\n","import * as queries from \"./queries\";\n\nconst HiveSignerIntegration = {\n queries,\n};\n\nexport { HiveSignerIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveSignerIntegration } from \"../../hivesigner\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\n\nexport function getAccountTokenQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"authenticate\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/login?username=${username}&hivesigner=true`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n const memoQueryOptions =\n HiveSignerIntegration.queries.getDecodeMemoQueryOptions(\n username,\n (await response.json()).memo,\n accessToken\n );\n await getQueryClient().prefetchQuery(memoQueryOptions);\n const { memoDecoded } = getQueryClient().getQueryData(\n memoQueryOptions.queryKey\n );\n\n return memoDecoded.replace(\"#\", \"\");\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ThreeSpeakVideo } from \"../types\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { getAccountTokenQueryOptions } from \"./get-account-token-query-options\";\n\nexport function getAccountVideosQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"videos\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const tokenQueryOptions = getAccountTokenQueryOptions(\n username,\n accessToken\n );\n\n await getQueryClient().prefetchQuery(tokenQueryOptions);\n const token = getQueryClient().getQueryData(tokenQueryOptions.queryKey);\n if (!token) {\n throw new Error(\"[SDK][Integrations][3Speak] – missing account token\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/api/my-videos`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n }\n );\n return (await response.json()) as ThreeSpeakVideo[];\n },\n });\n}\n","export * from \"./types\";\nexport * from \"./functions\";\nimport * as queries from \"./queries\";\n\nconst ThreeSpeakIntegration = {\n queries,\n};\n\nexport { ThreeSpeakIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/core\";\n\nexport function getHivePoshLinksQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"integrations\", \"hiveposh\", \"links\", username],\n retry: false, // Don't retry on user not found errors\n queryFn: async () => {\n try {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://hiveposh.com/api/v0/linked-accounts/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n // Handle 400 error when user is not registered on HivePosh\n if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n // Silently return null for \"User Not Connected\" errors\n if (errorData?.message === \"User Not Connected\") {\n return null;\n }\n }\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n\n return {\n twitter: {\n username: data.twitter_username,\n profile: data.twitter_profile,\n },\n reddit: {\n username: data.reddit_username,\n profile: data.reddit_profile,\n },\n } satisfies Record<\n \"twitter\" | \"reddit\",\n { username: string; profile: string }\n >;\n } catch (err) {\n // Silently handle all HivePosh API errors\n return null;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\n\nexport interface StatsResponse {\n results: [\n {\n metrics: number[];\n dimensions: string[];\n },\n ];\n query: {\n site_id: string;\n metrics: string[];\n date_range: string[];\n filters: string[];\n };\n}\ninterface UseStatsQueryOptions {\n url: string;\n dimensions?: string[];\n metrics?: string[];\n /**\n * Which dimension the `url` is matched against. `event:page` (default) matches\n * any visit that viewed the page; `visit:entry_page` matches only visits that\n * landed on it. The API route validates this against an allow-list.\n */\n filterBy?: \"event:page\" | \"visit:entry_page\";\n /**\n * Plausible `date_range`. Pass a tuple `[from, to]` (ISO `YYYY-MM-DD`) to scope\n * the query — e.g. a post's creation date through today. Scoping is essential:\n * ClickHouse orders events by `(site_id, toDate(timestamp), …)` and partitions\n * by month, so a bounded range prunes to a few granules instead of scanning the\n * whole history. Omitting it falls back to the route default (`\"all\"`), which on\n * a high-traffic site is a multi-second full scan. Plausible also accepts the\n * relative keywords `\"day\"`, `\"7d\"`, `\"30d\"`, `\"all\"`.\n */\n dateRange?: string | [string, string];\n enabled?: boolean;\n}\n\nexport function getStatsQueryOptions({\n url,\n dimensions = [],\n metrics = [\"visitors\", \"pageviews\", \"visit_duration\"],\n filterBy = \"event:page\",\n dateRange,\n enabled = true,\n}: UseStatsQueryOptions) {\n return queryOptions({\n queryKey: [\"integrations\", \"plausible\", url, dimensions, metrics, filterBy, dateRange],\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(`${CONFIG.privateApiHost}/api/stats`, {\n method: \"POST\",\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n filterBy,\n // Only forward a range when set, so the route keeps owning the default.\n ...(dateRange ? { date_range: dateRange } : {}),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // The proxy route returns 5xx (504/502) with an empty body on a Plausible\n // timeout/transport error, and Plausible itself can return a 4xx error JSON.\n // Without this guard those parse into an object with no `results`, and the UI\n // silently renders 0 — indistinguishable from a real zero. Throw instead so\n // React Query surfaces the error and retries.\n if (!response.ok) {\n throw new Error(`Failed to fetch Plausible stats: ${response.status}`);\n }\n\n return (await response.json()) as StatsResponse;\n },\n enabled: !!url && enabled,\n // Stats queries are now date-scoped and cheap; a single retry rides out a\n // transient slow scan without re-introducing the all-time pile-up.\n retry: 1,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRcStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"resource-credits\", \"stats\"],\n queryFn: async () => {\n const response = await callRPC(\"rc_api.get_rc_stats\", {});\n return response.rc_stats;\n },\n });\n}\n","import { callRPC } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getAccountRcQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"resource-credits\", \"account\", username],\n queryFn: async (): Promise => {\n const result = await callRPC(\"rc_api.find_rc_accounts\", {\n accounts: [username],\n });\n return result.rc_accounts;\n },\n enabled: !!username,\n });\n}\n","import { calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport type { RcStats } from \"../types/stats\";\n\n/**\n * Operations the RC pre-check can estimate. Mirrors the keys exposed by\n * `rc_api.get_rc_stats` (see {@link RcStats}[\"ops\"]).\n */\nexport type RcPrecheckOperation = keyof RcStats[\"ops\"];\n\nexport interface RcPrecheckInput {\n /** From `getAccountRcQueryOptions(username)` -> rcAccounts[0]. */\n rcAccount: RCAccount | null | undefined;\n /** From `getRcStatsQueryOptions()`. */\n rcStats: RcStats | null | undefined;\n /** The operation the user is about to broadcast. */\n operation: RcPrecheckOperation;\n /**\n * Safety multiplier applied to the average operation cost when deciding\n * whether the broadcast will \"likely fail\". Actual on-chain cost varies with\n * network load, so we keep headroom. Defaults to 1.2.\n */\n buffer?: number;\n}\n\nexport interface RcPrecheckResult {\n /** Both inputs were available, so the estimate is meaningful. */\n ready: boolean;\n /** Current RC mana of the account. */\n currentMana: number;\n /** Maximum RC mana of the account. */\n maxMana: number;\n /** Average RC cost of the operation. */\n avgCost: number;\n /** Average cost padded by `buffer`. */\n estimatedCost: number;\n /** `currentMana` is below the padded estimate -> broadcast likely fails. */\n willLikelyFail: boolean;\n /** RC shortfall vs the padded estimate (0 when not failing). */\n deficit: number;\n /** Roughly how many such operations the account can still afford. */\n remaining: number;\n}\n\nconst EMPTY: RcPrecheckResult = {\n ready: false,\n currentMana: 0,\n maxMana: 0,\n avgCost: 0,\n estimatedCost: 0,\n willLikelyFail: false,\n deficit: 0,\n remaining: 0,\n};\n\n/**\n * Pure, client-side estimate of whether an account has enough Resource Credits\n * to broadcast an operation, used to warn the user BEFORE they submit instead\n * of failing afterwards with the chain's \"Please wait to transact\" error.\n *\n * It is intentionally approximate: it uses the network-wide average cost from\n * `rc_api.get_rc_stats`, padded by a buffer. Treat `willLikelyFail` as a hint,\n * never a hard gate - the publish/comment/vote action must stay non-blocking.\n */\nexport function estimateRcPrecheck({\n rcAccount,\n rcStats,\n operation,\n buffer = 1.2,\n}: RcPrecheckInput): RcPrecheckResult {\n if (!rcAccount || !rcStats?.ops) {\n return EMPTY;\n }\n\n const { current_mana: currentMana, max_mana: maxMana } = calculateRCMana(rcAccount);\n const avgCost = Number(rcStats.ops[operation]?.avg_cost ?? 0);\n\n if (!(avgCost > 0)) {\n return { ...EMPTY, ready: true, currentMana, maxMana };\n }\n\n const safeBuffer = Number.isFinite(buffer) && buffer > 0 ? buffer : 1.2;\n const estimatedCost = avgCost * safeBuffer;\n const willLikelyFail = currentMana < estimatedCost;\n\n return {\n ready: true,\n currentMana,\n maxMana,\n avgCost,\n estimatedCost,\n willLikelyFail,\n deficit: willLikelyFail ? Math.ceil(estimatedCost - currentMana) : 0,\n remaining: Math.floor(currentMana / avgCost),\n };\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetGameStatus } from \"../types\";\n\nexport function getGameStatusCheckQueryOptions(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\"\n) {\n return queryOptions({\n queryKey: [\"games\", \"status-check\", gameType, username],\n enabled: !!username && !!code,\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/get-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()) as GetGameStatus;\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { GameClaim } from \"../types\";\nimport { useRecordActivity } from \"@/modules/analytics/mutations\";\n\nexport function useGameClaim(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\",\n key: string\n) {\n const { mutateAsync: recordActivity } = useRecordActivity(\n username,\n \"spin-rolled\"\n );\n\n return useMutation({\n mutationKey: [\"games\", \"post\", gameType, username],\n mutationFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/post-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n key,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (await response.json()) as GameClaim;\n },\n onSuccess() {\n recordActivity();\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { QuestsResponse } from \"../types\";\n\n/**\n * Read-only daily/weekly/monthly quest progress for a user. Aggregates the existing\n * points ledger (no auth required — same sensitivity as `/private-api/points`).\n */\nexport function getQuestsQueryOptions(username: string | undefined) {\n const name = username?.replace(\"@\", \"\");\n return queryOptions({\n queryKey: QueryKeys.quests.status(name),\n enabled: !!name,\n queryFn: async () => {\n if (!name) {\n throw new Error(\"[SDK][Quests] – username wasn't provided\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/quests\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ username: name }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch quests: ${response.status}`);\n }\n\n return (await response.json()) as QuestsResponse;\n },\n staleTime: 30000,\n refetchOnMount: true,\n });\n}\n","/**\n * Shared quest catalog — the single source of truth for which quests exist, their\n * encouraging goals, copy keys and icon hints. Lives in the SDK so the web and mobile\n * clients render an identical, harmonized set. The backend (`/private-api/quests`)\n * returns raw progress + the reward `cap`; this catalog layers the presentation.\n *\n * `goal` is an *encouraging, reachable* daily target and is intentionally independent of\n * the backend reward `cap` (the point at which the existing reward decays to ~0). It is\n * tunable here without any backend change.\n */\n\nexport type QuestTier = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface QuestCatalogEntry {\n id: string;\n tier: QuestTier;\n /** encouraging, reachable target for the period (tunable, not the reward cap) */\n goal: number;\n /** i18n key suffix; clients resolve e.g. `quests..title` / `.desc` */\n i18nKey: string;\n /** semantic icon hint; each client maps it to its own icon set */\n icon: string;\n}\n\nexport const QUEST_CATALOG: QuestCatalogEntry[] = [\n // Daily\n { id: \"checkin\", tier: \"daily\", goal: 1, i18nKey: \"checkin\", icon: \"check-circle\" },\n { id: \"post\", tier: \"daily\", goal: 1, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"daily\", goal: 3, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"daily\", goal: 10, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"daily\", goal: 1, i18nKey: \"reblog\", icon: \"repeat\" },\n { id: \"spin\", tier: \"daily\", goal: 1, i18nKey: \"spin\", icon: \"gift\" },\n // Weekly\n { id: \"post\", tier: \"weekly\", goal: 5, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"weekly\", goal: 15, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"weekly\", goal: 50, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"weekly\", goal: 5, i18nKey: \"reblog\", icon: \"repeat\" },\n // Monthly\n { id: \"post\", tier: \"monthly\", goal: 20, i18nKey: \"post\", icon: \"pencil\" },\n];\n\nexport function getQuestCatalogEntry(tier: QuestTier, id: string) {\n return QUEST_CATALOG.find((q) => q.tier === tier && q.id === id);\n}\n\n// Streak Freeze display config. MIRRORS the ePoints constants\n// (STREAK_FREEZE_PRICE / STREAK_FREEZE_MAX_OWNED) — the server is the source of truth\n// and validates every purchase; these drive the label + button state only, so a drift\n// here never over-charges (the buy is priced server-side).\nexport const STREAK_FREEZE_PRICE = 300;\nexport const STREAK_FREEZE_MAX_OWNED = 2;\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { StreakFreezeBuyResult } from \"../types\";\n\n/** A fresh idempotency key per purchase; guarded for runtimes without crypto.randomUUID. */\nfunction genIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * POST a single streak-freeze purchase. Throws on a non-2xx with the server's\n * `.status` + parsed `.data` attached so the caller can branch on 402 (insufficient)\n * / 409 (max owned). Exported for unit testing; the hook below wraps it.\n */\nexport async function buyStreakFreezeRequest(\n code: string\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/streak-freeze/buy\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code, idempotency_key: genIdempotencyKey() }),\n }\n );\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to buy streak freeze: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as StreakFreezeBuyResult;\n}\n\n/**\n * Buy one streak freeze (a Points-only sink). The server debits Points, caps owned\n * inventory, and is idempotent per key. On success the quests + points caches are\n * invalidated so the owned count and balance refresh. A 402 (insufficient) / 409 (max\n * owned) is rethrown with `.status` + `.data` so the caller can route to a Points top-up.\n */\nexport function useBuyStreakFreeze(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"streak-freeze\", \"buy\", name],\n mutationFn: async () => {\n if (!name || !code) {\n throw new Error(\"[SDK][StreakFreeze] – missing auth\");\n }\n return buyStreakFreezeRequest(code);\n },\n onSuccess() {\n // Balance only changes on a successful debit.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.points._prefix(name) });\n }\n },\n onSettled() {\n // Refresh freezes_owned on success AND error: a 409 (max owned) means the\n // client's count is stale, and without this the \"Protect streak\" button would\n // never hide and the user could keep re-triggering 409s.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.quests.status(name) });\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for subscribing to a community.\n */\nexport interface SubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for subscribing to a community.\n *\n * This mutation broadcasts a subscribe operation to the Hive blockchain,\n * adding the community to the user's subscription list.\n *\n * @param username - The username subscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"subscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const subscribeMutation = useSubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Subscribe to a community\n * subscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useSubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"subscribe\"],\n username,\n ({ community }) => [\n buildSubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnsubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unsubscribing from a community.\n */\nexport interface UnsubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for unsubscribing from a community.\n *\n * This mutation broadcasts an unsubscribe operation to the Hive blockchain,\n * removing the community from the user's subscription list.\n *\n * @param username - The username unsubscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"unsubscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const unsubscribeMutation = useUnsubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unsubscribe from a community\n * unsubscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useUnsubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"unsubscribe\"],\n username,\n ({ community }) => [\n buildUnsubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildMutePostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for muting/unmuting a post in a community.\n */\nexport interface MutePostPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Mute reason/notes (required even for unmute) */\n notes: string;\n /** True to mute, false to unmute */\n mute: boolean;\n}\n\n/**\n * React Query mutation hook for muting/unmuting posts in a community.\n *\n * This mutation broadcasts a custom_json operation to mute (or unmute)\n * a post within a community. Only community moderators/admins can mute posts.\n *\n * @param username - The username performing the mute (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community posts cache to hide muted content\n * - Invalidates post cache to update mute status\n * - Invalidates feed cache to remove muted posts from feeds\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"mutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Action (unmute): [\"unmutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Authority: Posting key\n *\n * **Mute vs Unmute:**\n * - mute: true - Mutes the post (hides from community feed)\n * - mute: false - Unmutes the post (restores to community feed)\n *\n * **Permission:**\n * - Only community moderators and admins can mute/unmute posts\n * - Attempting to mute without permission will fail with an error\n *\n * @example\n * ```typescript\n * const mutePostMutation = useMutePost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Mute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Violates community guidelines',\n * mute: true\n * });\n *\n * // Unmute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Resolved after editing',\n * mute: false\n * });\n * ```\n */\nexport function useMutePost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"mutePost\"],\n username,\n ({ community, author, permlink, notes, mute }) => [\n buildMutePostOp(username!, community, author, permlink, notes, mute)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n // Invalidate specific post cache to update mute status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n // Invalidate community data\n [\"community\", \"single\", variables.community],\n // Invalidate community feed/posts (matches all sort orders, limits, observers)\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.community\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetRoleOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community, CommunityTeam } from \"../types\";\n\n/**\n * Payload for setting a user's role in a community.\n */\nexport interface SetCommunityRolePayload {\n /** Account to set role for */\n account: string;\n /** Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\") */\n role: string;\n}\n\n/**\n * React Query mutation hook for setting a user's role in a community.\n *\n * This mutation broadcasts a setRole operation to the Hive blockchain,\n * updating the role of a community member. Only users with appropriate\n * permissions (community owner/admin) can set roles.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username setting the role (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated team member list\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"setRole\", {\"community\": \"hive-123456\", \"account\": \"user\", \"role\": \"mod\"}]\n * - Authority: Posting key\n *\n * **Role Types:**\n * - \"owner\" - Community owner (full permissions)\n * - \"admin\" - Administrator (can manage settings and team)\n * - \"mod\" - Moderator (can mute posts/users)\n * - \"member\" - Regular member (no special permissions)\n * - \"guest\" - Remove user from team (empty string also works)\n *\n * @example\n * ```typescript\n * const setRoleMutation = useSetCommunityRole('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Set a user as moderator\n * setRoleMutation.mutate({\n * account: 'alice',\n * role: 'mod'\n * });\n *\n * // Remove a user from the team\n * setRoleMutation.mutate({\n * account: 'bob',\n * role: 'guest'\n * });\n * ```\n */\nexport function useSetCommunityRole(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"set-role\", community],\n username,\n ({ account, role }) => [\n buildSetRoleOp(username!, community, account, role)\n ],\n async (_result: any, variables) => {\n // Optimistic team update in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n const team: CommunityTeam = [...(prev.team ?? [])];\n const idx = team.findIndex(([name]) => name === variables.account);\n if (idx >= 0) {\n team[idx] = [team[idx][0], variables.role, team[idx][2] ?? \"\"];\n } else {\n team.push([variables.account, variables.role, \"\"]);\n }\n return { ...prev, team };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries + context for affected user\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)],\n QueryKeys.communities.context(variables.account, community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUpdateCommunityOp, type CommunityProps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community } from \"../types\";\n\n/**\n * Payload for updating community properties.\n * Matches the CommunityProps interface from builders.\n */\nexport type UpdateCommunityPayload = CommunityProps;\n\n/**\n * React Query mutation hook for updating community properties.\n *\n * This mutation broadcasts an updateProps operation to the Hive blockchain,\n * modifying the community's metadata and settings. Only community admins\n * can update community properties.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username updating the community (required for broadcast, must be admin)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated properties\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"updateProps\", {\"community\": \"hive-123456\", \"props\": {...}}]\n * - Authority: Posting key\n *\n * **Properties:**\n * - title - Community display title\n * - about - Short description/tagline\n * - lang - Primary language code (e.g., \"en\")\n * - description - Full community description (markdown supported)\n * - flag_text - Custom text shown when flagging posts\n * - is_nsfw - Whether community contains NSFW content\n *\n * @example\n * ```typescript\n * const updateMutation = useUpdateCommunity('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update community properties\n * updateMutation.mutate({\n * title: 'My Awesome Community',\n * about: 'A place for awesome people',\n * lang: 'en',\n * description: '# Welcome\\nThis is our community description',\n * flag_text: 'Please explain why this content violates our rules',\n * is_nsfw: false\n * });\n * ```\n */\nexport function useUpdateCommunity(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"update\", community],\n username,\n (props) => [\n buildUpdateCommunityOp(username!, community, props)\n ],\n async (_result: any, variables) => {\n // Optimistic property merge in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n return { ...prev, ...(variables as unknown as Partial) };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)]\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommunityRegistrationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for community rewards registration.\n */\nexport interface CommunityRewardsRegisterPayload {\n /** Community account name (usually the community creator's account) */\n name: string;\n}\n\n/**\n * React Query mutation hook for registering to receive community rewards.\n *\n * This mutation broadcasts a custom_json operation to register a community\n * account to receive Ecency Points rewards for community activity.\n *\n * @param username - The username registering for community rewards (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to update registration status\n * - Invalidates points balance to reflect potential initial rewards\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_registration\"\n * - JSON: {\"name\": \"communityname\"}\n * - Authority: Active key (required for registration)\n *\n * **Purpose:**\n * - Enables communities to receive Ecency Points for activity\n * - One-time registration per community\n * - Can only be done by the community owner/creator\n *\n * @example\n * ```typescript\n * const registerMutation = useRegisterCommunityRewards(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Register community for rewards\n * registerMutation.mutate({\n * name: 'hive-123456'\n * });\n * ```\n */\nexport function useRegisterCommunityRewards(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"registerRewards\"],\n username,\n ({ name }) => [\n buildCommunityRegistrationOp(name)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate community cache to update registration status\n [...QueryKeys.communities.singlePrefix(variables.name)],\n // Invalidate points balance\n [...QueryKeys.points._prefix(username!)],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPinPostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface PinPostPayload {\n community: string;\n account: string;\n permlink: string;\n pin: boolean;\n}\n\nexport function usePinPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"pin-post\"],\n username,\n ({ community, account, permlink, pin }) => [\n buildPinPostOp(username!, community, account, permlink, pin)\n ],\n async (_result, variables) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.account}/${variables.permlink}`),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Communities } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunitiesQueryOptions(\n sort: string,\n query?: string,\n limit = 100,\n observer: string | undefined = undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.list(sort, query ?? \"\", limit),\n enabled,\n queryFn: async () => {\n const response = await callRPC(\"bridge.list_communities\", {\n last: \"\",\n limit,\n sort: sort === \"hot\" ? \"rank\" : sort,\n query: query ? query : null,\n observer,\n });\n return (\n response\n ? sort === \"hot\"\n ? response.sort(() => Math.random() - 0.5)\n : response\n : []\n ) as Communities;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { CommunityRole } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunityContextQueryOptions(\n username: string | undefined,\n communityName: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.context(username!, communityName!),\n enabled: !!username && !!communityName,\n queryFn: async () => {\n const response = await callRPC(\"bridge.get_community_context\", {\n account: username,\n name: communityName,\n });\n\n return {\n role: response?.role ?? \"guest\",\n subscribed: response?.subscribed ?? false,\n } satisfies {\n role: CommunityRole;\n subscribed: boolean;\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Community } from \"../types/community\";\nimport { getCommunity } from \"@/modules/bridge\";\nimport { QueryKeys } from \"@/modules/core\";\n\nexport function getCommunityQueryOptions(\n name: string | undefined,\n observer: string | undefined = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.single(name, observer),\n enabled: enabled && !!name,\n queryFn: async () => getCommunity(name ?? \"\", observer) as Promise,\n });\n}\n","import {\n InfiniteData,\n infiniteQueryOptions,\n queryOptions\n} from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Subscription } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * hivemind caps `bridge.list_subscribers` at 100 rows per call, regardless of a\n * larger requested limit.\n */\nexport const SUBSCRIBERS_PAGE_SIZE = 100;\n\ntype SubscribersPage = Subscription[];\ntype SubscribersCursor = string | null;\n\n/**\n * Fetches one page of subscribers.\n *\n * `last` is omitted on the first page rather than passed as an empty string:\n * hivemind reads `\"\"` as a real cursor positioned before the first account and\n * returns zero rows.\n */\nasync function fetchSubscribersPage(\n communityName: string,\n last: SubscribersCursor\n): Promise {\n const response = await callRPC(\"bridge.list_subscribers\", {\n community: communityName,\n limit: SUBSCRIBERS_PAGE_SIZE,\n ...(last ? { last } : {})\n });\n return (response as Subscription[] | null) ?? [];\n}\n\n/**\n * Get the first page of subscribers for a community.\n *\n * @deprecated Returns at most {@link SUBSCRIBERS_PAGE_SIZE} subscribers, which\n * for most communities is a small fraction of the total while looking like the\n * complete list. Prefer {@link getCommunitySubscribersInfiniteQueryOptions}\n * unless a single page is genuinely all that is wanted.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersQueryOptions(communityName: string) {\n return queryOptions({\n queryKey: QueryKeys.communities.subscribers(communityName),\n queryFn: async () => fetchSubscribersPage(communityName, null),\n staleTime: 60000\n });\n}\n\n/**\n * Get all subscribers for a community, paged with hivemind's `last` cursor.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersInfiniteQueryOptions(\n communityName: string\n) {\n return infiniteQueryOptions<\n SubscribersPage,\n Error,\n InfiniteData,\n string[],\n SubscribersCursor\n >({\n queryKey: QueryKeys.communities.subscribersInfinite(communityName),\n initialPageParam: null as SubscribersCursor,\n queryFn: async ({ pageParam }: { pageParam: SubscribersCursor }) =>\n fetchSubscribersPage(communityName, pageParam),\n // The cursor is the previous page's last account name. A short page is the\n // end of the list.\n getNextPageParam: (lastPage: SubscribersPage): SubscribersCursor =>\n lastPage?.length >= SUBSCRIBERS_PAGE_SIZE\n ? lastPage[lastPage.length - 1]?.[0] ?? null\n : null,\n staleTime: 60000\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountNotification } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype NotifPage = AccountNotification[];\ntype NotifCursor = number | null;\n\n/**\n * Get account notifications for a community (bridge API)\n *\n * @param account - The account/community name\n * @param limit - Number of notifications per page\n */\nexport function getAccountNotificationsInfiniteQueryOptions(\n account: string,\n limit: number\n) {\n return infiniteQueryOptions<\n NotifPage,\n Error,\n InfiniteData,\n (string | number)[],\n NotifCursor\n >({\n queryKey: QueryKeys.communities.accountNotifications(account, limit),\n initialPageParam: null as NotifCursor,\n\n // Errors are deliberately not caught. Returning [] on failure made an RPC\n // outage indistinguishable from an empty log: `isError` never became true,\n // so consumers rendered \"no activity\" for a failed request, and a failed\n // page produced no cursor and silently ended pagination. Let React Query\n // own the error so `isError` and retry behave normally.\n queryFn: async ({ pageParam }: { pageParam: NotifCursor }) => {\n const response = await callRPC(\"bridge.account_notifications\", {\n account,\n limit,\n last_id: pageParam ?? undefined,\n });\n return (response as AccountNotification[] | null) ?? [];\n },\n\n // A short page is the end of the log. Keying on \"empty\" alone would also\n // treat a truncated page as the end.\n getNextPageParam: (lastPage: NotifPage): NotifCursor =>\n lastPage?.length >= limit ? lastPage[lastPage.length - 1].id : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { RewardedCommunity } from \"../types/rewarded-community\";\n\nexport function getRewardedCommunitiesQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.communities.rewarded(),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/rewarded-communities\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch rewarded communities: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","export enum ROLES {\n OWNER = \"owner\",\n ADMIN = \"admin\",\n MOD = \"mod\",\n MEMBER = \"member\",\n GUEST = \"guest\",\n MUTED = \"muted\",\n}\n\nexport const roleMap: Record = {\n [ROLES.OWNER]: [\n ROLES.ADMIN,\n ROLES.MOD,\n ROLES.MEMBER,\n ROLES.GUEST,\n ROLES.MUTED,\n ],\n [ROLES.ADMIN]: [ROLES.MOD, ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n [ROLES.MOD]: [ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n};\n\nexport type CommunityTeam = Array>;\nexport type CommunityRole = (typeof ROLES)[keyof typeof ROLES]; // \"owner\" | \"member\" | ...\nexport type CommunityType = \"Topic\" | \"Journal\" | \"Council\";\n\nexport interface Community {\n about: string;\n admins?: string[];\n avatar_url: string;\n created_at: string;\n description: string;\n flag_text: string;\n id: number;\n is_nsfw: boolean;\n lang: string;\n name: string;\n num_authors: number;\n num_pending: number;\n subscribers: number;\n sum_pending: number;\n settings?: any;\n team: CommunityTeam;\n title: string;\n type_id: number;\n}\n\nexport type Communities = Community[];\n","import { CommunityRole, CommunityType, ROLES } from \"../types\";\n\nexport function getCommunityType(name: string, type_id: number): CommunityType {\n if (name.startsWith(\"hive-3\") || type_id === 3) return \"Council\";\n if (name.startsWith(\"hive-2\") || type_id === 2) return \"Journal\";\n return \"Topic\";\n}\n\nexport function getCommunityPermissions({\n communityType,\n userRole,\n subscribed,\n}: {\n communityType: CommunityType;\n userRole: CommunityRole;\n subscribed: boolean;\n}) {\n const canPost = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n if (communityType === \"Topic\") return true;\n\n // Journal & Council\n return [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD, ROLES.MEMBER].includes(\n userRole\n );\n })();\n\n const canComment = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n switch (communityType) {\n case \"Topic\":\n return true;\n case \"Journal\":\n return userRole !== ROLES.GUEST || subscribed;\n case \"Council\":\n return canPost;\n }\n })();\n\n const isModerator = [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD].includes(userRole);\n\n return {\n canPost,\n canComment,\n isModerator,\n };\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getNotificationsUnreadCountQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.unreadCount(activeUsername),\n queryFn: async () => {\n if (!code) {\n return 0;\n }\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/notifications/unread`,\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n const data = (await response.json()) as { count: number };\n return data.count;\n },\n enabled: !!activeUsername && !!code,\n initialData: 0,\n refetchInterval: 60000,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { NotificationFilter } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ApiNotification } from \"../types\";\n\nexport function getNotificationsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n filter: NotificationFilter | undefined = undefined\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.notifications.list(activeUsername, filter),\n queryFn: async ({ pageParam }) => {\n if (!code) {\n return [];\n }\n const data = {\n code,\n filter,\n since: pageParam,\n user: undefined,\n };\n\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/notifications\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }\n );\n\n if (!response.ok) {\n return [];\n }\n\n try {\n return (await response.json()) as ApiNotification[];\n } catch {\n return [];\n }\n },\n enabled: !!activeUsername && !!code,\n initialData: { pages: [], pageParams: [] },\n initialPageParam: \"\",\n getNextPageParam: (lastPage) => lastPage?.[lastPage.length - 1]?.id ?? \"\",\n refetchOnMount: true,\n });\n}\n","export enum NotificationFilter {\n VOTES = \"rvotes\",\n MENTIONS = \"mentions\",\n FAVORITES = \"nfavorites\",\n BOOKMARKS = \"nbookmarks\",\n FOLLOWS = \"follows\",\n REPLIES = \"replies\",\n REBLOGS = \"reblogs\",\n TRANSFERS = \"transfers\",\n DELEGATIONS = \"delegations\",\n PAYOUTS = \"payouts\",\n SCHEDULED_PUBLISHED = \"scheduled_published\",\n // Filter path is plural while the notification `type` string is singular\n // (`account_update`) - enotify routes on the plural form.\n ACCOUNT_UPDATES = \"account_updates\",\n WEEKLY_EARNINGS = \"weekly_earnings\",\n}\n","// Values are enotify's ACTIVITY_MAIN_TYPE_* ints and are validated server-side at\n// device registration, so they must match enotify constants.py exactly. Note payouts\n// is 19: the original 16 is commented out upstream and must not be reused.\nexport enum NotifyTypes {\n VOTE = 1,\n MENTION = 2,\n FOLLOW = 3,\n COMMENT = 4,\n RE_BLOG = 5,\n TRANSFERS = 6,\n DELEGATIONS = 10,\n FAVORITES = 13,\n BOOKMARKS = 15,\n PAYOUTS = 19,\n ACCOUNT_UPDATE = 20,\n WEEKLY_EARNINGS = 21,\n SCHEDULED_PUBLISHED = 22,\n ALLOW_NOTIFY = \"ALLOW_NOTIFY\",\n}\n\nexport const ALL_NOTIFY_TYPES = [\n NotifyTypes.VOTE,\n NotifyTypes.MENTION,\n NotifyTypes.FOLLOW,\n NotifyTypes.COMMENT,\n NotifyTypes.RE_BLOG,\n NotifyTypes.TRANSFERS,\n NotifyTypes.DELEGATIONS,\n NotifyTypes.FAVORITES,\n NotifyTypes.BOOKMARKS,\n NotifyTypes.PAYOUTS,\n NotifyTypes.ACCOUNT_UPDATE,\n NotifyTypes.WEEKLY_EARNINGS,\n NotifyTypes.SCHEDULED_PUBLISHED,\n] as const;\n\nexport enum NotificationViewType {\n ALL = \"All\",\n UNREAD = \"Unread\",\n READ = \"Read\",\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ApiNotificationSetting } from \"../types\";\nimport { ALL_NOTIFY_TYPES } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getNotificationsSettingsQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n initialMuted?: boolean\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.settings(activeUsername),\n queryFn: async () => {\n let token = activeUsername + \"-web\";\n if (!code) {\n throw new Error(\"Missing access token\");\n }\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/detail-device\",\n {\n body: JSON.stringify({\n code,\n username: activeUsername,\n token,\n }),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch notification settings: ${response.status}`);\n }\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n refetchOnMount: false,\n initialData: () => {\n return {\n status: 0,\n system: \"web\",\n allows_notify: 0,\n notify_types: initialMuted ? [] : ([...ALL_NOTIFY_TYPES] as number[]),\n } as ApiNotificationSetting;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Announcement } from \"../types/announcement\";\n\nexport function getAnnouncementsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.notifications.announcements(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/announcements\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch announcements: ${response.status}`);\n }\n\n const data = await response.json() as Announcement[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Spotlight } from \"../types/spotlight\";\n\n// `_accessToken` is accepted for call-site parity with mobile (which passes one) but is\n// intentionally unused: the spotlights endpoint is anonymous and only filters by date window.\nexport function getSpotlightsQueryOptions(_accessToken?: string) {\n return queryOptions({\n queryKey: QueryKeys.notifications.spotlights(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/spotlights\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch spotlights: ${response.status}`);\n }\n\n const data = (await response.json()) as Spotlight[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { useMutation, QueryKey, InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { markNotifications } from \"@/modules/private-api/requests\";\nimport { ApiNotification } from \"../types\";\n\ntype NotificationPage = ApiNotification[];\ntype InfiniteNotificationData = InfiniteData;\n\nfunction markNotificationRead(item: ApiNotification, id?: string): ApiNotification {\n return {\n ...item,\n read: (!id || id === item.id ? 1 : item.read) as 0 | 1,\n };\n}\n\nfunction isInfiniteData(data: unknown): data is InfiniteNotificationData {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"pages\" in data &&\n \"pageParams\" in data &&\n Array.isArray((data as InfiniteNotificationData).pages)\n );\n}\n\n/**\n * Hook to mark notifications as read with optimistic updates\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful mutation, receives unread count\n * @param onError - Optional callback on error\n *\n * @returns Mutation hook that accepts { id?: string }\n *\n * @example\n * ```typescript\n * const markAsRead = useMarkNotificationsRead(username, code);\n *\n * // Mark specific notification\n * markAsRead.mutate({ id: \"notification-id\" });\n *\n * // Mark all notifications (omit id)\n * markAsRead.mutate({});\n * ```\n */\nexport function useMarkNotificationsRead(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: (unreadCount?: number) => void,\n onError?: (e: Error) => void\n) {\n const queryClient = getQueryClient();\n\n return useMutation({\n mutationKey: [\"notifications\", \"mark-read\", username],\n\n mutationFn: async ({ id }: { id?: string }) => {\n if (!username || !code) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[SDK][Notifications] – missing auth for markNotifications\");\n }\n return;\n }\n return markNotifications(code, id);\n },\n\n // Optimistic update: Immediately mark notifications as read in cache\n onMutate: async ({ id }: { id?: string }) => {\n // Skip optimistic updates when auth is not available\n if (!username || !code) {\n return { previousData: [] };\n }\n\n // Cancel any outgoing refetches to prevent overwriting optimistic update\n await queryClient.cancelQueries({ queryKey: QueryKeys.notifications._prefix });\n\n // Snapshot current state for rollback\n const previousData: Array<[QueryKey, unknown]> = [];\n\n // Update infinite notification list queries (pages structure)\n const infiniteQueries = queryClient.getQueriesData({\n queryKey: QueryKeys.notifications._prefix,\n predicate: (query) => {\n const data = query.state.data;\n return isInfiniteData(data);\n },\n });\n\n infiniteQueries.forEach(([queryKey, data]) => {\n if (data && isInfiniteData(data)) {\n previousData.push([queryKey, data]);\n\n const updatedData: InfiniteNotificationData = {\n ...data,\n pages: data.pages.map((page) =>\n page.map((item) => markNotificationRead(item, id))\n ),\n };\n\n queryClient.setQueryData(queryKey, updatedData);\n }\n });\n\n // Optimistically decrement unread count\n const unreadKey = QueryKeys.notifications.unreadCount(username);\n const currentUnread = queryClient.getQueryData(unreadKey);\n if (typeof currentUnread === \"number\" && currentUnread > 0) {\n previousData.push([unreadKey, currentUnread]);\n\n if (!id) {\n // Mark all: set to 0\n queryClient.setQueryData(unreadKey, 0);\n } else {\n // Mark single: only decrement if the notification is currently unread\n const isUnread = infiniteQueries.some(([, d]) =>\n d?.pages.some((page) =>\n page.some((item) => item.id === id && item.read === 0)\n )\n );\n if (isUnread) {\n queryClient.setQueryData(unreadKey, currentUnread - 1);\n }\n }\n }\n\n // Return context for rollback\n return { previousData };\n },\n\n onSuccess: (response) => {\n // Extract unread count from response if available\n const unreadCount = typeof response === \"object\" && response !== null\n ? (response as { unread?: number }).unread\n : undefined;\n\n // Update unread count cache with server value\n if (typeof unreadCount === \"number\") {\n queryClient.setQueryData(\n QueryKeys.notifications.unreadCount(username),\n unreadCount\n );\n }\n\n onSuccess?.(unreadCount);\n },\n\n // Rollback optimistic update on error\n onError: (error, _variables, context) => {\n // Restore previous state\n if (context?.previousData) {\n context.previousData.forEach(([queryKey, data]) => {\n queryClient.setQueryData(queryKey, data);\n });\n }\n\n onError?.(error as Error);\n },\n\n // Always refetch after mutation settles\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: QueryKeys.notifications._prefix,\n });\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetLastReadOps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface SetLastReadPayload {\n date?: string;\n}\n\nexport function useSetLastRead(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"notifications\", \"set-last-read\"],\n username,\n ({ date }) => buildSetLastReadOps(username!, date),\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.notifications.unreadCount(username),\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a single proposal by ID\n */\nexport function getProposalQueryOptions(id: number) {\n return queryOptions({\n queryKey: [\"proposals\", \"proposal\", id],\n queryFn: async () => {\n const r = await callRPC(\"condenser_api.find_proposals\", [[id]]);\n const proposal = r[0];\n\n // Determine proposal status based on dates\n if (new Date(proposal.start_date) < new Date() && new Date(proposal.end_date) >= new Date()) {\n proposal.status = \"active\";\n } else if (new Date(proposal.end_date) < new Date()) {\n proposal.status = \"expired\";\n } else {\n proposal.status = \"inactive\";\n }\n\n return proposal as Proposal;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get all proposals, sorted with expired proposals at the end\n */\nexport function getProposalsQueryOptions() {\n return queryOptions({\n queryKey: [\"proposals\", \"list\"],\n queryFn: async () => {\n const response = (await callRPC(\"database_api.list_proposals\", {\n start: [-1],\n limit: 500,\n order: \"by_total_votes\",\n order_direction: \"descending\",\n status: \"all\",\n })) as { proposals: Proposal[] };\n\n const proposals = response.proposals;\n const expired = proposals.filter((x) => x.status === \"expired\");\n const others = proposals.filter((x) => x.status !== \"expired\");\n\n return [...others, ...expired];\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { FullAccount } from \"@/modules/accounts\";\nimport { parseAccounts } from \"@/modules/accounts/utils\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// One page = array of enriched vote rows\nexport type ProposalVoteRow = {\n id: number;\n voter: string;\n voterAccount: FullAccount;\n};\n\ntype Cursor = string; // we paginate by last voter name\n\n/**\n * Get proposal votes with pagination and enriched voter account data\n *\n * @param proposalId - The proposal ID\n * @param voter - Starting voter for pagination\n * @param limit - Number of votes per page\n */\nexport function getProposalVotesInfiniteQueryOptions(\n proposalId: number,\n voter: string,\n limit: number\n) {\n return infiniteQueryOptions<\n ProposalVoteRow[],\n Error,\n InfiniteData,\n (string | number)[],\n Cursor\n >({\n queryKey: [\"proposals\", \"votes\", proposalId, voter, limit],\n initialPageParam: voter as Cursor,\n refetchOnMount: true,\n staleTime: 0, // Always refetch on mount\n\n queryFn: async ({ pageParam }: { pageParam: Cursor }) => {\n const startParam = pageParam ?? voter;\n\n const response = (await callRPC(\"condenser_api.list_proposal_votes\", [\n [proposalId, startParam],\n limit,\n \"by_proposal_voter\",\n ])) as ProposalVote[];\n\n const list = response\n .filter((x) => x.proposal?.proposal_id === proposalId)\n .map((x) => ({ id: x.id, voter: x.voter }));\n\n const rawAccounts = await callRPC(\"condenser_api.get_accounts\", [list.map((l) => l.voter)]);\n const accounts = parseAccounts(rawAccounts);\n\n const page: ProposalVoteRow[] = list.map((i) => ({\n ...i,\n voterAccount: accounts.find((a) => i.voter === a.name)!,\n }));\n\n return page;\n },\n\n getNextPageParam: (lastPage: ProposalVoteRow[]): Cursor | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n return last?.voter ?? undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Fetches ALL proposal votes for a specific user in a single query.\n * Much more efficient than querying each proposal individually.\n * Uses \"by_voter_proposal\" order to get all votes by a user.\n */\nexport function getUserProposalVotesQueryOptions(voter: string) {\n return queryOptions({\n queryKey: [\"proposals\", \"votes\", \"by-user\", voter],\n enabled: !!voter && voter !== \"\",\n staleTime: 60 * 1000, // Cache for 1 minute\n queryFn: async () => {\n if (!voter || voter === \"\") {\n return [];\n }\n\n const response = (await callRPC(\"database_api.list_proposal_votes\", {\n start: [voter],\n limit: 1000,\n order: \"by_voter_proposal\",\n order_direction: \"ascending\",\n status: \"votable\",\n })) as { proposal_votes: ProposalVote[] };\n\n // Filter to only this user's votes (API might return votes after this user alphabetically)\n const userVotes = (response.proposal_votes || []).filter((vote) => vote.voter === voter);\n\n return userVotes;\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting on proposals.\n */\nexport interface ProposalVotePayload {\n /** Array of proposal IDs to vote on */\n proposalIds: number[];\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting on Hive proposals.\n *\n * This mutation broadcasts an update_proposal_votes operation to vote on\n * one or more proposals in the Hive Decentralized Fund (HDF).\n *\n * @param username - The username voting on proposals (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 150) if adapter.recordActivity is available\n * - Invalidates proposal list cache to show updated vote status\n * - Invalidates voter's proposal votes cache\n *\n * **Multiple Proposals:**\n * - You can vote on multiple proposals in a single transaction\n * - All proposals receive the same vote (approve or disapprove)\n * - Proposal IDs are integers, not strings\n *\n * **Vote Types:**\n * - approve: true - Vote in favor of the proposal(s)\n * - approve: false - Remove your vote from the proposal(s)\n *\n * @example\n * ```typescript\n * const proposalVoteMutation = useProposalVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Approve a single proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: true\n * });\n *\n * // Approve multiple proposals\n * proposalVoteMutation.mutate({\n * proposalIds: [123, 124, 125],\n * approve: true\n * });\n *\n * // Remove vote from a proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: false\n * });\n * ```\n */\nexport function useProposalVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"vote\"],\n username,\n ({ proposalIds, approve }) => [\n buildProposalVoteOp(username!, proposalIds, approve)\n ],\n async (result: any) => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(150, txId, result?.block_num).catch((error) => {\n console.debug(\"[SDK][Proposals][useProposalVote] recordActivity failed\", {\n activityType: 150,\n blockNum: result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.proposals.list(),\n QueryKeys.proposals.votesByUser(username!)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useProposalVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for proposal votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalCreateOp, type ProposalCreatePayload } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport { type ProposalCreatePayload };\n\nexport function useProposalCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"create\"],\n username,\n (payload) => [\n buildProposalCreateOp(username!, payload)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.proposals.list(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get vesting delegations for an account with infinite scroll support\n *\n * @param username - The account username\n * @param limit - Maximum number of results per page (default: 50)\n */\nexport function getVestingDelegationsQueryOptions(\n username?: string,\n limit = 50\n) {\n return infiniteQueryOptions({\n queryKey: [\"wallet\", \"vesting-delegations\", username, limit],\n initialPageParam: \"\" as string,\n queryFn: async ({ pageParam }: { pageParam: string }) => {\n // Request one extra item on subsequent pages to handle inclusive cursor\n const fetchLimit = pageParam ? limit + 1 : limit;\n\n const result = await callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n pageParam || \"\",\n fetchLimit,\n ]) as DelegatedVestingShare[];\n\n // Filter out duplicate first item on subsequent pages\n // Hive API is inclusive of the 'from' cursor\n if (pageParam && result.length > 0 && result[0]?.delegatee === pageParam) {\n // Return at most limit items after removing the duplicate\n return result.slice(1, limit + 1);\n }\n\n return result;\n },\n getNextPageParam: (lastPage: DelegatedVestingShare[]) => {\n // If we got fewer results than limit, we've reached the end\n if (!lastPage || lastPage.length < limit) {\n return undefined;\n }\n\n // Return the last delegatee as cursor for next page\n const lastDelegation = lastPage[lastPage.length - 1];\n return lastDelegation?.delegatee;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { AccountDelegations } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\n\n/**\n * Account vesting delegations via the HAF balance-api REST endpoint\n * (`/balance-api/accounts/{account-name}/delegations`).\n *\n * Unlike `condenser_api.get_vesting_delegations` (see\n * {@link getHivePowerDelegatesInfiniteQueryOptions}), this returns the\n * complete outgoing AND incoming lists in a single request, with `callREST`\n * handling multi-node failover. `amount` is raw vests (vests * 10^6).\n */\nexport function getAccountDelegationsQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"assets\", \"account-delegations\", username],\n enabled: !!username,\n queryFn: ({ signal }) =>\n callREST(\n \"balance\",\n \"/accounts/{account-name}/delegations\",\n { \"account-name\": username },\n undefined,\n undefined,\n signal\n ) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { VestingDelegationExpiration } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get expiring vesting delegations for an account.\n *\n * When a delegation is removed (set to 0 VESTS), the HP doesn't return\n * immediately — it enters a 5-day cooldown. This query fetches those\n * in-flight expirations so they can be shown alongside active delegations.\n *\n * Uses database_api.find_vesting_delegation_expirations which returns\n * vesting_shares as NAI asset objects ({amount, nai, precision}).\n *\n * @param username - The delegator account username\n */\nexport function getVestingDelegationExpirationsQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"vesting-delegation-expirations\", username],\n queryFn: async () => {\n if (!username) return [];\n const result = await callRPC(\"database_api.find_vesting_delegation_expirations\", { account: username }) as { delegations: VestingDelegationExpiration[] };\n return result.delegations;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HBD to HIVE conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CollateralizedConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get collateralized HIVE to HBD conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getCollateralizedConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"collateralized-conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_collateralized_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { SavingsWithdrawRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get pending savings withdrawal requests for an account\n *\n * @param account - The account username\n */\nexport function getSavingsWithdrawFromQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"savings-withdraw\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_savings_withdraw_from\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.request_id - b.request_id),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get power down (vesting withdrawal) routes for an account\n *\n * @param account - The account username\n */\nexport function getWithdrawRoutesQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"withdraw-routes\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n account,\n \"outgoing\",\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OpenOrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get open market orders for an account\n *\n * @param user - The account username\n */\nexport function getOpenOrdersQueryOptions(user: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"open-orders\", user],\n queryFn: () =>\n callRPC(\"condenser_api.get_open_orders\", [\n user,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.orderid - b.orderid),\n enabled: !!user,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { RcDirectDelegation, RcDirectDelegationsResponse } from \"../types/rc-direct-delegation\";\n\ntype RcPage = RcDirectDelegation[];\ntype RcCursor = string | null;\n\n/**\n * Get outgoing RC delegations for an account\n *\n * @param username - Account name to get delegations for\n * @param limit - Number of delegations per page\n */\nexport function getOutgoingRcDelegationsInfiniteQueryOptions(username: string, limit = 100) {\n return infiniteQueryOptions<\n RcPage,\n Error,\n InfiniteData,\n (string | number)[],\n RcCursor\n >({\n queryKey: [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n initialPageParam: null as RcCursor,\n\n queryFn: async ({ pageParam }: { pageParam: RcCursor }) => {\n const response = await callRPC(\"rc_api.list_rc_direct_delegations\", {\n start: [username, pageParam ?? \"\"],\n limit,\n })\n .then((r: any) => r as RcDirectDelegationsResponse);\n\n let delegations: RcDirectDelegation[] = response.rc_direct_delegations || [];\n\n // Filter out the starting delegation when paginating\n if (pageParam) {\n delegations = delegations.filter((delegation) => delegation.to !== pageParam);\n }\n\n return delegations;\n },\n\n getNextPageParam: (lastPage: RcPage): RcCursor =>\n lastPage.length === limit ? lastPage[lastPage.length - 1].to : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { IncomingRcResponse } from \"../types\";\n\nexport function getIncomingRcQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"wallet\", \"incoming-rc\", username],\n enabled: !!username,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] - Missing username for incoming RC\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/received-rc/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch incoming RC: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { ReceivedVestingShare } from \"../types/received-vesting-share\";\n\nexport function getReceivedVestingSharesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"received-vesting-shares\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch received vesting shares: ${response.status}`);\n }\n\n const data = (await response.json()) as { list: ReceivedVestingShare[] };\n return data.list;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { RecurrentTransfer } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get recurrent transfers for an account\n *\n * @param username - The account username\n */\nexport function getRecurrentTransfersQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"recurrent-transfers\", username],\n queryFn: () =>\n callRPC(\"condenser_api.find_recurrent_transfers\", [\n username,\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { ConfigManager } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\ntype PortfolioLayer = \"points\" | \"hive\" | \"chain\" | \"engine\";\n\ninterface TokenAction {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface PortfolioWalletItem {\n name: string;\n symbol: string;\n layer: PortfolioLayer;\n balance: number;\n fiatRate: number;\n currency: string;\n precision: number;\n address?: string;\n error?: string;\n pendingRewards?: number;\n pendingRewardsFiat?: number;\n liquid?: number;\n liquidFiat?: number;\n savings?: number;\n savingsFiat?: number;\n staked?: number;\n stakedFiat?: number;\n iconUrl?: string;\n actions?: TokenAction[];\n extraData?: Array<{ dataKey: string; value: any }>;\n apr?: number;\n}\n\nexport interface PortfolioResponse {\n username: string;\n currency?: string;\n wallets: PortfolioWalletItem[];\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const direct = Number.parseFloat(trimmed);\n if (Number.isFinite(direct)) {\n return direct;\n }\n\n const sanitized = trimmed.replace(/,/g, \"\");\n const match = sanitized.match(/[-+]?\\d+(?:\\.\\d+)?/);\n if (match) {\n const parsed = Number.parseFloat(match[0]);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseToken(rawToken: unknown): PortfolioWalletItem | undefined {\n if (!rawToken || typeof rawToken !== \"object\") {\n return undefined;\n }\n\n const token = rawToken as Record;\n\n // Portfolio v2 returns well-defined PortfolioItem structure\n return {\n name: normalizeString(token.name) ?? \"\",\n symbol: normalizeString(token.symbol) ?? \"\",\n layer: (normalizeString(token.layer) ?? \"hive\") as PortfolioLayer,\n balance: normalizeNumber(token.balance) ?? 0,\n fiatRate: normalizeNumber(token.fiatRate) ?? 0,\n currency: normalizeString(token.currency) ?? \"usd\",\n precision: normalizeNumber(token.precision) ?? 3,\n address: normalizeString(token.address),\n error: normalizeString(token.error),\n pendingRewards: normalizeNumber(token.pendingRewards),\n pendingRewardsFiat: normalizeNumber(token.pendingRewardsFiat),\n liquid: normalizeNumber(token.liquid),\n liquidFiat: normalizeNumber(token.liquidFiat),\n savings: normalizeNumber(token.savings),\n savingsFiat: normalizeNumber(token.savingsFiat),\n staked: normalizeNumber(token.staked),\n stakedFiat: normalizeNumber(token.stakedFiat),\n iconUrl: normalizeString(token.iconUrl),\n actions: (token.actions ?? []) as TokenAction[],\n extraData: (token.extraData ?? []) as Array<{ dataKey: string; value: any }>,\n apr: normalizeNumber(token.apr),\n };\n}\n\nfunction extractTokens(payload: unknown): unknown[] {\n if (!payload || typeof payload !== \"object\") {\n return [];\n }\n\n const containers = [payload];\n const record = payload as Record;\n if (record.data && typeof record.data === \"object\") {\n containers.push(record.data as Record);\n }\n if (record.result && typeof record.result === \"object\") {\n containers.push(record.result as Record);\n }\n if (record.portfolio && typeof record.portfolio === \"object\") {\n containers.push(record.portfolio as Record);\n }\n\n for (const container of containers) {\n if (Array.isArray(container)) {\n return container;\n }\n\n if (container && typeof container === \"object\") {\n for (const key of [\n \"wallets\",\n \"tokens\",\n \"assets\",\n \"items\",\n \"portfolio\",\n \"balances\",\n ]) {\n const value = (container as Record)[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n }\n\n return [];\n}\n\nfunction resolveUsername(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record;\n return (\n normalizeString(record.username) ??\n normalizeString(record.name) ??\n normalizeString(record.account)\n );\n}\n\n/**\n * Get portfolio query options for fetching user's wallet balances across all layers\n * @param username - Hive username\n * @param currency - Fiat currency code (default: \"usd\")\n * @param onlyEnabled - Only return enabled tokens (default: true)\n * @returns TanStack Query options for portfolio data\n */\nexport function getPortfolioQueryOptions(\n username: string,\n currency: string = \"usd\",\n onlyEnabled: boolean = true\n) {\n return queryOptions({\n queryKey: [\n \"wallet\",\n \"portfolio\",\n \"v2\",\n username,\n onlyEnabled ? \"only-enabled\" : \"all\",\n currency,\n ],\n enabled: Boolean(username),\n staleTime: 60000,\n refetchInterval: 120000,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] – username is required\");\n }\n\n const endpoint = `${ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, onlyEnabled, currency }),\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallet] – Portfolio request failed (${response.status})`\n );\n }\n\n const payload = (await response.json()) as unknown;\n const tokens = extractTokens(payload)\n .map((item) => parseToken(item))\n .filter((item): item is PortfolioWalletItem => Boolean(item))\n // Backend may still emit removed SPK-layer items; drop them defensively\n .filter((item) => (item.layer as string) !== \"spk\");\n\n if (!tokens.length) {\n throw new Error(\n \"[SDK][Wallet] – Portfolio payload contained no tokens\"\n );\n }\n\n return {\n username: resolveUsername(payload) ?? username,\n currency: normalizeString(\n (payload as Record | undefined)?.fiatCurrency ??\n (payload as Record | undefined)?.currency\n )?.toUpperCase(),\n wallets: tokens,\n };\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHiveAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n\n if (!accountData) {\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: 0,\n } satisfies GeneralAssetInfo;\n }\n\n const liquidBalance = parseAsset(accountData.balance).amount;\n const savingsBalance = parseAsset(accountData.savings_balance).amount;\n\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: liquidBalance + savingsBalance,\n parts: [\n {\n name: \"current\",\n balance: liquidBalance,\n },\n {\n name: \"savings\",\n balance: savingsBalance,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHbdAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hbd\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n\n const price = 1;\n\n if (!accountData) {\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance: 0,\n };\n }\n\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance:\n parseAsset(accountData.hbd_balance).amount +\n parseAsset(accountData?.savings_hbd_balance).amount,\n apr: ((dynamicProps?.hbdInterestRate ?? 0) / 100).toFixed(3),\n parts: [\n {\n name: \"current\",\n balance: parseAsset(accountData.hbd_balance).amount,\n },\n {\n name: \"savings\",\n balance: parseAsset(accountData.savings_hbd_balance).amount,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { isEmptyDate, parseAsset, vestsToHp } from \"@/modules/core/utils\";\n\nfunction getAPR(dynamicProps: DynamicProps) {\n const initialInflationRate = 9.5;\n const initialBlock = 7000000;\n const decreaseRate = 250000;\n const decreasePercentPerIncrement = 0.01;\n\n const headBlock = dynamicProps.headBlock;\n const deltaBlocks = headBlock - initialBlock;\n const decreaseIncrements = deltaBlocks / decreaseRate;\n\n let currentInflationRate =\n initialInflationRate - decreaseIncrements * decreasePercentPerIncrement;\n\n if (currentInflationRate < 0.95) {\n currentInflationRate = 0.95;\n }\n\n const vestingRewardPercent = dynamicProps.vestingRewardPercent / 10000;\n const virtualSupply = dynamicProps.virtualSupply;\n const totalVestingFunds = dynamicProps.totalVestingFund;\n\n return (\n (virtualSupply * currentInflationRate * vestingRewardPercent) /\n totalVestingFunds\n ).toFixed(3);\n}\n\nexport function getHivePowerAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n if (!dynamicProps || !accountData) {\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price: 0,\n accountBalance: 0,\n };\n }\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n const price = Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps.base / dynamicProps.quote;\n\n const vestingShares = parseAsset(accountData.vesting_shares).amount;\n const delegatedVests = parseAsset(\n accountData.delegated_vesting_shares\n ).amount;\n const receivedVests = parseAsset(\n accountData.received_vesting_shares\n ).amount;\n const withdrawRateVests = parseAsset(\n accountData.vesting_withdraw_rate\n ).amount;\n const remainingToWithdrawVests = Math.max(\n (Number(accountData.to_withdraw) - Number(accountData.withdrawn)) /\n 1e6,\n 0\n );\n const nextWithdrawalVests = !isEmptyDate(\n accountData.next_vesting_withdrawal\n )\n ? Math.min(withdrawRateVests, remainingToWithdrawVests)\n : 0;\n\n const hpBalance = +vestsToHp(\n vestingShares,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const outgoingDelegationsHp = +vestsToHp(\n delegatedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const incomingDelegationsHp = +vestsToHp(\n receivedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const pendingPowerDownHp = +vestsToHp(\n remainingToWithdrawVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const nextPowerDownHp = +vestsToHp(\n nextWithdrawalVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const totalBalance = Math.max(hpBalance - pendingPowerDownHp, 0);\n const availableHp = Math.max(hpBalance - outgoingDelegationsHp, 0);\n\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price,\n accountBalance: +totalBalance.toFixed(3),\n apr: getAPR(dynamicProps),\n parts: [\n {\n name: \"hp_balance\",\n balance: hpBalance,\n },\n {\n name: \"available\",\n balance: +availableHp.toFixed(3),\n },\n {\n name: \"outgoing_delegations\",\n balance: outgoingDelegationsHp,\n },\n {\n name: \"incoming_delegations\",\n balance: incomingDelegationsHp,\n },\n ...(pendingPowerDownHp > 0\n ? [\n {\n name: \"pending_power_down\",\n balance: +pendingPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ...(nextPowerDownHp > 0 && nextPowerDownHp !== pendingPowerDownHp\n ? [\n {\n name: \"next_power_down\",\n balance: +nextPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { utils } from \"../../../hive-tx\";\nimport { HiveOperationGroup } from \"../types\";\nconst ops = utils.operations;\n\nexport const HIVE_ACCOUNT_OPERATION_GROUPS: Record<\n HiveOperationGroup,\n number[]\n> = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n \"\": [],\n};\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nexport const HIVE_OPERATION_LIST = Object.keys(\n utils.operations\n) as HiveOperationName[];\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nconst operationOrders = utils.operations as Record<\n HiveOperationName,\n number\n>;\n\nexport const HIVE_OPERATION_ORDERS = operationOrders;\n\nexport const HIVE_OPERATION_NAME_BY_ID: Record =\n Object.entries(operationOrders).reduce((acc, [name, id]) => {\n acc[id] = name as HiveOperationName;\n return acc;\n }, {} as Record);\n","import { callRPC } from \"../../../hive-tx\";\nimport { utils } from \"../../../hive-tx\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { HIVE_ACCOUNT_OPERATION_GROUPS } from \"../consts\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationFilterKey,\n HiveOperationFilterValue,\n HiveOperationGroup,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nconst operationOrders = utils.operations;\n\nfunction isHiveOperationName(value: string): value is HiveOperationName {\n return Object.prototype.hasOwnProperty.call(operationOrders, value);\n}\n\nexport function resolveHiveOperationFilters(filters: HiveOperationFilter): {\n filterKey: HiveOperationFilterKey;\n filterArgs: any[];\n} {\n const rawValues: HiveOperationFilterValue[] = Array.isArray(filters)\n ? filters\n : [filters];\n\n const hasAll = rawValues.includes(\"\" as HiveOperationGroup);\n\n const uniqueValues = Array.from(\n new Set(\n rawValues.filter(\n (value): value is HiveOperationFilterValue =>\n value !== undefined &&\n value !== null &&\n value !== (\"\" as HiveOperationGroup)\n )\n )\n );\n\n const filterKey: HiveOperationFilterKey =\n hasAll || uniqueValues.length === 0\n ? \"all\"\n : uniqueValues\n .map((value) => value.toString())\n .sort()\n .join(\"|\");\n\n const operationIds = new Set();\n\n if (!hasAll) {\n uniqueValues.forEach((value) => {\n if (value in HIVE_ACCOUNT_OPERATION_GROUPS) {\n HIVE_ACCOUNT_OPERATION_GROUPS[value as HiveOperationGroup].forEach(\n (id) => operationIds.add(id)\n );\n return;\n }\n\n if (isHiveOperationName(value)) {\n operationIds.add(operationOrders[value]);\n }\n });\n }\n\n const filterArgs = makeBitMaskFilter(Array.from(operationIds));\n\n return {\n filterKey,\n filterArgs,\n };\n}\n\nfunction makeBitMaskFilter(allowedOperations: number[]) {\n let low = 0n;\n let high = 0n;\n\n allowedOperations.forEach((operation) => {\n if (operation < 64) {\n low |= 1n << BigInt(operation);\n } else {\n high |= 1n << BigInt(operation - 64);\n }\n });\n\n return [\n low !== 0n ? low.toString() : null,\n high !== 0n ? high.toString() : null,\n ];\n}\n\nexport function getHiveAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterArgs, filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n initialData: { pages: [], pageParams: [] },\n initialPageParam: -1,\n getNextPageParam: (lastPage, __) =>\n lastPage ? +(lastPage[lastPage.length - 1]?.num ?? 0) - 1 : -1,\n\n queryFn: async ({ pageParam }) => {\n const response = await callRPC(\n \"condenser_api.get_account_history\",\n [username, pageParam, limit, ...filterArgs]\n );\n\n return response.map(\n (x: any) =>\n ({\n num: x[0],\n type: x[1].op[0],\n timestamp: x[1].timestamp,\n trx_id: x[1].trx_id,\n ...x[1].op[1],\n }) satisfies HiveTransaction\n );\n },\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hivePayout = parseAsset(\n (item as AuthorReward).hive_payout\n );\n return hivePayout.amount > 0;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HIVE\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HIVE\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HIVE\"].includes(asset.symbol);\n\n case \"claim_reward_balance\":\n const rewardHive = parseAsset(\n (item as ClaimRewardBalance).reward_hive\n );\n return rewardHive.amount > 0;\n\n case \"curation_reward\":\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHbdAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hbdPayout = parseAsset(\n (item as AuthorReward).hbd_payout\n );\n return hbdPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardHbd = parseAsset(\n (item as ClaimRewardBalance).reward_hbd\n );\n return rewardHbd.amount > 0;\n\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HBD\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HBD\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HBD\"].includes(asset.symbol);\n\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n case \"proposal_pay\":\n case \"interest\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHivePowerAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n const userSelectedOperations = new Set(\n Array.isArray(filters) ? filters : [filters]\n );\n const hasAllFilter =\n userSelectedOperations.has(\"\" as any) || userSelectedOperations.size === 0;\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const vestingPayout = parseAsset(\n (item as AuthorReward).vesting_payout\n );\n return vestingPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardVests = parseAsset(\n (item as ClaimRewardBalance).reward_vests\n );\n return rewardVests.amount > 0;\n\n case \"transfer_to_vesting\":\n return true;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"recurrent_transfer\":\n return [\"VESTS\", \"HP\"].includes(parseAsset(item.amount).symbol);\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"VESTS\", \"HP\"].includes(asset.symbol);\n\n case \"curation_reward\":\n case \"withdraw_vesting\":\n case \"delegate_vesting_shares\":\n case \"fill_vesting_withdraw\":\n case \"return_vesting_delegation\":\n case \"producer_reward\":\n case \"set_withdraw_vesting_route\":\n return true;\n default:\n return hasAllFilter || userSelectedOperations.has(item.type);\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveMarketMetric } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nfunction subtractSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() - seconds * 1000);\n}\n\nexport function getHiveAssetMetricQueryOptions(bucketSeconds = 86_400) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n queryFn: async ({ pageParam: [startDate, endDate] }) => {\n const apiData: HiveMarketMetric[] = await callRPC(\"condenser_api.get_market_history\", [bucketSeconds, formatDate(startDate), formatDate(endDate)]\n );\n\n return apiData.map(({ hive, non_hive, open }) => ({\n close: non_hive.close / hive.close,\n open: non_hive.open / hive.open,\n low: non_hive.low / hive.low,\n high: non_hive.high / hive.high,\n volume: hive.volume,\n time: new Date(open),\n }));\n },\n initialPageParam: [\n subtractSeconds(new Date(), Math.max(100 * bucketSeconds, 28_800)),\n new Date(),\n ],\n getNextPageParam: (_, __, [prevStartDate]) => [\n subtractSeconds(prevStartDate, Math.max(100 * bucketSeconds, 28_800)),\n subtractSeconds(prevStartDate, bucketSeconds),\n ],\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHiveAssetWithdrawalRoutesQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"withdrawal-routes\", username],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n username,\n \"outgoing\",\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHivePowerDelegatesInfiniteQueryOptions(\n username: string,\n limit = 50\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegates\", username],\n enabled: !!username,\n queryFn: () =>\n callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n \"\",\n limit,\n ]) as Promise,\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { ReceivedVestingShare } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHivePowerDelegatingsQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegatings\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()).list as ReceivedVestingShare[];\n },\n select: (data) =>\n data.sort(\n (a, b) =>\n parseAsset(b.vesting_shares).amount -\n parseAsset(a.vesting_shares).amount\n ),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get the internal HIVE/HBD market order book\n *\n * @param limit - Maximum number of orders to fetch (default: 500)\n */\nexport function getOrderBookQueryOptions(limit = 500) {\n return queryOptions({\n queryKey: [\"market\", \"order-book\", limit],\n queryFn: () =>\n callRPC(\"condenser_api.get_order_book\", [\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market statistics from the blockchain\n */\nexport function getMarketStatisticsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"statistics\"],\n queryFn: () =>\n callRPC(\"condenser_api.get_ticker\", []) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketCandlestickDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market history (candlestick data)\n *\n * @param seconds - Bucket size in seconds\n * @param startDate - Start date for the data\n * @param endDate - End date for the data\n */\nexport function getMarketHistoryQueryOptions(\n seconds: number,\n startDate: Date,\n endDate: Date\n) {\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n return queryOptions({\n queryKey: [\"market\", \"history\", seconds, startDate.getTime(), endDate.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_market_history\", [\n seconds,\n formatDate(startDate),\n formatDate(endDate),\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveHbdStats, MarketCandlestickDataItem, MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get combined HIVE/HBD statistics including price, 24h change, and volume\n */\nexport function getHiveHbdStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"hive-hbd-stats\"],\n queryFn: async () => {\n // Get current market statistics\n const stats = (await callRPC(\"condenser_api.get_ticker\", [])) as MarketStatistics;\n\n // Get 24h market history\n const now = new Date();\n const oneDayAgo = new Date(now.getTime() - 86400000); // 24 hours ago\n\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n const dayChange = (await callRPC(\"condenser_api.get_market_history\", [86400, formatDate(oneDayAgo), formatDate(now)]\n )) as MarketCandlestickDataItem[];\n\n // Calculate stats\n const result: HiveHbdStats = {\n price: +stats.latest,\n close: dayChange[0] ? dayChange[0].non_hive.open / dayChange[0].hive.open : 0,\n high: dayChange[0] ? dayChange[0].non_hive.high / dayChange[0].hive.high : 0,\n low: dayChange[0] ? dayChange[0].non_hive.low / dayChange[0].hive.low : 0,\n percent: dayChange[0]\n ? 100 - ((dayChange[0].non_hive.open / dayChange[0].hive.open) * 100) / +stats.latest\n : 0,\n totalFromAsset: stats.hive_volume.split(\" \")[0],\n totalToAsset: stats.hbd_volume.split(\" \")[0],\n };\n\n return result;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketData } from \"../types\";\nimport { getBoundFetch } from \"@/modules/core\";\n\n/**\n * Get market chart data from CoinGecko API\n *\n * @param coin - Coin ID (e.g., \"hive\", \"bitcoin\")\n * @param vsCurrency - Currency to compare against (e.g., \"usd\", \"eur\")\n * @param fromTs - From timestamp (Unix timestamp in seconds)\n * @param toTs - To timestamp (Unix timestamp in seconds)\n */\nexport function getMarketDataQueryOptions(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n) {\n return queryOptions({\n queryKey: [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n queryFn: async ({ signal }) => {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n\n const response = await fetchApi(url, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch market data: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date) {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n}\n\nexport function getTradeHistoryQueryOptions(\n limit = 1000,\n startDate?: Date,\n endDate?: Date\n) {\n const end = endDate ?? new Date();\n const start =\n startDate ?? new Date(end.getTime() - 10 * 60 * 60 * 1000);\n\n return queryOptions({\n queryKey: [\"market\", \"trade-history\", limit, start.getTime(), end.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_trade_history\", [\n formatDate(start),\n formatDate(end),\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FeedHistoryItem {\n id: number;\n current_median_history: {\n base: string;\n quote: string;\n };\n market_median_history: {\n base: string;\n quote: string;\n };\n current_min_history: {\n base: string;\n quote: string;\n };\n current_max_history: {\n base: string;\n quote: string;\n };\n price_history: Array<{\n base: string;\n quote: string;\n }>;\n}\n\n/**\n * Get feed history from the blockchain\n * Returns price feed history including median prices\n */\nexport function getFeedHistoryQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"feed-history\"],\n queryFn: async () => {\n try {\n const feedHistory = await callRPC(\"condenser_api.get_feed_history\", []);\n return feedHistory as FeedHistoryItem;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface MedianHistoryPrice {\n base: string;\n quote: string;\n}\n\n/**\n * Get current median history price from the blockchain\n * Returns the current median price for HIVE/HBD conversion\n */\nexport function getCurrentMedianHistoryPriceQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"current-median-history-price\"],\n queryFn: async () => {\n try {\n const price = await callRPC(\"condenser_api.get_current_median_history_price\", []);\n return price as MedianHistoryPrice;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCreateOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCreatePayload {\n amountToSell: string;\n minToReceive: string;\n fillOrKill: boolean;\n expiration: string;\n orderId: number;\n}\n\nexport function useLimitOrderCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-create\"],\n username,\n (payload) => [\n buildLimitOrderCreateOp(\n username!,\n payload.amountToSell,\n payload.minToReceive,\n payload.fillOrKill,\n payload.expiration,\n payload.orderId\n )\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCancelOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCancelPayload {\n orderId: number;\n}\n\nexport function useLimitOrderCancel(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-cancel\"],\n username,\n ({ orderId }) => [\n buildLimitOrderCancelOp(username!, orderId)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { MarketData } from \"./types\";\nimport { CurrencyRates } from \"@/modules/private-api/types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n const data = (await response.json()) as T;\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n return data;\n}\n\nexport async function getMarketData(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n): Promise {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n const response = await fetchApi(url);\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRate(cur: string): Promise {\n if (cur === \"hbd\") {\n return 1;\n }\n\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${cur}`;\n const response = await fetchApi(url);\n const data = await parseJsonResponse<{ hive_dollar: Record }>(response);\n return data.hive_dollar[cur];\n}\n\nexport async function getCurrencyTokenRate(currency: string, token: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost +\n `/private-api/market-data/${currency === \"hbd\" ? \"usd\" : currency}/${token}`\n );\n\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRates(): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/market-data/latest\");\n return parseJsonResponse(response);\n}\n\nexport async function getHivePrice(): Promise<{ hive: { usd: number } }> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n \"https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd\"\n );\n return parseJsonResponse<{ hive: { usd: number } }>(response);\n}\n","import { ConfigManager, getBoundFetch } from \"@/modules/core\";\nimport type { HiveEngineOpenOrder } from \"./types\";\n\ntype EngineOrderBookEntry = {\n txId: string;\n timestamp: number;\n account: string;\n symbol: string;\n quantity: string;\n price: string;\n tokensLocked?: string;\n};\n\nconst ENGINE_RPC_HEADERS = { \"Content-type\": \"application/json\" };\n\nasync function engineRpc(payload: Record): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(`${baseUrl}/private-api/engine-api`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: ENGINE_RPC_HEADERS,\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – request failed with ${response.status}`\n );\n }\n\n const data = (await response.json()) as { result: T };\n return data.result;\n}\n\nasync function engineRpcSafe(\n payload: Record,\n fallback: T\n): Promise {\n try {\n return await engineRpc(payload);\n } catch (e) {\n return fallback;\n }\n}\n\nexport async function getHiveEngineOrderBook(\n symbol: string,\n limit: number = 50\n): Promise<{ buy: T[]; sell: T[] }> {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buy, sell] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"price\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"price\", descending: false }],\n },\n },\n []\n ),\n ]);\n\n const sortByPriceDesc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return right - left;\n });\n const sortByPriceAsc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return left - right;\n });\n\n return {\n buy: sortByPriceDesc(buy),\n sell: sortByPriceAsc(sell),\n };\n}\n\nexport async function getHiveEngineTradeHistory>(\n symbol: string,\n limit: number = 50\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"tradesHistory\",\n query: { symbol },\n limit,\n offset: 0,\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineOpenOrders(\n account: string,\n symbol: string,\n limit: number = 100\n): Promise {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol, account },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buyRaw, sellRaw] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n ]);\n\n const formatTotal = (quantity: string, price: string) =>\n (Number(quantity || 0) * Number(price || 0)).toFixed(8);\n\n const buy: HiveEngineOpenOrder[] = buyRaw.map((order) => ({\n id: order.txId,\n type: \"buy\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: order.tokensLocked ?? formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n const sell: HiveEngineOpenOrder[] = sellRaw.map((order) => ({\n id: order.txId,\n type: \"sell\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n return [...buy, ...sell].sort((a, b) => b.timestamp - a.timestamp) as T[];\n}\n\n/**\n * Market metrics, optionally narrowed to one symbol or to a list of them.\n *\n * An unfiltered call is served from a single page – the node caps `find` at 1000 rows\n * while Hive engine has far more traded tokens than that – so callers that only care\n * about specific symbols must pass them. Scanning the unfiltered page for a symbol\n * silently reports \"no market\" for everything outside it.\n */\nexport async function getHiveEngineMetrics>(\n symbol?: string | string[],\n account?: string\n): Promise {\n if (Array.isArray(symbol) && symbol.length === 0) {\n return [];\n }\n\n const symbolQuery = Array.isArray(symbol)\n ? { symbol: { $in: symbol } }\n : symbol\n ? { symbol }\n : {};\n\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"metrics\",\n query: {\n ...symbolQuery,\n ...(account ? { account } : {}),\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMarket>(\n account?: string,\n symbol?: string | string[]\n): Promise {\n return getHiveEngineMetrics(symbol, account);\n}\n\nexport async function getHiveEngineTokensBalances>(\n username: string\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"balances\",\n query: {\n account: username,\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMetadata>(\n tokens: string[]\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"tokens\",\n query: {\n symbol: { $in: tokens },\n },\n },\n id: 2,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokenTransactions>(\n username: string,\n symbol: string,\n limit: number,\n offset: number\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-account-history\", baseUrl);\n url.searchParams.set(\"account\", username);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"limit\", limit.toString());\n url.searchParams.set(\"offset\", offset.toString());\n\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – account history failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineTokenMetrics>(\n symbol: string,\n interval = \"daily\"\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-chart-api\", baseUrl);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"interval\", interval);\n\n const response = await fetchApi(url.toString(), {\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – chart failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineUnclaimedRewards>(\n username: string\n): Promise> {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(\n `${baseUrl}/private-api/engine-reward-api/${username}?hive=1`\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – rewards failed with ${response.status}`\n );\n }\n\n return (await response.json()) as Record;\n}\n","import { getHiveEngineTokensBalances } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenBalance } from \"../types\";\n\nexport function getHiveEngineTokensBalancesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"balances\", username] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensBalances(username);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMarketResponse } from \"../types\";\nimport { getHiveEngineTokensMarket } from \"../requests\";\n\nexport function getHiveEngineTokensMarketQueryOptions() {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"markets\"],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMarket();\n },\n });\n}\n","import { getHiveEngineTokensMetadata } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenMetadataResponse } from \"../types\";\n\nexport function getHiveEngineTokensMetadataQueryOptions(tokens: string[]) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"metadata-list\", tokens] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMetadata(tokens);\n },\n });\n}\n","import { getHiveEngineTokenTransactions } from \"../requests\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTransaction } from \"../types\";\n\nexport function getHiveEngineTokenTransactionsQueryOptions(\n username: string | undefined,\n symbol: string,\n limit = 20\n) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"transactions\", username],\n enabled: !!symbol && !!username,\n initialPageParam: 0,\n queryFn: async ({ pageParam }) => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n return getHiveEngineTokenTransactions(\n username,\n symbol,\n limit,\n pageParam as number\n );\n },\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n (lastPage?.length ?? 0) === limit ? (lastPageParam as number) + limit : undefined,\n getPreviousPageParam: (_firstPage, _allPages, firstPageParam) =>\n (firstPageParam as number) > 0 ? (firstPageParam as number) - limit : undefined,\n });\n}\n","import { getHiveEngineTokenMetrics } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMetric } from \"../types\";\n\nexport function getHiveEngineTokensMetricsQueryOptions(\n symbol: string,\n interval = \"daily\"\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokenMetrics(symbol, interval);\n },\n });\n}\n","import { getHiveEngineUnclaimedRewards } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenStatus } from \"../types\";\n\nexport function getHiveEngineUnclaimedRewardsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"unclaimed\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n enabled: !!username,\n queryFn: async () => {\n try {\n const data = await getHiveEngineUnclaimedRewards(\n username as string\n );\n return Object.values(data).filter(\n ({ pending_token }) => pending_token > 0\n );\n } catch (e) {\n return [];\n }\n },\n });\n}\n","import { getHiveEngineTokensMarket } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenInfo } from \"../types\";\n\nexport function getAllHiveEngineTokensQueryOptions(\n account?: string,\n symbol?: string | string[]\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"all-tokens\", account, symbol] as const,\n queryFn: async () => {\n return getHiveEngineTokensMarket(account, symbol);\n },\n });\n}\n","interface Options {\n fractionDigits?: number;\n prefix?: string;\n suffix?: string;\n}\n\nexport function formattedNumber(\n value: number | string,\n options: Options | undefined = undefined\n) {\n let opts: Options = {\n fractionDigits: 3,\n prefix: \"\",\n suffix: \"\",\n };\n\n if (options) {\n opts = { ...opts, ...options };\n }\n\n const { fractionDigits, prefix, suffix } = opts;\n\n let out = \"\";\n\n if (prefix) out += prefix + \" \";\n // turn too small values to zero. Bug: https://github.com/adamwdraper/Numeral-js/issues/563\n const av = Math.abs(parseFloat(value.toString())) < 0.0001 ? 0 : value;\n const num = typeof av === \"string\" ? parseFloat(av) : av;\n out += num.toLocaleString(\"en-US\", {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n useGrouping: true,\n });\n if (suffix) out += \" \" + suffix;\n\n return out;\n}\n","import { formattedNumber } from \"./formatted-number\";\n\ninterface HiveEngineTokenProps {\n symbol: string;\n name: string;\n icon: string;\n precision: number;\n stakingEnabled: boolean;\n delegationEnabled: boolean;\n balance: string;\n stake: string;\n delegationsIn: string;\n delegationsOut: string;\n usdValue: number;\n}\n\nexport class HiveEngineToken {\n symbol: string;\n name?: string;\n icon?: string;\n\n precision?: number;\n stakingEnabled?: boolean;\n delegationEnabled?: boolean;\n balance: number;\n stake: number;\n stakedBalance: number;\n delegationsIn: number;\n delegationsOut: number;\n usdValue: number;\n\n constructor(props: HiveEngineTokenProps) {\n this.symbol = props.symbol;\n this.name = props.name || \"\";\n this.icon = props.icon || \"\";\n\n this.precision = props.precision || 0;\n this.stakingEnabled = props.stakingEnabled || false;\n this.delegationEnabled = props.delegationEnabled || false;\n this.balance = parseFloat(props.balance) || 0;\n this.stake = parseFloat(props.stake) || 0;\n this.delegationsIn = parseFloat(props.delegationsIn) || 0;\n this.delegationsOut = parseFloat(props.delegationsOut) || 0;\n this.stakedBalance =\n this.stake + this.delegationsIn - this.delegationsOut;\n this.usdValue = props.usdValue;\n }\n\n hasDelegations = (): boolean => {\n if (!this.delegationEnabled) {\n return false;\n }\n\n return this.delegationsIn > 0 && this.delegationsOut > 0;\n };\n\n delegations = (): string => {\n if (!this.hasDelegations()) {\n return \"\";\n }\n\n return `(${formattedNumber(this.stake, {\n fractionDigits: this.precision,\n })} + ${formattedNumber(this.delegationsIn, {\n fractionDigits: this.precision,\n })} - ${formattedNumber(this.delegationsOut, {\n fractionDigits: this.precision,\n })})`;\n };\n\n staked = (): string => {\n if (!this.stakingEnabled) {\n return \"-\";\n }\n\n if (this.stakedBalance < 0.0001) {\n return this.stakedBalance.toString();\n }\n\n return formattedNumber(this.stakedBalance, {\n fractionDigits: this.precision,\n });\n };\n\n balanced = (): string => {\n if (this.balance < 0.0001) {\n return this.balance.toString();\n }\n\n return formattedNumber(this.balance, { fractionDigits: this.precision });\n };\n}\n","import {\n getHiveEngineTokensBalances,\n getHiveEngineTokensMarket,\n getHiveEngineTokensMetadata,\n} from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type {\n HiveEngineTokenBalance,\n Token,\n TokenMetadata,\n HiveEngineTokenInfo,\n} from \"../types\";\nimport { HiveEngineToken } from \"../utils\";\n\ninterface DynamicProps {\n base: number;\n quote: number;\n}\n\nexport function getHiveEngineBalancesWithUsdQueryOptions(\n account: string,\n dynamicProps?: DynamicProps,\n allTokens?: HiveEngineTokenInfo[]\n) {\n return queryOptions({\n queryKey: [\n \"assets\",\n \"hive-engine\",\n \"balances-with-usd\",\n account,\n dynamicProps,\n allTokens,\n ] as const,\n queryFn: async () => {\n if (!account) {\n throw new Error(\"[HiveEngine] No account in a balances query\");\n }\n\n const balances = await getHiveEngineTokensBalances(account);\n\n const tokens = await getHiveEngineTokensMetadata(\n balances.map((t) => t.symbol)\n );\n\n const pricePerHive = dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0;\n const providedMetrics: ReadonlyArray = Array.isArray(\n allTokens\n )\n ? allTokens\n : [];\n\n // Whatever the caller passed comes from an unfiltered metrics call, which the node\n // caps at 1000 rows – held tokens outside that page have no price and used to be\n // valued at zero, understating the wallet. Ask for the missing ones by symbol.\n const unpricedSymbols = balances\n .map((balance) => balance.symbol)\n .filter(\n (symbol) =>\n symbol !== \"SWAP.HIVE\" &&\n !providedMetrics.some((metric) => metric.symbol === symbol)\n );\n\n const metrics: ReadonlyArray = [\n ...providedMetrics,\n ...(unpricedSymbols.length\n ? await getHiveEngineTokensMarket(\n undefined,\n unpricedSymbols\n )\n : []),\n ];\n\n return balances.map((balance) => {\n const token = tokens.find((t) => t.symbol === balance.symbol);\n let tokenMetadata: TokenMetadata | undefined;\n\n if (token?.metadata) {\n try {\n tokenMetadata = JSON.parse(token.metadata) as TokenMetadata;\n } catch {\n tokenMetadata = undefined;\n }\n }\n\n const metric = metrics.find((m) => m.symbol === balance.symbol);\n const lastPrice = Number(metric?.lastPrice ?? \"0\");\n const balanceAmount = Number(balance.balance);\n\n const usdValue =\n balance.symbol === \"SWAP.HIVE\"\n ? pricePerHive * balanceAmount\n : lastPrice === 0\n ? 0\n : Number(\n (lastPrice * pricePerHive * balanceAmount).toFixed(10)\n );\n\n return new HiveEngineToken({\n symbol: balance.symbol,\n name: token?.name ?? balance.symbol,\n icon: tokenMetadata?.icon ?? \"\",\n precision: token?.precision ?? 0,\n stakingEnabled: token?.stakingEnabled ?? false,\n delegationEnabled: token?.delegationEnabled ?? false,\n balance: balance.balance,\n stake: balance.stake,\n delegationsIn: balance.delegationsIn,\n delegationsOut: balance.delegationsOut,\n usdValue,\n });\n });\n },\n enabled: !!account,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getHiveEngineTokensMetadataQueryOptions } from \"./get-hive-engine-tokens-metadata-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"./get-hive-engine-tokens-balances-query-options\";\nimport { getAllHiveEngineTokensQueryOptions } from \"./get-all-hive-engine-tokens-query-options\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"@/modules/wallet/queries/get-hive-asset-general-info-query-options\";\n\nexport function getHiveEngineTokenGeneralInfoQueryOptions(\n username?: string,\n symbol?: string\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"general-info\", username],\n enabled: !!symbol && !!username,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n const queryClient = getQueryClient();\n const hiveQuery = getHiveAssetGeneralInfoQueryOptions(username);\n await queryClient.prefetchQuery(hiveQuery);\n const hiveData = queryClient.getQueryData(\n hiveQuery.queryKey\n );\n\n const metadataList = await queryClient.ensureQueryData(\n getHiveEngineTokensMetadataQueryOptions([symbol])\n );\n\n const balanceList = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n // Scoped to this symbol: the unfiltered metrics call is capped at 1000 rows, so a\n // token outside that page reported no market and rendered a zero price.\n const marketList = await queryClient.ensureQueryData(\n getAllHiveEngineTokensQueryOptions(undefined, symbol)\n );\n\n const metadata = metadataList?.find((i) => i.symbol === symbol);\n const balance = balanceList?.find((i) => i.symbol === symbol);\n const market = marketList?.find((i) => i.symbol === symbol);\n\n const lastPrice = +(market?.lastPrice ?? \"0\");\n\n const liquidBalance = parseFloat(balance?.balance ?? \"0\");\n const stakedBalance = parseFloat(balance?.stake ?? \"0\");\n const unstakingBalance = parseFloat(balance?.pendingUnstake ?? \"0\");\n\n const parts: GeneralAssetInfo[\"parts\"] = [\n { name: \"liquid\", balance: liquidBalance },\n { name: \"staked\", balance: stakedBalance },\n ];\n\n if (unstakingBalance > 0) {\n parts.push({ name: \"unstaking\", balance: unstakingBalance });\n }\n\n return {\n name: symbol,\n title: metadata?.name ?? \"\",\n price: lastPrice === 0 ? 0 : Number(lastPrice * (hiveData?.price ?? 0)),\n accountBalance: liquidBalance + stakedBalance,\n layer: \"ENGINE\",\n parts,\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PointTransaction } from \"../types/point-transaction\";\n\ninterface PointsResponse {\n points: string;\n unclaimed_points: string;\n}\n\nexport function getPointsQueryOptions(username?: string, filter = 0) {\n return queryOptions({\n queryKey: [\"points\", username, filter],\n queryFn: async () => {\n if (!username) {\n throw new Error(\"Get points query – username wasn't provided\");\n }\n\n const name = username.replace(\"@\", \"\");\n\n // Get points\n const pointsResponse = await fetch(CONFIG.privateApiHost + \"/private-api/points\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name }),\n });\n\n if (!pointsResponse.ok) {\n throw new Error(`Failed to fetch points: ${pointsResponse.status}`);\n }\n\n const points = (await pointsResponse.json()) as PointsResponse;\n\n // Get transactions\n const transactionsResponse = await fetch(\n CONFIG.privateApiHost + \"/private-api/point-list\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name, type: filter }),\n }\n );\n\n if (!transactionsResponse.ok) {\n throw new Error(`Failed to fetch point transactions: ${transactionsResponse.status}`);\n }\n\n const transactions = (await transactionsResponse.json()) as PointTransaction[];\n\n return {\n points: points.points,\n uPoints: points.unclaimed_points,\n transactions,\n } as const;\n },\n staleTime: 30000,\n refetchOnMount: true,\n enabled: !!username,\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getPointsQueryOptions } from \"./get-points-query-options\";\n\nexport function getPointsAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getPointsQueryOptions(username));\n const data = getQueryClient().getQueryData(\n getPointsQueryOptions(username).queryKey\n );\n return {\n name: \"POINTS\",\n title: \"Ecency Points\",\n price: 0.002,\n accountBalance: +(data?.points ?? 0),\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { PointTransaction } from \"../types\";\nimport { PointTransactionType } from \"../types\";\nimport type { GeneralAssetTransaction } from \"@/modules/wallet/types\";\n\nexport function getPointsAssetTransactionsQueryOptions(\n username: string | undefined,\n type?: PointTransactionType\n) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"transactions\", username, type],\n queryFn: async () => {\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/point-list`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n type: type ?? 0,\n }),\n }\n );\n const data = (await response.json()) as PointTransaction[];\n return data.map(({ created, type, amount, id, sender, receiver, memo }) => ({\n created: new Date(created),\n type,\n results: [\n {\n amount: parseFloat(amount),\n asset: \"POINTS\",\n },\n ],\n id,\n from: sender ?? undefined,\n to: receiver ?? undefined,\n memo: memo ?? undefined,\n })) satisfies GeneralAssetTransaction[];\n },\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { getCurrencyRate } from \"@/modules/market\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"./get-hive-asset-general-info-query-options\";\nimport { getHbdAssetGeneralInfoQueryOptions } from \"./get-hbd-asset-general-info-query-options\";\nimport { getHivePowerAssetGeneralInfoQueryOptions } from \"./get-hive-power-asset-general-info-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getHiveEngineTokenGeneralInfoQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getPointsAssetGeneralInfoQueryOptions } from \"@/modules/points/queries\";\nimport {\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"./get-portfolio-query-options\";\n\ninterface Options {\n refetch?: boolean;\n currency?: string;\n}\n\nexport function getAccountWalletAssetInfoQueryOptions(\n username: string,\n asset: string,\n options: Options = { refetch: false }\n) {\n const queryClient = getQueryClient();\n const currency = options.currency ?? \"usd\";\n\n const fetchQuery = async (qo: any) => {\n if (options.refetch) {\n await queryClient.fetchQuery(qo);\n } else {\n await queryClient.prefetchQuery(qo);\n }\n return queryClient.getQueryData(qo.queryKey);\n };\n\n const convertPriceToUserCurrency = async (\n assetInfo: GeneralAssetInfo | undefined\n ): Promise => {\n if (!assetInfo || currency === \"usd\") {\n return assetInfo;\n }\n\n try {\n const conversionRate = await getCurrencyRate(currency);\n return {\n ...assetInfo,\n price: assetInfo.price * conversionRate,\n };\n } catch (error) {\n console.warn(`Failed to convert price from USD to ${currency}:`, error);\n return assetInfo;\n }\n };\n\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n\n const getPortfolioAssetInfo = async () => {\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const assetItem = portfolio.wallets.find(\n (item: PortfolioWalletItem) =>\n item.symbol.toUpperCase() === asset.toUpperCase()\n );\n\n if (!assetItem) return undefined;\n\n const parts: Array<{ name: string; balance: number }> = [];\n\n if (assetItem.liquid !== undefined && assetItem.liquid !== null) {\n parts.push({ name: \"liquid\", balance: assetItem.liquid });\n }\n\n if (assetItem.staked !== undefined && assetItem.staked !== null && assetItem.staked > 0) {\n parts.push({ name: \"staked\", balance: assetItem.staked });\n }\n\n if (assetItem.savings !== undefined && assetItem.savings !== null && assetItem.savings > 0) {\n parts.push({ name: \"savings\", balance: assetItem.savings });\n }\n\n if (assetItem.extraData && Array.isArray(assetItem.extraData)) {\n for (const extraItem of assetItem.extraData) {\n if (!extraItem || typeof extraItem !== \"object\") continue;\n\n const dataKey = extraItem.dataKey;\n const value = extraItem.value;\n\n if (typeof value === \"string\") {\n const cleanValue = value.replace(/,/g, \"\");\n const match = cleanValue.match(/[+-]?\\s*(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const numValue = Math.abs(Number.parseFloat(match[1]));\n\n if (dataKey === \"delegated_hive_power\") {\n parts.push({ name: \"outgoing_delegations\", balance: numValue });\n } else if (dataKey === \"received_hive_power\") {\n parts.push({ name: \"incoming_delegations\", balance: numValue });\n } else if (dataKey === \"powering_down_hive_power\") {\n parts.push({ name: \"pending_power_down\", balance: numValue });\n }\n }\n }\n }\n }\n\n return {\n name: assetItem.symbol,\n title: assetItem.name,\n price: assetItem.fiatRate,\n accountBalance: assetItem.balance,\n apr: assetItem.apr?.toString(),\n layer: assetItem.layer,\n pendingRewards: assetItem.pendingRewards,\n parts,\n } as GeneralAssetInfo;\n } catch {\n return undefined;\n }\n };\n\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n queryFn: async () => {\n const portfolioAssetInfo = await getPortfolioAssetInfo();\n\n if (portfolioAssetInfo && portfolioAssetInfo.price > 0) {\n return portfolioAssetInfo;\n }\n\n let assetInfo: GeneralAssetInfo | undefined;\n\n if (asset === \"HIVE\") {\n assetInfo = await fetchQuery(getHiveAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HP\") {\n assetInfo = await fetchQuery(getHivePowerAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HBD\") {\n assetInfo = await fetchQuery(getHbdAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"POINTS\") {\n assetInfo = await fetchQuery(getPointsAssetGeneralInfoQueryOptions(username));\n } else {\n // Check if it's a Hive Engine token\n const balances = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n if (balances.some((balance) => balance.symbol === asset)) {\n assetInfo = await fetchQuery(\n getHiveEngineTokenGeneralInfoQueryOptions(username, asset)\n );\n } else if (portfolioAssetInfo) {\n // Unknown asset but portfolio has data — use it as-is\n return portfolioAssetInfo;\n } else {\n throw new Error(\n `[SDK][Wallet] – unrecognized asset \"${asset}\"`\n );\n }\n }\n\n // If portfolio had rich data (parts, balance) but zero price,\n // merge the fallback price into the portfolio data\n if (portfolioAssetInfo && assetInfo && assetInfo.price > 0) {\n const converted = await convertPriceToUserCurrency(assetInfo);\n return {\n ...portfolioAssetInfo,\n price: converted!.price,\n };\n }\n\n return await convertPriceToUserCurrency(assetInfo);\n },\n });\n}\n","export enum AssetOperation {\n // Common\n Transfer = \"transfer\",\n\n // APR\n TransferToSavings = \"transfer-saving\",\n WithdrawFromSavings = \"withdraw-saving\",\n Delegate = \"delegate\",\n PowerUp = \"power-up\",\n PowerDown = \"power-down\",\n WithdrawRoutes = \"withdraw-routes\",\n ClaimInterest = \"claim-interest\",\n Swap = \"swap\",\n Convert = \"convert\",\n\n // Points\n Gift = \"gift\",\n Promote = \"promote\",\n Claim = \"claim\",\n Buy = \"buy\",\n\n // Layer 2\n Stake = \"stake\",\n Unstake = \"unstake\",\n Undelegate = \"undelegate\",\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for transferring tokens.\n */\nexport interface TransferPayload {\n /** Recipient account */\n to: string;\n /** Amount with asset symbol (e.g., \"1.000 HIVE\", \"5.000 HBD\") */\n amount: string;\n /** Transfer memo */\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring tokens.\n *\n * This mutation broadcasts a transfer operation to send HIVE or HBD\n * to another account. **Requires ACTIVE authority**.\n *\n * Uses `useBroadcastMutation` with the smart auth strategy:\n * - Adapter determines login type and dispatches to appropriate method\n * - If active key not available (common on web), triggers `showAuthUpgradeUI`\n * - Supports keychain, hivesigner, hiveauth, and direct key signing\n *\n * @param username - The username sending the transfer (required for broadcast)\n * @param auth - Authentication context with platform adapter\n *\n * @returns React Query mutation result\n */\nexport function useTransfer(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer\"],\n username,\n (payload) => [\n buildTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildPointTransferOp } from \"@/modules/operations/builders\";\n\nexport interface TransferPointPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring Ecency points.\n *\n * Uses `ecency_point_transfer` custom_json operation with ACTIVE authority.\n */\nexport function useTransferPoint(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-point\"],\n username,\n (payload) => [\n buildPointTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildDelegateVestingSharesOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for delegating Hive Power (vesting shares).\n */\nexport interface DelegateVestingSharesPayload {\n /** Account receiving HP delegation */\n delegatee: string;\n /** Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\"). Use \"0.000000 VESTS\" to remove delegation. */\n vestingShares: string;\n}\n\n/**\n * React Query mutation hook for delegating Hive Power (HP).\n *\n * This mutation broadcasts a delegate_vesting_shares operation to delegate HP\n * to another account. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username delegating HP (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Delegation operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Delegation Mechanics:**\n * - Delegated HP can be used by the delegatee for resource credits\n * - Delegatee CANNOT power down or transfer the delegated HP\n * - Delegation can be removed by setting vestingShares to \"0.000000 VESTS\"\n * - Removing delegation has a 5-day cooldown before HP returns to delegator\n *\n * **Post-Broadcast Actions:**\n * - Invalidates delegations list cache to show updated delegation\n * - Invalidates account data for both delegator and delegatee\n *\n * @example\n * ```typescript\n * const delegateMutation = useDelegateVestingShares(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Delegate HP\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '1000.000000 VESTS'\n * });\n *\n * // Remove delegation\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '0.000000 VESTS'\n * });\n * ```\n */\nexport function useDelegateVestingShares(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-vesting-shares\"],\n username,\n (payload) => [\n buildDelegateVestingSharesOp(\n username!,\n payload.delegatee,\n payload.vestingShares\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.delegatee),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildSetWithdrawVestingRouteOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for setting withdraw vesting route.\n */\nexport interface SetWithdrawVestingRoutePayload {\n /** Account receiving withdrawn vesting */\n toAccount: string;\n /** Percentage to route (0-10000, where 10000 = 100%). Already scaled. */\n percent: number;\n /** Auto convert to vesting (power up) */\n autoVest: boolean;\n}\n\n/**\n * React Query mutation hook for setting withdraw vesting route.\n *\n * This mutation broadcasts a set_withdraw_vesting_route operation to configure\n * where withdrawn VESTS (power down) are sent. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username setting withdraw route (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Withdraw route operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Withdraw Route Mechanics:**\n * - Routes a percentage of power down (withdraw_vesting) to another account\n * - Percent must be between 0-10000 (where 10000 = 100%)\n * - Multiple routes can be set, total cannot exceed 100%\n * - autoVest=true converts withdrawn VESTS to HP in destination account\n * - autoVest=false converts withdrawn VESTS to liquid HIVE\n *\n * **Post-Broadcast Actions:**\n * - Invalidates withdraw routes cache to show updated routes\n * - Invalidates account data for both accounts\n *\n * @example\n * ```typescript\n * const setRouteMutation = useSetWithdrawVestingRoute(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Route 50% of power down to another account (auto vest)\n * setRouteMutation.mutate({\n * toAccount: 'alice',\n * percent: 5000, // 50% (already scaled)\n * autoVest: true\n * });\n *\n * // Route 100% of power down to another account (liquid HIVE)\n * setRouteMutation.mutate({\n * toAccount: 'bob',\n * percent: 10000, // 100% (already scaled)\n * autoVest: false\n * });\n * ```\n */\nexport function useSetWithdrawVestingRoute(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"set-withdraw-vesting-route\"],\n username,\n (payload) => [\n buildSetWithdrawVestingRouteOp(\n username!,\n payload.toAccount,\n payload.percent,\n payload.autoVest\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.wallet.withdrawRoutes(username!),\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.toAccount)\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface TransferEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n memo: string;\n}\n\nexport function useTransferEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"transfer\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n memo: payload.memo\n }\n });\n return [[\"custom_json\", {\n required_auths: [username!],\n required_posting_auths: [],\n id: \"ssc-mainnet-hive\",\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\nexport function useTransferToSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-savings\"],\n username,\n (payload) => [\n buildTransferToSavingsOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferFromSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferFromSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useTransferFromSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-from-savings\"],\n username,\n (payload) => [\n buildTransferFromSavingsOp(username!, payload.to, payload.amount, payload.memo, payload.requestId)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToVestingOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToVestingPayload {\n to: string;\n amount: string;\n}\n\nexport function useTransferToVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-vesting\"],\n username,\n (payload) => [\n buildTransferToVestingOp(username!, payload.to, payload.amount)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildWithdrawVestingOp } from \"@/modules/operations/builders\";\n\nexport interface WithdrawVestingPayload {\n vestingShares: string;\n}\n\nexport function useWithdrawVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"withdraw-vesting\"],\n username,\n (payload) => [\n buildWithdrawVestingOp(username!, payload.vestingShares)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildConvertOp, buildCollateralizedConvertOp } from \"@/modules/operations/builders\";\n\nexport interface ConvertPayload {\n amount: string;\n requestId: number;\n collateralized?: boolean;\n}\n\nexport function useConvert(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"convert\"],\n username,\n (payload) => [\n payload.collateralized\n ? buildCollateralizedConvertOp(username!, payload.amount, payload.requestId)\n : buildConvertOp(username!, payload.amount, payload.requestId)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimInterestOps } from \"@/modules/operations/builders\";\n\nexport interface ClaimInterestPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useClaimInterest(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-interest\"],\n username,\n (payload) => buildClaimInterestOps(username!, payload.to, payload.amount, payload.memo, payload.requestId),\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimRewardBalanceOp } from \"@/modules/operations/builders\";\n\nexport interface ClaimRewardsPayload {\n rewardHive: string;\n rewardHbd: string;\n rewardVests: string;\n}\n\nconst CLAIM_REWARDS_INVALIDATION_DELAY_MS = 5000;\nconst pendingInvalidationTimers = new Map>();\n\nexport function useClaimRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-rewards\"],\n username,\n (payload) => [\n buildClaimRewardBalanceOp(username!, payload.rewardHive, payload.rewardHbd, payload.rewardVests)\n ],\n () => {\n const timerKey = username ?? \"__anonymous__\";\n const keysToInvalidate = [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n QueryKeys.assets.hiveGeneralInfo(username!),\n QueryKeys.assets.hbdGeneralInfo(username!),\n QueryKeys.assets.hivePowerGeneralInfo(username!),\n ];\n\n // Delay invalidation to allow blockchain to propagate the transaction.\n // Immediate invalidation would fetch stale (pre-confirmation) data.\n const existingTimer = pendingInvalidationTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n pendingInvalidationTimers.delete(timerKey);\n }\n\n const timer = setTimeout(async () => {\n try {\n const qc = getQueryClient();\n const results = await Promise.allSettled(\n keysToInvalidate.map((key) => qc.invalidateQueries({ queryKey: key }))\n );\n const rejected = results.filter((result) => result.status === \"rejected\");\n if (rejected.length > 0) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation rejected\", {\n username,\n rejectedCount: rejected.length,\n rejected\n });\n }\n } catch (error) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation failed\", {\n username,\n error\n });\n } finally {\n pendingInvalidationTimers.delete(timerKey);\n }\n }, CLAIM_REWARDS_INVALIDATION_DELAY_MS);\n\n pendingInvalidationTimers.set(timerKey, timer);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface DelegateEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useDelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"delegate\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UndelegateEngineTokenPayload {\n from: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUndelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"undelegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"undelegate\",\n contractPayload: {\n symbol: payload.symbol,\n from: payload.from,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface StakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useStakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"stake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"stake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UnstakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUnstakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"unstake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"unstake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface ClaimEngineRewardsPayload {\n tokens: string[];\n}\n\nexport function useClaimEngineRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-engine-rewards\"],\n username,\n (payload) => {\n const json = JSON.stringify(payload.tokens.map((symbol) => ({ symbol })));\n return [[\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [username!],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface EngineMarketOrderPayload {\n action: \"buy\" | \"sell\" | \"cancel\";\n symbol: string;\n quantity?: string;\n price?: string;\n orderId?: string;\n orderType?: \"buy\" | \"sell\";\n}\n\nexport function useEngineMarketOrder(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"engine-market-order\"],\n username,\n (payload) => {\n let contractPayload: Record;\n let contractAction: string;\n\n if (payload.action === \"cancel\") {\n contractAction = \"cancel\";\n contractPayload = {\n type: payload.orderType!,\n id: payload.orderId!,\n };\n } else {\n contractAction = payload.action;\n contractPayload = {\n symbol: payload.symbol,\n quantity: payload.quantity!,\n price: payload.price!,\n };\n }\n\n const json = JSON.stringify({\n contractName: \"market\",\n contractAction,\n contractPayload,\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport { AssetOperation } from \"../types\";\nimport {\n buildTransferOp,\n buildTransferToSavingsOp,\n buildTransferFromSavingsOp,\n buildTransferToVestingOp,\n buildWithdrawVestingOp,\n buildDelegateVestingSharesOp,\n buildSetWithdrawVestingRouteOp,\n buildConvertOp,\n buildClaimInterestOps,\n buildPointTransferOp,\n buildEngineOp,\n buildEngineClaimOp,\n} from \"@/modules/operations/builders\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface WalletOperationPayload {\n from: string;\n to?: string;\n amount?: string;\n memo?: string;\n request_id?: number;\n from_account?: string;\n to_account?: string;\n percent?: number;\n auto_vest?: boolean;\n mode?: string;\n [key: string]: unknown;\n}\n\nfunction buildHiveOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\", memo = \"\" } = payload;\n const requestId = payload.request_id ?? (Date.now() >>> 0);\n\n switch (asset) {\n case \"HIVE\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.PowerUp:\n return [buildTransferToVestingOp(from, to, amount)];\n }\n break;\n\n case \"HBD\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.ClaimInterest:\n return buildClaimInterestOps(from, to, amount, memo, requestId);\n case AssetOperation.Convert:\n return [buildConvertOp(from, amount, Math.floor(Date.now() / 1000))];\n }\n break;\n\n case \"HP\":\n switch (operation) {\n case AssetOperation.PowerDown:\n return [buildWithdrawVestingOp(from, amount)];\n case AssetOperation.Delegate:\n return [buildDelegateVestingSharesOp(from, to, amount)];\n case AssetOperation.WithdrawRoutes:\n return [buildSetWithdrawVestingRouteOp(\n payload.from_account ?? from,\n payload.to_account ?? to,\n payload.percent ?? 0,\n payload.auto_vest ?? false\n )];\n }\n break;\n\n case \"POINTS\":\n if (operation === AssetOperation.Transfer || operation === AssetOperation.Gift) {\n return [buildPointTransferOp(from, to, amount, memo)];\n }\n break;\n }\n\n return null;\n}\n\nfunction buildEngineOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\" } = payload;\n const quantity = typeof amount === \"string\" && amount.includes(\" \")\n ? amount.split(\" \")[0]\n : String(amount);\n\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildEngineOp(from, \"transfer\", {\n symbol: asset, to, quantity, memo: payload.memo ?? \"\"\n })];\n case AssetOperation.Stake:\n return [buildEngineOp(from, \"stake\", { symbol: asset, to, quantity })];\n case AssetOperation.Unstake:\n return [buildEngineOp(from, \"unstake\", { symbol: asset, to, quantity })];\n case AssetOperation.Delegate:\n return [buildEngineOp(from, \"delegate\", { symbol: asset, to, quantity })];\n case AssetOperation.Undelegate:\n return [buildEngineOp(from, \"undelegate\", { symbol: asset, from: to, quantity })];\n case AssetOperation.Claim:\n return [buildEngineClaimOp(from, [asset])];\n }\n\n return null;\n}\n\n/**\n * Determines authority level for a wallet operation.\n * Engine token claims use posting authority; everything else uses active.\n */\nfunction getWalletOperationAuthority(operation: AssetOperation): AuthorityLevel {\n if (operation === AssetOperation.Claim) {\n return 'posting';\n }\n return 'active';\n}\n\n/**\n * Meta-mutation hook that dispatches wallet operations based on asset and operation type.\n *\n * Supports HIVE, HBD, HP, POINTS, and Hive Engine tokens.\n * Uses `useBroadcastMutation` for unified auth handling via `AuthContextV2`.\n *\n * @param username - The Hive account performing the operation\n * @param asset - The asset symbol (e.g., \"HIVE\", \"HBD\", \"HP\", \"POINTS\", or engine token)\n * @param operation - The operation type from AssetOperation enum\n * @param auth - Auth context for broadcasting\n */\nexport function useWalletOperation(\n username: string | undefined,\n asset: string,\n operation: AssetOperation,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n operation as any\n );\n\n return useBroadcastMutation(\n [\"ecency-wallets\", asset, operation],\n username,\n (payload) => {\n // Try native Hive + POINTS operations\n const hiveOps = buildHiveOperations(asset, operation, payload);\n if (hiveOps) return hiveOps;\n\n // Try engine token operations\n const engineOps = buildEngineOperations(asset, operation, payload);\n if (engineOps) return engineOps;\n\n throw new Error(`[SDK][Wallet] – no operation builder for asset=\"${asset}\" operation=\"${operation}\"`);\n },\n () => {\n recordActivity();\n\n const keysToInvalidate: (string | undefined)[][] = [];\n\n // Invalidate asset-specific queries (prefix-matches all currency variants)\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, asset]);\n\n if (asset === \"HIVE\") {\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, \"HP\"]);\n }\n\n // Invalidate portfolio (prefix-matches all currency/filter variants)\n keysToInvalidate.push([\"wallet\", \"portfolio\", \"v2\", username]);\n\n // Delay invalidation to allow blockchain to process\n setTimeout(() => {\n keysToInvalidate.forEach((key) => {\n getQueryClient().invalidateQueries({ queryKey: key });\n });\n }, 5000);\n },\n auth,\n getWalletOperationAuthority(operation),\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDelegateRcOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface DelegateRcPayload {\n to: string;\n maxRc: string | number;\n}\n\nexport function useDelegateRc(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-rc\"],\n username,\n ({ to, maxRc }) => [\n buildDelegateRcOp(username!, to, maxRc)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n QueryKeys.resourceCredits.account(username!),\n QueryKeys.resourceCredits.account(variables.to),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting for a witness.\n */\nexport interface WitnessVotePayload {\n /** Witness account name to vote for/against */\n witness: string;\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting for a Hive witness.\n *\n * This mutation broadcasts an account_witness_vote operation to vote for\n * or remove a vote from a witness.\n *\n * @param username - The username voting for the witness (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account data cache to show updated witness votes\n * - Invalidates witness votes cache\n *\n * **Vote Types:**\n * - approve: true - Vote for the witness\n * - approve: false - Remove your vote from the witness\n *\n * **Authority Required:**\n * - Active authority is required for witness voting\n *\n * @example\n * ```typescript\n * const witnessVoteMutation = useWitnessVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Vote for a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: true\n * });\n *\n * // Remove vote from a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: false\n * });\n * ```\n */\nexport function useWitnessVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"vote\"],\n username,\n ({ witness, approve }) => [\n buildWitnessVoteOp(username!, witness, approve)\n ],\n async () => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.votes(username)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useWitnessVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for witness votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessProxyOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface WitnessProxyPayload {\n proxy: string;\n}\n\nexport function useWitnessProxy(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"proxy\"],\n username,\n ({ proxy }) => [\n buildWitnessProxyOp(username!, proxy)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.proxy(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Witness, WitnessVotersResponse } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\n\ntype WitnessPage = Witness[];\ntype WitnessCursor = number;\n\ninterface HafbeWitness {\n witness_name: string;\n rank: number;\n url: string;\n vests: string;\n votes_daily_change: string;\n voters_num: number;\n voters_num_daily_change: number;\n price_feed: number;\n bias: number;\n feed_updated_at: string;\n block_size: number;\n signing_key: string;\n version: string;\n missed_blocks: number;\n hbd_interest_rate: number;\n last_confirmed_block_num: number;\n account_creation_fee: number;\n}\n\ninterface HafbeWitnessesResponse {\n total_witnesses: number;\n total_pages: number;\n witnesses: HafbeWitness[];\n}\n\n/**\n * Map a hafbe-api witness to the SDK Witness shape so existing consumers\n * (e.g. the web app's transform()) keep working unchanged.\n */\nfunction mapRestWitness(w: HafbeWitness): Witness {\n return {\n owner: w.witness_name,\n total_missed: w.missed_blocks,\n url: w.url,\n props: {\n account_creation_fee: `${(w.account_creation_fee / 1000).toFixed(3)} HIVE`,\n account_subsidy_budget: 0,\n maximum_block_size: w.block_size,\n },\n hbd_exchange_rate: {\n base: `${w.price_feed.toFixed(3)} HBD`,\n },\n available_witness_account_subsidies: 0,\n running_version: w.version,\n signing_key: w.signing_key,\n last_hbd_exchange_update: w.feed_updated_at,\n rank: w.rank,\n vests: w.vests,\n voters_num: w.voters_num,\n voters_num_daily_change: w.voters_num_daily_change,\n price_feed: w.price_feed,\n hbd_interest_rate: w.hbd_interest_rate,\n last_confirmed_block_num: w.last_confirmed_block_num,\n };\n}\n\n/**\n * Get witnesses ordered by vote count (infinite scroll).\n * Uses the hafbe-api REST endpoint - replaces multi-call RPC assembly\n * with a single paginated call. Includes voter count, rank, and other\n * data that was previously unavailable.\n *\n * @param limit - Number of witnesses per page\n */\nexport function getWitnessesInfiniteQueryOptions(limit: number) {\n return infiniteQueryOptions<\n WitnessPage,\n Error,\n InfiniteData,\n (string | number)[],\n WitnessCursor\n >({\n queryKey: QueryKeys.witnesses.list(limit),\n initialPageParam: 1 as WitnessCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WitnessCursor }) => {\n const response = (await callREST(\n \"hafbe\",\n \"/witnesses\",\n {\n \"page-size\": limit,\n page: pageParam,\n }\n )) as HafbeWitnessesResponse;\n\n return response.witnesses.map(mapRestWitness);\n },\n\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n lastPage.length === limit ? lastPageParam + 1 : undefined,\n });\n}\n\nexport type WitnessVoterSortField =\n | \"vests\"\n | \"account_vests\"\n | \"proxied_vests\"\n | \"account_name\"\n | \"timestamp\";\n\nexport type WitnessVoterSortDirection = \"asc\" | \"desc\";\n\n/**\n * Get a single page of voters for a specific witness.\n *\n * Server-side pagination + sort: each page click fetches that page directly\n * from hafbe rather than scrolling through accumulated pages on the client.\n *\n * @param witness - Witness account name\n * @param page - 1-based page index\n * @param pageSize - Number of voters per page\n * @param sort - Field to sort by\n * @param direction - asc or desc\n */\nexport function getWitnessVotersPageQueryOptions(\n witness: string,\n page: number,\n pageSize: number,\n sort: WitnessVoterSortField = \"vests\",\n direction: WitnessVoterSortDirection = \"desc\"\n) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voters(witness, page, pageSize, sort, direction),\n queryFn: async ({ signal }) => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters\",\n {\n \"witness-name\": witness,\n \"page-size\": pageSize,\n page,\n sort,\n direction,\n },\n undefined,\n undefined,\n signal\n )) as WitnessVotersResponse;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n\n/**\n * Get total voter count for a witness.\n *\n * @param witness - Witness account name\n */\nexport function getWitnessVoterCountQueryOptions(witness: string) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voterCount(witness),\n queryFn: async () => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters/count\",\n { \"witness-name\": witness }\n )) as number;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n","export enum PointTransactionType {\n CHECKIN = 10,\n LOGIN = 20,\n CHECKIN_EXTRA = 30,\n POST = 100,\n COMMENT = 110,\n VOTE = 120,\n REBLOG = 130,\n DELEGATION = 150,\n REFERRAL = 160,\n COMMUNITY = 170,\n TRANSFER_SENT = 998,\n TRANSFER_INCOMING = 999,\n MINTED = 991,\n /**\n * Points burned out of supply rather than moved to the treasury. Written by the\n * AI surfaces (assist, image, transcribe), which pay a real per-request vendor\n * bill, so the Points are consumed rather than parked.\n *\n * The row carries no counterparty at all, which is what distinguishes it from\n * TRANSFER_SENT: `sender` and `receiver` are both null. A refund of a burn comes\n * back as this same type with a positive amount, so read the sign rather than\n * assuming a burn is always a debit.\n */\n BURNED = 997,\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPointsQueryOptions } from \"../queries\";\nimport type { Points } from \"../types\";\n\n/**\n * POST a points claim and return the parsed JSON body.\n *\n * The endpoint normally answers with JSON, but an edge/proxy layer can\n * occasionally return a 2xx whose body is an HTML interstitial or plain text\n * (ECENCY-NEXT-1FCJ). Calling `response.json()` on that throws a bare\n * `SyntaxError` that names neither the endpoint nor the cause. Instead we check\n * the content type first and fail with a STABLE, low-cardinality message\n * (content type + status) — never the raw body — so these group as a single\n * Sentry issue instead of fragmenting on every distinct HTML page.\n */\nexport async function claimPointsRequest(\n username: string | undefined,\n accessToken: string | undefined\n) {\n if (!username) {\n throw new Error(\"[SDK][Points][Claim] – username wasn't provided\");\n }\n\n if (!accessToken) {\n throw new Error(\"[SDK][Points][Claim] – access token wasn't found\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/points-claim\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n }\n );\n\n // Media types are case-insensitive; normalise once and reuse in every branch.\n const contentType = (response.headers.get(\"content-type\") ?? \"\")\n .split(\";\")[0]\n .trim()\n .toLowerCase();\n const body = await response.text();\n\n if (!response.ok) {\n if (response.status === 406) {\n try {\n return JSON.parse(body);\n } catch {\n return { message: body, code: response.status };\n }\n }\n // Only fold a short JSON error body into the message; an HTML gateway page\n // (e.g. 502/503) would otherwise fragment the Sentry group per distinct\n // page — the same problem the non-JSON guard below avoids for a 2xx body.\n const detail =\n body && contentType.includes(\"json\") ? `: ${body.slice(0, 200)}` : \"\";\n throw new Error(\n `[SDK][Points][Claim] – failed with status ${response.status}${detail}`\n );\n }\n\n if (!contentType.includes(\"json\")) {\n throw new Error(\n `[SDK][Points][Claim] – expected JSON but received \"${contentType || \"empty\"}\" response (status ${response.status})`\n );\n }\n\n try {\n return JSON.parse(body);\n } catch {\n throw new Error(\n `[SDK][Points][Claim] – malformed JSON response (status ${response.status})`\n );\n }\n}\n\nexport function useClaimPoints(\n username: string | undefined,\n accessToken: string | undefined,\n onSuccess?: () => void,\n onError?: Parameters[\"0\"][\"onError\"]\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n \"points-claimed\"\n );\n\n return useMutation({\n mutationFn: () => claimPointsRequest(username, accessToken),\n onError,\n onSuccess: () => {\n recordActivity();\n\n getQueryClient().setQueryData(\n getPointsQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n return {\n ...data,\n points: (\n parseFloat(data.points) + parseFloat(data.uPoints)\n ).toFixed(3),\n uPoints: \"0\",\n };\n }\n );\n\n onSuccess?.();\n },\n });\n}\n","// A token only counts at the start of the query or after whitespace, matching\n// the search API's parser. Unanchored, these matched inside ordinary words:\n// \"prototype:v2\" read as type=v2 and the API rejected it as an invalid type,\n// \"subcategory:hive-1\" filtered on category=hive-1 with a stray \"sub\" left as\n// required text. The boundary is captured rather than looked behind so it can\n// be put back when the token is stripped, keeping the neighbouring words apart\n// (a lookbehind would also be fine here, but this stays portable).\nconst author_re = /(^|\\s)author:([^\\s]+)/g;\nconst type_re = /(^|\\s)type:([^\\s]+)/g;\nconst category_re = /(^|\\s)category:([^\\s]+)/g;\nconst tag_re = /(^|\\s)tag:([^\\s]+)/g;\n\n// Index of the token value in a match; group 1 is the boundary.\nconst VALUE = 2;\n\nexport enum SearchType {\n ALL = \"\",\n POST = \"post\",\n COMMENT = \"comment\"\n}\n\nexport const MAX_SEARCH_TAGS = 5;\n\n// The search API applies both caps itself (see query_validator); mirrored here\n// so the client can refuse instead of turning a 400 into an empty result list.\nexport const MAX_SEARCH_QUERY_LENGTH = 100;\n\n/**\n * Both parsers match a token with /author:([^\\s]+)/, so a value containing a\n * space stops filtering at the space and the remainder silently becomes\n * required free text. Keep the first word only, which is what the API would\n * have filtered on anyway.\n */\nfunction firstToken(value: string): string {\n return value.trim().split(/\\s+/)[0] ?? \"\";\n}\n\n/**\n * Hive account names are lowercase and the API filters authors with an exact\n * term query, so \"@Demo\" has to become \"demo\" or it matches nothing.\n */\nexport function normalizeSearchAuthor(value: string): string {\n return firstToken(value).replace(/^@+/, \"\").toLowerCase();\n}\n\nexport function normalizeSearchCategory(value: string): string {\n // Leading \"#\" goes for the same reason it goes on tags: a category is matched\n // by an exact term query, and users write categories the way they write tags.\n return firstToken(value).replace(/^#+/, \"\").toLowerCase();\n}\n\n/**\n * Accepts what a user actually types (\"travel, photography\", \"#travel travel\")\n * and returns exact-match ready tags, deduped in first-seen order.\n */\nexport function normalizeSearchTags(value: string): string[] {\n const seen = new Set();\n\n return value\n .split(/[\\s,]+/)\n .map((tag) => tag.replace(/^#+/, \"\").toLowerCase())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n}\n\nexport interface SearchQueryParts {\n search?: string;\n author?: string;\n type?: SearchType;\n category?: string;\n /** Raw user input (\"a, b\") or an already split list. */\n tags?: string | string[];\n}\n\nexport interface BuiltSearchQuery {\n /** The `q` value to put in the URL. Round-trips through `SearchQuery`. */\n q: string;\n search: string;\n author: string;\n type: SearchType;\n category: string;\n tags: string[];\n}\n\n/**\n * Assembles the single `q` string that both this app and the search API parse\n * back into filters. Returns the normalized parts too, because the caller has\n * to validate the tag count and the total length before navigating.\n */\nexport function buildSearchQuery({\n search = \"\",\n author = \"\",\n type = SearchType.ALL,\n category = \"\",\n tags = []\n}: SearchQueryParts): BuiltSearchQuery {\n const normalizedSearch = search.trim().replace(/\\s+/g, \" \");\n const normalizedAuthor = normalizeSearchAuthor(author);\n const normalizedCategory = normalizeSearchCategory(category);\n const normalizedTags = normalizeSearchTags(Array.isArray(tags) ? tags.join(\",\") : tags);\n\n const parts = [normalizedSearch];\n\n if (normalizedAuthor) {\n parts.push(`author:${normalizedAuthor}`);\n }\n\n if (type) {\n parts.push(`type:${type}`);\n }\n\n if (normalizedCategory) {\n parts.push(`category:${normalizedCategory}`);\n }\n\n if (normalizedTags.length > 0) {\n // No space after the commas: a tag token ends at the first space, so\n // anything past one stops filtering and becomes required free text.\n parts.push(`tag:${normalizedTags.join(\",\")}`);\n }\n\n return {\n // Dropping the empty free text here is what keeps a filter-only query from\n // starting with a space.\n q: parts.filter((part) => part !== \"\").join(\" \"),\n search: normalizedSearch,\n author: normalizedAuthor,\n type,\n category: normalizedCategory,\n tags: normalizedTags\n };\n}\n\nexport class SearchQuery {\n public query: string = \"\";\n public search: string = \"\";\n public author: string = \"\";\n public type: SearchType = SearchType.ALL;\n public category: string = \"\";\n public tags: string[] = [];\n\n constructor(_query: string) {\n this.query = _query;\n this.search = _query;\n\n this.grabAuthor();\n this.grabType();\n this.grabCategory();\n this.grabTags();\n this.grabSearch();\n }\n\n private grab = (re: RegExp): string => {\n // @ts-ignore\n const matches = [...this.query.matchAll(re)];\n if (matches.length > 0) {\n return matches[0][VALUE].trim();\n }\n\n return \"\";\n };\n\n private grabAuthor = () => {\n this.author = this.grab(author_re);\n };\n\n private grabType = () => {\n const type = this.grab(type_re) as SearchType;\n if (Object.values(SearchType).includes(type)) {\n this.type = type as SearchType;\n }\n };\n\n private grabCategory = () => {\n this.category = this.grab(category_re);\n };\n\n private grabTags = () => {\n // Every tag: token counts, not just the first one. The API joins all of its\n // own tag: matches before splitting on commas, so reading only the first\n // token here under-reports the tags a query really applies and let a query\n // past the MAX_SEARCH_TAGS guard that the API then rejects with a 400.\n // A trailing comma (\"tag:a,\") must not yield an empty tag either - it would\n // be shown back as a phantom tag and counted against the same cap.\n const seen = new Set();\n\n this.tags = [...this.query.matchAll(tag_re)]\n .flatMap((match) => match[VALUE].split(\",\"))\n .map((tag) => tag.trim())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n };\n\n private grabSearch = () => {\n [author_re, type_re, category_re, tag_re].forEach((r) => {\n // Put the captured boundary back, or removing a mid-query token would\n // run the words either side of it together.\n this.search = this.search.replace(r, \"$1\");\n });\n\n while (this.search.indexOf(\" \") !== -1) {\n this.search = this.search.replace(\" \", \" \");\n }\n\n this.search = this.search.trim();\n };\n}\n","export type RequestError = Error & { status?: number; data?: unknown };\n\n/**\n * Reads a response body and, when the status is not OK, throws an error that\n * keeps both the status and the parsed body.\n *\n * The search backend answers a malformed query with an explanation the user can\n * act on (\"Maximum 5 tags!\", \"Query string too long! ...\", \"Parsed query is\n * empty!\"). Dropping the body leaves callers with a bare status: they can\n * neither tell the user what to change nor tell a deterministic rejection from\n * a transient failure worth retrying.\n *\n * Module-internal on purpose - it is not part of the published SDK surface.\n */\nexport async function parseJsonResponse(\n response: Response,\n /**\n * Shape guard for a SUCCESSFUL body. JSON.parse happily accepts `null`,\n * `\"maintenance\"` and `{\"error\": \"...\"}`, none of which are the payload the\n * caller asked for, and all of which would otherwise be returned as `T` and\n * cached as valid data. Callers that have a known shape pass a guard so an\n * unexpected 200 fails here instead of at the first property access.\n */\n isValid?: (data: unknown) => boolean\n): Promise {\n const parseBody = async (): Promise => {\n // Read the body ONCE. Calling json() and then falling back to text() on the\n // same response cannot work: json() consumes the stream, so the fallback\n // always threw and the raw body of a non-JSON failure (an HTML error page\n // from a proxy) was silently lost.\n let raw: string;\n try {\n raw = await response.text();\n } catch {\n return undefined;\n }\n\n if (raw === \"\") {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n // Raw text is a diagnostic, not a payload. On a failed response it is\n // what the caller shows or logs, but on a 2xx returning it would hand\n // back a string typed as the parsed body: callers reading `.results`\n // would see undefined and report an empty result set, and the\n // controversial/rising pager would throw on `resp.results.length`. An\n // unparseable success is a failure, so let it fall through to the throw\n // below rather than caching a string as a SearchResponse.\n return response.ok ? undefined : raw;\n }\n };\n\n const data = await parseBody();\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n if (data === undefined || (isValid !== undefined && !isValid(data))) {\n throw new Error(\"Response body was empty, invalid JSON, or not the expected shape\");\n }\n\n return data as T;\n}\n\n/**\n * The contract every /search-api consumer relies on: an object carrying a\n * `results` array. Enough to keep a stray 200 from reaching `resp.results.length`.\n */\nexport function isSearchResponse(data: unknown): boolean {\n return (\n typeof data === \"object\" &&\n data !== null &&\n Array.isArray((data as { results?: unknown }).results)\n );\n}\n","import { isServer } from \"@tanstack/react-query\";\nimport type { RequestError } from \"./parse-json-response\";\n\n/**\n * The app-wide default the browser QueryClient uses. Restated because supplying\n * a `retry` callback replaces React Query's own budget rather than adding to it.\n *\n * The 0 on the server is load-bearing: server QueryClients set `retry: false`\n * globally, and these queries are prefetched during SSR, so a flat 3 would\n * resurrect SSR retries against a single-region backend.\n */\nconst MAX_RETRIES = isServer ? 0 : 3;\n\n/**\n * Shared retry rule for every /search-api call.\n *\n * A 4xx is the backend rejecting the query itself (too many tags, over the\n * length cap, nothing left to search once the filters are parsed out).\n * Repeating it repeats the same answer, so the only effect is four requests\n * over several seconds before the UI can say what to change.\n *\n * 408 and 429 are the exceptions: they describe when the request arrived rather\n * than what it contained, and backing off is what resolves them. A client-side\n * timeout aborts the fetch and carries no status at all, so it falls through to\n * the normal budget like any other transport failure.\n */\nexport function searchRetryPolicy(failureCount: number, error: Error): boolean {\n const { status } = error as RequestError;\n const isTransient = status === 408 || status === 429;\n\n if (status !== undefined && status >= 400 && status < 500 && !isTransient) {\n return false;\n }\n\n return failureCount < MAX_RETRIES;\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function searchQueryOptions(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number\n) {\n return queryOptions({\n queryKey: QueryKeys.search.results(q, sort, hideLow, since, scroll_id, votes),\n queryFn: async ({ signal }) => {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (scroll_id) data.scroll_id = scroll_id;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n retry: searchRetryPolicy,\n });\n}\n\ntype PageParam = {\n sid: string | undefined;\n hasNextPage: boolean;\n};\n\nexport function getControversialRisingInfiniteQueryOptions(\n what: string,\n tag: string,\n enabled = true\n) {\n return infiniteQueryOptions<\n SearchResponse,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.search.controversialRising(what, tag),\n initialPageParam: { sid: undefined, hasNextPage: true } as PageParam,\n\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n if (!pageParam.hasNextPage) {\n return {\n hits: 0,\n took: 0,\n results: [],\n };\n }\n\n let sinceDate: Date | undefined;\n const now = new Date();\n\n switch (tag) {\n case \"today\":\n sinceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case \"week\":\n sinceDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case \"month\":\n sinceDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case \"year\":\n sinceDate = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);\n break;\n default:\n sinceDate = undefined;\n }\n\n const q = \"* type:post\";\n const sort = what === \"rising\" ? \"children\" : what;\n const since = sinceDate ? sinceDate.toISOString().split(\".\")[0] : undefined;\n const hideLow = \"0\";\n const votes = tag === \"today\" ? 50 : 200;\n\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (pageParam.sid) data.scroll_id = pageParam.sid;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n\n getNextPageParam: (resp: SearchResponse): PageParam => {\n return {\n sid: resp?.scroll_id,\n hasNextPage: resp.results.length > 0,\n };\n },\n\n enabled,\n retry: searchRetryPolicy,\n });\n}\n","import { CONFIG, INTERNAL_API_TIMEOUT_MS, getBoundFetch, withTimeoutSignal } from \"@/modules/core\";\nimport { SearchResponse } from \"./types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"./parse-json-response\";\n\nexport async function search(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number,\n signal?: AbortSignal\n): Promise {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) {\n data.since = since;\n }\n if (scroll_id) {\n data.scroll_id = scroll_id;\n }\n if (votes) {\n data.votes = votes;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function similar(\n params: {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n tags?: string[];\n since?: string;\n },\n signal?: AbortSignal,\n timeoutMs: number = INTERNAL_API_TIMEOUT_MS\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/similar\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(params),\n signal: withTimeoutSignal(timeoutMs, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function searchPath(q: string, signal?: AbortSignal): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n const data = await parseJsonResponse(response, Array.isArray);\n return data?.length > 0 ? data : [q];\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { similar } from \"../requests\";\nimport { SearchResult } from \"../types/search-response\";\n\n// Without a recency window the backend ranks across the entire historical\n// index and surfaces years-old posts. Constrain suggestions to the last\n// ~6 months so related posts stay fresh (it also bounds the backend's\n// more_like_this candidate set, which is what keeps it fast).\nconst SIMILAR_ENTRIES_SINCE_MS = 182 * 24 * 60 * 60 * 1000;\n\n// How many results the suggestions strip renders at most.\nconst SIMILAR_ENTRIES_TARGET = 4;\n\n// more_like_this only extracts a handful of significant terms, so an excerpt is\n// enough signal and keeps the request payload small.\nconst SIMILAR_ENTRIES_BODY_LIMIT = 3000;\n\n// On the server the prefetch sits on the entry-page render path, and the search\n// backend is single-region (EU) — so anything slower than this stalls SSR for a\n// non-essential \"related posts\" strip. Keep the SSR cap short and let the strip\n// fall back to a client fetch (only that render misses the in-HTML strip; it's\n// ISR-cached anyway). Do NOT raise this — 2s is the SSR budget.\nconst SIMILAR_ENTRIES_SSR_TIMEOUT_MS = 2000;\n\n// The client fetch doesn't block paint, so it previously had no cap and fell\n// through to the SDK's generic INTERNAL_API_TIMEOUT_MS (10s; CF's worker further\n// truncates at ~8s). Combined with React Query's default client retry (3×), a\n// /search-api/similar outage turned this best-effort strip into a multi-second\n// post-onload tail (observed as a ~29s \"fully loaded\" in GTmetrix). Cap the\n// client call short and disable retry (below) so a degraded backend just hides\n// the strip quickly instead of churning.\nconst SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS = 4000;\n\n// The strip is hidden below this many results. A lone suggestion looks\n// sparse. Exported so the web component shares one threshold (filter == render).\nexport const SIMILAR_ENTRIES_MIN_RENDER = 2;\n\n// Strip markdown image/link/URL noise before truncating, so more_like_this\n// keys on prose terms instead of image-CDN domains and file hashes (which\n// rarely match the index's sanitized body and just waste the term budget).\nfunction toMltExcerpt(body: string, limit: number): string {\n return body\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, \" \") // markdown images\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\") // markdown links -> keep link text\n .replace(/<[^>]+>/g, \" \") // html tags\n .replace(/https?:\\/\\/\\S+/g, \" \") // bare URLs\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, limit);\n}\n\n// Compact deterministic fingerprint (djb2) of the MLT inputs. Folded into the\n// cache key so an edited post (title/tags/body changed) refetches instead of\n// serving stale recommendations under the same author/permlink. Deterministic\n// so the SSR prefetch and the client compute the same key from the same entry.\nfunction fingerprint(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\ninterface Entry {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n json_metadata?: {\n // Hive's json_metadata is user-controlled and untyped on-chain: `tags` is\n // usually a string[] but some posts store it as a bare string (or other\n // junk). Typed as unknown on purpose so callers can't assume an array —\n // it's narrowed with a runtime guard below.\n tags?: unknown;\n };\n}\n\nexport function getSimilarEntriesQueryOptions(entry: Entry) {\n const title = entry.title ?? \"\";\n // `?? []` only guards null/undefined; a non-array tags value (e.g. a bare\n // string from json_metadata) slips through and crashes `.filter` — which\n // took down the entry-page SSR prefetch (Sentry ECENCY-NEXT-1FMA). Guard on\n // Array.isArray so only real arrays reach the filter.\n const rawTags = entry.json_metadata?.tags;\n const tags = (Array.isArray(rawTags) ? rawTags : []).filter(\n (tag): tag is string => typeof tag === \"string\" && tag !== \"\"\n );\n const body = toMltExcerpt(entry.body ?? \"\", SIMILAR_ENTRIES_BODY_LIMIT);\n const contentKey = fingerprint(`${title}|${tags.join(\",\")}|${body}`);\n\n return queryOptions({\n queryKey: QueryKeys.search.similarEntries(entry.author, entry.permlink, contentKey),\n queryFn: async ({ signal }) => {\n // Naive `YYYY-MM-DDTHH:mm:ss` (no `Z`) matches the search-api date\n // contract used elsewhere; a <14h skew on a 182-day boundary is immaterial.\n const since = new Date(Date.now() - SIMILAR_ENTRIES_SINCE_MS).toISOString().slice(0, 19);\n\n // Elasticsearch more_like_this recommendations: content-based \"related\n // posts\" ranked by shared significant terms in title/body/tags, scoped\n // to the recency window. The backend already excludes the source author,\n // spam and nsfw.\n const response = await similar(\n {\n author: entry.author,\n permlink: entry.permlink,\n title,\n body,\n tags,\n since\n },\n signal,\n // Short cap server-side so a slow cross-region call can't stall SSR;\n // a slightly longer (but still bounded) cap client-side so a degraded\n // backend can't hang the request on the SDK's generic 8s timeout.\n typeof window === \"undefined\"\n ? SIMILAR_ENTRIES_SSR_TIMEOUT_MS\n : SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS\n );\n\n // Light client guard mirroring the render contract: never the source\n // post, never nsfw, one per author, capped at the render target.\n const collected: SearchResult[] = [];\n const seenAuthors = new Set();\n for (const r of response.results) {\n if (collected.length >= SIMILAR_ENTRIES_TARGET) break;\n if (r.permlink === entry.permlink) continue;\n if ((r.tags ?? []).indexOf(\"nsfw\") !== -1) continue;\n if (seenAuthors.has(r.author)) continue;\n seenAuthors.add(r.author);\n collected.push(r);\n }\n\n return collected;\n },\n // The entry page server-prefetches this query and dehydrates it. Without a\n // staleTime, React Query treats the hydrated data as stale and refetches on\n // mount — issuing a *redundant* /search-api/similar XHR right after\n // hydration even though SSR already provided the data. That refetch was the\n // long post-onload tail in the waterfall (held open to the client timeout),\n // inflating GTmetrix \"Fully Loaded\" while the visible strip was already\n // populated from SSR. A staleTime makes the hydrated data fresh so the\n // client skips that refetch; if SSR delivered nothing (empty cache), the\n // client still fetches. Recommendations are stable per post (and the cache\n // key is content-fingerprinted), so 5 min matches the page's ISR cadence.\n staleTime: 5 * 60 * 1000,\n // Best-effort suggestions strip — never retry-storm a degraded backend.\n // The web QueryClient only disables retries on the server; the browser\n // client keeps React Query's default retry (3×) — and other SDK consumers\n // (e.g. mobile) may too — so pin retry:false here to cover every caller.\n retry: false\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { getProfiles } from \"@/modules/bridge\";\nimport { Profile } from \"@/modules/accounts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountQueryOptions(q: string, limit = 5) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.account(normalized, limit),\n queryFn: async (): Promise => {\n const usernames = (await callRPC(\"condenser_api.lookup_accounts\", [\n normalized,\n limit,\n ])) as string[];\n\n if (usernames.length === 0) {\n return [];\n }\n\n return getProfiles(usernames);\n },\n enabled: !!normalized,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { TrendingTag } from \"@/modules/posts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchTopicsQueryOptions(q: string, limit = 10) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.topics(normalized, limit),\n queryFn: async (): Promise => {\n const tags = (await callRPC(\"condenser_api.get_trending_tags\", [\n normalized,\n limit + 1,\n ])) as TrendingTag[];\n\n return tags\n .map((t) => t.name)\n .filter((name) => name !== \"\" && !name.startsWith(\"hive-\"))\n .slice(0, limit);\n },\n enabled: !!normalized,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function getSearchApiInfiniteQueryOptions(\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.search.api(q, sort, hideLow, since, votes, includeNsfw),\n queryFn: async ({ pageParam, signal }: { pageParam: string | undefined; signal: AbortSignal }) => {\n interface SearchApiPayload {\n q: string;\n sort: string;\n hide_low: boolean;\n since?: string;\n scroll_id?: string;\n votes?: number;\n include_nsfw?: number;\n }\n\n const payload: SearchApiPayload = { q, sort, hide_low: hideLow };\n\n if (since) {\n payload.since = since;\n }\n if (pageParam) {\n payload.scroll_id = pageParam;\n }\n if (votes !== undefined) {\n payload.votes = votes;\n }\n if (includeNsfw) {\n payload.include_nsfw = 1;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(payload),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body), instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: SearchResponse) => lastPage?.scroll_id,\n enabled: !!q,\n retry: searchRetryPolicy,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\n\nexport function getSearchPathQueryOptions(q: string) {\n return queryOptions({\n queryKey: [\"search\", \"path\", q],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n });\n\n if (!response.ok) {\n throw new Error(`Search path failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data?.length > 0) {\n return data as string[];\n }\n\n return [q];\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { SupportSettings } from \"../types\";\n\n/**\n * Fetch the active user's Support Ecency settings. The username is resolved\n * server-side from the validated `code`, so only the code is sent. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached. Exported for\n * unit testing; the query options below wrap it.\n */\nexport async function getSupportSettingsRequest(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to fetch support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Query options for the active user's Support Ecency settings\n * (beneficiary percent + curation holdback percent). Zeros mean both\n * opt-ins are off; the backend returns zeros when no row exists.\n */\nexport function getSupportSettingsQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n const name = username?.replace(\"@\", \"\");\n\n return queryOptions({\n queryKey: QueryKeys.support.settings(name),\n queryFn: () => {\n if (!code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return getSupportSettingsRequest(code);\n },\n enabled: !!name && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { QueryClient, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { SupportSettings, UpdateSupportSettingsPayload } from \"../types\";\n\n/**\n * POST a Support Ecency settings update. Both percents are integers within\n * 0..100 (0 = off); the gateway rejects anything else with a 400. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached so the caller\n * can surface the plain validation message. Exported for unit testing; the\n * hook below wraps it.\n */\nexport async function updateSupportSettingsRequest(\n code: string,\n payload: UpdateSupportSettingsPayload\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings-update\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n code,\n beneficiary_percent: payload.beneficiary_percent,\n curation_percent: payload.curation_percent,\n }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to update support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Sync the settings cache after a successful update: seed the fresh server\n * response and invalidate so any active observers refetch. Exported for unit\n * testing; `useUpdateSupportSettings` calls it from `onSuccess`.\n */\nexport function applySupportSettingsUpdate(\n queryClient: QueryClient,\n username: string,\n data: SupportSettings\n) {\n queryClient.setQueryData(QueryKeys.support.settings(username), data);\n return queryClient.invalidateQueries({ queryKey: QueryKeys.support.settings(username) });\n}\n\n/**\n * Update the user's voluntary Support Ecency opt-ins (post beneficiary percent\n * and curation holdback percent). On success the settings query is refreshed\n * so every surface (publish dialog, settings card, injection hooks) sees the\n * new preference.\n */\nexport function useUpdateSupportSettings(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"support\", \"settings-update\", name],\n mutationFn: async (payload: UpdateSupportSettingsPayload) => {\n if (!name || !code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return updateSupportSettingsRequest(code, payload);\n },\n onSuccess(data) {\n if (name) {\n applySupportSettingsUpdate(queryClient, name, data);\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getBoostPlusPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boost-plus-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\n/**\n * RC top-up pricing: duration -> Points cost tiers, served by the ePoints\n * backend via the private API. Reuses the {@link PromotePrice} shape\n * ({ duration, price }).\n */\nexport function getRcDelegationPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation prices: ${response.status}`);\n }\n\n return (await response.json()) as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface RcDelegationActive {\n user: string;\n expires: Date;\n}\n\n/**\n * The active (ON) RC top-up for a user, if any. Lets the UI block a duplicate\n * purchase up front (only one RC top-up is allowed at a time). Returns null\n * when the user has no active top-up.\n */\nexport function getRcDelegationActiveQueryOptions(username: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-active\", username],\n queryFn: async (): Promise => {\n if (!accessToken || !username) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-active\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken, username })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation active: ${response.status}`);\n }\n\n const responseData = (await response.json()) as { user?: string; expires?: string };\n\n return responseData && responseData.expires && responseData.user\n ? { user: responseData.user, expires: new Date(responseData.expires) }\n : null;\n },\n enabled: !!username && !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getPromotePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"promote-price\"],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/promote-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch promote prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface BoostPlusAccountPrice {\n account: string;\n expires: Date;\n}\n\nexport function getBoostPlusAccountPricesQueryOptions(account: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-accounts\", account],\n queryFn: async (): Promise => {\n if (!accessToken || !account) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boosted-plus-account\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken, account }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus account prices: ${response.status}`);\n }\n\n const responseData = await response.json() as {\n expires: string;\n account: string;\n };\n\n return responseData\n ? {\n account: responseData.account,\n expires: new Date(responseData.expires)\n }\n : null;\n },\n enabled: !!account && !!accessToken\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildBoostPlusOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface BoostPlusPayload {\n account: string;\n duration: number;\n}\n\nexport function useBoostPlus(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"boost-plus\"],\n username,\n ({ account, duration }) => [\n buildBoostPlusOp(username!, account, duration)\n ],\n async (_data, { account }) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.promotions.boostPlusAccounts(account),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildRcDelegationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface RcDelegationPayload {\n duration: number;\n}\n\n/**\n * Buys a short-term, RC-only delegation (RC top-up) for the active user, paid\n * with Ecency Points. Mirrors {@link useBoostPlus} but is RC-only (no Hive\n * Power / voting power transferred). Invalidates the user's account + RC caches\n * so the new RC shows up once the relay delegation lands.\n */\nexport function useRcDelegation(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"rc-delegation\"],\n username,\n ({ duration }) => [buildRcDelegationOp(username!, duration)],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!),\n [\"promotions\", \"rc-delegation-active\", username]\n ]);\n }\n },\n auth,\n \"active\",\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { HsTokenRenewResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nexport async function hsTokenRenew(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/auth-api/hs-token-refresh\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n const error = new Error(`Failed to refresh token: ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n const data = (await response.json()) as HsTokenRenewResponse;\n return data;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"../../core\";\n\nconst BAD_ACTORS_URL =\n \"https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt\";\n\nexport function getBadActorsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.badActors.list(),\n queryFn: async ({ signal }) => {\n const response = await fetch(BAD_ACTORS_URL, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bad actors list: ${response.status}`);\n }\n\n const text = await response.text();\n return new Set(text.split(\"\\n\").filter(Boolean));\n },\n staleTime: 24 * 60 * 60 * 1000,\n /**\n * Deliberately left unbounded, including under SSR.\n *\n * `Infinity` is the one value that schedules no gc timer at all —\n * `isValidTimeout` in query-core rejects non-finite timeouts, so\n * `scheduleGc` is a no-op. With no timer there is no GC root, and on a\n * per-request client the entry dies with the request that made it.\n * Replacing it with a finite window would *create* a timer that retains the\n * Query and, through it, that request's whole QueryCache — strictly worse\n * here than leaving it alone.\n */\n gcTime: Infinity\n });\n}\n","export const POLLS_PROTOCOL_VERSION = 1.1;\n\nexport enum PollPreferredInterpretation {\n NUMBER_OF_VOTES = \"number_of_votes\",\n TOKENS = \"tokens\",\n}\n\nexport interface PollChoiceVotes {\n total_votes: number;\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied: number | null;\n}\n\nexport interface PollChoice {\n choice_num: number;\n choice_text: string;\n votes?: PollChoiceVotes;\n}\n\nexport interface PollVoter {\n name: string;\n choices: number[];\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied?: number;\n}\n\nexport interface PollStats {\n total_voting_accounts_num: number;\n total_hive_hp?: number;\n total_hive_proxied_hp?: number;\n total_hive_hp_incl_proxied: number | null;\n}\n\nexport interface Poll {\n author: string;\n permlink: string;\n question: string;\n poll_choices: PollChoice[];\n poll_voters?: PollVoter[];\n poll_stats?: PollStats;\n poll_trx_id: string;\n status: string;\n end_time: string;\n preferred_interpretation: PollPreferredInterpretation | string;\n max_choices_voted: number;\n filter_account_age_days: number;\n protocol_version: number;\n created: string;\n post_title: string;\n post_body: string;\n parent_permlink: string;\n tags: string[];\n image: unknown[];\n token?: string | null;\n community_membership?: string[];\n allow_vote_changes?: boolean;\n ui_hide_res_until_voted?: boolean;\n platform?: string;\n}\n\nexport function mapMetaChoicesToPollChoices(metaChoices: string[]): PollChoice[] {\n if (!metaChoices) {\n return [];\n }\n\n return metaChoices.map((choice, index) => ({\n choice_num: index + 1,\n choice_text: choice,\n votes: {\n total_votes: 0,\n hive_hp: 0,\n hive_proxied_hp: 0,\n hive_hp_incl_proxied: 0,\n },\n }));\n}\n","import { isServer, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys, SERVER_GC_TIME_MS } from \"@/modules/core\";\nimport { getBoundFetch } from \"@/modules/core/utils\";\nimport type { Poll, PollChoice, PollVoter, PollStats } from \"../types\";\n\nfunction normalizePoll(raw: Record): Poll {\n const pollChoices = (raw.poll_choices as Record[] | undefined) ?? [];\n const pollVoters = (raw.poll_voters as Record[] | undefined) ?? [];\n const rawStats = raw.poll_stats as Record | undefined;\n\n const choices: PollChoice[] = pollChoices.map((c) => {\n const votes = c.votes as Record | undefined;\n return {\n choice_num: (c.choice_num as number) ?? 0,\n choice_text: (c.choice_text as string) ?? \"\",\n votes: votes\n ? {\n total_votes: (votes.total_votes as number) ?? 0,\n hive_hp: votes.hive_hp as number | undefined,\n hive_proxied_hp: votes.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: (votes.hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined,\n };\n });\n\n const voters: PollVoter[] = pollVoters.map((v) => ({\n name: (v.name as string) ?? \"\",\n choices: (v.choices as number[]) ?? [],\n hive_hp: v.hive_hp as number | undefined,\n hive_proxied_hp: v.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: v.hive_hp_incl_proxied as number | undefined,\n }));\n\n const stats: PollStats | undefined = rawStats\n ? {\n total_voting_accounts_num: (rawStats.total_voting_accounts_num as number) ?? 0,\n total_hive_hp: rawStats.total_hive_hp as number | undefined,\n total_hive_proxied_hp: rawStats.total_hive_proxied_hp as number | undefined,\n total_hive_hp_incl_proxied: (rawStats.total_hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined;\n\n return {\n author: (raw.author as string) ?? \"\",\n permlink: (raw.permlink as string) ?? \"\",\n question: (raw.question as string) ?? \"\",\n poll_choices: choices,\n poll_voters: voters,\n poll_stats: stats,\n poll_trx_id: (raw.poll_trx_id as string) ?? \"\",\n status: (raw.status as string) ?? \"\",\n end_time: (raw.end_time as string) ?? \"\",\n preferred_interpretation: (raw.preferred_interpretation as string) ?? \"number_of_votes\",\n max_choices_voted: (raw.max_choices_voted as number) ?? 1,\n filter_account_age_days: (raw.filter_account_age_days as number) ?? 0,\n protocol_version: (raw.protocol_version as number) ?? 0,\n created: (raw.created as string) ?? \"\",\n post_title: (raw.post_title as string) ?? \"\",\n post_body: (raw.post_body as string) ?? \"\",\n parent_permlink: (raw.parent_permlink as string) ?? \"\",\n tags: (raw.tags as string[]) ?? [],\n image: (raw.image as unknown[]) ?? [],\n token: raw.token as string | null | undefined,\n community_membership: raw.community_membership as string[] | undefined,\n allow_vote_changes: raw.allow_vote_changes as boolean | undefined,\n ui_hide_res_until_voted: (raw.ui_hide_res_until_voted as boolean | undefined) ?? false,\n platform: raw.platform as string | undefined,\n };\n}\n\nexport function getPollQueryOptions(\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.polls.details(author ?? \"\", permlink ?? \"\"),\n enabled: !!author && !!permlink,\n // Long in a browser, where a poll is cheap to keep and often revisited;\n // bounded during SSR, where holding it also holds that request's whole\n // cache. See SERVER_GC_TIME_MS.\n gcTime: isServer ? SERVER_GC_TIME_MS : 30 * 60 * 1000,\n queryFn: async (): Promise => {\n if (!author || !permlink) {\n throw new Error(\"[SDK][Polls] – missing author or permlink\");\n }\n\n const fetchApi = getBoundFetch();\n const url = `${CONFIG.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(author)}&permlink=eq.${encodeURIComponent(permlink)}`;\n const response = await fetchApi(url);\n\n if (!response.ok) {\n throw new Error(`[SDK][Polls] – fetch failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data) || !data[0]) {\n throw new Error(\"[SDK][Polls] – no poll data found\");\n }\n\n return normalizePoll(data[0]);\n },\n });\n}\n","import { QueryKeys, useBroadcastMutation } from \"@/modules/core\";\nimport type { BroadcastMode, AuthContextV2 } from \"@/modules/core\";\n\nexport interface PollVotePayload {\n pollTrxId: string;\n choices: number[];\n}\n\nexport function usePollVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n QueryKeys.polls.vote(),\n username ?? \"\",\n ({ pollTrxId, choices }) => {\n if (!username) {\n throw new Error(\"[SDK][Polls] Cannot vote without an authenticated username\");\n }\n return [\n [\n \"custom_json\",\n {\n id: \"polls\",\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify({\n poll: pollTrxId,\n action: \"vote\",\n choices,\n }),\n },\n ],\n ];\n },\n undefined,\n auth,\n \"posting\",\n { broadcastMode: broadcastMode ?? \"async\" }\n );\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/hive-tx/helpers/ByteBuffer.ts","../../src/hive-tx/config.ts","../../src/hive-tx/helpers/Signature.ts","../../src/hive-tx/helpers/PublicKey.ts","../../src/hive-tx/helpers/Asset.ts","../../src/hive-tx/helpers/HexBuffer.ts","../../src/hive-tx/helpers/serializer.ts","../../src/hive-tx/helpers/sleep.ts","../../src/hive-tx/helpers/call.ts","../../src/hive-tx/Transaction.ts","../../src/hive-tx/helpers/PrivateKey.ts","../../src/hive-tx/helpers/aes.ts","../../src/hive-tx/helpers/deserializer.ts","../../src/hive-tx/helpers/memo.ts","../../src/hive-tx/helpers/utils.ts","../../src/modules/core/hive-tx.ts","../../src/modules/core/errors/chain-errors.ts","../../src/modules/core/mutations/use-broadcast-mutation.ts","../../src/modules/core/mutations/broadcast-json.ts","../../src/modules/core/mutations/invalidate-after-broadcast.ts","../../src/modules/core/abort-signal.ts","../../src/modules/core/config.ts","../../src/modules/core/queries-manager.ts","../../src/modules/core/utils/decoder-encoder.ts","../../src/modules/core/utils/parse-asset.ts","../../src/modules/core/utils/get-bound-fetch.ts","../../src/modules/core/utils/is-community.ts","../../src/modules/core/utils/pagination-helpers.ts","../../src/modules/core/utils/vests-to-hp.ts","../../src/modules/core/utils/is-empty-date.ts","../../src/modules/core/queries/get-dynamic-props-query-options.ts","../../src/modules/core/queries/get-reward-fund-query-options.ts","../../src/modules/core/query-keys.ts","../../src/modules/ai/queries/get-ai-generate-price-query-options.ts","../../src/modules/ai/queries/get-ai-assist-price-query-options.ts","../../src/modules/ai/queries/get-ai-transcribe-price-query-options.ts","../../src/modules/ai/mutations/use-generate-image.ts","../../src/modules/ai/mutations/use-ai-assist.ts","../../src/modules/ai/mutations/use-ai-transcribe.ts","../../src/modules/accounts/queries/get-account-full-query-options.ts","../../src/modules/accounts/utils/profile-metadata.ts","../../src/modules/accounts/utils/parse-accounts.ts","../../src/modules/accounts/queries/get-accounts-query-options.ts","../../src/modules/accounts/queries/get-follow-count-query-options.ts","../../src/modules/accounts/queries/get-followers-query-options.ts","../../src/modules/accounts/queries/get-following-query-options.ts","../../src/modules/accounts/queries/get-muted-users-query-options.ts","../../src/modules/accounts/queries/lookup-accounts-query-options.ts","../../src/modules/accounts/queries/search-accounts-by-username-query-options.ts","../../src/modules/accounts/queries/check-username-wallets-pending-query-options.ts","../../src/modules/accounts/queries/get-relationship-between-accounts-query-options.ts","../../src/modules/accounts/queries/get-account-subscriptions-query-options.ts","../../src/modules/accounts/queries/get-bookmarks-query-options.ts","../../src/modules/accounts/queries/get-favorites-query-options.ts","../../src/modules/accounts/queries/check-favorite-query-options.ts","../../src/modules/accounts/queries/get-account-recoveries-query-options.ts","../../src/modules/accounts/queries/get-account-pending-recovery-query-options.ts","../../src/modules/accounts/queries/get-account-reputations-query-options.ts","../../src/modules/accounts/queries/get-transactions-infinite-query-options.ts","../../src/modules/accounts/queries/get-bots-query-options.ts","../../src/modules/accounts/queries/get-referrals-infinite-query-options.ts","../../src/modules/accounts/queries/get-referrals-stats-query-options.ts","../../src/modules/accounts/queries/get-friends-infinite-query-options.ts","../../src/modules/accounts/queries/get-search-friends-query-options.ts","../../src/modules/posts/queries/get-trending-tags-query-options.ts","../../src/modules/posts/queries/get-trending-tags-with-stats-query-options.ts","../../src/modules/posts/queries/get-fragments-query-options.ts","../../src/modules/posts/queries/get-promoted-posts-query-options.ts","../../src/modules/posts/queries/get-entry-active-votes-query-options.ts","../../src/modules/posts/queries/get-user-post-vote-query-options.ts","../../src/modules/posts/queries/get-content-query-options.ts","../../src/modules/posts/queries/get-content-replies-query-options.ts","../../src/modules/posts/queries/get-post-header-query-options.ts","../../src/modules/posts/utils/filter-dmca-entries.ts","../../src/modules/bridge/verify-on-alternate-node.ts","../../src/modules/posts/queries/get-post-query-options.ts","../../src/modules/bridge/requests.ts","../../src/modules/posts/queries/get-discussions-query-options.ts","../../src/modules/posts/queries/get-account-posts-query-options.ts","../../src/modules/posts/queries/get-posts-ranked-query-options.ts","../../src/modules/posts/queries/get-reblogs-query-options.ts","../../src/modules/posts/queries/get-reblogged-by-query-options.ts","../../src/modules/posts/queries/get-schedules-query-options.ts","../../src/modules/posts/queries/get-drafts-query-options.ts","../../src/modules/posts/queries/get-images-query-options.ts","../../src/modules/posts/queries/get-comment-history-query-options.ts","../../src/modules/posts/queries/get-deleted-entry-query-options.ts","../../src/modules/posts/queries/get-post-tips-query-options.ts","../../src/modules/posts/utils/waves-helpers.ts","../../src/modules/posts/queries/get-waves-feed-query-options.ts","../../src/modules/posts/queries/get-shorts-feed-query-options.ts","../../src/modules/posts/queries/get-waves-by-host-query-options.ts","../../src/modules/posts/queries/get-waves-by-tag-query-options.ts","../../src/modules/posts/queries/get-waves-following-query-options.ts","../../src/modules/posts/queries/get-waves-trending-tags-query-options.ts","../../src/modules/posts/queries/get-waves-by-account-query-options.ts","../../src/modules/posts/queries/get-waves-trending-authors-query-options.ts","../../src/modules/posts/queries/get-normalize-post-query-options.ts","../../src/modules/accounts/queries/get-account-vote-history-infinite-query-options.ts","../../src/modules/accounts/queries/get-profiles-query-options.ts","../../src/modules/accounts/queries/get-balance-history-query-options.ts","../../src/modules/accounts/queries/get-aggregated-balance-query-options.ts","../../src/modules/accounts/queries/get-pro-members-query-options.ts","../../src/modules/accounts/mutations/use-account-update.ts","../../src/modules/accounts/mutations/use-account-relations-update.ts","../../src/modules/operations/builders/content.ts","../../src/modules/operations/builders/wallet.ts","../../src/modules/operations/builders/social.ts","../../src/modules/operations/builders/governance.ts","../../src/modules/operations/builders/community.ts","../../src/modules/operations/builders/market.ts","../../src/modules/operations/builders/account.ts","../../src/modules/operations/builders/ecency.ts","../../src/modules/accounts/mutations/use-follow.ts","../../src/modules/accounts/mutations/use-unfollow.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-add.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-delete.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-add.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-delete.ts","../../src/modules/accounts/mutations/use-account-update-key-auths.ts","../../src/modules/accounts/mutations/use-account-update-password.ts","../../src/modules/accounts/mutations/use-account-revoke-posting.ts","../../src/modules/accounts/mutations/use-account-update-recovery.ts","../../src/modules/accounts/mutations/build-revoke-keys-op.ts","../../src/modules/accounts/mutations/use-account-revoke-key.ts","../../src/modules/accounts/mutations/use-claim-account.ts","../../src/modules/accounts/mutations/use-grant-posting-permission.ts","../../src/modules/accounts/mutations/use-create-account.ts","../../src/modules/accounts/utils/account-power.ts","../../src/modules/operations/authority-map.ts","../../src/modules/operations/mutations/sign-operation-by-key.ts","../../src/modules/operations/mutations/sign-operation-by-keychain.ts","../../src/modules/operations/mutations/sign-operation-by-hivesigner.ts","../../src/modules/operations/queries/get-chain-properties-query-options.ts","../../src/modules/posts/utils/fragment-cache-helpers.ts","../../src/modules/posts/mutations/add-fragment.ts","../../src/modules/posts/mutations/edit-fragment.ts","../../src/modules/posts/mutations/remove-fragment.ts","../../src/modules/private-api/requests.ts","../../src/modules/posts/mutations/use-add-draft.ts","../../src/modules/posts/mutations/use-update-draft.ts","../../src/modules/posts/mutations/use-delete-draft.ts","../../src/modules/posts/mutations/use-add-schedule.ts","../../src/modules/posts/mutations/use-delete-schedule.ts","../../src/modules/posts/mutations/use-move-schedule.ts","../../src/modules/posts/mutations/use-add-image.ts","../../src/modules/posts/mutations/use-delete-image.ts","../../src/modules/posts/mutations/use-upload-image.ts","../../src/modules/posts/cache/entries-cache-management.ts","../../src/modules/posts/mutations/use-vote.ts","../../src/modules/posts/mutations/use-reblog.ts","../../src/modules/posts/mutations/use-comment.ts","../../src/modules/posts/cache/discussions-cache-utils.ts","../../src/modules/posts/mutations/use-delete-comment.ts","../../src/modules/posts/mutations/use-cross-post.ts","../../src/modules/posts/mutations/use-update-reply.ts","../../src/modules/posts/mutations/use-promote.ts","../../src/modules/posts/utils/validate-post-creating.ts","../../src/modules/analytics/mutations/index.ts","../../src/modules/analytics/mutations/use-record-activity.ts","../../src/modules/analytics/queries/get-discover-leaderboard-query-options.ts","../../src/modules/analytics/queries/get-discover-curation-query-options.ts","../../src/modules/analytics/queries/get-page-stats-query-options.ts","../../src/modules/integrations/3speak/functions/beneficiary.ts","../../src/modules/integrations/3speak/queries/index.ts","../../src/modules/integrations/hivesigner/queries/index.ts","../../src/modules/integrations/hivesigner/queries/get-decode-memo-query-options.ts","../../src/modules/integrations/hivesigner/index.ts","../../src/modules/integrations/3speak/queries/get-account-token-query-options.ts","../../src/modules/integrations/3speak/queries/get-account-videos-query-options.ts","../../src/modules/integrations/3speak/index.ts","../../src/modules/integrations/hiveposh/queries/get-hiveposh-links-query-options.ts","../../src/modules/integrations/plausible/queries/get-stats-query-options.ts","../../src/modules/resource-credits/queries/get-rc-stats-query-options.ts","../../src/modules/resource-credits/queries/get-account-rc-query-options.ts","../../src/modules/resource-credits/utils/estimate-rc-precheck.ts","../../src/modules/games/queries/game-status-check-query-options.ts","../../src/modules/games/mutations/game-claim.ts","../../src/modules/quests/queries/get-quests-query-options.ts","../../src/modules/quests/catalog.ts","../../src/modules/quests/mutations/buy-streak-freeze.ts","../../src/modules/communities/mutations/use-subscribe-community.ts","../../src/modules/communities/mutations/use-unsubscribe-community.ts","../../src/modules/communities/mutations/use-mute-post.ts","../../src/modules/communities/mutations/use-set-community-role.ts","../../src/modules/communities/mutations/use-update-community.ts","../../src/modules/communities/mutations/use-register-community-rewards.ts","../../src/modules/communities/mutations/use-pin-post.ts","../../src/modules/communities/queries/get-communities-query-options.ts","../../src/modules/communities/queries/get-community-context-query-options.ts","../../src/modules/communities/queries/get-community-query-options.ts","../../src/modules/communities/queries/get-community-subscribers-query-options.ts","../../src/modules/communities/queries/get-account-notifications-infinite-query-options.ts","../../src/modules/communities/queries/get-rewarded-communities-query-options.ts","../../src/modules/communities/types/community.ts","../../src/modules/communities/utils/index.ts","../../src/modules/notifications/queries/get-notifications-unread-count-query-options.ts","../../src/modules/notifications/queries/get-notifications-infinite-query-options.ts","../../src/modules/notifications/enums/notification-filter.ts","../../src/modules/notifications/enums/notify-types.ts","../../src/modules/notifications/queries/get-notifications-settings-query-options.ts","../../src/modules/notifications/queries/get-announcements-query-options.ts","../../src/modules/notifications/queries/get-spotlights-query-options.ts","../../src/modules/notifications/mutations/use-mark-notifications-read.ts","../../src/modules/notifications/mutations/use-set-last-read.ts","../../src/modules/proposals/queries/get-proposal-query-options.ts","../../src/modules/proposals/queries/get-proposals-query-options.ts","../../src/modules/proposals/queries/get-proposal-votes-query-options.ts","../../src/modules/proposals/queries/get-user-proposal-votes-query-options.ts","../../src/modules/proposals/mutations/use-proposal-vote.ts","../../src/modules/proposals/mutations/use-proposal-create.ts","../../src/modules/wallet/queries/get-vesting-delegations-query-options.ts","../../src/modules/wallet/queries/get-account-delegations-query-options.ts","../../src/modules/wallet/queries/get-vesting-delegation-expirations-query-options.ts","../../src/modules/wallet/queries/get-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-collateralized-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-savings-withdraw-from-query-options.ts","../../src/modules/wallet/queries/get-withdraw-routes-query-options.ts","../../src/modules/wallet/queries/get-open-orders-query-options.ts","../../src/modules/wallet/queries/get-outgoing-rc-delegations-infinite-query-options.ts","../../src/modules/wallet/queries/get-incoming-rc-query-options.ts","../../src/modules/wallet/queries/get-received-vesting-shares-query-options.ts","../../src/modules/wallet/queries/get-recurrent-transfers-query-options.ts","../../src/modules/wallet/queries/get-portfolio-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-general-info-query-options.ts","../../src/modules/wallet/consts/hive-account-operation-groups.ts","../../src/modules/wallet/consts/hive-operation-list.ts","../../src/modules/wallet/consts/hive-operation-orders.ts","../../src/modules/wallet/queries/get-hive-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-metric-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-withdrawal-routes-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegates-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegatings-query-options.ts","../../src/modules/market/queries/get-order-book-query-options.ts","../../src/modules/market/queries/get-market-statistics-query-options.ts","../../src/modules/market/queries/get-market-history-query-options.ts","../../src/modules/market/queries/get-hive-hbd-stats-query-options.ts","../../src/modules/market/queries/get-market-data-query-options.ts","../../src/modules/market/queries/get-trade-history-query-options.ts","../../src/modules/market/queries/get-feed-history-query-options.ts","../../src/modules/market/queries/get-current-median-history-price-query-options.ts","../../src/modules/market/mutations/use-limit-order-create.ts","../../src/modules/market/mutations/use-limit-order-cancel.ts","../../src/modules/market/requests.ts","../../src/modules/hive-engine/requests.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-balances-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-market-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-metadata-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-transactions-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-metrics-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-unclaimed-rewards-query-options.ts","../../src/modules/hive-engine/queries/get-all-hive-engine-tokens-query-options.ts","../../src/modules/hive-engine/utils/formatted-number.ts","../../src/modules/hive-engine/utils/hive-engine-token.ts","../../src/modules/hive-engine/queries/get-hive-engine-balances-with-usd-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-general-info-query-options.ts","../../src/modules/points/queries/get-points-query-options.ts","../../src/modules/points/queries/get-points-asset-general-info-query-options.ts","../../src/modules/points/queries/get-points-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-account-wallet-asset-info-query-options.ts","../../src/modules/wallet/types/asset-operation.ts","../../src/modules/wallet/mutations/use-transfer.ts","../../src/modules/wallet/mutations/use-transfer-point.ts","../../src/modules/wallet/mutations/use-delegate-vesting-shares.ts","../../src/modules/wallet/mutations/use-set-withdraw-vesting-route.ts","../../src/modules/wallet/mutations/use-transfer-engine-token.ts","../../src/modules/wallet/mutations/use-transfer-to-savings.ts","../../src/modules/wallet/mutations/use-transfer-from-savings.ts","../../src/modules/wallet/mutations/use-transfer-to-vesting.ts","../../src/modules/wallet/mutations/use-withdraw-vesting.ts","../../src/modules/wallet/mutations/use-convert.ts","../../src/modules/wallet/mutations/use-claim-interest.ts","../../src/modules/wallet/mutations/use-claim-rewards.ts","../../src/modules/wallet/mutations/use-delegate-engine-token.ts","../../src/modules/wallet/mutations/use-undelegate-engine-token.ts","../../src/modules/wallet/mutations/use-stake-engine-token.ts","../../src/modules/wallet/mutations/use-unstake-engine-token.ts","../../src/modules/wallet/mutations/use-claim-engine-rewards.ts","../../src/modules/wallet/mutations/use-engine-market-order.ts","../../src/modules/wallet/mutations/use-wallet-operation.ts","../../src/modules/wallet/mutations/use-delegate-rc.ts","../../src/modules/witnesses/mutations/use-witness-vote.ts","../../src/modules/witnesses/mutations/use-witness-proxy.ts","../../src/modules/witnesses/queries/get-witnesses-query-options.ts","../../src/modules/points/types/point-transaction-type.ts","../../src/modules/points/mutations/use-claim-points.ts","../../src/modules/search/query-builder.ts","../../src/modules/search/parse-json-response.ts","../../src/modules/search/retry-policy.ts","../../src/modules/search/queries/get-search-query-options.ts","../../src/modules/search/requests.ts","../../src/modules/search/queries/get-similar-entries-query-options.ts","../../src/modules/search/queries/get-search-account-query-options.ts","../../src/modules/search/queries/get-search-topics-query-options.ts","../../src/modules/search/queries/get-search-api-infinite-query-options.ts","../../src/modules/search/queries/get-search-path-query-options.ts","../../src/modules/support/queries/get-support-settings-query-options.ts","../../src/modules/support/mutations/update-support-settings.ts","../../src/modules/promotions/queries/get-boost-plus-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-active-query-options.ts","../../src/modules/promotions/queries/get-promote-price-query-options.ts","../../src/modules/promotions/queries/get-boost-plus-account-prices-query-options.ts","../../src/modules/promotions/mutations/use-boost-plus.ts","../../src/modules/promotions/mutations/use-rc-delegation.ts","../../src/modules/auth/requests.ts","../../src/modules/bad-actors/queries/get-bad-actors-query-options.ts","../../src/modules/polls/types/poll.ts","../../src/modules/polls/queries/get-poll-query-options.ts","../../src/modules/polls/mutations/use-poll-vote.ts"],"names":["EMPTY_BUFFER","_encoder","_decoder","getEncoder","s","utf8","i","c","next","getDecoder","b","bytes","result","byte","codePoint","_ByteBuffer","capacity","littleEndian","__publicField","buffers","buf","bb","view","offset","buffer","source","value","relative","src","copy","begin","end","target","targetOffset","sourceOffset","sourceLimit","targetRelative","len","current","length","forceCopy","limit","size","str","currentOffset","encoded","lenVarintSize","start","lenResult","lenValue","lenLength","ByteBuffer","config","sanitizeNodeList","nodes","n","setNodes","validNodes","setRestNodes","valid","setRestNodesByApi","map","api","list","setUserAgent","ua","setResilience","opts","r","bool","v","pos","Signature","_Signature","data","recovery","compressed","string","temp","hexToBytes","bytesToHex","message","sig","secp256k1","PublicKey","_PublicKey","key","prefix","wif","expectedPrefix","bs58","checksum","expectedChecksum","ripemd160","isUint8ArrayEqual","signature","encodePublic","a","Asset","_Asset","amount","symbol","expectedSymbol","amountString","HexBuffer","_HexBuffer","OPERATION_IDS","VoidSerializer","StringSerializer","Int16Serializer","Int64Serializer","UInt8Serializer","UInt16Serializer","UInt32Serializer","UInt64Serializer","BooleanSerializer","StaticVariantSerializer","itemSerializers","id","item","AssetSerializer","asset","precision","DateSerializer","PublicKeySerializer","BinarySerializer","VariableBinarySerializer","FlatMapSerializer","keySerializer","valueSerializer","ArraySerializer","itemSerializer","ObjectSerializer","keySerializers","serializer","error","OptionalSerializer","AuthoritySerializer","BeneficiarySerializer","PriceSerializer","ChainPropertiesSerializer","OperationDataSerializer","operationId","definitions","objectSerializer","OperationSerializers","ProposalUpdateSerializer","OperationSerializer","operation","TransactionSerializer","EncryptedMemoSerializer","Serializer","sleep","ms","resolve","isNodeRuntime","serverIdentityHeaders","RPCError","rpcError","NodeError","node","parseRetryAfterMs","header","secs","dateMs","delta","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","RATE_LIMIT_BASE_MS","RATE_LIMIT_MAX_MS","RATE_LIMIT_STREAK_RESET_MS","MAX_API_FAILURES_BEFORE_COOLDOWN","API_COOLDOWN_MS","HEAD_BLOCK_MAX_AGE_MS","STALE_BLOCK_THRESHOLD","LATENCY_EWMA_ALPHA","LATENCY_MIN_SAMPLES","LATENCY_MAX_AGE_MS","LATENCY_REPROBE_MS","LATENCY_UNPROVEN_PRIOR_MS","LATENCY_SLOW_FAILURE_MS","NodeHealthTracker","h","durationMs","profileKey","apiFail","now","p","elapsedMs","existing","retryAfterMs","hasHeader","cooldown","blockNum","recent","best","healthy","unhealthy","ordered","d","probe","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","HedgeBudget","tokens","rpcHedgeBudget","adaptiveAttemptTimeout","tracker","callerTimeout","explicit","ewma","recordError","e","tryRecordHeadBlock","block","createTimeoutReason","err","createTimeoutSignal","controller","timer","mergeSignals","primary","secondary","onPrimaryAbort","onSecondaryAbort","cleanup","jsonRPCCall","url","params","timeout","shouldRetry","externalSignal","body","tSignal","cleanupTimeout","signal","cleanupMerge","res","jitterDelay","hedgedRpcAttempt","hedgePool","explicitTimeout","deadlineAt","onHedgeFired","validate","reject","done","pendingLegs","hedgeFired","primarySettled","lastError","hedgeTimer","primaryStart","controllers","finish","settle","startLeg","isHedge","merged","legTimeout","primaryWindow","delay","live","callRPC","retry","ceiling","deadline","triedInRound","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","restProfileKey","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","restSignal","restCleanup","restCallStart","response","callWithQuorum","quorum","allNodes","arr","j","currentBatchSize","allResults","batchNodes","promises","batchResults","consensusResult","findConsensus","results","resultGroups","consensusGroup","group","chainId","Transaction","_Transaction","options","expiration","props","refBlockPrefix","expirationIso","operationName","operationBody","keys","digest","txId","checkStatus","maxPollAttempts","status","transactionData","sha256","NETWORK_ID","PrivateKey","_PrivateKey","decodePrivate","seed","username","password","role","rv","encodePrivate","publicKey","sha512","doubleSha256","input","encodedKey","checksumVerify","encrypt","privateKey","nonce","uniqueNonce","crypt","decrypt","nonceL","S","ebuf","encryptionKey","iv","tag","check","cbuf","check32","cryptoJsDecrypt","cryptoJsEncrypt","messageBuffer","AESCBC","uniqueNonceEntropy","randomPrivateKey","long","entropy","PublicKeyDeserializer","fixedBuf","UInt64Deserializer","UInt32Deserializer","BinaryDeserializer","bCopy","BufferDeserializer","keyDeserializers","obj","deserializer","EncryptedMemoDeserializer","Deserializer","encode","memo","testNonce","checkEncryption","toPrivateObj","toPublicObj","mbuf","memoBuffer","mbuf2","decode","from","to","encrypted","otherpub","encodeTest","plaintext","cyphertext","o","Memo","utils_exports","__export","buildWitnessSetProperties","makeBitMaskFilter","operations","validateUsername","suffix","ref","label","allowedOperations","reduceFunction","low","high","allowedOperation","owner","type","serialize","nobleSha256","isWif","broadcastOperations","ops","tx","op","broadcastOperationsAsync","MANA_REGENERATION_SECONDS","calculateManabar","maxMana","manabar","currentMana","percentage","getVests","account","vests","delegated","received","withdrawRate","alreadyWithdrawn","withdrawVests","calculateVPMana","calculateRCMana","rcAccount","ErrorType","parseChainError","errorDescription","errorMessage","errorCode","errorString","testPattern","pattern","formatError","parsed","shouldTriggerAuthFallback","isResourceCreditsError","isInfoError","isNetworkError","broadcastWithMethod","auth","authority","fetchedKey","fetchedToken","broadcastMode","adapter","token","hs","tokenError","broadcastWithFallback","loginType","hasPostingAuth","selectedMethod","hsError","chain","errors","shouldSkip","skipReason","prefetchedKey","prefetchedToken","skipReasons","errorMessages","useBroadcastMutation","mutationKey","onSuccess","useMutation","payload","postingKey","accessToken","broadcastJson","jjson","BROADCAST_INCLUSION_DELAY_MS","invalidateAfterBroadcast","withTimeoutSignal","timeoutMs","timeoutSignal","ac","onAbort","reason","isDevelopment","getHeliusApiKey","INTERNAL_API_TIMEOUT_MS","SERVER_GC_TIME_MS","queryClientResolver","fallbackQueryClient","resolveQueryClient","QueryClient","CONFIG","client","ConfigManager","setQueryClient","setQueryClientResolver","setPrivateApiHost","host","setClientId","clientId","setDefaultObserver","observer","getValidatedBaseUrl","setPollsApiHost","setImageHost","setHiveNodes","userAgent","analyzeRedosRisk","unboundedRange","match","min","max","testRegexPerformance","regex","adversarialInputs","maxExecutionTime","duration","safeCompileRegex","maxLength","staticAnalysis","compileErr","runtimeTest","setDmcaLists","lists","coerceList","resolved","rejectedTagCount","makeQueryClient","getQueryClient","EcencyQueriesManager","getQueryData","queryKey","getInfiniteQueryData","prefetchQuery","prefetchInfiniteQuery","generateClientServerQuery","useQuery","generateClientServerInfiniteQuery","useInfiniteQuery","encodeObj","decodeObj","dataToParse","Symbol","NaiMap","parseAsset","sval","sp","cachedFetch","getBoundFetch","isCommunity","isWrappedResponse","normalizeToWrappedResponse","vestsToHp","hivePerMVests","isEmptyDate","DYNAMIC_PROPS_REFRESH_MS","getDynamicPropsQueryOptions","queryOptions","QueryKeys","rawGlobalDynamic","rawFeedHistory","rawChainProps","rawRewardFund","rawHardforkProps","totalVestingSharesAmount","totalVestingFundAmount","base","quote","fundRecentClaims","fundRewardBalance","votePowerReserveRate","authorRewardCurve","contentConstant","currentHardforkVersion","lastHardfork","hbdPrintRate","hbdInterestRate","headBlock","totalVestingFund","totalVestingShares","virtualSupply","vestingRewardPercent","accountCreationFee","getRewardFundQueryOptions","fundName","entryPath","author","permlink","filter","startAuthor","startPermlink","activeUsername","sort","order","onlyMeta","hours","usernames","following","mode","followType","query","follower","startFollowing","startFollower","excludeList","accounts","targetUsername","reference","name","communityName","proposalId","voter","q","hideLow","since","scrollId","votes","what","content","includeNsfw","witness","page","pageSize","direction","user","coinType","granularity","onlyEnabled","currency","filterKey","bucketSeconds","seconds","startDate","endDate","coin","vsCurrency","fromTs","toTs","dimensions","metrics","dateRange","gameType","getAiGeneratePriceQueryOptions","getAiAssistPriceQueryOptions","getAiTranscribePriceQueryOptions","makeIdempotencyKey","useGenerateImage","pendingData","useAiAssist","useAiTranscribe","form","isMetadataStripped","hasProfileValues","profile","getAccountFullQueryOptions","bridgeProfile","rows","chainAccount","reread","parseProfileMetadata","stats","follow_stats","reputationValue","DENIED_KEYS","isPlainObject","proto","deepMerge","srcVal","tgtVal","sanitizeTokens","meta","rest","safeMeta","postingJsonMetadata","extractAccountProfile","pickRicherMetadataSnapshot","preferred","fallback","preferredKeys","parsePostingMetadataRoot","buildPostingJsonMetadata","existingPostingJsonMetadata","root","existingProfile","mergedProfile","buildProfileMetadata","profileTokens","_ignoredVersion","profileRest","metadata","parseAccounts","rawAccounts","x","jsonMetadata","getAccountsQueryOptions","getFollowCountQueryOptions","getFollowersQueryOptions","getFollowingQueryOptions","MUTED_USERS_PAGE_SIZE","MUTED_USERS_MAX_PAGES","getMutedUsersQueryOptions","muted","names","lookupAccountsQueryOptions","getSearchAccountsByUsernameQueryOptions","RESERVED_META_KEYS","checkUsernameWalletsPendingQueryOptions","wallets","walletItem","sanitizedMeta","address","showFlag","baseCandidate","metaTokenCandidates","metaSymbol","metaValue","getRelationshipBetweenAccountsQueryOptions","getAccountSubscriptionsQueryOptions","getBookmarksQueryOptions","getBookmarksInfiniteQueryOptions","infiniteQueryOptions","pageParam","json","lastPage","getFavoritesQueryOptions","getFavoritesInfiniteQueryOptions","checkFavoriteQueryOptions","getAccountRecoveriesQueryOptions","getAccountPendingRecoveryQueryOptions","getAccountReputationsQueryOptions","ACCOUNT_OPERATION_GROUPS","ALL_ACCOUNT_OPERATIONS","acc","val","deriveNum","entry","normalizeOpType","restType","isNaiAsset","naiToString","normalizeOpValue","k","getTransactionsInfiniteQueryOptions","operationTypes","nextPage","getBotsQueryOptions","getReferralsInfiniteQueryOptions","maxId","nextMaxId","getReferralsStatsQueryOptions","getFriendsInfiniteQueryOptions","enabled","accountNames","SEARCH_LIMIT","getSearchFriendsQueryOptions","getTrendingTagsQueryOptions","afterTag","tags","getTrendingTagsWithStatsQueryOptions","getFragmentsQueryOptions","getFragmentsInfiniteQueryOptions","getPromotedPostsQuery","getEntryActiveVotesQueryOptions","getUserPostVoteQueryOptions","getContentQueryOptions","getContentRepliesQueryOptions","getPostHeaderQueryOptions","filterDmcaEntry","entryOrEntries","applyFilter","verifyPostOnAlternateNode","getPostQueryOptions","num","cleanPermlink","verified","verifiedEntry","bridgeApiCall","resolvePost","post","resp","getPost","resolvePosts","posts","validatedPosts","validateEntry","getPostsRanked","start_author","start_permlink","getAccountPosts","newEntry","requiredStringProps","prop","validatedEntry","getPostHeader","getDiscussion","validatedResp","getCommunity","getCommunities","last","normalizePost","getSubscriptions","getSubscribers","community","getRelationshipBetweenAccounts","getProfiles","SortOrder","sortDiscussions","discussion","allPayout","absNegative","isPinned","sortOrders","_a","_b","keyA","keyB","sorted","pinnedIndex","pinned","getDiscussionsQueryOptions","resolvedObserver","oldData","newData","optimisticEntries","fetchedPermlinks","missingOptimistic","opt","getDiscussionQueryOptions","getAccountPostsInfiniteQueryOptions","hasNextPage","getAccountPostsQueryOptions","displaySelects","displaySelect","select","orderForDisplay","byCreated","getPostsRankedInfiniteQueryOptions","_options","sanitizedTag","getPostsRankedQueryOptions","getReblogsQueryOptions","getRebloggedByQueryOptions","getSchedulesQueryOptions","getSchedulesInfiniteQueryOptions","getDraftsQueryOptions","getDraftsInfiniteQueryOptions","fetchUserImages","getImagesQueryOptions","getGalleryImagesQueryOptions","getImagesInfiniteQueryOptions","getCommentHistoryQueryOptions","makeEntryPath","cleanAuthor","normalizedAuthor","normalizedPermlink","getDeletedEntryQueryOptions","isValid","history","title","getPostTipsQueryOptions","isEnabled","normalizeContainer","normalizeParent","normalizeWaveEntryFromApi","containerSource","container","parent","toEntryArray","getVisibleFirstLevelThreadItems","discussionItemsRaw","discussionItems","firstLevelItems","parent_author","parent_permlink","mapThreadItemsToWaveEntries","items","DEFAULT_FEED_LIMIT","normalizeParams","fetchWavesFeedPage","containers","cursor","row","getWavesFeedQueryOptions","normalized","getWavesLatestFeedQueryOptions","fetchShortsFeedPage","getShortsFeedQueryOptions","THREAD_CONTAINER_BATCH_SIZE","MAX_CONTAINERS_TO_SCAN","getThreads","scannedContainers","skipContainerId","rpcParams","normalizedContainers","visibleItems","lastContainer","getWavesByHostQueryOptions","DEFAULT_TAG_FEED_LIMIT","getWavesByTagQueryOptions","getWavesFollowingQueryOptions","normalizedUsername","flattened","getWavesTrendingTagsQueryOptions","getWavesByAccountQueryOptions","getWavesTrendingAuthorsQueryOptions","getNormalizePostQueryOptions","isEntry","getDays","createdDate","past","getAccountVoteHistoryInfiniteQueryOptions","filters","dayLimit","historyObj","filtered","entries","firstHistory","getProfilesQueryOptions","getBalanceHistoryInfiniteQueryOptions","getAggregatedBalanceQueryOptions","getProMembersQueryOptions","proMembersSet","members","m","useAccountUpdate","queryClient","useQueryClient","_data","variables","useAccountRelationsUpdate","onError","kind","relationsQuery","actualRelation","buildVoteOp","weight","buildCommentOp","parentAuthor","parentPermlink","buildCommentOptionsOp","maxAcceptedPayout","percentHbd","allowVotes","allowCurationRewards","extensions","buildDeleteCommentOp","buildReblogOp","deleteReblog","buildTransferOp","buildMultiTransferOps","destinations","dest","buildRecurrentTransferOp","recurrence","executions","buildTransferToSavingsOp","buildTransferFromSavingsOp","requestId","buildCancelTransferFromSavingsOp","buildClaimInterestOps","buildTransferToVestingOp","buildWithdrawVestingOp","vestingShares","buildDelegateVestingSharesOp","delegator","delegatee","buildSetWithdrawVestingRouteOp","fromAccount","toAccount","percent","autoVest","buildConvertOp","buildCollateralizedConvertOp","buildEngineOp","contractAction","contractPayload","contractName","buildEngineClaimOp","buildDelegateRcOp","delegatees","maxRc","delegateeArray","buildFollowOp","buildUnfollowOp","buildIgnoreOp","buildUnignoreOp","buildSetLastReadOps","date","lastReadDate","notifyOp","ecencyNotifyOp","buildWitnessVoteOp","approve","buildWitnessProxyOp","proxy","buildProposalCreateOp","creator","buildProposalVoteOp","proposalIds","buildRemoveProposalOp","proposalOwner","buildUpdateProposalOp","dailyPay","subject","buildSubscribeOp","buildUnsubscribeOp","buildSetRoleOp","buildUpdateCommunityOp","buildPinPostOp","pin","buildMutePostOp","notes","mute","buildMuteUserOp","buildFlagPostOp","BuySellTransactionType","OrderIdPrefix","buildLimitOrderCreateOp","amountToSell","minToReceive","fillOrKill","orderId","formatNumber","decimals","buildLimitOrderCreateOpWithType","orderType","idPrefix","expirationStr","formattedAmountToSell","formattedMinToReceive","buildLimitOrderCancelOp","buildClaimRewardBalanceOp","rewardHive","rewardHbd","rewardVests","buildAccountUpdateOp","active","posting","memoKey","buildAccountUpdate2Op","buildAccountCreateOp","newAccountName","fee","buildCreateClaimedAccountOp","buildClaimAccountOp","buildGrantPostingPermissionOp","currentPosting","grantedAccount","weightThreshold","existingIndex","newAccountAuths","newPosting","buildRevokePostingPermissionOp","revokedAccount","buildChangeRecoveryAccountOp","accountToRecover","newRecoveryAccount","buildRequestAccountRecoveryOp","recoveryAccount","newOwnerAuthority","buildRecoverAccountOp","recentOwnerAuthority","buildBoostPlusOp","buildRcDelegationOp","buildPromoteOp","buildPointTransferOp","sender","receiver","normalizedAmount","buildMultiPointTransferOps","destArray","buildCommunityRegistrationOp","buildActiveCustomJsonOp","buildPostingCustomJsonOp","useFollow","_result","useUnfollow","useBookmarkAdd","useBookmarkDelete","bookmarkId","useAccountFavoriteAdd","qc","useAccountFavoriteDelete","listKey","infinitePrefix","checkKey","previousList","f","previousCheck","infiniteQueries","previousInfinite","context","dedupeAndSortKeyAuths","additions","useAccountUpdateKeyAuths","accountData","keepCurrent","currentKey","keysToRevoke","keysToRevokeByAuthority","prepareAuth","keyName","allKeysToRevoke","existingKeys","values","useAccountUpdatePassword","updateKeys","newPassword","currentPassword","useAccountRevokePosting","accountName","ctx","useAccountUpdateRecovery","email","canRevokeFromAuthority","revokingKeyStrs","remainingWeight","sum","accountWeight","buildRevokeKeysOp","revokingKeys","hasAnyKeyInAuth","clone","needsOwnerUpdate","useAccountRevokeKey","revokingKey","useClaimAccount","useGrantPostingPermission","useCreateAccount","HIVE_VOTING_MANA_REGENERATION_SECONDS","HIVE_100_PERCENT","HIVE_VOTE_DUST_THRESHOLD","getEffectiveVests","vesting","vestsToRshares","votingPowerValue","votePerc","hasStableVoteHardfork","dynamicProps","major","minor","stableVoteRshares","reserveRate","effectiveVests","usedMana","mana","votingRshares","totalVests","votingPower","powerRechargeTime","power","downVotingPower","totalShares","elapsed","currentManaPerc","rcPower","votingValue","rShares","OPERATION_AUTHORITY_MAP","getCustomJsonAuthority","customJsonOp","opType","customJson","getProposalAuthority","proposalOp","getOperationAuthority","getRequiredAuthority","highestAuthority","useSignOperationByKey","keyOrSeed","useSignOperationByKeychain","keyType","useSignOperationByHivesigner","callbackUri","getChainPropertiesQueryOptions","applyFragmentUpdate","vars","buildAddedFragment","useAddFragment","newFragment","index","useEditFragment","fragmentId","applyUpdate","fragment","useRemoveFragment","parseJsonResponse","errorData","signUp","referral","captchaToken","subscribeEmail","usrActivity","ty","bl","getNotifications","saveNotificationSetting","system","allows_notify","notify_types","getNotificationSetting","markNotifications","addImage","UPLOAD_HOST","uploadImage","file","fetchApi","formData","uploadImageWithSignature","deleteImage","imageId","addDraft","updateDraft","draftId","deleteDraft","addSchedule","schedule","reblog","deleteSchedule","moveSchedule","getPromotedPost","onboardEmail","friend","dataBody","useAddDraft","useUpdateDraft","useDeleteDraft","_variables","useAddSchedule","useDeleteSchedule","useMoveSchedule","useAddImage","nextCode","effectiveCode","useDeleteImage","prev","img","useUploadImage","getEntryFromCache","setEntryInCache","mutateEntry","updater","updated","EntriesCacheManagement","updateVotes","payout","updateReblogsCount","count","updateRepliesCount","addReply","reply","updateEntries","invalidateEntry","getEntry","isVoteAlreadyReflected","activeVotes","hasVoterRecord","applyVoteCacheUpdate","newVotes","newPayout","useVote","doInvalidate","useReblog","newCount","invalidate","useComment","beneficiaries","sortedBeneficiaries","isPost","activityType","queriesToInvalidate","discussionsAuthor","discussionsPermlink","addOptimisticDiscussionEntry","rootAuthor","rootPermlink","queries","removeOptimisticDiscussionEntry","snapshots","restoreDiscussionSnapshots","updateEntryInCache","updates","previous","restoreEntryInCache","useDeleteComment","_error","useCrossPost","useUpdateReply","usePromote","DEFAULT_VALIDATE_POST_DELAYS","getContent","validatePostCreating","attempts","delays","waitMs","mutations_exports","useRecordActivity","getLocationInfo","locationInfo","domain","getDiscoverLeaderboardQueryOptions","getDiscoverCurationQueryOptions","accountsResponse","element","curator","receivedVestingShares","delegatedVestingShares","vestingWithdrawRate","effectiveVest","getPageStatsQueryOptions","sortedDimensions","sortedMetrics","THREESPEAK_BENEFICIARY_ACCOUNT","THREESPEAK_BENEFICIARY_WEIGHT","hasThreeSpeakEmbed","enforceThreeSpeakBeneficiary","isThreeSpeakBeneficiary","queries_exports","getAccountTokenQueryOptions","getAccountVideosQueryOptions","getDecodeMemoQueryOptions","HiveSignerIntegration","memoQueryOptions","memoDecoded","tokenQueryOptions","ThreeSpeakIntegration","getHivePoshLinksQueryOptions","getStatsQueryOptions","filterBy","getRcStatsQueryOptions","getAccountRcQueryOptions","EMPTY","estimateRcPrecheck","rcStats","avgCost","safeBuffer","estimatedCost","willLikelyFail","getGameStatusCheckQueryOptions","useGameClaim","recordActivity","getQuestsQueryOptions","QUEST_CATALOG","getQuestCatalogEntry","tier","STREAK_FREEZE_PRICE","STREAK_FREEZE_MAX_OWNED","genIdempotencyKey","buyStreakFreezeRequest","useBuyStreakFreeze","useSubscribeCommunity","useUnsubscribeCommunity","useMutePost","useSetCommunityRole","team","idx","useUpdateCommunity","useRegisterCommunityRewards","usePinPost","getCommunitiesQueryOptions","getCommunityContextQueryOptions","getCommunityQueryOptions","SUBSCRIBERS_PAGE_SIZE","fetchSubscribersPage","getCommunitySubscribersQueryOptions","getCommunitySubscribersInfiniteQueryOptions","getAccountNotificationsInfiniteQueryOptions","getRewardedCommunitiesQueryOptions","ROLES","roleMap","getCommunityType","type_id","getCommunityPermissions","communityType","userRole","subscribed","canPost","canComment","isModerator","getNotificationsUnreadCountQueryOptions","getNotificationsInfiniteQueryOptions","NotificationFilter","NotifyTypes","ALL_NOTIFY_TYPES","NotificationViewType","getNotificationsSettingsQueryOptions","initialMuted","getAnnouncementsQueryOptions","getSpotlightsQueryOptions","_accessToken","markNotificationRead","isInfiniteData","useMarkNotificationsRead","previousData","updatedData","unreadKey","currentUnread","unreadCount","useSetLastRead","getProposalQueryOptions","proposal","getProposalsQueryOptions","proposals","expired","getProposalVotesInfiniteQueryOptions","getUserProposalVotesQueryOptions","vote","useProposalVote","useProposalCreate","getVestingDelegationsQueryOptions","fetchLimit","getAccountDelegationsQueryOptions","getVestingDelegationExpirationsQueryOptions","getConversionRequestsQueryOptions","getCollateralizedConversionRequestsQueryOptions","getSavingsWithdrawFromQueryOptions","getWithdrawRoutesQueryOptions","getOpenOrdersQueryOptions","getOutgoingRcDelegationsInfiniteQueryOptions","delegations","delegation","getIncomingRcQueryOptions","getReceivedVestingSharesQueryOptions","getRecurrentTransfersQueryOptions","normalizeString","trimmed","normalizeNumber","direct","parseToken","rawToken","extractTokens","record","resolveUsername","getPortfolioQueryOptions","getHiveAssetGeneralInfoQueryOptions","marketTicker","marketPrice","liquidBalance","savingsBalance","getHbdAssetGeneralInfoQueryOptions","price","getAPR","currentInflationRate","totalVestingFunds","getHivePowerAssetGeneralInfoQueryOptions","delegatedVests","receivedVests","withdrawRateVests","remainingToWithdrawVests","nextWithdrawalVests","hpBalance","outgoingDelegationsHp","incomingDelegationsHp","pendingPowerDownHp","nextPowerDownHp","totalBalance","availableHp","HIVE_ACCOUNT_OPERATION_GROUPS","HIVE_OPERATION_LIST","operationOrders","HIVE_OPERATION_ORDERS","HIVE_OPERATION_NAME_BY_ID","isHiveOperationName","resolveHiveOperationFilters","rawValues","hasAll","uniqueValues","operationIds","filterArgs","getHiveAssetTransactionsQueryOptions","__","pages","pageParams","getHbdAssetTransactionsQueryOptions","getHivePowerAssetTransactionsQueryOptions","userSelectedOperations","hasAllFilter","formatDate","pad","subtractSeconds","getHiveAssetMetricQueryOptions","hive","non_hive","open","_","prevStartDate","getHiveAssetWithdrawalRoutesQueryOptions","getHivePowerDelegatesInfiniteQueryOptions","getHivePowerDelegatingsQueryOptions","getOrderBookQueryOptions","getMarketStatisticsQueryOptions","getMarketHistoryQueryOptions","getHiveHbdStatsQueryOptions","oneDayAgo","dayChange","getMarketDataQueryOptions","getTradeHistoryQueryOptions","getFeedHistoryQueryOptions","getCurrentMedianHistoryPriceQueryOptions","useLimitOrderCreate","useLimitOrderCancel","getMarketData","getCurrencyRate","cur","getCurrencyTokenRate","getCurrencyRates","getHivePrice","ENGINE_RPC_HEADERS","engineRpc","engineRpcSafe","getHiveEngineOrderBook","baseParams","buy","sell","sortByPriceDesc","left","sortByPriceAsc","right","getHiveEngineTradeHistory","getHiveEngineOpenOrders","buyRaw","sellRaw","formatTotal","quantity","getHiveEngineMetrics","symbolQuery","getHiveEngineTokensMarket","getHiveEngineTokensBalances","getHiveEngineTokensMetadata","getHiveEngineTokenTransactions","getHiveEngineTokenMetrics","interval","getHiveEngineUnclaimedRewards","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMarketQueryOptions","getHiveEngineTokensMetadataQueryOptions","getHiveEngineTokenTransactionsQueryOptions","_allPages","lastPageParam","_firstPage","firstPageParam","getHiveEngineTokensMetricsQueryOptions","getHiveEngineUnclaimedRewardsQueryOptions","pending_token","getAllHiveEngineTokensQueryOptions","formattedNumber","fractionDigits","out","av","HiveEngineToken","getHiveEngineBalancesWithUsdQueryOptions","allTokens","balances","t","pricePerHive","providedMetrics","unpricedSymbols","balance","metric","tokenMetadata","lastPrice","balanceAmount","usdValue","getHiveEngineTokenGeneralInfoQueryOptions","hiveQuery","hiveData","metadataList","balanceList","marketList","stakedBalance","unstakingBalance","getPointsQueryOptions","pointsResponse","points","transactionsResponse","transactions","getPointsAssetGeneralInfoQueryOptions","getPointsAssetTransactionsQueryOptions","created","getAccountWalletAssetInfoQueryOptions","fetchQuery","qo","convertPriceToUserCurrency","assetInfo","conversionRate","portfolioQuery","getPortfolioAssetInfo","assetItem","extraItem","dataKey","numValue","portfolioAssetInfo","converted","AssetOperation","useTransfer","useTransferPoint","useDelegateVestingShares","useSetWithdrawVestingRoute","useTransferEngineToken","useTransferToSavings","useTransferFromSavings","useTransferToVesting","useWithdrawVesting","useConvert","useClaimInterest","CLAIM_REWARDS_INVALIDATION_DELAY_MS","pendingInvalidationTimers","useClaimRewards","timerKey","keysToInvalidate","existingTimer","rejected","useDelegateEngineToken","useUndelegateEngineToken","useStakeEngineToken","useUnstakeEngineToken","useClaimEngineRewards","useEngineMarketOrder","buildHiveOperations","buildEngineOperations","getWalletOperationAuthority","useWalletOperation","hiveOps","engineOps","useDelegateRc","useWitnessVote","useWitnessProxy","mapRestWitness","w","getWitnessesInfiniteQueryOptions","getWitnessVotersPageQueryOptions","getWitnessVoterCountQueryOptions","PointTransactionType","claimPointsRequest","contentType","detail","useClaimPoints","author_re","type_re","category_re","tag_re","SearchType","MAX_SEARCH_TAGS","MAX_SEARCH_QUERY_LENGTH","firstToken","normalizeSearchAuthor","normalizeSearchCategory","normalizeSearchTags","seen","buildSearchQuery","search","category","normalizedSearch","normalizedCategory","normalizedTags","part","SearchQuery","_query","re","matches","raw","isSearchResponse","MAX_RETRIES","isServer","searchRetryPolicy","failureCount","isTransient","searchQueryOptions","scroll_id","getControversialRisingInfiniteQueryOptions","sinceDate","similar","searchPath","SIMILAR_ENTRIES_SINCE_MS","SIMILAR_ENTRIES_TARGET","SIMILAR_ENTRIES_BODY_LIMIT","SIMILAR_ENTRIES_SSR_TIMEOUT_MS","SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS","SIMILAR_ENTRIES_MIN_RENDER","toMltExcerpt","fingerprint","getSimilarEntriesQueryOptions","rawTags","contentKey","collected","seenAuthors","getSearchAccountQueryOptions","getSearchTopicsQueryOptions","getSearchApiInfiniteQueryOptions","getSearchPathQueryOptions","getSupportSettingsRequest","getSupportSettingsQueryOptions","updateSupportSettingsRequest","applySupportSettingsUpdate","useUpdateSupportSettings","getBoostPlusPricesQueryOptions","getRcDelegationPricesQueryOptions","getRcDelegationActiveQueryOptions","responseData","getPromotePriceQueryOptions","getBoostPlusAccountPricesQueryOptions","useBoostPlus","useRcDelegation","hsTokenRenew","BAD_ACTORS_URL","getBadActorsQueryOptions","POLLS_PROTOCOL_VERSION","PollPreferredInterpretation","mapMetaChoicesToPollChoices","metaChoices","choice","normalizePoll","pollChoices","pollVoters","rawStats","choices","voters","getPollQueryOptions","usePollVote","pollTrxId"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license bytebuffer.ts (c) 2015 Daniel Wirtz \n * Backing buffer: ArrayBuffer, Accessor: DataView\n * Released under the Apache License, Version 2.0\n * see: https://github.com/dcodeIO/bytebuffer.ts for details\n * modified by @xmcl/bytebuffer\n * And customized for hive-tx\n */\n\nconst EMPTY_BUFFER = new ArrayBuffer(0)\n\n// Lazy-init to avoid crashing on runtimes that lack TextEncoder/TextDecoder\n// (notably React Native with Hermes). Falls back to manual UTF-8 encode/decode.\nlet _encoder: { encode(s: string): Uint8Array } | null = null\nlet _decoder: { decode(b: BufferSource): string } | null = null\n\nfunction getEncoder(): { encode(s: string): Uint8Array } {\n if (!_encoder) {\n if (typeof TextEncoder !== 'undefined') {\n _encoder = new TextEncoder()\n } else {\n _encoder = {\n encode(s: string): Uint8Array {\n // Manual UTF-8 encode fallback\n const utf8: number[] = []\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i)\n if (c < 0x80) {\n utf8.push(c)\n } else if (c < 0x800) {\n utf8.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {\n const next = s.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n utf8.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n utf8.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n return new Uint8Array(utf8)\n },\n }\n }\n }\n return _encoder\n}\n\nfunction getDecoder(): { decode(b: BufferSource): string } {\n if (!_decoder) {\n if (typeof TextDecoder !== 'undefined') {\n _decoder = new TextDecoder()\n } else {\n _decoder = {\n decode(b: BufferSource): string {\n const bytes = b instanceof ArrayBuffer ? new Uint8Array(b) : new Uint8Array((b as ArrayBufferView).buffer, (b as ArrayBufferView).byteOffset, (b as ArrayBufferView).byteLength)\n let result = ''\n for (let i = 0; i < bytes.length; ) {\n const byte = bytes[i]\n let codePoint: number\n if (byte < 0x80) { codePoint = byte; i += 1 }\n else if ((byte & 0xe0) === 0xc0) { codePoint = ((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f); i += 2 }\n else if ((byte & 0xf0) === 0xe0) { codePoint = ((byte & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f); i += 3 }\n else { codePoint = ((byte & 0x07) << 18) | ((bytes[i + 1] & 0x3f) << 12) | ((bytes[i + 2] & 0x3f) << 6) | (bytes[i + 3] & 0x3f); i += 4 }\n if (codePoint <= 0xffff) { result += String.fromCharCode(codePoint) }\n else { codePoint -= 0x10000; result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff)) }\n }\n return result\n },\n }\n }\n }\n return _decoder\n}\n\nexport class ByteBuffer {\n static LITTLE_ENDIAN = true\n static BIG_ENDIAN = false\n static DEFAULT_CAPACITY = 16\n static DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN\n\n buffer: ArrayBufferLike\n view: DataView\n offset: number\n markedOffset: number\n limit: number\n littleEndian: boolean\n\n constructor(\n capacity: number = ByteBuffer.DEFAULT_CAPACITY,\n littleEndian: boolean = ByteBuffer.DEFAULT_ENDIAN\n ) {\n this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity)\n this.view = capacity === 0 ? new DataView(EMPTY_BUFFER) : new DataView(this.buffer)\n this.offset = 0\n this.markedOffset = -1\n this.limit = capacity\n this.littleEndian = littleEndian\n }\n\n static allocate(capacity?: number, littleEndian?: boolean): ByteBuffer {\n return new ByteBuffer(capacity, littleEndian)\n }\n\n static concat(\n buffers: Array,\n littleEndian?: boolean\n ): ByteBuffer {\n let capacity = 0\n for (let i = 0; i < buffers.length; ++i) {\n const buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n capacity += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n capacity += buf.length\n } else if (buf instanceof ArrayBuffer) {\n capacity += buf.byteLength\n } else if (Array.isArray(buf)) {\n capacity += buf.length\n } else {\n throw TypeError('Illegal buffer')\n }\n }\n\n if (capacity === 0) {\n return new ByteBuffer(0, littleEndian)\n }\n\n const bb = new ByteBuffer(capacity, littleEndian)\n const view = new Uint8Array(bb.buffer)\n let offset = 0\n\n for (let i = 0; i < buffers.length; ++i) {\n let buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n view.set(new Uint8Array(buf.buffer, buf.offset, buf.limit - buf.offset), offset)\n offset += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n view.set(buf, offset)\n offset += buf.length\n } else if (buf instanceof ArrayBuffer) {\n view.set(new Uint8Array(buf), offset)\n offset += buf.byteLength\n } else {\n // Array\n view.set(buf as number[], offset)\n offset += (buf as number[]).length\n }\n }\n\n bb.limit = bb.offset = offset\n bb.offset = 0\n return bb\n }\n\n static wrap(\n buffer: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n littleEndian?: boolean\n ): ByteBuffer {\n if (buffer instanceof ByteBuffer) {\n const bb = buffer.clone()\n bb.markedOffset = -1\n return bb\n }\n\n let bb: ByteBuffer\n if (buffer instanceof Uint8Array) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.length > 0) {\n bb.buffer = buffer.buffer\n bb.offset = buffer.byteOffset\n bb.limit = buffer.byteOffset + buffer.byteLength\n bb.view = new DataView(buffer.buffer)\n }\n } else if (buffer instanceof ArrayBuffer) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.byteLength > 0) {\n bb.buffer = buffer\n bb.offset = 0\n bb.limit = buffer.byteLength\n bb.view = buffer.byteLength > 0 ? new DataView(buffer) : new DataView(EMPTY_BUFFER)\n }\n } else if (Array.isArray(buffer)) {\n bb = new ByteBuffer(buffer.length, littleEndian)\n bb.limit = buffer.length\n new Uint8Array(bb.buffer).set(buffer)\n } else {\n throw TypeError('Illegal buffer')\n }\n\n return bb\n }\n\n writeBytes(\n source: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n offset?: number\n ): ByteBuffer {\n return this.append(source, offset)\n }\n\n writeInt8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setInt8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeByte(value: number, offset?: number): ByteBuffer {\n return this.writeInt8(value, offset)\n }\n\n writeUint8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setUint8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeUInt8(value: number, offset?: number): ByteBuffer {\n return this.writeUint8(value, offset)\n }\n\n readUint8(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint8(offset)\n if (relative) this.offset += 1\n return value\n }\n\n readUInt8(offset?: number): number {\n return this.readUint8(offset)\n }\n\n writeInt16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setInt16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeShort(value: number, offset?: number): ByteBuffer {\n return this.writeInt16(value, offset)\n }\n\n writeUint16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setUint16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeUInt16(value: number, offset?: number): ByteBuffer {\n return this.writeUint16(value, offset)\n }\n\n writeInt32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setInt32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeInt(value: number, offset?: number): ByteBuffer {\n return this.writeInt32(value, offset)\n }\n\n writeUint32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setUint32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeUInt32(value: number, offset?: number): ByteBuffer {\n return this.writeUint32(value, offset)\n }\n\n readUint32(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint32(offset, this.littleEndian)\n if (relative) {\n this.offset += 4\n }\n return value\n }\n\n readUInt32 = this.readUint32\n\n append(source: ByteBuffer | ArrayBuffer | Uint8Array | number[], offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n let src: Uint8Array\n if (source instanceof ByteBuffer) {\n src = new Uint8Array(source.buffer, source.offset, source.limit - source.offset)\n source.offset += src.length\n } else if (source instanceof Uint8Array) {\n src = source\n } else if (source instanceof ArrayBuffer) {\n src = new Uint8Array(source)\n } else {\n src = new Uint8Array(source)\n }\n\n if (src.length <= 0) return this\n\n if (offset + src.length > this.buffer.byteLength) {\n this.resize(offset + src.length)\n }\n\n new Uint8Array(this.buffer).set(src, offset)\n\n if (relative) this.offset += src.length\n return this\n }\n\n clone(copy?: boolean): ByteBuffer {\n const bb = new ByteBuffer(0, this.littleEndian)\n if (copy) {\n bb.buffer = new ArrayBuffer(this.buffer.byteLength)\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer))\n bb.view = new DataView(bb.buffer)\n } else {\n bb.buffer = this.buffer\n bb.view = this.view\n }\n bb.offset = this.offset\n bb.markedOffset = this.markedOffset\n bb.limit = this.limit\n return bb\n }\n\n copy(begin?: number, end?: number): ByteBuffer {\n if (begin === undefined) begin = this.offset\n if (end === undefined) end = this.limit\n\n if (begin === end) {\n return new ByteBuffer(0, this.littleEndian)\n }\n\n const capacity = end - begin\n const bb = new ByteBuffer(capacity, this.littleEndian)\n bb.offset = 0\n bb.limit = capacity\n\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer).subarray(begin, end), 0)\n return bb\n }\n\n copyTo(\n target: ByteBuffer,\n targetOffset?: number,\n sourceOffset?: number,\n sourceLimit?: number\n ): ByteBuffer {\n const targetRelative = typeof targetOffset === 'undefined'\n const relative = typeof sourceOffset === 'undefined'\n targetOffset = targetRelative ? target.offset : targetOffset!\n sourceOffset = relative ? this.offset : sourceOffset!\n sourceLimit = sourceLimit === undefined ? this.limit : sourceLimit\n\n const len = sourceLimit - sourceOffset\n if (len === 0) return target\n\n target.ensureCapacity(targetOffset + len)\n new Uint8Array(target.buffer).set(\n new Uint8Array(this.buffer).subarray(sourceOffset, sourceLimit),\n targetOffset\n )\n\n if (relative) this.offset += len\n if (targetRelative) target.offset += len\n return this\n }\n\n ensureCapacity(capacity: number): ByteBuffer {\n let current = this.buffer.byteLength\n if (current < capacity) {\n return this.resize((current *= 2) > capacity ? current : capacity)\n }\n return this\n }\n\n flip(): ByteBuffer {\n this.limit = this.offset\n this.offset = 0\n return this\n }\n\n resize(capacity: number): ByteBuffer {\n if (this.buffer.byteLength < capacity) {\n const buffer = new ArrayBuffer(capacity)\n new Uint8Array(buffer).set(new Uint8Array(this.buffer))\n this.buffer = buffer\n this.view = new DataView(buffer)\n }\n return this\n }\n\n skip(length: number): ByteBuffer {\n this.offset += length\n return this\n }\n\n writeInt64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigInt64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeLong(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeInt64(value, offset)\n }\n\n readInt64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigInt64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readLong(offset?: number): bigint {\n return this.readInt64(offset)\n }\n\n writeUint64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigUint64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeUInt64(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeUint64(value, offset)\n }\n\n readUint64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigUint64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readUInt64(offset?: number): bigint {\n return this.readUint64(offset)\n }\n\n toBuffer(forceCopy?: boolean): ArrayBufferLike {\n const offset = this.offset\n const limit = this.limit\n if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) {\n return this.buffer\n }\n if (offset === limit) return EMPTY_BUFFER\n return this.buffer.slice(offset, limit)\n }\n\n toArrayBuffer(forceCopy?: boolean): ArrayBufferLike {\n return this.toBuffer(forceCopy)\n }\n\n writeVarint32(value: number, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const size = this.calculateVarint32(value)\n if (offset + size > this.buffer.byteLength) {\n this.resize(offset + size)\n }\n\n value >>>= 0\n while (value >= 0x80) {\n this.view.setUint8(offset++, (value & 0x7f) | 0x80)\n value >>>= 7\n }\n this.view.setUint8(offset++, value)\n\n if (relative) {\n this.offset = offset\n return this\n }\n return size\n }\n\n readVarint32(offset?: number): number | { value: number; length: number } {\n const relative = typeof offset === 'undefined'\n if (typeof offset === 'undefined') {\n offset = this.offset\n }\n let c = 0\n let value = 0 >>> 0\n let b: number\n do {\n b = this.view.getUint8(offset++)\n if (c < 5) {\n value |= (b & 0x7f) << (7 * c)\n }\n ++c\n } while ((b & 0x80) !== 0)\n value |= 0\n\n if (relative) {\n this.offset = offset\n return value\n }\n return { value, length: c }\n }\n\n calculateVarint32(value: number): number {\n value = value >>> 0\n if (value < 1 << 7) return 1\n else if (value < 1 << 14) return 2\n else if (value < 1 << 21) return 3\n else if (value < 1 << 28) return 4\n else return 5\n }\n\n writeVString(str: string, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n let currentOffset = relative ? this.offset : offset!\n\n const encoded = getEncoder().encode(str)\n const len = encoded.length\n const lenVarintSize = this.calculateVarint32(len)\n\n if (currentOffset + lenVarintSize + len > this.buffer.byteLength) {\n this.resize(currentOffset + lenVarintSize + len)\n }\n\n this.writeVarint32(len, currentOffset)\n currentOffset += lenVarintSize\n\n new Uint8Array(this.buffer).set(encoded, currentOffset)\n currentOffset += len\n\n if (relative) {\n this.offset = currentOffset\n return this\n }\n return currentOffset - (offset || 0)\n }\n\n readVString(offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const start = offset\n const lenResult = this.readVarint32(offset) as { value: number; length: number }\n const lenValue = lenResult.value\n const lenLength = lenResult.length\n\n offset += lenLength\n\n // TextDecoder can take Uint8Array view directly\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, lenValue))\n offset += lenValue\n\n if (relative) {\n this.offset = offset\n return str\n } else {\n return {\n string: str,\n length: offset - start\n }\n }\n }\n\n readUTF8String(length: number, offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n // const strBuffer = this.buffer.slice(offset, end)\n // Faster to view if Shared? No, Decoder takes buffer or view.\n // Making a view is cheap.\n // But DataView vs Uint8Array. TextDecoder takes BufferSource (ArrayBuffer or ArrayBufferView).\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, length))\n\n if (relative) {\n this.offset += length\n return str\n } else {\n return {\n string: str,\n length\n }\n }\n }\n}\n","import type { APIMethods } from './api-types'\n\n/**\n * Unified configuration for Hive blockchain connectivity.\n * This is the single source of truth for node endpoints, timeouts, and chain settings.\n * Mutate this object directly or use ConfigManager.setHiveNodes() for validated updates.\n */\nexport const config = {\n /**\n * Array of Hive API node endpoints for load balancing and failover.\n */\n nodes: [\n 'https://api.hive.blog',\n 'https://api.deathwing.me',\n 'https://api.openhive.network',\n 'https://techcoderx.com',\n 'https://api.syncad.com',\n 'https://rpc.mahdiyari.info',\n ],\n\n /**\n * Array of Hive API node endpoints that support REST APIs.\n * Note: Without the trailing /\n */\n restNodes: [\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://api.syncad.com',\n 'https://hiveapi.actifit.io',\n 'https://api.c0ff33a.uk'\n ],\n\n /**\n * Per-API REST node override. Some APIs are served by only a subset of\n * nodes; list just those capable hosts here so callREST never burns its\n * (small) retry budget on nodes that 404/503 the API, and a cold start\n * hits a capable node immediately. Any API not listed falls back to\n * `restNodes`. The health tracker still orders *within* this list.\n *\n * hivesense: empirically only ~2 public nodes serve /hivesense-api (the\n * other configured nodes 404/503 it; Ecency's own was decommissioned), so\n * pin them — otherwise the health tracker keeps rediscovering incapable\n * nodes each cooldown and cold starts waste attempts.\n */\n restNodesByApi: {\n hivesense: ['https://api.hive.blog', 'https://api.syncad.com']\n } as Partial>,\n\n /**\n * User-Agent sent on server-side (Node) HTTP requests to Hive nodes.\n *\n * Node's built-in fetch (undici) sends a bare `User-Agent: node` when none is\n * set, which is indistinguishable from any random Node script in node/CDN\n * analytics. A descriptive value lets operators tell their own SSR/server\n * traffic apart from anonymous scrapers. Only applied in Node — browsers\n * forbid overriding User-Agent (it is silently dropped) and React Native sets\n * its own native UA, so client and mobile traffic are untouched. Override via\n * `ConfigManager.setUserAgent()` (or `setUserAgent()` from `@ecency/sdk/hive`).\n */\n userAgent: 'ecency-sdk',\n\n /**\n * The Hive blockchain chain ID for transaction signing and verification.\n */\n chain_id: 'beeab0de00000000000000000000000000000000000000000000000000000000',\n\n /**\n * Address prefix used for public key formatting (STM for mainnet).\n */\n address_prefix: 'STM',\n\n /**\n * Timeout in milliseconds for read API calls (get_content, get_accounts, etc.).\n * Kept short so the health tracker can fail over to another node quickly.\n */\n timeout: 5_000,\n\n /**\n * Timeout in milliseconds for broadcast API calls.\n * Longer than read timeout because broadcast_transaction_synchronous waits\n * for block inclusion, which depends on the 3-second block interval and\n * network conditions.\n */\n broadcastTimeout: 15_000,\n\n /**\n * Number of retry attempts for failed API calls before throwing an error.\n * Total attempts = retry + 1. With ~7 nodes in the list, a budget of 5\n * means callRPC iterates through 6 distinct nodes before giving up, so a\n * single sick node (or two) can't surface as an unhandled error to the\n * caller while the rest of the list is healthy.\n */\n retry: 5,\n\n /**\n * Tail-latency resilience for READ calls. Motivation: on a shared public-node\n * pool a node can slow down or throttle *mid-request*; a fixed `timeout` means\n * the caller only notices after the full window, and under SSR concurrency\n * those stalled renders pile up. Two mechanisms, both scoped to reads only\n * (broadcasts never hedge and keep their fixed `broadcastTimeout`):\n *\n * - Adaptive per-attempt timeout (`adaptiveTimeout`, default ON): when a\n * node has a usable latency profile (EWMA), the per-attempt timeout becomes\n * `min(callerTimeout, max(floorMs, factor × EWMA))` — a node running far\n * above its own baseline is abandoned early and failover starts sooner.\n * Never *raises* the caller's timeout; unprofiled nodes keep it unchanged.\n *\n * - Hedged requests (`hedge`, default OFF — opt in via `setResilience`): if\n * the primary attempt is still pending after `max(hedgeDelayFloorMs,\n * hedgeDelayFactor × EWMA)`, a duplicate request is fired at the next\n * healthy untried node and the first success wins (the loser is aborted).\n * A token bucket (`hedgeBucketCapacity` burst, refilled by\n * `hedgeRefillPerSuccess` per un-hedged success) caps hedges to roughly\n * `hedgeRefillPerSuccess` of traffic, so only the slow tail hedges — and\n * under pool-wide slowness the bucket drains and hedging auto-disables\n * instead of amplifying load into public-node rate limits.\n */\n resilience: {\n adaptiveTimeout: true,\n adaptiveTimeoutFloorMs: 2_000,\n adaptiveTimeoutFactor: 4,\n hedge: false,\n hedgeDelayFloorMs: 750,\n hedgeDelayFactor: 2,\n hedgeBucketCapacity: 10,\n hedgeRefillPerSuccess: 0.1,\n /**\n * Wall-clock budget for one read call across ALL failover attempts, as a\n * multiple of the per-attempt timeout: no NEW attempt starts past\n * `totalBudgetFactor × timeout` (an in-flight attempt still finishes its\n * own window). Bounds the pathological pool-wide-slowness walk — without\n * it a read could hold its caller for (retry+1) × timeout ≈ 30s, which\n * under SSR concurrency is a memory pile-up, the exact incident this\n * feature exists for. Applies to reads only (callRPC / callREST);\n * broadcasts keep their try-each-node-once semantics.\n */\n totalBudgetFactor: 2\n }\n}\n\n/** Shape of the `config.resilience` bag (see its doc comment). */\nexport type ResilienceOptions = typeof config.resilience\n\n/**\n * Validated setter for the Hive RPC node list — replaces `config.nodes`.\n * Trims, drops non-http(s) entries, and de-dupes (order-preserving). A no-op\n * if nothing valid remains, so a bad input can't empty the list.\n *\n * Lives here, in the React-free `hive-tx` core, on purpose: it must be\n * reachable from BOTH the full `@ecency/sdk` entry (via\n * `ConfigManager.setHiveNodes`, which delegates here) and the lean\n * `@ecency/sdk/hive` server/CLI entry — without dragging react-query or the\n * DMCA/ReDoS surface of `ConfigManager` into the lean entry. Within a single\n * bundle this mutates the one `config` instance `callRPC` reads; the\n * cross-bundle single-instance guarantee is a separate (build-level) concern.\n */\n/**\n * Trim, drop non-string / non-http(s), and de-dupe (order-preserving) a node\n * list. Shared by `setNodes` and the REST-node setters below so all three\n * normalize identically.\n */\nconst sanitizeNodeList = (nodes: unknown): string[] =>\n Array.isArray(nodes)\n ? [\n ...new Set(\n nodes\n .filter((n): n is string => typeof n === 'string')\n // Trim, then strip trailing slashes so REST paths concatenate cleanly:\n // `callREST` builds `node + '/status-api'`, and a `https://host/` node would\n // otherwise yield `https://host//status-api`, which several HAF nodes 404.\n // De-dupe AFTER normalizing so `host` and `host/` collapse to one entry.\n .map((n) => n.trim().replace(/\\/+$/, ''))\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n : []\n\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = sanitizeNodeList(nodes)\n if (!validNodes.length) return\n config.nodes = validNodes\n}\n\n/**\n * Validated setter for the REST-API node list — replaces `config.restNodes`.\n * Same shape/guarantees as `setNodes` (trim, drop non-http(s), de-dupe, no-op on\n * empty). Exists because `restNodes` is otherwise baked into the SDK: an app that\n * wants to add/remove a REST host (e.g. drop an own node it is decommissioning, or\n * widen the public pool) previously had to fork + republish the SDK. With this, the\n * REST pool is app-configurable at runtime exactly like the read pool. Lives in the\n * React-free `hive-tx` core so both the full `@ecency/sdk` entry and the lean\n * `@ecency/sdk/hive` entry can reach it.\n */\nexport const setRestNodes = (nodes: string[]): void => {\n const valid = sanitizeNodeList(nodes)\n if (!valid.length) return\n config.restNodes = valid\n}\n\n/**\n * Merge validated per-API REST node overrides into `config.restNodesByApi`.\n * For each entry: a non-empty, valid list pins that API to those hosts; an empty or\n * all-invalid list REMOVES the pin so the API falls back to `restNodes`. Other APIs'\n * existing pins (e.g. the built-in `hivesense`) are preserved. Lets an app pin the\n * APIs it actually uses to known-capable hosts (so `callREST` never burns its small\n * retry budget on a node that 404/503s the API) without an SDK republish.\n */\nexport const setRestNodesByApi = (\n map: Partial>\n): void => {\n if (!map || typeof map !== 'object') return\n const next: Partial> = { ...config.restNodesByApi }\n for (const [api, list] of Object.entries(map)) {\n const valid = sanitizeNodeList(list)\n if (valid.length) {\n next[api as APIMethods] = valid\n } else {\n delete next[api as APIMethods]\n }\n }\n config.restNodesByApi = next\n}\n\n/**\n * Validated setter for the User-Agent sent on server-side (Node) requests.\n * Trims the input and ignores an empty value so a bad input can't blank out the\n * header. Like `setNodes`, it lives in the React-free `hive-tx` core so it is\n * reachable from both the full `@ecency/sdk` entry (via\n * `ConfigManager.setUserAgent`) and the lean `@ecency/sdk/hive` server/CLI entry.\n */\nexport const setUserAgent = (ua: string): void => {\n // Defensive against plain-JS / React Native callers that may pass a non-string\n // despite the `string` type (avoids throwing on `.trim()`).\n if (typeof ua !== 'string') return\n const value = ua.trim()\n // Ignore blank values, and reject control characters (CR, LF, and other\n // C0/DEL controls). An invalid header value would otherwise be stored and make\n // every subsequent fetch throw, and rejecting CR/LF closes a header-injection\n // vector for any caller that builds the UA from untrusted input.\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return\n config.userAgent = value\n}\n\n/**\n * Validated partial setter for `config.resilience` (adaptive read timeouts +\n * hedged requests — see the field's doc comment). Booleans must be booleans;\n * numeric fields must be finite and positive, with the refill rate additionally\n * capped at 1 so a typo can't turn the tail-hedge into a traffic doubler\n * (refill ≤ 1 ⇒ hedges can never exceed un-hedged successes). Invalid values\n * are ignored field-by-field, so one bad entry can't block the rest. Lives in\n * the React-free `hive-tx` core (like the other setters) so both `@ecency/sdk`\n * (via `ConfigManager.setResilience`) and the lean `@ecency/sdk/hive` entry\n * can reach it.\n */\nexport const setResilience = (opts: Partial): void => {\n if (!opts || typeof opts !== 'object') return\n const r = config.resilience\n const bool = (v: unknown): v is boolean => typeof v === 'boolean'\n const pos = (v: unknown): v is number =>\n typeof v === 'number' && Number.isFinite(v) && v > 0\n if (bool(opts.adaptiveTimeout)) r.adaptiveTimeout = opts.adaptiveTimeout\n // Floor must stay ≥ the tracker's slow-failure recording floor (2s): the\n // safety argument for adaptive timeouts is that an abort at the window IS\n // recorded as a slow sample, growing the EWMA so the window self-corrects\n // upward. A floor below 2s would abort without recording — the window could\n // never converge and a too-tight profile would starve that call forever.\n if (pos(opts.adaptiveTimeoutFloorMs)) {\n r.adaptiveTimeoutFloorMs = Math.max(opts.adaptiveTimeoutFloorMs, 2_000)\n }\n if (pos(opts.adaptiveTimeoutFactor)) r.adaptiveTimeoutFactor = opts.adaptiveTimeoutFactor\n if (bool(opts.hedge)) r.hedge = opts.hedge\n if (pos(opts.hedgeDelayFloorMs)) r.hedgeDelayFloorMs = opts.hedgeDelayFloorMs\n if (pos(opts.hedgeDelayFactor)) r.hedgeDelayFactor = opts.hedgeDelayFactor\n if (pos(opts.hedgeBucketCapacity)) r.hedgeBucketCapacity = opts.hedgeBucketCapacity\n // Refill must stay ≤ 1: at 1 token per success the hedge rate could reach\n // 100% of traffic, defeating the \"tail only\" contract. Cap rather than reject\n // so a caller asking for \"more hedging\" gets the safe maximum.\n if (pos(opts.hedgeRefillPerSuccess)) {\n r.hedgeRefillPerSuccess = Math.min(opts.hedgeRefillPerSuccess, 1)\n }\n // Below 1 the budget could not even cover the configured per-attempt window.\n if (pos(opts.totalBudgetFactor)) {\n r.totalBudgetFactor = Math.max(opts.totalBudgetFactor, 1)\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport class Signature {\n data: Uint8Array\n recovery: number\n private compressed: boolean\n\n /**\n * Creates a new Signature instance.\n * @param data Raw signature data (64 bytes)\n * @param recovery Recovery byte (0-3)\n * @param compressed Whether signature is compressed (default: true)\n */\n constructor(data: Uint8Array, recovery: number, compressed?: boolean) {\n this.data = data\n this.recovery = recovery\n this.compressed = compressed ?? true\n }\n\n /**\n * Creates a Signature from a hex string.\n * @param string 130-character hex string containing signature and recovery data\n * @returns New Signature instance\n * @throws Error if input is not a string\n */\n static from(string: string) {\n if (typeof string === 'string') {\n const temp = hexToBytes(string)\n let recovery = parseInt(bytesToHex(temp.subarray(0, 1)), 16) - 31\n let compressed = true\n // non-compressed signatures have -4\n // https://github.com/bitcoin/bitcoin/blob/95ea54ba089610019a74c1176a2c7c0dba144b1c/src/key.cpp#L257\n if (recovery < 0) {\n compressed = false\n recovery = recovery + 4\n }\n const data = temp.subarray(1)\n return new Signature(data, recovery, compressed)\n } else {\n throw new Error('Expected string for data')\n }\n }\n\n /**\n * Converts signature to 65-byte buffer format.\n * @returns 65-byte buffer containing recovery byte + signature data\n */\n toBuffer() {\n const buffer = new Uint8Array(65).fill(0)\n if (this.compressed) {\n buffer[0] = (this.recovery + 31) & 0xff\n } else {\n buffer[0] = (this.recovery + 27) & 0xff\n }\n buffer.set(this.data, 1)\n return buffer\n }\n\n /**\n * Returns signature as 130-character hex string.\n * @returns Hex string representation of signature\n */\n customToString() {\n return bytesToHex(this.toBuffer())\n }\n\n /**\n * Returns signature as 130-character hex string.\n * Overrides Object.prototype.toString() so that String(sig) and\n * template literals produce the hex representation instead of \"[object Object]\".\n * @returns Hex string representation of signature\n */\n toString() {\n return this.customToString()\n }\n\n /**\n * Recovers the public key from this signature and message.\n * @param message 32-byte message hash (Uint8Array) or 64-character hex string\n * @returns PublicKey that created this signature\n * @throws Error if message is not a valid 32-byte SHA256 hash\n */\n getPublicKey(message: Uint8Array | string): PublicKey {\n if (\n (message instanceof Uint8Array && message.length !== 32) ||\n (typeof message === 'string' && message.length !== 64)\n ) {\n throw new Error('Expected a valid sha256 hash as message')\n }\n if (typeof message === 'string') {\n message = hexToBytes(message)\n }\n const sig = secp256k1.Signature.fromBytes(this.data, 'compact')\n const temp = new secp256k1.Signature(sig.r, sig.s, this.recovery)\n return new PublicKey(temp.recoverPublicKey(message).toBytes())\n }\n}\n","import { ripemd160 } from '@noble/hashes/legacy.js'\nimport bs58 from 'bs58'\nimport { config } from '../config'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { Signature } from './Signature'\n\nexport class PublicKey {\n key: Uint8Array\n prefix: string\n\n /**\n * Creates a new PublicKey instance from raw bytes.\n * @param key Raw public key bytes (33 bytes, compressed format)\n * @param prefix Optional address prefix (defaults to the current config.address_prefix)\n */\n constructor(key: Uint8Array, prefix?: string) {\n this.key = key\n // Read config at call time so runtime mutations to config.address_prefix\n // (e.g. switching to a non-mainnet network) take effect for new instances.\n this.prefix = prefix ?? config.address_prefix\n }\n\n /**\n * Creates a PublicKey from a string representation.\n * The expected prefix is read from config.address_prefix at call time, so\n * consumers can switch networks at runtime.\n * @param wif Public key string (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n * @returns New PublicKey instance\n * @throws Error if the prefix, length, checksum, or curve point is invalid\n */\n static fromString(wif: string): PublicKey {\n const expectedPrefix = config.address_prefix\n if (typeof wif !== 'string' || wif.length <= expectedPrefix.length) {\n throw new Error('Invalid public key')\n }\n const prefix = wif.slice(0, expectedPrefix.length)\n if (prefix !== expectedPrefix) {\n throw new Error(`Public key must start with ${expectedPrefix}`)\n }\n let buffer: Uint8Array\n try {\n buffer = bs58.decode(wif.slice(expectedPrefix.length))\n } catch {\n throw new Error('Invalid public key encoding')\n }\n // 33-byte compressed secp256k1 point + 4-byte RIPEMD160 checksum\n if (buffer.length !== 37) {\n throw new Error('Invalid public key length')\n }\n const key = buffer.subarray(0, 33)\n const checksum = buffer.subarray(33, 37)\n const expectedChecksum = ripemd160(key).subarray(0, 4)\n if (!isUint8ArrayEqual(checksum, expectedChecksum)) {\n throw new Error('Public key checksum mismatch')\n }\n try {\n secp256k1.Point.fromBytes(key)\n } catch {\n throw new Error('Invalid public key')\n }\n return new PublicKey(key, prefix)\n }\n\n /**\n * Creates a PublicKey from a string or returns the instance if already a PublicKey.\n * @param value Public key string or PublicKey instance\n * @returns New or existing PublicKey instance\n */\n static from(value: string | PublicKey): PublicKey {\n if (value instanceof PublicKey) {\n return value\n } else {\n return PublicKey.fromString(value as string)\n }\n }\n\n /**\n * Verifies a signature against a message hash.\n * @param message 32-byte message hash to verify\n * @param signature Signature to verify\n * @returns True if signature is valid, false otherwise\n */\n verify(message: Uint8Array, signature: Signature | string): boolean {\n if (typeof signature === 'string') {\n signature = Signature.from(signature)\n }\n return secp256k1.verify(signature.data, message, this.key, {\n prehash: false,\n format: 'compact'\n })\n }\n\n /**\n * Returns the public key as a string for storage or transmission.\n * @returns Public key string with prefix (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n */\n toString(): string {\n return encodePublic(this.key, this.prefix)\n }\n\n /**\n * Returns JSON representation (same as toString()).\n * @returns Public key string\n */\n toJSON(): string {\n return this.toString()\n }\n\n /**\n * Returns a string representation for debugging.\n * @returns Formatted public key string\n */\n inspect(): string {\n return `PublicKey: ${this.toString()}`\n }\n}\n\nconst encodePublic = (key: Uint8Array, prefix: string): string => {\n const checksum = ripemd160(key)\n return prefix + bs58.encode(new Uint8Array([...key, ...checksum.subarray(0, 4)]))\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array): boolean => {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n","/** Class representing a hive asset,\n * e.g. `1.000 HIVE` or `12.112233 VESTS`. */\nexport class Asset {\n amount: number\n symbol: string\n\n constructor(amount: number, symbol: string) {\n this.amount = amount\n this.symbol = symbol === 'HIVE' ? 'STEEM' : symbol === 'HBD' ? 'SBD' : symbol\n }\n\n /** Create a new Asset instance from a string, e.g. `42.000 HIVE`. */\n static fromString(string: string, expectedSymbol: string | null = null): Asset {\n const [amountString, symbol] = string.split(' ')\n if (['STEEM', 'VESTS', 'SBD', 'TESTS', 'TBD', 'HIVE', 'HBD'].indexOf(symbol) === -1) {\n throw new Error(`Invalid asset symbol: ${symbol}`)\n }\n if (expectedSymbol && symbol !== expectedSymbol) {\n throw new Error(`Invalid asset, expected symbol: ${expectedSymbol} got: ${symbol}`)\n }\n const amount = Number.parseFloat(amountString)\n if (!Number.isFinite(amount)) {\n throw new Error(`Invalid asset amount: ${amountString}`)\n }\n return new Asset(amount, symbol)\n }\n\n /**\n * Convenience to create new Asset.\n * @param symbol Symbol to use when created from number. Will also be used to validate\n * the asset, throws if the passed value has a different symbol than this.\n */\n static from(value: number | string | Asset, symbol?: string | null): Asset {\n if (value instanceof Asset) {\n if (symbol && value.symbol !== symbol) {\n throw new Error(`Invalid asset, expected symbol: ${symbol} got: ${value.symbol}`)\n }\n return value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n return new Asset(value, symbol || 'STEEM')\n } else if (typeof value === 'string') {\n return Asset.fromString(value, symbol)\n } else {\n throw new Error(`Invalid asset '${String(value)}'`)\n }\n }\n\n // We convert HIVE & HBD strings to STEEM & SBD because the serialization should be based on STEEM & SBD\n\n /** Return asset precision. */\n getPrecision() {\n switch (this.symbol) {\n case 'TESTS':\n case 'TBD':\n case 'STEEM':\n case 'SBD':\n case 'HBD':\n case 'HIVE':\n return 3\n case 'VESTS':\n return 6\n default:\n return 3\n }\n }\n\n /** Return a string representation of this asset, e.g. `42.000 HIVE`. */\n toString() {\n return `${this.amount.toFixed(this.getPrecision())} ${this.symbol}`\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\n/** Buffer wrapper that serializes to a hex-encoded string. */\nexport class HexBuffer {\n buffer: Uint8Array\n /** Convenience to create a new HexBuffer, does not copy data if value passed is already a buffer. */\n static from(value: string | Uint8Array | HexBuffer) {\n if (value instanceof HexBuffer) {\n return value\n } else if (value instanceof Uint8Array) {\n return new HexBuffer(value)\n } else if (typeof value === 'string') {\n return new HexBuffer(hexToBytes(value))\n } else {\n return new HexBuffer(new Uint8Array(value))\n }\n }\n\n constructor(buffer: Uint8Array) {\n this.buffer = buffer\n }\n\n toString() {\n return bytesToHex(this.buffer)\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { Asset } from './Asset'\nimport { HexBuffer } from './HexBuffer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Operation } from '../types'\n\n// Operation ID constants for better maintainability\nconst OPERATION_IDS = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n // pow: 14,\n custom: 15,\n // report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n // pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n // custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49\n} as const\n\ntype OperationId = (typeof OPERATION_IDS)[keyof typeof OPERATION_IDS]\n\nconst VoidSerializer = () => {\n throw new Error('Void can not be serialized')\n}\nconst StringSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeVString(data)\n}\n\nconst Int16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeInt16(data)\n}\n\nconst Int64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeInt64(data)\n}\n\nconst UInt8Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint8(data)\n}\n\nconst UInt16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint16(data)\n}\n\nconst UInt32Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint32(data)\n}\n\nconst UInt64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeUint64(data)\n}\n\nconst BooleanSerializer = (buffer: ByteBuffer, data: number | boolean) => {\n buffer.writeByte(data ? 1 : 0)\n}\n\nconst StaticVariantSerializer = (itemSerializers: any) => {\n // return (buffer: ByteBuffer, data: any[]) => {\n // let id = data[0]\n // const item = data[1]\n // // id was/is supposed to be 0 or integer here but seems to have been changed in e.g. comment_options\n // // extensions: [\n // // [\n // // \"comment_payout_beneficiaries\",\n // // {\n // // \"beneficiaries\": [\n // // {\n // // \"account\": \"vimm\",\n // // \"weight\": 1000\n // // }\n // // ]\n // // }\n // // ]\n // // ]\n // // Keep it here just in case\n // // https://gitlab.syncad.com/hive/hive/-/issues/722\n // // \"comment_payout_beneficiaries\" was 0 and at some point it got changed\n // // It should still be serialized as a 0 or an integer\n // // Now the question is, always 0? will need an example transaction to prove otherwise\n // if (typeof id === 'string') {\n // if (id === 'update_proposal_end_date') {\n // id = 1\n // } else {\n // id = 0\n // }\n // }\n // buffer.writeVarint32(id)\n // itemSerializers[id](buffer, item)\n return (buffer: ByteBuffer, data: any) => {\n const [id, item] = data\n buffer.writeVarint32(id)\n itemSerializers[id](buffer, item)\n }\n}\n\n/**\n * Serialize asset.\n * @note This looses precision for amounts larger than 2^53-1/10^precision.\n * Should not be a problem in real-word usage.\n */\nconst AssetSerializer = (buffer: ByteBuffer, data: string | Asset) => {\n const asset = Asset.from(data)\n const precision = asset.getPrecision()\n buffer.writeInt64(Math.round(asset.amount * Math.pow(10, precision)))\n buffer.writeUint8(precision)\n for (let i = 0; i < 7; i++) {\n buffer.writeUint8(asset.symbol.charCodeAt(i) || 0)\n }\n}\n\nconst DateSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeUint32(Math.floor(new Date(data + 'Z').getTime() / 1000))\n}\n\nconst PublicKeySerializer = (buffer: ByteBuffer, data: string | PublicKey) => {\n if (\n data === null ||\n (typeof data === 'string' && data.slice(-39) === '1111111111111111111111111111111114T1Anm')\n ) {\n buffer.append(new Uint8Array(33).fill(0))\n } else {\n buffer.append(PublicKey.from(data).key)\n }\n}\n\nconst BinarySerializer = (size: null | number = null) => {\n return (buffer: ByteBuffer, data: string | Uint8Array | HexBuffer) => {\n data = HexBuffer.from(data)\n const len = data.buffer.length\n if (size) {\n if (len !== size) {\n throw new Error(`Unable to serialize binary. Expected ${size} bytes, got ${len}`)\n }\n } else {\n buffer.writeVarint32(len)\n }\n buffer.append(data.buffer)\n }\n}\n\nconst VariableBinarySerializer = BinarySerializer()\n\nconst FlatMapSerializer = (keySerializer: any, valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(data.length)\n for (const [key, value] of data) {\n keySerializer(buffer, key)\n valueSerializer(buffer, value)\n }\n }\n}\n\nconst ArraySerializer = (itemSerializer: any) => {\n return (buffer: ByteBuffer, data: any[]) => {\n buffer.writeVarint32(data.length)\n for (const item of data) {\n itemSerializer(buffer, item)\n }\n }\n}\n\nconst ObjectSerializer = (keySerializers: any) => {\n return (buffer: ByteBuffer, data: any) => {\n for (const [key, serializer] of keySerializers) {\n try {\n serializer(buffer, data[key])\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n }\n}\n\nconst OptionalSerializer = (valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any | undefined) => {\n if (data !== undefined) {\n buffer.writeByte(1)\n valueSerializer(buffer, data)\n } else {\n buffer.writeByte(0)\n }\n }\n}\n\nconst AuthoritySerializer = ObjectSerializer([\n ['weight_threshold', UInt32Serializer],\n ['account_auths', FlatMapSerializer(StringSerializer, UInt16Serializer)],\n ['key_auths', FlatMapSerializer(PublicKeySerializer, UInt16Serializer)]\n])\n\nconst BeneficiarySerializer = ObjectSerializer([\n ['account', StringSerializer],\n ['weight', UInt16Serializer]\n])\n\nconst PriceSerializer = ObjectSerializer([\n ['base', AssetSerializer],\n ['quote', AssetSerializer]\n])\n\n// const SignedBlockHeaderSerializer = ObjectSerializer([\n// ['previous', BinarySerializer(20)],\n// ['timestamp', DateSerializer],\n// ['witness', StringSerializer],\n// ['transaction_merkle_root', BinarySerializer(20)],\n// ['extensions', ArraySerializer(VoidSerializer)],\n// ['witness_signature', BinarySerializer(65)]\n// ])\n\nconst ChainPropertiesSerializer = ObjectSerializer([\n ['account_creation_fee', AssetSerializer],\n ['maximum_block_size', UInt32Serializer],\n ['hbd_interest_rate', UInt16Serializer]\n])\n\nconst OperationDataSerializer = (operationId: OperationId, definitions: any) => {\n const objectSerializer = ObjectSerializer(definitions)\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(operationId)\n objectSerializer(buffer, data)\n }\n}\n\nconst OperationSerializers: Record> = {}\n\nOperationSerializers.account_create = OperationDataSerializer(OPERATION_IDS.account_create, [\n ['fee', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_create_with_delegation = OperationDataSerializer(\n OPERATION_IDS.account_create_with_delegation,\n [\n ['fee', AssetSerializer],\n ['delegation', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update = OperationDataSerializer(OPERATION_IDS.account_update, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_witness_proxy = OperationDataSerializer(\n OPERATION_IDS.account_witness_proxy,\n [\n ['account', StringSerializer],\n ['proxy', StringSerializer]\n ]\n)\n\nOperationSerializers.account_witness_vote = OperationDataSerializer(\n OPERATION_IDS.account_witness_vote,\n [\n ['account', StringSerializer],\n ['witness', StringSerializer],\n ['approve', BooleanSerializer]\n ]\n)\n\nOperationSerializers.cancel_transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.cancel_transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer]\n ]\n)\n\nOperationSerializers.change_recovery_account = OperationDataSerializer(\n OPERATION_IDS.change_recovery_account,\n [\n ['account_to_recover', StringSerializer],\n ['new_recovery_account', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.claim_account = OperationDataSerializer(OPERATION_IDS.claim_account, [\n ['creator', StringSerializer],\n ['fee', AssetSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.claim_reward_balance = OperationDataSerializer(\n OPERATION_IDS.claim_reward_balance,\n [\n ['account', StringSerializer],\n ['reward_hive', AssetSerializer],\n ['reward_hbd', AssetSerializer],\n ['reward_vests', AssetSerializer]\n ]\n)\n\nOperationSerializers.comment = OperationDataSerializer(OPERATION_IDS.comment, [\n ['parent_author', StringSerializer],\n ['parent_permlink', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['title', StringSerializer],\n ['body', StringSerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.comment_options = OperationDataSerializer(OPERATION_IDS.comment_options, [\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['max_accepted_payout', AssetSerializer],\n ['percent_hbd', UInt16Serializer],\n ['allow_votes', BooleanSerializer],\n ['allow_curation_rewards', BooleanSerializer],\n [\n 'extensions',\n ArraySerializer(\n StaticVariantSerializer([\n ObjectSerializer([['beneficiaries', ArraySerializer(BeneficiarySerializer)]])\n ])\n )\n ]\n])\n\nOperationSerializers.convert = OperationDataSerializer(OPERATION_IDS.convert, [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n])\n\nOperationSerializers.create_claimed_account = OperationDataSerializer(\n OPERATION_IDS.create_claimed_account,\n [\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.custom = OperationDataSerializer(OPERATION_IDS.custom, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['id', UInt16Serializer],\n ['data', VariableBinarySerializer]\n])\n\n// Not used on chain\n// OperationSerializers.custom_binary = OperationDataSerializer(OPERATION_IDS.custom_binary, [\n// ['required_owner_auths', ArraySerializer(StringSerializer)],\n// ['required_active_auths', ArraySerializer(StringSerializer)],\n// ['required_posting_auths', ArraySerializer(StringSerializer)],\n// ['required_auths', ArraySerializer(AuthoritySerializer)],\n// ['id', StringSerializer],\n// ['data', VariableBinarySerializer]\n// ])\n\nOperationSerializers.custom_json = OperationDataSerializer(OPERATION_IDS.custom_json, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['required_posting_auths', ArraySerializer(StringSerializer)],\n ['id', StringSerializer],\n ['json', StringSerializer]\n])\n\nOperationSerializers.decline_voting_rights = OperationDataSerializer(\n OPERATION_IDS.decline_voting_rights,\n [\n ['account', StringSerializer],\n ['decline', BooleanSerializer]\n ]\n)\n\nOperationSerializers.delegate_vesting_shares = OperationDataSerializer(\n OPERATION_IDS.delegate_vesting_shares,\n [\n ['delegator', StringSerializer],\n ['delegatee', StringSerializer],\n ['vesting_shares', AssetSerializer]\n ]\n)\n\nOperationSerializers.delete_comment = OperationDataSerializer(OPERATION_IDS.delete_comment, [\n ['author', StringSerializer],\n ['permlink', StringSerializer]\n])\n\nOperationSerializers.escrow_approve = OperationDataSerializer(OPERATION_IDS.escrow_approve, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['approve', BooleanSerializer]\n])\n\nOperationSerializers.escrow_dispute = OperationDataSerializer(OPERATION_IDS.escrow_dispute, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer]\n])\n\nOperationSerializers.escrow_release = OperationDataSerializer(OPERATION_IDS.escrow_release, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['receiver', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer]\n])\n\nOperationSerializers.escrow_transfer = OperationDataSerializer(OPERATION_IDS.escrow_transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer],\n ['escrow_id', UInt32Serializer],\n ['agent', StringSerializer],\n ['fee', AssetSerializer],\n ['json_meta', StringSerializer],\n ['ratification_deadline', DateSerializer],\n ['escrow_expiration', DateSerializer]\n])\n\nOperationSerializers.feed_publish = OperationDataSerializer(OPERATION_IDS.feed_publish, [\n ['publisher', StringSerializer],\n ['exchange_rate', PriceSerializer]\n])\n\nOperationSerializers.limit_order_cancel = OperationDataSerializer(\n OPERATION_IDS.limit_order_cancel,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer]\n ]\n)\n\nOperationSerializers.limit_order_create = OperationDataSerializer(\n OPERATION_IDS.limit_order_create,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['min_to_receive', AssetSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.limit_order_create2 = OperationDataSerializer(\n OPERATION_IDS.limit_order_create2,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['exchange_rate', PriceSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.recover_account = OperationDataSerializer(OPERATION_IDS.recover_account, [\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['recent_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\n// Not used on chain\n// OperationSerializers.report_over_production = OperationDataSerializer(\n// OPERATION_IDS.report_over_production,\n// [\n// ['reporter', StringSerializer],\n// ['first_block', SignedBlockHeaderSerializer],\n// ['second_block', SignedBlockHeaderSerializer]\n// ]\n// )\n\nOperationSerializers.request_account_recovery = OperationDataSerializer(\n OPERATION_IDS.request_account_recovery,\n [\n ['recovery_account', StringSerializer],\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.reset_account = OperationDataSerializer(OPERATION_IDS.reset_account, [\n ['reset_account', StringSerializer],\n ['account_to_reset', StringSerializer],\n ['new_owner_authority', AuthoritySerializer]\n])\n\nOperationSerializers.set_reset_account = OperationDataSerializer(OPERATION_IDS.set_reset_account, [\n ['account', StringSerializer],\n ['current_reset_account', StringSerializer],\n ['reset_account', StringSerializer]\n])\n\nOperationSerializers.set_withdraw_vesting_route = OperationDataSerializer(\n OPERATION_IDS.set_withdraw_vesting_route,\n [\n ['from_account', StringSerializer],\n ['to_account', StringSerializer],\n ['percent', UInt16Serializer],\n ['auto_vest', BooleanSerializer]\n ]\n)\n\nOperationSerializers.transfer = OperationDataSerializer(OPERATION_IDS.transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n])\n\nOperationSerializers.transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_to_savings,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_vesting = OperationDataSerializer(\n OPERATION_IDS.transfer_to_vesting,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.vote = OperationDataSerializer(OPERATION_IDS.vote, [\n ['voter', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['weight', Int16Serializer]\n])\n\nOperationSerializers.withdraw_vesting = OperationDataSerializer(OPERATION_IDS.withdraw_vesting, [\n ['account', StringSerializer],\n ['vesting_shares', AssetSerializer]\n])\n\nOperationSerializers.witness_update = OperationDataSerializer(OPERATION_IDS.witness_update, [\n ['owner', StringSerializer],\n ['url', StringSerializer],\n ['block_signing_key', PublicKeySerializer],\n ['props', ChainPropertiesSerializer],\n ['fee', AssetSerializer]\n])\n\nOperationSerializers.witness_set_properties = OperationDataSerializer(\n OPERATION_IDS.witness_set_properties,\n [\n ['owner', StringSerializer],\n ['props', FlatMapSerializer(StringSerializer, VariableBinarySerializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update2 = OperationDataSerializer(OPERATION_IDS.account_update2, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', OptionalSerializer(PublicKeySerializer)],\n ['json_metadata', StringSerializer],\n ['posting_json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.create_proposal = OperationDataSerializer(OPERATION_IDS.create_proposal, [\n ['creator', StringSerializer],\n ['receiver', StringSerializer],\n ['start_date', DateSerializer],\n ['end_date', DateSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.update_proposal_votes = OperationDataSerializer(\n OPERATION_IDS.update_proposal_votes,\n [\n ['voter', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['approve', BooleanSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.remove_proposal = OperationDataSerializer(OPERATION_IDS.remove_proposal, [\n ['proposal_owner', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nconst ProposalUpdateSerializer = ObjectSerializer([['end_date', DateSerializer]])\n\nOperationSerializers.update_proposal = OperationDataSerializer(OPERATION_IDS.update_proposal, [\n ['proposal_id', UInt64Serializer],\n ['creator', StringSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n [\n 'extensions',\n ArraySerializer(StaticVariantSerializer([VoidSerializer, ProposalUpdateSerializer]))\n ]\n])\n\nOperationSerializers.collateralized_convert = OperationDataSerializer(\n OPERATION_IDS.collateralized_convert,\n [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.recurrent_transfer = OperationDataSerializer(\n OPERATION_IDS.recurrent_transfer,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer],\n ['recurrence', UInt16Serializer],\n ['executions', UInt16Serializer],\n [\n 'extensions',\n ArraySerializer(\n ObjectSerializer([\n ['type', UInt8Serializer],\n ['value', ObjectSerializer([['pair_id', UInt8Serializer]])]\n ])\n )\n ]\n ]\n)\n\nconst OperationSerializer = (buffer: ByteBuffer, operation: Operation) => {\n const serializer = OperationSerializers[operation[0]]\n if (!serializer) {\n throw new Error(`No serializer for operation: ${operation[0]}`)\n }\n try {\n serializer(buffer, operation[1])\n } catch (error: any) {\n error.message = `${operation[0]}: ${error.message}`\n throw error\n }\n}\n\nconst TransactionSerializer = ObjectSerializer([\n ['ref_block_num', UInt16Serializer],\n ['ref_block_prefix', UInt32Serializer],\n ['expiration', DateSerializer],\n ['operations', ArraySerializer(OperationSerializer)],\n ['extensions', ArraySerializer(StringSerializer)]\n])\n\nconst EncryptedMemoSerializer = ObjectSerializer([\n ['from', PublicKeySerializer],\n ['to', PublicKeySerializer],\n ['nonce', UInt64Serializer],\n ['check', UInt32Serializer],\n ['encrypted', BinarySerializer()]\n])\n\nexport const Serializer = {\n // Array: ArraySerializer,\n Asset: AssetSerializer,\n // Authority: AuthoritySerializer,\n // Binary: BinarySerializer,\n // Boolean: BooleanSerializer,\n // Date: DateSerializer,\n // FlatMap: FlatMapSerializer,\n // Int16: Int16Serializer,\n // Int32: Int32Serializer,\n // Int64: Int64Serializer,\n // Int8: Int8Serializer,\n Memo: EncryptedMemoSerializer,\n // Object: ObjectSerializer,\n // Operation: OperationSerializer,\n // Optional: OptionalSerializer,\n Price: PriceSerializer,\n PublicKey: PublicKeySerializer,\n // StaticVariant: StaticVariantSerializer,\n String: StringSerializer,\n Transaction: TransactionSerializer,\n UInt16: UInt16Serializer,\n UInt32: UInt32Serializer\n // UInt64: UInt64Serializer,\n // UInt8: UInt8Serializer,\n // Void: VoidSerializer\n}\n","export const sleep = (ms: number): Promise => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { config } from '../config'\nimport { CallResponse } from '../types'\nimport type { APIMethods } from '../api-types'\nimport { sleep } from './sleep'\n\n// ── Server identity (User-Agent) ────────────────────────────────────────────\n\n/**\n * True only when running under Node.js (SSR / server / CLI). Computed once.\n *\n * We attach a descriptive `User-Agent` exclusively here because that is the only\n * place it (a) takes effect and (b) is wanted:\n * - Node's undici fetch otherwise sends a bare `User-Agent: node`, which is\n * indistinguishable from any anonymous script in node/CDN analytics.\n * - Browsers treat `User-Agent` as a forbidden header and silently drop any\n * override, so setting it there is pointless (and we avoid the churn).\n * - React Native sets its own native UA (e.g. the mobile app's own string);\n * overriding it would relabel real mobile traffic, so we explicitly exclude\n * it via `navigator.product === 'ReactNative'`.\n */\nconst isNodeRuntime: boolean = (() => {\n try {\n const isReactNative =\n typeof navigator !== 'undefined' && (navigator as any).product === 'ReactNative'\n return (\n !isReactNative &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null\n )\n } catch {\n return false\n }\n})()\n\n/**\n * Headers that identify the caller on server-side requests. Returns the\n * configured `User-Agent` only under Node; an empty object everywhere else so\n * browser and React Native requests are left exactly as they were.\n */\nfunction serverIdentityHeaders(): Record {\n return isNodeRuntime ? { 'User-Agent': config.userAgent } : {}\n}\n\n// ── Error Types ─────────────────────────────────────────────────────────────\n\nexport class RPCError extends Error {\n name = 'RPCError'\n data?: any\n code: number\n stack: undefined = undefined\n constructor(rpcError: { message: string; code: number; data?: any }) {\n super(rpcError.message)\n this.code = rpcError.code\n if ('data' in rpcError) {\n this.data = rpcError.data\n }\n }\n}\n\n/**\n * Transport-level error thrown by jsonRPCCall for HTTP status errors (429, 503).\n * Carries node identity and rate-limit info so callers can record health\n * exactly once without double-counting.\n */\nclass NodeError extends Error {\n node: string\n /** Explicit server `Retry-After` in ms, or 0 when the 429 carried no usable header. */\n rateLimitMs: number\n /** True for an HTTP 429 regardless of whether a `Retry-After` header was present, so\n * a header-less rate limit is still cooled down (with escalating backoff) rather than\n * mis-recorded as a plain transport failure. */\n isRateLimit: boolean\n constructor(\n node: string,\n message: string,\n opts: { rateLimitMs?: number; isRateLimit?: boolean } = {}\n ) {\n super(message)\n this.node = node\n this.rateLimitMs = opts.rateLimitMs ?? 0\n this.isRateLimit = opts.isRateLimit ?? false\n }\n}\n\n/**\n * Parse an HTTP `Retry-After` header to milliseconds. Supports both forms in the\n * spec: `` (e.g. \"120\") and ``. Returns 0 when the header\n * is absent or unparseable (including a non-numeric junk value or a past date) so the\n * caller falls back to escalating backoff instead of a NaN/negative cooldown.\n */\nfunction parseRetryAfterMs(header: string | null): number {\n if (!header) return 0\n const secs = Number(header)\n if (Number.isFinite(secs)) return secs > 0 ? secs * 1000 : 0\n const dateMs = Date.parse(header)\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now()\n return delta > 0 ? delta : 0\n }\n return 0\n}\n\n/** Errors that indicate the request definitely never reached the server. */\nconst PRE_CONNECTION_ERRORS = ['ECONNREFUSED', 'ENOTFOUND', 'EHOSTUNREACH', 'EAI_AGAIN']\n\n/** Browser fetch network-failure messages — emitted by Chromium/Firefox/Safari\n * when CORS preflight fails, DNS fails, TLS fails, or the response is blocked.\n * These map to scenarios where retrying the same signed broadcast is safe: the\n * request either never reached the node, or its response was blocked but a\n * re-broadcast of the *same* signed tx will be deduped by Hive (same trx_id). */\nconst BROWSER_NETWORK_ERRORS = [\n 'Failed to fetch', // Chromium\n 'NetworkError when attempting to fetch', // Firefox\n 'Load failed', // Safari\n 'fetch failed' // Node 18+ undici / Bun — also covered via cause chain\n]\n\n/**\n * Concatenate the error's surface text + the messages/codes from up to 5\n * levels of nested `cause`. Node.js fetch wraps connection failures as\n * `TypeError('fetch failed')` with the real `code` (ECONNREFUSED, etc.)\n * nested in the cause chain. Browser fetch failures have no cause but\n * carry their identifier in `message`.\n */\nfunction flattenErrorText(e: any): string {\n if (!e) return ''\n const parts: string[] = [String(e.name || ''), String(e.message || ''), String(e.code || '')]\n let cause = e.cause\n for (let depth = 0; cause && depth < 5; depth++) {\n parts.push(String(cause.code || ''), String(cause.message || ''))\n cause = cause.cause\n }\n return parts.join(' ')\n}\n\n/**\n * Decide whether a broadcast attempt can safely be retried on another node.\n *\n * Safe to retry (same signed tx → Hive dedupes by trx_id at the mempool layer):\n * - Pre-connection failures (ECONNREFUSED, ENOTFOUND, etc.) — request never sent.\n * - Browser fetch network failures (CORS block, TLS error, DNS) — TypeError with\n * a well-known message string.\n * - JSON parse failures — node returned an HTML error page (typical for\n * Cloudflare 1033 tunnel-down / 5xx interstitials), so the request never\n * reached the Hive RPC layer.\n * - NodeError (HTTP 429/5xx surfaced from jsonRPCCall) — already known transient.\n *\n * NOT safe to retry:\n * - RPCError — the node accepted the request and the blockchain rejected it.\n * Retrying on another node would either get the same rejection or accept\n * a different one; surface the original error instead.\n */\nfunction isBroadcastSafeToRetry(e: any): boolean {\n if (!e) return false\n if (e instanceof NodeError) return true\n if (e instanceof RPCError) return false\n\n const text = flattenErrorText(e)\n if (PRE_CONNECTION_ERRORS.some((code) => text.includes(code))) return true\n if (BROWSER_NETWORK_ERRORS.some((msg) => text.includes(msg))) return true\n\n // res.json() against an HTML body (Cloudflare/proxy interstitials) throws\n // SyntaxError. The Hive RPC layer never saw the tx, so failover is safe.\n if (e instanceof SyntaxError) return true\n // Some runtimes surface JSON parse errors as plain Error with this text.\n if (/Unexpected token|JSON\\.parse|Unexpected end of JSON/i.test(text)) return true\n\n return false\n}\n\n// ── Node Health Tracker ─────────────────────────────────────────────────────\n\n/** Node-level health state tracked by NodeHealthTracker. */\ninterface NodeHealth {\n /** Global consecutive-failure counter. Resets on success. */\n consecutiveFailures: number\n /** Timestamp of the most recent failure. Used with the 30s cooldown window. */\n lastFailureTime: number\n /** Epoch ms after which the node is no longer rate-limited. */\n rateLimitedUntil: number\n /** Count of consecutive 429s (no intervening success) with no usable Retry-After.\n * Drives escalating backoff; reset by a success or by RATE_LIMIT_STREAK_RESET_MS. */\n rateLimitStreak: number\n /** Epoch ms of the most recent 429. Used to expire the escalation streak. */\n lastRateLimitAt: number\n /** Per-API failure counters. Some nodes disable specific API plugins; tracking\n * per-API lets us deprioritize a node only for the APIs that fail, not globally.\n * `defective` marks a cooldown set by recordDefectiveResponse (payload\n * validation failure) — unlike ordinary strike cooldowns it survives\n * recordSuccess and only expires on its own. */\n apiFailures: Map<\n string,\n { count: number; cooldownUntil: number; lastFailureTime: number; defective?: boolean }\n >\n /** Most recent head_block_number observed for this node. */\n headBlock: number\n /** Epoch ms when the head_block was recorded. Used to expire stale observations. */\n headBlockUpdatedAt: number\n\n // ── Latency tracking (adaptive ordering) ────────────────────────────────\n /** EWMA of observed round-trip ms. Fed by successful calls AND by slow/timeout\n * failures (so a node that returns 200 in 15s, or aborts at the timeout, is\n * ranked on its real slowness — not treated as merely \"healthy\"). `undefined`\n * until the first sample. */\n ewmaLatencyMs?: number\n /** Number of latency samples folded into the EWMA. Gates \"warmup\": below\n * LATENCY_MIN_SAMPLES the node is unproven and keeps its config-order prior. */\n latencySampleCount: number\n /** Epoch ms of the most recent latency sample. Used for usability expiry and to\n * decide when a node is overdue for an exploratory re-probe. */\n latencyUpdatedAt: number\n /** Epoch ms of the most recent exploratory promotion. Single-flight guard so a\n * burst of concurrent orderings doesn't all re-probe the same stale node. */\n lastProbeAt: number\n\n /**\n * Per-profile-key latency (same EWMA/warmup/expiry rules as the global one).\n * The global EWMA mixes cheap calls (get_accounts ~300ms) with heavy ones\n * (get_account_history, bridge.get_discussion — legitimately seconds), so it\n * ranks nodes fine but is the WRONG baseline for per-attempt deadlines: a\n * profile dominated by cheap calls would abort every legitimately-heavy call.\n * Deadlines/hedge delays therefore key on the FULL method for RPC\n * (\"condenser_api.get_account_history\") and api+endpoint template for REST —\n * an API prefix alone still mixes cheap and heavy methods. Ranking keeps the\n * global profile. Bounded: #nodes × #distinct methods called (code-defined,\n * not user input); fully cleared whenever the node's global profile expires\n * (the global clock advances on every sample, so global-stale ⇒ all stale).\n */\n apiLatency: Map\n}\n\n/**\n * JSON-RPC error codes that indicate the node itself is unhealthy, not that the\n * client sent a bad request. These should trigger failover to another node.\n *\n * Background: Hive nodes fronted by HAF/jussi/drone return HTTP 200 with a\n * JSON-RPC error body when a backing service (hivemind, postgrest, etc.) is down.\n * The HTTP layer looks healthy, so failover never triggers — the caller just gets\n * an error and gives up. This function identifies those node-level errors.\n */\nfunction isNodeLevelRPCError(code: number, message: string): boolean {\n // -32603: Internal error — node is having problems\n if (code === -32603) return true\n // -32000 to -32099: Server error range (implementation-defined server errors)\n if (code <= -32000 && code >= -32099) return true\n // -32601: Method not found — node may be missing this API plugin\n if (code === -32601) return true\n // -32602 with node-sick indicators (vs normal \"invalid params\" from bad client input)\n // e.g. \"Unable to parse endpoint data\" from HAF when a backing service is down\n if (code === -32602 && /unable to parse|endpoint data|internal/i.test(message)) return true\n return false\n}\n\n/** Extract the API prefix from a method name like \"rc_api.find_rc_accounts\" -> \"rc_api\". */\nfunction apiOf(method: string): string {\n const dot = method.indexOf('.')\n return dot > 0 ? method.slice(0, dot) : method\n}\n\n// ── Rate-limit (429) backoff constants ───────────────────────────────────────\n/** Base cooldown applied to a 429 with no usable `Retry-After` header. Matches the\n * previous flat default so first-offence behaviour is unchanged. */\nconst RATE_LIMIT_BASE_MS = 10_000\n/** Ceiling for the escalating header-less cooldown. Prevents a node from being\n * parked far longer than a real public node's throttle window. */\nconst RATE_LIMIT_MAX_MS = 60_000\n/** No 429 from a node for this long ⇒ its escalation streak resets to 0, so an\n * occasional throttle hours apart doesn't compound into a long park. */\nconst RATE_LIMIT_STREAK_RESET_MS = 120_000\n\n/** Per-API failure threshold before the node is deprioritized for that API only. */\nconst MAX_API_FAILURES_BEFORE_COOLDOWN = 2\n/** How long a node stays deprioritized for a specific API after repeated failures. */\nconst API_COOLDOWN_MS = 60_000\n/** How long head_block observations remain valid before being treated as unknown. */\nconst HEAD_BLOCK_MAX_AGE_MS = 120_000\n/** Maximum lag (in blocks) before a node is considered stale relative to the best-known head. */\nconst STALE_BLOCK_THRESHOLD = 30\n\n// ── Adaptive latency-ordering constants ──────────────────────────────────────\n/** EWMA smoothing weight for a new latency sample. 0.3 ⇒ ~5–6 samples to converge;\n * absorbs one-off GC/TLS spikes while still reacting to a real regional shift fast. */\nconst LATENCY_EWMA_ALPHA = 0.3\n/** Samples required before a node's latency is trusted for ranking. Below this the\n * node is \"warming\" and ranks at a neutral prior (config order via tiebreak), so a\n * single fluke never reorders the list and cold start == today's behavior. */\nconst LATENCY_MIN_SAMPLES = 3\n/** How long a latency sample stays usable for ranking. Past this a node reverts to\n * warming. Must be > LATENCY_REPROBE_MS so re-probes keep a busy node's profile fresh. */\nconst LATENCY_MAX_AGE_MS = 5 * 60_000\n/** A healthy node not sampled within this window is overdue for an exploratory\n * re-probe (promoted to front of ONE ordering). This is what lets a demoted node\n * climb back when it recovers — and what profiles a node that organic traffic never\n * reaches. 60s ⇒ ~1 probe/node/min worst case = negligible cost. */\nconst LATENCY_REPROBE_MS = 60_000\n/** Neutral score (ms) for an unproven/warming node: optimistic enough to sit ahead\n * of a proven-slow node (so we explore an unknown before hammering a known-slow one)\n * but behind a proven-fast node. Fixed, so a node makes at most ONE rank transition\n * when it crosses LATENCY_MIN_SAMPLES — no churn. */\nconst LATENCY_UNPROVEN_PRIOR_MS = 1_000\n/** A failed call only feeds a latency penalty if it was actually slow (≥ this). Keeps\n * a genuine timeout / slow-5xx (a far-region node case) visible to the ranker while an\n * instant ECONNREFUSED (a *down* node, handled by consecutiveFailures) is NOT mis-read\n * as \"slow\". The penalty value is the *measured* elapsed, never a static constant. */\nconst LATENCY_SLOW_FAILURE_MS = 2_000\n\n/**\n * Latency-ranking tuning, re-exported as a frozen bag so tests assert behaviour\n * against the real numbers instead of mirroring literals that can silently drift.\n * @internal — not part of the package's public API; for the co-located spec only.\n */\nexport const __LATENCY_TUNING__ = Object.freeze({\n EWMA_ALPHA: LATENCY_EWMA_ALPHA,\n MIN_SAMPLES: LATENCY_MIN_SAMPLES,\n MAX_AGE_MS: LATENCY_MAX_AGE_MS,\n REPROBE_MS: LATENCY_REPROBE_MS,\n UNPROVEN_PRIOR_MS: LATENCY_UNPROVEN_PRIOR_MS,\n SLOW_FAILURE_MS: LATENCY_SLOW_FAILURE_MS\n})\n\n/** @internal Exported for testing only. */\nexport class NodeHealthTracker {\n private health = new Map()\n\n private getOrCreate(node: string): NodeHealth {\n let h = this.health.get(node)\n if (!h) {\n h = {\n consecutiveFailures: 0,\n lastFailureTime: 0,\n rateLimitedUntil: 0,\n rateLimitStreak: 0,\n lastRateLimitAt: 0,\n apiFailures: new Map(),\n headBlock: 0,\n headBlockUpdatedAt: 0,\n ewmaLatencyMs: undefined,\n latencySampleCount: 0,\n latencyUpdatedAt: 0,\n // Stamp the probe clock at creation so a brand-new (never-sampled) node is\n // NOT treated as \"overdue for re-probe\" on its very first ordering pass.\n // With lastProbeAt=0 the re-probe gate (touch <= now - LATENCY_REPROBE_MS)\n // fired immediately, so the 2nd+ ordering on a cold worker promoted unproven\n // nodes ahead of the configured order for no measured reason. Seeding it to\n // \"now\" preserves configured order during warmup; a genuinely slow preferred\n // node is still demoted by its EWMA score (not by epoch-zero exploration),\n // and idle nodes are still re-probed once LATENCY_REPROBE_MS has truly elapsed.\n lastProbeAt: Date.now(),\n apiLatency: new Map()\n }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number, profileKey?: string): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 0\n // A success means the node recovered — clear the escalation streak so the next\n // throttle starts from the base cooldown. We deliberately do NOT clear an active\n // rateLimitedUntil window here: under concurrency a success from a request that was\n // already in flight can resolve *after* another request recorded a fresh 429\n // Retry-After, and erasing the window would put a just-throttled node back into\n // rotation early. The window expires on its own (short for header-less; the server's\n // value for an explicit Retry-After).\n h.rateLimitStreak = 0\n if (api) {\n // A successful API call clears that API's failure counter — but never an\n // ACTIVE defective-response cooldown: the \"success\" may itself be an\n // unvalidated read from the same lying node (validated calls are the\n // minority of traffic), and re-admitting it early defeats the decisive\n // penalty. That window expires on its own, like rateLimitedUntil above.\n const apiFail = h.apiFailures.get(api)\n if (!apiFail || !(apiFail.defective && apiFail.cooldownUntil > Date.now())) {\n h.apiFailures.delete(api)\n }\n }\n if (typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0) {\n // Latency profiles use the finest key available (full method / endpoint\n // template); the API prefix is only a fallback so bare callers still\n // profile SOMETHING. Failure state above stays per-API on purpose.\n this.recordLatency(h, durationMs, profileKey ?? api)\n }\n }\n\n /**\n * Record a *slow* failed call as a latency signal. The failure counters are\n * updated separately (recordFailure/recordError); this only feeds the EWMA so a\n * node that returns 200-but-too-slow, times out, or returns a slow 5xx is ranked\n * on its real slowness. Callers pass the MEASURED elapsed ms and only call this\n * when the call was genuinely slow (≥ LATENCY_SLOW_FAILURE_MS) — an instant\n * connection failure (a *down* node) must NOT look \"slow\".\n */\n recordSlowFailure(node: string, durationMs: number, profileKey?: string): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs, profileKey)\n }\n\n /**\n * Usable latency profile (EWMA ms), or `undefined` while unproven or stale.\n * With a `profileKey` (full RPC method / REST api+endpoint template),\n * returns that (node, key) profile ONLY — deliberately no fallback to the\n * mixed global profile, because an average dominated by cheap calls is the\n * wrong deadline baseline for a heavy method (that fallback is exactly the\n * \"2s window starves get_account_history\" failure mode). Without a key,\n * returns the global ranking profile. Both follow the same \"profiled and\n * fresh\" gate as the ranker.\n * @internal\n */\n getUsableLatencyMs(node: string, profileKey?: string): number | undefined {\n const h = this.health.get(node)\n if (!h) return undefined\n const now = Date.now()\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n return p &&\n p.sampleCount >= LATENCY_MIN_SAMPLES &&\n now - p.updatedAt <= LATENCY_MAX_AGE_MS\n ? p.ewmaMs\n : undefined\n }\n return this.isLatencyUsable(h, now) ? h.ewmaLatencyMs : undefined\n }\n\n /**\n * Censored latency sample for a request that was ABORTED because a hedge\n * completed first while it was still in flight. The elapsed-at-abort is a\n * *lower bound* on the true latency, so folding it in can only move the\n * node's EWMA toward the truth, never below it — which is what lets repeated\n * hedge-wins reorder the pool. Deliberately does NOT touch the failure\n * counters or rate-limit state: the node returned no error, it was merely\n * slow, and treating cancellation as failure would flap `isNodeHealthy`.\n * Callers must NOT record this for a primary that already settled on its own\n * (its outcome was recorded normally; a second sample would be fabricated).\n * Bypasses the `recordSlowFailure` 2s floor (a hedge can win well below it).\n * By construction the elapsed is ≥ the hedge delay, so only a degenerate\n * near-zero epsilon needs rejecting — anything under one LAN round trip is\n * noise, not a latency measurement.\n * @internal\n */\n recordCensoredLatency(node: string, elapsedMs: number, profileKey?: string): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 50) return\n this.recordLatency(this.getOrCreate(node), elapsedMs, profileKey)\n }\n\n /**\n * Fold a latency sample into the node's global EWMA (warmup + usability\n * bookkeeping) and, when a profile key is given, into that (node, key)\n * profile — the global one ranks nodes, the keyed one calibrates deadlines.\n */\n private recordLatency(h: NodeHealth, durationMs: number, profileKey?: string): void {\n const now = Date.now()\n // A profile older than the usable window starts fresh, so an idled process\n // re-learns from scratch rather than ranking on hour-old data. Every keyed\n // profile shares this clock (each sample updates both), so global-stale\n // implies every keyed profile is stale too — clear the map rather than\n // leave never-again-read tombstone entries for the life of the process.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\n h.apiLatency.clear()\n }\n h.ewmaLatencyMs =\n h.ewmaLatencyMs === undefined\n ? durationMs\n : LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * h.ewmaLatencyMs\n h.latencySampleCount++\n h.latencyUpdatedAt = now\n\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n if (!p || now - p.updatedAt > LATENCY_MAX_AGE_MS) {\n h.apiLatency.set(profileKey, { ewmaMs: durationMs, sampleCount: 1, updatedAt: now })\n } else {\n p.ewmaMs = LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * p.ewmaMs\n p.sampleCount++\n p.updatedAt = now\n }\n }\n }\n\n recordFailure(node: string, api?: string): void {\n const h = this.getOrCreate(node)\n if (api) {\n // API-specific failure: only update the per-API tracker.\n // This prevents e.g. 3 rc_api failures from marking the node\n // globally unhealthy for condenser_api too.\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n // Reset counter if previous cooldown expired OR last failure was >30s ago\n // (avoids sticky penalties from sparse failures hours apart)\n if (\n (existing.cooldownUntil > 0 && existing.cooldownUntil <= now) ||\n (existing.lastFailureTime > 0 && now - existing.lastFailureTime > 30_000)\n ) {\n existing.count = 0\n existing.cooldownUntil = 0\n }\n existing.count++\n existing.lastFailureTime = now\n if (existing.count >= MAX_API_FAILURES_BEFORE_COOLDOWN) {\n existing.cooldownUntil = now + API_COOLDOWN_MS\n }\n h.apiFailures.set(api, existing)\n } else {\n // Transport-level failure (no specific API): update global counter\n h.consecutiveFailures++\n h.lastFailureTime = Date.now()\n }\n }\n\n /**\n * A response that failed the caller's payload validation is a decisive,\n * reproducible node fault — the node answered 200 with data the caller KNOWS\n * to be impossible — so it trips the per-API cooldown immediately instead of\n * accruing ordinary strikes. Deliberately its own method rather than\n * recordFailure × N: ordinary strikes are cleared by any success, and a\n * top-ranked lying node keeps recording successes on the unvalidated calls\n * between probes, which would reset its strikes forever and keep it in\n * rotation (observed live). Scope stays per-API: the node may be perfectly\n * healthy for its other API families.\n */\n recordDefectiveResponse(node: string, api: string): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n existing.count = Math.max(existing.count + 1, MAX_API_FAILURES_BEFORE_COOLDOWN)\n existing.lastFailureTime = now\n existing.cooldownUntil = now + API_COOLDOWN_MS\n existing.defective = true\n h.apiFailures.set(api, existing)\n }\n\n /**\n * Cool down a rate-limited node. Honors an explicit server `Retry-After`\n * (`retryAfterMs`) exactly — the server told us when to return. With no usable\n * header, applies escalating backoff: BASE, 2×BASE, 4×BASE … capped at\n * RATE_LIMIT_MAX_MS, indexed by the node's consecutive-429 streak (reset by a\n * success or after RATE_LIMIT_STREAK_RESET_MS of quiet). This stops a throttled\n * public node from being re-admitted every 10s and re-hammered under sustained\n * load, which matters most when the fleet's own unlimited node is removed.\n */\n recordRateLimit(node: string, retryAfterMs?: number): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n // Expire a stale streak so an occasional throttle hours apart doesn't compound.\n if (h.rateLimitStreak > 0 && now - h.lastRateLimitAt > RATE_LIMIT_STREAK_RESET_MS) {\n h.rateLimitStreak = 0\n }\n const hasHeader = typeof retryAfterMs === 'number' && Number.isFinite(retryAfterMs) && retryAfterMs > 0\n const cooldown = hasHeader\n ? retryAfterMs!\n : Math.min(RATE_LIMIT_BASE_MS * 2 ** h.rateLimitStreak, RATE_LIMIT_MAX_MS)\n // Only a header-less 429 advances the escalation streak — an explicit Retry-After is\n // honored exactly and must not compound the header-less backoff (else several\n // Retry-After 429s would push a later header-less 429 straight to the 60s cap).\n if (!hasHeader) h.rateLimitStreak++\n h.lastRateLimitAt = now\n // Explicit Retry-After is honored exactly (the server's current instruction). A\n // header-less cooldown may only move the window FORWARD — it must never truncate a\n // longer window already set, e.g. a node parked for an hour by an explicit\n // Retry-After that is later retried as a last resort and returns a header-less 429\n // must not have its 1h window cut down to the 10s base.\n h.rateLimitedUntil = hasHeader\n ? now + cooldown\n : Math.max(h.rateLimitedUntil, now + cooldown)\n h.consecutiveFailures++\n h.lastFailureTime = now\n }\n\n /** Record an observed head_block_number for this node. */\n recordHeadBlock(node: string, blockNum: number): void {\n if (!blockNum || !Number.isFinite(blockNum)) return\n const h = this.getOrCreate(node)\n h.headBlock = blockNum\n h.headBlockUpdatedAt = Date.now()\n }\n\n /**\n * Consensus head block from recent observations. Uses the median rather than the\n * max to prevent a single bad/misconfigured node from poisoning the reference.\n * A node reporting an inflated head_block won't affect the median unless the\n * majority of nodes agree on that range.\n */\n private consensusHeadBlock(): number {\n const now = Date.now()\n const recent: number[] = []\n for (const h of this.health.values()) {\n if (h.headBlock > 0 && now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS) {\n recent.push(h.headBlock)\n }\n }\n if (recent.length < 2) return 0 // Need at least 2 observations to compare\n recent.sort((a, b) => a - b)\n // Median: for even length, use the lower-middle value (conservative)\n return recent[Math.floor((recent.length - 1) / 2)]\n }\n\n /** True if this node is healthy (globally and for the given API if provided). */\n isNodeHealthy(node: string, api?: string): boolean {\n const h = this.health.get(node)\n if (!h) return true // unknown nodes assumed healthy\n const now = Date.now()\n\n // Rate-limited and cooldown hasn't expired\n if (h.rateLimitedUntil > now) return false\n\n // Too many consecutive failures within the last 30 seconds\n if (h.consecutiveFailures >= 3 && now - h.lastFailureTime < 30_000) return false\n\n // Per-API cooldown: node may be healthy overall but missing this API plugin\n if (api) {\n const apiFail = h.apiFailures.get(api)\n if (apiFail && apiFail.cooldownUntil > now) return false\n }\n\n // Head-block staleness: deprioritize nodes lagging behind the consensus head\n const best = this.consensusHeadBlock()\n if (\n best > 0 &&\n h.headBlock > 0 &&\n now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS &&\n best - h.headBlock > STALE_BLOCK_THRESHOLD\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Order nodes best-first: healthy nodes sorted by adaptive latency score, then\n * unhealthy nodes appended. Capability / staleness / rate-limit filtering stays in\n * `isNodeHealthy` and is unchanged — latency only reorders WITHIN the healthy set,\n * and only WITHIN the array it is handed (so it never leaves the configured list).\n *\n * One ordering per pass MAY promote a healthy node overdue for a re-probe (never\n * sampled, or not sampled within LATENCY_REPROBE_MS) to the front — single-flight\n * via `lastProbeAt`. This is what lets a demoted node climb back when it recovers,\n * and profiles a node that organic traffic (always served by a faster peer) never\n * reaches. Cold start: with no profiles, every node scores the neutral prior and the\n * stable config-index tiebreak yields the original order — i.e. today's behavior.\n */\n getOrderedNodes(nodes: string[], api?: string): string[] {\n const healthy: string[] = []\n const unhealthy: string[] = []\n for (const node of nodes) {\n if (this.isNodeHealthy(node, api)) {\n healthy.push(node)\n } else {\n unhealthy.push(node)\n }\n }\n if (healthy.length <= 1) {\n return [...healthy, ...unhealthy]\n }\n const now = Date.now()\n // Every score in THIS pass falls back to config index on ties → a total,\n // transitive order with no memo (so no stale-denominator inversions).\n const ordered = healthy\n .map((node, i) => ({ node, i, score: this.scoreNode(node, now) }))\n .sort((a, b) => a.score - b.score || a.i - b.i)\n .map((d) => d.node)\n const probe = this.pickReprobeCandidate(healthy, now)\n if (probe && ordered[0] !== probe) {\n return [probe, ...ordered.filter((n) => n !== probe), ...unhealthy]\n }\n return [...ordered, ...unhealthy]\n }\n\n /** A node's latency is usable for ranking only if profiled (≥ MIN_SAMPLES) and fresh. */\n private isLatencyUsable(h: NodeHealth | undefined, now: number): boolean {\n return (\n !!h &&\n h.ewmaLatencyMs !== undefined &&\n h.latencySampleCount >= LATENCY_MIN_SAMPLES &&\n now - h.latencyUpdatedAt <= LATENCY_MAX_AGE_MS\n )\n }\n\n /**\n * Ranking score (lower = better). Unproven/warming nodes get a fixed neutral prior\n * so they sit ahead of a proven-slow node but behind a proven-fast one, and make at\n * most one rank transition when they cross MIN_SAMPLES (no churn).\n */\n private scoreNode(node: string, now: number): number {\n const h = this.health.get(node)\n if (!this.isLatencyUsable(h, now)) return LATENCY_UNPROVEN_PRIOR_MS\n return h!.ewmaLatencyMs!\n }\n\n /**\n * At most one healthy node overdue for an exploratory re-probe: never sampled, or\n * neither sampled nor re-probed within LATENCY_REPROBE_MS. Returns the stalest such\n * node and stamps `lastProbeAt` to single-flight it against concurrent orderings.\n *\n * Note: `getOrCreate` here materializes a health entry per node in the passed list.\n * The node list (`config.nodes`/`restNodes`) is treated as effectively static — set\n * once via `setNodes` — so the map is bounded. If a host is ever removed from the\n * list at runtime its stale entry is simply ignored (never re-surfaced) and is a\n * negligible, bounded amount of memory.\n */\n private pickReprobeCandidate(healthy: string[], now: number): string | undefined {\n const threshold = now - LATENCY_REPROBE_MS\n let cand: string | undefined\n let candTouch = Infinity\n for (const n of healthy) {\n const h = this.getOrCreate(n)\n const touch = Math.max(h.latencyUpdatedAt, h.lastProbeAt)\n if (touch <= threshold && touch < candTouch) {\n cand = n\n candTouch = touch\n }\n }\n if (cand) this.getOrCreate(cand).lastProbeAt = now\n return cand\n }\n}\n\n// Exported for the co-located specs only (asserting the call sites' effect on\n// health). Not re-exported by hive-tx/index.ts, so NOT part of the public API.\n// @internal\nexport const rpcHealthTracker = new NodeHealthTracker()\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\n\n// ── Hedged-request budget ────────────────────────────────────────────────────\n\n/**\n * Token bucket bounding hedged (duplicated) read requests to a fraction of\n * overall traffic. A hedge spends 1 token; every un-hedged success refills\n * `config.resilience.hedgeRefillPerSuccess` (default 0.1 ⇒ steady-state hedge\n * rate ≤ ~9% of successful traffic, with bursts up to `hedgeBucketCapacity`).\n * The self-limiting property this buys: under pool-wide slowness nearly every\n * request wants to hedge while successes (the refills) stagnate, so the bucket\n * drains and hedging auto-disables instead of doubling load into public-node\n * rate limits — the standard hedged-request guard (cf. gRPC's hedging throttle;\n * Dean & Barroso, \"The Tail at Scale\"). One instance per process shared across\n * concurrent calls; plain synchronous mutation is race-free on the JS event\n * loop. Reads config live so runtime tuning via `setResilience` applies.\n * @internal Exported for testing only.\n */\nexport class HedgeBudget {\n private tokens = config.resilience.hedgeBucketCapacity\n\n trySpend(): boolean {\n this.clamp()\n // Epsilon guards fractional-refill float accumulation (10 × 0.1 < 1 in FP64).\n if (this.tokens >= 1 - 1e-9) {\n this.tokens -= 1\n return true\n }\n return false\n }\n\n refill(): void {\n this.clamp()\n this.tokens = Math.min(\n config.resilience.hedgeBucketCapacity,\n this.tokens + config.resilience.hedgeRefillPerSuccess\n )\n }\n\n /** Capacity may be lowered at runtime; never let stored tokens exceed it. */\n private clamp(): void {\n if (this.tokens > config.resilience.hedgeBucketCapacity) {\n this.tokens = config.resilience.hedgeBucketCapacity\n }\n }\n\n /** @internal test hook */\n get available(): number {\n return this.tokens\n }\n\n /** @internal test hook */\n reset(tokens = config.resilience.hedgeBucketCapacity): void {\n this.tokens = tokens\n }\n}\n\n// @internal — exported for the co-located spec only, like the trackers above.\nexport const rpcHedgeBudget = new HedgeBudget()\n\n/**\n * Per-attempt timeout for a read call. A node profiled for THIS profile key\n * (full RPC method / REST api+endpoint template) is given `factor × EWMA` —\n * floored (≥2s) so a moderate spike on a fast call is not cut off, and capped\n * at the caller's ceiling so this can only ever *shorten* the wait. The\n * effect: a node running far above its own baseline for this exact kind of\n * call is abandoned early and failover starts in seconds instead of the full\n * fixed window.\n *\n * Two deliberate exclusions:\n * - `explicit` callers (who passed a timeout argument) keep exactly what they\n * asked for — the documented meaning of the parameter is preserved, and a\n * consumer who knows their call is heavy is never second-guessed.\n * - The profile is per (node, full method) with NO fallback to the node's\n * mixed global EWMA or even the API-prefix average: a baseline dominated by\n * cheap `condenser_api.get_accounts` calls must not set the deadline for a\n * heavy `condenser_api.get_account_history`. An unprofiled (node, method)\n * pair keeps the caller's timeout unchanged (cold start == old behavior).\n */\nfunction adaptiveAttemptTimeout(\n tracker: NodeHealthTracker,\n node: string,\n profileKey: string,\n callerTimeout: number,\n explicit: boolean\n): number {\n const r = config.resilience\n if (!r.adaptiveTimeout || explicit) return callerTimeout\n const ewma = tracker.getUsableLatencyMs(node, profileKey)\n if (ewma === undefined) return callerTimeout\n // EWMAs are fractional, but the result feeds AbortSignal.timeout(), which\n // Node rejects with ERR_OUT_OF_RANGE for non-integer delays (browsers coerce).\n return Math.ceil(\n Math.min(callerTimeout, Math.max(r.adaptiveTimeoutFloorMs, r.adaptiveTimeoutFactor * ewma))\n )\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/** Record a caught error on the health tracker (handles NodeError to avoid double-counting). */\nfunction recordError(tracker: NodeHealthTracker, node: string, e: any, api?: string): void {\n if (e instanceof NodeError) {\n if (e.isRateLimit) {\n // 0 → no usable Retry-After → let recordRateLimit apply escalating backoff.\n tracker.recordRateLimit(node, e.rateLimitMs || undefined)\n } else {\n tracker.recordFailure(node, api)\n }\n } else if (e instanceof RPCError) {\n // RPC-level errors are API-specific (e.g., disabled API)\n tracker.recordFailure(node, api)\n } else {\n // Transport-level failures (DNS, TLS, timeout) affect the whole node\n tracker.recordFailure(node)\n }\n}\n\n/**\n * Passively extract head_block_number from known RPC responses\n * (e.g. `condenser_api.get_dynamic_global_properties`, `database_api.get_dynamic_global_properties`).\n * Silently ignores responses without that shape.\n */\nfunction tryRecordHeadBlock(\n tracker: NodeHealthTracker,\n node: string,\n method: string,\n result: any\n): void {\n if (!result || typeof result !== 'object') return\n if (!method.includes('get_dynamic_global_properties')) return\n const block = (result as any).head_block_number\n if (typeof block === 'number') {\n tracker.recordHeadBlock(node, block)\n }\n}\n\n// ── AbortSignal helpers (browser fallbacks) ─────────────────────────────────\n\n/**\n * Build a TimeoutError \"reason\" for an aborted signal.\n * Prefers the standard `DOMException` when available. Runtimes that ship\n * `AbortController` without `DOMException` (notably React Native / Hermes,\n * old Node < 17) fall back to a plain Error tagged with `name: 'TimeoutError'`\n * — which is what consumers actually check on `signal.reason`.\n */\nfunction createTimeoutReason(): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException('The operation was aborted due to timeout', 'TimeoutError')\n }\n const err = new Error('The operation was aborted due to timeout')\n err.name = 'TimeoutError'\n return err\n}\n\n/** AbortSignal.timeout polyfill for pre-Chrome 103 / pre-Safari 16.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to clear the dangling timer. */\nfunction createTimeoutSignal(ms: number): { signal: AbortSignal; cleanup: () => void } {\n // Node's AbortSignal.timeout throws ERR_OUT_OF_RANGE on fractional delays\n // (browsers coerce them), so guard every caller here.\n ms = Math.ceil(ms)\n if (typeof AbortSignal.timeout === 'function') {\n return { signal: AbortSignal.timeout(ms), cleanup: () => {} }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(createTimeoutReason()), ms)\n return { signal: controller.signal, cleanup: () => clearTimeout(timer) }\n}\n\n/** AbortSignal.any polyfill for pre-Chrome 116 / pre-Safari 17.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to remove listeners from the input signals (prevents leaks when the\n * same long-lived signal is reused across many callRPC invocations). */\nfunction mergeSignals(\n primary: AbortSignal,\n secondary?: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!secondary) return { signal: primary, cleanup: () => {} }\n if (typeof AbortSignal.any === 'function') {\n return { signal: AbortSignal.any([primary, secondary]), cleanup: () => {} }\n }\n // Fallback: controller that aborts with the winning signal's reason\n const controller = new AbortController()\n if (primary.aborted) {\n controller.abort(primary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n if (secondary.aborted) {\n controller.abort(secondary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n\n const onPrimaryAbort = () => controller.abort(primary.reason)\n const onSecondaryAbort = () => controller.abort(secondary.reason)\n primary.addEventListener('abort', onPrimaryAbort, { once: true })\n secondary.addEventListener('abort', onSecondaryAbort, { once: true })\n\n const cleanup = () => {\n primary.removeEventListener('abort', onPrimaryAbort)\n secondary.removeEventListener('abort', onSecondaryAbort)\n }\n return { signal: controller.signal, cleanup }\n}\n\n/**\n * Low-level JSON-RPC call to a single node. No failover.\n * Throws RPCError for blockchain rejections, NodeError for HTTP 429/5xx,\n * and generic Error for other transport failures.\n * @param shouldRetry - If true, retries once on the same node for transient errors.\n */\nconst jsonRPCCall = async (\n url: string,\n method: string,\n params: any,\n timeout = config.timeout,\n shouldRetry = false,\n externalSignal?: AbortSignal\n) => {\n const id = Math.floor(Math.random() * 100_000_000)\n const body = {\n jsonrpc: '2.0',\n method,\n params,\n id\n }\n // Merge the per-call timeout with any external abort signal (e.g., SSR\n // request cancellation). Either one firing cancels the fetch.\n // Fallbacks for browsers without AbortSignal.timeout (pre-Chrome 103)\n // or AbortSignal.any (pre-Chrome 116).\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\n const { signal, cleanup: cleanupMerge } = mergeSignals(tSignal, externalSignal)\n const cleanup = () => {\n cleanupTimeout()\n cleanupMerge()\n }\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...serverIdentityHeaders() },\n signal\n })\n\n // Handle HTTP-level errors before parsing JSON.\n // Throw NodeError so callers can record health exactly once.\n if (res.status === 429) {\n throw new NodeError(url, `HTTP 429 Rate Limited`, {\n rateLimitMs: parseRetryAfterMs(res.headers.get('Retry-After')),\n isRateLimit: true\n })\n }\n // Any other 5xx is a node-level failure. Common cases:\n // 502 Bad Gateway — upstream HAF/jussi down\n // 503 Service Unavail — node draining / maintenance\n // 504 Gateway Timeout — slow upstream\n // 520-530 — Cloudflare interstitials (1033 tunnel error → 530)\n // Without this branch, the HTML error-page body would fall into res.json()\n // and throw a generic SyntaxError downstream, making failover guess at\n // whether the request reached the node.\n if (res.status >= 500 && res.status < 600) {\n throw new NodeError(url, `HTTP ${res.status} from ${url}`)\n }\n\n const result = (await res.json()) as CallResponse\n if (\n !result ||\n typeof result.id === 'undefined' ||\n result.id !== id ||\n result.jsonrpc !== '2.0'\n ) {\n throw new Error('JSONRPC id mismatch')\n }\n if ('result' in result) {\n return result.result\n }\n if ('error' in result) {\n const e = result.error\n if ('message' in e && 'code' in e) {\n throw new RPCError(e)\n }\n throw result.error\n }\n // No result and no error?\n throw result\n } catch (e) {\n if (e instanceof RPCError) {\n throw e\n }\n // NodeError should not be retried on the same node - it's an HTTP status issue\n if (e instanceof NodeError) {\n throw e\n }\n if (externalSignal?.aborted) {\n throw e\n }\n if (shouldRetry) {\n return jsonRPCCall(url, method, params, timeout, false, externalSignal)\n }\n throw e\n } finally {\n cleanup()\n }\n}\n\n/** Small jitter delay between failover attempts to prevent thundering herd. */\nfunction jitterDelay(): Promise {\n return sleep(50 + Math.random() * 50)\n}\n\n// ── Hedged read attempt ─────────────────────────────────────────────────────\n\n/**\n * One hedged READ attempt: start the primary node, and if it is still pending\n * after `max(hedgeDelayFloorMs, hedgeDelayFactor × primary EWMA)`, race a\n * duplicate against the next healthy untried node. First success wins and the\n * loser is aborted. Resolution rules (mirroring the sequential path exactly):\n *\n * - External abort (caller cancelled): reject immediately, record nothing.\n * - Authoritative RPCError (non-node-level blockchain rejection) from either\n * leg: an answer, not a fault — abort the other leg, reject immediately.\n * - Failover-class failure: record health for that leg (recordError +\n * recordSlowFailure — identical to the sequential catch); if the other leg\n * is still running, keep waiting on it; when both have failed, reject with\n * the last error so the outer loop continues its normal failover.\n * - Primary fails BEFORE the hedge fires: reject immediately (plain failover —\n * hedging only ever races slowness, never a node that failed fast).\n *\n * Health/budget bookkeeping on a win: winner records a normal success sample;\n * if the hedge won, the primary gets a censored latency sample (elapsed at\n * abort — a lower bound on its true latency) so repeated hedge-wins reorder\n * the pool; if the primary won without the hedge ever firing, the budget\n * refills. An aborted hedge leg records nothing (it was never given a fair\n * run). Broadcasts NEVER go through this path (double-broadcast risk) — it is\n * wired into `callRPC` only.\n */\nfunction hedgedRpcAttempt(opts: {\n method: string\n params: any[] | object\n api: string\n primary: string\n /**\n * Pre-selected healthy untried peers (up to a few, in rank order). The\n * actual hedge target is drawn uniformly at random at FIRE time: with many\n * concurrent callers behind one origin IP, always duplicating to the single\n * next-ranked node would concentrate the whole hedge stream on it and could\n * trip its per-IP rate limit — spreading over the top candidates keeps the\n * same budget bound without a single-target hotspot. Marked tried only if\n * the hedge actually fires.\n */\n hedgePool: string[]\n callerTimeout: number\n /** Caller passed an explicit timeout — adaptive shortening is disabled. */\n explicitTimeout: boolean\n /** The call's wall-clock deadline: a hedge must not START past it (it would\n * be a brand-new request the outer loop itself would refuse to start). */\n deadlineAt: number\n externalSignal?: AbortSignal\n /** Lets the outer loop add the hedge node to its tried-set at fire time. */\n onHedgeFired: (node: string) => void\n /** Caller-supplied payload validation — see callRPC's `validate` param. */\n validate?: (result: unknown) => boolean\n}): Promise {\n const {\n method,\n params,\n api,\n primary,\n hedgePool,\n callerTimeout,\n explicitTimeout,\n deadlineAt,\n externalSignal,\n onHedgeFired,\n validate\n } = opts\n return new Promise((resolve, reject) => {\n let done = false\n let pendingLegs = 0\n let hedgeFired = false\n /** The primary settled on its own (success OR failure). A censored latency\n * sample is only valid for a primary that was still in flight when the\n * hedge won — recording one after the primary already failed would\n * fabricate a second sample for a request whose outcome was recorded. */\n let primarySettled = false\n let lastError: any\n let hedgeTimer: ReturnType | undefined\n let primaryStart = 0\n const controllers: AbortController[] = []\n\n /** Settle exactly once: clear the timer, abort every other in-flight leg\n * (their rejections land behind the `done` guard and are dropped). */\n const finish = (settle: () => void) => {\n if (done) return\n done = true\n if (hedgeTimer !== undefined) {\n clearTimeout(hedgeTimer)\n hedgeTimer = undefined\n }\n for (const c of controllers) {\n if (!c.signal.aborted) c.abort()\n }\n settle()\n }\n\n const startLeg = (node: string, isHedge: boolean) => {\n pendingLegs++\n const controller = new AbortController()\n controllers.push(controller)\n // Merge our cancellation handle with the caller's signal; jsonRPCCall\n // merges the result with its own per-attempt timeout signal.\n const merged = mergeSignals(controller.signal, externalSignal)\n const legTimeout = adaptiveAttemptTimeout(\n rpcHealthTracker,\n node,\n method,\n callerTimeout,\n explicitTimeout\n )\n const start = Date.now()\n if (!isHedge) primaryStart = start\n jsonRPCCall(node, method, params, legTimeout, false, merged.signal)\n .then((res) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Same handling as the catch\n // path — record the fault against this node's API health, never\n // record a success for a lie, and let the other leg still win.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(\n `[hive-tx] response validation failed for ${method} from ${node}`\n )\n if (!isHedge && !hedgeFired) {\n finish(() => reject(lastError))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n return\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - start, method)\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n if (isHedge) {\n if (!primarySettled) {\n // Primary lost the race while still in flight: censored sample\n // (lower bound of its true latency) so the ranker learns without\n // marking it as failed. A primary that already failed was fully\n // recorded by its own catch — nothing more to record.\n rpcHealthTracker.recordCensoredLatency(primary, Date.now() - primaryStart, method)\n }\n } else if (!hedgeFired) {\n rpcHedgeBudget.refill()\n }\n finish(() => resolve(res as T))\n })\n .catch((e) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return // aborted loser (or late settle) — already resolved\n if (externalSignal?.aborted) {\n // Caller cancelled — bail without recording (mirrors sequential path).\n finish(() => reject(e))\n return\n }\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n // Authoritative rejection: an answer, not a node fault.\n finish(() => reject(e))\n return\n }\n // Failover-class failure — record exactly as the sequential catch does.\n recordError(rpcHealthTracker, node, e, api)\n rpcHealthTracker.recordSlowFailure(node, Date.now() - start, method)\n lastError = e\n if (!isHedge && !hedgeFired) {\n // Primary failed fast, before the hedge delay: plain failover.\n finish(() => reject(e))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n // else: the other leg is still in flight and may still win.\n })\n }\n\n startLeg(primary, false)\n\n // Delay from the primary's per-method profile (the eligibility gate\n // ensured it is usable); a raced expiry just means the floor applies. It is\n // then clamped BELOW the primary's own attempt window: for a heavy API\n // (EWMA > window/hedgeDelayFactor) the un-clamped delay would land past\n // the primary's timeout-abort — which clears this timer — so hedging would\n // silently never fire for exactly the heavy tail it exists to protect.\n // Firing at ~80% of the window keeps the duplicate meaningful (it starts\n // while the primary is still allowed to win) for every profile shape.\n const ewma = rpcHealthTracker.getUsableLatencyMs(primary, method) ?? 0\n const primaryWindow = adaptiveAttemptTimeout(\n rpcHealthTracker,\n primary,\n method,\n callerTimeout,\n explicitTimeout\n )\n const delay = Math.min(\n Math.max(config.resilience.hedgeDelayFloorMs, config.resilience.hedgeDelayFactor * ewma),\n 0.8 * primaryWindow\n )\n hedgeTimer = setTimeout(() => {\n hedgeTimer = undefined\n if (done || externalSignal?.aborted) return\n // Never START a duplicate past the call's wall-clock deadline — it would\n // extend the hold and spend a token on work the outer loop would refuse.\n if (Date.now() >= deadlineAt) return\n // Candidates were selected before the delay elapsed — re-check health at\n // fire time (one may have been rate-limited meanwhile) BEFORE spending a\n // token, so a stale pool costs nothing. Random draw spreads concurrent\n // callers' duplicates across the top candidates (see hedgePool doc).\n const live = hedgePool.filter((n) => rpcHealthTracker.isNodeHealthy(n, api))\n if (live.length === 0) return\n const target = live[Math.floor(Math.random() * live.length)]\n // Budget check at fire time, not arm time: only actual duplicates spend.\n if (!rpcHedgeBudget.trySpend()) return\n hedgeFired = true\n onHedgeFired(target)\n startLeg(target, true)\n }, delay)\n })\n}\n\n// ── Public API: callRPC ─────────────────────────────────────────────────────\n\n/**\n * Makes API calls to Hive blockchain nodes with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, jitter between retries,\n * and HTTP status awareness (429 rate limiting, 503).\n *\n * If the current node fails, it will automatically try the next healthy node.\n * When all nodes have been tried, wraps around to give earlier nodes another chance\n * until the full retry budget (config.retry) is exhausted.\n * RPCErrors (valid blockchain rejections) are never retried.\n *\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Maximum number of retry attempts (default: config.retry). The\n * wall-clock budget (`config.resilience.totalBudgetFactor` × timeout) may end\n * the failover walk before the retry count is exhausted.\n * @param validate - Optional payload validation. Some nodes return a valid\n * JSON-RPC envelope carrying an impossible payload (e.g. account rows with\n * metadata fields stripped to \"\"), which no transport-level check can catch.\n * When the callback returns false the response is treated as a node fault:\n * recorded against that node's per-API health (repeat offenders get an API\n * cooldown and are deprioritized) and the failover walk continues to the\n * next node instead of returning the lie. Keep validators conservative —\n * reject only payloads the caller KNOWS cannot be correct, or a strict\n * validator turns every node's honest answer into a failover storm.\n * @returns Promise resolving to the API response\n * @throws {RPCError} On blockchain-level errors (bad params, missing authority, etc.)\n * @throws {Error} If all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callRPC } from 'hive-tx'\n *\n * // Get account information\n * const accounts = await callRPC('condenser_api.get_accounts', [['alice']])\n *\n * // Custom timeout and retry settings\n * const data = await callRPC('condenser_api.get_content', ['alice', 'test-post'], 10_000, 5)\n * ```\n */\nexport const callRPC = async (\n method: string,\n params: any[] | object = [],\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal,\n validate?: (result: unknown) => boolean\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n // An explicit timeout argument is authoritative: adaptive shortening only\n // applies to callers who left the window to the SDK (timeout === undefined),\n // so `callRPC(m, p, 10_000)` still means \"give each attempt 10s\" exactly.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const api = apiOf(method)\n // Wall-clock budget across ALL failover attempts. Without it the worst case\n // is (retry+1) × timeout ≈ 30s — exactly the render pile-up this feature\n // exists to prevent — whenever the WHOLE pool is slow (adaptive timeouts\n // rise with the EWMAs and hedging self-throttles, both by design). The\n // deadline is checked before each new attempt AND before a hedge fires; an\n // in-flight attempt still finishes its own window, so the true ceiling is\n // deadline + one attempt window (up to ~2× the window if a hedge fired just\n // before the deadline and the attempt then waits out the hedge leg too).\n // Note this budget also bounds callers who passed an explicit `retry`: the\n // wall clock, not the attempt count, is the stronger promise here.\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Track nodes tried in the current round. When all nodes have been tried,\n // clear the set to allow a second round (wrap-around) using the retry budget.\n const triedInRound = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so nodes with an API-specific cooldown are deprioritized.\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n // Pick the healthiest untried node. If all tried, start a new round.\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n\n // Hedge eligibility for THIS attempt: opted in, the primary has a usable\n // latency profile for this exact method (so the hedge delay is grounded in\n // data — cold starts stay sequential), and healthy untried peers exist.\n let hedgePool: string[] = []\n if (\n config.resilience.hedge &&\n rpcHealthTracker.getUsableLatencyMs(node, method) !== undefined\n ) {\n hedgePool = orderedNodes\n .filter((n) => !triedInRound.has(n) && rpcHealthTracker.isNodeHealthy(n, api))\n .slice(0, 3)\n }\n\n if (hedgePool.length > 0) {\n try {\n // All health/budget recording happens inside the hedged attempt —\n // the catch below must NOT record again (unlike the sequential path).\n return await hedgedRpcAttempt({\n method,\n params,\n api,\n primary: node,\n hedgePool,\n callerTimeout: ceiling,\n explicitTimeout,\n deadlineAt: deadline,\n externalSignal: signal,\n onHedgeFired: (n) => triedInRound.add(n),\n validate\n })\n } catch (e: any) {\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n lastError = e\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n }\n\n const callStart = Date.now()\n try {\n const res = await jsonRPCCall(\n node,\n method,\n params,\n adaptiveAttemptTimeout(rpcHealthTracker, node, method, ceiling, explicitTimeout),\n false,\n signal\n )\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Count it against this node's API\n // health (never record a success or refill the hedge budget for a\n // lie) and fail over to the next node.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(`[hive-tx] response validation failed for ${method} from ${node}`)\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart, method)\n // An un-hedged success is what earns hedge budget back (see HedgeBudget).\n rpcHedgeBudget.refill()\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n return res as T\n } catch (e: any) {\n // RPCErrors: distinguish node-level failures from genuine blockchain rejections.\n // Node-level errors (e.g. -32602 \"Unable to parse endpoint data\" from a sick\n // HAF/jussi backend) should failover; real rejections (bad params, missing\n // authority, etc.) propagate immediately.\n if (e instanceof RPCError) {\n if (!isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n // Node-level RPC error — record failure and fall through to failover\n }\n // External abort — stop retrying immediately\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n // A genuinely slow failure (timeout/abort/slow-5xx) is also a latency signal so\n // a node that 200s-but-too-slow or aborts at the timeout is demoted by the\n // ranker, not only by the (transient) failure gate. Measured elapsed, never a\n // constant; recordSlowFailure ignores instant (down-node) failures.\n rpcHealthTracker.recordSlowFailure(node, Date.now() - callStart, method)\n lastError = e\n\n // Add jitter before trying next node\n if (attempt < retry) {\n await jitterDelay()\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callRPC for broadcasts ──────────────────────────────────────\n\n/**\n * Broadcast-safe RPC call. Only retries on pre-connection errors where the\n * request definitively never reached the server (ECONNREFUSED, ENOTFOUND, etc.).\n * On timeouts, HTTP errors, or any ambiguous failure, throws immediately to\n * prevent double-broadcasting transactions.\n *\n * Tries each node once (no wrap-around) since broadcast retries are dangerous.\n *\n * @internal Used by Transaction.broadcast()\n */\nexport const callRPCBroadcast = async (\n method: string,\n params: any[] | object = [],\n timeout = config.broadcastTimeout,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n const api = apiOf(method)\n // Track which nodes we've already tried - broadcasts must never retry the same node\n const triedNodes = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt < config.nodes.length; attempt++) {\n // Re-evaluate order each attempt so health changes are respected\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n const node = orderedNodes.find((n) => !triedNodes.has(n))\n if (!node) break\n triedNodes.add(node)\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n // Deliberately no latency sample for broadcasts: broadcast_transaction_synchronous\n // blocks for block inclusion (~1.5–3s+) regardless of the node's read speed, so\n // feeding it into the shared read EWMA would wrongly demote a fast node for reads.\n // The same nodes are profiled by callRPC read traffic, so a genuinely slow node is\n // still demoted there.\n rpcHealthTracker.recordSuccess(node, api)\n return res as T\n } catch (e: any) {\n // RPCErrors are valid blockchain rejections - never retry\n if (e instanceof RPCError) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n lastError = e\n\n // Broadcast safety: only fail over when the request is safe to re-send.\n // `broadcastOperations` signs the tx exactly once and `callRPCBroadcast`\n // reuses that signed payload across nodes, so any case where the next\n // node would dedupe by trx_id is fine. RPCErrors (real blockchain\n // rejections) propagate immediately — see isBroadcastSafeToRetry.\n if (!isBroadcastSafeToRetry(e)) {\n throw e\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callREST ────────────────────────────────────────────────────\n\nconst apiMethods: Record = {\n balance: '/balance-api',\n hafah: '/hafah-api',\n hafbe: '/hafbe-api',\n hivemind: '/hivemind-api',\n hivesense: '/hivesense-api',\n reputation: '/reputation-api',\n 'nft-tracker': '/nft-tracker-api',\n hafsql: '/hafsql',\n status: '/status-api'\n}\n\n/**\n * Makes REST API calls to Hive blockchain REST endpoints with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, and timeout support.\n * Wraps around the node list to honor the full retry budget.\n *\n * @template Api - The REST API method type (e.g., 'balance', 'hafah', 'hivemind', etc.)\n * @template P - The endpoint path type for the specified API\n *\n * @param api - The REST API method name to call\n * @param endpoint - The specific endpoint path within the API\n * @param params - Optional parameters for path and query string replacement\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Number of retry attempts before throwing an error (default:\n * config.retry). The wall-clock budget (`config.resilience.totalBudgetFactor`\n * × timeout) may end the failover walk before the retry count is exhausted.\n *\n * @returns Promise resolving to the API response data with proper typing\n * @throws Error if all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callREST } from 'hive-tx'\n *\n * // Get account balance\n * const balance = await callREST('balance', '/accounts/{account-name}/balances', { \"account-name\": 'alice' })\n *\n * // Custom timeout and retry settings\n * const data = await callREST('status', '/status', undefined, 10_000, 3)\n * ```\n */\nexport async function callREST(\n api: APIMethods,\n endpoint: string,\n params?: Record,\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal\n): Promise {\n if (!Array.isArray(config.restNodes)) {\n throw new Error('config.restNodes is not an array')\n }\n if (config.restNodes.length === 0) {\n throw new Error('config.restNodes is empty')\n }\n // Same contract as callRPC: an explicit timeout argument is authoritative\n // (no adaptive shortening), and a wall-clock deadline bounds the total\n // failover walk when the whole pool is slow.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Latency-profile key: api + endpoint TEMPLATE (pre-substitution, so the\n // cardinality is code-defined) — a cheap endpoint's baseline must not set\n // the deadline for a heavy one within the same REST api.\n const restProfileKey = `${api}:${endpoint}`\n // Per-API node override: an API served by only a subset of nodes (e.g.\n // hivesense) uses its own capable-host list so the small retry budget and\n // cold starts aren't wasted on nodes that 404/503 it. Any API without an\n // override (or with an empty one) falls back to the generic restNodes.\n const apiNodes =\n config.restNodesByApi?.[api]?.length\n ? config.restNodesByApi[api]!\n : config.restNodes\n const triedInRound = new Set()\n let lastError: any\n // Track whether the error was already recorded by the HTTP status handler\n let alreadyRecorded = false\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so per-API cooldowns are respected.\n const orderedNodes = restHealthTracker.getOrderedNodes(apiNodes, api)\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n const baseUrl = node + apiMethods[api]\n let path = endpoint as string\n const paramObj = params || ({} as Record)\n const processedPathParams = new Set()\n\n // Replace path params ONLY\n Object.entries(paramObj).forEach(([key, value]) => {\n if (path.includes(`{${key}}`)) {\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)))\n processedPathParams.add(key)\n }\n })\n const url = new URL(baseUrl + path)\n // Add ONLY remaining params as query (if any)\n Object.entries(paramObj).forEach(([key, value]) => {\n if (!processedPathParams.has(key)) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n })\n\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n alreadyRecorded = false\n // Adaptive per-attempt timeout (see adaptiveAttemptTimeout): a profiled\n // REST node is abandoned at factor×EWMA instead of the full fixed window.\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(\n adaptiveAttemptTimeout(restHealthTracker, node, restProfileKey, ceiling, explicitTimeout)\n )\n const { signal: restSignal, cleanup: cleanupMerge } = mergeSignals(tSignal, signal)\n const restCleanup = () => { cleanupTimeout(); cleanupMerge() }\n const restCallStart = Date.now()\n try {\n const response = await fetch(url.toString(), {\n signal: restSignal,\n headers: serverIdentityHeaders()\n })\n if (response.status === 404) {\n throw new Error('HTTP 404 - Hint: can happen on wrong params')\n }\n if (response.status === 429) {\n // 0 (no usable Retry-After) → undefined → escalating backoff in recordRateLimit.\n restHealthTracker.recordRateLimit(\n node,\n parseRetryAfterMs(response.headers.get('Retry-After')) || undefined\n )\n alreadyRecorded = true\n throw new Error(`HTTP 429 Rate Limited by ${node}`)\n }\n if (response.status === 503) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP 503 Service Unavailable from ${node}`)\n }\n if (!response.ok) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP ${response.status} from ${node}`)\n }\n restHealthTracker.recordSuccess(node, api, Date.now() - restCallStart, restProfileKey)\n return response.json() as any\n } catch (e: any) {\n // 404 is not a node issue, don't failover\n if (e?.message?.includes('HTTP 404')) {\n throw e\n }\n // External abort (caller unmounted / React Query cancelled the request) is the\n // client's decision, NOT a node fault. Mirror callRPC: bail before recording any\n // failure or slow-latency sample so a healthy REST node (e.g. an own node) is never\n // demoted by routine navigation/cancellation.\n if (signal?.aborted) {\n throw e\n }\n // Only record if not already recorded by 429/503 handler above\n if (!alreadyRecorded) {\n restHealthTracker.recordFailure(node, api)\n }\n // A slow failure (timeout/abort/slow-5xx — e.g. an own node from a far region) is a\n // latency signal too, so it is demoted by the ranker, not only the failure gate.\n // Measured elapsed; recordSlowFailure floors at LATENCY_SLOW_FAILURE_MS so a fast\n // 404/429 or instant down-node failure is NOT mis-read as \"slow\".\n restHealthTracker.recordSlowFailure(node, Date.now() - restCallStart, restProfileKey)\n lastError = e\n\n if (attempt < retry) {\n await jitterDelay()\n }\n } finally {\n restCleanup()\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callWithQuorum ───────────────────────────────────────────────\n\n/**\n * Make a JSONRPC call with quorum. The method will cross-check the result\n * with `quorum` number of nodes before returning the result.\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param quorum - Default: 2 (recommended)\n */\nexport const callWithQuorum = async (\n method: string,\n params: any[] | object = [],\n quorum = 2,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an Array')\n }\n if (quorum > config.nodes.length) {\n throw new Error('quorum > config.nodes.length')\n }\n // We call random nodes for better security (Fisher-Yates shuffle)\n const shuffleNodes = (arr: string[]) => {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n }\n let allNodes = shuffleNodes(config.nodes)\n let currentBatchSize = Math.min(quorum, allNodes.length)\n let allResults: any[] = []\n while (currentBatchSize > 0 && allNodes.length > 0) {\n // Take next batch of nodes\n const batchNodes = allNodes.splice(0, currentBatchSize)\n const promises: Promise[] = []\n const batchResults: any[] = []\n // Launch batch calls in parallel\n for (let i = 0; i < batchNodes.length; i++) {\n promises.push(\n jsonRPCCall(batchNodes[i], method, params, undefined, true, signal)\n .then((data) => batchResults.push(data))\n .catch(() => {})\n )\n }\n await Promise.all(promises)\n allResults.push(...batchResults)\n // Check for consensus in successful results\n const consensusResult = findConsensus(allResults, quorum)\n if (consensusResult) {\n return consensusResult\n }\n // Prepare next batch\n currentBatchSize = Math.min(quorum, allNodes.length)\n if (currentBatchSize === 0) {\n throw new Error('No more nodes available.')\n }\n }\n throw new Error(\"Couldn't reach quorum.\")\n}\n\nfunction findConsensus(results: any[], quorum: number) {\n const resultGroups = new Map()\n for (const result of results) {\n const key = JSON.stringify(result)\n if (!resultGroups.has(key)) {\n resultGroups.set(key, [])\n }\n resultGroups.get(key)!.push(result)\n }\n const consensusGroup = Array.from(resultGroups.values()).find((group) => group.length >= quorum)\n return consensusGroup ? consensusGroup[0] : null\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { PrivateKey } from './helpers/PrivateKey'\nimport {\n OperationName,\n OperationBody,\n TransactionType,\n TransactionStatus,\n BroadcastResult\n} from './types'\nimport { ByteBuffer } from './helpers/ByteBuffer'\nimport { Serializer } from './helpers/serializer'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { config } from './config'\nimport { callRPC, callRPCBroadcast, RPCError } from './helpers/call'\nimport { DigestData } from './types'\nimport { sleep } from './helpers/sleep'\n\nconst chainId = hexToBytes(config.chain_id)\n\ninterface TransactionOptions {\n transaction?: TransactionType | Transaction\n /**\n * Transaction expiration in milliseconds (ms) - max 86400000 (24 hours)\n * @default 60_000\n */\n expiration?: number\n}\n\nexport class Transaction {\n transaction?: TransactionType\n\n expiration: number = 60_000\n\n private txId?: string\n\n constructor(options?: TransactionOptions) {\n if (options?.transaction) {\n if (options.transaction instanceof Transaction) {\n this.transaction = options.transaction.transaction\n this.expiration = options.transaction.expiration\n } else {\n this.transaction = options.transaction\n }\n // A transaction built externally (e.g. from a hive-uri signing request)\n // may omit the `signatures` array. sign(), addSignature() and broadcast()\n // all assume it exists, so normalize it here to avoid\n // \"Cannot read property 'push' of undefined\" on sign.\n if (this.transaction && !Array.isArray(this.transaction.signatures)) {\n this.transaction.signatures = []\n }\n this.txId = this.digest().txId\n }\n if (options?.expiration) {\n this.expiration = options.expiration\n }\n }\n\n /**\n * Adds an operation to the transaction. If no transaction exists, creates one first.\n * @template O Operation name type for type safety\n * @param operationName The name/type of the operation to add (e.g., 'transfer', 'vote', 'comment')\n * @param operationBody The operation data/body for the specified operation type\n * @returns Promise that resolves when the operation is added\n * @throws Error if transaction creation fails or global properties cannot be retrieved\n */\n async addOperation(\n operationName: O,\n operationBody: OperationBody\n ): Promise {\n if (!this.transaction) {\n await this.createTransaction(this.expiration)\n }\n this.transaction!.operations.push([operationName, operationBody])\n }\n\n /**\n * Signs the transaction with the provided key(s), supporting both single and multi-signature transactions.\n * For multi-signature, you can sign with all keys at once or sign individually by calling this method multiple times.\n * @param keys Single PrivateKey or array of PrivateKeys to sign the transaction with\n * @returns The signed transaction\n * @throws Error if no transaction exists to sign\n */\n sign(keys: PrivateKey | PrivateKey[]): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n if (this.transaction) {\n const { digest, txId } = this.digest()\n if (!Array.isArray(keys)) {\n keys = [keys]\n }\n for (const key of keys) {\n const signature = key.sign(digest)\n this.transaction.signatures.push(signature.customToString())\n }\n this.txId = txId\n return this.transaction\n } else {\n throw new Error('No transaction to sign')\n }\n }\n\n /**\n * Broadcasts the signed transaction to the Hive network.\n * Automatically handles retries and duplicate transaction detection.\n * @param checkStatus By default (false) the transaction is not guaranteed to be included in a block.\n * For example the transaction can expire while waiting in mempool.\n * If you pass true here, the function will wait for the transaction to be either included or dropped\n * before returning a result.\n * @returns Promise resolving to broadcast result\n * @throws Error if no transaction exists or transaction is not signed or transaction got rejected\n */\n async broadcast(checkStatus = false): Promise {\n if (!this.transaction) {\n throw new Error(\n 'Attempted to broadcast an empty transaction. Add operations by .addOperation()'\n )\n }\n if (this.transaction.signatures.length === 0) {\n throw new Error(\n 'Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)'\n )\n }\n try {\n await callRPCBroadcast('condenser_api.broadcast_transaction', [this.transaction])\n } catch (e) {\n if (e instanceof RPCError && e.message.includes('Duplicate transaction check failed')) {\n // ignore duplicate transaction error as this can happen when we retry the broadcast\n } else {\n throw e\n }\n }\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n if (!checkStatus) {\n return { tx_id: this.txId, status: 'unknown' }\n }\n // Poll until the transaction reaches a final state or max attempts exceeded.\n // With 60 attempts: delays grow from 1.3s to 19s, total wait ~10 minutes.\n const maxPollAttempts = 60\n await sleep(1000)\n let status = await this.checkStatus()\n let i = 1\n while (\n status?.status !== 'within_irreversible_block' &&\n status?.status !== 'expired_irreversible' &&\n status?.status !== 'too_old' &&\n i < maxPollAttempts\n ) {\n await sleep(1000 + i * 300)\n status = await this.checkStatus()\n i++\n }\n return {\n tx_id: this.txId,\n status: (status?.status ?? 'unknown') as BroadcastResult['status']\n }\n }\n\n /**\n * Returns the transaction digest containing the transaction ID and hash.\n * The digest can be used to verify signatures and for transaction identification.\n * @returns DigestData containing transaction ID and hash\n * @throws Error if no transaction exists\n */\n digest(): DigestData {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n const temp = { ...this.transaction }\n try {\n Serializer.Transaction(buffer, temp)\n } catch (cause) {\n throw new Error('Unable to serialize transaction: ' + cause)\n }\n buffer.flip()\n const transactionData = new Uint8Array(buffer.toBuffer())\n const txId = bytesToHex(sha256(transactionData)).slice(0, 40)\n const digest = sha256(new Uint8Array([...chainId, ...transactionData]))\n return { digest, txId }\n }\n\n /**\n * Adds a signature to an already created transaction. Useful when signing with external tools.\n * Multiple signatures can be added one at a time for multi-signature transactions.\n * @param signature The signature string in hex format (must be exactly 130 characters)\n * @returns The transaction with the added signature\n * @throws Error if no transaction exists or signature format is invalid\n */\n addSignature(signature: string): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .create(operations)')\n }\n if (typeof signature !== 'string') {\n throw new Error('Signature must be string')\n }\n if (signature.length !== 130) {\n throw new Error('Signature must be 130 characters long')\n }\n this.transaction.signatures.push(signature)\n return this.transaction\n }\n\n /** Get status of this transaction. Usually called internally after broadcasting. */\n async checkStatus(): Promise {\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n return callRPC('transaction_status_api.find_transaction', {\n transaction_id: this.txId,\n expiration: this.transaction?.expiration\n })\n }\n\n /**\n * Creates the transaction structure and initializes it with blockchain data.\n * Retrieves current head block information and sets up reference block data.\n * @private\n * @param expiration Transaction expiration in milliseconds\n */\n private createTransaction = async (expiration: number) => {\n const props = await callRPC('condenser_api.get_dynamic_global_properties', [])\n const bytes = hexToBytes(props.head_block_id)\n const refBlockPrefix = Number(new Uint32Array(bytes.buffer, bytes.byteOffset + 4, 1)[0])\n const expirationIso = new Date(Date.now() + expiration).toISOString().slice(0, -5)\n this.transaction = {\n expiration: expirationIso,\n extensions: [],\n operations: [],\n ref_block_num: props.head_block_number & 0xffff,\n ref_block_prefix: refBlockPrefix,\n signatures: []\n }\n }\n}\n","import bs58 from 'bs58'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PublicKey } from './PublicKey'\nimport { Signature } from './Signature'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport type KeyRole = 'owner' | 'active' | 'posting' | 'memo'\n\nconst NETWORK_ID = new Uint8Array([0x80])\n\n/**\n * ECDSA (secp256k1) private key for signing and encryption operations.\n * Handles key generation, derivation from seeds/passwords, and cryptographic operations.\n *\n * All private keys are stored internally as Uint8Array and can be converted to/from\n * Wallet Import Format (WIF) strings for storage and transmission.\n *\n * @example\n * ```typescript\n * // From WIF string\n * const key = PrivateKey.from('5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw')\n *\n * // Generate random key\n * const randomKey = PrivateKey.randomKey()\n *\n * // From username and password\n * const loginKey = PrivateKey.fromLogin('username', 'password')\n *\n * // Sign a message\n * const signature = key.sign(someHash)\n *\n * // Get public key\n * const pubKey = key.createPublic()\n * ```\n */\nexport class PrivateKey {\n key: Uint8Array\n\n constructor(key: Uint8Array) {\n this.key = key\n try {\n secp256k1.getPublicKey(key)\n } catch (e) {\n throw new Error('invalid private key')\n }\n }\n\n /**\n * Creates a PrivateKey instance from a WIF string or raw Uint8Array.\n * Automatically detects the input type and uses the appropriate method.\n *\n * @param value - WIF formatted string or raw 32-byte key as Uint8Array\n * @returns New PrivateKey instance\n * @throws Error if the key format is invalid\n */\n static from(value: string | Uint8Array): PrivateKey {\n if (typeof value === 'string') {\n return PrivateKey.fromString(value)\n } else {\n return new PrivateKey(value)\n }\n }\n\n /**\n * Creates a PrivateKey from a Wallet Import Format (WIF) encoded string.\n *\n * @param wif - WIF encoded private key string\n * @returns New PrivateKey instance\n * @throws Error if WIF format is invalid or checksum fails\n */\n static fromString(wif: string): PrivateKey {\n return new PrivateKey(decodePrivate(wif).subarray(1))\n }\n\n /**\n * Creates a PrivateKey from a seed string or Uint8Array.\n * The seed is hashed with SHA256 to produce the private key.\n *\n * @param seed - Seed string (converted to bytes) or raw byte array\n * @returns New PrivateKey instance derived from seed\n */\n static fromSeed(seed: string | Uint8Array): PrivateKey {\n if (typeof seed === 'string') {\n const isHex = /^[0-9a-fA-F]+$/.test(seed)\n if (isHex) {\n seed = hexToBytes(seed)\n } else {\n // Convert non-hex string to Uint8Array using UTF-8 encoding\n // Avoid top-level TextEncoder — not available on all runtimes (e.g. Hermes)\n const bytes: number[] = []\n for (let i = 0; i < seed.length; i++) {\n let c = seed.charCodeAt(i)\n if (c < 0x80) {\n bytes.push(c)\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < seed.length) {\n const next = seed.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n seed = new Uint8Array(bytes)\n }\n }\n return new PrivateKey(sha256(seed))\n }\n\n /**\n * Derives a PrivateKey from username, password, and role using Hive's key derivation scheme.\n * This generates the same keys that the Hive wallet uses for login-based keys.\n *\n * @param username - Hive username\n * @param password - Master password (or seed phrase)\n * @param role - Key role ('owner', 'active', 'posting', 'memo')\n * @returns New PrivateKey instance for the specified role\n */\n static fromLogin(username: string, password: string, role: KeyRole = 'active'): PrivateKey {\n const seed = username + role + password\n return PrivateKey.fromSeed(seed)\n }\n\n /**\n * Signs a 32-byte message hash using ECDSA and returns a recoverable signature.\n * The signature includes recovery information to allow public key recovery.\n *\n * @param message - 32-byte message hash to sign (Uint8Array)\n * @returns Signature object containing the signature data\n */\n sign(message: Uint8Array): Signature {\n const rv = secp256k1.sign(message, this.key, {\n extraEntropy: true,\n format: 'recovered',\n prehash: false // prehash does sha256 on the message\n })\n const recovery = parseInt(bytesToHex(rv.subarray(0, 1)), 16)\n return Signature.from((recovery + 31).toString(16) + bytesToHex(rv.subarray(1)))\n }\n\n /**\n * Derives the corresponding public key for this private key.\n *\n * @param prefix - Optional address prefix (defaults to config.address_prefix)\n * @returns PublicKey instance derived from this private key\n */\n createPublic(prefix?: string): PublicKey {\n return new PublicKey(secp256k1.getPublicKey(this.key), prefix)\n }\n\n /**\n * Returns the private key as a Wallet Import Format (WIF) encoded string.\n * This includes network ID and checksum for safe storage/transmission.\n *\n * @returns WIF encoded private key string\n */\n toString(): string {\n return encodePrivate(new Uint8Array([...NETWORK_ID, ...this.key]))\n }\n\n /**\n * Returns a masked representation of the private key for debugging/logging.\n * Shows only the first and last 6 characters to avoid accidental exposure.\n * Use toString() to get the full key for export/serialization.\n *\n * @returns Masked key representation for safe logging\n */\n inspect(): string {\n const key = this.toString()\n return `PrivateKey: ${key.slice(0, 6)}...${key.slice(-6)}`\n }\n\n /**\n * Computes a shared secret using ECDH key exchange for memo encryption.\n * The shared secret is used as a key for AES encryption/decryption.\n *\n * @param publicKey - Other party's public key\n * @returns 64-byte shared secret as Uint8Array\n */\n getSharedSecret(publicKey: PublicKey): Uint8Array {\n const s = secp256k1.getSharedSecret(this.key, publicKey.key)\n // strip the parity byte\n return sha512(s.subarray(1))\n }\n\n /**\n * Generates a new cryptographically secure random private key.\n * Uses the secp256k1 key generation algorithm for security.\n * This method may take up to 250ms due to entropy collection.\n *\n * @returns New randomly generated PrivateKey instance\n */\n static randomKey(): PrivateKey {\n return new PrivateKey(secp256k1.keygen().secretKey)\n }\n}\n\nconst doubleSha256 = (input: Uint8Array) => {\n const dbl = sha256(sha256(input))\n return dbl\n}\n\n/** Encode bs58+doubleSha256-checksum private key. */\nconst encodePrivate = (key: Uint8Array) => {\n // assert.equal(key.readUInt8(0), 0x80, 'private key network id mismatch')\n const checksum = doubleSha256(key)\n return bs58.encode(new Uint8Array([...key, ...checksum.slice(0, 4)]))\n}\n\n/** Decode bs58+doubleSha256-checksum encoded private key. */\nconst decodePrivate = (encodedKey: string) => {\n const buffer = bs58.decode(encodedKey)\n if (!isUint8ArrayEqual(buffer.slice(0, 1), NETWORK_ID)) {\n throw new Error('Private key network id mismatch')\n }\n const checksum = buffer.slice(-4)\n const key = buffer.slice(0, -4)\n const checksumVerify = doubleSha256(key).slice(0, 4)\n if (!isUint8ArrayEqual(checksum, checksumVerify)) {\n throw new Error('Private key checksum mismatch')\n }\n return key\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array) => {\n if (a === b) return true\n if (a.byteLength !== b.byteLength) return false\n const len = a.byteLength\n let i = 0\n while (i < len && a[i] === b[i]) i++\n return i === len\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { cbc as AESCBC } from '@noble/ciphers/aes.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PrivateKey } from './PrivateKey'\nimport { PublicKey } from './PublicKey'\n\nexport const encrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n message: Uint8Array,\n nonce: bigint = uniqueNonce()\n) => crypt(privateKey, publicKey, nonce, message)\n\nexport const decrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum: number\n): Uint8Array => {\n const d = crypt(privateKey, publicKey, nonce, message, checksum)\n return d.message\n}\n\n/**\n * @arg message - Encrypted or plain text message (see checksum)\n * @arg checksum - shared secret checksum (null to encrypt, non-null to decrypt)\n */\nconst crypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum?: number\n): { nonce: bigint; message: Uint8Array; checksum: number } => {\n const nonceL = nonce\n const S = privateKey.getSharedSecret(publicKey)\n let ebuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n ebuf.writeUint64(nonceL)\n ebuf.append(S)\n ebuf.flip()\n\n const encryptionKey = sha512(new Uint8Array(ebuf.toBuffer()))\n const iv = encryptionKey.subarray(32, 48)\n const tag = encryptionKey.subarray(0, 32)\n\n // check if first 64 bit of sha256 hash treated as uint64_t truncated to 32 bits.\n const check = sha256(encryptionKey).subarray(0, 4)\n const cbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n cbuf.append(check)\n cbuf.flip()\n const check32 = cbuf.readUint32()\n if (checksum !== undefined) {\n if (check32 !== checksum) {\n throw new Error('Invalid key')\n }\n message = cryptoJsDecrypt(message, tag, iv)\n } else {\n message = cryptoJsEncrypt(message, tag, iv)\n }\n return { nonce: nonceL, message, checksum: check32 }\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} ciphertext - binary format\n * @return {Uint8Array} the decrypted message\n */\nconst cryptoJsDecrypt = (message: Uint8Array, tag: Uint8Array, iv: Uint8Array): Uint8Array => {\n let messageBuffer = message\n const decipher = AESCBC(tag, iv)\n messageBuffer = decipher.decrypt(messageBuffer)\n return messageBuffer\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} plaintext - binary format\n * @return {Uint8Array} binary\n */\nexport const cryptoJsEncrypt = (\n message: Uint8Array,\n tag: Uint8Array,\n iv: Uint8Array\n): Uint8Array => {\n let messageBuffer = message\n const cipher = AESCBC(tag, iv)\n messageBuffer = cipher.encrypt(messageBuffer)\n return messageBuffer\n}\n\nlet uniqueNonceEntropy: number | null = null\n\nconst uniqueNonce = (): bigint => {\n if (uniqueNonceEntropy === null) {\n const randomPrivateKey = secp256k1.utils.randomSecretKey()\n uniqueNonceEntropy = (randomPrivateKey[0] << 8) | randomPrivateKey[1]\n }\n let long = BigInt(Date.now())\n const entropy = ++uniqueNonceEntropy % 0x10000\n long = (long << BigInt(16)) | BigInt(entropy)\n return long\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\n\nconst PublicKeyDeserializer = (buf: ByteBuffer) => {\n const c = fixedBuf(buf, 33)\n return new PublicKey(c)\n}\n\nconst UInt64Deserializer = (b: ByteBuffer) => {\n return b.readUint64()\n}\n\nconst UInt32Deserializer = (b: ByteBuffer) => {\n return b.readUint32()\n}\n\nconst BinaryDeserializer = (b: ByteBuffer) => {\n const len = b.readVarint32()\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n}\n\nconst BufferDeserializer = (keyDeserializers: any) => (buf: Uint8Array) => {\n const obj: any = {}\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n buffer.append(buf)\n buffer.flip()\n for (const [key, deserializer] of keyDeserializers) {\n try {\n obj[key] = deserializer(buffer)\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n return obj\n}\n\nfunction fixedBuf(b: ByteBuffer, len: number) {\n if (!b) {\n throw Error('No buffer found on first parameter')\n } else {\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n }\n}\n\nconst EncryptedMemoDeserializer = BufferDeserializer([\n ['from', PublicKeyDeserializer],\n ['to', PublicKeyDeserializer],\n ['nonce', UInt64Deserializer],\n ['check', UInt32Deserializer],\n ['encrypted', BinaryDeserializer]\n])\n\nexport const Deserializer = {\n Memo: EncryptedMemoDeserializer\n}\n","import bs58 from 'bs58'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Serializer } from './serializer'\nimport { PrivateKey } from './PrivateKey'\nimport * as Aes from './aes'\nimport { PublicKey } from './PublicKey'\nimport { Deserializer } from './deserializer'\n\nexport type Memo = {\n /**\n * Encrypts a memo for secure private messaging\n */\n encode(\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n ): string\n\n /**\n * Decrypts a memo message\n */\n decode(privateKey: string | PrivateKey, memo: string): string\n}\n\n/**\n * Encodes a memo using AES encryption for secure private messaging on Hive.\n * Messages must start with '#' to be encrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Sender's private memo key (string WIF format or PrivateKey instance)\n * @param publicKey - Recipient's public memo key (string or PublicKey instance)\n * @param memo - Message to encrypt (must start with '#' for encryption)\n * @param testNonce - Optional nonce for testing (advanced usage)\n * @returns Encrypted memo string prefixed with '#'\n * @throws Error if encryption is not supported in current environment\n */\nconst encode = (\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n publicKey = toPublicObj(publicKey)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.writeVString(memo)\n const memoBuffer = new Uint8Array(mbuf.copy(0, mbuf.offset).toBuffer())\n const { nonce, message, checksum } = Aes.encrypt(privateKey, publicKey, memoBuffer, testNonce)\n const mbuf2 = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n Serializer.Memo(mbuf2, {\n check: checksum,\n encrypted: message,\n from: privateKey.createPublic(),\n nonce,\n to: publicKey\n })\n mbuf2.flip()\n const data = new Uint8Array(mbuf2.toBuffer())\n return '#' + bs58.encode(data)\n}\n\n/**\n * Decrypts an encrypted memo using AES decryption.\n * Messages must start with '#' to be decrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Recipient's private memo key (string WIF format or PrivateKey instance)\n * @param memo - Encrypted memo string (must start with '#' for decryption)\n * @returns Decrypted memo content with '#' prefix\n * @throws Error if decryption fails or encryption not supported in current environment\n */\nconst decode = (privateKey: string | PrivateKey, memo: string): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n // memo = bs58.decode(memo)\n let memoBuffer = Deserializer.Memo(bs58.decode(memo))\n const { from, to, nonce, check, encrypted } = memoBuffer\n const pubkey = privateKey.createPublic().toString()\n const otherpub =\n pubkey === new PublicKey(from.key).toString() ? new PublicKey(to.key) : new PublicKey(from.key)\n memoBuffer = Aes.decrypt(privateKey, otherpub, nonce, encrypted, check)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.append(memoBuffer)\n mbuf.flip()\n return '#' + mbuf.readVString()\n}\n\nlet encodeTest: boolean | undefined\nconst checkEncryption = () => {\n if (encodeTest === undefined) {\n let plaintext\n encodeTest = true // prevent infinate looping\n try {\n const wif = '5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw'\n const pubkey = 'STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA'\n const cyphertext = encode(wif, pubkey, '#memo爱')\n plaintext = decode(wif, cyphertext)\n } finally {\n encodeTest = plaintext === '#memo爱'\n }\n }\n if (encodeTest === false) {\n throw new Error('This environment does not support encryption.')\n }\n}\n\nconst toPrivateObj = (o: string | PrivateKey): PrivateKey => {\n if (typeof o === 'string') {\n return PrivateKey.fromString(o)\n } else {\n return o\n }\n}\nconst toPublicObj = (o: string | PublicKey): PublicKey => {\n if (typeof o === 'string') {\n return PublicKey.fromString(o)\n } else {\n return o\n }\n}\n\n/**\n * Memo utilities for encrypting and decrypting private messages between Hive users.\n * Uses AES encryption with ECDH key exchange for secure communication.\n *\n * Messages must start with '#' to be encrypted/decrypted.\n * Plain text messages (without '#') are returned unchanged.\n *\n * @example\n * ```typescript\n * import { Memo, PrivateKey, PublicKey } from 'hive-tx'\n *\n * // Encrypt a message\n * const encrypted = Memo.encode(senderPrivateKey, recipientPublicKey, '#Hello World')\n *\n * // Decrypt a message\n * const decrypted = Memo.decode(recipientPrivateKey, encrypted)\n * console.log(decrypted) // '#Hello World'\n * ```\n */\nexport const Memo = {\n decode,\n encode\n}\n","import { Serializer } from './serializer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\nimport { bytesToHex } from '@noble/hashes/utils.js'\n\nexport interface WitnessProps {\n account_creation_fee?: string\n account_subsidy_budget?: number\n account_subsidy_decay?: number\n key: PublicKey | string\n maximum_block_size?: number\n new_signing_key?: PublicKey | string | null\n hbd_exchange_rate?: { base: string; quote: string }\n hbd_interest_rate?: number\n url?: string\n}\n\n/** Return null for a valid username */\nexport const validateUsername = (username: string): null | string => {\n let suffix = 'Account name should '\n if (!username) {\n return suffix + 'not be empty.'\n }\n const length = username.length\n if (length < 3) {\n return suffix + 'be longer.'\n }\n if (length > 16) {\n return suffix + 'be shorter.'\n }\n if (/\\./.test(username)) {\n suffix = 'Each account segment should '\n }\n const ref = username.split('.')\n const len = ref.length\n for (let i = 0; i < len; i++) {\n const label = ref[i]\n if (!/^[a-z]/.test(label)) {\n return suffix + 'start with a lowercase letter.'\n }\n if (!/^[a-z0-9-]*$/.test(label)) {\n return suffix + 'have only lowercase letters, digits, or dashes.'\n }\n if (!/[a-z0-9]$/.test(label)) {\n return suffix + 'end with a lowercase letter or digit.'\n }\n if (label.length < 3) {\n return suffix + 'be longer.'\n }\n }\n return null\n}\n\nexport const operations = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n pow: 14,\n custom: 15,\n report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49,\n // virtual ops\n fill_convert_request: 50,\n author_reward: 51,\n curation_reward: 52,\n comment_reward: 53,\n liquidity_reward: 54,\n interest: 55,\n fill_vesting_withdraw: 56,\n fill_order: 57,\n shutdown_witness: 58,\n fill_transfer_from_savings: 59,\n hardfork: 60,\n comment_payout_update: 61,\n return_vesting_delegation: 62,\n comment_benefactor_reward: 63,\n producer_reward: 64,\n clear_null_account_balance: 65,\n proposal_pay: 66,\n sps_fund: 67,\n hardfork_hive: 68,\n hardfork_hive_restore: 69,\n delayed_voting: 70,\n consolidate_treasury_balance: 71,\n effective_comment_vote: 72,\n ineffective_delete_comment: 73,\n sps_convert: 74,\n expired_account_notification: 75,\n changed_recovery_account: 76,\n transfer_to_vesting_completed: 77,\n pow_reward: 78,\n vesting_shares_split: 79,\n account_created: 80,\n fill_collateralized_convert_request: 81,\n system_warning: 82,\n fill_recurrent_transfer: 83,\n failed_recurrent_transfer: 84,\n limit_order_cancelled: 85,\n producer_missed: 86,\n proposal_fee: 87,\n collateralized_convert_immediate_conversion: 88,\n escrow_approved: 89,\n escrow_rejected: 90,\n proxy_cleared: 91,\n declined_voting_rights: 92\n}\n\n/**\n * Make bitmask filter to be used with get_account_history call\n */\nexport const makeBitMaskFilter = (allowedOperations: number[]): [string | null, string | null] => {\n return allowedOperations\n .reduce(reduceFunction, [BigInt(0), BigInt(0)])\n .map((value: bigint) => (value !== BigInt(0) ? value.toString() : null)) as [string | null, string | null]\n}\nconst reduceFunction = (\n [low, high]: [bigint, bigint],\n allowedOperation: number\n): [bigint, bigint] => {\n if (allowedOperation < 64) {\n return [low | (BigInt(1) << BigInt(allowedOperation)), high]\n } else {\n return [low, high | (BigInt(1) << BigInt(allowedOperation - 64))]\n }\n}\n\nexport const buildWitnessSetProperties = (\n owner: string,\n props: WitnessProps\n): ['witness_set_properties', { extensions: never[]; owner: string; props: any }] => {\n const data = {\n extensions: [],\n owner,\n props: []\n }\n for (const key of Object.keys(props)) {\n if ((props as any)[key] === undefined) continue\n let type\n switch (key) {\n case 'key':\n case 'new_signing_key':\n type = Serializer.PublicKey\n break\n case 'account_subsidy_budget':\n case 'account_subsidy_decay':\n case 'maximum_block_size':\n type = Serializer.UInt32\n break\n case 'hbd_interest_rate':\n type = Serializer.UInt16\n break\n case 'url':\n type = Serializer.String\n break\n case 'hbd_exchange_rate':\n type = Serializer.Price\n break\n case 'account_creation_fee':\n type = Serializer.Asset\n break\n default:\n throw new Error(`Unknown witness prop: ${key}`)\n }\n data.props.push([key, serialize(type, props[key])])\n }\n data.props.sort((a: any, b: any) => a[0].localeCompare(b[0]))\n return ['witness_set_properties', data]\n}\n\nconst serialize = (serializer: any, data: any) => {\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n serializer(buffer, data)\n buffer.flip()\n // `props` values must be hex\n return bytesToHex(new Uint8Array(buffer.toBuffer()))\n}\n","/**\n * Re-exports hive-tx APIs and provides helper functions that bridge\n * API differences from the legacy dhive library.\n */\n\nimport {\n PrivateKey,\n Transaction,\n callRPCBroadcast,\n type BroadcastResult,\n} from \"../../hive-tx\";\nimport type { Operation, OperationName, OperationBody } from \"../../hive-tx\";\nimport { sha256 as nobleSha256 } from \"@noble/hashes/sha2.js\";\n\n// ── Re-exports ─────────────────────────────────────────────────────────────\n\nexport {\n Transaction as HiveTxTransaction,\n PrivateKey,\n PublicKey,\n Signature,\n Memo,\n config as hiveTxConfig,\n callRPC,\n callRPCBroadcast,\n callREST,\n callWithQuorum,\n utils as hiveTxUtils,\n} from \"../../hive-tx\";\n\nexport type {\n Operation,\n OperationName,\n OperationBody,\n AssetSymbol,\n BroadcastResult,\n AccountCreateOperation,\n CustomJsonOperation,\n // Referenced in ConfigManager.setResilience's public signature — must be\n // nameable from the main entry, not only from @ecency/sdk/hive.\n ResilienceOptions,\n} from \"../../hive-tx\";\n\n// ── Compat types (matching dhive shapes used throughout the codebase) ──────\n\n/** Compatible with dhive's TransactionConfirmation from broadcast_transaction_synchronous */\nexport interface TransactionConfirmation {\n id: string;\n block_num: number;\n trx_num: number;\n expired: boolean;\n}\n\n/** Authority role type used in key management */\nexport type AuthorityType = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\n/** SMT asset format (NAI representation) used in transaction history */\nexport interface SMTAsset {\n amount: string;\n precision: number;\n nai: string;\n}\n\n/** RC account data from rc_api.find_rc_accounts */\nexport interface RCAccount {\n account: string;\n rc_manabar: {\n current_mana: string | number;\n last_update_time: number;\n };\n max_rc: string | number;\n max_rc_creation_adjustment: {\n amount: string;\n precision: number;\n nai: string;\n };\n delegated_rc: number;\n received_delegated_rc: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Compute SHA-256 hash of a string or Uint8Array.\n * Drop-in replacement for dhive's `cryptoUtils.sha256()`.\n */\nexport function sha256(input: string | Uint8Array): Uint8Array {\n let data: Uint8Array;\n if (typeof input === \"string\") {\n // Inline UTF-8 encode — avoids TextEncoder which is unavailable on some\n // runtimes (React Native / Hermes).\n const bytes: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c < 0x80) {\n bytes.push(c);\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const next = input.charCodeAt(++i);\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff);\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n }\n }\n data = new Uint8Array(bytes);\n } else {\n data = input;\n }\n return nobleSha256(data);\n}\n\n/** Check if a string is a valid WIF-encoded private key. */\nexport function isWif(key: string): boolean {\n try {\n PrivateKey.fromString(key);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sign and broadcast operations, returning a dhive-compatible TransactionConfirmation.\n *\n * Uses broadcast_transaction_synchronous so the response includes block_num/trx_num,\n * matching the shape that the rest of the codebase expects from dhive's\n * `client.broadcast.sendOperations()`.\n *\n * @deprecated Prefer {@link broadcastOperationsAsync} (the default for\n * `useBroadcastMutation`); poll `transaction_status_api` if you need block\n * confirmation. Kept only for explicit `broadcastMode: 'sync'` opt-ins.\n */\nexport async function broadcastOperations(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return callRPCBroadcast(\"condenser_api.broadcast_transaction_synchronous\", [\n tx.transaction,\n ]);\n}\n\n/**\n * Sign and broadcast operations without waiting for block inclusion.\n *\n * Uses broadcast_transaction which returns as soon as the node accepts the\n * transaction into its mempool. Transport and RPC errors (network failures,\n * invalid operations, expired transactions) are still thrown immediately -\n * the only thing skipped is the wait for the transaction to appear in a block.\n *\n * Returns { tx_id, status: 'unknown' }. To confirm block inclusion afterward,\n * poll transaction_status_api with the returned tx_id.\n *\n * Prefer this for operations where faster response matters more than\n * immediate confirmation (e.g. votes, reblogs, follows).\n *\n * Use broadcastOperations() when you need block_num/trx_num confirmation\n * (e.g. transfers, account updates, key changes).\n */\nexport async function broadcastOperationsAsync(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return tx.broadcast(false);\n}\n\n// ── Mana calculations (ported from dhive's RCAPI) ──────────────────────────\n\ninterface Manabar {\n current_mana: string | number;\n last_update_time: number;\n}\n\ninterface ManaResult {\n current_mana: number;\n max_mana: number;\n percentage: number;\n}\n\nconst MANA_REGENERATION_SECONDS = 432000; // 5 days\n\nfunction calculateManabar(maxMana: number, manabar: Manabar): ManaResult {\n const delta = Date.now() / 1000 - manabar.last_update_time;\n let currentMana =\n Number(manabar.current_mana) +\n (delta * maxMana) / MANA_REGENERATION_SECONDS;\n let percentage = Math.round((currentMana / maxMana) * 10000);\n if (!isFinite(percentage) || percentage < 0) {\n percentage = 0;\n } else if (percentage > 10000) {\n percentage = 10000;\n }\n return { current_mana: currentMana, max_mana: maxMana, percentage };\n}\n\n/**\n * Get effective vesting shares for an account (matching dhive's getVests).\n * Subtracts delegated, adds received, accounts for pending withdrawals.\n */\nfunction getVests(account: any): number {\n const vests = parseFloat(account.vesting_shares);\n const delegated = parseFloat(account.delegated_vesting_shares);\n const received = parseFloat(account.received_vesting_shares);\n const withdrawRate = parseFloat(account.vesting_withdraw_rate);\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n return vests - withdrawVests - delegated + received;\n}\n\n/** Calculate voting power mana (equivalent to dhive client.rc.calculateVPMana) */\nexport function calculateVPMana(account: any): ManaResult {\n const maxMana = getVests(account) * 1e6;\n return calculateManabar(maxMana, account.voting_manabar);\n}\n\n/** Calculate RC mana (equivalent to dhive client.rc.calculateRCMana) */\nexport function calculateRCMana(rcAccount: RCAccount): ManaResult {\n return calculateManabar(\n Number(rcAccount.max_rc),\n rcAccount.rc_manabar\n );\n}\n\n// setHiveTxNodes and initHiveTx removed — config is now unified.\n// Use hiveTxConfig directly or ConfigManager.setHiveNodes().\n","/**\n * Chain error handling utilities\n * Extracted from web's operations.ts and mobile's dhive.ts error handling patterns\n */\n\nexport enum ErrorType {\n COMMON = \"common\",\n INFO = \"info\",\n INSUFFICIENT_RESOURCE_CREDITS = \"insufficient_resource_credits\",\n MISSING_AUTHORITY = \"missing_authority\",\n TOKEN_EXPIRED = \"token_expired\",\n NETWORK = \"network\",\n TIMEOUT = \"timeout\",\n VALIDATION = \"validation\",\n}\n\nexport interface ParsedChainError {\n message: string;\n type: ErrorType;\n originalError?: any;\n}\n\n/**\n * Parses Hive blockchain errors into standardized format.\n * Extracted from web's operations.ts and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string from a blockchain operation\n * @returns Parsed error with user-friendly message and categorized type\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * const parsed = parseChainError(error);\n * console.log(parsed.message); // \"Insufficient Resource Credits. Please wait or power up.\"\n * console.log(parsed.type); // ErrorType.INSUFFICIENT_RESOURCE_CREDITS\n * }\n * ```\n */\nexport function parseChainError(error: any): ParsedChainError {\n // Extract error strings from various error formats\n // Check both error_description and message independently for pattern matching\n const errorDescription = error?.error_description ? String(error.error_description) : '';\n const errorMessage = error?.message ? String(error.message) : '';\n // HiveSigner throws plain objects like { error: \"unauthorized\", error_description: \"...\" }\n const errorCode = error?.error ? String(error.error) : '';\n const errorString = errorDescription || errorMessage || String(error || '');\n\n // Helper function to test patterns against all error fields\n const testPattern = (pattern: RegExp): boolean => {\n // Check error code first (e.g. HiveSigner's { error: \"unauthorized\" })\n if (errorCode && pattern.test(errorCode)) return true;\n // Check error_description (priority)\n if (errorDescription && pattern.test(errorDescription)) return true;\n // Then check message\n if (errorMessage && pattern.test(errorMessage)) return true;\n // Finally check fallback errorString (handles plain string inputs)\n if (errorString && pattern.test(errorString)) return true;\n return false;\n };\n\n // Resource credits (from both web and mobile patterns)\n if (\n testPattern(/please wait to transact/i) ||\n testPattern(/insufficient rc/i) ||\n testPattern(/rc mana|rc account|resource credits/i)\n ) {\n return {\n message: \"Insufficient Resource Credits. Please wait or power up.\",\n type: ErrorType.INSUFFICIENT_RESOURCE_CREDITS,\n originalError: error,\n };\n }\n\n // Min comment interval (from web operations.ts line 29)\n if (testPattern(/you may only post once every/i)) {\n return {\n message: \"Please wait before posting again (minimum 3 second interval between comments).\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Identical vote (from web operations.ts line 31)\n if (testPattern(/your current vote on this comment is identical/i)) {\n return {\n message: \"You have already voted with the same weight.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Must claim something (from web operations.ts line 33)\n if (testPattern(/must claim something/i)) {\n return {\n message: \"You must claim rewards before performing this action.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot claim that much VESTS (from web operations.ts line 35)\n if (testPattern(/cannot claim that much vests/i)) {\n return {\n message: \"Cannot claim that amount. Please check your pending rewards.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot delete comment with positive votes (from web operations.ts line 42)\n if (testPattern(/cannot delete a comment with net positive/i)) {\n return {\n message: \"Cannot delete a comment with positive votes.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Comment has children (from web operations.ts line 44)\n if (testPattern(/children == 0/i)) {\n return {\n message: \"Cannot delete a comment with replies.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Comment already paid out (from web operations.ts line 46)\n if (testPattern(/comment_cashout/i)) {\n return {\n message: \"Cannot modify a comment that has already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Voting on paid out post (from web operations.ts line 48)\n if (testPattern(/votes evaluating for comment that is paid out is forbidden/i)) {\n return {\n message: \"Cannot vote on posts that have already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // No key available (SDK internal - from broadcastWithMethod when key not stored)\n if (testPattern(/no (active|owner|posting|memo) key available/i)) {\n return {\n message: \"Key not available. Please provide your key to sign this operation.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing active authority. Hive nodes return \"missing required active\n // authority\"; web operations.ts also throws the short form. Match both so the\n // auth fallback (auth-upgrade dialog) fires instead of misclassifying as a\n // generic chain error.\n if (testPattern(/missing (required )?active authority/i)) {\n return {\n message: \"Missing active authority. This operation requires your active key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing owner authority (\"missing required owner authority\" or short form)\n if (testPattern(/missing (required )?owner authority/i)) {\n return {\n message: \"Missing owner authority. This operation requires your owner key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing posting authority (general pattern)\n if (testPattern(/missing (required )?posting authority/i)) {\n return {\n message: \"Missing posting authority. Please check your login method.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Token expired / unauthorized (HiveSigner OAuth2 errors + general patterns)\n // HiveSigner returns: { error: \"invalid_grant\" } for invalid/expired tokens,\n // { error: \"unauthorized_access\" } for IP-based access denial\n if (\n errorCode === 'invalid_grant' ||\n errorCode === 'unauthorized_access' ||\n testPattern(/token expired/i) ||\n testPattern(/invalid token/i) ||\n testPattern(/\\bunauthorized\\b/i) ||\n testPattern(/\\bforbidden\\b/i)\n ) {\n return {\n message: \"Authentication token expired. Please log in again.\",\n type: ErrorType.TOKEN_EXPIRED,\n originalError: error,\n };\n }\n\n // Already reblogged\n if (testPattern(/has already reblogged/i) || testPattern(/already reblogged this post/i)) {\n return {\n message: \"You have already reblogged this post.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Duplicate transaction\n if (testPattern(/duplicate transaction/i)) {\n return {\n message: \"This transaction has already been processed.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Network errors (more specific patterns to avoid false positives)\n if (\n testPattern(/econnrefused/i) ||\n testPattern(/connection refused/i) ||\n testPattern(/failed to fetch/i) ||\n testPattern(/\\bnetwork[-\\s]?(request|error|timeout|unreachable|down|failed)\\b/i)\n ) {\n return {\n message: \"Network error. Please check your connection and try again.\",\n type: ErrorType.NETWORK,\n originalError: error,\n };\n }\n\n // Timeout errors\n if (testPattern(/timeout/i) || testPattern(/timed out/i)) {\n return {\n message: \"Request timed out. Please try again.\",\n type: ErrorType.TIMEOUT,\n originalError: error,\n };\n }\n\n // Account doesn't exist\n if (testPattern(/account.*does not exist/i) || testPattern(/account not found/i)) {\n return {\n message: \"Account not found. Please check the username.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Invalid memo key\n if (testPattern(/invalid memo key/i)) {\n return {\n message: \"Invalid memo key. Cannot encrypt message.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Insufficient funds (require both words in same string to avoid cross-field false positives)\n if (testPattern(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i)) {\n return {\n message: \"Insufficient funds for this transaction.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Generic validation errors (use word boundaries to be more specific)\n if (testPattern(/\\b(invalid|validation)\\b/i)) {\n // Truncate to 150 chars like other branches\n const message = (error?.message || errorString).substring(0, 150) || \"Validation error occurred\";\n return {\n message,\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Default: return original error message\n // Check for error_description first (from web operations.ts line 65-72)\n if (error?.error_description && typeof error.error_description === \"string\") {\n return {\n message: error.error_description.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Then check message field\n if (error?.message && typeof error.message === \"string\") {\n return {\n message: error.message.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Handle plain objects without message property (avoid \"[object Object]\")\n let message: string;\n if (typeof error === 'object' && error !== null) {\n // Check for common error properties\n if (error.error_description) {\n message = String(error.error_description);\n } else if (error.code) {\n message = `Error code: ${error.code}`;\n } else if (errorString && errorString !== '[object Object]') {\n message = errorString.substring(0, 150);\n } else {\n message = \"Unknown error occurred\";\n }\n } else {\n message = errorString.substring(0, 150) || \"Unknown error occurred\";\n }\n\n return {\n message,\n type: ErrorType.COMMON,\n originalError: error,\n };\n}\n\n/**\n * Formats error for display to user.\n * Returns tuple of [message, type] for backward compatibility with existing code.\n *\n * This function maintains compatibility with the old formatError signature from\n * web's operations.ts (line 59-84) and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string\n * @returns Tuple of [user-friendly message, error type]\n *\n * @example\n * ```typescript\n * try {\n * await transfer(...);\n * } catch (error) {\n * const [message, type] = formatError(error);\n * showToast(message, type);\n * }\n * ```\n */\nexport function formatError(error: any): [string, ErrorType] {\n const parsed = parseChainError(error);\n return [parsed.message, parsed.type];\n}\n\n/**\n * Checks if error indicates missing authority and should trigger auth fallback.\n * Used by the SDK's useBroadcastMutation to determine if it should retry with\n * an alternate authentication method.\n *\n * @param error - The error object or string\n * @returns true if auth fallback should be attempted\n *\n * @example\n * ```typescript\n * try {\n * await broadcast(operations);\n * } catch (error) {\n * if (shouldTriggerAuthFallback(error)) {\n * // Try with alternate auth method\n * await broadcastWithHiveAuth(operations);\n * }\n * }\n * ```\n */\nexport function shouldTriggerAuthFallback(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.MISSING_AUTHORITY || type === ErrorType.TOKEN_EXPIRED;\n}\n\n/**\n * Checks if error is a resource credits (RC) error.\n * Useful for showing specific UI feedback about RC issues.\n *\n * @param error - The error object or string\n * @returns true if the error is related to insufficient RC\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * if (isResourceCreditsError(error)) {\n * showRCWarning(); // Show specific RC education/power up UI\n * }\n * }\n * ```\n */\nexport function isResourceCreditsError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INSUFFICIENT_RESOURCE_CREDITS;\n}\n\n/**\n * Checks if error is informational (not critical).\n * Informational errors typically don't need retry logic.\n *\n * @param error - The error object or string\n * @returns true if the error is informational\n */\nexport function isInfoError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INFO;\n}\n\n/**\n * Checks if error is network-related and should be retried.\n *\n * @param error - The error object or string\n * @returns true if the error is network-related\n */\nexport function isNetworkError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.NETWORK || type === ErrorType.TIMEOUT;\n}\n","import {\n useMutation,\n type MutationKey,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { PrivateKey, RPCError } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { broadcastOperations, broadcastOperationsAsync, type TransactionConfirmation } from \"@/modules/core/hive-tx\";\nimport type { BroadcastResult } from \"../../../hive-tx\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { shouldTriggerAuthFallback } from \"@/modules/core/errors\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport hs from \"hivesigner\";\n\n/**\n * Broadcast mode controls whether the SDK waits for block inclusion.\n *\n * - `'async'` (default): Uses `broadcast_transaction` — returns once the node\n * accepts the transaction into its mempool. Transport and RPC errors are\n * still thrown immediately; only the block-inclusion wait is skipped.\n *\n * - `'sync'`: Uses `broadcast_transaction_synchronous` — waits for block\n * inclusion and returns `block_num`/`trx_num`. Deprecated; prefer `'async'`\n * and poll `transaction_status_api` if you need block confirmation.\n */\nexport type BroadcastMode = 'sync' | 'async';\n\n/**\n * Broadcasts operations using a specific auth method.\n *\n * @param method - Auth method to use ('key', 'hiveauth', 'hivesigner', 'keychain', 'custom')\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and configuration\n * @param authority - Key authority to use (posting, active, owner, or memo)\n * @param fetchedKey - Optional pre-fetched key to avoid duplicate fetches\n * @param fetchedToken - Optional pre-fetched access token to avoid duplicate fetches\n * @param broadcastMode - Whether to wait for block inclusion ('sync') or just mempool acceptance ('async')\n * @returns Transaction confirmation from the blockchain\n * @throws Error if method is not available or broadcast fails\n */\nasync function broadcastWithMethod(\n method: string,\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n fetchedKey?: string | null,\n fetchedToken?: string | null,\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n switch (method) {\n case 'key': {\n if (!adapter) {\n throw new Error('No adapter provided for key-based auth');\n }\n\n // Use pre-fetched key if provided, otherwise fetch it\n let key: string | null | undefined = fetchedKey;\n\n if (key === undefined) {\n // Key not pre-fetched, fetch it now based on authority\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n } else {\n throw new Error(\n `Owner key not supported by adapter. Owner operations (like account recovery) ` +\n `require master password login or manual key entry.`\n );\n }\n break;\n\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n } else {\n throw new Error(\n `Memo key not supported by adapter. Use memo encryption methods instead.`\n );\n }\n break;\n\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n }\n\n if (!key) {\n throw new Error(`No ${authority} key available for ${username}`);\n }\n\n // Attempt broadcast with key\n const privateKey = PrivateKey.fromString(key);\n if (broadcastMode === 'async') {\n return await broadcastOperationsAsync(ops, privateKey);\n }\n return await broadcastOperations(ops, privateKey);\n }\n\n case 'hiveauth': {\n if (!adapter?.broadcastWithHiveAuth) {\n throw new Error('HiveAuth not supported by adapter');\n }\n return await adapter.broadcastWithHiveAuth(username, ops, authority);\n }\n\n case 'hivesigner': {\n if (!adapter) {\n throw new Error('No adapter provided for HiveSigner auth');\n }\n\n // Access tokens only have posting authority — for active/owner/memo ops,\n // go directly to platform-specific HiveSigner broadcast (e.g., redirect to hivesigner.com)\n if (authority !== 'posting') {\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw new Error(`HiveSigner access token cannot sign ${authority} operations. No platform broadcast available.`);\n }\n\n // Try direct API broadcast with access token first (posting ops only)\n const token = fetchedToken !== undefined\n ? fetchedToken\n : await adapter.getAccessToken(username);\n\n if (token) {\n try {\n const client = new hs.Client({ accessToken: token });\n const response = await client.broadcast(ops);\n return response.result;\n } catch (tokenError) {\n // Token broadcast failed — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner && shouldTriggerAuthFallback(tokenError)) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw tokenError;\n }\n }\n\n // No token available — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n\n throw new Error(`No access token available for ${username}`);\n }\n\n case 'keychain': {\n if (!adapter?.broadcastWithKeychain) {\n throw new Error('Keychain not supported by adapter');\n }\n return await adapter.broadcastWithKeychain(username, ops, authority);\n }\n\n case 'custom': {\n if (!auth?.broadcast) {\n throw new Error('No custom broadcast function provided');\n }\n return (await auth.broadcast(ops, authority)) as TransactionConfirmation;\n }\n\n default:\n throw new Error(`Unknown auth method: ${method}`);\n }\n}\n\n/**\n * Attempts to broadcast operations using multiple auth methods in fallback chain.\n * Implements sophisticated fallback pattern from mobile app.\n *\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and fallback configuration\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n * @returns Transaction confirmation from the blockchain\n * @throws Error if all auth methods fail or if a non-auth error occurs\n *\n * @remarks\n * **Preferred Behavior (when adapter.getLoginType exists):**\n * - Calls adapter.getLoginType() to determine user's actual auth method\n * - Uses ONLY that method (no fallbacks) - more predictable and faster\n * - If it fails, throws the error immediately\n *\n * **Fallback Behavior (for backward compatibility):**\n * - Tries each auth method in the fallback chain order\n * - Only continues to next method if error is auth-related (missing authority, token expired)\n * - Stops immediately for non-auth errors (RC exhaustion, network errors, validation errors)\n * - Collects all errors and provides detailed failure message\n *\n * @example\n * ```typescript\n * // Preferred: Adapter with getLoginType (single method, no fallbacks)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter, // includes getLoginType()\n * };\n *\n * // Legacy: Explicit fallback chain (tries multiple methods)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter,\n * fallbackChain: ['key', 'hiveauth', 'hivesigner'],\n * };\n * ```\n */\nasync function broadcastWithFallback(\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n // PREFERRED APPROACH: If adapter provides getLoginType, use smart auth strategy\n // This avoids unnecessary fallback attempts and is more predictable\n if (adapter?.getLoginType) {\n const loginType = await adapter.getLoginType(username, authority);\n\n if (loginType) {\n // SMART AUTH STRATEGY: Optimize based on login type + authority + credentials\n\n // Check if user has granted ecency.app posting authority\n const hasPostingAuth = adapter.hasPostingAuthorization\n ? await adapter.hasPostingAuthorization(username)\n : false;\n\n // OPTIMIZATION: Use HiveSigner token for posting ops when posting auth is granted\n // This is faster than direct key signing or HiveAuth for key-based logins\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'key'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to direct key signing if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to key:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for keychain/MetaMask users with posting auth (faster, no popup)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'keychain'\n ) {\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n console.warn('[SDK] HiveSigner token auth failed, falling back to keychain/snap:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for HiveAuth users with posting auth (faster)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'hiveauth'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to HiveAuth if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to HiveAuth:', error);\n }\n }\n\n // Use user's actual login method\n try {\n return await broadcastWithMethod(loginType, username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Check if error is due to missing authority (e.g., posting key trying active op)\n if (shouldTriggerAuthFallback(error)) {\n // Show auth upgrade UI if available (only for posting/active operations)\n if (\n adapter.showAuthUpgradeUI &&\n (authority === 'posting' || authority === 'active')\n ) {\n // Guard against empty operations array\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n\n // User selected a specific method - delegate to broadcastWithMethod\n // This handles all auth methods (hiveauth, hivesigner, key, keychain, custom, etc.)\n // broadcastWithMethod already contains all necessary validation and method-specific logic\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // Not an auth error, or no upgrade UI available - throw original error\n throw error;\n }\n }\n\n // loginType is null — user's auth method is unknown (e.g., incomplete login data)\n if (authority === 'posting') {\n // For posting ops, try HiveSigner — access token is usually available for all logins\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (hsError) {\n if (shouldTriggerAuthFallback(hsError) && adapter.showAuthUpgradeUI) {\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`No login type available for ${username}. Please log in again.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n throw hsError;\n }\n } else if (authority === 'active' && adapter.showAuthUpgradeUI) {\n // For active ops, show auth upgrade dialog — no silent fallback possible\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // FALLBACK APPROACH: For backward compatibility, use fallback chain\n // This is only used if adapter doesn't provide getLoginType\n const chain = auth?.fallbackChain ?? ['key', 'hiveauth', 'hivesigner', 'keychain', 'custom'];\n const errors: Map = new Map();\n\n for (const method of chain) {\n try {\n // Check if method is available before attempting\n let shouldSkip = false;\n let skipReason = '';\n let prefetchedKey: string | null | undefined;\n let prefetchedToken: string | null | undefined;\n\n switch (method) {\n case 'key':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch key to check availability (will be reused in broadcast)\n let key: string | null | undefined;\n\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n }\n break;\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n }\n break;\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n\n if (!key) {\n shouldSkip = true;\n skipReason = `No ${authority} key available`;\n } else {\n prefetchedKey = key; // Store for reuse\n }\n }\n break;\n case 'hiveauth':\n if (!adapter?.broadcastWithHiveAuth) {\n shouldSkip = true;\n skipReason = 'HiveAuth not supported by adapter';\n }\n break;\n case 'hivesigner':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch token if available (will be reused in broadcast)\n const token = await adapter.getAccessToken(username);\n if (token) {\n prefetchedToken = token; // Store for reuse\n }\n // When no token but adapter exists, don't skip —\n // broadcastWithMethod can fall back to adapter.broadcastWithHiveSigner\n }\n break;\n case 'keychain':\n if (!adapter?.broadcastWithKeychain) {\n shouldSkip = true;\n skipReason = 'Keychain not supported by adapter';\n }\n break;\n case 'custom':\n if (!auth?.broadcast) {\n shouldSkip = true;\n skipReason = 'No custom broadcast function provided';\n }\n break;\n }\n\n if (shouldSkip) {\n errors.set(method, new Error(`Skipped: ${skipReason}`));\n continue;\n }\n\n // Method is available, attempt broadcast with pre-fetched credentials\n return await broadcastWithMethod(method, username, ops, auth, authority, prefetchedKey, prefetchedToken, broadcastMode);\n } catch (error) {\n // Record actual error from failed broadcast attempt\n errors.set(method, error as Error);\n\n // Only continue fallback if error suggests trying another method\n if (!shouldTriggerAuthFallback(error)) {\n // If it's not an auth error, throw immediately (e.g., RC error, network error)\n throw error;\n }\n }\n }\n\n // FIX #2: Improved error message distinguishes between skips and real failures\n const hasRealAttempts = Array.from(errors.values()).some(\n error => !error.message.startsWith('Skipped:')\n );\n\n if (!hasRealAttempts) {\n // All methods were skipped (none attempted)\n const skipReasons = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n throw new Error(\n `[SDK][Broadcast] No auth methods attempted for ${username}. ${skipReasons}`\n );\n }\n\n // At least one method was attempted but all failed\n const errorMessages = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n\n throw new Error(\n `[SDK][Broadcast] All auth methods failed for ${username}. Errors: ${errorMessages}`\n );\n}\n\n/**\n * React Query mutation hook for broadcasting Hive operations.\n * Supports multiple authentication methods with automatic fallback.\n *\n * @template T - Type of the mutation payload\n * @param mutationKey - React Query mutation key for cache management\n * @param username - Hive username (required for broadcast)\n * @param operations - Function that converts payload to Hive operations\n * @param onSuccess - Success callback after broadcast completes\n * @param auth - Authentication context (supports both legacy AuthContext and new AuthContextV2)\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Authentication Flow:**\n *\n * 1. **With AuthContextV2 + adapter + enableFallback** (recommended for new code):\n * - Tries auth methods in fallbackChain order\n * - Smart fallback: only retries on auth errors, not RC/network errors\n * - Uses platform adapter for storage, UI, and broadcasting\n *\n * 2. **With legacy AuthContext** (backward compatible):\n * - Tries auth.broadcast() first (custom implementation)\n * - Falls back to postingKey if available\n * - Falls back to accessToken (HiveSigner) if available\n * - Throws if no auth method available\n *\n * **Backward Compatibility:**\n * - All existing code using AuthContext will continue to work\n * - AuthContextV2 extends AuthContext, so it's a drop-in replacement\n * - enableFallback defaults to false if no adapter provided\n *\n * @example\n * ```typescript\n * // New pattern with platform adapter and fallback\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * },\n * 'posting'\n * );\n *\n * // Legacy pattern (still works)\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * { postingKey: 'wif-key' }\n * );\n * ```\n */\nexport function useBroadcastMutation(\n mutationKey: MutationKey = [],\n username: string | undefined,\n operations: (payload: T) => Operation[],\n onSuccess: UseMutationOptions[\"onSuccess\"] = () => {},\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n options?: {\n onMutate?: UseMutationOptions[\"onMutate\"];\n onError?: UseMutationOptions[\"onError\"];\n onSettled?: UseMutationOptions[\"onSettled\"];\n /**\n * Controls whether to wait for block inclusion or just mempool acceptance.\n *\n * - `'async'` (default): Returns after mempool acceptance. Recommended for\n * all operations; errors are still thrown immediately.\n *\n * - `'sync'`: Waits for block inclusion, returns block_num/trx_num.\n * Deprecated; prefer `'async'`.\n */\n broadcastMode?: BroadcastMode;\n }\n) {\n const broadcastMode = options?.broadcastMode ?? 'async';\n\n return useMutation({\n onSuccess,\n onMutate: options?.onMutate,\n onError: options?.onError,\n onSettled: options?.onSettled,\n mutationKey: [...mutationKey, username],\n mutationFn: async (payload: T) => {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n\n const ops = operations(payload);\n\n try {\n // New: Try auth methods in fallback chain (if enabled)\n if (auth?.enableFallback !== false && auth?.adapter) {\n return await broadcastWithFallback(username, ops, auth, authority, broadcastMode);\n }\n\n // Legacy behavior: try methods in fixed order (backward compatible)\n if (auth?.broadcast) {\n return await auth.broadcast(ops, authority);\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n // Legacy auth only supports posting authority\n if (authority !== 'posting') {\n throw new Error(\n `[SDK][Broadcast] Legacy auth only supports posting authority, but '${authority}' was requested. ` +\n `Use AuthContextV2 with an adapter for ${authority} operations.`\n );\n }\n\n const privateKey = PrivateKey.fromString(postingKey);\n\n return await broadcastOperations(\n ops,\n privateKey\n );\n }\n\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const client = new hs.Client({ accessToken });\n const response = await client.broadcast(ops);\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n } catch (e) {\n if (e instanceof RPCError) {\n // Normalize raw blockchain rejections (missing authority, RC exhaustion,\n // validation failures) from every broadcast path — sync and async — into\n // a plain Error whose message is preserved for downstream classification\n // (formatError), so React Query captures a handled mutation error.\n throw new Error(e.message);\n }\n throw e\n }\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\nimport hs from \"hivesigner\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport async function broadcastJson(\n username: string | undefined,\n id: string,\n payload: T,\n auth?: AuthContextV2\n) {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n const jjson = {\n id,\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify(payload),\n };\n\n if (auth?.broadcast) {\n return auth.broadcast([[\"custom_json\", jjson]], \"posting\");\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n const privateKey = PrivateKey.fromString(postingKey);\n\n return broadcastOperations(\n [[\"custom_json\", jjson]],\n privateKey\n );\n }\n\n // With hivesigner access token\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const response = await new hs.Client({\n accessToken,\n }).customJson([], [username], id, JSON.stringify(payload));\n return response.result;\n }\n\n /*\n * Adapter, as a last resort rather than first.\n *\n * `auth.broadcast` above is the deprecated V1 field, and an AuthContextV2\n * does not carry it, so a Keychain user whose posting key is not stored and\n * who has no HiveSigner token reached the throw below instead of being asked\n * to sign. The web app passes V2 everywhere (`getSdkAuthContext`), so this is\n * reachable today from follow and unfollow.\n *\n * Placed last on purpose: every branch above already works for the sessions\n * that reach it, and reordering would change which method signs for people\n * it currently serves. This only claims cases that were previously errors.\n */\n const adapter = auth?.adapter;\n if (adapter) {\n const ops: Parameters>[1] =\n [[\"custom_json\", jjson]];\n\n if (auth?.loginType === \"keychain\" && adapter.broadcastWithKeychain) {\n return adapter.broadcastWithKeychain(username, ops, \"posting\");\n }\n if (auth?.loginType === \"hiveauth\" && adapter.broadcastWithHiveAuth) {\n return adapter.broadcastWithHiveAuth(username, ops, \"posting\");\n }\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n}\n","import type { BroadcastMode } from \"./use-broadcast-mutation\";\nimport type { PlatformAdapter } from \"@/modules/core/types\";\n\n/**\n * Delay (ms) before invalidating chain-derived queries after an async\n * broadcast. ~1.3 Hive blocks (3s/block) so the just-broadcast transaction has\n * landed in a block before we refetch — otherwise the refetch returns pre-tx\n * state (e.g. a stale wallet balance).\n */\nexport const BROADCAST_INCLUSION_DELAY_MS = 4000;\n\n/**\n * Invalidate queries after a broadcast, accounting for broadcast mode.\n *\n * - `'sync'`: the transaction already waited for block inclusion, so refetch\n * immediately (returns the adapter's promise so callers may await it).\n * - `'async'` (default) / undefined: the transaction is only in the mempool, so\n * a refetch now would read pre-tx state — defer by ~1 block.\n *\n * No-ops when the adapter can't invalidate.\n */\nexport function invalidateAfterBroadcast(\n adapter: PlatformAdapter | null | undefined,\n broadcastMode: BroadcastMode | undefined,\n keys: any[][]\n): void | Promise {\n if (!adapter?.invalidateQueries) return;\n if (broadcastMode === \"sync\") {\n // Method call (not an extracted reference) so `this` stays bound to adapter.\n return adapter.invalidateQueries(keys);\n }\n setTimeout(() => adapter.invalidateQueries?.(keys), BROADCAST_INCLUSION_DELAY_MS);\n}\n","export function withTimeoutSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n if (!signal) return timeoutSignal;\n\n // AbortSignal.any is available in Chrome 116+, Safari 17.4+, Firefox 124+.\n // Fall back to manual AbortController wiring for older browsers.\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([signal, timeoutSignal]);\n }\n\n const ac = new AbortController();\n const onAbort = () => {\n const reason = signal.aborted ? signal.reason : timeoutSignal.reason;\n ac.abort(reason);\n signal.removeEventListener(\"abort\", onAbort);\n timeoutSignal.removeEventListener(\"abort\", onAbort);\n };\n if (signal.aborted) {\n ac.abort(signal.reason);\n } else if (timeoutSignal.aborted) {\n ac.abort(timeoutSignal.reason);\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n timeoutSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return ac.signal;\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport {\n config as hiveTxConfig,\n setNodes as setHiveTxNodes,\n setRestNodes as setHiveTxRestNodes,\n setRestNodesByApi as setHiveTxRestNodesByApi,\n setUserAgent as setHiveTxUserAgent,\n setResilience as setHiveTxResilience,\n type ResilienceOptions,\n} from \"../../hive-tx\";\nimport type { APIMethods } from \"../../hive-tx/api-types\";\n\n// Safe environment variable access for browser builds\n// In browser builds, tsup will replace process.env.* with literal values at compile time\nconst isDevelopment = (() => {\n try {\n return process.env?.NODE_ENV === 'development';\n } catch {\n return false;\n }\n})();\n\nconst getHeliusApiKey = () => {\n try {\n return process.env?.VITE_HELIUS_API_KEY;\n } catch {\n return undefined;\n }\n};\n\n/** Timeout for internal API calls (search, private API). */\nexport const INTERNAL_API_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on `gcTime` for any query that runs during SSR.\n *\n * A long window is fine in a browser or native app, where the cache holds one\n * user's data and lives as long as the session. It is not fine in a server\n * renderer: every query schedules a gc timer, a pending timer is a GC root, and\n * `Query` holds the whole `QueryCache` — so one long-lived entry keeps\n * everything else that request cached reachable for its entire window. A server\n * process then settles at roughly `ingest rate × gcTime`, which is how\n * ecency.com's renderers ended up aborting on the old-space cap rather than\n * levelling off (2026-07-26).\n *\n * Two minutes is far longer than any single render, which is the only window a\n * server-side entry has to be reused before it is dehydrated into the payload.\n *\n * Note this bounds SDK queries at the source. `apps/web` additionally clamps\n * every query through `defaultQueryOptions`, which is what protects it from\n * options defined outside the SDK; hosts that do not clamp get the right\n * behaviour from these defaults alone.\n */\nexport const SERVER_GC_TIME_MS = 2 * 60 * 1000;\n\n/**\n * How `CONFIG.queryClient` is resolved.\n *\n * This used to be a plain `queryClient: new QueryClient()` property — a single\n * instance created at module import and shared by every caller for the lifetime\n * of the process. That is correct in a browser (one process, one user) but wrong\n * under SSR, where one process serves every request: each server render wrote its\n * fetched data into that one cache and nothing ever removed it, so the heap grew\n * monotonically until the renderer hit its old-space limit and aborted.\n *\n * A host that renders on the server registers a resolver (see\n * `ConfigManager.setQueryClientResolver`) which returns the *current request's*\n * client, so cached data dies with the request that produced it. Hosts that\n * genuinely want one long-lived client keep using `setQueryClient`, and callers\n * that configure nothing fall back to a lazily created instance.\n *\n * The resolver is consulted on every read rather than cached here on purpose:\n * request scoping is the host's concern, and only the host can know when one\n * request ends and the next begins.\n */\nlet queryClientResolver: (() => QueryClient) | undefined;\n\n/** Created on first use, and only when no resolver has been registered. */\nlet fallbackQueryClient: QueryClient | undefined;\n\nfunction resolveQueryClient(): QueryClient {\n if (queryClientResolver) {\n return queryClientResolver();\n }\n return (fallbackQueryClient ??= new QueryClient());\n}\n\nexport const CONFIG = {\n privateApiHost: \"https://ecency.com\",\n /**\n * Observer used for bridge calls when nobody is logged in. The bridge applies\n * this account's mute list to the response, marking muted authors' posts and\n * comments `stats.gray` so clients can dim or collapse them. Anonymous\n * visitors therefore inherit Ecency's moderation instead of seeing an\n * unfiltered firehose. Apps may override via `ConfigManager.setDefaultObserver`,\n * which expects a real account rather than \"\" (see that setter).\n *\n * Note this only *marks* content: the bridge still returns muted authors'\n * posts, so an observer never shortens a feed.\n */\n defaultObserver: \"ecency\",\n /**\n * First-party client identifier sent as the `X-Ecency-Client` header on\n * search/private API requests. Lets the origin distinguish Ecency's own\n * web/mobile/SSR traffic from third-party integrators (who should use the\n * keyed api.hivesearcher.com backend instead of the public proxy). This is\n * a routing marker, not a secret. Apps may override via\n * `ConfigManager.setClientId` (e.g. \"web\" or \"mobile\") for observability.\n */\n clientId: \"ecency-sdk\",\n imageHost: \"https://i.ecency.com\",\n /** Current Hive RPC nodes. Reads from the unified hive-tx config. */\n get hiveNodes(): string[] {\n return hiveTxConfig.nodes;\n },\n heliusApiKey: getHeliusApiKey(),\n /**\n * The React Query client all SDK code reads through `getQueryClient()`.\n * Backed by a resolver so an SSR host can scope it per request — see the\n * `queryClientResolver` note above. Assigning replaces the resolver with one\n * that always returns the assigned client, preserving the previous\n * \"one client, set once\" behaviour for browser and native hosts.\n */\n get queryClient(): QueryClient {\n return resolveQueryClient();\n },\n set queryClient(client: QueryClient) {\n queryClientResolver = () => client;\n },\n pollsApiHost: \"https://poll.ecency.com\",\n plausibleHost: \"https://pl.ecency.com\",\n // DMCA filtering - can be configured by the app\n dmcaAccounts: [] as string[],\n dmcaTags: [] as string[],\n dmcaPatterns: [] as string[],\n // Pre-compiled regex patterns for performance and security\n dmcaTagRegexes: [] as RegExp[],\n dmcaPatternRegexes: [] as RegExp[],\n // Track if DMCA has been initialized to avoid duplicate logs\n _dmcaInitialized: false,\n};\n\ntype DmcaListsInput = {\n accounts?: string[];\n tags?: string[];\n posts?: string[];\n};\n\nexport namespace ConfigManager {\n export function setQueryClient(client: QueryClient) {\n CONFIG.queryClient = client;\n }\n\n /**\n * Register how the SDK should obtain its React Query client, for hosts where\n * a single shared instance is wrong — principally SSR, where one process\n * serves many requests and a shared cache both leaks memory and risks serving\n * one request's data to another.\n *\n * `resolve` is called on every SDK cache access and should return the client\n * belonging to the request currently being handled. In a Next.js App Router\n * host that means wrapping the factory in React's `cache()`, which memoises\n * per request:\n *\n * ```ts\n * ConfigManager.setQueryClientResolver(() => getQueryClient());\n * ```\n *\n * Registering a resolver supersedes any client previously passed to\n * `setQueryClient`; assigning a client afterwards supersedes the resolver.\n */\n export function setQueryClientResolver(resolve: () => QueryClient) {\n queryClientResolver = resolve;\n }\n\n /**\n * Set the private API host\n * @param host - The private API host URL (e.g., \"https://ecency.com\" or \"\" for relative URLs)\n */\n export function setPrivateApiHost(host: string) {\n CONFIG.privateApiHost = host;\n }\n\n /**\n * Set the first-party client identifier sent as the `X-Ecency-Client` header\n * on search/private API requests (e.g. \"web\" or \"mobile\"). Defaults to\n * \"ecency-sdk\". Used by the origin to tell Ecency's own apps apart from\n * third-party integrators.\n * @param clientId - Short client label\n */\n export function setClientId(clientId: string) {\n CONFIG.clientId = clientId;\n }\n\n /**\n * Set the observer used for bridge calls made without a logged-in user.\n * Defaults to \"ecency\"; a third-party integrator should point this at their\n * own moderation account.\n *\n * Must be a real account. An empty value is rejected rather than treated as\n * an opt-out: consumers resolve the observer with `||`, and `getDiscussion`\n * separately falls back to the post author, so \"\" would not disable mute\n * marking. It would silently observe as someone else while being cached under\n * \"\", leaving the request and its cache key describing different things.\n * @param observer - Hive account whose mute list applies to anonymous reads\n * @throws If given an empty or whitespace-only value\n */\n export function setDefaultObserver(observer: string) {\n if (typeof observer !== \"string\" || observer.trim() === \"\") {\n throw new Error(\n \"setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; \" +\n \"observer resolution would fall back to the post author while caching under an empty key.\"\n );\n }\n\n CONFIG.defaultObserver = observer;\n }\n\n /**\n * Get a validated base URL for API requests\n * Returns a valid base URL that can be used with new URL(path, baseUrl)\n *\n * Priority:\n * 1. CONFIG.privateApiHost if set (dev/staging or explicit config)\n * 2. window.location.origin if in browser (production with relative URLs)\n * 3. 'https://ecency.com' as fallback for SSR (production default)\n *\n * @returns A valid base URL string\n * @throws Never throws - always returns a valid URL\n */\n export function getValidatedBaseUrl(): string {\n if (CONFIG.privateApiHost) {\n return CONFIG.privateApiHost;\n }\n\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n\n // Fallback for SSR when privateApiHost is empty (production case)\n return 'https://ecency.com';\n }\n\n /**\n * Set the polls API host\n * @param host - The polls API host URL (e.g., \"https://poll.ecency.com\")\n */\n export function setPollsApiHost(host: string) {\n CONFIG.pollsApiHost = host;\n }\n\n /**\n * Set the image host\n * @param host - The image host URL (e.g., \"https://i.ecency.com\")\n */\n export function setImageHost(host: string) {\n CONFIG.imageHost = host;\n }\n\n /**\n * Set Hive RPC nodes, replacing the default list.\n * Delegates to the unified hive-tx `setNodes` (single validated setter,\n * shared with the lean `@ecency/sdk/hive` entry) so node configuration is\n * defined in exactly one place.\n * @param nodes - Array of Hive RPC node URLs\n */\n export function setHiveNodes(nodes: string[]) {\n setHiveTxNodes(nodes);\n }\n\n /**\n * Set the REST-API node list, replacing the default `restNodes`. Lets an app\n * add/remove REST hosts at runtime (e.g. drop an own node being decommissioned,\n * or widen the public pool) without forking + republishing the SDK. Delegates to\n * the unified hive-tx `setRestNodes` (validated, shared with `@ecency/sdk/hive`).\n * @param nodes - Array of REST-capable node URLs (without a trailing slash)\n */\n export function setRestNodes(nodes: string[]) {\n setHiveTxRestNodes(nodes);\n }\n\n /**\n * Merge per-API REST node overrides. For each API a non-empty valid list pins it\n * to those hosts (so `callREST` never wastes its retry budget on a node that\n * 404/503s the API); an empty list removes the pin (falls back to `restNodes`).\n * Other APIs' pins (e.g. the built-in `hivesense`) are preserved. Delegates to the\n * unified hive-tx `setRestNodesByApi`.\n * @param map - Partial map of REST API name → capable node URLs\n */\n export function setRestNodesByApi(map: Partial>) {\n setHiveTxRestNodesByApi(map);\n }\n\n /**\n * Set the User-Agent sent on server-side (Node) requests to Hive nodes.\n * Lets an app label its own SSR/server traffic (otherwise Node's fetch sends a\n * bare `node` UA). No effect in browsers (User-Agent is a forbidden header) or\n * React Native (keeps its native UA). Delegates to the unified hive-tx setter.\n * @param userAgent - The User-Agent string (e.g. \"ecency-web-ssr (+https://ecency.com)\")\n */\n export function setUserAgent(userAgent: string) {\n setHiveTxUserAgent(userAgent);\n }\n\n /**\n * Tune read-call tail-latency resilience: adaptive per-attempt timeouts\n * (default on) and hedged requests (default OFF — a duplicate request races\n * the next healthy node when the primary stalls, bounded by a token bucket so\n * only the slow tail hedges and pool-wide slowness self-disables it). Partial:\n * only the fields provided are changed; invalid values are ignored\n * field-by-field. Delegates to the unified hive-tx `setResilience`.\n * @param opts - e.g. `{ hedge: true }` to opt into hedged reads\n */\n export function setResilience(opts: Partial) {\n setHiveTxResilience(opts);\n }\n\n /**\n * Static analysis: Check for known ReDoS-vulnerable patterns\n * @param pattern - Raw regex pattern string\n * @returns Object with risk level and reason\n */\n function analyzeRedosRisk(pattern: string): { safe: boolean; reason?: string } {\n // Check 1: Nested quantifiers (e.g., (a+)+, (a*)+, (a{1,})+)\n if (/(\\([^)]*[*+{][^)]*\\))[*+{]/.test(pattern)) {\n return { safe: false, reason: \"nested quantifiers detected\" };\n }\n\n // Check 2: Alternation with overlapping terms (e.g., (a|a)+, (ab|a)+)\n if (/\\([^|)]*\\|[^)]*\\)[*+{]/.test(pattern)) {\n return { safe: false, reason: \"alternation with quantifier (potential overlap)\" };\n }\n\n // Check 3: Catastrophic backtracking patterns (e.g., (a*)*b, (a+)+b)\n if (/\\([^)]*[*+][^)]*\\)[*+]/.test(pattern)) {\n return { safe: false, reason: \"repeated quantifiers (catastrophic backtracking risk)\" };\n }\n\n // Check 4: Greedy quantifiers followed by optional patterns (e.g., .*.*x, .+.+x)\n if (/\\.\\*\\.\\*/.test(pattern) || /\\.\\+\\.\\+/.test(pattern)) {\n return { safe: false, reason: \"multiple greedy quantifiers on wildcards\" };\n }\n\n // Check 5: Unbounded ranges with wildcards (e.g., .{1,999999})\n const unboundedRange = /\\.?\\{(\\d+),(\\d+)\\}/g;\n let match;\n while ((match = unboundedRange.exec(pattern)) !== null) {\n const [, min, max] = match;\n const range = parseInt(max, 10) - parseInt(min, 10);\n if (range > 1000) {\n return { safe: false, reason: `excessive range: {${min},${max}}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Runtime test: Execute regex against adversarial inputs with timeout\n * @param regex - Compiled regex\n * @returns Object indicating if regex passed runtime test\n */\n function testRegexPerformance(regex: RegExp): { safe: boolean; reason?: string } {\n // Test inputs designed to trigger ReDoS in vulnerable patterns\n const adversarialInputs = [\n // Nested quantifier attack\n \"a\".repeat(50) + \"x\",\n // Alternation attack\n \"ab\".repeat(50) + \"x\",\n // Wildcard attack\n \"x\".repeat(100),\n // Mixed attack\n \"aaa\".repeat(30) + \"bbb\".repeat(30) + \"x\",\n ];\n\n const maxExecutionTime = 5; // 5ms hard limit per test\n\n for (const input of adversarialInputs) {\n const start = Date.now();\n try {\n regex.test(input);\n const duration = Date.now() - start;\n\n if (duration > maxExecutionTime) {\n return {\n safe: false,\n reason: `runtime test exceeded ${maxExecutionTime}ms (took ${duration}ms on input length ${input.length})`\n };\n }\n } catch (err) {\n return { safe: false, reason: `runtime test threw error: ${err}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Safely compile a regex pattern with defense-in-depth validation\n * @param pattern - Raw regex pattern string\n * @param maxLength - Maximum allowed pattern length (default 200)\n * @returns Compiled RegExp or null if invalid/unsafe\n */\n function safeCompileRegex(pattern: string, maxLength = 200): RegExp | null {\n // Use the module-level isDevelopment constant\n\n try {\n // Layer 1: Basic validation\n if (!pattern) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: empty pattern`);\n }\n return null;\n }\n\n if (pattern.length > maxLength) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: length ${pattern.length} exceeds max ${maxLength} - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 2: Static ReDoS analysis\n const staticAnalysis = analyzeRedosRisk(pattern);\n if (!staticAnalysis.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${staticAnalysis.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 3: Compilation attempt\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (compileErr) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${pattern.substring(0, 50)}...`, compileErr);\n }\n return null;\n }\n\n // Layer 4: Runtime performance testing\n const runtimeTest = testRegexPerformance(regex);\n if (!runtimeTest.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${runtimeTest.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n return regex;\n } catch (err) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${pattern.substring(0, 50)}...`, err);\n }\n return null;\n }\n }\n\n /**\n * Set DMCA filtering lists\n * @param lists - DMCA lists object containing accounts/tags/posts arrays\n */\n export function setDmcaLists(\n lists: DmcaListsInput = {}\n ) {\n const coerceList = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n // Ensure we have a valid object to work with\n const input = lists || {};\n\n const resolved = {\n accounts: coerceList(input.accounts),\n tags: coerceList(input.tags),\n patterns: coerceList(input.posts),\n };\n\n CONFIG.dmcaAccounts = resolved.accounts;\n CONFIG.dmcaTags = resolved.tags;\n CONFIG.dmcaPatterns = resolved.patterns;\n\n // Pre-compile tag regex patterns (tags can be regex)\n CONFIG.dmcaTagRegexes = resolved.tags\n .map((pattern) => safeCompileRegex(pattern))\n .filter((r): r is RegExp => r !== null);\n\n // Post patterns are plain strings for exact matching, not regex\n // No compilation needed - they will be used with simple string comparison\n CONFIG.dmcaPatternRegexes = [];\n\n const rejectedTagCount = resolved.tags.length - CONFIG.dmcaTagRegexes.length;\n\n // Only log once to avoid noise during builds/hot reloads\n // Only show in development mode to avoid cluttering production console\n // Use the module-level isDevelopment constant\n\n if (!CONFIG._dmcaInitialized && isDevelopment) {\n console.log(`[SDK] DMCA configuration loaded:`);\n console.log(` - Accounts: ${resolved.accounts.length}`);\n console.log(` - Tag patterns: ${CONFIG.dmcaTagRegexes.length}/${resolved.tags.length} compiled (${rejectedTagCount} rejected)`);\n console.log(` - Post patterns: ${resolved.patterns.length} (using exact string matching)`);\n\n if (rejectedTagCount > 0) {\n console.warn(`[SDK] ${rejectedTagCount} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`);\n }\n }\n\n CONFIG._dmcaInitialized = true;\n }\n}\n","import {\n InfiniteData,\n QueryClient,\n QueryKey,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n useQuery,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { CONFIG } from \"./config\";\n\n/**\n * Builds a client with the SDK's defaults. It is only a factory — request\n * scoping is the host's job, via `ConfigManager.setQueryClientResolver`, since\n * only the host knows where one request ends and the next begins.\n */\nexport function makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // With SSR, we usually want to set some default staleTime\n // above 0 to avoid refetching immediately on the client\n // staleTime: 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n },\n },\n });\n}\nexport const getQueryClient = () => CONFIG.queryClient;\n\nexport namespace EcencyQueriesManager {\n export function getQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData(queryKey);\n }\n\n export function getInfiniteQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData>(queryKey);\n }\n\n export async function prefetchQuery(options: UseQueryOptions) {\n const queryClient = getQueryClient();\n await queryClient.prefetchQuery(options);\n return getQueryData(options.queryKey);\n }\n\n export async function prefetchInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n const queryClient = getQueryClient();\n await queryClient.prefetchInfiniteQuery(options);\n return getInfiniteQueryData(options.queryKey);\n }\n\n export function generateClientServerQuery(options: UseQueryOptions) {\n return {\n prefetch: () => prefetchQuery(options),\n getData: () => getQueryData(options.queryKey),\n useClientQuery: () => useQuery(options),\n fetchAndGet: () => getQueryClient().fetchQuery(options),\n };\n }\n\n export function generateClientServerInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n return {\n prefetch: () => prefetchInfiniteQuery(options),\n getData: () => getInfiniteQueryData(options.queryKey),\n useClientQuery: () => useInfiniteQuery(options),\n fetchAndGet: () => getQueryClient().fetchInfiniteQuery(options),\n };\n }\n}\n","export function encodeObj(o: any): string {\n return btoa(JSON.stringify(o));\n}\n\nexport function decodeObj(o: any): any {\n let dataToParse = atob(o);\n if (dataToParse[0] !== \"{\") {\n return undefined;\n }\n return JSON.parse(dataToParse);\n}\n","import type { SMTAsset } from \"@/modules/core/hive-tx\";\n\nexport enum Symbol {\n HIVE = \"HIVE\",\n HBD = \"HBD\",\n VESTS = \"VESTS\",\n}\n\nexport enum NaiMap {\n \"@@000000021\" = \"HIVE\",\n \"@@000000013\" = \"HBD\",\n \"@@000000037\" = \"VESTS\",\n}\n\nexport interface Asset {\n amount: number;\n symbol: Symbol;\n}\n\nexport function parseAsset(sval: string | SMTAsset): Asset {\n if (typeof sval === \"string\") {\n const sp = sval.split(\" \");\n return {\n amount: parseFloat(sp[0]),\n // @ts-ignore\n symbol: Symbol[sp[1]],\n };\n } else {\n return {\n amount: parseFloat(sval.amount.toString()) / Math.pow(10, sval.precision),\n // @ts-ignore\n symbol: NaiMap[sval.nai],\n };\n }\n}\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][SDK] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","export function isCommunity(value: unknown) {\n return typeof value === \"string\" ? /^hive-\\d+$/.test(value) : false;\n}\n","import { WrappedResponse } from \"../types/pagination\";\n\n/**\n * Type guard to check if response is wrapped with pagination metadata\n */\nexport function isWrappedResponse(response: any): response is WrappedResponse {\n return (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n \"pagination\" in response &&\n Array.isArray(response.data)\n );\n}\n\n/**\n * Normalize response to wrapped format for backwards compatibility\n * If the backend returns old format (array), convert it to wrapped format\n */\nexport function normalizeToWrappedResponse(\n response: T[] | WrappedResponse,\n limit: number\n): WrappedResponse {\n if (isWrappedResponse(response)) {\n return response;\n }\n\n // Old format - just an array\n // Since we don't have pagination metadata, assume no more pages\n return {\n data: Array.isArray(response) ? response : [],\n pagination: {\n total: Array.isArray(response) ? response.length : 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n}\n","export function vestsToHp(vests: number, hivePerMVests: number): number {\n return (vests / 1e6) * hivePerMVests;\n}\n","export function isEmptyDate(s: string | undefined): boolean {\n if (s === undefined) {\n return true;\n }\n\n return parseInt(s.split(\"-\")[0], 10) < 1980;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { DynamicProps } from \"../types\";\nimport { parseAsset } from \"../utils\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// This query powers wallet/HP/reward math that should stay close to chain state.\n// Keep a short refresh cadence despite the 5 RPC calls.\nconst DYNAMIC_PROPS_REFRESH_MS = 60 * 1000;\n\nexport function getDynamicPropsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.core.dynamicProps(),\n refetchInterval: DYNAMIC_PROPS_REFRESH_MS,\n staleTime: DYNAMIC_PROPS_REFRESH_MS,\n queryFn: async ({ signal }): Promise => {\n // Get raw blockchain data — all five calls are independent, run in parallel.\n // Hardfork properties is wrapped with catch since not all nodes support it.\n const [rawGlobalDynamic, rawFeedHistory, rawChainProps, rawRewardFund, rawHardforkProps] = await Promise.all([\n callRPC(\"condenser_api.get_dynamic_global_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_feed_history\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_chain_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_reward_fund\", [\"post\"], undefined, undefined, signal),\n callRPC(\"database_api.get_hardfork_properties\", {}, undefined, undefined, signal)\n .catch(() => ({ current_hardfork_version: \"1.28.0\", last_hardfork: 28 })),\n ]) as [any, any, any, any, any];\n\n // Calculate derived values for backward compatibility\n // parseAsset handles both string format (\"200905388484 HIVE\") and NAI format ({ amount, nai, precision })\n const totalVestingSharesAmount = parseAsset(rawGlobalDynamic.total_vesting_shares).amount;\n const totalVestingFundAmount = parseAsset(rawGlobalDynamic.total_vesting_fund_hive).amount;\n\n // Guard against division by zero/NaN/Infinity\n let hivePerMVests = 0;\n if (\n Number.isFinite(totalVestingSharesAmount) &&\n totalVestingSharesAmount !== 0 &&\n Number.isFinite(totalVestingFundAmount)\n ) {\n hivePerMVests = (totalVestingFundAmount / totalVestingSharesAmount) * 1e6;\n }\n const base = parseAsset(rawFeedHistory.current_median_history.base).amount;\n const quote = parseAsset(rawFeedHistory.current_median_history.quote).amount;\n const fundRecentClaims = parseFloat(rawRewardFund.recent_claims);\n const fundRewardBalance = parseAsset(rawRewardFund.reward_balance).amount;\n const votePowerReserveRate = Number(rawGlobalDynamic.vote_power_reserve_rate ?? 0);\n const authorRewardCurve = rawRewardFund.author_reward_curve ?? \"linear\";\n const contentConstant = Number(rawRewardFund.content_constant ?? 0);\n const currentHardforkVersion = String(rawHardforkProps.current_hardfork_version ?? \"0.0.0\");\n const lastHardfork = Number(rawHardforkProps.last_hardfork ?? 0);\n const hbdPrintRate = rawGlobalDynamic.hbd_print_rate;\n const hbdInterestRate = rawGlobalDynamic.hbd_interest_rate;\n const headBlock = rawGlobalDynamic.head_block_number;\n const totalVestingFund = totalVestingFundAmount;\n const totalVestingShares = totalVestingSharesAmount;\n const virtualSupply = parseAsset(rawGlobalDynamic.virtual_supply).amount;\n const vestingRewardPercent = rawGlobalDynamic.vesting_reward_percent || 0;\n const accountCreationFee = rawChainProps.account_creation_fee;\n\n return {\n // Backward compatible transformed fields (camelCase, parsed)\n hivePerMVests,\n base,\n quote,\n fundRecentClaims,\n fundRewardBalance,\n votePowerReserveRate,\n authorRewardCurve,\n contentConstant,\n currentHardforkVersion,\n lastHardfork,\n hbdPrintRate,\n hbdInterestRate,\n headBlock,\n totalVestingFund,\n totalVestingShares,\n virtualSupply,\n vestingRewardPercent,\n accountCreationFee,\n\n // Raw blockchain data (snake_case, unparsed) for direct use\n // Includes ALL fields from the blockchain responses\n raw: {\n globalDynamic: rawGlobalDynamic,\n feedHistory: rawFeedHistory,\n chainProps: rawChainProps,\n rewardFund: rawRewardFund,\n hardforkProps: rawHardforkProps,\n },\n } as DynamicProps;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface RewardFund {\n id: number;\n name: string;\n reward_balance: string;\n recent_claims: string;\n last_update: string;\n content_constant: string;\n percent_curation_rewards: number;\n percent_content_rewards: number;\n author_reward_curve: string;\n curation_reward_curve: string;\n}\n\n/**\n * Get reward fund information from the blockchain\n * @param fundName - Name of the reward fund (default: 'post')\n */\nexport function getRewardFundQueryOptions(fundName = \"post\") {\n return queryOptions({\n queryKey: QueryKeys.core.rewardFund(fundName),\n queryFn: () =>\n callRPC(\"condenser_api.get_reward_fund\", [\n fundName,\n ]) as Promise,\n });\n}\n","/**\n * Centralized query key definitions for all SDK queries.\n *\n * These key builders are the single source of truth for React Query cache keys.\n * Both SDK query options and web app consumers should reference these\n * instead of using inline string arrays.\n *\n * @example\n * ```typescript\n * import { QueryKeys } from \"@ecency/sdk\";\n *\n * // In query options\n * queryKey: QueryKeys.posts.entry(`/@${author}/${permlink}`)\n *\n * // In cache invalidation\n * queryClient.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) })\n * ```\n */\n/** Strip trailing undefined values so the key works as a prefix for partialMatchKey */\nfunction key(...parts: unknown[]): unknown[] {\n let end = parts.length;\n while (end > 0 && parts[end - 1] === undefined) {\n end--;\n }\n return parts.slice(0, end);\n}\n\nexport const QueryKeys = {\n // ===========================================================================\n // Posts\n // ===========================================================================\n posts: {\n entry: (entryPath: string) => [\"posts\", \"entry\", entryPath],\n postHeader: (author: string, permlink?: string) =>\n [\"posts\", \"post-header\", author, permlink],\n content: (author: string, permlink: string) =>\n [\"posts\", \"content\", author, permlink],\n contentReplies: (author: string, permlink: string) =>\n [\"posts\", \"content-replies\", author, permlink],\n accountPosts: (\n username: string,\n filter: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"account-posts\", username, filter, limit, observer],\n accountPostsPage: (\n username: string,\n filter: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n observer: string\n ) =>\n [\n \"posts\",\n \"account-posts-page\",\n username,\n filter,\n startAuthor,\n startPermlink,\n limit,\n observer,\n ],\n userPostVote: (username: string, author: string, permlink: string) =>\n [\"posts\", \"user-vote\", username, author, permlink],\n reblogs: (username: string, limit: number) =>\n [\"posts\", \"reblogs\", username, limit],\n entryActiveVotes: (author?: string, permlink?: string) =>\n [\"posts\", \"entry-active-votes\", author, permlink],\n rebloggedBy: (author: string, permlink: string) =>\n [\"posts\", \"reblogged-by\", author, permlink],\n tips: (author: string, permlink: string) =>\n [\"posts\", \"tips\", author, permlink],\n normalize: (author: string, permlink: string) =>\n [\"posts\", \"normalize\", author, permlink],\n drafts: (activeUsername?: string) =>\n [\"posts\", \"drafts\", activeUsername],\n draftsInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"drafts\", \"infinite\", activeUsername, limit),\n schedules: (activeUsername?: string) =>\n [\"posts\", \"schedules\", activeUsername],\n schedulesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"schedules\", \"infinite\", activeUsername, limit),\n fragments: (username?: string) =>\n [\"posts\", \"fragments\", username],\n fragmentsInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"fragments\", \"infinite\", username, limit),\n images: (username?: string) => [\"posts\", \"images\", username],\n galleryImages: (activeUsername?: string) =>\n [\"posts\", \"gallery-images\", activeUsername],\n imagesInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"images\", \"infinite\", username, limit),\n promoted: (type: string) => [\"posts\", \"promoted\", type],\n _promotedPrefix: [\"posts\", \"promoted\"],\n accountPostsBlogPrefix: (username: string) =>\n [\"posts\", \"account-posts\", username, \"blog\"] as const,\n postsRanked: (\n sort: string,\n tag: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"posts-ranked\", sort, tag, limit, observer],\n postsRankedPage: (\n sort: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n tag: string,\n observer: string\n ) =>\n [\n \"posts\",\n \"posts-ranked-page\",\n sort,\n startAuthor,\n startPermlink,\n limit,\n tag,\n observer,\n ],\n discussions: (\n author: string,\n permlink: string,\n order: string,\n observer: string\n ) => [\"posts\", \"discussions\", author, permlink, order, observer],\n discussion: (author: string, permlink: string, observer: string) =>\n [\"posts\", \"discussion\", author, permlink, observer],\n deletedEntry: (entryPath: string) =>\n [\"posts\", \"deleted-entry\", entryPath],\n commentHistory: (\n author: string,\n permlink: string,\n onlyMeta: boolean\n ) => [\"posts\", \"comment-history\", author, permlink, onlyMeta],\n trendingTags: () => [\"posts\", \"trending-tags\"],\n trendingTagsWithStats: (limit: number) =>\n [\"posts\", \"trending-tags\", \"stats\", limit],\n wavesFeed: (\n params: {\n containers?: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"feed\",\n params.tag ?? \"\",\n params.following ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n shortsFeed: (\n params: {\n containers?: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"shorts\",\n params.tag ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n wavesByHost: (host: string) =>\n [\"posts\", \"waves\", \"by-host\", host],\n wavesByTag: (host: string, tag: string) =>\n [\"posts\", \"waves\", \"by-tag\", host, tag],\n wavesFollowing: (host: string, username: string) =>\n [\"posts\", \"waves\", \"following\", host, username],\n wavesTrendingTags: (host: string, hours: number) =>\n [\"posts\", \"waves\", \"trending-tags\", host, hours],\n wavesByAccount: (host: string, username: string) =>\n [\"posts\", \"waves\", \"by-account\", host, username],\n wavesTrendingAuthors: (host: string) =>\n [\"posts\", \"waves\", \"trending-authors\", host],\n _prefix: [\"posts\"],\n },\n\n // ===========================================================================\n // Accounts\n // ===========================================================================\n accounts: {\n full: (username?: string) => [\"get-account-full\", username],\n list: (...usernames: string[]) =>\n [\"accounts\", \"list\", ...usernames],\n friends: (\n following: string,\n mode: string,\n followType: string,\n limit: number\n ) => [\"accounts\", \"friends\", following, mode, followType, limit],\n searchFriends: (username: string, mode: string, query: string) =>\n [\"accounts\", \"friends\", \"search\", username, mode, query],\n subscriptions: (username: string) =>\n [\"accounts\", \"subscriptions\", username],\n followCount: (username: string) =>\n [\"accounts\", \"follow-count\", username],\n recoveries: (username: string) =>\n [\"accounts\", \"recoveries\", username],\n pendingRecovery: (username: string) =>\n [\"accounts\", \"recoveries\", username, \"pending-request\"],\n checkWalletPending: (username: string, code: string | null) =>\n [\"accounts\", \"check-wallet-pending\", username, code],\n mutedUsers: (username: string) =>\n [\"accounts\", \"muted-users\", username],\n following: (\n follower: string,\n startFollowing: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"following\",\n follower,\n startFollowing,\n followType,\n limit,\n ],\n followers: (\n following: string,\n startFollower: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"followers\",\n following,\n startFollower,\n followType,\n limit,\n ],\n search: (query: string, excludeList?: string[]) =>\n [\"accounts\", \"search\", query, excludeList],\n profiles: (accounts: string[], observer: string) =>\n [\"accounts\", \"profiles\", accounts, observer],\n lookup: (query: string, limit: number) =>\n [\"accounts\", \"lookup\", query, limit],\n transactions: (username: string, group: string, limit: number) =>\n [\"accounts\", \"transactions\", username, group, limit],\n favorites: (activeUsername?: string) =>\n [\"accounts\", \"favorites\", activeUsername],\n favoritesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"favorites\", \"infinite\", activeUsername, limit),\n checkFavorite: (activeUsername: string, targetUsername: string) =>\n [\n \"accounts\",\n \"favorites\",\n \"check\",\n activeUsername,\n targetUsername,\n ],\n relations: (reference: string | undefined, target: string | undefined) =>\n [\"accounts\", \"relations\", reference, target],\n bots: () => [\"accounts\", \"bots\"],\n voteHistory: (username: string, limit: number) =>\n [\"accounts\", \"vote-history\", username, limit],\n reputations: (query: string, limit: number) =>\n [\"accounts\", \"reputations\", query, limit],\n bookmarks: (activeUsername?: string) =>\n [\"accounts\", \"bookmarks\", activeUsername],\n bookmarksInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"bookmarks\", \"infinite\", activeUsername, limit),\n referrals: (username: string) =>\n [\"accounts\", \"referrals\", username],\n referralsStats: (username: string) =>\n [\"accounts\", \"referrals-stats\", username],\n proMembers: () => [\"accounts\", \"pro-members\"],\n _prefix: [\"accounts\"],\n },\n\n // ===========================================================================\n // Notifications\n // ===========================================================================\n notifications: {\n announcements: () => [\"notifications\", \"announcements\"],\n spotlights: () => [\"notifications\", \"spotlights\"],\n list: (activeUsername?: string, filter?: string) =>\n [\"notifications\", activeUsername, filter],\n unreadCount: (activeUsername?: string) =>\n [\"notifications\", \"unread\", activeUsername],\n settings: (activeUsername?: string) =>\n [\"notifications\", \"settings\", activeUsername],\n _prefix: [\"notifications\"],\n },\n\n // ===========================================================================\n // Core\n // ===========================================================================\n core: {\n rewardFund: (fundName: string) =>\n [\"core\", \"reward-fund\", fundName],\n dynamicProps: () => [\"core\", \"dynamic-props\"],\n chainProperties: () => [\"core\", \"chain-properties\"],\n _prefix: [\"core\"],\n },\n\n // ===========================================================================\n // Communities\n // ===========================================================================\n communities: {\n single: (name?: string, observer?: string) =>\n [\"community\", \"single\", name, observer],\n /** Prefix key for matching all observer variants of a community */\n singlePrefix: (name: string) =>\n [\"community\", \"single\", name] as const,\n context: (username: string, communityName: string) =>\n [\"community\", \"context\", username, communityName],\n rewarded: () => [\"communities\", \"rewarded\"],\n list: (sort: string, query: string, limit: number) =>\n [\"communities\", \"list\", sort, query, limit],\n subscribers: (communityName: string) =>\n [\"communities\", \"subscribers\", communityName],\n subscribersInfinite: (communityName: string) =>\n [\"communities\", \"subscribers\", \"infinite\", communityName],\n accountNotifications: (account: string, limit: number) =>\n [\"communities\", \"account-notifications\", account, limit],\n },\n\n // ===========================================================================\n // Proposals\n // ===========================================================================\n proposals: {\n list: () => [\"proposals\", \"list\"],\n proposal: (id: number) => [\"proposals\", \"proposal\", id],\n votes: (proposalId: number, voter: string, limit: number) =>\n [\"proposals\", \"votes\", proposalId, voter, limit],\n votesPrefix: (proposalId: number) =>\n [\"proposals\", \"votes\", proposalId] as const,\n votesByUser: (voter: string) =>\n [\"proposals\", \"votes\", \"by-user\", voter],\n },\n\n // ===========================================================================\n // Search\n // ===========================================================================\n search: {\n topics: (q: string, limit: number) => [\"search\", \"topics\", q, limit],\n path: (q: string) => [\"search\", \"path\", q],\n account: (q: string, limit: number) =>\n [\"search\", \"account\", q, limit],\n results: (\n q: string,\n sort: string,\n hideLow: boolean | string,\n since?: string,\n scrollId?: string,\n votes?: number\n ) => {\n const normalizedHideLow = typeof hideLow === \"string\" ? hideLow === \"1\" || hideLow === \"true\" : hideLow;\n return [\"search\", q, sort, normalizedHideLow, since, scrollId, votes] as const;\n },\n controversialRising: (what: string, tag: string) =>\n [\"search\", \"controversial-rising\", what, tag],\n similarEntries: (author: string, permlink: string, content?: string) =>\n content\n ? [\"search\", \"similar-entries\", author, permlink, content]\n : [\"search\", \"similar-entries\", author, permlink],\n api: (\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n ) => key(\"search\", \"api\", q, sort, hideLow, since, votes, includeNsfw),\n },\n\n // ===========================================================================\n // Witnesses\n // ===========================================================================\n witnesses: {\n list: (limit: number) => [\"witnesses\", \"list\", limit],\n votes: (username: string | undefined) => [\"witnesses\", \"votes\", username],\n proxy: () => [\"witnesses\", \"proxy\"],\n voters: (\n witness: string,\n page: number,\n pageSize: number,\n sort: string,\n direction: string\n ) => [\"witnesses\", \"voters\", witness, page, pageSize, sort, direction],\n voterCount: (witness: string) =>\n [\"witnesses\", \"voter-count\", witness],\n },\n\n // ===========================================================================\n // Wallet\n // ===========================================================================\n wallet: {\n outgoingRcDelegations: (username: string, limit: number) =>\n [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n vestingDelegations: (username: string, limit: number) =>\n [\"wallet\", \"vesting-delegations\", username, limit],\n withdrawRoutes: (account: string) =>\n [\"wallet\", \"withdraw-routes\", account],\n incomingRc: (username: string) =>\n [\"wallet\", \"incoming-rc\", username],\n conversionRequests: (account: string) =>\n [\"wallet\", \"conversion-requests\", account],\n receivedVestingShares: (username: string) =>\n [\"wallet\", \"received-vesting-shares\", username],\n savingsWithdraw: (account: string) =>\n [\"wallet\", \"savings-withdraw\", account],\n openOrders: (user: string) =>\n [\"wallet\", \"open-orders\", user],\n collateralizedConversionRequests: (account: string) =>\n [\"wallet\", \"collateralized-conversion-requests\", account],\n recurrentTransfers: (username: string) =>\n [\"wallet\", \"recurrent-transfers\", username],\n balanceHistory: (username: string, coinType: string, pageSize: number) =>\n [\"wallet\", \"balance-history\", username, coinType, pageSize],\n aggregatedHistory: (\n username: string,\n coinType: string,\n granularity?: \"yearly\" | \"monthly\" | \"daily\"\n ) =>\n granularity === undefined\n ? [\"wallet\", \"aggregated-history\", username, coinType]\n : [\"wallet\", \"aggregated-history\", username, coinType, granularity],\n portfolio: (\n username: string,\n onlyEnabled: string,\n currency: string\n ) =>\n [\"wallet\", \"portfolio\", \"v2\", username, onlyEnabled, currency],\n },\n\n // ===========================================================================\n // Assets\n // ===========================================================================\n assets: {\n hiveGeneralInfo: (username: string) =>\n [\"assets\", \"hive\", \"general-info\", username],\n hiveTransactions: (username: string, limit: number, filterKey: string) =>\n [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n hiveWithdrawalRoutes: (username: string) =>\n [\"assets\", \"hive\", \"withdrawal-routes\", username],\n hiveMetrics: (bucketSeconds: number) =>\n [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n hbdGeneralInfo: (username: string) =>\n [\"assets\", \"hbd\", \"general-info\", username],\n hbdTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) => [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n hivePowerGeneralInfo: (username: string) =>\n [\"assets\", \"hive-power\", \"general-info\", username],\n hivePowerDelegates: (username: string) =>\n [\"assets\", \"hive-power\", \"delegates\", username],\n hivePowerDelegatings: (username: string) =>\n [\"assets\", \"hive-power\", \"delegatings\", username],\n hivePowerTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) =>\n [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n pointsGeneralInfo: (username: string) =>\n [\"assets\", \"points\", \"general-info\", username],\n pointsTransactions: (username: string, type: string) =>\n [\"assets\", \"points\", \"transactions\", username, type],\n ecencyAssetInfo: (username: string, asset: string, currency: string) =>\n [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n },\n\n // ===========================================================================\n // Market\n // ===========================================================================\n market: {\n statistics: () => [\"market\", \"statistics\"],\n orderBook: (limit: number) => [\"market\", \"order-book\", limit],\n history: (seconds: number, startDate: number, endDate: number) =>\n [\"market\", \"history\", seconds, startDate, endDate],\n feedHistory: () => [\"market\", \"feed-history\"],\n hiveHbdStats: () => [\"market\", \"hive-hbd-stats\"],\n data: (\n coin: string,\n vsCurrency: string,\n fromTs: number,\n toTs: number\n ) => [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n tradeHistory: (limit: number, start: number, end: number) =>\n [\"market\", \"trade-history\", limit, start, end],\n currentMedianHistoryPrice: () =>\n [\"market\", \"current-median-history-price\"],\n },\n\n // ===========================================================================\n // Analytics\n // ===========================================================================\n analytics: {\n discoverCuration: (duration: string) =>\n [\"analytics\", \"discover-curation\", duration],\n pageStats: (\n url: string,\n dimensions: string,\n metrics: string,\n dateRange: string\n ) =>\n [\"analytics\", \"page-stats\", url, dimensions, metrics, dateRange],\n discoverLeaderboard: (duration: string) =>\n [\"analytics\", \"discover-leaderboard\", duration],\n },\n\n // ===========================================================================\n // Promotions\n // ===========================================================================\n promotions: {\n promotePrice: () => [\"promotions\", \"promote-price\"],\n boostPlusPrices: () => [\"promotions\", \"boost-plus-prices\"],\n boostPlusAccounts: (account: string) =>\n [\"promotions\", \"boost-plus-accounts\", account],\n },\n\n // ===========================================================================\n // Resource Credits\n // ===========================================================================\n resourceCredits: {\n account: (username: string) =>\n [\"resource-credits\", \"account\", username],\n stats: () => [\"resource-credits\", \"stats\"],\n },\n\n // ===========================================================================\n // Points\n // ===========================================================================\n points: {\n points: (username: string, filter: number) =>\n [\"points\", username, filter],\n _prefix: (username: string) => [\"points\", username],\n },\n\n // ===========================================================================\n // Polls\n // ===========================================================================\n polls: {\n details: (author: string, permlink: string) =>\n [\"polls\", \"details\", author, permlink],\n vote: (author?: string, permlink?: string) =>\n author && permlink\n ? [\"polls\", \"vote\", author, permlink]\n : [\"polls\", \"vote\"],\n _prefix: [\"polls\"],\n },\n\n // ===========================================================================\n // Operations\n // ===========================================================================\n operations: {\n chainProperties: () => [\"operations\", \"chain-properties\"],\n },\n\n // ===========================================================================\n // Games\n // ===========================================================================\n games: {\n statusCheck: (gameType: string, username: string) =>\n [\"games\", \"status-check\", gameType, username],\n },\n\n quests: {\n status: (username: string | undefined) => [\"quests\", \"status\", username],\n },\n\n // ===========================================================================\n // Support Ecency\n // ===========================================================================\n support: {\n settings: (username: string | undefined) => [\"support\", \"settings\", username],\n _prefix: [\"support\"],\n },\n\n // ===========================================================================\n // Bad Actors\n // ===========================================================================\n badActors: {\n list: () => [\"bad-actors\", \"list\"],\n _prefix: [\"bad-actors\"],\n },\n\n // ===========================================================================\n // AI\n // ===========================================================================\n ai: {\n prices: () => [\"ai\", \"prices\"] as const,\n assistPrices: (username?: string) => [\"ai\", \"assist-prices\", username] as const,\n transcribePrice: (username?: string) => [\"ai\", \"transcribe-price\", username] as const,\n _prefix: [\"ai\"],\n },\n} as const;\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiImagePriceResponse } from \"../types\";\n\nexport function getAiGeneratePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.prices(),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-generate-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI generation prices: ${response.status}`);\n }\n\n return (await response.json()) as AiImagePriceResponse;\n },\n staleTime: 300_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiAssistPrice } from \"../types\";\n\nexport function getAiAssistPriceQueryOptions(username: string | undefined, accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.assistPrices(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-assist-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI assist prices: ${response.status}`);\n }\n\n return (await response.json()) as AiAssistPrice[];\n },\n staleTime: 60_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiTranscribePrice } from \"../types\";\n\n/**\n * Dictation pricing. Kept on its own route rather than folded into\n * /private-api/ai-assist-price: that endpoint returns a list of flat-cost actions and\n * shipped clients render every entry as a selectable assist action, so adding a\n * metered one there would surface in older clients as an action they cannot perform.\n *\n * Everything except `free_remaining` is static, so this is cheap to hold and lets the\n * client price a clip locally while the user is still recording.\n */\nexport function getAiTranscribePriceQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.ai.transcribePrice(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI transcribe price: ${response.status}`);\n }\n\n return (await response.json()) as AiTranscribePrice;\n },\n staleTime: 60_000,\n enabled: !!accessToken\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiGenerationResponse } from \"../types\";\n\nexport interface GenerateImageParams {\n prompt: string;\n aspect_ratio?: string;\n power?: number;\n // Pass a stable key to make a retry recover the same paid generation. If omitted a\n // fresh key is generated per call (only dedupes edge/proxy retries, not user retries).\n idempotency_key?: string;\n}\n\n// Generates a key matching the eepoints validator [A-Za-z0-9_-]{8,64}.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useGenerateImage(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"generate-image\"],\n mutationFn: async (params: GenerateImageParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-generate-image\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: accessToken,\n us: username,\n prompt: params.prompt,\n aspect_ratio: params.aspect_ratio ?? \"1:1\",\n power: params.power ?? 1,\n idempotency_key: params.idempotency_key ?? makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][GenerateImage] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n // 202 = the prediction is paid for and captured but not yet delivered to our image\n // host. Detect it by HTTP status BEFORE parsing (the body may be present or empty)\n // and surface it as a typed error so the caller can retry with the SAME\n // idempotency_key to fetch it — no second prediction, no second charge.\n if (response.status === 202) {\n let pendingData: Record = {};\n try {\n pendingData = await response.json();\n } catch {\n // empty / non-JSON 202 body is fine — the status alone drives recovery\n }\n const err = new Error(\"[SDK][AI][GenerateImage] – delivery pending\");\n (err as any).status = 202;\n (err as any).data = pendingData;\n throw err;\n }\n\n const data = (await response.json()) as AiGenerationResponse;\n\n return data;\n },\n onSuccess: () => {\n // Invalidate points cache since balance changed\n if (username) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiAssistResponse } from \"../types\";\n\nexport interface AiAssistParams {\n action: string;\n text: string;\n code?: string;\n}\n\n// Generates a key that matches the eepoints validator [A-Za-z0-9_-]{8,64}.\n// Used to dedupe duplicate POSTs caused by edge/proxy retries — same key on\n// retry returns the cached AI output without re-charging or re-calling Claude.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useAiAssist(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"assist\"],\n mutationFn: async (params: AiAssistParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][Assist] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][Assist] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-assist\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: params.code ?? accessToken,\n us: username,\n action: params.action,\n text: params.text,\n idempotency_key: makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][Assist] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n return (await response.json()) as AiAssistResponse;\n },\n onSuccess: (data) => {\n if (username) {\n // Invalidate points cache if cost was charged\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n // Invalidate assist prices to refresh free_remaining counts\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.assistPrices(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiTranscribeParams, AiTranscribeResponse } from \"../types\";\n\n// Matches the eepoints validator [A-Za-z0-9_-]{8,64}. Dedupes duplicate POSTs caused\n// by edge/proxy retries -- the same key returns the cached transcript without\n// re-charging or re-calling the vendor.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Transcribe an audio clip to text, charged per 30 seconds.\n *\n * Sends multipart/form-data rather than JSON because it carries a file. Unlike the\n * other AI mutations the charge is BURNED rather than moved to the treasury, so the\n * points transaction shows up as PointTransactionType.BURNED (997).\n */\nexport function useAiTranscribe(username: string | undefined, accessToken: string | undefined) {\n return useMutation({\n mutationKey: [\"ai\", \"transcribe\"],\n mutationFn: async (params: AiTranscribeParams): Promise => {\n if (!username) {\n throw new Error(\"[SDK][AI][Transcribe] – username wasn't provided\");\n }\n\n // Validate the token actually being sent, not just the bound one. A caller\n // that resolves a fresh token per call (because the bound one can expire\n // during a long recording) legitimately has nothing at hook construction.\n const code = params.code ?? accessToken;\n if (!code) {\n throw new Error(\"[SDK][AI][Transcribe] – access token wasn't found\");\n }\n\n const form = new FormData();\n form.append(\"code\", code);\n // `us` is resolved from the code server-side and is deliberately not sent:\n // upstream burns from whoever it names.\n form.append(\"duration_ms\", String(Math.round(params.durationMs)));\n // Caller-supplied key when there is one. Generating a fresh key per attempt\n // would defeat the dedupe in the one case it exists for: a POST that reached\n // the server whose response was lost. Retrying then would transcribe and\n // charge a second time. Same contract as useGenerateImage.\n form.append(\"idempotency_key\", params.idempotency_key ?? makeIdempotencyKey());\n form.append(\"audio\", params.audio, params.fileName ?? \"clip.webm\");\n\n const fetchApi = getBoundFetch();\n // No Content-Type header: fetch sets it, including the multipart boundary.\n // Setting it by hand drops the boundary and the body becomes unparseable.\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe\", {\n method: \"POST\",\n body: form\n });\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n // Object.assign rather than `as any` casts: callers need `status` to tell a\n // 402 (out of Points) from a 429 (rate limited) from a 400 (clip too long),\n // and this keeps that shape typed.\n throw Object.assign(\n new Error(\n `[SDK][AI][Transcribe] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n ),\n { status: response.status, data: parsed }\n );\n }\n\n return (await response.json()) as AiTranscribeResponse;\n },\n onSuccess: (data) => {\n if (username) {\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username)\n });\n }\n // Refresh free_remaining, which only Pro members ever have above zero.\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.transcribePrice(username)\n });\n }\n }\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport {\n AccountFollowStats,\n FullAccount,\n} from \"../types\";\nimport { parseProfileMetadata } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** The raw `condenser_api.get_accounts` row — every FullAccount field except the three\n * this query derives separately (follow_stats + reputation from bridge, profile parsed). */\ntype RawAccount = Omit;\n\n/** Minimal shape read from `bridge.get_profile` (hivemind social profile): it carries\n * the reputation score, the follower/following counts and hivemind's parsed\n * (normalized) profile — the latter is used only to cross-validate the chain row. */\ninterface BridgeProfile {\n reputation?: number;\n stats?: { followers?: number; following?: number };\n metadata?: { profile?: Record };\n}\n\n/** True when the chain row carries no account metadata at all. Legitimate for\n * accounts that never set a profile — but combined with a populated hivemind\n * profile it identifies a node serving stripped account rows. */\nfunction isMetadataStripped(account: RawAccount): boolean {\n return !account.posting_json_metadata && !account.json_metadata;\n}\n\n/** True when a hivemind `metadata.profile` object carries at least one real\n * value. Hivemind emits its fixed profile keys with empty strings for\n * accounts without a profile, so key presence alone proves nothing. */\nfunction hasProfileValues(profile?: Record | null): boolean {\n if (!profile) return false;\n return Object.values(profile).some((value) =>\n typeof value === \"string\" ? value.length > 0 : value != null\n );\n}\n\nexport function getAccountFullQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.full(username),\n queryFn: async ({ signal }) => {\n if (!username) {\n return null;\n }\n\n // Fetch the chain account (balances/keys/vesting) and the hivemind profile in\n // parallel — both only need the username. bridge.get_profile carries BOTH the\n // follower/following counts and the reputation score, so it replaces the old\n // second-layer condenser_api.get_follow_count RPC *and* the reputation-api REST\n // call: condenser_api.get_accounts no longer returns a usable reputation (it is 0\n // since the hardfork), and there is no reason to make two extra round-trips for\n // data one profile object already carries.\n const [response, bridgeProfile] = await Promise.all([\n callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so fail over to the next node instead of misreading it as\n // \"account does not exist\".\n (rows) => Array.isArray(rows)\n ),\n callRPC(\n \"bridge.get_profile\",\n { account: username },\n undefined,\n undefined,\n signal\n ).catch((e): BridgeProfile | null => {\n // A caller cancel (aborted signal) must propagate — only genuine RPC/transport\n // failures degrade to reputation 0 / no follow_stats.\n if (signal?.aborted) throw e;\n return null;\n })\n ]);\n if (!response?.[0]) {\n // The account does not exist (e.g. not yet finalized on-chain during\n // signup). Treat absence as a recoverable null instead of throwing, so\n // consumers (useQuery hooks and fetchQuery callers) surface it as empty\n // data rather than an unhandled rejection / error-boundary crash.\n return null;\n }\n\n let chainAccount = response[0];\n\n // Cross-validate the chain row against the hivemind profile fetched in\n // the same query. Some public nodes serve account rows with BOTH\n // metadata fields stripped to \"\" (observed in the wild) while their own\n // hivemind still returns the real profile — and a merge base built from\n // such a row wipes the user's profile on the next partial\n // account_update2. When the row claims \"no metadata\" but hivemind\n // disagrees, re-read once (failover may pick another node) and otherwise\n // fail the query: an error here is recoverable, a poisoned cache entry\n // is not.\n if (\n isMetadataStripped(chainAccount) &&\n hasProfileValues(bridgeProfile?.metadata?.profile)\n ) {\n // The re-read carries a payload validator: a stripped row is treated\n // as a node fault, so the failover walk moves on to other nodes (and\n // repeat offenders earn a per-API health cooldown) instead of asking\n // the same lying node twice.\n const reread = await callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n (rows) =>\n Array.isArray(rows) &&\n (!rows[0] || !isMetadataStripped(rows[0] as RawAccount))\n );\n if (reread[0] && !isMetadataStripped(reread[0])) {\n chainAccount = reread[0];\n } else {\n throw new Error(\n `[SDK][Accounts] – inconsistent account row for ${username}: empty json metadata while hivemind profile is populated`\n );\n }\n }\n\n const profile = parseProfileMetadata(chainAccount.posting_json_metadata);\n\n // bridge.get_profile.stats → follower/following counts; `reputation` is the\n // computed score (e.g. 78.29). accountReputation() floors an in-range score, so\n // it yields the same value the reputation-api used to return. Both degrade to a\n // safe default if the profile call failed.\n const stats = bridgeProfile?.stats;\n const follow_stats: AccountFollowStats | undefined = stats\n ? {\n account: chainAccount.name,\n follower_count: stats.followers ?? 0,\n following_count: stats.following ?? 0\n }\n : undefined;\n const reputationValue: number = bridgeProfile?.reputation ?? 0;\n\n return {\n name: chainAccount.name,\n owner: chainAccount.owner,\n active: chainAccount.active,\n posting: chainAccount.posting,\n memo_key: chainAccount.memo_key,\n post_count: chainAccount.post_count,\n created: chainAccount.created,\n posting_json_metadata: chainAccount.posting_json_metadata,\n last_vote_time: chainAccount.last_vote_time,\n last_post: chainAccount.last_post,\n json_metadata: chainAccount.json_metadata,\n reward_hive_balance: chainAccount.reward_hive_balance,\n reward_hbd_balance: chainAccount.reward_hbd_balance,\n reward_vesting_hive: chainAccount.reward_vesting_hive,\n reward_vesting_balance: chainAccount.reward_vesting_balance,\n balance: chainAccount.balance,\n hbd_balance: chainAccount.hbd_balance,\n savings_balance: chainAccount.savings_balance,\n savings_hbd_balance: chainAccount.savings_hbd_balance,\n savings_hbd_last_interest_payment:\n chainAccount.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update:\n chainAccount.savings_hbd_seconds_last_update,\n savings_hbd_seconds: chainAccount.savings_hbd_seconds,\n next_vesting_withdrawal: chainAccount.next_vesting_withdrawal,\n pending_claimed_accounts: chainAccount.pending_claimed_accounts,\n vesting_shares: chainAccount.vesting_shares,\n delegated_vesting_shares: chainAccount.delegated_vesting_shares,\n received_vesting_shares: chainAccount.received_vesting_shares,\n vesting_withdraw_rate: chainAccount.vesting_withdraw_rate,\n to_withdraw: chainAccount.to_withdraw,\n withdrawn: chainAccount.withdrawn,\n witness_votes: chainAccount.witness_votes,\n proxy: chainAccount.proxy,\n recovery_account: chainAccount.recovery_account,\n proxied_vsf_votes: chainAccount.proxied_vsf_votes,\n voting_manabar: chainAccount.voting_manabar,\n voting_power: chainAccount.voting_power,\n downvote_manabar: chainAccount.downvote_manabar,\n follow_stats,\n reputation: reputationValue,\n profile,\n } satisfies FullAccount;\n },\n enabled: !!username,\n staleTime: 60000,\n });\n}\n","import { AccountProfile, FullAccount } from \"../types\";\n\nexport type ProfileTokens = AccountProfile[\"tokens\"];\n\nconst DENIED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nfunction deepMerge>(target: T, source: Record): T {\n const result = { ...target } as Record;\n for (const key of Object.keys(source)) {\n if (DENIED_KEYS.has(key)) {\n continue;\n }\n const srcVal = source[key];\n const tgtVal = result[key];\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\n result[key] = deepMerge(tgtVal, srcVal);\n } else {\n result[key] = srcVal;\n }\n }\n return result as T;\n}\n\nexport interface BuildProfileMetadataArgs {\n existingProfile?: AccountProfile;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}\n\nfunction sanitizeTokens(\n tokens?: ProfileTokens | null\n): ProfileTokens | undefined {\n // Guard against corrupted data from blockchain where tokens is not an array\n if (!tokens || !Array.isArray(tokens)) {\n return undefined;\n }\n\n return tokens.map(({ meta, ...rest }) => {\n if (!meta || typeof meta !== \"object\") {\n return { ...rest, meta };\n }\n\n const { privateKey, username, ...safeMeta } = meta;\n return { ...rest, meta: safeMeta };\n });\n}\n\nexport function parseProfileMetadata(\n postingJsonMetadata?: string | null\n): AccountProfile {\n if (!postingJsonMetadata) {\n return {} as AccountProfile;\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n parsed.profile &&\n typeof parsed.profile === \"object\"\n ) {\n return parsed.profile as AccountProfile;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata:\", err, { length: postingJsonMetadata?.length ?? 0 });\n }\n\n return {} as AccountProfile;\n}\n\nexport function extractAccountProfile(\n data?: Pick | null\n): AccountProfile {\n return parseProfileMetadata(data?.posting_json_metadata);\n}\n\n/**\n * Choose between two account snapshots for a posting-metadata merge base.\n * Prefers `preferred` (typically the freshest cache entry) unless `fallback`\n * carries strictly more profile keys — guarding read-modify-write flows\n * against a snapshot whose metadata was served stripped by a misbehaving node\n * while another snapshot still holds the real profile. A partial update must\n * never shrink the profile while any snapshot still knows the full one.\n */\nexport function pickRicherMetadataSnapshot<\n T extends Pick\n>(\n preferred: T | null | undefined,\n fallback: T | null | undefined\n): T | null | undefined {\n if (!preferred) return fallback;\n if (!fallback) return preferred;\n const preferredKeys = Object.keys(\n parseProfileMetadata(preferred.posting_json_metadata)\n ).length;\n const fallbackKeys = Object.keys(\n parseProfileMetadata(fallback.posting_json_metadata)\n ).length;\n return fallbackKeys > preferredKeys ? fallback : preferred;\n}\n\n/**\n * Parse the FULL root object of posting_json_metadata, not just its `profile`\n * key. Returns {} for missing/invalid input or a non-object root.\n *\n * `parseProfileMetadata` intentionally returns only `parsed.profile`; this\n * helper exists so writers can carry forward any sibling top-level keys that\n * live alongside `profile` (data other Hive apps may store there) instead of\n * dropping them on the next update.\n */\nexport function parsePostingMetadataRoot(\n postingJsonMetadata?: string | null\n): Record {\n if (!postingJsonMetadata) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata root:\", err, {\n length: postingJsonMetadata?.length ?? 0,\n });\n }\n\n return {};\n}\n\n/**\n * Build the serialized `posting_json_metadata` string for an account_update2\n * operation. It deep-merges the profile (via {@link buildProfileMetadata}) over\n * the account's CURRENT on-chain profile AND preserves any non-`profile`\n * top-level keys present in the existing metadata, so a partial profile update\n * (e.g. only `pinned` or only `tokens`) never clobbers unrelated fields.\n */\nexport function buildPostingJsonMetadata({\n existingPostingJsonMetadata,\n profile,\n tokens,\n}: {\n existingPostingJsonMetadata?: string | null;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}): string {\n const root = parsePostingMetadataRoot(existingPostingJsonMetadata);\n const existingProfile = isPlainObject(root.profile)\n ? (root.profile as AccountProfile)\n : ({} as AccountProfile);\n\n const mergedProfile = buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n });\n\n return JSON.stringify({ ...root, profile: mergedProfile });\n}\n\nexport function buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n}: BuildProfileMetadataArgs): AccountProfile {\n const { tokens: profileTokens, version: _ignoredVersion, ...profileRest } =\n profile ?? {};\n\n const metadata = deepMerge(\n (existingProfile ?? {}) as Record,\n profileRest as Record,\n ) as AccountProfile;\n\n // Clean up corrupted tokens data from blockchain before processing\n if (metadata.tokens && !Array.isArray(metadata.tokens)) {\n metadata.tokens = undefined;\n }\n\n // tokens semantics:\n // undefined → no change, fall back to profileTokens from profile partial\n // null or [] → explicitly clear tokens\n // non-empty array → set tokens\n if (tokens !== undefined) {\n // Explicit intent from caller: null or [] clears, non-empty array sets\n metadata.tokens = tokens && tokens.length > 0 ? tokens : [];\n } else if (profileTokens !== undefined) {\n // Fall back to tokens from profile partial (including empty array to clear)\n metadata.tokens = profileTokens;\n }\n\n metadata.tokens = sanitizeTokens(metadata.tokens);\n metadata.version = 2;\n\n return metadata;\n}\n","import { FullAccount, AccountProfile } from \"../types\";\nimport { parseProfileMetadata } from \"./profile-metadata\";\n\n/**\n * Parses raw account data from Hive API into FullAccount type\n * Handles profile metadata extraction from posting_json_metadata or json_metadata\n */\nexport function parseAccounts(rawAccounts: any[]): FullAccount[] {\n return rawAccounts.map((x) => {\n const account: FullAccount = {\n name: x.name,\n owner: x.owner,\n active: x.active,\n posting: x.posting,\n memo_key: x.memo_key,\n post_count: x.post_count,\n created: x.created,\n reputation: x.reputation,\n posting_json_metadata: x.posting_json_metadata,\n last_vote_time: x.last_vote_time,\n last_post: x.last_post,\n json_metadata: x.json_metadata,\n reward_hive_balance: x.reward_hive_balance,\n reward_hbd_balance: x.reward_hbd_balance,\n reward_vesting_hive: x.reward_vesting_hive,\n reward_vesting_balance: x.reward_vesting_balance,\n balance: x.balance,\n hbd_balance: x.hbd_balance,\n savings_balance: x.savings_balance,\n savings_hbd_balance: x.savings_hbd_balance,\n savings_hbd_last_interest_payment: x.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update: x.savings_hbd_seconds_last_update,\n savings_hbd_seconds: x.savings_hbd_seconds,\n next_vesting_withdrawal: x.next_vesting_withdrawal,\n pending_claimed_accounts: x.pending_claimed_accounts,\n vesting_shares: x.vesting_shares,\n delegated_vesting_shares: x.delegated_vesting_shares,\n received_vesting_shares: x.received_vesting_shares,\n vesting_withdraw_rate: x.vesting_withdraw_rate,\n to_withdraw: x.to_withdraw,\n withdrawn: x.withdrawn,\n witness_votes: x.witness_votes,\n proxy: x.proxy,\n recovery_account: x.recovery_account,\n proxied_vsf_votes: x.proxied_vsf_votes,\n voting_manabar: x.voting_manabar,\n voting_power: x.voting_power,\n downvote_manabar: x.downvote_manabar,\n };\n\n // Try to parse profile from posting_json_metadata first\n let profile: AccountProfile | undefined = parseProfileMetadata(\n x.posting_json_metadata\n );\n\n // Fallback to json_metadata if posting_json_metadata didn't have a profile\n if (!profile || Object.keys(profile).length === 0) {\n try {\n const jsonMetadata = JSON.parse(x.json_metadata || \"{}\");\n if (jsonMetadata.profile) {\n profile = jsonMetadata.profile;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n // Ensure we always have a profile object\n if (!profile || Object.keys(profile).length === 0) {\n profile = {\n about: \"\",\n cover_image: \"\",\n location: \"\",\n name: \"\",\n profile_image: \"\",\n website: \"\",\n };\n }\n\n return { ...account, profile };\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { parseAccounts } from \"../utils/parse-accounts\";\nimport { FullAccount } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountsQueryOptions(usernames: string[]) {\n return queryOptions({\n queryKey: QueryKeys.accounts.list(...usernames),\n enabled: usernames.length > 0,\n queryFn: async (): Promise => {\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so the validator makes callRPC fail over to the next node\n // instead of resolving with a payload parseAccounts cannot map over.\n const response = (await callRPC(\n \"condenser_api.get_accounts\",\n [usernames],\n undefined,\n undefined,\n undefined,\n (rows) => Array.isArray(rows)\n )) as any[];\n return parseAccounts(response ?? []);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountFollowStats } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get follow count (followers and following) for an account\n */\nexport function getFollowCountQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followCount(username),\n queryFn: () =>\n callRPC(\"condenser_api.get_follow_count\", [\n username,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts following a user\n *\n * @param following - The account being followed\n * @param startFollower - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowersQueryOptions(\n following: string | undefined,\n startFollower: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followers(following!, startFollower, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_followers\", [\n following,\n startFollower,\n followType,\n limit,\n ]) as Promise,\n enabled: !!following,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts that a user is following\n *\n * @param follower - The account doing the following\n * @param startFollowing - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowingQueryOptions(\n follower: string,\n startFollowing: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.following(follower, startFollowing, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_following\", [\n follower,\n startFollowing,\n followType,\n limit,\n ]) as Promise,\n enabled: !!follower,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** `condenser_api.get_following` caps a single response at 1000 rows. */\nconst MUTED_USERS_PAGE_SIZE = 1000;\n\n/**\n * Safety valve for the paging loop: 20 pages is 20k muted accounts, far past\n * any real mute list. Bounds the work if a node ever stops advancing the\n * cursor, so a malformed response degrades to a truncated list rather than an\n * endless request loop.\n */\nconst MUTED_USERS_MAX_PAGES = 20;\n\n/**\n * Get the full list of accounts a user has muted.\n *\n * Pages until the list is exhausted instead of taking the first N. That is\n * load-bearing: this result dims muted authors in feeds and collapses their\n * comments (`entry-list-item-muted-content`, `discussion-list`), so a truncated\n * list silently renders muted accounts as though they were never muted.\n *\n * Takes no limit, on purpose. `QueryKeys.accounts.mutedUsers` keys on the\n * username alone, so a limit parameter meant callers requesting different\n * amounts shared one cache entry and whichever mounted first decided how much\n * of the list every other caller saw.\n *\n * @param username - The account whose mute list to fetch\n */\nexport function getMutedUsersQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.mutedUsers(username!),\n queryFn: async () => {\n const muted: string[] = [];\n let start = \"\";\n\n for (let page = 0; page < MUTED_USERS_MAX_PAGES; page++) {\n const response = (await callRPC(\"condenser_api.get_following\", [\n username,\n start,\n \"ignore\",\n MUTED_USERS_PAGE_SIZE,\n ])) as Follow[];\n\n if (!response?.length) {\n break;\n }\n\n let names = response.map((user) => user.following);\n\n // `start` is exclusive on Hive, so a page should not repeat the cursor.\n // Drop it defensively anyway: against a node treating `start` as\n // inclusive, this loop would otherwise re-append the same account until\n // it hit the page cap.\n if (names[0] === start) {\n names = names.slice(1);\n }\n\n if (!names.length) {\n break;\n }\n\n muted.push(...names);\n\n if (response.length < MUTED_USERS_PAGE_SIZE) {\n break;\n }\n\n start = names[names.length - 1];\n }\n\n return muted;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Lookup accounts by username prefix\n *\n * @param query - Username prefix to search for\n * @param limit - Maximum number of results (default: 50)\n */\nexport function lookupAccountsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.lookup(query, limit),\n queryFn: () =>\n callRPC(\"condenser_api.lookup_accounts\", [\n query,\n limit,\n ]) as Promise,\n enabled: !!query,\n staleTime: Infinity,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountsByUsernameQueryOptions(\n query: string,\n limit = 5,\n excludeList: string[] = []\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.search(query, excludeList),\n enabled: !!query,\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.lookup_accounts\", [query, limit])) as string[];\n return response.filter((item) =>\n excludeList.length > 0 ? !excludeList.includes(item) : true\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountProfile } from \"../types\";\n\ntype AccountProfileToken = NonNullable[number];\n\nexport type WalletMetadataCandidate = Partial & {\n currency?: string;\n show?: boolean;\n address?: string;\n publicKey?: string;\n privateKey?: string;\n username?: string;\n};\n\nexport interface CheckUsernameWalletsPendingResponse {\n exist: boolean;\n tokens?: WalletMetadataCandidate[];\n wallets?: WalletMetadataCandidate[];\n}\n\nconst RESERVED_META_KEYS = new Set([\n \"ownerPublicKey\",\n \"activePublicKey\",\n \"postingPublicKey\",\n \"memoPublicKey\",\n]);\n\ninterface WalletsEndpointResponseItem {\n token?: unknown;\n address?: unknown;\n status?: unknown;\n meta?: unknown;\n username?: unknown;\n}\n\nexport function checkUsernameWalletsPendingQueryOptions(\n username: string,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkWalletPending(username, code ?? null),\n queryFn: async () => {\n if (!username || !code) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/wallets\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code,\n }),\n }\n );\n\n if (!response.ok) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const payload = (await response.json()) as unknown;\n\n const wallets: WalletMetadataCandidate[] = Array.isArray(payload)\n ? payload.flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const walletItem = item as WalletsEndpointResponseItem;\n\n const symbol =\n typeof walletItem.token === \"string\"\n ? walletItem.token\n : undefined;\n\n if (!symbol) {\n return [];\n }\n\n const meta: Record =\n walletItem.meta && typeof walletItem.meta === \"object\"\n ? { ...(walletItem.meta as Record) }\n : {};\n\n const sanitizedMeta: Record = {};\n\n const address =\n typeof walletItem.address === \"string\" && walletItem.address\n ? walletItem.address\n : undefined;\n\n const statusShow =\n typeof walletItem.status === \"number\"\n ? walletItem.status === 3\n : undefined;\n\n const showFlag = statusShow ?? false;\n\n if (address) {\n sanitizedMeta.address = address;\n }\n\n sanitizedMeta.show = showFlag;\n\n const baseCandidate = {\n symbol,\n currency: symbol,\n address,\n show: showFlag,\n type: \"CHAIN\",\n meta: sanitizedMeta,\n } satisfies WalletMetadataCandidate;\n\n const metaTokenCandidates: WalletMetadataCandidate[] = [];\n\n for (const [metaSymbol, metaValue] of Object.entries(meta)) {\n if (typeof metaSymbol !== \"string\") {\n continue;\n }\n\n if (RESERVED_META_KEYS.has(metaSymbol)) {\n continue;\n }\n\n if (typeof metaValue !== \"string\" || !metaValue) {\n continue;\n }\n\n if (!/^[A-Z0-9]{2,10}$/.test(metaSymbol)) {\n continue;\n }\n\n metaTokenCandidates.push({\n symbol: metaSymbol,\n currency: metaSymbol,\n address: metaValue,\n show: showFlag,\n type: \"CHAIN\",\n meta: { address: metaValue, show: showFlag },\n });\n }\n\n return [baseCandidate, ...metaTokenCandidates];\n })\n : [];\n\n return {\n exist: wallets.length > 0,\n tokens: wallets.length ? wallets : undefined,\n wallets: wallets.length ? wallets : undefined,\n } satisfies CheckUsernameWalletsPendingResponse;\n },\n refetchOnMount: true,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountRelationship } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRelationshipBetweenAccountsQueryOptions(\n reference: string | undefined,\n target: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.relations(reference, target),\n enabled: !!reference && !!target,\n refetchOnMount: false,\n refetchInterval: 3_600_000,\n queryFn: async () => {\n const fallback: AccountRelationship = {\n follows: false,\n ignores: false,\n blacklists: false,\n follows_muted: false,\n follows_blacklists: false,\n };\n\n // `enabled` only gates the automatic useQuery run. fetchQuery and\n // prefetchQuery invoke queryFn regardless, so guard here as well rather\n // than sending a missing account name to the RPC and caching the result.\n if (!reference || !target) {\n return fallback;\n }\n\n const result = await callRPC(\"bridge.get_relationship_between_accounts\", [reference, target]);\n return (result ?? fallback) as AccountRelationship;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype Subscriptions = string[];\n\nexport function getAccountSubscriptionsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.subscriptions(username!),\n enabled: !!username,\n queryFn: async ({ signal }) => {\n const response = await callRPC(\"bridge.list_all_subscriptions\", {\n account: username,\n }, undefined, undefined, signal);\n return (response ?? []) as Subscriptions;\n },\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountBookmark } from \"../types\";\n\nexport function getBookmarksQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.bookmarks(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Bookmarks] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountBookmark[];\n },\n });\n}\n\nexport function getBookmarksInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.bookmarksInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bookmarks: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../types\";\n\nexport function getFavoritesQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.favorites(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountFavorite[];\n },\n });\n}\n\nexport function getFavoritesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.favoritesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/favorites?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch favorites: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n/**\n * Query options to check if a specific account is in the active user's favorites\n * @param activeUsername - The logged-in user's username\n * @param code - Access token for authentication\n * @param targetUsername - The username to check if favorited\n * @returns Query options for checking if target is favorited\n */\nexport function checkFavoriteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n targetUsername: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkFavorite(activeUsername!, targetUsername!),\n enabled: !!activeUsername && !!code && !!targetUsername,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n if (!targetUsername) {\n throw new Error(\"[SDK][Accounts][Favorites] – no target username\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-check\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n account: targetUsername,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n const result = await response.json();\n if (typeof result !== \"boolean\") {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check returned invalid type: expected boolean, got ${typeof result}`\n );\n }\n\n return result;\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetRecoveriesEmailResponse } from \"../types\";\n\nexport function getAccountRecoveriesQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n enabled: !!username && !!code,\n queryKey: QueryKeys.accounts.recoveries(username!),\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Accounts] Missing username or access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/recoveries\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n return response.json() as Promise;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountPendingRecoveryQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n enabled: !!username,\n queryKey: QueryKeys.accounts.pendingRecovery(username!),\n queryFn: () =>\n callRPC(\"database_api.find_change_recovery_account_requests\", { accounts: [username] }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountReputation } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountReputationsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.reputations(query, limit),\n enabled: !!query,\n queryFn: async (): Promise => {\n if (!query) {\n return [];\n }\n\n return callRPC(\"condenser_api.get_account_reputations\", [query, limit]) as Promise;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { utils } from \"../../../hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Transaction, OperationGroup } from \"../types/transaction\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { parseAsset, NaiMap } from \"@/modules/core/utils\";\n\nconst ops = utils.operations;\n\nexport const ACCOUNT_OPERATION_GROUPS: Record = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n};\n\nexport const ALL_ACCOUNT_OPERATIONS = [...Object.values(ACCOUNT_OPERATION_GROUPS)].reduce(\n (acc, val) => acc.concat(val),\n []\n);\n\ninterface TxPageRaw {\n entries: Transaction[];\n currentPage: number;\n}\n\n/**\n * Cursor for transaction pagination.\n * null = first request (returns newest page, API omits page param).\n * number = specific page to fetch (decrementing for older data).\n */\ntype TxCursor = number | null;\n\ninterface HafahOperation {\n op: {\n type: string;\n value: Record;\n };\n block: number;\n trx_id: string;\n op_pos: number;\n op_type_id: number;\n timestamp: string;\n virtual_op: boolean;\n operation_id: string;\n trx_in_block: number;\n}\n\ninterface HafahResponse {\n total_operations: number;\n total_pages: number;\n operations_result: HafahOperation[];\n}\n\n/**\n * Derive a safe, unique, and chronologically ordered `num` from REST fields.\n *\n * Layout: block * 10_000_000 + trx_in_block * 100 + op_pos\n * - trx_in_block: up to 99_999 (Hive max block size ~65K txs)\n * - op_pos: up to 99 (operations within a single transaction)\n * - Max value: 105_000_000 * 10_000_000 = 1.05e15, within MAX_SAFE_INTEGER (9.007e15)\n */\nfunction deriveNum(entry: HafahOperation): number {\n return entry.block * 10_000_000 + entry.trx_in_block * 100 + entry.op_pos;\n}\n\n/**\n * Strip the `_operation` suffix from the REST API type name\n * to match the Transaction type discriminants (e.g. \"transfer\").\n */\nfunction normalizeOpType(restType: string): string {\n return restType.replace(/_operation$/, \"\");\n}\n\n/**\n * Check if a value is a NAI asset object (e.g. { nai: \"@@000000021\", amount: \"1000\", precision: 3 }).\n */\nfunction isNaiAsset(v: unknown): v is { nai: string; amount: string; precision: number } {\n return typeof v === \"object\" && v !== null && \"nai\" in v && \"amount\" in v && \"precision\" in v;\n}\n\n/**\n * Convert a NAI asset object to a human-readable string like \"1.000 HIVE\".\n * Returns the value unchanged if it's not a NAI object.\n */\nfunction naiToString(v: unknown): unknown {\n if (!isNaiAsset(v)) return v;\n const parsed = parseAsset(v);\n const symbol = NaiMap[v.nai as keyof typeof NaiMap] ?? \"UNKNOWN\";\n return `${parsed.amount.toFixed(v.precision)} ${symbol}`;\n}\n\n/**\n * Convert all NAI asset objects in an operation's value to human-readable strings\n * so downstream renderers that expect \"1.000 HIVE\" don't crash with object values.\n */\nfunction normalizeOpValue(value: Record): Record {\n const result: Record = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = naiToString(v);\n }\n return result;\n}\n\n/**\n * Get account transaction history with pagination and filtering.\n * Uses the hafah-api REST endpoint for server-side op-type filtering\n * and real pagination metadata.\n *\n * @param username - Account name to get transactions for\n * @param limit - Number of transactions per page\n * @param group - Filter by operation group (transfers, market-orders, etc.)\n */\nexport function getTransactionsInfiniteQueryOptions(\n username?: string,\n limit = 20,\n group: OperationGroup | \"\" = \"\"\n) {\n const operationTypes = group\n ? ACCOUNT_OPERATION_GROUPS[group]\n : ALL_ACCOUNT_OPERATIONS;\n\n return infiniteQueryOptions<\n TxPageRaw,\n Error,\n InfiniteData,\n (string | number)[],\n TxCursor\n >({\n queryKey: QueryKeys.accounts.transactions(username ?? \"\", group, limit),\n initialPageParam: null as TxCursor,\n\n queryFn: async ({ pageParam, signal }: { pageParam: TxCursor; signal?: AbortSignal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"operation-types\": operationTypes.join(\",\"),\n \"page-size\": limit,\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number (decrementing)\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"hafah\",\n \"/accounts/{account-name}/operations\",\n params,\n undefined,\n undefined,\n signal\n )) as HafahResponse;\n\n const entries = response.operations_result.map((entry) => {\n const type = normalizeOpType(entry.op.type);\n const value = normalizeOpValue(entry.op.value);\n return {\n ...value,\n num: deriveNum(entry),\n type,\n timestamp: entry.timestamp,\n trx_id: entry.trx_id,\n } as Transaction;\n });\n\n return {\n entries,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getBotsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.bots(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/public/bots\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bots: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n refetchOnMount: true,\n staleTime: Infinity,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { ReferralItem } from \"../types/referral\";\n\ntype PageParam = { maxId?: number };\n\nexport function getReferralsInfiniteQueryOptions(username: string) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.referrals(username),\n initialPageParam: { maxId: undefined } as PageParam,\n queryFn: async ({ pageParam }: { pageParam: PageParam }) => {\n const { maxId } = pageParam ?? {};\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(`/private-api/referrals/${username}`, baseUrl);\n\n if (maxId !== undefined) {\n url.searchParams.set(\"max_id\", maxId.toString());\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referrals: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n getNextPageParam: (lastPage: ReferralItem[]) => {\n const nextMaxId = lastPage?.[lastPage.length - 1]?.id;\n return typeof nextMaxId === \"number\" ? ({ maxId: nextMaxId } as PageParam) : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ReferralStat } from \"../types/referral\";\n\ninterface ReferralStatsResponse {\n total?: number;\n rewarded?: number;\n}\n\nexport function getReferralsStatsQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.referralsStats(username),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/referrals/${username}/stats`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referral stats: ${response.status}`);\n }\n\n const data = await response.json() as ReferralStatsResponse;\n\n if (!data) {\n throw new Error(\"No Referrals for this user!\");\n }\n\n return {\n total: data.total ?? 0,\n rewarded: data.rewarded ?? 0,\n } as ReferralStat;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendsRow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FriendsPageParam {\n startFollowing: string;\n}\n\ntype FriendsPage = FriendsRow[];\n\n/**\n * Get list of friends (following/followers) with profile information\n *\n * @param following - The account whose friends to get\n * @param mode - \"following\" or \"followers\"\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Number of results per page (default: 100)\n * @param enabled - Whether query is enabled (default: true)\n */\nexport function getFriendsInfiniteQueryOptions(\n following: string,\n mode: \"following\" | \"followers\",\n options?: {\n followType?: string;\n limit?: number;\n enabled?: boolean;\n }\n) {\n const { followType = \"blog\", limit = 100, enabled = true } = options ?? {};\n\n return infiniteQueryOptions<\n FriendsPage,\n Error,\n InfiniteData,\n (string | number)[],\n FriendsPageParam\n >({\n queryKey: QueryKeys.accounts.friends(following, mode, followType, limit),\n initialPageParam: { startFollowing: \"\" } as FriendsPageParam,\n enabled,\n refetchOnMount: true,\n\n queryFn: async ({ pageParam }: { pageParam: FriendsPageParam }) => {\n const { startFollowing } = pageParam;\n\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [following, startFollowing === \"\" ? null : startFollowing, followType, limit])) as Follow[];\n\n const accountNames = response.map((e) =>\n mode === \"following\" ? e.following : e.follower\n );\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n const rows: FriendsPage = (accounts ?? []).map((a) => ({\n name: a.name,\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n }));\n\n return rows;\n },\n\n getNextPageParam: (lastPage: FriendsPage): FriendsPageParam | undefined =>\n lastPage && lastPage.length === limit\n ? { startFollowing: lastPage[lastPage.length - 1].name }\n : undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendSearchResult } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst SEARCH_LIMIT = 30;\n\n/**\n * Search friends (following/followers) by query string\n *\n * @param username - The account whose friends to search\n * @param mode - \"following\" or \"followers\"\n * @param query - Search query string\n */\nexport function getSearchFriendsQueryOptions(\n username: string,\n mode: \"following\" | \"followers\",\n query: string\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.searchFriends(username, mode, query),\n refetchOnMount: false,\n enabled: false, // Manual query via refetch\n queryFn: async (): Promise => {\n if (!query) return [];\n\n const start = query.slice(0, -1);\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [username, start, \"blog\", 1000])) as Follow[];\n\n const accountNames = response\n .map((e) => (mode === \"following\" ? e.following : e.follower))\n .filter((name) => name.toLowerCase().includes(query.toLowerCase()))\n .slice(0, SEARCH_LIMIT);\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n return (\n accounts?.map((a) => ({\n name: a.name,\n full_name: a.metadata.profile?.name || \"\",\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n })) ?? []\n );\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsQueryOptions(limit = 20) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTags(),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags\n .filter((x) => x.name !== \"\")\n .filter((x) => !x.name.startsWith(\"hive-\"))\n .map((x) => x.name)\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length > 0\n ? { afterTag: lastPage[lastPage.length - 1] }\n : undefined,\n staleTime: 60 * 60 * 1000, // 1 hour — tags change slowly\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { isCommunity } from \"@/modules/core/utils\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsWithStatsQueryOptions(limit = 250) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTagsWithStats(limit),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags.filter((tag) => tag.name !== \"\").filter((tag) => !isCommunity(tag.name))\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length ? { afterTag: lastPage[lastPage.length - 1].name } : undefined,\n staleTime: Infinity,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\n\nexport function getFragmentsQueryOptions(username: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.fragments(username),\n queryFn: async () => {\n if (!code) {\n return [];\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return response.json() as Promise;\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getFragmentsInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.fragmentsInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/fragments?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch fragments: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { ConfigManager, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n// TODO: replace any with Entry\nexport function getPromotedPostsQuery(\n type: \"feed\" | \"waves\" = \"feed\"\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.promoted(type),\n queryFn: async () => {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/promoted-entries\", baseUrl);\n if (type === \"waves\") {\n url.searchParams.append(\"short_content\", \"1\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n const data = await response.json();\n return data as T[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry, Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getEntryActiveVotesQueryOptions(entry?: Entry) {\n return queryOptions({\n queryKey: QueryKeys.posts.entryActiveVotes(entry?.author, entry?.permlink),\n queryFn: async () => {\n return callRPC(\"condenser_api.get_active_votes\", [\n entry?.author,\n entry?.permlink,\n ]) as Promise;\n },\n enabled: !!entry,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a specific user's vote on a post\n * Useful when post has >1000 votes to efficiently get one user's vote\n *\n * @param username - The voter's username\n * @param author - The post author\n * @param permlink - The post permlink\n */\nexport function getUserPostVoteQueryOptions(\n username: string | undefined,\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.userPostVote(username!, author!, permlink!),\n queryFn: async () => {\n const result = await callRPC(\"database_api.list_votes\", {\n start: [username, author, permlink],\n limit: 1,\n order: \"by_voter_comment\"\n });\n\n // Return first vote if found, otherwise null\n return (result?.votes?.[0] || null) as Vote | null;\n },\n enabled: !!username && !!author && !!permlink,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.content(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentRepliesQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.contentReplies(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content_replies\", {\n author,\n permlink,\n }) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostHeaderQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.postHeader(author, permlink),\n queryFn: async () => {\n return callRPC(\"bridge.get_post_header\", {\n author,\n permlink,\n }) as Promise;\n },\n initialData: null,\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { Entry } from \"../types\";\n\n/**\n * Filters and censors entries that match DMCA patterns\n * @param entry - Single entry or array of entries to filter\n * @returns Filtered entry/entries with DMCA content censored.\n * Note: Can return null/undefined if input is falsy - callers should guard against this.\n */\nexport function filterDmcaEntry(entry: Entry): Entry | null | undefined;\nexport function filterDmcaEntry(entries: Entry[]): Entry[];\nexport function filterDmcaEntry(entryOrEntries: Entry | Entry[] | null | undefined): Entry | Entry[] | null | undefined {\n if (Array.isArray(entryOrEntries)) {\n // Array elements are non-null Entries, so applyFilter never returns nullish here.\n return entryOrEntries.map((entry) => applyFilter(entry)) as Entry[];\n }\n return applyFilter(entryOrEntries);\n}\n\nfunction applyFilter(entry: Entry | null | undefined): Entry | null | undefined {\n if (!entry) return entry;\n\n const entryPath = `@${entry.author}/${entry.permlink}`;\n const isDmca =\n CONFIG.dmcaPatterns.includes(entryPath) ||\n CONFIG.dmcaPatternRegexes.some((regex) => regex.test(entryPath));\n\n if (isDmca) {\n return {\n ...entry,\n body: \"This post is not available due to a copyright/fraudulent claim.\",\n title: \"\",\n };\n }\n\n return entry;\n}\n","import { callWithQuorum } from \"../../hive-tx\";\nimport { Entry } from \"@/modules/posts/types\";\n\n/**\n * When the primary node returns null for a get_post call,\n * verify by querying multiple random nodes. If any node\n * returns the post, it exists (the first node was lagging).\n *\n * Uses callWithQuorum(quorum=1) which shuffles and queries\n * nodes in batches. Since it shuffles, it's unlikely to hit\n * the same node that just returned null first.\n */\nexport async function verifyPostOnAlternateNode(\n author: string,\n permlink: string,\n observer: string\n): Promise {\n try {\n const response = await callWithQuorum(\"bridge.get_post\", {\n author,\n permlink,\n observer,\n }, 1);\n\n if (\n response &&\n typeof response === \"object\" &&\n (response as Entry).author === author &&\n (response as Entry).permlink === permlink\n ) {\n return response as Entry;\n }\n } catch {\n // All nodes failed or returned null\n }\n\n return null;\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { verifyPostOnAlternateNode } from \"@/modules/bridge/verify-on-alternate-node\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostQueryOptions(\n author: string,\n permlink?: string,\n observer = \"\",\n num?: number\n) {\n const cleanPermlink = permlink?.trim();\n const entryPath = `/@${author}/${cleanPermlink ?? \"\"}`;\n\n return queryOptions({\n queryKey: QueryKeys.posts.entry(entryPath),\n queryFn: async () => {\n if (!cleanPermlink || cleanPermlink === \"undefined\") {\n return null;\n }\n\n // hive-tx tries nodes in order; the first healthy node (index 0) handles this call.\n // If it returns null, verifyPostOnAlternateNode skips index 0 and tries others.\n const response = await callRPC(\"bridge.get_post\", {\n author,\n permlink: cleanPermlink,\n observer,\n });\n\n if (!response) {\n // Primary node returned null — verify on alternate nodes\n // to guard against sync lag returning null for valid posts\n const verified = await verifyPostOnAlternateNode(author, cleanPermlink, observer);\n if (!verified) {\n return null;\n }\n const verifiedEntry = num !== undefined ? { ...verified, num } as Entry : verified as Entry;\n return filterDmcaEntry(verifiedEntry);\n }\n\n const entry = num !== undefined ? { ...response, num } as Entry : response as Entry;\n return filterDmcaEntry(entry);\n },\n enabled:\n !!author &&\n !!permlink &&\n permlink.trim() !== \"\" &&\n permlink.trim() !== \"undefined\",\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { AccountRelationship, Profile } from \"@/modules/accounts/types\";\nimport { Community } from \"@/modules/communities/types/community\";\nimport { Subscription } from \"@/modules/communities/types/subscription\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { filterDmcaEntry } from \"@/modules/posts/utils/filter-dmca-entries\";\n\ntype BridgeParams = Record | unknown[];\n\nexport function bridgeApiCall(endpoint: string, params: BridgeParams, signal?: AbortSignal): Promise {\n return callRPC(`bridge.${endpoint}`, params, undefined, undefined, signal) as Promise;\n}\n\nexport async function resolvePost(\n post: Entry,\n observer: string,\n num?: number,\n signal?: AbortSignal\n): Promise {\n const { json_metadata: json } = post;\n\n if (json?.original_author && json?.original_permlink && json.tags?.[0] === \"cross-post\") {\n try {\n const resp = await getPost(\n json.original_author,\n json.original_permlink,\n observer,\n num,\n signal\n );\n if (resp) {\n return {\n ...post,\n original_entry: resp,\n num,\n };\n }\n return post;\n } catch {\n return post;\n }\n }\n\n return { ...post, num };\n}\n\nasync function resolvePosts(posts: Entry[], observer: string, signal?: AbortSignal): Promise {\n const validatedPosts = posts.map(validateEntry);\n const resolved = await Promise.all(validatedPosts.map((p) => resolvePost(p, observer, undefined, signal)));\n return filterDmcaEntry(resolved) as Entry[];\n}\n\nexport async function getPostsRanked(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_ranked_posts\", {\n sort,\n start_author,\n start_permlink,\n limit,\n tag,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_ranked_posts returned ${typeof resp} instead of an array for sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\nexport async function getAccountPosts(\n sort: string,\n account: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n if (CONFIG.dmcaAccounts.includes(account)) {\n return [];\n }\n\n const resp = await bridgeApiCall(\"get_account_posts\", {\n sort,\n account,\n start_author,\n start_permlink,\n limit,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_account_posts returned ${typeof resp} instead of an array for account=${account}, sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\n/**\n * Validates that an Entry object has required properties with non-null values.\n */\nfunction validateEntry(entry: Entry): Entry {\n const newEntry: Entry = {\n ...entry,\n active_votes: Array.isArray(entry.active_votes) ? [...entry.active_votes] : [],\n beneficiaries: Array.isArray(entry.beneficiaries) ? [...entry.beneficiaries] : [],\n blacklists: Array.isArray(entry.blacklists) ? [...entry.blacklists] : [],\n replies: Array.isArray(entry.replies) ? [...entry.replies] : [],\n stats: entry.stats ? { ...entry.stats } : null,\n };\n\n const requiredStringProps: (keyof Entry)[] = [\n \"author\",\n \"title\",\n \"body\",\n \"created\",\n \"category\",\n \"permlink\",\n \"url\",\n \"updated\",\n ];\n\n for (const prop of requiredStringProps) {\n if (newEntry[prop] == null) {\n (newEntry as any)[prop] = \"\";\n }\n }\n\n if (newEntry.author_reputation == null) {\n newEntry.author_reputation = 0;\n }\n if (newEntry.children == null) {\n newEntry.children = 0;\n }\n if (newEntry.depth == null) {\n newEntry.depth = 0;\n }\n if (newEntry.net_rshares == null) {\n newEntry.net_rshares = 0;\n }\n if (newEntry.payout == null) {\n newEntry.payout = 0;\n }\n if (newEntry.percent_hbd == null) {\n newEntry.percent_hbd = 0;\n }\n\n if (!newEntry.stats) {\n newEntry.stats = {\n flag_weight: 0,\n gray: false,\n hide: false,\n total_votes: 0,\n };\n }\n\n if (newEntry.author_payout_value == null) {\n newEntry.author_payout_value = \"0.000 HBD\";\n }\n if (newEntry.curator_payout_value == null) {\n newEntry.curator_payout_value = \"0.000 HBD\";\n }\n if (newEntry.max_accepted_payout == null) {\n newEntry.max_accepted_payout = \"1000000.000 HBD\";\n }\n if (newEntry.payout_at == null) {\n newEntry.payout_at = \"\";\n }\n if (newEntry.pending_payout_value == null) {\n newEntry.pending_payout_value = \"0.000 HBD\";\n }\n if (newEntry.promoted == null) {\n newEntry.promoted = \"0.000 HBD\";\n }\n\n if (newEntry.is_paidout == null) {\n newEntry.is_paidout = false;\n }\n\n return newEntry;\n}\n\nexport async function getPost(\n author: string = \"\",\n permlink: string = \"\",\n observer: string = \"\",\n num?: number,\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_post\", {\n author,\n permlink,\n observer,\n }, signal);\n\n if (resp) {\n const validatedEntry = validateEntry(resp);\n const post = await resolvePost(validatedEntry, observer, num, signal);\n return filterDmcaEntry(post) as Entry;\n }\n\n return undefined;\n}\n\nexport async function getPostHeader(\n author: string = \"\",\n permlink: string = \"\"\n): Promise {\n const resp = await bridgeApiCall(\"get_post_header\", {\n author,\n permlink,\n });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getDiscussion(\n author: string,\n permlink: string,\n observer?: string\n): Promise | null> {\n const resp = await bridgeApiCall | null>(\"get_discussion\", {\n author,\n permlink,\n observer: observer || author,\n });\n\n if (resp) {\n const validatedResp: Record = {};\n for (const [key, entry] of Object.entries(resp)) {\n validatedResp[key] = validateEntry(entry);\n }\n return validatedResp;\n }\n return resp;\n}\n\nexport async function getCommunity(\n name: string,\n observer: string | undefined = \"\"\n): Promise {\n return bridgeApiCall(\"get_community\", { name, observer });\n}\n\nexport async function getCommunities(\n last: string = \"\",\n limit: number = 100,\n query?: string | null,\n sort: string = \"rank\",\n observer: string = \"\"\n): Promise {\n return bridgeApiCall(\"list_communities\", {\n last,\n limit,\n query,\n sort,\n observer,\n });\n}\n\nexport async function normalizePost(post: unknown): Promise {\n const resp = await bridgeApiCall(\"normalize_post\", { post });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getSubscriptions(account: string): Promise {\n return bridgeApiCall(\"list_all_subscriptions\", { account });\n}\n\nexport async function getSubscribers(community: string): Promise {\n return bridgeApiCall(\"list_subscribers\", { community });\n}\n\nexport async function getRelationshipBetweenAccounts(\n follower: string,\n following: string\n): Promise {\n return bridgeApiCall(\"get_relationship_between_accounts\", [\n follower,\n following,\n ]);\n}\n\nexport async function getProfiles(\n accounts: string[],\n observer?: string\n): Promise {\n return bridgeApiCall(\"get_profiles\", { accounts, observer });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getDiscussion } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport enum SortOrder {\n trending = \"trending\",\n author_reputation = \"author_reputation\",\n votes = \"votes\",\n created = \"created\",\n}\n\nfunction parseAsset(value: string): { amount: number; symbol: string } {\n const match = value.match(/^(\\d+\\.?\\d*)\\s*([A-Z]+)$/);\n if (!match) return { amount: 0, symbol: \"\" };\n return {\n amount: parseFloat(match[1]),\n symbol: match[2],\n };\n}\n\nexport function sortDiscussions(\n entry: Entry,\n discussion: Entry[],\n order: SortOrder\n) {\n const allPayout = (c: Entry) =>\n parseAsset(c.pending_payout_value).amount +\n parseAsset(c.author_payout_value).amount +\n parseAsset(c.curator_payout_value).amount;\n\n const absNegative = (a: Entry) => a.net_rshares < 0;\n const isPinned = (a: Entry) =>\n entry.json_metadata?.pinned_reply === `${a.author}/${a.permlink}`;\n\n const sortOrders = {\n trending: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const _a = allPayout(a);\n const _b = allPayout(b);\n if (_a !== _b) {\n return _b - _a;\n }\n\n return 0;\n },\n author_reputation: (a: Entry, b: Entry) => {\n const keyA = a.author_reputation;\n const keyB = b.author_reputation;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n votes: (a: Entry, b: Entry) => {\n const keyA = a.children;\n const keyB = b.children;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n created: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const keyA = Date.parse(a.created);\n const keyB = Date.parse(b.created);\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n };\n\n const sorted = discussion.sort(sortOrders[order]);\n const pinnedIndex = sorted.findIndex((i) => isPinned(i));\n const pinned = sorted[pinnedIndex];\n if (pinnedIndex >= 0) {\n sorted.splice(pinnedIndex, 1);\n sorted.unshift(pinned);\n }\n return sorted;\n}\n\nexport function getDiscussionsQueryOptions(\n entry: Entry,\n order: SortOrder = SortOrder.created,\n enabled: boolean = true,\n observer?: string\n) {\n // Anonymous readers fall back to CONFIG.defaultObserver rather than the post\n // author. Author-as-observer only helps the minority of authors who curate a\n // mute list; everyone else's comment section came back unfiltered, so the\n // shared moderation account is the better default for logged-out traffic.\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussions(entry?.author, entry?.permlink, order, resolvedObserver),\n queryFn: async () => {\n if (!entry) {\n return [];\n }\n\n const response = await callRPC(\"bridge.get_discussion\", {\n author: entry.author,\n permlink: entry.permlink,\n observer: resolvedObserver,\n });\n\n const results = response\n ? Array.from(Object.values(response as Record))\n : [];\n return filterDmcaEntry(results);\n },\n enabled: enabled && !!entry,\n select: (data: Entry[]) => sortDiscussions(entry, data, order),\n // Preserve optimistic entries during refetch by using structural sharing\n // This ensures newly added comments (is_optimistic: true) aren't wiped out\n // when blockchain hasn't indexed them yet\n structuralSharing: (oldData, newData) => {\n if (!oldData || !newData) return newData;\n\n // Find optimistic entries in old data that aren't in new data yet\n const optimisticEntries = (oldData as Entry[]).filter(\n (entry: Entry) => entry.is_optimistic === true\n );\n\n const fetchedPermlinks = new Set(\n (newData as Entry[]).map((e: Entry) => `${e.author}/${e.permlink}`)\n );\n\n const missingOptimistic = optimisticEntries.filter(\n (opt: Entry) => !fetchedPermlinks.has(`${opt.author}/${opt.permlink}`)\n );\n\n // If there are optimistic entries missing from new data, preserve them\n if (missingOptimistic.length > 0) {\n return [...(newData as Entry[]), ...missingOptimistic];\n }\n\n return newData;\n },\n });\n}\n\nexport function getDiscussionQueryOptions(\n author: string,\n permlink: string,\n observer?: string,\n enabled = true\n) {\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussion(author, permlink, resolvedObserver),\n enabled: enabled && !!author && !!permlink,\n queryFn: async () =>\n getDiscussion(author, permlink, resolvedObserver) as Promise | null>,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getAccountPosts } from \"@/modules/bridge\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n hasNextPage: boolean;\n};\ntype Page = Entry[];\n\nexport function getAccountPostsInfiniteQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return infiniteQueryOptions<\n Page,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.accountPosts(username ?? \"\", filter, limit, observer),\n enabled: !!username && enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n hasNextPage: true,\n } as PageParam,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!pageParam?.hasNextPage || !username) return [];\n\n const response = await getAccountPosts(\n filter,\n username,\n pageParam.author ?? \"\",\n pageParam.permlink ?? \"\",\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n\n getNextPageParam: (lastPage: Page): PageParam | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n // Only consider there's a next page if we got a full page of results\n // A partial page means we've reached the end\n const hasNextPage = (lastPage?.length ?? 0) === limit;\n\n if (!hasNextPage) {\n return undefined;\n }\n\n return {\n author: last?.author,\n permlink: last?.permlink,\n hasNextPage,\n };\n },\n });\n}\n\nexport function getAccountPostsQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.accountPostsPage(username ?? \"\", filter, start_author, start_permlink, limit, observer),\n enabled: !!username && enabled,\n queryFn: async ({ signal } = {} as any) => {\n if (!username) {\n return [];\n }\n\n const response = await getAccountPosts(\n filter,\n username,\n start_author,\n start_permlink,\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getPostsRanked } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n};\n\ninterface GetPostsRankedOptions {\n resolvePosts?: boolean;\n}\n\n/**\n * `select` runs on every render, and React Query only reuses its previous\n * result when both the data and the select function are unchanged. These\n * options are rebuilt on each render, so an inline arrow would be a new\n * function every time and every page would be re-sorted on every render.\n * One stable function per sort keeps that memoization working.\n */\nconst displaySelects = new Map<\n string,\n (data: InfiniteData) => InfiniteData\n>();\n\nfunction displaySelect(sort: string) {\n let select = displaySelects.get(sort);\n if (!select) {\n select = (data) => ({\n ...data,\n pages: data.pages.map((page) => orderForDisplay(page, sort)),\n });\n displaySelects.set(sort, select);\n }\n return select;\n}\n\n/**\n * Display order for one page.\n *\n * Pinned entries are captured before the created-date sort: the bridge surfaces\n * them at the head of the response in the community moderators' chosen order,\n * which the sort would scatter by age. Every pin is kept, since an earlier\n * post-sort find() kept one and silently dropped the rest, so multi-pin\n * communities never displayed their other pinned posts. Pins only occur on the\n * first page, cursor pages return none, so this is a no-op elsewhere.\n *\n * Applied in `select` rather than in the query function so it cannot reach the\n * pagination cursor.\n */\nfunction orderForDisplay(page: Entry[], sort: string): Entry[] {\n const pinned = page.filter((entry) => entry.stats?.is_pinned);\n const rest = page.filter((entry) => !entry.stats?.is_pinned);\n\n if (sort === \"hot\") {\n return [...pinned, ...rest];\n }\n\n const byCreated = [...rest].sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n return [...pinned, ...byCreated];\n}\n\nexport function getPostsRankedInfiniteQueryOptions(\n sort: string,\n tag: string,\n limit = 20,\n observer = \"\",\n enabled = true,\n _options: GetPostsRankedOptions = {}\n) {\n return infiniteQueryOptions<\n Entry[],\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.postsRanked(sort, tag, limit, observer),\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await callRPC(\"bridge.get_ranked_posts\", {\n sort,\n start_author: pageParam.author,\n start_permlink: pageParam.permlink,\n limit,\n tag: sanitizedTag,\n observer,\n }, undefined, undefined, signal);\n\n if (response === null || response === undefined) {\n return [];\n }\n\n if (!Array.isArray(response)) {\n throw new Error(\n `[SDK] get_ranked_posts returned ${typeof response} for sort=${sort}`\n );\n }\n\n // Kept in the bridge's own order. getNextPageParam takes the cursor from\n // the last entry of the page this returns, and the bridge continues from\n // that entry in ITS ranking, so reordering here made the next request\n // start from the middle of the previous ranked page: for trending, payout\n // and muted the last entry by date is not the last entry by rank, and\n // scrolling repeated some posts and skipped others. Display order is\n // applied in `select`, which React Query runs after pagination.\n return filterDmcaEntry(response as Entry[]);\n },\n select: displaySelect(sort),\n enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n } as PageParam,\n getNextPageParam: (lastPage: Entry[]) => {\n // React Query reads \"there is no next page\" from undefined alone, so\n // returning an object here always left it true. An infinite list\n // then keeps calling fetchNextPage at the end of the feed, appending an\n // empty page each time: the query state churns and the cache grows for as\n // long as the reader sits at the bottom.\n const last = lastPage?.[lastPage.length - 1];\n if (!last) {\n return undefined;\n }\n\n return { author: last.author, permlink: last.permlink };\n },\n });\n}\n\nexport function getPostsRankedQueryOptions(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.postsRankedPage(sort, start_author, start_permlink, limit, tag, observer),\n enabled,\n queryFn: async ({ signal } = {} as any) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await getPostsRanked(\n sort,\n start_author,\n start_permlink,\n limit,\n sanitizedTag,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface BlogEntry {\n author: string;\n permlink: string;\n blog: string;\n reblog_on: string;\n reblogged_on: string;\n entry_id: number;\n}\n\nexport interface Reblog {\n author: string;\n permlink: string;\n}\n\nexport function getReblogsQueryOptions(\n username?: string,\n activeUsername?: string,\n limit = 200\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.reblogs(username ?? \"\", limit),\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.get_blog_entries\", [\n username ?? activeUsername,\n 0,\n limit,\n ])) as BlogEntry[];\n\n return response\n .filter(\n (i) =>\n i.author !== activeUsername &&\n !i.reblogged_on.startsWith(\"1970-\")\n )\n .map((i) => ({ author: i.author, permlink: i.permlink })) as Reblog[];\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of usernames who reblogged a specific post\n */\nexport function getRebloggedByQueryOptions(author?: string, permlink?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.rebloggedBy(author ?? \"\", permlink ?? \"\"),\n queryFn: async () => {\n if (!author || !permlink) {\n return [];\n }\n\n const response = (await callRPC(\"condenser_api.get_reblogged_by\", [author, permlink])) as string[];\n\n return Array.isArray(response) ? response : [];\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Schedule } from \"../types/schedule\";\n\nexport function getSchedulesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.schedules(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getSchedulesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.schedulesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/schedules?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Draft } from \"../types/draft\";\n\nexport function getDraftsQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.drafts(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getDraftsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.draftsInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/drafts?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n const json = await response.json();\n // Normalize response for backwards compatibility\n // If backend doesn't support wrapped format yet, it returns Draft[]\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { UserImage } from \"../types/user-image\";\n\nasync function fetchUserImages(code: string | undefined): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nexport function getImagesQueryOptions(username?: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.images(username),\n queryFn: async () => {\n if (!username || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getGalleryImagesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.galleryImages(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getImagesInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.imagesInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/images?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nexport function getCommentHistoryQueryOptions(author: string, permlink: string, onlyMeta = false) {\n return queryOptions({\n queryKey: QueryKeys.posts.commentHistory(author, permlink, onlyMeta),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n onlyMeta: onlyMeta ? \"1\" : \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nfunction makeEntryPath(author: string, permlink: string): string {\n const cleanAuthor = author?.trim();\n const cleanPermlink = permlink?.trim();\n\n if (!cleanAuthor || !cleanPermlink) {\n throw new Error(\"Invalid entry path: author and permlink are required\");\n }\n\n // Normalize by removing any leading @ or / characters\n const normalizedAuthor = cleanAuthor.replace(/^@+/, \"\");\n const normalizedPermlink = cleanPermlink.replace(/^\\/+/, \"\");\n\n if (!normalizedAuthor || !normalizedPermlink) {\n throw new Error(\"Invalid entry path: author and permlink cannot be empty after normalization\");\n }\n\n return `@${normalizedAuthor}/${normalizedPermlink}`;\n}\n\nexport interface DeletedEntry {\n body: string;\n title: string;\n tags: string[];\n}\n\nexport function getDeletedEntryQueryOptions(author: string, permlink: string) {\n const cleanPermlink = permlink?.trim();\n const cleanAuthor = author?.trim();\n const isValid =\n !!cleanAuthor && !!cleanPermlink && cleanPermlink !== \"undefined\";\n\n const entryPath = isValid ? makeEntryPath(cleanAuthor, cleanPermlink) : \"\";\n\n return queryOptions({\n queryKey: QueryKeys.posts.deletedEntry(entryPath),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink: cleanPermlink || \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n select: (history): DeletedEntry | null => {\n if (!history?.list?.[0]) {\n return null;\n }\n const { body, title, tags } = history.list[0];\n return {\n body,\n title,\n tags,\n };\n },\n enabled: isValid,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { PostTipsResponse } from \"../types/post-tip\";\n\n/**\n * Tips for a single post.\n *\n * Addressed as a GET so the response can be cached. This was a POST, which no\n * cache may store, so the same tip totals were refetched on every mount. The\n * endpoint keys off nothing but author and permlink and needs no auth, and now\n * serves a Cache-Control, so a repeat read can come from the browser instead of\n * the network.\n *\n * `staleTime` is kept at or below the endpoint's own cache window rather than\n * extending it. react-query cannot see how old a response already was when\n * `fetch` served it from the browser cache, so it restarts its window from zero\n * on a body that may already be near expiry; worst-case staleness is the two\n * windows added together.\n */\nexport function getPostTipsQueryOptions(author: string, permlink: string, isEnabled = true) {\n return queryOptions({\n queryKey: QueryKeys.posts.tips(author, permlink),\n queryFn: async () => {\n const path = `/private-api/post-tips/${encodeURIComponent(author)}/${encodeURIComponent(permlink)}`;\n const response = await fetch(CONFIG.privateApiHost + path, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post tips: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink && isEnabled,\n staleTime: 60 * 1000,\n });\n}\n","import { Entry, WaveEntry } from \"../types\";\nimport { getDiscussionsQueryOptions, SortOrder } from \"../queries/get-discussions-query-options\";\nimport { CONFIG } from \"@/modules/core\";\n\ntype EntryWithPostId = Entry & { post_id: number };\n\nfunction normalizeContainer(entry: EntryWithPostId, host: string): WaveEntry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds send the publish time as `timestamp`, not `created`.\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n host\n } as WaveEntry;\n}\n\nfunction normalizeParent(entry: EntryWithPostId): Entry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id\n } as Entry;\n}\n\nexport function normalizeWaveEntryFromApi(\n entry:\n | (Entry & { post_id: number; container?: EntryWithPostId | null; parent?: EntryWithPostId | null })\n | null\n | undefined,\n host: string\n): WaveEntry | null {\n if (!entry) {\n return null;\n }\n\n const containerSource = entry.container ?? entry;\n const container = normalizeContainer(containerSource, host);\n\n const parent = entry.parent ? normalizeParent(entry.parent) : undefined;\n\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds (following / tag / account) send the publish\n // time as `timestamp`, not `created`; map it so the relative time renders on\n // every card (the For You feed already carries a real `created` from Hive RPC).\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n // The private-api waves feeds omit max_accepted_payout; default it (and the\n // payout strings) to the Hive shape so payout-rendering consumers run their\n // pending+author+curator summation instead of treating the value as missing.\n max_accepted_payout: entry.max_accepted_payout || \"1000000.000 HBD\",\n pending_payout_value: entry.pending_payout_value || \"0.000 HBD\",\n author_payout_value: entry.author_payout_value || \"0.000 HBD\",\n curator_payout_value: entry.curator_payout_value || \"0.000 HBD\",\n host,\n container,\n parent\n } as WaveEntry;\n}\n\nexport function toEntryArray(x: unknown): Entry[] {\n return Array.isArray(x) ? (x as Entry[]) : [];\n}\n\nexport async function getVisibleFirstLevelThreadItems(\n container: WaveEntry\n): Promise {\n const queryOptions = getDiscussionsQueryOptions(container, SortOrder.created, true);\n const discussionItemsRaw = await CONFIG.queryClient.fetchQuery(queryOptions);\n const discussionItems = toEntryArray(discussionItemsRaw);\n\n if (discussionItems.length <= 1) {\n return [];\n }\n\n const firstLevelItems = discussionItems.filter(\n ({ parent_author, parent_permlink }) =>\n parent_author === container.author && parent_permlink === container.permlink\n );\n\n if (firstLevelItems.length === 0) {\n return [];\n }\n\n const visibleItems = firstLevelItems.filter((item) => !item.stats?.gray);\n\n return visibleItems;\n}\n\nexport function mapThreadItemsToWaveEntries(\n items: Entry[],\n container: WaveEntry,\n host: string\n): WaveEntry[] {\n if (items.length === 0) {\n return [];\n }\n\n return items\n .map((item) => {\n const parent = items.find(\n (i) =>\n i.author === item.parent_author &&\n i.permlink === item.parent_permlink &&\n i.author !== host\n );\n\n return {\n ...item,\n id: item.post_id,\n host,\n container,\n parent\n } as WaveEntry;\n })\n .filter((entry) => entry.container.post_id !== entry.post_id)\n .sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\ntype WavesFeedRow = Entry & {\n post_id: number;\n // The wave's container account (e.g. ecency.waves, leothreads), so a mixed\n // cross-container feed can be rendered and acted on per item.\n host?: string;\n // Opaque keyset cursor pointing just past this row.\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type WavesFeedEntry = WaveEntry & { _cursor?: string };\n\nexport interface WavesFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only waves carrying this tag (across all containers). */\n tag?: string;\n /** Only waves from accounts this user follows (across all containers). */\n following?: string;\n /** Only this author's waves (across all containers); the per-author feed. */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedFeedParams {\n containers: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: WavesFeedParams): NormalizedFeedParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n following: params.following?.trim().toLowerCase() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchWavesFeedPage(\n { containers, tag, following, author, observer, limit }: NormalizedFeedParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/feed\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (following) {\n url.searchParams.set(\"following\", following);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves feed: ${response.status}`);\n }\n\n const data = (await response.json()) as WavesFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return { ...entry, _cursor: row._cursor } as WavesFeedEntry;\n })\n .filter((entry): entry is WavesFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container waves feed (the chronological \"For You\" stream, and\n * the Following / Tag feeds via filters).\n *\n * A single esync-backed call returns the newest waves across every indexed\n * container, already merged and time-ordered, with keyset (cursor) pagination,\n * replacing the per-container chain-RPC scan. The optional `tag` / `following`\n * filters narrow the same stream without changing the cursor.\n */\nexport function getWavesFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchWavesFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination. A short page (fewer than `limit` rows) is the\n // end-of-feed signal; on a full page the server always returns the next\n // cursor on the last row. Stopping (rather than looping) is the safe\n // fallback if that cursor were ever absent.\n getNextPageParam: (lastPage: WavesFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n\n/**\n * Page-one of the combined feed as a plain (non-infinite) query under a distinct\n * key, for the \"new waves\" poll. Separate from {@link getWavesFeedQueryOptions}\n * so refreshing it never truncates the infinite feed's loaded pages.\n */\nexport function getWavesLatestFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return queryOptions({\n queryKey: [\n ...QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n \"latest\"\n ],\n staleTime: 0,\n queryFn: ({ signal }) => fetchWavesFeedPage(normalized, undefined, signal)\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\n/** The 3Speak video a short embeds, as returned by esync /api/waves/shorts. */\nexport interface ShortVideo {\n platform: string;\n author: string;\n permlink: string;\n embed_url: string;\n thumbnail_url: string | null;\n duration_secs: number | null;\n}\n\ntype ShortsFeedRow = Entry & {\n post_id: number;\n host?: string;\n video?: ShortVideo;\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type ShortsFeedEntry = WaveEntry & {\n /** The embedded 3Speak video reference for the reels player. */\n video?: ShortVideo;\n _cursor?: string;\n};\n\nexport interface ShortsFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only shorts carrying this tag (across all containers). */\n tag?: string;\n /** Only this author's shorts (across all containers). */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedShortsParams {\n containers: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: ShortsFeedParams): NormalizedShortsParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchShortsFeedPage(\n { containers, tag, author, observer, limit }: NormalizedShortsParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/shorts\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch shorts feed: ${response.status}`);\n }\n\n const data = (await response.json()) as ShortsFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return {\n ...entry,\n // A lightweight feed row may omit active_votes; EntryVoteBtn (which uses\n // this entry as React Query initialData) calls .some() on it, so default\n // to an empty array to avoid a crash before the full post query loads.\n active_votes: entry.active_votes ?? [],\n video: row.video,\n _cursor: row._cursor\n } as ShortsFeedEntry;\n })\n .filter((entry): entry is ShortsFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container shorts (reels) feed: waves that embed a 3Speak video.\n *\n * Backed by esync /api/waves/shorts (via /private-api/waves/shorts). Same shape,\n * keyset pagination and filters as {@link getWavesFeedQueryOptions}, plus a\n * `video` block per item for the vertical reels player. There is no `following`\n * filter in v1.\n */\nexport function getShortsFeedQueryOptions(params: ShortsFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.shortsFeed({ containers, tag, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchShortsFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination: a short page (fewer than `limit` rows) ends the feed;\n // on a full page the server returns the next cursor on the last row.\n getNextPageParam: (lastPage: ShortsFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport {\n getVisibleFirstLevelThreadItems,\n mapThreadItemsToWaveEntries\n} from \"../utils/waves-helpers\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst THREAD_CONTAINER_BATCH_SIZE = 5;\nconst MAX_CONTAINERS_TO_SCAN = 50;\n\ninterface ThreadsResult {\n entries: WaveEntry[];\n}\n\nasync function getThreads(\n host: string,\n pageParam?: WaveEntry\n): Promise {\n let startAuthor = pageParam?.author;\n let startPermlink = pageParam?.permlink;\n let scannedContainers = 0;\n let skipContainerId = pageParam?.post_id;\n\n while (scannedContainers < MAX_CONTAINERS_TO_SCAN) {\n interface AccountPostsParams {\n sort: string;\n account: string;\n limit: number;\n start_author?: string;\n start_permlink?: string;\n }\n\n const rpcParams: AccountPostsParams = {\n sort: \"posts\", // ProfileFilter.posts\n account: host,\n limit: THREAD_CONTAINER_BATCH_SIZE,\n ...(startAuthor ? { start_author: startAuthor } : {}),\n ...(startPermlink ? { start_permlink: startPermlink } : {})\n };\n\n let containers: WaveEntry[];\n try {\n containers = (await callRPC(\"bridge.get_account_posts\", rpcParams)) as WaveEntry[];\n } catch (err) {\n console.error(\"[SDK] getThreads get_account_posts error:\", err);\n return null;\n }\n\n if (!containers || containers.length === 0) {\n return null;\n }\n\n const normalizedContainers = containers.map((container) => {\n container.id = container.post_id;\n container.host = host;\n return container;\n });\n\n for (const container of normalizedContainers) {\n if (skipContainerId && container.post_id === skipContainerId) {\n skipContainerId = undefined;\n continue;\n }\n\n scannedContainers += 1;\n\n if (container.stats?.gray) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n let visibleItems: Entry[];\n try {\n visibleItems = await getVisibleFirstLevelThreadItems(container);\n } catch (err) {\n // A transient bridge.get_discussion failure (RPC timeout, node error, or\n // an oversized response on a large late-day container) must not collapse\n // the whole feed. Treat this container as temporarily unavailable and scan\n // the next one — mirroring the empty-container handling below and the\n // get_account_posts guard above. The query's refetch interval retries it.\n console.error(\"[SDK] getThreads get_discussion error:\", err);\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n if (visibleItems.length === 0) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n return {\n entries: mapThreadItemsToWaveEntries(visibleItems, container, host)\n };\n }\n\n const lastContainer = normalizedContainers[normalizedContainers.length - 1];\n\n if (!lastContainer) {\n return null;\n }\n\n startAuthor = lastContainer.author;\n startPermlink = lastContainer.permlink;\n }\n\n return null;\n}\n\n// Page = array of WaveEntry; Cursor = WaveEntry (container) or undefined\ntype WavesPage = WaveEntry[];\ntype WavesCursor = WaveEntry | undefined;\n\nexport function getWavesByHostQueryOptions(host: string) {\n return infiniteQueryOptions<\n WavesPage,\n Error,\n InfiniteData,\n string[],\n WavesCursor\n >({\n queryKey: QueryKeys.posts.wavesByHost(host),\n initialPageParam: undefined as WavesCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WavesCursor }) => {\n const result = await getThreads(host, pageParam);\n if (!result) return []; // no items to show for this page\n\n return result.entries;\n },\n\n getNextPageParam: (lastPage: WavesPage): WavesCursor => lastPage?.[0]?.container,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesTagEntryResponse = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nconst DEFAULT_TAG_FEED_LIMIT = 40;\n\nexport function getWavesByTagQueryOptions(host: string, tag: string, limit = DEFAULT_TAG_FEED_LIMIT) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByTag(host, tag),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/tags\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"tag\", tag);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves by tag: ${response.status}`);\n }\n\n const data = await response.json() as WavesTagEntryResponse[];\n\n const result = data\n .slice(0, limit)\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n return result.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves by tag\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesFollowingEntry = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport function getWavesFollowingQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFollowing(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/following\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves following feed: ${response.status}`);\n }\n\n const data = await response.json() as WavesFollowingEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves following feed\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingTag } from \"../types\";\n\ninterface WavesTrendingTagResponse {\n tag: string;\n posts: number;\n}\n\nexport function getWavesTrendingTagsQueryOptions(host?: string, hours = 24) {\n // Omit the container for combined trending tags across all containers.\n const container = host?.trim() || undefined;\n\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingTags(container ?? \"\", hours),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/tags\", baseUrl);\n if (container) {\n url.searchParams.set(\"container\", container);\n }\n url.searchParams.set(\"hours\", hours.toString());\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending tags: ${response.status}`);\n }\n\n const data = await response.json() as WavesTrendingTagResponse[];\n\n return data.map(({ tag, posts }) => ({ tag, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending tags\", error);\n return [];\n }\n }\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ninterface WavesAccountEntry extends Entry {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n}\n\nexport function getWavesByAccountQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByAccount(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/account\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves for account: ${response.status}`);\n }\n\n const data = await response.json() as WavesAccountEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves for account\", error);\n throw error;\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingAuthor } from \"../types\";\n\nexport function getWavesTrendingAuthorsQueryOptions(host: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingAuthors(host),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/authors\", baseUrl);\n url.searchParams.set(\"container\", host);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending authors: ${response.status}`);\n }\n\n const data = await response.json() as WaveTrendingAuthor[];\n\n return data.map(({ author, posts }) => ({ author, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending authors\", error);\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"../types\";\nimport { normalizePost } from \"@/modules/bridge\";\n\nexport function getNormalizePostQueryOptions(\n post: { author?: string; permlink?: string } | undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.normalize(post?.author ?? \"\", post?.permlink ?? \"\"),\n enabled: enabled && !!post,\n queryFn: async () => normalizePost(post) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core/config\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { getPostQueryOptions } from \"@/modules/posts/queries\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ninterface VoteOperationDetails {\n voter: string;\n author: string;\n permlink: string;\n weight: number;\n}\n\ninterface AccountVoteHistoryItem {\n timestamp: string;\n op: [string, VoteOperationDetails];\n}\n\ntype AccountVoteHistoryRecord = [number, AccountVoteHistoryItem];\n\ninterface VoteHistoryResult extends VoteOperationDetails {\n num: number;\n timestamp: string;\n}\n\nexport interface VoteHistoryPageParam {\n start: number;\n}\n\nexport interface VoteHistoryPage {\n lastDate: number;\n lastItemFetched: number;\n entries: Entry[];\n}\n\nfunction isEntry(x: unknown): x is Entry {\n return (\n !!x &&\n typeof x === \"object\" &&\n \"author\" in x &&\n \"permlink\" in x &&\n \"active_votes\" in x\n );\n}\n\n/**\n * Calculate days since a date\n */\nfunction getDays(createdDate: string): number {\n const past = new Date(createdDate);\n const now = new Date();\n const diffMs = now.getTime() - past.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Get account vote history with entries\n *\n * @param username - Account name to get vote history for\n * @param limit - Number of history items per page (default: 20)\n * @param filters - Additional filters to pass to get_account_history\n * @param dayLimit - Only include votes from last N days (default: 7)\n */\nexport function getAccountVoteHistoryInfiniteQueryOptions(\n username: string,\n options?: {\n limit?: number;\n filters?: F[];\n dayLimit?: number;\n }\n) {\n const { limit = 20, filters = [], dayLimit = 7.0 } = options ?? {};\n\n return infiniteQueryOptions<\n VoteHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n VoteHistoryPageParam\n >({\n queryKey: QueryKeys.accounts.voteHistory(username, limit),\n initialPageParam: { start: -1 },\n\n queryFn: async ({ pageParam }: { pageParam: VoteHistoryPageParam }) => {\n const { start } = pageParam;\n\n const response = (await callRPC(\"condenser_api.get_account_history\", [username, start, limit, ...filters])) as AccountVoteHistoryRecord[];\n\n const mappedResults: VoteHistoryResult[] = response.map(([num, historyObj]) => ({\n ...historyObj.op[1],\n num,\n timestamp: historyObj.timestamp,\n }));\n\n const result = mappedResults.filter(\n (filtered) =>\n filtered.voter === username &&\n filtered.weight !== 0 &&\n getDays(filtered.timestamp) <= dayLimit\n );\n\n const entries: Entry[] = [];\n for (const obj of result) {\n const post = await CONFIG.queryClient.fetchQuery(\n getPostQueryOptions(obj.author, obj.permlink)\n );\n if (isEntry(post)) entries.push(post);\n }\n\n const [firstHistory] = response;\n\n return {\n lastDate: firstHistory ? getDays(firstHistory[1].timestamp) : 0,\n lastItemFetched: firstHistory ? firstHistory[0] : start,\n entries,\n };\n },\n\n getNextPageParam: (lastPage: VoteHistoryPage): VoteHistoryPageParam => ({\n start: lastPage.lastItemFetched,\n }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Profile } from \"../types\";\nimport { getProfiles } from \"@/modules/bridge\";\n\nexport function getProfilesQueryOptions(\n accounts: string[],\n observer?: string,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.profiles(accounts, observer ?? \"\"),\n enabled: enabled && accounts.length > 0,\n queryFn: async () => getProfiles(accounts, observer) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type {\n BalanceCoinType,\n BalanceHistoryEntry,\n BalanceHistoryResponse,\n} from \"../types\";\n\ninterface BalanceHistoryPage {\n entries: BalanceHistoryEntry[];\n currentPage: number;\n}\n\n/**\n * Cursor for balance history pagination.\n * null = first request (returns the newest page).\n * number = specific page to fetch (decrementing for older data).\n */\ntype BalanceHistoryCursor = number | null;\n\n/**\n * Get balance history for an account with pagination, newest first.\n * Uses the balance-api REST endpoint with direction=desc.\n *\n * Pagination: first call omits `page` to get the newest data.\n * The response includes `total_pages` so we know the current page number.\n * Subsequent calls decrement the page number to load older data.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param pageSize - Number of entries per page\n */\nexport function getBalanceHistoryInfiniteQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n pageSize = 200\n) {\n return infiniteQueryOptions<\n BalanceHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n BalanceHistoryCursor\n >({\n queryKey: QueryKeys.wallet.balanceHistory(\n username ?? \"\",\n coinType,\n pageSize\n ),\n initialPageParam: null as BalanceHistoryCursor,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"coin-type\": coinType,\n \"page-size\": pageSize,\n direction: \"desc\",\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"balance\",\n \"/accounts/{account-name}/balance-history\",\n params,\n undefined,\n undefined,\n signal\n )) as BalanceHistoryResponse;\n\n return {\n entries: response.operations_result,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n // Decrement page to go further back in time\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type { AggregatedBalanceEntry, BalanceCoinType } from \"../types\";\n\nexport type BalanceAggregationGranularity = \"yearly\" | \"monthly\" | \"daily\";\n\n/**\n * Get aggregated balance history for an account.\n * Uses the balance-api REST endpoint - enables yearly/monthly/daily summary\n * widgets that are impossible via RPC.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param granularity - yearly (default), monthly, or daily\n */\nexport function getAggregatedBalanceQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n granularity: BalanceAggregationGranularity = \"yearly\"\n) {\n return queryOptions({\n queryKey: QueryKeys.wallet.aggregatedHistory(\n username ?? \"\",\n coinType,\n granularity\n ),\n\n queryFn: async () => {\n if (!username) {\n return [];\n }\n\n return (await callREST(\n \"balance\",\n \"/accounts/{account-name}/aggregated-history\",\n {\n \"account-name\": username,\n \"coin-type\": coinType,\n granularity,\n }\n )) as AggregatedBalanceEntry[];\n },\n\n enabled: !!username,\n staleTime: 60_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport interface ProMembersResponse {\n /** Usernames of active Ecency Pro members. */\n members: string[];\n count: number;\n}\n\n/**\n * Public, cached roster of Ecency Pro members. Backed by a lightweight private-api\n * endpoint (no auth) so any surface can decorate a username with a Pro badge without\n * a per-user request.\n *\n * `staleTime` is deliberately shorter than the endpoint's own cache window and is\n * NOT raised to match it. react-query has no idea how old a response already was\n * when `fetch` served it from the browser cache: it treats a nine-minute-old\n * cached body as freshly fetched and starts its own window from zero. Worst-case\n * staleness is therefore the endpoint's window plus this one, so raising this to\n * match the server would roughly double it rather than align it.\n */\nexport function getProMembersQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.proMembers(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/pro-members\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch pro members: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Lowercased set of member usernames for O(1), case-insensitive membership checks. */\nexport function proMembersSet(members?: string[]): Set {\n return new Set((members ?? []).map((m) => m.toLowerCase()));\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { AccountProfile, FullAccount } from \"../types\";\nimport {\n buildPostingJsonMetadata,\n buildProfileMetadata,\n extractAccountProfile,\n pickRicherMetadataSnapshot,\n} from \"../utils/profile-metadata\";\n\ninterface Payload {\n profile: Partial;\n tokens: AccountProfile[\"tokens\"];\n}\n\n/**\n * React Query mutation hook for updating account profile metadata.\n *\n * This mutation broadcasts an account_update2 operation to update the user's\n * profile information (name, about, location, avatar, cover image, etc.).\n *\n * @param username - The username to update (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Profile Fields:**\n * - name: Display name\n * - about: Bio/description\n * - location: Location\n * - website: Website URL\n * - profile_image: Avatar URL\n * - cover_image: Cover/banner URL\n * - tokens: Social tokens (Twitter, Facebook, etc.)\n * - version: Profile metadata version (auto-set to 2)\n *\n * **Authentication:**\n * - Uses posting authority (account_update2 operation)\n * - Supports all auth methods via platform adapter\n *\n * **Post-Broadcast Actions:**\n * - Optimistically updates account cache with new profile data\n * - Invalidates account cache to refetch from blockchain\n *\n * @example\n * ```typescript\n * const updateProfile = useAccountUpdate(username, {\n * adapter: myAdapter,\n * });\n *\n * // Update profile\n * updateProfile.mutate({\n * profile: {\n * name: \"John Doe\",\n * about: \"Hive enthusiast\",\n * profile_image: \"https://...\",\n * }\n * });\n * ```\n */\nexport function useAccountUpdate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useBroadcastMutation(\n [\"accounts\", \"update\"],\n username,\n (payload: Partial) => {\n // Prefer the freshest cached snapshot. onMutate has just refetched the\n // account from chain, so this usually reflects the current on-chain\n // profile rather than a possibly stale/unloaded render-time value. If\n // the cache instead holds a metadata-poorer row than the render-time\n // snapshot (e.g. a node served a stripped account row), the richer\n // snapshot wins — a partial update must never shrink the profile while\n // any snapshot still knows the full one.\n const account = pickRicherMetadataSnapshot(\n queryClient.getQueryData(\n getAccountFullQueryOptions(username).queryKey\n ),\n data\n );\n\n if (!account) {\n throw new Error(\"[SDK][Accounts] – cannot update not existing account\");\n }\n\n return [\n [\n \"account_update2\",\n {\n account: username!,\n json_metadata: \"\",\n extensions: [] as [],\n // Read-modify-write the FULL on-chain metadata: deep-merge the\n // profile and preserve any non-`profile` top-level keys, so a\n // partial update never wipes unrelated fields.\n posting_json_metadata: buildPostingJsonMetadata({\n existingPostingJsonMetadata: account.posting_json_metadata,\n profile: payload.profile,\n tokens: payload.tokens,\n }),\n },\n ],\n ];\n },\n async (_data: unknown, variables: Partial) => {\n // Optimistic cache update\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n const obj = JSON.parse(JSON.stringify(data)) as FullAccount;\n obj.profile = buildProfileMetadata({\n existingProfile: extractAccountProfile(data),\n profile: variables.profile,\n tokens: variables.tokens,\n });\n\n return obj;\n }\n );\n\n // Invalidate cache to refetch from blockchain\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username)\n ]);\n },\n auth,\n undefined,\n {\n broadcastMode,\n // Before merging, force a fresh on-chain read so a stale or unloaded\n // cached snapshot cannot cause a partial update (e.g. pinning a post,\n // which sets only `pinned`) to overwrite the existing profile with a\n // near-empty object. Best-effort: if the refetch fails, the op builder\n // falls back to the cached snapshot.\n onMutate: async () => {\n if (!username) {\n return;\n }\n try {\n await queryClient.fetchQuery({\n ...getAccountFullQueryOptions(username),\n staleTime: 0,\n });\n } catch {\n // Ignore – fall back to whatever is already cached.\n }\n },\n }\n );\n}\n","import { broadcastJson, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getRelationshipBetweenAccountsQueryOptions, getAccountFullQueryOptions } from \"../queries\";\nimport { AccountRelationship } from \"../types\";\n\ntype Kind = \"toggle-ignore\" | \"toggle-follow\";\n\nexport function useAccountRelationsUpdate(\n reference: string | undefined,\n target: string | undefined,\n auth: AuthContext | undefined,\n onSuccess: (data: Partial | undefined) => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"relation\", \"update\", reference, target],\n mutationFn: async (kind: Kind) => {\n const relationsQuery = getRelationshipBetweenAccountsQueryOptions(\n reference!,\n target!\n );\n await getQueryClient().prefetchQuery(relationsQuery);\n const actualRelation = getQueryClient().getQueryData(\n relationsQuery.queryKey\n );\n\n await broadcastJson(\n reference,\n \"follow\",\n [\n \"follow\",\n {\n follower: reference,\n following: target,\n what: [\n ...(kind === \"toggle-ignore\" && !actualRelation?.ignores\n ? [\"ignore\"]\n : []),\n ...(kind === \"toggle-follow\" && !actualRelation?.follows\n ? [\"blog\"]\n : []),\n ],\n },\n ],\n auth\n );\n\n return {\n ...actualRelation,\n ignores:\n kind === \"toggle-ignore\"\n ? !actualRelation?.ignores\n : actualRelation?.ignores,\n follows:\n kind === \"toggle-follow\"\n ? !actualRelation?.follows\n : actualRelation?.follows,\n } satisfies Partial;\n },\n onError,\n onSuccess(data) {\n onSuccess(data);\n\n getQueryClient().setQueryData(\n QueryKeys.accounts.relations(reference!, target!),\n data\n );\n\n // Invalidate account query to refetch follow stats (follower_count, following_count)\n // This is needed because profile pages use staleTime: Infinity for performance\n if (target) {\n getQueryClient().invalidateQueries(\n getAccountFullQueryOptions(target)\n );\n }\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Content Operations\n * Operations for creating, voting, and managing content on Hive blockchain\n */\n\n/**\n * Builds a vote operation.\n * @param voter - Account casting the vote\n * @param author - Author of the post/comment\n * @param permlink - Permlink of the post/comment\n * @param weight - Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote)\n * @returns Vote operation\n */\nexport function buildVoteOp(\n voter: string,\n author: string,\n permlink: string,\n weight: number\n): Operation {\n if (!voter || !author || !permlink) {\n throw new Error(\"[SDK][buildVoteOp] Missing required parameters\");\n }\n if (weight < -10000 || weight > 10000) {\n throw new Error(\"[SDK][buildVoteOp] Weight must be between -10000 and 10000\");\n }\n\n return [\n \"vote\",\n {\n voter,\n author,\n permlink,\n weight,\n },\n ];\n}\n\n/**\n * Builds a comment operation (for posts or replies).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param parentAuthor - Parent author (empty string for top-level posts)\n * @param parentPermlink - Parent permlink (category/tag for top-level posts)\n * @param title - Title of the post (empty for comments)\n * @param body - Content body (required - cannot be empty)\n * @param jsonMetadata - JSON metadata object\n * @returns Comment operation\n */\nexport function buildCommentOp(\n author: string,\n permlink: string,\n parentAuthor: string,\n parentPermlink: string,\n title: string,\n body: string,\n jsonMetadata: Record\n): Operation {\n // Validate all required parameters including body\n if (!author || !permlink || parentPermlink === undefined || !body) {\n throw new Error(\"[SDK][buildCommentOp] Missing required parameters\");\n }\n\n return [\n \"comment\",\n {\n parent_author: parentAuthor,\n parent_permlink: parentPermlink,\n author,\n permlink,\n title,\n body,\n json_metadata: JSON.stringify(jsonMetadata),\n },\n ];\n}\n\n/**\n * Builds a comment options operation (for setting beneficiaries, rewards, etc.).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param maxAcceptedPayout - Maximum accepted payout (e.g., \"1000000.000 HBD\")\n * @param percentHbd - Percent of payout in HBD (10000 = 100%)\n * @param allowVotes - Allow votes on this content\n * @param allowCurationRewards - Allow curation rewards\n * @param extensions - Extensions array (for beneficiaries, etc.)\n * @returns Comment options operation\n */\nexport function buildCommentOptionsOp(\n author: string,\n permlink: string,\n maxAcceptedPayout: string,\n percentHbd: number,\n allowVotes: boolean,\n allowCurationRewards: boolean,\n extensions: any[]\n): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildCommentOptionsOp] Missing required parameters\");\n }\n\n return [\n \"comment_options\",\n {\n author,\n permlink,\n max_accepted_payout: maxAcceptedPayout,\n percent_hbd: percentHbd,\n allow_votes: allowVotes,\n allow_curation_rewards: allowCurationRewards,\n extensions,\n },\n ];\n}\n\n/**\n * Builds a delete comment operation.\n * @param author - Author of the comment/post to delete\n * @param permlink - Permlink of the comment/post to delete\n * @returns Delete comment operation\n */\nexport function buildDeleteCommentOp(author: string, permlink: string): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildDeleteCommentOp] Missing required parameters\");\n }\n\n return [\n \"delete_comment\",\n {\n author,\n permlink,\n },\n ];\n}\n\n/**\n * Builds a reblog operation (custom_json).\n * @param account - Account performing the reblog\n * @param author - Original post author\n * @param permlink - Original post permlink\n * @param deleteReblog - If true, removes the reblog\n * @returns Custom JSON operation for reblog\n */\nexport function buildReblogOp(\n account: string,\n author: string,\n permlink: string,\n deleteReblog: boolean = false\n): Operation {\n if (!account || !author || !permlink) {\n throw new Error(\"[SDK][buildReblogOp] Missing required parameters\");\n }\n\n const json: any = {\n account,\n author,\n permlink,\n };\n\n if (deleteReblog) {\n json.delete = \"delete\";\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\"reblog\", json]),\n required_auths: [],\n required_posting_auths: [account],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Wallet Operations\n * Operations for managing tokens, savings, vesting, and conversions\n */\n\n/**\n * Builds a transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer operation\n */\nexport function buildTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferOp] Missing required parameters\");\n }\n\n return [\n \"transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds multiple transfer operations for multiple recipients.\n * @param from - Sender account\n * @param destinations - Comma or space separated list of recipient accounts\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Array of transfer operations\n */\nexport function buildMultiTransferOps(\n from: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!from || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Create a transfer operation for each destination username\n return destArray.map((dest) =>\n buildTransferOp(from, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds a recurrent transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param recurrence - Recurrence in hours\n * @param executions - Number of executions (2 = executes twice)\n * @returns Recurrent transfer operation\n */\nexport function buildRecurrentTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n recurrence: number,\n executions: number\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Missing required parameters\");\n }\n if (recurrence < 24) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours\");\n }\n\n return [\n \"recurrent_transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n recurrence,\n executions,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a transfer to savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer to savings operation\n */\nexport function buildTransferToSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds a transfer from savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID (use timestamp)\n * @returns Transfer from savings operation\n */\nexport function buildTransferFromSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_from_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds a cancel transfer from savings operation.\n * @param from - Account that initiated the savings withdrawal\n * @param requestId - Request ID to cancel\n * @returns Cancel transfer from savings operation\n */\nexport function buildCancelTransferFromSavingsOp(\n from: string,\n requestId: number\n): Operation {\n if (!from || requestId === undefined) {\n throw new Error(\"[SDK][buildCancelTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"cancel_transfer_from_savings\",\n {\n from,\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds operations to claim savings interest.\n * Creates a transfer_from_savings and immediately cancels it to claim interest.\n * @param from - Account claiming interest\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"0.001 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID\n * @returns Array of operations [transfer_from_savings, cancel_transfer_from_savings]\n */\nexport function buildClaimInterestOps(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation[] {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildClaimInterestOps] Missing required parameters\");\n }\n\n return [\n buildTransferFromSavingsOp(from, to, amount, memo, requestId),\n buildCancelTransferFromSavingsOp(from, requestId),\n ];\n}\n\n/**\n * Builds a transfer to vesting operation (power up).\n * @param from - Account sending HIVE\n * @param to - Account receiving Hive Power\n * @param amount - Amount with HIVE symbol (e.g., \"1.000 HIVE\")\n * @returns Transfer to vesting operation\n */\nexport function buildTransferToVestingOp(\n from: string,\n to: string,\n amount: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToVestingOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_vesting\",\n {\n from,\n to,\n amount,\n },\n ];\n}\n\n/**\n * Builds a withdraw vesting operation (power down).\n * @param account - Account withdrawing vesting\n * @param vestingShares - Amount of VESTS to withdraw (e.g., \"1.000000 VESTS\")\n * @returns Withdraw vesting operation\n */\nexport function buildWithdrawVestingOp(\n account: string,\n vestingShares: string\n): Operation {\n if (!account || !vestingShares) {\n throw new Error(\"[SDK][buildWithdrawVestingOp] Missing required parameters\");\n }\n\n return [\n \"withdraw_vesting\",\n {\n account,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a delegate vesting shares operation (HP delegation).\n * @param delegator - Account delegating HP\n * @param delegatee - Account receiving HP delegation\n * @param vestingShares - Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\")\n * @returns Delegate vesting shares operation\n */\nexport function buildDelegateVestingSharesOp(\n delegator: string,\n delegatee: string,\n vestingShares: string\n): Operation {\n if (!delegator || !delegatee || !vestingShares) {\n throw new Error(\"[SDK][buildDelegateVestingSharesOp] Missing required parameters\");\n }\n\n return [\n \"delegate_vesting_shares\",\n {\n delegator,\n delegatee,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a set withdraw vesting route operation.\n * @param fromAccount - Account withdrawing vesting\n * @param toAccount - Account receiving withdrawn vesting\n * @param percent - Percentage to route (0-10000, where 10000 = 100%)\n * @param autoVest - Auto convert to vesting\n * @returns Set withdraw vesting route operation\n */\nexport function buildSetWithdrawVestingRouteOp(\n fromAccount: string,\n toAccount: string,\n percent: number,\n autoVest: boolean\n): Operation {\n if (!fromAccount || !toAccount || percent === undefined) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters\");\n }\n if (percent < 0 || percent > 10000) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000\");\n }\n\n return [\n \"set_withdraw_vesting_route\",\n {\n from_account: fromAccount,\n to_account: toAccount,\n percent,\n auto_vest: autoVest,\n },\n ];\n}\n\n/**\n * Builds a convert operation (HBD to HIVE).\n * @param owner - Account converting HBD\n * @param amount - Amount of HBD to convert (e.g., \"1.000 HBD\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Convert operation\n */\nexport function buildConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildConvertOp] Missing required parameters\");\n }\n\n return [\n \"convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a collateralized convert operation (HIVE to HBD via collateral).\n * @param owner - Account converting HIVE\n * @param amount - Amount of HIVE to convert (e.g., \"1.000 HIVE\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Collateralized convert operation\n */\nexport function buildCollateralizedConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildCollateralizedConvertOp] Missing required parameters\");\n }\n\n return [\n \"collateralized_convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a Hive Engine custom_json operation.\n * @param from - Account performing the operation\n * @param contractAction - Engine contract action (e.g., \"transfer\", \"stake\")\n * @param contractPayload - Payload for the contract action\n * @param contractName - Engine contract name (defaults to \"tokens\")\n * @returns Custom JSON operation\n */\nexport function buildEngineOp(\n from: string,\n contractAction: string,\n contractPayload: Record,\n contractName = \"tokens\"\n): Operation {\n return [\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [from],\n required_posting_auths: [],\n json: JSON.stringify({ contractName, contractAction, contractPayload }),\n }];\n}\n\n/**\n * Builds a scot_claim_token operation (posting authority).\n * @param account - Account claiming rewards\n * @param tokens - Array of token symbols to claim\n * @returns Custom JSON operation\n */\nexport function buildEngineClaimOp(\n account: string,\n tokens: string[]\n): Operation {\n return [\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [account],\n json: JSON.stringify(tokens.map((symbol) => ({ symbol }))),\n }];\n}\n\n/**\n * Builds a delegate RC operation (custom_json).\n * @param from - Account delegating RC\n * @param delegatees - Single delegatee or comma-separated list\n * @param maxRc - Maximum RC to delegate (in mana units)\n * @returns Custom JSON operation for RC delegation\n */\nexport function buildDelegateRcOp(\n from: string,\n delegatees: string,\n maxRc: string | number\n): Operation {\n if (!from || !delegatees || maxRc === undefined) {\n throw new Error(\"[SDK][buildDelegateRcOp] Missing required parameters\");\n }\n\n const delegateeArray = delegatees.includes(\",\")\n ? delegatees.split(\",\").map((d) => d.trim())\n : [delegatees];\n\n return [\n \"custom_json\",\n {\n id: \"rc\",\n json: JSON.stringify([\n \"delegate_rc\",\n {\n from,\n delegatees: delegateeArray,\n max_rc: maxRc,\n },\n ]),\n required_auths: [],\n required_posting_auths: [from],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Social Operations\n * Operations for following, muting, and managing social relationships\n */\n\n/**\n * Builds a follow operation (custom_json).\n * @param follower - Account following\n * @param following - Account to follow\n * @returns Custom JSON operation for follow\n */\nexport function buildFollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildFollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"blog\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unfollow operation (custom_json).\n * @param follower - Account unfollowing\n * @param following - Account to unfollow\n * @returns Custom JSON operation for unfollow\n */\nexport function buildUnfollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnfollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an ignore/mute operation (custom_json).\n * @param follower - Account ignoring\n * @param following - Account to ignore\n * @returns Custom JSON operation for ignore\n */\nexport function buildIgnoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildIgnoreOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"ignore\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unignore/unmute operation (custom_json).\n * @param follower - Account unignoring\n * @param following - Account to unignore\n * @returns Custom JSON operation for unignore\n */\nexport function buildUnignoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnignoreOp] Missing required parameters\");\n }\n\n return buildUnfollowOp(follower, following);\n}\n\n/**\n * Builds a Hive Notify set last read operation (custom_json).\n * @param username - Account setting last read\n * @param date - ISO date string (defaults to now)\n * @returns Array of custom JSON operations for setting last read\n */\nexport function buildSetLastReadOps(username: string, date?: string): Operation[] {\n if (!username) {\n throw new Error(\"[SDK][buildSetLastReadOps] Missing required parameters\");\n }\n\n const lastReadDate = date || new Date().toISOString().split(\".\")[0];\n\n const notifyOp: Operation = [\n \"custom_json\",\n {\n id: \"notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n const ecencyNotifyOp: Operation = [\n \"custom_json\",\n {\n id: \"ecency_notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n return [notifyOp, ecencyNotifyOp];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Governance Operations\n * Operations for witness voting, proposals, and proxy management\n */\n\n/**\n * Builds an account witness vote operation.\n * @param account - Account voting\n * @param witness - Witness account name\n * @param approve - True to approve, false to disapprove\n * @returns Account witness vote operation\n */\nexport function buildWitnessVoteOp(\n account: string,\n witness: string,\n approve: boolean\n): Operation {\n if (!account || !witness || approve === undefined) {\n throw new Error(\"[SDK][buildWitnessVoteOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_vote\",\n {\n account,\n witness,\n approve,\n },\n ];\n}\n\n/**\n * Builds an account witness proxy operation.\n * @param account - Account setting proxy\n * @param proxy - Proxy account name (empty string to remove proxy)\n * @returns Account witness proxy operation\n */\nexport function buildWitnessProxyOp(account: string, proxy: string): Operation {\n if (!account || proxy === undefined) {\n throw new Error(\"[SDK][buildWitnessProxyOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_proxy\",\n {\n account,\n proxy,\n },\n ];\n}\n\n/**\n * Payload for proposal creation\n */\nexport interface ProposalCreatePayload {\n receiver: string;\n subject: string;\n permlink: string;\n start: string;\n end: string;\n dailyPay: string;\n}\n\n/**\n * Builds a create proposal operation.\n * @param creator - Account creating the proposal\n * @param payload - Proposal details (must include start, end, and dailyPay)\n * @returns Create proposal operation\n */\nexport function buildProposalCreateOp(\n creator: string,\n payload: ProposalCreatePayload\n): Operation {\n // Validate required fields including start, end, and dailyPay\n if (\n !creator ||\n !payload.receiver ||\n !payload.subject ||\n !payload.permlink ||\n !payload.start ||\n !payload.end ||\n !payload.dailyPay\n ) {\n throw new Error(\"[SDK][buildProposalCreateOp] Missing required parameters\");\n }\n\n // Validate date format by attempting to parse them\n const startDate = new Date(payload.start);\n const endDate = new Date(payload.end);\n if (startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {\n throw new Error(\n \"[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings\"\n );\n }\n\n return [\n \"create_proposal\",\n {\n creator,\n receiver: payload.receiver,\n start_date: payload.start,\n end_date: payload.end,\n daily_pay: payload.dailyPay,\n subject: payload.subject,\n permlink: payload.permlink,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal votes operation.\n * @param voter - Account voting\n * @param proposalIds - Array of proposal IDs\n * @param approve - True to approve, false to disapprove\n * @returns Update proposal votes operation\n */\nexport function buildProposalVoteOp(\n voter: string,\n proposalIds: number[],\n approve: boolean\n): Operation {\n if (!voter || !proposalIds || proposalIds.length === 0 || approve === undefined) {\n throw new Error(\"[SDK][buildProposalVoteOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal_votes\",\n {\n voter,\n proposal_ids: proposalIds,\n approve,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a remove proposal operation.\n * @param proposalOwner - Owner of the proposal\n * @param proposalIds - Array of proposal IDs to remove\n * @returns Remove proposal operation\n */\nexport function buildRemoveProposalOp(\n proposalOwner: string,\n proposalIds: number[]\n): Operation {\n if (!proposalOwner || !proposalIds || proposalIds.length === 0) {\n throw new Error(\"[SDK][buildRemoveProposalOp] Missing required parameters\");\n }\n\n return [\n \"remove_proposal\",\n {\n proposal_owner: proposalOwner,\n proposal_ids: proposalIds,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal operation.\n * @param proposalId - Proposal ID to update (must be a valid number, including 0)\n * @param creator - Account that created the proposal\n * @param dailyPay - New daily pay amount\n * @param subject - New subject\n * @param permlink - New permlink\n * @returns Update proposal operation\n */\nexport function buildUpdateProposalOp(\n proposalId: number,\n creator: string,\n dailyPay: string,\n subject: string,\n permlink: string\n): Operation {\n // Validate proposalId properly - check for undefined/null instead of falsy\n // This allows proposalId of 0 which is a valid proposal ID\n if (\n proposalId === undefined ||\n proposalId === null ||\n typeof proposalId !== 'number' ||\n !creator ||\n !dailyPay ||\n !subject ||\n !permlink\n ) {\n throw new Error(\"[SDK][buildUpdateProposalOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal\",\n {\n proposal_id: proposalId,\n creator,\n daily_pay: dailyPay,\n subject,\n permlink,\n extensions: [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Community Operations\n * Operations for managing Hive communities\n */\n\n/**\n * Builds a subscribe to community operation (custom_json).\n * @param username - Account subscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for subscribe\n */\nexport function buildSubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildSubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"subscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds an unsubscribe from community operation (custom_json).\n * @param username - Account unsubscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for unsubscribe\n */\nexport function buildUnsubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildUnsubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"unsubscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a set user role in community operation (custom_json).\n * @param username - Account setting the role (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to set role for\n * @param role - Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\")\n * @returns Custom JSON operation for setRole\n */\nexport function buildSetRoleOp(\n username: string,\n community: string,\n account: string,\n role: string\n): Operation {\n if (!username || !community || !account || !role) {\n throw new Error(\n `[SDK][buildSetRoleOp] Missing required parameters: username=${username}, community=${community}, account=${account}, role=${role}`\n );\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"setRole\", { community, account, role }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Community properties for update\n */\nexport interface CommunityProps {\n title: string;\n about: string;\n lang: string;\n description: string;\n flag_text: string;\n is_nsfw: boolean;\n}\n\n/**\n * Builds an update community properties operation (custom_json).\n * @param username - Account updating (must be community admin)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param props - Properties to update\n * @returns Custom JSON operation for updateProps\n */\nexport function buildUpdateCommunityOp(\n username: string,\n community: string,\n props: CommunityProps\n): Operation {\n if (!username || !community || !props) {\n throw new Error(\"[SDK][buildUpdateCommunityOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"updateProps\", { community, props }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a pin/unpin post in community operation (custom_json).\n * @param username - Account pinning (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param pin - True to pin, false to unpin\n * @returns Custom JSON operation for pinPost/unpinPost\n */\nexport function buildPinPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n pin: boolean\n): Operation {\n if (!username || !community || !account || !permlink || pin === undefined) {\n throw new Error(\"[SDK][buildPinPostOp] Missing required parameters\");\n }\n\n const action = pin ? \"pinPost\" : \"unpinPost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute post in community operation (custom_json).\n * @param username - Account muting (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for mutePost/unmutePost\n */\nexport function buildMutePostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string,\n mute: boolean\n): Operation {\n if (\n !username ||\n !community ||\n !account ||\n !permlink ||\n mute === undefined\n ) {\n throw new Error(\"[SDK][buildMutePostOp] Missing required parameters\");\n }\n\n const action = mute ? \"mutePost\" : \"unmutePost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute user in community operation (custom_json).\n * @param username - Account performing mute (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to mute/unmute\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for muteUser/unmuteUser\n */\nexport function buildMuteUserOp(\n username: string,\n community: string,\n account: string,\n notes: string,\n mute: boolean\n): Operation {\n if (!username || !community || !account || mute === undefined) {\n throw new Error(\"[SDK][buildMuteUserOp] Missing required parameters\");\n }\n\n const action = mute ? \"muteUser\" : \"unmuteUser\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a flag post in community operation (custom_json).\n * @param username - Account flagging\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Flag reason/notes\n * @returns Custom JSON operation for flagPost\n */\nexport function buildFlagPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string\n): Operation {\n if (!username || !community || !account || !permlink) {\n throw new Error(\"[SDK][buildFlagPostOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"flagPost\", { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Market Operations\n * Operations for trading on the internal Hive market\n */\n\n/**\n * Transaction type for buy/sell operations\n */\nexport enum BuySellTransactionType {\n Buy = \"buy\",\n Sell = \"sell\",\n}\n\n/**\n * Order ID prefix for different order types\n */\nexport enum OrderIdPrefix {\n EMPTY = \"\",\n SWAP = \"9\",\n}\n\n/**\n * Builds a limit order create operation.\n * @param owner - Account creating the order\n * @param amountToSell - Amount and asset to sell\n * @param minToReceive - Minimum amount and asset to receive\n * @param fillOrKill - If true, order must be filled immediately or cancelled\n * @param expiration - Expiration date (ISO string)\n * @param orderId - Unique order ID\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOp(\n owner: string,\n amountToSell: string,\n minToReceive: string,\n fillOrKill: boolean,\n expiration: string,\n orderId: number\n): Operation {\n if (!owner || !amountToSell || !minToReceive || !expiration || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCreateOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_create\",\n {\n owner,\n orderid: orderId,\n amount_to_sell: amountToSell,\n min_to_receive: minToReceive,\n fill_or_kill: fillOrKill,\n expiration,\n },\n ];\n}\n\n/**\n * Helper to format number to 3 decimal places\n */\nfunction formatNumber(value: number, decimals: number = 3): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Builds a limit order create operation with automatic formatting.\n * This is a convenience method that handles buy/sell logic and formatting.\n *\n * For Buy orders: You're buying HIVE with HBD\n * - amountToSell: HBD amount you're spending\n * - minToReceive: HIVE amount you want to receive\n *\n * For Sell orders: You're selling HIVE for HBD\n * - amountToSell: HIVE amount you're selling\n * - minToReceive: HBD amount you want to receive\n *\n * @param owner - Account creating the order\n * @param amountToSell - Amount to sell (number)\n * @param minToReceive - Minimum to receive (number)\n * @param orderType - Buy or Sell\n * @param idPrefix - Order ID prefix\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOpWithType(\n owner: string,\n amountToSell: number,\n minToReceive: number,\n orderType: BuySellTransactionType,\n idPrefix: OrderIdPrefix = OrderIdPrefix.EMPTY\n): Operation {\n // Validate numeric inputs\n if (\n !owner ||\n orderType === undefined ||\n !Number.isFinite(amountToSell) ||\n amountToSell <= 0 ||\n !Number.isFinite(minToReceive) ||\n minToReceive <= 0\n ) {\n throw new Error(\"[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters\");\n }\n\n // Calculate expiration (27 days from now)\n const expiration = new Date(Date.now());\n expiration.setDate(expiration.getDate() + 27);\n const expirationStr = expiration.toISOString().split(\".\")[0];\n\n // Generate order ID\n const orderId = Number(\n `${idPrefix}${Math.floor(Date.now() / 1000)\n .toString()\n .slice(2)}`\n );\n\n // Format amounts based on order type\n // Buy: Sell HBD to buy HIVE\n // Sell: Sell HIVE to buy HBD\n const formattedAmountToSell =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(amountToSell, 3)} HBD`\n : `${formatNumber(amountToSell, 3)} HIVE`;\n\n const formattedMinToReceive =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(minToReceive, 3)} HIVE`\n : `${formatNumber(minToReceive, 3)} HBD`;\n\n return buildLimitOrderCreateOp(\n owner,\n formattedAmountToSell,\n formattedMinToReceive,\n false,\n expirationStr,\n orderId\n );\n}\n\n/**\n * Builds a limit order cancel operation.\n * @param owner - Account cancelling the order\n * @param orderId - Order ID to cancel\n * @returns Limit order cancel operation\n */\nexport function buildLimitOrderCancelOp(owner: string, orderId: number): Operation {\n if (!owner || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCancelOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_cancel\",\n {\n owner,\n orderid: orderId,\n },\n ];\n}\n\n/**\n * Builds a claim reward balance operation.\n * @param account - Account claiming rewards\n * @param rewardHive - HIVE reward to claim (e.g., \"0.000 HIVE\")\n * @param rewardHbd - HBD reward to claim (e.g., \"0.000 HBD\")\n * @param rewardVests - VESTS reward to claim (e.g., \"0.000000 VESTS\")\n * @returns Claim reward balance operation\n */\nexport function buildClaimRewardBalanceOp(\n account: string,\n rewardHive: string,\n rewardHbd: string,\n rewardVests: string\n): Operation {\n if (!account || !rewardHive || !rewardHbd || !rewardVests) {\n throw new Error(\"[SDK][buildClaimRewardBalanceOp] Missing required parameters\");\n }\n\n return [\n \"claim_reward_balance\",\n {\n account,\n reward_hive: rewardHive,\n reward_hbd: rewardHbd,\n reward_vests: rewardVests,\n },\n ];\n}\n","import type { Operation, Authority } from \"../../../hive-tx\";\n\nexport type { Authority };\n\n/**\n * Account Operations\n * Operations for managing accounts, keys, and permissions\n */\n\n/**\n * Builds an account update operation.\n * @param account - Account name\n * @param owner - Owner authority (optional)\n * @param active - Active authority (optional)\n * @param posting - Posting authority (optional)\n * @param memoKey - Memo public key\n * @param jsonMetadata - Account JSON metadata\n * @returns Account update operation\n */\nexport function buildAccountUpdateOp(\n account: string,\n owner: Authority | undefined,\n active: Authority | undefined,\n posting: Authority | undefined,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !memoKey) {\n throw new Error(\"[SDK][buildAccountUpdateOp] Missing required parameters\");\n }\n\n return [\n \"account_update\",\n {\n account,\n owner,\n active,\n posting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an account update2 operation (for posting_json_metadata).\n * @param account - Account name\n * @param jsonMetadata - Account JSON metadata (legacy, usually empty)\n * @param postingJsonMetadata - Posting JSON metadata string\n * @param extensions - Extensions array\n * @returns Account update2 operation\n */\nexport function buildAccountUpdate2Op(\n account: string,\n jsonMetadata: string,\n postingJsonMetadata: string,\n extensions: any[]\n): Operation {\n if (!account || postingJsonMetadata === undefined) {\n throw new Error(\"[SDK][buildAccountUpdate2Op] Missing required parameters\");\n }\n\n return [\n \"account_update2\",\n {\n account,\n json_metadata: jsonMetadata || \"\",\n posting_json_metadata: postingJsonMetadata,\n extensions: (extensions || []) as [],\n },\n ];\n}\n\n/**\n * Public keys for account creation\n */\nexport interface AccountKeys {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n}\n\n/**\n * Builds an account create operation.\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @param fee - Creation fee (e.g., \"3.000 HIVE\")\n * @returns Account create operation\n */\nexport function buildAccountCreateOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys,\n fee: string\n): Operation {\n if (!creator || !newAccountName || !keys || !fee) {\n throw new Error(\"[SDK][buildAccountCreateOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"account_create\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n fee,\n },\n ] satisfies Operation;\n}\n\n/**\n * Builds a create claimed account operation (using account creation tokens).\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @returns Create claimed account operation\n */\nexport function buildCreateClaimedAccountOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys\n): Operation {\n if (!creator || !newAccountName || !keys) {\n throw new Error(\"[SDK][buildCreateClaimedAccountOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"create_claimed_account\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds a claim account operation.\n * @param creator - Account claiming the token\n * @param fee - Fee for claiming (usually \"0.000 HIVE\" for RC-based claims)\n * @returns Claim account operation\n */\nexport function buildClaimAccountOp(creator: string, fee: string): Operation {\n if (!creator || !fee) {\n throw new Error(\"[SDK][buildClaimAccountOp] Missing required parameters\");\n }\n\n return [\n \"claim_account\",\n {\n creator,\n fee,\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds an operation to grant posting permission to another account.\n * Helper that modifies posting authority to add an account.\n * @param account - Account granting permission\n * @param currentPosting - Current posting authority\n * @param grantedAccount - Account to grant permission to\n * @param weightThreshold - Weight threshold of the granted account\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildGrantPostingPermissionOp(\n account: string,\n currentPosting: Authority,\n grantedAccount: string,\n weightThreshold: number,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !grantedAccount || !memoKey) {\n throw new Error(\"[SDK][buildGrantPostingPermissionOp] Missing required parameters\");\n }\n\n // Find existing account or create new entry to prevent duplicates\n const existingIndex = currentPosting.account_auths.findIndex(\n ([acc]) => acc === grantedAccount\n );\n\n const newAccountAuths = [...currentPosting.account_auths];\n if (existingIndex >= 0) {\n // Update existing entry with new weight\n newAccountAuths[existingIndex] = [grantedAccount, weightThreshold];\n } else {\n // Add new entry\n newAccountAuths.push([grantedAccount, weightThreshold]);\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: newAccountAuths,\n };\n\n // Sort account_auths alphabetically for consistency\n newPosting.account_auths.sort((a, b) => (a[0] > b[0] ? 1 : -1));\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an operation to revoke posting permission from an account.\n * Helper that modifies posting authority to remove an account.\n * @param account - Account revoking permission\n * @param currentPosting - Current posting authority\n * @param revokedAccount - Account to revoke permission from\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildRevokePostingPermissionOp(\n account: string,\n currentPosting: Authority,\n revokedAccount: string,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !revokedAccount || !memoKey) {\n throw new Error(\"[SDK][buildRevokePostingPermissionOp] Missing required parameters\");\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: currentPosting.account_auths.filter(\n ([acc]) => acc !== revokedAccount\n ),\n };\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds a change recovery account operation.\n * @param accountToRecover - Account to change recovery account for\n * @param newRecoveryAccount - New recovery account name\n * @param extensions - Extensions array\n * @returns Change recovery account operation\n */\nexport function buildChangeRecoveryAccountOp(\n accountToRecover: string,\n newRecoveryAccount: string,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newRecoveryAccount) {\n throw new Error(\"[SDK][buildChangeRecoveryAccountOp] Missing required parameters\");\n }\n\n return [\n \"change_recovery_account\",\n {\n account_to_recover: accountToRecover,\n new_recovery_account: newRecoveryAccount,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a request account recovery operation.\n * @param recoveryAccount - Recovery account performing the recovery\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param extensions - Extensions array\n * @returns Request account recovery operation\n */\nexport function buildRequestAccountRecoveryOp(\n recoveryAccount: string,\n accountToRecover: string,\n newOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {\n throw new Error(\"[SDK][buildRequestAccountRecoveryOp] Missing required parameters\");\n }\n\n return [\n \"request_account_recovery\",\n {\n recovery_account: recoveryAccount,\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a recover account operation.\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param recentOwnerAuthority - Recent owner authority (for proof)\n * @param extensions - Extensions array\n * @returns Recover account operation\n */\nexport function buildRecoverAccountOp(\n accountToRecover: string,\n newOwnerAuthority: Authority,\n recentOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newOwnerAuthority || !recentOwnerAuthority) {\n throw new Error(\"[SDK][buildRecoverAccountOp] Missing required parameters\");\n }\n\n return [\n \"recover_account\",\n {\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n recent_owner_authority: recentOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Ecency-Specific Operations\n * Custom operations for Ecency platform features (Points, Boost, Promote, etc.)\n */\n\n/**\n * Builds an Ecency Boost Plus subscription operation (custom_json).\n * @param user - User account\n * @param account - Account to subscribe\n * @param duration - Subscription duration in days (must be a valid finite number)\n * @returns Custom JSON operation for boost plus\n */\nexport function buildBoostPlusOp(\n user: string,\n account: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !account || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildBoostPlusOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_boost_plus\",\n json: JSON.stringify({\n user,\n account,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency RC top-up operation (custom_json): a short-term, RC-only\n * delegation to the user's OWN account, paid for with Ecency Points. Distinct\n * from Boost Plus (which delegates Hive Power). The RC amount is fixed\n * server-side, so the user only chooses a duration. Signed with active\n * authority because it spends Points. The actual on-chain `delegate_rc` is\n * broadcast by the Ecency relay account, not here.\n * @param user - User account (payer and recipient of the RC)\n * @param duration - Delegation duration in days (must be a valid finite number)\n * @returns Custom JSON operation for the RC top-up\n */\nexport function buildRcDelegationOp(user: string, duration: number): Operation {\n if (!user || !Number.isInteger(duration) || duration <= 0) {\n throw new Error(\"[SDK][buildRcDelegationOp] Missing or invalid parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_rc_delegation\",\n json: JSON.stringify({\n user,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency promote operation (custom_json).\n * @param user - User account\n * @param author - Post author\n * @param permlink - Post permlink\n * @param duration - Promotion duration in days (must be a valid finite number)\n * @returns Custom JSON operation for promote\n */\nexport function buildPromoteOp(\n user: string,\n author: string,\n permlink: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !author || !permlink || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildPromoteOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_promote\",\n json: JSON.stringify({\n user,\n author,\n permlink,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency point transfer operation (custom_json).\n * @param sender - Sender account\n * @param receiver - Receiver account\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Custom JSON operation for point transfer\n */\nexport function buildPointTransferOp(\n sender: string,\n receiver: string,\n amount: string,\n memo: string\n): Operation {\n if (!sender || !receiver || !amount) {\n throw new Error(\"[SDK][buildPointTransferOp] Missing required parameters\");\n }\n\n // Normalize \"POINTS\" to \"POINT\" — backend expects singular form\n const normalizedAmount = amount.replace(/POINTS\\b/, \"POINT\");\n\n return [\n \"custom_json\",\n {\n id: \"ecency_point_transfer\",\n json: JSON.stringify({\n sender,\n receiver,\n amount: normalizedAmount,\n memo: memo || \"\",\n }),\n required_auths: [sender],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds multiple Ecency point transfer operations for multiple recipients.\n * @param sender - Sender account\n * @param destinations - Comma or space separated list of recipients\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Array of custom JSON operations for point transfers\n */\nexport function buildMultiPointTransferOps(\n sender: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!sender || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Validate parsed destinations\n if (destArray.length === 0) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing valid destinations\");\n }\n\n // Create a point transfer operation for each destination\n return destArray.map((dest) =>\n buildPointTransferOp(sender, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds an Ecency community rewards registration operation (custom_json).\n * @param name - Account name to register\n * @returns Custom JSON operation for community registration\n */\nexport function buildCommunityRegistrationOp(name: string): Operation {\n if (!name) {\n throw new Error(\"[SDK][buildCommunityRegistrationOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_registration\",\n json: JSON.stringify({\n name,\n }),\n required_auths: [name],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic active authority custom_json operation.\n * Used for various Ecency operations that require active authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with active authority\n */\nexport function buildActiveCustomJsonOp(\n username: string,\n operationId: string,\n json: Record\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildActiveCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [username],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic posting authority custom_json operation.\n * Used for various operations that require posting authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with posting authority\n */\nexport function buildPostingCustomJsonOp(\n username: string,\n operationId: string,\n json: Record | any[]\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildPostingCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildFollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for following an account.\n */\nexport interface FollowPayload {\n /** Account to follow */\n following: string;\n}\n\n/**\n * React Query mutation hook for following an account.\n *\n * This mutation broadcasts a follow operation to the Hive blockchain,\n * adding the target account to the follower's \"blog\" follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const followMutation = useFollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Follow an account\n * followMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useFollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"follow\"],\n username,\n ({ following }) => [\n buildFollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnfollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unfollowing an account.\n */\nexport interface UnfollowPayload {\n /** Account to unfollow */\n following: string;\n}\n\n/**\n * React Query mutation hook for unfollowing an account.\n *\n * This mutation broadcasts an unfollow operation to the Hive blockchain,\n * removing the target account from the follower's follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const unfollowMutation = useUnfollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unfollow an account\n * unfollowMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useUnfollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"unfollow\"],\n username,\n ({ following }) => [\n buildUnfollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n author: string;\n permlink: string;\n}\n\nexport function useBookmarkAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"add\", username],\n mutationFn: async ({ author, permlink }: Payload) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useBookmarkDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"delete\", username],\n mutationFn: async (bookmarkId: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: bookmarkId,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useAccountFavoriteAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"add\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation, InfiniteData } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../../types\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAccountFavoriteDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"delete\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to delete favorite: ${response.status}`);\n }\n return response.json();\n },\n onMutate: async (account: string) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.accounts.favorites(username);\n const infinitePrefix = QueryKeys.accounts.favoritesInfinite(username);\n const checkKey = QueryKeys.accounts.checkFavorite(username, account);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n qc.cancelQueries({ queryKey: checkKey }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((f) => f.account !== account)\n );\n }\n\n const previousCheck = qc.getQueryData(checkKey);\n qc.setQueryData(checkKey, false);\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((f) => f.account !== account),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite, previousCheck };\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError: (err, account, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.accounts.favorites(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n if (context?.previousCheck !== undefined) {\n qc.setQueryData(\n QueryKeys.accounts.checkFavorite(username!, account),\n context.previousCheck\n );\n }\n onError(err);\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\nexport interface Keys {\n owner: PrivateKey;\n active: PrivateKey;\n posting: PrivateKey;\n memo_key: PrivateKey;\n}\n\ninterface Payload {\n keepCurrent?: boolean;\n currentKey: PrivateKey;\n keys: Keys[];\n keysToRevoke?: string[]; // Deprecated: will be treated as revoking from all authorities\n keysToRevokeByAuthority?: Partial>; // Authority-specific revocation\n}\n\nexport function dedupeAndSortKeyAuths(\n existing: Authority[\"key_auths\"],\n additions: [string, number][]\n): Authority[\"key_auths\"] {\n const merged = new Map();\n\n existing.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n additions.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n return Array.from(merged.entries())\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, weight]) => [key, weight] as [string, number]);\n}\n\ntype UpdateKeyAuthsOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdateKeyAuths(\n username: string,\n options?: UpdateKeyAuthsOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"keys-update\", username],\n mutationFn: async ({\n keys,\n keepCurrent = false,\n currentKey,\n keysToRevoke = [],\n keysToRevokeByAuthority = {}\n }: Payload) => {\n if (keys.length === 0) {\n throw new Error(\n \"[SDK][Update password] – no new keys provided\"\n );\n }\n\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update keys for anon user\"\n );\n }\n\n const prepareAuth = (keyName: keyof Keys) => {\n const auth: Authority = JSON.parse(JSON.stringify(accountData[keyName]));\n\n // Get keys to revoke for this specific authority\n const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];\n // Fallback to global keysToRevoke for backwards compatibility\n const allKeysToRevoke = [\n ...keysToRevokeForAuthority,\n ...(keysToRevokeByAuthority[keyName] === undefined ? keysToRevoke : [])\n ];\n\n // Filter out keys to revoke from existing keys (authority-specific)\n const existingKeys = keepCurrent\n ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString()))\n : [];\n\n auth.key_auths = dedupeAndSortKeyAuths(\n existingKeys,\n keys.map(\n (values, i) =>\n [values[keyName].createPublic().toString(), i + 1] as [\n string,\n number,\n ]\n )\n );\n\n return auth;\n };\n\n return broadcastOperations(\n [[\"account_update\", {\n account: username,\n json_metadata: accountData.json_metadata,\n owner: prepareAuth(\"owner\"),\n active: prepareAuth(\"active\"),\n posting: prepareAuth(\"posting\"),\n // Always use new memo key when adding new keys\n memo_key: keys[0].memo_key.createPublic().toString(),\n }]],\n currentKey\n );\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { useAccountUpdateKeyAuths } from \"./use-account-update-key-auths\";\n\ninterface Payload {\n newPassword: string;\n currentPassword: string;\n keepCurrent?: boolean;\n}\n\n/**\n * Only native Hive and custom passwords could be updated here\n * Seed based password cannot be updated here, it will be in an account always for now\n */\ntype UpdatePasswordOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdatePassword(\n username: string,\n options?: UpdatePasswordOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);\n\n return useMutation({\n mutationKey: [\"accounts\", \"password-update\", username],\n mutationFn: async ({\n newPassword,\n currentPassword,\n keepCurrent,\n }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update password for anon user\"\n );\n }\n const currentKey = PrivateKey.fromLogin(\n username,\n currentPassword,\n \"owner\"\n );\n\n return updateKeys({\n currentKey,\n keepCurrent,\n keys: [\n {\n owner: PrivateKey.fromLogin(username, newPassword, \"owner\"),\n active: PrivateKey.fromLogin(username, newPassword, \"active\"),\n posting: PrivateKey.fromLogin(username, newPassword, \"posting\"),\n memo_key: PrivateKey.fromLogin(username, newPassword, \"memo\"),\n },\n ],\n });\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { FullAccount } from \"../types\";\nimport hs from \"hivesigner\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n}\n\ntype RevokePostingOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountRevokePosting(\n username: string | undefined,\n options: RevokePostingOptions,\n auth?: AuthContextV2\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-posting\", data?.name],\n mutationFn: async ({ accountName, type, key }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot revoke posting for anonymous user\"\n );\n }\n\n const posting = JSON.parse(JSON.stringify(data.posting)) as FullAccount[\"posting\"];\n\n posting.account_auths = posting.account_auths.filter(\n ([account]) => account !== accountName\n );\n\n const operationBody = {\n account: data.name,\n posting,\n memo_key: data.memo_key,\n json_metadata: data.json_metadata,\n };\n\n if (type === \"key\" && key) {\n return broadcastOperations([[\"account_update\", operationBody]], key);\n } else if (type === \"keychain\") {\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.adapter.broadcastWithKeychain(\n data.name,\n [[\"account_update\", operationBody]],\n \"active\"\n );\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"account_update\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: (resp, payload, ctx) => {\n (options.onSuccess as\n | ((data: unknown, variables: CommonPayload, context: unknown) => unknown)\n | undefined)?.(resp, payload, ctx);\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) =>\n ({\n ...data,\n posting: {\n ...data?.posting,\n account_auths:\n data?.posting?.account_auths?.filter(\n ([account]) => account !== payload.accountName\n ) ?? [],\n },\n }) as FullAccount\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\" | \"ecency\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n email?: string;\n}\n\ntype UpdateRecoveryOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountUpdateRecovery(\n username: string | undefined,\n code: string | undefined,\n options: UpdateRecoveryOptions,\n auth?: AuthContextV2\n) {\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"recovery\", data?.name],\n mutationFn: async ({ accountName, type, key, email }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot change recovery for anonymous user\"\n );\n }\n\n const operationBody = {\n account_to_recover: data.name,\n new_recovery_account: accountName,\n extensions: [] as [],\n };\n\n if (type === \"ecency\") {\n if (!code) {\n throw new Error(\"[SDK][Accounts] – missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/recoveries-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n email,\n publicKeys: [\n ...data.owner.key_auths,\n ...data.active.key_auths,\n ...data.posting.key_auths,\n data.memo_key,\n ],\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx, so guard explicitly — otherwise the\n // caller's onSuccess shows a \"recovery updated\" toast on a failed request.\n // (The missing Content-Type header also made the backend skip JSON parsing.)\n if (!response.ok) {\n throw new Error(`[SDK][Accounts] Failed to add recovery: ${response.status}`);\n }\n\n return response;\n } else if (type === \"key\" && key) {\n return broadcastOperations(\n [[\"change_recovery_account\", operationBody]],\n key\n );\n } else if (type === \"keychain\") {\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.adapter.broadcastWithKeychain(data.name, [[\"change_recovery_account\", operationBody]], \"owner\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"change_recovery_account\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: options.onSuccess,\n });\n}\n","import { PublicKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport { FullAccount } from \"../types\";\n\n/**\n * Check whether an authority would still meet its weight_threshold\n * after removing the given keys. This prevents revoking keys that\n * would leave an authority unable to sign (especially for multisig).\n */\nexport function canRevokeFromAuthority(\n auth: Authority,\n revokingKeyStrs: Set\n): boolean {\n const remainingWeight = auth.key_auths\n .filter(([key]) => !revokingKeyStrs.has(String(key)))\n .reduce((sum, [, weight]) => sum + weight, 0);\n\n // account_auths also contribute weight\n const accountWeight = (auth.account_auths ?? []).reduce(\n (sum: number, [, weight]: [string, number]) => sum + weight,\n 0\n );\n\n return (remainingWeight + accountWeight) >= auth.weight_threshold;\n}\n\n/**\n * Build an account_update operation that removes the given public keys\n * from the relevant authorities.\n *\n * Only includes the `owner` field when a revoking key actually exists\n * in the owner authority - omitting it allows active-level signing.\n *\n * Returns the operation payload (without the \"account_update\" tag) so\n * callers can wrap it as needed for their broadcast method.\n */\nexport function buildRevokeKeysOp(\n accountData: FullAccount,\n revokingKeys: PublicKey[]\n) {\n const revokingKeyStrs = new Set(revokingKeys.map((k) => k.toString()));\n\n const hasAnyKeyInAuth = (auth: Authority) =>\n auth.key_auths.some(\n ([key]: [string | PublicKey, number]) => revokingKeyStrs.has(String(key))\n );\n\n const prepareAuth = (auth: Authority): Authority => {\n const clone: Authority = JSON.parse(JSON.stringify(auth));\n clone.key_auths = clone.key_auths.filter(\n ([key]) => !revokingKeyStrs.has(key.toString())\n );\n return clone;\n };\n\n const needsOwnerUpdate = hasAnyKeyInAuth(accountData.owner);\n\n return {\n account: accountData.name,\n json_metadata: accountData.json_metadata,\n owner: needsOwnerUpdate ? prepareAuth(accountData.owner) : undefined,\n active: prepareAuth(accountData.active),\n posting: prepareAuth(accountData.posting),\n memo_key: accountData.memo_key\n };\n}\n","import { PrivateKey, PublicKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { buildRevokeKeysOp } from \"./build-revoke-keys-op\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ninterface Payload {\n currentKey: PrivateKey;\n /** Keys to revoke. Accepts a single key or an array. */\n revokingKey: PublicKey | PublicKey[];\n}\n\n/**\n * Revoke one or more keys from an account on the Hive blockchain.\n *\n * When revoking keys that exist only in active/posting authorities,\n * the owner field is omitted from the operation so active-level\n * signing is sufficient.\n */\ntype RevokeKeyOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountRevokeKey(\n username: string | undefined,\n options?: RevokeKeyOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-key\", accountData?.name],\n mutationFn: async ({ currentKey, revokingKey }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Revoke key] – cannot update keys for anon user\"\n );\n }\n\n const revokingKeys = Array.isArray(revokingKey) ? revokingKey : [revokingKey];\n const op = buildRevokeKeysOp(accountData, revokingKeys);\n\n return broadcastOperations([[\"account_update\", op]], currentKey);\n },\n ...options,\n });\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildClaimAccountOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for claiming account creation tokens.\n */\nexport interface ClaimAccountPayload {\n /** Creator account claiming the token */\n creator: string;\n /** Fee for claiming (usually \"0.000 HIVE\" for RC-based claims) */\n fee?: string;\n}\n\n/**\n * React Query mutation hook for claiming account creation tokens.\n *\n * This mutation broadcasts a claim_account operation to claim an account\n * creation token using Resource Credits (RC). The claimed token can later\n * be used to create a new account for free using the create_claimed_account\n * operation.\n *\n * @param username - The username claiming the account token (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account cache to update pending_claimed_accounts count\n * - Updates account query data to set pending_claimed_accounts = 0 optimistically\n *\n * **Operation Details:**\n * - Uses native claim_account operation\n * - Fee: \"0.000 HIVE\" (uses RC instead of HIVE)\n * - Authority: Active key (required for claiming)\n *\n * **RC Requirements:**\n * - Requires sufficient Resource Credits (RC)\n * - RC amount varies based on network conditions\n * - Claiming without sufficient RC will fail\n *\n * **Use Case:**\n * - Claim tokens in advance when RC is available\n * - Create accounts later without paying HIVE fee\n * - Useful for onboarding services and apps\n *\n * @example\n * ```typescript\n * const claimMutation = useClaimAccount(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Claim account token using RC\n * claimMutation.mutate({\n * creator: 'alice',\n * fee: '0.000 HIVE'\n * });\n * ```\n */\nexport function useClaimAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"claimAccount\"],\n username,\n ({ creator, fee = \"0.000 HIVE\" }) => [\n buildClaimAccountOp(creator, fee)\n ],\n async (_result: any, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(variables.creator),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildGrantPostingPermissionOp, type Authority } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface GrantPostingPermissionPayload {\n currentPosting: Authority;\n grantedAccount: string;\n weightThreshold: number;\n memoKey: string;\n jsonMetadata: string;\n}\n\nexport function useGrantPostingPermission(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"grant-posting-permission\"],\n username,\n (payload) => [\n buildGrantPostingPermissionOp(\n username!,\n payload.currentPosting,\n payload.grantedAccount,\n payload.weightThreshold,\n payload.memoKey,\n payload.jsonMetadata\n )\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildAccountCreateOp, buildCreateClaimedAccountOp, type AccountKeys } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface CreateAccountPayload {\n newAccountName: string;\n keys: AccountKeys;\n fee: string;\n /** If true, uses a claimed account token instead of paying the fee */\n useClaimed?: boolean;\n}\n\nexport function useCreateAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"create\"],\n username,\n (payload) => [\n payload.useClaimed\n ? buildCreateClaimedAccountOp(username!, payload.newAccountName, payload.keys)\n : buildAccountCreateOp(username!, payload.newAccountName, payload.keys, payload.fee)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { parseAsset } from \"@/modules/core/utils\";\nimport { DynamicProps } from \"@/modules/core/types\";\nimport { FullAccount } from \"../types\";\nimport { calculateVPMana, calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\n\nconst HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24; // 5 days\nconst HIVE_100_PERCENT = 10000;\nconst HIVE_VOTE_DUST_THRESHOLD = 50_000_000;\n\nfunction getEffectiveVests(account: FullAccount): number {\n const vesting = parseAsset(account.vesting_shares).amount;\n const received = parseAsset(account.received_vesting_shares).amount;\n const delegated = parseAsset(account.delegated_vesting_shares).amount;\n const withdrawRate = parseAsset(account.vesting_withdraw_rate).amount;\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n\n return vesting + received - delegated - withdrawVests;\n}\n\nfunction vestsToRshares(vests: number, votingPowerValue: number, votePerc: number): number {\n const vestingShares = vests * 1e6;\n const power = (votingPowerValue * votePerc) / 1e4 / 50 + 1;\n return (power * vestingShares) / 1e4;\n}\n\nfunction hasStableVoteHardfork(dynamicProps: DynamicProps): boolean {\n if (Number.isFinite(dynamicProps.lastHardfork)) {\n return dynamicProps.lastHardfork >= 28;\n }\n\n const [major = \"0\", minor = \"0\"] = (dynamicProps.currentHardforkVersion ?? \"0.0.0\").split(\".\");\n return Number(major) > 1 || (Number(major) === 1 && Number(minor) >= 28);\n}\n\nfunction stableVoteRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n weight: number\n): number {\n const reserveRate =\n dynamicProps.votePowerReserveRate ||\n Number(dynamicProps.raw?.globalDynamic?.vote_power_reserve_rate ?? 0);\n\n if (!Number.isFinite(reserveRate) || reserveRate <= 0) {\n return 0;\n }\n\n const effectiveVests = getEffectiveVests(account);\n if (!Number.isFinite(effectiveVests) || effectiveVests <= 0) {\n return 0;\n }\n\n const vestingShares = effectiveVests * 1e6;\n const usedMana =\n Math.ceil(\n (vestingShares * weight * 60 * 60 * 24) /\n HIVE_100_PERCENT /\n (reserveRate * HIVE_VOTING_MANA_REGENERATION_SECONDS)\n );\n\n const mana = calculateVPMana(account);\n const currentMana = Math.min(mana.current_mana, mana.max_mana);\n\n if (!Number.isFinite(currentMana) || usedMana > currentMana) {\n return 0;\n }\n\n return Math.max(usedMana - HIVE_VOTE_DUST_THRESHOLD, 0);\n}\n\nexport function votingRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n\n if (hasStableVoteHardfork(dynamicProps)) {\n return stableVoteRshares(account, dynamicProps, weight);\n }\n\n let totalVests = 0;\n try {\n totalVests = getEffectiveVests(account);\n if (!Number.isFinite(totalVests)) {\n return 0;\n }\n } catch {\n return 0;\n }\n\n return vestsToRshares(totalVests, votingPowerValue, weight);\n}\n\nexport function votingPower(account: FullAccount): number {\n const calc = calculateVPMana(account);\n return calc.percentage / 100;\n}\n\nexport function powerRechargeTime(power: number) {\n if (!Number.isFinite(power)) {\n throw new TypeError(\"Voting power must be a finite number\");\n }\n if (power < 0 || power > 100) {\n throw new RangeError(\"Voting power must be between 0 and 100\");\n }\n const missingPower = 100 - power;\n return (\n (missingPower * 100 * HIVE_VOTING_MANA_REGENERATION_SECONDS) / 10000\n );\n}\n\nexport function downVotingPower(account: FullAccount): number {\n const totalShares =\n parseFloat(account.vesting_shares) +\n parseFloat(account.received_vesting_shares) -\n parseFloat(account.delegated_vesting_shares);\n const elapsed = Math.floor(Date.now() / 1000) - account.downvote_manabar.last_update_time;\n const maxMana = (totalShares * 1000000) / 4;\n\n if (maxMana <= 0) {\n return 0;\n }\n\n let currentMana =\n parseFloat(account.downvote_manabar.current_mana.toString()) +\n (elapsed * maxMana) / HIVE_VOTING_MANA_REGENERATION_SECONDS;\n\n if (currentMana > maxMana) {\n currentMana = maxMana;\n }\n const currentManaPerc = (currentMana * 100) / maxMana;\n\n if (isNaN(currentManaPerc)) {\n return 0;\n }\n\n if (currentManaPerc > 100) {\n return 100;\n }\n return currentManaPerc;\n}\n\nexport function rcPower(account: RCAccount): number {\n const calc = calculateRCMana(account);\n return calc.percentage / 100;\n}\n\nexport function votingValue(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n const { fundRecentClaims, fundRewardBalance, base, quote } = dynamicProps;\n\n if (\n !Number.isFinite(fundRecentClaims) ||\n !Number.isFinite(fundRewardBalance) ||\n !Number.isFinite(base) ||\n !Number.isFinite(quote)\n ) {\n return 0;\n }\n\n if (fundRecentClaims === 0 || quote === 0) {\n return 0;\n }\n\n const rShares = votingRshares(account, dynamicProps, votingPowerValue, weight);\n\n if (!Number.isFinite(rShares)) {\n return 0;\n }\n\n return (rShares / fundRecentClaims) * fundRewardBalance * (base / quote);\n}\n","import type { Operation } from \"../../hive-tx\";\n\n/**\n * Authority levels for Hive blockchain operations.\n * - posting: Social operations (voting, commenting, reblogging)\n * - active: Financial and account management operations\n * - owner: Critical security operations (key changes, account recovery)\n * - memo: Memo encryption/decryption (rarely used for signing)\n */\nexport type AuthorityLevel = 'posting' | 'active' | 'owner' | 'memo';\n\n/**\n * Maps operation types to their required authority level.\n *\n * This mapping is used to determine which key is needed to sign a transaction,\n * enabling smart auth fallback and auth upgrade UI.\n *\n * @remarks\n * - Most social operations (vote, comment, reblog) require posting authority\n * - Financial operations (transfer, withdraw) require active authority\n * - Account management operations require active authority\n * - Security operations (password change, account recovery) require owner authority\n * - custom_json requires dynamic detection based on required_auths vs required_posting_auths\n */\nexport const OPERATION_AUTHORITY_MAP: Record = {\n // Posting authority operations\n vote: 'posting',\n comment: 'posting',\n delete_comment: 'posting',\n comment_options: 'posting',\n claim_reward_balance: 'posting',\n\n // Active authority operations - Financial\n cancel_transfer_from_savings: 'active',\n collateralized_convert: 'active',\n convert: 'active',\n delegate_vesting_shares: 'active',\n recurrent_transfer: 'active',\n set_withdraw_vesting_route: 'active',\n transfer: 'active',\n transfer_from_savings: 'active',\n transfer_to_savings: 'active',\n transfer_to_vesting: 'active',\n withdraw_vesting: 'active',\n\n // Active authority operations - Market\n limit_order_create: 'active',\n limit_order_cancel: 'active',\n\n // Active authority operations - Account Management\n account_update: 'active',\n account_update2: 'active',\n claim_account: 'active',\n create_claimed_account: 'active',\n\n // Active authority operations - Governance\n account_witness_proxy: 'active',\n account_witness_vote: 'active',\n remove_proposal: 'active',\n update_proposal_votes: 'active',\n\n // Owner authority operations - Security & Account Recovery\n change_recovery_account: 'owner',\n request_account_recovery: 'owner',\n recover_account: 'owner',\n reset_account: 'owner',\n set_reset_account: 'owner',\n\n // Note: Some operations are handled separately via content inspection:\n // - custom_json: via getCustomJsonAuthority() - posting or active based on required_auths\n // - create_proposal/update_proposal: via getProposalAuthority() - typically active\n};\n\n/**\n * Determines authority required for a custom_json operation.\n *\n * Custom JSON operations can require either posting or active authority\n * depending on which field is populated:\n * - required_auths (active authority)\n * - required_posting_auths (posting authority)\n *\n * @param customJsonOp - The custom_json operation to inspect\n * @returns 'active' if requires active authority, 'posting' if requires posting authority\n *\n * @example\n * ```typescript\n * // Reblog operation (posting authority)\n * const reblogOp: Operation = ['custom_json', {\n * required_auths: [],\n * required_posting_auths: ['alice'],\n * id: 'reblog',\n * json: '...'\n * }];\n * getCustomJsonAuthority(reblogOp); // Returns 'posting'\n *\n * // Some active authority custom_json\n * const activeOp: Operation = ['custom_json', {\n * required_auths: ['alice'],\n * required_posting_auths: [],\n * id: 'some_active_op',\n * json: '...'\n * }];\n * getCustomJsonAuthority(activeOp); // Returns 'active'\n * ```\n */\nexport function getCustomJsonAuthority(customJsonOp: Operation): AuthorityLevel {\n const opType = customJsonOp[0];\n const payload = customJsonOp[1];\n\n if (opType !== 'custom_json') {\n throw new Error('Operation is not a custom_json operation');\n }\n\n // Type assertion for custom_json payload\n const customJson = payload as {\n required_auths?: string[];\n required_posting_auths?: string[];\n id: string;\n json: string;\n };\n\n // If required_auths is set and non-empty, needs active authority\n if (customJson.required_auths && customJson.required_auths.length > 0) {\n return 'active';\n }\n\n // If only required_posting_auths is set, needs posting authority\n if (customJson.required_posting_auths && customJson.required_posting_auths.length > 0) {\n return 'posting';\n }\n\n // Default to posting for custom_json (most common case)\n return 'posting';\n}\n\n/**\n * Determines authority required for a proposal operation.\n *\n * Proposal operations (create_proposal, update_proposal) typically require\n * active authority as they involve financial commitments and funding allocations.\n *\n * @param proposalOp - The proposal operation to inspect\n * @returns 'active' authority requirement\n *\n * @remarks\n * Unlike custom_json, proposal operations don't have explicit required_auths fields.\n * They always use the creator's authority, which defaults to active for financial\n * operations involving the DAO treasury.\n *\n * @example\n * ```typescript\n * const proposalOp: Operation = ['create_proposal', {\n * creator: 'alice',\n * receiver: 'bob',\n * subject: 'My Proposal',\n * permlink: 'my-proposal',\n * start: '2026-03-01T00:00:00',\n * end: '2026-04-01T00:00:00',\n * daily_pay: '100.000 HBD',\n * extensions: []\n * }];\n * getProposalAuthority(proposalOp); // Returns 'active'\n * ```\n */\nexport function getProposalAuthority(proposalOp: Operation): AuthorityLevel {\n const opType = proposalOp[0];\n\n if (opType !== 'create_proposal' && opType !== 'update_proposal') {\n throw new Error('Operation is not a proposal operation');\n }\n\n // Proposal operations require active authority for financial operations\n return 'active';\n}\n\n/**\n * Determines the required authority level for any operation.\n *\n * Uses the OPERATION_AUTHORITY_MAP for standard operations, and dynamic\n * detection for custom_json operations.\n *\n * @param op - The operation to check\n * @returns 'posting' or 'active' authority requirement\n *\n * @example\n * ```typescript\n * const voteOp: Operation = ['vote', { voter: 'alice', author: 'bob', permlink: 'post', weight: 10000 }];\n * getOperationAuthority(voteOp); // Returns 'posting'\n *\n * const transferOp: Operation = ['transfer', { from: 'alice', to: 'bob', amount: '1.000 HIVE', memo: '' }];\n * getOperationAuthority(transferOp); // Returns 'active'\n * ```\n */\nexport function getOperationAuthority(op: Operation): AuthorityLevel {\n const opType = op[0];\n\n // Special handling for custom_json - requires content inspection\n if (opType === 'custom_json') {\n return getCustomJsonAuthority(op);\n }\n\n // Special handling for proposal operations - requires content inspection\n if (opType === 'create_proposal' || opType === 'update_proposal') {\n return getProposalAuthority(op);\n }\n\n // Use mapping for standard operations, default to posting if unknown\n return OPERATION_AUTHORITY_MAP[opType] ?? 'posting';\n}\n\n/**\n * Determines the highest authority level required for a list of operations.\n *\n * Useful when broadcasting multiple operations together - the highest authority\n * level required by any operation determines what key is needed for the batch.\n *\n * Authority hierarchy: owner > active > posting > memo\n *\n * @param ops - Array of operations\n * @returns Highest authority level required ('owner', 'active', or 'posting')\n *\n * @example\n * ```typescript\n * const ops: Operation[] = [\n * ['vote', { ... }], // posting\n * ['comment', { ... }], // posting\n * ];\n * getRequiredAuthority(ops); // Returns 'posting'\n *\n * const mixedOps: Operation[] = [\n * ['comment', { ... }], // posting\n * ['transfer', { ... }], // active\n * ];\n * getRequiredAuthority(mixedOps); // Returns 'active'\n *\n * const securityOps: Operation[] = [\n * ['transfer', { ... }], // active\n * ['change_recovery_account', { ... }], // owner\n * ];\n * getRequiredAuthority(securityOps); // Returns 'owner'\n * ```\n */\nexport function getRequiredAuthority(ops: Operation[]): AuthorityLevel {\n let highestAuthority: AuthorityLevel = 'posting';\n\n for (const op of ops) {\n const authority = getOperationAuthority(op);\n\n // Owner is highest - return immediately\n if (authority === 'owner') {\n return 'owner';\n }\n\n // Active is higher than posting\n if (authority === 'active' && highestAuthority === 'posting') {\n highestAuthority = 'active';\n }\n\n // Memo is lowest (same level as posting)\n // If we see memo but only have posting, stick with posting\n }\n\n return highestAuthority;\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { isWif, broadcastOperations } from \"@/modules/core/hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useSignOperationByKey(username: string | undefined) {\n return useMutation({\n mutationKey: [\"operations\", \"sign\", username],\n mutationFn: ({\n operation,\n keyOrSeed,\n }: {\n operation: Operation;\n keyOrSeed: string;\n }) => {\n if (!username) {\n throw new Error(\"[Operations][Sign] – cannot sign op with anon user\");\n }\n\n let privateKey: PrivateKey;\n if (keyOrSeed.split(\" \").length === 12) {\n privateKey = PrivateKey.fromLogin(username, keyOrSeed, \"active\");\n } else if (isWif(keyOrSeed)) {\n privateKey = PrivateKey.fromString(keyOrSeed);\n } else {\n privateKey = PrivateKey.from(keyOrSeed);\n }\n\n return broadcastOperations(\n [operation],\n privateKey\n );\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport function useSignOperationByKeychain(\n username: string | undefined,\n auth?: AuthContextV2,\n keyType: \"owner\" | \"active\" | \"posting\" | \"memo\" = \"active\"\n) {\n return useMutation({\n mutationKey: [\"operations\", \"sign-keychain\", username],\n mutationFn: ({ operation }: { operation: Operation }) => {\n if (!username) {\n throw new Error(\n \"[SDK][Keychain] – cannot sign operation with anon user\"\n );\n }\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Keychain] – missing keychain broadcaster\");\n }\n\n return auth.adapter.broadcastWithKeychain(username, [operation], keyType);\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function useSignOperationByHivesigner(callbackUri = \"/\") {\n return useMutation({\n mutationKey: [\"operations\", \"sign-hivesigner\", callbackUri],\n mutationFn: async ({ operation }: { operation: Operation }) => {\n return hs.sendOperation(operation, { callback: callbackUri }, () => {});\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getChainPropertiesQueryOptions() {\n return queryOptions({\n queryKey: [\"operations\", \"chain-properties\"],\n queryFn: async () => {\n return await callRPC(\"condenser_api.get_chain_properties\", []);\n },\n });\n}\n","import { Fragment } from \"../types\";\n\n/**\n * Build the cache entry for an edited fragment.\n *\n * The `/private-api/fragments-update` endpoint returns only a minimal\n * acknowledgement, not the full fragment. Writing that response straight into\n * the query cache blanked out the edited snippet (the reported bug), so the\n * updated record is built from the values the user actually submitted, merged\n * over whatever fields the response does carry, on top of the existing cached\n * fragment (preserving id/created).\n */\nexport function applyFragmentUpdate(\n existing: Fragment,\n response: Partial | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...existing,\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n };\n}\n\n/**\n * Build the cache entry for a newly added fragment. Reaffirms the submitted\n * title/body over the server acknowledgement so a fresh snippet never renders\n * blank if the response omits them, while keeping any server-provided\n * id/timestamps.\n */\nexport function buildAddedFragment(\n response: Fragment | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n } as Fragment;\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { buildAddedFragment } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAddFragment(username: string, code: string | undefined) {\n return useMutation({\n mutationKey: [\"posts\", \"add-fragment\", username],\n mutationFn: async ({ title, body }: { title: string; body: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-add\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and insert a bogus fragment into the cache. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to add fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // Reaffirm the submitted title/body over the server acknowledgement so a\n // freshly added snippet never renders blank if the response omits them,\n // while keeping any server-provided id/timestamps.\n const newFragment = buildAddedFragment(response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [newFragment, ...(data ?? [])]\n );\n\n // Update infinite query cache - add new fragment to first page\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page, index) =>\n index === 0\n ? { ...page, data: [newFragment, ...page.data] }\n : page\n ),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { applyFragmentUpdate } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useEditFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"edit-fragment\", username],\n mutationFn: async ({\n fragmentId,\n title,\n body\n }: {\n fragmentId: string;\n title: string;\n body: string;\n }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-update\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and overwrite the cached fragment with bogus data. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to update fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // The /fragments-update endpoint returns a minimal acknowledgement, not the\n // full fragment, so writing the raw response into the cache blanked out the\n // edited snippet. Rebuild the fragment from the submitted values instead.\n const applyUpdate = (fragment: Fragment): Fragment =>\n applyFragmentUpdate(fragment, response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) =>\n data?.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ) ?? []\n );\n\n // Update infinite query cache - update fragment in all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useRemoveFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"remove-fragment\", username],\n mutationFn: async ({ fragmentId }: { fragmentId: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/fragments-delete\", {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // getBoundFetch returns the raw fetch, so a 401/403/500 resolves rather than\n // rejects. Without this guard onSuccess would run and strip the fragment from\n // cache on a failed delete (false success). Throw so onError fires instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to delete fragment: ${response.status}`);\n }\n\n return response;\n },\n onSuccess(_data, variables) {\n const queryClient = getQueryClient();\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [...(data ?? [])].filter(({ id }) => id !== variables.fragmentId)\n );\n\n // Update infinite query cache - remove fragment from all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((fragment) => fragment.id !== variables.fragmentId),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { ApiNotification, ApiNotificationSetting } from \"@/modules/notifications\";\nimport { Draft, DraftMetadata } from \"@/modules/posts/types/draft\";\nimport { Schedule } from \"@/modules/posts/types/schedule\";\nimport { ApiResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n if (!response.ok) {\n let errorData: unknown = undefined;\n try {\n errorData = await response.json();\n } catch {\n errorData = undefined;\n }\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = errorData;\n throw error;\n }\n\n // Handle empty responses gracefully (e.g., 204 No Content or empty body)\n const text = await response.text();\n if (!text || text.trim() === \"\") {\n return \"\" as T;\n }\n\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n // If JSON parsing fails, return empty string as fallback\n console.warn(\"[SDK] Failed to parse JSON response:\", e, \"Response:\", text);\n return \"\" as T;\n }\n}\n\nexport async function signUp(\n username: string,\n email: string,\n referral: string,\n captchaToken?: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/account-create\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, email, referral, captcha_token: captchaToken }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function subscribeEmail(\n email: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/subscribe\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function usrActivity(\n code: string | undefined,\n ty: number,\n bl: string | number = \"\",\n tx: string | number = \"\"\n): Promise {\n const params: {\n code: string | undefined;\n ty: number;\n bl?: string | number;\n tx?: string | number;\n } = { code, ty };\n\n if (bl) {\n params.bl = bl;\n }\n if (tx) {\n params.tx = tx;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/usr-activity\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(params),\n });\n\n await parseJsonResponse(response);\n}\n\nexport async function getNotifications(\n code: string | undefined,\n filter: string | null,\n since: string | null = null,\n user: string | null = null\n): Promise {\n const data: { code: string | undefined; filter?: string; since?: string; user?: string } = {\n code,\n };\n\n if (filter) {\n data.filter = filter;\n }\n\n if (since) {\n data.since = since;\n }\n\n if (user) {\n data.user = user;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function saveNotificationSetting(\n code: string | undefined,\n username: string,\n system: string,\n allows_notify: number,\n notify_types: number[],\n token: string\n): Promise {\n const data = {\n code,\n username,\n token,\n system,\n allows_notify,\n notify_types,\n };\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/register-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getNotificationSetting(\n code: string | undefined,\n username: string,\n token: string\n): Promise {\n const data = { code, username, token };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/detail-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function markNotifications(\n code: string | undefined,\n id?: string\n): Promise> {\n const data: { code: string | undefined; id?: string } = {\n code,\n };\n if (id) {\n data.id = id;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications/mark\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addImage(code: string | undefined, url: string): Promise> {\n const data = { code, url };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\n// Upload always targets the canonical Ecency image server, even when\n// the user has changed their viewing proxy (e.g. images.hive.blog).\n// i.ecency.com is the same imagehoster endpoint as images.ecency.com\n// (identical backend / token validation); it is the canonical host\n// because some ISPs SNI-filter the images.ecency.com hostname.\nconst UPLOAD_HOST = \"https://i.ecency.com\";\n\nexport async function uploadImage(\n file: File,\n token: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${UPLOAD_HOST}/hs/${token}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\n/**\n * Upload image using posting key signature (/:username/:signature path).\n * Works with any compatible image server (images.ecency.com, images.hive.blog).\n * The signature is sha256(\"ImageSigningChallenge\" + fileData) signed with the posting key.\n */\nexport async function uploadImageWithSignature(\n file: File,\n username: string,\n signature: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${CONFIG.imageHost}/${username}/${signature}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\nexport async function deleteImage(\n code: string | undefined,\n imageId: string\n): Promise> {\n const data = { code, id: imageId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addDraft(\n code: string | undefined,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function updateDraft(\n code: string | undefined,\n draftId: string,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, id: draftId, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-update\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function deleteDraft(\n code: string | undefined,\n draftId: string\n): Promise> {\n const data = { code, id: draftId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addSchedule(\n code: string | undefined,\n permlink: string,\n title: string,\n body: string,\n meta: Record,\n options: Record | null,\n schedule: string,\n reblog: boolean\n): Promise> {\n const data: Record = {\n code,\n permlink,\n title,\n body,\n meta,\n schedule,\n reblog,\n };\n\n if (options) {\n data.options = options;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function deleteSchedule(\n code: string | undefined,\n id: string\n): Promise> {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function moveSchedule(code: string | undefined, id: string): Promise {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-move\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getPromotedPost(\n code: string | undefined,\n author: string,\n permlink: string\n): Promise<{ author: string; permlink: string } | \"\"> {\n const data = { code, author, permlink };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/promoted-post\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ author: string; permlink: string } | \"\">(response);\n}\n\nexport async function onboardEmail(\n username: string,\n email: string,\n friend: string\n): Promise> {\n const dataBody = {\n username,\n email,\n friend,\n };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/account-create-friend\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(dataBody),\n }\n );\n\n return parseJsonResponse>(response);\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useAddDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"add\", username],\n mutationFn: async ({\n title,\n body,\n tags,\n meta,\n }: {\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addDraft\");\n }\n return addDraft(code, title, body, tags, meta);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full drafts list from the response (API returns complete list)\n if (data?.drafts) {\n qc.setQueryData(QueryKeys.posts.drafts(username), data.drafts);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n }\n // Also invalidate the infinite query so the drafts list refetches\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { updateDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useUpdateDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"update\", username],\n mutationFn: async ({\n draftId,\n title,\n body,\n tags,\n meta,\n }: {\n draftId: string;\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for updateDraft\");\n }\n return updateDraft(code, draftId, title, body, tags, meta);\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteDraft } from \"@/modules/private-api/requests\";\nimport type { Draft } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useDeleteDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"delete\", username],\n mutationFn: async ({ draftId }: { draftId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteDraft\");\n }\n return deleteDraft(code, draftId);\n },\n onMutate: async ({ draftId }) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.posts.drafts(username);\n const infinitePrefix = QueryKeys.posts.draftsInfinite(username);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((d) => d._id !== draftId)\n );\n }\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((d) => d._id !== draftId),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite };\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError: (err, _variables, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.posts.drafts(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n onError?.(err);\n },\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addSchedule } from \"@/modules/private-api/requests\";\n\nexport function useAddSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"add\", username],\n mutationFn: async ({\n permlink,\n title,\n body,\n meta,\n options,\n schedule,\n reblog,\n }: {\n permlink: string;\n title: string;\n body: string;\n meta: Record;\n options: Record | null;\n schedule: string;\n reblog: boolean;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addSchedule\");\n }\n return addSchedule(code, permlink, title, body, meta, options, schedule, reblog);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.schedules(username),\n });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteSchedule } from \"@/modules/private-api/requests\";\n\nexport function useDeleteSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"delete\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteSchedule\");\n }\n return deleteSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { moveSchedule } from \"@/modules/private-api/requests\";\n\nexport function useMoveSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"move\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for moveSchedule\");\n }\n return moveSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n // Also invalidate drafts since moving a schedule creates a draft\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to add an image URL to the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful addition\n * @param onError - Optional callback on error\n *\n * @example\n * const addImageMutation = useAddImage(username, code);\n * addImageMutation.mutate({ url: 'https://...' });\n */\nexport function useAddImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"add\", username],\n mutationFn: async ({ url, code: nextCode }: { url: string; code?: string }) => {\n const effectiveCode = nextCode ?? code;\n\n if (!username || !effectiveCode) {\n throw new Error(\"[SDK][Posts] – missing auth for addImage\");\n }\n return addImage(effectiveCode, url);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.images(username),\n });\n },\n onError,\n });\n}\n","import { useMutation, type InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport { deleteImage } from \"@/modules/private-api/requests\";\nimport type { UserImage } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\n/**\n * Hook to delete an image from the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful deletion\n * @param onError - Optional callback on error\n *\n * @example\n * const deleteImageMutation = useDeleteImage(username, code);\n * deleteImageMutation.mutate({ imageId: '123' });\n */\nexport function useDeleteImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"delete\", username],\n mutationFn: async ({ imageId }: { imageId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteImage\");\n }\n return deleteImage(code, imageId);\n },\n onSuccess: (_data, variables) => {\n onSuccess?.();\n const qc = getQueryClient();\n const { imageId } = variables;\n\n // Optimistic removal from regular cache\n qc.setQueryData(\n [\"posts\", \"images\", username],\n (prev) => prev?.filter((img) => img._id !== imageId)\n );\n\n // Optimistic removal from infinite cache pages\n qc.setQueriesData>>(\n { queryKey: [\"posts\", \"images\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((img) => img._id !== imageId),\n })),\n };\n }\n );\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { uploadImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to upload an image file to Ecency image hosting\n *\n * @param onSuccess - Optional callback on successful upload, receives { url: string }\n * @param onError - Optional callback on error\n *\n * Note: This hook uploads to Ecency's image server and requires a signature token.\n * The token should be generated using the user's posting key signature.\n *\n * @example\n * const uploadMutation = useUploadImage(\n * (data) => console.log('Uploaded:', data.url)\n * );\n * uploadMutation.mutate({ file, token });\n */\nexport function useUploadImage(\n onSuccess?: (data: { url: string }) => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"upload\"],\n mutationFn: async ({\n file,\n token,\n signal,\n }: {\n file: File;\n token: string;\n signal?: AbortSignal;\n }) => {\n return uploadImage(file, token, signal);\n },\n onSuccess,\n onError,\n });\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry, EntryVote } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nfunction makeEntryPath(author: string, permlink: string) {\n return `/@${author}/${permlink}`;\n}\n\nfunction getEntryFromCache(\n author: string,\n permlink: string,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n return queryClient.getQueryData(\n QueryKeys.posts.entry(makeEntryPath(author, permlink))\n );\n}\n\nfunction setEntryInCache(entry: Entry, qc?: QueryClient) {\n const queryClient = qc ?? getQueryClient();\n queryClient.setQueryData(\n QueryKeys.posts.entry(makeEntryPath(entry.author, entry.permlink)),\n entry\n );\n}\n\nfunction mutateEntry(\n author: string,\n permlink: string,\n updater: (entry: Entry) => Entry,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = makeEntryPath(author, permlink);\n const existing = queryClient.getQueryData(QueryKeys.posts.entry(path));\n if (!existing) return undefined;\n\n const updated = updater(existing);\n queryClient.setQueryData(QueryKeys.posts.entry(path), updated);\n return existing;\n}\n\n/**\n * SDK-level entry cache utilities. These operate on SDK cache keys\n * ([\"posts\", \"entry\", \"/@author/permlink\"]).\n *\n * Web layer can bridge these to its own QueryIdentifiers.ENTRY keys\n * during the migration period.\n */\nexport namespace EntriesCacheManagement {\n export function updateVotes(\n author: string,\n permlink: string,\n votes: EntryVote[],\n payout: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n active_votes: votes,\n stats: {\n ...(entry.stats || {\n gray: false,\n hide: false,\n flag_weight: 0,\n total_votes: 0,\n }),\n total_votes: votes.length,\n flag_weight: entry.stats?.flag_weight || 0,\n },\n total_votes: votes.length,\n payout,\n pending_payout_value: String(payout),\n }),\n qc\n );\n }\n\n export function updateReblogsCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n reblogs: count,\n }),\n qc\n );\n }\n\n export function updateRepliesCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n children: count,\n }),\n qc\n );\n }\n\n export function addReply(\n reply: Entry,\n parentAuthor: string,\n parentPermlink: string,\n qc?: QueryClient\n ) {\n mutateEntry(\n parentAuthor,\n parentPermlink,\n (entry) => ({\n ...entry,\n children: entry.children + 1,\n replies: [reply, ...entry.replies],\n }),\n qc\n );\n }\n\n export function updateEntries(entries: Entry[], qc?: QueryClient) {\n entries.forEach((entry) => setEntryInCache(entry, qc));\n }\n\n export function invalidateEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ) {\n const queryClient = qc ?? getQueryClient();\n queryClient.invalidateQueries({\n queryKey: QueryKeys.posts.entry(makeEntryPath(author, permlink)),\n });\n }\n\n export function getEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ): Entry | undefined {\n return getEntryFromCache(author, permlink, qc);\n }\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Whether the cached active_votes list already reflects the broadcast vote:\n * the voter is present for a vote (weight !== 0) or absent for an unvote\n * (weight === 0). Used to avoid stacking the SDK's post-broadcast optimistic\n * update on top of a platform-level optimistic update applied at press time.\n */\nexport function isVoteAlreadyReflected(\n activeVotes: Array<{ voter: string }>,\n voter: string | undefined,\n weight: number\n): boolean {\n const hasVoterRecord = activeVotes.some((v) => v.voter === voter);\n return weight !== 0 ? hasVoterRecord : !hasVoterRecord;\n}\n\n/**\n * Payload for voting on a post or comment.\n */\nexport interface VotePayload {\n /** Author of the post/comment to vote on */\n author: string;\n /** Permlink of the post/comment to vote on */\n permlink: string;\n /** Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote) */\n weight: number;\n /** Optional estimated payout change for optimistic UI */\n estimated?: number;\n}\n\n/**\n * Post-broadcast optimistic cache update for a vote: replaces the voter's\n * active_votes record and bumps the payout by `estimated`. Skipped when the\n * cached entry already reflects this vote (voter present for a vote, absent\n * for an unvote): platforms with their own at-press optimistic layer (e.g.\n * the mobile app) have applied it by the time the broadcast resolves, and\n * stacking a second update here double-counts the payout and clobbers the\n * platform's richer vote record until the deferred invalidation.\n */\nexport function applyVoteCacheUpdate(\n username: string | undefined,\n variables: VotePayload,\n qc?: QueryClient\n): void {\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink, qc);\n if (\n !entry?.active_votes ||\n isVoteAlreadyReflected(entry.active_votes, username, variables.weight)\n ) {\n return;\n }\n const newVotes = [\n ...entry.active_votes.filter((v) => v.voter !== username),\n ...(variables.weight !== 0 ? [{ rshares: variables.weight, voter: username! }] : [])\n ];\n const newPayout = entry.payout + (variables.estimated ?? 0);\n EntriesCacheManagement.updateVotes(\n variables.author,\n variables.permlink,\n newVotes,\n newPayout,\n qc\n );\n}\n\n/**\n * React Query mutation hook for voting on posts and comments.\n *\n * This mutation broadcasts a vote operation to the Hive blockchain,\n * supporting upvotes (positive weight) and downvotes (negative weight).\n *\n * @param username - The username of the voter (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 120) if adapter.recordActivity is available\n * - Invalidates post cache to refetch updated vote data\n * - Invalidates voting power cache to show updated VP\n *\n * **Vote Weight:**\n * - 10000 = 100% upvote\n * - 0 = remove vote\n * - -10000 = 100% downvote\n *\n * @example\n * ```typescript\n * const voteMutation = useVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Upvote a post\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 10000\n * });\n *\n * // Remove vote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 0\n * });\n *\n * // Downvote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: -10000\n * });\n * ```\n *\n * @remarks\n * broadcastMode: async — Votes don't require block confirmation.\n * The vote is accepted into the mempool immediately; UI can optimistically update.\n */\nexport function useVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"vote\"],\n username,\n ({ author, permlink, weight }) => [\n buildVoteOp(username!, author, permlink, weight)\n ],\n async (result: any, variables) => {\n // Optimistic vote list + payout update (no-op when the cache already\n // reflects this vote — see applyVoteCacheUpdate).\n applyVoteCacheUpdate(username, variables);\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(120, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n if (auth?.adapter?.invalidateQueries) {\n const doInvalidate = () => {\n auth.adapter!.invalidateQueries!([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.accounts.full(username)\n ]);\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(doInvalidate, 4000);\n } else {\n doInvalidate();\n }\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildReblogOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Payload for reblogging a post.\n */\nexport interface ReblogPayload {\n /** Original post author */\n author: string;\n /** Original post permlink */\n permlink: string;\n /** If true, removes the reblog instead of creating it */\n deleteReblog?: boolean;\n}\n\n/**\n * React Query mutation hook for reblogging posts.\n *\n * This mutation broadcasts a custom_json operation to reblog (or un-reblog)\n * a post to the user's blog feed.\n *\n * @param username - The username performing the reblog (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 130) if adapter.recordActivity is available\n * - Invalidates blog feed cache to show the reblogged post\n * - Invalidates post cache to update reblog status\n *\n * **Reblog vs Delete:**\n * - deleteReblog: false (default) - Creates a reblog\n * - deleteReblog: true - Removes an existing reblog\n *\n * @example\n * ```typescript\n * const reblogMutation = useReblog(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Reblog a post\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post'\n * });\n *\n * // Remove a reblog\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * deleteReblog: true\n * });\n * ```\n */\nexport function useReblog(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"reblog\"],\n username,\n ({ author, permlink, deleteReblog }) => [\n buildReblogOp(username!, author, permlink, deleteReblog ?? false)\n ],\n async (result: any, variables) => {\n // Optimistic reblog count update\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink);\n if (entry) {\n const newCount = Math.max(0, (entry.reblogs ?? 0) + (variables.deleteReblog ? -1 : 1));\n EntriesCacheManagement.updateReblogsCount(variables.author, variables.permlink, newCount);\n }\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(130, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n const invalidate = () => {\n const qc = getQueryClient();\n qc.invalidateQueries({\n queryKey: QueryKeys.posts.accountPostsBlogPrefix(username!),\n });\n if (auth?.adapter?.invalidateQueries) {\n auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.posts.rebloggedBy(variables.author, variables.permlink),\n ]);\n }\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(invalidate, 4000);\n } else {\n invalidate();\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Beneficiary account and weight.\n */\nexport interface Beneficiary {\n /** Beneficiary account name */\n account: string;\n /** Beneficiary weight (10000 = 100%) */\n weight: number;\n}\n\n/**\n * Payload for creating a comment or post.\n */\nexport interface CommentPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post */\n permlink: string;\n /** Parent author (empty string for top-level posts) */\n parentAuthor: string;\n /** Parent permlink (category/tag for top-level posts) */\n parentPermlink: string;\n /** Title of the post (empty for comments) */\n title: string;\n /** Content body */\n body: string;\n /** JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for creating posts and comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to create a new post or reply on the Hive blockchain.\n *\n * @param username - The username creating the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 100 for posts, 110 for comments) if adapter.recordActivity is available\n * - Invalidates feed caches to show the new content\n * - Invalidates parent post cache if this is a reply\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Post vs Comment:**\n * - Post: parentAuthor = \"\", parentPermlink = category/tag\n * - Comment: parentAuthor = parent author, parentPermlink = parent permlink\n *\n * @example\n * ```typescript\n * const commentMutation = useComment(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a post\n * commentMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post-20260209',\n * parentAuthor: '',\n * parentPermlink: 'technology',\n * title: 'My Awesome Post',\n * body: 'This is the post content...',\n * jsonMetadata: {\n * tags: ['technology', 'hive'],\n * app: 'ecency/3.0.0'\n * },\n * options: {\n * beneficiaries: [\n * { account: 'ecency', weight: 500 }\n * ]\n * }\n * });\n *\n * // Create a comment\n * commentMutation.mutate({\n * author: 'bob',\n * permlink: 're-alice-my-awesome-post-20260209',\n * parentAuthor: 'alice',\n * parentPermlink: 'my-awesome-post-20260209',\n * title: '',\n * body: 'Great post!',\n * jsonMetadata: { app: 'ecency/3.0.0' }\n * });\n * ```\n */\nexport function useComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"comment\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (result: any, variables) => {\n // Determine if this is a post or comment\n const isPost = !variables.parentAuthor;\n const activityType = isPost ? 100 : 110;\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(activityType, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation (always runs regardless of recordActivity outcome)\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (!isPost) {\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * Adds an optimistic entry to all discussions caches for the given root post.\n * Uses predicate matching to find all sort order variants.\n */\nexport function addOptimisticDiscussionEntry(\n entry: Entry,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n queryClient.setQueryData(queryKey, [entry, ...data]);\n }\n }\n}\n\n/**\n * Removes an entry from all discussions caches for the given root post.\n * Returns the previous state for rollback.\n */\nexport function removeOptimisticDiscussionEntry(\n author: string,\n permlink: string,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n): Map {\n const queryClient = qc ?? getQueryClient();\n const snapshots = new Map();\n\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n snapshots.set(queryKey, data);\n queryClient.setQueryData(\n queryKey,\n data.filter(\n (e) => e.author !== author || e.permlink !== permlink\n )\n );\n }\n }\n\n return snapshots;\n}\n\n/**\n * Restores discussion cache snapshots (for rollback on error).\n */\nexport function restoreDiscussionSnapshots(\n snapshots: Map,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n for (const [queryKey, data] of snapshots) {\n queryClient.setQueryData(queryKey, data);\n }\n}\n\n/**\n * Updates a specific entry in the SDK entry cache.\n * Returns the previous entry for rollback.\n */\nexport function updateEntryInCache(\n author: string,\n permlink: string,\n updates: Partial,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n const previous = queryClient.getQueryData(QueryKeys.posts.entry(path));\n\n if (previous) {\n queryClient.setQueryData(QueryKeys.posts.entry(path), {\n ...previous,\n ...updates,\n });\n }\n\n return previous;\n}\n\n/**\n * Restores an entry in cache (for rollback on error).\n */\nexport function restoreEntryInCache(\n author: string,\n permlink: string,\n entry: Entry,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n queryClient.setQueryData(QueryKeys.posts.entry(path), entry);\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDeleteCommentOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport {\n removeOptimisticDiscussionEntry,\n restoreDiscussionSnapshots,\n} from \"../cache/discussions-cache-utils\";\nimport type { Entry } from \"../types\";\n\n/**\n * Payload for deleting a comment or post.\n */\nexport interface DeleteCommentPayload {\n /** Author of the comment/post to delete */\n author: string;\n /** Permlink of the comment/post to delete */\n permlink: string;\n /** Optional: Parent author (for cache invalidation of discussions) */\n parentAuthor?: string;\n /** Optional: Parent permlink (for cache invalidation of discussions) */\n parentPermlink?: string;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n}\n\n/**\n * React Query mutation hook for deleting posts and comments.\n *\n * This mutation broadcasts a delete_comment operation to the Hive blockchain.\n * Includes optimistic removal from discussions cache with rollback on error.\n *\n * @param username - The username deleting the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n */\nexport function useDeleteComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"deleteComment\"],\n username,\n ({ author, permlink }) => [\n buildDeleteCommentOp(author, permlink)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (variables.parentAuthor && variables.parentPermlink) {\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n {\n broadcastMode,\n // Optimistic removal: remove from discussions cache before broadcast\n onMutate: async (variables) => {\n const rootAuthor = variables.rootAuthor || variables.parentAuthor;\n const rootPermlink = variables.rootPermlink || variables.parentPermlink;\n\n if (rootAuthor && rootPermlink) {\n const snapshots = removeOptimisticDiscussionEntry(\n variables.author,\n variables.permlink,\n rootAuthor,\n rootPermlink\n );\n return { snapshots };\n }\n return {};\n },\n // Rollback on error: restore discussions cache\n onError: (_error, _variables, context) => {\n const { snapshots } = (context as { snapshots?: Map }) ?? {};\n if (snapshots) {\n restoreDiscussionSnapshots(snapshots);\n }\n },\n }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Payload for creating a cross-post.\n */\nexport interface CrossPostPayload {\n /** Author of the cross-post (current user) */\n author: string;\n /** Permlink of the cross-post (usually: original-permlink-community-id) */\n permlink: string;\n /** Community ID to cross-post to (used as parent_permlink) */\n parentPermlink: string;\n /** Title of the cross-post (same as original) */\n title: string;\n /** Body of the cross-post (includes reference to original) */\n body: string;\n /** JSON metadata (must include original_author, original_permlink, tags, app) */\n jsonMetadata: Record;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"0.000 HBD\" for declined payout) */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n };\n}\n\n/**\n * React Query mutation hook for creating cross-posts.\n *\n * A cross-post is a special type of post that references an original post\n * and publishes it to a different community.\n *\n * @param username - The username creating the cross-post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates feed/blog caches to show the new cross-post\n *\n * **Operations:**\n * - Always includes a comment operation (with empty parent_author for top-level post)\n * - Optionally includes comment_options operation for rewards/beneficiaries\n *\n * **Metadata Requirements:**\n * The jsonMetadata must include:\n * - `original_author`: Author of the original post\n * - `original_permlink`: Permlink of the original post\n * - `tags`: Tags for the cross-post (typically [\"cross-post\"])\n * - `app`: Application identifier (e.g., \"ecency/3.0.0-vision\")\n *\n * @example\n * ```typescript\n * const crossPostMutation = useCrossPost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a cross-post\n * crossPostMutation.mutate({\n * author: 'alice',\n * permlink: 'great-post-hive-123456',\n * parentPermlink: 'hive-123456', // community ID\n * title: 'Great Post',\n * body: 'This is a cross post of [@bob/great-post](/technology/@bob/great-post) by @alice.

Check this out!',\n * jsonMetadata: {\n * app: 'ecency/3.0.0-vision',\n * tags: ['cross-post'],\n * original_author: 'bob',\n * original_permlink: 'great-post'\n * },\n * options: {\n * maxAcceptedPayout: '0.000 HBD',\n * allowCurationRewards: false\n * }\n * });\n * ```\n */\nexport function useCrossPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"cross-post\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (empty parent_author for top-level post)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n \"\", // empty parent_author for top-level post\n payload.parentPermlink, // community ID\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n } = payload.options;\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n [] // No beneficiaries for cross-posts\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n // Invalidate target community feed so cross-post appears\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.parentPermlink\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\nimport type { Beneficiary } from \"./use-comment\";\n\n/**\n * Payload for updating a reply/comment.\n */\nexport interface UpdateReplyPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post being updated */\n permlink: string;\n /** Parent author */\n parentAuthor: string;\n /** Parent permlink */\n parentPermlink: string;\n /** Title (empty for comments) */\n title: string;\n /** Updated content body */\n body: string;\n /** Updated JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for updating existing replies/comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to update an existing reply/comment on the Hive blockchain.\n *\n * @param username - The username updating the comment (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates parent post cache to reflect the updated comment\n * - Invalidates discussions cache (all sort orders)\n * - Invalidates RC cache (RC decreases after updating)\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Important:**\n * - Updates use the same comment operation as creating new comments\n * - The blockchain identifies this as an update based on matching author/permlink\n * - Only the author can update their own content\n * - Content can only be updated before payout (within 7 days)\n *\n * @example\n * ```typescript\n * const updateReplyMutation = useUpdateReply(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update a reply\n * updateReplyMutation.mutate({\n * author: 'alice',\n * permlink: 're-bob-my-post-20260209',\n * parentAuthor: 'bob',\n * parentPermlink: 'my-post-20260209',\n * title: '',\n * body: 'Updated comment content!',\n * jsonMetadata: {\n * tags: ['comment'],\n * app: 'ecency/3.0.0-vision'\n * },\n * rootAuthor: 'bob',\n * rootPermlink: 'my-post-20260209'\n * });\n * ```\n */\nexport function useUpdateReply(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"update-reply\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (same operation for create and update)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = _result?.id ?? _result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(110, txId, _result?.block_num).catch((error) => {\n console.debug(\"[SDK][Posts][useUpdateReply] recordActivity failed\", {\n activityType: 110,\n blockNum: _result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPromoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for promoting a post using Ecency Points.\n */\nexport interface PromotePayload {\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Promotion duration in days */\n duration: number;\n}\n\n/**\n * React Query mutation hook for promoting posts.\n *\n * This mutation broadcasts a custom_json operation to promote a post\n * using Ecency Points. The post will appear in promoted feeds for the\n * specified duration.\n *\n * @param username - The username promoting the post (required for broadcast, deducts points from this user)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates promoted posts cache to show newly promoted content\n * - Invalidates user points balance\n * - Invalidates post cache to update promotion status\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_promote\"\n * - JSON: {\"user\": \"username\", \"author\": \"postauthor\", \"permlink\": \"postpermlink\", \"duration\": 7}\n * - Authority: Active key (required for point spending)\n *\n * **Cost:**\n * - Costs Ecency Points based on duration\n * - User must have sufficient points balance\n *\n * @example\n * ```typescript\n * const promoteMutation = usePromote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Promote a post for 7 days\n * promoteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-great-post',\n * duration: 7\n * });\n * ```\n */\nexport function usePromote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"ecency\", \"promote\"],\n username,\n ({ author, permlink, duration }) => [\n buildPromoteOp(username!, author, permlink, duration)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate promoted posts feed\n [...QueryKeys.posts._promotedPrefix],\n // Invalidate user points balance\n [...QueryKeys.points._prefix(username!)],\n // Invalidate specific post cache to update promotion status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport type ValidatePostCreatingOptions = {\n delays?: number[];\n};\n\nconst DEFAULT_VALIDATE_POST_DELAYS = [3000, 3000, 3000];\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function getContent(author: string, permlink: string): Promise {\n return callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise;\n}\n\nexport async function validatePostCreating(\n author: string,\n permlink: string,\n attempts = 0,\n options?: ValidatePostCreatingOptions\n) {\n const delays = options?.delays ?? DEFAULT_VALIDATE_POST_DELAYS;\n\n let response: Entry | undefined;\n try {\n response = await getContent(author, permlink);\n } catch (e) {\n response = undefined;\n }\n\n if (response || attempts >= delays.length) {\n return;\n }\n\n const waitMs = delays[attempts];\n if (waitMs > 0) {\n await delay(waitMs);\n }\n\n return validatePostCreating(author, permlink, attempts + 1, options);\n}\n","export * from \"./use-record-activity\";\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ntype ActivityType =\n // Editor related\n | \"post-created\"\n | \"post-updated\"\n | \"post-scheduled\"\n | \"draft-created\"\n | \"video-published\"\n\n // Legacy editor related\n | \"legacy-post-created\"\n | \"legacy-post-updated\"\n | \"legacy-post-scheduled\"\n | \"legacy-draft-created\"\n | \"legacy-video-published\"\n\n // Perks related\n | \"perks-points-by-qr\"\n | \"perks-account-boost\"\n | \"perks-promote\"\n | \"perks-boost-plus\"\n | \"points-claimed\"\n | \"spin-rolled\"\n\n // Signup related\n | \"signed-up-with-wallets\"\n | \"signed-up-with-email\";\n\nexport interface RecordActivityOptions {\n url?: string;\n domain?: string;\n}\n\n/**\n * Get current location info safely (works in browser and Node.js)\n * Returns empty strings in non-browser environments\n */\nfunction getLocationInfo(): { url: string; domain: string } {\n if (typeof window !== \"undefined\" && window.location) {\n return {\n url: window.location.href,\n domain: window.location.host,\n };\n }\n return { url: \"\", domain: \"\" };\n}\n\nexport function useRecordActivity(\n username: string | undefined,\n activityType: ActivityType,\n options?: RecordActivityOptions\n) {\n return useMutation({\n mutationKey: [\"analytics\", activityType],\n mutationFn: async () => {\n if (!activityType) {\n throw new Error(\"[SDK][Analytics] – no activity type provided\");\n }\n const fetchApi = getBoundFetch();\n\n // Use provided values or auto-detect from browser environment\n // Falls back to empty strings in non-browser environments (Node.js, React Native, etc.)\n const locationInfo = getLocationInfo();\n const url = options?.url ?? locationInfo.url;\n const domain = options?.domain ?? locationInfo.domain;\n\n try {\n await fetchApi(CONFIG.plausibleHost + \"/api/event\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: activityType,\n url,\n domain,\n props: {\n username,\n },\n }),\n });\n } catch {\n // Analytics is fire-and-forget - network failures, ad blockers,\n // and CORS issues should not bubble up as user-facing errors\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { LeaderBoardDuration, LeaderBoardItem } from \"../types\";\n\nexport function getDiscoverLeaderboardQueryOptions(duration: LeaderBoardDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-leaderboard\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/leaderboard/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch leaderboard: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { CurationDuration, CurationItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getDiscoverCurationQueryOptions(duration: CurationDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-curation\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/curation/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch curation data: ${response.status}`);\n }\n\n const data = (await response.json()) as CurationItem[];\n\n // Fetch account data for efficiency calculation\n const accounts = data.map((item) => item.account);\n const accountsResponse = await callRPC(\"condenser_api.get_accounts\", [accounts]);\n\n // Calculate efficiency for each curator\n for (let index = 0; index < accountsResponse.length; index++) {\n const element = accountsResponse[index];\n const curator = data[index];\n\n // Convert Asset to string if needed\n const vestingShares = typeof element.vesting_shares === 'string'\n ? element.vesting_shares\n : element.vesting_shares.toString();\n const receivedVestingShares = typeof element.received_vesting_shares === 'string'\n ? element.received_vesting_shares\n : element.received_vesting_shares.toString();\n const delegatedVestingShares = typeof element.delegated_vesting_shares === 'string'\n ? element.delegated_vesting_shares\n : element.delegated_vesting_shares.toString();\n const vestingWithdrawRate = typeof element.vesting_withdraw_rate === 'string'\n ? element.vesting_withdraw_rate\n : element.vesting_withdraw_rate.toString();\n\n const effectiveVest: number =\n parseFloat(vestingShares) +\n parseFloat(receivedVestingShares) -\n parseFloat(delegatedVestingShares) -\n parseFloat(vestingWithdrawRate);\n // `hp` is the reward in Hive Power; the denominator stays in VESTS, which\n // is what the ranking has always compared. Every curator is scaled the\n // same way, so the ordering is unaffected by the unit mismatch.\n curator.efficiency = curator.hp / effectiveVest;\n }\n\n // Sort by efficiency descending\n data.sort((a: CurationItem, b: CurationItem) => b.efficiency - a.efficiency);\n\n return data;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PageStatsResponse } from \"../types\";\n\n/**\n * Get page statistics from the private analytics API\n *\n * @param url - URL to get stats for\n * @param dimensions - Dimensions to query (default: [])\n * @param metrics - Metrics to query (default: [\"visitors\", \"pageviews\", \"visit_duration\"])\n * @param dateRange - Date range for the query (e.g. \"day\", \"7d\", \"30d\", \"all\")\n */\nexport function getPageStatsQueryOptions(\n url: string,\n dimensions: string[] = [],\n metrics: string[] = [\"visitors\", \"pageviews\", \"visit_duration\"],\n dateRange?: string\n) {\n // Sort arrays to ensure stable query keys regardless of input order\n const sortedDimensions = [...dimensions].sort();\n const sortedMetrics = [...metrics].sort();\n\n return queryOptions({\n queryKey: [\"analytics\", \"page-stats\", url, sortedDimensions, sortedMetrics, dateRange],\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/api/stats\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n date_range: dateRange,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch page stats: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!url,\n // Analytics data should always be fresh - users expect current stats when changing range\n staleTime: 0,\n });\n}\n","/**\n * 3Speak takes an 11% beneficiary share on posts that embed one of its videos.\n *\n * This lives in the SDK because the rule is a payout contract that both the web app and the\n * mobile app have to apply identically. It was previously duplicated in each, which meant a\n * change to the weight, or to what counts as an embed, could land on one platform and not the\n * other and silently misroute revenue.\n */\n\n/** A beneficiary route as it appears in `comment_options`. */\nexport interface ThreeSpeakBeneficiaryRoute {\n account: string;\n weight: number;\n src?: string;\n}\n\nexport const THREESPEAK_BENEFICIARY_ACCOUNT = \"threespeakfund\";\n\n/** Beneficiary weight in basis points: 1100 = 11%. */\nexport const THREESPEAK_BENEFICIARY_WEIGHT = 1100;\n\n/**\n * Whether the body embeds a 3Speak video.\n *\n * Matches an actual embed url (e.g. `https://play.3speak.tv/embed?v=user/id`), not a plain\n * text mention of \"3speak.tv/embed\", which would otherwise attach an 11% route to a post that\n * merely talks about 3Speak.\n *\n * `3speak.tv` must be the host, either bare or under dot-delimited subdomains. The previous\n * `[a-z.]*` prefix also matched a lookalike domain such as `fake3speak.tv`, which would have\n * routed 11% of a user's rewards to threespeakfund for a video 3Speak never hosted. Matching\n * is case-insensitive because hostnames are, and a missed match means the route is silently\n * not attached rather than anything failing loudly.\n *\n * Note this requires an `/embed` path segment. The embed url is not built locally, it comes\n * back from 3Speak on upload, so if that shape ever changes this predicate stops recognising\n * it and the route is silently not attached.\n */\nexport function hasThreeSpeakEmbed(body: string): boolean {\n return /https?:\\/\\/([a-z0-9-]+\\.)*3speak\\.tv\\/embed[?/]/i.test(body);\n}\n\n/**\n * Ensures the 3Speak beneficiary is present, at the correct weight, when the body embeds a\n * 3Speak video. Other beneficiaries are preserved and the input is never mutated. Returns the\n * original array reference untouched when there is nothing to change, so callers can use it as\n * a cheap equality check.\n */\nexport function enforceThreeSpeakBeneficiary(\n beneficiaries: T[],\n body: string\n): (T | ThreeSpeakBeneficiaryRoute)[] {\n if (!hasThreeSpeakEmbed(body)) {\n return beneficiaries;\n }\n\n const existing = beneficiaries.find((b) => b.account === THREESPEAK_BENEFICIARY_ACCOUNT);\n\n if (existing && existing.weight === THREESPEAK_BENEFICIARY_WEIGHT) {\n return beneficiaries;\n }\n\n if (existing) {\n return beneficiaries.map((b) =>\n b.account === THREESPEAK_BENEFICIARY_ACCOUNT\n ? { ...b, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n : b\n );\n }\n\n return [\n ...beneficiaries,\n { account: THREESPEAK_BENEFICIARY_ACCOUNT, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n ];\n}\n\n/** Whether a beneficiary entry is the 3Speak route, which the UI locks from editing. */\nexport function isThreeSpeakBeneficiary(account: string): boolean {\n return account === THREESPEAK_BENEFICIARY_ACCOUNT;\n}\n","export * from \"./get-account-token-query-options\";\nexport * from \"./get-account-videos-query-options\";\n","export * from \"./get-decode-memo-query-options\";\n","import { queryOptions } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function getDecodeMemoQueryOptions(\n username: string,\n memo: string,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"hivesigner\", \"decode-memo\", username],\n queryFn: async () => {\n if (accessToken) {\n const hsClient = new hs.Client({\n accessToken,\n });\n return hsClient.decode(memo);\n }\n },\n });\n}\n","import * as queries from \"./queries\";\n\nconst HiveSignerIntegration = {\n queries,\n};\n\nexport { HiveSignerIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveSignerIntegration } from \"../../hivesigner\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\n\nexport function getAccountTokenQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"authenticate\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/login?username=${username}&hivesigner=true`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n const memoQueryOptions =\n HiveSignerIntegration.queries.getDecodeMemoQueryOptions(\n username,\n (await response.json()).memo,\n accessToken\n );\n await getQueryClient().prefetchQuery(memoQueryOptions);\n const { memoDecoded } = getQueryClient().getQueryData(\n memoQueryOptions.queryKey\n );\n\n return memoDecoded.replace(\"#\", \"\");\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ThreeSpeakVideo } from \"../types\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { getAccountTokenQueryOptions } from \"./get-account-token-query-options\";\n\nexport function getAccountVideosQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"videos\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const tokenQueryOptions = getAccountTokenQueryOptions(\n username,\n accessToken\n );\n\n await getQueryClient().prefetchQuery(tokenQueryOptions);\n const token = getQueryClient().getQueryData(tokenQueryOptions.queryKey);\n if (!token) {\n throw new Error(\"[SDK][Integrations][3Speak] – missing account token\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/api/my-videos`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n }\n );\n return (await response.json()) as ThreeSpeakVideo[];\n },\n });\n}\n","export * from \"./types\";\nexport * from \"./functions\";\nimport * as queries from \"./queries\";\n\nconst ThreeSpeakIntegration = {\n queries,\n};\n\nexport { ThreeSpeakIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/core\";\n\nexport function getHivePoshLinksQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"integrations\", \"hiveposh\", \"links\", username],\n retry: false, // Don't retry on user not found errors\n queryFn: async () => {\n try {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://hiveposh.com/api/v0/linked-accounts/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n // Handle 400 error when user is not registered on HivePosh\n if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n // Silently return null for \"User Not Connected\" errors\n if (errorData?.message === \"User Not Connected\") {\n return null;\n }\n }\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n\n return {\n twitter: {\n username: data.twitter_username,\n profile: data.twitter_profile,\n },\n reddit: {\n username: data.reddit_username,\n profile: data.reddit_profile,\n },\n } satisfies Record<\n \"twitter\" | \"reddit\",\n { username: string; profile: string }\n >;\n } catch (err) {\n // Silently handle all HivePosh API errors\n return null;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\n\nexport interface StatsResponse {\n results: [\n {\n metrics: number[];\n dimensions: string[];\n },\n ];\n query: {\n site_id: string;\n metrics: string[];\n date_range: string[];\n filters: string[];\n };\n}\ninterface UseStatsQueryOptions {\n url: string;\n dimensions?: string[];\n metrics?: string[];\n /**\n * Which dimension the `url` is matched against. `event:page` (default) matches\n * any visit that viewed the page; `visit:entry_page` matches only visits that\n * landed on it. The API route validates this against an allow-list.\n */\n filterBy?: \"event:page\" | \"visit:entry_page\";\n /**\n * Plausible `date_range`. Pass a tuple `[from, to]` (ISO `YYYY-MM-DD`) to scope\n * the query — e.g. a post's creation date through today. Scoping is essential:\n * ClickHouse orders events by `(site_id, toDate(timestamp), …)` and partitions\n * by month, so a bounded range prunes to a few granules instead of scanning the\n * whole history. Omitting it falls back to the route default (`\"all\"`), which on\n * a high-traffic site is a multi-second full scan. Plausible also accepts the\n * relative keywords `\"day\"`, `\"7d\"`, `\"30d\"`, `\"all\"`.\n */\n dateRange?: string | [string, string];\n enabled?: boolean;\n}\n\nexport function getStatsQueryOptions({\n url,\n dimensions = [],\n metrics = [\"visitors\", \"pageviews\", \"visit_duration\"],\n filterBy = \"event:page\",\n dateRange,\n enabled = true,\n}: UseStatsQueryOptions) {\n return queryOptions({\n queryKey: [\"integrations\", \"plausible\", url, dimensions, metrics, filterBy, dateRange],\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(`${CONFIG.privateApiHost}/api/stats`, {\n method: \"POST\",\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n filterBy,\n // Only forward a range when set, so the route keeps owning the default.\n ...(dateRange ? { date_range: dateRange } : {}),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // The proxy route returns 5xx (504/502) with an empty body on a Plausible\n // timeout/transport error, and Plausible itself can return a 4xx error JSON.\n // Without this guard those parse into an object with no `results`, and the UI\n // silently renders 0 — indistinguishable from a real zero. Throw instead so\n // React Query surfaces the error and retries.\n if (!response.ok) {\n throw new Error(`Failed to fetch Plausible stats: ${response.status}`);\n }\n\n return (await response.json()) as StatsResponse;\n },\n enabled: !!url && enabled,\n // Stats queries are now date-scoped and cheap; a single retry rides out a\n // transient slow scan without re-introducing the all-time pile-up.\n retry: 1,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRcStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"resource-credits\", \"stats\"],\n queryFn: async () => {\n const response = await callRPC(\"rc_api.get_rc_stats\", {});\n return response.rc_stats;\n },\n });\n}\n","import { callRPC } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getAccountRcQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"resource-credits\", \"account\", username],\n queryFn: async (): Promise => {\n const result = await callRPC(\"rc_api.find_rc_accounts\", {\n accounts: [username],\n });\n return result.rc_accounts;\n },\n enabled: !!username,\n });\n}\n","import { calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport type { RcStats } from \"../types/stats\";\n\n/**\n * Operations the RC pre-check can estimate. Mirrors the keys exposed by\n * `rc_api.get_rc_stats` (see {@link RcStats}[\"ops\"]).\n */\nexport type RcPrecheckOperation = keyof RcStats[\"ops\"];\n\nexport interface RcPrecheckInput {\n /** From `getAccountRcQueryOptions(username)` -> rcAccounts[0]. */\n rcAccount: RCAccount | null | undefined;\n /** From `getRcStatsQueryOptions()`. */\n rcStats: RcStats | null | undefined;\n /** The operation the user is about to broadcast. */\n operation: RcPrecheckOperation;\n /**\n * Safety multiplier applied to the average operation cost when deciding\n * whether the broadcast will \"likely fail\". Actual on-chain cost varies with\n * network load, so we keep headroom. Defaults to 1.2.\n */\n buffer?: number;\n}\n\nexport interface RcPrecheckResult {\n /** Both inputs were available, so the estimate is meaningful. */\n ready: boolean;\n /** Current RC mana of the account. */\n currentMana: number;\n /** Maximum RC mana of the account. */\n maxMana: number;\n /** Average RC cost of the operation. */\n avgCost: number;\n /** Average cost padded by `buffer`. */\n estimatedCost: number;\n /** `currentMana` is below the padded estimate -> broadcast likely fails. */\n willLikelyFail: boolean;\n /** RC shortfall vs the padded estimate (0 when not failing). */\n deficit: number;\n /** Roughly how many such operations the account can still afford. */\n remaining: number;\n}\n\nconst EMPTY: RcPrecheckResult = {\n ready: false,\n currentMana: 0,\n maxMana: 0,\n avgCost: 0,\n estimatedCost: 0,\n willLikelyFail: false,\n deficit: 0,\n remaining: 0,\n};\n\n/**\n * Pure, client-side estimate of whether an account has enough Resource Credits\n * to broadcast an operation, used to warn the user BEFORE they submit instead\n * of failing afterwards with the chain's \"Please wait to transact\" error.\n *\n * It is intentionally approximate: it uses the network-wide average cost from\n * `rc_api.get_rc_stats`, padded by a buffer. Treat `willLikelyFail` as a hint,\n * never a hard gate - the publish/comment/vote action must stay non-blocking.\n */\nexport function estimateRcPrecheck({\n rcAccount,\n rcStats,\n operation,\n buffer = 1.2,\n}: RcPrecheckInput): RcPrecheckResult {\n if (!rcAccount || !rcStats?.ops) {\n return EMPTY;\n }\n\n const { current_mana: currentMana, max_mana: maxMana } = calculateRCMana(rcAccount);\n const avgCost = Number(rcStats.ops[operation]?.avg_cost ?? 0);\n\n if (!(avgCost > 0)) {\n return { ...EMPTY, ready: true, currentMana, maxMana };\n }\n\n const safeBuffer = Number.isFinite(buffer) && buffer > 0 ? buffer : 1.2;\n const estimatedCost = avgCost * safeBuffer;\n const willLikelyFail = currentMana < estimatedCost;\n\n return {\n ready: true,\n currentMana,\n maxMana,\n avgCost,\n estimatedCost,\n willLikelyFail,\n deficit: willLikelyFail ? Math.ceil(estimatedCost - currentMana) : 0,\n remaining: Math.floor(currentMana / avgCost),\n };\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetGameStatus } from \"../types\";\n\nexport function getGameStatusCheckQueryOptions(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\"\n) {\n return queryOptions({\n queryKey: [\"games\", \"status-check\", gameType, username],\n enabled: !!username && !!code,\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/get-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()) as GetGameStatus;\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { GameClaim } from \"../types\";\nimport { useRecordActivity } from \"@/modules/analytics/mutations\";\n\nexport function useGameClaim(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\",\n key: string\n) {\n const { mutateAsync: recordActivity } = useRecordActivity(\n username,\n \"spin-rolled\"\n );\n\n return useMutation({\n mutationKey: [\"games\", \"post\", gameType, username],\n mutationFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/post-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n key,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (await response.json()) as GameClaim;\n },\n onSuccess() {\n recordActivity();\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { QuestsResponse } from \"../types\";\n\n/**\n * Read-only daily/weekly/monthly quest progress for a user. Aggregates the existing\n * points ledger (no auth required — same sensitivity as `/private-api/points`).\n */\nexport function getQuestsQueryOptions(username: string | undefined) {\n const name = username?.replace(\"@\", \"\");\n return queryOptions({\n queryKey: QueryKeys.quests.status(name),\n enabled: !!name,\n queryFn: async () => {\n if (!name) {\n throw new Error(\"[SDK][Quests] – username wasn't provided\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/quests\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ username: name }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch quests: ${response.status}`);\n }\n\n return (await response.json()) as QuestsResponse;\n },\n staleTime: 30000,\n refetchOnMount: true,\n });\n}\n","/**\n * Shared quest catalog — the single source of truth for which quests exist, their\n * encouraging goals, copy keys and icon hints. Lives in the SDK so the web and mobile\n * clients render an identical, harmonized set. The backend (`/private-api/quests`)\n * returns raw progress + the reward `cap`; this catalog layers the presentation.\n *\n * `goal` is an *encouraging, reachable* daily target and is intentionally independent of\n * the backend reward `cap` (the point at which the existing reward decays to ~0). It is\n * tunable here without any backend change.\n */\n\nexport type QuestTier = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface QuestCatalogEntry {\n id: string;\n tier: QuestTier;\n /** encouraging, reachable target for the period (tunable, not the reward cap) */\n goal: number;\n /** i18n key suffix; clients resolve e.g. `quests..title` / `.desc` */\n i18nKey: string;\n /** semantic icon hint; each client maps it to its own icon set */\n icon: string;\n}\n\nexport const QUEST_CATALOG: QuestCatalogEntry[] = [\n // Daily\n { id: \"checkin\", tier: \"daily\", goal: 1, i18nKey: \"checkin\", icon: \"check-circle\" },\n { id: \"post\", tier: \"daily\", goal: 1, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"daily\", goal: 3, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"daily\", goal: 10, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"daily\", goal: 1, i18nKey: \"reblog\", icon: \"repeat\" },\n { id: \"spin\", tier: \"daily\", goal: 1, i18nKey: \"spin\", icon: \"gift\" },\n // Weekly\n { id: \"post\", tier: \"weekly\", goal: 5, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"weekly\", goal: 15, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"weekly\", goal: 50, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"weekly\", goal: 5, i18nKey: \"reblog\", icon: \"repeat\" },\n // Monthly\n { id: \"post\", tier: \"monthly\", goal: 20, i18nKey: \"post\", icon: \"pencil\" },\n];\n\nexport function getQuestCatalogEntry(tier: QuestTier, id: string) {\n return QUEST_CATALOG.find((q) => q.tier === tier && q.id === id);\n}\n\n// Streak Freeze display config. MIRRORS the ePoints constants\n// (STREAK_FREEZE_PRICE / STREAK_FREEZE_MAX_OWNED) — the server is the source of truth\n// and validates every purchase; these drive the label + button state only, so a drift\n// here never over-charges (the buy is priced server-side).\nexport const STREAK_FREEZE_PRICE = 300;\nexport const STREAK_FREEZE_MAX_OWNED = 2;\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { StreakFreezeBuyResult } from \"../types\";\n\n/** A fresh idempotency key per purchase; guarded for runtimes without crypto.randomUUID. */\nfunction genIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * POST a single streak-freeze purchase. Throws on a non-2xx with the server's\n * `.status` + parsed `.data` attached so the caller can branch on 402 (insufficient)\n * / 409 (max owned). Exported for unit testing; the hook below wraps it.\n */\nexport async function buyStreakFreezeRequest(\n code: string\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/streak-freeze/buy\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code, idempotency_key: genIdempotencyKey() }),\n }\n );\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to buy streak freeze: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as StreakFreezeBuyResult;\n}\n\n/**\n * Buy one streak freeze (a Points-only sink). The server debits Points, caps owned\n * inventory, and is idempotent per key. On success the quests + points caches are\n * invalidated so the owned count and balance refresh. A 402 (insufficient) / 409 (max\n * owned) is rethrown with `.status` + `.data` so the caller can route to a Points top-up.\n */\nexport function useBuyStreakFreeze(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"streak-freeze\", \"buy\", name],\n mutationFn: async () => {\n if (!name || !code) {\n throw new Error(\"[SDK][StreakFreeze] – missing auth\");\n }\n return buyStreakFreezeRequest(code);\n },\n onSuccess() {\n // Balance only changes on a successful debit.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.points._prefix(name) });\n }\n },\n onSettled() {\n // Refresh freezes_owned on success AND error: a 409 (max owned) means the\n // client's count is stale, and without this the \"Protect streak\" button would\n // never hide and the user could keep re-triggering 409s.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.quests.status(name) });\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for subscribing to a community.\n */\nexport interface SubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for subscribing to a community.\n *\n * This mutation broadcasts a subscribe operation to the Hive blockchain,\n * adding the community to the user's subscription list.\n *\n * @param username - The username subscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"subscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const subscribeMutation = useSubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Subscribe to a community\n * subscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useSubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"subscribe\"],\n username,\n ({ community }) => [\n buildSubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnsubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unsubscribing from a community.\n */\nexport interface UnsubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for unsubscribing from a community.\n *\n * This mutation broadcasts an unsubscribe operation to the Hive blockchain,\n * removing the community from the user's subscription list.\n *\n * @param username - The username unsubscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"unsubscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const unsubscribeMutation = useUnsubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unsubscribe from a community\n * unsubscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useUnsubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"unsubscribe\"],\n username,\n ({ community }) => [\n buildUnsubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildMutePostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for muting/unmuting a post in a community.\n */\nexport interface MutePostPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Mute reason/notes (required even for unmute) */\n notes: string;\n /** True to mute, false to unmute */\n mute: boolean;\n}\n\n/**\n * React Query mutation hook for muting/unmuting posts in a community.\n *\n * This mutation broadcasts a custom_json operation to mute (or unmute)\n * a post within a community. Only community moderators/admins can mute posts.\n *\n * @param username - The username performing the mute (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community posts cache to hide muted content\n * - Invalidates post cache to update mute status\n * - Invalidates feed cache to remove muted posts from feeds\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"mutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Action (unmute): [\"unmutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Authority: Posting key\n *\n * **Mute vs Unmute:**\n * - mute: true - Mutes the post (hides from community feed)\n * - mute: false - Unmutes the post (restores to community feed)\n *\n * **Permission:**\n * - Only community moderators and admins can mute/unmute posts\n * - Attempting to mute without permission will fail with an error\n *\n * @example\n * ```typescript\n * const mutePostMutation = useMutePost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Mute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Violates community guidelines',\n * mute: true\n * });\n *\n * // Unmute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Resolved after editing',\n * mute: false\n * });\n * ```\n */\nexport function useMutePost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"mutePost\"],\n username,\n ({ community, author, permlink, notes, mute }) => [\n buildMutePostOp(username!, community, author, permlink, notes, mute)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n // Invalidate specific post cache to update mute status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n // Invalidate community data\n [\"community\", \"single\", variables.community],\n // Invalidate community feed/posts (matches all sort orders, limits, observers)\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.community\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetRoleOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community, CommunityTeam } from \"../types\";\n\n/**\n * Payload for setting a user's role in a community.\n */\nexport interface SetCommunityRolePayload {\n /** Account to set role for */\n account: string;\n /** Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\") */\n role: string;\n}\n\n/**\n * React Query mutation hook for setting a user's role in a community.\n *\n * This mutation broadcasts a setRole operation to the Hive blockchain,\n * updating the role of a community member. Only users with appropriate\n * permissions (community owner/admin) can set roles.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username setting the role (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated team member list\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"setRole\", {\"community\": \"hive-123456\", \"account\": \"user\", \"role\": \"mod\"}]\n * - Authority: Posting key\n *\n * **Role Types:**\n * - \"owner\" - Community owner (full permissions)\n * - \"admin\" - Administrator (can manage settings and team)\n * - \"mod\" - Moderator (can mute posts/users)\n * - \"member\" - Regular member (no special permissions)\n * - \"guest\" - Remove user from team (empty string also works)\n *\n * @example\n * ```typescript\n * const setRoleMutation = useSetCommunityRole('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Set a user as moderator\n * setRoleMutation.mutate({\n * account: 'alice',\n * role: 'mod'\n * });\n *\n * // Remove a user from the team\n * setRoleMutation.mutate({\n * account: 'bob',\n * role: 'guest'\n * });\n * ```\n */\nexport function useSetCommunityRole(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"set-role\", community],\n username,\n ({ account, role }) => [\n buildSetRoleOp(username!, community, account, role)\n ],\n async (_result: any, variables) => {\n // Optimistic team update in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n const team: CommunityTeam = [...(prev.team ?? [])];\n const idx = team.findIndex(([name]) => name === variables.account);\n if (idx >= 0) {\n team[idx] = [team[idx][0], variables.role, team[idx][2] ?? \"\"];\n } else {\n team.push([variables.account, variables.role, \"\"]);\n }\n return { ...prev, team };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries + context for affected user\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)],\n QueryKeys.communities.context(variables.account, community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUpdateCommunityOp, type CommunityProps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community } from \"../types\";\n\n/**\n * Payload for updating community properties.\n * Matches the CommunityProps interface from builders.\n */\nexport type UpdateCommunityPayload = CommunityProps;\n\n/**\n * React Query mutation hook for updating community properties.\n *\n * This mutation broadcasts an updateProps operation to the Hive blockchain,\n * modifying the community's metadata and settings. Only community admins\n * can update community properties.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username updating the community (required for broadcast, must be admin)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated properties\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"updateProps\", {\"community\": \"hive-123456\", \"props\": {...}}]\n * - Authority: Posting key\n *\n * **Properties:**\n * - title - Community display title\n * - about - Short description/tagline\n * - lang - Primary language code (e.g., \"en\")\n * - description - Full community description (markdown supported)\n * - flag_text - Custom text shown when flagging posts\n * - is_nsfw - Whether community contains NSFW content\n *\n * @example\n * ```typescript\n * const updateMutation = useUpdateCommunity('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update community properties\n * updateMutation.mutate({\n * title: 'My Awesome Community',\n * about: 'A place for awesome people',\n * lang: 'en',\n * description: '# Welcome\\nThis is our community description',\n * flag_text: 'Please explain why this content violates our rules',\n * is_nsfw: false\n * });\n * ```\n */\nexport function useUpdateCommunity(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"update\", community],\n username,\n (props) => [\n buildUpdateCommunityOp(username!, community, props)\n ],\n async (_result: any, variables) => {\n // Optimistic property merge in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n return { ...prev, ...(variables as unknown as Partial) };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)]\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommunityRegistrationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for community rewards registration.\n */\nexport interface CommunityRewardsRegisterPayload {\n /** Community account name (usually the community creator's account) */\n name: string;\n}\n\n/**\n * React Query mutation hook for registering to receive community rewards.\n *\n * This mutation broadcasts a custom_json operation to register a community\n * account to receive Ecency Points rewards for community activity.\n *\n * @param username - The username registering for community rewards (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to update registration status\n * - Invalidates points balance to reflect potential initial rewards\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_registration\"\n * - JSON: {\"name\": \"communityname\"}\n * - Authority: Active key (required for registration)\n *\n * **Purpose:**\n * - Enables communities to receive Ecency Points for activity\n * - One-time registration per community\n * - Can only be done by the community owner/creator\n *\n * @example\n * ```typescript\n * const registerMutation = useRegisterCommunityRewards(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Register community for rewards\n * registerMutation.mutate({\n * name: 'hive-123456'\n * });\n * ```\n */\nexport function useRegisterCommunityRewards(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"registerRewards\"],\n username,\n ({ name }) => [\n buildCommunityRegistrationOp(name)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate community cache to update registration status\n [...QueryKeys.communities.singlePrefix(variables.name)],\n // Invalidate points balance\n [...QueryKeys.points._prefix(username!)],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPinPostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface PinPostPayload {\n community: string;\n account: string;\n permlink: string;\n pin: boolean;\n}\n\nexport function usePinPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"pin-post\"],\n username,\n ({ community, account, permlink, pin }) => [\n buildPinPostOp(username!, community, account, permlink, pin)\n ],\n async (_result, variables) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.account}/${variables.permlink}`),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Communities } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunitiesQueryOptions(\n sort: string,\n query?: string,\n limit = 100,\n observer: string | undefined = undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.list(sort, query ?? \"\", limit),\n enabled,\n queryFn: async () => {\n const response = await callRPC(\"bridge.list_communities\", {\n last: \"\",\n limit,\n sort: sort === \"hot\" ? \"rank\" : sort,\n query: query ? query : null,\n observer,\n });\n return (\n response\n ? sort === \"hot\"\n ? response.sort(() => Math.random() - 0.5)\n : response\n : []\n ) as Communities;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { CommunityRole } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunityContextQueryOptions(\n username: string | undefined,\n communityName: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.context(username!, communityName!),\n enabled: !!username && !!communityName,\n queryFn: async () => {\n const response = await callRPC(\"bridge.get_community_context\", {\n account: username,\n name: communityName,\n });\n\n return {\n role: response?.role ?? \"guest\",\n subscribed: response?.subscribed ?? false,\n } satisfies {\n role: CommunityRole;\n subscribed: boolean;\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Community } from \"../types/community\";\nimport { getCommunity } from \"@/modules/bridge\";\nimport { QueryKeys } from \"@/modules/core\";\n\nexport function getCommunityQueryOptions(\n name: string | undefined,\n observer: string | undefined = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.single(name, observer),\n enabled: enabled && !!name,\n queryFn: async () => getCommunity(name ?? \"\", observer) as Promise,\n });\n}\n","import {\n InfiniteData,\n infiniteQueryOptions,\n queryOptions\n} from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Subscription } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * hivemind caps `bridge.list_subscribers` at 100 rows per call, regardless of a\n * larger requested limit.\n */\nexport const SUBSCRIBERS_PAGE_SIZE = 100;\n\ntype SubscribersPage = Subscription[];\ntype SubscribersCursor = string | null;\n\n/**\n * Fetches one page of subscribers.\n *\n * `last` is omitted on the first page rather than passed as an empty string:\n * hivemind reads `\"\"` as a real cursor positioned before the first account and\n * returns zero rows.\n */\nasync function fetchSubscribersPage(\n communityName: string,\n last: SubscribersCursor\n): Promise {\n const response = await callRPC(\"bridge.list_subscribers\", {\n community: communityName,\n limit: SUBSCRIBERS_PAGE_SIZE,\n ...(last ? { last } : {})\n });\n return (response as Subscription[] | null) ?? [];\n}\n\n/**\n * Get the first page of subscribers for a community.\n *\n * @deprecated Returns at most {@link SUBSCRIBERS_PAGE_SIZE} subscribers, which\n * for most communities is a small fraction of the total while looking like the\n * complete list. Prefer {@link getCommunitySubscribersInfiniteQueryOptions}\n * unless a single page is genuinely all that is wanted.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersQueryOptions(communityName: string) {\n return queryOptions({\n queryKey: QueryKeys.communities.subscribers(communityName),\n queryFn: async () => fetchSubscribersPage(communityName, null),\n staleTime: 60000\n });\n}\n\n/**\n * Get all subscribers for a community, paged with hivemind's `last` cursor.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersInfiniteQueryOptions(\n communityName: string\n) {\n return infiniteQueryOptions<\n SubscribersPage,\n Error,\n InfiniteData,\n string[],\n SubscribersCursor\n >({\n queryKey: QueryKeys.communities.subscribersInfinite(communityName),\n initialPageParam: null as SubscribersCursor,\n queryFn: async ({ pageParam }: { pageParam: SubscribersCursor }) =>\n fetchSubscribersPage(communityName, pageParam),\n // The cursor is the previous page's last account name. A short page is the\n // end of the list.\n getNextPageParam: (lastPage: SubscribersPage): SubscribersCursor =>\n lastPage?.length >= SUBSCRIBERS_PAGE_SIZE\n ? lastPage[lastPage.length - 1]?.[0] ?? null\n : null,\n staleTime: 60000\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountNotification } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype NotifPage = AccountNotification[];\ntype NotifCursor = number | null;\n\n/**\n * Get account notifications for a community (bridge API)\n *\n * @param account - The account/community name\n * @param limit - Number of notifications per page\n */\nexport function getAccountNotificationsInfiniteQueryOptions(\n account: string,\n limit: number\n) {\n return infiniteQueryOptions<\n NotifPage,\n Error,\n InfiniteData,\n (string | number)[],\n NotifCursor\n >({\n queryKey: QueryKeys.communities.accountNotifications(account, limit),\n initialPageParam: null as NotifCursor,\n\n // Errors are deliberately not caught. Returning [] on failure made an RPC\n // outage indistinguishable from an empty log: `isError` never became true,\n // so consumers rendered \"no activity\" for a failed request, and a failed\n // page produced no cursor and silently ended pagination. Let React Query\n // own the error so `isError` and retry behave normally.\n queryFn: async ({ pageParam }: { pageParam: NotifCursor }) => {\n const response = await callRPC(\"bridge.account_notifications\", {\n account,\n limit,\n last_id: pageParam ?? undefined,\n });\n return (response as AccountNotification[] | null) ?? [];\n },\n\n // A short page is the end of the log. Keying on \"empty\" alone would also\n // treat a truncated page as the end.\n getNextPageParam: (lastPage: NotifPage): NotifCursor =>\n lastPage?.length >= limit ? lastPage[lastPage.length - 1].id : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { RewardedCommunity } from \"../types/rewarded-community\";\n\nexport function getRewardedCommunitiesQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.communities.rewarded(),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/rewarded-communities\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch rewarded communities: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","export enum ROLES {\n OWNER = \"owner\",\n ADMIN = \"admin\",\n MOD = \"mod\",\n MEMBER = \"member\",\n GUEST = \"guest\",\n MUTED = \"muted\",\n}\n\nexport const roleMap: Record = {\n [ROLES.OWNER]: [\n ROLES.ADMIN,\n ROLES.MOD,\n ROLES.MEMBER,\n ROLES.GUEST,\n ROLES.MUTED,\n ],\n [ROLES.ADMIN]: [ROLES.MOD, ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n [ROLES.MOD]: [ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n};\n\nexport type CommunityTeam = Array>;\nexport type CommunityRole = (typeof ROLES)[keyof typeof ROLES]; // \"owner\" | \"member\" | ...\nexport type CommunityType = \"Topic\" | \"Journal\" | \"Council\";\n\nexport interface Community {\n about: string;\n admins?: string[];\n avatar_url: string;\n created_at: string;\n description: string;\n flag_text: string;\n id: number;\n is_nsfw: boolean;\n lang: string;\n name: string;\n num_authors: number;\n num_pending: number;\n subscribers: number;\n sum_pending: number;\n settings?: any;\n team: CommunityTeam;\n title: string;\n type_id: number;\n}\n\nexport type Communities = Community[];\n","import { CommunityRole, CommunityType, ROLES } from \"../types\";\n\nexport function getCommunityType(name: string, type_id: number): CommunityType {\n if (name.startsWith(\"hive-3\") || type_id === 3) return \"Council\";\n if (name.startsWith(\"hive-2\") || type_id === 2) return \"Journal\";\n return \"Topic\";\n}\n\nexport function getCommunityPermissions({\n communityType,\n userRole,\n subscribed,\n}: {\n communityType: CommunityType;\n userRole: CommunityRole;\n subscribed: boolean;\n}) {\n const canPost = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n if (communityType === \"Topic\") return true;\n\n // Journal & Council\n return [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD, ROLES.MEMBER].includes(\n userRole\n );\n })();\n\n const canComment = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n switch (communityType) {\n case \"Topic\":\n return true;\n case \"Journal\":\n return userRole !== ROLES.GUEST || subscribed;\n case \"Council\":\n return canPost;\n }\n })();\n\n const isModerator = [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD].includes(userRole);\n\n return {\n canPost,\n canComment,\n isModerator,\n };\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getNotificationsUnreadCountQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.unreadCount(activeUsername),\n queryFn: async () => {\n if (!code) {\n return 0;\n }\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/notifications/unread`,\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n const data = (await response.json()) as { count: number };\n return data.count;\n },\n enabled: !!activeUsername && !!code,\n initialData: 0,\n refetchInterval: 60000,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { NotificationFilter } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ApiNotification } from \"../types\";\n\nexport function getNotificationsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n filter: NotificationFilter | undefined = undefined\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.notifications.list(activeUsername, filter),\n queryFn: async ({ pageParam }) => {\n if (!code) {\n return [];\n }\n const data = {\n code,\n filter,\n since: pageParam,\n user: undefined,\n };\n\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/notifications\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }\n );\n\n if (!response.ok) {\n return [];\n }\n\n try {\n return (await response.json()) as ApiNotification[];\n } catch {\n return [];\n }\n },\n enabled: !!activeUsername && !!code,\n initialData: { pages: [], pageParams: [] },\n initialPageParam: \"\",\n getNextPageParam: (lastPage) => lastPage?.[lastPage.length - 1]?.id ?? \"\",\n refetchOnMount: true,\n });\n}\n","export enum NotificationFilter {\n VOTES = \"rvotes\",\n MENTIONS = \"mentions\",\n FAVORITES = \"nfavorites\",\n BOOKMARKS = \"nbookmarks\",\n FOLLOWS = \"follows\",\n REPLIES = \"replies\",\n REBLOGS = \"reblogs\",\n TRANSFERS = \"transfers\",\n DELEGATIONS = \"delegations\",\n PAYOUTS = \"payouts\",\n SCHEDULED_PUBLISHED = \"scheduled_published\",\n // Filter path is plural while the notification `type` string is singular\n // (`account_update`) - enotify routes on the plural form.\n ACCOUNT_UPDATES = \"account_updates\",\n WEEKLY_EARNINGS = \"weekly_earnings\",\n}\n","// Values are enotify's ACTIVITY_MAIN_TYPE_* ints and are validated server-side at\n// device registration, so they must match enotify constants.py exactly. Note payouts\n// is 19: the original 16 is commented out upstream and must not be reused.\nexport enum NotifyTypes {\n VOTE = 1,\n MENTION = 2,\n FOLLOW = 3,\n COMMENT = 4,\n RE_BLOG = 5,\n TRANSFERS = 6,\n DELEGATIONS = 10,\n FAVORITES = 13,\n BOOKMARKS = 15,\n PAYOUTS = 19,\n ACCOUNT_UPDATE = 20,\n WEEKLY_EARNINGS = 21,\n SCHEDULED_PUBLISHED = 22,\n ALLOW_NOTIFY = \"ALLOW_NOTIFY\",\n}\n\nexport const ALL_NOTIFY_TYPES = [\n NotifyTypes.VOTE,\n NotifyTypes.MENTION,\n NotifyTypes.FOLLOW,\n NotifyTypes.COMMENT,\n NotifyTypes.RE_BLOG,\n NotifyTypes.TRANSFERS,\n NotifyTypes.DELEGATIONS,\n NotifyTypes.FAVORITES,\n NotifyTypes.BOOKMARKS,\n NotifyTypes.PAYOUTS,\n NotifyTypes.ACCOUNT_UPDATE,\n NotifyTypes.WEEKLY_EARNINGS,\n NotifyTypes.SCHEDULED_PUBLISHED,\n] as const;\n\nexport enum NotificationViewType {\n ALL = \"All\",\n UNREAD = \"Unread\",\n READ = \"Read\",\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ApiNotificationSetting } from \"../types\";\nimport { ALL_NOTIFY_TYPES } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getNotificationsSettingsQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n initialMuted?: boolean\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.settings(activeUsername),\n queryFn: async () => {\n let token = activeUsername + \"-web\";\n if (!code) {\n throw new Error(\"Missing access token\");\n }\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/detail-device\",\n {\n body: JSON.stringify({\n code,\n username: activeUsername,\n token,\n }),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch notification settings: ${response.status}`);\n }\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n refetchOnMount: false,\n initialData: () => {\n return {\n status: 0,\n system: \"web\",\n allows_notify: 0,\n notify_types: initialMuted ? [] : ([...ALL_NOTIFY_TYPES] as number[]),\n } as ApiNotificationSetting;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Announcement } from \"../types/announcement\";\n\nexport function getAnnouncementsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.notifications.announcements(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/announcements\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch announcements: ${response.status}`);\n }\n\n const data = await response.json() as Announcement[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Spotlight } from \"../types/spotlight\";\n\n// `_accessToken` is accepted for call-site parity with mobile (which passes one) but is\n// intentionally unused: the spotlights endpoint is anonymous and only filters by date window.\nexport function getSpotlightsQueryOptions(_accessToken?: string) {\n return queryOptions({\n queryKey: QueryKeys.notifications.spotlights(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/spotlights\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch spotlights: ${response.status}`);\n }\n\n const data = (await response.json()) as Spotlight[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { useMutation, QueryKey, InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { markNotifications } from \"@/modules/private-api/requests\";\nimport { ApiNotification } from \"../types\";\n\ntype NotificationPage = ApiNotification[];\ntype InfiniteNotificationData = InfiniteData;\n\nfunction markNotificationRead(item: ApiNotification, id?: string): ApiNotification {\n return {\n ...item,\n read: (!id || id === item.id ? 1 : item.read) as 0 | 1,\n };\n}\n\nfunction isInfiniteData(data: unknown): data is InfiniteNotificationData {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"pages\" in data &&\n \"pageParams\" in data &&\n Array.isArray((data as InfiniteNotificationData).pages)\n );\n}\n\n/**\n * Hook to mark notifications as read with optimistic updates\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful mutation, receives unread count\n * @param onError - Optional callback on error\n *\n * @returns Mutation hook that accepts { id?: string }\n *\n * @example\n * ```typescript\n * const markAsRead = useMarkNotificationsRead(username, code);\n *\n * // Mark specific notification\n * markAsRead.mutate({ id: \"notification-id\" });\n *\n * // Mark all notifications (omit id)\n * markAsRead.mutate({});\n * ```\n */\nexport function useMarkNotificationsRead(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: (unreadCount?: number) => void,\n onError?: (e: Error) => void\n) {\n const queryClient = getQueryClient();\n\n return useMutation({\n mutationKey: [\"notifications\", \"mark-read\", username],\n\n mutationFn: async ({ id }: { id?: string }) => {\n if (!username || !code) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[SDK][Notifications] – missing auth for markNotifications\");\n }\n return;\n }\n return markNotifications(code, id);\n },\n\n // Optimistic update: Immediately mark notifications as read in cache\n onMutate: async ({ id }: { id?: string }) => {\n // Skip optimistic updates when auth is not available\n if (!username || !code) {\n return { previousData: [] };\n }\n\n // Cancel any outgoing refetches to prevent overwriting optimistic update\n await queryClient.cancelQueries({ queryKey: QueryKeys.notifications._prefix });\n\n // Snapshot current state for rollback\n const previousData: Array<[QueryKey, unknown]> = [];\n\n // Update infinite notification list queries (pages structure)\n const infiniteQueries = queryClient.getQueriesData({\n queryKey: QueryKeys.notifications._prefix,\n predicate: (query) => {\n const data = query.state.data;\n return isInfiniteData(data);\n },\n });\n\n infiniteQueries.forEach(([queryKey, data]) => {\n if (data && isInfiniteData(data)) {\n previousData.push([queryKey, data]);\n\n const updatedData: InfiniteNotificationData = {\n ...data,\n pages: data.pages.map((page) =>\n page.map((item) => markNotificationRead(item, id))\n ),\n };\n\n queryClient.setQueryData(queryKey, updatedData);\n }\n });\n\n // Optimistically decrement unread count\n const unreadKey = QueryKeys.notifications.unreadCount(username);\n const currentUnread = queryClient.getQueryData(unreadKey);\n if (typeof currentUnread === \"number\" && currentUnread > 0) {\n previousData.push([unreadKey, currentUnread]);\n\n if (!id) {\n // Mark all: set to 0\n queryClient.setQueryData(unreadKey, 0);\n } else {\n // Mark single: only decrement if the notification is currently unread\n const isUnread = infiniteQueries.some(([, d]) =>\n d?.pages.some((page) =>\n page.some((item) => item.id === id && item.read === 0)\n )\n );\n if (isUnread) {\n queryClient.setQueryData(unreadKey, currentUnread - 1);\n }\n }\n }\n\n // Return context for rollback\n return { previousData };\n },\n\n onSuccess: (response) => {\n // Extract unread count from response if available\n const unreadCount = typeof response === \"object\" && response !== null\n ? (response as { unread?: number }).unread\n : undefined;\n\n // Update unread count cache with server value\n if (typeof unreadCount === \"number\") {\n queryClient.setQueryData(\n QueryKeys.notifications.unreadCount(username),\n unreadCount\n );\n }\n\n onSuccess?.(unreadCount);\n },\n\n // Rollback optimistic update on error\n onError: (error, _variables, context) => {\n // Restore previous state\n if (context?.previousData) {\n context.previousData.forEach(([queryKey, data]) => {\n queryClient.setQueryData(queryKey, data);\n });\n }\n\n onError?.(error as Error);\n },\n\n // Always refetch after mutation settles\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: QueryKeys.notifications._prefix,\n });\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetLastReadOps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface SetLastReadPayload {\n date?: string;\n}\n\nexport function useSetLastRead(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"notifications\", \"set-last-read\"],\n username,\n ({ date }) => buildSetLastReadOps(username!, date),\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.notifications.unreadCount(username),\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a single proposal by ID\n */\nexport function getProposalQueryOptions(id: number) {\n return queryOptions({\n queryKey: [\"proposals\", \"proposal\", id],\n queryFn: async () => {\n const r = await callRPC(\"condenser_api.find_proposals\", [[id]]);\n const proposal = r[0];\n\n // Determine proposal status based on dates\n if (new Date(proposal.start_date) < new Date() && new Date(proposal.end_date) >= new Date()) {\n proposal.status = \"active\";\n } else if (new Date(proposal.end_date) < new Date()) {\n proposal.status = \"expired\";\n } else {\n proposal.status = \"inactive\";\n }\n\n return proposal as Proposal;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get all proposals, sorted with expired proposals at the end\n */\nexport function getProposalsQueryOptions() {\n return queryOptions({\n queryKey: [\"proposals\", \"list\"],\n queryFn: async () => {\n const response = (await callRPC(\"database_api.list_proposals\", {\n start: [-1],\n limit: 500,\n order: \"by_total_votes\",\n order_direction: \"descending\",\n status: \"all\",\n })) as { proposals: Proposal[] };\n\n const proposals = response.proposals;\n const expired = proposals.filter((x) => x.status === \"expired\");\n const others = proposals.filter((x) => x.status !== \"expired\");\n\n return [...others, ...expired];\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { FullAccount } from \"@/modules/accounts\";\nimport { parseAccounts } from \"@/modules/accounts/utils\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// One page = array of enriched vote rows\nexport type ProposalVoteRow = {\n id: number;\n voter: string;\n voterAccount: FullAccount;\n};\n\ntype Cursor = string; // we paginate by last voter name\n\n/**\n * Get proposal votes with pagination and enriched voter account data\n *\n * @param proposalId - The proposal ID\n * @param voter - Starting voter for pagination\n * @param limit - Number of votes per page\n */\nexport function getProposalVotesInfiniteQueryOptions(\n proposalId: number,\n voter: string,\n limit: number\n) {\n return infiniteQueryOptions<\n ProposalVoteRow[],\n Error,\n InfiniteData,\n (string | number)[],\n Cursor\n >({\n queryKey: [\"proposals\", \"votes\", proposalId, voter, limit],\n initialPageParam: voter as Cursor,\n refetchOnMount: true,\n staleTime: 0, // Always refetch on mount\n\n queryFn: async ({ pageParam }: { pageParam: Cursor }) => {\n const startParam = pageParam ?? voter;\n\n const response = (await callRPC(\"condenser_api.list_proposal_votes\", [\n [proposalId, startParam],\n limit,\n \"by_proposal_voter\",\n ])) as ProposalVote[];\n\n const list = response\n .filter((x) => x.proposal?.proposal_id === proposalId)\n .map((x) => ({ id: x.id, voter: x.voter }));\n\n const rawAccounts = await callRPC(\"condenser_api.get_accounts\", [list.map((l) => l.voter)]);\n const accounts = parseAccounts(rawAccounts);\n\n const page: ProposalVoteRow[] = list.map((i) => ({\n ...i,\n voterAccount: accounts.find((a) => i.voter === a.name)!,\n }));\n\n return page;\n },\n\n getNextPageParam: (lastPage: ProposalVoteRow[]): Cursor | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n return last?.voter ?? undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Fetches ALL proposal votes for a specific user in a single query.\n * Much more efficient than querying each proposal individually.\n * Uses \"by_voter_proposal\" order to get all votes by a user.\n */\nexport function getUserProposalVotesQueryOptions(voter: string) {\n return queryOptions({\n queryKey: [\"proposals\", \"votes\", \"by-user\", voter],\n enabled: !!voter && voter !== \"\",\n staleTime: 60 * 1000, // Cache for 1 minute\n queryFn: async () => {\n if (!voter || voter === \"\") {\n return [];\n }\n\n const response = (await callRPC(\"database_api.list_proposal_votes\", {\n start: [voter],\n limit: 1000,\n order: \"by_voter_proposal\",\n order_direction: \"ascending\",\n status: \"votable\",\n })) as { proposal_votes: ProposalVote[] };\n\n // Filter to only this user's votes (API might return votes after this user alphabetically)\n const userVotes = (response.proposal_votes || []).filter((vote) => vote.voter === voter);\n\n return userVotes;\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting on proposals.\n */\nexport interface ProposalVotePayload {\n /** Array of proposal IDs to vote on */\n proposalIds: number[];\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting on Hive proposals.\n *\n * This mutation broadcasts an update_proposal_votes operation to vote on\n * one or more proposals in the Hive Decentralized Fund (HDF).\n *\n * @param username - The username voting on proposals (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 150) if adapter.recordActivity is available\n * - Invalidates proposal list cache to show updated vote status\n * - Invalidates voter's proposal votes cache\n *\n * **Multiple Proposals:**\n * - You can vote on multiple proposals in a single transaction\n * - All proposals receive the same vote (approve or disapprove)\n * - Proposal IDs are integers, not strings\n *\n * **Vote Types:**\n * - approve: true - Vote in favor of the proposal(s)\n * - approve: false - Remove your vote from the proposal(s)\n *\n * @example\n * ```typescript\n * const proposalVoteMutation = useProposalVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Approve a single proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: true\n * });\n *\n * // Approve multiple proposals\n * proposalVoteMutation.mutate({\n * proposalIds: [123, 124, 125],\n * approve: true\n * });\n *\n * // Remove vote from a proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: false\n * });\n * ```\n */\nexport function useProposalVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"vote\"],\n username,\n ({ proposalIds, approve }) => [\n buildProposalVoteOp(username!, proposalIds, approve)\n ],\n async (result: any) => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(150, txId, result?.block_num).catch((error) => {\n console.debug(\"[SDK][Proposals][useProposalVote] recordActivity failed\", {\n activityType: 150,\n blockNum: result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.proposals.list(),\n QueryKeys.proposals.votesByUser(username!)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useProposalVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for proposal votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalCreateOp, type ProposalCreatePayload } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport { type ProposalCreatePayload };\n\nexport function useProposalCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"create\"],\n username,\n (payload) => [\n buildProposalCreateOp(username!, payload)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.proposals.list(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get vesting delegations for an account with infinite scroll support\n *\n * @param username - The account username\n * @param limit - Maximum number of results per page (default: 50)\n */\nexport function getVestingDelegationsQueryOptions(\n username?: string,\n limit = 50\n) {\n return infiniteQueryOptions({\n queryKey: [\"wallet\", \"vesting-delegations\", username, limit],\n initialPageParam: \"\" as string,\n queryFn: async ({ pageParam }: { pageParam: string }) => {\n // Request one extra item on subsequent pages to handle inclusive cursor\n const fetchLimit = pageParam ? limit + 1 : limit;\n\n const result = await callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n pageParam || \"\",\n fetchLimit,\n ]) as DelegatedVestingShare[];\n\n // Filter out duplicate first item on subsequent pages\n // Hive API is inclusive of the 'from' cursor\n if (pageParam && result.length > 0 && result[0]?.delegatee === pageParam) {\n // Return at most limit items after removing the duplicate\n return result.slice(1, limit + 1);\n }\n\n return result;\n },\n getNextPageParam: (lastPage: DelegatedVestingShare[]) => {\n // If we got fewer results than limit, we've reached the end\n if (!lastPage || lastPage.length < limit) {\n return undefined;\n }\n\n // Return the last delegatee as cursor for next page\n const lastDelegation = lastPage[lastPage.length - 1];\n return lastDelegation?.delegatee;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { AccountDelegations } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\n\n/**\n * Account vesting delegations via the HAF balance-api REST endpoint\n * (`/balance-api/accounts/{account-name}/delegations`).\n *\n * Unlike `condenser_api.get_vesting_delegations` (see\n * {@link getHivePowerDelegatesInfiniteQueryOptions}), this returns the\n * complete outgoing AND incoming lists in a single request, with `callREST`\n * handling multi-node failover. `amount` is raw vests (vests * 10^6).\n */\nexport function getAccountDelegationsQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"assets\", \"account-delegations\", username],\n enabled: !!username,\n queryFn: ({ signal }) =>\n callREST(\n \"balance\",\n \"/accounts/{account-name}/delegations\",\n { \"account-name\": username },\n undefined,\n undefined,\n signal\n ) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { VestingDelegationExpiration } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get expiring vesting delegations for an account.\n *\n * When a delegation is removed (set to 0 VESTS), the HP doesn't return\n * immediately — it enters a 5-day cooldown. This query fetches those\n * in-flight expirations so they can be shown alongside active delegations.\n *\n * Uses database_api.find_vesting_delegation_expirations which returns\n * vesting_shares as NAI asset objects ({amount, nai, precision}).\n *\n * @param username - The delegator account username\n */\nexport function getVestingDelegationExpirationsQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"vesting-delegation-expirations\", username],\n queryFn: async () => {\n if (!username) return [];\n const result = await callRPC(\"database_api.find_vesting_delegation_expirations\", { account: username }) as { delegations: VestingDelegationExpiration[] };\n return result.delegations;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HBD to HIVE conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CollateralizedConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get collateralized HIVE to HBD conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getCollateralizedConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"collateralized-conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_collateralized_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { SavingsWithdrawRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get pending savings withdrawal requests for an account\n *\n * @param account - The account username\n */\nexport function getSavingsWithdrawFromQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"savings-withdraw\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_savings_withdraw_from\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.request_id - b.request_id),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get power down (vesting withdrawal) routes for an account\n *\n * @param account - The account username\n */\nexport function getWithdrawRoutesQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"withdraw-routes\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n account,\n \"outgoing\",\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OpenOrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get open market orders for an account\n *\n * @param user - The account username\n */\nexport function getOpenOrdersQueryOptions(user: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"open-orders\", user],\n queryFn: () =>\n callRPC(\"condenser_api.get_open_orders\", [\n user,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.orderid - b.orderid),\n enabled: !!user,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { RcDirectDelegation, RcDirectDelegationsResponse } from \"../types/rc-direct-delegation\";\n\ntype RcPage = RcDirectDelegation[];\ntype RcCursor = string | null;\n\n/**\n * Get outgoing RC delegations for an account\n *\n * @param username - Account name to get delegations for\n * @param limit - Number of delegations per page\n */\nexport function getOutgoingRcDelegationsInfiniteQueryOptions(username: string, limit = 100) {\n return infiniteQueryOptions<\n RcPage,\n Error,\n InfiniteData,\n (string | number)[],\n RcCursor\n >({\n queryKey: [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n initialPageParam: null as RcCursor,\n\n queryFn: async ({ pageParam }: { pageParam: RcCursor }) => {\n const response = await callRPC(\"rc_api.list_rc_direct_delegations\", {\n start: [username, pageParam ?? \"\"],\n limit,\n })\n .then((r: any) => r as RcDirectDelegationsResponse);\n\n let delegations: RcDirectDelegation[] = response.rc_direct_delegations || [];\n\n // Filter out the starting delegation when paginating\n if (pageParam) {\n delegations = delegations.filter((delegation) => delegation.to !== pageParam);\n }\n\n return delegations;\n },\n\n getNextPageParam: (lastPage: RcPage): RcCursor =>\n lastPage.length === limit ? lastPage[lastPage.length - 1].to : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { IncomingRcResponse } from \"../types\";\n\nexport function getIncomingRcQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"wallet\", \"incoming-rc\", username],\n enabled: !!username,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] - Missing username for incoming RC\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/received-rc/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch incoming RC: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { ReceivedVestingShare } from \"../types/received-vesting-share\";\n\nexport function getReceivedVestingSharesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"received-vesting-shares\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch received vesting shares: ${response.status}`);\n }\n\n const data = (await response.json()) as { list: ReceivedVestingShare[] };\n return data.list;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { RecurrentTransfer } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get recurrent transfers for an account\n *\n * @param username - The account username\n */\nexport function getRecurrentTransfersQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"recurrent-transfers\", username],\n queryFn: () =>\n callRPC(\"condenser_api.find_recurrent_transfers\", [\n username,\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { ConfigManager } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\ntype PortfolioLayer = \"points\" | \"hive\" | \"chain\" | \"engine\";\n\ninterface TokenAction {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface PortfolioWalletItem {\n name: string;\n symbol: string;\n layer: PortfolioLayer;\n balance: number;\n fiatRate: number;\n currency: string;\n precision: number;\n address?: string;\n error?: string;\n pendingRewards?: number;\n pendingRewardsFiat?: number;\n liquid?: number;\n liquidFiat?: number;\n savings?: number;\n savingsFiat?: number;\n staked?: number;\n stakedFiat?: number;\n iconUrl?: string;\n actions?: TokenAction[];\n extraData?: Array<{ dataKey: string; value: any }>;\n apr?: number;\n}\n\nexport interface PortfolioResponse {\n username: string;\n currency?: string;\n wallets: PortfolioWalletItem[];\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const direct = Number.parseFloat(trimmed);\n if (Number.isFinite(direct)) {\n return direct;\n }\n\n const sanitized = trimmed.replace(/,/g, \"\");\n const match = sanitized.match(/[-+]?\\d+(?:\\.\\d+)?/);\n if (match) {\n const parsed = Number.parseFloat(match[0]);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseToken(rawToken: unknown): PortfolioWalletItem | undefined {\n if (!rawToken || typeof rawToken !== \"object\") {\n return undefined;\n }\n\n const token = rawToken as Record;\n\n // Portfolio v2 returns well-defined PortfolioItem structure\n return {\n name: normalizeString(token.name) ?? \"\",\n symbol: normalizeString(token.symbol) ?? \"\",\n layer: (normalizeString(token.layer) ?? \"hive\") as PortfolioLayer,\n balance: normalizeNumber(token.balance) ?? 0,\n fiatRate: normalizeNumber(token.fiatRate) ?? 0,\n currency: normalizeString(token.currency) ?? \"usd\",\n precision: normalizeNumber(token.precision) ?? 3,\n address: normalizeString(token.address),\n error: normalizeString(token.error),\n pendingRewards: normalizeNumber(token.pendingRewards),\n pendingRewardsFiat: normalizeNumber(token.pendingRewardsFiat),\n liquid: normalizeNumber(token.liquid),\n liquidFiat: normalizeNumber(token.liquidFiat),\n savings: normalizeNumber(token.savings),\n savingsFiat: normalizeNumber(token.savingsFiat),\n staked: normalizeNumber(token.staked),\n stakedFiat: normalizeNumber(token.stakedFiat),\n iconUrl: normalizeString(token.iconUrl),\n actions: (token.actions ?? []) as TokenAction[],\n extraData: (token.extraData ?? []) as Array<{ dataKey: string; value: any }>,\n apr: normalizeNumber(token.apr),\n };\n}\n\nfunction extractTokens(payload: unknown): unknown[] {\n if (!payload || typeof payload !== \"object\") {\n return [];\n }\n\n const containers = [payload];\n const record = payload as Record;\n if (record.data && typeof record.data === \"object\") {\n containers.push(record.data as Record);\n }\n if (record.result && typeof record.result === \"object\") {\n containers.push(record.result as Record);\n }\n if (record.portfolio && typeof record.portfolio === \"object\") {\n containers.push(record.portfolio as Record);\n }\n\n for (const container of containers) {\n if (Array.isArray(container)) {\n return container;\n }\n\n if (container && typeof container === \"object\") {\n for (const key of [\n \"wallets\",\n \"tokens\",\n \"assets\",\n \"items\",\n \"portfolio\",\n \"balances\",\n ]) {\n const value = (container as Record)[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n }\n\n return [];\n}\n\nfunction resolveUsername(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record;\n return (\n normalizeString(record.username) ??\n normalizeString(record.name) ??\n normalizeString(record.account)\n );\n}\n\n/**\n * Get portfolio query options for fetching user's wallet balances across all layers\n * @param username - Hive username\n * @param currency - Fiat currency code (default: \"usd\")\n * @param onlyEnabled - Only return enabled tokens (default: true)\n * @returns TanStack Query options for portfolio data\n */\nexport function getPortfolioQueryOptions(\n username: string,\n currency: string = \"usd\",\n onlyEnabled: boolean = true\n) {\n return queryOptions({\n queryKey: [\n \"wallet\",\n \"portfolio\",\n \"v2\",\n username,\n onlyEnabled ? \"only-enabled\" : \"all\",\n currency,\n ],\n enabled: Boolean(username),\n staleTime: 60000,\n refetchInterval: 120000,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] – username is required\");\n }\n\n const endpoint = `${ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, onlyEnabled, currency }),\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallet] – Portfolio request failed (${response.status})`\n );\n }\n\n const payload = (await response.json()) as unknown;\n const tokens = extractTokens(payload)\n .map((item) => parseToken(item))\n .filter((item): item is PortfolioWalletItem => Boolean(item))\n // Backend may still emit removed SPK-layer items; drop them defensively\n .filter((item) => (item.layer as string) !== \"spk\");\n\n if (!tokens.length) {\n throw new Error(\n \"[SDK][Wallet] – Portfolio payload contained no tokens\"\n );\n }\n\n return {\n username: resolveUsername(payload) ?? username,\n currency: normalizeString(\n (payload as Record | undefined)?.fiatCurrency ??\n (payload as Record | undefined)?.currency\n )?.toUpperCase(),\n wallets: tokens,\n };\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHiveAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n\n if (!accountData) {\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: 0,\n } satisfies GeneralAssetInfo;\n }\n\n const liquidBalance = parseAsset(accountData.balance).amount;\n const savingsBalance = parseAsset(accountData.savings_balance).amount;\n\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: liquidBalance + savingsBalance,\n parts: [\n {\n name: \"current\",\n balance: liquidBalance,\n },\n {\n name: \"savings\",\n balance: savingsBalance,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHbdAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hbd\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n\n const price = 1;\n\n if (!accountData) {\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance: 0,\n };\n }\n\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance:\n parseAsset(accountData.hbd_balance).amount +\n parseAsset(accountData?.savings_hbd_balance).amount,\n apr: ((dynamicProps?.hbdInterestRate ?? 0) / 100).toFixed(3),\n parts: [\n {\n name: \"current\",\n balance: parseAsset(accountData.hbd_balance).amount,\n },\n {\n name: \"savings\",\n balance: parseAsset(accountData.savings_hbd_balance).amount,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { isEmptyDate, parseAsset, vestsToHp } from \"@/modules/core/utils\";\n\nfunction getAPR(dynamicProps: DynamicProps) {\n const initialInflationRate = 9.5;\n const initialBlock = 7000000;\n const decreaseRate = 250000;\n const decreasePercentPerIncrement = 0.01;\n\n const headBlock = dynamicProps.headBlock;\n const deltaBlocks = headBlock - initialBlock;\n const decreaseIncrements = deltaBlocks / decreaseRate;\n\n let currentInflationRate =\n initialInflationRate - decreaseIncrements * decreasePercentPerIncrement;\n\n if (currentInflationRate < 0.95) {\n currentInflationRate = 0.95;\n }\n\n const vestingRewardPercent = dynamicProps.vestingRewardPercent / 10000;\n const virtualSupply = dynamicProps.virtualSupply;\n const totalVestingFunds = dynamicProps.totalVestingFund;\n\n return (\n (virtualSupply * currentInflationRate * vestingRewardPercent) /\n totalVestingFunds\n ).toFixed(3);\n}\n\nexport function getHivePowerAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n if (!dynamicProps || !accountData) {\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price: 0,\n accountBalance: 0,\n };\n }\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n const price = Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps.base / dynamicProps.quote;\n\n const vestingShares = parseAsset(accountData.vesting_shares).amount;\n const delegatedVests = parseAsset(\n accountData.delegated_vesting_shares\n ).amount;\n const receivedVests = parseAsset(\n accountData.received_vesting_shares\n ).amount;\n const withdrawRateVests = parseAsset(\n accountData.vesting_withdraw_rate\n ).amount;\n const remainingToWithdrawVests = Math.max(\n (Number(accountData.to_withdraw) - Number(accountData.withdrawn)) /\n 1e6,\n 0\n );\n const nextWithdrawalVests = !isEmptyDate(\n accountData.next_vesting_withdrawal\n )\n ? Math.min(withdrawRateVests, remainingToWithdrawVests)\n : 0;\n\n const hpBalance = +vestsToHp(\n vestingShares,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const outgoingDelegationsHp = +vestsToHp(\n delegatedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const incomingDelegationsHp = +vestsToHp(\n receivedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const pendingPowerDownHp = +vestsToHp(\n remainingToWithdrawVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const nextPowerDownHp = +vestsToHp(\n nextWithdrawalVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const totalBalance = Math.max(hpBalance - pendingPowerDownHp, 0);\n const availableHp = Math.max(hpBalance - outgoingDelegationsHp, 0);\n\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price,\n accountBalance: +totalBalance.toFixed(3),\n apr: getAPR(dynamicProps),\n parts: [\n {\n name: \"hp_balance\",\n balance: hpBalance,\n },\n {\n name: \"available\",\n balance: +availableHp.toFixed(3),\n },\n {\n name: \"outgoing_delegations\",\n balance: outgoingDelegationsHp,\n },\n {\n name: \"incoming_delegations\",\n balance: incomingDelegationsHp,\n },\n ...(pendingPowerDownHp > 0\n ? [\n {\n name: \"pending_power_down\",\n balance: +pendingPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ...(nextPowerDownHp > 0 && nextPowerDownHp !== pendingPowerDownHp\n ? [\n {\n name: \"next_power_down\",\n balance: +nextPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { utils } from \"../../../hive-tx\";\nimport { HiveOperationGroup } from \"../types\";\nconst ops = utils.operations;\n\nexport const HIVE_ACCOUNT_OPERATION_GROUPS: Record<\n HiveOperationGroup,\n number[]\n> = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n \"\": [],\n};\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nexport const HIVE_OPERATION_LIST = Object.keys(\n utils.operations\n) as HiveOperationName[];\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nconst operationOrders = utils.operations as Record<\n HiveOperationName,\n number\n>;\n\nexport const HIVE_OPERATION_ORDERS = operationOrders;\n\nexport const HIVE_OPERATION_NAME_BY_ID: Record =\n Object.entries(operationOrders).reduce((acc, [name, id]) => {\n acc[id] = name as HiveOperationName;\n return acc;\n }, {} as Record);\n","import { callRPC } from \"../../../hive-tx\";\nimport { utils } from \"../../../hive-tx\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { HIVE_ACCOUNT_OPERATION_GROUPS } from \"../consts\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationFilterKey,\n HiveOperationFilterValue,\n HiveOperationGroup,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nconst operationOrders = utils.operations;\n\nfunction isHiveOperationName(value: string): value is HiveOperationName {\n return Object.prototype.hasOwnProperty.call(operationOrders, value);\n}\n\nexport function resolveHiveOperationFilters(filters: HiveOperationFilter): {\n filterKey: HiveOperationFilterKey;\n filterArgs: any[];\n} {\n const rawValues: HiveOperationFilterValue[] = Array.isArray(filters)\n ? filters\n : [filters];\n\n const hasAll = rawValues.includes(\"\" as HiveOperationGroup);\n\n const uniqueValues = Array.from(\n new Set(\n rawValues.filter(\n (value): value is HiveOperationFilterValue =>\n value !== undefined &&\n value !== null &&\n value !== (\"\" as HiveOperationGroup)\n )\n )\n );\n\n const filterKey: HiveOperationFilterKey =\n hasAll || uniqueValues.length === 0\n ? \"all\"\n : uniqueValues\n .map((value) => value.toString())\n .sort()\n .join(\"|\");\n\n const operationIds = new Set();\n\n if (!hasAll) {\n uniqueValues.forEach((value) => {\n if (value in HIVE_ACCOUNT_OPERATION_GROUPS) {\n HIVE_ACCOUNT_OPERATION_GROUPS[value as HiveOperationGroup].forEach(\n (id) => operationIds.add(id)\n );\n return;\n }\n\n if (isHiveOperationName(value)) {\n operationIds.add(operationOrders[value]);\n }\n });\n }\n\n const filterArgs = makeBitMaskFilter(Array.from(operationIds));\n\n return {\n filterKey,\n filterArgs,\n };\n}\n\nfunction makeBitMaskFilter(allowedOperations: number[]) {\n let low = 0n;\n let high = 0n;\n\n allowedOperations.forEach((operation) => {\n if (operation < 64) {\n low |= 1n << BigInt(operation);\n } else {\n high |= 1n << BigInt(operation - 64);\n }\n });\n\n return [\n low !== 0n ? low.toString() : null,\n high !== 0n ? high.toString() : null,\n ];\n}\n\nexport function getHiveAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterArgs, filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n initialData: { pages: [], pageParams: [] },\n initialPageParam: -1,\n getNextPageParam: (lastPage, __) =>\n lastPage ? +(lastPage[lastPage.length - 1]?.num ?? 0) - 1 : -1,\n\n queryFn: async ({ pageParam }) => {\n const response = await callRPC(\n \"condenser_api.get_account_history\",\n [username, pageParam, limit, ...filterArgs]\n );\n\n return response.map(\n (x: any) =>\n ({\n num: x[0],\n type: x[1].op[0],\n timestamp: x[1].timestamp,\n trx_id: x[1].trx_id,\n ...x[1].op[1],\n }) satisfies HiveTransaction\n );\n },\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hivePayout = parseAsset(\n (item as AuthorReward).hive_payout\n );\n return hivePayout.amount > 0;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HIVE\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HIVE\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HIVE\"].includes(asset.symbol);\n\n case \"claim_reward_balance\":\n const rewardHive = parseAsset(\n (item as ClaimRewardBalance).reward_hive\n );\n return rewardHive.amount > 0;\n\n case \"curation_reward\":\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHbdAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hbdPayout = parseAsset(\n (item as AuthorReward).hbd_payout\n );\n return hbdPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardHbd = parseAsset(\n (item as ClaimRewardBalance).reward_hbd\n );\n return rewardHbd.amount > 0;\n\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HBD\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HBD\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HBD\"].includes(asset.symbol);\n\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n case \"proposal_pay\":\n case \"interest\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHivePowerAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n const userSelectedOperations = new Set(\n Array.isArray(filters) ? filters : [filters]\n );\n const hasAllFilter =\n userSelectedOperations.has(\"\" as any) || userSelectedOperations.size === 0;\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const vestingPayout = parseAsset(\n (item as AuthorReward).vesting_payout\n );\n return vestingPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardVests = parseAsset(\n (item as ClaimRewardBalance).reward_vests\n );\n return rewardVests.amount > 0;\n\n case \"transfer_to_vesting\":\n return true;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"recurrent_transfer\":\n return [\"VESTS\", \"HP\"].includes(parseAsset(item.amount).symbol);\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"VESTS\", \"HP\"].includes(asset.symbol);\n\n case \"curation_reward\":\n case \"withdraw_vesting\":\n case \"delegate_vesting_shares\":\n case \"fill_vesting_withdraw\":\n case \"return_vesting_delegation\":\n case \"producer_reward\":\n case \"set_withdraw_vesting_route\":\n return true;\n default:\n return hasAllFilter || userSelectedOperations.has(item.type);\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveMarketMetric } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nfunction subtractSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() - seconds * 1000);\n}\n\nexport function getHiveAssetMetricQueryOptions(bucketSeconds = 86_400) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n queryFn: async ({ pageParam: [startDate, endDate] }) => {\n const apiData: HiveMarketMetric[] = await callRPC(\"condenser_api.get_market_history\", [bucketSeconds, formatDate(startDate), formatDate(endDate)]\n );\n\n return apiData.map(({ hive, non_hive, open }) => ({\n close: non_hive.close / hive.close,\n open: non_hive.open / hive.open,\n low: non_hive.low / hive.low,\n high: non_hive.high / hive.high,\n volume: hive.volume,\n time: new Date(open),\n }));\n },\n initialPageParam: [\n subtractSeconds(new Date(), Math.max(100 * bucketSeconds, 28_800)),\n new Date(),\n ],\n getNextPageParam: (_, __, [prevStartDate]) => [\n subtractSeconds(prevStartDate, Math.max(100 * bucketSeconds, 28_800)),\n subtractSeconds(prevStartDate, bucketSeconds),\n ],\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHiveAssetWithdrawalRoutesQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"withdrawal-routes\", username],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n username,\n \"outgoing\",\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHivePowerDelegatesInfiniteQueryOptions(\n username: string,\n limit = 50\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegates\", username],\n enabled: !!username,\n queryFn: () =>\n callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n \"\",\n limit,\n ]) as Promise,\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { ReceivedVestingShare } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHivePowerDelegatingsQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegatings\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()).list as ReceivedVestingShare[];\n },\n select: (data) =>\n data.sort(\n (a, b) =>\n parseAsset(b.vesting_shares).amount -\n parseAsset(a.vesting_shares).amount\n ),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get the internal HIVE/HBD market order book\n *\n * @param limit - Maximum number of orders to fetch (default: 500)\n */\nexport function getOrderBookQueryOptions(limit = 500) {\n return queryOptions({\n queryKey: [\"market\", \"order-book\", limit],\n queryFn: () =>\n callRPC(\"condenser_api.get_order_book\", [\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market statistics from the blockchain\n */\nexport function getMarketStatisticsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"statistics\"],\n queryFn: () =>\n callRPC(\"condenser_api.get_ticker\", []) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketCandlestickDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market history (candlestick data)\n *\n * @param seconds - Bucket size in seconds\n * @param startDate - Start date for the data\n * @param endDate - End date for the data\n */\nexport function getMarketHistoryQueryOptions(\n seconds: number,\n startDate: Date,\n endDate: Date\n) {\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n return queryOptions({\n queryKey: [\"market\", \"history\", seconds, startDate.getTime(), endDate.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_market_history\", [\n seconds,\n formatDate(startDate),\n formatDate(endDate),\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveHbdStats, MarketCandlestickDataItem, MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get combined HIVE/HBD statistics including price, 24h change, and volume\n */\nexport function getHiveHbdStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"hive-hbd-stats\"],\n queryFn: async () => {\n // Get current market statistics\n const stats = (await callRPC(\"condenser_api.get_ticker\", [])) as MarketStatistics;\n\n // Get 24h market history\n const now = new Date();\n const oneDayAgo = new Date(now.getTime() - 86400000); // 24 hours ago\n\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n const dayChange = (await callRPC(\"condenser_api.get_market_history\", [86400, formatDate(oneDayAgo), formatDate(now)]\n )) as MarketCandlestickDataItem[];\n\n // Calculate stats\n const result: HiveHbdStats = {\n price: +stats.latest,\n close: dayChange[0] ? dayChange[0].non_hive.open / dayChange[0].hive.open : 0,\n high: dayChange[0] ? dayChange[0].non_hive.high / dayChange[0].hive.high : 0,\n low: dayChange[0] ? dayChange[0].non_hive.low / dayChange[0].hive.low : 0,\n percent: dayChange[0]\n ? 100 - ((dayChange[0].non_hive.open / dayChange[0].hive.open) * 100) / +stats.latest\n : 0,\n totalFromAsset: stats.hive_volume.split(\" \")[0],\n totalToAsset: stats.hbd_volume.split(\" \")[0],\n };\n\n return result;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketData } from \"../types\";\nimport { getBoundFetch } from \"@/modules/core\";\n\n/**\n * Get market chart data from CoinGecko API\n *\n * @param coin - Coin ID (e.g., \"hive\", \"bitcoin\")\n * @param vsCurrency - Currency to compare against (e.g., \"usd\", \"eur\")\n * @param fromTs - From timestamp (Unix timestamp in seconds)\n * @param toTs - To timestamp (Unix timestamp in seconds)\n */\nexport function getMarketDataQueryOptions(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n) {\n return queryOptions({\n queryKey: [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n queryFn: async ({ signal }) => {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n\n const response = await fetchApi(url, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch market data: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date) {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n}\n\nexport function getTradeHistoryQueryOptions(\n limit = 1000,\n startDate?: Date,\n endDate?: Date\n) {\n const end = endDate ?? new Date();\n const start =\n startDate ?? new Date(end.getTime() - 10 * 60 * 60 * 1000);\n\n return queryOptions({\n queryKey: [\"market\", \"trade-history\", limit, start.getTime(), end.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_trade_history\", [\n formatDate(start),\n formatDate(end),\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FeedHistoryItem {\n id: number;\n current_median_history: {\n base: string;\n quote: string;\n };\n market_median_history: {\n base: string;\n quote: string;\n };\n current_min_history: {\n base: string;\n quote: string;\n };\n current_max_history: {\n base: string;\n quote: string;\n };\n price_history: Array<{\n base: string;\n quote: string;\n }>;\n}\n\n/**\n * Get feed history from the blockchain\n * Returns price feed history including median prices\n */\nexport function getFeedHistoryQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"feed-history\"],\n queryFn: async () => {\n try {\n const feedHistory = await callRPC(\"condenser_api.get_feed_history\", []);\n return feedHistory as FeedHistoryItem;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface MedianHistoryPrice {\n base: string;\n quote: string;\n}\n\n/**\n * Get current median history price from the blockchain\n * Returns the current median price for HIVE/HBD conversion\n */\nexport function getCurrentMedianHistoryPriceQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"current-median-history-price\"],\n queryFn: async () => {\n try {\n const price = await callRPC(\"condenser_api.get_current_median_history_price\", []);\n return price as MedianHistoryPrice;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCreateOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCreatePayload {\n amountToSell: string;\n minToReceive: string;\n fillOrKill: boolean;\n expiration: string;\n orderId: number;\n}\n\nexport function useLimitOrderCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-create\"],\n username,\n (payload) => [\n buildLimitOrderCreateOp(\n username!,\n payload.amountToSell,\n payload.minToReceive,\n payload.fillOrKill,\n payload.expiration,\n payload.orderId\n )\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCancelOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCancelPayload {\n orderId: number;\n}\n\nexport function useLimitOrderCancel(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-cancel\"],\n username,\n ({ orderId }) => [\n buildLimitOrderCancelOp(username!, orderId)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { MarketData } from \"./types\";\nimport { CurrencyRates } from \"@/modules/private-api/types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n const data = (await response.json()) as T;\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n return data;\n}\n\nexport async function getMarketData(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n): Promise {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n const response = await fetchApi(url);\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRate(cur: string): Promise {\n if (cur === \"hbd\") {\n return 1;\n }\n\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${cur}`;\n const response = await fetchApi(url);\n const data = await parseJsonResponse<{ hive_dollar: Record }>(response);\n return data.hive_dollar[cur];\n}\n\nexport async function getCurrencyTokenRate(currency: string, token: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost +\n `/private-api/market-data/${currency === \"hbd\" ? \"usd\" : currency}/${token}`\n );\n\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRates(): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/market-data/latest\");\n return parseJsonResponse(response);\n}\n\nexport async function getHivePrice(): Promise<{ hive: { usd: number } }> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n \"https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd\"\n );\n return parseJsonResponse<{ hive: { usd: number } }>(response);\n}\n","import { ConfigManager, getBoundFetch } from \"@/modules/core\";\nimport type { HiveEngineOpenOrder } from \"./types\";\n\ntype EngineOrderBookEntry = {\n txId: string;\n timestamp: number;\n account: string;\n symbol: string;\n quantity: string;\n price: string;\n tokensLocked?: string;\n};\n\nconst ENGINE_RPC_HEADERS = { \"Content-type\": \"application/json\" };\n\nasync function engineRpc(payload: Record): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(`${baseUrl}/private-api/engine-api`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: ENGINE_RPC_HEADERS,\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – request failed with ${response.status}`\n );\n }\n\n const data = (await response.json()) as { result: T };\n return data.result;\n}\n\nasync function engineRpcSafe(\n payload: Record,\n fallback: T\n): Promise {\n try {\n return await engineRpc(payload);\n } catch (e) {\n return fallback;\n }\n}\n\nexport async function getHiveEngineOrderBook(\n symbol: string,\n limit: number = 50\n): Promise<{ buy: T[]; sell: T[] }> {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buy, sell] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"price\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"price\", descending: false }],\n },\n },\n []\n ),\n ]);\n\n const sortByPriceDesc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return right - left;\n });\n const sortByPriceAsc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return left - right;\n });\n\n return {\n buy: sortByPriceDesc(buy),\n sell: sortByPriceAsc(sell),\n };\n}\n\nexport async function getHiveEngineTradeHistory>(\n symbol: string,\n limit: number = 50\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"tradesHistory\",\n query: { symbol },\n limit,\n offset: 0,\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineOpenOrders(\n account: string,\n symbol: string,\n limit: number = 100\n): Promise {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol, account },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buyRaw, sellRaw] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n ]);\n\n const formatTotal = (quantity: string, price: string) =>\n (Number(quantity || 0) * Number(price || 0)).toFixed(8);\n\n const buy: HiveEngineOpenOrder[] = buyRaw.map((order) => ({\n id: order.txId,\n type: \"buy\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: order.tokensLocked ?? formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n const sell: HiveEngineOpenOrder[] = sellRaw.map((order) => ({\n id: order.txId,\n type: \"sell\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n return [...buy, ...sell].sort((a, b) => b.timestamp - a.timestamp) as T[];\n}\n\n/**\n * Market metrics, optionally narrowed to one symbol or to a list of them.\n *\n * An unfiltered call is served from a single page – the node caps `find` at 1000 rows\n * while Hive engine has far more traded tokens than that – so callers that only care\n * about specific symbols must pass them. Scanning the unfiltered page for a symbol\n * silently reports \"no market\" for everything outside it.\n */\nexport async function getHiveEngineMetrics>(\n symbol?: string | string[],\n account?: string\n): Promise {\n if (Array.isArray(symbol) && symbol.length === 0) {\n return [];\n }\n\n const symbolQuery = Array.isArray(symbol)\n ? { symbol: { $in: symbol } }\n : symbol\n ? { symbol }\n : {};\n\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"metrics\",\n query: {\n ...symbolQuery,\n ...(account ? { account } : {}),\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMarket>(\n account?: string,\n symbol?: string | string[]\n): Promise {\n return getHiveEngineMetrics(symbol, account);\n}\n\nexport async function getHiveEngineTokensBalances>(\n username: string\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"balances\",\n query: {\n account: username,\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMetadata>(\n tokens: string[]\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"tokens\",\n query: {\n symbol: { $in: tokens },\n },\n },\n id: 2,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokenTransactions>(\n username: string,\n symbol: string,\n limit: number,\n offset: number\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-account-history\", baseUrl);\n url.searchParams.set(\"account\", username);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"limit\", limit.toString());\n url.searchParams.set(\"offset\", offset.toString());\n\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – account history failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineTokenMetrics>(\n symbol: string,\n interval = \"daily\"\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-chart-api\", baseUrl);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"interval\", interval);\n\n const response = await fetchApi(url.toString(), {\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – chart failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineUnclaimedRewards>(\n username: string\n): Promise> {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(\n `${baseUrl}/private-api/engine-reward-api/${username}?hive=1`\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – rewards failed with ${response.status}`\n );\n }\n\n return (await response.json()) as Record;\n}\n","import { getHiveEngineTokensBalances } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenBalance } from \"../types\";\n\nexport function getHiveEngineTokensBalancesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"balances\", username] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensBalances(username);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMarketResponse } from \"../types\";\nimport { getHiveEngineTokensMarket } from \"../requests\";\n\nexport function getHiveEngineTokensMarketQueryOptions() {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"markets\"],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMarket();\n },\n });\n}\n","import { getHiveEngineTokensMetadata } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenMetadataResponse } from \"../types\";\n\nexport function getHiveEngineTokensMetadataQueryOptions(tokens: string[]) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"metadata-list\", tokens] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMetadata(tokens);\n },\n });\n}\n","import { getHiveEngineTokenTransactions } from \"../requests\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTransaction } from \"../types\";\n\nexport function getHiveEngineTokenTransactionsQueryOptions(\n username: string | undefined,\n symbol: string,\n limit = 20\n) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"transactions\", username],\n enabled: !!symbol && !!username,\n initialPageParam: 0,\n queryFn: async ({ pageParam }) => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n return getHiveEngineTokenTransactions(\n username,\n symbol,\n limit,\n pageParam as number\n );\n },\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n (lastPage?.length ?? 0) === limit ? (lastPageParam as number) + limit : undefined,\n getPreviousPageParam: (_firstPage, _allPages, firstPageParam) =>\n (firstPageParam as number) > 0 ? (firstPageParam as number) - limit : undefined,\n });\n}\n","import { getHiveEngineTokenMetrics } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMetric } from \"../types\";\n\nexport function getHiveEngineTokensMetricsQueryOptions(\n symbol: string,\n interval = \"daily\"\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokenMetrics(symbol, interval);\n },\n });\n}\n","import { getHiveEngineUnclaimedRewards } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenStatus } from \"../types\";\n\nexport function getHiveEngineUnclaimedRewardsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"unclaimed\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n enabled: !!username,\n queryFn: async () => {\n try {\n const data = await getHiveEngineUnclaimedRewards(\n username as string\n );\n return Object.values(data).filter(\n ({ pending_token }) => pending_token > 0\n );\n } catch (e) {\n return [];\n }\n },\n });\n}\n","import { getHiveEngineTokensMarket } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenInfo } from \"../types\";\n\nexport function getAllHiveEngineTokensQueryOptions(\n account?: string,\n symbol?: string | string[]\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"all-tokens\", account, symbol] as const,\n queryFn: async () => {\n return getHiveEngineTokensMarket(account, symbol);\n },\n });\n}\n","interface Options {\n fractionDigits?: number;\n prefix?: string;\n suffix?: string;\n}\n\nexport function formattedNumber(\n value: number | string,\n options: Options | undefined = undefined\n) {\n let opts: Options = {\n fractionDigits: 3,\n prefix: \"\",\n suffix: \"\",\n };\n\n if (options) {\n opts = { ...opts, ...options };\n }\n\n const { fractionDigits, prefix, suffix } = opts;\n\n let out = \"\";\n\n if (prefix) out += prefix + \" \";\n // turn too small values to zero. Bug: https://github.com/adamwdraper/Numeral-js/issues/563\n const av = Math.abs(parseFloat(value.toString())) < 0.0001 ? 0 : value;\n const num = typeof av === \"string\" ? parseFloat(av) : av;\n out += num.toLocaleString(\"en-US\", {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n useGrouping: true,\n });\n if (suffix) out += \" \" + suffix;\n\n return out;\n}\n","import { formattedNumber } from \"./formatted-number\";\n\ninterface HiveEngineTokenProps {\n symbol: string;\n name: string;\n icon: string;\n precision: number;\n stakingEnabled: boolean;\n delegationEnabled: boolean;\n balance: string;\n stake: string;\n delegationsIn: string;\n delegationsOut: string;\n usdValue: number;\n}\n\nexport class HiveEngineToken {\n symbol: string;\n name?: string;\n icon?: string;\n\n precision?: number;\n stakingEnabled?: boolean;\n delegationEnabled?: boolean;\n balance: number;\n stake: number;\n stakedBalance: number;\n delegationsIn: number;\n delegationsOut: number;\n usdValue: number;\n\n constructor(props: HiveEngineTokenProps) {\n this.symbol = props.symbol;\n this.name = props.name || \"\";\n this.icon = props.icon || \"\";\n\n this.precision = props.precision || 0;\n this.stakingEnabled = props.stakingEnabled || false;\n this.delegationEnabled = props.delegationEnabled || false;\n this.balance = parseFloat(props.balance) || 0;\n this.stake = parseFloat(props.stake) || 0;\n this.delegationsIn = parseFloat(props.delegationsIn) || 0;\n this.delegationsOut = parseFloat(props.delegationsOut) || 0;\n this.stakedBalance =\n this.stake + this.delegationsIn - this.delegationsOut;\n this.usdValue = props.usdValue;\n }\n\n hasDelegations = (): boolean => {\n if (!this.delegationEnabled) {\n return false;\n }\n\n return this.delegationsIn > 0 && this.delegationsOut > 0;\n };\n\n delegations = (): string => {\n if (!this.hasDelegations()) {\n return \"\";\n }\n\n return `(${formattedNumber(this.stake, {\n fractionDigits: this.precision,\n })} + ${formattedNumber(this.delegationsIn, {\n fractionDigits: this.precision,\n })} - ${formattedNumber(this.delegationsOut, {\n fractionDigits: this.precision,\n })})`;\n };\n\n staked = (): string => {\n if (!this.stakingEnabled) {\n return \"-\";\n }\n\n if (this.stakedBalance < 0.0001) {\n return this.stakedBalance.toString();\n }\n\n return formattedNumber(this.stakedBalance, {\n fractionDigits: this.precision,\n });\n };\n\n balanced = (): string => {\n if (this.balance < 0.0001) {\n return this.balance.toString();\n }\n\n return formattedNumber(this.balance, { fractionDigits: this.precision });\n };\n}\n","import {\n getHiveEngineTokensBalances,\n getHiveEngineTokensMarket,\n getHiveEngineTokensMetadata,\n} from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type {\n HiveEngineTokenBalance,\n Token,\n TokenMetadata,\n HiveEngineTokenInfo,\n} from \"../types\";\nimport { HiveEngineToken } from \"../utils\";\n\ninterface DynamicProps {\n base: number;\n quote: number;\n}\n\nexport function getHiveEngineBalancesWithUsdQueryOptions(\n account: string,\n dynamicProps?: DynamicProps,\n allTokens?: HiveEngineTokenInfo[]\n) {\n return queryOptions({\n queryKey: [\n \"assets\",\n \"hive-engine\",\n \"balances-with-usd\",\n account,\n dynamicProps,\n allTokens,\n ] as const,\n queryFn: async () => {\n if (!account) {\n throw new Error(\"[HiveEngine] No account in a balances query\");\n }\n\n const balances = await getHiveEngineTokensBalances(account);\n\n const tokens = await getHiveEngineTokensMetadata(\n balances.map((t) => t.symbol)\n );\n\n const pricePerHive = dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0;\n const providedMetrics: ReadonlyArray = Array.isArray(\n allTokens\n )\n ? allTokens\n : [];\n\n // Whatever the caller passed comes from an unfiltered metrics call, which the node\n // caps at 1000 rows – held tokens outside that page have no price and used to be\n // valued at zero, understating the wallet. Ask for the missing ones by symbol.\n const unpricedSymbols = balances\n .map((balance) => balance.symbol)\n .filter(\n (symbol) =>\n symbol !== \"SWAP.HIVE\" &&\n !providedMetrics.some((metric) => metric.symbol === symbol)\n );\n\n const metrics: ReadonlyArray = [\n ...providedMetrics,\n ...(unpricedSymbols.length\n ? await getHiveEngineTokensMarket(\n undefined,\n unpricedSymbols\n )\n : []),\n ];\n\n return balances.map((balance) => {\n const token = tokens.find((t) => t.symbol === balance.symbol);\n let tokenMetadata: TokenMetadata | undefined;\n\n if (token?.metadata) {\n try {\n tokenMetadata = JSON.parse(token.metadata) as TokenMetadata;\n } catch {\n tokenMetadata = undefined;\n }\n }\n\n const metric = metrics.find((m) => m.symbol === balance.symbol);\n const lastPrice = Number(metric?.lastPrice ?? \"0\");\n const balanceAmount = Number(balance.balance);\n\n const usdValue =\n balance.symbol === \"SWAP.HIVE\"\n ? pricePerHive * balanceAmount\n : lastPrice === 0\n ? 0\n : Number(\n (lastPrice * pricePerHive * balanceAmount).toFixed(10)\n );\n\n return new HiveEngineToken({\n symbol: balance.symbol,\n name: token?.name ?? balance.symbol,\n icon: tokenMetadata?.icon ?? \"\",\n precision: token?.precision ?? 0,\n stakingEnabled: token?.stakingEnabled ?? false,\n delegationEnabled: token?.delegationEnabled ?? false,\n balance: balance.balance,\n stake: balance.stake,\n delegationsIn: balance.delegationsIn,\n delegationsOut: balance.delegationsOut,\n usdValue,\n });\n });\n },\n enabled: !!account,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getHiveEngineTokensMetadataQueryOptions } from \"./get-hive-engine-tokens-metadata-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"./get-hive-engine-tokens-balances-query-options\";\nimport { getAllHiveEngineTokensQueryOptions } from \"./get-all-hive-engine-tokens-query-options\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"@/modules/wallet/queries/get-hive-asset-general-info-query-options\";\n\nexport function getHiveEngineTokenGeneralInfoQueryOptions(\n username?: string,\n symbol?: string\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"general-info\", username],\n enabled: !!symbol && !!username,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n const queryClient = getQueryClient();\n const hiveQuery = getHiveAssetGeneralInfoQueryOptions(username);\n await queryClient.prefetchQuery(hiveQuery);\n const hiveData = queryClient.getQueryData(\n hiveQuery.queryKey\n );\n\n const metadataList = await queryClient.ensureQueryData(\n getHiveEngineTokensMetadataQueryOptions([symbol])\n );\n\n const balanceList = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n // Scoped to this symbol: the unfiltered metrics call is capped at 1000 rows, so a\n // token outside that page reported no market and rendered a zero price.\n const marketList = await queryClient.ensureQueryData(\n getAllHiveEngineTokensQueryOptions(undefined, symbol)\n );\n\n const metadata = metadataList?.find((i) => i.symbol === symbol);\n const balance = balanceList?.find((i) => i.symbol === symbol);\n const market = marketList?.find((i) => i.symbol === symbol);\n\n const lastPrice = +(market?.lastPrice ?? \"0\");\n\n const liquidBalance = parseFloat(balance?.balance ?? \"0\");\n const stakedBalance = parseFloat(balance?.stake ?? \"0\");\n const unstakingBalance = parseFloat(balance?.pendingUnstake ?? \"0\");\n\n const parts: GeneralAssetInfo[\"parts\"] = [\n { name: \"liquid\", balance: liquidBalance },\n { name: \"staked\", balance: stakedBalance },\n ];\n\n if (unstakingBalance > 0) {\n parts.push({ name: \"unstaking\", balance: unstakingBalance });\n }\n\n return {\n name: symbol,\n title: metadata?.name ?? \"\",\n price: lastPrice === 0 ? 0 : Number(lastPrice * (hiveData?.price ?? 0)),\n accountBalance: liquidBalance + stakedBalance,\n layer: \"ENGINE\",\n parts,\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PointTransaction } from \"../types/point-transaction\";\n\ninterface PointsResponse {\n points: string;\n unclaimed_points: string;\n}\n\nexport function getPointsQueryOptions(username?: string, filter = 0) {\n return queryOptions({\n queryKey: [\"points\", username, filter],\n queryFn: async () => {\n if (!username) {\n throw new Error(\"Get points query – username wasn't provided\");\n }\n\n const name = username.replace(\"@\", \"\");\n\n // Get points\n const pointsResponse = await fetch(CONFIG.privateApiHost + \"/private-api/points\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name }),\n });\n\n if (!pointsResponse.ok) {\n throw new Error(`Failed to fetch points: ${pointsResponse.status}`);\n }\n\n const points = (await pointsResponse.json()) as PointsResponse;\n\n // Get transactions\n const transactionsResponse = await fetch(\n CONFIG.privateApiHost + \"/private-api/point-list\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name, type: filter }),\n }\n );\n\n if (!transactionsResponse.ok) {\n throw new Error(`Failed to fetch point transactions: ${transactionsResponse.status}`);\n }\n\n const transactions = (await transactionsResponse.json()) as PointTransaction[];\n\n return {\n points: points.points,\n uPoints: points.unclaimed_points,\n transactions,\n } as const;\n },\n staleTime: 30000,\n refetchOnMount: true,\n enabled: !!username,\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getPointsQueryOptions } from \"./get-points-query-options\";\n\nexport function getPointsAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getPointsQueryOptions(username));\n const data = getQueryClient().getQueryData(\n getPointsQueryOptions(username).queryKey\n );\n return {\n name: \"POINTS\",\n title: \"Ecency Points\",\n price: 0.002,\n accountBalance: +(data?.points ?? 0),\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { PointTransaction } from \"../types\";\nimport { PointTransactionType } from \"../types\";\nimport type { GeneralAssetTransaction } from \"@/modules/wallet/types\";\n\nexport function getPointsAssetTransactionsQueryOptions(\n username: string | undefined,\n type?: PointTransactionType\n) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"transactions\", username, type],\n queryFn: async () => {\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/point-list`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n type: type ?? 0,\n }),\n }\n );\n const data = (await response.json()) as PointTransaction[];\n return data.map(({ created, type, amount, id, sender, receiver, memo }) => ({\n created: new Date(created),\n type,\n results: [\n {\n amount: parseFloat(amount),\n asset: \"POINTS\",\n },\n ],\n id,\n from: sender ?? undefined,\n to: receiver ?? undefined,\n memo: memo ?? undefined,\n })) satisfies GeneralAssetTransaction[];\n },\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { getCurrencyRate } from \"@/modules/market\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"./get-hive-asset-general-info-query-options\";\nimport { getHbdAssetGeneralInfoQueryOptions } from \"./get-hbd-asset-general-info-query-options\";\nimport { getHivePowerAssetGeneralInfoQueryOptions } from \"./get-hive-power-asset-general-info-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getHiveEngineTokenGeneralInfoQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getPointsAssetGeneralInfoQueryOptions } from \"@/modules/points/queries\";\nimport {\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"./get-portfolio-query-options\";\n\ninterface Options {\n refetch?: boolean;\n currency?: string;\n}\n\nexport function getAccountWalletAssetInfoQueryOptions(\n username: string,\n asset: string,\n options: Options = { refetch: false }\n) {\n const queryClient = getQueryClient();\n const currency = options.currency ?? \"usd\";\n\n const fetchQuery = async (qo: any) => {\n if (options.refetch) {\n await queryClient.fetchQuery(qo);\n } else {\n await queryClient.prefetchQuery(qo);\n }\n return queryClient.getQueryData(qo.queryKey);\n };\n\n const convertPriceToUserCurrency = async (\n assetInfo: GeneralAssetInfo | undefined\n ): Promise => {\n if (!assetInfo || currency === \"usd\") {\n return assetInfo;\n }\n\n try {\n const conversionRate = await getCurrencyRate(currency);\n return {\n ...assetInfo,\n price: assetInfo.price * conversionRate,\n };\n } catch (error) {\n console.warn(`Failed to convert price from USD to ${currency}:`, error);\n return assetInfo;\n }\n };\n\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n\n const getPortfolioAssetInfo = async () => {\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const assetItem = portfolio.wallets.find(\n (item: PortfolioWalletItem) =>\n item.symbol.toUpperCase() === asset.toUpperCase()\n );\n\n if (!assetItem) return undefined;\n\n const parts: Array<{ name: string; balance: number }> = [];\n\n if (assetItem.liquid !== undefined && assetItem.liquid !== null) {\n parts.push({ name: \"liquid\", balance: assetItem.liquid });\n }\n\n if (assetItem.staked !== undefined && assetItem.staked !== null && assetItem.staked > 0) {\n parts.push({ name: \"staked\", balance: assetItem.staked });\n }\n\n if (assetItem.savings !== undefined && assetItem.savings !== null && assetItem.savings > 0) {\n parts.push({ name: \"savings\", balance: assetItem.savings });\n }\n\n if (assetItem.extraData && Array.isArray(assetItem.extraData)) {\n for (const extraItem of assetItem.extraData) {\n if (!extraItem || typeof extraItem !== \"object\") continue;\n\n const dataKey = extraItem.dataKey;\n const value = extraItem.value;\n\n if (typeof value === \"string\") {\n const cleanValue = value.replace(/,/g, \"\");\n const match = cleanValue.match(/[+-]?\\s*(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const numValue = Math.abs(Number.parseFloat(match[1]));\n\n if (dataKey === \"delegated_hive_power\") {\n parts.push({ name: \"outgoing_delegations\", balance: numValue });\n } else if (dataKey === \"received_hive_power\") {\n parts.push({ name: \"incoming_delegations\", balance: numValue });\n } else if (dataKey === \"powering_down_hive_power\") {\n parts.push({ name: \"pending_power_down\", balance: numValue });\n }\n }\n }\n }\n }\n\n return {\n name: assetItem.symbol,\n title: assetItem.name,\n price: assetItem.fiatRate,\n accountBalance: assetItem.balance,\n apr: assetItem.apr?.toString(),\n layer: assetItem.layer,\n pendingRewards: assetItem.pendingRewards,\n parts,\n } as GeneralAssetInfo;\n } catch {\n return undefined;\n }\n };\n\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n queryFn: async () => {\n const portfolioAssetInfo = await getPortfolioAssetInfo();\n\n if (portfolioAssetInfo && portfolioAssetInfo.price > 0) {\n return portfolioAssetInfo;\n }\n\n let assetInfo: GeneralAssetInfo | undefined;\n\n if (asset === \"HIVE\") {\n assetInfo = await fetchQuery(getHiveAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HP\") {\n assetInfo = await fetchQuery(getHivePowerAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HBD\") {\n assetInfo = await fetchQuery(getHbdAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"POINTS\") {\n assetInfo = await fetchQuery(getPointsAssetGeneralInfoQueryOptions(username));\n } else {\n // Check if it's a Hive Engine token\n const balances = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n if (balances.some((balance) => balance.symbol === asset)) {\n assetInfo = await fetchQuery(\n getHiveEngineTokenGeneralInfoQueryOptions(username, asset)\n );\n } else if (portfolioAssetInfo) {\n // Unknown asset but portfolio has data — use it as-is\n return portfolioAssetInfo;\n } else {\n throw new Error(\n `[SDK][Wallet] – unrecognized asset \"${asset}\"`\n );\n }\n }\n\n // If portfolio had rich data (parts, balance) but zero price,\n // merge the fallback price into the portfolio data\n if (portfolioAssetInfo && assetInfo && assetInfo.price > 0) {\n const converted = await convertPriceToUserCurrency(assetInfo);\n return {\n ...portfolioAssetInfo,\n price: converted!.price,\n };\n }\n\n return await convertPriceToUserCurrency(assetInfo);\n },\n });\n}\n","export enum AssetOperation {\n // Common\n Transfer = \"transfer\",\n\n // APR\n TransferToSavings = \"transfer-saving\",\n WithdrawFromSavings = \"withdraw-saving\",\n Delegate = \"delegate\",\n PowerUp = \"power-up\",\n PowerDown = \"power-down\",\n WithdrawRoutes = \"withdraw-routes\",\n ClaimInterest = \"claim-interest\",\n Swap = \"swap\",\n Convert = \"convert\",\n\n // Points\n Gift = \"gift\",\n Promote = \"promote\",\n Claim = \"claim\",\n Buy = \"buy\",\n\n // Layer 2\n Stake = \"stake\",\n Unstake = \"unstake\",\n Undelegate = \"undelegate\",\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for transferring tokens.\n */\nexport interface TransferPayload {\n /** Recipient account */\n to: string;\n /** Amount with asset symbol (e.g., \"1.000 HIVE\", \"5.000 HBD\") */\n amount: string;\n /** Transfer memo */\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring tokens.\n *\n * This mutation broadcasts a transfer operation to send HIVE or HBD\n * to another account. **Requires ACTIVE authority**.\n *\n * Uses `useBroadcastMutation` with the smart auth strategy:\n * - Adapter determines login type and dispatches to appropriate method\n * - If active key not available (common on web), triggers `showAuthUpgradeUI`\n * - Supports keychain, hivesigner, hiveauth, and direct key signing\n *\n * @param username - The username sending the transfer (required for broadcast)\n * @param auth - Authentication context with platform adapter\n *\n * @returns React Query mutation result\n */\nexport function useTransfer(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer\"],\n username,\n (payload) => [\n buildTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildPointTransferOp } from \"@/modules/operations/builders\";\n\nexport interface TransferPointPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring Ecency points.\n *\n * Uses `ecency_point_transfer` custom_json operation with ACTIVE authority.\n */\nexport function useTransferPoint(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-point\"],\n username,\n (payload) => [\n buildPointTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildDelegateVestingSharesOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for delegating Hive Power (vesting shares).\n */\nexport interface DelegateVestingSharesPayload {\n /** Account receiving HP delegation */\n delegatee: string;\n /** Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\"). Use \"0.000000 VESTS\" to remove delegation. */\n vestingShares: string;\n}\n\n/**\n * React Query mutation hook for delegating Hive Power (HP).\n *\n * This mutation broadcasts a delegate_vesting_shares operation to delegate HP\n * to another account. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username delegating HP (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Delegation operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Delegation Mechanics:**\n * - Delegated HP can be used by the delegatee for resource credits\n * - Delegatee CANNOT power down or transfer the delegated HP\n * - Delegation can be removed by setting vestingShares to \"0.000000 VESTS\"\n * - Removing delegation has a 5-day cooldown before HP returns to delegator\n *\n * **Post-Broadcast Actions:**\n * - Invalidates delegations list cache to show updated delegation\n * - Invalidates account data for both delegator and delegatee\n *\n * @example\n * ```typescript\n * const delegateMutation = useDelegateVestingShares(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Delegate HP\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '1000.000000 VESTS'\n * });\n *\n * // Remove delegation\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '0.000000 VESTS'\n * });\n * ```\n */\nexport function useDelegateVestingShares(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-vesting-shares\"],\n username,\n (payload) => [\n buildDelegateVestingSharesOp(\n username!,\n payload.delegatee,\n payload.vestingShares\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.delegatee),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildSetWithdrawVestingRouteOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for setting withdraw vesting route.\n */\nexport interface SetWithdrawVestingRoutePayload {\n /** Account receiving withdrawn vesting */\n toAccount: string;\n /** Percentage to route (0-10000, where 10000 = 100%). Already scaled. */\n percent: number;\n /** Auto convert to vesting (power up) */\n autoVest: boolean;\n}\n\n/**\n * React Query mutation hook for setting withdraw vesting route.\n *\n * This mutation broadcasts a set_withdraw_vesting_route operation to configure\n * where withdrawn VESTS (power down) are sent. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username setting withdraw route (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Withdraw route operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Withdraw Route Mechanics:**\n * - Routes a percentage of power down (withdraw_vesting) to another account\n * - Percent must be between 0-10000 (where 10000 = 100%)\n * - Multiple routes can be set, total cannot exceed 100%\n * - autoVest=true converts withdrawn VESTS to HP in destination account\n * - autoVest=false converts withdrawn VESTS to liquid HIVE\n *\n * **Post-Broadcast Actions:**\n * - Invalidates withdraw routes cache to show updated routes\n * - Invalidates account data for both accounts\n *\n * @example\n * ```typescript\n * const setRouteMutation = useSetWithdrawVestingRoute(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Route 50% of power down to another account (auto vest)\n * setRouteMutation.mutate({\n * toAccount: 'alice',\n * percent: 5000, // 50% (already scaled)\n * autoVest: true\n * });\n *\n * // Route 100% of power down to another account (liquid HIVE)\n * setRouteMutation.mutate({\n * toAccount: 'bob',\n * percent: 10000, // 100% (already scaled)\n * autoVest: false\n * });\n * ```\n */\nexport function useSetWithdrawVestingRoute(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"set-withdraw-vesting-route\"],\n username,\n (payload) => [\n buildSetWithdrawVestingRouteOp(\n username!,\n payload.toAccount,\n payload.percent,\n payload.autoVest\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.wallet.withdrawRoutes(username!),\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.toAccount)\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface TransferEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n memo: string;\n}\n\nexport function useTransferEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"transfer\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n memo: payload.memo\n }\n });\n return [[\"custom_json\", {\n required_auths: [username!],\n required_posting_auths: [],\n id: \"ssc-mainnet-hive\",\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\nexport function useTransferToSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-savings\"],\n username,\n (payload) => [\n buildTransferToSavingsOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferFromSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferFromSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useTransferFromSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-from-savings\"],\n username,\n (payload) => [\n buildTransferFromSavingsOp(username!, payload.to, payload.amount, payload.memo, payload.requestId)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToVestingOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToVestingPayload {\n to: string;\n amount: string;\n}\n\nexport function useTransferToVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-vesting\"],\n username,\n (payload) => [\n buildTransferToVestingOp(username!, payload.to, payload.amount)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildWithdrawVestingOp } from \"@/modules/operations/builders\";\n\nexport interface WithdrawVestingPayload {\n vestingShares: string;\n}\n\nexport function useWithdrawVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"withdraw-vesting\"],\n username,\n (payload) => [\n buildWithdrawVestingOp(username!, payload.vestingShares)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildConvertOp, buildCollateralizedConvertOp } from \"@/modules/operations/builders\";\n\nexport interface ConvertPayload {\n amount: string;\n requestId: number;\n collateralized?: boolean;\n}\n\nexport function useConvert(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"convert\"],\n username,\n (payload) => [\n payload.collateralized\n ? buildCollateralizedConvertOp(username!, payload.amount, payload.requestId)\n : buildConvertOp(username!, payload.amount, payload.requestId)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimInterestOps } from \"@/modules/operations/builders\";\n\nexport interface ClaimInterestPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useClaimInterest(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-interest\"],\n username,\n (payload) => buildClaimInterestOps(username!, payload.to, payload.amount, payload.memo, payload.requestId),\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimRewardBalanceOp } from \"@/modules/operations/builders\";\n\nexport interface ClaimRewardsPayload {\n rewardHive: string;\n rewardHbd: string;\n rewardVests: string;\n}\n\nconst CLAIM_REWARDS_INVALIDATION_DELAY_MS = 5000;\nconst pendingInvalidationTimers = new Map>();\n\nexport function useClaimRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-rewards\"],\n username,\n (payload) => [\n buildClaimRewardBalanceOp(username!, payload.rewardHive, payload.rewardHbd, payload.rewardVests)\n ],\n () => {\n const timerKey = username ?? \"__anonymous__\";\n const keysToInvalidate = [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n QueryKeys.assets.hiveGeneralInfo(username!),\n QueryKeys.assets.hbdGeneralInfo(username!),\n QueryKeys.assets.hivePowerGeneralInfo(username!),\n ];\n\n // Delay invalidation to allow blockchain to propagate the transaction.\n // Immediate invalidation would fetch stale (pre-confirmation) data.\n const existingTimer = pendingInvalidationTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n pendingInvalidationTimers.delete(timerKey);\n }\n\n const timer = setTimeout(async () => {\n try {\n const qc = getQueryClient();\n const results = await Promise.allSettled(\n keysToInvalidate.map((key) => qc.invalidateQueries({ queryKey: key }))\n );\n const rejected = results.filter((result) => result.status === \"rejected\");\n if (rejected.length > 0) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation rejected\", {\n username,\n rejectedCount: rejected.length,\n rejected\n });\n }\n } catch (error) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation failed\", {\n username,\n error\n });\n } finally {\n pendingInvalidationTimers.delete(timerKey);\n }\n }, CLAIM_REWARDS_INVALIDATION_DELAY_MS);\n\n pendingInvalidationTimers.set(timerKey, timer);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface DelegateEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useDelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"delegate\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UndelegateEngineTokenPayload {\n from: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUndelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"undelegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"undelegate\",\n contractPayload: {\n symbol: payload.symbol,\n from: payload.from,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface StakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useStakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"stake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"stake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UnstakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUnstakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"unstake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"unstake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface ClaimEngineRewardsPayload {\n tokens: string[];\n}\n\nexport function useClaimEngineRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-engine-rewards\"],\n username,\n (payload) => {\n const json = JSON.stringify(payload.tokens.map((symbol) => ({ symbol })));\n return [[\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [username!],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface EngineMarketOrderPayload {\n action: \"buy\" | \"sell\" | \"cancel\";\n symbol: string;\n quantity?: string;\n price?: string;\n orderId?: string;\n orderType?: \"buy\" | \"sell\";\n}\n\nexport function useEngineMarketOrder(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"engine-market-order\"],\n username,\n (payload) => {\n let contractPayload: Record;\n let contractAction: string;\n\n if (payload.action === \"cancel\") {\n contractAction = \"cancel\";\n contractPayload = {\n type: payload.orderType!,\n id: payload.orderId!,\n };\n } else {\n contractAction = payload.action;\n contractPayload = {\n symbol: payload.symbol,\n quantity: payload.quantity!,\n price: payload.price!,\n };\n }\n\n const json = JSON.stringify({\n contractName: \"market\",\n contractAction,\n contractPayload,\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport { AssetOperation } from \"../types\";\nimport {\n buildTransferOp,\n buildTransferToSavingsOp,\n buildTransferFromSavingsOp,\n buildTransferToVestingOp,\n buildWithdrawVestingOp,\n buildDelegateVestingSharesOp,\n buildSetWithdrawVestingRouteOp,\n buildConvertOp,\n buildClaimInterestOps,\n buildPointTransferOp,\n buildEngineOp,\n buildEngineClaimOp,\n} from \"@/modules/operations/builders\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface WalletOperationPayload {\n from: string;\n to?: string;\n amount?: string;\n memo?: string;\n request_id?: number;\n from_account?: string;\n to_account?: string;\n percent?: number;\n auto_vest?: boolean;\n mode?: string;\n [key: string]: unknown;\n}\n\nfunction buildHiveOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\", memo = \"\" } = payload;\n const requestId = payload.request_id ?? (Date.now() >>> 0);\n\n switch (asset) {\n case \"HIVE\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.PowerUp:\n return [buildTransferToVestingOp(from, to, amount)];\n }\n break;\n\n case \"HBD\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.ClaimInterest:\n return buildClaimInterestOps(from, to, amount, memo, requestId);\n case AssetOperation.Convert:\n return [buildConvertOp(from, amount, Math.floor(Date.now() / 1000))];\n }\n break;\n\n case \"HP\":\n switch (operation) {\n case AssetOperation.PowerDown:\n return [buildWithdrawVestingOp(from, amount)];\n case AssetOperation.Delegate:\n return [buildDelegateVestingSharesOp(from, to, amount)];\n case AssetOperation.WithdrawRoutes:\n return [buildSetWithdrawVestingRouteOp(\n payload.from_account ?? from,\n payload.to_account ?? to,\n payload.percent ?? 0,\n payload.auto_vest ?? false\n )];\n }\n break;\n\n case \"POINTS\":\n if (operation === AssetOperation.Transfer || operation === AssetOperation.Gift) {\n return [buildPointTransferOp(from, to, amount, memo)];\n }\n break;\n }\n\n return null;\n}\n\nfunction buildEngineOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\" } = payload;\n const quantity = typeof amount === \"string\" && amount.includes(\" \")\n ? amount.split(\" \")[0]\n : String(amount);\n\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildEngineOp(from, \"transfer\", {\n symbol: asset, to, quantity, memo: payload.memo ?? \"\"\n })];\n case AssetOperation.Stake:\n return [buildEngineOp(from, \"stake\", { symbol: asset, to, quantity })];\n case AssetOperation.Unstake:\n return [buildEngineOp(from, \"unstake\", { symbol: asset, to, quantity })];\n case AssetOperation.Delegate:\n return [buildEngineOp(from, \"delegate\", { symbol: asset, to, quantity })];\n case AssetOperation.Undelegate:\n return [buildEngineOp(from, \"undelegate\", { symbol: asset, from: to, quantity })];\n case AssetOperation.Claim:\n return [buildEngineClaimOp(from, [asset])];\n }\n\n return null;\n}\n\n/**\n * Determines authority level for a wallet operation.\n * Engine token claims use posting authority; everything else uses active.\n */\nfunction getWalletOperationAuthority(operation: AssetOperation): AuthorityLevel {\n if (operation === AssetOperation.Claim) {\n return 'posting';\n }\n return 'active';\n}\n\n/**\n * Meta-mutation hook that dispatches wallet operations based on asset and operation type.\n *\n * Supports HIVE, HBD, HP, POINTS, and Hive Engine tokens.\n * Uses `useBroadcastMutation` for unified auth handling via `AuthContextV2`.\n *\n * @param username - The Hive account performing the operation\n * @param asset - The asset symbol (e.g., \"HIVE\", \"HBD\", \"HP\", \"POINTS\", or engine token)\n * @param operation - The operation type from AssetOperation enum\n * @param auth - Auth context for broadcasting\n */\nexport function useWalletOperation(\n username: string | undefined,\n asset: string,\n operation: AssetOperation,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n operation as any\n );\n\n return useBroadcastMutation(\n [\"ecency-wallets\", asset, operation],\n username,\n (payload) => {\n // Try native Hive + POINTS operations\n const hiveOps = buildHiveOperations(asset, operation, payload);\n if (hiveOps) return hiveOps;\n\n // Try engine token operations\n const engineOps = buildEngineOperations(asset, operation, payload);\n if (engineOps) return engineOps;\n\n throw new Error(`[SDK][Wallet] – no operation builder for asset=\"${asset}\" operation=\"${operation}\"`);\n },\n () => {\n recordActivity();\n\n const keysToInvalidate: (string | undefined)[][] = [];\n\n // Invalidate asset-specific queries (prefix-matches all currency variants)\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, asset]);\n\n if (asset === \"HIVE\") {\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, \"HP\"]);\n }\n\n // Invalidate portfolio (prefix-matches all currency/filter variants)\n keysToInvalidate.push([\"wallet\", \"portfolio\", \"v2\", username]);\n\n // Delay invalidation to allow blockchain to process\n setTimeout(() => {\n keysToInvalidate.forEach((key) => {\n getQueryClient().invalidateQueries({ queryKey: key });\n });\n }, 5000);\n },\n auth,\n getWalletOperationAuthority(operation),\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDelegateRcOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface DelegateRcPayload {\n to: string;\n maxRc: string | number;\n}\n\nexport function useDelegateRc(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-rc\"],\n username,\n ({ to, maxRc }) => [\n buildDelegateRcOp(username!, to, maxRc)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n QueryKeys.resourceCredits.account(username!),\n QueryKeys.resourceCredits.account(variables.to),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting for a witness.\n */\nexport interface WitnessVotePayload {\n /** Witness account name to vote for/against */\n witness: string;\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting for a Hive witness.\n *\n * This mutation broadcasts an account_witness_vote operation to vote for\n * or remove a vote from a witness.\n *\n * @param username - The username voting for the witness (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account data cache to show updated witness votes\n * - Invalidates witness votes cache\n *\n * **Vote Types:**\n * - approve: true - Vote for the witness\n * - approve: false - Remove your vote from the witness\n *\n * **Authority Required:**\n * - Active authority is required for witness voting\n *\n * @example\n * ```typescript\n * const witnessVoteMutation = useWitnessVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Vote for a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: true\n * });\n *\n * // Remove vote from a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: false\n * });\n * ```\n */\nexport function useWitnessVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"vote\"],\n username,\n ({ witness, approve }) => [\n buildWitnessVoteOp(username!, witness, approve)\n ],\n async () => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.votes(username)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useWitnessVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for witness votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessProxyOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface WitnessProxyPayload {\n proxy: string;\n}\n\nexport function useWitnessProxy(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"proxy\"],\n username,\n ({ proxy }) => [\n buildWitnessProxyOp(username!, proxy)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.proxy(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Witness, WitnessVotersResponse } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\n\ntype WitnessPage = Witness[];\ntype WitnessCursor = number;\n\ninterface HafbeWitness {\n witness_name: string;\n rank: number;\n url: string;\n vests: string;\n votes_daily_change: string;\n voters_num: number;\n voters_num_daily_change: number;\n price_feed: number;\n bias: number;\n feed_updated_at: string;\n block_size: number;\n signing_key: string;\n version: string;\n missed_blocks: number;\n hbd_interest_rate: number;\n last_confirmed_block_num: number;\n account_creation_fee: number;\n}\n\ninterface HafbeWitnessesResponse {\n total_witnesses: number;\n total_pages: number;\n witnesses: HafbeWitness[];\n}\n\n/**\n * Map a hafbe-api witness to the SDK Witness shape so existing consumers\n * (e.g. the web app's transform()) keep working unchanged.\n */\nfunction mapRestWitness(w: HafbeWitness): Witness {\n return {\n owner: w.witness_name,\n total_missed: w.missed_blocks,\n url: w.url,\n props: {\n account_creation_fee: `${(w.account_creation_fee / 1000).toFixed(3)} HIVE`,\n account_subsidy_budget: 0,\n maximum_block_size: w.block_size,\n },\n hbd_exchange_rate: {\n base: `${w.price_feed.toFixed(3)} HBD`,\n },\n available_witness_account_subsidies: 0,\n running_version: w.version,\n signing_key: w.signing_key,\n last_hbd_exchange_update: w.feed_updated_at,\n rank: w.rank,\n vests: w.vests,\n voters_num: w.voters_num,\n voters_num_daily_change: w.voters_num_daily_change,\n price_feed: w.price_feed,\n hbd_interest_rate: w.hbd_interest_rate,\n last_confirmed_block_num: w.last_confirmed_block_num,\n };\n}\n\n/**\n * Get witnesses ordered by vote count (infinite scroll).\n * Uses the hafbe-api REST endpoint - replaces multi-call RPC assembly\n * with a single paginated call. Includes voter count, rank, and other\n * data that was previously unavailable.\n *\n * @param limit - Number of witnesses per page\n */\nexport function getWitnessesInfiniteQueryOptions(limit: number) {\n return infiniteQueryOptions<\n WitnessPage,\n Error,\n InfiniteData,\n (string | number)[],\n WitnessCursor\n >({\n queryKey: QueryKeys.witnesses.list(limit),\n initialPageParam: 1 as WitnessCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WitnessCursor }) => {\n const response = (await callREST(\n \"hafbe\",\n \"/witnesses\",\n {\n \"page-size\": limit,\n page: pageParam,\n }\n )) as HafbeWitnessesResponse;\n\n return response.witnesses.map(mapRestWitness);\n },\n\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n lastPage.length === limit ? lastPageParam + 1 : undefined,\n });\n}\n\nexport type WitnessVoterSortField =\n | \"vests\"\n | \"account_vests\"\n | \"proxied_vests\"\n | \"account_name\"\n | \"timestamp\";\n\nexport type WitnessVoterSortDirection = \"asc\" | \"desc\";\n\n/**\n * Get a single page of voters for a specific witness.\n *\n * Server-side pagination + sort: each page click fetches that page directly\n * from hafbe rather than scrolling through accumulated pages on the client.\n *\n * @param witness - Witness account name\n * @param page - 1-based page index\n * @param pageSize - Number of voters per page\n * @param sort - Field to sort by\n * @param direction - asc or desc\n */\nexport function getWitnessVotersPageQueryOptions(\n witness: string,\n page: number,\n pageSize: number,\n sort: WitnessVoterSortField = \"vests\",\n direction: WitnessVoterSortDirection = \"desc\"\n) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voters(witness, page, pageSize, sort, direction),\n queryFn: async ({ signal }) => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters\",\n {\n \"witness-name\": witness,\n \"page-size\": pageSize,\n page,\n sort,\n direction,\n },\n undefined,\n undefined,\n signal\n )) as WitnessVotersResponse;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n\n/**\n * Get total voter count for a witness.\n *\n * @param witness - Witness account name\n */\nexport function getWitnessVoterCountQueryOptions(witness: string) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voterCount(witness),\n queryFn: async () => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters/count\",\n { \"witness-name\": witness }\n )) as number;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n","export enum PointTransactionType {\n CHECKIN = 10,\n LOGIN = 20,\n CHECKIN_EXTRA = 30,\n POST = 100,\n COMMENT = 110,\n VOTE = 120,\n REBLOG = 130,\n DELEGATION = 150,\n REFERRAL = 160,\n COMMUNITY = 170,\n TRANSFER_SENT = 998,\n TRANSFER_INCOMING = 999,\n MINTED = 991,\n /**\n * Points burned out of supply rather than moved to the treasury. Written by the\n * AI surfaces (assist, image, transcribe), which pay a real per-request vendor\n * bill, so the Points are consumed rather than parked.\n *\n * The row carries no counterparty at all, which is what distinguishes it from\n * TRANSFER_SENT: `sender` and `receiver` are both null. A refund of a burn comes\n * back as this same type with a positive amount, so read the sign rather than\n * assuming a burn is always a debit.\n */\n BURNED = 997,\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPointsQueryOptions } from \"../queries\";\nimport type { Points } from \"../types\";\n\n/**\n * POST a points claim and return the parsed JSON body.\n *\n * The endpoint normally answers with JSON, but an edge/proxy layer can\n * occasionally return a 2xx whose body is an HTML interstitial or plain text\n * (ECENCY-NEXT-1FCJ). Calling `response.json()` on that throws a bare\n * `SyntaxError` that names neither the endpoint nor the cause. Instead we check\n * the content type first and fail with a STABLE, low-cardinality message\n * (content type + status) — never the raw body — so these group as a single\n * Sentry issue instead of fragmenting on every distinct HTML page.\n */\nexport async function claimPointsRequest(\n username: string | undefined,\n accessToken: string | undefined\n) {\n if (!username) {\n throw new Error(\"[SDK][Points][Claim] – username wasn't provided\");\n }\n\n if (!accessToken) {\n throw new Error(\"[SDK][Points][Claim] – access token wasn't found\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/points-claim\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n }\n );\n\n // Media types are case-insensitive; normalise once and reuse in every branch.\n const contentType = (response.headers.get(\"content-type\") ?? \"\")\n .split(\";\")[0]\n .trim()\n .toLowerCase();\n const body = await response.text();\n\n if (!response.ok) {\n if (response.status === 406) {\n try {\n return JSON.parse(body);\n } catch {\n return { message: body, code: response.status };\n }\n }\n // Only fold a short JSON error body into the message; an HTML gateway page\n // (e.g. 502/503) would otherwise fragment the Sentry group per distinct\n // page — the same problem the non-JSON guard below avoids for a 2xx body.\n const detail =\n body && contentType.includes(\"json\") ? `: ${body.slice(0, 200)}` : \"\";\n throw new Error(\n `[SDK][Points][Claim] – failed with status ${response.status}${detail}`\n );\n }\n\n if (!contentType.includes(\"json\")) {\n throw new Error(\n `[SDK][Points][Claim] – expected JSON but received \"${contentType || \"empty\"}\" response (status ${response.status})`\n );\n }\n\n try {\n return JSON.parse(body);\n } catch {\n throw new Error(\n `[SDK][Points][Claim] – malformed JSON response (status ${response.status})`\n );\n }\n}\n\nexport function useClaimPoints(\n username: string | undefined,\n accessToken: string | undefined,\n onSuccess?: () => void,\n onError?: Parameters[\"0\"][\"onError\"]\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n \"points-claimed\"\n );\n\n return useMutation({\n mutationFn: () => claimPointsRequest(username, accessToken),\n onError,\n onSuccess: () => {\n recordActivity();\n\n getQueryClient().setQueryData(\n getPointsQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n return {\n ...data,\n points: (\n parseFloat(data.points) + parseFloat(data.uPoints)\n ).toFixed(3),\n uPoints: \"0\",\n };\n }\n );\n\n onSuccess?.();\n },\n });\n}\n","// A token only counts at the start of the query or after whitespace, matching\n// the search API's parser. Unanchored, these matched inside ordinary words:\n// \"prototype:v2\" read as type=v2 and the API rejected it as an invalid type,\n// \"subcategory:hive-1\" filtered on category=hive-1 with a stray \"sub\" left as\n// required text. The boundary is captured rather than looked behind so it can\n// be put back when the token is stripped, keeping the neighbouring words apart\n// (a lookbehind would also be fine here, but this stays portable).\nconst author_re = /(^|\\s)author:([^\\s]+)/g;\nconst type_re = /(^|\\s)type:([^\\s]+)/g;\nconst category_re = /(^|\\s)category:([^\\s]+)/g;\nconst tag_re = /(^|\\s)tag:([^\\s]+)/g;\n\n// Index of the token value in a match; group 1 is the boundary.\nconst VALUE = 2;\n\nexport enum SearchType {\n ALL = \"\",\n POST = \"post\",\n COMMENT = \"comment\"\n}\n\nexport const MAX_SEARCH_TAGS = 5;\n\n// The search API applies both caps itself (see query_validator); mirrored here\n// so the client can refuse instead of turning a 400 into an empty result list.\nexport const MAX_SEARCH_QUERY_LENGTH = 100;\n\n/**\n * Both parsers match a token with /author:([^\\s]+)/, so a value containing a\n * space stops filtering at the space and the remainder silently becomes\n * required free text. Keep the first word only, which is what the API would\n * have filtered on anyway.\n */\nfunction firstToken(value: string): string {\n return value.trim().split(/\\s+/)[0] ?? \"\";\n}\n\n/**\n * Hive account names are lowercase and the API filters authors with an exact\n * term query, so \"@Demo\" has to become \"demo\" or it matches nothing.\n */\nexport function normalizeSearchAuthor(value: string): string {\n return firstToken(value).replace(/^@+/, \"\").toLowerCase();\n}\n\nexport function normalizeSearchCategory(value: string): string {\n // Leading \"#\" goes for the same reason it goes on tags: a category is matched\n // by an exact term query, and users write categories the way they write tags.\n return firstToken(value).replace(/^#+/, \"\").toLowerCase();\n}\n\n/**\n * Accepts what a user actually types (\"travel, photography\", \"#travel travel\")\n * and returns exact-match ready tags, deduped in first-seen order.\n */\nexport function normalizeSearchTags(value: string): string[] {\n const seen = new Set();\n\n return value\n .split(/[\\s,]+/)\n .map((tag) => tag.replace(/^#+/, \"\").toLowerCase())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n}\n\nexport interface SearchQueryParts {\n search?: string;\n author?: string;\n type?: SearchType;\n category?: string;\n /** Raw user input (\"a, b\") or an already split list. */\n tags?: string | string[];\n}\n\nexport interface BuiltSearchQuery {\n /** The `q` value to put in the URL. Round-trips through `SearchQuery`. */\n q: string;\n search: string;\n author: string;\n type: SearchType;\n category: string;\n tags: string[];\n}\n\n/**\n * Assembles the single `q` string that both this app and the search API parse\n * back into filters. Returns the normalized parts too, because the caller has\n * to validate the tag count and the total length before navigating.\n */\nexport function buildSearchQuery({\n search = \"\",\n author = \"\",\n type = SearchType.ALL,\n category = \"\",\n tags = []\n}: SearchQueryParts): BuiltSearchQuery {\n const normalizedSearch = search.trim().replace(/\\s+/g, \" \");\n const normalizedAuthor = normalizeSearchAuthor(author);\n const normalizedCategory = normalizeSearchCategory(category);\n const normalizedTags = normalizeSearchTags(Array.isArray(tags) ? tags.join(\",\") : tags);\n\n const parts = [normalizedSearch];\n\n if (normalizedAuthor) {\n parts.push(`author:${normalizedAuthor}`);\n }\n\n if (type) {\n parts.push(`type:${type}`);\n }\n\n if (normalizedCategory) {\n parts.push(`category:${normalizedCategory}`);\n }\n\n if (normalizedTags.length > 0) {\n // No space after the commas: a tag token ends at the first space, so\n // anything past one stops filtering and becomes required free text.\n parts.push(`tag:${normalizedTags.join(\",\")}`);\n }\n\n return {\n // Dropping the empty free text here is what keeps a filter-only query from\n // starting with a space.\n q: parts.filter((part) => part !== \"\").join(\" \"),\n search: normalizedSearch,\n author: normalizedAuthor,\n type,\n category: normalizedCategory,\n tags: normalizedTags\n };\n}\n\nexport class SearchQuery {\n public query: string = \"\";\n public search: string = \"\";\n public author: string = \"\";\n public type: SearchType = SearchType.ALL;\n public category: string = \"\";\n public tags: string[] = [];\n\n constructor(_query: string) {\n this.query = _query;\n this.search = _query;\n\n this.grabAuthor();\n this.grabType();\n this.grabCategory();\n this.grabTags();\n this.grabSearch();\n }\n\n private grab = (re: RegExp): string => {\n // @ts-ignore\n const matches = [...this.query.matchAll(re)];\n if (matches.length > 0) {\n return matches[0][VALUE].trim();\n }\n\n return \"\";\n };\n\n private grabAuthor = () => {\n this.author = this.grab(author_re);\n };\n\n private grabType = () => {\n const type = this.grab(type_re) as SearchType;\n if (Object.values(SearchType).includes(type)) {\n this.type = type as SearchType;\n }\n };\n\n private grabCategory = () => {\n this.category = this.grab(category_re);\n };\n\n private grabTags = () => {\n // Every tag: token counts, not just the first one. The API joins all of its\n // own tag: matches before splitting on commas, so reading only the first\n // token here under-reports the tags a query really applies and let a query\n // past the MAX_SEARCH_TAGS guard that the API then rejects with a 400.\n // A trailing comma (\"tag:a,\") must not yield an empty tag either - it would\n // be shown back as a phantom tag and counted against the same cap.\n const seen = new Set();\n\n this.tags = [...this.query.matchAll(tag_re)]\n .flatMap((match) => match[VALUE].split(\",\"))\n .map((tag) => tag.trim())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n };\n\n private grabSearch = () => {\n [author_re, type_re, category_re, tag_re].forEach((r) => {\n // Put the captured boundary back, or removing a mid-query token would\n // run the words either side of it together.\n this.search = this.search.replace(r, \"$1\");\n });\n\n while (this.search.indexOf(\" \") !== -1) {\n this.search = this.search.replace(\" \", \" \");\n }\n\n this.search = this.search.trim();\n };\n}\n","export type RequestError = Error & { status?: number; data?: unknown };\n\n/**\n * Reads a response body and, when the status is not OK, throws an error that\n * keeps both the status and the parsed body.\n *\n * The search backend answers a malformed query with an explanation the user can\n * act on (\"Maximum 5 tags!\", \"Query string too long! ...\", \"Parsed query is\n * empty!\"). Dropping the body leaves callers with a bare status: they can\n * neither tell the user what to change nor tell a deterministic rejection from\n * a transient failure worth retrying.\n *\n * Module-internal on purpose - it is not part of the published SDK surface.\n */\nexport async function parseJsonResponse(\n response: Response,\n /**\n * Shape guard for a SUCCESSFUL body. JSON.parse happily accepts `null`,\n * `\"maintenance\"` and `{\"error\": \"...\"}`, none of which are the payload the\n * caller asked for, and all of which would otherwise be returned as `T` and\n * cached as valid data. Callers that have a known shape pass a guard so an\n * unexpected 200 fails here instead of at the first property access.\n */\n isValid?: (data: unknown) => boolean\n): Promise {\n const parseBody = async (): Promise => {\n // Read the body ONCE. Calling json() and then falling back to text() on the\n // same response cannot work: json() consumes the stream, so the fallback\n // always threw and the raw body of a non-JSON failure (an HTML error page\n // from a proxy) was silently lost.\n let raw: string;\n try {\n raw = await response.text();\n } catch {\n return undefined;\n }\n\n if (raw === \"\") {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n // Raw text is a diagnostic, not a payload. On a failed response it is\n // what the caller shows or logs, but on a 2xx returning it would hand\n // back a string typed as the parsed body: callers reading `.results`\n // would see undefined and report an empty result set, and the\n // controversial/rising pager would throw on `resp.results.length`. An\n // unparseable success is a failure, so let it fall through to the throw\n // below rather than caching a string as a SearchResponse.\n return response.ok ? undefined : raw;\n }\n };\n\n const data = await parseBody();\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n if (data === undefined || (isValid !== undefined && !isValid(data))) {\n throw new Error(\"Response body was empty, invalid JSON, or not the expected shape\");\n }\n\n return data as T;\n}\n\n/**\n * The contract every /search-api consumer relies on: an object carrying a\n * `results` array. Enough to keep a stray 200 from reaching `resp.results.length`.\n */\nexport function isSearchResponse(data: unknown): boolean {\n return (\n typeof data === \"object\" &&\n data !== null &&\n Array.isArray((data as { results?: unknown }).results)\n );\n}\n","import { isServer } from \"@tanstack/react-query\";\nimport type { RequestError } from \"./parse-json-response\";\n\n/**\n * The app-wide default the browser QueryClient uses. Restated because supplying\n * a `retry` callback replaces React Query's own budget rather than adding to it.\n *\n * The 0 on the server is load-bearing: server QueryClients set `retry: false`\n * globally, and these queries are prefetched during SSR, so a flat 3 would\n * resurrect SSR retries against a single-region backend.\n */\nconst MAX_RETRIES = isServer ? 0 : 3;\n\n/**\n * Shared retry rule for every /search-api call.\n *\n * A 4xx is the backend rejecting the query itself (too many tags, over the\n * length cap, nothing left to search once the filters are parsed out).\n * Repeating it repeats the same answer, so the only effect is four requests\n * over several seconds before the UI can say what to change.\n *\n * 408 and 429 are the exceptions: they describe when the request arrived rather\n * than what it contained, and backing off is what resolves them. A client-side\n * timeout aborts the fetch and carries no status at all, so it falls through to\n * the normal budget like any other transport failure.\n */\nexport function searchRetryPolicy(failureCount: number, error: Error): boolean {\n const { status } = error as RequestError;\n const isTransient = status === 408 || status === 429;\n\n if (status !== undefined && status >= 400 && status < 500 && !isTransient) {\n return false;\n }\n\n return failureCount < MAX_RETRIES;\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function searchQueryOptions(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number\n) {\n return queryOptions({\n queryKey: QueryKeys.search.results(q, sort, hideLow, since, scroll_id, votes),\n queryFn: async ({ signal }) => {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (scroll_id) data.scroll_id = scroll_id;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n retry: searchRetryPolicy,\n });\n}\n\ntype PageParam = {\n sid: string | undefined;\n hasNextPage: boolean;\n};\n\nexport function getControversialRisingInfiniteQueryOptions(\n what: string,\n tag: string,\n enabled = true\n) {\n return infiniteQueryOptions<\n SearchResponse,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.search.controversialRising(what, tag),\n initialPageParam: { sid: undefined, hasNextPage: true } as PageParam,\n\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n if (!pageParam.hasNextPage) {\n return {\n hits: 0,\n took: 0,\n results: [],\n };\n }\n\n let sinceDate: Date | undefined;\n const now = new Date();\n\n switch (tag) {\n case \"today\":\n sinceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case \"week\":\n sinceDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case \"month\":\n sinceDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case \"year\":\n sinceDate = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);\n break;\n default:\n sinceDate = undefined;\n }\n\n const q = \"* type:post\";\n const sort = what === \"rising\" ? \"children\" : what;\n const since = sinceDate ? sinceDate.toISOString().split(\".\")[0] : undefined;\n const hideLow = \"0\";\n const votes = tag === \"today\" ? 50 : 200;\n\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (pageParam.sid) data.scroll_id = pageParam.sid;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n\n getNextPageParam: (resp: SearchResponse): PageParam => {\n return {\n sid: resp?.scroll_id,\n hasNextPage: resp.results.length > 0,\n };\n },\n\n enabled,\n retry: searchRetryPolicy,\n });\n}\n","import { CONFIG, INTERNAL_API_TIMEOUT_MS, getBoundFetch, withTimeoutSignal } from \"@/modules/core\";\nimport { SearchResponse } from \"./types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"./parse-json-response\";\n\nexport async function search(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number,\n signal?: AbortSignal\n): Promise {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) {\n data.since = since;\n }\n if (scroll_id) {\n data.scroll_id = scroll_id;\n }\n if (votes) {\n data.votes = votes;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function similar(\n params: {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n tags?: string[];\n since?: string;\n },\n signal?: AbortSignal,\n timeoutMs: number = INTERNAL_API_TIMEOUT_MS\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/similar\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(params),\n signal: withTimeoutSignal(timeoutMs, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function searchPath(q: string, signal?: AbortSignal): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n const data = await parseJsonResponse(response, Array.isArray);\n return data?.length > 0 ? data : [q];\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { similar } from \"../requests\";\nimport { SearchResult } from \"../types/search-response\";\n\n// Without a recency window the backend ranks across the entire historical\n// index and surfaces years-old posts. Constrain suggestions to the last\n// ~6 months so related posts stay fresh (it also bounds the backend's\n// more_like_this candidate set, which is what keeps it fast).\nconst SIMILAR_ENTRIES_SINCE_MS = 182 * 24 * 60 * 60 * 1000;\n\n// How many results the suggestions strip renders at most.\nconst SIMILAR_ENTRIES_TARGET = 4;\n\n// more_like_this only extracts a handful of significant terms, so an excerpt is\n// enough signal and keeps the request payload small.\nconst SIMILAR_ENTRIES_BODY_LIMIT = 3000;\n\n// On the server the prefetch sits on the entry-page render path, and the search\n// backend is single-region (EU) — so anything slower than this stalls SSR for a\n// non-essential \"related posts\" strip. Keep the SSR cap short and let the strip\n// fall back to a client fetch (only that render misses the in-HTML strip; it's\n// ISR-cached anyway). Do NOT raise this — 2s is the SSR budget.\nconst SIMILAR_ENTRIES_SSR_TIMEOUT_MS = 2000;\n\n// The client fetch doesn't block paint, so it previously had no cap and fell\n// through to the SDK's generic INTERNAL_API_TIMEOUT_MS (10s; CF's worker further\n// truncates at ~8s). Combined with React Query's default client retry (3×), a\n// /search-api/similar outage turned this best-effort strip into a multi-second\n// post-onload tail (observed as a ~29s \"fully loaded\" in GTmetrix). Cap the\n// client call short and disable retry (below) so a degraded backend just hides\n// the strip quickly instead of churning.\nconst SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS = 4000;\n\n// The strip is hidden below this many results. A lone suggestion looks\n// sparse. Exported so the web component shares one threshold (filter == render).\nexport const SIMILAR_ENTRIES_MIN_RENDER = 2;\n\n// Strip markdown image/link/URL noise before truncating, so more_like_this\n// keys on prose terms instead of image-CDN domains and file hashes (which\n// rarely match the index's sanitized body and just waste the term budget).\nfunction toMltExcerpt(body: string, limit: number): string {\n return body\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, \" \") // markdown images\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\") // markdown links -> keep link text\n .replace(/<[^>]+>/g, \" \") // html tags\n .replace(/https?:\\/\\/\\S+/g, \" \") // bare URLs\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, limit);\n}\n\n// Compact deterministic fingerprint (djb2) of the MLT inputs. Folded into the\n// cache key so an edited post (title/tags/body changed) refetches instead of\n// serving stale recommendations under the same author/permlink. Deterministic\n// so the SSR prefetch and the client compute the same key from the same entry.\nfunction fingerprint(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\ninterface Entry {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n json_metadata?: {\n // Hive's json_metadata is user-controlled and untyped on-chain: `tags` is\n // usually a string[] but some posts store it as a bare string (or other\n // junk). Typed as unknown on purpose so callers can't assume an array —\n // it's narrowed with a runtime guard below.\n tags?: unknown;\n };\n}\n\nexport function getSimilarEntriesQueryOptions(entry: Entry) {\n const title = entry.title ?? \"\";\n // `?? []` only guards null/undefined; a non-array tags value (e.g. a bare\n // string from json_metadata) slips through and crashes `.filter` — which\n // took down the entry-page SSR prefetch (Sentry ECENCY-NEXT-1FMA). Guard on\n // Array.isArray so only real arrays reach the filter.\n const rawTags = entry.json_metadata?.tags;\n const tags = (Array.isArray(rawTags) ? rawTags : []).filter(\n (tag): tag is string => typeof tag === \"string\" && tag !== \"\"\n );\n const body = toMltExcerpt(entry.body ?? \"\", SIMILAR_ENTRIES_BODY_LIMIT);\n const contentKey = fingerprint(`${title}|${tags.join(\",\")}|${body}`);\n\n return queryOptions({\n queryKey: QueryKeys.search.similarEntries(entry.author, entry.permlink, contentKey),\n queryFn: async ({ signal }) => {\n // Naive `YYYY-MM-DDTHH:mm:ss` (no `Z`) matches the search-api date\n // contract used elsewhere; a <14h skew on a 182-day boundary is immaterial.\n const since = new Date(Date.now() - SIMILAR_ENTRIES_SINCE_MS).toISOString().slice(0, 19);\n\n // Elasticsearch more_like_this recommendations: content-based \"related\n // posts\" ranked by shared significant terms in title/body/tags, scoped\n // to the recency window. The backend already excludes the source author,\n // spam and nsfw.\n const response = await similar(\n {\n author: entry.author,\n permlink: entry.permlink,\n title,\n body,\n tags,\n since\n },\n signal,\n // Short cap server-side so a slow cross-region call can't stall SSR;\n // a slightly longer (but still bounded) cap client-side so a degraded\n // backend can't hang the request on the SDK's generic 8s timeout.\n typeof window === \"undefined\"\n ? SIMILAR_ENTRIES_SSR_TIMEOUT_MS\n : SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS\n );\n\n // Light client guard mirroring the render contract: never the source\n // post, never nsfw, one per author, capped at the render target.\n const collected: SearchResult[] = [];\n const seenAuthors = new Set();\n for (const r of response.results) {\n if (collected.length >= SIMILAR_ENTRIES_TARGET) break;\n if (r.permlink === entry.permlink) continue;\n if ((r.tags ?? []).indexOf(\"nsfw\") !== -1) continue;\n if (seenAuthors.has(r.author)) continue;\n seenAuthors.add(r.author);\n collected.push(r);\n }\n\n return collected;\n },\n // The entry page server-prefetches this query and dehydrates it. Without a\n // staleTime, React Query treats the hydrated data as stale and refetches on\n // mount — issuing a *redundant* /search-api/similar XHR right after\n // hydration even though SSR already provided the data. That refetch was the\n // long post-onload tail in the waterfall (held open to the client timeout),\n // inflating GTmetrix \"Fully Loaded\" while the visible strip was already\n // populated from SSR. A staleTime makes the hydrated data fresh so the\n // client skips that refetch; if SSR delivered nothing (empty cache), the\n // client still fetches. Recommendations are stable per post (and the cache\n // key is content-fingerprinted), so 5 min matches the page's ISR cadence.\n staleTime: 5 * 60 * 1000,\n // Best-effort suggestions strip — never retry-storm a degraded backend.\n // The web QueryClient only disables retries on the server; the browser\n // client keeps React Query's default retry (3×) — and other SDK consumers\n // (e.g. mobile) may too — so pin retry:false here to cover every caller.\n retry: false\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { getProfiles } from \"@/modules/bridge\";\nimport { Profile } from \"@/modules/accounts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountQueryOptions(q: string, limit = 5) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.account(normalized, limit),\n queryFn: async (): Promise => {\n const usernames = (await callRPC(\"condenser_api.lookup_accounts\", [\n normalized,\n limit,\n ])) as string[];\n\n if (usernames.length === 0) {\n return [];\n }\n\n return getProfiles(usernames);\n },\n enabled: !!normalized,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { TrendingTag } from \"@/modules/posts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchTopicsQueryOptions(q: string, limit = 10) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.topics(normalized, limit),\n queryFn: async (): Promise => {\n const tags = (await callRPC(\"condenser_api.get_trending_tags\", [\n normalized,\n limit + 1,\n ])) as TrendingTag[];\n\n return tags\n .map((t) => t.name)\n .filter((name) => name !== \"\" && !name.startsWith(\"hive-\"))\n .slice(0, limit);\n },\n enabled: !!normalized,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function getSearchApiInfiniteQueryOptions(\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.search.api(q, sort, hideLow, since, votes, includeNsfw),\n queryFn: async ({ pageParam, signal }: { pageParam: string | undefined; signal: AbortSignal }) => {\n interface SearchApiPayload {\n q: string;\n sort: string;\n hide_low: boolean;\n since?: string;\n scroll_id?: string;\n votes?: number;\n include_nsfw?: number;\n }\n\n const payload: SearchApiPayload = { q, sort, hide_low: hideLow };\n\n if (since) {\n payload.since = since;\n }\n if (pageParam) {\n payload.scroll_id = pageParam;\n }\n if (votes !== undefined) {\n payload.votes = votes;\n }\n if (includeNsfw) {\n payload.include_nsfw = 1;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(payload),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body), instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: SearchResponse) => lastPage?.scroll_id,\n enabled: !!q,\n retry: searchRetryPolicy,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\n\nexport function getSearchPathQueryOptions(q: string) {\n return queryOptions({\n queryKey: [\"search\", \"path\", q],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n });\n\n if (!response.ok) {\n throw new Error(`Search path failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data?.length > 0) {\n return data as string[];\n }\n\n return [q];\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { SupportSettings } from \"../types\";\n\n/**\n * Fetch the active user's Support Ecency settings. The username is resolved\n * server-side from the validated `code`, so only the code is sent. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached. Exported for\n * unit testing; the query options below wrap it.\n */\nexport async function getSupportSettingsRequest(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to fetch support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Query options for the active user's Support Ecency settings\n * (beneficiary percent + curation holdback percent). Zeros mean both\n * opt-ins are off; the backend returns zeros when no row exists.\n */\nexport function getSupportSettingsQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n const name = username?.replace(\"@\", \"\");\n\n return queryOptions({\n queryKey: QueryKeys.support.settings(name),\n queryFn: () => {\n if (!code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return getSupportSettingsRequest(code);\n },\n enabled: !!name && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { QueryClient, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { SupportSettings, UpdateSupportSettingsPayload } from \"../types\";\n\n/**\n * POST a Support Ecency settings update. Both percents are integers within\n * 0..100 (0 = off); the gateway rejects anything else with a 400. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached so the caller\n * can surface the plain validation message. Exported for unit testing; the\n * hook below wraps it.\n */\nexport async function updateSupportSettingsRequest(\n code: string,\n payload: UpdateSupportSettingsPayload\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings-update\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n code,\n beneficiary_percent: payload.beneficiary_percent,\n curation_percent: payload.curation_percent,\n }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to update support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Sync the settings cache after a successful update: seed the fresh server\n * response and invalidate so any active observers refetch. Exported for unit\n * testing; `useUpdateSupportSettings` calls it from `onSuccess`.\n */\nexport function applySupportSettingsUpdate(\n queryClient: QueryClient,\n username: string,\n data: SupportSettings\n) {\n queryClient.setQueryData(QueryKeys.support.settings(username), data);\n return queryClient.invalidateQueries({ queryKey: QueryKeys.support.settings(username) });\n}\n\n/**\n * Update the user's voluntary Support Ecency opt-ins (post beneficiary percent\n * and curation holdback percent). On success the settings query is refreshed\n * so every surface (publish dialog, settings card, injection hooks) sees the\n * new preference.\n */\nexport function useUpdateSupportSettings(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"support\", \"settings-update\", name],\n mutationFn: async (payload: UpdateSupportSettingsPayload) => {\n if (!name || !code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return updateSupportSettingsRequest(code, payload);\n },\n onSuccess(data) {\n if (name) {\n applySupportSettingsUpdate(queryClient, name, data);\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getBoostPlusPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boost-plus-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\n/**\n * RC top-up pricing: duration -> Points cost tiers, served by the ePoints\n * backend via the private API. Reuses the {@link PromotePrice} shape\n * ({ duration, price }).\n */\nexport function getRcDelegationPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation prices: ${response.status}`);\n }\n\n return (await response.json()) as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface RcDelegationActive {\n user: string;\n expires: Date;\n}\n\n/**\n * The active (ON) RC top-up for a user, if any. Lets the UI block a duplicate\n * purchase up front (only one RC top-up is allowed at a time). Returns null\n * when the user has no active top-up.\n */\nexport function getRcDelegationActiveQueryOptions(username: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-active\", username],\n queryFn: async (): Promise => {\n if (!accessToken || !username) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-active\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken, username })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation active: ${response.status}`);\n }\n\n const responseData = (await response.json()) as { user?: string; expires?: string };\n\n return responseData && responseData.expires && responseData.user\n ? { user: responseData.user, expires: new Date(responseData.expires) }\n : null;\n },\n enabled: !!username && !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getPromotePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"promote-price\"],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/promote-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch promote prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface BoostPlusAccountPrice {\n account: string;\n expires: Date;\n}\n\nexport function getBoostPlusAccountPricesQueryOptions(account: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-accounts\", account],\n queryFn: async (): Promise => {\n if (!accessToken || !account) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boosted-plus-account\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken, account }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus account prices: ${response.status}`);\n }\n\n const responseData = await response.json() as {\n expires: string;\n account: string;\n };\n\n return responseData\n ? {\n account: responseData.account,\n expires: new Date(responseData.expires)\n }\n : null;\n },\n enabled: !!account && !!accessToken\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildBoostPlusOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface BoostPlusPayload {\n account: string;\n duration: number;\n}\n\nexport function useBoostPlus(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"boost-plus\"],\n username,\n ({ account, duration }) => [\n buildBoostPlusOp(username!, account, duration)\n ],\n async (_data, { account }) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.promotions.boostPlusAccounts(account),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildRcDelegationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface RcDelegationPayload {\n duration: number;\n}\n\n/**\n * Buys a short-term, RC-only delegation (RC top-up) for the active user, paid\n * with Ecency Points. Mirrors {@link useBoostPlus} but is RC-only (no Hive\n * Power / voting power transferred). Invalidates the user's account + RC caches\n * so the new RC shows up once the relay delegation lands.\n */\nexport function useRcDelegation(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"rc-delegation\"],\n username,\n ({ duration }) => [buildRcDelegationOp(username!, duration)],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!),\n [\"promotions\", \"rc-delegation-active\", username]\n ]);\n }\n },\n auth,\n \"active\",\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { HsTokenRenewResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nexport async function hsTokenRenew(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/auth-api/hs-token-refresh\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n const error = new Error(`Failed to refresh token: ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n const data = (await response.json()) as HsTokenRenewResponse;\n return data;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"../../core\";\n\nconst BAD_ACTORS_URL =\n \"https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt\";\n\nexport function getBadActorsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.badActors.list(),\n queryFn: async ({ signal }) => {\n const response = await fetch(BAD_ACTORS_URL, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bad actors list: ${response.status}`);\n }\n\n const text = await response.text();\n return new Set(text.split(\"\\n\").filter(Boolean));\n },\n staleTime: 24 * 60 * 60 * 1000,\n /**\n * Deliberately left unbounded, including under SSR.\n *\n * `Infinity` is the one value that schedules no gc timer at all —\n * `isValidTimeout` in query-core rejects non-finite timeouts, so\n * `scheduleGc` is a no-op. With no timer there is no GC root, and on a\n * per-request client the entry dies with the request that made it.\n * Replacing it with a finite window would *create* a timer that retains the\n * Query and, through it, that request's whole QueryCache — strictly worse\n * here than leaving it alone.\n */\n gcTime: Infinity\n });\n}\n","export const POLLS_PROTOCOL_VERSION = 1.1;\n\nexport enum PollPreferredInterpretation {\n NUMBER_OF_VOTES = \"number_of_votes\",\n TOKENS = \"tokens\",\n}\n\nexport interface PollChoiceVotes {\n total_votes: number;\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied: number | null;\n}\n\nexport interface PollChoice {\n choice_num: number;\n choice_text: string;\n votes?: PollChoiceVotes;\n}\n\nexport interface PollVoter {\n name: string;\n choices: number[];\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied?: number;\n}\n\nexport interface PollStats {\n total_voting_accounts_num: number;\n total_hive_hp?: number;\n total_hive_proxied_hp?: number;\n total_hive_hp_incl_proxied: number | null;\n}\n\nexport interface Poll {\n author: string;\n permlink: string;\n question: string;\n poll_choices: PollChoice[];\n poll_voters?: PollVoter[];\n poll_stats?: PollStats;\n poll_trx_id: string;\n status: string;\n end_time: string;\n preferred_interpretation: PollPreferredInterpretation | string;\n max_choices_voted: number;\n filter_account_age_days: number;\n protocol_version: number;\n created: string;\n post_title: string;\n post_body: string;\n parent_permlink: string;\n tags: string[];\n image: unknown[];\n token?: string | null;\n community_membership?: string[];\n allow_vote_changes?: boolean;\n ui_hide_res_until_voted?: boolean;\n platform?: string;\n}\n\nexport function mapMetaChoicesToPollChoices(metaChoices: string[]): PollChoice[] {\n if (!metaChoices) {\n return [];\n }\n\n return metaChoices.map((choice, index) => ({\n choice_num: index + 1,\n choice_text: choice,\n votes: {\n total_votes: 0,\n hive_hp: 0,\n hive_proxied_hp: 0,\n hive_hp_incl_proxied: 0,\n },\n }));\n}\n","import { isServer, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys, SERVER_GC_TIME_MS } from \"@/modules/core\";\nimport { getBoundFetch } from \"@/modules/core/utils\";\nimport type { Poll, PollChoice, PollVoter, PollStats } from \"../types\";\n\nfunction normalizePoll(raw: Record): Poll {\n const pollChoices = (raw.poll_choices as Record[] | undefined) ?? [];\n const pollVoters = (raw.poll_voters as Record[] | undefined) ?? [];\n const rawStats = raw.poll_stats as Record | undefined;\n\n const choices: PollChoice[] = pollChoices.map((c) => {\n const votes = c.votes as Record | undefined;\n return {\n choice_num: (c.choice_num as number) ?? 0,\n choice_text: (c.choice_text as string) ?? \"\",\n votes: votes\n ? {\n total_votes: (votes.total_votes as number) ?? 0,\n hive_hp: votes.hive_hp as number | undefined,\n hive_proxied_hp: votes.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: (votes.hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined,\n };\n });\n\n const voters: PollVoter[] = pollVoters.map((v) => ({\n name: (v.name as string) ?? \"\",\n choices: (v.choices as number[]) ?? [],\n hive_hp: v.hive_hp as number | undefined,\n hive_proxied_hp: v.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: v.hive_hp_incl_proxied as number | undefined,\n }));\n\n const stats: PollStats | undefined = rawStats\n ? {\n total_voting_accounts_num: (rawStats.total_voting_accounts_num as number) ?? 0,\n total_hive_hp: rawStats.total_hive_hp as number | undefined,\n total_hive_proxied_hp: rawStats.total_hive_proxied_hp as number | undefined,\n total_hive_hp_incl_proxied: (rawStats.total_hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined;\n\n return {\n author: (raw.author as string) ?? \"\",\n permlink: (raw.permlink as string) ?? \"\",\n question: (raw.question as string) ?? \"\",\n poll_choices: choices,\n poll_voters: voters,\n poll_stats: stats,\n poll_trx_id: (raw.poll_trx_id as string) ?? \"\",\n status: (raw.status as string) ?? \"\",\n end_time: (raw.end_time as string) ?? \"\",\n preferred_interpretation: (raw.preferred_interpretation as string) ?? \"number_of_votes\",\n max_choices_voted: (raw.max_choices_voted as number) ?? 1,\n filter_account_age_days: (raw.filter_account_age_days as number) ?? 0,\n protocol_version: (raw.protocol_version as number) ?? 0,\n created: (raw.created as string) ?? \"\",\n post_title: (raw.post_title as string) ?? \"\",\n post_body: (raw.post_body as string) ?? \"\",\n parent_permlink: (raw.parent_permlink as string) ?? \"\",\n tags: (raw.tags as string[]) ?? [],\n image: (raw.image as unknown[]) ?? [],\n token: raw.token as string | null | undefined,\n community_membership: raw.community_membership as string[] | undefined,\n allow_vote_changes: raw.allow_vote_changes as boolean | undefined,\n ui_hide_res_until_voted: (raw.ui_hide_res_until_voted as boolean | undefined) ?? false,\n platform: raw.platform as string | undefined,\n };\n}\n\nexport function getPollQueryOptions(\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.polls.details(author ?? \"\", permlink ?? \"\"),\n enabled: !!author && !!permlink,\n // Long in a browser, where a poll is cheap to keep and often revisited;\n // bounded during SSR, where holding it also holds that request's whole\n // cache. See SERVER_GC_TIME_MS.\n gcTime: isServer ? SERVER_GC_TIME_MS : 30 * 60 * 1000,\n queryFn: async (): Promise => {\n if (!author || !permlink) {\n throw new Error(\"[SDK][Polls] – missing author or permlink\");\n }\n\n const fetchApi = getBoundFetch();\n const url = `${CONFIG.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(author)}&permlink=eq.${encodeURIComponent(permlink)}`;\n const response = await fetchApi(url);\n\n if (!response.ok) {\n throw new Error(`[SDK][Polls] – fetch failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data) || !data[0]) {\n throw new Error(\"[SDK][Polls] – no poll data found\");\n }\n\n return normalizePoll(data[0]);\n },\n });\n}\n","import { QueryKeys, useBroadcastMutation } from \"@/modules/core\";\nimport type { BroadcastMode, AuthContextV2 } from \"@/modules/core\";\n\nexport interface PollVotePayload {\n pollTrxId: string;\n choices: number[];\n}\n\nexport function usePollVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n QueryKeys.polls.vote(),\n username ?? \"\",\n ({ pollTrxId, choices }) => {\n if (!username) {\n throw new Error(\"[SDK][Polls] Cannot vote without an authenticated username\");\n }\n return [\n [\n \"custom_json\",\n {\n id: \"polls\",\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify({\n poll: pollTrxId,\n action: \"vote\",\n choices,\n }),\n },\n ],\n ];\n },\n undefined,\n auth,\n \"posting\",\n { broadcastMode: broadcastMode ?? \"async\" }\n );\n}\n"]} \ No newline at end of file diff --git a/packages/sdk/dist/node/index.cjs b/packages/sdk/dist/node/index.cjs index fd71c99479..7899e35518 100644 --- a/packages/sdk/dist/node/index.cjs +++ b/packages/sdk/dist/node/index.cjs @@ -1,4 +1,4 @@ -'use strict';var reactQuery=require('@tanstack/react-query'),utils_js=require('@noble/hashes/utils.js'),legacy_js=require('@noble/hashes/legacy.js'),en=require('bs58'),secp256k1_js=require('@noble/curves/secp256k1.js'),sha2_js=require('@noble/hashes/sha2.js'),aes_js=require('@noble/ciphers/aes.js'),Un=require('hivesigner');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var en__default=/*#__PURE__*/_interopDefault(en);var Un__default=/*#__PURE__*/_interopDefault(Un);var bo=Object.defineProperty;var ft=(e,t)=>{for(var r in t)bo(e,r,{get:t[r],enumerable:true});};var mt=new ArrayBuffer(0),gt=null,yt=null;function vo(){return gt||(typeof TextEncoder<"u"?gt=new TextEncoder:gt={encode(e){let t=[];for(let r=0;r>6,128|n&63);else if(n>=55296&&n<=56319&&r+1>18,128|n>>12&63,128|n>>6&63,128|n&63);}else t.push(224|n>>12,128|n>>6&63,128|n&63);}return new Uint8Array(t)}}),gt}function Gr(){return yt||(typeof TextDecoder<"u"?yt=new TextDecoder:yt={decode(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r="";for(let n=0;n>10),56320+(o&1023)));}return r}}),yt}var I=class e{static LITTLE_ENDIAN=true;static BIG_ENDIAN=false;static DEFAULT_CAPACITY=16;static DEFAULT_ENDIAN=e.BIG_ENDIAN;buffer;view;offset;markedOffset;limit;littleEndian;constructor(t=e.DEFAULT_CAPACITY,r=e.DEFAULT_ENDIAN){this.buffer=t===0?mt:new ArrayBuffer(t),this.view=t===0?new DataView(mt):new DataView(this.buffer),this.offset=0,this.markedOffset=-1,this.limit=t,this.littleEndian=r;}static allocate(t,r){return new e(t,r)}static concat(t,r){let n=0;for(let a=0;a0&&(n.buffer=t.buffer,n.offset=t.byteOffset,n.limit=t.byteOffset+t.byteLength,n.view=new DataView(t.buffer));else if(t instanceof ArrayBuffer)n=new e(0,r),t.byteLength>0&&(n.buffer=t,n.offset=0,n.limit=t.byteLength,n.view=t.byteLength>0?new DataView(t):new DataView(mt));else if(Array.isArray(t))n=new e(t.length,r),n.limit=t.length,new Uint8Array(n.buffer).set(t);else throw TypeError("Illegal buffer");return n}writeBytes(t,r){return this.append(t,r)}writeInt8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setInt8(r,t),n&&(this.offset+=1),this}writeByte(t,r){return this.writeInt8(t,r)}writeUint8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setUint8(r,t),n&&(this.offset+=1),this}writeUInt8(t,r){return this.writeUint8(t,r)}readUint8(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint8(t);return r&&(this.offset+=1),n}readUInt8(t){return this.readUint8(t)}writeInt16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setInt16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeShort(t,r){return this.writeInt16(t,r)}writeUint16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setUint16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeUInt16(t,r){return this.writeUint16(t,r)}writeInt32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setInt32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeInt(t,r){return this.writeInt32(t,r)}writeUint32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setUint32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeUInt32(t,r){return this.writeUint32(t,r)}readUint32(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint32(t,this.littleEndian);return r&&(this.offset+=4),n}readUInt32=this.readUint32;append(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i;return t instanceof e?(i=new Uint8Array(t.buffer,t.offset,t.limit-t.offset),t.offset+=i.length):t instanceof Uint8Array?i=t:t instanceof ArrayBuffer?i=new Uint8Array(t):i=new Uint8Array(t),i.length<=0?this:(r+i.length>this.buffer.byteLength&&this.resize(r+i.length),new Uint8Array(this.buffer).set(i,r),n&&(this.offset+=i.length),this)}clone(t){let r=new e(0,this.littleEndian);return t?(r.buffer=new ArrayBuffer(this.buffer.byteLength),new Uint8Array(r.buffer).set(new Uint8Array(this.buffer)),r.view=new DataView(r.buffer)):(r.buffer=this.buffer,r.view=this.view),r.offset=this.offset,r.markedOffset=this.markedOffset,r.limit=this.limit,r}copy(t,r){if(t===void 0&&(t=this.offset),r===void 0&&(r=this.limit),t===r)return new e(0,this.littleEndian);let n=r-t,i=new e(n,this.littleEndian);return i.offset=0,i.limit=n,new Uint8Array(i.buffer).set(new Uint8Array(this.buffer).subarray(t,r),0),i}copyTo(t,r,n,i){let o=typeof r>"u",s=typeof n>"u";r=o?t.offset:r,n=s?this.offset:n,i=i===void 0?this.limit:i;let a=i-n;return a===0?t:(t.ensureCapacity(r+a),new Uint8Array(t.buffer).set(new Uint8Array(this.buffer).subarray(n,i),r),s&&(this.offset+=a),o&&(t.offset+=a),this)}ensureCapacity(t){let r=this.buffer.byteLength;return rt?r:t):this}flip(){return this.limit=this.offset,this.offset=0,this}resize(t){if(this.buffer.byteLength"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigInt64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeLong(t,r){return this.writeInt64(t,r)}readInt64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigInt64(t,this.littleEndian);return r&&(this.offset+=8),n}readLong(t){return this.readInt64(t)}writeUint64(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigUint64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeUInt64(t,r){return this.writeUint64(t,r)}readUint64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigUint64(t,this.littleEndian);return r&&(this.offset+=8),n}readUInt64(t){return this.readUint64(t)}toBuffer(t){let r=this.offset,n=this.limit;return !t&&r===0&&n===this.buffer.byteLength?this.buffer:r===n?mt:this.buffer.slice(r,n)}toArrayBuffer(t){return this.toBuffer(t)}writeVarint32(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=this.calculateVarint32(t);for(r+i>this.buffer.byteLength&&this.resize(r+i),t>>>=0;t>=128;)this.view.setUint8(r++,t&127|128),t>>>=7;return this.view.setUint8(r++,t),n?(this.offset=r,this):i}readVarint32(t){let r=typeof t>"u";typeof t>"u"&&(t=this.offset);let n=0,i=0,o;do o=this.view.getUint8(t++),n<5&&(i|=(o&127)<<7*n),++n;while((o&128)!==0);return i|=0,r?(this.offset=t,i):{value:i,length:n}}calculateVarint32(t){return t=t>>>0,t<128?1:t<16384?2:t<1<<21?3:t<1<<28?4:5}writeVString(t,r){let n=typeof r>"u",i=n?this.offset:r,o=vo().encode(t),s=o.length,a=this.calculateVarint32(s);return i+a+s>this.buffer.byteLength&&this.resize(i+a+s),this.writeVarint32(s,i),i+=a,new Uint8Array(this.buffer).set(o,i),i+=s,n?(this.offset=i,this):i-(r||0)}readVString(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=t,i=this.readVarint32(t),o=i.value,s=i.length;t+=s;let a=Gr().decode(new Uint8Array(this.buffer,t,o));return t+=o,r?(this.offset=t,a):{string:a,length:t-n}}readUTF8String(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=Gr().decode(new Uint8Array(this.buffer,r,t));return n?(this.offset+=t,i):{string:i,length:t}}};var x={nodes:["https://api.hive.blog","https://api.deathwing.me","https://api.openhive.network","https://techcoderx.com","https://api.syncad.com","https://rpc.mahdiyari.info"],restNodes:["https://api.hive.blog","https://rpc.mahdiyari.info","https://api.syncad.com","https://hiveapi.actifit.io","https://api.c0ff33a.uk"],restNodesByApi:{hivesense:["https://api.hive.blog","https://api.syncad.com"]},userAgent:"ecency-sdk",chain_id:"beeab0de00000000000000000000000000000000000000000000000000000000",address_prefix:"STM",timeout:5e3,broadcastTimeout:15e3,retry:5,resilience:{adaptiveTimeout:true,adaptiveTimeoutFloorMs:2e3,adaptiveTimeoutFactor:4,hedge:false,hedgeDelayFloorMs:750,hedgeDelayFactor:2,hedgeBucketCapacity:10,hedgeRefillPerSuccess:.1,totalBudgetFactor:2}},Lt=e=>Array.isArray(e)?[...new Set(e.filter(t=>typeof t=="string").map(t=>t.trim().replace(/\/+$/,"")).filter(t=>t.length>0&&/^https?:\/\/.+/.test(t)))]:[],$t=e=>{let t=Lt(e);t.length&&(x.nodes=t);},Wt=e=>{let t=Lt(e);t.length&&(x.restNodes=t);},Gt=e=>{if(!e||typeof e!="object")return;let t={...x.restNodesByApi};for(let[r,n]of Object.entries(e)){let i=Lt(n);i.length?t[r]=i:delete t[r];}x.restNodesByApi=t;},zt=e=>{if(typeof e!="string")return;let t=e.trim();!t||/[\u0000-\u001f\u007f]/.test(t)||(x.userAgent=t);},Jt=e=>{if(!e||typeof e!="object")return;let t=x.resilience,r=i=>typeof i=="boolean",n=i=>typeof i=="number"&&Number.isFinite(i)&&i>0;r(e.adaptiveTimeout)&&(t.adaptiveTimeout=e.adaptiveTimeout),n(e.adaptiveTimeoutFloorMs)&&(t.adaptiveTimeoutFloorMs=Math.max(e.adaptiveTimeoutFloorMs,2e3)),n(e.adaptiveTimeoutFactor)&&(t.adaptiveTimeoutFactor=e.adaptiveTimeoutFactor),r(e.hedge)&&(t.hedge=e.hedge),n(e.hedgeDelayFloorMs)&&(t.hedgeDelayFloorMs=e.hedgeDelayFloorMs),n(e.hedgeDelayFactor)&&(t.hedgeDelayFactor=e.hedgeDelayFactor),n(e.hedgeBucketCapacity)&&(t.hedgeBucketCapacity=e.hedgeBucketCapacity),n(e.hedgeRefillPerSuccess)&&(t.hedgeRefillPerSuccess=Math.min(e.hedgeRefillPerSuccess,1)),n(e.totalBudgetFactor)&&(t.totalBudgetFactor=Math.max(e.totalBudgetFactor,1));};var Ae=class e{data;recovery;compressed;constructor(t,r,n){this.data=t,this.recovery=r,this.compressed=n??true;}static from(t){if(typeof t=="string"){let r=utils_js.hexToBytes(t),n=parseInt(utils_js.bytesToHex(r.subarray(0,1)),16)-31,i=true;n<0&&(i=false,n=n+4);let o=r.subarray(1);return new e(o,n,i)}else throw new Error("Expected string for data")}toBuffer(){let t=new Uint8Array(65).fill(0);return this.compressed?t[0]=this.recovery+31&255:t[0]=this.recovery+27&255,t.set(this.data,1),t}customToString(){return utils_js.bytesToHex(this.toBuffer())}toString(){return this.customToString()}getPublicKey(t){if(t instanceof Uint8Array&&t.length!==32||typeof t=="string"&&t.length!==64)throw new Error("Expected a valid sha256 hash as message");typeof t=="string"&&(t=utils_js.hexToBytes(t));let r=secp256k1_js.secp256k1.Signature.fromBytes(this.data,"compact"),n=new secp256k1_js.secp256k1.Signature(r.r,r.s,this.recovery);return new J(n.recoverPublicKey(t).toBytes())}};var J=class e{key;prefix;constructor(t,r){this.key=t,this.prefix=r??x.address_prefix;}static fromString(t){let r=x.address_prefix;if(typeof t!="string"||t.length<=r.length)throw new Error("Invalid public key");let n=t.slice(0,r.length);if(n!==r)throw new Error(`Public key must start with ${r}`);let i;try{i=en__default.default.decode(t.slice(r.length));}catch{throw new Error("Invalid public key encoding")}if(i.length!==37)throw new Error("Invalid public key length");let o=i.subarray(0,33),s=i.subarray(33,37),a=legacy_js.ripemd160(o).subarray(0,4);if(!Po(s,a))throw new Error("Public key checksum mismatch");try{secp256k1_js.secp256k1.Point.fromBytes(o);}catch{throw new Error("Invalid public key")}return new e(o,n)}static from(t){return t instanceof e?t:e.fromString(t)}verify(t,r){return typeof r=="string"&&(r=Ae.from(r)),secp256k1_js.secp256k1.verify(r.data,t,this.key,{prehash:false,format:"compact"})}toString(){return Ao(this.key,this.prefix)}toJSON(){return this.toString()}inspect(){return `PublicKey: ${this.toString()}`}},Ao=(e,t)=>{let r=legacy_js.ripemd160(e);return t+en__default.default.encode(new Uint8Array([...e,...r.subarray(0,4)]))},Po=(e,t)=>{if(e.byteLength!==t.byteLength)return false;for(let r=0;r{throw new Error("Void can not be serialized")},_=(e,t)=>{e.writeVString(t);},Eo=(e,t)=>{e.writeInt16(t);},rn=(e,t)=>{e.writeInt64(t);},tn=(e,t)=>{e.writeUint8(t);},ce=(e,t)=>{e.writeUint16(t);},Y=(e,t)=>{e.writeUint32(t);},nn=(e,t)=>{e.writeUint64(t);},ge=(e,t)=>{e.writeByte(t?1:0);},on=e=>(t,r)=>{let[n,i]=r;t.writeVarint32(n),e[n](t,i);},q=(e,t)=>{let r=ht.from(t),n=r.getPrecision();e.writeInt64(Math.round(r.amount*Math.pow(10,n))),e.writeUint8(n);for(let i=0;i<7;i++)e.writeUint8(r.symbol.charCodeAt(i)||0);},Pe=(e,t)=>{e.writeUint32(Math.floor(new Date(t+"Z").getTime()/1e3));},fe=(e,t)=>{t===null||typeof t=="string"&&t.slice(-39)==="1111111111111111111111111111111114T1Anm"?e.append(new Uint8Array(33).fill(0)):e.append(J.from(t).key);},sn=(e=null)=>(t,r)=>{r=wt.from(r);let n=r.buffer.length;if(e){if(n!==e)throw new Error(`Unable to serialize binary. Expected ${e} bytes, got ${n}`)}else t.writeVarint32(n);t.append(r.buffer);},an=sn(),Yt=(e,t)=>(r,n)=>{r.writeVarint32(n.length);for(let[i,o]of n)e(r,i),t(r,o);},V=e=>(t,r)=>{t.writeVarint32(r.length);for(let n of r)e(t,n);},ue=e=>(t,r)=>{for(let[n,i]of e)try{i(t,r[n]);}catch(o){throw o.message=`${n}: ${o.message}`,o}},ke=e=>(t,r)=>{r!==void 0?(t.writeByte(1),e(t,r)):t.writeByte(0);},W=ue([["weight_threshold",Y],["account_auths",Yt(_,ce)],["key_auths",Yt(fe,ce)]]),So=ue([["account",_],["weight",ce]]),Xt=ue([["base",q],["quote",q]]),ko=ue([["account_creation_fee",q],["maximum_block_size",Y],["hbd_interest_rate",ce]]),R=(e,t)=>{let r=ue(t);return (n,i)=>{n.writeVarint32(e),r(n,i);}},k={};k.account_create=R(T.account_create,[["fee",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_]]);k.account_create_with_delegation=R(T.account_create_with_delegation,[["fee",q],["delegation",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.account_update=R(T.account_update,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",fe],["json_metadata",_]]);k.account_witness_proxy=R(T.account_witness_proxy,[["account",_],["proxy",_]]);k.account_witness_vote=R(T.account_witness_vote,[["account",_],["witness",_],["approve",ge]]);k.cancel_transfer_from_savings=R(T.cancel_transfer_from_savings,[["from",_],["request_id",Y]]);k.change_recovery_account=R(T.change_recovery_account,[["account_to_recover",_],["new_recovery_account",_],["extensions",V(ie)]]);k.claim_account=R(T.claim_account,[["creator",_],["fee",q],["extensions",V(ie)]]);k.claim_reward_balance=R(T.claim_reward_balance,[["account",_],["reward_hive",q],["reward_hbd",q],["reward_vests",q]]);k.comment=R(T.comment,[["parent_author",_],["parent_permlink",_],["author",_],["permlink",_],["title",_],["body",_],["json_metadata",_]]);k.comment_options=R(T.comment_options,[["author",_],["permlink",_],["max_accepted_payout",q],["percent_hbd",ce],["allow_votes",ge],["allow_curation_rewards",ge],["extensions",V(on([ue([["beneficiaries",V(So)]])]))]]);k.convert=R(T.convert,[["owner",_],["requestid",Y],["amount",q]]);k.create_claimed_account=R(T.create_claimed_account,[["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.custom=R(T.custom,[["required_auths",V(_)],["id",ce],["data",an]]);k.custom_json=R(T.custom_json,[["required_auths",V(_)],["required_posting_auths",V(_)],["id",_],["json",_]]);k.decline_voting_rights=R(T.decline_voting_rights,[["account",_],["decline",ge]]);k.delegate_vesting_shares=R(T.delegate_vesting_shares,[["delegator",_],["delegatee",_],["vesting_shares",q]]);k.delete_comment=R(T.delete_comment,[["author",_],["permlink",_]]);k.escrow_approve=R(T.escrow_approve,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y],["approve",ge]]);k.escrow_dispute=R(T.escrow_dispute,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y]]);k.escrow_release=R(T.escrow_release,[["from",_],["to",_],["agent",_],["who",_],["receiver",_],["escrow_id",Y],["hbd_amount",q],["hive_amount",q]]);k.escrow_transfer=R(T.escrow_transfer,[["from",_],["to",_],["hbd_amount",q],["hive_amount",q],["escrow_id",Y],["agent",_],["fee",q],["json_meta",_],["ratification_deadline",Pe],["escrow_expiration",Pe]]);k.feed_publish=R(T.feed_publish,[["publisher",_],["exchange_rate",Xt]]);k.limit_order_cancel=R(T.limit_order_cancel,[["owner",_],["orderid",Y]]);k.limit_order_create=R(T.limit_order_create,[["owner",_],["orderid",Y],["amount_to_sell",q],["min_to_receive",q],["fill_or_kill",ge],["expiration",Pe]]);k.limit_order_create2=R(T.limit_order_create2,[["owner",_],["orderid",Y],["amount_to_sell",q],["exchange_rate",Xt],["fill_or_kill",ge],["expiration",Pe]]);k.recover_account=R(T.recover_account,[["account_to_recover",_],["new_owner_authority",W],["recent_owner_authority",W],["extensions",V(ie)]]);k.request_account_recovery=R(T.request_account_recovery,[["recovery_account",_],["account_to_recover",_],["new_owner_authority",W],["extensions",V(ie)]]);k.reset_account=R(T.reset_account,[["reset_account",_],["account_to_reset",_],["new_owner_authority",W]]);k.set_reset_account=R(T.set_reset_account,[["account",_],["current_reset_account",_],["reset_account",_]]);k.set_withdraw_vesting_route=R(T.set_withdraw_vesting_route,[["from_account",_],["to_account",_],["percent",ce],["auto_vest",ge]]);k.transfer=R(T.transfer,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_from_savings=R(T.transfer_from_savings,[["from",_],["request_id",Y],["to",_],["amount",q],["memo",_]]);k.transfer_to_savings=R(T.transfer_to_savings,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_to_vesting=R(T.transfer_to_vesting,[["from",_],["to",_],["amount",q]]);k.vote=R(T.vote,[["voter",_],["author",_],["permlink",_],["weight",Eo]]);k.withdraw_vesting=R(T.withdraw_vesting,[["account",_],["vesting_shares",q]]);k.witness_update=R(T.witness_update,[["owner",_],["url",_],["block_signing_key",fe],["props",ko],["fee",q]]);k.witness_set_properties=R(T.witness_set_properties,[["owner",_],["props",Yt(_,an)],["extensions",V(ie)]]);k.account_update2=R(T.account_update2,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",ke(fe)],["json_metadata",_],["posting_json_metadata",_],["extensions",V(ie)]]);k.create_proposal=R(T.create_proposal,[["creator",_],["receiver",_],["start_date",Pe],["end_date",Pe],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(ie)]]);k.update_proposal_votes=R(T.update_proposal_votes,[["voter",_],["proposal_ids",V(rn)],["approve",ge],["extensions",V(ie)]]);k.remove_proposal=R(T.remove_proposal,[["proposal_owner",_],["proposal_ids",V(rn)],["extensions",V(ie)]]);var Co=ue([["end_date",Pe]]);k.update_proposal=R(T.update_proposal,[["proposal_id",nn],["creator",_],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(on([ie,Co]))]]);k.collateralized_convert=R(T.collateralized_convert,[["owner",_],["requestid",Y],["amount",q]]);k.recurrent_transfer=R(T.recurrent_transfer,[["from",_],["to",_],["amount",q],["memo",_],["recurrence",ce],["executions",ce],["extensions",V(ue([["type",tn],["value",ue([["pair_id",tn]])]]))]]);var To=(e,t)=>{let r=k[t[0]];if(!r)throw new Error(`No serializer for operation: ${t[0]}`);try{r(e,t[1]);}catch(n){throw n.message=`${t[0]}: ${n.message}`,n}},Ro=ue([["ref_block_num",ce],["ref_block_prefix",Y],["expiration",Pe],["operations",V(To)],["extensions",V(_)]]),Fo=ue([["from",fe],["to",fe],["nonce",nn],["check",Y],["encrypted",sn()]]),pe={Asset:q,Memo:Fo,Price:Xt,PublicKey:fe,String:_,Transaction:Ro,UInt16:ce,UInt32:Y};var Ye=e=>new Promise(t=>setTimeout(t,e));var qo=(()=>{try{return !(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof process<"u"&&process.versions!=null&&process.versions.node!=null}catch{return false}})();function ln(){return qo?{"User-Agent":x.userAgent}:{}}var X=class extends Error{name="RPCError";data;code;stack=void 0;constructor(t){super(t.message),this.code=t.code,"data"in t&&(this.data=t.data);}},Ce=class extends Error{node;rateLimitMs;isRateLimit;constructor(t,r,n={}){super(r),this.node=t,this.rateLimitMs=n.rateLimitMs??0,this.isRateLimit=n.isRateLimit??false;}};function dn(e){if(!e)return 0;let t=Number(e);if(Number.isFinite(t))return t>0?t*1e3:0;let r=Date.parse(e);if(Number.isFinite(r)){let n=r-Date.now();return n>0?n:0}return 0}var Io=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],Do=["Failed to fetch","NetworkError when attempting to fetch","Load failed","fetch failed"];function Ko(e){if(!e)return "";let t=[String(e.name||""),String(e.message||""),String(e.code||"")],r=e.cause;for(let n=0;r&&n<5;n++)t.push(String(r.code||""),String(r.message||"")),r=r.cause;return t.join(" ")}function Bo(e){if(!e)return false;if(e instanceof Ce)return true;if(e instanceof X)return false;let t=Ko(e);return !!(Io.some(r=>t.includes(r))||Do.some(r=>t.includes(r))||e instanceof SyntaxError||/Unexpected token|JSON\.parse|Unexpected end of JSON/i.test(t))}function Zt(e,t){return !!(e===-32603||e<=-32e3&&e>=-32099||e===-32601||e===-32602&&/unable to parse|endpoint data|internal/i.test(t))}function fn(e){let t=e.indexOf(".");return t>0?e.slice(0,t):e}var Mo=1e4,No=6e4,Qo=12e4,cn=2,un=6e4,pn=12e4,Ho=30,Xe=.3,er=3,Ze=5*6e4,mn=6e4,gn=1e3,yn=2e3,bt=class{health=new Map;getOrCreate(t){let r=this.health.get(t);return r||(r={consecutiveFailures:0,lastFailureTime:0,rateLimitedUntil:0,rateLimitStreak:0,lastRateLimitAt:0,apiFailures:new Map,headBlock:0,headBlockUpdatedAt:0,ewmaLatencyMs:void 0,latencySampleCount:0,latencyUpdatedAt:0,lastProbeAt:Date.now(),apiLatency:new Map},this.health.set(t,r)),r}recordSuccess(t,r,n,i){let o=this.getOrCreate(t);if(o.consecutiveFailures=0,o.rateLimitStreak=0,r){let s=o.apiFailures.get(r);(!s||!(s.defective&&s.cooldownUntil>Date.now()))&&o.apiFailures.delete(r);}typeof n=="number"&&Number.isFinite(n)&&n>=0&&this.recordLatency(o,n,i??r);}recordSlowFailure(t,r,n){!Number.isFinite(r)||r=er&&i-o.updatedAt<=Ze?o.ewmaMs:void 0}return this.isLatencyUsable(n,i)?n.ewmaLatencyMs:void 0}recordCensoredLatency(t,r,n){!Number.isFinite(r)||r<50||this.recordLatency(this.getOrCreate(t),r,n);}recordLatency(t,r,n){let i=Date.now();if(t.latencyUpdatedAt>0&&i-t.latencyUpdatedAt>Ze&&(t.ewmaLatencyMs=void 0,t.latencySampleCount=0,t.apiLatency.clear()),t.ewmaLatencyMs=t.ewmaLatencyMs===void 0?r:Xe*r+(1-Xe)*t.ewmaLatencyMs,t.latencySampleCount++,t.latencyUpdatedAt=i,n!==void 0){let o=t.apiLatency.get(n);!o||i-o.updatedAt>Ze?t.apiLatency.set(n,{ewmaMs:r,sampleCount:1,updatedAt:i}):(o.ewmaMs=Xe*r+(1-Xe)*o.ewmaMs,o.sampleCount++,o.updatedAt=i);}}recordFailure(t,r){let n=this.getOrCreate(t);if(r){let i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};(o.cooldownUntil>0&&o.cooldownUntil<=i||o.lastFailureTime>0&&i-o.lastFailureTime>3e4)&&(o.count=0,o.cooldownUntil=0),o.count++,o.lastFailureTime=i,o.count>=cn&&(o.cooldownUntil=i+un),n.apiFailures.set(r,o);}else n.consecutiveFailures++,n.lastFailureTime=Date.now();}recordDefectiveResponse(t,r){let n=this.getOrCreate(t),i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};o.count=Math.max(o.count+1,cn),o.lastFailureTime=i,o.cooldownUntil=i+un,o.defective=true,n.apiFailures.set(r,o);}recordRateLimit(t,r){let n=this.getOrCreate(t),i=Date.now();n.rateLimitStreak>0&&i-n.lastRateLimitAt>Qo&&(n.rateLimitStreak=0);let o=typeof r=="number"&&Number.isFinite(r)&&r>0,s=o?r:Math.min(Mo*2**n.rateLimitStreak,No);o||n.rateLimitStreak++,n.lastRateLimitAt=i,n.rateLimitedUntil=o?i+s:Math.max(n.rateLimitedUntil,i+s),n.consecutiveFailures++,n.lastFailureTime=i;}recordHeadBlock(t,r){if(!r||!Number.isFinite(r))return;let n=this.getOrCreate(t);n.headBlock=r,n.headBlockUpdatedAt=Date.now();}consensusHeadBlock(){let t=Date.now(),r=[];for(let n of this.health.values())n.headBlock>0&&t-n.headBlockUpdatedAt<=pn&&r.push(n.headBlock);return r.length<2?0:(r.sort((n,i)=>n-i),r[Math.floor((r.length-1)/2)])}isNodeHealthy(t,r){let n=this.health.get(t);if(!n)return true;let i=Date.now();if(n.rateLimitedUntil>i||n.consecutiveFailures>=3&&i-n.lastFailureTime<3e4)return false;if(r){let s=n.apiFailures.get(r);if(s&&s.cooldownUntil>i)return false}let o=this.consensusHeadBlock();return !(o>0&&n.headBlock>0&&i-n.headBlockUpdatedAt<=pn&&o-n.headBlock>Ho)}getOrderedNodes(t,r){let n=[],i=[];for(let u of t)this.isNodeHealthy(u,r)?n.push(u):i.push(u);if(n.length<=1)return [...n,...i];let o=Date.now(),s=n.map((u,p)=>({node:u,i:p,score:this.scoreNode(u,o)})).sort((u,p)=>u.score-p.score||u.i-p.i).map(u=>u.node),a=this.pickReprobeCandidate(n,o);return a&&s[0]!==a?[a,...s.filter(u=>u!==a),...i]:[...s,...i]}isLatencyUsable(t,r){return !!t&&t.ewmaLatencyMs!==void 0&&t.latencySampleCount>=er&&r-t.latencyUpdatedAt<=Ze}scoreNode(t,r){let n=this.health.get(t);return this.isLatencyUsable(n,r)?n.ewmaLatencyMs:gn}pickReprobeCandidate(t,r){let n=r-mn,i,o=1/0;for(let s of t){let a=this.getOrCreate(s),u=Math.max(a.latencyUpdatedAt,a.lastProbeAt);u<=n&&u=1-1e-9?(this.tokens-=1,true):false}refill(){this.clamp(),this.tokens=Math.min(x.resilience.hedgeBucketCapacity,this.tokens+x.resilience.hedgeRefillPerSuccess);}clamp(){this.tokens>x.resilience.hedgeBucketCapacity&&(this.tokens=x.resilience.hedgeBucketCapacity);}get available(){return this.tokens}reset(t=x.resilience.hedgeBucketCapacity){this.tokens=t;}},rr=new tr;function vt(e,t,r,n,i){let o=x.resilience;if(!o.adaptiveTimeout||i)return n;let s=e.getUsableLatencyMs(t,r);return s===void 0?n:Math.ceil(Math.min(n,Math.max(o.adaptiveTimeoutFloorMs,o.adaptiveTimeoutFactor*s)))}function nr(e,t,r,n){r instanceof Ce?r.isRateLimit?e.recordRateLimit(t,r.rateLimitMs||void 0):e.recordFailure(t,n):r instanceof X?e.recordFailure(t,n):e.recordFailure(t);}function hn(e,t,r,n){if(!n||typeof n!="object"||!r.includes("get_dynamic_global_properties"))return;let i=n.head_block_number;typeof i=="number"&&e.recordHeadBlock(t,i);}function Uo(){if(typeof DOMException<"u")return new DOMException("The operation was aborted due to timeout","TimeoutError");let e=new Error("The operation was aborted due to timeout");return e.name="TimeoutError",e}function wn(e){if(e=Math.ceil(e),typeof AbortSignal.timeout=="function")return {signal:AbortSignal.timeout(e),cleanup:()=>{}};let t=new AbortController,r=setTimeout(()=>t.abort(Uo()),e);return {signal:t.signal,cleanup:()=>clearTimeout(r)}}function ir(e,t){if(!t)return {signal:e,cleanup:()=>{}};if(typeof AbortSignal.any=="function")return {signal:AbortSignal.any([e,t]),cleanup:()=>{}};let r=new AbortController;if(e.aborted)return r.abort(e.reason),{signal:r.signal,cleanup:()=>{}};if(t.aborted)return r.abort(t.reason),{signal:r.signal,cleanup:()=>{}};let n=()=>r.abort(e.reason),i=()=>r.abort(t.reason);e.addEventListener("abort",n,{once:true}),t.addEventListener("abort",i,{once:true});let o=()=>{e.removeEventListener("abort",n),t.removeEventListener("abort",i);};return {signal:r.signal,cleanup:o}}var et=async(e,t,r,n=x.timeout,i=false,o)=>{let s=Math.floor(Math.random()*1e8),a={jsonrpc:"2.0",method:t,params:r,id:s},{signal:u,cleanup:p}=wn(n),{signal:l,cleanup:f}=ir(u,o),m=()=>{p(),f();};try{let y=await fetch(e,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",...ln()},signal:l});if(y.status===429)throw new Ce(e,"HTTP 429 Rate Limited",{rateLimitMs:dn(y.headers.get("Retry-After")),isRateLimit:!0});if(y.status>=500&&y.status<600)throw new Ce(e,`HTTP ${y.status} from ${e}`);let h=await y.json();if(!h||typeof h.id>"u"||h.id!==s||h.jsonrpc!=="2.0")throw new Error("JSONRPC id mismatch");if("result"in h)return h.result;if("error"in h){let E=h.error;throw "message"in E&&"code"in E?new X(E):h.error}throw h}catch(y){if(y instanceof X||y instanceof Ce||o?.aborted)throw y;if(i)return et(e,t,r,n,false,o);throw y}finally{m();}};function _t(){return Ye(50+Math.random()*50)}function Vo(e){let{method:t,params:r,api:n,primary:i,hedgePool:o,callerTimeout:s,explicitTimeout:a,deadlineAt:u,externalSignal:p,onHedgeFired:l,validate:f}=e;return new Promise((m,y)=>{let h=false,E=0,O=false,A=false,P,L,U=0,B=[],Q=z=>{if(!h){h=true,L!==void 0&&(clearTimeout(L),L=void 0);for(let F of B)F.signal.aborted||F.abort();z();}},$=(z,F)=>{E++;let de=new AbortController;B.push(de);let Je=ir(de.signal,p),_o=vt(j,z,t,s,a),jt=Date.now();F||(U=jt),et(z,t,r,_o,false,Je.signal).then(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(f&&!f(ne)){if(j.recordDefectiveResponse(z,n),P=new Error(`[hive-tx] response validation failed for ${t} from ${z}`),!F&&!O){Q(()=>y(P));return}E===0&&Q(()=>y(P));return}j.recordSuccess(z,n,Date.now()-jt,t),hn(j,z,t,ne),F?A||j.recordCensoredLatency(i,Date.now()-U,t):O||rr.refill(),Q(()=>m(ne));}}).catch(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(p?.aborted){Q(()=>y(ne));return}if(ne instanceof X&&!Zt(ne.code,ne.message)){Q(()=>y(ne));return}if(nr(j,z,ne,n),j.recordSlowFailure(z,Date.now()-jt,t),P=ne,!F&&!O){Q(()=>y(ne));return}E===0&&Q(()=>y(P));}});};$(i,false);let Se=j.getUsableLatencyMs(i,t)??0,ze=vt(j,i,t,s,a),Vt=Math.min(Math.max(x.resilience.hedgeDelayFloorMs,x.resilience.hedgeDelayFactor*Se),.8*ze);L=setTimeout(()=>{if(L=void 0,h||p?.aborted||Date.now()>=u)return;let z=o.filter(de=>j.isNodeHealthy(de,n));if(z.length===0)return;let F=z[Math.floor(Math.random()*z.length)];rr.trySpend()&&(O=true,l(F),$(F,true));},Vt);})}var g=async(e,t=[],r,n=x.retry,i,o)=>{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let s=r!==void 0,a=r??x.timeout,u=fn(e),p=Date.now()+x.resilience.totalBudgetFactor*a,l=new Set,f;for(let m=0;m<=n&&!(m>0&&Date.now()>=p);m++){let y=j.getOrderedNodes(x.nodes,u),h=y.find(A=>!l.has(A));h||(l.clear(),h=y[0]),l.add(h);let E=[];if(x.resilience.hedge&&j.getUsableLatencyMs(h,e)!==void 0&&(E=y.filter(A=>!l.has(A)&&j.isNodeHealthy(A,u)).slice(0,3)),E.length>0)try{return await Vo({method:e,params:t,api:u,primary:h,hedgePool:E,callerTimeout:a,explicitTimeout:s,deadlineAt:p,externalSignal:i,onHedgeFired:A=>l.add(A),validate:o})}catch(A){if(A instanceof X&&!Zt(A.code,A.message)||i?.aborted)throw A;f=A,m{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let i=fn(e),o=new Set,s;for(let a=0;a!o.has(l));if(!p)break;if(o.add(p),n?.aborted)throw new Error("Aborted");try{let l=await et(p,e,t,r,!1,n);return j.recordSuccess(p,i),l}catch(l){if(l instanceof X||n?.aborted||(nr(j,p,l,i),s=l,!Bo(l)))throw l}}throw s},jo={balance:"/balance-api",hafah:"/hafah-api",hafbe:"/hafbe-api",hivemind:"/hivemind-api",hivesense:"/hivesense-api",reputation:"/reputation-api","nft-tracker":"/nft-tracker-api",hafsql:"/hafsql",status:"/status-api"};async function ee(e,t,r,n,i=x.retry,o){if(!Array.isArray(x.restNodes))throw new Error("config.restNodes is not an array");if(x.restNodes.length===0)throw new Error("config.restNodes is empty");let s=n!==void 0,a=n??x.timeout,u=Date.now()+x.resilience.totalBudgetFactor*a,p=`${e}:${t}`,l=x.restNodesByApi?.[e]?.length?x.restNodesByApi[e]:x.restNodes,f=new Set,m,y=false;for(let h=0;h<=i&&!(h>0&&Date.now()>=u);h++){let E=Oe.getOrderedNodes(l,e),O=E.find(F=>!f.has(F));O||(f.clear(),O=E[0]),f.add(O);let A=O+jo[e],P=t,L=r||{},U=new Set;Object.entries(L).forEach(([F,de])=>{P.includes(`{${F}}`)&&(P=P.replace(`{${F}}`,encodeURIComponent(String(de))),U.add(F));});let B=new URL(A+P);if(Object.entries(L).forEach(([F,de])=>{U.has(F)||(Array.isArray(de)?de.forEach(Je=>B.searchParams.append(F,String(Je))):B.searchParams.set(F,String(de)));}),o?.aborted)throw new Error("Aborted");y=false;let{signal:Q,cleanup:$}=wn(vt(Oe,O,p,a,s)),{signal:Se,cleanup:ze}=ir(Q,o),Vt=()=>{$(),ze();},z=Date.now();try{let F=await fetch(B.toString(),{signal:Se,headers:ln()});if(F.status===404)throw new Error("HTTP 404 - Hint: can happen on wrong params");if(F.status===429)throw Oe.recordRateLimit(O,dn(F.headers.get("Retry-After"))||void 0),y=!0,new Error(`HTTP 429 Rate Limited by ${O}`);if(F.status===503)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP 503 Service Unavailable from ${O}`);if(!F.ok)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP ${F.status} from ${O}`);return Oe.recordSuccess(O,e,Date.now()-z,p),F.json()}catch(F){if(F?.message?.includes("HTTP 404")||o?.aborted)throw F;y||Oe.recordFailure(O,e),Oe.recordSlowFailure(O,Date.now()-z,p),m=F,h{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an Array");if(r>x.nodes.length)throw new Error("quorum > config.nodes.length");let o=(u=>{let p=[...u];for(let l=p.length-1;l>0;l--){let f=Math.floor(Math.random()*(l+1));[p[l],p[f]]=[p[f],p[l]];}return p})(x.nodes),s=Math.min(r,o.length),a=[];for(;s>0&&o.length>0;){let u=o.splice(0,s),p=[],l=[];for(let m=0;ml.push(y)).catch(()=>{}));await Promise.all(p),a.push(...l);let f=Lo(a,r);if(f)return f;if(s=Math.min(r,o.length),s===0)throw new Error("No more nodes available.")}throw new Error("Couldn't reach quorum.")};function Lo(e,t){let r=new Map;for(let i of e){let o=JSON.stringify(i);r.has(o)||r.set(o,[]),r.get(o).push(i);}let n=Array.from(r.values()).find(i=>i.length>=t);return n?n[0]:null}var Wo=utils_js.hexToBytes(x.chain_id),Te=class e{transaction;expiration=6e4;txId;constructor(t){t?.transaction&&(t.transaction instanceof e?(this.transaction=t.transaction.transaction,this.expiration=t.transaction.expiration):this.transaction=t.transaction,this.transaction&&!Array.isArray(this.transaction.signatures)&&(this.transaction.signatures=[]),this.txId=this.digest().txId),t?.expiration&&(this.expiration=t.expiration);}async addOperation(t,r){this.transaction||await this.createTransaction(this.expiration),this.transaction.operations.push([t,r]);}sign(t){if(!this.transaction)throw new Error("First create a transaction by .addOperation()");if(this.transaction){let{digest:r,txId:n}=this.digest();Array.isArray(t)||(t=[t]);for(let i of t){let o=i.sign(r);this.transaction.signatures.push(o.customToString());}return this.txId=n,this.transaction}else throw new Error("No transaction to sign")}async broadcast(t=false){if(!this.transaction)throw new Error("Attempted to broadcast an empty transaction. Add operations by .addOperation()");if(this.transaction.signatures.length===0)throw new Error("Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)");try{await Qe("condenser_api.broadcast_transaction",[this.transaction]);}catch(o){if(!(o instanceof X&&o.message.includes("Duplicate transaction check failed")))throw o}if(this.txId||(this.txId=this.digest().txId),!t)return {tx_id:this.txId,status:"unknown"};let r=60;await Ye(1e3);let n=await this.checkStatus(),i=1;for(;n?.status!=="within_irreversible_block"&&n?.status!=="expired_irreversible"&&n?.status!=="too_old"&&i{let r=await g("condenser_api.get_dynamic_global_properties",[]),n=utils_js.hexToBytes(r.head_block_id),i=Number(new Uint32Array(n.buffer,n.byteOffset+4,1)[0]),o=new Date(Date.now()+t).toISOString().slice(0,-5);this.transaction={expiration:o,extensions:[],operations:[],ref_block_num:r.head_block_number&65535,ref_block_prefix:i,signatures:[]};}};var On=new Uint8Array([128]),H=class e{key;constructor(t){this.key=t;try{secp256k1_js.secp256k1.getPublicKey(t);}catch{throw new Error("invalid private key")}}static from(t){return typeof t=="string"?e.fromString(t):new e(t)}static fromString(t){return new e(Yo(t).subarray(1))}static fromSeed(t){if(typeof t=="string")if(/^[0-9a-fA-F]+$/.test(t))t=utils_js.hexToBytes(t);else {let n=[];for(let i=0;i>6,128|o&63);else if(o>=55296&&o<=56319&&i+1>18,128|o>>12&63,128|o>>6&63,128|o&63);}else n.push(224|o>>12,128|o>>6&63,128|o&63);}t=new Uint8Array(n);}return new e(sha2_js.sha256(t))}static fromLogin(t,r,n="active"){let i=t+n+r;return e.fromSeed(i)}sign(t){let r=secp256k1_js.secp256k1.sign(t,this.key,{extraEntropy:true,format:"recovered",prehash:false}),n=parseInt(utils_js.bytesToHex(r.subarray(0,1)),16);return Ae.from((n+31).toString(16)+utils_js.bytesToHex(r.subarray(1)))}createPublic(t){return new J(secp256k1_js.secp256k1.getPublicKey(this.key),t)}toString(){return Jo(new Uint8Array([...On,...this.key]))}inspect(){let t=this.toString();return `PrivateKey: ${t.slice(0,6)}...${t.slice(-6)}`}getSharedSecret(t){let r=secp256k1_js.secp256k1.getSharedSecret(this.key,t.key);return sha2_js.sha512(r.subarray(1))}static randomKey(){return new e(secp256k1_js.secp256k1.keygen().secretKey)}},xn=e=>sha2_js.sha256(sha2_js.sha256(e)),Jo=e=>{let t=xn(e);return en__default.default.encode(new Uint8Array([...e,...t.slice(0,4)]))},Yo=e=>{let t=en__default.default.decode(e);if(!An(t.slice(0,1),On))throw new Error("Private key network id mismatch");let r=t.slice(-4),n=t.slice(0,-4),i=xn(n).slice(0,4);if(!An(r,i))throw new Error("Private key checksum mismatch");return n},An=(e,t)=>{if(e===t)return true;if(e.byteLength!==t.byteLength)return false;let r=e.byteLength,n=0;for(;nCn(e,t,n,r),kn=(e,t,r,n,i)=>Cn(e,t,r,n,i).message,Cn=(e,t,r,n,i)=>{let o=r,s=e.getSharedSecret(t),a=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);a.writeUint64(o),a.append(s),a.flip();let u=sha2_js.sha512(new Uint8Array(a.toBuffer())),p=u.subarray(32,48),l=u.subarray(0,32),f=sha2_js.sha256(u).subarray(0,4),m=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);m.append(f),m.flip();let y=m.readUint32();if(i!==void 0){if(y!==i)throw new Error("Invalid key");n=ts(n,l,p);}else n=rs(n,l,p);return {nonce:o,message:n,checksum:y}},ts=(e,t,r)=>{let n=e;return n=aes_js.cbc(t,r).decrypt(n),n},rs=(e,t,r)=>{let n=e;return n=aes_js.cbc(t,r).encrypt(n),n},sr=null,ns=()=>{if(sr===null){let r=secp256k1_js.secp256k1.utils.randomSecretKey();sr=r[0]<<8|r[1];}let e=BigInt(Date.now()),t=++sr%65536;return e=e<{let t=us(e,33);return new J(t)},os=e=>e.readUint64(),ss=e=>e.readUint32(),as=e=>{let t=e.readVarint32(),r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())},cs=e=>t=>{let r={},n=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);n.append(t),n.flip();for(let[i,o]of e)try{r[i]=o(n);}catch(s){throw s.message=`${i}: ${s.message}`,s}return r};function us(e,t){if(e){let r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())}else throw Error("No buffer found on first parameter")}var ps=cs([["from",Tn],["to",Tn],["nonce",os],["check",ss],["encrypted",as]]),Rn={Memo:ps};var qn=(e,t,r,n)=>{if(!r.startsWith("#"))return r;r=r.substring(1),Dn(),e=Kn(e),t=ls(t);let i=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);i.writeVString(r);let o=new Uint8Array(i.copy(0,i.offset).toBuffer()),{nonce:s,message:a,checksum:u}=Sn(e,t,o,n),p=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);pe.Memo(p,{check:u,encrypted:a,from:e.createPublic(),nonce:s,to:t}),p.flip();let l=new Uint8Array(p.toBuffer());return "#"+en__default.default.encode(l)},In=(e,t)=>{if(!t.startsWith("#"))return t;t=t.substring(1),Dn(),e=Kn(e);let r=Rn.Memo(en__default.default.decode(t)),{from:n,to:i,nonce:o,check:s,encrypted:a}=r,p=e.createPublic().toString()===new J(n.key).toString()?new J(i.key):new J(n.key);r=kn(e,p,o,a,s);let l=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return l.append(r),l.flip(),"#"+l.readVString()},Pt,Dn=()=>{if(Pt===void 0){let e;Pt=true;try{let t="5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw",n=qn(t,"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA","#memo\u7231");e=In(t,n);}finally{Pt=e==="#memo\u7231";}}if(Pt===false)throw new Error("This environment does not support encryption.")},Kn=e=>typeof e=="string"?H.fromString(e):e,ls=e=>typeof e=="string"?J.fromString(e):e,Bn={decode:In,encode:qn};var re={};ft(re,{buildWitnessSetProperties:()=>hs,makeBitMaskFilter:()=>gs,operations:()=>ms,validateUsername:()=>fs});var fs=e=>{let t="Account name should ";if(!e)return t+"not be empty.";let r=e.length;if(r<3)return t+"be longer.";if(r>16)return t+"be shorter.";/\./.test(e)&&(t="Each account segment should ");let n=e.split("."),i=n.length;for(let o=0;oe.reduce(ys,[BigInt(0),BigInt(0)]).map(t=>t!==BigInt(0)?t.toString():null),ys=([e,t],r)=>r<64?[e|BigInt(1)<{let r={extensions:[],owner:e,props:[]};for(let n of Object.keys(t)){if(t[n]===void 0)continue;let i;switch(n){case "key":case "new_signing_key":i=pe.PublicKey;break;case "account_subsidy_budget":case "account_subsidy_decay":case "maximum_block_size":i=pe.UInt32;break;case "hbd_interest_rate":i=pe.UInt16;break;case "url":i=pe.String;break;case "hbd_exchange_rate":i=pe.Price;break;case "account_creation_fee":i=pe.Asset;break;default:throw new Error(`Unknown witness prop: ${n}`)}r.props.push([n,ws(i,t[n])]);}return r.props.sort((n,i)=>n[0].localeCompare(i[0])),["witness_set_properties",r]},ws=(e,t)=>{let r=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return e(r,t),r.flip(),utils_js.bytesToHex(new Uint8Array(r.toBuffer()))};function tm(e){let t;if(typeof e=="string"){let r=[];for(let n=0;n>6,128|i&63);else if(i>=55296&&i<=56319&&n+1>18,128|i>>12&63,128|i>>6&63,128|i&63);}else r.push(224|i>>12,128|i>>6&63,128|i&63);}t=new Uint8Array(r);}else t=e;return sha2_js.sha256(t)}function Mn(e){try{return H.fromString(e),!0}catch{return false}}async function Z(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),Qe("condenser_api.broadcast_transaction_synchronous",[r.transaction])}async function Nn(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),r.broadcast(false)}var bs=432e3;function Qn(e,t){let r=Date.now()/1e3-t.last_update_time,n=Number(t.current_mana)+r*e/bs,i=Math.round(n/e*1e4);return !isFinite(i)||i<0?i=0:i>1e4&&(i=1e4),{current_mana:n,max_mana:e,percentage:i}}function vs(e){let t=parseFloat(e.vesting_shares),r=parseFloat(e.delegated_vesting_shares),n=parseFloat(e.received_vesting_shares),i=parseFloat(e.vesting_withdraw_rate),o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t-s-r+n}function ar(e){let t=vs(e)*1e6;return Qn(t,e.voting_manabar)}function Ot(e){return Qn(Number(e.max_rc),e.rc_manabar)}var Hn=(u=>(u.COMMON="common",u.INFO="info",u.INSUFFICIENT_RESOURCE_CREDITS="insufficient_resource_credits",u.MISSING_AUTHORITY="missing_authority",u.TOKEN_EXPIRED="token_expired",u.NETWORK="network",u.TIMEOUT="timeout",u.VALIDATION="validation",u))(Hn||{});function He(e){let t=e?.error_description?String(e.error_description):"",r=e?.message?String(e.message):"",n=e?.error?String(e.error):"",i=t||r||String(e||""),o=a=>!!(n&&a.test(n)||t&&a.test(t)||r&&a.test(r)||i&&a.test(i));if(o(/please wait to transact/i)||o(/insufficient rc/i)||o(/rc mana|rc account|resource credits/i))return {message:"Insufficient Resource Credits. Please wait or power up.",type:"insufficient_resource_credits",originalError:e};if(o(/you may only post once every/i))return {message:"Please wait before posting again (minimum 3 second interval between comments).",type:"common",originalError:e};if(o(/your current vote on this comment is identical/i))return {message:"You have already voted with the same weight.",type:"info",originalError:e};if(o(/must claim something/i))return {message:"You must claim rewards before performing this action.",type:"info",originalError:e};if(o(/cannot claim that much vests/i))return {message:"Cannot claim that amount. Please check your pending rewards.",type:"info",originalError:e};if(o(/cannot delete a comment with net positive/i))return {message:"Cannot delete a comment with positive votes.",type:"info",originalError:e};if(o(/children == 0/i))return {message:"Cannot delete a comment with replies.",type:"common",originalError:e};if(o(/comment_cashout/i))return {message:"Cannot modify a comment that has already been paid out.",type:"common",originalError:e};if(o(/votes evaluating for comment that is paid out is forbidden/i))return {message:"Cannot vote on posts that have already been paid out.",type:"common",originalError:e};if(o(/no (active|owner|posting|memo) key available/i))return {message:"Key not available. Please provide your key to sign this operation.",type:"missing_authority",originalError:e};if(o(/missing (required )?active authority/i))return {message:"Missing active authority. This operation requires your active key.",type:"missing_authority",originalError:e};if(o(/missing (required )?owner authority/i))return {message:"Missing owner authority. This operation requires your owner key.",type:"missing_authority",originalError:e};if(o(/missing (required )?posting authority/i))return {message:"Missing posting authority. Please check your login method.",type:"missing_authority",originalError:e};if(n==="invalid_grant"||n==="unauthorized_access"||o(/token expired/i)||o(/invalid token/i)||o(/\bunauthorized\b/i)||o(/\bforbidden\b/i))return {message:"Authentication token expired. Please log in again.",type:"token_expired",originalError:e};if(o(/has already reblogged/i)||o(/already reblogged this post/i))return {message:"You have already reblogged this post.",type:"info",originalError:e};if(o(/duplicate transaction/i))return {message:"This transaction has already been processed.",type:"info",originalError:e};if(o(/econnrefused/i)||o(/connection refused/i)||o(/failed to fetch/i)||o(/\bnetwork[-\s]?(request|error|timeout|unreachable|down|failed)\b/i))return {message:"Network error. Please check your connection and try again.",type:"network",originalError:e};if(o(/timeout/i)||o(/timed out/i))return {message:"Request timed out. Please try again.",type:"timeout",originalError:e};if(o(/account.*does not exist/i)||o(/account not found/i))return {message:"Account not found. Please check the username.",type:"validation",originalError:e};if(o(/invalid memo key/i))return {message:"Invalid memo key. Cannot encrypt message.",type:"validation",originalError:e};if(o(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i))return {message:"Insufficient funds for this transaction.",type:"validation",originalError:e};if(o(/\b(invalid|validation)\b/i))return {message:(e?.message||i).substring(0,150)||"Validation error occurred",type:"validation",originalError:e};if(e?.error_description&&typeof e.error_description=="string")return {message:e.error_description.substring(0,150),type:"common",originalError:e};if(e?.message&&typeof e.message=="string")return {message:e.message.substring(0,150),type:"common",originalError:e};let s;return typeof e=="object"&&e!==null?e.error_description?s=String(e.error_description):e.code?s=`Error code: ${e.code}`:i&&i!=="[object Object]"?s=i.substring(0,150):s="Unknown error occurred":s=i.substring(0,150)||"Unknown error occurred",{message:s,type:"common",originalError:e}}function As(e){let t=He(e);return [t.message,t.type]}function ye(e){let{type:t}=He(e);return t==="missing_authority"||t==="token_expired"}function Ps(e){let{type:t}=He(e);return t==="insufficient_resource_credits"}function Os(e){let{type:t}=He(e);return t==="info"}function xs(e){let{type:t}=He(e);return t==="network"||t==="timeout"}async function he(e,t,r,n,i="posting",o,s,a="async"){let u=n?.adapter;switch(e){case "key":{if(!u)throw new Error("No adapter provided for key-based auth");let p=o;if(p===void 0)switch(i){case "owner":if(u.getOwnerKey)p=await u.getOwnerKey(t);else throw new Error("Owner key not supported by adapter. Owner operations (like account recovery) require master password login or manual key entry.");break;case "active":u.getActiveKey&&(p=await u.getActiveKey(t));break;case "memo":if(u.getMemoKey)p=await u.getMemoKey(t);else throw new Error("Memo key not supported by adapter. Use memo encryption methods instead.");break;default:p=await u.getPostingKey(t);break}if(!p)throw new Error(`No ${i} key available for ${t}`);let l=H.fromString(p);return a==="async"?await Nn(r,l):await Z(r,l)}case "hiveauth":{if(!u?.broadcastWithHiveAuth)throw new Error("HiveAuth not supported by adapter");return await u.broadcastWithHiveAuth(t,r,i)}case "hivesigner":{if(!u)throw new Error("No adapter provided for HiveSigner auth");if(i!=="posting"){if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`HiveSigner access token cannot sign ${i} operations. No platform broadcast available.`)}let p=s!==void 0?s:await u.getAccessToken(t);if(p)try{return (await new Un__default.default.Client({accessToken:p}).broadcast(r)).result}catch(l){if(u.broadcastWithHiveSigner&&ye(l))return await u.broadcastWithHiveSigner(t,r,i);throw l}if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`No access token available for ${t}`)}case "keychain":{if(!u?.broadcastWithKeychain)throw new Error("Keychain not supported by adapter");return await u.broadcastWithKeychain(t,r,i)}case "custom":{if(!n?.broadcast)throw new Error("No custom broadcast function provided");return await n.broadcast(r,i)}default:throw new Error(`Unknown auth method: ${e}`)}}async function Ss(e,t,r,n="posting",i="async"){let o=r?.adapter;if(o?.getLoginType){let l=await o.getLoginType(e,n);if(l){let f=o.hasPostingAuthorization?await o.hasPostingAuthorization(e):false;if(n==="posting"&&f&&l==="key")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to key:",m);}if(n==="posting"&&f&&l==="keychain")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to keychain/snap:",m);}if(n==="posting"&&f&&l==="hiveauth")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to HiveAuth:",m);}try{return await he(l,e,t,r,n,void 0,void 0,i)}catch(m){if(ye(m)&&o.showAuthUpgradeUI&&(n==="posting"||n==="active")){let y=t.length>0?t[0][0]:"unknown",h=await o.showAuthUpgradeUI(n,y);if(!h)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(h,e,t,r,n,void 0,void 0,i)}throw m}}if(n==="posting")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(f){if(ye(f)&&o.showAuthUpgradeUI){let m=t.length>0?t[0][0]:"unknown",y=await o.showAuthUpgradeUI(n,m);if(!y)throw new Error(`No login type available for ${e}. Please log in again.`);return await he(y,e,t,r,n,void 0,void 0,i)}throw f}else if(n==="active"&&o.showAuthUpgradeUI){let f=t.length>0?t[0][0]:"unknown",m=await o.showAuthUpgradeUI(n,f);if(!m)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(m,e,t,r,n,void 0,void 0,i)}}let s=r?.fallbackChain??["key","hiveauth","hivesigner","keychain","custom"],a=new Map;for(let l of s)try{let f=!1,m="",y,h;switch(l){case "key":if(!o)f=!0,m="No adapter provided";else {let E;switch(n){case "owner":o.getOwnerKey&&(E=await o.getOwnerKey(e));break;case "active":o.getActiveKey&&(E=await o.getActiveKey(e));break;case "memo":o.getMemoKey&&(E=await o.getMemoKey(e));break;default:E=await o.getPostingKey(e);break}E?y=E:(f=!0,m=`No ${n} key available`);}break;case "hiveauth":o?.broadcastWithHiveAuth||(f=!0,m="HiveAuth not supported by adapter");break;case "hivesigner":if(!o)f=!0,m="No adapter provided";else {let E=await o.getAccessToken(e);E&&(h=E);}break;case "keychain":o?.broadcastWithKeychain||(f=!0,m="Keychain not supported by adapter");break;case "custom":r?.broadcast||(f=!0,m="No custom broadcast function provided");break}if(f){a.set(l,new Error(`Skipped: ${m}`));continue}return await he(l,e,t,r,n,y,h,i)}catch(f){if(a.set(l,f),!ye(f))throw f}if(!Array.from(a.values()).some(l=>!l.message.startsWith("Skipped:"))){let l=Array.from(a.entries()).map(([f,m])=>`${f}: ${m.message}`).join(", ");throw new Error(`[SDK][Broadcast] No auth methods attempted for ${e}. ${l}`)}let p=Array.from(a.entries()).map(([l,f])=>`${l}: ${f.message}`).join(", ");throw new Error(`[SDK][Broadcast] All auth methods failed for ${e}. Errors: ${p}`)}function v(e=[],t,r,n=()=>{},i,o="posting",s){let a=s?.broadcastMode??"async";return reactQuery.useMutation({onSuccess:n,onMutate:s?.onMutate,onError:s?.onError,onSettled:s?.onSettled,mutationKey:[...e,t],mutationFn:async u=>{if(!t)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let p=r(u);try{if(i?.enableFallback!==!1&&i?.adapter)return await Ss(t,p,i,o,a);if(i?.broadcast)return await i.broadcast(p,o);let l=i?.postingKey;if(l){if(o!=="posting")throw new Error(`[SDK][Broadcast] Legacy auth only supports posting authority, but '${o}' was requested. Use AuthContextV2 with an adapter for ${o} operations.`);let m=H.fromString(l);return await Z(p,m)}let f=i?.accessToken;if(f)return (await new Un__default.default.Client({accessToken:f}).broadcast(p)).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}catch(l){throw l instanceof X?new Error(l.message):l}}})}async function Vn(e,t,r,n){if(!e)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let i={id:t,required_auths:[],required_posting_auths:[e],json:JSON.stringify(r)};if(n?.broadcast)return n.broadcast([["custom_json",i]],"posting");let o=n?.postingKey;if(o){let a=H.fromString(o);return Z([["custom_json",i]],a)}let s=n?.accessToken;if(s)return (await new Un__default.default.Client({accessToken:s}).customJson([],[e],t,JSON.stringify(r))).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}var hm=4e3;function S(e,t,r){if(e?.invalidateQueries){if(t==="sync")return e.invalidateQueries(r);setTimeout(()=>e.invalidateQueries?.(r),4e3);}}function we(e,t){let r=AbortSignal.timeout(e);if(!t)return r;if(typeof AbortSignal.any=="function")return AbortSignal.any([t,r]);let n=new AbortController,i=()=>{let o=t.aborted?t.reason:r.reason;n.abort(o),t.removeEventListener("abort",i),r.removeEventListener("abort",i);};return t.aborted?n.abort(t.reason):r.aborted?n.abort(r.reason):(t.addEventListener("abort",i,{once:true}),r.addEventListener("abort",i,{once:true})),n.signal}var Re=(()=>{try{return process.env?.NODE_ENV==="development"}catch{return false}})(),Ts=()=>{try{return process.env?.VITE_HELIUS_API_KEY}catch{return}},_e=1e4,jn=120*1e3,xt,Rs;function Fs(){return xt?xt():Rs??=new reactQuery.QueryClient}var d={privateApiHost:"https://ecency.com",defaultObserver:"ecency",clientId:"ecency-sdk",imageHost:"https://i.ecency.com",get hiveNodes(){return x.nodes},heliusApiKey:Ts(),get queryClient(){return Fs()},set queryClient(e){xt=()=>e;},pollsApiHost:"https://poll.ecency.com",plausibleHost:"https://pl.ecency.com",dmcaAccounts:[],dmcaTags:[],dmcaPatterns:[],dmcaTagRegexes:[],dmcaPatternRegexes:[],_dmcaInitialized:false};exports.ConfigManager=void 0;(A=>{function e(P){d.queryClient=P;}A.setQueryClient=e;function t(P){xt=P;}A.setQueryClientResolver=t;function r(P){d.privateApiHost=P;}A.setPrivateApiHost=r;function n(P){d.clientId=P;}A.setClientId=n;function i(P){if(typeof P!="string"||P.trim()==="")throw new Error("setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; observer resolution would fall back to the post author while caching under an empty key.");d.defaultObserver=P;}A.setDefaultObserver=i;function o(){return d.privateApiHost?d.privateApiHost:typeof window<"u"&&window.location?.origin?window.location.origin:"https://ecency.com"}A.getValidatedBaseUrl=o;function s(P){d.pollsApiHost=P;}A.setPollsApiHost=s;function a(P){d.imageHost=P;}A.setImageHost=a;function u(P){$t(P);}A.setHiveNodes=u;function p(P){Wt(P);}A.setRestNodes=p;function l(P){Gt(P);}A.setRestNodesByApi=l;function f(P){zt(P);}A.setUserAgent=f;function m(P){Jt(P);}A.setResilience=m;function y(P){if(/(\([^)]*[*+{][^)]*\))[*+{]/.test(P))return {safe:false,reason:"nested quantifiers detected"};if(/\([^|)]*\|[^)]*\)[*+{]/.test(P))return {safe:false,reason:"alternation with quantifier (potential overlap)"};if(/\([^)]*[*+][^)]*\)[*+]/.test(P))return {safe:false,reason:"repeated quantifiers (catastrophic backtracking risk)"};if(/\.\*\.\*/.test(P)||/\.\+\.\+/.test(P))return {safe:false,reason:"multiple greedy quantifiers on wildcards"};let L=/\.?\{(\d+),(\d+)\}/g,U;for(;(U=L.exec(P))!==null;){let[,B,Q]=U;if(parseInt(Q,10)-parseInt(B,10)>1e3)return {safe:false,reason:`excessive range: {${B},${Q}}`}}return {safe:true}}function h(P){let L=["a".repeat(50)+"x","ab".repeat(50)+"x","x".repeat(100),"aaa".repeat(30)+"bbb".repeat(30)+"x"],U=5;for(let B of L){let Q=Date.now();try{P.test(B);let $=Date.now()-Q;if($>U)return {safe:!1,reason:`runtime test exceeded ${U}ms (took ${$}ms on input length ${B.length})`}}catch($){return {safe:false,reason:`runtime test threw error: ${$}`}}}return {safe:true}}function E(P,L=200){try{if(!P)return Re&&console.warn("[SDK] DMCA pattern rejected: empty pattern"),null;if(P.length>L)return Re&&console.warn(`[SDK] DMCA pattern rejected: length ${P.length} exceeds max ${L} - pattern: ${P.substring(0,50)}...`),null;let U=y(P);if(!U.safe)return Re&&console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${U.reason}) - pattern: ${P.substring(0,50)}...`),null;let B;try{B=new RegExp(P);}catch($){return Re&&console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${P.substring(0,50)}...`,$),null}let Q=h(B);return Q.safe?B:(Re&&console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${Q.reason}) - pattern: ${P.substring(0,50)}...`),null)}catch(U){return Re&&console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${P.substring(0,50)}...`,U),null}}function O(P={}){let L=$=>Array.isArray($)?$.filter(Se=>typeof Se=="string"):[],U=P||{},B={accounts:L(U.accounts),tags:L(U.tags),patterns:L(U.posts)};d.dmcaAccounts=B.accounts,d.dmcaTags=B.tags,d.dmcaPatterns=B.patterns,d.dmcaTagRegexes=B.tags.map($=>E($)).filter($=>$!==null),d.dmcaPatternRegexes=[];let Q=B.tags.length-d.dmcaTagRegexes.length;!d._dmcaInitialized&&Re&&(console.log("[SDK] DMCA configuration loaded:"),console.log(` - Accounts: ${B.accounts.length}`),console.log(` - Tag patterns: ${d.dmcaTagRegexes.length}/${B.tags.length} compiled (${Q} rejected)`),console.log(` - Post patterns: ${B.patterns.length} (using exact string matching)`),Q>0&&console.warn(`[SDK] ${Q} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`)),d._dmcaInitialized=true;}A.setDmcaLists=O;})(exports.ConfigManager||={});function Cm(){return new reactQuery.QueryClient({defaultOptions:{queries:{refetchOnWindowFocus:false,refetchOnMount:false}}})}var b=()=>d.queryClient;exports.EcencyQueriesManager=void 0;(s=>{function e(a){return b().getQueryData(a)}s.getQueryData=e;function t(a){return b().getQueryData(a)}s.getInfiniteQueryData=t;async function r(a){return await b().prefetchQuery(a),e(a.queryKey)}s.prefetchQuery=r;async function n(a){return await b().prefetchInfiniteQuery(a),t(a.queryKey)}s.prefetchInfiniteQuery=n;function i(a){return {prefetch:()=>r(a),getData:()=>e(a.queryKey),useClientQuery:()=>reactQuery.useQuery(a),fetchAndGet:()=>b().fetchQuery(a)}}s.generateClientServerQuery=i;function o(a){return {prefetch:()=>n(a),getData:()=>t(a.queryKey),useClientQuery:()=>reactQuery.useInfiniteQuery(a),fetchAndGet:()=>b().fetchInfiniteQuery(a)}}s.generateClientServerInfiniteQuery=o;})(exports.EcencyQueriesManager||={});function Rm(e){return btoa(JSON.stringify(e))}function Fm(e){let t=atob(e);if(t[0]==="{")return JSON.parse(t)}var Ln=(n=>(n.HIVE="HIVE",n.HBD="HBD",n.VESTS="VESTS",n))(Ln||{}),Et=(e=>(e["@@000000021"]="HIVE",e["@@000000013"]="HBD",e["@@000000037"]="VESTS",e))(Et||{});function C(e){if(typeof e=="string"){let t=e.split(" ");return {amount:parseFloat(t[0]),symbol:Ln[t[1]]}}else return {amount:parseFloat(e.amount.toString())/Math.pow(10,e.precision),symbol:Et[e.nai]}}var cr;function w(){if(!cr){if(typeof globalThis.fetch!="function")throw new Error("[Ecency][SDK] - global fetch is not available");cr=globalThis.fetch.bind(globalThis);}return cr}function $n(e){return typeof e=="string"?/^hive-\d+$/.test(e):false}function Bs(e){return e&&typeof e=="object"&&"data"in e&&"pagination"in e&&Array.isArray(e.data)}function oe(e,t){return Bs(e)?e:{data:Array.isArray(e)?e:[],pagination:{total:Array.isArray(e)?e.length:0,limit:t,offset:0,has_next:false}}}function Ue(e,t){return e/1e6*t}function Wn(e){return e===void 0?true:parseInt(e.split("-")[0],10)<1980}var Gn=60*1e3;function be(){return reactQuery.queryOptions({queryKey:c.core.dynamicProps(),refetchInterval:Gn,staleTime:Gn,queryFn:async({signal:e})=>{let[t,r,n,i,o]=await Promise.all([g("condenser_api.get_dynamic_global_properties",[],void 0,void 0,e),g("condenser_api.get_feed_history",[],void 0,void 0,e),g("condenser_api.get_chain_properties",[],void 0,void 0,e),g("condenser_api.get_reward_fund",["post"],void 0,void 0,e),g("database_api.get_hardfork_properties",{},void 0,void 0,e).catch(()=>({current_hardfork_version:"1.28.0",last_hardfork:28}))]),s=C(t.total_vesting_shares).amount,a=C(t.total_vesting_fund_hive).amount,u=0;Number.isFinite(s)&&s!==0&&Number.isFinite(a)&&(u=a/s*1e6);let p=C(r.current_median_history.base).amount,l=C(r.current_median_history.quote).amount,f=parseFloat(i.recent_claims),m=C(i.reward_balance).amount,y=Number(t.vote_power_reserve_rate??0),h=i.author_reward_curve??"linear",E=Number(i.content_constant??0),O=String(o.current_hardfork_version??"0.0.0"),A=Number(o.last_hardfork??0),P=t.hbd_print_rate,L=t.hbd_interest_rate,U=t.head_block_number,B=a,Q=s,$=C(t.virtual_supply).amount,Se=t.vesting_reward_percent||0,ze=n.account_creation_fee;return {hivePerMVests:u,base:p,quote:l,fundRecentClaims:f,fundRewardBalance:m,votePowerReserveRate:y,authorRewardCurve:h,contentConstant:E,currentHardforkVersion:O,lastHardfork:A,hbdPrintRate:P,hbdInterestRate:L,headBlock:U,totalVestingFund:B,totalVestingShares:Q,virtualSupply:$,vestingRewardPercent:Se,accountCreationFee:ze,raw:{globalDynamic:t,feedHistory:r,chainProps:n,rewardFund:i,hardforkProps:o}}}})}function Gm(e="post"){return reactQuery.queryOptions({queryKey:c.core.rewardFund(e),queryFn:()=>g("condenser_api.get_reward_fund",[e])})}function Fe(...e){let t=e.length;for(;t>0&&e[t-1]===void 0;)t--;return e.slice(0,t)}var c={posts:{entry:e=>["posts","entry",e],postHeader:(e,t)=>["posts","post-header",e,t],content:(e,t)=>["posts","content",e,t],contentReplies:(e,t)=>["posts","content-replies",e,t],accountPosts:(e,t,r,n)=>["posts","account-posts",e,t,r,n],accountPostsPage:(e,t,r,n,i,o)=>["posts","account-posts-page",e,t,r,n,i,o],userPostVote:(e,t,r)=>["posts","user-vote",e,t,r],reblogs:(e,t)=>["posts","reblogs",e,t],entryActiveVotes:(e,t)=>["posts","entry-active-votes",e,t],rebloggedBy:(e,t)=>["posts","reblogged-by",e,t],tips:(e,t)=>["posts","tips",e,t],normalize:(e,t)=>["posts","normalize",e,t],drafts:e=>["posts","drafts",e],draftsInfinite:(e,t)=>Fe("posts","drafts","infinite",e,t),schedules:e=>["posts","schedules",e],schedulesInfinite:(e,t)=>Fe("posts","schedules","infinite",e,t),fragments:e=>["posts","fragments",e],fragmentsInfinite:(e,t)=>Fe("posts","fragments","infinite",e,t),images:e=>["posts","images",e],galleryImages:e=>["posts","gallery-images",e],imagesInfinite:(e,t)=>Fe("posts","images","infinite",e,t),promoted:e=>["posts","promoted",e],_promotedPrefix:["posts","promoted"],accountPostsBlogPrefix:e=>["posts","account-posts",e,"blog"],postsRanked:(e,t,r,n)=>["posts","posts-ranked",e,t,r,n],postsRankedPage:(e,t,r,n,i,o)=>["posts","posts-ranked-page",e,t,r,n,i,o],discussions:(e,t,r,n)=>["posts","discussions",e,t,r,n],discussion:(e,t,r)=>["posts","discussion",e,t,r],deletedEntry:e=>["posts","deleted-entry",e],commentHistory:(e,t,r)=>["posts","comment-history",e,t,r],trendingTags:()=>["posts","trending-tags"],trendingTagsWithStats:e=>["posts","trending-tags","stats",e],wavesFeed:(e={})=>["posts","waves","feed",e.tag??"",e.following??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],shortsFeed:(e={})=>["posts","waves","shorts",e.tag??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],wavesByHost:e=>["posts","waves","by-host",e],wavesByTag:(e,t)=>["posts","waves","by-tag",e,t],wavesFollowing:(e,t)=>["posts","waves","following",e,t],wavesTrendingTags:(e,t)=>["posts","waves","trending-tags",e,t],wavesByAccount:(e,t)=>["posts","waves","by-account",e,t],wavesTrendingAuthors:e=>["posts","waves","trending-authors",e],_prefix:["posts"]},accounts:{full:e=>["get-account-full",e],list:(...e)=>["accounts","list",...e],friends:(e,t,r,n)=>["accounts","friends",e,t,r,n],searchFriends:(e,t,r)=>["accounts","friends","search",e,t,r],subscriptions:e=>["accounts","subscriptions",e],followCount:e=>["accounts","follow-count",e],recoveries:e=>["accounts","recoveries",e],pendingRecovery:e=>["accounts","recoveries",e,"pending-request"],checkWalletPending:(e,t)=>["accounts","check-wallet-pending",e,t],mutedUsers:e=>["accounts","muted-users",e],following:(e,t,r,n)=>["accounts","following",e,t,r,n],followers:(e,t,r,n)=>["accounts","followers",e,t,r,n],search:(e,t)=>["accounts","search",e,t],profiles:(e,t)=>["accounts","profiles",e,t],lookup:(e,t)=>["accounts","lookup",e,t],transactions:(e,t,r)=>["accounts","transactions",e,t,r],favorites:e=>["accounts","favorites",e],favoritesInfinite:(e,t)=>Fe("accounts","favorites","infinite",e,t),checkFavorite:(e,t)=>["accounts","favorites","check",e,t],relations:(e,t)=>["accounts","relations",e,t],bots:()=>["accounts","bots"],voteHistory:(e,t)=>["accounts","vote-history",e,t],reputations:(e,t)=>["accounts","reputations",e,t],bookmarks:e=>["accounts","bookmarks",e],bookmarksInfinite:(e,t)=>Fe("accounts","bookmarks","infinite",e,t),referrals:e=>["accounts","referrals",e],referralsStats:e=>["accounts","referrals-stats",e],proMembers:()=>["accounts","pro-members"],_prefix:["accounts"]},notifications:{announcements:()=>["notifications","announcements"],spotlights:()=>["notifications","spotlights"],list:(e,t)=>["notifications",e,t],unreadCount:e=>["notifications","unread",e],settings:e=>["notifications","settings",e],_prefix:["notifications"]},core:{rewardFund:e=>["core","reward-fund",e],dynamicProps:()=>["core","dynamic-props"],chainProperties:()=>["core","chain-properties"],_prefix:["core"]},communities:{single:(e,t)=>["community","single",e,t],singlePrefix:e=>["community","single",e],context:(e,t)=>["community","context",e,t],rewarded:()=>["communities","rewarded"],list:(e,t,r)=>["communities","list",e,t,r],subscribers:e=>["communities","subscribers",e],subscribersInfinite:e=>["communities","subscribers","infinite",e],accountNotifications:(e,t)=>["communities","account-notifications",e,t]},proposals:{list:()=>["proposals","list"],proposal:e=>["proposals","proposal",e],votes:(e,t,r)=>["proposals","votes",e,t,r],votesPrefix:e=>["proposals","votes",e],votesByUser:e=>["proposals","votes","by-user",e]},search:{topics:(e,t)=>["search","topics",e,t],path:e=>["search","path",e],account:(e,t)=>["search","account",e,t],results:(e,t,r,n,i,o)=>["search",e,t,typeof r=="string"?r==="1"||r==="true":r,n,i,o],controversialRising:(e,t)=>["search","controversial-rising",e,t],similarEntries:(e,t,r)=>r?["search","similar-entries",e,t,r]:["search","similar-entries",e,t],api:(e,t,r,n,i,o)=>Fe("search","api",e,t,r,n,i,o)},witnesses:{list:e=>["witnesses","list",e],votes:e=>["witnesses","votes",e],proxy:()=>["witnesses","proxy"],voters:(e,t,r,n,i)=>["witnesses","voters",e,t,r,n,i],voterCount:e=>["witnesses","voter-count",e]},wallet:{outgoingRcDelegations:(e,t)=>["wallet","outgoing-rc-delegations",e,t],vestingDelegations:(e,t)=>["wallet","vesting-delegations",e,t],withdrawRoutes:e=>["wallet","withdraw-routes",e],incomingRc:e=>["wallet","incoming-rc",e],conversionRequests:e=>["wallet","conversion-requests",e],receivedVestingShares:e=>["wallet","received-vesting-shares",e],savingsWithdraw:e=>["wallet","savings-withdraw",e],openOrders:e=>["wallet","open-orders",e],collateralizedConversionRequests:e=>["wallet","collateralized-conversion-requests",e],recurrentTransfers:e=>["wallet","recurrent-transfers",e],balanceHistory:(e,t,r)=>["wallet","balance-history",e,t,r],aggregatedHistory:(e,t,r)=>r===void 0?["wallet","aggregated-history",e,t]:["wallet","aggregated-history",e,t,r],portfolio:(e,t,r)=>["wallet","portfolio","v2",e,t,r]},assets:{hiveGeneralInfo:e=>["assets","hive","general-info",e],hiveTransactions:(e,t,r)=>["assets","hive","transactions",e,t,r],hiveWithdrawalRoutes:e=>["assets","hive","withdrawal-routes",e],hiveMetrics:e=>["assets","hive","metrics",e],hbdGeneralInfo:e=>["assets","hbd","general-info",e],hbdTransactions:(e,t,r)=>["assets","hbd","transactions",e,t,r],hivePowerGeneralInfo:e=>["assets","hive-power","general-info",e],hivePowerDelegates:e=>["assets","hive-power","delegates",e],hivePowerDelegatings:e=>["assets","hive-power","delegatings",e],hivePowerTransactions:(e,t,r)=>["assets","hive-power","transactions",e,t,r],pointsGeneralInfo:e=>["assets","points","general-info",e],pointsTransactions:(e,t)=>["assets","points","transactions",e,t],ecencyAssetInfo:(e,t,r)=>["ecency-wallets","asset-info",e,t,r]},market:{statistics:()=>["market","statistics"],orderBook:e=>["market","order-book",e],history:(e,t,r)=>["market","history",e,t,r],feedHistory:()=>["market","feed-history"],hiveHbdStats:()=>["market","hive-hbd-stats"],data:(e,t,r,n)=>["market","data",e,t,r,n],tradeHistory:(e,t,r)=>["market","trade-history",e,t,r],currentMedianHistoryPrice:()=>["market","current-median-history-price"]},analytics:{discoverCuration:e=>["analytics","discover-curation",e],pageStats:(e,t,r,n)=>["analytics","page-stats",e,t,r,n],discoverLeaderboard:e=>["analytics","discover-leaderboard",e]},promotions:{promotePrice:()=>["promotions","promote-price"],boostPlusPrices:()=>["promotions","boost-plus-prices"],boostPlusAccounts:e=>["promotions","boost-plus-accounts",e]},resourceCredits:{account:e=>["resource-credits","account",e],stats:()=>["resource-credits","stats"]},points:{points:(e,t)=>["points",e,t],_prefix:e=>["points",e]},polls:{details:(e,t)=>["polls","details",e,t],vote:(e,t)=>e&&t?["polls","vote",e,t]:["polls","vote"],_prefix:["polls"]},operations:{chainProperties:()=>["operations","chain-properties"]},games:{statusCheck:(e,t)=>["games","status-check",e,t]},quests:{status:e=>["quests","status",e]},support:{settings:e=>["support","settings",e],_prefix:["support"]},badActors:{list:()=>["bad-actors","list"],_prefix:["bad-actors"]},ai:{prices:()=>["ai","prices"],assistPrices:e=>["ai","assist-prices",e],transcribePrice:e=>["ai","transcribe-price",e],_prefix:["ai"]}};function Zm(e){return reactQuery.queryOptions({queryKey:c.ai.prices(),queryFn:async()=>{let r=await w()(d.privateApiHost+"/private-api/ai-generate-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch AI generation prices: ${r.status}`);return await r.json()},staleTime:3e5,enabled:!!e})}function ng(e,t){return reactQuery.queryOptions({queryKey:c.ai.assistPrices(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-assist-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI assist prices: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function ag(e,t){return reactQuery.queryOptions({queryKey:c.ai.transcribePrice(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-transcribe-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI transcribe price: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function js(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function lg(e,t){return reactQuery.useMutation({mutationKey:["ai","generate-image"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][GenerateImage] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][GenerateImage] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-generate-image",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,us:e,prompt:r.prompt,aspect_ratio:r.aspect_ratio??"1:1",power:r.power??1,idempotency_key:r.idempotency_key??js()})});if(!i.ok){let s=await i.text(),a={};try{a=JSON.parse(s);}catch{}let u=new Error(`[SDK][AI][GenerateImage] \u2013 failed with status ${i.status}${s?`: ${s}`:""}`);throw u.status=i.status,u.data=a,u}if(i.status===202){let s={};try{s=await i.json();}catch{}let a=new Error("[SDK][AI][GenerateImage] \u2013 delivery pending");throw a.status=202,a.data=s,a}return await i.json()},onSuccess:()=>{e&&b().invalidateQueries({queryKey:c.points._prefix(e)});}})}function $s(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function gg(e,t){return reactQuery.useMutation({mutationKey:["ai","assist"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Assist] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][Assist] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-assist",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r.code??t,us:e,action:r.action,text:r.text,idempotency_key:$s()})});if(!i.ok){let o=await i.text(),s={};try{s=JSON.parse(o);}catch{}let a=new Error(`[SDK][AI][Assist] \u2013 failed with status ${i.status}${o?`: ${o}`:""}`);throw a.status=i.status,a.data=s,a}return await i.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.assistPrices(e)}));}})}function Gs(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function _g(e,t){return reactQuery.useMutation({mutationKey:["ai","transcribe"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Transcribe] \u2013 username wasn't provided");let n=r.code??t;if(!n)throw new Error("[SDK][AI][Transcribe] \u2013 access token wasn't found");let i=new FormData;i.append("code",n),i.append("duration_ms",String(Math.round(r.durationMs))),i.append("idempotency_key",r.idempotency_key??Gs()),i.append("audio",r.audio,r.fileName??"clip.webm");let s=await w()(d.privateApiHost+"/private-api/ai-transcribe",{method:"POST",body:i});if(!s.ok){let a=await s.text(),u={};try{u=JSON.parse(a);}catch{}throw Object.assign(new Error(`[SDK][AI][Transcribe] \u2013 failed with status ${s.status}${a?`: ${a}`:""}`),{status:s.status,data:u})}return await s.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.transcribePrice(e)}));}})}function ur(e){return !e.posting_json_metadata&&!e.json_metadata}function Js(e){return e?Object.values(e).some(t=>typeof t=="string"?t.length>0:t!=null):false}function M(e){return reactQuery.queryOptions({queryKey:c.accounts.full(e),queryFn:async({signal:t})=>{if(!e)return null;let[r,n]=await Promise.all([g("condenser_api.get_accounts",[[e]],void 0,void 0,t,p=>Array.isArray(p)),g("bridge.get_profile",{account:e},void 0,void 0,t).catch(p=>{if(t?.aborted)throw p;return null})]);if(!r?.[0])return null;let i=r[0];if(ur(i)&&Js(n?.metadata?.profile)){let p=await g("condenser_api.get_accounts",[[e]],void 0,void 0,t,l=>Array.isArray(l)&&(!l[0]||!ur(l[0])));if(p[0]&&!ur(p[0]))i=p[0];else throw new Error(`[SDK][Accounts] \u2013 inconsistent account row for ${e}: empty json metadata while hivemind profile is populated`)}let o=qe(i.posting_json_metadata),s=n?.stats,a=s?{account:i.name,follower_count:s.followers??0,following_count:s.following??0}:void 0,u=n?.reputation??0;return {name:i.name,owner:i.owner,active:i.active,posting:i.posting,memo_key:i.memo_key,post_count:i.post_count,created:i.created,posting_json_metadata:i.posting_json_metadata,last_vote_time:i.last_vote_time,last_post:i.last_post,json_metadata:i.json_metadata,reward_hive_balance:i.reward_hive_balance,reward_hbd_balance:i.reward_hbd_balance,reward_vesting_hive:i.reward_vesting_hive,reward_vesting_balance:i.reward_vesting_balance,balance:i.balance,hbd_balance:i.hbd_balance,savings_balance:i.savings_balance,savings_hbd_balance:i.savings_hbd_balance,savings_hbd_last_interest_payment:i.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:i.savings_hbd_seconds_last_update,savings_hbd_seconds:i.savings_hbd_seconds,next_vesting_withdrawal:i.next_vesting_withdrawal,pending_claimed_accounts:i.pending_claimed_accounts,vesting_shares:i.vesting_shares,delegated_vesting_shares:i.delegated_vesting_shares,received_vesting_shares:i.received_vesting_shares,vesting_withdraw_rate:i.vesting_withdraw_rate,to_withdraw:i.to_withdraw,withdrawn:i.withdrawn,witness_votes:i.witness_votes,proxy:i.proxy,recovery_account:i.recovery_account,proxied_vsf_votes:i.proxied_vsf_votes,voting_manabar:i.voting_manabar,voting_power:i.voting_power,downvote_manabar:i.downvote_manabar,follow_stats:a,reputation:u,profile:o}},enabled:!!e,staleTime:6e4})}var Ys=new Set(["__proto__","constructor","prototype"]);function St(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function zn(e,t){let r={...e};for(let n of Object.keys(t)){if(Ys.has(n))continue;let i=t[n],o=r[n];St(i)&&St(o)?r[n]=zn(o,i):r[n]=i;}return r}function Xs(e){if(!(!e||!Array.isArray(e)))return e.map(({meta:t,...r})=>{if(!t||typeof t!="object")return {...r,meta:t};let{privateKey:n,username:i,...o}=t;return {...r,meta:o}})}function qe(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.profile&&typeof t.profile=="object")return t.profile}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata:",t,{length:e?.length??0});}return {}}function Jn(e){return qe(e?.posting_json_metadata)}function Yn(e,t){if(!e)return t;if(!t)return e;let r=Object.keys(qe(e.posting_json_metadata)).length;return Object.keys(qe(t.posting_json_metadata)).length>r?t:e}function Zs(e){if(!e)return {};try{let t=JSON.parse(e);if(St(t))return t}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata root:",t,{length:e?.length??0});}return {}}function Xn({existingPostingJsonMetadata:e,profile:t,tokens:r}){let n=Zs(e),i=St(n.profile)?n.profile:{},o=pr({existingProfile:i,profile:t,tokens:r});return JSON.stringify({...n,profile:o})}function pr({existingProfile:e,profile:t,tokens:r}){let{tokens:n,version:i,...o}=t??{},s=zn(e??{},o);return s.tokens&&!Array.isArray(s.tokens)&&(s.tokens=void 0),r!==void 0?s.tokens=r&&r.length>0?r:[]:n!==void 0&&(s.tokens=n),s.tokens=Xs(s.tokens),s.version=2,s}function kt(e){return e.map(t=>{let r={name:t.name,owner:t.owner,active:t.active,posting:t.posting,memo_key:t.memo_key,post_count:t.post_count,created:t.created,reputation:t.reputation,posting_json_metadata:t.posting_json_metadata,last_vote_time:t.last_vote_time,last_post:t.last_post,json_metadata:t.json_metadata,reward_hive_balance:t.reward_hive_balance,reward_hbd_balance:t.reward_hbd_balance,reward_vesting_hive:t.reward_vesting_hive,reward_vesting_balance:t.reward_vesting_balance,balance:t.balance,hbd_balance:t.hbd_balance,savings_balance:t.savings_balance,savings_hbd_balance:t.savings_hbd_balance,savings_hbd_last_interest_payment:t.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:t.savings_hbd_seconds_last_update,savings_hbd_seconds:t.savings_hbd_seconds,next_vesting_withdrawal:t.next_vesting_withdrawal,pending_claimed_accounts:t.pending_claimed_accounts,vesting_shares:t.vesting_shares,delegated_vesting_shares:t.delegated_vesting_shares,received_vesting_shares:t.received_vesting_shares,vesting_withdraw_rate:t.vesting_withdraw_rate,to_withdraw:t.to_withdraw,withdrawn:t.withdrawn,witness_votes:t.witness_votes,proxy:t.proxy,recovery_account:t.recovery_account,proxied_vsf_votes:t.proxied_vsf_votes,voting_manabar:t.voting_manabar,voting_power:t.voting_power,downvote_manabar:t.downvote_manabar},n=qe(t.posting_json_metadata);if(!n||Object.keys(n).length===0)try{let i=JSON.parse(t.json_metadata||"{}");i.profile&&(n=i.profile);}catch{}return (!n||Object.keys(n).length===0)&&(n={about:"",cover_image:"",location:"",name:"",profile_image:"",website:""}),{...r,profile:n}})}function qg(e){return reactQuery.queryOptions({queryKey:c.accounts.list(...e),enabled:e.length>0,queryFn:async()=>{let t=await g("condenser_api.get_accounts",[e],void 0,void 0,void 0,r=>Array.isArray(r));return kt(t??[])}})}function Mg(e){return reactQuery.queryOptions({queryKey:c.accounts.followCount(e),queryFn:()=>g("condenser_api.get_follow_count",[e])})}function Vg(e,t,r="blog",n=100){return reactQuery.queryOptions({queryKey:c.accounts.followers(e,t,r,n),queryFn:()=>g("condenser_api.get_followers",[e,t,r,n]),enabled:!!e})}function Gg(e,t,r="blog",n=100){return reactQuery.queryOptions({queryKey:c.accounts.following(e,t,r,n),queryFn:()=>g("condenser_api.get_following",[e,t,r,n]),enabled:!!e})}var Zn=1e3,oa=20;function Zg(e){return reactQuery.queryOptions({queryKey:c.accounts.mutedUsers(e),queryFn:async()=>{let t=[],r="";for(let n=0;ns.following);if(o[0]===r&&(o=o.slice(1)),!o.length||(t.push(...o),i.lengthg("condenser_api.lookup_accounts",[e,t]),enabled:!!e,staleTime:1/0})}function uy(e,t=5,r=[]){return reactQuery.queryOptions({queryKey:c.accounts.search(e,r),enabled:!!e,queryFn:async()=>(await g("condenser_api.lookup_accounts",[e,t])).filter(i=>r.length>0?!r.includes(i):true)})}var ua=new Set(["ownerPublicKey","activePublicKey","postingPublicKey","memoPublicKey"]);function fy(e,t){return reactQuery.queryOptions({queryKey:c.accounts.checkWalletPending(e,t??null),queryFn:async()=>{if(!e||!t)return {exist:false};let n=await w()(d.privateApiHost+"/private-api/wallets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,code:t})});if(!n.ok)return {exist:false};let i=await n.json(),o=Array.isArray(i)?i.flatMap(s=>{if(!s||typeof s!="object")return [];let a=s,u=typeof a.token=="string"?a.token:void 0;if(!u)return [];let p=a.meta&&typeof a.meta=="object"?{...a.meta}:{},l={},f=typeof a.address=="string"&&a.address?a.address:void 0,y=(typeof a.status=="number"?a.status===3:void 0)??false;f&&(l.address=f),l.show=y;let h={symbol:u,currency:u,address:f,show:y,type:"CHAIN",meta:l},E=[];for(let[O,A]of Object.entries(p))typeof O=="string"&&(ua.has(O)||typeof A!="string"||!A||/^[A-Z0-9]{2,10}$/.test(O)&&E.push({symbol:O,currency:O,address:A,show:y,type:"CHAIN",meta:{address:A,show:y}}));return [h,...E]}):[];return {exist:o.length>0,tokens:o.length?o:void 0,wallets:o.length?o:void 0}},refetchOnMount:true})}function ei(e,t){return reactQuery.queryOptions({queryKey:c.accounts.relations(e,t),enabled:!!e&&!!t,refetchOnMount:false,refetchInterval:36e5,queryFn:async()=>{let r={follows:false,ignores:false,blacklists:false,follows_muted:false,follows_blacklists:false};return !e||!t?r:await g("bridge.get_relationship_between_accounts",[e,t])??r}})}function Ay(e){return reactQuery.queryOptions({queryKey:c.accounts.subscriptions(e),enabled:!!e,queryFn:async({signal:t})=>await g("bridge.list_all_subscriptions",{account:e},void 0,void 0,t)??[]})}function Ey(e,t){return reactQuery.queryOptions({queryKey:c.accounts.bookmarks(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Bookmarks] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/bookmarks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Sy(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.accounts.bookmarksInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch bookmarks: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ry(e,t){return reactQuery.queryOptions({queryKey:c.accounts.favorites(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Fy(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.accounts.favoritesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/favorites?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch favorites: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ky(e,t,r){return reactQuery.queryOptions({queryKey:c.accounts.checkFavorite(e,r),enabled:!!e&&!!t&&!!r,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");if(!r)throw new Error("[SDK][Accounts][Favorites] \u2013 no target username");let i=await w()(d.privateApiHost+"/private-api/favorites-check",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:r})});if(!i.ok)throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check failed with status ${i.status}: ${i.statusText}`);let o=await i.json();if(typeof o!="boolean")throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check returned invalid type: expected boolean, got ${typeof o}`);return o}})}function Qy(e,t){return reactQuery.queryOptions({enabled:!!e&&!!t,queryKey:c.accounts.recoveries(e),queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts] Missing username or access token");return (await w()(d.privateApiHost+"/private-api/recoveries",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Ly(e){return reactQuery.queryOptions({enabled:!!e,queryKey:c.accounts.pendingRecovery(e),queryFn:()=>g("database_api.find_change_recovery_account_requests",{accounts:[e]})})}function Jy(e,t=50){return reactQuery.queryOptions({queryKey:c.accounts.reputations(e,t),enabled:!!e,queryFn:async()=>e?g("condenser_api.get_account_reputations",[e,t]):[]})}var D=re.operations,ti={transfers:[D.transfer,D.transfer_to_savings,D.transfer_from_savings,D.cancel_transfer_from_savings,D.recurrent_transfer,D.fill_recurrent_transfer,D.escrow_transfer,D.fill_recurrent_transfer],"market-orders":[D.fill_convert_request,D.fill_order,D.fill_collateralized_convert_request,D.limit_order_create2,D.limit_order_create,D.limit_order_cancel],interests:[D.interest],"stake-operations":[D.return_vesting_delegation,D.withdraw_vesting,D.transfer_to_vesting,D.set_withdraw_vesting_route,D.update_proposal_votes,D.fill_vesting_withdraw,D.account_witness_proxy,D.delegate_vesting_shares],rewards:[D.author_reward,D.curation_reward,D.producer_reward,D.claim_reward_balance,D.comment_benefactor_reward,D.liquidity_reward,D.proposal_pay]},va=[...Object.values(ti)].reduce((e,t)=>e.concat(t),[]);function Aa(e){return e.block*1e7+e.trx_in_block*100+e.op_pos}function Pa(e){return e.replace(/_operation$/,"")}function Oa(e){return typeof e=="object"&&e!==null&&"nai"in e&&"amount"in e&&"precision"in e}function xa(e){if(!Oa(e))return e;let t=C(e),r=Et[e.nai]??"UNKNOWN";return `${t.amount.toFixed(e.precision)} ${r}`}function Ea(e){let t={};for(let[r,n]of Object.entries(e))t[r]=xa(n);return t}function ih(e,t=20,r=""){let n=r?ti[r]:va;return reactQuery.infiniteQueryOptions({queryKey:c.accounts.transactions(e??"",r,t),initialPageParam:null,queryFn:async({pageParam:i,signal:o})=>{if(!e)return {entries:[],currentPage:0};let s={"account-name":e,"operation-types":n.join(","),"page-size":t};i!==null&&(s.page=i);let a=await ee("hafah","/accounts/{account-name}/operations",s,void 0,void 0,o);return {entries:a.operations_result.map(p=>{let l=Pa(p.op.type);return {...Ea(p.op.value),num:Aa(p),type:l,timestamp:p.timestamp,trx_id:p.trx_id}}),currentPage:i??a.total_pages}},getNextPageParam:i=>{let o=i.currentPage-1;return o>=1?o:void 0}})}function ch(){return reactQuery.queryOptions({queryKey:c.accounts.bots(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/public/bots",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch bots: ${e.status}`);return e.json()},refetchOnMount:true,staleTime:1/0})}function dh(e){return reactQuery.infiniteQueryOptions({queryKey:c.accounts.referrals(e),initialPageParam:{maxId:void 0},queryFn:async({pageParam:t})=>{let{maxId:r}=t??{},n=exports.ConfigManager.getValidatedBaseUrl(),i=new URL(`/private-api/referrals/${e}`,n);r!==void 0&&i.searchParams.set("max_id",r.toString());let o=await fetch(i.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`Failed to fetch referrals: ${o.status}`);return o.json()},getNextPageParam:t=>{let r=t?.[t.length-1]?.id;return typeof r=="number"?{maxId:r}:void 0}})}function yh(e){return reactQuery.queryOptions({queryKey:c.accounts.referralsStats(e),queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/referrals/${e}/stats`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch referral stats: ${t.status}`);let r=await t.json();if(!r)throw new Error("No Referrals for this user!");return {total:r.total??0,rewarded:r.rewarded??0}}})}function Ah(e,t,r){let{followType:n="blog",limit:i=100,enabled:o=true}=r??{};return reactQuery.infiniteQueryOptions({queryKey:c.accounts.friends(e,t,n,i),initialPageParam:{startFollowing:""},enabled:o,refetchOnMount:true,queryFn:async({pageParam:s})=>{let{startFollowing:a}=s,l=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,a===""?null:a,n,i])).map(y=>t==="following"?y.following:y.follower);return (await g("bridge.get_profiles",{accounts:l,observer:void 0})??[]).map(y=>({name:y.name,reputation:y.reputation,active:y.active}))},getNextPageParam:s=>s&&s.length===i?{startFollowing:s[s.length-1].name}:void 0})}var Fa=30;function Sh(e,t,r){return reactQuery.queryOptions({queryKey:c.accounts.searchFriends(e,t,r),refetchOnMount:false,enabled:false,queryFn:async()=>{if(!r)return [];let n=r.slice(0,-1),s=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,n,"blog",1e3])).map(u=>t==="following"?u.following:u.follower).filter(u=>u.toLowerCase().includes(r.toLowerCase())).slice(0,Fa);return (await g("bridge.get_profiles",{accounts:s,observer:void 0}))?.map(u=>({name:u.name,full_name:u.metadata.profile?.name||"",reputation:u.reputation,active:u.active}))??[]}})}function Fh(e=20){return reactQuery.infiniteQueryOptions({queryKey:c.posts.trendingTags(),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!n.name.startsWith("hive-")).map(n=>n.name)),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length>0?{afterTag:t[t.length-1]}:void 0,staleTime:3600*1e3})}function Mh(e=250){return reactQuery.infiniteQueryOptions({queryKey:c.posts.trendingTagsWithStats(e),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!$n(n.name))),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length?{afterTag:t[t.length-1].name}:void 0,staleTime:1/0})}function Ve(e,t){return reactQuery.queryOptions({queryKey:c.posts.fragments(e),queryFn:async()=>t?(await w()(d.privateApiHost+"/private-api/fragments",{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json():[],enabled:!!e&&!!t})}function Uh(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.fragmentsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/fragments?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch fragments: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function $h(e="feed"){return reactQuery.queryOptions({queryKey:c.posts.promoted(e),queryFn:async()=>{let t=exports.ConfigManager.getValidatedBaseUrl(),r=new URL("/private-api/promoted-entries",t);return e==="waves"&&r.searchParams.append("short_content","1"),await(await w()(r.toString(),{method:"GET",headers:{"Content-Type":"application/json"}})).json()}})}function Yh(e){return reactQuery.queryOptions({queryKey:c.posts.entryActiveVotes(e?.author,e?.permlink),queryFn:async()=>g("condenser_api.get_active_votes",[e?.author,e?.permlink]),enabled:!!e})}function rw(e,t,r){return reactQuery.queryOptions({queryKey:c.posts.userPostVote(e,t,r),queryFn:async()=>(await g("database_api.list_votes",{start:[e,t,r],limit:1,order:"by_voter_comment"}))?.votes?.[0]||null,enabled:!!e&&!!t&&!!r})}function aw(e,t){return reactQuery.queryOptions({queryKey:c.posts.content(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content",[e,t])})}function dw(e,t){return reactQuery.queryOptions({queryKey:c.posts.contentReplies(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content_replies",{author:e,permlink:t})})}function hw(e,t){return reactQuery.queryOptions({queryKey:c.posts.postHeader(e,t),queryFn:async()=>g("bridge.get_post_header",{author:e,permlink:t}),initialData:null})}function te(e){return Array.isArray(e)?e.map(t=>ri(t)):ri(e)}function ri(e){if(!e)return e;let t=`@${e.author}/${e.permlink}`;return d.dmcaPatterns.includes(t)||d.dmcaPatternRegexes.some(n=>n.test(t))?{...e,body:"This post is not available due to a copyright/fraudulent claim.",title:""}:e}async function ni(e,t,r){try{let n=await At("bridge.get_post",{author:e,permlink:t,observer:r},1);if(n&&typeof n=="object"&&n.author===e&&n.permlink===t)return n}catch{}return null}function ii(e,t,r="",n){let i=t?.trim(),o=`/@${e}/${i??""}`;return reactQuery.queryOptions({queryKey:c.posts.entry(o),queryFn:async()=>{if(!i||i==="undefined")return null;let s=await g("bridge.get_post",{author:e,permlink:i,observer:r});if(!s){let u=await ni(e,i,r);if(!u)return null;let p=n!==void 0?{...u,num:n}:u;return te(p)}let a=n!==void 0?{...s,num:n}:s;return te(a)},enabled:!!e&&!!t&&t.trim()!==""&&t.trim()!=="undefined"})}function se(e,t,r){return g(`bridge.${e}`,t,void 0,void 0,r)}async function oi(e,t,r,n){let{json_metadata:i}=e;if(i?.original_author&&i?.original_permlink&&i.tags?.[0]==="cross-post")try{let o=await ja(i.original_author,i.original_permlink,t,r,n);return o?{...e,original_entry:o,num:r}:e}catch{return e}return {...e,num:r}}async function si(e,t,r){let n=e.map(rt),i=await Promise.all(n.map(o=>oi(o,t,void 0,r)));return te(i)}async function ai(e,t="",r="",n=20,i="",o="",s){let a=await se("get_ranked_posts",{sort:e,start_author:t,start_permlink:r,limit:n,tag:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_ranked_posts returned ${typeof a} instead of an array for sort=${e}; treating as no results.`),null)}async function lr(e,t,r="",n="",i=20,o="",s){if(d.dmcaAccounts.includes(t))return [];let a=await se("get_account_posts",{sort:e,account:t,start_author:r,start_permlink:n,limit:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_account_posts returned ${typeof a} instead of an array for account=${t}, sort=${e}; treating as no results.`),null)}function rt(e){let t={...e,active_votes:Array.isArray(e.active_votes)?[...e.active_votes]:[],beneficiaries:Array.isArray(e.beneficiaries)?[...e.beneficiaries]:[],blacklists:Array.isArray(e.blacklists)?[...e.blacklists]:[],replies:Array.isArray(e.replies)?[...e.replies]:[],stats:e.stats?{...e.stats}:null},r=["author","title","body","created","category","permlink","url","updated"];for(let n of r)t[n]==null&&(t[n]="");return t.author_reputation==null&&(t.author_reputation=0),t.children==null&&(t.children=0),t.depth==null&&(t.depth=0),t.net_rshares==null&&(t.net_rshares=0),t.payout==null&&(t.payout=0),t.percent_hbd==null&&(t.percent_hbd=0),t.stats||(t.stats={flag_weight:0,gray:false,hide:false,total_votes:0}),t.author_payout_value==null&&(t.author_payout_value="0.000 HBD"),t.curator_payout_value==null&&(t.curator_payout_value="0.000 HBD"),t.max_accepted_payout==null&&(t.max_accepted_payout="1000000.000 HBD"),t.payout_at==null&&(t.payout_at=""),t.pending_payout_value==null&&(t.pending_payout_value="0.000 HBD"),t.promoted==null&&(t.promoted="0.000 HBD"),t.is_paidout==null&&(t.is_paidout=false),t}async function ja(e="",t="",r="",n,i){let o=await se("get_post",{author:e,permlink:t,observer:r},i);if(o){let s=rt(o),a=await oi(s,r,n,i);return te(a)}}async function Fw(e="",t=""){let r=await se("get_post_header",{author:e,permlink:t});return r&&rt(r)}async function ci(e,t,r){let n=await se("get_discussion",{author:e,permlink:t,observer:r||e});if(n){let i={};for(let[o,s]of Object.entries(n))i[o]=rt(s);return i}return n}async function ui(e,t=""){return se("get_community",{name:e,observer:t})}async function qw(e="",t=100,r,n="rank",i=""){return se("list_communities",{last:e,limit:t,query:r,sort:n,observer:i})}async function pi(e){let t=await se("normalize_post",{post:e});return t&&rt(t)}async function Iw(e){return se("list_all_subscriptions",{account:e})}async function Dw(e){return se("list_subscribers",{community:e})}async function Kw(e,t){return se("get_relationship_between_accounts",[e,t])}async function Ct(e,t){return se("get_profiles",{accounts:e,observer:t})}var di=(i=>(i.trending="trending",i.author_reputation="author_reputation",i.votes="votes",i.created="created",i))(di||{});function dr(e){let t=e.match(/^(\d+\.?\d*)\s*([A-Z]+)$/);return t?{amount:parseFloat(t[1]),symbol:t[2]}:{amount:0,symbol:""}}function La(e,t,r){let n=l=>dr(l.pending_payout_value).amount+dr(l.author_payout_value).amount+dr(l.curator_payout_value).amount,i=l=>l.net_rshares<0,o=l=>e.json_metadata?.pinned_reply===`${l.author}/${l.permlink}`,s={trending:(l,f)=>{if(i(l))return 1;if(i(f))return -1;let m=n(l),y=n(f);return m!==y?y-m:0},author_reputation:(l,f)=>{let m=l.author_reputation,y=f.author_reputation;return m>y?-1:m{let m=l.children,y=f.children;return m>y?-1:m{if(i(l))return 1;if(i(f))return -1;let m=Date.parse(l.created),y=Date.parse(f.created);return m>y?-1:mo(l)),p=a[u];return u>=0&&(a.splice(u,1),a.unshift(p)),a}function fi(e,t="created",r=true,n){let i=n||d.defaultObserver;return reactQuery.queryOptions({queryKey:c.posts.discussions(e?.author,e?.permlink,t,i),queryFn:async()=>{if(!e)return [];let o=await g("bridge.get_discussion",{author:e.author,permlink:e.permlink,observer:i}),s=o?Array.from(Object.values(o)):[];return te(s)},enabled:r&&!!e,select:o=>La(e,o,t),structuralSharing:(o,s)=>{if(!o||!s)return s;let a=o.filter(l=>l.is_optimistic===true),u=new Set(s.map(l=>`${l.author}/${l.permlink}`)),p=a.filter(l=>!u.has(`${l.author}/${l.permlink}`));return p.length>0?[...s,...p]:s}})}function Vw(e,t,r,n=true){let i=r||d.defaultObserver;return reactQuery.queryOptions({queryKey:c.posts.discussion(e,t,i),enabled:n&&!!e&&!!t,queryFn:async()=>ci(e,t,i)})}function Jw(e,t="posts",r=20,n="",i=true){return reactQuery.infiniteQueryOptions({queryKey:c.posts.accountPosts(e??"",t,r,n),enabled:!!e&&i,initialPageParam:{author:void 0,permlink:void 0,hasNextPage:true},queryFn:async({pageParam:o,signal:s})=>{if(!o?.hasNextPage||!e)return [];let a=await lr(t,e,o.author??"",o.permlink??"",r,n,s);return te(a??[])},getNextPageParam:o=>{let s=o?.[o.length-1],a=(o?.length??0)===r;if(a)return {author:s?.author,permlink:s?.permlink,hasNextPage:a}}})}function Yw(e,t="posts",r="",n="",i=20,o="",s=true){return reactQuery.queryOptions({queryKey:c.posts.accountPostsPage(e??"",t,r,n,i,o),enabled:!!e&&s,queryFn:async({signal:a}={})=>{if(!e)return [];let u=await lr(t,e,r,n,i,o,a);return te(u??[])}})}var mi=new Map;function Ja(e){let t=mi.get(e);return t||(t=r=>({...r,pages:r.pages.map(n=>Ya(n,e))}),mi.set(e,t)),t}function Ya(e,t){let r=e.filter(o=>o.stats?.is_pinned),n=e.filter(o=>!o.stats?.is_pinned);if(t==="hot")return [...r,...n];let i=[...n].sort((o,s)=>new Date(s.created).getTime()-new Date(o.created).getTime());return [...r,...i]}function o_(e,t,r=20,n="",i=true,o={}){return reactQuery.infiniteQueryOptions({queryKey:c.posts.postsRanked(e,t,r,n),queryFn:async({pageParam:s,signal:a})=>{let u=t;d.dmcaTagRegexes.some(l=>l.test(t))&&(u="");let p=await g("bridge.get_ranked_posts",{sort:e,start_author:s.author,start_permlink:s.permlink,limit:r,tag:u,observer:n},void 0,void 0,a);if(p==null)return [];if(!Array.isArray(p))throw new Error(`[SDK] get_ranked_posts returned ${typeof p} for sort=${e}`);return te(p)},select:Ja(e),enabled:i,initialPageParam:{author:void 0,permlink:void 0},getNextPageParam:s=>{let a=s?.[s.length-1];if(a)return {author:a.author,permlink:a.permlink}}})}function s_(e,t="",r="",n=20,i="",o="",s=true){return reactQuery.queryOptions({queryKey:c.posts.postsRankedPage(e,t,r,n,i,o),enabled:s,queryFn:async({signal:a}={})=>{let u=i;d.dmcaTagRegexes.some(l=>l.test(i))&&(u="");let p=await ai(e,t,r,n,u,o,a);return te(p??[])}})}function l_(e,t,r=200){return reactQuery.queryOptions({queryKey:c.posts.reblogs(e??"",r),queryFn:async()=>(await g("condenser_api.get_blog_entries",[e??t,0,r])).filter(i=>i.author!==t&&!i.reblogged_on.startsWith("1970-")).map(i=>({author:i.author,permlink:i.permlink})),enabled:!!e})}function y_(e,t){return reactQuery.queryOptions({queryKey:c.posts.rebloggedBy(e??"",t??""),queryFn:async()=>{if(!e||!t)return [];let r=await g("condenser_api.get_reblogged_by",[e,t]);return Array.isArray(r)?r:[]},enabled:!!e&&!!t})}function b_(e,t){return reactQuery.queryOptions({queryKey:c.posts.schedules(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/schedules",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch schedules: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function v_(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.schedulesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/schedules?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch schedules: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function x_(e,t){return reactQuery.queryOptions({queryKey:c.posts.drafts(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch drafts: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function E_(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.draftsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/drafts?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch drafts: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}async function yi(e){let r=await w()(d.privateApiHost+"/private-api/images",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch images: ${r.status}`);return r.json()}function T_(e,t){return reactQuery.queryOptions({queryKey:c.posts.images(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function R_(e,t){return reactQuery.queryOptions({queryKey:c.posts.galleryImages(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function F_(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.imagesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/images?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch images: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function K_(e,t,r=false){return reactQuery.queryOptions({queryKey:c.posts.commentHistory(e,t,r),queryFn:async({signal:n})=>{let i=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:t,onlyMeta:r?"1":""}),signal:n});if(!i.ok)throw new Error(`Failed to fetch comment history: ${i.status}`);return i.json()},enabled:!!e&&!!t})}function ac(e,t){let r=e?.trim(),n=t?.trim();if(!r||!n)throw new Error("Invalid entry path: author and permlink are required");let i=r.replace(/^@+/,""),o=n.replace(/^\/+/,"");if(!i||!o)throw new Error("Invalid entry path: author and permlink cannot be empty after normalization");return `@${i}/${o}`}function Q_(e,t){let r=t?.trim(),n=e?.trim(),i=!!n&&!!r&&r!=="undefined",o=i?ac(n,r):"";return reactQuery.queryOptions({queryKey:c.posts.deletedEntry(o),queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:r||""}),signal:s});if(!a.ok)throw new Error(`Failed to fetch comment history: ${a.status}`);return a.json()},select:s=>{if(!s?.list?.[0])return null;let{body:a,title:u,tags:p}=s.list[0];return {body:a,title:u,tags:p}},enabled:i})}function j_(e,t,r=true){return reactQuery.queryOptions({queryKey:c.posts.tips(e,t),queryFn:async()=>{let n=`/private-api/post-tips/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,i=await fetch(d.privateApiHost+n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch post tips: ${i.status}`);return i.json()},enabled:!!e&&!!t&&r,staleTime:60*1e3})}function uc(e,t){return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,host:t}}function pc(e){return {...e,id:e.id??e.post_id}}function me(e,t){if(!e)return null;let r=e.container??e,n=uc(r,t),i=e.parent?pc(e.parent):void 0;return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,max_accepted_payout:e.max_accepted_payout||"1000000.000 HBD",pending_payout_value:e.pending_payout_value||"0.000 HBD",author_payout_value:e.author_payout_value||"0.000 HBD",curator_payout_value:e.curator_payout_value||"0.000 HBD",host:t,container:n,parent:i}}function lc(e){return Array.isArray(e)?e:[]}async function hi(e){let t=fi(e,"created",true),r=await d.queryClient.fetchQuery(t),n=lc(r);if(n.length<=1)return [];let i=n.filter(({parent_author:s,parent_permlink:a})=>s===e.author&&a===e.permlink);return i.length===0?[]:i.filter(s=>!s.stats?.gray)}function wi(e,t,r){return e.length===0?[]:e.map(n=>{let i=e.find(o=>o.author===n.parent_author&&o.permlink===n.parent_permlink&&o.author!==r);return {...n,id:n.post_id,host:r,container:t,parent:i}}).filter(n=>n.container.post_id!==n.post_id).sort((n,i)=>new Date(i.created).getTime()-new Date(n.created).getTime())}var mc=20;function _i(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,following:e.following?.trim().toLowerCase()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??mc}}async function bi({containers:e,tag:t,following:r,author:n,observer:i,limit:o},s,a){let u=exports.ConfigManager.getValidatedBaseUrl(),p=new URL("/private-api/waves/feed",u);p.searchParams.set("limit",String(o)),s&&p.searchParams.set("cursor",s),e.forEach(m=>p.searchParams.append("container",m)),t&&p.searchParams.set("tag",t),r&&p.searchParams.set("following",r),n&&p.searchParams.set("author",n),i&&p.searchParams.set("observer",i);let l=await fetch(p.toString(),{method:"GET",signal:a});if(!l.ok)throw new Error(`Failed to fetch waves feed: ${l.status}`);let f=await l.json();return !Array.isArray(f)||f.length===0?[]:f.map(m=>{let y=me(m,m.host??"");return y?{...y,_cursor:m._cursor}:null}).filter(m=>!!m)}function X_(e={}){let t=_i(e),{containers:r,tag:n,following:i,author:o,observer:s,limit:a}=t;return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesFeed({containers:r,tag:n,following:i,author:o,observer:s,limit:a}),initialPageParam:void 0,queryFn:({pageParam:u,signal:p})=>bi(t,u,p),getNextPageParam:u=>{if(!(u.lengthbi(t,void 0,u)})}var yc=20;function hc(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??yc}}async function wc({containers:e,tag:t,author:r,observer:n,limit:i},o,s){let a=exports.ConfigManager.getValidatedBaseUrl(),u=new URL("/private-api/waves/shorts",a);u.searchParams.set("limit",String(i)),o&&u.searchParams.set("cursor",o),e.forEach(f=>u.searchParams.append("container",f)),t&&u.searchParams.set("tag",t),r&&u.searchParams.set("author",r),n&&u.searchParams.set("observer",n);let p=await fetch(u.toString(),{method:"GET",signal:s});if(!p.ok)throw new Error(`Failed to fetch shorts feed: ${p.status}`);let l=await p.json();return !Array.isArray(l)||l.length===0?[]:l.map(f=>{let m=me(f,f.host??"");return m?{...m,active_votes:m.active_votes??[],video:f.video,_cursor:f._cursor}:null}).filter(f=>!!f)}function ib(e={}){let t=hc(e),{containers:r,tag:n,author:i,observer:o,limit:s}=t;return reactQuery.infiniteQueryOptions({queryKey:c.posts.shortsFeed({containers:r,tag:n,author:i,observer:o,limit:s}),initialPageParam:void 0,queryFn:({pageParam:a,signal:u})=>wc(t,a,u),getNextPageParam:a=>{if(!(a.length(l.id=l.post_id,l.host=e,l));for(let l of u){if(o&&l.post_id===o){o=void 0;continue}if(i+=1,l.stats?.gray){r=l.author,n=l.permlink;continue}let f;try{f=await hi(l);}catch(m){console.error("[SDK] getThreads get_discussion error:",m),r=l.author,n=l.permlink;continue}if(f.length===0){r=l.author,n=l.permlink;continue}return {entries:wi(f,l,e)}}let p=u[u.length-1];if(!p)return null;r=p.author,n=p.permlink;}return null}function lb(e){return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesByHost(e),initialPageParam:void 0,queryFn:async({pageParam:t})=>{let r=await Ac(e,t);return r?r.entries:[]},getNextPageParam:t=>t?.[0]?.container})}var Oc=40;function yb(e,t,r=Oc){return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesByTag(e,t),initialPageParam:void 0,queryFn:async({signal:n})=>{try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/tags",i);o.searchParams.set("container",e),o.searchParams.set("tag",t);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves by tag: ${s.status}`);return (await s.json()).slice(0,r).map(p=>me(p,e)).filter(p=>!!p).sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves by tag",i),[]}},getNextPageParam:()=>{}})}function vb(e,t){let r=t?.trim().toLowerCase();return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesFollowing(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/following",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves following feed: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves following feed",i),[]}},getNextPageParam:()=>{}})}function xb(e,t=24){let r=e?.trim()||void 0;return reactQuery.queryOptions({queryKey:c.posts.wavesTrendingTags(r??"",t),queryFn:async({signal:n})=>{try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/trending/tags",i);r&&o.searchParams.set("container",r),o.searchParams.set("hours",t.toString());let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves trending tags: ${s.status}`);return (await s.json()).map(({tag:u,posts:p})=>({tag:u,posts:p}))}catch(i){return console.error("[SDK] Failed to fetch waves trending tags",i),[]}}})}function Tb(e,t){let r=t?.trim().toLowerCase();return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesByAccount(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/account",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves for account: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){throw console.error("[SDK] Failed to fetch waves for account",i),i}},getNextPageParam:()=>{}})}function Ib(e){return reactQuery.queryOptions({queryKey:c.posts.wavesTrendingAuthors(e),queryFn:async({signal:t})=>{try{let r=exports.ConfigManager.getValidatedBaseUrl(),n=new URL("/private-api/waves/trending/authors",r);n.searchParams.set("container",e);let i=await fetch(n.toString(),{method:"GET",signal:t});if(!i.ok)throw new Error(`Failed to fetch waves trending authors: ${i.status}`);return (await i.json()).map(({author:s,posts:a})=>({author:s,posts:a}))}catch(r){throw console.error("[SDK] Failed to fetch waves trending authors",r),r}}})}function Nb(e,t=true){return reactQuery.queryOptions({queryKey:c.posts.normalize(e?.author??"",e?.permlink??""),enabled:t&&!!e,queryFn:async()=>pi(e)})}function Rc(e){return !!e&&typeof e=="object"&&"author"in e&&"permlink"in e&&"active_votes"in e}function vi(e){let t=new Date(e);return (new Date().getTime()-t.getTime())/(1e3*60*60*24)}function Wb(e,t){let{limit:r=20,filters:n=[],dayLimit:i=7}=t??{};return reactQuery.infiniteQueryOptions({queryKey:c.accounts.voteHistory(e,r),initialPageParam:{start:-1},queryFn:async({pageParam:o})=>{let{start:s}=o,a=await g("condenser_api.get_account_history",[e,s,r,...n]),p=a.map(([m,y])=>({...y.op[1],num:m,timestamp:y.timestamp})).filter(m=>m.voter===e&&m.weight!==0&&vi(m.timestamp)<=i),l=[];for(let m of p){let y=await d.queryClient.fetchQuery(ii(m.author,m.permlink));Rc(y)&&l.push(y);}let[f]=a;return {lastDate:f?vi(f[1].timestamp):0,lastItemFetched:f?f[0]:s,entries:l}},getNextPageParam:o=>({start:o.lastItemFetched})})}function Xb(e,t,r=true){return reactQuery.queryOptions({queryKey:c.accounts.profiles(e,t??""),enabled:r&&e.length>0,queryFn:async()=>Ct(e,t)})}function iv(e,t="HIVE",r=200){return reactQuery.infiniteQueryOptions({queryKey:c.wallet.balanceHistory(e??"",t,r),initialPageParam:null,queryFn:async({pageParam:n,signal:i})=>{if(!e)return {entries:[],currentPage:0};let o={"account-name":e,"coin-type":t,"page-size":r,direction:"desc"};n!==null&&(o.page=n);let s=await ee("balance","/accounts/{account-name}/balance-history",o,void 0,void 0,i);return {entries:s.operations_result,currentPage:n??s.total_pages}},getNextPageParam:n=>{let i=n.currentPage-1;return i>=1?i:void 0},enabled:!!e})}function uv(e,t="HIVE",r="yearly"){return reactQuery.queryOptions({queryKey:c.wallet.aggregatedHistory(e??"",t,r),queryFn:async()=>e?await ee("balance","/accounts/{account-name}/aggregated-history",{"account-name":e,"coin-type":t,granularity:r}):[],enabled:!!e,staleTime:6e4})}function fv(){return reactQuery.queryOptions({queryKey:c.accounts.proMembers(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/pro-members",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch pro members: ${e.status}`);return e.json()},staleTime:300*1e3})}function mv(e){return new Set((e??[]).map(t=>t.toLowerCase()))}function bv(e,t,r){let n=reactQuery.useQueryClient(),{data:i}=reactQuery.useQuery(M(e));return v(["accounts","update"],e,o=>{let s=Yn(n.getQueryData(M(e).queryKey),i);if(!s)throw new Error("[SDK][Accounts] \u2013 cannot update not existing account");return [["account_update2",{account:e,json_metadata:"",extensions:[],posting_json_metadata:Xn({existingPostingJsonMetadata:s.posting_json_metadata,profile:o.profile,tokens:o.tokens})}]]},async(o,s)=>{n.setQueryData(M(e).queryKey,a=>{if(!a)return a;let u=JSON.parse(JSON.stringify(a));return u.profile=pr({existingProfile:Jn(a),profile:s.profile,tokens:s.tokens}),u}),await S(t?.adapter,r,[c.accounts.full(e)]);},t,void 0,{broadcastMode:r,onMutate:async()=>{if(e)try{await n.fetchQuery({...M(e),staleTime:0});}catch{}}})}function xv(e,t,r,n,i){return reactQuery.useMutation({mutationKey:["accounts","relation","update",e,t],mutationFn:async o=>{let s=ei(e,t);await b().prefetchQuery(s);let a=b().getQueryData(s.queryKey);return await Vn(e,"follow",["follow",{follower:e,following:t,what:[...o==="toggle-ignore"&&!a?.ignores?["ignore"]:[],...o==="toggle-follow"&&!a?.follows?["blog"]:[]]}],r),{...a,ignores:o==="toggle-ignore"?!a?.ignores:a?.ignores,follows:o==="toggle-follow"?!a?.follows:a?.follows}},onError:i,onSuccess(o){n(o),b().setQueryData(c.accounts.relations(e,t),o),t&&b().invalidateQueries(M(t));}})}function fr(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildVoteOp] Missing required parameters");if(n<-1e4||n>1e4)throw new Error("[SDK][buildVoteOp] Weight must be between -10000 and 10000");return ["vote",{voter:e,author:t,permlink:r,weight:n}]}function Ie(e,t,r,n,i,o,s){if(!e||!t||n===void 0||!o)throw new Error("[SDK][buildCommentOp] Missing required parameters");return ["comment",{parent_author:r,parent_permlink:n,author:e,permlink:t,title:i,body:o,json_metadata:JSON.stringify(s)}]}function De(e,t,r,n,i,o,s){if(!e||!t)throw new Error("[SDK][buildCommentOptionsOp] Missing required parameters");return ["comment_options",{author:e,permlink:t,max_accepted_payout:r,percent_hbd:n,allow_votes:i,allow_curation_rewards:o,extensions:s}]}function mr(e,t){if(!e||!t)throw new Error("[SDK][buildDeleteCommentOp] Missing required parameters");return ["delete_comment",{author:e,permlink:t}]}function gr(e,t,r,n=false){if(!e||!t||!r)throw new Error("[SDK][buildReblogOp] Missing required parameters");let i={account:e,author:t,permlink:r};return n&&(i.delete="delete"),["custom_json",{id:"follow",json:JSON.stringify(["reblog",i]),required_auths:[],required_posting_auths:[e]}]}function Ke(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferOp] Missing required parameters");return ["transfer",{from:e,to:t,amount:r,memo:n||""}]}function Nc(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiTransferOps] Missing required parameters");return t.trim().split(/[\s,]+/).filter(Boolean).map(o=>Ke(e,o.trim(),r,n))}function Qc(e,t,r,n,i,o){if(!e||!t||!r)throw new Error("[SDK][buildRecurrentTransferOp] Missing required parameters");if(i<24)throw new Error("[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours");return ["recurrent_transfer",{from:e,to:t,amount:r,memo:n||"",recurrence:i,executions:o,extensions:[]}]}function je(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferToSavingsOp] Missing required parameters");return ["transfer_to_savings",{from:e,to:t,amount:r,memo:n||""}]}function Be(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildTransferFromSavingsOp] Missing required parameters");return ["transfer_from_savings",{from:e,to:t,amount:r,memo:n||"",request_id:i}]}function Ai(e,t){if(!e||t===void 0)throw new Error("[SDK][buildCancelTransferFromSavingsOp] Missing required parameters");return ["cancel_transfer_from_savings",{from:e,request_id:t}]}function nt(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildClaimInterestOps] Missing required parameters");return [Be(e,t,r,n,i),Ai(e,i)]}function it(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildTransferToVestingOp] Missing required parameters");return ["transfer_to_vesting",{from:e,to:t,amount:r}]}function ot(e,t){if(!e||!t)throw new Error("[SDK][buildWithdrawVestingOp] Missing required parameters");return ["withdraw_vesting",{account:e,vesting_shares:t}]}function st(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildDelegateVestingSharesOp] Missing required parameters");return ["delegate_vesting_shares",{delegator:e,delegatee:t,vesting_shares:r}]}function at(e,t,r,n){if(!e||!t||r===void 0)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters");if(r<0||r>1e4)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");return ["set_withdraw_vesting_route",{from_account:e,to_account:t,percent:r,auto_vest:n}]}function ct(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildConvertOp] Missing required parameters");return ["convert",{owner:e,amount:t,requestid:r}]}function yr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildCollateralizedConvertOp] Missing required parameters");return ["collateralized_convert",{owner:e,amount:t,requestid:r}]}function Me(e,t,r,n="tokens"){return ["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:JSON.stringify({contractName:n,contractAction:t,contractPayload:r})}]}function hr(e,t){return ["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:JSON.stringify(t.map(r=>({symbol:r})))}]}function wr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildDelegateRcOp] Missing required parameters");let n=t.includes(",")?t.split(",").map(i=>i.trim()):[t];return ["custom_json",{id:"rc",json:JSON.stringify(["delegate_rc",{from:e,delegatees:n,max_rc:r}]),required_auths:[],required_posting_auths:[e]}]}function _r(e,t){if(!e||!t)throw new Error("[SDK][buildFollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["blog"]}]),required_auths:[],required_posting_auths:[e]}]}function Tt(e,t){if(!e||!t)throw new Error("[SDK][buildUnfollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:[]}]),required_auths:[],required_posting_auths:[e]}]}function Hc(e,t){if(!e||!t)throw new Error("[SDK][buildIgnoreOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["ignore"]}]),required_auths:[],required_posting_auths:[e]}]}function Uc(e,t){if(!e||!t)throw new Error("[SDK][buildUnignoreOp] Missing required parameters");return Tt(e,t)}function br(e,t){if(!e)throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");let r=t||new Date().toISOString().split(".")[0],n=["custom_json",{id:"notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}],i=["custom_json",{id:"ecency_notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}];return [n,i]}function vr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");return ["account_witness_vote",{account:e,witness:t,approve:r}]}function Ar(e,t){if(!e||t===void 0)throw new Error("[SDK][buildWitnessProxyOp] Missing required parameters");return ["account_witness_proxy",{account:e,proxy:t}]}function Pr(e,t){if(!e||!t.receiver||!t.subject||!t.permlink||!t.start||!t.end||!t.dailyPay)throw new Error("[SDK][buildProposalCreateOp] Missing required parameters");let r=new Date(t.start),n=new Date(t.end);if(r.toString()==="Invalid Date"||n.toString()==="Invalid Date")throw new Error("[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings");return ["create_proposal",{creator:e,receiver:t.receiver,start_date:t.start,end_date:t.end,daily_pay:t.dailyPay,subject:t.subject,permlink:t.permlink,extensions:[]}]}function Or(e,t,r){if(!e||!t||t.length===0||r===void 0)throw new Error("[SDK][buildProposalVoteOp] Missing required parameters");return ["update_proposal_votes",{voter:e,proposal_ids:t,approve:r,extensions:[]}]}function Vc(e,t){if(!e||!t||t.length===0)throw new Error("[SDK][buildRemoveProposalOp] Missing required parameters");return ["remove_proposal",{proposal_owner:e,proposal_ids:t,extensions:[]}]}function jc(e,t,r,n,i){if(e==null||typeof e!="number"||!t||!r||!n||!i)throw new Error("[SDK][buildUpdateProposalOp] Missing required parameters");return ["update_proposal",{proposal_id:e,creator:t,daily_pay:r,subject:n,permlink:i,extensions:[]}]}function xr(e,t){if(!e||!t)throw new Error("[SDK][buildSubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["subscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Er(e,t){if(!e||!t)throw new Error("[SDK][buildUnsubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["unsubscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Sr(e,t,r,n){if(!e||!t||!r||!n)throw new Error(`[SDK][buildSetRoleOp] Missing required parameters: username=${e}, community=${t}, account=${r}, role=${n}`);return ["custom_json",{id:"community",json:JSON.stringify(["setRole",{community:t,account:r,role:n}]),required_auths:[],required_posting_auths:[e]}]}function kr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildUpdateCommunityOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["updateProps",{community:t,props:r}]),required_auths:[],required_posting_auths:[e]}]}function Cr(e,t,r,n,i){if(!e||!t||!r||!n||i===void 0)throw new Error("[SDK][buildPinPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"pinPost":"unpinPost",{community:t,account:r,permlink:n}]),required_auths:[],required_posting_auths:[e]}]}function Tr(e,t,r,n,i,o){if(!e||!t||!r||!n||o===void 0)throw new Error("[SDK][buildMutePostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([o?"mutePost":"unmutePost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}function Lc(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildMuteUserOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"muteUser":"unmuteUser",{community:t,account:r,notes:n}]),required_auths:[],required_posting_auths:[e]}]}function $c(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildFlagPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["flagPost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}var Pi=(r=>(r.Buy="buy",r.Sell="sell",r))(Pi||{}),Oi=(r=>(r.EMPTY="",r.SWAP="9",r))(Oi||{});function Ft(e,t,r,n,i,o){if(!e||!t||!r||!i||o===void 0)throw new Error("[SDK][buildLimitOrderCreateOp] Missing required parameters");return ["limit_order_create",{owner:e,orderid:o,amount_to_sell:t,min_to_receive:r,fill_or_kill:n,expiration:i}]}function Rt(e,t=3){return e.toFixed(t)}function Wc(e,t,r,n,i=""){if(!e||n===void 0||!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new Error("[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters");let o=new Date(Date.now());o.setDate(o.getDate()+27);let s=o.toISOString().split(".")[0],a=+`${i}${Math.floor(Date.now()/1e3).toString().slice(2)}`,u=n==="buy"?`${Rt(t,3)} HBD`:`${Rt(t,3)} HIVE`,p=n==="buy"?`${Rt(r,3)} HIVE`:`${Rt(r,3)} HBD`;return Ft(e,u,p,false,s,a)}function Rr(e,t){if(!e||t===void 0)throw new Error("[SDK][buildLimitOrderCancelOp] Missing required parameters");return ["limit_order_cancel",{owner:e,orderid:t}]}function Fr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildClaimRewardBalanceOp] Missing required parameters");return ["claim_reward_balance",{account:e,reward_hive:t,reward_hbd:r,reward_vests:n}]}function Gc(e,t,r,n,i,o){if(!e||!i)throw new Error("[SDK][buildAccountUpdateOp] Missing required parameters");return ["account_update",{account:e,owner:t,active:r,posting:n,memo_key:i,json_metadata:o}]}function zc(e,t,r,n){if(!e||r===void 0)throw new Error("[SDK][buildAccountUpdate2Op] Missing required parameters");return ["account_update2",{account:e,json_metadata:t||"",posting_json_metadata:r,extensions:n||[]}]}function qr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildAccountCreateOp] Missing required parameters");let i={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},o={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},s={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["account_create",{creator:e,new_account_name:t,owner:i,active:o,posting:s,memo_key:r.memoPublicKey,json_metadata:"",fee:n}]}function Ir(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildCreateClaimedAccountOp] Missing required parameters");let n={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},i={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},o={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["create_claimed_account",{creator:e,new_account_name:t,owner:n,active:i,posting:o,memo_key:r.memoPublicKey,json_metadata:"",extensions:[]}]}function Dr(e,t){if(!e||!t)throw new Error("[SDK][buildClaimAccountOp] Missing required parameters");return ["claim_account",{creator:e,fee:t,extensions:[]}]}function Kr(e,t,r,n,i,o){if(!e||!t||!r||!i)throw new Error("[SDK][buildGrantPostingPermissionOp] Missing required parameters");let s=t.account_auths.findIndex(([p])=>p===r),a=[...t.account_auths];s>=0?a[s]=[r,n]:a.push([r,n]);let u={...t,account_auths:a};return u.account_auths.sort((p,l)=>p[0]>l[0]?1:-1),["account_update",{account:e,posting:u,memo_key:i,json_metadata:o}]}function Jc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildRevokePostingPermissionOp] Missing required parameters");let o={...t,account_auths:t.account_auths.filter(([s])=>s!==r)};return ["account_update",{account:e,posting:o,memo_key:n,json_metadata:i}]}function Yc(e,t,r=[]){if(!e||!t)throw new Error("[SDK][buildChangeRecoveryAccountOp] Missing required parameters");return ["change_recovery_account",{account_to_recover:e,new_recovery_account:t,extensions:r}]}function Xc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");return ["request_account_recovery",{recovery_account:e,account_to_recover:t,new_owner_authority:r,extensions:n}]}function Zc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRecoverAccountOp] Missing required parameters");return ["recover_account",{account_to_recover:e,new_owner_authority:t,recent_owner_authority:r,extensions:n}]}function Br(e,t,r){if(!e||!t||!Number.isFinite(r))throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");return ["custom_json",{id:"ecency_boost_plus",json:JSON.stringify({user:e,account:t,duration:r}),required_auths:[e],required_posting_auths:[]}]}function Mr(e,t){if(!e||!Number.isInteger(t)||t<=0)throw new Error("[SDK][buildRcDelegationOp] Missing or invalid parameters");return ["custom_json",{id:"ecency_rc_delegation",json:JSON.stringify({user:e,duration:t}),required_auths:[e],required_posting_auths:[]}]}function Nr(e,t,r,n){if(!e||!t||!r||!Number.isFinite(n))throw new Error("[SDK][buildPromoteOp] Missing required parameters");return ["custom_json",{id:"ecency_promote",json:JSON.stringify({user:e,author:t,permlink:r,duration:n}),required_auths:[e],required_posting_auths:[]}]}function Le(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildPointTransferOp] Missing required parameters");let i=r.replace(/POINTS\b/,"POINT");return ["custom_json",{id:"ecency_point_transfer",json:JSON.stringify({sender:e,receiver:t,amount:i,memo:n||""}),required_auths:[e],required_posting_auths:[]}]}function eu(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");let i=t.trim().split(/[\s,]+/).filter(Boolean);if(i.length===0)throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");return i.map(o=>Le(e,o.trim(),r,n))}function Qr(e){if(!e)throw new Error("[SDK][buildCommunityRegistrationOp] Missing required parameters");return ["custom_json",{id:"ecency_registration",json:JSON.stringify({name:e}),required_auths:[e],required_posting_auths:[]}]}function tu(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildActiveCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[e],required_posting_auths:[]}]}function ru(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildPostingCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[],required_posting_auths:[e]}]}function $v(e,t,r){return v(["accounts","follow"],e,({following:n})=>[_r(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function Jv(e,t,r){return v(["accounts","unfollow"],e,({following:n})=>[Tt(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function eA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","bookmarks","add",e],mutationFn:async({author:i,permlink:o})=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:i,permlink:o,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function iA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","bookmarks","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:i,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function cA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","favorites","add",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/favorites-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})})).json()},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:n})}function fA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","favorites","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");let s=await w()(d.privateApiHost+"/private-api/favorites-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})});if(!s.ok)throw new Error(`Failed to delete favorite: ${s.status}`);return s.json()},onMutate:async i=>{if(!e)return;let o=b(),s=c.accounts.favorites(e),a=c.accounts.favoritesInfinite(e),u=c.accounts.checkFavorite(e,i);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a}),o.cancelQueries({queryKey:u})]);let p=o.getQueryData(s);p&&o.setQueryData(s,p.filter(y=>y.account!==i));let l=o.getQueryData(u);o.setQueryData(u,false);let f=o.getQueriesData({queryKey:a}),m=new Map(f);for(let[y,h]of f)h&&o.setQueryData(y,{...h,pages:h.pages.map(E=>({...E,data:E.data.filter(O=>O.account!==i)}))});return {previousList:p,previousInfinite:m,previousCheck:l}},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.accounts.favorites(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);s?.previousCheck!==void 0&&a.setQueryData(c.accounts.checkFavorite(e,o),s.previousCheck),n(i);}})}function uu(e,t){let r=new Map;return e.forEach(([n,i])=>{r.set(n.toString(),i);}),t.forEach(([n,i])=>{r.set(n.toString(),i);}),Array.from(r.entries()).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i])}function xi(e,t){let{data:r}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","keys-update",e],mutationFn:async({keys:n,keepCurrent:i=false,currentKey:o,keysToRevoke:s=[],keysToRevokeByAuthority:a={}})=>{if(n.length===0)throw new Error("[SDK][Update password] \u2013 no new keys provided");if(!r)throw new Error("[SDK][Update password] \u2013 cannot update keys for anon user");let u=p=>{let l=JSON.parse(JSON.stringify(r[p])),m=[...a[p]||[],...a[p]===void 0?s:[]],y=i?l.key_auths.filter(([h])=>!m.includes(h.toString())):[];return l.key_auths=uu(y,n.map((h,E)=>[h[p].createPublic().toString(),E+1])),l};return Z([["account_update",{account:e,json_metadata:r.json_metadata,owner:u("owner"),active:u("active"),posting:u("posting"),memo_key:n[0].memo_key.createPublic().toString()}]],o)},...t})}function PA(e,t){let{data:r}=reactQuery.useQuery(M(e)),{mutateAsync:n}=xi(e);return reactQuery.useMutation({mutationKey:["accounts","password-update",e],mutationFn:async({newPassword:i,currentPassword:o,keepCurrent:s})=>{if(!r)throw new Error("[SDK][Update password] \u2013 cannot update password for anon user");let a=H.fromLogin(e,o,"owner");return n({currentKey:a,keepCurrent:s,keys:[{owner:H.fromLogin(e,i,"owner"),active:H.fromLogin(e,i,"active"),posting:H.fromLogin(e,i,"posting"),memo_key:H.fromLogin(e,i,"memo")}]})},...t})}function CA(e,t,r){let n=reactQuery.useQueryClient(),{data:i}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","revoke-posting",i?.name],mutationFn:async({accountName:o,type:s,key:a})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user");let u=JSON.parse(JSON.stringify(i.posting));u.account_auths=u.account_auths.filter(([l])=>l!==o);let p={account:i.name,posting:u,memo_key:i.memo_key,json_metadata:i.json_metadata};if(s==="key"&&a)return Z([["account_update",p]],a);if(s==="keychain"){if(!r?.broadcast)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return r.broadcast([["account_update",p]],"active")}else return !t.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing."),Un__default.default.sendOperation(["account_update",p],t.hsCallbackUrl?{callback:t.hsCallbackUrl}:{},()=>{})},onError:t.onError,onSuccess:(o,s,a)=>{t.onSuccess?.(o,s,a),n.setQueryData(M(e).queryKey,u=>({...u,posting:{...u?.posting,account_auths:u?.posting?.account_auths?.filter(([p])=>p!==s.accountName)??[]}}));}})}function KA(e,t,r,n){let{data:i}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","recovery",i?.name],mutationFn:async({accountName:o,type:s,key:a,email:u})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user");let p={account_to_recover:i.name,new_recovery_account:o,extensions:[]};if(s==="ecency"){if(!t)throw new Error("[SDK][Accounts] \u2013 missing access token");let f=await w()(d.privateApiHost+"/private-api/recoveries-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,email:u,publicKeys:[...i.owner.key_auths,...i.active.key_auths,...i.posting.key_auths,i.memo_key]})});if(!f.ok)throw new Error(`[SDK][Accounts] Failed to add recovery: ${f.status}`);return f}else {if(s==="key"&&a)return Z([["change_recovery_account",p]],a);if(s==="keychain"){if(!n?.broadcast)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return n.broadcast([["change_recovery_account",p]],"owner")}else return !r.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing."),Un__default.default.sendOperation(["change_recovery_account",p],r.hsCallbackUrl?{callback:r.hsCallbackUrl}:{},()=>{})}},onError:r.onError,onSuccess:r.onSuccess})}function MA(e,t){let r=e.key_auths.filter(([i])=>!t.has(String(i))).reduce((i,[,o])=>i+o,0),n=(e.account_auths??[]).reduce((i,[,o])=>i+o,0);return r+n>=e.weight_threshold}function Ei(e,t){let r=new Set(t.map(s=>s.toString())),n=s=>s.key_auths.some(([a])=>r.has(String(a))),i=s=>{let a=JSON.parse(JSON.stringify(s));return a.key_auths=a.key_auths.filter(([u])=>!r.has(u.toString())),a},o=n(e.owner);return {account:e.name,json_metadata:e.json_metadata,owner:o?i(e.owner):void 0,active:i(e.active),posting:i(e.posting),memo_key:e.memo_key}}function jA(e,t){let{data:r}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","revoke-key",r?.name],mutationFn:async({currentKey:n,revokingKey:i})=>{if(!r)throw new Error("[SDK][Revoke key] \u2013 cannot update keys for anon user");let o=Array.isArray(i)?i:[i],s=Ei(r,o);return Z([["account_update",s]],n)},...t})}function GA(e,t,r){return v(["accounts","claimAccount"],e,({creator:n,fee:i="0.000 HIVE"})=>[Dr(n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(i.creator)]);},t,"active",{broadcastMode:r})}function XA(e,t,r){return v(["accounts","grant-posting-permission"],e,n=>[Kr(e,n.currentPosting,n.grantedAccount,n.weightThreshold,n.memoKey,n.jsonMetadata)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}function rP(e,t,r){return v(["accounts","create"],e,n=>[n.useClaimed?Ir(e,n.newAccountName,n.keys):qr(e,n.newAccountName,n.keys,n.fee)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}var Hr=300*60*24,vu=1e4,Au=5e7;function Si(e){let t=C(e.vesting_shares).amount,r=C(e.received_vesting_shares).amount,n=C(e.delegated_vesting_shares).amount,i=C(e.vesting_withdraw_rate).amount,o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t+r-n-s}function Pu(e,t,r){let n=e*1e6;return (t*r/1e4/50+1)*n/1e4}function Ou(e){if(Number.isFinite(e.lastHardfork))return e.lastHardfork>=28;let[t="0",r="0"]=(e.currentHardforkVersion??"0.0.0").split(".");return Number(t)>1||Number(t)===1&&Number(r)>=28}function xu(e,t,r){let n=t.votePowerReserveRate||Number(t.raw?.globalDynamic?.vote_power_reserve_rate??0);if(!Number.isFinite(n)||n<=0)return 0;let i=Si(e);if(!Number.isFinite(i)||i<=0)return 0;let o=i*1e6,s=Math.ceil(o*r*60*60*24/vu/(n*Hr)),a=ar(e),u=Math.min(a.current_mana,a.max_mana);return !Number.isFinite(u)||s>u?0:Math.max(s-Au,0)}function Eu(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;if(Ou(t))return xu(e,t,n);let i=0;try{if(i=Si(e),!Number.isFinite(i))return 0}catch{return 0}return Pu(i,r,n)}function sP(e){return ar(e).percentage/100}function aP(e){if(!Number.isFinite(e))throw new TypeError("Voting power must be a finite number");if(e<0||e>100)throw new RangeError("Voting power must be between 0 and 100");return (100-e)*100*Hr/1e4}function cP(e){let t=parseFloat(e.vesting_shares)+parseFloat(e.received_vesting_shares)-parseFloat(e.delegated_vesting_shares),r=Math.floor(Date.now()/1e3)-e.downvote_manabar.last_update_time,n=t*1e6/4;if(n<=0)return 0;let i=parseFloat(e.downvote_manabar.current_mana.toString())+r*n/Hr;i>n&&(i=n);let o=i*100/n;return isNaN(o)?0:o>100?100:o}function uP(e){return Ot(e).percentage/100}function pP(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;let{fundRecentClaims:i,fundRewardBalance:o,base:s,quote:a}=t;if(!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(a)||i===0||a===0)return 0;let u=Eu(e,t,r,n);return Number.isFinite(u)?u/i*o*(s/a):0}var Su={vote:"posting",comment:"posting",delete_comment:"posting",comment_options:"posting",claim_reward_balance:"posting",cancel_transfer_from_savings:"active",collateralized_convert:"active",convert:"active",delegate_vesting_shares:"active",recurrent_transfer:"active",set_withdraw_vesting_route:"active",transfer:"active",transfer_from_savings:"active",transfer_to_savings:"active",transfer_to_vesting:"active",withdraw_vesting:"active",limit_order_create:"active",limit_order_cancel:"active",account_update:"active",account_update2:"active",claim_account:"active",create_claimed_account:"active",account_witness_proxy:"active",account_witness_vote:"active",remove_proposal:"active",update_proposal_votes:"active",change_recovery_account:"owner",request_account_recovery:"owner",recover_account:"owner",reset_account:"owner",set_reset_account:"owner"};function ku(e){let t=e[0],r=e[1];if(t!=="custom_json")throw new Error("Operation is not a custom_json operation");let n=r;return n.required_auths&&n.required_auths.length>0?"active":(n.required_posting_auths&&n.required_posting_auths.length>0,"posting")}function Cu(e){let t=e[0];if(t!=="create_proposal"&&t!=="update_proposal")throw new Error("Operation is not a proposal operation");return "active"}function Tu(e){let t=e[0];return t==="custom_json"?ku(e):t==="create_proposal"||t==="update_proposal"?Cu(e):Su[t]??"posting"}function dP(e){let t="posting";for(let r of e){let n=Tu(r);if(n==="owner")return "owner";n==="active"&&t==="posting"&&(t="active");}return t}function hP(e){return reactQuery.useMutation({mutationKey:["operations","sign",e],mutationFn:({operation:t,keyOrSeed:r})=>{if(!e)throw new Error("[Operations][Sign] \u2013 cannot sign op with anon user");let n;return r.split(" ").length===12?n=H.fromLogin(e,r,"active"):Mn(r)?n=H.fromString(r):n=H.from(r),Z([t],n)}})}function bP(e,t,r="active"){return reactQuery.useMutation({mutationKey:["operations","sign-keychain",e],mutationFn:({operation:n})=>{if(!e)throw new Error("[SDK][Keychain] \u2013\xA0cannot sign operation with anon user");if(!t?.broadcast)throw new Error("[SDK][Keychain] \u2013 missing keychain broadcaster");return t.broadcast([n],r)}})}function OP(e="/"){return reactQuery.useMutation({mutationKey:["operations","sign-hivesigner",e],mutationFn:async({operation:t})=>Un__default.default.sendOperation(t,{callback:e},()=>{})})}function kP(){return reactQuery.queryOptions({queryKey:["operations","chain-properties"],queryFn:async()=>await g("condenser_api.get_chain_properties",[])})}function ki(e,t,r){return {...e,...t??{},title:r.title,body:r.body}}function Ci(e,t){return {...e??{},title:t.title,body:t.body}}function KP(e,t){return reactQuery.useMutation({mutationKey:["posts","add-fragment",e],mutationFn:async({title:r,body:n})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let o=await w()(d.privateApiHost+"/private-api/fragments-add",{method:"POST",body:JSON.stringify({code:t,title:r,body:n}),headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`[SDK][Posts] Failed to add fragment: ${o.status}`);return o.json()},onSuccess(r,n){let i=b(),o=Ci(r,n);i.setQueryData(Ve(e,t).queryKey,s=>[o,...s??[]]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map((a,u)=>u===0?{...a,data:[o,...a.data]}:a)});}})}function VP(e,t){return reactQuery.useMutation({mutationKey:["posts","edit-fragment",e],mutationFn:async({fragmentId:r,title:n,body:i})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let s=await w()(d.privateApiHost+"/private-api/fragments-update",{method:"POST",body:JSON.stringify({code:t,id:r,title:n,body:i}),headers:{"Content-Type":"application/json"}});if(!s.ok)throw new Error(`[SDK][Posts] Failed to update fragment: ${s.status}`);return s.json()},onSuccess(r,n){let i=b(),o=s=>ki(s,r,n);i.setQueryData(Ve(e,t).queryKey,s=>s?.map(a=>a.id===n.fragmentId?o(a):a)??[]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map(a=>({...a,data:a.data.map(u=>u.id===n.fragmentId?o(u):u)}))});}})}function zP(e,t){return reactQuery.useMutation({mutationKey:["posts","remove-fragment",e],mutationFn:async({fragmentId:r})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let i=await w()(d.privateApiHost+"/private-api/fragments-delete",{method:"POST",body:JSON.stringify({code:t,id:r}),headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`[SDK][Posts] Failed to delete fragment: ${i.status}`);return i},onSuccess(r,n){let i=b();i.setQueryData(Ve(e,t).queryKey,o=>[...o??[]].filter(({id:s})=>s!==n.fragmentId)),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},o=>o&&{...o,pages:o.pages.map(s=>({...s,data:s.data.filter(a=>a.id!==n.fragmentId)}))});}})}async function G(e){if(!e.ok){let r;try{r=await e.json();}catch{r=void 0;}let n=new Error(`Request failed with status ${e.status}`);throw n.status=e.status,n.data=r,n}let t=await e.text();if(!t||t.trim()==="")return "";try{return JSON.parse(t)}catch(r){return console.warn("[SDK] Failed to parse JSON response:",r,"Response:",t),""}}async function XP(e,t,r,n){let o=await w()(d.privateApiHost+"/private-api/account-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,email:t,referral:r,captcha_token:n})}),s=await G(o);return {status:o.status,data:s}}async function ZP(e){let r=await w()(d.privateApiHost+"/private-api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e})}),n=await G(r);return {status:r.status,data:n}}async function e0(e,t,r="",n=""){let i={code:e,ty:t};r&&(i.bl=r),n&&(i.tx=n);let s=await w()(d.privateApiHost+"/private-api/usr-activity",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});await G(s);}async function t0(e,t,r=null,n=null){let i={code:e};t&&(i.filter=t),r&&(i.since=r),n&&(i.user=n);let s=await w()(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return G(s)}async function r0(e,t,r,n,i,o){let s={code:e,username:t,token:o,system:r,allows_notify:n,notify_types:i},u=await w()(d.privateApiHost+"/private-api/register-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function n0(e,t,r){let n={code:e,username:t,token:r},o=await w()(d.privateApiHost+"/private-api/detail-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function Ti(e,t){let r={code:e};t&&(r.id=t);let i=await w()(d.privateApiHost+"/private-api/notifications/mark",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ri(e,t){let r={code:e,url:t},i=await w()(d.privateApiHost+"/private-api/images-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}var Nu="https://i.ecency.com";async function Fi(e,t,r){let n=w(),i=new FormData;i.append("file",e);let o=await n(`${Nu}/hs/${t}`,{method:"POST",body:i,signal:r});return G(o)}async function i0(e,t,r,n){let i=w(),o=new FormData;o.append("file",e);let s=await i(`${d.imageHost}/${t}/${r}`,{method:"POST",body:o,signal:n});return G(s)}async function qi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/images-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ii(e,t,r,n,i){let o={code:e,title:t,body:r,tags:n,meta:i},a=await w()(d.privateApiHost+"/private-api/drafts-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});return G(a)}async function Di(e,t,r,n,i,o){let s={code:e,id:t,title:r,body:n,tags:i,meta:o},u=await w()(d.privateApiHost+"/private-api/drafts-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function Ki(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/drafts-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Bi(e,t,r,n,i,o,s,a){let u={code:e,permlink:t,title:r,body:n,meta:i,schedule:s,reblog:a};o&&(u.options=o);let l=await w()(d.privateApiHost+"/private-api/schedules-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return G(l)}async function Mi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ni(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function o0(e,t,r){let n={code:e,author:t,permlink:r},o=await w()(d.privateApiHost+"/private-api/promoted-post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function s0(e,t,r){let n={username:e,email:t,friend:r},o=await w()(d.privateApiHost+"/private-api/account-create-friend",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}function l0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","drafts","add",e],mutationFn:async({title:i,body:o,tags:s,meta:a})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addDraft");return Ii(t,i,o,s,a)},onSuccess:i=>{r?.();let o=b();i?.drafts?o.setQueryData(c.posts.drafts(e),i.drafts):o.invalidateQueries({queryKey:c.posts.drafts(e)}),o.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function y0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","drafts","update",e],mutationFn:async({draftId:i,title:o,body:s,tags:a,meta:u})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for updateDraft");return Di(t,i,o,s,a,u)},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function A0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","drafts","delete",e],mutationFn:async({draftId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteDraft");return Ki(t,i)},onMutate:async({draftId:i})=>{if(!e)return;let o=b(),s=c.posts.drafts(e),a=c.posts.draftsInfinite(e);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a})]);let u=o.getQueryData(s);u&&o.setQueryData(s,u.filter(f=>f._id!==i));let p=o.getQueriesData({queryKey:a}),l=new Map(p);for(let[f,m]of p)m&&o.setQueryData(f,{...m,pages:m.pages.map(y=>({...y,data:y.data.filter(h=>h._id!==i)}))});return {previousList:u,previousInfinite:l}},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.posts.drafts(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);n?.(i);}})}function S0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","schedules","add",e],mutationFn:async({permlink:i,title:o,body:s,meta:a,options:u,schedule:p,reblog:l})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addSchedule");return Bi(t,i,o,s,a,u,p,l)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function F0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","schedules","delete",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteSchedule");return Mi(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function B0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","schedules","move",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for moveSchedule");return Ni(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)}),o.invalidateQueries({queryKey:c.posts.drafts(e)});},onError:n})}function U0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","images","add",e],mutationFn:async({url:i,code:o})=>{let s=o??t;if(!e||!s)throw new Error("[SDK][Posts] \u2013 missing auth for addImage");return Ri(s,i)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.images(e)});},onError:n})}function W0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","images","delete",e],mutationFn:async({imageId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteImage");return qi(t,i)},onSuccess:(i,o)=>{r?.();let s=b(),{imageId:a}=o;s.setQueryData(["posts","images",e],u=>u?.filter(p=>p._id!==a)),s.setQueriesData({queryKey:["posts","images","infinite",e]},u=>u&&{...u,pages:u.pages.map(p=>({...p,data:p.data.filter(l=>l._id!==a)}))});},onError:n})}function Y0(e,t){return reactQuery.useMutation({mutationKey:["posts","images","upload"],mutationFn:async({file:r,token:n,signal:i})=>Fi(r,n,i),onSuccess:e,onError:t})}function It(e,t){return `/@${e}/${t}`}function zu(e,t,r){return (r??b()).getQueryData(c.posts.entry(It(e,t)))}function Ju(e,t){(t??b()).setQueryData(c.posts.entry(It(e.author,e.permlink)),e);}function qt(e,t,r,n){let i=n??b(),o=It(e,t),s=i.getQueryData(c.posts.entry(o));if(!s)return;let a=r(s);return i.setQueryData(c.posts.entry(o),a),s}exports.EntriesCacheManagement=void 0;(a=>{function e(u,p,l,f,m){qt(u,p,y=>({...y,active_votes:l,stats:{...y.stats||{gray:false,hide:false,flag_weight:0,total_votes:0},total_votes:l.length,flag_weight:y.stats?.flag_weight||0},total_votes:l.length,payout:f,pending_payout_value:String(f)}),m);}a.updateVotes=e;function t(u,p,l,f){qt(u,p,m=>({...m,reblogs:l}),f);}a.updateReblogsCount=t;function r(u,p,l,f){qt(u,p,m=>({...m,children:l}),f);}a.updateRepliesCount=r;function n(u,p,l,f){qt(p,l,m=>({...m,children:m.children+1,replies:[u,...m.replies]}),f);}a.addReply=n;function i(u,p){u.forEach(l=>Ju(l,p));}a.updateEntries=i;function o(u,p,l){(l??b()).invalidateQueries({queryKey:c.posts.entry(It(u,p))});}a.invalidateEntry=o;function s(u,p,l){return zu(u,p,l)}a.getEntry=s;})(exports.EntriesCacheManagement||={});function Yu(e,t,r){let n=e.some(i=>i.voter===t);return r!==0?n:!n}function Xu(e,t,r){let n=exports.EntriesCacheManagement.getEntry(t.author,t.permlink,r);if(!n?.active_votes||Yu(n.active_votes,e,t.weight))return;let i=[...n.active_votes.filter(s=>s.voter!==e),...t.weight!==0?[{rshares:t.weight,voter:e}]:[]],o=n.payout+(t.estimated??0);exports.EntriesCacheManagement.updateVotes(t.author,t.permlink,i,o,r);}function iO(e,t,r){return v(["posts","vote"],e,({author:n,permlink:i,weight:o})=>[fr(e,n,i,o)],async(n,i)=>{Xu(e,i);let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(120,o,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let s=()=>{t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.accounts.full(e)]);};(r??"async")==="async"?setTimeout(s,4e3):s();}},t,"posting",{broadcastMode:r??"async"})}function uO(e,t,r){return v(["posts","reblog"],e,({author:n,permlink:i,deleteReblog:o})=>[gr(e,n,i,o??false)],async(n,i)=>{let o=exports.EntriesCacheManagement.getEntry(i.author,i.permlink);if(o){let p=Math.max(0,(o.reblogs??0)+(i.deleteReblog?-1:1));exports.EntriesCacheManagement.updateReblogsCount(i.author,i.permlink,p);}let s=n?.id??n?.tx_id;t?.adapter?.recordActivity&&s&&t.adapter.recordActivity(130,s,n?.block_num).catch(()=>{});let a=()=>{b().invalidateQueries({queryKey:c.posts.accountPostsBlogPrefix(e)}),t?.adapter?.invalidateQueries&&t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.posts.rebloggedBy(i.author,i.permlink)]);};(r??"async")==="async"?setTimeout(a,4e3):a();},t,"posting",{broadcastMode:r??"async"})}function fO(e,t,r){return v(["posts","comment"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=!i.parentAuthor,s=o?100:110,a=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&a&&t.adapter.recordActivity(s,a,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let u=[c.accounts.full(e),c.resourceCredits.account(e)];if(!o){u.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let p=i.rootAuthor||i.parentAuthor,l=i.rootPermlink||i.parentPermlink;u.push({predicate:f=>{let m=f.queryKey;return Array.isArray(m)&&m[0]==="posts"&&m[1]==="discussions"&&m[2]===p&&m[3]===l}});}await t.adapter.invalidateQueries(u);}},t,"posting",{broadcastMode:r})}function yO(e,t,r,n){let i=n??b(),o=i.getQueriesData({predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="discussions"&&a[2]===t&&a[3]===r}});for(let[s,a]of o)a&&i.setQueryData(s,[e,...a]);}function Qi(e,t,r,n,i){let o=i??b(),s=new Map,a=o.getQueriesData({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===r&&p[3]===n}});for(let[u,p]of a)p&&(s.set(u,p),o.setQueryData(u,p.filter(l=>l.author!==e||l.permlink!==t)));return s}function Hi(e,t){let r=t??b();for(let[n,i]of e)r.setQueryData(n,i);}function hO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`,s=i.getQueryData(c.posts.entry(o));return s&&i.setQueryData(c.posts.entry(o),{...s,...r}),s}function wO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`;i.setQueryData(c.posts.entry(o),r);}function PO(e,t,r){return v(["posts","deleteComment"],e,({author:n,permlink:i})=>[mr(n,i)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e)];if(i.parentAuthor&&i.parentPermlink){o.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let s=i.rootAuthor||i.parentAuthor,a=i.rootPermlink||i.parentPermlink;o.push({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===s&&p[3]===a}});}await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r,onMutate:async n=>{let i=n.rootAuthor||n.parentAuthor,o=n.rootPermlink||n.parentPermlink;return i&&o?{snapshots:Qi(n.author,n.permlink,i,o)}:{}},onError:(n,i,o)=>{let{snapshots:s}=o??{};s&&Hi(s);}})}function SO(e,t,r){return v(["posts","cross-post"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,"",n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true}=n.options;i.push(De(n.author,n.permlink,o,s,a,u,[]));}return i},async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e),{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.parentPermlink}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"async"})}function RO(e,t,r){return v(["posts","update-reply"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(110,o,n?.block_num).catch(s=>{console.debug("[SDK][Posts][useUpdateReply] recordActivity failed",{activityType:110,blockNum:n?.block_num,transactionId:o,error:s});}),t?.adapter?.invalidateQueries){let s=[c.resourceCredits.account(e)];s.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let a=i.rootAuthor||i.parentAuthor,u=i.rootPermlink||i.parentPermlink;s.push({predicate:p=>{let l=p.queryKey;return Array.isArray(l)&&l[0]==="posts"&&l[1]==="discussions"&&l[2]===a&&l[3]===u}}),await t.adapter.invalidateQueries(s);}},t,"posting",{broadcastMode:r})}function DO(e,t,r){return v(["ecency","promote"],e,({author:n,permlink:i,duration:o})=>[Nr(e,n,i,o)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.posts._promotedPrefix],[...c.points._prefix(e)],c.posts.entry(`/@${i.author}/${i.permlink}`)]);},t,"active",{broadcastMode:r})}var Zu=[3e3,3e3,3e3],ep=e=>new Promise(t=>setTimeout(t,e));async function tp(e,t){return g("condenser_api.get_content",[e,t])}async function rp(e,t,r=0,n){let i=n?.delays??Zu,o;try{o=await tp(e,t);}catch{o=void 0;}if(o||r>=i.length)return;let s=i[r];return s>0&&await ep(s),rp(e,t,r+1,n)}var $e={};ft($e,{useRecordActivity:()=>Ur});function ip(){return typeof window<"u"&&window.location?{url:window.location.href,domain:window.location.host}:{url:"",domain:""}}function Ur(e,t,r){return reactQuery.useMutation({mutationKey:["analytics",t],mutationFn:async()=>{if(!t)throw new Error("[SDK][Analytics] \u2013 no activity type provided");let n=w(),i=ip(),o=r?.url??i.url,s=r?.domain??i.domain;try{await n(d.plausibleHost+"/api/event",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,url:o,domain:s,props:{username:e}})});}catch{}}})}function LO(e){return reactQuery.queryOptions({queryKey:["analytics","discover-leaderboard",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/leaderboard/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch leaderboard: ${r.status}`);return r.json()}})}function JO(e){return reactQuery.queryOptions({queryKey:["analytics","discover-curation",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/curation/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch curation data: ${r.status}`);let n=await r.json(),i=n.map(s=>s.account),o=await g("condenser_api.get_accounts",[i]);for(let s=0;sa.efficiency-s.efficiency),n}})}function ex(e,t=[],r=["visitors","pageviews","visit_duration"],n){let i=[...t].sort(),o=[...r].sort();return reactQuery.queryOptions({queryKey:["analytics","page-stats",e,i,o,n],queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/api/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,date_range:n}),signal:s});if(!a.ok)throw new Error(`Failed to fetch page stats: ${a.status}`);return a.json()},enabled:!!e,staleTime:0})}var Dt="threespeakfund",sx=1100;function cp(e){return /https?:\/\/([a-z0-9-]+\.)*3speak\.tv\/embed[?/]/i.test(e)}function ax(e,t){if(!cp(t))return e;let r=e.find(n=>n.account===Dt);return r&&r.weight===1100?e:r?e.map(n=>n.account===Dt?{...n,weight:1100}:n):[...e,{account:Dt,weight:1100}]}function cx(e){return e===Dt}var Lr={};ft(Lr,{getAccountTokenQueryOptions:()=>jr,getAccountVideosQueryOptions:()=>mp});var Vr={};ft(Vr,{getDecodeMemoQueryOptions:()=>lp});function lp(e,t,r){return reactQuery.queryOptions({queryKey:["integrations","hivesigner","decode-memo",e],queryFn:async()=>{if(r)return new Un__default.default.Client({accessToken:r}).decode(t)}})}var Ui={queries:Vr};function jr(e,t){return reactQuery.queryOptions({queryKey:["integrations","3speak","authenticate",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let n=await w()(`https://studio.3speak.tv/mobile/login?username=${e}&hivesigner=true`,{headers:{"Content-Type":"application/json"}}),i=Ui.queries.getDecodeMemoQueryOptions(e,(await n.json()).memo,t);await b().prefetchQuery(i);let{memoDecoded:o}=b().getQueryData(i.queryKey);return o.replace("#","")}})}function mp(e,t){return reactQuery.queryOptions({queryKey:["integrations","3speak","videos",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let r=jr(e,t);await b().prefetchQuery(r);let n=b().getQueryData(r.queryKey);if(!n)throw new Error("[SDK][Integrations][3Speak] \u2013 missing account token");return await(await w()("https://studio.3speak.tv/mobile/api/my-videos",{headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}})).json()}})}var xx={queries:Lr};function Rx(e){return reactQuery.queryOptions({queryKey:["integrations","hiveposh","links",e],retry:false,queryFn:async()=>{try{let r=await w()(`https://hiveposh.com/api/v0/linked-accounts/${e}`,{headers:{"Content-Type":"application/json"}});if(r.status===400&&(await r.json().catch(()=>({})))?.message==="User Not Connected"||!r.ok)return null;let n=await r.json();return {twitter:{username:n.twitter_username,profile:n.twitter_profile},reddit:{username:n.reddit_username,profile:n.reddit_profile}}}catch{return null}}})}function Dx({url:e,dimensions:t=[],metrics:r=["visitors","pageviews","visit_duration"],filterBy:n="event:page",dateRange:i,enabled:o=true}){return reactQuery.queryOptions({queryKey:["integrations","plausible",e,t,r,n,i],queryFn:async()=>{let a=await w()(`${d.privateApiHost}/api/stats`,{method:"POST",body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,filterBy:n,...i?{date_range:i}:{}}),headers:{"Content-Type":"application/json"}});if(!a.ok)throw new Error(`Failed to fetch Plausible stats: ${a.status}`);return await a.json()},enabled:!!e&&o,retry:1})}function Nx(){return reactQuery.queryOptions({queryKey:["resource-credits","stats"],queryFn:async()=>(await g("rc_api.get_rc_stats",{})).rc_stats})}function Vx(e){return reactQuery.queryOptions({queryKey:["resource-credits","account",e],queryFn:async()=>(await g("rc_api.find_rc_accounts",{accounts:[e]})).rc_accounts,enabled:!!e})}var Vi={ready:false,currentMana:0,maxMana:0,avgCost:0,estimatedCost:0,willLikelyFail:false,deficit:0,remaining:0};function $x({rcAccount:e,rcStats:t,operation:r,buffer:n=1.2}){if(!e||!t?.ops)return Vi;let{current_mana:i,max_mana:o}=Ot(e),s=Number(t.ops[r]?.avg_cost??0);if(!(s>0))return {...Vi,ready:true,currentMana:i,maxMana:o};let a=Number.isFinite(n)&&n>0?n:1.2,u=s*a,p=i{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/get-game",{method:"POST",body:JSON.stringify({game_type:r,code:t}),headers:{"Content-Type":"application/json"}})).json()}})}function tE(e,t,r,n){let{mutateAsync:i}=Ur(e,"spin-rolled");return reactQuery.useMutation({mutationKey:["games","post",r,e],mutationFn:async()=>{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/post-game",{method:"POST",body:JSON.stringify({game_type:r,code:t,key:n}),headers:{"Content-Type":"application/json"}})).json()},onSuccess(){i();}})}function oE(e){let t=e?.replace("@","");return reactQuery.queryOptions({queryKey:c.quests.status(t),enabled:!!t,queryFn:async()=>{if(!t)throw new Error("[SDK][Quests] \u2013 username wasn't provided");let n=await w()(d.privateApiHost+"/private-api/quests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t})});if(!n.ok)throw new Error(`Failed to fetch quests: ${n.status}`);return await n.json()},staleTime:3e4,refetchOnMount:true})}var Ap=[{id:"checkin",tier:"daily",goal:1,i18nKey:"checkin",icon:"check-circle"},{id:"post",tier:"daily",goal:1,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"daily",goal:3,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"daily",goal:10,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"daily",goal:1,i18nKey:"reblog",icon:"repeat"},{id:"spin",tier:"daily",goal:1,i18nKey:"spin",icon:"gift"},{id:"post",tier:"weekly",goal:5,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"weekly",goal:15,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"weekly",goal:50,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"weekly",goal:5,i18nKey:"reblog",icon:"repeat"},{id:"post",tier:"monthly",goal:20,i18nKey:"post",icon:"pencil"}];function aE(e,t){return Ap.find(r=>r.tier===e&&r.id===t)}var cE=300,uE=2;function xp(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}async function Ep(e){let r=await w()(d.privateApiHost+"/private-api/streak-freeze/buy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,idempotency_key:xp()})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to buy streak freeze: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function fE(e,t){let r=reactQuery.useQueryClient(),n=e?.replace("@","");return reactQuery.useMutation({mutationKey:["streak-freeze","buy",n],mutationFn:async()=>{if(!n||!t)throw new Error("[SDK][StreakFreeze] \u2013 missing auth");return Ep(t)},onSuccess(){n&&r.invalidateQueries({queryKey:c.points._prefix(n)});},onSettled(){n&&r.invalidateQueries({queryKey:c.quests.status(n)});}})}function hE(e,t,r){return v(["communities","subscribe"],e,({community:n})=>[xr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"async"})}function vE(e,t,r){return v(["communities","unsubscribe"],e,({community:n})=>[Er(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"sync"})}function xE(e,t,r){return v(["communities","mutePost"],e,({community:n,author:i,permlink:o,notes:s,mute:a})=>[Tr(e,n,i,o,s,a)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.posts.entry(`/@${i.author}/${i.permlink}`),["community","single",i.community],{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.community}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"sync"})}function CE(e,t,r,n){return v(["communities","set-role",e],t,({account:i,role:o})=>[Sr(t,e,i,o)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>{if(!a)return a;let u=[...a.team??[]],p=u.findIndex(([l])=>l===o.account);return p>=0?u[p]=[u[p][0],o.role,u[p][2]??""]:u.push([o.account,o.role,""]),{...a,team:u}}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)],c.communities.context(o.account,e)]);},r,"posting",{broadcastMode:n??"async"})}function qE(e,t,r,n){return v(["communities","update",e],t,i=>[kr(t,e,i)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>a&&{...a,...o}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)]]);},r,"posting",{broadcastMode:n??"async"})}function BE(e,t,r){return v(["communities","registerRewards"],e,({name:n})=>[Qr(n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.communities.singlePrefix(i.name)],[...c.points._prefix(e)]]);},t,"active",{broadcastMode:r})}function HE(e,t,r){return v(["communities","pin-post"],e,({community:n,account:i,permlink:o,pin:s})=>[Cr(e,n,i,o,s)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.posts.entry(`/@${i.account}/${i.permlink}`),[...c.communities.singlePrefix(i.community)]]);},t,"posting",{broadcastMode:r??"async"})}function $E(e,t,r=100,n=void 0,i=true){return reactQuery.queryOptions({queryKey:c.communities.list(e,t??"",r),enabled:i,queryFn:async()=>{let o=await g("bridge.list_communities",{last:"",limit:r,sort:e==="hot"?"rank":e,query:t||null,observer:n});return o?e==="hot"?o.sort(()=>Math.random()-.5):o:[]}})}function YE(e,t){return reactQuery.queryOptions({queryKey:c.communities.context(e,t),enabled:!!e&&!!t,queryFn:async()=>{let r=await g("bridge.get_community_context",{account:e,name:t});return {role:r?.role??"guest",subscribed:r?.subscribed??false}}})}function rS(e,t="",r=true){return reactQuery.queryOptions({queryKey:c.communities.single(e,t),enabled:r&&!!e,queryFn:async()=>ui(e??"",t)})}var ji=100;async function Li(e,t){return await g("bridge.list_subscribers",{community:e,limit:ji,...t?{last:t}:{}})??[]}function cS(e){return reactQuery.queryOptions({queryKey:c.communities.subscribers(e),queryFn:async()=>Li(e,null),staleTime:6e4})}function uS(e){return reactQuery.infiniteQueryOptions({queryKey:c.communities.subscribersInfinite(e),initialPageParam:null,queryFn:async({pageParam:t})=>Li(e,t),getNextPageParam:t=>t?.length>=ji?t[t.length-1]?.[0]??null:null,staleTime:6e4})}function gS(e,t){return reactQuery.infiniteQueryOptions({queryKey:c.communities.accountNotifications(e,t),initialPageParam:null,queryFn:async({pageParam:r})=>await g("bridge.account_notifications",{account:e,limit:t,last_id:r??void 0})??[],getNextPageParam:r=>r?.length>=t?r[r.length-1].id:null})}function _S(){return reactQuery.queryOptions({queryKey:c.communities.rewarded(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/rewarded-communities",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch rewarded communities: ${e.status}`);return e.json()}})}var Ip=(s=>(s.OWNER="owner",s.ADMIN="admin",s.MOD="mod",s.MEMBER="member",s.GUEST="guest",s.MUTED="muted",s))(Ip||{}),vS={owner:["admin","mod","member","guest","muted"],admin:["mod","member","guest","muted"],mod:["member","guest","muted"]};function PS(e,t){return e.startsWith("hive-3")||t===3?"Council":e.startsWith("hive-2")||t===2?"Journal":"Topic"}function OS({communityType:e,userRole:t,subscribed:r}){let n=t==="muted"?false:e==="Topic"?true:["owner","admin","mod","member"].includes(t),i=(()=>{if(t==="muted")return false;switch(e){case "Topic":return true;case "Journal":return t!=="guest"||r;case "Council":return n}})(),o=["owner","admin","mod"].includes(t);return {canPost:n,canComment:i,isModerator:o}}function kS(e,t){return reactQuery.queryOptions({queryKey:c.notifications.unreadCount(e),queryFn:async()=>t?(await(await fetch(`${d.privateApiHost}/private-api/notifications/unread`,{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json()).count:0,enabled:!!e&&!!t,initialData:0,refetchInterval:6e4})}function FS(e,t,r=void 0){return reactQuery.infiniteQueryOptions({queryKey:c.notifications.list(e,r),queryFn:async({pageParam:n})=>{if(!t)return [];let i={code:t,filter:r,since:n,user:void 0},o=await fetch(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!o.ok)return [];try{return await o.json()}catch{return []}},enabled:!!e&&!!t,initialData:{pages:[],pageParams:[]},initialPageParam:"",getNextPageParam:n=>n?.[n.length-1]?.id??"",refetchOnMount:true})}var Bp=(y=>(y.VOTES="rvotes",y.MENTIONS="mentions",y.FAVORITES="nfavorites",y.BOOKMARKS="nbookmarks",y.FOLLOWS="follows",y.REPLIES="replies",y.REBLOGS="reblogs",y.TRANSFERS="transfers",y.DELEGATIONS="delegations",y.PAYOUTS="payouts",y.SCHEDULED_PUBLISHED="scheduled_published",y.ACCOUNT_UPDATES="account_updates",y.WEEKLY_EARNINGS="weekly_earnings",y))(Bp||{});var Mp=(h=>(h[h.VOTE=1]="VOTE",h[h.MENTION=2]="MENTION",h[h.FOLLOW=3]="FOLLOW",h[h.COMMENT=4]="COMMENT",h[h.RE_BLOG=5]="RE_BLOG",h[h.TRANSFERS=6]="TRANSFERS",h[h.DELEGATIONS=10]="DELEGATIONS",h[h.FAVORITES=13]="FAVORITES",h[h.BOOKMARKS=15]="BOOKMARKS",h[h.PAYOUTS=19]="PAYOUTS",h[h.ACCOUNT_UPDATE=20]="ACCOUNT_UPDATE",h[h.WEEKLY_EARNINGS=21]="WEEKLY_EARNINGS",h[h.SCHEDULED_PUBLISHED=22]="SCHEDULED_PUBLISHED",h.ALLOW_NOTIFY="ALLOW_NOTIFY",h))(Mp||{}),$i=[1,2,3,4,5,6,10,13,15,19,20,21,22],Np=(n=>(n.ALL="All",n.UNREAD="Unread",n.READ="Read",n))(Np||{});function NS(e,t,r){return reactQuery.queryOptions({queryKey:c.notifications.settings(e),queryFn:async()=>{let n=e+"-web";if(!t)throw new Error("Missing access token");let i=await fetch(d.privateApiHost+"/private-api/detail-device",{body:JSON.stringify({code:t,username:e,token:n}),method:"POST",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch notification settings: ${i.status}`);return i.json()},enabled:!!e&&!!t,refetchOnMount:false,initialData:()=>({status:0,system:"web",allows_notify:0,notify_types:r?[]:[...$i]})})}function VS(){return reactQuery.queryOptions({queryKey:c.notifications.announcements(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/announcements",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch announcements: ${e.status}`);return await e.json()||[]},staleTime:36e5})}function WS(e){return reactQuery.queryOptions({queryKey:c.notifications.spotlights(),queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/spotlights",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch spotlights: ${t.status}`);return await t.json()||[]},staleTime:36e5})}function jp(e,t){return {...e,read:!t||t===e.id?1:e.read}}function Wi(e){return typeof e=="object"&&e!==null&&"pages"in e&&"pageParams"in e&&Array.isArray(e.pages)}function ek(e,t,r,n){let i=b();return reactQuery.useMutation({mutationKey:["notifications","mark-read",e],mutationFn:async({id:o})=>{if(!e||!t){process.env.NODE_ENV!=="production"&&console.warn("[SDK][Notifications] \u2013 missing auth for markNotifications");return}return Ti(t,o)},onMutate:async({id:o})=>{if(!e||!t)return {previousData:[]};await i.cancelQueries({queryKey:c.notifications._prefix});let s=[],a=i.getQueriesData({queryKey:c.notifications._prefix,predicate:l=>{let f=l.state.data;return Wi(f)}});a.forEach(([l,f])=>{if(f&&Wi(f)){s.push([l,f]);let m={...f,pages:f.pages.map(y=>y.map(h=>jp(h,o)))};i.setQueryData(l,m);}});let u=c.notifications.unreadCount(e),p=i.getQueryData(u);return typeof p=="number"&&p>0&&(s.push([u,p]),o?a.some(([,f])=>f?.pages.some(m=>m.some(y=>y.id===o&&y.read===0)))&&i.setQueryData(u,p-1):i.setQueryData(u,0)),{previousData:s}},onSuccess:o=>{let s=typeof o=="object"&&o!==null?o.unread:void 0;typeof s=="number"&&i.setQueryData(c.notifications.unreadCount(e),s),r?.(s);},onError:(o,s,a)=>{a?.previousData&&a.previousData.forEach(([u,p])=>{i.setQueryData(u,p);}),n?.(o);},onSettled:()=>{i.invalidateQueries({queryKey:c.notifications._prefix});}})}function ik(e,t,r){return v(["notifications","set-last-read"],e,({date:n})=>br(e,n),async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.notifications.unreadCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function ck(e){return reactQuery.queryOptions({queryKey:["proposals","proposal",e],queryFn:async()=>{let r=(await g("condenser_api.find_proposals",[[e]]))[0];return new Date(r.start_date)=new Date?r.status="active":new Date(r.end_date){let t=(await g("database_api.list_proposals",{start:[-1],limit:500,order:"by_total_votes",order_direction:"descending",status:"all"})).proposals,r=t.filter(i=>i.status==="expired");return [...t.filter(i=>i.status!=="expired"),...r]}})}function wk(e,t,r){return reactQuery.infiniteQueryOptions({queryKey:["proposals","votes",e,t,r],initialPageParam:t,refetchOnMount:true,staleTime:0,queryFn:async({pageParam:n})=>{let s=(await g("condenser_api.list_proposal_votes",[[e,n??t],r,"by_proposal_voter"])).filter(l=>l.proposal?.proposal_id===e).map(l=>({id:l.id,voter:l.voter})),a=await g("condenser_api.get_accounts",[s.map(l=>l.voter)]),u=kt(a);return s.map(l=>({...l,voterAccount:u.find(f=>l.voter===f.name)}))},getNextPageParam:n=>n?.[n.length-1]?.voter??void 0})}function Ak(e){return reactQuery.queryOptions({queryKey:["proposals","votes","by-user",e],enabled:!!e&&e!=="",staleTime:60*1e3,queryFn:async()=>!e||e===""?[]:((await g("database_api.list_proposal_votes",{start:[e],limit:1e3,order:"by_voter_proposal",order_direction:"ascending",status:"votable"})).proposal_votes||[]).filter(n=>n.voter===e)})}function Ek(e,t,r){return v(["proposals","vote"],e,({proposalIds:n,approve:i})=>[Or(e,n,i)],async n=>{try{let i=n?.id??n?.tx_id;t?.adapter?.recordActivity&&i&&t.adapter.recordActivity(150,i,n?.block_num).catch(o=>{console.debug("[SDK][Proposals][useProposalVote] recordActivity failed",{activityType:150,blockNum:n?.block_num,transactionId:i,error:o});}),t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.proposals.list(),c.proposals.votesByUser(e)]);}catch(i){console.warn("[useProposalVote] Post-broadcast side-effect failed:",i);}},t,"active",{broadcastMode:r})}function Tk(e,t,r){return v(["proposals","create"],e,n=>[Pr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.proposals.list()]);},t,"active",{broadcastMode:r})}function Ik(e,t=50){return reactQuery.infiniteQueryOptions({queryKey:["wallet","vesting-delegations",e,t],initialPageParam:"",queryFn:async({pageParam:r})=>{let n=r?t+1:t,i=await g("condenser_api.get_vesting_delegations",[e,r||"",n]);return r&&i.length>0&&i[0]?.delegatee===r?i.slice(1,t+1):i},getNextPageParam:r=>!r||r.lengthee("balance","/accounts/{account-name}/delegations",{"account-name":e},void 0,void 0,t)})}function Uk(e){return reactQuery.queryOptions({queryKey:["wallet","vesting-delegation-expirations",e],queryFn:async()=>e?(await g("database_api.find_vesting_delegation_expirations",{account:e})).delegations:[],enabled:!!e})}function $k(e){return reactQuery.queryOptions({queryKey:["wallet","conversion-requests",e],queryFn:()=>g("condenser_api.get_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function Jk(e){return reactQuery.queryOptions({queryKey:["wallet","collateralized-conversion-requests",e],queryFn:()=>g("condenser_api.get_collateralized_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function eC(e){return reactQuery.queryOptions({queryKey:["wallet","savings-withdraw",e],queryFn:()=>g("condenser_api.get_savings_withdraw_from",[e]),select:t=>t.sort((r,n)=>r.request_id-n.request_id)})}function iC(e){return reactQuery.queryOptions({queryKey:["wallet","withdraw-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"])})}function cC(e){return reactQuery.queryOptions({queryKey:["wallet","open-orders",e],queryFn:()=>g("condenser_api.get_open_orders",[e]),select:t=>t.sort((r,n)=>r.orderid-n.orderid),enabled:!!e})}function fC(e,t=100){return reactQuery.infiniteQueryOptions({queryKey:["wallet","outgoing-rc-delegations",e,t],initialPageParam:null,queryFn:async({pageParam:r})=>{let i=(await g("rc_api.list_rc_direct_delegations",{start:[e,r??""],limit:t}).then(o=>o)).rc_direct_delegations||[];return r&&(i=i.filter(o=>o.to!==r)),i},getNextPageParam:r=>r.length===t?r[r.length-1].to:null})}function hC(e){return reactQuery.queryOptions({queryKey:["wallet","incoming-rc",e],enabled:!!e,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] - Missing username for incoming RC");let r=await w()(`${d.privateApiHost}/private-api/received-rc/${e}`);if(!r.ok)throw new Error(`Failed to fetch incoming RC: ${r.status}`);return r.json()}})}function vC(e){return reactQuery.queryOptions({queryKey:["wallet","received-vesting-shares",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`);if(!t.ok)throw new Error(`Failed to fetch received vesting shares: ${t.status}`);return (await t.json()).list}})}function xC(e){return reactQuery.queryOptions({queryKey:["wallet","recurrent-transfers",e],queryFn:()=>g("condenser_api.find_recurrent_transfers",[e]),enabled:!!e})}function le(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}}function ae(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return;let r=Number.parseFloat(t);if(Number.isFinite(r))return r;let i=t.replace(/,/g,"").match(/[-+]?\d+(?:\.\d+)?/);if(i){let o=Number.parseFloat(i[0]);if(Number.isFinite(o))return o}}}function cl(e){if(!e||typeof e!="object")return;let t=e;return {name:le(t.name)??"",symbol:le(t.symbol)??"",layer:le(t.layer)??"hive",balance:ae(t.balance)??0,fiatRate:ae(t.fiatRate)??0,currency:le(t.currency)??"usd",precision:ae(t.precision)??3,address:le(t.address),error:le(t.error),pendingRewards:ae(t.pendingRewards),pendingRewardsFiat:ae(t.pendingRewardsFiat),liquid:ae(t.liquid),liquidFiat:ae(t.liquidFiat),savings:ae(t.savings),savingsFiat:ae(t.savingsFiat),staked:ae(t.staked),stakedFiat:ae(t.stakedFiat),iconUrl:le(t.iconUrl),actions:t.actions??[],extraData:t.extraData??[],apr:ae(t.apr)}}function ul(e){if(!e||typeof e!="object")return [];let t=[e],r=e;r.data&&typeof r.data=="object"&&t.push(r.data),r.result&&typeof r.result=="object"&&t.push(r.result),r.portfolio&&typeof r.portfolio=="object"&&t.push(r.portfolio);for(let n of t){if(Array.isArray(n))return n;if(n&&typeof n=="object")for(let i of ["wallets","tokens","assets","items","portfolio","balances"]){let o=n[i];if(Array.isArray(o))return o}}return []}function pl(e){if(!e||typeof e!="object")return;let t=e;return le(t.username)??le(t.name)??le(t.account)}function Gi(e,t="usd",r=true){return reactQuery.queryOptions({queryKey:["wallet","portfolio","v2",e,r?"only-enabled":"all",t],enabled:!!e,staleTime:6e4,refetchInterval:12e4,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] \u2013 username is required");let n=`${exports.ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`,i=await fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({username:e,onlyEnabled:r,currency:t})});if(!i.ok)throw new Error(`[SDK][Wallet] \u2013 Portfolio request failed (${i.status})`);let o=await i.json(),s=ul(o).map(a=>cl(a)).filter(a=>!!a).filter(a=>a.layer!=="spk");if(!s.length)throw new Error("[SDK][Wallet] \u2013 Portfolio payload contained no tokens");return {username:pl(o)??e,currency:le(o?.fiatCurrency??o?.currency)?.toUpperCase(),wallets:s}}})}function Kt(e){return reactQuery.queryOptions({queryKey:["assets","hive","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey),n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??"");if(!r)return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:0};let o=C(r.balance).amount,s=C(r.savings_balance).amount;return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:o+s,parts:[{name:"current",balance:o},{name:"savings",balance:s}]}}})}function zi(e){return reactQuery.queryOptions({queryKey:["assets","hbd","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(M(e).queryKey),r=b().getQueryData(be().queryKey),n=1;return t?{name:"HBD",title:"Hive Dollar",price:n,accountBalance:C(t.hbd_balance).amount+C(t?.savings_hbd_balance).amount,apr:((r?.hbdInterestRate??0)/100).toFixed(3),parts:[{name:"current",balance:C(t.hbd_balance).amount},{name:"savings",balance:C(t.savings_hbd_balance).amount}]}:{name:"HBD",title:"Hive Dollar",price:n,accountBalance:0}}})}function ml(e){let u=9.5-(e.headBlock-7e6)/25e4*.01;u<.95&&(u=.95);let p=e.vestingRewardPercent/1e4,l=e.virtualSupply,f=e.totalVestingFund;return (l*u*p/f).toFixed(3)}function Ji(e){return reactQuery.queryOptions({queryKey:["assets","hive-power","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey);if(!t||!r)return {name:"HP",title:"Hive Power",price:0,accountBalance:0};let n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??""),o=Number.isFinite(i)?i:t.base/t.quote,s=C(r.vesting_shares).amount,a=C(r.delegated_vesting_shares).amount,u=C(r.received_vesting_shares).amount,p=C(r.vesting_withdraw_rate).amount,l=Math.max((Number(r.to_withdraw)-Number(r.withdrawn))/1e6,0),f=Wn(r.next_vesting_withdrawal)?0:Math.min(p,l),m=+Ue(s,t.hivePerMVests).toFixed(3),y=+Ue(a,t.hivePerMVests).toFixed(3),h=+Ue(u,t.hivePerMVests).toFixed(3),E=+Ue(l,t.hivePerMVests).toFixed(3),O=+Ue(f,t.hivePerMVests).toFixed(3),A=Math.max(m-E,0),P=Math.max(m-y,0);return {name:"HP",title:"Hive Power",price:o,accountBalance:+A.toFixed(3),apr:ml(t),parts:[{name:"hp_balance",balance:m},{name:"available",balance:+P.toFixed(3)},{name:"outgoing_delegations",balance:y},{name:"incoming_delegations",balance:h},...E>0?[{name:"pending_power_down",balance:+E.toFixed(3)}]:[],...O>0&&O!==E?[{name:"next_power_down",balance:+O.toFixed(3)}]:[]]}}})}var K=re.operations,$r={transfers:[K.transfer,K.transfer_to_savings,K.transfer_from_savings,K.cancel_transfer_from_savings,K.recurrent_transfer,K.fill_recurrent_transfer,K.escrow_transfer,K.fill_recurrent_transfer],"market-orders":[K.fill_convert_request,K.fill_order,K.fill_collateralized_convert_request,K.limit_order_create2,K.limit_order_create,K.limit_order_cancel],interests:[K.interest],"stake-operations":[K.return_vesting_delegation,K.withdraw_vesting,K.transfer_to_vesting,K.set_withdraw_vesting_route,K.update_proposal_votes,K.fill_vesting_withdraw,K.account_witness_proxy,K.delegate_vesting_shares],rewards:[K.author_reward,K.curation_reward,K.producer_reward,K.claim_reward_balance,K.comment_benefactor_reward,K.liquidity_reward,K.proposal_pay],"":[]};var JC=Object.keys(re.operations);var Yi=re.operations,ZC=Yi,eT=Object.entries(Yi).reduce((e,[t,r])=>(e[r]=t,e),{});var Xi=re.operations;function yl(e){return Object.prototype.hasOwnProperty.call(Xi,e)}function ut(e){let t=Array.isArray(e)?e:[e],r=t.includes(""),n=Array.from(new Set(t.filter(a=>a!=null&&a!==""))),i=r||n.length===0?"all":n.map(a=>a.toString()).sort().join("|"),o=new Set;r||n.forEach(a=>{if(a in $r){$r[a].forEach(u=>o.add(u));return}yl(a)&&o.add(Xi[a]);});let s=hl(Array.from(o));return {filterKey:i,filterArgs:s}}function hl(e){let t=0n,r=0n;return e.forEach(n=>{n<64?t|=1n<o?+(o[o.length-1]?.num??0)-1:-1,queryFn:async({pageParam:o})=>(await g("condenser_api.get_account_history",[e,o,t,...n])).map(a=>({num:a[0],type:a[1].op[0],timestamp:a[1].timestamp,trx_id:a[1].trx_id,...a[1].op[1]})),select:({pages:o,pageParams:s})=>({pageParams:s,pages:o.map(a=>a.filter(u=>{switch(u.type){case "author_reward":case "comment_benefactor_reward":return C(u.hive_payout).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(u.amount).symbol==="HIVE";case "transfer_from_savings":return C(u.amount).symbol==="HIVE";case "fill_recurrent_transfer":let l=C(u.amount);return ["HIVE"].includes(l.symbol);case "claim_reward_balance":return C(u.reward_hive).amount>0;case "curation_reward":case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":return true;case "limit_order_create2":return true;default:return false}}))})})}function lT(e,t=20,r=[]){let{filterKey:n}=ut(r);return reactQuery.infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hbd","transactions",e,t,n],select:({pages:i,pageParams:o})=>({pageParams:o,pages:i.map(s=>s.filter(a=>{switch(a.type){case "author_reward":case "comment_benefactor_reward":return C(a.hbd_payout).amount>0;case "claim_reward_balance":return C(a.reward_hbd).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(a.amount).symbol==="HBD";case "transfer_from_savings":return C(a.amount).symbol==="HBD";case "fill_recurrent_transfer":let l=C(a.amount);return ["HBD"].includes(l.symbol);case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":case "proposal_pay":case "interest":return true;case "limit_order_create2":return true;default:return false}}))})})}function yT(e,t=20,r=[]){let{filterKey:n}=ut(r),i=new Set(Array.isArray(r)?r:[r]),o=i.has("")||i.size===0;return reactQuery.infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hive-power","transactions",e,t,n],select:({pages:s,pageParams:a})=>({pageParams:a,pages:s.map(u=>u.filter(p=>{switch(p.type){case "author_reward":case "comment_benefactor_reward":return C(p.vesting_payout).amount>0;case "claim_reward_balance":return C(p.reward_vests).amount>0;case "transfer_to_vesting":return true;case "transfer":case "transfer_to_savings":case "recurrent_transfer":return ["VESTS","HP"].includes(C(p.amount).symbol);case "fill_recurrent_transfer":let m=C(p.amount);return ["VESTS","HP"].includes(m.symbol);case "curation_reward":case "withdraw_vesting":case "delegate_vesting_shares":case "fill_vesting_withdraw":case "return_vesting_delegation":case "producer_reward":case "set_withdraw_vesting_route":return true;default:return o||i.has(p.type)}}))})})}function Zi(e){let t=r=>r.toString().padStart(2,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Wr(e,t){return new Date(e.getTime()-t*1e3)}function bT(e=86400){return reactQuery.infiniteQueryOptions({queryKey:["assets","hive","metrics",e],queryFn:async({pageParam:[t,r]})=>(await g("condenser_api.get_market_history",[e,Zi(t),Zi(r)])).map(({hive:i,non_hive:o,open:s})=>({close:o.close/i.close,open:o.open/i.open,low:o.low/i.low,high:o.high/i.high,volume:i.volume,time:new Date(s)})),initialPageParam:[Wr(new Date,Math.max(100*e,28800)),new Date],getNextPageParam:(t,r,[n])=>[Wr(n,Math.max(100*e,28800)),Wr(n,e)]})}function OT(e){return reactQuery.queryOptions({queryKey:["assets","hive","withdrawal-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"]),enabled:!!e})}function kT(e,t=50){return reactQuery.queryOptions({queryKey:["assets","hive-power","delegates",e],enabled:!!e,queryFn:()=>g("condenser_api.get_vesting_delegations",[e,"",t])})}function qT(e){return reactQuery.queryOptions({queryKey:["assets","hive-power","delegatings",e],queryFn:async()=>(await(await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`,{headers:{"Content-Type":"application/json"}})).json()).list,select:t=>t.sort((r,n)=>C(n.vesting_shares).amount-C(r.vesting_shares).amount)})}function BT(e=500){return reactQuery.queryOptions({queryKey:["market","order-book",e],queryFn:()=>g("condenser_api.get_order_book",[e])})}function HT(){return reactQuery.queryOptions({queryKey:["market","statistics"],queryFn:()=>g("condenser_api.get_ticker",[])})}function LT(e,t,r){let n=i=>i.toISOString().replace(/\.\d{3}Z$/,"");return reactQuery.queryOptions({queryKey:["market","history",e,t.getTime(),r.getTime()],queryFn:()=>g("condenser_api.get_market_history",[e,n(t),n(r)])})}function zT(){return reactQuery.queryOptions({queryKey:["market","hive-hbd-stats"],queryFn:async()=>{let e=await g("condenser_api.get_ticker",[]),t=new Date,r=new Date(t.getTime()-864e5),n=s=>s.toISOString().replace(/\.\d{3}Z$/,""),i=await g("condenser_api.get_market_history",[86400,n(r),n(t)]);return {price:+e.latest,close:i[0]?i[0].non_hive.open/i[0].hive.open:0,high:i[0]?i[0].non_hive.high/i[0].hive.high:0,low:i[0]?i[0].non_hive.low/i[0].hive.low:0,percent:i[0]?100-i[0].non_hive.open/i[0].hive.open*100/+e.latest:0,totalFromAsset:e.hive_volume.split(" ")[0],totalToAsset:e.hbd_volume.split(" ")[0]}}})}function ZT(e,t,r,n){return reactQuery.queryOptions({queryKey:["market","data",e,t,r,n],queryFn:async({signal:i})=>{let o=w(),s=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,a=await o(s,{signal:i});if(!a.ok)throw new Error(`Failed to fetch market data: ${a.status}`);return a.json()}})}function eo(e){return e.toISOString().replace(/\.\d{3}Z$/,"")}function nR(e=1e3,t,r){let n=r??new Date,i=t??new Date(n.getTime()-600*60*1e3);return reactQuery.queryOptions({queryKey:["market","trade-history",e,i.getTime(),n.getTime()],queryFn:()=>g("condenser_api.get_trade_history",[eo(i),eo(n),e])})}function aR(){return reactQuery.queryOptions({queryKey:["market","feed-history"],queryFn:async()=>{try{return await g("condenser_api.get_feed_history",[])}catch(e){throw e}}})}function lR(){return reactQuery.queryOptions({queryKey:["market","current-median-history-price"],queryFn:async()=>{try{return await g("condenser_api.get_current_median_history_price",[])}catch(e){throw e}}})}function gR(e,t,r){return v(["market","limit-order-create"],e,n=>[Ft(e,n.amountToSell,n.minToReceive,n.fillOrKill,n.expiration,n.orderId)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function _R(e,t,r){return v(["market","limit-order-cancel"],e,({orderId:n})=>[Rr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}async function pt(e){let t=await e.json();if(!e.ok){let r=new Error(`Request failed with status ${e.status}`);throw r.status=e.status,r.data=t,r}return t}async function AR(e,t,r,n){let i=w(),o=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,s=await i(o);return pt(s)}async function to(e){if(e==="hbd")return 1;let t=w(),r=`https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${e}`,n=await t(r);return (await pt(n)).hive_dollar[e]}async function PR(e,t){let n=await w()(d.privateApiHost+`/private-api/market-data/${e==="hbd"?"usd":e}/${t}`);return pt(n)}async function OR(){let t=await w()(d.privateApiHost+"/private-api/market-data/latest");return pt(t)}async function xR(){let t=await w()("https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd");return pt(t)}var Fl={"Content-type":"application/json"};async function ql(e){let t=w(),r=exports.ConfigManager.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-api`,{method:"POST",body:JSON.stringify(e),headers:Fl});if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 request failed with ${n.status}`);return (await n.json()).result}async function xe(e,t){try{return await ql(e)}catch{return t}}async function kR(e,t=50){let r={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:e},limit:t,offset:0},id:1},[n,i]=await Promise.all([xe({...r,params:{...r.params,table:"buyBook",indexes:[{index:"price",descending:true}]}},[]),xe({...r,params:{...r.params,table:"sellBook",indexes:[{index:"price",descending:false}]}},[])]),o=a=>a.sort((u,p)=>{let l=Number(u.price??0);return Number(p.price??0)-l}),s=a=>a.sort((u,p)=>{let l=Number(u.price??0),f=Number(p.price??0);return l-f});return {buy:o(n),sell:s(i)}}async function CR(e,t=50){return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"tradesHistory",query:{symbol:e},limit:t,offset:0,indexes:[{index:"timestamp",descending:true}]},id:1},[])}async function TR(e,t,r=100){let n={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:t,account:e},limit:r,offset:0},id:1},[i,o]=await Promise.all([xe({...n,params:{...n.params,table:"buyBook",indexes:[{index:"timestamp",descending:true}]}},[]),xe({...n,params:{...n.params,table:"sellBook",indexes:[{index:"timestamp",descending:true}]}},[])]),s=(p,l)=>(Number(p||0)*Number(l||0)).toFixed(8),a=i.map(p=>({id:p.txId,type:"buy",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:p.tokensLocked??s(p.quantity,p.price),timestamp:Number(p.timestamp??0)})),u=o.map(p=>({id:p.txId,type:"sell",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:s(p.quantity,p.price),timestamp:Number(p.timestamp??0)}));return [...a,...u].sort((p,l)=>l.timestamp-p.timestamp)}async function Il(e,t){if(Array.isArray(e)&&e.length===0)return [];let r=Array.isArray(e)?{symbol:{$in:e}}:e?{symbol:e}:{};return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"metrics",query:{...r,...t?{account:t}:{}}},id:1},[])}async function We(e,t){return Il(t,e)}async function Mt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"balances",query:{account:e}},id:1},[])}async function Nt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"tokens",query:{symbol:{$in:e}}},id:2},[])}async function ro(e,t,r,n){let i=w(),o=exports.ConfigManager.getValidatedBaseUrl(),s=new URL("/private-api/engine-account-history",o);s.searchParams.set("account",e),s.searchParams.set("symbol",t),s.searchParams.set("limit",r.toString()),s.searchParams.set("offset",n.toString());let a=await i(s.toString(),{method:"GET",headers:{"Content-type":"application/json"}});if(!a.ok)throw new Error(`[SDK][HiveEngine] \u2013 account history failed with ${a.status}`);return await a.json()}async function no(e,t="daily"){let r=w(),n=exports.ConfigManager.getValidatedBaseUrl(),i=new URL("/private-api/engine-chart-api",n);i.searchParams.set("symbol",e),i.searchParams.set("interval",t);let o=await r(i.toString(),{headers:{"Content-type":"application/json"}});if(!o.ok)throw new Error(`[SDK][HiveEngine] \u2013 chart failed with ${o.status}`);return await o.json()}async function io(e){let t=w(),r=exports.ConfigManager.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-reward-api/${e}?hive=1`);if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 rewards failed with ${n.status}`);return await n.json()}function Qt(e){return reactQuery.queryOptions({queryKey:["assets","hive-engine","balances",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Mt(e)})}function BR(){return reactQuery.queryOptions({queryKey:["assets","hive-engine","markets"],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>We()})}function oo(e){return reactQuery.queryOptions({queryKey:["assets","hive-engine","metadata-list",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Nt(e)})}function jR(e,t,r=20){return reactQuery.infiniteQueryOptions({queryKey:["assets","hive-engine",t,"transactions",e],enabled:!!t&&!!e,initialPageParam:0,queryFn:async({pageParam:n})=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");return ro(e,t,r,n)},getNextPageParam:(n,i,o)=>(n?.length??0)===r?o+r:void 0,getPreviousPageParam:(n,i,o)=>o>0?o-r:void 0})}function GR(e,t="daily"){return reactQuery.queryOptions({queryKey:["assets","hive-engine",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>no(e,t)})}function XR(e){return reactQuery.queryOptions({queryKey:["assets","hive-engine","unclaimed",e],staleTime:6e4,refetchInterval:9e4,enabled:!!e,queryFn:async()=>{try{let t=await io(e);return Object.values(t).filter(({pending_token:r})=>r>0)}catch{return []}}})}function so(e,t){return reactQuery.queryOptions({queryKey:["assets","hive-engine","all-tokens",e,t],queryFn:async()=>We(e,t)})}function Ge(e,t=void 0){let r={fractionDigits:3,prefix:"",suffix:""};t&&(r={...r,...t});let{fractionDigits:n,prefix:i,suffix:o}=r,s="";i&&(s+=i+" ");let a=Math.abs(parseFloat(e.toString()))<1e-4?0:e,u=typeof a=="string"?parseFloat(a):a;return s+=u.toLocaleString("en-US",{minimumFractionDigits:n,maximumFractionDigits:n,useGrouping:true}),o&&(s+=" "+o),s}var Ht=class{symbol;name;icon;precision;stakingEnabled;delegationEnabled;balance;stake;stakedBalance;delegationsIn;delegationsOut;usdValue;constructor(t){this.symbol=t.symbol,this.name=t.name||"",this.icon=t.icon||"",this.precision=t.precision||0,this.stakingEnabled=t.stakingEnabled||false,this.delegationEnabled=t.delegationEnabled||false,this.balance=parseFloat(t.balance)||0,this.stake=parseFloat(t.stake)||0,this.delegationsIn=parseFloat(t.delegationsIn)||0,this.delegationsOut=parseFloat(t.delegationsOut)||0,this.stakedBalance=this.stake+this.delegationsIn-this.delegationsOut,this.usdValue=t.usdValue;}hasDelegations=()=>this.delegationEnabled?this.delegationsIn>0&&this.delegationsOut>0:false;delegations=()=>this.hasDelegations()?`(${Ge(this.stake,{fractionDigits:this.precision})} + ${Ge(this.delegationsIn,{fractionDigits:this.precision})} - ${Ge(this.delegationsOut,{fractionDigits:this.precision})})`:"";staked=()=>this.stakingEnabled?this.stakedBalance<1e-4?this.stakedBalance.toString():Ge(this.stakedBalance,{fractionDigits:this.precision}):"-";balanced=()=>this.balance<1e-4?this.balance.toString():Ge(this.balance,{fractionDigits:this.precision})};function uF(e,t,r){return reactQuery.queryOptions({queryKey:["assets","hive-engine","balances-with-usd",e,t,r],queryFn:async()=>{if(!e)throw new Error("[HiveEngine] No account in a balances query");let n=await Mt(e),i=await Nt(n.map(p=>p.symbol)),o=t?t.base/t.quote:0,s=Array.isArray(r)?r:[],a=n.map(p=>p.symbol).filter(p=>p!=="SWAP.HIVE"&&!s.some(l=>l.symbol===p)),u=[...s,...a.length?await We(void 0,a):[]];return n.map(p=>{let l=i.find(O=>O.symbol===p.symbol),f;if(l?.metadata)try{f=JSON.parse(l.metadata);}catch{f=void 0;}let m=u.find(O=>O.symbol===p.symbol),y=Number(m?.lastPrice??"0"),h=Number(p.balance),E=p.symbol==="SWAP.HIVE"?o*h:y===0?0:Number((y*o*h).toFixed(10));return new Ht({symbol:p.symbol,name:l?.name??p.symbol,icon:f?.icon??"",precision:l?.precision??0,stakingEnabled:l?.stakingEnabled??false,delegationEnabled:l?.delegationEnabled??false,balance:p.balance,stake:p.stake,delegationsIn:p.delegationsIn,delegationsOut:p.delegationsOut,usdValue:E})})},enabled:!!e})}function ao(e,t){return reactQuery.queryOptions({queryKey:["assets","hive-engine",t,"general-info",e],enabled:!!t&&!!e,staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");let r=b(),n=Kt(e);await r.prefetchQuery(n);let i=r.getQueryData(n.queryKey),o=await r.ensureQueryData(oo([t])),s=await r.ensureQueryData(Qt(e)),a=await r.ensureQueryData(so(void 0,t)),u=o?.find(O=>O.symbol===t),p=s?.find(O=>O.symbol===t),f=+(a?.find(O=>O.symbol===t)?.lastPrice??"0"),m=parseFloat(p?.balance??"0"),y=parseFloat(p?.stake??"0"),h=parseFloat(p?.pendingUnstake??"0"),E=[{name:"liquid",balance:m},{name:"staked",balance:y}];return h>0&&E.push({name:"unstaking",balance:h}),{name:t,title:u?.name??"",price:f===0?0:Number(f*(i?.price??0)),accountBalance:m+y,layer:"ENGINE",parts:E}}})}function lt(e,t=0){return reactQuery.queryOptions({queryKey:["points",e,t],queryFn:async()=>{if(!e)throw new Error("Get points query \u2013 username wasn't provided");let r=e.replace("@",""),n=await fetch(d.privateApiHost+"/private-api/points",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r})});if(!n.ok)throw new Error(`Failed to fetch points: ${n.status}`);let i=await n.json(),o=await fetch(d.privateApiHost+"/private-api/point-list",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,type:t})});if(!o.ok)throw new Error(`Failed to fetch point transactions: ${o.status}`);let s=await o.json();return {points:i.points,uPoints:i.unclaimed_points,transactions:s}},staleTime:3e4,refetchOnMount:true,enabled:!!e})}function co(e){return reactQuery.queryOptions({queryKey:["assets","points","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>(await b().prefetchQuery(lt(e)),{name:"POINTS",title:"Ecency Points",price:.002,accountBalance:+(b().getQueryData(lt(e).queryKey)?.points??0)})})}function SF(e,t){return reactQuery.queryOptions({queryKey:["assets","points","transactions",e,t],queryFn:async()=>(await(await fetch(`${d.privateApiHost}/private-api/point-list`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,type:t??0})})).json()).map(({created:i,type:o,amount:s,id:a,sender:u,receiver:p,memo:l})=>({created:new Date(i),type:o,results:[{amount:parseFloat(s),asset:"POINTS"}],id:a,from:u??void 0,to:p??void 0,memo:l??void 0}))})}function NF(e,t,r={refetch:false}){let n=b(),i=r.currency??"usd",o=async p=>(r.refetch?await n.fetchQuery(p):await n.prefetchQuery(p),n.getQueryData(p.queryKey)),s=async p=>{if(!p||i==="usd")return p;try{let l=await to(i);return {...p,price:p.price*l}}catch(l){return console.warn(`Failed to convert price from USD to ${i}:`,l),p}},a=Gi(e,i,true),u=async()=>{try{let l=(await n.fetchQuery(a)).wallets.find(m=>m.symbol.toUpperCase()===t.toUpperCase());if(!l)return;let f=[];if(l.liquid!==void 0&&l.liquid!==null&&f.push({name:"liquid",balance:l.liquid}),l.staked!==void 0&&l.staked!==null&&l.staked>0&&f.push({name:"staked",balance:l.staked}),l.savings!==void 0&&l.savings!==null&&l.savings>0&&f.push({name:"savings",balance:l.savings}),l.extraData&&Array.isArray(l.extraData))for(let m of l.extraData){if(!m||typeof m!="object")continue;let y=m.dataKey,h=m.value;if(typeof h=="string"){let O=h.replace(/,/g,"").match(/[+-]?\s*(\d+(?:\.\d+)?)/);if(O){let A=Math.abs(Number.parseFloat(O[1]));y==="delegated_hive_power"?f.push({name:"outgoing_delegations",balance:A}):y==="received_hive_power"?f.push({name:"incoming_delegations",balance:A}):y==="powering_down_hive_power"&&f.push({name:"pending_power_down",balance:A});}}}return {name:l.symbol,title:l.name,price:l.fiatRate,accountBalance:l.balance,apr:l.apr?.toString(),layer:l.layer,pendingRewards:l.pendingRewards,parts:f}}catch{return}};return reactQuery.queryOptions({queryKey:["ecency-wallets","asset-info",e,t,i],queryFn:async()=>{let p=await u();if(p&&p.price>0)return p;let l;if(t==="HIVE")l=await o(Kt(e));else if(t==="HP")l=await o(Ji(e));else if(t==="HBD")l=await o(zi(e));else if(t==="POINTS")l=await o(co(e));else if((await n.ensureQueryData(Qt(e))).some(m=>m.symbol===t))l=await o(ao(e,t));else {if(p)return p;throw new Error(`[SDK][Wallet] \u2013 unrecognized asset "${t}"`)}if(p&&l&&l.price>0){let f=await s(l);return {...p,price:f.price}}return await s(l)}})}var Gl=(A=>(A.Transfer="transfer",A.TransferToSavings="transfer-saving",A.WithdrawFromSavings="withdraw-saving",A.Delegate="delegate",A.PowerUp="power-up",A.PowerDown="power-down",A.WithdrawRoutes="withdraw-routes",A.ClaimInterest="claim-interest",A.Swap="swap",A.Convert="convert",A.Gift="gift",A.Promote="promote",A.Claim="claim",A.Buy="buy",A.Stake="stake",A.Unstake="unstake",A.Undelegate="undelegate",A))(Gl||{});function LF(e,t,r){return v(["wallet","transfer"],e,n=>[Ke(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function JF(e,t,r){return v(["wallet","transfer-point"],e,n=>[Le(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function tq(e,t,r){return v(["wallet","delegate-vesting-shares"],e,n=>[st(e,n.delegatee,n.vestingShares)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.delegatee),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function sq(e,t,r){return v(["wallet","set-withdraw-vesting-route"],e,n=>[at(e,n.toAccount,n.percent,n.autoVest)],async(n,i)=>{await S(t?.adapter,r,[c.wallet.withdrawRoutes(e),c.accounts.full(e),c.accounts.full(i.toAccount)]);},t,"active",{broadcastMode:r})}function pq(e,t,r){return v(["wallet","transfer-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"transfer",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity,memo:n.memo}});return [["custom_json",{required_auths:[e],required_posting_auths:[],id:"ssc-mainnet-hive",json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function gq(e,t,r){return v(["wallet","transfer-to-savings"],e,n=>[je(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function bq(e,t,r){return v(["wallet","transfer-from-savings"],e,n=>[Be(e,n.to,n.amount,n.memo,n.requestId)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function xq(e,t,r){return v(["wallet","transfer-to-vesting"],e,n=>[it(e,n.to,n.amount)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Tq(e,t,r){return v(["wallet","withdraw-vesting"],e,n=>[ot(e,n.vestingShares)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Dq(e,t,r){return v(["wallet","convert"],e,n=>[n.collateralized?yr(e,n.amount,n.requestId):ct(e,n.amount,n.requestId)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Qq(e,t,r){return v(["wallet","claim-interest"],e,n=>nt(e,n.to,n.amount,n.memo,n.requestId),async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}var zl=5e3,Ut=new Map;function Lq(e,t,r){return v(["wallet","claim-rewards"],e,n=>[Fr(e,n.rewardHive,n.rewardHbd,n.rewardVests)],()=>{let n=e??"__anonymous__",i=[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e],c.assets.hiveGeneralInfo(e),c.assets.hbdGeneralInfo(e),c.assets.hivePowerGeneralInfo(e)],o=Ut.get(n);o&&(clearTimeout(o),Ut.delete(n));let s=setTimeout(async()=>{try{let a=b(),p=(await Promise.allSettled(i.map(l=>a.invalidateQueries({queryKey:l})))).filter(l=>l.status==="rejected");p.length>0&&console.error("[SDK][Wallet][useClaimRewards] delayed invalidation rejected",{username:e,rejectedCount:p.length,rejected:p});}catch(a){console.error("[SDK][Wallet][useClaimRewards] delayed invalidation failed",{username:e,error:a});}finally{Ut.delete(n);}},zl);Ut.set(n,s);},t,"posting",{broadcastMode:r})}function zq(e,t,r){return v(["wallet","delegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"delegate",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Zq(e,t,r){return v(["wallet","undelegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"undelegate",contractPayload:{symbol:n.symbol,from:n.from,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function nI(e,t,r){return v(["wallet","stake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"stake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function aI(e,t,r){return v(["wallet","unstake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"unstake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function lI(e,t,r){return v(["wallet","claim-engine-rewards"],e,n=>{let i=JSON.stringify(n.tokens.map(o=>({symbol:o})));return [["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"posting",{broadcastMode:r})}function gI(e,t,r){return v(["wallet","engine-market-order"],e,n=>{let i,o;n.action==="cancel"?(o="cancel",i={type:n.orderType,id:n.orderId}):(o=n.action,i={symbol:n.symbol,quantity:n.quantity,price:n.price});let s=JSON.stringify({contractName:"market",contractAction:o,contractPayload:i});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:s}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Jl(e,t,r){let{from:n,to:i="",amount:o="",memo:s=""}=r,a=r.request_id??Date.now()>>>0;switch(e){case "HIVE":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "power-up":return [it(n,i,o)]}break;case "HBD":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "claim-interest":return nt(n,i,o,s,a);case "convert":return [ct(n,o,Math.floor(Date.now()/1e3))]}break;case "HP":switch(t){case "power-down":return [ot(n,o)];case "delegate":return [st(n,i,o)];case "withdraw-routes":return [at(r.from_account??n,r.to_account??i,r.percent??0,r.auto_vest??false)]}break;case "POINTS":if(t==="transfer"||t==="gift")return [Le(n,i,o,s)];break}return null}function Yl(e,t,r){let{from:n,to:i="",amount:o=""}=r,s=typeof o=="string"&&o.includes(" ")?o.split(" ")[0]:String(o);switch(t){case "transfer":return [Me(n,"transfer",{symbol:e,to:i,quantity:s,memo:r.memo??""})];case "stake":return [Me(n,"stake",{symbol:e,to:i,quantity:s})];case "unstake":return [Me(n,"unstake",{symbol:e,to:i,quantity:s})];case "delegate":return [Me(n,"delegate",{symbol:e,to:i,quantity:s})];case "undelegate":return [Me(n,"undelegate",{symbol:e,from:i,quantity:s})];case "claim":return [hr(n,[e])]}return null}function Xl(e){return e==="claim"?"posting":"active"}function vI(e,t,r,n,i){let{mutateAsync:o}=$e.useRecordActivity(e,r);return v(["ecency-wallets",t,r],e,s=>{let a=Jl(t,r,s);if(a)return a;let u=Yl(t,r,s);if(u)return u;throw new Error(`[SDK][Wallet] \u2013 no operation builder for asset="${t}" operation="${r}"`)},()=>{o();let s=[];s.push(["ecency-wallets","asset-info",e,t]),t==="HIVE"&&s.push(["ecency-wallets","asset-info",e,"HP"]),s.push(["wallet","portfolio","v2",e]),setTimeout(()=>{s.forEach(a=>{b().invalidateQueries({queryKey:a});});},5e3);},n,Xl(r),{broadcastMode:i})}function xI(e,t,r){return v(["wallet","delegate-rc"],e,({to:n,maxRc:i})=>[wr(e,n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),c.resourceCredits.account(e),c.resourceCredits.account(i.to)]);},t,"active",{broadcastMode:r})}function CI(e,t,r){return v(["witnesses","vote"],e,({witness:n,approve:i})=>[vr(e,n,i)],async()=>{try{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.votes(e)]);}catch(n){console.warn("[useWitnessVote] Post-broadcast side-effect failed:",n);}},t,"active",{broadcastMode:r})}function qI(e,t,r){return v(["witnesses","proxy"],e,({proxy:n})=>[Ar(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.proxy()]);},t,"active",{broadcastMode:r})}function ed(e){return {owner:e.witness_name,total_missed:e.missed_blocks,url:e.url,props:{account_creation_fee:`${(e.account_creation_fee/1e3).toFixed(3)} HIVE`,account_subsidy_budget:0,maximum_block_size:e.block_size},hbd_exchange_rate:{base:`${e.price_feed.toFixed(3)} HBD`},available_witness_account_subsidies:0,running_version:e.version,signing_key:e.signing_key,last_hbd_exchange_update:e.feed_updated_at,rank:e.rank,vests:e.vests,voters_num:e.voters_num,voters_num_daily_change:e.voters_num_daily_change,price_feed:e.price_feed,hbd_interest_rate:e.hbd_interest_rate,last_confirmed_block_num:e.last_confirmed_block_num}}function NI(e){return reactQuery.infiniteQueryOptions({queryKey:c.witnesses.list(e),initialPageParam:1,queryFn:async({pageParam:t})=>(await ee("hafbe","/witnesses",{"page-size":e,page:t})).witnesses.map(ed),getNextPageParam:(t,r,n)=>t.length===e?n+1:void 0})}function QI(e,t,r,n="vests",i="desc"){return reactQuery.queryOptions({queryKey:c.witnesses.voters(e,t,r,n,i),queryFn:async({signal:o})=>await ee("hafbe","/witnesses/{witness-name}/voters",{"witness-name":e,"page-size":r,page:t,sort:n,direction:i},void 0,void 0,o),enabled:!!e,staleTime:6e4})}function HI(e){return reactQuery.queryOptions({queryKey:c.witnesses.voterCount(e),queryFn:async()=>await ee("hafbe","/witnesses/{witness-name}/voters/count",{"witness-name":e}),enabled:!!e,staleTime:6e4})}var td=(h=>(h[h.CHECKIN=10]="CHECKIN",h[h.LOGIN=20]="LOGIN",h[h.CHECKIN_EXTRA=30]="CHECKIN_EXTRA",h[h.POST=100]="POST",h[h.COMMENT=110]="COMMENT",h[h.VOTE=120]="VOTE",h[h.REBLOG=130]="REBLOG",h[h.DELEGATION=150]="DELEGATION",h[h.REFERRAL=160]="REFERRAL",h[h.COMMUNITY=170]="COMMUNITY",h[h.TRANSFER_SENT=998]="TRANSFER_SENT",h[h.TRANSFER_INCOMING=999]="TRANSFER_INCOMING",h[h.MINTED=991]="MINTED",h[h.BURNED=997]="BURNED",h))(td||{});async function nd(e,t){if(!e)throw new Error("[SDK][Points][Claim] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][Points][Claim] \u2013 access token wasn't found");let n=await w()(d.privateApiHost+"/private-api/points-claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})}),i=(n.headers.get("content-type")??"").split(";")[0].trim().toLowerCase(),o=await n.text();if(!n.ok){if(n.status===406)try{return JSON.parse(o)}catch{return {message:o,code:n.status}}let s=o&&i.includes("json")?`: ${o.slice(0,200)}`:"";throw new Error(`[SDK][Points][Claim] \u2013 failed with status ${n.status}${s}`)}if(!i.includes("json"))throw new Error(`[SDK][Points][Claim] \u2013 expected JSON but received "${i||"empty"}" response (status ${n.status})`);try{return JSON.parse(o)}catch{throw new Error(`[SDK][Points][Claim] \u2013 malformed JSON response (status ${n.status})`)}}function GI(e,t,r,n){let{mutateAsync:i}=$e.useRecordActivity(e,"points-claimed");return reactQuery.useMutation({mutationFn:()=>nd(e,t),onError:n,onSuccess:()=>{i(),b().setQueryData(lt(e).queryKey,o=>o&&{...o,points:(parseFloat(o.points)+parseFloat(o.uPoints)).toFixed(3),uPoints:"0"}),r?.();}})}var po=/(^|\s)author:([^\s]+)/g,lo=/(^|\s)type:([^\s]+)/g,fo=/(^|\s)category:([^\s]+)/g,mo=/(^|\s)tag:([^\s]+)/g;var yo=(n=>(n.ALL="",n.POST="post",n.COMMENT="comment",n))(yo||{}),JI=5,YI=100;function ho(e){return e.trim().split(/\s+/)[0]??""}function id(e){return ho(e).replace(/^@+/,"").toLowerCase()}function od(e){return ho(e).replace(/^#+/,"").toLowerCase()}function sd(e){let t=new Set;return e.split(/[\s,]+/).map(r=>r.replace(/^#+/,"").toLowerCase()).filter(r=>r===""||t.has(r)?false:(t.add(r),true))}function XI({search:e="",author:t="",type:r="",category:n="",tags:i=[]}){let o=e.trim().replace(/\s+/g," "),s=id(t),a=od(n),u=sd(Array.isArray(i)?i.join(","):i),p=[o];return s&&p.push(`author:${s}`),r&&p.push(`type:${r}`),a&&p.push(`category:${a}`),u.length>0&&p.push(`tag:${u.join(",")}`),{q:p.filter(l=>l!=="").join(" "),search:o,author:s,type:r,category:a,tags:u}}var go=class{query="";search="";author="";type="";category="";tags=[];constructor(t){this.query=t,this.search=t,this.grabAuthor(),this.grabType(),this.grabCategory(),this.grabTags(),this.grabSearch();}grab=t=>{let r=[...this.query.matchAll(t)];return r.length>0?r[0][2].trim():""};grabAuthor=()=>{this.author=this.grab(po);};grabType=()=>{let t=this.grab(lo);Object.values(yo).includes(t)&&(this.type=t);};grabCategory=()=>{this.category=this.grab(fo);};grabTags=()=>{let t=new Set;this.tags=[...this.query.matchAll(mo)].flatMap(r=>r[2].split(",")).map(r=>r.trim()).filter(r=>r===""||t.has(r)?false:(t.add(r),true));};grabSearch=()=>{for([po,lo,fo,mo].forEach(t=>{this.search=this.search.replace(t,"$1");});this.search.indexOf(" ")!==-1;)this.search=this.search.replace(" "," ");this.search=this.search.trim();}};async function ve(e,t){let n=await(async()=>{let i;try{i=await e.text();}catch{return}if(i!=="")try{return JSON.parse(i)}catch{return e.ok?void 0:i}})();if(!e.ok){let i=new Error(`Request failed with status ${e.status}`);throw i.status=e.status,i.data=n,i}if(n===void 0||t!==void 0&&!t(n))throw new Error("Response body was empty, invalid JSON, or not the expected shape");return n}function Ee(e){return typeof e=="object"&&e!==null&&Array.isArray(e.results)}var cd=reactQuery.isServer?0:3;function dt(e,t){let{status:r}=t,n=r===408||r===429;return r!==void 0&&r>=400&&r<500&&!n?false:e{let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let u=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(u,Ee)},retry:dt})}function uD(e,t,r=true){return reactQuery.infiniteQueryOptions({queryKey:c.search.controversialRising(e,t),initialPageParam:{sid:void 0,hasNextPage:true},queryFn:async({pageParam:n,signal:i})=>{if(!n.hasNextPage)return {hits:0,took:0,results:[]};let o,s=new Date;switch(t){case "today":o=new Date(s.getTime()-1440*60*1e3);break;case "week":o=new Date(s.getTime()-10080*60*1e3);break;case "month":o=new Date(s.getTime()-720*60*60*1e3);break;case "year":o=new Date(s.getTime()-365*24*60*60*1e3);break;default:o=void 0;}let a="* type:post",u=e==="rising"?"children":e,p=o?o.toISOString().split(".")[0]:void 0,l="0",f=t==="today"?50:200,m={q:a,sort:u,hide_low:l};p&&(m.since=p),n.sid&&(m.scroll_id=n.sid),(m.votes=f);let y=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(m),signal:we(_e,i)});return ve(y,Ee)},getNextPageParam:n=>({sid:n?.scroll_id,hasNextPage:n.results.length>0}),enabled:r,retry:dt})}async function fD(e,t,r,n,i,o,s){let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let p=await w()(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(p,Ee)}async function wo(e,t,r=_e){let i=await w()(d.privateApiHost+"/search-api/similar",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(e),signal:we(r,t)});return ve(i,Ee)}async function mD(e,t){let n=await w()(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e}),signal:we(_e,t)}),i=await ve(n,Array.isArray);return i?.length>0?i:[e]}var dd=4368*60*60*1e3,fd=4,md=3e3,gd=2e3,yd=4e3,_D=2;function hd(e,t){return e.replace(/!\[[^\]]*\]\([^)]*\)/g," ").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim().slice(0,t)}function wd(e){let t=5381;for(let r=0;r>>0).toString(36)}function bD(e){let t=e.title??"",r=e.json_metadata?.tags,n=(Array.isArray(r)?r:[]).filter(s=>typeof s=="string"&&s!==""),i=hd(e.body??"",md),o=wd(`${t}|${n.join(",")}|${i}`);return reactQuery.queryOptions({queryKey:c.search.similarEntries(e.author,e.permlink,o),queryFn:async({signal:s})=>{let a=new Date(Date.now()-dd).toISOString().slice(0,19),u=await wo({author:e.author,permlink:e.permlink,title:t,body:i,tags:n,since:a},s,typeof window>"u"?gd:yd),p=[],l=new Set;for(let f of u.results){if(p.length>=fd)break;f.permlink!==e.permlink&&(f.tags??[]).indexOf("nsfw")===-1&&(l.has(f.author)||(l.add(f.author),p.push(f)));}return p},staleTime:300*1e3,retry:false})}function ED(e,t=5){let r=e.trim();return reactQuery.queryOptions({queryKey:c.search.account(r,t),queryFn:async()=>{let n=await g("condenser_api.lookup_accounts",[r,t]);return n.length===0?[]:Ct(n)},enabled:!!r})}function RD(e,t=10){let r=e.trim();return reactQuery.queryOptions({queryKey:c.search.topics(r,t),queryFn:async()=>(await g("condenser_api.get_trending_tags",[r,t+1])).map(i=>i.name).filter(i=>i!==""&&!i.startsWith("hive-")).slice(0,t),enabled:!!r})}function BD(e,t,r,n,i,o){return reactQuery.infiniteQueryOptions({queryKey:c.search.api(e,t,r,n,i,o),queryFn:async({pageParam:s,signal:a})=>{let u={q:e,sort:t,hide_low:r};n&&(u.since=n),s&&(u.scroll_id=s),i!==void 0&&(u.votes=i),o&&(u.include_nsfw=1);let p=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(u),signal:we(_e,a)});return ve(p,Ee)},initialPageParam:void 0,getNextPageParam:s=>s?.scroll_id,enabled:!!e,retry:dt})}function HD(e){return reactQuery.queryOptions({queryKey:["search","path",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e})});if(!t.ok)throw new Error(`Search path failed: ${t.status}`);let r=await t.json();return r?.length>0?r:[e]}})}async function Od(e){let r=await w()(d.privateApiHost+"/private-api/support-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to fetch support settings: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function LD(e,t){let r=e?.replace("@","");return reactQuery.queryOptions({queryKey:c.support.settings(r),queryFn:()=>{if(!t)throw new Error("[SDK][Support] missing auth");return Od(t)},enabled:!!r&&!!t})}async function Sd(e,t){let n=await w()(d.privateApiHost+"/private-api/support-settings-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,beneficiary_percent:t.beneficiary_percent,curation_percent:t.curation_percent})});if(!n.ok){let i;try{i=await n.json();}catch{}let o=i?.message??`Failed to update support settings: ${n.status}`,s=new Error(o);throw s.status=n.status,s.data=i,s}return await n.json()}function kd(e,t,r){return e.setQueryData(c.support.settings(t),r),e.invalidateQueries({queryKey:c.support.settings(t)})}function JD(e,t){let r=reactQuery.useQueryClient(),n=e?.replace("@","");return reactQuery.useMutation({mutationKey:["support","settings-update",n],mutationFn:async i=>{if(!n||!t)throw new Error("[SDK][Support] missing auth");return Sd(t,i)},onSuccess(i){n&&kd(r,n,i);}})}function eK(e){return reactQuery.queryOptions({queryKey:["promotions","boost-plus-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/boost-plus-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch boost plus prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function iK(e){return reactQuery.queryOptions({queryKey:["promotions","rc-delegation-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/rc-delegation-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch RC delegation prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function cK(e,t){return reactQuery.queryOptions({queryKey:["promotions","rc-delegation-active",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/rc-delegation-active",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,username:e})});if(!r.ok)throw new Error(`Failed to fetch RC delegation active: ${r.status}`);let n=await r.json();return n&&n.expires&&n.user?{user:n.user,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function dK(e){return reactQuery.queryOptions({queryKey:["promotions","promote-price"],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/promote-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch promote prices: ${t.status}`);return await t.json()},enabled:!!e})}function yK(e,t){return reactQuery.queryOptions({queryKey:["promotions","boost-plus-accounts",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/boosted-plus-account",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:e})});if(!r.ok)throw new Error(`Failed to fetch boost plus account prices: ${r.status}`);let n=await r.json();return n?{account:n.account,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function bK(e,t,r){return v(["promotions","boost-plus"],e,({account:n,duration:i})=>[Br(e,n,i)],async(n,{account:i})=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.promotions.boostPlusAccounts(i)]);},t,"active",{broadcastMode:r})}function OK(e,t,r){return v(["promotions","rc-delegation"],e,({duration:n})=>[Mr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.resourceCredits.account(e),["promotions","rc-delegation-active",e]]);},t,"active",{broadcastMode:r})}async function SK(e){let r=await w()(d.privateApiHost+"/auth-api/hs-token-refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let i;try{i=await r.json();}catch{i=void 0;}let o=new Error(`Failed to refresh token: ${r.status}`);throw o.status=r.status,o.data=i,o}return await r.json()}var Dd="https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt";function RK(){return reactQuery.queryOptions({queryKey:c.badActors.list(),queryFn:async({signal:e})=>{let t=await fetch(Dd,{signal:e});if(!t.ok)throw new Error(`Failed to fetch bad actors list: ${t.status}`);let r=await t.text();return new Set(r.split(` +'use strict';var reactQuery=require('@tanstack/react-query'),utils_js=require('@noble/hashes/utils.js'),legacy_js=require('@noble/hashes/legacy.js'),en=require('bs58'),secp256k1_js=require('@noble/curves/secp256k1.js'),sha2_js=require('@noble/hashes/sha2.js'),aes_js=require('@noble/ciphers/aes.js'),Un=require('hivesigner');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var en__default=/*#__PURE__*/_interopDefault(en);var Un__default=/*#__PURE__*/_interopDefault(Un);var bo=Object.defineProperty;var ft=(e,t)=>{for(var r in t)bo(e,r,{get:t[r],enumerable:true});};var mt=new ArrayBuffer(0),gt=null,yt=null;function vo(){return gt||(typeof TextEncoder<"u"?gt=new TextEncoder:gt={encode(e){let t=[];for(let r=0;r>6,128|n&63);else if(n>=55296&&n<=56319&&r+1>18,128|n>>12&63,128|n>>6&63,128|n&63);}else t.push(224|n>>12,128|n>>6&63,128|n&63);}return new Uint8Array(t)}}),gt}function Gr(){return yt||(typeof TextDecoder<"u"?yt=new TextDecoder:yt={decode(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r="";for(let n=0;n>10),56320+(o&1023)));}return r}}),yt}var I=class e{static LITTLE_ENDIAN=true;static BIG_ENDIAN=false;static DEFAULT_CAPACITY=16;static DEFAULT_ENDIAN=e.BIG_ENDIAN;buffer;view;offset;markedOffset;limit;littleEndian;constructor(t=e.DEFAULT_CAPACITY,r=e.DEFAULT_ENDIAN){this.buffer=t===0?mt:new ArrayBuffer(t),this.view=t===0?new DataView(mt):new DataView(this.buffer),this.offset=0,this.markedOffset=-1,this.limit=t,this.littleEndian=r;}static allocate(t,r){return new e(t,r)}static concat(t,r){let n=0;for(let a=0;a0&&(n.buffer=t.buffer,n.offset=t.byteOffset,n.limit=t.byteOffset+t.byteLength,n.view=new DataView(t.buffer));else if(t instanceof ArrayBuffer)n=new e(0,r),t.byteLength>0&&(n.buffer=t,n.offset=0,n.limit=t.byteLength,n.view=t.byteLength>0?new DataView(t):new DataView(mt));else if(Array.isArray(t))n=new e(t.length,r),n.limit=t.length,new Uint8Array(n.buffer).set(t);else throw TypeError("Illegal buffer");return n}writeBytes(t,r){return this.append(t,r)}writeInt8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setInt8(r,t),n&&(this.offset+=1),this}writeByte(t,r){return this.writeInt8(t,r)}writeUint8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setUint8(r,t),n&&(this.offset+=1),this}writeUInt8(t,r){return this.writeUint8(t,r)}readUint8(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint8(t);return r&&(this.offset+=1),n}readUInt8(t){return this.readUint8(t)}writeInt16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setInt16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeShort(t,r){return this.writeInt16(t,r)}writeUint16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setUint16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeUInt16(t,r){return this.writeUint16(t,r)}writeInt32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setInt32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeInt(t,r){return this.writeInt32(t,r)}writeUint32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setUint32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeUInt32(t,r){return this.writeUint32(t,r)}readUint32(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint32(t,this.littleEndian);return r&&(this.offset+=4),n}readUInt32=this.readUint32;append(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i;return t instanceof e?(i=new Uint8Array(t.buffer,t.offset,t.limit-t.offset),t.offset+=i.length):t instanceof Uint8Array?i=t:t instanceof ArrayBuffer?i=new Uint8Array(t):i=new Uint8Array(t),i.length<=0?this:(r+i.length>this.buffer.byteLength&&this.resize(r+i.length),new Uint8Array(this.buffer).set(i,r),n&&(this.offset+=i.length),this)}clone(t){let r=new e(0,this.littleEndian);return t?(r.buffer=new ArrayBuffer(this.buffer.byteLength),new Uint8Array(r.buffer).set(new Uint8Array(this.buffer)),r.view=new DataView(r.buffer)):(r.buffer=this.buffer,r.view=this.view),r.offset=this.offset,r.markedOffset=this.markedOffset,r.limit=this.limit,r}copy(t,r){if(t===void 0&&(t=this.offset),r===void 0&&(r=this.limit),t===r)return new e(0,this.littleEndian);let n=r-t,i=new e(n,this.littleEndian);return i.offset=0,i.limit=n,new Uint8Array(i.buffer).set(new Uint8Array(this.buffer).subarray(t,r),0),i}copyTo(t,r,n,i){let o=typeof r>"u",s=typeof n>"u";r=o?t.offset:r,n=s?this.offset:n,i=i===void 0?this.limit:i;let a=i-n;return a===0?t:(t.ensureCapacity(r+a),new Uint8Array(t.buffer).set(new Uint8Array(this.buffer).subarray(n,i),r),s&&(this.offset+=a),o&&(t.offset+=a),this)}ensureCapacity(t){let r=this.buffer.byteLength;return rt?r:t):this}flip(){return this.limit=this.offset,this.offset=0,this}resize(t){if(this.buffer.byteLength"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigInt64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeLong(t,r){return this.writeInt64(t,r)}readInt64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigInt64(t,this.littleEndian);return r&&(this.offset+=8),n}readLong(t){return this.readInt64(t)}writeUint64(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigUint64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeUInt64(t,r){return this.writeUint64(t,r)}readUint64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigUint64(t,this.littleEndian);return r&&(this.offset+=8),n}readUInt64(t){return this.readUint64(t)}toBuffer(t){let r=this.offset,n=this.limit;return !t&&r===0&&n===this.buffer.byteLength?this.buffer:r===n?mt:this.buffer.slice(r,n)}toArrayBuffer(t){return this.toBuffer(t)}writeVarint32(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=this.calculateVarint32(t);for(r+i>this.buffer.byteLength&&this.resize(r+i),t>>>=0;t>=128;)this.view.setUint8(r++,t&127|128),t>>>=7;return this.view.setUint8(r++,t),n?(this.offset=r,this):i}readVarint32(t){let r=typeof t>"u";typeof t>"u"&&(t=this.offset);let n=0,i=0,o;do o=this.view.getUint8(t++),n<5&&(i|=(o&127)<<7*n),++n;while((o&128)!==0);return i|=0,r?(this.offset=t,i):{value:i,length:n}}calculateVarint32(t){return t=t>>>0,t<128?1:t<16384?2:t<1<<21?3:t<1<<28?4:5}writeVString(t,r){let n=typeof r>"u",i=n?this.offset:r,o=vo().encode(t),s=o.length,a=this.calculateVarint32(s);return i+a+s>this.buffer.byteLength&&this.resize(i+a+s),this.writeVarint32(s,i),i+=a,new Uint8Array(this.buffer).set(o,i),i+=s,n?(this.offset=i,this):i-(r||0)}readVString(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=t,i=this.readVarint32(t),o=i.value,s=i.length;t+=s;let a=Gr().decode(new Uint8Array(this.buffer,t,o));return t+=o,r?(this.offset=t,a):{string:a,length:t-n}}readUTF8String(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=Gr().decode(new Uint8Array(this.buffer,r,t));return n?(this.offset+=t,i):{string:i,length:t}}};var x={nodes:["https://api.hive.blog","https://api.deathwing.me","https://api.openhive.network","https://techcoderx.com","https://api.syncad.com","https://rpc.mahdiyari.info"],restNodes:["https://api.hive.blog","https://rpc.mahdiyari.info","https://api.syncad.com","https://hiveapi.actifit.io","https://api.c0ff33a.uk"],restNodesByApi:{hivesense:["https://api.hive.blog","https://api.syncad.com"]},userAgent:"ecency-sdk",chain_id:"beeab0de00000000000000000000000000000000000000000000000000000000",address_prefix:"STM",timeout:5e3,broadcastTimeout:15e3,retry:5,resilience:{adaptiveTimeout:true,adaptiveTimeoutFloorMs:2e3,adaptiveTimeoutFactor:4,hedge:false,hedgeDelayFloorMs:750,hedgeDelayFactor:2,hedgeBucketCapacity:10,hedgeRefillPerSuccess:.1,totalBudgetFactor:2}},Lt=e=>Array.isArray(e)?[...new Set(e.filter(t=>typeof t=="string").map(t=>t.trim().replace(/\/+$/,"")).filter(t=>t.length>0&&/^https?:\/\/.+/.test(t)))]:[],$t=e=>{let t=Lt(e);t.length&&(x.nodes=t);},Wt=e=>{let t=Lt(e);t.length&&(x.restNodes=t);},Gt=e=>{if(!e||typeof e!="object")return;let t={...x.restNodesByApi};for(let[r,n]of Object.entries(e)){let i=Lt(n);i.length?t[r]=i:delete t[r];}x.restNodesByApi=t;},zt=e=>{if(typeof e!="string")return;let t=e.trim();!t||/[\u0000-\u001f\u007f]/.test(t)||(x.userAgent=t);},Jt=e=>{if(!e||typeof e!="object")return;let t=x.resilience,r=i=>typeof i=="boolean",n=i=>typeof i=="number"&&Number.isFinite(i)&&i>0;r(e.adaptiveTimeout)&&(t.adaptiveTimeout=e.adaptiveTimeout),n(e.adaptiveTimeoutFloorMs)&&(t.adaptiveTimeoutFloorMs=Math.max(e.adaptiveTimeoutFloorMs,2e3)),n(e.adaptiveTimeoutFactor)&&(t.adaptiveTimeoutFactor=e.adaptiveTimeoutFactor),r(e.hedge)&&(t.hedge=e.hedge),n(e.hedgeDelayFloorMs)&&(t.hedgeDelayFloorMs=e.hedgeDelayFloorMs),n(e.hedgeDelayFactor)&&(t.hedgeDelayFactor=e.hedgeDelayFactor),n(e.hedgeBucketCapacity)&&(t.hedgeBucketCapacity=e.hedgeBucketCapacity),n(e.hedgeRefillPerSuccess)&&(t.hedgeRefillPerSuccess=Math.min(e.hedgeRefillPerSuccess,1)),n(e.totalBudgetFactor)&&(t.totalBudgetFactor=Math.max(e.totalBudgetFactor,1));};var Ae=class e{data;recovery;compressed;constructor(t,r,n){this.data=t,this.recovery=r,this.compressed=n??true;}static from(t){if(typeof t=="string"){let r=utils_js.hexToBytes(t),n=parseInt(utils_js.bytesToHex(r.subarray(0,1)),16)-31,i=true;n<0&&(i=false,n=n+4);let o=r.subarray(1);return new e(o,n,i)}else throw new Error("Expected string for data")}toBuffer(){let t=new Uint8Array(65).fill(0);return this.compressed?t[0]=this.recovery+31&255:t[0]=this.recovery+27&255,t.set(this.data,1),t}customToString(){return utils_js.bytesToHex(this.toBuffer())}toString(){return this.customToString()}getPublicKey(t){if(t instanceof Uint8Array&&t.length!==32||typeof t=="string"&&t.length!==64)throw new Error("Expected a valid sha256 hash as message");typeof t=="string"&&(t=utils_js.hexToBytes(t));let r=secp256k1_js.secp256k1.Signature.fromBytes(this.data,"compact"),n=new secp256k1_js.secp256k1.Signature(r.r,r.s,this.recovery);return new J(n.recoverPublicKey(t).toBytes())}};var J=class e{key;prefix;constructor(t,r){this.key=t,this.prefix=r??x.address_prefix;}static fromString(t){let r=x.address_prefix;if(typeof t!="string"||t.length<=r.length)throw new Error("Invalid public key");let n=t.slice(0,r.length);if(n!==r)throw new Error(`Public key must start with ${r}`);let i;try{i=en__default.default.decode(t.slice(r.length));}catch{throw new Error("Invalid public key encoding")}if(i.length!==37)throw new Error("Invalid public key length");let o=i.subarray(0,33),s=i.subarray(33,37),a=legacy_js.ripemd160(o).subarray(0,4);if(!Po(s,a))throw new Error("Public key checksum mismatch");try{secp256k1_js.secp256k1.Point.fromBytes(o);}catch{throw new Error("Invalid public key")}return new e(o,n)}static from(t){return t instanceof e?t:e.fromString(t)}verify(t,r){return typeof r=="string"&&(r=Ae.from(r)),secp256k1_js.secp256k1.verify(r.data,t,this.key,{prehash:false,format:"compact"})}toString(){return Ao(this.key,this.prefix)}toJSON(){return this.toString()}inspect(){return `PublicKey: ${this.toString()}`}},Ao=(e,t)=>{let r=legacy_js.ripemd160(e);return t+en__default.default.encode(new Uint8Array([...e,...r.subarray(0,4)]))},Po=(e,t)=>{if(e.byteLength!==t.byteLength)return false;for(let r=0;r{throw new Error("Void can not be serialized")},_=(e,t)=>{e.writeVString(t);},Eo=(e,t)=>{e.writeInt16(t);},rn=(e,t)=>{e.writeInt64(t);},tn=(e,t)=>{e.writeUint8(t);},ce=(e,t)=>{e.writeUint16(t);},Y=(e,t)=>{e.writeUint32(t);},nn=(e,t)=>{e.writeUint64(t);},ge=(e,t)=>{e.writeByte(t?1:0);},on=e=>(t,r)=>{let[n,i]=r;t.writeVarint32(n),e[n](t,i);},q=(e,t)=>{let r=ht.from(t),n=r.getPrecision();e.writeInt64(Math.round(r.amount*Math.pow(10,n))),e.writeUint8(n);for(let i=0;i<7;i++)e.writeUint8(r.symbol.charCodeAt(i)||0);},Pe=(e,t)=>{e.writeUint32(Math.floor(new Date(t+"Z").getTime()/1e3));},fe=(e,t)=>{t===null||typeof t=="string"&&t.slice(-39)==="1111111111111111111111111111111114T1Anm"?e.append(new Uint8Array(33).fill(0)):e.append(J.from(t).key);},sn=(e=null)=>(t,r)=>{r=wt.from(r);let n=r.buffer.length;if(e){if(n!==e)throw new Error(`Unable to serialize binary. Expected ${e} bytes, got ${n}`)}else t.writeVarint32(n);t.append(r.buffer);},an=sn(),Yt=(e,t)=>(r,n)=>{r.writeVarint32(n.length);for(let[i,o]of n)e(r,i),t(r,o);},V=e=>(t,r)=>{t.writeVarint32(r.length);for(let n of r)e(t,n);},ue=e=>(t,r)=>{for(let[n,i]of e)try{i(t,r[n]);}catch(o){throw o.message=`${n}: ${o.message}`,o}},ke=e=>(t,r)=>{r!==void 0?(t.writeByte(1),e(t,r)):t.writeByte(0);},W=ue([["weight_threshold",Y],["account_auths",Yt(_,ce)],["key_auths",Yt(fe,ce)]]),So=ue([["account",_],["weight",ce]]),Xt=ue([["base",q],["quote",q]]),ko=ue([["account_creation_fee",q],["maximum_block_size",Y],["hbd_interest_rate",ce]]),R=(e,t)=>{let r=ue(t);return (n,i)=>{n.writeVarint32(e),r(n,i);}},k={};k.account_create=R(T.account_create,[["fee",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_]]);k.account_create_with_delegation=R(T.account_create_with_delegation,[["fee",q],["delegation",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.account_update=R(T.account_update,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",fe],["json_metadata",_]]);k.account_witness_proxy=R(T.account_witness_proxy,[["account",_],["proxy",_]]);k.account_witness_vote=R(T.account_witness_vote,[["account",_],["witness",_],["approve",ge]]);k.cancel_transfer_from_savings=R(T.cancel_transfer_from_savings,[["from",_],["request_id",Y]]);k.change_recovery_account=R(T.change_recovery_account,[["account_to_recover",_],["new_recovery_account",_],["extensions",V(ie)]]);k.claim_account=R(T.claim_account,[["creator",_],["fee",q],["extensions",V(ie)]]);k.claim_reward_balance=R(T.claim_reward_balance,[["account",_],["reward_hive",q],["reward_hbd",q],["reward_vests",q]]);k.comment=R(T.comment,[["parent_author",_],["parent_permlink",_],["author",_],["permlink",_],["title",_],["body",_],["json_metadata",_]]);k.comment_options=R(T.comment_options,[["author",_],["permlink",_],["max_accepted_payout",q],["percent_hbd",ce],["allow_votes",ge],["allow_curation_rewards",ge],["extensions",V(on([ue([["beneficiaries",V(So)]])]))]]);k.convert=R(T.convert,[["owner",_],["requestid",Y],["amount",q]]);k.create_claimed_account=R(T.create_claimed_account,[["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.custom=R(T.custom,[["required_auths",V(_)],["id",ce],["data",an]]);k.custom_json=R(T.custom_json,[["required_auths",V(_)],["required_posting_auths",V(_)],["id",_],["json",_]]);k.decline_voting_rights=R(T.decline_voting_rights,[["account",_],["decline",ge]]);k.delegate_vesting_shares=R(T.delegate_vesting_shares,[["delegator",_],["delegatee",_],["vesting_shares",q]]);k.delete_comment=R(T.delete_comment,[["author",_],["permlink",_]]);k.escrow_approve=R(T.escrow_approve,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y],["approve",ge]]);k.escrow_dispute=R(T.escrow_dispute,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y]]);k.escrow_release=R(T.escrow_release,[["from",_],["to",_],["agent",_],["who",_],["receiver",_],["escrow_id",Y],["hbd_amount",q],["hive_amount",q]]);k.escrow_transfer=R(T.escrow_transfer,[["from",_],["to",_],["hbd_amount",q],["hive_amount",q],["escrow_id",Y],["agent",_],["fee",q],["json_meta",_],["ratification_deadline",Pe],["escrow_expiration",Pe]]);k.feed_publish=R(T.feed_publish,[["publisher",_],["exchange_rate",Xt]]);k.limit_order_cancel=R(T.limit_order_cancel,[["owner",_],["orderid",Y]]);k.limit_order_create=R(T.limit_order_create,[["owner",_],["orderid",Y],["amount_to_sell",q],["min_to_receive",q],["fill_or_kill",ge],["expiration",Pe]]);k.limit_order_create2=R(T.limit_order_create2,[["owner",_],["orderid",Y],["amount_to_sell",q],["exchange_rate",Xt],["fill_or_kill",ge],["expiration",Pe]]);k.recover_account=R(T.recover_account,[["account_to_recover",_],["new_owner_authority",W],["recent_owner_authority",W],["extensions",V(ie)]]);k.request_account_recovery=R(T.request_account_recovery,[["recovery_account",_],["account_to_recover",_],["new_owner_authority",W],["extensions",V(ie)]]);k.reset_account=R(T.reset_account,[["reset_account",_],["account_to_reset",_],["new_owner_authority",W]]);k.set_reset_account=R(T.set_reset_account,[["account",_],["current_reset_account",_],["reset_account",_]]);k.set_withdraw_vesting_route=R(T.set_withdraw_vesting_route,[["from_account",_],["to_account",_],["percent",ce],["auto_vest",ge]]);k.transfer=R(T.transfer,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_from_savings=R(T.transfer_from_savings,[["from",_],["request_id",Y],["to",_],["amount",q],["memo",_]]);k.transfer_to_savings=R(T.transfer_to_savings,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_to_vesting=R(T.transfer_to_vesting,[["from",_],["to",_],["amount",q]]);k.vote=R(T.vote,[["voter",_],["author",_],["permlink",_],["weight",Eo]]);k.withdraw_vesting=R(T.withdraw_vesting,[["account",_],["vesting_shares",q]]);k.witness_update=R(T.witness_update,[["owner",_],["url",_],["block_signing_key",fe],["props",ko],["fee",q]]);k.witness_set_properties=R(T.witness_set_properties,[["owner",_],["props",Yt(_,an)],["extensions",V(ie)]]);k.account_update2=R(T.account_update2,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",ke(fe)],["json_metadata",_],["posting_json_metadata",_],["extensions",V(ie)]]);k.create_proposal=R(T.create_proposal,[["creator",_],["receiver",_],["start_date",Pe],["end_date",Pe],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(ie)]]);k.update_proposal_votes=R(T.update_proposal_votes,[["voter",_],["proposal_ids",V(rn)],["approve",ge],["extensions",V(ie)]]);k.remove_proposal=R(T.remove_proposal,[["proposal_owner",_],["proposal_ids",V(rn)],["extensions",V(ie)]]);var Co=ue([["end_date",Pe]]);k.update_proposal=R(T.update_proposal,[["proposal_id",nn],["creator",_],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(on([ie,Co]))]]);k.collateralized_convert=R(T.collateralized_convert,[["owner",_],["requestid",Y],["amount",q]]);k.recurrent_transfer=R(T.recurrent_transfer,[["from",_],["to",_],["amount",q],["memo",_],["recurrence",ce],["executions",ce],["extensions",V(ue([["type",tn],["value",ue([["pair_id",tn]])]]))]]);var To=(e,t)=>{let r=k[t[0]];if(!r)throw new Error(`No serializer for operation: ${t[0]}`);try{r(e,t[1]);}catch(n){throw n.message=`${t[0]}: ${n.message}`,n}},Ro=ue([["ref_block_num",ce],["ref_block_prefix",Y],["expiration",Pe],["operations",V(To)],["extensions",V(_)]]),Fo=ue([["from",fe],["to",fe],["nonce",nn],["check",Y],["encrypted",sn()]]),pe={Asset:q,Memo:Fo,Price:Xt,PublicKey:fe,String:_,Transaction:Ro,UInt16:ce,UInt32:Y};var Ye=e=>new Promise(t=>setTimeout(t,e));var qo=(()=>{try{return !(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof process<"u"&&process.versions!=null&&process.versions.node!=null}catch{return false}})();function ln(){return qo?{"User-Agent":x.userAgent}:{}}var X=class extends Error{name="RPCError";data;code;stack=void 0;constructor(t){super(t.message),this.code=t.code,"data"in t&&(this.data=t.data);}},Ce=class extends Error{node;rateLimitMs;isRateLimit;constructor(t,r,n={}){super(r),this.node=t,this.rateLimitMs=n.rateLimitMs??0,this.isRateLimit=n.isRateLimit??false;}};function dn(e){if(!e)return 0;let t=Number(e);if(Number.isFinite(t))return t>0?t*1e3:0;let r=Date.parse(e);if(Number.isFinite(r)){let n=r-Date.now();return n>0?n:0}return 0}var Io=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],Do=["Failed to fetch","NetworkError when attempting to fetch","Load failed","fetch failed"];function Ko(e){if(!e)return "";let t=[String(e.name||""),String(e.message||""),String(e.code||"")],r=e.cause;for(let n=0;r&&n<5;n++)t.push(String(r.code||""),String(r.message||"")),r=r.cause;return t.join(" ")}function Bo(e){if(!e)return false;if(e instanceof Ce)return true;if(e instanceof X)return false;let t=Ko(e);return !!(Io.some(r=>t.includes(r))||Do.some(r=>t.includes(r))||e instanceof SyntaxError||/Unexpected token|JSON\.parse|Unexpected end of JSON/i.test(t))}function Zt(e,t){return !!(e===-32603||e<=-32e3&&e>=-32099||e===-32601||e===-32602&&/unable to parse|endpoint data|internal/i.test(t))}function fn(e){let t=e.indexOf(".");return t>0?e.slice(0,t):e}var Mo=1e4,No=6e4,Qo=12e4,cn=2,un=6e4,pn=12e4,Ho=30,Xe=.3,er=3,Ze=5*6e4,mn=6e4,gn=1e3,yn=2e3,bt=class{health=new Map;getOrCreate(t){let r=this.health.get(t);return r||(r={consecutiveFailures:0,lastFailureTime:0,rateLimitedUntil:0,rateLimitStreak:0,lastRateLimitAt:0,apiFailures:new Map,headBlock:0,headBlockUpdatedAt:0,ewmaLatencyMs:void 0,latencySampleCount:0,latencyUpdatedAt:0,lastProbeAt:Date.now(),apiLatency:new Map},this.health.set(t,r)),r}recordSuccess(t,r,n,i){let o=this.getOrCreate(t);if(o.consecutiveFailures=0,o.rateLimitStreak=0,r){let s=o.apiFailures.get(r);(!s||!(s.defective&&s.cooldownUntil>Date.now()))&&o.apiFailures.delete(r);}typeof n=="number"&&Number.isFinite(n)&&n>=0&&this.recordLatency(o,n,i??r);}recordSlowFailure(t,r,n){!Number.isFinite(r)||r=er&&i-o.updatedAt<=Ze?o.ewmaMs:void 0}return this.isLatencyUsable(n,i)?n.ewmaLatencyMs:void 0}recordCensoredLatency(t,r,n){!Number.isFinite(r)||r<50||this.recordLatency(this.getOrCreate(t),r,n);}recordLatency(t,r,n){let i=Date.now();if(t.latencyUpdatedAt>0&&i-t.latencyUpdatedAt>Ze&&(t.ewmaLatencyMs=void 0,t.latencySampleCount=0,t.apiLatency.clear()),t.ewmaLatencyMs=t.ewmaLatencyMs===void 0?r:Xe*r+(1-Xe)*t.ewmaLatencyMs,t.latencySampleCount++,t.latencyUpdatedAt=i,n!==void 0){let o=t.apiLatency.get(n);!o||i-o.updatedAt>Ze?t.apiLatency.set(n,{ewmaMs:r,sampleCount:1,updatedAt:i}):(o.ewmaMs=Xe*r+(1-Xe)*o.ewmaMs,o.sampleCount++,o.updatedAt=i);}}recordFailure(t,r){let n=this.getOrCreate(t);if(r){let i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};(o.cooldownUntil>0&&o.cooldownUntil<=i||o.lastFailureTime>0&&i-o.lastFailureTime>3e4)&&(o.count=0,o.cooldownUntil=0),o.count++,o.lastFailureTime=i,o.count>=cn&&(o.cooldownUntil=i+un),n.apiFailures.set(r,o);}else n.consecutiveFailures++,n.lastFailureTime=Date.now();}recordDefectiveResponse(t,r){let n=this.getOrCreate(t),i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};o.count=Math.max(o.count+1,cn),o.lastFailureTime=i,o.cooldownUntil=i+un,o.defective=true,n.apiFailures.set(r,o);}recordRateLimit(t,r){let n=this.getOrCreate(t),i=Date.now();n.rateLimitStreak>0&&i-n.lastRateLimitAt>Qo&&(n.rateLimitStreak=0);let o=typeof r=="number"&&Number.isFinite(r)&&r>0,s=o?r:Math.min(Mo*2**n.rateLimitStreak,No);o||n.rateLimitStreak++,n.lastRateLimitAt=i,n.rateLimitedUntil=o?i+s:Math.max(n.rateLimitedUntil,i+s),n.consecutiveFailures++,n.lastFailureTime=i;}recordHeadBlock(t,r){if(!r||!Number.isFinite(r))return;let n=this.getOrCreate(t);n.headBlock=r,n.headBlockUpdatedAt=Date.now();}consensusHeadBlock(){let t=Date.now(),r=[];for(let n of this.health.values())n.headBlock>0&&t-n.headBlockUpdatedAt<=pn&&r.push(n.headBlock);return r.length<2?0:(r.sort((n,i)=>n-i),r[Math.floor((r.length-1)/2)])}isNodeHealthy(t,r){let n=this.health.get(t);if(!n)return true;let i=Date.now();if(n.rateLimitedUntil>i||n.consecutiveFailures>=3&&i-n.lastFailureTime<3e4)return false;if(r){let s=n.apiFailures.get(r);if(s&&s.cooldownUntil>i)return false}let o=this.consensusHeadBlock();return !(o>0&&n.headBlock>0&&i-n.headBlockUpdatedAt<=pn&&o-n.headBlock>Ho)}getOrderedNodes(t,r){let n=[],i=[];for(let u of t)this.isNodeHealthy(u,r)?n.push(u):i.push(u);if(n.length<=1)return [...n,...i];let o=Date.now(),s=n.map((u,p)=>({node:u,i:p,score:this.scoreNode(u,o)})).sort((u,p)=>u.score-p.score||u.i-p.i).map(u=>u.node),a=this.pickReprobeCandidate(n,o);return a&&s[0]!==a?[a,...s.filter(u=>u!==a),...i]:[...s,...i]}isLatencyUsable(t,r){return !!t&&t.ewmaLatencyMs!==void 0&&t.latencySampleCount>=er&&r-t.latencyUpdatedAt<=Ze}scoreNode(t,r){let n=this.health.get(t);return this.isLatencyUsable(n,r)?n.ewmaLatencyMs:gn}pickReprobeCandidate(t,r){let n=r-mn,i,o=1/0;for(let s of t){let a=this.getOrCreate(s),u=Math.max(a.latencyUpdatedAt,a.lastProbeAt);u<=n&&u=1-1e-9?(this.tokens-=1,true):false}refill(){this.clamp(),this.tokens=Math.min(x.resilience.hedgeBucketCapacity,this.tokens+x.resilience.hedgeRefillPerSuccess);}clamp(){this.tokens>x.resilience.hedgeBucketCapacity&&(this.tokens=x.resilience.hedgeBucketCapacity);}get available(){return this.tokens}reset(t=x.resilience.hedgeBucketCapacity){this.tokens=t;}},rr=new tr;function vt(e,t,r,n,i){let o=x.resilience;if(!o.adaptiveTimeout||i)return n;let s=e.getUsableLatencyMs(t,r);return s===void 0?n:Math.ceil(Math.min(n,Math.max(o.adaptiveTimeoutFloorMs,o.adaptiveTimeoutFactor*s)))}function nr(e,t,r,n){r instanceof Ce?r.isRateLimit?e.recordRateLimit(t,r.rateLimitMs||void 0):e.recordFailure(t,n):r instanceof X?e.recordFailure(t,n):e.recordFailure(t);}function hn(e,t,r,n){if(!n||typeof n!="object"||!r.includes("get_dynamic_global_properties"))return;let i=n.head_block_number;typeof i=="number"&&e.recordHeadBlock(t,i);}function Uo(){if(typeof DOMException<"u")return new DOMException("The operation was aborted due to timeout","TimeoutError");let e=new Error("The operation was aborted due to timeout");return e.name="TimeoutError",e}function wn(e){if(e=Math.ceil(e),typeof AbortSignal.timeout=="function")return {signal:AbortSignal.timeout(e),cleanup:()=>{}};let t=new AbortController,r=setTimeout(()=>t.abort(Uo()),e);return {signal:t.signal,cleanup:()=>clearTimeout(r)}}function ir(e,t){if(!t)return {signal:e,cleanup:()=>{}};if(typeof AbortSignal.any=="function")return {signal:AbortSignal.any([e,t]),cleanup:()=>{}};let r=new AbortController;if(e.aborted)return r.abort(e.reason),{signal:r.signal,cleanup:()=>{}};if(t.aborted)return r.abort(t.reason),{signal:r.signal,cleanup:()=>{}};let n=()=>r.abort(e.reason),i=()=>r.abort(t.reason);e.addEventListener("abort",n,{once:true}),t.addEventListener("abort",i,{once:true});let o=()=>{e.removeEventListener("abort",n),t.removeEventListener("abort",i);};return {signal:r.signal,cleanup:o}}var et=async(e,t,r,n=x.timeout,i=false,o)=>{let s=Math.floor(Math.random()*1e8),a={jsonrpc:"2.0",method:t,params:r,id:s},{signal:u,cleanup:p}=wn(n),{signal:l,cleanup:f}=ir(u,o),m=()=>{p(),f();};try{let y=await fetch(e,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",...ln()},signal:l});if(y.status===429)throw new Ce(e,"HTTP 429 Rate Limited",{rateLimitMs:dn(y.headers.get("Retry-After")),isRateLimit:!0});if(y.status>=500&&y.status<600)throw new Ce(e,`HTTP ${y.status} from ${e}`);let h=await y.json();if(!h||typeof h.id>"u"||h.id!==s||h.jsonrpc!=="2.0")throw new Error("JSONRPC id mismatch");if("result"in h)return h.result;if("error"in h){let E=h.error;throw "message"in E&&"code"in E?new X(E):h.error}throw h}catch(y){if(y instanceof X||y instanceof Ce||o?.aborted)throw y;if(i)return et(e,t,r,n,false,o);throw y}finally{m();}};function _t(){return Ye(50+Math.random()*50)}function Vo(e){let{method:t,params:r,api:n,primary:i,hedgePool:o,callerTimeout:s,explicitTimeout:a,deadlineAt:u,externalSignal:p,onHedgeFired:l,validate:f}=e;return new Promise((m,y)=>{let h=false,E=0,O=false,A=false,P,L,U=0,B=[],Q=z=>{if(!h){h=true,L!==void 0&&(clearTimeout(L),L=void 0);for(let F of B)F.signal.aborted||F.abort();z();}},$=(z,F)=>{E++;let de=new AbortController;B.push(de);let Je=ir(de.signal,p),_o=vt(j,z,t,s,a),jt=Date.now();F||(U=jt),et(z,t,r,_o,false,Je.signal).then(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(f&&!f(ne)){if(j.recordDefectiveResponse(z,n),P=new Error(`[hive-tx] response validation failed for ${t} from ${z}`),!F&&!O){Q(()=>y(P));return}E===0&&Q(()=>y(P));return}j.recordSuccess(z,n,Date.now()-jt,t),hn(j,z,t,ne),F?A||j.recordCensoredLatency(i,Date.now()-U,t):O||rr.refill(),Q(()=>m(ne));}}).catch(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(p?.aborted){Q(()=>y(ne));return}if(ne instanceof X&&!Zt(ne.code,ne.message)){Q(()=>y(ne));return}if(nr(j,z,ne,n),j.recordSlowFailure(z,Date.now()-jt,t),P=ne,!F&&!O){Q(()=>y(ne));return}E===0&&Q(()=>y(P));}});};$(i,false);let Se=j.getUsableLatencyMs(i,t)??0,ze=vt(j,i,t,s,a),Vt=Math.min(Math.max(x.resilience.hedgeDelayFloorMs,x.resilience.hedgeDelayFactor*Se),.8*ze);L=setTimeout(()=>{if(L=void 0,h||p?.aborted||Date.now()>=u)return;let z=o.filter(de=>j.isNodeHealthy(de,n));if(z.length===0)return;let F=z[Math.floor(Math.random()*z.length)];rr.trySpend()&&(O=true,l(F),$(F,true));},Vt);})}var g=async(e,t=[],r,n=x.retry,i,o)=>{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let s=r!==void 0,a=r??x.timeout,u=fn(e),p=Date.now()+x.resilience.totalBudgetFactor*a,l=new Set,f;for(let m=0;m<=n&&!(m>0&&Date.now()>=p);m++){let y=j.getOrderedNodes(x.nodes,u),h=y.find(A=>!l.has(A));h||(l.clear(),h=y[0]),l.add(h);let E=[];if(x.resilience.hedge&&j.getUsableLatencyMs(h,e)!==void 0&&(E=y.filter(A=>!l.has(A)&&j.isNodeHealthy(A,u)).slice(0,3)),E.length>0)try{return await Vo({method:e,params:t,api:u,primary:h,hedgePool:E,callerTimeout:a,explicitTimeout:s,deadlineAt:p,externalSignal:i,onHedgeFired:A=>l.add(A),validate:o})}catch(A){if(A instanceof X&&!Zt(A.code,A.message)||i?.aborted)throw A;f=A,m{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let i=fn(e),o=new Set,s;for(let a=0;a!o.has(l));if(!p)break;if(o.add(p),n?.aborted)throw new Error("Aborted");try{let l=await et(p,e,t,r,!1,n);return j.recordSuccess(p,i),l}catch(l){if(l instanceof X||n?.aborted||(nr(j,p,l,i),s=l,!Bo(l)))throw l}}throw s},jo={balance:"/balance-api",hafah:"/hafah-api",hafbe:"/hafbe-api",hivemind:"/hivemind-api",hivesense:"/hivesense-api",reputation:"/reputation-api","nft-tracker":"/nft-tracker-api",hafsql:"/hafsql",status:"/status-api"};async function ee(e,t,r,n,i=x.retry,o){if(!Array.isArray(x.restNodes))throw new Error("config.restNodes is not an array");if(x.restNodes.length===0)throw new Error("config.restNodes is empty");let s=n!==void 0,a=n??x.timeout,u=Date.now()+x.resilience.totalBudgetFactor*a,p=`${e}:${t}`,l=x.restNodesByApi?.[e]?.length?x.restNodesByApi[e]:x.restNodes,f=new Set,m,y=false;for(let h=0;h<=i&&!(h>0&&Date.now()>=u);h++){let E=Oe.getOrderedNodes(l,e),O=E.find(F=>!f.has(F));O||(f.clear(),O=E[0]),f.add(O);let A=O+jo[e],P=t,L=r||{},U=new Set;Object.entries(L).forEach(([F,de])=>{P.includes(`{${F}}`)&&(P=P.replace(`{${F}}`,encodeURIComponent(String(de))),U.add(F));});let B=new URL(A+P);if(Object.entries(L).forEach(([F,de])=>{U.has(F)||(Array.isArray(de)?de.forEach(Je=>B.searchParams.append(F,String(Je))):B.searchParams.set(F,String(de)));}),o?.aborted)throw new Error("Aborted");y=false;let{signal:Q,cleanup:$}=wn(vt(Oe,O,p,a,s)),{signal:Se,cleanup:ze}=ir(Q,o),Vt=()=>{$(),ze();},z=Date.now();try{let F=await fetch(B.toString(),{signal:Se,headers:ln()});if(F.status===404)throw new Error("HTTP 404 - Hint: can happen on wrong params");if(F.status===429)throw Oe.recordRateLimit(O,dn(F.headers.get("Retry-After"))||void 0),y=!0,new Error(`HTTP 429 Rate Limited by ${O}`);if(F.status===503)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP 503 Service Unavailable from ${O}`);if(!F.ok)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP ${F.status} from ${O}`);return Oe.recordSuccess(O,e,Date.now()-z,p),F.json()}catch(F){if(F?.message?.includes("HTTP 404")||o?.aborted)throw F;y||Oe.recordFailure(O,e),Oe.recordSlowFailure(O,Date.now()-z,p),m=F,h{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an Array");if(r>x.nodes.length)throw new Error("quorum > config.nodes.length");let o=(u=>{let p=[...u];for(let l=p.length-1;l>0;l--){let f=Math.floor(Math.random()*(l+1));[p[l],p[f]]=[p[f],p[l]];}return p})(x.nodes),s=Math.min(r,o.length),a=[];for(;s>0&&o.length>0;){let u=o.splice(0,s),p=[],l=[];for(let m=0;ml.push(y)).catch(()=>{}));await Promise.all(p),a.push(...l);let f=Lo(a,r);if(f)return f;if(s=Math.min(r,o.length),s===0)throw new Error("No more nodes available.")}throw new Error("Couldn't reach quorum.")};function Lo(e,t){let r=new Map;for(let i of e){let o=JSON.stringify(i);r.has(o)||r.set(o,[]),r.get(o).push(i);}let n=Array.from(r.values()).find(i=>i.length>=t);return n?n[0]:null}var Wo=utils_js.hexToBytes(x.chain_id),Te=class e{transaction;expiration=6e4;txId;constructor(t){t?.transaction&&(t.transaction instanceof e?(this.transaction=t.transaction.transaction,this.expiration=t.transaction.expiration):this.transaction=t.transaction,this.transaction&&!Array.isArray(this.transaction.signatures)&&(this.transaction.signatures=[]),this.txId=this.digest().txId),t?.expiration&&(this.expiration=t.expiration);}async addOperation(t,r){this.transaction||await this.createTransaction(this.expiration),this.transaction.operations.push([t,r]);}sign(t){if(!this.transaction)throw new Error("First create a transaction by .addOperation()");if(this.transaction){let{digest:r,txId:n}=this.digest();Array.isArray(t)||(t=[t]);for(let i of t){let o=i.sign(r);this.transaction.signatures.push(o.customToString());}return this.txId=n,this.transaction}else throw new Error("No transaction to sign")}async broadcast(t=false){if(!this.transaction)throw new Error("Attempted to broadcast an empty transaction. Add operations by .addOperation()");if(this.transaction.signatures.length===0)throw new Error("Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)");try{await Qe("condenser_api.broadcast_transaction",[this.transaction]);}catch(o){if(!(o instanceof X&&o.message.includes("Duplicate transaction check failed")))throw o}if(this.txId||(this.txId=this.digest().txId),!t)return {tx_id:this.txId,status:"unknown"};let r=60;await Ye(1e3);let n=await this.checkStatus(),i=1;for(;n?.status!=="within_irreversible_block"&&n?.status!=="expired_irreversible"&&n?.status!=="too_old"&&i{let r=await g("condenser_api.get_dynamic_global_properties",[]),n=utils_js.hexToBytes(r.head_block_id),i=Number(new Uint32Array(n.buffer,n.byteOffset+4,1)[0]),o=new Date(Date.now()+t).toISOString().slice(0,-5);this.transaction={expiration:o,extensions:[],operations:[],ref_block_num:r.head_block_number&65535,ref_block_prefix:i,signatures:[]};}};var On=new Uint8Array([128]),H=class e{key;constructor(t){this.key=t;try{secp256k1_js.secp256k1.getPublicKey(t);}catch{throw new Error("invalid private key")}}static from(t){return typeof t=="string"?e.fromString(t):new e(t)}static fromString(t){return new e(Yo(t).subarray(1))}static fromSeed(t){if(typeof t=="string")if(/^[0-9a-fA-F]+$/.test(t))t=utils_js.hexToBytes(t);else {let n=[];for(let i=0;i>6,128|o&63);else if(o>=55296&&o<=56319&&i+1>18,128|o>>12&63,128|o>>6&63,128|o&63);}else n.push(224|o>>12,128|o>>6&63,128|o&63);}t=new Uint8Array(n);}return new e(sha2_js.sha256(t))}static fromLogin(t,r,n="active"){let i=t+n+r;return e.fromSeed(i)}sign(t){let r=secp256k1_js.secp256k1.sign(t,this.key,{extraEntropy:true,format:"recovered",prehash:false}),n=parseInt(utils_js.bytesToHex(r.subarray(0,1)),16);return Ae.from((n+31).toString(16)+utils_js.bytesToHex(r.subarray(1)))}createPublic(t){return new J(secp256k1_js.secp256k1.getPublicKey(this.key),t)}toString(){return Jo(new Uint8Array([...On,...this.key]))}inspect(){let t=this.toString();return `PrivateKey: ${t.slice(0,6)}...${t.slice(-6)}`}getSharedSecret(t){let r=secp256k1_js.secp256k1.getSharedSecret(this.key,t.key);return sha2_js.sha512(r.subarray(1))}static randomKey(){return new e(secp256k1_js.secp256k1.keygen().secretKey)}},xn=e=>sha2_js.sha256(sha2_js.sha256(e)),Jo=e=>{let t=xn(e);return en__default.default.encode(new Uint8Array([...e,...t.slice(0,4)]))},Yo=e=>{let t=en__default.default.decode(e);if(!An(t.slice(0,1),On))throw new Error("Private key network id mismatch");let r=t.slice(-4),n=t.slice(0,-4),i=xn(n).slice(0,4);if(!An(r,i))throw new Error("Private key checksum mismatch");return n},An=(e,t)=>{if(e===t)return true;if(e.byteLength!==t.byteLength)return false;let r=e.byteLength,n=0;for(;nCn(e,t,n,r),kn=(e,t,r,n,i)=>Cn(e,t,r,n,i).message,Cn=(e,t,r,n,i)=>{let o=r,s=e.getSharedSecret(t),a=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);a.writeUint64(o),a.append(s),a.flip();let u=sha2_js.sha512(new Uint8Array(a.toBuffer())),p=u.subarray(32,48),l=u.subarray(0,32),f=sha2_js.sha256(u).subarray(0,4),m=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);m.append(f),m.flip();let y=m.readUint32();if(i!==void 0){if(y!==i)throw new Error("Invalid key");n=ts(n,l,p);}else n=rs(n,l,p);return {nonce:o,message:n,checksum:y}},ts=(e,t,r)=>{let n=e;return n=aes_js.cbc(t,r).decrypt(n),n},rs=(e,t,r)=>{let n=e;return n=aes_js.cbc(t,r).encrypt(n),n},sr=null,ns=()=>{if(sr===null){let r=secp256k1_js.secp256k1.utils.randomSecretKey();sr=r[0]<<8|r[1];}let e=BigInt(Date.now()),t=++sr%65536;return e=e<{let t=us(e,33);return new J(t)},os=e=>e.readUint64(),ss=e=>e.readUint32(),as=e=>{let t=e.readVarint32(),r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())},cs=e=>t=>{let r={},n=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);n.append(t),n.flip();for(let[i,o]of e)try{r[i]=o(n);}catch(s){throw s.message=`${i}: ${s.message}`,s}return r};function us(e,t){if(e){let r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())}else throw Error("No buffer found on first parameter")}var ps=cs([["from",Tn],["to",Tn],["nonce",os],["check",ss],["encrypted",as]]),Rn={Memo:ps};var qn=(e,t,r,n)=>{if(!r.startsWith("#"))return r;r=r.substring(1),Dn(),e=Kn(e),t=ls(t);let i=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);i.writeVString(r);let o=new Uint8Array(i.copy(0,i.offset).toBuffer()),{nonce:s,message:a,checksum:u}=Sn(e,t,o,n),p=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);pe.Memo(p,{check:u,encrypted:a,from:e.createPublic(),nonce:s,to:t}),p.flip();let l=new Uint8Array(p.toBuffer());return "#"+en__default.default.encode(l)},In=(e,t)=>{if(!t.startsWith("#"))return t;t=t.substring(1),Dn(),e=Kn(e);let r=Rn.Memo(en__default.default.decode(t)),{from:n,to:i,nonce:o,check:s,encrypted:a}=r,p=e.createPublic().toString()===new J(n.key).toString()?new J(i.key):new J(n.key);r=kn(e,p,o,a,s);let l=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return l.append(r),l.flip(),"#"+l.readVString()},Pt,Dn=()=>{if(Pt===void 0){let e;Pt=true;try{let t="5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw",n=qn(t,"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA","#memo\u7231");e=In(t,n);}finally{Pt=e==="#memo\u7231";}}if(Pt===false)throw new Error("This environment does not support encryption.")},Kn=e=>typeof e=="string"?H.fromString(e):e,ls=e=>typeof e=="string"?J.fromString(e):e,Bn={decode:In,encode:qn};var re={};ft(re,{buildWitnessSetProperties:()=>hs,makeBitMaskFilter:()=>gs,operations:()=>ms,validateUsername:()=>fs});var fs=e=>{let t="Account name should ";if(!e)return t+"not be empty.";let r=e.length;if(r<3)return t+"be longer.";if(r>16)return t+"be shorter.";/\./.test(e)&&(t="Each account segment should ");let n=e.split("."),i=n.length;for(let o=0;oe.reduce(ys,[BigInt(0),BigInt(0)]).map(t=>t!==BigInt(0)?t.toString():null),ys=([e,t],r)=>r<64?[e|BigInt(1)<{let r={extensions:[],owner:e,props:[]};for(let n of Object.keys(t)){if(t[n]===void 0)continue;let i;switch(n){case "key":case "new_signing_key":i=pe.PublicKey;break;case "account_subsidy_budget":case "account_subsidy_decay":case "maximum_block_size":i=pe.UInt32;break;case "hbd_interest_rate":i=pe.UInt16;break;case "url":i=pe.String;break;case "hbd_exchange_rate":i=pe.Price;break;case "account_creation_fee":i=pe.Asset;break;default:throw new Error(`Unknown witness prop: ${n}`)}r.props.push([n,ws(i,t[n])]);}return r.props.sort((n,i)=>n[0].localeCompare(i[0])),["witness_set_properties",r]},ws=(e,t)=>{let r=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return e(r,t),r.flip(),utils_js.bytesToHex(new Uint8Array(r.toBuffer()))};function tm(e){let t;if(typeof e=="string"){let r=[];for(let n=0;n>6,128|i&63);else if(i>=55296&&i<=56319&&n+1>18,128|i>>12&63,128|i>>6&63,128|i&63);}else r.push(224|i>>12,128|i>>6&63,128|i&63);}t=new Uint8Array(r);}else t=e;return sha2_js.sha256(t)}function Mn(e){try{return H.fromString(e),!0}catch{return false}}async function Z(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),Qe("condenser_api.broadcast_transaction_synchronous",[r.transaction])}async function Nn(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),r.broadcast(false)}var bs=432e3;function Qn(e,t){let r=Date.now()/1e3-t.last_update_time,n=Number(t.current_mana)+r*e/bs,i=Math.round(n/e*1e4);return !isFinite(i)||i<0?i=0:i>1e4&&(i=1e4),{current_mana:n,max_mana:e,percentage:i}}function vs(e){let t=parseFloat(e.vesting_shares),r=parseFloat(e.delegated_vesting_shares),n=parseFloat(e.received_vesting_shares),i=parseFloat(e.vesting_withdraw_rate),o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t-s-r+n}function ar(e){let t=vs(e)*1e6;return Qn(t,e.voting_manabar)}function Ot(e){return Qn(Number(e.max_rc),e.rc_manabar)}var Hn=(u=>(u.COMMON="common",u.INFO="info",u.INSUFFICIENT_RESOURCE_CREDITS="insufficient_resource_credits",u.MISSING_AUTHORITY="missing_authority",u.TOKEN_EXPIRED="token_expired",u.NETWORK="network",u.TIMEOUT="timeout",u.VALIDATION="validation",u))(Hn||{});function He(e){let t=e?.error_description?String(e.error_description):"",r=e?.message?String(e.message):"",n=e?.error?String(e.error):"",i=t||r||String(e||""),o=a=>!!(n&&a.test(n)||t&&a.test(t)||r&&a.test(r)||i&&a.test(i));if(o(/please wait to transact/i)||o(/insufficient rc/i)||o(/rc mana|rc account|resource credits/i))return {message:"Insufficient Resource Credits. Please wait or power up.",type:"insufficient_resource_credits",originalError:e};if(o(/you may only post once every/i))return {message:"Please wait before posting again (minimum 3 second interval between comments).",type:"common",originalError:e};if(o(/your current vote on this comment is identical/i))return {message:"You have already voted with the same weight.",type:"info",originalError:e};if(o(/must claim something/i))return {message:"You must claim rewards before performing this action.",type:"info",originalError:e};if(o(/cannot claim that much vests/i))return {message:"Cannot claim that amount. Please check your pending rewards.",type:"info",originalError:e};if(o(/cannot delete a comment with net positive/i))return {message:"Cannot delete a comment with positive votes.",type:"info",originalError:e};if(o(/children == 0/i))return {message:"Cannot delete a comment with replies.",type:"common",originalError:e};if(o(/comment_cashout/i))return {message:"Cannot modify a comment that has already been paid out.",type:"common",originalError:e};if(o(/votes evaluating for comment that is paid out is forbidden/i))return {message:"Cannot vote on posts that have already been paid out.",type:"common",originalError:e};if(o(/no (active|owner|posting|memo) key available/i))return {message:"Key not available. Please provide your key to sign this operation.",type:"missing_authority",originalError:e};if(o(/missing (required )?active authority/i))return {message:"Missing active authority. This operation requires your active key.",type:"missing_authority",originalError:e};if(o(/missing (required )?owner authority/i))return {message:"Missing owner authority. This operation requires your owner key.",type:"missing_authority",originalError:e};if(o(/missing (required )?posting authority/i))return {message:"Missing posting authority. Please check your login method.",type:"missing_authority",originalError:e};if(n==="invalid_grant"||n==="unauthorized_access"||o(/token expired/i)||o(/invalid token/i)||o(/\bunauthorized\b/i)||o(/\bforbidden\b/i))return {message:"Authentication token expired. Please log in again.",type:"token_expired",originalError:e};if(o(/has already reblogged/i)||o(/already reblogged this post/i))return {message:"You have already reblogged this post.",type:"info",originalError:e};if(o(/duplicate transaction/i))return {message:"This transaction has already been processed.",type:"info",originalError:e};if(o(/econnrefused/i)||o(/connection refused/i)||o(/failed to fetch/i)||o(/\bnetwork[-\s]?(request|error|timeout|unreachable|down|failed)\b/i))return {message:"Network error. Please check your connection and try again.",type:"network",originalError:e};if(o(/timeout/i)||o(/timed out/i))return {message:"Request timed out. Please try again.",type:"timeout",originalError:e};if(o(/account.*does not exist/i)||o(/account not found/i))return {message:"Account not found. Please check the username.",type:"validation",originalError:e};if(o(/invalid memo key/i))return {message:"Invalid memo key. Cannot encrypt message.",type:"validation",originalError:e};if(o(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i))return {message:"Insufficient funds for this transaction.",type:"validation",originalError:e};if(o(/\b(invalid|validation)\b/i))return {message:(e?.message||i).substring(0,150)||"Validation error occurred",type:"validation",originalError:e};if(e?.error_description&&typeof e.error_description=="string")return {message:e.error_description.substring(0,150),type:"common",originalError:e};if(e?.message&&typeof e.message=="string")return {message:e.message.substring(0,150),type:"common",originalError:e};let s;return typeof e=="object"&&e!==null?e.error_description?s=String(e.error_description):e.code?s=`Error code: ${e.code}`:i&&i!=="[object Object]"?s=i.substring(0,150):s="Unknown error occurred":s=i.substring(0,150)||"Unknown error occurred",{message:s,type:"common",originalError:e}}function As(e){let t=He(e);return [t.message,t.type]}function ye(e){let{type:t}=He(e);return t==="missing_authority"||t==="token_expired"}function Ps(e){let{type:t}=He(e);return t==="insufficient_resource_credits"}function Os(e){let{type:t}=He(e);return t==="info"}function xs(e){let{type:t}=He(e);return t==="network"||t==="timeout"}async function he(e,t,r,n,i="posting",o,s,a="async"){let u=n?.adapter;switch(e){case "key":{if(!u)throw new Error("No adapter provided for key-based auth");let p=o;if(p===void 0)switch(i){case "owner":if(u.getOwnerKey)p=await u.getOwnerKey(t);else throw new Error("Owner key not supported by adapter. Owner operations (like account recovery) require master password login or manual key entry.");break;case "active":u.getActiveKey&&(p=await u.getActiveKey(t));break;case "memo":if(u.getMemoKey)p=await u.getMemoKey(t);else throw new Error("Memo key not supported by adapter. Use memo encryption methods instead.");break;default:p=await u.getPostingKey(t);break}if(!p)throw new Error(`No ${i} key available for ${t}`);let l=H.fromString(p);return a==="async"?await Nn(r,l):await Z(r,l)}case "hiveauth":{if(!u?.broadcastWithHiveAuth)throw new Error("HiveAuth not supported by adapter");return await u.broadcastWithHiveAuth(t,r,i)}case "hivesigner":{if(!u)throw new Error("No adapter provided for HiveSigner auth");if(i!=="posting"){if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`HiveSigner access token cannot sign ${i} operations. No platform broadcast available.`)}let p=s!==void 0?s:await u.getAccessToken(t);if(p)try{return (await new Un__default.default.Client({accessToken:p}).broadcast(r)).result}catch(l){if(u.broadcastWithHiveSigner&&ye(l))return await u.broadcastWithHiveSigner(t,r,i);throw l}if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`No access token available for ${t}`)}case "keychain":{if(!u?.broadcastWithKeychain)throw new Error("Keychain not supported by adapter");return await u.broadcastWithKeychain(t,r,i)}case "custom":{if(!n?.broadcast)throw new Error("No custom broadcast function provided");return await n.broadcast(r,i)}default:throw new Error(`Unknown auth method: ${e}`)}}async function Ss(e,t,r,n="posting",i="async"){let o=r?.adapter;if(o?.getLoginType){let l=await o.getLoginType(e,n);if(l){let f=o.hasPostingAuthorization?await o.hasPostingAuthorization(e):false;if(n==="posting"&&f&&l==="key")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to key:",m);}if(n==="posting"&&f&&l==="keychain")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to keychain/snap:",m);}if(n==="posting"&&f&&l==="hiveauth")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to HiveAuth:",m);}try{return await he(l,e,t,r,n,void 0,void 0,i)}catch(m){if(ye(m)&&o.showAuthUpgradeUI&&(n==="posting"||n==="active")){let y=t.length>0?t[0][0]:"unknown",h=await o.showAuthUpgradeUI(n,y);if(!h)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(h,e,t,r,n,void 0,void 0,i)}throw m}}if(n==="posting")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(f){if(ye(f)&&o.showAuthUpgradeUI){let m=t.length>0?t[0][0]:"unknown",y=await o.showAuthUpgradeUI(n,m);if(!y)throw new Error(`No login type available for ${e}. Please log in again.`);return await he(y,e,t,r,n,void 0,void 0,i)}throw f}else if(n==="active"&&o.showAuthUpgradeUI){let f=t.length>0?t[0][0]:"unknown",m=await o.showAuthUpgradeUI(n,f);if(!m)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(m,e,t,r,n,void 0,void 0,i)}}let s=r?.fallbackChain??["key","hiveauth","hivesigner","keychain","custom"],a=new Map;for(let l of s)try{let f=!1,m="",y,h;switch(l){case "key":if(!o)f=!0,m="No adapter provided";else {let E;switch(n){case "owner":o.getOwnerKey&&(E=await o.getOwnerKey(e));break;case "active":o.getActiveKey&&(E=await o.getActiveKey(e));break;case "memo":o.getMemoKey&&(E=await o.getMemoKey(e));break;default:E=await o.getPostingKey(e);break}E?y=E:(f=!0,m=`No ${n} key available`);}break;case "hiveauth":o?.broadcastWithHiveAuth||(f=!0,m="HiveAuth not supported by adapter");break;case "hivesigner":if(!o)f=!0,m="No adapter provided";else {let E=await o.getAccessToken(e);E&&(h=E);}break;case "keychain":o?.broadcastWithKeychain||(f=!0,m="Keychain not supported by adapter");break;case "custom":r?.broadcast||(f=!0,m="No custom broadcast function provided");break}if(f){a.set(l,new Error(`Skipped: ${m}`));continue}return await he(l,e,t,r,n,y,h,i)}catch(f){if(a.set(l,f),!ye(f))throw f}if(!Array.from(a.values()).some(l=>!l.message.startsWith("Skipped:"))){let l=Array.from(a.entries()).map(([f,m])=>`${f}: ${m.message}`).join(", ");throw new Error(`[SDK][Broadcast] No auth methods attempted for ${e}. ${l}`)}let p=Array.from(a.entries()).map(([l,f])=>`${l}: ${f.message}`).join(", ");throw new Error(`[SDK][Broadcast] All auth methods failed for ${e}. Errors: ${p}`)}function v(e=[],t,r,n=()=>{},i,o="posting",s){let a=s?.broadcastMode??"async";return reactQuery.useMutation({onSuccess:n,onMutate:s?.onMutate,onError:s?.onError,onSettled:s?.onSettled,mutationKey:[...e,t],mutationFn:async u=>{if(!t)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let p=r(u);try{if(i?.enableFallback!==!1&&i?.adapter)return await Ss(t,p,i,o,a);if(i?.broadcast)return await i.broadcast(p,o);let l=i?.postingKey;if(l){if(o!=="posting")throw new Error(`[SDK][Broadcast] Legacy auth only supports posting authority, but '${o}' was requested. Use AuthContextV2 with an adapter for ${o} operations.`);let m=H.fromString(l);return await Z(p,m)}let f=i?.accessToken;if(f)return (await new Un__default.default.Client({accessToken:f}).broadcast(p)).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}catch(l){throw l instanceof X?new Error(l.message):l}}})}async function Vn(e,t,r,n){if(!e)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let i={id:t,required_auths:[],required_posting_auths:[e],json:JSON.stringify(r)};if(n?.broadcast)return n.broadcast([["custom_json",i]],"posting");let o=n?.postingKey;if(o){let u=H.fromString(o);return Z([["custom_json",i]],u)}let s=n?.accessToken;if(s)return (await new Un__default.default.Client({accessToken:s}).customJson([],[e],t,JSON.stringify(r))).result;let a=n?.adapter;if(a){let u=[["custom_json",i]];if(n?.loginType==="keychain"&&a.broadcastWithKeychain)return a.broadcastWithKeychain(e,u,"posting");if(n?.loginType==="hiveauth"&&a.broadcastWithHiveAuth)return a.broadcastWithHiveAuth(e,u,"posting")}throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}var hm=4e3;function S(e,t,r){if(e?.invalidateQueries){if(t==="sync")return e.invalidateQueries(r);setTimeout(()=>e.invalidateQueries?.(r),4e3);}}function we(e,t){let r=AbortSignal.timeout(e);if(!t)return r;if(typeof AbortSignal.any=="function")return AbortSignal.any([t,r]);let n=new AbortController,i=()=>{let o=t.aborted?t.reason:r.reason;n.abort(o),t.removeEventListener("abort",i),r.removeEventListener("abort",i);};return t.aborted?n.abort(t.reason):r.aborted?n.abort(r.reason):(t.addEventListener("abort",i,{once:true}),r.addEventListener("abort",i,{once:true})),n.signal}var Re=(()=>{try{return process.env?.NODE_ENV==="development"}catch{return false}})(),Ts=()=>{try{return process.env?.VITE_HELIUS_API_KEY}catch{return}},_e=1e4,jn=120*1e3,xt,Rs;function Fs(){return xt?xt():Rs??=new reactQuery.QueryClient}var d={privateApiHost:"https://ecency.com",defaultObserver:"ecency",clientId:"ecency-sdk",imageHost:"https://i.ecency.com",get hiveNodes(){return x.nodes},heliusApiKey:Ts(),get queryClient(){return Fs()},set queryClient(e){xt=()=>e;},pollsApiHost:"https://poll.ecency.com",plausibleHost:"https://pl.ecency.com",dmcaAccounts:[],dmcaTags:[],dmcaPatterns:[],dmcaTagRegexes:[],dmcaPatternRegexes:[],_dmcaInitialized:false};exports.ConfigManager=void 0;(A=>{function e(P){d.queryClient=P;}A.setQueryClient=e;function t(P){xt=P;}A.setQueryClientResolver=t;function r(P){d.privateApiHost=P;}A.setPrivateApiHost=r;function n(P){d.clientId=P;}A.setClientId=n;function i(P){if(typeof P!="string"||P.trim()==="")throw new Error("setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; observer resolution would fall back to the post author while caching under an empty key.");d.defaultObserver=P;}A.setDefaultObserver=i;function o(){return d.privateApiHost?d.privateApiHost:typeof window<"u"&&window.location?.origin?window.location.origin:"https://ecency.com"}A.getValidatedBaseUrl=o;function s(P){d.pollsApiHost=P;}A.setPollsApiHost=s;function a(P){d.imageHost=P;}A.setImageHost=a;function u(P){$t(P);}A.setHiveNodes=u;function p(P){Wt(P);}A.setRestNodes=p;function l(P){Gt(P);}A.setRestNodesByApi=l;function f(P){zt(P);}A.setUserAgent=f;function m(P){Jt(P);}A.setResilience=m;function y(P){if(/(\([^)]*[*+{][^)]*\))[*+{]/.test(P))return {safe:false,reason:"nested quantifiers detected"};if(/\([^|)]*\|[^)]*\)[*+{]/.test(P))return {safe:false,reason:"alternation with quantifier (potential overlap)"};if(/\([^)]*[*+][^)]*\)[*+]/.test(P))return {safe:false,reason:"repeated quantifiers (catastrophic backtracking risk)"};if(/\.\*\.\*/.test(P)||/\.\+\.\+/.test(P))return {safe:false,reason:"multiple greedy quantifiers on wildcards"};let L=/\.?\{(\d+),(\d+)\}/g,U;for(;(U=L.exec(P))!==null;){let[,B,Q]=U;if(parseInt(Q,10)-parseInt(B,10)>1e3)return {safe:false,reason:`excessive range: {${B},${Q}}`}}return {safe:true}}function h(P){let L=["a".repeat(50)+"x","ab".repeat(50)+"x","x".repeat(100),"aaa".repeat(30)+"bbb".repeat(30)+"x"],U=5;for(let B of L){let Q=Date.now();try{P.test(B);let $=Date.now()-Q;if($>U)return {safe:!1,reason:`runtime test exceeded ${U}ms (took ${$}ms on input length ${B.length})`}}catch($){return {safe:false,reason:`runtime test threw error: ${$}`}}}return {safe:true}}function E(P,L=200){try{if(!P)return Re&&console.warn("[SDK] DMCA pattern rejected: empty pattern"),null;if(P.length>L)return Re&&console.warn(`[SDK] DMCA pattern rejected: length ${P.length} exceeds max ${L} - pattern: ${P.substring(0,50)}...`),null;let U=y(P);if(!U.safe)return Re&&console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${U.reason}) - pattern: ${P.substring(0,50)}...`),null;let B;try{B=new RegExp(P);}catch($){return Re&&console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${P.substring(0,50)}...`,$),null}let Q=h(B);return Q.safe?B:(Re&&console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${Q.reason}) - pattern: ${P.substring(0,50)}...`),null)}catch(U){return Re&&console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${P.substring(0,50)}...`,U),null}}function O(P={}){let L=$=>Array.isArray($)?$.filter(Se=>typeof Se=="string"):[],U=P||{},B={accounts:L(U.accounts),tags:L(U.tags),patterns:L(U.posts)};d.dmcaAccounts=B.accounts,d.dmcaTags=B.tags,d.dmcaPatterns=B.patterns,d.dmcaTagRegexes=B.tags.map($=>E($)).filter($=>$!==null),d.dmcaPatternRegexes=[];let Q=B.tags.length-d.dmcaTagRegexes.length;!d._dmcaInitialized&&Re&&(console.log("[SDK] DMCA configuration loaded:"),console.log(` - Accounts: ${B.accounts.length}`),console.log(` - Tag patterns: ${d.dmcaTagRegexes.length}/${B.tags.length} compiled (${Q} rejected)`),console.log(` - Post patterns: ${B.patterns.length} (using exact string matching)`),Q>0&&console.warn(`[SDK] ${Q} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`)),d._dmcaInitialized=true;}A.setDmcaLists=O;})(exports.ConfigManager||={});function Cm(){return new reactQuery.QueryClient({defaultOptions:{queries:{refetchOnWindowFocus:false,refetchOnMount:false}}})}var b=()=>d.queryClient;exports.EcencyQueriesManager=void 0;(s=>{function e(a){return b().getQueryData(a)}s.getQueryData=e;function t(a){return b().getQueryData(a)}s.getInfiniteQueryData=t;async function r(a){return await b().prefetchQuery(a),e(a.queryKey)}s.prefetchQuery=r;async function n(a){return await b().prefetchInfiniteQuery(a),t(a.queryKey)}s.prefetchInfiniteQuery=n;function i(a){return {prefetch:()=>r(a),getData:()=>e(a.queryKey),useClientQuery:()=>reactQuery.useQuery(a),fetchAndGet:()=>b().fetchQuery(a)}}s.generateClientServerQuery=i;function o(a){return {prefetch:()=>n(a),getData:()=>t(a.queryKey),useClientQuery:()=>reactQuery.useInfiniteQuery(a),fetchAndGet:()=>b().fetchInfiniteQuery(a)}}s.generateClientServerInfiniteQuery=o;})(exports.EcencyQueriesManager||={});function Rm(e){return btoa(JSON.stringify(e))}function Fm(e){let t=atob(e);if(t[0]==="{")return JSON.parse(t)}var Ln=(n=>(n.HIVE="HIVE",n.HBD="HBD",n.VESTS="VESTS",n))(Ln||{}),Et=(e=>(e["@@000000021"]="HIVE",e["@@000000013"]="HBD",e["@@000000037"]="VESTS",e))(Et||{});function C(e){if(typeof e=="string"){let t=e.split(" ");return {amount:parseFloat(t[0]),symbol:Ln[t[1]]}}else return {amount:parseFloat(e.amount.toString())/Math.pow(10,e.precision),symbol:Et[e.nai]}}var cr;function w(){if(!cr){if(typeof globalThis.fetch!="function")throw new Error("[Ecency][SDK] - global fetch is not available");cr=globalThis.fetch.bind(globalThis);}return cr}function $n(e){return typeof e=="string"?/^hive-\d+$/.test(e):false}function Bs(e){return e&&typeof e=="object"&&"data"in e&&"pagination"in e&&Array.isArray(e.data)}function oe(e,t){return Bs(e)?e:{data:Array.isArray(e)?e:[],pagination:{total:Array.isArray(e)?e.length:0,limit:t,offset:0,has_next:false}}}function Ue(e,t){return e/1e6*t}function Wn(e){return e===void 0?true:parseInt(e.split("-")[0],10)<1980}var Gn=60*1e3;function be(){return reactQuery.queryOptions({queryKey:c.core.dynamicProps(),refetchInterval:Gn,staleTime:Gn,queryFn:async({signal:e})=>{let[t,r,n,i,o]=await Promise.all([g("condenser_api.get_dynamic_global_properties",[],void 0,void 0,e),g("condenser_api.get_feed_history",[],void 0,void 0,e),g("condenser_api.get_chain_properties",[],void 0,void 0,e),g("condenser_api.get_reward_fund",["post"],void 0,void 0,e),g("database_api.get_hardfork_properties",{},void 0,void 0,e).catch(()=>({current_hardfork_version:"1.28.0",last_hardfork:28}))]),s=C(t.total_vesting_shares).amount,a=C(t.total_vesting_fund_hive).amount,u=0;Number.isFinite(s)&&s!==0&&Number.isFinite(a)&&(u=a/s*1e6);let p=C(r.current_median_history.base).amount,l=C(r.current_median_history.quote).amount,f=parseFloat(i.recent_claims),m=C(i.reward_balance).amount,y=Number(t.vote_power_reserve_rate??0),h=i.author_reward_curve??"linear",E=Number(i.content_constant??0),O=String(o.current_hardfork_version??"0.0.0"),A=Number(o.last_hardfork??0),P=t.hbd_print_rate,L=t.hbd_interest_rate,U=t.head_block_number,B=a,Q=s,$=C(t.virtual_supply).amount,Se=t.vesting_reward_percent||0,ze=n.account_creation_fee;return {hivePerMVests:u,base:p,quote:l,fundRecentClaims:f,fundRewardBalance:m,votePowerReserveRate:y,authorRewardCurve:h,contentConstant:E,currentHardforkVersion:O,lastHardfork:A,hbdPrintRate:P,hbdInterestRate:L,headBlock:U,totalVestingFund:B,totalVestingShares:Q,virtualSupply:$,vestingRewardPercent:Se,accountCreationFee:ze,raw:{globalDynamic:t,feedHistory:r,chainProps:n,rewardFund:i,hardforkProps:o}}}})}function Gm(e="post"){return reactQuery.queryOptions({queryKey:c.core.rewardFund(e),queryFn:()=>g("condenser_api.get_reward_fund",[e])})}function Fe(...e){let t=e.length;for(;t>0&&e[t-1]===void 0;)t--;return e.slice(0,t)}var c={posts:{entry:e=>["posts","entry",e],postHeader:(e,t)=>["posts","post-header",e,t],content:(e,t)=>["posts","content",e,t],contentReplies:(e,t)=>["posts","content-replies",e,t],accountPosts:(e,t,r,n)=>["posts","account-posts",e,t,r,n],accountPostsPage:(e,t,r,n,i,o)=>["posts","account-posts-page",e,t,r,n,i,o],userPostVote:(e,t,r)=>["posts","user-vote",e,t,r],reblogs:(e,t)=>["posts","reblogs",e,t],entryActiveVotes:(e,t)=>["posts","entry-active-votes",e,t],rebloggedBy:(e,t)=>["posts","reblogged-by",e,t],tips:(e,t)=>["posts","tips",e,t],normalize:(e,t)=>["posts","normalize",e,t],drafts:e=>["posts","drafts",e],draftsInfinite:(e,t)=>Fe("posts","drafts","infinite",e,t),schedules:e=>["posts","schedules",e],schedulesInfinite:(e,t)=>Fe("posts","schedules","infinite",e,t),fragments:e=>["posts","fragments",e],fragmentsInfinite:(e,t)=>Fe("posts","fragments","infinite",e,t),images:e=>["posts","images",e],galleryImages:e=>["posts","gallery-images",e],imagesInfinite:(e,t)=>Fe("posts","images","infinite",e,t),promoted:e=>["posts","promoted",e],_promotedPrefix:["posts","promoted"],accountPostsBlogPrefix:e=>["posts","account-posts",e,"blog"],postsRanked:(e,t,r,n)=>["posts","posts-ranked",e,t,r,n],postsRankedPage:(e,t,r,n,i,o)=>["posts","posts-ranked-page",e,t,r,n,i,o],discussions:(e,t,r,n)=>["posts","discussions",e,t,r,n],discussion:(e,t,r)=>["posts","discussion",e,t,r],deletedEntry:e=>["posts","deleted-entry",e],commentHistory:(e,t,r)=>["posts","comment-history",e,t,r],trendingTags:()=>["posts","trending-tags"],trendingTagsWithStats:e=>["posts","trending-tags","stats",e],wavesFeed:(e={})=>["posts","waves","feed",e.tag??"",e.following??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],shortsFeed:(e={})=>["posts","waves","shorts",e.tag??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],wavesByHost:e=>["posts","waves","by-host",e],wavesByTag:(e,t)=>["posts","waves","by-tag",e,t],wavesFollowing:(e,t)=>["posts","waves","following",e,t],wavesTrendingTags:(e,t)=>["posts","waves","trending-tags",e,t],wavesByAccount:(e,t)=>["posts","waves","by-account",e,t],wavesTrendingAuthors:e=>["posts","waves","trending-authors",e],_prefix:["posts"]},accounts:{full:e=>["get-account-full",e],list:(...e)=>["accounts","list",...e],friends:(e,t,r,n)=>["accounts","friends",e,t,r,n],searchFriends:(e,t,r)=>["accounts","friends","search",e,t,r],subscriptions:e=>["accounts","subscriptions",e],followCount:e=>["accounts","follow-count",e],recoveries:e=>["accounts","recoveries",e],pendingRecovery:e=>["accounts","recoveries",e,"pending-request"],checkWalletPending:(e,t)=>["accounts","check-wallet-pending",e,t],mutedUsers:e=>["accounts","muted-users",e],following:(e,t,r,n)=>["accounts","following",e,t,r,n],followers:(e,t,r,n)=>["accounts","followers",e,t,r,n],search:(e,t)=>["accounts","search",e,t],profiles:(e,t)=>["accounts","profiles",e,t],lookup:(e,t)=>["accounts","lookup",e,t],transactions:(e,t,r)=>["accounts","transactions",e,t,r],favorites:e=>["accounts","favorites",e],favoritesInfinite:(e,t)=>Fe("accounts","favorites","infinite",e,t),checkFavorite:(e,t)=>["accounts","favorites","check",e,t],relations:(e,t)=>["accounts","relations",e,t],bots:()=>["accounts","bots"],voteHistory:(e,t)=>["accounts","vote-history",e,t],reputations:(e,t)=>["accounts","reputations",e,t],bookmarks:e=>["accounts","bookmarks",e],bookmarksInfinite:(e,t)=>Fe("accounts","bookmarks","infinite",e,t),referrals:e=>["accounts","referrals",e],referralsStats:e=>["accounts","referrals-stats",e],proMembers:()=>["accounts","pro-members"],_prefix:["accounts"]},notifications:{announcements:()=>["notifications","announcements"],spotlights:()=>["notifications","spotlights"],list:(e,t)=>["notifications",e,t],unreadCount:e=>["notifications","unread",e],settings:e=>["notifications","settings",e],_prefix:["notifications"]},core:{rewardFund:e=>["core","reward-fund",e],dynamicProps:()=>["core","dynamic-props"],chainProperties:()=>["core","chain-properties"],_prefix:["core"]},communities:{single:(e,t)=>["community","single",e,t],singlePrefix:e=>["community","single",e],context:(e,t)=>["community","context",e,t],rewarded:()=>["communities","rewarded"],list:(e,t,r)=>["communities","list",e,t,r],subscribers:e=>["communities","subscribers",e],subscribersInfinite:e=>["communities","subscribers","infinite",e],accountNotifications:(e,t)=>["communities","account-notifications",e,t]},proposals:{list:()=>["proposals","list"],proposal:e=>["proposals","proposal",e],votes:(e,t,r)=>["proposals","votes",e,t,r],votesPrefix:e=>["proposals","votes",e],votesByUser:e=>["proposals","votes","by-user",e]},search:{topics:(e,t)=>["search","topics",e,t],path:e=>["search","path",e],account:(e,t)=>["search","account",e,t],results:(e,t,r,n,i,o)=>["search",e,t,typeof r=="string"?r==="1"||r==="true":r,n,i,o],controversialRising:(e,t)=>["search","controversial-rising",e,t],similarEntries:(e,t,r)=>r?["search","similar-entries",e,t,r]:["search","similar-entries",e,t],api:(e,t,r,n,i,o)=>Fe("search","api",e,t,r,n,i,o)},witnesses:{list:e=>["witnesses","list",e],votes:e=>["witnesses","votes",e],proxy:()=>["witnesses","proxy"],voters:(e,t,r,n,i)=>["witnesses","voters",e,t,r,n,i],voterCount:e=>["witnesses","voter-count",e]},wallet:{outgoingRcDelegations:(e,t)=>["wallet","outgoing-rc-delegations",e,t],vestingDelegations:(e,t)=>["wallet","vesting-delegations",e,t],withdrawRoutes:e=>["wallet","withdraw-routes",e],incomingRc:e=>["wallet","incoming-rc",e],conversionRequests:e=>["wallet","conversion-requests",e],receivedVestingShares:e=>["wallet","received-vesting-shares",e],savingsWithdraw:e=>["wallet","savings-withdraw",e],openOrders:e=>["wallet","open-orders",e],collateralizedConversionRequests:e=>["wallet","collateralized-conversion-requests",e],recurrentTransfers:e=>["wallet","recurrent-transfers",e],balanceHistory:(e,t,r)=>["wallet","balance-history",e,t,r],aggregatedHistory:(e,t,r)=>r===void 0?["wallet","aggregated-history",e,t]:["wallet","aggregated-history",e,t,r],portfolio:(e,t,r)=>["wallet","portfolio","v2",e,t,r]},assets:{hiveGeneralInfo:e=>["assets","hive","general-info",e],hiveTransactions:(e,t,r)=>["assets","hive","transactions",e,t,r],hiveWithdrawalRoutes:e=>["assets","hive","withdrawal-routes",e],hiveMetrics:e=>["assets","hive","metrics",e],hbdGeneralInfo:e=>["assets","hbd","general-info",e],hbdTransactions:(e,t,r)=>["assets","hbd","transactions",e,t,r],hivePowerGeneralInfo:e=>["assets","hive-power","general-info",e],hivePowerDelegates:e=>["assets","hive-power","delegates",e],hivePowerDelegatings:e=>["assets","hive-power","delegatings",e],hivePowerTransactions:(e,t,r)=>["assets","hive-power","transactions",e,t,r],pointsGeneralInfo:e=>["assets","points","general-info",e],pointsTransactions:(e,t)=>["assets","points","transactions",e,t],ecencyAssetInfo:(e,t,r)=>["ecency-wallets","asset-info",e,t,r]},market:{statistics:()=>["market","statistics"],orderBook:e=>["market","order-book",e],history:(e,t,r)=>["market","history",e,t,r],feedHistory:()=>["market","feed-history"],hiveHbdStats:()=>["market","hive-hbd-stats"],data:(e,t,r,n)=>["market","data",e,t,r,n],tradeHistory:(e,t,r)=>["market","trade-history",e,t,r],currentMedianHistoryPrice:()=>["market","current-median-history-price"]},analytics:{discoverCuration:e=>["analytics","discover-curation",e],pageStats:(e,t,r,n)=>["analytics","page-stats",e,t,r,n],discoverLeaderboard:e=>["analytics","discover-leaderboard",e]},promotions:{promotePrice:()=>["promotions","promote-price"],boostPlusPrices:()=>["promotions","boost-plus-prices"],boostPlusAccounts:e=>["promotions","boost-plus-accounts",e]},resourceCredits:{account:e=>["resource-credits","account",e],stats:()=>["resource-credits","stats"]},points:{points:(e,t)=>["points",e,t],_prefix:e=>["points",e]},polls:{details:(e,t)=>["polls","details",e,t],vote:(e,t)=>e&&t?["polls","vote",e,t]:["polls","vote"],_prefix:["polls"]},operations:{chainProperties:()=>["operations","chain-properties"]},games:{statusCheck:(e,t)=>["games","status-check",e,t]},quests:{status:e=>["quests","status",e]},support:{settings:e=>["support","settings",e],_prefix:["support"]},badActors:{list:()=>["bad-actors","list"],_prefix:["bad-actors"]},ai:{prices:()=>["ai","prices"],assistPrices:e=>["ai","assist-prices",e],transcribePrice:e=>["ai","transcribe-price",e],_prefix:["ai"]}};function Zm(e){return reactQuery.queryOptions({queryKey:c.ai.prices(),queryFn:async()=>{let r=await w()(d.privateApiHost+"/private-api/ai-generate-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch AI generation prices: ${r.status}`);return await r.json()},staleTime:3e5,enabled:!!e})}function ng(e,t){return reactQuery.queryOptions({queryKey:c.ai.assistPrices(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-assist-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI assist prices: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function ag(e,t){return reactQuery.queryOptions({queryKey:c.ai.transcribePrice(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-transcribe-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI transcribe price: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function js(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function lg(e,t){return reactQuery.useMutation({mutationKey:["ai","generate-image"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][GenerateImage] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][GenerateImage] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-generate-image",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,us:e,prompt:r.prompt,aspect_ratio:r.aspect_ratio??"1:1",power:r.power??1,idempotency_key:r.idempotency_key??js()})});if(!i.ok){let s=await i.text(),a={};try{a=JSON.parse(s);}catch{}let u=new Error(`[SDK][AI][GenerateImage] \u2013 failed with status ${i.status}${s?`: ${s}`:""}`);throw u.status=i.status,u.data=a,u}if(i.status===202){let s={};try{s=await i.json();}catch{}let a=new Error("[SDK][AI][GenerateImage] \u2013 delivery pending");throw a.status=202,a.data=s,a}return await i.json()},onSuccess:()=>{e&&b().invalidateQueries({queryKey:c.points._prefix(e)});}})}function $s(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function gg(e,t){return reactQuery.useMutation({mutationKey:["ai","assist"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Assist] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][Assist] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-assist",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r.code??t,us:e,action:r.action,text:r.text,idempotency_key:$s()})});if(!i.ok){let o=await i.text(),s={};try{s=JSON.parse(o);}catch{}let a=new Error(`[SDK][AI][Assist] \u2013 failed with status ${i.status}${o?`: ${o}`:""}`);throw a.status=i.status,a.data=s,a}return await i.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.assistPrices(e)}));}})}function Gs(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function _g(e,t){return reactQuery.useMutation({mutationKey:["ai","transcribe"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Transcribe] \u2013 username wasn't provided");let n=r.code??t;if(!n)throw new Error("[SDK][AI][Transcribe] \u2013 access token wasn't found");let i=new FormData;i.append("code",n),i.append("duration_ms",String(Math.round(r.durationMs))),i.append("idempotency_key",r.idempotency_key??Gs()),i.append("audio",r.audio,r.fileName??"clip.webm");let s=await w()(d.privateApiHost+"/private-api/ai-transcribe",{method:"POST",body:i});if(!s.ok){let a=await s.text(),u={};try{u=JSON.parse(a);}catch{}throw Object.assign(new Error(`[SDK][AI][Transcribe] \u2013 failed with status ${s.status}${a?`: ${a}`:""}`),{status:s.status,data:u})}return await s.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.transcribePrice(e)}));}})}function ur(e){return !e.posting_json_metadata&&!e.json_metadata}function Js(e){return e?Object.values(e).some(t=>typeof t=="string"?t.length>0:t!=null):false}function M(e){return reactQuery.queryOptions({queryKey:c.accounts.full(e),queryFn:async({signal:t})=>{if(!e)return null;let[r,n]=await Promise.all([g("condenser_api.get_accounts",[[e]],void 0,void 0,t,p=>Array.isArray(p)),g("bridge.get_profile",{account:e},void 0,void 0,t).catch(p=>{if(t?.aborted)throw p;return null})]);if(!r?.[0])return null;let i=r[0];if(ur(i)&&Js(n?.metadata?.profile)){let p=await g("condenser_api.get_accounts",[[e]],void 0,void 0,t,l=>Array.isArray(l)&&(!l[0]||!ur(l[0])));if(p[0]&&!ur(p[0]))i=p[0];else throw new Error(`[SDK][Accounts] \u2013 inconsistent account row for ${e}: empty json metadata while hivemind profile is populated`)}let o=qe(i.posting_json_metadata),s=n?.stats,a=s?{account:i.name,follower_count:s.followers??0,following_count:s.following??0}:void 0,u=n?.reputation??0;return {name:i.name,owner:i.owner,active:i.active,posting:i.posting,memo_key:i.memo_key,post_count:i.post_count,created:i.created,posting_json_metadata:i.posting_json_metadata,last_vote_time:i.last_vote_time,last_post:i.last_post,json_metadata:i.json_metadata,reward_hive_balance:i.reward_hive_balance,reward_hbd_balance:i.reward_hbd_balance,reward_vesting_hive:i.reward_vesting_hive,reward_vesting_balance:i.reward_vesting_balance,balance:i.balance,hbd_balance:i.hbd_balance,savings_balance:i.savings_balance,savings_hbd_balance:i.savings_hbd_balance,savings_hbd_last_interest_payment:i.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:i.savings_hbd_seconds_last_update,savings_hbd_seconds:i.savings_hbd_seconds,next_vesting_withdrawal:i.next_vesting_withdrawal,pending_claimed_accounts:i.pending_claimed_accounts,vesting_shares:i.vesting_shares,delegated_vesting_shares:i.delegated_vesting_shares,received_vesting_shares:i.received_vesting_shares,vesting_withdraw_rate:i.vesting_withdraw_rate,to_withdraw:i.to_withdraw,withdrawn:i.withdrawn,witness_votes:i.witness_votes,proxy:i.proxy,recovery_account:i.recovery_account,proxied_vsf_votes:i.proxied_vsf_votes,voting_manabar:i.voting_manabar,voting_power:i.voting_power,downvote_manabar:i.downvote_manabar,follow_stats:a,reputation:u,profile:o}},enabled:!!e,staleTime:6e4})}var Ys=new Set(["__proto__","constructor","prototype"]);function St(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function zn(e,t){let r={...e};for(let n of Object.keys(t)){if(Ys.has(n))continue;let i=t[n],o=r[n];St(i)&&St(o)?r[n]=zn(o,i):r[n]=i;}return r}function Xs(e){if(!(!e||!Array.isArray(e)))return e.map(({meta:t,...r})=>{if(!t||typeof t!="object")return {...r,meta:t};let{privateKey:n,username:i,...o}=t;return {...r,meta:o}})}function qe(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.profile&&typeof t.profile=="object")return t.profile}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata:",t,{length:e?.length??0});}return {}}function Jn(e){return qe(e?.posting_json_metadata)}function Yn(e,t){if(!e)return t;if(!t)return e;let r=Object.keys(qe(e.posting_json_metadata)).length;return Object.keys(qe(t.posting_json_metadata)).length>r?t:e}function Zs(e){if(!e)return {};try{let t=JSON.parse(e);if(St(t))return t}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata root:",t,{length:e?.length??0});}return {}}function Xn({existingPostingJsonMetadata:e,profile:t,tokens:r}){let n=Zs(e),i=St(n.profile)?n.profile:{},o=pr({existingProfile:i,profile:t,tokens:r});return JSON.stringify({...n,profile:o})}function pr({existingProfile:e,profile:t,tokens:r}){let{tokens:n,version:i,...o}=t??{},s=zn(e??{},o);return s.tokens&&!Array.isArray(s.tokens)&&(s.tokens=void 0),r!==void 0?s.tokens=r&&r.length>0?r:[]:n!==void 0&&(s.tokens=n),s.tokens=Xs(s.tokens),s.version=2,s}function kt(e){return e.map(t=>{let r={name:t.name,owner:t.owner,active:t.active,posting:t.posting,memo_key:t.memo_key,post_count:t.post_count,created:t.created,reputation:t.reputation,posting_json_metadata:t.posting_json_metadata,last_vote_time:t.last_vote_time,last_post:t.last_post,json_metadata:t.json_metadata,reward_hive_balance:t.reward_hive_balance,reward_hbd_balance:t.reward_hbd_balance,reward_vesting_hive:t.reward_vesting_hive,reward_vesting_balance:t.reward_vesting_balance,balance:t.balance,hbd_balance:t.hbd_balance,savings_balance:t.savings_balance,savings_hbd_balance:t.savings_hbd_balance,savings_hbd_last_interest_payment:t.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:t.savings_hbd_seconds_last_update,savings_hbd_seconds:t.savings_hbd_seconds,next_vesting_withdrawal:t.next_vesting_withdrawal,pending_claimed_accounts:t.pending_claimed_accounts,vesting_shares:t.vesting_shares,delegated_vesting_shares:t.delegated_vesting_shares,received_vesting_shares:t.received_vesting_shares,vesting_withdraw_rate:t.vesting_withdraw_rate,to_withdraw:t.to_withdraw,withdrawn:t.withdrawn,witness_votes:t.witness_votes,proxy:t.proxy,recovery_account:t.recovery_account,proxied_vsf_votes:t.proxied_vsf_votes,voting_manabar:t.voting_manabar,voting_power:t.voting_power,downvote_manabar:t.downvote_manabar},n=qe(t.posting_json_metadata);if(!n||Object.keys(n).length===0)try{let i=JSON.parse(t.json_metadata||"{}");i.profile&&(n=i.profile);}catch{}return (!n||Object.keys(n).length===0)&&(n={about:"",cover_image:"",location:"",name:"",profile_image:"",website:""}),{...r,profile:n}})}function qg(e){return reactQuery.queryOptions({queryKey:c.accounts.list(...e),enabled:e.length>0,queryFn:async()=>{let t=await g("condenser_api.get_accounts",[e],void 0,void 0,void 0,r=>Array.isArray(r));return kt(t??[])}})}function Mg(e){return reactQuery.queryOptions({queryKey:c.accounts.followCount(e),queryFn:()=>g("condenser_api.get_follow_count",[e])})}function Vg(e,t,r="blog",n=100){return reactQuery.queryOptions({queryKey:c.accounts.followers(e,t,r,n),queryFn:()=>g("condenser_api.get_followers",[e,t,r,n]),enabled:!!e})}function Gg(e,t,r="blog",n=100){return reactQuery.queryOptions({queryKey:c.accounts.following(e,t,r,n),queryFn:()=>g("condenser_api.get_following",[e,t,r,n]),enabled:!!e})}var Zn=1e3,oa=20;function Zg(e){return reactQuery.queryOptions({queryKey:c.accounts.mutedUsers(e),queryFn:async()=>{let t=[],r="";for(let n=0;ns.following);if(o[0]===r&&(o=o.slice(1)),!o.length||(t.push(...o),i.lengthg("condenser_api.lookup_accounts",[e,t]),enabled:!!e,staleTime:1/0})}function uy(e,t=5,r=[]){return reactQuery.queryOptions({queryKey:c.accounts.search(e,r),enabled:!!e,queryFn:async()=>(await g("condenser_api.lookup_accounts",[e,t])).filter(i=>r.length>0?!r.includes(i):true)})}var ua=new Set(["ownerPublicKey","activePublicKey","postingPublicKey","memoPublicKey"]);function fy(e,t){return reactQuery.queryOptions({queryKey:c.accounts.checkWalletPending(e,t??null),queryFn:async()=>{if(!e||!t)return {exist:false};let n=await w()(d.privateApiHost+"/private-api/wallets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,code:t})});if(!n.ok)return {exist:false};let i=await n.json(),o=Array.isArray(i)?i.flatMap(s=>{if(!s||typeof s!="object")return [];let a=s,u=typeof a.token=="string"?a.token:void 0;if(!u)return [];let p=a.meta&&typeof a.meta=="object"?{...a.meta}:{},l={},f=typeof a.address=="string"&&a.address?a.address:void 0,y=(typeof a.status=="number"?a.status===3:void 0)??false;f&&(l.address=f),l.show=y;let h={symbol:u,currency:u,address:f,show:y,type:"CHAIN",meta:l},E=[];for(let[O,A]of Object.entries(p))typeof O=="string"&&(ua.has(O)||typeof A!="string"||!A||/^[A-Z0-9]{2,10}$/.test(O)&&E.push({symbol:O,currency:O,address:A,show:y,type:"CHAIN",meta:{address:A,show:y}}));return [h,...E]}):[];return {exist:o.length>0,tokens:o.length?o:void 0,wallets:o.length?o:void 0}},refetchOnMount:true})}function ei(e,t){return reactQuery.queryOptions({queryKey:c.accounts.relations(e,t),enabled:!!e&&!!t,refetchOnMount:false,refetchInterval:36e5,queryFn:async()=>{let r={follows:false,ignores:false,blacklists:false,follows_muted:false,follows_blacklists:false};return !e||!t?r:await g("bridge.get_relationship_between_accounts",[e,t])??r}})}function Ay(e){return reactQuery.queryOptions({queryKey:c.accounts.subscriptions(e),enabled:!!e,queryFn:async({signal:t})=>await g("bridge.list_all_subscriptions",{account:e},void 0,void 0,t)??[]})}function Ey(e,t){return reactQuery.queryOptions({queryKey:c.accounts.bookmarks(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Bookmarks] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/bookmarks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Sy(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.accounts.bookmarksInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch bookmarks: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ry(e,t){return reactQuery.queryOptions({queryKey:c.accounts.favorites(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Fy(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.accounts.favoritesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/favorites?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch favorites: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ky(e,t,r){return reactQuery.queryOptions({queryKey:c.accounts.checkFavorite(e,r),enabled:!!e&&!!t&&!!r,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");if(!r)throw new Error("[SDK][Accounts][Favorites] \u2013 no target username");let i=await w()(d.privateApiHost+"/private-api/favorites-check",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:r})});if(!i.ok)throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check failed with status ${i.status}: ${i.statusText}`);let o=await i.json();if(typeof o!="boolean")throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check returned invalid type: expected boolean, got ${typeof o}`);return o}})}function Qy(e,t){return reactQuery.queryOptions({enabled:!!e&&!!t,queryKey:c.accounts.recoveries(e),queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts] Missing username or access token");return (await w()(d.privateApiHost+"/private-api/recoveries",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Ly(e){return reactQuery.queryOptions({enabled:!!e,queryKey:c.accounts.pendingRecovery(e),queryFn:()=>g("database_api.find_change_recovery_account_requests",{accounts:[e]})})}function Jy(e,t=50){return reactQuery.queryOptions({queryKey:c.accounts.reputations(e,t),enabled:!!e,queryFn:async()=>e?g("condenser_api.get_account_reputations",[e,t]):[]})}var D=re.operations,ti={transfers:[D.transfer,D.transfer_to_savings,D.transfer_from_savings,D.cancel_transfer_from_savings,D.recurrent_transfer,D.fill_recurrent_transfer,D.escrow_transfer,D.fill_recurrent_transfer],"market-orders":[D.fill_convert_request,D.fill_order,D.fill_collateralized_convert_request,D.limit_order_create2,D.limit_order_create,D.limit_order_cancel],interests:[D.interest],"stake-operations":[D.return_vesting_delegation,D.withdraw_vesting,D.transfer_to_vesting,D.set_withdraw_vesting_route,D.update_proposal_votes,D.fill_vesting_withdraw,D.account_witness_proxy,D.delegate_vesting_shares],rewards:[D.author_reward,D.curation_reward,D.producer_reward,D.claim_reward_balance,D.comment_benefactor_reward,D.liquidity_reward,D.proposal_pay]},va=[...Object.values(ti)].reduce((e,t)=>e.concat(t),[]);function Aa(e){return e.block*1e7+e.trx_in_block*100+e.op_pos}function Pa(e){return e.replace(/_operation$/,"")}function Oa(e){return typeof e=="object"&&e!==null&&"nai"in e&&"amount"in e&&"precision"in e}function xa(e){if(!Oa(e))return e;let t=C(e),r=Et[e.nai]??"UNKNOWN";return `${t.amount.toFixed(e.precision)} ${r}`}function Ea(e){let t={};for(let[r,n]of Object.entries(e))t[r]=xa(n);return t}function ih(e,t=20,r=""){let n=r?ti[r]:va;return reactQuery.infiniteQueryOptions({queryKey:c.accounts.transactions(e??"",r,t),initialPageParam:null,queryFn:async({pageParam:i,signal:o})=>{if(!e)return {entries:[],currentPage:0};let s={"account-name":e,"operation-types":n.join(","),"page-size":t};i!==null&&(s.page=i);let a=await ee("hafah","/accounts/{account-name}/operations",s,void 0,void 0,o);return {entries:a.operations_result.map(p=>{let l=Pa(p.op.type);return {...Ea(p.op.value),num:Aa(p),type:l,timestamp:p.timestamp,trx_id:p.trx_id}}),currentPage:i??a.total_pages}},getNextPageParam:i=>{let o=i.currentPage-1;return o>=1?o:void 0}})}function ch(){return reactQuery.queryOptions({queryKey:c.accounts.bots(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/public/bots",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch bots: ${e.status}`);return e.json()},refetchOnMount:true,staleTime:1/0})}function dh(e){return reactQuery.infiniteQueryOptions({queryKey:c.accounts.referrals(e),initialPageParam:{maxId:void 0},queryFn:async({pageParam:t})=>{let{maxId:r}=t??{},n=exports.ConfigManager.getValidatedBaseUrl(),i=new URL(`/private-api/referrals/${e}`,n);r!==void 0&&i.searchParams.set("max_id",r.toString());let o=await fetch(i.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`Failed to fetch referrals: ${o.status}`);return o.json()},getNextPageParam:t=>{let r=t?.[t.length-1]?.id;return typeof r=="number"?{maxId:r}:void 0}})}function yh(e){return reactQuery.queryOptions({queryKey:c.accounts.referralsStats(e),queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/referrals/${e}/stats`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch referral stats: ${t.status}`);let r=await t.json();if(!r)throw new Error("No Referrals for this user!");return {total:r.total??0,rewarded:r.rewarded??0}}})}function Ah(e,t,r){let{followType:n="blog",limit:i=100,enabled:o=true}=r??{};return reactQuery.infiniteQueryOptions({queryKey:c.accounts.friends(e,t,n,i),initialPageParam:{startFollowing:""},enabled:o,refetchOnMount:true,queryFn:async({pageParam:s})=>{let{startFollowing:a}=s,l=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,a===""?null:a,n,i])).map(y=>t==="following"?y.following:y.follower);return (await g("bridge.get_profiles",{accounts:l,observer:void 0})??[]).map(y=>({name:y.name,reputation:y.reputation,active:y.active}))},getNextPageParam:s=>s&&s.length===i?{startFollowing:s[s.length-1].name}:void 0})}var Fa=30;function Sh(e,t,r){return reactQuery.queryOptions({queryKey:c.accounts.searchFriends(e,t,r),refetchOnMount:false,enabled:false,queryFn:async()=>{if(!r)return [];let n=r.slice(0,-1),s=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,n,"blog",1e3])).map(u=>t==="following"?u.following:u.follower).filter(u=>u.toLowerCase().includes(r.toLowerCase())).slice(0,Fa);return (await g("bridge.get_profiles",{accounts:s,observer:void 0}))?.map(u=>({name:u.name,full_name:u.metadata.profile?.name||"",reputation:u.reputation,active:u.active}))??[]}})}function Fh(e=20){return reactQuery.infiniteQueryOptions({queryKey:c.posts.trendingTags(),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!n.name.startsWith("hive-")).map(n=>n.name)),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length>0?{afterTag:t[t.length-1]}:void 0,staleTime:3600*1e3})}function Mh(e=250){return reactQuery.infiniteQueryOptions({queryKey:c.posts.trendingTagsWithStats(e),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!$n(n.name))),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length?{afterTag:t[t.length-1].name}:void 0,staleTime:1/0})}function Ve(e,t){return reactQuery.queryOptions({queryKey:c.posts.fragments(e),queryFn:async()=>t?(await w()(d.privateApiHost+"/private-api/fragments",{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json():[],enabled:!!e&&!!t})}function Uh(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.fragmentsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/fragments?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch fragments: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function $h(e="feed"){return reactQuery.queryOptions({queryKey:c.posts.promoted(e),queryFn:async()=>{let t=exports.ConfigManager.getValidatedBaseUrl(),r=new URL("/private-api/promoted-entries",t);return e==="waves"&&r.searchParams.append("short_content","1"),await(await w()(r.toString(),{method:"GET",headers:{"Content-Type":"application/json"}})).json()}})}function Yh(e){return reactQuery.queryOptions({queryKey:c.posts.entryActiveVotes(e?.author,e?.permlink),queryFn:async()=>g("condenser_api.get_active_votes",[e?.author,e?.permlink]),enabled:!!e})}function rw(e,t,r){return reactQuery.queryOptions({queryKey:c.posts.userPostVote(e,t,r),queryFn:async()=>(await g("database_api.list_votes",{start:[e,t,r],limit:1,order:"by_voter_comment"}))?.votes?.[0]||null,enabled:!!e&&!!t&&!!r})}function aw(e,t){return reactQuery.queryOptions({queryKey:c.posts.content(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content",[e,t])})}function dw(e,t){return reactQuery.queryOptions({queryKey:c.posts.contentReplies(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content_replies",{author:e,permlink:t})})}function hw(e,t){return reactQuery.queryOptions({queryKey:c.posts.postHeader(e,t),queryFn:async()=>g("bridge.get_post_header",{author:e,permlink:t}),initialData:null})}function te(e){return Array.isArray(e)?e.map(t=>ri(t)):ri(e)}function ri(e){if(!e)return e;let t=`@${e.author}/${e.permlink}`;return d.dmcaPatterns.includes(t)||d.dmcaPatternRegexes.some(n=>n.test(t))?{...e,body:"This post is not available due to a copyright/fraudulent claim.",title:""}:e}async function ni(e,t,r){try{let n=await At("bridge.get_post",{author:e,permlink:t,observer:r},1);if(n&&typeof n=="object"&&n.author===e&&n.permlink===t)return n}catch{}return null}function ii(e,t,r="",n){let i=t?.trim(),o=`/@${e}/${i??""}`;return reactQuery.queryOptions({queryKey:c.posts.entry(o),queryFn:async()=>{if(!i||i==="undefined")return null;let s=await g("bridge.get_post",{author:e,permlink:i,observer:r});if(!s){let u=await ni(e,i,r);if(!u)return null;let p=n!==void 0?{...u,num:n}:u;return te(p)}let a=n!==void 0?{...s,num:n}:s;return te(a)},enabled:!!e&&!!t&&t.trim()!==""&&t.trim()!=="undefined"})}function se(e,t,r){return g(`bridge.${e}`,t,void 0,void 0,r)}async function oi(e,t,r,n){let{json_metadata:i}=e;if(i?.original_author&&i?.original_permlink&&i.tags?.[0]==="cross-post")try{let o=await ja(i.original_author,i.original_permlink,t,r,n);return o?{...e,original_entry:o,num:r}:e}catch{return e}return {...e,num:r}}async function si(e,t,r){let n=e.map(rt),i=await Promise.all(n.map(o=>oi(o,t,void 0,r)));return te(i)}async function ai(e,t="",r="",n=20,i="",o="",s){let a=await se("get_ranked_posts",{sort:e,start_author:t,start_permlink:r,limit:n,tag:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_ranked_posts returned ${typeof a} instead of an array for sort=${e}; treating as no results.`),null)}async function lr(e,t,r="",n="",i=20,o="",s){if(d.dmcaAccounts.includes(t))return [];let a=await se("get_account_posts",{sort:e,account:t,start_author:r,start_permlink:n,limit:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_account_posts returned ${typeof a} instead of an array for account=${t}, sort=${e}; treating as no results.`),null)}function rt(e){let t={...e,active_votes:Array.isArray(e.active_votes)?[...e.active_votes]:[],beneficiaries:Array.isArray(e.beneficiaries)?[...e.beneficiaries]:[],blacklists:Array.isArray(e.blacklists)?[...e.blacklists]:[],replies:Array.isArray(e.replies)?[...e.replies]:[],stats:e.stats?{...e.stats}:null},r=["author","title","body","created","category","permlink","url","updated"];for(let n of r)t[n]==null&&(t[n]="");return t.author_reputation==null&&(t.author_reputation=0),t.children==null&&(t.children=0),t.depth==null&&(t.depth=0),t.net_rshares==null&&(t.net_rshares=0),t.payout==null&&(t.payout=0),t.percent_hbd==null&&(t.percent_hbd=0),t.stats||(t.stats={flag_weight:0,gray:false,hide:false,total_votes:0}),t.author_payout_value==null&&(t.author_payout_value="0.000 HBD"),t.curator_payout_value==null&&(t.curator_payout_value="0.000 HBD"),t.max_accepted_payout==null&&(t.max_accepted_payout="1000000.000 HBD"),t.payout_at==null&&(t.payout_at=""),t.pending_payout_value==null&&(t.pending_payout_value="0.000 HBD"),t.promoted==null&&(t.promoted="0.000 HBD"),t.is_paidout==null&&(t.is_paidout=false),t}async function ja(e="",t="",r="",n,i){let o=await se("get_post",{author:e,permlink:t,observer:r},i);if(o){let s=rt(o),a=await oi(s,r,n,i);return te(a)}}async function Fw(e="",t=""){let r=await se("get_post_header",{author:e,permlink:t});return r&&rt(r)}async function ci(e,t,r){let n=await se("get_discussion",{author:e,permlink:t,observer:r||e});if(n){let i={};for(let[o,s]of Object.entries(n))i[o]=rt(s);return i}return n}async function ui(e,t=""){return se("get_community",{name:e,observer:t})}async function qw(e="",t=100,r,n="rank",i=""){return se("list_communities",{last:e,limit:t,query:r,sort:n,observer:i})}async function pi(e){let t=await se("normalize_post",{post:e});return t&&rt(t)}async function Iw(e){return se("list_all_subscriptions",{account:e})}async function Dw(e){return se("list_subscribers",{community:e})}async function Kw(e,t){return se("get_relationship_between_accounts",[e,t])}async function Ct(e,t){return se("get_profiles",{accounts:e,observer:t})}var di=(i=>(i.trending="trending",i.author_reputation="author_reputation",i.votes="votes",i.created="created",i))(di||{});function dr(e){let t=e.match(/^(\d+\.?\d*)\s*([A-Z]+)$/);return t?{amount:parseFloat(t[1]),symbol:t[2]}:{amount:0,symbol:""}}function La(e,t,r){let n=l=>dr(l.pending_payout_value).amount+dr(l.author_payout_value).amount+dr(l.curator_payout_value).amount,i=l=>l.net_rshares<0,o=l=>e.json_metadata?.pinned_reply===`${l.author}/${l.permlink}`,s={trending:(l,f)=>{if(i(l))return 1;if(i(f))return -1;let m=n(l),y=n(f);return m!==y?y-m:0},author_reputation:(l,f)=>{let m=l.author_reputation,y=f.author_reputation;return m>y?-1:m{let m=l.children,y=f.children;return m>y?-1:m{if(i(l))return 1;if(i(f))return -1;let m=Date.parse(l.created),y=Date.parse(f.created);return m>y?-1:mo(l)),p=a[u];return u>=0&&(a.splice(u,1),a.unshift(p)),a}function fi(e,t="created",r=true,n){let i=n||d.defaultObserver;return reactQuery.queryOptions({queryKey:c.posts.discussions(e?.author,e?.permlink,t,i),queryFn:async()=>{if(!e)return [];let o=await g("bridge.get_discussion",{author:e.author,permlink:e.permlink,observer:i}),s=o?Array.from(Object.values(o)):[];return te(s)},enabled:r&&!!e,select:o=>La(e,o,t),structuralSharing:(o,s)=>{if(!o||!s)return s;let a=o.filter(l=>l.is_optimistic===true),u=new Set(s.map(l=>`${l.author}/${l.permlink}`)),p=a.filter(l=>!u.has(`${l.author}/${l.permlink}`));return p.length>0?[...s,...p]:s}})}function Vw(e,t,r,n=true){let i=r||d.defaultObserver;return reactQuery.queryOptions({queryKey:c.posts.discussion(e,t,i),enabled:n&&!!e&&!!t,queryFn:async()=>ci(e,t,i)})}function Jw(e,t="posts",r=20,n="",i=true){return reactQuery.infiniteQueryOptions({queryKey:c.posts.accountPosts(e??"",t,r,n),enabled:!!e&&i,initialPageParam:{author:void 0,permlink:void 0,hasNextPage:true},queryFn:async({pageParam:o,signal:s})=>{if(!o?.hasNextPage||!e)return [];let a=await lr(t,e,o.author??"",o.permlink??"",r,n,s);return te(a??[])},getNextPageParam:o=>{let s=o?.[o.length-1],a=(o?.length??0)===r;if(a)return {author:s?.author,permlink:s?.permlink,hasNextPage:a}}})}function Yw(e,t="posts",r="",n="",i=20,o="",s=true){return reactQuery.queryOptions({queryKey:c.posts.accountPostsPage(e??"",t,r,n,i,o),enabled:!!e&&s,queryFn:async({signal:a}={})=>{if(!e)return [];let u=await lr(t,e,r,n,i,o,a);return te(u??[])}})}var mi=new Map;function Ja(e){let t=mi.get(e);return t||(t=r=>({...r,pages:r.pages.map(n=>Ya(n,e))}),mi.set(e,t)),t}function Ya(e,t){let r=e.filter(o=>o.stats?.is_pinned),n=e.filter(o=>!o.stats?.is_pinned);if(t==="hot")return [...r,...n];let i=[...n].sort((o,s)=>new Date(s.created).getTime()-new Date(o.created).getTime());return [...r,...i]}function o_(e,t,r=20,n="",i=true,o={}){return reactQuery.infiniteQueryOptions({queryKey:c.posts.postsRanked(e,t,r,n),queryFn:async({pageParam:s,signal:a})=>{let u=t;d.dmcaTagRegexes.some(l=>l.test(t))&&(u="");let p=await g("bridge.get_ranked_posts",{sort:e,start_author:s.author,start_permlink:s.permlink,limit:r,tag:u,observer:n},void 0,void 0,a);if(p==null)return [];if(!Array.isArray(p))throw new Error(`[SDK] get_ranked_posts returned ${typeof p} for sort=${e}`);return te(p)},select:Ja(e),enabled:i,initialPageParam:{author:void 0,permlink:void 0},getNextPageParam:s=>{let a=s?.[s.length-1];if(a)return {author:a.author,permlink:a.permlink}}})}function s_(e,t="",r="",n=20,i="",o="",s=true){return reactQuery.queryOptions({queryKey:c.posts.postsRankedPage(e,t,r,n,i,o),enabled:s,queryFn:async({signal:a}={})=>{let u=i;d.dmcaTagRegexes.some(l=>l.test(i))&&(u="");let p=await ai(e,t,r,n,u,o,a);return te(p??[])}})}function l_(e,t,r=200){return reactQuery.queryOptions({queryKey:c.posts.reblogs(e??"",r),queryFn:async()=>(await g("condenser_api.get_blog_entries",[e??t,0,r])).filter(i=>i.author!==t&&!i.reblogged_on.startsWith("1970-")).map(i=>({author:i.author,permlink:i.permlink})),enabled:!!e})}function y_(e,t){return reactQuery.queryOptions({queryKey:c.posts.rebloggedBy(e??"",t??""),queryFn:async()=>{if(!e||!t)return [];let r=await g("condenser_api.get_reblogged_by",[e,t]);return Array.isArray(r)?r:[]},enabled:!!e&&!!t})}function b_(e,t){return reactQuery.queryOptions({queryKey:c.posts.schedules(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/schedules",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch schedules: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function v_(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.schedulesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/schedules?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch schedules: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function x_(e,t){return reactQuery.queryOptions({queryKey:c.posts.drafts(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch drafts: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function E_(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.draftsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/drafts?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch drafts: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}async function yi(e){let r=await w()(d.privateApiHost+"/private-api/images",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch images: ${r.status}`);return r.json()}function T_(e,t){return reactQuery.queryOptions({queryKey:c.posts.images(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function R_(e,t){return reactQuery.queryOptions({queryKey:c.posts.galleryImages(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function F_(e,t,r=10){return reactQuery.infiniteQueryOptions({queryKey:c.posts.imagesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/images?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch images: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function K_(e,t,r=false){return reactQuery.queryOptions({queryKey:c.posts.commentHistory(e,t,r),queryFn:async({signal:n})=>{let i=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:t,onlyMeta:r?"1":""}),signal:n});if(!i.ok)throw new Error(`Failed to fetch comment history: ${i.status}`);return i.json()},enabled:!!e&&!!t})}function ac(e,t){let r=e?.trim(),n=t?.trim();if(!r||!n)throw new Error("Invalid entry path: author and permlink are required");let i=r.replace(/^@+/,""),o=n.replace(/^\/+/,"");if(!i||!o)throw new Error("Invalid entry path: author and permlink cannot be empty after normalization");return `@${i}/${o}`}function Q_(e,t){let r=t?.trim(),n=e?.trim(),i=!!n&&!!r&&r!=="undefined",o=i?ac(n,r):"";return reactQuery.queryOptions({queryKey:c.posts.deletedEntry(o),queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:r||""}),signal:s});if(!a.ok)throw new Error(`Failed to fetch comment history: ${a.status}`);return a.json()},select:s=>{if(!s?.list?.[0])return null;let{body:a,title:u,tags:p}=s.list[0];return {body:a,title:u,tags:p}},enabled:i})}function j_(e,t,r=true){return reactQuery.queryOptions({queryKey:c.posts.tips(e,t),queryFn:async()=>{let n=`/private-api/post-tips/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,i=await fetch(d.privateApiHost+n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch post tips: ${i.status}`);return i.json()},enabled:!!e&&!!t&&r,staleTime:60*1e3})}function uc(e,t){return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,host:t}}function pc(e){return {...e,id:e.id??e.post_id}}function me(e,t){if(!e)return null;let r=e.container??e,n=uc(r,t),i=e.parent?pc(e.parent):void 0;return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,max_accepted_payout:e.max_accepted_payout||"1000000.000 HBD",pending_payout_value:e.pending_payout_value||"0.000 HBD",author_payout_value:e.author_payout_value||"0.000 HBD",curator_payout_value:e.curator_payout_value||"0.000 HBD",host:t,container:n,parent:i}}function lc(e){return Array.isArray(e)?e:[]}async function hi(e){let t=fi(e,"created",true),r=await d.queryClient.fetchQuery(t),n=lc(r);if(n.length<=1)return [];let i=n.filter(({parent_author:s,parent_permlink:a})=>s===e.author&&a===e.permlink);return i.length===0?[]:i.filter(s=>!s.stats?.gray)}function wi(e,t,r){return e.length===0?[]:e.map(n=>{let i=e.find(o=>o.author===n.parent_author&&o.permlink===n.parent_permlink&&o.author!==r);return {...n,id:n.post_id,host:r,container:t,parent:i}}).filter(n=>n.container.post_id!==n.post_id).sort((n,i)=>new Date(i.created).getTime()-new Date(n.created).getTime())}var mc=20;function _i(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,following:e.following?.trim().toLowerCase()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??mc}}async function bi({containers:e,tag:t,following:r,author:n,observer:i,limit:o},s,a){let u=exports.ConfigManager.getValidatedBaseUrl(),p=new URL("/private-api/waves/feed",u);p.searchParams.set("limit",String(o)),s&&p.searchParams.set("cursor",s),e.forEach(m=>p.searchParams.append("container",m)),t&&p.searchParams.set("tag",t),r&&p.searchParams.set("following",r),n&&p.searchParams.set("author",n),i&&p.searchParams.set("observer",i);let l=await fetch(p.toString(),{method:"GET",signal:a});if(!l.ok)throw new Error(`Failed to fetch waves feed: ${l.status}`);let f=await l.json();return !Array.isArray(f)||f.length===0?[]:f.map(m=>{let y=me(m,m.host??"");return y?{...y,_cursor:m._cursor}:null}).filter(m=>!!m)}function X_(e={}){let t=_i(e),{containers:r,tag:n,following:i,author:o,observer:s,limit:a}=t;return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesFeed({containers:r,tag:n,following:i,author:o,observer:s,limit:a}),initialPageParam:void 0,queryFn:({pageParam:u,signal:p})=>bi(t,u,p),getNextPageParam:u=>{if(!(u.lengthbi(t,void 0,u)})}var yc=20;function hc(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??yc}}async function wc({containers:e,tag:t,author:r,observer:n,limit:i},o,s){let a=exports.ConfigManager.getValidatedBaseUrl(),u=new URL("/private-api/waves/shorts",a);u.searchParams.set("limit",String(i)),o&&u.searchParams.set("cursor",o),e.forEach(f=>u.searchParams.append("container",f)),t&&u.searchParams.set("tag",t),r&&u.searchParams.set("author",r),n&&u.searchParams.set("observer",n);let p=await fetch(u.toString(),{method:"GET",signal:s});if(!p.ok)throw new Error(`Failed to fetch shorts feed: ${p.status}`);let l=await p.json();return !Array.isArray(l)||l.length===0?[]:l.map(f=>{let m=me(f,f.host??"");return m?{...m,active_votes:m.active_votes??[],video:f.video,_cursor:f._cursor}:null}).filter(f=>!!f)}function ib(e={}){let t=hc(e),{containers:r,tag:n,author:i,observer:o,limit:s}=t;return reactQuery.infiniteQueryOptions({queryKey:c.posts.shortsFeed({containers:r,tag:n,author:i,observer:o,limit:s}),initialPageParam:void 0,queryFn:({pageParam:a,signal:u})=>wc(t,a,u),getNextPageParam:a=>{if(!(a.length(l.id=l.post_id,l.host=e,l));for(let l of u){if(o&&l.post_id===o){o=void 0;continue}if(i+=1,l.stats?.gray){r=l.author,n=l.permlink;continue}let f;try{f=await hi(l);}catch(m){console.error("[SDK] getThreads get_discussion error:",m),r=l.author,n=l.permlink;continue}if(f.length===0){r=l.author,n=l.permlink;continue}return {entries:wi(f,l,e)}}let p=u[u.length-1];if(!p)return null;r=p.author,n=p.permlink;}return null}function lb(e){return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesByHost(e),initialPageParam:void 0,queryFn:async({pageParam:t})=>{let r=await Ac(e,t);return r?r.entries:[]},getNextPageParam:t=>t?.[0]?.container})}var Oc=40;function yb(e,t,r=Oc){return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesByTag(e,t),initialPageParam:void 0,queryFn:async({signal:n})=>{try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/tags",i);o.searchParams.set("container",e),o.searchParams.set("tag",t);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves by tag: ${s.status}`);return (await s.json()).slice(0,r).map(p=>me(p,e)).filter(p=>!!p).sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves by tag",i),[]}},getNextPageParam:()=>{}})}function vb(e,t){let r=t?.trim().toLowerCase();return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesFollowing(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/following",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves following feed: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves following feed",i),[]}},getNextPageParam:()=>{}})}function xb(e,t=24){let r=e?.trim()||void 0;return reactQuery.queryOptions({queryKey:c.posts.wavesTrendingTags(r??"",t),queryFn:async({signal:n})=>{try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/trending/tags",i);r&&o.searchParams.set("container",r),o.searchParams.set("hours",t.toString());let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves trending tags: ${s.status}`);return (await s.json()).map(({tag:u,posts:p})=>({tag:u,posts:p}))}catch(i){return console.error("[SDK] Failed to fetch waves trending tags",i),[]}}})}function Tb(e,t){let r=t?.trim().toLowerCase();return reactQuery.infiniteQueryOptions({queryKey:c.posts.wavesByAccount(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=exports.ConfigManager.getValidatedBaseUrl(),o=new URL("/private-api/waves/account",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves for account: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){throw console.error("[SDK] Failed to fetch waves for account",i),i}},getNextPageParam:()=>{}})}function Ib(e){return reactQuery.queryOptions({queryKey:c.posts.wavesTrendingAuthors(e),queryFn:async({signal:t})=>{try{let r=exports.ConfigManager.getValidatedBaseUrl(),n=new URL("/private-api/waves/trending/authors",r);n.searchParams.set("container",e);let i=await fetch(n.toString(),{method:"GET",signal:t});if(!i.ok)throw new Error(`Failed to fetch waves trending authors: ${i.status}`);return (await i.json()).map(({author:s,posts:a})=>({author:s,posts:a}))}catch(r){throw console.error("[SDK] Failed to fetch waves trending authors",r),r}}})}function Nb(e,t=true){return reactQuery.queryOptions({queryKey:c.posts.normalize(e?.author??"",e?.permlink??""),enabled:t&&!!e,queryFn:async()=>pi(e)})}function Rc(e){return !!e&&typeof e=="object"&&"author"in e&&"permlink"in e&&"active_votes"in e}function vi(e){let t=new Date(e);return (new Date().getTime()-t.getTime())/(1e3*60*60*24)}function Wb(e,t){let{limit:r=20,filters:n=[],dayLimit:i=7}=t??{};return reactQuery.infiniteQueryOptions({queryKey:c.accounts.voteHistory(e,r),initialPageParam:{start:-1},queryFn:async({pageParam:o})=>{let{start:s}=o,a=await g("condenser_api.get_account_history",[e,s,r,...n]),p=a.map(([m,y])=>({...y.op[1],num:m,timestamp:y.timestamp})).filter(m=>m.voter===e&&m.weight!==0&&vi(m.timestamp)<=i),l=[];for(let m of p){let y=await d.queryClient.fetchQuery(ii(m.author,m.permlink));Rc(y)&&l.push(y);}let[f]=a;return {lastDate:f?vi(f[1].timestamp):0,lastItemFetched:f?f[0]:s,entries:l}},getNextPageParam:o=>({start:o.lastItemFetched})})}function Xb(e,t,r=true){return reactQuery.queryOptions({queryKey:c.accounts.profiles(e,t??""),enabled:r&&e.length>0,queryFn:async()=>Ct(e,t)})}function iv(e,t="HIVE",r=200){return reactQuery.infiniteQueryOptions({queryKey:c.wallet.balanceHistory(e??"",t,r),initialPageParam:null,queryFn:async({pageParam:n,signal:i})=>{if(!e)return {entries:[],currentPage:0};let o={"account-name":e,"coin-type":t,"page-size":r,direction:"desc"};n!==null&&(o.page=n);let s=await ee("balance","/accounts/{account-name}/balance-history",o,void 0,void 0,i);return {entries:s.operations_result,currentPage:n??s.total_pages}},getNextPageParam:n=>{let i=n.currentPage-1;return i>=1?i:void 0},enabled:!!e})}function uv(e,t="HIVE",r="yearly"){return reactQuery.queryOptions({queryKey:c.wallet.aggregatedHistory(e??"",t,r),queryFn:async()=>e?await ee("balance","/accounts/{account-name}/aggregated-history",{"account-name":e,"coin-type":t,granularity:r}):[],enabled:!!e,staleTime:6e4})}function fv(){return reactQuery.queryOptions({queryKey:c.accounts.proMembers(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/pro-members",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch pro members: ${e.status}`);return e.json()},staleTime:300*1e3})}function mv(e){return new Set((e??[]).map(t=>t.toLowerCase()))}function bv(e,t,r){let n=reactQuery.useQueryClient(),{data:i}=reactQuery.useQuery(M(e));return v(["accounts","update"],e,o=>{let s=Yn(n.getQueryData(M(e).queryKey),i);if(!s)throw new Error("[SDK][Accounts] \u2013 cannot update not existing account");return [["account_update2",{account:e,json_metadata:"",extensions:[],posting_json_metadata:Xn({existingPostingJsonMetadata:s.posting_json_metadata,profile:o.profile,tokens:o.tokens})}]]},async(o,s)=>{n.setQueryData(M(e).queryKey,a=>{if(!a)return a;let u=JSON.parse(JSON.stringify(a));return u.profile=pr({existingProfile:Jn(a),profile:s.profile,tokens:s.tokens}),u}),await S(t?.adapter,r,[c.accounts.full(e)]);},t,void 0,{broadcastMode:r,onMutate:async()=>{if(e)try{await n.fetchQuery({...M(e),staleTime:0});}catch{}}})}function xv(e,t,r,n,i){return reactQuery.useMutation({mutationKey:["accounts","relation","update",e,t],mutationFn:async o=>{let s=ei(e,t);await b().prefetchQuery(s);let a=b().getQueryData(s.queryKey);return await Vn(e,"follow",["follow",{follower:e,following:t,what:[...o==="toggle-ignore"&&!a?.ignores?["ignore"]:[],...o==="toggle-follow"&&!a?.follows?["blog"]:[]]}],r),{...a,ignores:o==="toggle-ignore"?!a?.ignores:a?.ignores,follows:o==="toggle-follow"?!a?.follows:a?.follows}},onError:i,onSuccess(o){n(o),b().setQueryData(c.accounts.relations(e,t),o),t&&b().invalidateQueries(M(t));}})}function fr(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildVoteOp] Missing required parameters");if(n<-1e4||n>1e4)throw new Error("[SDK][buildVoteOp] Weight must be between -10000 and 10000");return ["vote",{voter:e,author:t,permlink:r,weight:n}]}function Ie(e,t,r,n,i,o,s){if(!e||!t||n===void 0||!o)throw new Error("[SDK][buildCommentOp] Missing required parameters");return ["comment",{parent_author:r,parent_permlink:n,author:e,permlink:t,title:i,body:o,json_metadata:JSON.stringify(s)}]}function De(e,t,r,n,i,o,s){if(!e||!t)throw new Error("[SDK][buildCommentOptionsOp] Missing required parameters");return ["comment_options",{author:e,permlink:t,max_accepted_payout:r,percent_hbd:n,allow_votes:i,allow_curation_rewards:o,extensions:s}]}function mr(e,t){if(!e||!t)throw new Error("[SDK][buildDeleteCommentOp] Missing required parameters");return ["delete_comment",{author:e,permlink:t}]}function gr(e,t,r,n=false){if(!e||!t||!r)throw new Error("[SDK][buildReblogOp] Missing required parameters");let i={account:e,author:t,permlink:r};return n&&(i.delete="delete"),["custom_json",{id:"follow",json:JSON.stringify(["reblog",i]),required_auths:[],required_posting_auths:[e]}]}function Ke(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferOp] Missing required parameters");return ["transfer",{from:e,to:t,amount:r,memo:n||""}]}function Nc(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiTransferOps] Missing required parameters");return t.trim().split(/[\s,]+/).filter(Boolean).map(o=>Ke(e,o.trim(),r,n))}function Qc(e,t,r,n,i,o){if(!e||!t||!r)throw new Error("[SDK][buildRecurrentTransferOp] Missing required parameters");if(i<24)throw new Error("[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours");return ["recurrent_transfer",{from:e,to:t,amount:r,memo:n||"",recurrence:i,executions:o,extensions:[]}]}function je(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferToSavingsOp] Missing required parameters");return ["transfer_to_savings",{from:e,to:t,amount:r,memo:n||""}]}function Be(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildTransferFromSavingsOp] Missing required parameters");return ["transfer_from_savings",{from:e,to:t,amount:r,memo:n||"",request_id:i}]}function Ai(e,t){if(!e||t===void 0)throw new Error("[SDK][buildCancelTransferFromSavingsOp] Missing required parameters");return ["cancel_transfer_from_savings",{from:e,request_id:t}]}function nt(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildClaimInterestOps] Missing required parameters");return [Be(e,t,r,n,i),Ai(e,i)]}function it(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildTransferToVestingOp] Missing required parameters");return ["transfer_to_vesting",{from:e,to:t,amount:r}]}function ot(e,t){if(!e||!t)throw new Error("[SDK][buildWithdrawVestingOp] Missing required parameters");return ["withdraw_vesting",{account:e,vesting_shares:t}]}function st(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildDelegateVestingSharesOp] Missing required parameters");return ["delegate_vesting_shares",{delegator:e,delegatee:t,vesting_shares:r}]}function at(e,t,r,n){if(!e||!t||r===void 0)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters");if(r<0||r>1e4)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");return ["set_withdraw_vesting_route",{from_account:e,to_account:t,percent:r,auto_vest:n}]}function ct(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildConvertOp] Missing required parameters");return ["convert",{owner:e,amount:t,requestid:r}]}function yr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildCollateralizedConvertOp] Missing required parameters");return ["collateralized_convert",{owner:e,amount:t,requestid:r}]}function Me(e,t,r,n="tokens"){return ["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:JSON.stringify({contractName:n,contractAction:t,contractPayload:r})}]}function hr(e,t){return ["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:JSON.stringify(t.map(r=>({symbol:r})))}]}function wr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildDelegateRcOp] Missing required parameters");let n=t.includes(",")?t.split(",").map(i=>i.trim()):[t];return ["custom_json",{id:"rc",json:JSON.stringify(["delegate_rc",{from:e,delegatees:n,max_rc:r}]),required_auths:[],required_posting_auths:[e]}]}function _r(e,t){if(!e||!t)throw new Error("[SDK][buildFollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["blog"]}]),required_auths:[],required_posting_auths:[e]}]}function Tt(e,t){if(!e||!t)throw new Error("[SDK][buildUnfollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:[]}]),required_auths:[],required_posting_auths:[e]}]}function Hc(e,t){if(!e||!t)throw new Error("[SDK][buildIgnoreOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["ignore"]}]),required_auths:[],required_posting_auths:[e]}]}function Uc(e,t){if(!e||!t)throw new Error("[SDK][buildUnignoreOp] Missing required parameters");return Tt(e,t)}function br(e,t){if(!e)throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");let r=t||new Date().toISOString().split(".")[0],n=["custom_json",{id:"notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}],i=["custom_json",{id:"ecency_notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}];return [n,i]}function vr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");return ["account_witness_vote",{account:e,witness:t,approve:r}]}function Ar(e,t){if(!e||t===void 0)throw new Error("[SDK][buildWitnessProxyOp] Missing required parameters");return ["account_witness_proxy",{account:e,proxy:t}]}function Pr(e,t){if(!e||!t.receiver||!t.subject||!t.permlink||!t.start||!t.end||!t.dailyPay)throw new Error("[SDK][buildProposalCreateOp] Missing required parameters");let r=new Date(t.start),n=new Date(t.end);if(r.toString()==="Invalid Date"||n.toString()==="Invalid Date")throw new Error("[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings");return ["create_proposal",{creator:e,receiver:t.receiver,start_date:t.start,end_date:t.end,daily_pay:t.dailyPay,subject:t.subject,permlink:t.permlink,extensions:[]}]}function Or(e,t,r){if(!e||!t||t.length===0||r===void 0)throw new Error("[SDK][buildProposalVoteOp] Missing required parameters");return ["update_proposal_votes",{voter:e,proposal_ids:t,approve:r,extensions:[]}]}function Vc(e,t){if(!e||!t||t.length===0)throw new Error("[SDK][buildRemoveProposalOp] Missing required parameters");return ["remove_proposal",{proposal_owner:e,proposal_ids:t,extensions:[]}]}function jc(e,t,r,n,i){if(e==null||typeof e!="number"||!t||!r||!n||!i)throw new Error("[SDK][buildUpdateProposalOp] Missing required parameters");return ["update_proposal",{proposal_id:e,creator:t,daily_pay:r,subject:n,permlink:i,extensions:[]}]}function xr(e,t){if(!e||!t)throw new Error("[SDK][buildSubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["subscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Er(e,t){if(!e||!t)throw new Error("[SDK][buildUnsubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["unsubscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Sr(e,t,r,n){if(!e||!t||!r||!n)throw new Error(`[SDK][buildSetRoleOp] Missing required parameters: username=${e}, community=${t}, account=${r}, role=${n}`);return ["custom_json",{id:"community",json:JSON.stringify(["setRole",{community:t,account:r,role:n}]),required_auths:[],required_posting_auths:[e]}]}function kr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildUpdateCommunityOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["updateProps",{community:t,props:r}]),required_auths:[],required_posting_auths:[e]}]}function Cr(e,t,r,n,i){if(!e||!t||!r||!n||i===void 0)throw new Error("[SDK][buildPinPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"pinPost":"unpinPost",{community:t,account:r,permlink:n}]),required_auths:[],required_posting_auths:[e]}]}function Tr(e,t,r,n,i,o){if(!e||!t||!r||!n||o===void 0)throw new Error("[SDK][buildMutePostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([o?"mutePost":"unmutePost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}function Lc(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildMuteUserOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"muteUser":"unmuteUser",{community:t,account:r,notes:n}]),required_auths:[],required_posting_auths:[e]}]}function $c(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildFlagPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["flagPost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}var Pi=(r=>(r.Buy="buy",r.Sell="sell",r))(Pi||{}),Oi=(r=>(r.EMPTY="",r.SWAP="9",r))(Oi||{});function Ft(e,t,r,n,i,o){if(!e||!t||!r||!i||o===void 0)throw new Error("[SDK][buildLimitOrderCreateOp] Missing required parameters");return ["limit_order_create",{owner:e,orderid:o,amount_to_sell:t,min_to_receive:r,fill_or_kill:n,expiration:i}]}function Rt(e,t=3){return e.toFixed(t)}function Wc(e,t,r,n,i=""){if(!e||n===void 0||!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new Error("[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters");let o=new Date(Date.now());o.setDate(o.getDate()+27);let s=o.toISOString().split(".")[0],a=+`${i}${Math.floor(Date.now()/1e3).toString().slice(2)}`,u=n==="buy"?`${Rt(t,3)} HBD`:`${Rt(t,3)} HIVE`,p=n==="buy"?`${Rt(r,3)} HIVE`:`${Rt(r,3)} HBD`;return Ft(e,u,p,false,s,a)}function Rr(e,t){if(!e||t===void 0)throw new Error("[SDK][buildLimitOrderCancelOp] Missing required parameters");return ["limit_order_cancel",{owner:e,orderid:t}]}function Fr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildClaimRewardBalanceOp] Missing required parameters");return ["claim_reward_balance",{account:e,reward_hive:t,reward_hbd:r,reward_vests:n}]}function Gc(e,t,r,n,i,o){if(!e||!i)throw new Error("[SDK][buildAccountUpdateOp] Missing required parameters");return ["account_update",{account:e,owner:t,active:r,posting:n,memo_key:i,json_metadata:o}]}function zc(e,t,r,n){if(!e||r===void 0)throw new Error("[SDK][buildAccountUpdate2Op] Missing required parameters");return ["account_update2",{account:e,json_metadata:t||"",posting_json_metadata:r,extensions:n||[]}]}function qr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildAccountCreateOp] Missing required parameters");let i={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},o={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},s={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["account_create",{creator:e,new_account_name:t,owner:i,active:o,posting:s,memo_key:r.memoPublicKey,json_metadata:"",fee:n}]}function Ir(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildCreateClaimedAccountOp] Missing required parameters");let n={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},i={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},o={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["create_claimed_account",{creator:e,new_account_name:t,owner:n,active:i,posting:o,memo_key:r.memoPublicKey,json_metadata:"",extensions:[]}]}function Dr(e,t){if(!e||!t)throw new Error("[SDK][buildClaimAccountOp] Missing required parameters");return ["claim_account",{creator:e,fee:t,extensions:[]}]}function Kr(e,t,r,n,i,o){if(!e||!t||!r||!i)throw new Error("[SDK][buildGrantPostingPermissionOp] Missing required parameters");let s=t.account_auths.findIndex(([p])=>p===r),a=[...t.account_auths];s>=0?a[s]=[r,n]:a.push([r,n]);let u={...t,account_auths:a};return u.account_auths.sort((p,l)=>p[0]>l[0]?1:-1),["account_update",{account:e,posting:u,memo_key:i,json_metadata:o}]}function Jc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildRevokePostingPermissionOp] Missing required parameters");let o={...t,account_auths:t.account_auths.filter(([s])=>s!==r)};return ["account_update",{account:e,posting:o,memo_key:n,json_metadata:i}]}function Yc(e,t,r=[]){if(!e||!t)throw new Error("[SDK][buildChangeRecoveryAccountOp] Missing required parameters");return ["change_recovery_account",{account_to_recover:e,new_recovery_account:t,extensions:r}]}function Xc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");return ["request_account_recovery",{recovery_account:e,account_to_recover:t,new_owner_authority:r,extensions:n}]}function Zc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRecoverAccountOp] Missing required parameters");return ["recover_account",{account_to_recover:e,new_owner_authority:t,recent_owner_authority:r,extensions:n}]}function Br(e,t,r){if(!e||!t||!Number.isFinite(r))throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");return ["custom_json",{id:"ecency_boost_plus",json:JSON.stringify({user:e,account:t,duration:r}),required_auths:[e],required_posting_auths:[]}]}function Mr(e,t){if(!e||!Number.isInteger(t)||t<=0)throw new Error("[SDK][buildRcDelegationOp] Missing or invalid parameters");return ["custom_json",{id:"ecency_rc_delegation",json:JSON.stringify({user:e,duration:t}),required_auths:[e],required_posting_auths:[]}]}function Nr(e,t,r,n){if(!e||!t||!r||!Number.isFinite(n))throw new Error("[SDK][buildPromoteOp] Missing required parameters");return ["custom_json",{id:"ecency_promote",json:JSON.stringify({user:e,author:t,permlink:r,duration:n}),required_auths:[e],required_posting_auths:[]}]}function Le(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildPointTransferOp] Missing required parameters");let i=r.replace(/POINTS\b/,"POINT");return ["custom_json",{id:"ecency_point_transfer",json:JSON.stringify({sender:e,receiver:t,amount:i,memo:n||""}),required_auths:[e],required_posting_auths:[]}]}function eu(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");let i=t.trim().split(/[\s,]+/).filter(Boolean);if(i.length===0)throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");return i.map(o=>Le(e,o.trim(),r,n))}function Qr(e){if(!e)throw new Error("[SDK][buildCommunityRegistrationOp] Missing required parameters");return ["custom_json",{id:"ecency_registration",json:JSON.stringify({name:e}),required_auths:[e],required_posting_auths:[]}]}function tu(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildActiveCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[e],required_posting_auths:[]}]}function ru(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildPostingCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[],required_posting_auths:[e]}]}function $v(e,t,r){return v(["accounts","follow"],e,({following:n})=>[_r(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function Jv(e,t,r){return v(["accounts","unfollow"],e,({following:n})=>[Tt(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function eA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","bookmarks","add",e],mutationFn:async({author:i,permlink:o})=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:i,permlink:o,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function iA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","bookmarks","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:i,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function cA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","favorites","add",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/favorites-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})})).json()},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:n})}function fA(e,t,r,n){return reactQuery.useMutation({mutationKey:["accounts","favorites","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");let s=await w()(d.privateApiHost+"/private-api/favorites-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})});if(!s.ok)throw new Error(`Failed to delete favorite: ${s.status}`);return s.json()},onMutate:async i=>{if(!e)return;let o=b(),s=c.accounts.favorites(e),a=c.accounts.favoritesInfinite(e),u=c.accounts.checkFavorite(e,i);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a}),o.cancelQueries({queryKey:u})]);let p=o.getQueryData(s);p&&o.setQueryData(s,p.filter(y=>y.account!==i));let l=o.getQueryData(u);o.setQueryData(u,false);let f=o.getQueriesData({queryKey:a}),m=new Map(f);for(let[y,h]of f)h&&o.setQueryData(y,{...h,pages:h.pages.map(E=>({...E,data:E.data.filter(O=>O.account!==i)}))});return {previousList:p,previousInfinite:m,previousCheck:l}},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.accounts.favorites(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);s?.previousCheck!==void 0&&a.setQueryData(c.accounts.checkFavorite(e,o),s.previousCheck),n(i);}})}function uu(e,t){let r=new Map;return e.forEach(([n,i])=>{r.set(n.toString(),i);}),t.forEach(([n,i])=>{r.set(n.toString(),i);}),Array.from(r.entries()).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i])}function xi(e,t){let{data:r}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","keys-update",e],mutationFn:async({keys:n,keepCurrent:i=false,currentKey:o,keysToRevoke:s=[],keysToRevokeByAuthority:a={}})=>{if(n.length===0)throw new Error("[SDK][Update password] \u2013 no new keys provided");if(!r)throw new Error("[SDK][Update password] \u2013 cannot update keys for anon user");let u=p=>{let l=JSON.parse(JSON.stringify(r[p])),m=[...a[p]||[],...a[p]===void 0?s:[]],y=i?l.key_auths.filter(([h])=>!m.includes(h.toString())):[];return l.key_auths=uu(y,n.map((h,E)=>[h[p].createPublic().toString(),E+1])),l};return Z([["account_update",{account:e,json_metadata:r.json_metadata,owner:u("owner"),active:u("active"),posting:u("posting"),memo_key:n[0].memo_key.createPublic().toString()}]],o)},...t})}function PA(e,t){let{data:r}=reactQuery.useQuery(M(e)),{mutateAsync:n}=xi(e);return reactQuery.useMutation({mutationKey:["accounts","password-update",e],mutationFn:async({newPassword:i,currentPassword:o,keepCurrent:s})=>{if(!r)throw new Error("[SDK][Update password] \u2013 cannot update password for anon user");let a=H.fromLogin(e,o,"owner");return n({currentKey:a,keepCurrent:s,keys:[{owner:H.fromLogin(e,i,"owner"),active:H.fromLogin(e,i,"active"),posting:H.fromLogin(e,i,"posting"),memo_key:H.fromLogin(e,i,"memo")}]})},...t})}function CA(e,t,r){let n=reactQuery.useQueryClient(),{data:i}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","revoke-posting",i?.name],mutationFn:async({accountName:o,type:s,key:a})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user");let u=JSON.parse(JSON.stringify(i.posting));u.account_auths=u.account_auths.filter(([l])=>l!==o);let p={account:i.name,posting:u,memo_key:i.memo_key,json_metadata:i.json_metadata};if(s==="key"&&a)return Z([["account_update",p]],a);if(s==="keychain"){if(!r?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return r.adapter.broadcastWithKeychain(i.name,[["account_update",p]],"active")}else return !t.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing."),Un__default.default.sendOperation(["account_update",p],t.hsCallbackUrl?{callback:t.hsCallbackUrl}:{},()=>{})},onError:t.onError,onSuccess:(o,s,a)=>{t.onSuccess?.(o,s,a),n.setQueryData(M(e).queryKey,u=>({...u,posting:{...u?.posting,account_auths:u?.posting?.account_auths?.filter(([p])=>p!==s.accountName)??[]}}));}})}function KA(e,t,r,n){let{data:i}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","recovery",i?.name],mutationFn:async({accountName:o,type:s,key:a,email:u})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user");let p={account_to_recover:i.name,new_recovery_account:o,extensions:[]};if(s==="ecency"){if(!t)throw new Error("[SDK][Accounts] \u2013 missing access token");let f=await w()(d.privateApiHost+"/private-api/recoveries-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,email:u,publicKeys:[...i.owner.key_auths,...i.active.key_auths,...i.posting.key_auths,i.memo_key]})});if(!f.ok)throw new Error(`[SDK][Accounts] Failed to add recovery: ${f.status}`);return f}else {if(s==="key"&&a)return Z([["change_recovery_account",p]],a);if(s==="keychain"){if(!n?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return n.adapter.broadcastWithKeychain(i.name,[["change_recovery_account",p]],"owner")}else return !r.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing."),Un__default.default.sendOperation(["change_recovery_account",p],r.hsCallbackUrl?{callback:r.hsCallbackUrl}:{},()=>{})}},onError:r.onError,onSuccess:r.onSuccess})}function MA(e,t){let r=e.key_auths.filter(([i])=>!t.has(String(i))).reduce((i,[,o])=>i+o,0),n=(e.account_auths??[]).reduce((i,[,o])=>i+o,0);return r+n>=e.weight_threshold}function Ei(e,t){let r=new Set(t.map(s=>s.toString())),n=s=>s.key_auths.some(([a])=>r.has(String(a))),i=s=>{let a=JSON.parse(JSON.stringify(s));return a.key_auths=a.key_auths.filter(([u])=>!r.has(u.toString())),a},o=n(e.owner);return {account:e.name,json_metadata:e.json_metadata,owner:o?i(e.owner):void 0,active:i(e.active),posting:i(e.posting),memo_key:e.memo_key}}function jA(e,t){let{data:r}=reactQuery.useQuery(M(e));return reactQuery.useMutation({mutationKey:["accounts","revoke-key",r?.name],mutationFn:async({currentKey:n,revokingKey:i})=>{if(!r)throw new Error("[SDK][Revoke key] \u2013 cannot update keys for anon user");let o=Array.isArray(i)?i:[i],s=Ei(r,o);return Z([["account_update",s]],n)},...t})}function GA(e,t,r){return v(["accounts","claimAccount"],e,({creator:n,fee:i="0.000 HIVE"})=>[Dr(n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(i.creator)]);},t,"active",{broadcastMode:r})}function XA(e,t,r){return v(["accounts","grant-posting-permission"],e,n=>[Kr(e,n.currentPosting,n.grantedAccount,n.weightThreshold,n.memoKey,n.jsonMetadata)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}function rP(e,t,r){return v(["accounts","create"],e,n=>[n.useClaimed?Ir(e,n.newAccountName,n.keys):qr(e,n.newAccountName,n.keys,n.fee)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}var Hr=300*60*24,vu=1e4,Au=5e7;function Si(e){let t=C(e.vesting_shares).amount,r=C(e.received_vesting_shares).amount,n=C(e.delegated_vesting_shares).amount,i=C(e.vesting_withdraw_rate).amount,o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t+r-n-s}function Pu(e,t,r){let n=e*1e6;return (t*r/1e4/50+1)*n/1e4}function Ou(e){if(Number.isFinite(e.lastHardfork))return e.lastHardfork>=28;let[t="0",r="0"]=(e.currentHardforkVersion??"0.0.0").split(".");return Number(t)>1||Number(t)===1&&Number(r)>=28}function xu(e,t,r){let n=t.votePowerReserveRate||Number(t.raw?.globalDynamic?.vote_power_reserve_rate??0);if(!Number.isFinite(n)||n<=0)return 0;let i=Si(e);if(!Number.isFinite(i)||i<=0)return 0;let o=i*1e6,s=Math.ceil(o*r*60*60*24/vu/(n*Hr)),a=ar(e),u=Math.min(a.current_mana,a.max_mana);return !Number.isFinite(u)||s>u?0:Math.max(s-Au,0)}function Eu(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;if(Ou(t))return xu(e,t,n);let i=0;try{if(i=Si(e),!Number.isFinite(i))return 0}catch{return 0}return Pu(i,r,n)}function sP(e){return ar(e).percentage/100}function aP(e){if(!Number.isFinite(e))throw new TypeError("Voting power must be a finite number");if(e<0||e>100)throw new RangeError("Voting power must be between 0 and 100");return (100-e)*100*Hr/1e4}function cP(e){let t=parseFloat(e.vesting_shares)+parseFloat(e.received_vesting_shares)-parseFloat(e.delegated_vesting_shares),r=Math.floor(Date.now()/1e3)-e.downvote_manabar.last_update_time,n=t*1e6/4;if(n<=0)return 0;let i=parseFloat(e.downvote_manabar.current_mana.toString())+r*n/Hr;i>n&&(i=n);let o=i*100/n;return isNaN(o)?0:o>100?100:o}function uP(e){return Ot(e).percentage/100}function pP(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;let{fundRecentClaims:i,fundRewardBalance:o,base:s,quote:a}=t;if(!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(a)||i===0||a===0)return 0;let u=Eu(e,t,r,n);return Number.isFinite(u)?u/i*o*(s/a):0}var Su={vote:"posting",comment:"posting",delete_comment:"posting",comment_options:"posting",claim_reward_balance:"posting",cancel_transfer_from_savings:"active",collateralized_convert:"active",convert:"active",delegate_vesting_shares:"active",recurrent_transfer:"active",set_withdraw_vesting_route:"active",transfer:"active",transfer_from_savings:"active",transfer_to_savings:"active",transfer_to_vesting:"active",withdraw_vesting:"active",limit_order_create:"active",limit_order_cancel:"active",account_update:"active",account_update2:"active",claim_account:"active",create_claimed_account:"active",account_witness_proxy:"active",account_witness_vote:"active",remove_proposal:"active",update_proposal_votes:"active",change_recovery_account:"owner",request_account_recovery:"owner",recover_account:"owner",reset_account:"owner",set_reset_account:"owner"};function ku(e){let t=e[0],r=e[1];if(t!=="custom_json")throw new Error("Operation is not a custom_json operation");let n=r;return n.required_auths&&n.required_auths.length>0?"active":(n.required_posting_auths&&n.required_posting_auths.length>0,"posting")}function Cu(e){let t=e[0];if(t!=="create_proposal"&&t!=="update_proposal")throw new Error("Operation is not a proposal operation");return "active"}function Tu(e){let t=e[0];return t==="custom_json"?ku(e):t==="create_proposal"||t==="update_proposal"?Cu(e):Su[t]??"posting"}function dP(e){let t="posting";for(let r of e){let n=Tu(r);if(n==="owner")return "owner";n==="active"&&t==="posting"&&(t="active");}return t}function hP(e){return reactQuery.useMutation({mutationKey:["operations","sign",e],mutationFn:({operation:t,keyOrSeed:r})=>{if(!e)throw new Error("[Operations][Sign] \u2013 cannot sign op with anon user");let n;return r.split(" ").length===12?n=H.fromLogin(e,r,"active"):Mn(r)?n=H.fromString(r):n=H.from(r),Z([t],n)}})}function bP(e,t,r="active"){return reactQuery.useMutation({mutationKey:["operations","sign-keychain",e],mutationFn:({operation:n})=>{if(!e)throw new Error("[SDK][Keychain] \u2013\xA0cannot sign operation with anon user");if(!t?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Keychain] \u2013 missing keychain broadcaster");return t.adapter.broadcastWithKeychain(e,[n],r)}})}function OP(e="/"){return reactQuery.useMutation({mutationKey:["operations","sign-hivesigner",e],mutationFn:async({operation:t})=>Un__default.default.sendOperation(t,{callback:e},()=>{})})}function kP(){return reactQuery.queryOptions({queryKey:["operations","chain-properties"],queryFn:async()=>await g("condenser_api.get_chain_properties",[])})}function ki(e,t,r){return {...e,...t??{},title:r.title,body:r.body}}function Ci(e,t){return {...e??{},title:t.title,body:t.body}}function KP(e,t){return reactQuery.useMutation({mutationKey:["posts","add-fragment",e],mutationFn:async({title:r,body:n})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let o=await w()(d.privateApiHost+"/private-api/fragments-add",{method:"POST",body:JSON.stringify({code:t,title:r,body:n}),headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`[SDK][Posts] Failed to add fragment: ${o.status}`);return o.json()},onSuccess(r,n){let i=b(),o=Ci(r,n);i.setQueryData(Ve(e,t).queryKey,s=>[o,...s??[]]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map((a,u)=>u===0?{...a,data:[o,...a.data]}:a)});}})}function VP(e,t){return reactQuery.useMutation({mutationKey:["posts","edit-fragment",e],mutationFn:async({fragmentId:r,title:n,body:i})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let s=await w()(d.privateApiHost+"/private-api/fragments-update",{method:"POST",body:JSON.stringify({code:t,id:r,title:n,body:i}),headers:{"Content-Type":"application/json"}});if(!s.ok)throw new Error(`[SDK][Posts] Failed to update fragment: ${s.status}`);return s.json()},onSuccess(r,n){let i=b(),o=s=>ki(s,r,n);i.setQueryData(Ve(e,t).queryKey,s=>s?.map(a=>a.id===n.fragmentId?o(a):a)??[]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map(a=>({...a,data:a.data.map(u=>u.id===n.fragmentId?o(u):u)}))});}})}function zP(e,t){return reactQuery.useMutation({mutationKey:["posts","remove-fragment",e],mutationFn:async({fragmentId:r})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let i=await w()(d.privateApiHost+"/private-api/fragments-delete",{method:"POST",body:JSON.stringify({code:t,id:r}),headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`[SDK][Posts] Failed to delete fragment: ${i.status}`);return i},onSuccess(r,n){let i=b();i.setQueryData(Ve(e,t).queryKey,o=>[...o??[]].filter(({id:s})=>s!==n.fragmentId)),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},o=>o&&{...o,pages:o.pages.map(s=>({...s,data:s.data.filter(a=>a.id!==n.fragmentId)}))});}})}async function G(e){if(!e.ok){let r;try{r=await e.json();}catch{r=void 0;}let n=new Error(`Request failed with status ${e.status}`);throw n.status=e.status,n.data=r,n}let t=await e.text();if(!t||t.trim()==="")return "";try{return JSON.parse(t)}catch(r){return console.warn("[SDK] Failed to parse JSON response:",r,"Response:",t),""}}async function XP(e,t,r,n){let o=await w()(d.privateApiHost+"/private-api/account-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,email:t,referral:r,captcha_token:n})}),s=await G(o);return {status:o.status,data:s}}async function ZP(e){let r=await w()(d.privateApiHost+"/private-api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e})}),n=await G(r);return {status:r.status,data:n}}async function e0(e,t,r="",n=""){let i={code:e,ty:t};r&&(i.bl=r),n&&(i.tx=n);let s=await w()(d.privateApiHost+"/private-api/usr-activity",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});await G(s);}async function t0(e,t,r=null,n=null){let i={code:e};t&&(i.filter=t),r&&(i.since=r),n&&(i.user=n);let s=await w()(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return G(s)}async function r0(e,t,r,n,i,o){let s={code:e,username:t,token:o,system:r,allows_notify:n,notify_types:i},u=await w()(d.privateApiHost+"/private-api/register-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function n0(e,t,r){let n={code:e,username:t,token:r},o=await w()(d.privateApiHost+"/private-api/detail-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function Ti(e,t){let r={code:e};t&&(r.id=t);let i=await w()(d.privateApiHost+"/private-api/notifications/mark",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ri(e,t){let r={code:e,url:t},i=await w()(d.privateApiHost+"/private-api/images-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}var Nu="https://i.ecency.com";async function Fi(e,t,r){let n=w(),i=new FormData;i.append("file",e);let o=await n(`${Nu}/hs/${t}`,{method:"POST",body:i,signal:r});return G(o)}async function i0(e,t,r,n){let i=w(),o=new FormData;o.append("file",e);let s=await i(`${d.imageHost}/${t}/${r}`,{method:"POST",body:o,signal:n});return G(s)}async function qi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/images-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ii(e,t,r,n,i){let o={code:e,title:t,body:r,tags:n,meta:i},a=await w()(d.privateApiHost+"/private-api/drafts-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});return G(a)}async function Di(e,t,r,n,i,o){let s={code:e,id:t,title:r,body:n,tags:i,meta:o},u=await w()(d.privateApiHost+"/private-api/drafts-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function Ki(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/drafts-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Bi(e,t,r,n,i,o,s,a){let u={code:e,permlink:t,title:r,body:n,meta:i,schedule:s,reblog:a};o&&(u.options=o);let l=await w()(d.privateApiHost+"/private-api/schedules-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return G(l)}async function Mi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ni(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function o0(e,t,r){let n={code:e,author:t,permlink:r},o=await w()(d.privateApiHost+"/private-api/promoted-post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function s0(e,t,r){let n={username:e,email:t,friend:r},o=await w()(d.privateApiHost+"/private-api/account-create-friend",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}function l0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","drafts","add",e],mutationFn:async({title:i,body:o,tags:s,meta:a})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addDraft");return Ii(t,i,o,s,a)},onSuccess:i=>{r?.();let o=b();i?.drafts?o.setQueryData(c.posts.drafts(e),i.drafts):o.invalidateQueries({queryKey:c.posts.drafts(e)}),o.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function y0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","drafts","update",e],mutationFn:async({draftId:i,title:o,body:s,tags:a,meta:u})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for updateDraft");return Di(t,i,o,s,a,u)},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function A0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","drafts","delete",e],mutationFn:async({draftId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteDraft");return Ki(t,i)},onMutate:async({draftId:i})=>{if(!e)return;let o=b(),s=c.posts.drafts(e),a=c.posts.draftsInfinite(e);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a})]);let u=o.getQueryData(s);u&&o.setQueryData(s,u.filter(f=>f._id!==i));let p=o.getQueriesData({queryKey:a}),l=new Map(p);for(let[f,m]of p)m&&o.setQueryData(f,{...m,pages:m.pages.map(y=>({...y,data:y.data.filter(h=>h._id!==i)}))});return {previousList:u,previousInfinite:l}},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.posts.drafts(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);n?.(i);}})}function S0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","schedules","add",e],mutationFn:async({permlink:i,title:o,body:s,meta:a,options:u,schedule:p,reblog:l})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addSchedule");return Bi(t,i,o,s,a,u,p,l)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function F0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","schedules","delete",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteSchedule");return Mi(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function B0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","schedules","move",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for moveSchedule");return Ni(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)}),o.invalidateQueries({queryKey:c.posts.drafts(e)});},onError:n})}function U0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","images","add",e],mutationFn:async({url:i,code:o})=>{let s=o??t;if(!e||!s)throw new Error("[SDK][Posts] \u2013 missing auth for addImage");return Ri(s,i)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.images(e)});},onError:n})}function W0(e,t,r,n){return reactQuery.useMutation({mutationKey:["posts","images","delete",e],mutationFn:async({imageId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteImage");return qi(t,i)},onSuccess:(i,o)=>{r?.();let s=b(),{imageId:a}=o;s.setQueryData(["posts","images",e],u=>u?.filter(p=>p._id!==a)),s.setQueriesData({queryKey:["posts","images","infinite",e]},u=>u&&{...u,pages:u.pages.map(p=>({...p,data:p.data.filter(l=>l._id!==a)}))});},onError:n})}function Y0(e,t){return reactQuery.useMutation({mutationKey:["posts","images","upload"],mutationFn:async({file:r,token:n,signal:i})=>Fi(r,n,i),onSuccess:e,onError:t})}function It(e,t){return `/@${e}/${t}`}function zu(e,t,r){return (r??b()).getQueryData(c.posts.entry(It(e,t)))}function Ju(e,t){(t??b()).setQueryData(c.posts.entry(It(e.author,e.permlink)),e);}function qt(e,t,r,n){let i=n??b(),o=It(e,t),s=i.getQueryData(c.posts.entry(o));if(!s)return;let a=r(s);return i.setQueryData(c.posts.entry(o),a),s}exports.EntriesCacheManagement=void 0;(a=>{function e(u,p,l,f,m){qt(u,p,y=>({...y,active_votes:l,stats:{...y.stats||{gray:false,hide:false,flag_weight:0,total_votes:0},total_votes:l.length,flag_weight:y.stats?.flag_weight||0},total_votes:l.length,payout:f,pending_payout_value:String(f)}),m);}a.updateVotes=e;function t(u,p,l,f){qt(u,p,m=>({...m,reblogs:l}),f);}a.updateReblogsCount=t;function r(u,p,l,f){qt(u,p,m=>({...m,children:l}),f);}a.updateRepliesCount=r;function n(u,p,l,f){qt(p,l,m=>({...m,children:m.children+1,replies:[u,...m.replies]}),f);}a.addReply=n;function i(u,p){u.forEach(l=>Ju(l,p));}a.updateEntries=i;function o(u,p,l){(l??b()).invalidateQueries({queryKey:c.posts.entry(It(u,p))});}a.invalidateEntry=o;function s(u,p,l){return zu(u,p,l)}a.getEntry=s;})(exports.EntriesCacheManagement||={});function Yu(e,t,r){let n=e.some(i=>i.voter===t);return r!==0?n:!n}function Xu(e,t,r){let n=exports.EntriesCacheManagement.getEntry(t.author,t.permlink,r);if(!n?.active_votes||Yu(n.active_votes,e,t.weight))return;let i=[...n.active_votes.filter(s=>s.voter!==e),...t.weight!==0?[{rshares:t.weight,voter:e}]:[]],o=n.payout+(t.estimated??0);exports.EntriesCacheManagement.updateVotes(t.author,t.permlink,i,o,r);}function iO(e,t,r){return v(["posts","vote"],e,({author:n,permlink:i,weight:o})=>[fr(e,n,i,o)],async(n,i)=>{Xu(e,i);let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(120,o,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let s=()=>{t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.accounts.full(e)]);};(r??"async")==="async"?setTimeout(s,4e3):s();}},t,"posting",{broadcastMode:r??"async"})}function uO(e,t,r){return v(["posts","reblog"],e,({author:n,permlink:i,deleteReblog:o})=>[gr(e,n,i,o??false)],async(n,i)=>{let o=exports.EntriesCacheManagement.getEntry(i.author,i.permlink);if(o){let p=Math.max(0,(o.reblogs??0)+(i.deleteReblog?-1:1));exports.EntriesCacheManagement.updateReblogsCount(i.author,i.permlink,p);}let s=n?.id??n?.tx_id;t?.adapter?.recordActivity&&s&&t.adapter.recordActivity(130,s,n?.block_num).catch(()=>{});let a=()=>{b().invalidateQueries({queryKey:c.posts.accountPostsBlogPrefix(e)}),t?.adapter?.invalidateQueries&&t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.posts.rebloggedBy(i.author,i.permlink)]);};(r??"async")==="async"?setTimeout(a,4e3):a();},t,"posting",{broadcastMode:r??"async"})}function fO(e,t,r){return v(["posts","comment"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=!i.parentAuthor,s=o?100:110,a=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&a&&t.adapter.recordActivity(s,a,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let u=[c.accounts.full(e),c.resourceCredits.account(e)];if(!o){u.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let p=i.rootAuthor||i.parentAuthor,l=i.rootPermlink||i.parentPermlink;u.push({predicate:f=>{let m=f.queryKey;return Array.isArray(m)&&m[0]==="posts"&&m[1]==="discussions"&&m[2]===p&&m[3]===l}});}await t.adapter.invalidateQueries(u);}},t,"posting",{broadcastMode:r})}function yO(e,t,r,n){let i=n??b(),o=i.getQueriesData({predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="discussions"&&a[2]===t&&a[3]===r}});for(let[s,a]of o)a&&i.setQueryData(s,[e,...a]);}function Qi(e,t,r,n,i){let o=i??b(),s=new Map,a=o.getQueriesData({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===r&&p[3]===n}});for(let[u,p]of a)p&&(s.set(u,p),o.setQueryData(u,p.filter(l=>l.author!==e||l.permlink!==t)));return s}function Hi(e,t){let r=t??b();for(let[n,i]of e)r.setQueryData(n,i);}function hO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`,s=i.getQueryData(c.posts.entry(o));return s&&i.setQueryData(c.posts.entry(o),{...s,...r}),s}function wO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`;i.setQueryData(c.posts.entry(o),r);}function PO(e,t,r){return v(["posts","deleteComment"],e,({author:n,permlink:i})=>[mr(n,i)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e)];if(i.parentAuthor&&i.parentPermlink){o.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let s=i.rootAuthor||i.parentAuthor,a=i.rootPermlink||i.parentPermlink;o.push({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===s&&p[3]===a}});}await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r,onMutate:async n=>{let i=n.rootAuthor||n.parentAuthor,o=n.rootPermlink||n.parentPermlink;return i&&o?{snapshots:Qi(n.author,n.permlink,i,o)}:{}},onError:(n,i,o)=>{let{snapshots:s}=o??{};s&&Hi(s);}})}function SO(e,t,r){return v(["posts","cross-post"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,"",n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true}=n.options;i.push(De(n.author,n.permlink,o,s,a,u,[]));}return i},async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e),{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.parentPermlink}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"async"})}function RO(e,t,r){return v(["posts","update-reply"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(110,o,n?.block_num).catch(s=>{console.debug("[SDK][Posts][useUpdateReply] recordActivity failed",{activityType:110,blockNum:n?.block_num,transactionId:o,error:s});}),t?.adapter?.invalidateQueries){let s=[c.resourceCredits.account(e)];s.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let a=i.rootAuthor||i.parentAuthor,u=i.rootPermlink||i.parentPermlink;s.push({predicate:p=>{let l=p.queryKey;return Array.isArray(l)&&l[0]==="posts"&&l[1]==="discussions"&&l[2]===a&&l[3]===u}}),await t.adapter.invalidateQueries(s);}},t,"posting",{broadcastMode:r})}function DO(e,t,r){return v(["ecency","promote"],e,({author:n,permlink:i,duration:o})=>[Nr(e,n,i,o)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.posts._promotedPrefix],[...c.points._prefix(e)],c.posts.entry(`/@${i.author}/${i.permlink}`)]);},t,"active",{broadcastMode:r})}var Zu=[3e3,3e3,3e3],ep=e=>new Promise(t=>setTimeout(t,e));async function tp(e,t){return g("condenser_api.get_content",[e,t])}async function rp(e,t,r=0,n){let i=n?.delays??Zu,o;try{o=await tp(e,t);}catch{o=void 0;}if(o||r>=i.length)return;let s=i[r];return s>0&&await ep(s),rp(e,t,r+1,n)}var $e={};ft($e,{useRecordActivity:()=>Ur});function ip(){return typeof window<"u"&&window.location?{url:window.location.href,domain:window.location.host}:{url:"",domain:""}}function Ur(e,t,r){return reactQuery.useMutation({mutationKey:["analytics",t],mutationFn:async()=>{if(!t)throw new Error("[SDK][Analytics] \u2013 no activity type provided");let n=w(),i=ip(),o=r?.url??i.url,s=r?.domain??i.domain;try{await n(d.plausibleHost+"/api/event",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,url:o,domain:s,props:{username:e}})});}catch{}}})}function LO(e){return reactQuery.queryOptions({queryKey:["analytics","discover-leaderboard",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/leaderboard/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch leaderboard: ${r.status}`);return r.json()}})}function JO(e){return reactQuery.queryOptions({queryKey:["analytics","discover-curation",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/curation/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch curation data: ${r.status}`);let n=await r.json(),i=n.map(s=>s.account),o=await g("condenser_api.get_accounts",[i]);for(let s=0;sa.efficiency-s.efficiency),n}})}function ex(e,t=[],r=["visitors","pageviews","visit_duration"],n){let i=[...t].sort(),o=[...r].sort();return reactQuery.queryOptions({queryKey:["analytics","page-stats",e,i,o,n],queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/api/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,date_range:n}),signal:s});if(!a.ok)throw new Error(`Failed to fetch page stats: ${a.status}`);return a.json()},enabled:!!e,staleTime:0})}var Dt="threespeakfund",sx=1100;function cp(e){return /https?:\/\/([a-z0-9-]+\.)*3speak\.tv\/embed[?/]/i.test(e)}function ax(e,t){if(!cp(t))return e;let r=e.find(n=>n.account===Dt);return r&&r.weight===1100?e:r?e.map(n=>n.account===Dt?{...n,weight:1100}:n):[...e,{account:Dt,weight:1100}]}function cx(e){return e===Dt}var Lr={};ft(Lr,{getAccountTokenQueryOptions:()=>jr,getAccountVideosQueryOptions:()=>mp});var Vr={};ft(Vr,{getDecodeMemoQueryOptions:()=>lp});function lp(e,t,r){return reactQuery.queryOptions({queryKey:["integrations","hivesigner","decode-memo",e],queryFn:async()=>{if(r)return new Un__default.default.Client({accessToken:r}).decode(t)}})}var Ui={queries:Vr};function jr(e,t){return reactQuery.queryOptions({queryKey:["integrations","3speak","authenticate",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let n=await w()(`https://studio.3speak.tv/mobile/login?username=${e}&hivesigner=true`,{headers:{"Content-Type":"application/json"}}),i=Ui.queries.getDecodeMemoQueryOptions(e,(await n.json()).memo,t);await b().prefetchQuery(i);let{memoDecoded:o}=b().getQueryData(i.queryKey);return o.replace("#","")}})}function mp(e,t){return reactQuery.queryOptions({queryKey:["integrations","3speak","videos",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let r=jr(e,t);await b().prefetchQuery(r);let n=b().getQueryData(r.queryKey);if(!n)throw new Error("[SDK][Integrations][3Speak] \u2013 missing account token");return await(await w()("https://studio.3speak.tv/mobile/api/my-videos",{headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}})).json()}})}var xx={queries:Lr};function Rx(e){return reactQuery.queryOptions({queryKey:["integrations","hiveposh","links",e],retry:false,queryFn:async()=>{try{let r=await w()(`https://hiveposh.com/api/v0/linked-accounts/${e}`,{headers:{"Content-Type":"application/json"}});if(r.status===400&&(await r.json().catch(()=>({})))?.message==="User Not Connected"||!r.ok)return null;let n=await r.json();return {twitter:{username:n.twitter_username,profile:n.twitter_profile},reddit:{username:n.reddit_username,profile:n.reddit_profile}}}catch{return null}}})}function Dx({url:e,dimensions:t=[],metrics:r=["visitors","pageviews","visit_duration"],filterBy:n="event:page",dateRange:i,enabled:o=true}){return reactQuery.queryOptions({queryKey:["integrations","plausible",e,t,r,n,i],queryFn:async()=>{let a=await w()(`${d.privateApiHost}/api/stats`,{method:"POST",body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,filterBy:n,...i?{date_range:i}:{}}),headers:{"Content-Type":"application/json"}});if(!a.ok)throw new Error(`Failed to fetch Plausible stats: ${a.status}`);return await a.json()},enabled:!!e&&o,retry:1})}function Nx(){return reactQuery.queryOptions({queryKey:["resource-credits","stats"],queryFn:async()=>(await g("rc_api.get_rc_stats",{})).rc_stats})}function Vx(e){return reactQuery.queryOptions({queryKey:["resource-credits","account",e],queryFn:async()=>(await g("rc_api.find_rc_accounts",{accounts:[e]})).rc_accounts,enabled:!!e})}var Vi={ready:false,currentMana:0,maxMana:0,avgCost:0,estimatedCost:0,willLikelyFail:false,deficit:0,remaining:0};function $x({rcAccount:e,rcStats:t,operation:r,buffer:n=1.2}){if(!e||!t?.ops)return Vi;let{current_mana:i,max_mana:o}=Ot(e),s=Number(t.ops[r]?.avg_cost??0);if(!(s>0))return {...Vi,ready:true,currentMana:i,maxMana:o};let a=Number.isFinite(n)&&n>0?n:1.2,u=s*a,p=i{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/get-game",{method:"POST",body:JSON.stringify({game_type:r,code:t}),headers:{"Content-Type":"application/json"}})).json()}})}function tE(e,t,r,n){let{mutateAsync:i}=Ur(e,"spin-rolled");return reactQuery.useMutation({mutationKey:["games","post",r,e],mutationFn:async()=>{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/post-game",{method:"POST",body:JSON.stringify({game_type:r,code:t,key:n}),headers:{"Content-Type":"application/json"}})).json()},onSuccess(){i();}})}function oE(e){let t=e?.replace("@","");return reactQuery.queryOptions({queryKey:c.quests.status(t),enabled:!!t,queryFn:async()=>{if(!t)throw new Error("[SDK][Quests] \u2013 username wasn't provided");let n=await w()(d.privateApiHost+"/private-api/quests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t})});if(!n.ok)throw new Error(`Failed to fetch quests: ${n.status}`);return await n.json()},staleTime:3e4,refetchOnMount:true})}var Ap=[{id:"checkin",tier:"daily",goal:1,i18nKey:"checkin",icon:"check-circle"},{id:"post",tier:"daily",goal:1,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"daily",goal:3,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"daily",goal:10,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"daily",goal:1,i18nKey:"reblog",icon:"repeat"},{id:"spin",tier:"daily",goal:1,i18nKey:"spin",icon:"gift"},{id:"post",tier:"weekly",goal:5,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"weekly",goal:15,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"weekly",goal:50,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"weekly",goal:5,i18nKey:"reblog",icon:"repeat"},{id:"post",tier:"monthly",goal:20,i18nKey:"post",icon:"pencil"}];function aE(e,t){return Ap.find(r=>r.tier===e&&r.id===t)}var cE=300,uE=2;function xp(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}async function Ep(e){let r=await w()(d.privateApiHost+"/private-api/streak-freeze/buy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,idempotency_key:xp()})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to buy streak freeze: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function fE(e,t){let r=reactQuery.useQueryClient(),n=e?.replace("@","");return reactQuery.useMutation({mutationKey:["streak-freeze","buy",n],mutationFn:async()=>{if(!n||!t)throw new Error("[SDK][StreakFreeze] \u2013 missing auth");return Ep(t)},onSuccess(){n&&r.invalidateQueries({queryKey:c.points._prefix(n)});},onSettled(){n&&r.invalidateQueries({queryKey:c.quests.status(n)});}})}function hE(e,t,r){return v(["communities","subscribe"],e,({community:n})=>[xr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"async"})}function vE(e,t,r){return v(["communities","unsubscribe"],e,({community:n})=>[Er(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"sync"})}function xE(e,t,r){return v(["communities","mutePost"],e,({community:n,author:i,permlink:o,notes:s,mute:a})=>[Tr(e,n,i,o,s,a)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.posts.entry(`/@${i.author}/${i.permlink}`),["community","single",i.community],{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.community}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"sync"})}function CE(e,t,r,n){return v(["communities","set-role",e],t,({account:i,role:o})=>[Sr(t,e,i,o)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>{if(!a)return a;let u=[...a.team??[]],p=u.findIndex(([l])=>l===o.account);return p>=0?u[p]=[u[p][0],o.role,u[p][2]??""]:u.push([o.account,o.role,""]),{...a,team:u}}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)],c.communities.context(o.account,e)]);},r,"posting",{broadcastMode:n??"async"})}function qE(e,t,r,n){return v(["communities","update",e],t,i=>[kr(t,e,i)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>a&&{...a,...o}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)]]);},r,"posting",{broadcastMode:n??"async"})}function BE(e,t,r){return v(["communities","registerRewards"],e,({name:n})=>[Qr(n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.communities.singlePrefix(i.name)],[...c.points._prefix(e)]]);},t,"active",{broadcastMode:r})}function HE(e,t,r){return v(["communities","pin-post"],e,({community:n,account:i,permlink:o,pin:s})=>[Cr(e,n,i,o,s)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.posts.entry(`/@${i.account}/${i.permlink}`),[...c.communities.singlePrefix(i.community)]]);},t,"posting",{broadcastMode:r??"async"})}function $E(e,t,r=100,n=void 0,i=true){return reactQuery.queryOptions({queryKey:c.communities.list(e,t??"",r),enabled:i,queryFn:async()=>{let o=await g("bridge.list_communities",{last:"",limit:r,sort:e==="hot"?"rank":e,query:t||null,observer:n});return o?e==="hot"?o.sort(()=>Math.random()-.5):o:[]}})}function YE(e,t){return reactQuery.queryOptions({queryKey:c.communities.context(e,t),enabled:!!e&&!!t,queryFn:async()=>{let r=await g("bridge.get_community_context",{account:e,name:t});return {role:r?.role??"guest",subscribed:r?.subscribed??false}}})}function rS(e,t="",r=true){return reactQuery.queryOptions({queryKey:c.communities.single(e,t),enabled:r&&!!e,queryFn:async()=>ui(e??"",t)})}var ji=100;async function Li(e,t){return await g("bridge.list_subscribers",{community:e,limit:ji,...t?{last:t}:{}})??[]}function cS(e){return reactQuery.queryOptions({queryKey:c.communities.subscribers(e),queryFn:async()=>Li(e,null),staleTime:6e4})}function uS(e){return reactQuery.infiniteQueryOptions({queryKey:c.communities.subscribersInfinite(e),initialPageParam:null,queryFn:async({pageParam:t})=>Li(e,t),getNextPageParam:t=>t?.length>=ji?t[t.length-1]?.[0]??null:null,staleTime:6e4})}function gS(e,t){return reactQuery.infiniteQueryOptions({queryKey:c.communities.accountNotifications(e,t),initialPageParam:null,queryFn:async({pageParam:r})=>await g("bridge.account_notifications",{account:e,limit:t,last_id:r??void 0})??[],getNextPageParam:r=>r?.length>=t?r[r.length-1].id:null})}function _S(){return reactQuery.queryOptions({queryKey:c.communities.rewarded(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/rewarded-communities",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch rewarded communities: ${e.status}`);return e.json()}})}var Ip=(s=>(s.OWNER="owner",s.ADMIN="admin",s.MOD="mod",s.MEMBER="member",s.GUEST="guest",s.MUTED="muted",s))(Ip||{}),vS={owner:["admin","mod","member","guest","muted"],admin:["mod","member","guest","muted"],mod:["member","guest","muted"]};function PS(e,t){return e.startsWith("hive-3")||t===3?"Council":e.startsWith("hive-2")||t===2?"Journal":"Topic"}function OS({communityType:e,userRole:t,subscribed:r}){let n=t==="muted"?false:e==="Topic"?true:["owner","admin","mod","member"].includes(t),i=(()=>{if(t==="muted")return false;switch(e){case "Topic":return true;case "Journal":return t!=="guest"||r;case "Council":return n}})(),o=["owner","admin","mod"].includes(t);return {canPost:n,canComment:i,isModerator:o}}function kS(e,t){return reactQuery.queryOptions({queryKey:c.notifications.unreadCount(e),queryFn:async()=>t?(await(await fetch(`${d.privateApiHost}/private-api/notifications/unread`,{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json()).count:0,enabled:!!e&&!!t,initialData:0,refetchInterval:6e4})}function FS(e,t,r=void 0){return reactQuery.infiniteQueryOptions({queryKey:c.notifications.list(e,r),queryFn:async({pageParam:n})=>{if(!t)return [];let i={code:t,filter:r,since:n,user:void 0},o=await fetch(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!o.ok)return [];try{return await o.json()}catch{return []}},enabled:!!e&&!!t,initialData:{pages:[],pageParams:[]},initialPageParam:"",getNextPageParam:n=>n?.[n.length-1]?.id??"",refetchOnMount:true})}var Bp=(y=>(y.VOTES="rvotes",y.MENTIONS="mentions",y.FAVORITES="nfavorites",y.BOOKMARKS="nbookmarks",y.FOLLOWS="follows",y.REPLIES="replies",y.REBLOGS="reblogs",y.TRANSFERS="transfers",y.DELEGATIONS="delegations",y.PAYOUTS="payouts",y.SCHEDULED_PUBLISHED="scheduled_published",y.ACCOUNT_UPDATES="account_updates",y.WEEKLY_EARNINGS="weekly_earnings",y))(Bp||{});var Mp=(h=>(h[h.VOTE=1]="VOTE",h[h.MENTION=2]="MENTION",h[h.FOLLOW=3]="FOLLOW",h[h.COMMENT=4]="COMMENT",h[h.RE_BLOG=5]="RE_BLOG",h[h.TRANSFERS=6]="TRANSFERS",h[h.DELEGATIONS=10]="DELEGATIONS",h[h.FAVORITES=13]="FAVORITES",h[h.BOOKMARKS=15]="BOOKMARKS",h[h.PAYOUTS=19]="PAYOUTS",h[h.ACCOUNT_UPDATE=20]="ACCOUNT_UPDATE",h[h.WEEKLY_EARNINGS=21]="WEEKLY_EARNINGS",h[h.SCHEDULED_PUBLISHED=22]="SCHEDULED_PUBLISHED",h.ALLOW_NOTIFY="ALLOW_NOTIFY",h))(Mp||{}),$i=[1,2,3,4,5,6,10,13,15,19,20,21,22],Np=(n=>(n.ALL="All",n.UNREAD="Unread",n.READ="Read",n))(Np||{});function NS(e,t,r){return reactQuery.queryOptions({queryKey:c.notifications.settings(e),queryFn:async()=>{let n=e+"-web";if(!t)throw new Error("Missing access token");let i=await fetch(d.privateApiHost+"/private-api/detail-device",{body:JSON.stringify({code:t,username:e,token:n}),method:"POST",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch notification settings: ${i.status}`);return i.json()},enabled:!!e&&!!t,refetchOnMount:false,initialData:()=>({status:0,system:"web",allows_notify:0,notify_types:r?[]:[...$i]})})}function VS(){return reactQuery.queryOptions({queryKey:c.notifications.announcements(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/announcements",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch announcements: ${e.status}`);return await e.json()||[]},staleTime:36e5})}function WS(e){return reactQuery.queryOptions({queryKey:c.notifications.spotlights(),queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/spotlights",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch spotlights: ${t.status}`);return await t.json()||[]},staleTime:36e5})}function jp(e,t){return {...e,read:!t||t===e.id?1:e.read}}function Wi(e){return typeof e=="object"&&e!==null&&"pages"in e&&"pageParams"in e&&Array.isArray(e.pages)}function ek(e,t,r,n){let i=b();return reactQuery.useMutation({mutationKey:["notifications","mark-read",e],mutationFn:async({id:o})=>{if(!e||!t){process.env.NODE_ENV!=="production"&&console.warn("[SDK][Notifications] \u2013 missing auth for markNotifications");return}return Ti(t,o)},onMutate:async({id:o})=>{if(!e||!t)return {previousData:[]};await i.cancelQueries({queryKey:c.notifications._prefix});let s=[],a=i.getQueriesData({queryKey:c.notifications._prefix,predicate:l=>{let f=l.state.data;return Wi(f)}});a.forEach(([l,f])=>{if(f&&Wi(f)){s.push([l,f]);let m={...f,pages:f.pages.map(y=>y.map(h=>jp(h,o)))};i.setQueryData(l,m);}});let u=c.notifications.unreadCount(e),p=i.getQueryData(u);return typeof p=="number"&&p>0&&(s.push([u,p]),o?a.some(([,f])=>f?.pages.some(m=>m.some(y=>y.id===o&&y.read===0)))&&i.setQueryData(u,p-1):i.setQueryData(u,0)),{previousData:s}},onSuccess:o=>{let s=typeof o=="object"&&o!==null?o.unread:void 0;typeof s=="number"&&i.setQueryData(c.notifications.unreadCount(e),s),r?.(s);},onError:(o,s,a)=>{a?.previousData&&a.previousData.forEach(([u,p])=>{i.setQueryData(u,p);}),n?.(o);},onSettled:()=>{i.invalidateQueries({queryKey:c.notifications._prefix});}})}function ik(e,t,r){return v(["notifications","set-last-read"],e,({date:n})=>br(e,n),async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.notifications.unreadCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function ck(e){return reactQuery.queryOptions({queryKey:["proposals","proposal",e],queryFn:async()=>{let r=(await g("condenser_api.find_proposals",[[e]]))[0];return new Date(r.start_date)=new Date?r.status="active":new Date(r.end_date){let t=(await g("database_api.list_proposals",{start:[-1],limit:500,order:"by_total_votes",order_direction:"descending",status:"all"})).proposals,r=t.filter(i=>i.status==="expired");return [...t.filter(i=>i.status!=="expired"),...r]}})}function wk(e,t,r){return reactQuery.infiniteQueryOptions({queryKey:["proposals","votes",e,t,r],initialPageParam:t,refetchOnMount:true,staleTime:0,queryFn:async({pageParam:n})=>{let s=(await g("condenser_api.list_proposal_votes",[[e,n??t],r,"by_proposal_voter"])).filter(l=>l.proposal?.proposal_id===e).map(l=>({id:l.id,voter:l.voter})),a=await g("condenser_api.get_accounts",[s.map(l=>l.voter)]),u=kt(a);return s.map(l=>({...l,voterAccount:u.find(f=>l.voter===f.name)}))},getNextPageParam:n=>n?.[n.length-1]?.voter??void 0})}function Ak(e){return reactQuery.queryOptions({queryKey:["proposals","votes","by-user",e],enabled:!!e&&e!=="",staleTime:60*1e3,queryFn:async()=>!e||e===""?[]:((await g("database_api.list_proposal_votes",{start:[e],limit:1e3,order:"by_voter_proposal",order_direction:"ascending",status:"votable"})).proposal_votes||[]).filter(n=>n.voter===e)})}function Ek(e,t,r){return v(["proposals","vote"],e,({proposalIds:n,approve:i})=>[Or(e,n,i)],async n=>{try{let i=n?.id??n?.tx_id;t?.adapter?.recordActivity&&i&&t.adapter.recordActivity(150,i,n?.block_num).catch(o=>{console.debug("[SDK][Proposals][useProposalVote] recordActivity failed",{activityType:150,blockNum:n?.block_num,transactionId:i,error:o});}),t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.proposals.list(),c.proposals.votesByUser(e)]);}catch(i){console.warn("[useProposalVote] Post-broadcast side-effect failed:",i);}},t,"active",{broadcastMode:r})}function Tk(e,t,r){return v(["proposals","create"],e,n=>[Pr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.proposals.list()]);},t,"active",{broadcastMode:r})}function Ik(e,t=50){return reactQuery.infiniteQueryOptions({queryKey:["wallet","vesting-delegations",e,t],initialPageParam:"",queryFn:async({pageParam:r})=>{let n=r?t+1:t,i=await g("condenser_api.get_vesting_delegations",[e,r||"",n]);return r&&i.length>0&&i[0]?.delegatee===r?i.slice(1,t+1):i},getNextPageParam:r=>!r||r.lengthee("balance","/accounts/{account-name}/delegations",{"account-name":e},void 0,void 0,t)})}function Uk(e){return reactQuery.queryOptions({queryKey:["wallet","vesting-delegation-expirations",e],queryFn:async()=>e?(await g("database_api.find_vesting_delegation_expirations",{account:e})).delegations:[],enabled:!!e})}function $k(e){return reactQuery.queryOptions({queryKey:["wallet","conversion-requests",e],queryFn:()=>g("condenser_api.get_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function Jk(e){return reactQuery.queryOptions({queryKey:["wallet","collateralized-conversion-requests",e],queryFn:()=>g("condenser_api.get_collateralized_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function eC(e){return reactQuery.queryOptions({queryKey:["wallet","savings-withdraw",e],queryFn:()=>g("condenser_api.get_savings_withdraw_from",[e]),select:t=>t.sort((r,n)=>r.request_id-n.request_id)})}function iC(e){return reactQuery.queryOptions({queryKey:["wallet","withdraw-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"])})}function cC(e){return reactQuery.queryOptions({queryKey:["wallet","open-orders",e],queryFn:()=>g("condenser_api.get_open_orders",[e]),select:t=>t.sort((r,n)=>r.orderid-n.orderid),enabled:!!e})}function fC(e,t=100){return reactQuery.infiniteQueryOptions({queryKey:["wallet","outgoing-rc-delegations",e,t],initialPageParam:null,queryFn:async({pageParam:r})=>{let i=(await g("rc_api.list_rc_direct_delegations",{start:[e,r??""],limit:t}).then(o=>o)).rc_direct_delegations||[];return r&&(i=i.filter(o=>o.to!==r)),i},getNextPageParam:r=>r.length===t?r[r.length-1].to:null})}function hC(e){return reactQuery.queryOptions({queryKey:["wallet","incoming-rc",e],enabled:!!e,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] - Missing username for incoming RC");let r=await w()(`${d.privateApiHost}/private-api/received-rc/${e}`);if(!r.ok)throw new Error(`Failed to fetch incoming RC: ${r.status}`);return r.json()}})}function vC(e){return reactQuery.queryOptions({queryKey:["wallet","received-vesting-shares",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`);if(!t.ok)throw new Error(`Failed to fetch received vesting shares: ${t.status}`);return (await t.json()).list}})}function xC(e){return reactQuery.queryOptions({queryKey:["wallet","recurrent-transfers",e],queryFn:()=>g("condenser_api.find_recurrent_transfers",[e]),enabled:!!e})}function le(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}}function ae(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return;let r=Number.parseFloat(t);if(Number.isFinite(r))return r;let i=t.replace(/,/g,"").match(/[-+]?\d+(?:\.\d+)?/);if(i){let o=Number.parseFloat(i[0]);if(Number.isFinite(o))return o}}}function cl(e){if(!e||typeof e!="object")return;let t=e;return {name:le(t.name)??"",symbol:le(t.symbol)??"",layer:le(t.layer)??"hive",balance:ae(t.balance)??0,fiatRate:ae(t.fiatRate)??0,currency:le(t.currency)??"usd",precision:ae(t.precision)??3,address:le(t.address),error:le(t.error),pendingRewards:ae(t.pendingRewards),pendingRewardsFiat:ae(t.pendingRewardsFiat),liquid:ae(t.liquid),liquidFiat:ae(t.liquidFiat),savings:ae(t.savings),savingsFiat:ae(t.savingsFiat),staked:ae(t.staked),stakedFiat:ae(t.stakedFiat),iconUrl:le(t.iconUrl),actions:t.actions??[],extraData:t.extraData??[],apr:ae(t.apr)}}function ul(e){if(!e||typeof e!="object")return [];let t=[e],r=e;r.data&&typeof r.data=="object"&&t.push(r.data),r.result&&typeof r.result=="object"&&t.push(r.result),r.portfolio&&typeof r.portfolio=="object"&&t.push(r.portfolio);for(let n of t){if(Array.isArray(n))return n;if(n&&typeof n=="object")for(let i of ["wallets","tokens","assets","items","portfolio","balances"]){let o=n[i];if(Array.isArray(o))return o}}return []}function pl(e){if(!e||typeof e!="object")return;let t=e;return le(t.username)??le(t.name)??le(t.account)}function Gi(e,t="usd",r=true){return reactQuery.queryOptions({queryKey:["wallet","portfolio","v2",e,r?"only-enabled":"all",t],enabled:!!e,staleTime:6e4,refetchInterval:12e4,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] \u2013 username is required");let n=`${exports.ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`,i=await fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({username:e,onlyEnabled:r,currency:t})});if(!i.ok)throw new Error(`[SDK][Wallet] \u2013 Portfolio request failed (${i.status})`);let o=await i.json(),s=ul(o).map(a=>cl(a)).filter(a=>!!a).filter(a=>a.layer!=="spk");if(!s.length)throw new Error("[SDK][Wallet] \u2013 Portfolio payload contained no tokens");return {username:pl(o)??e,currency:le(o?.fiatCurrency??o?.currency)?.toUpperCase(),wallets:s}}})}function Kt(e){return reactQuery.queryOptions({queryKey:["assets","hive","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey),n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??"");if(!r)return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:0};let o=C(r.balance).amount,s=C(r.savings_balance).amount;return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:o+s,parts:[{name:"current",balance:o},{name:"savings",balance:s}]}}})}function zi(e){return reactQuery.queryOptions({queryKey:["assets","hbd","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(M(e).queryKey),r=b().getQueryData(be().queryKey),n=1;return t?{name:"HBD",title:"Hive Dollar",price:n,accountBalance:C(t.hbd_balance).amount+C(t?.savings_hbd_balance).amount,apr:((r?.hbdInterestRate??0)/100).toFixed(3),parts:[{name:"current",balance:C(t.hbd_balance).amount},{name:"savings",balance:C(t.savings_hbd_balance).amount}]}:{name:"HBD",title:"Hive Dollar",price:n,accountBalance:0}}})}function ml(e){let u=9.5-(e.headBlock-7e6)/25e4*.01;u<.95&&(u=.95);let p=e.vestingRewardPercent/1e4,l=e.virtualSupply,f=e.totalVestingFund;return (l*u*p/f).toFixed(3)}function Ji(e){return reactQuery.queryOptions({queryKey:["assets","hive-power","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey);if(!t||!r)return {name:"HP",title:"Hive Power",price:0,accountBalance:0};let n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??""),o=Number.isFinite(i)?i:t.base/t.quote,s=C(r.vesting_shares).amount,a=C(r.delegated_vesting_shares).amount,u=C(r.received_vesting_shares).amount,p=C(r.vesting_withdraw_rate).amount,l=Math.max((Number(r.to_withdraw)-Number(r.withdrawn))/1e6,0),f=Wn(r.next_vesting_withdrawal)?0:Math.min(p,l),m=+Ue(s,t.hivePerMVests).toFixed(3),y=+Ue(a,t.hivePerMVests).toFixed(3),h=+Ue(u,t.hivePerMVests).toFixed(3),E=+Ue(l,t.hivePerMVests).toFixed(3),O=+Ue(f,t.hivePerMVests).toFixed(3),A=Math.max(m-E,0),P=Math.max(m-y,0);return {name:"HP",title:"Hive Power",price:o,accountBalance:+A.toFixed(3),apr:ml(t),parts:[{name:"hp_balance",balance:m},{name:"available",balance:+P.toFixed(3)},{name:"outgoing_delegations",balance:y},{name:"incoming_delegations",balance:h},...E>0?[{name:"pending_power_down",balance:+E.toFixed(3)}]:[],...O>0&&O!==E?[{name:"next_power_down",balance:+O.toFixed(3)}]:[]]}}})}var K=re.operations,$r={transfers:[K.transfer,K.transfer_to_savings,K.transfer_from_savings,K.cancel_transfer_from_savings,K.recurrent_transfer,K.fill_recurrent_transfer,K.escrow_transfer,K.fill_recurrent_transfer],"market-orders":[K.fill_convert_request,K.fill_order,K.fill_collateralized_convert_request,K.limit_order_create2,K.limit_order_create,K.limit_order_cancel],interests:[K.interest],"stake-operations":[K.return_vesting_delegation,K.withdraw_vesting,K.transfer_to_vesting,K.set_withdraw_vesting_route,K.update_proposal_votes,K.fill_vesting_withdraw,K.account_witness_proxy,K.delegate_vesting_shares],rewards:[K.author_reward,K.curation_reward,K.producer_reward,K.claim_reward_balance,K.comment_benefactor_reward,K.liquidity_reward,K.proposal_pay],"":[]};var JC=Object.keys(re.operations);var Yi=re.operations,ZC=Yi,eT=Object.entries(Yi).reduce((e,[t,r])=>(e[r]=t,e),{});var Xi=re.operations;function yl(e){return Object.prototype.hasOwnProperty.call(Xi,e)}function ut(e){let t=Array.isArray(e)?e:[e],r=t.includes(""),n=Array.from(new Set(t.filter(a=>a!=null&&a!==""))),i=r||n.length===0?"all":n.map(a=>a.toString()).sort().join("|"),o=new Set;r||n.forEach(a=>{if(a in $r){$r[a].forEach(u=>o.add(u));return}yl(a)&&o.add(Xi[a]);});let s=hl(Array.from(o));return {filterKey:i,filterArgs:s}}function hl(e){let t=0n,r=0n;return e.forEach(n=>{n<64?t|=1n<o?+(o[o.length-1]?.num??0)-1:-1,queryFn:async({pageParam:o})=>(await g("condenser_api.get_account_history",[e,o,t,...n])).map(a=>({num:a[0],type:a[1].op[0],timestamp:a[1].timestamp,trx_id:a[1].trx_id,...a[1].op[1]})),select:({pages:o,pageParams:s})=>({pageParams:s,pages:o.map(a=>a.filter(u=>{switch(u.type){case "author_reward":case "comment_benefactor_reward":return C(u.hive_payout).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(u.amount).symbol==="HIVE";case "transfer_from_savings":return C(u.amount).symbol==="HIVE";case "fill_recurrent_transfer":let l=C(u.amount);return ["HIVE"].includes(l.symbol);case "claim_reward_balance":return C(u.reward_hive).amount>0;case "curation_reward":case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":return true;case "limit_order_create2":return true;default:return false}}))})})}function lT(e,t=20,r=[]){let{filterKey:n}=ut(r);return reactQuery.infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hbd","transactions",e,t,n],select:({pages:i,pageParams:o})=>({pageParams:o,pages:i.map(s=>s.filter(a=>{switch(a.type){case "author_reward":case "comment_benefactor_reward":return C(a.hbd_payout).amount>0;case "claim_reward_balance":return C(a.reward_hbd).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(a.amount).symbol==="HBD";case "transfer_from_savings":return C(a.amount).symbol==="HBD";case "fill_recurrent_transfer":let l=C(a.amount);return ["HBD"].includes(l.symbol);case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":case "proposal_pay":case "interest":return true;case "limit_order_create2":return true;default:return false}}))})})}function yT(e,t=20,r=[]){let{filterKey:n}=ut(r),i=new Set(Array.isArray(r)?r:[r]),o=i.has("")||i.size===0;return reactQuery.infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hive-power","transactions",e,t,n],select:({pages:s,pageParams:a})=>({pageParams:a,pages:s.map(u=>u.filter(p=>{switch(p.type){case "author_reward":case "comment_benefactor_reward":return C(p.vesting_payout).amount>0;case "claim_reward_balance":return C(p.reward_vests).amount>0;case "transfer_to_vesting":return true;case "transfer":case "transfer_to_savings":case "recurrent_transfer":return ["VESTS","HP"].includes(C(p.amount).symbol);case "fill_recurrent_transfer":let m=C(p.amount);return ["VESTS","HP"].includes(m.symbol);case "curation_reward":case "withdraw_vesting":case "delegate_vesting_shares":case "fill_vesting_withdraw":case "return_vesting_delegation":case "producer_reward":case "set_withdraw_vesting_route":return true;default:return o||i.has(p.type)}}))})})}function Zi(e){let t=r=>r.toString().padStart(2,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Wr(e,t){return new Date(e.getTime()-t*1e3)}function bT(e=86400){return reactQuery.infiniteQueryOptions({queryKey:["assets","hive","metrics",e],queryFn:async({pageParam:[t,r]})=>(await g("condenser_api.get_market_history",[e,Zi(t),Zi(r)])).map(({hive:i,non_hive:o,open:s})=>({close:o.close/i.close,open:o.open/i.open,low:o.low/i.low,high:o.high/i.high,volume:i.volume,time:new Date(s)})),initialPageParam:[Wr(new Date,Math.max(100*e,28800)),new Date],getNextPageParam:(t,r,[n])=>[Wr(n,Math.max(100*e,28800)),Wr(n,e)]})}function OT(e){return reactQuery.queryOptions({queryKey:["assets","hive","withdrawal-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"]),enabled:!!e})}function kT(e,t=50){return reactQuery.queryOptions({queryKey:["assets","hive-power","delegates",e],enabled:!!e,queryFn:()=>g("condenser_api.get_vesting_delegations",[e,"",t])})}function qT(e){return reactQuery.queryOptions({queryKey:["assets","hive-power","delegatings",e],queryFn:async()=>(await(await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`,{headers:{"Content-Type":"application/json"}})).json()).list,select:t=>t.sort((r,n)=>C(n.vesting_shares).amount-C(r.vesting_shares).amount)})}function BT(e=500){return reactQuery.queryOptions({queryKey:["market","order-book",e],queryFn:()=>g("condenser_api.get_order_book",[e])})}function HT(){return reactQuery.queryOptions({queryKey:["market","statistics"],queryFn:()=>g("condenser_api.get_ticker",[])})}function LT(e,t,r){let n=i=>i.toISOString().replace(/\.\d{3}Z$/,"");return reactQuery.queryOptions({queryKey:["market","history",e,t.getTime(),r.getTime()],queryFn:()=>g("condenser_api.get_market_history",[e,n(t),n(r)])})}function zT(){return reactQuery.queryOptions({queryKey:["market","hive-hbd-stats"],queryFn:async()=>{let e=await g("condenser_api.get_ticker",[]),t=new Date,r=new Date(t.getTime()-864e5),n=s=>s.toISOString().replace(/\.\d{3}Z$/,""),i=await g("condenser_api.get_market_history",[86400,n(r),n(t)]);return {price:+e.latest,close:i[0]?i[0].non_hive.open/i[0].hive.open:0,high:i[0]?i[0].non_hive.high/i[0].hive.high:0,low:i[0]?i[0].non_hive.low/i[0].hive.low:0,percent:i[0]?100-i[0].non_hive.open/i[0].hive.open*100/+e.latest:0,totalFromAsset:e.hive_volume.split(" ")[0],totalToAsset:e.hbd_volume.split(" ")[0]}}})}function ZT(e,t,r,n){return reactQuery.queryOptions({queryKey:["market","data",e,t,r,n],queryFn:async({signal:i})=>{let o=w(),s=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,a=await o(s,{signal:i});if(!a.ok)throw new Error(`Failed to fetch market data: ${a.status}`);return a.json()}})}function eo(e){return e.toISOString().replace(/\.\d{3}Z$/,"")}function nR(e=1e3,t,r){let n=r??new Date,i=t??new Date(n.getTime()-600*60*1e3);return reactQuery.queryOptions({queryKey:["market","trade-history",e,i.getTime(),n.getTime()],queryFn:()=>g("condenser_api.get_trade_history",[eo(i),eo(n),e])})}function aR(){return reactQuery.queryOptions({queryKey:["market","feed-history"],queryFn:async()=>{try{return await g("condenser_api.get_feed_history",[])}catch(e){throw e}}})}function lR(){return reactQuery.queryOptions({queryKey:["market","current-median-history-price"],queryFn:async()=>{try{return await g("condenser_api.get_current_median_history_price",[])}catch(e){throw e}}})}function gR(e,t,r){return v(["market","limit-order-create"],e,n=>[Ft(e,n.amountToSell,n.minToReceive,n.fillOrKill,n.expiration,n.orderId)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function _R(e,t,r){return v(["market","limit-order-cancel"],e,({orderId:n})=>[Rr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}async function pt(e){let t=await e.json();if(!e.ok){let r=new Error(`Request failed with status ${e.status}`);throw r.status=e.status,r.data=t,r}return t}async function AR(e,t,r,n){let i=w(),o=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,s=await i(o);return pt(s)}async function to(e){if(e==="hbd")return 1;let t=w(),r=`https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${e}`,n=await t(r);return (await pt(n)).hive_dollar[e]}async function PR(e,t){let n=await w()(d.privateApiHost+`/private-api/market-data/${e==="hbd"?"usd":e}/${t}`);return pt(n)}async function OR(){let t=await w()(d.privateApiHost+"/private-api/market-data/latest");return pt(t)}async function xR(){let t=await w()("https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd");return pt(t)}var Fl={"Content-type":"application/json"};async function ql(e){let t=w(),r=exports.ConfigManager.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-api`,{method:"POST",body:JSON.stringify(e),headers:Fl});if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 request failed with ${n.status}`);return (await n.json()).result}async function xe(e,t){try{return await ql(e)}catch{return t}}async function kR(e,t=50){let r={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:e},limit:t,offset:0},id:1},[n,i]=await Promise.all([xe({...r,params:{...r.params,table:"buyBook",indexes:[{index:"price",descending:true}]}},[]),xe({...r,params:{...r.params,table:"sellBook",indexes:[{index:"price",descending:false}]}},[])]),o=a=>a.sort((u,p)=>{let l=Number(u.price??0);return Number(p.price??0)-l}),s=a=>a.sort((u,p)=>{let l=Number(u.price??0),f=Number(p.price??0);return l-f});return {buy:o(n),sell:s(i)}}async function CR(e,t=50){return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"tradesHistory",query:{symbol:e},limit:t,offset:0,indexes:[{index:"timestamp",descending:true}]},id:1},[])}async function TR(e,t,r=100){let n={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:t,account:e},limit:r,offset:0},id:1},[i,o]=await Promise.all([xe({...n,params:{...n.params,table:"buyBook",indexes:[{index:"timestamp",descending:true}]}},[]),xe({...n,params:{...n.params,table:"sellBook",indexes:[{index:"timestamp",descending:true}]}},[])]),s=(p,l)=>(Number(p||0)*Number(l||0)).toFixed(8),a=i.map(p=>({id:p.txId,type:"buy",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:p.tokensLocked??s(p.quantity,p.price),timestamp:Number(p.timestamp??0)})),u=o.map(p=>({id:p.txId,type:"sell",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:s(p.quantity,p.price),timestamp:Number(p.timestamp??0)}));return [...a,...u].sort((p,l)=>l.timestamp-p.timestamp)}async function Il(e,t){if(Array.isArray(e)&&e.length===0)return [];let r=Array.isArray(e)?{symbol:{$in:e}}:e?{symbol:e}:{};return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"metrics",query:{...r,...t?{account:t}:{}}},id:1},[])}async function We(e,t){return Il(t,e)}async function Mt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"balances",query:{account:e}},id:1},[])}async function Nt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"tokens",query:{symbol:{$in:e}}},id:2},[])}async function ro(e,t,r,n){let i=w(),o=exports.ConfigManager.getValidatedBaseUrl(),s=new URL("/private-api/engine-account-history",o);s.searchParams.set("account",e),s.searchParams.set("symbol",t),s.searchParams.set("limit",r.toString()),s.searchParams.set("offset",n.toString());let a=await i(s.toString(),{method:"GET",headers:{"Content-type":"application/json"}});if(!a.ok)throw new Error(`[SDK][HiveEngine] \u2013 account history failed with ${a.status}`);return await a.json()}async function no(e,t="daily"){let r=w(),n=exports.ConfigManager.getValidatedBaseUrl(),i=new URL("/private-api/engine-chart-api",n);i.searchParams.set("symbol",e),i.searchParams.set("interval",t);let o=await r(i.toString(),{headers:{"Content-type":"application/json"}});if(!o.ok)throw new Error(`[SDK][HiveEngine] \u2013 chart failed with ${o.status}`);return await o.json()}async function io(e){let t=w(),r=exports.ConfigManager.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-reward-api/${e}?hive=1`);if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 rewards failed with ${n.status}`);return await n.json()}function Qt(e){return reactQuery.queryOptions({queryKey:["assets","hive-engine","balances",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Mt(e)})}function BR(){return reactQuery.queryOptions({queryKey:["assets","hive-engine","markets"],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>We()})}function oo(e){return reactQuery.queryOptions({queryKey:["assets","hive-engine","metadata-list",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Nt(e)})}function jR(e,t,r=20){return reactQuery.infiniteQueryOptions({queryKey:["assets","hive-engine",t,"transactions",e],enabled:!!t&&!!e,initialPageParam:0,queryFn:async({pageParam:n})=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");return ro(e,t,r,n)},getNextPageParam:(n,i,o)=>(n?.length??0)===r?o+r:void 0,getPreviousPageParam:(n,i,o)=>o>0?o-r:void 0})}function GR(e,t="daily"){return reactQuery.queryOptions({queryKey:["assets","hive-engine",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>no(e,t)})}function XR(e){return reactQuery.queryOptions({queryKey:["assets","hive-engine","unclaimed",e],staleTime:6e4,refetchInterval:9e4,enabled:!!e,queryFn:async()=>{try{let t=await io(e);return Object.values(t).filter(({pending_token:r})=>r>0)}catch{return []}}})}function so(e,t){return reactQuery.queryOptions({queryKey:["assets","hive-engine","all-tokens",e,t],queryFn:async()=>We(e,t)})}function Ge(e,t=void 0){let r={fractionDigits:3,prefix:"",suffix:""};t&&(r={...r,...t});let{fractionDigits:n,prefix:i,suffix:o}=r,s="";i&&(s+=i+" ");let a=Math.abs(parseFloat(e.toString()))<1e-4?0:e,u=typeof a=="string"?parseFloat(a):a;return s+=u.toLocaleString("en-US",{minimumFractionDigits:n,maximumFractionDigits:n,useGrouping:true}),o&&(s+=" "+o),s}var Ht=class{symbol;name;icon;precision;stakingEnabled;delegationEnabled;balance;stake;stakedBalance;delegationsIn;delegationsOut;usdValue;constructor(t){this.symbol=t.symbol,this.name=t.name||"",this.icon=t.icon||"",this.precision=t.precision||0,this.stakingEnabled=t.stakingEnabled||false,this.delegationEnabled=t.delegationEnabled||false,this.balance=parseFloat(t.balance)||0,this.stake=parseFloat(t.stake)||0,this.delegationsIn=parseFloat(t.delegationsIn)||0,this.delegationsOut=parseFloat(t.delegationsOut)||0,this.stakedBalance=this.stake+this.delegationsIn-this.delegationsOut,this.usdValue=t.usdValue;}hasDelegations=()=>this.delegationEnabled?this.delegationsIn>0&&this.delegationsOut>0:false;delegations=()=>this.hasDelegations()?`(${Ge(this.stake,{fractionDigits:this.precision})} + ${Ge(this.delegationsIn,{fractionDigits:this.precision})} - ${Ge(this.delegationsOut,{fractionDigits:this.precision})})`:"";staked=()=>this.stakingEnabled?this.stakedBalance<1e-4?this.stakedBalance.toString():Ge(this.stakedBalance,{fractionDigits:this.precision}):"-";balanced=()=>this.balance<1e-4?this.balance.toString():Ge(this.balance,{fractionDigits:this.precision})};function uF(e,t,r){return reactQuery.queryOptions({queryKey:["assets","hive-engine","balances-with-usd",e,t,r],queryFn:async()=>{if(!e)throw new Error("[HiveEngine] No account in a balances query");let n=await Mt(e),i=await Nt(n.map(p=>p.symbol)),o=t?t.base/t.quote:0,s=Array.isArray(r)?r:[],a=n.map(p=>p.symbol).filter(p=>p!=="SWAP.HIVE"&&!s.some(l=>l.symbol===p)),u=[...s,...a.length?await We(void 0,a):[]];return n.map(p=>{let l=i.find(O=>O.symbol===p.symbol),f;if(l?.metadata)try{f=JSON.parse(l.metadata);}catch{f=void 0;}let m=u.find(O=>O.symbol===p.symbol),y=Number(m?.lastPrice??"0"),h=Number(p.balance),E=p.symbol==="SWAP.HIVE"?o*h:y===0?0:Number((y*o*h).toFixed(10));return new Ht({symbol:p.symbol,name:l?.name??p.symbol,icon:f?.icon??"",precision:l?.precision??0,stakingEnabled:l?.stakingEnabled??false,delegationEnabled:l?.delegationEnabled??false,balance:p.balance,stake:p.stake,delegationsIn:p.delegationsIn,delegationsOut:p.delegationsOut,usdValue:E})})},enabled:!!e})}function ao(e,t){return reactQuery.queryOptions({queryKey:["assets","hive-engine",t,"general-info",e],enabled:!!t&&!!e,staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");let r=b(),n=Kt(e);await r.prefetchQuery(n);let i=r.getQueryData(n.queryKey),o=await r.ensureQueryData(oo([t])),s=await r.ensureQueryData(Qt(e)),a=await r.ensureQueryData(so(void 0,t)),u=o?.find(O=>O.symbol===t),p=s?.find(O=>O.symbol===t),f=+(a?.find(O=>O.symbol===t)?.lastPrice??"0"),m=parseFloat(p?.balance??"0"),y=parseFloat(p?.stake??"0"),h=parseFloat(p?.pendingUnstake??"0"),E=[{name:"liquid",balance:m},{name:"staked",balance:y}];return h>0&&E.push({name:"unstaking",balance:h}),{name:t,title:u?.name??"",price:f===0?0:Number(f*(i?.price??0)),accountBalance:m+y,layer:"ENGINE",parts:E}}})}function lt(e,t=0){return reactQuery.queryOptions({queryKey:["points",e,t],queryFn:async()=>{if(!e)throw new Error("Get points query \u2013 username wasn't provided");let r=e.replace("@",""),n=await fetch(d.privateApiHost+"/private-api/points",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r})});if(!n.ok)throw new Error(`Failed to fetch points: ${n.status}`);let i=await n.json(),o=await fetch(d.privateApiHost+"/private-api/point-list",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,type:t})});if(!o.ok)throw new Error(`Failed to fetch point transactions: ${o.status}`);let s=await o.json();return {points:i.points,uPoints:i.unclaimed_points,transactions:s}},staleTime:3e4,refetchOnMount:true,enabled:!!e})}function co(e){return reactQuery.queryOptions({queryKey:["assets","points","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>(await b().prefetchQuery(lt(e)),{name:"POINTS",title:"Ecency Points",price:.002,accountBalance:+(b().getQueryData(lt(e).queryKey)?.points??0)})})}function SF(e,t){return reactQuery.queryOptions({queryKey:["assets","points","transactions",e,t],queryFn:async()=>(await(await fetch(`${d.privateApiHost}/private-api/point-list`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,type:t??0})})).json()).map(({created:i,type:o,amount:s,id:a,sender:u,receiver:p,memo:l})=>({created:new Date(i),type:o,results:[{amount:parseFloat(s),asset:"POINTS"}],id:a,from:u??void 0,to:p??void 0,memo:l??void 0}))})}function NF(e,t,r={refetch:false}){let n=b(),i=r.currency??"usd",o=async p=>(r.refetch?await n.fetchQuery(p):await n.prefetchQuery(p),n.getQueryData(p.queryKey)),s=async p=>{if(!p||i==="usd")return p;try{let l=await to(i);return {...p,price:p.price*l}}catch(l){return console.warn(`Failed to convert price from USD to ${i}:`,l),p}},a=Gi(e,i,true),u=async()=>{try{let l=(await n.fetchQuery(a)).wallets.find(m=>m.symbol.toUpperCase()===t.toUpperCase());if(!l)return;let f=[];if(l.liquid!==void 0&&l.liquid!==null&&f.push({name:"liquid",balance:l.liquid}),l.staked!==void 0&&l.staked!==null&&l.staked>0&&f.push({name:"staked",balance:l.staked}),l.savings!==void 0&&l.savings!==null&&l.savings>0&&f.push({name:"savings",balance:l.savings}),l.extraData&&Array.isArray(l.extraData))for(let m of l.extraData){if(!m||typeof m!="object")continue;let y=m.dataKey,h=m.value;if(typeof h=="string"){let O=h.replace(/,/g,"").match(/[+-]?\s*(\d+(?:\.\d+)?)/);if(O){let A=Math.abs(Number.parseFloat(O[1]));y==="delegated_hive_power"?f.push({name:"outgoing_delegations",balance:A}):y==="received_hive_power"?f.push({name:"incoming_delegations",balance:A}):y==="powering_down_hive_power"&&f.push({name:"pending_power_down",balance:A});}}}return {name:l.symbol,title:l.name,price:l.fiatRate,accountBalance:l.balance,apr:l.apr?.toString(),layer:l.layer,pendingRewards:l.pendingRewards,parts:f}}catch{return}};return reactQuery.queryOptions({queryKey:["ecency-wallets","asset-info",e,t,i],queryFn:async()=>{let p=await u();if(p&&p.price>0)return p;let l;if(t==="HIVE")l=await o(Kt(e));else if(t==="HP")l=await o(Ji(e));else if(t==="HBD")l=await o(zi(e));else if(t==="POINTS")l=await o(co(e));else if((await n.ensureQueryData(Qt(e))).some(m=>m.symbol===t))l=await o(ao(e,t));else {if(p)return p;throw new Error(`[SDK][Wallet] \u2013 unrecognized asset "${t}"`)}if(p&&l&&l.price>0){let f=await s(l);return {...p,price:f.price}}return await s(l)}})}var Gl=(A=>(A.Transfer="transfer",A.TransferToSavings="transfer-saving",A.WithdrawFromSavings="withdraw-saving",A.Delegate="delegate",A.PowerUp="power-up",A.PowerDown="power-down",A.WithdrawRoutes="withdraw-routes",A.ClaimInterest="claim-interest",A.Swap="swap",A.Convert="convert",A.Gift="gift",A.Promote="promote",A.Claim="claim",A.Buy="buy",A.Stake="stake",A.Unstake="unstake",A.Undelegate="undelegate",A))(Gl||{});function LF(e,t,r){return v(["wallet","transfer"],e,n=>[Ke(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function JF(e,t,r){return v(["wallet","transfer-point"],e,n=>[Le(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function tq(e,t,r){return v(["wallet","delegate-vesting-shares"],e,n=>[st(e,n.delegatee,n.vestingShares)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.delegatee),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function sq(e,t,r){return v(["wallet","set-withdraw-vesting-route"],e,n=>[at(e,n.toAccount,n.percent,n.autoVest)],async(n,i)=>{await S(t?.adapter,r,[c.wallet.withdrawRoutes(e),c.accounts.full(e),c.accounts.full(i.toAccount)]);},t,"active",{broadcastMode:r})}function pq(e,t,r){return v(["wallet","transfer-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"transfer",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity,memo:n.memo}});return [["custom_json",{required_auths:[e],required_posting_auths:[],id:"ssc-mainnet-hive",json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function gq(e,t,r){return v(["wallet","transfer-to-savings"],e,n=>[je(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function bq(e,t,r){return v(["wallet","transfer-from-savings"],e,n=>[Be(e,n.to,n.amount,n.memo,n.requestId)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function xq(e,t,r){return v(["wallet","transfer-to-vesting"],e,n=>[it(e,n.to,n.amount)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Tq(e,t,r){return v(["wallet","withdraw-vesting"],e,n=>[ot(e,n.vestingShares)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Dq(e,t,r){return v(["wallet","convert"],e,n=>[n.collateralized?yr(e,n.amount,n.requestId):ct(e,n.amount,n.requestId)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Qq(e,t,r){return v(["wallet","claim-interest"],e,n=>nt(e,n.to,n.amount,n.memo,n.requestId),async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}var zl=5e3,Ut=new Map;function Lq(e,t,r){return v(["wallet","claim-rewards"],e,n=>[Fr(e,n.rewardHive,n.rewardHbd,n.rewardVests)],()=>{let n=e??"__anonymous__",i=[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e],c.assets.hiveGeneralInfo(e),c.assets.hbdGeneralInfo(e),c.assets.hivePowerGeneralInfo(e)],o=Ut.get(n);o&&(clearTimeout(o),Ut.delete(n));let s=setTimeout(async()=>{try{let a=b(),p=(await Promise.allSettled(i.map(l=>a.invalidateQueries({queryKey:l})))).filter(l=>l.status==="rejected");p.length>0&&console.error("[SDK][Wallet][useClaimRewards] delayed invalidation rejected",{username:e,rejectedCount:p.length,rejected:p});}catch(a){console.error("[SDK][Wallet][useClaimRewards] delayed invalidation failed",{username:e,error:a});}finally{Ut.delete(n);}},zl);Ut.set(n,s);},t,"posting",{broadcastMode:r})}function zq(e,t,r){return v(["wallet","delegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"delegate",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Zq(e,t,r){return v(["wallet","undelegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"undelegate",contractPayload:{symbol:n.symbol,from:n.from,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function nI(e,t,r){return v(["wallet","stake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"stake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function aI(e,t,r){return v(["wallet","unstake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"unstake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function lI(e,t,r){return v(["wallet","claim-engine-rewards"],e,n=>{let i=JSON.stringify(n.tokens.map(o=>({symbol:o})));return [["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"posting",{broadcastMode:r})}function gI(e,t,r){return v(["wallet","engine-market-order"],e,n=>{let i,o;n.action==="cancel"?(o="cancel",i={type:n.orderType,id:n.orderId}):(o=n.action,i={symbol:n.symbol,quantity:n.quantity,price:n.price});let s=JSON.stringify({contractName:"market",contractAction:o,contractPayload:i});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:s}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Jl(e,t,r){let{from:n,to:i="",amount:o="",memo:s=""}=r,a=r.request_id??Date.now()>>>0;switch(e){case "HIVE":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "power-up":return [it(n,i,o)]}break;case "HBD":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "claim-interest":return nt(n,i,o,s,a);case "convert":return [ct(n,o,Math.floor(Date.now()/1e3))]}break;case "HP":switch(t){case "power-down":return [ot(n,o)];case "delegate":return [st(n,i,o)];case "withdraw-routes":return [at(r.from_account??n,r.to_account??i,r.percent??0,r.auto_vest??false)]}break;case "POINTS":if(t==="transfer"||t==="gift")return [Le(n,i,o,s)];break}return null}function Yl(e,t,r){let{from:n,to:i="",amount:o=""}=r,s=typeof o=="string"&&o.includes(" ")?o.split(" ")[0]:String(o);switch(t){case "transfer":return [Me(n,"transfer",{symbol:e,to:i,quantity:s,memo:r.memo??""})];case "stake":return [Me(n,"stake",{symbol:e,to:i,quantity:s})];case "unstake":return [Me(n,"unstake",{symbol:e,to:i,quantity:s})];case "delegate":return [Me(n,"delegate",{symbol:e,to:i,quantity:s})];case "undelegate":return [Me(n,"undelegate",{symbol:e,from:i,quantity:s})];case "claim":return [hr(n,[e])]}return null}function Xl(e){return e==="claim"?"posting":"active"}function vI(e,t,r,n,i){let{mutateAsync:o}=$e.useRecordActivity(e,r);return v(["ecency-wallets",t,r],e,s=>{let a=Jl(t,r,s);if(a)return a;let u=Yl(t,r,s);if(u)return u;throw new Error(`[SDK][Wallet] \u2013 no operation builder for asset="${t}" operation="${r}"`)},()=>{o();let s=[];s.push(["ecency-wallets","asset-info",e,t]),t==="HIVE"&&s.push(["ecency-wallets","asset-info",e,"HP"]),s.push(["wallet","portfolio","v2",e]),setTimeout(()=>{s.forEach(a=>{b().invalidateQueries({queryKey:a});});},5e3);},n,Xl(r),{broadcastMode:i})}function xI(e,t,r){return v(["wallet","delegate-rc"],e,({to:n,maxRc:i})=>[wr(e,n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),c.resourceCredits.account(e),c.resourceCredits.account(i.to)]);},t,"active",{broadcastMode:r})}function CI(e,t,r){return v(["witnesses","vote"],e,({witness:n,approve:i})=>[vr(e,n,i)],async()=>{try{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.votes(e)]);}catch(n){console.warn("[useWitnessVote] Post-broadcast side-effect failed:",n);}},t,"active",{broadcastMode:r})}function qI(e,t,r){return v(["witnesses","proxy"],e,({proxy:n})=>[Ar(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.proxy()]);},t,"active",{broadcastMode:r})}function ed(e){return {owner:e.witness_name,total_missed:e.missed_blocks,url:e.url,props:{account_creation_fee:`${(e.account_creation_fee/1e3).toFixed(3)} HIVE`,account_subsidy_budget:0,maximum_block_size:e.block_size},hbd_exchange_rate:{base:`${e.price_feed.toFixed(3)} HBD`},available_witness_account_subsidies:0,running_version:e.version,signing_key:e.signing_key,last_hbd_exchange_update:e.feed_updated_at,rank:e.rank,vests:e.vests,voters_num:e.voters_num,voters_num_daily_change:e.voters_num_daily_change,price_feed:e.price_feed,hbd_interest_rate:e.hbd_interest_rate,last_confirmed_block_num:e.last_confirmed_block_num}}function NI(e){return reactQuery.infiniteQueryOptions({queryKey:c.witnesses.list(e),initialPageParam:1,queryFn:async({pageParam:t})=>(await ee("hafbe","/witnesses",{"page-size":e,page:t})).witnesses.map(ed),getNextPageParam:(t,r,n)=>t.length===e?n+1:void 0})}function QI(e,t,r,n="vests",i="desc"){return reactQuery.queryOptions({queryKey:c.witnesses.voters(e,t,r,n,i),queryFn:async({signal:o})=>await ee("hafbe","/witnesses/{witness-name}/voters",{"witness-name":e,"page-size":r,page:t,sort:n,direction:i},void 0,void 0,o),enabled:!!e,staleTime:6e4})}function HI(e){return reactQuery.queryOptions({queryKey:c.witnesses.voterCount(e),queryFn:async()=>await ee("hafbe","/witnesses/{witness-name}/voters/count",{"witness-name":e}),enabled:!!e,staleTime:6e4})}var td=(h=>(h[h.CHECKIN=10]="CHECKIN",h[h.LOGIN=20]="LOGIN",h[h.CHECKIN_EXTRA=30]="CHECKIN_EXTRA",h[h.POST=100]="POST",h[h.COMMENT=110]="COMMENT",h[h.VOTE=120]="VOTE",h[h.REBLOG=130]="REBLOG",h[h.DELEGATION=150]="DELEGATION",h[h.REFERRAL=160]="REFERRAL",h[h.COMMUNITY=170]="COMMUNITY",h[h.TRANSFER_SENT=998]="TRANSFER_SENT",h[h.TRANSFER_INCOMING=999]="TRANSFER_INCOMING",h[h.MINTED=991]="MINTED",h[h.BURNED=997]="BURNED",h))(td||{});async function nd(e,t){if(!e)throw new Error("[SDK][Points][Claim] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][Points][Claim] \u2013 access token wasn't found");let n=await w()(d.privateApiHost+"/private-api/points-claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})}),i=(n.headers.get("content-type")??"").split(";")[0].trim().toLowerCase(),o=await n.text();if(!n.ok){if(n.status===406)try{return JSON.parse(o)}catch{return {message:o,code:n.status}}let s=o&&i.includes("json")?`: ${o.slice(0,200)}`:"";throw new Error(`[SDK][Points][Claim] \u2013 failed with status ${n.status}${s}`)}if(!i.includes("json"))throw new Error(`[SDK][Points][Claim] \u2013 expected JSON but received "${i||"empty"}" response (status ${n.status})`);try{return JSON.parse(o)}catch{throw new Error(`[SDK][Points][Claim] \u2013 malformed JSON response (status ${n.status})`)}}function GI(e,t,r,n){let{mutateAsync:i}=$e.useRecordActivity(e,"points-claimed");return reactQuery.useMutation({mutationFn:()=>nd(e,t),onError:n,onSuccess:()=>{i(),b().setQueryData(lt(e).queryKey,o=>o&&{...o,points:(parseFloat(o.points)+parseFloat(o.uPoints)).toFixed(3),uPoints:"0"}),r?.();}})}var po=/(^|\s)author:([^\s]+)/g,lo=/(^|\s)type:([^\s]+)/g,fo=/(^|\s)category:([^\s]+)/g,mo=/(^|\s)tag:([^\s]+)/g;var yo=(n=>(n.ALL="",n.POST="post",n.COMMENT="comment",n))(yo||{}),JI=5,YI=100;function ho(e){return e.trim().split(/\s+/)[0]??""}function id(e){return ho(e).replace(/^@+/,"").toLowerCase()}function od(e){return ho(e).replace(/^#+/,"").toLowerCase()}function sd(e){let t=new Set;return e.split(/[\s,]+/).map(r=>r.replace(/^#+/,"").toLowerCase()).filter(r=>r===""||t.has(r)?false:(t.add(r),true))}function XI({search:e="",author:t="",type:r="",category:n="",tags:i=[]}){let o=e.trim().replace(/\s+/g," "),s=id(t),a=od(n),u=sd(Array.isArray(i)?i.join(","):i),p=[o];return s&&p.push(`author:${s}`),r&&p.push(`type:${r}`),a&&p.push(`category:${a}`),u.length>0&&p.push(`tag:${u.join(",")}`),{q:p.filter(l=>l!=="").join(" "),search:o,author:s,type:r,category:a,tags:u}}var go=class{query="";search="";author="";type="";category="";tags=[];constructor(t){this.query=t,this.search=t,this.grabAuthor(),this.grabType(),this.grabCategory(),this.grabTags(),this.grabSearch();}grab=t=>{let r=[...this.query.matchAll(t)];return r.length>0?r[0][2].trim():""};grabAuthor=()=>{this.author=this.grab(po);};grabType=()=>{let t=this.grab(lo);Object.values(yo).includes(t)&&(this.type=t);};grabCategory=()=>{this.category=this.grab(fo);};grabTags=()=>{let t=new Set;this.tags=[...this.query.matchAll(mo)].flatMap(r=>r[2].split(",")).map(r=>r.trim()).filter(r=>r===""||t.has(r)?false:(t.add(r),true));};grabSearch=()=>{for([po,lo,fo,mo].forEach(t=>{this.search=this.search.replace(t,"$1");});this.search.indexOf(" ")!==-1;)this.search=this.search.replace(" "," ");this.search=this.search.trim();}};async function ve(e,t){let n=await(async()=>{let i;try{i=await e.text();}catch{return}if(i!=="")try{return JSON.parse(i)}catch{return e.ok?void 0:i}})();if(!e.ok){let i=new Error(`Request failed with status ${e.status}`);throw i.status=e.status,i.data=n,i}if(n===void 0||t!==void 0&&!t(n))throw new Error("Response body was empty, invalid JSON, or not the expected shape");return n}function Ee(e){return typeof e=="object"&&e!==null&&Array.isArray(e.results)}var cd=reactQuery.isServer?0:3;function dt(e,t){let{status:r}=t,n=r===408||r===429;return r!==void 0&&r>=400&&r<500&&!n?false:e{let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let u=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(u,Ee)},retry:dt})}function uD(e,t,r=true){return reactQuery.infiniteQueryOptions({queryKey:c.search.controversialRising(e,t),initialPageParam:{sid:void 0,hasNextPage:true},queryFn:async({pageParam:n,signal:i})=>{if(!n.hasNextPage)return {hits:0,took:0,results:[]};let o,s=new Date;switch(t){case "today":o=new Date(s.getTime()-1440*60*1e3);break;case "week":o=new Date(s.getTime()-10080*60*1e3);break;case "month":o=new Date(s.getTime()-720*60*60*1e3);break;case "year":o=new Date(s.getTime()-365*24*60*60*1e3);break;default:o=void 0;}let a="* type:post",u=e==="rising"?"children":e,p=o?o.toISOString().split(".")[0]:void 0,l="0",f=t==="today"?50:200,m={q:a,sort:u,hide_low:l};p&&(m.since=p),n.sid&&(m.scroll_id=n.sid),(m.votes=f);let y=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(m),signal:we(_e,i)});return ve(y,Ee)},getNextPageParam:n=>({sid:n?.scroll_id,hasNextPage:n.results.length>0}),enabled:r,retry:dt})}async function fD(e,t,r,n,i,o,s){let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let p=await w()(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(p,Ee)}async function wo(e,t,r=_e){let i=await w()(d.privateApiHost+"/search-api/similar",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(e),signal:we(r,t)});return ve(i,Ee)}async function mD(e,t){let n=await w()(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e}),signal:we(_e,t)}),i=await ve(n,Array.isArray);return i?.length>0?i:[e]}var dd=4368*60*60*1e3,fd=4,md=3e3,gd=2e3,yd=4e3,_D=2;function hd(e,t){return e.replace(/!\[[^\]]*\]\([^)]*\)/g," ").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim().slice(0,t)}function wd(e){let t=5381;for(let r=0;r>>0).toString(36)}function bD(e){let t=e.title??"",r=e.json_metadata?.tags,n=(Array.isArray(r)?r:[]).filter(s=>typeof s=="string"&&s!==""),i=hd(e.body??"",md),o=wd(`${t}|${n.join(",")}|${i}`);return reactQuery.queryOptions({queryKey:c.search.similarEntries(e.author,e.permlink,o),queryFn:async({signal:s})=>{let a=new Date(Date.now()-dd).toISOString().slice(0,19),u=await wo({author:e.author,permlink:e.permlink,title:t,body:i,tags:n,since:a},s,typeof window>"u"?gd:yd),p=[],l=new Set;for(let f of u.results){if(p.length>=fd)break;f.permlink!==e.permlink&&(f.tags??[]).indexOf("nsfw")===-1&&(l.has(f.author)||(l.add(f.author),p.push(f)));}return p},staleTime:300*1e3,retry:false})}function ED(e,t=5){let r=e.trim();return reactQuery.queryOptions({queryKey:c.search.account(r,t),queryFn:async()=>{let n=await g("condenser_api.lookup_accounts",[r,t]);return n.length===0?[]:Ct(n)},enabled:!!r})}function RD(e,t=10){let r=e.trim();return reactQuery.queryOptions({queryKey:c.search.topics(r,t),queryFn:async()=>(await g("condenser_api.get_trending_tags",[r,t+1])).map(i=>i.name).filter(i=>i!==""&&!i.startsWith("hive-")).slice(0,t),enabled:!!r})}function BD(e,t,r,n,i,o){return reactQuery.infiniteQueryOptions({queryKey:c.search.api(e,t,r,n,i,o),queryFn:async({pageParam:s,signal:a})=>{let u={q:e,sort:t,hide_low:r};n&&(u.since=n),s&&(u.scroll_id=s),i!==void 0&&(u.votes=i),o&&(u.include_nsfw=1);let p=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(u),signal:we(_e,a)});return ve(p,Ee)},initialPageParam:void 0,getNextPageParam:s=>s?.scroll_id,enabled:!!e,retry:dt})}function HD(e){return reactQuery.queryOptions({queryKey:["search","path",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e})});if(!t.ok)throw new Error(`Search path failed: ${t.status}`);let r=await t.json();return r?.length>0?r:[e]}})}async function Od(e){let r=await w()(d.privateApiHost+"/private-api/support-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to fetch support settings: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function LD(e,t){let r=e?.replace("@","");return reactQuery.queryOptions({queryKey:c.support.settings(r),queryFn:()=>{if(!t)throw new Error("[SDK][Support] missing auth");return Od(t)},enabled:!!r&&!!t})}async function Sd(e,t){let n=await w()(d.privateApiHost+"/private-api/support-settings-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,beneficiary_percent:t.beneficiary_percent,curation_percent:t.curation_percent})});if(!n.ok){let i;try{i=await n.json();}catch{}let o=i?.message??`Failed to update support settings: ${n.status}`,s=new Error(o);throw s.status=n.status,s.data=i,s}return await n.json()}function kd(e,t,r){return e.setQueryData(c.support.settings(t),r),e.invalidateQueries({queryKey:c.support.settings(t)})}function JD(e,t){let r=reactQuery.useQueryClient(),n=e?.replace("@","");return reactQuery.useMutation({mutationKey:["support","settings-update",n],mutationFn:async i=>{if(!n||!t)throw new Error("[SDK][Support] missing auth");return Sd(t,i)},onSuccess(i){n&&kd(r,n,i);}})}function eK(e){return reactQuery.queryOptions({queryKey:["promotions","boost-plus-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/boost-plus-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch boost plus prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function iK(e){return reactQuery.queryOptions({queryKey:["promotions","rc-delegation-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/rc-delegation-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch RC delegation prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function cK(e,t){return reactQuery.queryOptions({queryKey:["promotions","rc-delegation-active",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/rc-delegation-active",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,username:e})});if(!r.ok)throw new Error(`Failed to fetch RC delegation active: ${r.status}`);let n=await r.json();return n&&n.expires&&n.user?{user:n.user,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function dK(e){return reactQuery.queryOptions({queryKey:["promotions","promote-price"],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/promote-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch promote prices: ${t.status}`);return await t.json()},enabled:!!e})}function yK(e,t){return reactQuery.queryOptions({queryKey:["promotions","boost-plus-accounts",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/boosted-plus-account",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:e})});if(!r.ok)throw new Error(`Failed to fetch boost plus account prices: ${r.status}`);let n=await r.json();return n?{account:n.account,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function bK(e,t,r){return v(["promotions","boost-plus"],e,({account:n,duration:i})=>[Br(e,n,i)],async(n,{account:i})=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.promotions.boostPlusAccounts(i)]);},t,"active",{broadcastMode:r})}function OK(e,t,r){return v(["promotions","rc-delegation"],e,({duration:n})=>[Mr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.resourceCredits.account(e),["promotions","rc-delegation-active",e]]);},t,"active",{broadcastMode:r})}async function SK(e){let r=await w()(d.privateApiHost+"/auth-api/hs-token-refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let i;try{i=await r.json();}catch{i=void 0;}let o=new Error(`Failed to refresh token: ${r.status}`);throw o.status=r.status,o.data=i,o}return await r.json()}var Dd="https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt";function RK(){return reactQuery.queryOptions({queryKey:c.badActors.list(),queryFn:async({signal:e})=>{let t=await fetch(Dd,{signal:e});if(!t.ok)throw new Error(`Failed to fetch bad actors list: ${t.status}`);let r=await t.text();return new Set(r.split(` `).filter(Boolean))},staleTime:1440*60*1e3,gcTime:1/0})}var qK=1.1,Kd=(r=>(r.NUMBER_OF_VOTES="number_of_votes",r.TOKENS="tokens",r))(Kd||{});function IK(e){return e?e.map((t,r)=>({choice_num:r+1,choice_text:t,votes:{total_votes:0,hive_hp:0,hive_proxied_hp:0,hive_hp_incl_proxied:0}})):[]}function Nd(e){let t=e.poll_choices??[],r=e.poll_voters??[],n=e.poll_stats,i=t.map(a=>{let u=a.votes;return {choice_num:a.choice_num??0,choice_text:a.choice_text??"",votes:u?{total_votes:u.total_votes??0,hive_hp:u.hive_hp,hive_proxied_hp:u.hive_proxied_hp,hive_hp_incl_proxied:u.hive_hp_incl_proxied??null}:void 0}}),o=r.map(a=>({name:a.name??"",choices:a.choices??[],hive_hp:a.hive_hp,hive_proxied_hp:a.hive_proxied_hp,hive_hp_incl_proxied:a.hive_hp_incl_proxied})),s=n?{total_voting_accounts_num:n.total_voting_accounts_num??0,total_hive_hp:n.total_hive_hp,total_hive_proxied_hp:n.total_hive_proxied_hp,total_hive_hp_incl_proxied:n.total_hive_hp_incl_proxied??null}:void 0;return {author:e.author??"",permlink:e.permlink??"",question:e.question??"",poll_choices:i,poll_voters:o,poll_stats:s,poll_trx_id:e.poll_trx_id??"",status:e.status??"",end_time:e.end_time??"",preferred_interpretation:e.preferred_interpretation??"number_of_votes",max_choices_voted:e.max_choices_voted??1,filter_account_age_days:e.filter_account_age_days??0,protocol_version:e.protocol_version??0,created:e.created??"",post_title:e.post_title??"",post_body:e.post_body??"",parent_permlink:e.parent_permlink??"",tags:e.tags??[],image:e.image??[],token:e.token,community_membership:e.community_membership,allow_vote_changes:e.allow_vote_changes,ui_hide_res_until_voted:e.ui_hide_res_until_voted??false,platform:e.platform}}function NK(e,t){return reactQuery.queryOptions({queryKey:c.polls.details(e??"",t??""),enabled:!!e&&!!t,gcTime:reactQuery.isServer?jn:1800*1e3,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Polls] \u2013 missing author or permlink");let r=w(),n=`${d.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(e)}&permlink=eq.${encodeURIComponent(t)}`,i=await r(n);if(!i.ok)throw new Error(`[SDK][Polls] \u2013 fetch failed: ${i.status}`);let o=await i.json();if(!Array.isArray(o)||!o[0])throw new Error("[SDK][Polls] \u2013 no poll data found");return Nd(o[0])}})}function UK(e,t,r){return v(c.polls.vote(),e??"",({pollTrxId:n,choices:i})=>{if(!e)throw new Error("[SDK][Polls] Cannot vote without an authenticated username");return [["custom_json",{id:"polls",required_auths:[],required_posting_auths:[e],json:JSON.stringify({poll:n,action:"vote",choices:i})}]]},void 0,t,"posting",{broadcastMode:r??"async"})}/** * @license bytebuffer.ts (c) 2015 Daniel Wirtz * Backing buffer: ArrayBuffer, Accessor: DataView diff --git a/packages/sdk/dist/node/index.cjs.map b/packages/sdk/dist/node/index.cjs.map index 286bbbfb84..089ea4e8e3 100644 --- a/packages/sdk/dist/node/index.cjs.map +++ b/packages/sdk/dist/node/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/hive-tx/helpers/ByteBuffer.ts","../../src/hive-tx/config.ts","../../src/hive-tx/helpers/Signature.ts","../../src/hive-tx/helpers/PublicKey.ts","../../src/hive-tx/helpers/Asset.ts","../../src/hive-tx/helpers/HexBuffer.ts","../../src/hive-tx/helpers/serializer.ts","../../src/hive-tx/helpers/sleep.ts","../../src/hive-tx/helpers/call.ts","../../src/hive-tx/Transaction.ts","../../src/hive-tx/helpers/PrivateKey.ts","../../src/hive-tx/helpers/aes.ts","../../src/hive-tx/helpers/deserializer.ts","../../src/hive-tx/helpers/memo.ts","../../src/hive-tx/helpers/utils.ts","../../src/modules/core/hive-tx.ts","../../src/modules/core/errors/chain-errors.ts","../../src/modules/core/mutations/use-broadcast-mutation.ts","../../src/modules/core/mutations/broadcast-json.ts","../../src/modules/core/mutations/invalidate-after-broadcast.ts","../../src/modules/core/abort-signal.ts","../../src/modules/core/config.ts","../../src/modules/core/queries-manager.ts","../../src/modules/core/utils/decoder-encoder.ts","../../src/modules/core/utils/parse-asset.ts","../../src/modules/core/utils/get-bound-fetch.ts","../../src/modules/core/utils/is-community.ts","../../src/modules/core/utils/pagination-helpers.ts","../../src/modules/core/utils/vests-to-hp.ts","../../src/modules/core/utils/is-empty-date.ts","../../src/modules/core/queries/get-dynamic-props-query-options.ts","../../src/modules/core/queries/get-reward-fund-query-options.ts","../../src/modules/core/query-keys.ts","../../src/modules/ai/queries/get-ai-generate-price-query-options.ts","../../src/modules/ai/queries/get-ai-assist-price-query-options.ts","../../src/modules/ai/queries/get-ai-transcribe-price-query-options.ts","../../src/modules/ai/mutations/use-generate-image.ts","../../src/modules/ai/mutations/use-ai-assist.ts","../../src/modules/ai/mutations/use-ai-transcribe.ts","../../src/modules/accounts/queries/get-account-full-query-options.ts","../../src/modules/accounts/utils/profile-metadata.ts","../../src/modules/accounts/utils/parse-accounts.ts","../../src/modules/accounts/queries/get-accounts-query-options.ts","../../src/modules/accounts/queries/get-follow-count-query-options.ts","../../src/modules/accounts/queries/get-followers-query-options.ts","../../src/modules/accounts/queries/get-following-query-options.ts","../../src/modules/accounts/queries/get-muted-users-query-options.ts","../../src/modules/accounts/queries/lookup-accounts-query-options.ts","../../src/modules/accounts/queries/search-accounts-by-username-query-options.ts","../../src/modules/accounts/queries/check-username-wallets-pending-query-options.ts","../../src/modules/accounts/queries/get-relationship-between-accounts-query-options.ts","../../src/modules/accounts/queries/get-account-subscriptions-query-options.ts","../../src/modules/accounts/queries/get-bookmarks-query-options.ts","../../src/modules/accounts/queries/get-favorites-query-options.ts","../../src/modules/accounts/queries/check-favorite-query-options.ts","../../src/modules/accounts/queries/get-account-recoveries-query-options.ts","../../src/modules/accounts/queries/get-account-pending-recovery-query-options.ts","../../src/modules/accounts/queries/get-account-reputations-query-options.ts","../../src/modules/accounts/queries/get-transactions-infinite-query-options.ts","../../src/modules/accounts/queries/get-bots-query-options.ts","../../src/modules/accounts/queries/get-referrals-infinite-query-options.ts","../../src/modules/accounts/queries/get-referrals-stats-query-options.ts","../../src/modules/accounts/queries/get-friends-infinite-query-options.ts","../../src/modules/accounts/queries/get-search-friends-query-options.ts","../../src/modules/posts/queries/get-trending-tags-query-options.ts","../../src/modules/posts/queries/get-trending-tags-with-stats-query-options.ts","../../src/modules/posts/queries/get-fragments-query-options.ts","../../src/modules/posts/queries/get-promoted-posts-query-options.ts","../../src/modules/posts/queries/get-entry-active-votes-query-options.ts","../../src/modules/posts/queries/get-user-post-vote-query-options.ts","../../src/modules/posts/queries/get-content-query-options.ts","../../src/modules/posts/queries/get-content-replies-query-options.ts","../../src/modules/posts/queries/get-post-header-query-options.ts","../../src/modules/posts/utils/filter-dmca-entries.ts","../../src/modules/bridge/verify-on-alternate-node.ts","../../src/modules/posts/queries/get-post-query-options.ts","../../src/modules/bridge/requests.ts","../../src/modules/posts/queries/get-discussions-query-options.ts","../../src/modules/posts/queries/get-account-posts-query-options.ts","../../src/modules/posts/queries/get-posts-ranked-query-options.ts","../../src/modules/posts/queries/get-reblogs-query-options.ts","../../src/modules/posts/queries/get-reblogged-by-query-options.ts","../../src/modules/posts/queries/get-schedules-query-options.ts","../../src/modules/posts/queries/get-drafts-query-options.ts","../../src/modules/posts/queries/get-images-query-options.ts","../../src/modules/posts/queries/get-comment-history-query-options.ts","../../src/modules/posts/queries/get-deleted-entry-query-options.ts","../../src/modules/posts/queries/get-post-tips-query-options.ts","../../src/modules/posts/utils/waves-helpers.ts","../../src/modules/posts/queries/get-waves-feed-query-options.ts","../../src/modules/posts/queries/get-shorts-feed-query-options.ts","../../src/modules/posts/queries/get-waves-by-host-query-options.ts","../../src/modules/posts/queries/get-waves-by-tag-query-options.ts","../../src/modules/posts/queries/get-waves-following-query-options.ts","../../src/modules/posts/queries/get-waves-trending-tags-query-options.ts","../../src/modules/posts/queries/get-waves-by-account-query-options.ts","../../src/modules/posts/queries/get-waves-trending-authors-query-options.ts","../../src/modules/posts/queries/get-normalize-post-query-options.ts","../../src/modules/accounts/queries/get-account-vote-history-infinite-query-options.ts","../../src/modules/accounts/queries/get-profiles-query-options.ts","../../src/modules/accounts/queries/get-balance-history-query-options.ts","../../src/modules/accounts/queries/get-aggregated-balance-query-options.ts","../../src/modules/accounts/queries/get-pro-members-query-options.ts","../../src/modules/accounts/mutations/use-account-update.ts","../../src/modules/accounts/mutations/use-account-relations-update.ts","../../src/modules/operations/builders/content.ts","../../src/modules/operations/builders/wallet.ts","../../src/modules/operations/builders/social.ts","../../src/modules/operations/builders/governance.ts","../../src/modules/operations/builders/community.ts","../../src/modules/operations/builders/market.ts","../../src/modules/operations/builders/account.ts","../../src/modules/operations/builders/ecency.ts","../../src/modules/accounts/mutations/use-follow.ts","../../src/modules/accounts/mutations/use-unfollow.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-add.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-delete.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-add.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-delete.ts","../../src/modules/accounts/mutations/use-account-update-key-auths.ts","../../src/modules/accounts/mutations/use-account-update-password.ts","../../src/modules/accounts/mutations/use-account-revoke-posting.ts","../../src/modules/accounts/mutations/use-account-update-recovery.ts","../../src/modules/accounts/mutations/build-revoke-keys-op.ts","../../src/modules/accounts/mutations/use-account-revoke-key.ts","../../src/modules/accounts/mutations/use-claim-account.ts","../../src/modules/accounts/mutations/use-grant-posting-permission.ts","../../src/modules/accounts/mutations/use-create-account.ts","../../src/modules/accounts/utils/account-power.ts","../../src/modules/operations/authority-map.ts","../../src/modules/operations/mutations/sign-operation-by-key.ts","../../src/modules/operations/mutations/sign-operation-by-keychain.ts","../../src/modules/operations/mutations/sign-operation-by-hivesigner.ts","../../src/modules/operations/queries/get-chain-properties-query-options.ts","../../src/modules/posts/utils/fragment-cache-helpers.ts","../../src/modules/posts/mutations/add-fragment.ts","../../src/modules/posts/mutations/edit-fragment.ts","../../src/modules/posts/mutations/remove-fragment.ts","../../src/modules/private-api/requests.ts","../../src/modules/posts/mutations/use-add-draft.ts","../../src/modules/posts/mutations/use-update-draft.ts","../../src/modules/posts/mutations/use-delete-draft.ts","../../src/modules/posts/mutations/use-add-schedule.ts","../../src/modules/posts/mutations/use-delete-schedule.ts","../../src/modules/posts/mutations/use-move-schedule.ts","../../src/modules/posts/mutations/use-add-image.ts","../../src/modules/posts/mutations/use-delete-image.ts","../../src/modules/posts/mutations/use-upload-image.ts","../../src/modules/posts/cache/entries-cache-management.ts","../../src/modules/posts/mutations/use-vote.ts","../../src/modules/posts/mutations/use-reblog.ts","../../src/modules/posts/mutations/use-comment.ts","../../src/modules/posts/cache/discussions-cache-utils.ts","../../src/modules/posts/mutations/use-delete-comment.ts","../../src/modules/posts/mutations/use-cross-post.ts","../../src/modules/posts/mutations/use-update-reply.ts","../../src/modules/posts/mutations/use-promote.ts","../../src/modules/posts/utils/validate-post-creating.ts","../../src/modules/analytics/mutations/index.ts","../../src/modules/analytics/mutations/use-record-activity.ts","../../src/modules/analytics/queries/get-discover-leaderboard-query-options.ts","../../src/modules/analytics/queries/get-discover-curation-query-options.ts","../../src/modules/analytics/queries/get-page-stats-query-options.ts","../../src/modules/integrations/3speak/functions/beneficiary.ts","../../src/modules/integrations/3speak/queries/index.ts","../../src/modules/integrations/hivesigner/queries/index.ts","../../src/modules/integrations/hivesigner/queries/get-decode-memo-query-options.ts","../../src/modules/integrations/hivesigner/index.ts","../../src/modules/integrations/3speak/queries/get-account-token-query-options.ts","../../src/modules/integrations/3speak/queries/get-account-videos-query-options.ts","../../src/modules/integrations/3speak/index.ts","../../src/modules/integrations/hiveposh/queries/get-hiveposh-links-query-options.ts","../../src/modules/integrations/plausible/queries/get-stats-query-options.ts","../../src/modules/resource-credits/queries/get-rc-stats-query-options.ts","../../src/modules/resource-credits/queries/get-account-rc-query-options.ts","../../src/modules/resource-credits/utils/estimate-rc-precheck.ts","../../src/modules/games/queries/game-status-check-query-options.ts","../../src/modules/games/mutations/game-claim.ts","../../src/modules/quests/queries/get-quests-query-options.ts","../../src/modules/quests/catalog.ts","../../src/modules/quests/mutations/buy-streak-freeze.ts","../../src/modules/communities/mutations/use-subscribe-community.ts","../../src/modules/communities/mutations/use-unsubscribe-community.ts","../../src/modules/communities/mutations/use-mute-post.ts","../../src/modules/communities/mutations/use-set-community-role.ts","../../src/modules/communities/mutations/use-update-community.ts","../../src/modules/communities/mutations/use-register-community-rewards.ts","../../src/modules/communities/mutations/use-pin-post.ts","../../src/modules/communities/queries/get-communities-query-options.ts","../../src/modules/communities/queries/get-community-context-query-options.ts","../../src/modules/communities/queries/get-community-query-options.ts","../../src/modules/communities/queries/get-community-subscribers-query-options.ts","../../src/modules/communities/queries/get-account-notifications-infinite-query-options.ts","../../src/modules/communities/queries/get-rewarded-communities-query-options.ts","../../src/modules/communities/types/community.ts","../../src/modules/communities/utils/index.ts","../../src/modules/notifications/queries/get-notifications-unread-count-query-options.ts","../../src/modules/notifications/queries/get-notifications-infinite-query-options.ts","../../src/modules/notifications/enums/notification-filter.ts","../../src/modules/notifications/enums/notify-types.ts","../../src/modules/notifications/queries/get-notifications-settings-query-options.ts","../../src/modules/notifications/queries/get-announcements-query-options.ts","../../src/modules/notifications/queries/get-spotlights-query-options.ts","../../src/modules/notifications/mutations/use-mark-notifications-read.ts","../../src/modules/notifications/mutations/use-set-last-read.ts","../../src/modules/proposals/queries/get-proposal-query-options.ts","../../src/modules/proposals/queries/get-proposals-query-options.ts","../../src/modules/proposals/queries/get-proposal-votes-query-options.ts","../../src/modules/proposals/queries/get-user-proposal-votes-query-options.ts","../../src/modules/proposals/mutations/use-proposal-vote.ts","../../src/modules/proposals/mutations/use-proposal-create.ts","../../src/modules/wallet/queries/get-vesting-delegations-query-options.ts","../../src/modules/wallet/queries/get-account-delegations-query-options.ts","../../src/modules/wallet/queries/get-vesting-delegation-expirations-query-options.ts","../../src/modules/wallet/queries/get-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-collateralized-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-savings-withdraw-from-query-options.ts","../../src/modules/wallet/queries/get-withdraw-routes-query-options.ts","../../src/modules/wallet/queries/get-open-orders-query-options.ts","../../src/modules/wallet/queries/get-outgoing-rc-delegations-infinite-query-options.ts","../../src/modules/wallet/queries/get-incoming-rc-query-options.ts","../../src/modules/wallet/queries/get-received-vesting-shares-query-options.ts","../../src/modules/wallet/queries/get-recurrent-transfers-query-options.ts","../../src/modules/wallet/queries/get-portfolio-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-general-info-query-options.ts","../../src/modules/wallet/consts/hive-account-operation-groups.ts","../../src/modules/wallet/consts/hive-operation-list.ts","../../src/modules/wallet/consts/hive-operation-orders.ts","../../src/modules/wallet/queries/get-hive-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-metric-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-withdrawal-routes-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegates-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegatings-query-options.ts","../../src/modules/market/queries/get-order-book-query-options.ts","../../src/modules/market/queries/get-market-statistics-query-options.ts","../../src/modules/market/queries/get-market-history-query-options.ts","../../src/modules/market/queries/get-hive-hbd-stats-query-options.ts","../../src/modules/market/queries/get-market-data-query-options.ts","../../src/modules/market/queries/get-trade-history-query-options.ts","../../src/modules/market/queries/get-feed-history-query-options.ts","../../src/modules/market/queries/get-current-median-history-price-query-options.ts","../../src/modules/market/mutations/use-limit-order-create.ts","../../src/modules/market/mutations/use-limit-order-cancel.ts","../../src/modules/market/requests.ts","../../src/modules/hive-engine/requests.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-balances-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-market-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-metadata-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-transactions-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-metrics-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-unclaimed-rewards-query-options.ts","../../src/modules/hive-engine/queries/get-all-hive-engine-tokens-query-options.ts","../../src/modules/hive-engine/utils/formatted-number.ts","../../src/modules/hive-engine/utils/hive-engine-token.ts","../../src/modules/hive-engine/queries/get-hive-engine-balances-with-usd-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-general-info-query-options.ts","../../src/modules/points/queries/get-points-query-options.ts","../../src/modules/points/queries/get-points-asset-general-info-query-options.ts","../../src/modules/points/queries/get-points-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-account-wallet-asset-info-query-options.ts","../../src/modules/wallet/types/asset-operation.ts","../../src/modules/wallet/mutations/use-transfer.ts","../../src/modules/wallet/mutations/use-transfer-point.ts","../../src/modules/wallet/mutations/use-delegate-vesting-shares.ts","../../src/modules/wallet/mutations/use-set-withdraw-vesting-route.ts","../../src/modules/wallet/mutations/use-transfer-engine-token.ts","../../src/modules/wallet/mutations/use-transfer-to-savings.ts","../../src/modules/wallet/mutations/use-transfer-from-savings.ts","../../src/modules/wallet/mutations/use-transfer-to-vesting.ts","../../src/modules/wallet/mutations/use-withdraw-vesting.ts","../../src/modules/wallet/mutations/use-convert.ts","../../src/modules/wallet/mutations/use-claim-interest.ts","../../src/modules/wallet/mutations/use-claim-rewards.ts","../../src/modules/wallet/mutations/use-delegate-engine-token.ts","../../src/modules/wallet/mutations/use-undelegate-engine-token.ts","../../src/modules/wallet/mutations/use-stake-engine-token.ts","../../src/modules/wallet/mutations/use-unstake-engine-token.ts","../../src/modules/wallet/mutations/use-claim-engine-rewards.ts","../../src/modules/wallet/mutations/use-engine-market-order.ts","../../src/modules/wallet/mutations/use-wallet-operation.ts","../../src/modules/wallet/mutations/use-delegate-rc.ts","../../src/modules/witnesses/mutations/use-witness-vote.ts","../../src/modules/witnesses/mutations/use-witness-proxy.ts","../../src/modules/witnesses/queries/get-witnesses-query-options.ts","../../src/modules/points/types/point-transaction-type.ts","../../src/modules/points/mutations/use-claim-points.ts","../../src/modules/search/query-builder.ts","../../src/modules/search/parse-json-response.ts","../../src/modules/search/retry-policy.ts","../../src/modules/search/queries/get-search-query-options.ts","../../src/modules/search/requests.ts","../../src/modules/search/queries/get-similar-entries-query-options.ts","../../src/modules/search/queries/get-search-account-query-options.ts","../../src/modules/search/queries/get-search-topics-query-options.ts","../../src/modules/search/queries/get-search-api-infinite-query-options.ts","../../src/modules/search/queries/get-search-path-query-options.ts","../../src/modules/support/queries/get-support-settings-query-options.ts","../../src/modules/support/mutations/update-support-settings.ts","../../src/modules/promotions/queries/get-boost-plus-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-active-query-options.ts","../../src/modules/promotions/queries/get-promote-price-query-options.ts","../../src/modules/promotions/queries/get-boost-plus-account-prices-query-options.ts","../../src/modules/promotions/mutations/use-boost-plus.ts","../../src/modules/promotions/mutations/use-rc-delegation.ts","../../src/modules/auth/requests.ts","../../src/modules/bad-actors/queries/get-bad-actors-query-options.ts","../../src/modules/polls/types/poll.ts","../../src/modules/polls/queries/get-poll-query-options.ts","../../src/modules/polls/mutations/use-poll-vote.ts"],"names":["EMPTY_BUFFER","_encoder","_decoder","getEncoder","s","utf8","i","c","next","getDecoder","b","bytes","result","byte","codePoint","ByteBuffer","_ByteBuffer","capacity","littleEndian","buffers","buf","bb","view","offset","buffer","source","value","relative","src","copy","begin","end","target","targetOffset","sourceOffset","sourceLimit","targetRelative","len","current","length","forceCopy","limit","size","str","currentOffset","encoded","lenVarintSize","start","lenResult","lenValue","lenLength","config","sanitizeNodeList","nodes","n","setNodes","validNodes","setRestNodes","valid","setRestNodesByApi","map","api","list","setUserAgent","ua","setResilience","opts","r","bool","v","pos","Signature","_Signature","data","recovery","compressed","string","temp","hexToBytes","bytesToHex","message","sig","secp256k1","PublicKey","_PublicKey","key","prefix","wif","expectedPrefix","bs58","checksum","expectedChecksum","ripemd160","isUint8ArrayEqual","signature","encodePublic","a","Asset","_Asset","amount","symbol","expectedSymbol","amountString","HexBuffer","_HexBuffer","OPERATION_IDS","VoidSerializer","StringSerializer","Int16Serializer","Int64Serializer","UInt8Serializer","UInt16Serializer","UInt32Serializer","UInt64Serializer","BooleanSerializer","StaticVariantSerializer","itemSerializers","id","item","AssetSerializer","asset","precision","DateSerializer","PublicKeySerializer","BinarySerializer","VariableBinarySerializer","FlatMapSerializer","keySerializer","valueSerializer","ArraySerializer","itemSerializer","ObjectSerializer","keySerializers","serializer","error","OptionalSerializer","AuthoritySerializer","BeneficiarySerializer","PriceSerializer","ChainPropertiesSerializer","OperationDataSerializer","operationId","definitions","objectSerializer","OperationSerializers","ProposalUpdateSerializer","OperationSerializer","operation","TransactionSerializer","EncryptedMemoSerializer","Serializer","sleep","ms","resolve","isNodeRuntime","serverIdentityHeaders","RPCError","rpcError","NodeError","node","parseRetryAfterMs","header","secs","dateMs","delta","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","RATE_LIMIT_BASE_MS","RATE_LIMIT_MAX_MS","RATE_LIMIT_STREAK_RESET_MS","MAX_API_FAILURES_BEFORE_COOLDOWN","API_COOLDOWN_MS","HEAD_BLOCK_MAX_AGE_MS","STALE_BLOCK_THRESHOLD","LATENCY_EWMA_ALPHA","LATENCY_MIN_SAMPLES","LATENCY_MAX_AGE_MS","LATENCY_REPROBE_MS","LATENCY_UNPROVEN_PRIOR_MS","LATENCY_SLOW_FAILURE_MS","NodeHealthTracker","h","durationMs","profileKey","apiFail","now","p","elapsedMs","existing","retryAfterMs","hasHeader","cooldown","blockNum","recent","best","healthy","unhealthy","ordered","d","probe","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","HedgeBudget","tokens","rpcHedgeBudget","adaptiveAttemptTimeout","tracker","callerTimeout","explicit","ewma","recordError","e","tryRecordHeadBlock","block","createTimeoutReason","err","createTimeoutSignal","controller","timer","mergeSignals","primary","secondary","onPrimaryAbort","onSecondaryAbort","cleanup","jsonRPCCall","url","params","timeout","shouldRetry","externalSignal","body","tSignal","cleanupTimeout","signal","cleanupMerge","res","jitterDelay","hedgedRpcAttempt","hedgePool","explicitTimeout","deadlineAt","onHedgeFired","validate","reject","done","pendingLegs","hedgeFired","primarySettled","lastError","hedgeTimer","primaryStart","controllers","finish","settle","startLeg","isHedge","merged","legTimeout","primaryWindow","delay","live","callRPC","retry","ceiling","deadline","triedInRound","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","restProfileKey","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","restSignal","restCleanup","restCallStart","response","callWithQuorum","quorum","allNodes","arr","j","currentBatchSize","allResults","batchNodes","promises","batchResults","consensusResult","findConsensus","results","resultGroups","consensusGroup","group","chainId","Transaction","_Transaction","options","operationName","operationBody","keys","digest","txId","checkStatus","maxPollAttempts","status","transactionData","sha256","expiration","props","refBlockPrefix","expirationIso","NETWORK_ID","PrivateKey","_PrivateKey","decodePrivate","seed","username","password","role","rv","encodePrivate","publicKey","sha512","doubleSha256","input","encodedKey","checksumVerify","encrypt","privateKey","nonce","uniqueNonce","crypt","decrypt","nonceL","S","ebuf","encryptionKey","iv","tag","check","cbuf","check32","cryptoJsDecrypt","cryptoJsEncrypt","messageBuffer","AESCBC","uniqueNonceEntropy","randomPrivateKey","long","entropy","PublicKeyDeserializer","fixedBuf","UInt64Deserializer","UInt32Deserializer","BinaryDeserializer","bCopy","BufferDeserializer","keyDeserializers","obj","deserializer","EncryptedMemoDeserializer","Deserializer","encode","memo","testNonce","checkEncryption","toPrivateObj","toPublicObj","mbuf","memoBuffer","mbuf2","decode","from","to","encrypted","otherpub","encodeTest","plaintext","cyphertext","o","Memo","utils_exports","__export","buildWitnessSetProperties","makeBitMaskFilter","operations","validateUsername","suffix","ref","label","allowedOperations","reduceFunction","low","high","allowedOperation","owner","type","serialize","nobleSha256","isWif","broadcastOperations","ops","tx","op","broadcastOperationsAsync","MANA_REGENERATION_SECONDS","calculateManabar","maxMana","manabar","currentMana","percentage","getVests","account","vests","delegated","received","withdrawRate","alreadyWithdrawn","withdrawVests","calculateVPMana","calculateRCMana","rcAccount","ErrorType","parseChainError","errorDescription","errorMessage","errorCode","errorString","testPattern","pattern","formatError","parsed","shouldTriggerAuthFallback","isResourceCreditsError","isInfoError","isNetworkError","broadcastWithMethod","auth","authority","fetchedKey","fetchedToken","broadcastMode","adapter","token","hs","tokenError","broadcastWithFallback","loginType","hasPostingAuth","selectedMethod","hsError","chain","errors","shouldSkip","skipReason","prefetchedKey","prefetchedToken","skipReasons","errorMessages","useBroadcastMutation","mutationKey","onSuccess","useMutation","payload","postingKey","accessToken","broadcastJson","jjson","BROADCAST_INCLUSION_DELAY_MS","invalidateAfterBroadcast","withTimeoutSignal","timeoutMs","timeoutSignal","ac","onAbort","reason","isDevelopment","getHeliusApiKey","INTERNAL_API_TIMEOUT_MS","SERVER_GC_TIME_MS","queryClientResolver","fallbackQueryClient","resolveQueryClient","QueryClient","CONFIG","client","ConfigManager","setQueryClient","setQueryClientResolver","setPrivateApiHost","host","setClientId","clientId","setDefaultObserver","observer","getValidatedBaseUrl","setPollsApiHost","setImageHost","setHiveNodes","userAgent","analyzeRedosRisk","unboundedRange","match","min","max","testRegexPerformance","regex","adversarialInputs","maxExecutionTime","duration","safeCompileRegex","maxLength","staticAnalysis","compileErr","runtimeTest","setDmcaLists","lists","coerceList","resolved","rejectedTagCount","makeQueryClient","getQueryClient","EcencyQueriesManager","getQueryData","queryKey","getInfiniteQueryData","prefetchQuery","prefetchInfiniteQuery","generateClientServerQuery","useQuery","generateClientServerInfiniteQuery","useInfiniteQuery","encodeObj","decodeObj","dataToParse","Symbol","NaiMap","parseAsset","sval","sp","cachedFetch","getBoundFetch","isCommunity","isWrappedResponse","normalizeToWrappedResponse","vestsToHp","hivePerMVests","isEmptyDate","DYNAMIC_PROPS_REFRESH_MS","getDynamicPropsQueryOptions","queryOptions","QueryKeys","rawGlobalDynamic","rawFeedHistory","rawChainProps","rawRewardFund","rawHardforkProps","totalVestingSharesAmount","totalVestingFundAmount","base","quote","fundRecentClaims","fundRewardBalance","votePowerReserveRate","authorRewardCurve","contentConstant","currentHardforkVersion","lastHardfork","hbdPrintRate","hbdInterestRate","headBlock","totalVestingFund","totalVestingShares","virtualSupply","vestingRewardPercent","accountCreationFee","getRewardFundQueryOptions","fundName","entryPath","author","permlink","filter","startAuthor","startPermlink","activeUsername","sort","order","onlyMeta","hours","usernames","following","mode","followType","query","follower","startFollowing","startFollower","excludeList","accounts","targetUsername","reference","name","communityName","proposalId","voter","q","hideLow","since","scrollId","votes","what","content","includeNsfw","witness","page","pageSize","direction","user","coinType","granularity","onlyEnabled","currency","filterKey","bucketSeconds","seconds","startDate","endDate","coin","vsCurrency","fromTs","toTs","dimensions","metrics","dateRange","gameType","getAiGeneratePriceQueryOptions","getAiAssistPriceQueryOptions","getAiTranscribePriceQueryOptions","makeIdempotencyKey","useGenerateImage","pendingData","useAiAssist","useAiTranscribe","form","isMetadataStripped","hasProfileValues","profile","getAccountFullQueryOptions","bridgeProfile","rows","chainAccount","reread","parseProfileMetadata","stats","follow_stats","reputationValue","DENIED_KEYS","isPlainObject","proto","deepMerge","srcVal","tgtVal","sanitizeTokens","meta","rest","safeMeta","postingJsonMetadata","extractAccountProfile","pickRicherMetadataSnapshot","preferred","fallback","preferredKeys","parsePostingMetadataRoot","buildPostingJsonMetadata","existingPostingJsonMetadata","root","existingProfile","mergedProfile","buildProfileMetadata","profileTokens","_ignoredVersion","profileRest","metadata","parseAccounts","rawAccounts","x","jsonMetadata","getAccountsQueryOptions","getFollowCountQueryOptions","getFollowersQueryOptions","getFollowingQueryOptions","MUTED_USERS_PAGE_SIZE","MUTED_USERS_MAX_PAGES","getMutedUsersQueryOptions","muted","names","lookupAccountsQueryOptions","getSearchAccountsByUsernameQueryOptions","RESERVED_META_KEYS","checkUsernameWalletsPendingQueryOptions","wallets","walletItem","sanitizedMeta","address","showFlag","baseCandidate","metaTokenCandidates","metaSymbol","metaValue","getRelationshipBetweenAccountsQueryOptions","getAccountSubscriptionsQueryOptions","getBookmarksQueryOptions","getBookmarksInfiniteQueryOptions","infiniteQueryOptions","pageParam","json","lastPage","getFavoritesQueryOptions","getFavoritesInfiniteQueryOptions","checkFavoriteQueryOptions","getAccountRecoveriesQueryOptions","getAccountPendingRecoveryQueryOptions","getAccountReputationsQueryOptions","ACCOUNT_OPERATION_GROUPS","ALL_ACCOUNT_OPERATIONS","acc","val","deriveNum","entry","normalizeOpType","restType","isNaiAsset","naiToString","normalizeOpValue","k","getTransactionsInfiniteQueryOptions","operationTypes","nextPage","getBotsQueryOptions","getReferralsInfiniteQueryOptions","maxId","nextMaxId","getReferralsStatsQueryOptions","getFriendsInfiniteQueryOptions","enabled","accountNames","SEARCH_LIMIT","getSearchFriendsQueryOptions","getTrendingTagsQueryOptions","afterTag","tags","getTrendingTagsWithStatsQueryOptions","getFragmentsQueryOptions","getFragmentsInfiniteQueryOptions","getPromotedPostsQuery","getEntryActiveVotesQueryOptions","getUserPostVoteQueryOptions","getContentQueryOptions","getContentRepliesQueryOptions","getPostHeaderQueryOptions","filterDmcaEntry","entryOrEntries","applyFilter","verifyPostOnAlternateNode","getPostQueryOptions","num","cleanPermlink","verified","verifiedEntry","bridgeApiCall","resolvePost","post","resp","getPost","resolvePosts","posts","validatedPosts","validateEntry","getPostsRanked","start_author","start_permlink","getAccountPosts","newEntry","requiredStringProps","prop","validatedEntry","getPostHeader","getDiscussion","validatedResp","getCommunity","getCommunities","last","normalizePost","getSubscriptions","getSubscribers","community","getRelationshipBetweenAccounts","getProfiles","SortOrder","sortDiscussions","discussion","allPayout","absNegative","isPinned","sortOrders","_a","_b","keyA","keyB","sorted","pinnedIndex","pinned","getDiscussionsQueryOptions","resolvedObserver","oldData","newData","optimisticEntries","fetchedPermlinks","missingOptimistic","opt","getDiscussionQueryOptions","getAccountPostsInfiniteQueryOptions","hasNextPage","getAccountPostsQueryOptions","displaySelects","displaySelect","select","orderForDisplay","byCreated","getPostsRankedInfiniteQueryOptions","_options","sanitizedTag","getPostsRankedQueryOptions","getReblogsQueryOptions","getRebloggedByQueryOptions","getSchedulesQueryOptions","getSchedulesInfiniteQueryOptions","getDraftsQueryOptions","getDraftsInfiniteQueryOptions","fetchUserImages","getImagesQueryOptions","getGalleryImagesQueryOptions","getImagesInfiniteQueryOptions","getCommentHistoryQueryOptions","makeEntryPath","cleanAuthor","normalizedAuthor","normalizedPermlink","getDeletedEntryQueryOptions","isValid","history","title","getPostTipsQueryOptions","isEnabled","normalizeContainer","normalizeParent","normalizeWaveEntryFromApi","containerSource","container","parent","toEntryArray","getVisibleFirstLevelThreadItems","discussionItemsRaw","discussionItems","firstLevelItems","parent_author","parent_permlink","mapThreadItemsToWaveEntries","items","DEFAULT_FEED_LIMIT","normalizeParams","fetchWavesFeedPage","containers","cursor","row","getWavesFeedQueryOptions","normalized","getWavesLatestFeedQueryOptions","fetchShortsFeedPage","getShortsFeedQueryOptions","THREAD_CONTAINER_BATCH_SIZE","MAX_CONTAINERS_TO_SCAN","getThreads","scannedContainers","skipContainerId","rpcParams","normalizedContainers","visibleItems","lastContainer","getWavesByHostQueryOptions","DEFAULT_TAG_FEED_LIMIT","getWavesByTagQueryOptions","getWavesFollowingQueryOptions","normalizedUsername","flattened","getWavesTrendingTagsQueryOptions","getWavesByAccountQueryOptions","getWavesTrendingAuthorsQueryOptions","getNormalizePostQueryOptions","isEntry","getDays","createdDate","past","getAccountVoteHistoryInfiniteQueryOptions","filters","dayLimit","historyObj","filtered","entries","firstHistory","getProfilesQueryOptions","getBalanceHistoryInfiniteQueryOptions","getAggregatedBalanceQueryOptions","getProMembersQueryOptions","proMembersSet","members","m","useAccountUpdate","queryClient","useQueryClient","_data","variables","useAccountRelationsUpdate","onError","kind","relationsQuery","actualRelation","buildVoteOp","weight","buildCommentOp","parentAuthor","parentPermlink","buildCommentOptionsOp","maxAcceptedPayout","percentHbd","allowVotes","allowCurationRewards","extensions","buildDeleteCommentOp","buildReblogOp","deleteReblog","buildTransferOp","buildMultiTransferOps","destinations","dest","buildRecurrentTransferOp","recurrence","executions","buildTransferToSavingsOp","buildTransferFromSavingsOp","requestId","buildCancelTransferFromSavingsOp","buildClaimInterestOps","buildTransferToVestingOp","buildWithdrawVestingOp","vestingShares","buildDelegateVestingSharesOp","delegator","delegatee","buildSetWithdrawVestingRouteOp","fromAccount","toAccount","percent","autoVest","buildConvertOp","buildCollateralizedConvertOp","buildEngineOp","contractAction","contractPayload","contractName","buildEngineClaimOp","buildDelegateRcOp","delegatees","maxRc","delegateeArray","buildFollowOp","buildUnfollowOp","buildIgnoreOp","buildUnignoreOp","buildSetLastReadOps","date","lastReadDate","notifyOp","ecencyNotifyOp","buildWitnessVoteOp","approve","buildWitnessProxyOp","proxy","buildProposalCreateOp","creator","buildProposalVoteOp","proposalIds","buildRemoveProposalOp","proposalOwner","buildUpdateProposalOp","dailyPay","subject","buildSubscribeOp","buildUnsubscribeOp","buildSetRoleOp","buildUpdateCommunityOp","buildPinPostOp","pin","buildMutePostOp","notes","mute","buildMuteUserOp","buildFlagPostOp","BuySellTransactionType","OrderIdPrefix","buildLimitOrderCreateOp","amountToSell","minToReceive","fillOrKill","orderId","formatNumber","decimals","buildLimitOrderCreateOpWithType","orderType","idPrefix","expirationStr","formattedAmountToSell","formattedMinToReceive","buildLimitOrderCancelOp","buildClaimRewardBalanceOp","rewardHive","rewardHbd","rewardVests","buildAccountUpdateOp","active","posting","memoKey","buildAccountUpdate2Op","buildAccountCreateOp","newAccountName","fee","buildCreateClaimedAccountOp","buildClaimAccountOp","buildGrantPostingPermissionOp","currentPosting","grantedAccount","weightThreshold","existingIndex","newAccountAuths","newPosting","buildRevokePostingPermissionOp","revokedAccount","buildChangeRecoveryAccountOp","accountToRecover","newRecoveryAccount","buildRequestAccountRecoveryOp","recoveryAccount","newOwnerAuthority","buildRecoverAccountOp","recentOwnerAuthority","buildBoostPlusOp","buildRcDelegationOp","buildPromoteOp","buildPointTransferOp","sender","receiver","normalizedAmount","buildMultiPointTransferOps","destArray","buildCommunityRegistrationOp","buildActiveCustomJsonOp","buildPostingCustomJsonOp","useFollow","_result","useUnfollow","useBookmarkAdd","useBookmarkDelete","bookmarkId","useAccountFavoriteAdd","qc","useAccountFavoriteDelete","listKey","infinitePrefix","checkKey","previousList","f","previousCheck","infiniteQueries","previousInfinite","context","dedupeAndSortKeyAuths","additions","useAccountUpdateKeyAuths","accountData","keepCurrent","currentKey","keysToRevoke","keysToRevokeByAuthority","prepareAuth","keyName","allKeysToRevoke","existingKeys","values","useAccountUpdatePassword","updateKeys","newPassword","currentPassword","useAccountRevokePosting","accountName","ctx","useAccountUpdateRecovery","email","canRevokeFromAuthority","revokingKeyStrs","remainingWeight","sum","accountWeight","buildRevokeKeysOp","revokingKeys","hasAnyKeyInAuth","clone","needsOwnerUpdate","useAccountRevokeKey","revokingKey","useClaimAccount","useGrantPostingPermission","useCreateAccount","HIVE_VOTING_MANA_REGENERATION_SECONDS","HIVE_100_PERCENT","HIVE_VOTE_DUST_THRESHOLD","getEffectiveVests","vesting","vestsToRshares","votingPowerValue","votePerc","hasStableVoteHardfork","dynamicProps","major","minor","stableVoteRshares","reserveRate","effectiveVests","usedMana","mana","votingRshares","totalVests","votingPower","powerRechargeTime","power","downVotingPower","totalShares","elapsed","currentManaPerc","rcPower","votingValue","rShares","OPERATION_AUTHORITY_MAP","getCustomJsonAuthority","customJsonOp","opType","customJson","getProposalAuthority","proposalOp","getOperationAuthority","getRequiredAuthority","highestAuthority","useSignOperationByKey","keyOrSeed","useSignOperationByKeychain","keyType","useSignOperationByHivesigner","callbackUri","getChainPropertiesQueryOptions","applyFragmentUpdate","vars","buildAddedFragment","useAddFragment","newFragment","index","useEditFragment","fragmentId","applyUpdate","fragment","useRemoveFragment","parseJsonResponse","errorData","signUp","referral","captchaToken","subscribeEmail","usrActivity","ty","bl","getNotifications","saveNotificationSetting","system","allows_notify","notify_types","getNotificationSetting","markNotifications","addImage","UPLOAD_HOST","uploadImage","file","fetchApi","formData","uploadImageWithSignature","deleteImage","imageId","addDraft","updateDraft","draftId","deleteDraft","addSchedule","schedule","reblog","deleteSchedule","moveSchedule","getPromotedPost","onboardEmail","friend","dataBody","useAddDraft","useUpdateDraft","useDeleteDraft","_variables","useAddSchedule","useDeleteSchedule","useMoveSchedule","useAddImage","nextCode","effectiveCode","useDeleteImage","prev","img","useUploadImage","getEntryFromCache","setEntryInCache","mutateEntry","updater","updated","EntriesCacheManagement","updateVotes","payout","updateReblogsCount","count","updateRepliesCount","addReply","reply","updateEntries","invalidateEntry","getEntry","isVoteAlreadyReflected","activeVotes","hasVoterRecord","applyVoteCacheUpdate","newVotes","newPayout","useVote","doInvalidate","useReblog","newCount","invalidate","useComment","beneficiaries","sortedBeneficiaries","isPost","activityType","queriesToInvalidate","discussionsAuthor","discussionsPermlink","addOptimisticDiscussionEntry","rootAuthor","rootPermlink","queries","removeOptimisticDiscussionEntry","snapshots","restoreDiscussionSnapshots","updateEntryInCache","updates","previous","restoreEntryInCache","useDeleteComment","_error","useCrossPost","useUpdateReply","usePromote","DEFAULT_VALIDATE_POST_DELAYS","getContent","validatePostCreating","attempts","delays","waitMs","mutations_exports","useRecordActivity","getLocationInfo","locationInfo","domain","getDiscoverLeaderboardQueryOptions","getDiscoverCurationQueryOptions","accountsResponse","element","curator","receivedVestingShares","delegatedVestingShares","vestingWithdrawRate","effectiveVest","getPageStatsQueryOptions","sortedDimensions","sortedMetrics","THREESPEAK_BENEFICIARY_ACCOUNT","THREESPEAK_BENEFICIARY_WEIGHT","hasThreeSpeakEmbed","enforceThreeSpeakBeneficiary","isThreeSpeakBeneficiary","queries_exports","getAccountTokenQueryOptions","getAccountVideosQueryOptions","getDecodeMemoQueryOptions","HiveSignerIntegration","memoQueryOptions","memoDecoded","tokenQueryOptions","ThreeSpeakIntegration","getHivePoshLinksQueryOptions","getStatsQueryOptions","filterBy","getRcStatsQueryOptions","getAccountRcQueryOptions","EMPTY","estimateRcPrecheck","rcStats","avgCost","safeBuffer","estimatedCost","willLikelyFail","getGameStatusCheckQueryOptions","useGameClaim","recordActivity","getQuestsQueryOptions","QUEST_CATALOG","getQuestCatalogEntry","tier","STREAK_FREEZE_PRICE","STREAK_FREEZE_MAX_OWNED","genIdempotencyKey","buyStreakFreezeRequest","useBuyStreakFreeze","useSubscribeCommunity","useUnsubscribeCommunity","useMutePost","useSetCommunityRole","team","idx","useUpdateCommunity","useRegisterCommunityRewards","usePinPost","getCommunitiesQueryOptions","getCommunityContextQueryOptions","getCommunityQueryOptions","SUBSCRIBERS_PAGE_SIZE","fetchSubscribersPage","getCommunitySubscribersQueryOptions","getCommunitySubscribersInfiniteQueryOptions","getAccountNotificationsInfiniteQueryOptions","getRewardedCommunitiesQueryOptions","ROLES","roleMap","getCommunityType","type_id","getCommunityPermissions","communityType","userRole","subscribed","canPost","canComment","isModerator","getNotificationsUnreadCountQueryOptions","getNotificationsInfiniteQueryOptions","NotificationFilter","NotifyTypes","ALL_NOTIFY_TYPES","NotificationViewType","getNotificationsSettingsQueryOptions","initialMuted","getAnnouncementsQueryOptions","getSpotlightsQueryOptions","_accessToken","markNotificationRead","isInfiniteData","useMarkNotificationsRead","previousData","updatedData","unreadKey","currentUnread","unreadCount","useSetLastRead","getProposalQueryOptions","proposal","getProposalsQueryOptions","proposals","expired","getProposalVotesInfiniteQueryOptions","getUserProposalVotesQueryOptions","vote","useProposalVote","useProposalCreate","getVestingDelegationsQueryOptions","fetchLimit","getAccountDelegationsQueryOptions","getVestingDelegationExpirationsQueryOptions","getConversionRequestsQueryOptions","getCollateralizedConversionRequestsQueryOptions","getSavingsWithdrawFromQueryOptions","getWithdrawRoutesQueryOptions","getOpenOrdersQueryOptions","getOutgoingRcDelegationsInfiniteQueryOptions","delegations","delegation","getIncomingRcQueryOptions","getReceivedVestingSharesQueryOptions","getRecurrentTransfersQueryOptions","normalizeString","trimmed","normalizeNumber","direct","parseToken","rawToken","extractTokens","record","resolveUsername","getPortfolioQueryOptions","getHiveAssetGeneralInfoQueryOptions","marketTicker","marketPrice","liquidBalance","savingsBalance","getHbdAssetGeneralInfoQueryOptions","price","getAPR","currentInflationRate","totalVestingFunds","getHivePowerAssetGeneralInfoQueryOptions","delegatedVests","receivedVests","withdrawRateVests","remainingToWithdrawVests","nextWithdrawalVests","hpBalance","outgoingDelegationsHp","incomingDelegationsHp","pendingPowerDownHp","nextPowerDownHp","totalBalance","availableHp","HIVE_ACCOUNT_OPERATION_GROUPS","HIVE_OPERATION_LIST","operationOrders","HIVE_OPERATION_ORDERS","HIVE_OPERATION_NAME_BY_ID","isHiveOperationName","resolveHiveOperationFilters","rawValues","hasAll","uniqueValues","operationIds","filterArgs","getHiveAssetTransactionsQueryOptions","__","pages","pageParams","getHbdAssetTransactionsQueryOptions","getHivePowerAssetTransactionsQueryOptions","userSelectedOperations","hasAllFilter","formatDate","pad","subtractSeconds","getHiveAssetMetricQueryOptions","hive","non_hive","open","_","prevStartDate","getHiveAssetWithdrawalRoutesQueryOptions","getHivePowerDelegatesInfiniteQueryOptions","getHivePowerDelegatingsQueryOptions","getOrderBookQueryOptions","getMarketStatisticsQueryOptions","getMarketHistoryQueryOptions","getHiveHbdStatsQueryOptions","oneDayAgo","dayChange","getMarketDataQueryOptions","getTradeHistoryQueryOptions","getFeedHistoryQueryOptions","getCurrentMedianHistoryPriceQueryOptions","useLimitOrderCreate","useLimitOrderCancel","getMarketData","getCurrencyRate","cur","getCurrencyTokenRate","getCurrencyRates","getHivePrice","ENGINE_RPC_HEADERS","engineRpc","engineRpcSafe","getHiveEngineOrderBook","baseParams","buy","sell","sortByPriceDesc","left","sortByPriceAsc","right","getHiveEngineTradeHistory","getHiveEngineOpenOrders","buyRaw","sellRaw","formatTotal","quantity","getHiveEngineMetrics","symbolQuery","getHiveEngineTokensMarket","getHiveEngineTokensBalances","getHiveEngineTokensMetadata","getHiveEngineTokenTransactions","getHiveEngineTokenMetrics","interval","getHiveEngineUnclaimedRewards","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMarketQueryOptions","getHiveEngineTokensMetadataQueryOptions","getHiveEngineTokenTransactionsQueryOptions","_allPages","lastPageParam","_firstPage","firstPageParam","getHiveEngineTokensMetricsQueryOptions","getHiveEngineUnclaimedRewardsQueryOptions","pending_token","getAllHiveEngineTokensQueryOptions","formattedNumber","fractionDigits","out","av","HiveEngineToken","getHiveEngineBalancesWithUsdQueryOptions","allTokens","balances","t","pricePerHive","providedMetrics","unpricedSymbols","balance","metric","tokenMetadata","lastPrice","balanceAmount","usdValue","getHiveEngineTokenGeneralInfoQueryOptions","hiveQuery","hiveData","metadataList","balanceList","marketList","stakedBalance","unstakingBalance","getPointsQueryOptions","pointsResponse","points","transactionsResponse","transactions","getPointsAssetGeneralInfoQueryOptions","getPointsAssetTransactionsQueryOptions","created","getAccountWalletAssetInfoQueryOptions","fetchQuery","qo","convertPriceToUserCurrency","assetInfo","conversionRate","portfolioQuery","getPortfolioAssetInfo","assetItem","extraItem","dataKey","numValue","portfolioAssetInfo","converted","AssetOperation","useTransfer","useTransferPoint","useDelegateVestingShares","useSetWithdrawVestingRoute","useTransferEngineToken","useTransferToSavings","useTransferFromSavings","useTransferToVesting","useWithdrawVesting","useConvert","useClaimInterest","CLAIM_REWARDS_INVALIDATION_DELAY_MS","pendingInvalidationTimers","useClaimRewards","timerKey","keysToInvalidate","existingTimer","rejected","useDelegateEngineToken","useUndelegateEngineToken","useStakeEngineToken","useUnstakeEngineToken","useClaimEngineRewards","useEngineMarketOrder","buildHiveOperations","buildEngineOperations","getWalletOperationAuthority","useWalletOperation","hiveOps","engineOps","useDelegateRc","useWitnessVote","useWitnessProxy","mapRestWitness","w","getWitnessesInfiniteQueryOptions","getWitnessVotersPageQueryOptions","getWitnessVoterCountQueryOptions","PointTransactionType","claimPointsRequest","contentType","detail","useClaimPoints","author_re","type_re","category_re","tag_re","SearchType","MAX_SEARCH_TAGS","MAX_SEARCH_QUERY_LENGTH","firstToken","normalizeSearchAuthor","normalizeSearchCategory","normalizeSearchTags","seen","buildSearchQuery","search","category","normalizedSearch","normalizedCategory","normalizedTags","part","SearchQuery","_query","re","matches","raw","isSearchResponse","MAX_RETRIES","isServer","searchRetryPolicy","failureCount","isTransient","searchQueryOptions","scroll_id","getControversialRisingInfiniteQueryOptions","sinceDate","similar","searchPath","SIMILAR_ENTRIES_SINCE_MS","SIMILAR_ENTRIES_TARGET","SIMILAR_ENTRIES_BODY_LIMIT","SIMILAR_ENTRIES_SSR_TIMEOUT_MS","SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS","SIMILAR_ENTRIES_MIN_RENDER","toMltExcerpt","fingerprint","getSimilarEntriesQueryOptions","rawTags","contentKey","collected","seenAuthors","getSearchAccountQueryOptions","getSearchTopicsQueryOptions","getSearchApiInfiniteQueryOptions","getSearchPathQueryOptions","getSupportSettingsRequest","getSupportSettingsQueryOptions","updateSupportSettingsRequest","applySupportSettingsUpdate","useUpdateSupportSettings","getBoostPlusPricesQueryOptions","getRcDelegationPricesQueryOptions","getRcDelegationActiveQueryOptions","responseData","getPromotePriceQueryOptions","getBoostPlusAccountPricesQueryOptions","useBoostPlus","useRcDelegation","hsTokenRenew","BAD_ACTORS_URL","getBadActorsQueryOptions","POLLS_PROTOCOL_VERSION","PollPreferredInterpretation","mapMetaChoicesToPollChoices","metaChoices","choice","normalizePoll","pollChoices","pollVoters","rawStats","choices","voters","getPollQueryOptions","usePollVote","pollTrxId"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @license bytebuffer.ts (c) 2015 Daniel Wirtz \n * Backing buffer: ArrayBuffer, Accessor: DataView\n * Released under the Apache License, Version 2.0\n * see: https://github.com/dcodeIO/bytebuffer.ts for details\n * modified by @xmcl/bytebuffer\n * And customized for hive-tx\n */\n\nconst EMPTY_BUFFER = new ArrayBuffer(0)\n\n// Lazy-init to avoid crashing on runtimes that lack TextEncoder/TextDecoder\n// (notably React Native with Hermes). Falls back to manual UTF-8 encode/decode.\nlet _encoder: { encode(s: string): Uint8Array } | null = null\nlet _decoder: { decode(b: BufferSource): string } | null = null\n\nfunction getEncoder(): { encode(s: string): Uint8Array } {\n if (!_encoder) {\n if (typeof TextEncoder !== 'undefined') {\n _encoder = new TextEncoder()\n } else {\n _encoder = {\n encode(s: string): Uint8Array {\n // Manual UTF-8 encode fallback\n const utf8: number[] = []\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i)\n if (c < 0x80) {\n utf8.push(c)\n } else if (c < 0x800) {\n utf8.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {\n const next = s.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n utf8.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n utf8.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n return new Uint8Array(utf8)\n },\n }\n }\n }\n return _encoder\n}\n\nfunction getDecoder(): { decode(b: BufferSource): string } {\n if (!_decoder) {\n if (typeof TextDecoder !== 'undefined') {\n _decoder = new TextDecoder()\n } else {\n _decoder = {\n decode(b: BufferSource): string {\n const bytes = b instanceof ArrayBuffer ? new Uint8Array(b) : new Uint8Array((b as ArrayBufferView).buffer, (b as ArrayBufferView).byteOffset, (b as ArrayBufferView).byteLength)\n let result = ''\n for (let i = 0; i < bytes.length; ) {\n const byte = bytes[i]\n let codePoint: number\n if (byte < 0x80) { codePoint = byte; i += 1 }\n else if ((byte & 0xe0) === 0xc0) { codePoint = ((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f); i += 2 }\n else if ((byte & 0xf0) === 0xe0) { codePoint = ((byte & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f); i += 3 }\n else { codePoint = ((byte & 0x07) << 18) | ((bytes[i + 1] & 0x3f) << 12) | ((bytes[i + 2] & 0x3f) << 6) | (bytes[i + 3] & 0x3f); i += 4 }\n if (codePoint <= 0xffff) { result += String.fromCharCode(codePoint) }\n else { codePoint -= 0x10000; result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff)) }\n }\n return result\n },\n }\n }\n }\n return _decoder\n}\n\nexport class ByteBuffer {\n static LITTLE_ENDIAN = true\n static BIG_ENDIAN = false\n static DEFAULT_CAPACITY = 16\n static DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN\n\n buffer: ArrayBufferLike\n view: DataView\n offset: number\n markedOffset: number\n limit: number\n littleEndian: boolean\n\n constructor(\n capacity: number = ByteBuffer.DEFAULT_CAPACITY,\n littleEndian: boolean = ByteBuffer.DEFAULT_ENDIAN\n ) {\n this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity)\n this.view = capacity === 0 ? new DataView(EMPTY_BUFFER) : new DataView(this.buffer)\n this.offset = 0\n this.markedOffset = -1\n this.limit = capacity\n this.littleEndian = littleEndian\n }\n\n static allocate(capacity?: number, littleEndian?: boolean): ByteBuffer {\n return new ByteBuffer(capacity, littleEndian)\n }\n\n static concat(\n buffers: Array,\n littleEndian?: boolean\n ): ByteBuffer {\n let capacity = 0\n for (let i = 0; i < buffers.length; ++i) {\n const buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n capacity += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n capacity += buf.length\n } else if (buf instanceof ArrayBuffer) {\n capacity += buf.byteLength\n } else if (Array.isArray(buf)) {\n capacity += buf.length\n } else {\n throw TypeError('Illegal buffer')\n }\n }\n\n if (capacity === 0) {\n return new ByteBuffer(0, littleEndian)\n }\n\n const bb = new ByteBuffer(capacity, littleEndian)\n const view = new Uint8Array(bb.buffer)\n let offset = 0\n\n for (let i = 0; i < buffers.length; ++i) {\n let buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n view.set(new Uint8Array(buf.buffer, buf.offset, buf.limit - buf.offset), offset)\n offset += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n view.set(buf, offset)\n offset += buf.length\n } else if (buf instanceof ArrayBuffer) {\n view.set(new Uint8Array(buf), offset)\n offset += buf.byteLength\n } else {\n // Array\n view.set(buf as number[], offset)\n offset += (buf as number[]).length\n }\n }\n\n bb.limit = bb.offset = offset\n bb.offset = 0\n return bb\n }\n\n static wrap(\n buffer: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n littleEndian?: boolean\n ): ByteBuffer {\n if (buffer instanceof ByteBuffer) {\n const bb = buffer.clone()\n bb.markedOffset = -1\n return bb\n }\n\n let bb: ByteBuffer\n if (buffer instanceof Uint8Array) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.length > 0) {\n bb.buffer = buffer.buffer\n bb.offset = buffer.byteOffset\n bb.limit = buffer.byteOffset + buffer.byteLength\n bb.view = new DataView(buffer.buffer)\n }\n } else if (buffer instanceof ArrayBuffer) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.byteLength > 0) {\n bb.buffer = buffer\n bb.offset = 0\n bb.limit = buffer.byteLength\n bb.view = buffer.byteLength > 0 ? new DataView(buffer) : new DataView(EMPTY_BUFFER)\n }\n } else if (Array.isArray(buffer)) {\n bb = new ByteBuffer(buffer.length, littleEndian)\n bb.limit = buffer.length\n new Uint8Array(bb.buffer).set(buffer)\n } else {\n throw TypeError('Illegal buffer')\n }\n\n return bb\n }\n\n writeBytes(\n source: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n offset?: number\n ): ByteBuffer {\n return this.append(source, offset)\n }\n\n writeInt8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setInt8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeByte(value: number, offset?: number): ByteBuffer {\n return this.writeInt8(value, offset)\n }\n\n writeUint8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setUint8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeUInt8(value: number, offset?: number): ByteBuffer {\n return this.writeUint8(value, offset)\n }\n\n readUint8(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint8(offset)\n if (relative) this.offset += 1\n return value\n }\n\n readUInt8(offset?: number): number {\n return this.readUint8(offset)\n }\n\n writeInt16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setInt16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeShort(value: number, offset?: number): ByteBuffer {\n return this.writeInt16(value, offset)\n }\n\n writeUint16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setUint16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeUInt16(value: number, offset?: number): ByteBuffer {\n return this.writeUint16(value, offset)\n }\n\n writeInt32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setInt32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeInt(value: number, offset?: number): ByteBuffer {\n return this.writeInt32(value, offset)\n }\n\n writeUint32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setUint32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeUInt32(value: number, offset?: number): ByteBuffer {\n return this.writeUint32(value, offset)\n }\n\n readUint32(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint32(offset, this.littleEndian)\n if (relative) {\n this.offset += 4\n }\n return value\n }\n\n readUInt32 = this.readUint32\n\n append(source: ByteBuffer | ArrayBuffer | Uint8Array | number[], offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n let src: Uint8Array\n if (source instanceof ByteBuffer) {\n src = new Uint8Array(source.buffer, source.offset, source.limit - source.offset)\n source.offset += src.length\n } else if (source instanceof Uint8Array) {\n src = source\n } else if (source instanceof ArrayBuffer) {\n src = new Uint8Array(source)\n } else {\n src = new Uint8Array(source)\n }\n\n if (src.length <= 0) return this\n\n if (offset + src.length > this.buffer.byteLength) {\n this.resize(offset + src.length)\n }\n\n new Uint8Array(this.buffer).set(src, offset)\n\n if (relative) this.offset += src.length\n return this\n }\n\n clone(copy?: boolean): ByteBuffer {\n const bb = new ByteBuffer(0, this.littleEndian)\n if (copy) {\n bb.buffer = new ArrayBuffer(this.buffer.byteLength)\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer))\n bb.view = new DataView(bb.buffer)\n } else {\n bb.buffer = this.buffer\n bb.view = this.view\n }\n bb.offset = this.offset\n bb.markedOffset = this.markedOffset\n bb.limit = this.limit\n return bb\n }\n\n copy(begin?: number, end?: number): ByteBuffer {\n if (begin === undefined) begin = this.offset\n if (end === undefined) end = this.limit\n\n if (begin === end) {\n return new ByteBuffer(0, this.littleEndian)\n }\n\n const capacity = end - begin\n const bb = new ByteBuffer(capacity, this.littleEndian)\n bb.offset = 0\n bb.limit = capacity\n\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer).subarray(begin, end), 0)\n return bb\n }\n\n copyTo(\n target: ByteBuffer,\n targetOffset?: number,\n sourceOffset?: number,\n sourceLimit?: number\n ): ByteBuffer {\n const targetRelative = typeof targetOffset === 'undefined'\n const relative = typeof sourceOffset === 'undefined'\n targetOffset = targetRelative ? target.offset : targetOffset!\n sourceOffset = relative ? this.offset : sourceOffset!\n sourceLimit = sourceLimit === undefined ? this.limit : sourceLimit\n\n const len = sourceLimit - sourceOffset\n if (len === 0) return target\n\n target.ensureCapacity(targetOffset + len)\n new Uint8Array(target.buffer).set(\n new Uint8Array(this.buffer).subarray(sourceOffset, sourceLimit),\n targetOffset\n )\n\n if (relative) this.offset += len\n if (targetRelative) target.offset += len\n return this\n }\n\n ensureCapacity(capacity: number): ByteBuffer {\n let current = this.buffer.byteLength\n if (current < capacity) {\n return this.resize((current *= 2) > capacity ? current : capacity)\n }\n return this\n }\n\n flip(): ByteBuffer {\n this.limit = this.offset\n this.offset = 0\n return this\n }\n\n resize(capacity: number): ByteBuffer {\n if (this.buffer.byteLength < capacity) {\n const buffer = new ArrayBuffer(capacity)\n new Uint8Array(buffer).set(new Uint8Array(this.buffer))\n this.buffer = buffer\n this.view = new DataView(buffer)\n }\n return this\n }\n\n skip(length: number): ByteBuffer {\n this.offset += length\n return this\n }\n\n writeInt64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigInt64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeLong(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeInt64(value, offset)\n }\n\n readInt64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigInt64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readLong(offset?: number): bigint {\n return this.readInt64(offset)\n }\n\n writeUint64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigUint64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeUInt64(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeUint64(value, offset)\n }\n\n readUint64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigUint64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readUInt64(offset?: number): bigint {\n return this.readUint64(offset)\n }\n\n toBuffer(forceCopy?: boolean): ArrayBufferLike {\n const offset = this.offset\n const limit = this.limit\n if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) {\n return this.buffer\n }\n if (offset === limit) return EMPTY_BUFFER\n return this.buffer.slice(offset, limit)\n }\n\n toArrayBuffer(forceCopy?: boolean): ArrayBufferLike {\n return this.toBuffer(forceCopy)\n }\n\n writeVarint32(value: number, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const size = this.calculateVarint32(value)\n if (offset + size > this.buffer.byteLength) {\n this.resize(offset + size)\n }\n\n value >>>= 0\n while (value >= 0x80) {\n this.view.setUint8(offset++, (value & 0x7f) | 0x80)\n value >>>= 7\n }\n this.view.setUint8(offset++, value)\n\n if (relative) {\n this.offset = offset\n return this\n }\n return size\n }\n\n readVarint32(offset?: number): number | { value: number; length: number } {\n const relative = typeof offset === 'undefined'\n if (typeof offset === 'undefined') {\n offset = this.offset\n }\n let c = 0\n let value = 0 >>> 0\n let b: number\n do {\n b = this.view.getUint8(offset++)\n if (c < 5) {\n value |= (b & 0x7f) << (7 * c)\n }\n ++c\n } while ((b & 0x80) !== 0)\n value |= 0\n\n if (relative) {\n this.offset = offset\n return value\n }\n return { value, length: c }\n }\n\n calculateVarint32(value: number): number {\n value = value >>> 0\n if (value < 1 << 7) return 1\n else if (value < 1 << 14) return 2\n else if (value < 1 << 21) return 3\n else if (value < 1 << 28) return 4\n else return 5\n }\n\n writeVString(str: string, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n let currentOffset = relative ? this.offset : offset!\n\n const encoded = getEncoder().encode(str)\n const len = encoded.length\n const lenVarintSize = this.calculateVarint32(len)\n\n if (currentOffset + lenVarintSize + len > this.buffer.byteLength) {\n this.resize(currentOffset + lenVarintSize + len)\n }\n\n this.writeVarint32(len, currentOffset)\n currentOffset += lenVarintSize\n\n new Uint8Array(this.buffer).set(encoded, currentOffset)\n currentOffset += len\n\n if (relative) {\n this.offset = currentOffset\n return this\n }\n return currentOffset - (offset || 0)\n }\n\n readVString(offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const start = offset\n const lenResult = this.readVarint32(offset) as { value: number; length: number }\n const lenValue = lenResult.value\n const lenLength = lenResult.length\n\n offset += lenLength\n\n // TextDecoder can take Uint8Array view directly\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, lenValue))\n offset += lenValue\n\n if (relative) {\n this.offset = offset\n return str\n } else {\n return {\n string: str,\n length: offset - start\n }\n }\n }\n\n readUTF8String(length: number, offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n // const strBuffer = this.buffer.slice(offset, end)\n // Faster to view if Shared? No, Decoder takes buffer or view.\n // Making a view is cheap.\n // But DataView vs Uint8Array. TextDecoder takes BufferSource (ArrayBuffer or ArrayBufferView).\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, length))\n\n if (relative) {\n this.offset += length\n return str\n } else {\n return {\n string: str,\n length\n }\n }\n }\n}\n","import type { APIMethods } from './api-types'\n\n/**\n * Unified configuration for Hive blockchain connectivity.\n * This is the single source of truth for node endpoints, timeouts, and chain settings.\n * Mutate this object directly or use ConfigManager.setHiveNodes() for validated updates.\n */\nexport const config = {\n /**\n * Array of Hive API node endpoints for load balancing and failover.\n */\n nodes: [\n 'https://api.hive.blog',\n 'https://api.deathwing.me',\n 'https://api.openhive.network',\n 'https://techcoderx.com',\n 'https://api.syncad.com',\n 'https://rpc.mahdiyari.info',\n ],\n\n /**\n * Array of Hive API node endpoints that support REST APIs.\n * Note: Without the trailing /\n */\n restNodes: [\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://api.syncad.com',\n 'https://hiveapi.actifit.io',\n 'https://api.c0ff33a.uk'\n ],\n\n /**\n * Per-API REST node override. Some APIs are served by only a subset of\n * nodes; list just those capable hosts here so callREST never burns its\n * (small) retry budget on nodes that 404/503 the API, and a cold start\n * hits a capable node immediately. Any API not listed falls back to\n * `restNodes`. The health tracker still orders *within* this list.\n *\n * hivesense: empirically only ~2 public nodes serve /hivesense-api (the\n * other configured nodes 404/503 it; Ecency's own was decommissioned), so\n * pin them — otherwise the health tracker keeps rediscovering incapable\n * nodes each cooldown and cold starts waste attempts.\n */\n restNodesByApi: {\n hivesense: ['https://api.hive.blog', 'https://api.syncad.com']\n } as Partial>,\n\n /**\n * User-Agent sent on server-side (Node) HTTP requests to Hive nodes.\n *\n * Node's built-in fetch (undici) sends a bare `User-Agent: node` when none is\n * set, which is indistinguishable from any random Node script in node/CDN\n * analytics. A descriptive value lets operators tell their own SSR/server\n * traffic apart from anonymous scrapers. Only applied in Node — browsers\n * forbid overriding User-Agent (it is silently dropped) and React Native sets\n * its own native UA, so client and mobile traffic are untouched. Override via\n * `ConfigManager.setUserAgent()` (or `setUserAgent()` from `@ecency/sdk/hive`).\n */\n userAgent: 'ecency-sdk',\n\n /**\n * The Hive blockchain chain ID for transaction signing and verification.\n */\n chain_id: 'beeab0de00000000000000000000000000000000000000000000000000000000',\n\n /**\n * Address prefix used for public key formatting (STM for mainnet).\n */\n address_prefix: 'STM',\n\n /**\n * Timeout in milliseconds for read API calls (get_content, get_accounts, etc.).\n * Kept short so the health tracker can fail over to another node quickly.\n */\n timeout: 5_000,\n\n /**\n * Timeout in milliseconds for broadcast API calls.\n * Longer than read timeout because broadcast_transaction_synchronous waits\n * for block inclusion, which depends on the 3-second block interval and\n * network conditions.\n */\n broadcastTimeout: 15_000,\n\n /**\n * Number of retry attempts for failed API calls before throwing an error.\n * Total attempts = retry + 1. With ~7 nodes in the list, a budget of 5\n * means callRPC iterates through 6 distinct nodes before giving up, so a\n * single sick node (or two) can't surface as an unhandled error to the\n * caller while the rest of the list is healthy.\n */\n retry: 5,\n\n /**\n * Tail-latency resilience for READ calls. Motivation: on a shared public-node\n * pool a node can slow down or throttle *mid-request*; a fixed `timeout` means\n * the caller only notices after the full window, and under SSR concurrency\n * those stalled renders pile up. Two mechanisms, both scoped to reads only\n * (broadcasts never hedge and keep their fixed `broadcastTimeout`):\n *\n * - Adaptive per-attempt timeout (`adaptiveTimeout`, default ON): when a\n * node has a usable latency profile (EWMA), the per-attempt timeout becomes\n * `min(callerTimeout, max(floorMs, factor × EWMA))` — a node running far\n * above its own baseline is abandoned early and failover starts sooner.\n * Never *raises* the caller's timeout; unprofiled nodes keep it unchanged.\n *\n * - Hedged requests (`hedge`, default OFF — opt in via `setResilience`): if\n * the primary attempt is still pending after `max(hedgeDelayFloorMs,\n * hedgeDelayFactor × EWMA)`, a duplicate request is fired at the next\n * healthy untried node and the first success wins (the loser is aborted).\n * A token bucket (`hedgeBucketCapacity` burst, refilled by\n * `hedgeRefillPerSuccess` per un-hedged success) caps hedges to roughly\n * `hedgeRefillPerSuccess` of traffic, so only the slow tail hedges — and\n * under pool-wide slowness the bucket drains and hedging auto-disables\n * instead of amplifying load into public-node rate limits.\n */\n resilience: {\n adaptiveTimeout: true,\n adaptiveTimeoutFloorMs: 2_000,\n adaptiveTimeoutFactor: 4,\n hedge: false,\n hedgeDelayFloorMs: 750,\n hedgeDelayFactor: 2,\n hedgeBucketCapacity: 10,\n hedgeRefillPerSuccess: 0.1,\n /**\n * Wall-clock budget for one read call across ALL failover attempts, as a\n * multiple of the per-attempt timeout: no NEW attempt starts past\n * `totalBudgetFactor × timeout` (an in-flight attempt still finishes its\n * own window). Bounds the pathological pool-wide-slowness walk — without\n * it a read could hold its caller for (retry+1) × timeout ≈ 30s, which\n * under SSR concurrency is a memory pile-up, the exact incident this\n * feature exists for. Applies to reads only (callRPC / callREST);\n * broadcasts keep their try-each-node-once semantics.\n */\n totalBudgetFactor: 2\n }\n}\n\n/** Shape of the `config.resilience` bag (see its doc comment). */\nexport type ResilienceOptions = typeof config.resilience\n\n/**\n * Validated setter for the Hive RPC node list — replaces `config.nodes`.\n * Trims, drops non-http(s) entries, and de-dupes (order-preserving). A no-op\n * if nothing valid remains, so a bad input can't empty the list.\n *\n * Lives here, in the React-free `hive-tx` core, on purpose: it must be\n * reachable from BOTH the full `@ecency/sdk` entry (via\n * `ConfigManager.setHiveNodes`, which delegates here) and the lean\n * `@ecency/sdk/hive` server/CLI entry — without dragging react-query or the\n * DMCA/ReDoS surface of `ConfigManager` into the lean entry. Within a single\n * bundle this mutates the one `config` instance `callRPC` reads; the\n * cross-bundle single-instance guarantee is a separate (build-level) concern.\n */\n/**\n * Trim, drop non-string / non-http(s), and de-dupe (order-preserving) a node\n * list. Shared by `setNodes` and the REST-node setters below so all three\n * normalize identically.\n */\nconst sanitizeNodeList = (nodes: unknown): string[] =>\n Array.isArray(nodes)\n ? [\n ...new Set(\n nodes\n .filter((n): n is string => typeof n === 'string')\n // Trim, then strip trailing slashes so REST paths concatenate cleanly:\n // `callREST` builds `node + '/status-api'`, and a `https://host/` node would\n // otherwise yield `https://host//status-api`, which several HAF nodes 404.\n // De-dupe AFTER normalizing so `host` and `host/` collapse to one entry.\n .map((n) => n.trim().replace(/\\/+$/, ''))\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n : []\n\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = sanitizeNodeList(nodes)\n if (!validNodes.length) return\n config.nodes = validNodes\n}\n\n/**\n * Validated setter for the REST-API node list — replaces `config.restNodes`.\n * Same shape/guarantees as `setNodes` (trim, drop non-http(s), de-dupe, no-op on\n * empty). Exists because `restNodes` is otherwise baked into the SDK: an app that\n * wants to add/remove a REST host (e.g. drop an own node it is decommissioning, or\n * widen the public pool) previously had to fork + republish the SDK. With this, the\n * REST pool is app-configurable at runtime exactly like the read pool. Lives in the\n * React-free `hive-tx` core so both the full `@ecency/sdk` entry and the lean\n * `@ecency/sdk/hive` entry can reach it.\n */\nexport const setRestNodes = (nodes: string[]): void => {\n const valid = sanitizeNodeList(nodes)\n if (!valid.length) return\n config.restNodes = valid\n}\n\n/**\n * Merge validated per-API REST node overrides into `config.restNodesByApi`.\n * For each entry: a non-empty, valid list pins that API to those hosts; an empty or\n * all-invalid list REMOVES the pin so the API falls back to `restNodes`. Other APIs'\n * existing pins (e.g. the built-in `hivesense`) are preserved. Lets an app pin the\n * APIs it actually uses to known-capable hosts (so `callREST` never burns its small\n * retry budget on a node that 404/503s the API) without an SDK republish.\n */\nexport const setRestNodesByApi = (\n map: Partial>\n): void => {\n if (!map || typeof map !== 'object') return\n const next: Partial> = { ...config.restNodesByApi }\n for (const [api, list] of Object.entries(map)) {\n const valid = sanitizeNodeList(list)\n if (valid.length) {\n next[api as APIMethods] = valid\n } else {\n delete next[api as APIMethods]\n }\n }\n config.restNodesByApi = next\n}\n\n/**\n * Validated setter for the User-Agent sent on server-side (Node) requests.\n * Trims the input and ignores an empty value so a bad input can't blank out the\n * header. Like `setNodes`, it lives in the React-free `hive-tx` core so it is\n * reachable from both the full `@ecency/sdk` entry (via\n * `ConfigManager.setUserAgent`) and the lean `@ecency/sdk/hive` server/CLI entry.\n */\nexport const setUserAgent = (ua: string): void => {\n // Defensive against plain-JS / React Native callers that may pass a non-string\n // despite the `string` type (avoids throwing on `.trim()`).\n if (typeof ua !== 'string') return\n const value = ua.trim()\n // Ignore blank values, and reject control characters (CR, LF, and other\n // C0/DEL controls). An invalid header value would otherwise be stored and make\n // every subsequent fetch throw, and rejecting CR/LF closes a header-injection\n // vector for any caller that builds the UA from untrusted input.\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return\n config.userAgent = value\n}\n\n/**\n * Validated partial setter for `config.resilience` (adaptive read timeouts +\n * hedged requests — see the field's doc comment). Booleans must be booleans;\n * numeric fields must be finite and positive, with the refill rate additionally\n * capped at 1 so a typo can't turn the tail-hedge into a traffic doubler\n * (refill ≤ 1 ⇒ hedges can never exceed un-hedged successes). Invalid values\n * are ignored field-by-field, so one bad entry can't block the rest. Lives in\n * the React-free `hive-tx` core (like the other setters) so both `@ecency/sdk`\n * (via `ConfigManager.setResilience`) and the lean `@ecency/sdk/hive` entry\n * can reach it.\n */\nexport const setResilience = (opts: Partial): void => {\n if (!opts || typeof opts !== 'object') return\n const r = config.resilience\n const bool = (v: unknown): v is boolean => typeof v === 'boolean'\n const pos = (v: unknown): v is number =>\n typeof v === 'number' && Number.isFinite(v) && v > 0\n if (bool(opts.adaptiveTimeout)) r.adaptiveTimeout = opts.adaptiveTimeout\n // Floor must stay ≥ the tracker's slow-failure recording floor (2s): the\n // safety argument for adaptive timeouts is that an abort at the window IS\n // recorded as a slow sample, growing the EWMA so the window self-corrects\n // upward. A floor below 2s would abort without recording — the window could\n // never converge and a too-tight profile would starve that call forever.\n if (pos(opts.adaptiveTimeoutFloorMs)) {\n r.adaptiveTimeoutFloorMs = Math.max(opts.adaptiveTimeoutFloorMs, 2_000)\n }\n if (pos(opts.adaptiveTimeoutFactor)) r.adaptiveTimeoutFactor = opts.adaptiveTimeoutFactor\n if (bool(opts.hedge)) r.hedge = opts.hedge\n if (pos(opts.hedgeDelayFloorMs)) r.hedgeDelayFloorMs = opts.hedgeDelayFloorMs\n if (pos(opts.hedgeDelayFactor)) r.hedgeDelayFactor = opts.hedgeDelayFactor\n if (pos(opts.hedgeBucketCapacity)) r.hedgeBucketCapacity = opts.hedgeBucketCapacity\n // Refill must stay ≤ 1: at 1 token per success the hedge rate could reach\n // 100% of traffic, defeating the \"tail only\" contract. Cap rather than reject\n // so a caller asking for \"more hedging\" gets the safe maximum.\n if (pos(opts.hedgeRefillPerSuccess)) {\n r.hedgeRefillPerSuccess = Math.min(opts.hedgeRefillPerSuccess, 1)\n }\n // Below 1 the budget could not even cover the configured per-attempt window.\n if (pos(opts.totalBudgetFactor)) {\n r.totalBudgetFactor = Math.max(opts.totalBudgetFactor, 1)\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport class Signature {\n data: Uint8Array\n recovery: number\n private compressed: boolean\n\n /**\n * Creates a new Signature instance.\n * @param data Raw signature data (64 bytes)\n * @param recovery Recovery byte (0-3)\n * @param compressed Whether signature is compressed (default: true)\n */\n constructor(data: Uint8Array, recovery: number, compressed?: boolean) {\n this.data = data\n this.recovery = recovery\n this.compressed = compressed ?? true\n }\n\n /**\n * Creates a Signature from a hex string.\n * @param string 130-character hex string containing signature and recovery data\n * @returns New Signature instance\n * @throws Error if input is not a string\n */\n static from(string: string) {\n if (typeof string === 'string') {\n const temp = hexToBytes(string)\n let recovery = parseInt(bytesToHex(temp.subarray(0, 1)), 16) - 31\n let compressed = true\n // non-compressed signatures have -4\n // https://github.com/bitcoin/bitcoin/blob/95ea54ba089610019a74c1176a2c7c0dba144b1c/src/key.cpp#L257\n if (recovery < 0) {\n compressed = false\n recovery = recovery + 4\n }\n const data = temp.subarray(1)\n return new Signature(data, recovery, compressed)\n } else {\n throw new Error('Expected string for data')\n }\n }\n\n /**\n * Converts signature to 65-byte buffer format.\n * @returns 65-byte buffer containing recovery byte + signature data\n */\n toBuffer() {\n const buffer = new Uint8Array(65).fill(0)\n if (this.compressed) {\n buffer[0] = (this.recovery + 31) & 0xff\n } else {\n buffer[0] = (this.recovery + 27) & 0xff\n }\n buffer.set(this.data, 1)\n return buffer\n }\n\n /**\n * Returns signature as 130-character hex string.\n * @returns Hex string representation of signature\n */\n customToString() {\n return bytesToHex(this.toBuffer())\n }\n\n /**\n * Returns signature as 130-character hex string.\n * Overrides Object.prototype.toString() so that String(sig) and\n * template literals produce the hex representation instead of \"[object Object]\".\n * @returns Hex string representation of signature\n */\n toString() {\n return this.customToString()\n }\n\n /**\n * Recovers the public key from this signature and message.\n * @param message 32-byte message hash (Uint8Array) or 64-character hex string\n * @returns PublicKey that created this signature\n * @throws Error if message is not a valid 32-byte SHA256 hash\n */\n getPublicKey(message: Uint8Array | string): PublicKey {\n if (\n (message instanceof Uint8Array && message.length !== 32) ||\n (typeof message === 'string' && message.length !== 64)\n ) {\n throw new Error('Expected a valid sha256 hash as message')\n }\n if (typeof message === 'string') {\n message = hexToBytes(message)\n }\n const sig = secp256k1.Signature.fromBytes(this.data, 'compact')\n const temp = new secp256k1.Signature(sig.r, sig.s, this.recovery)\n return new PublicKey(temp.recoverPublicKey(message).toBytes())\n }\n}\n","import { ripemd160 } from '@noble/hashes/legacy.js'\nimport bs58 from 'bs58'\nimport { config } from '../config'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { Signature } from './Signature'\n\nexport class PublicKey {\n key: Uint8Array\n prefix: string\n\n /**\n * Creates a new PublicKey instance from raw bytes.\n * @param key Raw public key bytes (33 bytes, compressed format)\n * @param prefix Optional address prefix (defaults to the current config.address_prefix)\n */\n constructor(key: Uint8Array, prefix?: string) {\n this.key = key\n // Read config at call time so runtime mutations to config.address_prefix\n // (e.g. switching to a non-mainnet network) take effect for new instances.\n this.prefix = prefix ?? config.address_prefix\n }\n\n /**\n * Creates a PublicKey from a string representation.\n * The expected prefix is read from config.address_prefix at call time, so\n * consumers can switch networks at runtime.\n * @param wif Public key string (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n * @returns New PublicKey instance\n * @throws Error if the prefix, length, checksum, or curve point is invalid\n */\n static fromString(wif: string): PublicKey {\n const expectedPrefix = config.address_prefix\n if (typeof wif !== 'string' || wif.length <= expectedPrefix.length) {\n throw new Error('Invalid public key')\n }\n const prefix = wif.slice(0, expectedPrefix.length)\n if (prefix !== expectedPrefix) {\n throw new Error(`Public key must start with ${expectedPrefix}`)\n }\n let buffer: Uint8Array\n try {\n buffer = bs58.decode(wif.slice(expectedPrefix.length))\n } catch {\n throw new Error('Invalid public key encoding')\n }\n // 33-byte compressed secp256k1 point + 4-byte RIPEMD160 checksum\n if (buffer.length !== 37) {\n throw new Error('Invalid public key length')\n }\n const key = buffer.subarray(0, 33)\n const checksum = buffer.subarray(33, 37)\n const expectedChecksum = ripemd160(key).subarray(0, 4)\n if (!isUint8ArrayEqual(checksum, expectedChecksum)) {\n throw new Error('Public key checksum mismatch')\n }\n try {\n secp256k1.Point.fromBytes(key)\n } catch {\n throw new Error('Invalid public key')\n }\n return new PublicKey(key, prefix)\n }\n\n /**\n * Creates a PublicKey from a string or returns the instance if already a PublicKey.\n * @param value Public key string or PublicKey instance\n * @returns New or existing PublicKey instance\n */\n static from(value: string | PublicKey): PublicKey {\n if (value instanceof PublicKey) {\n return value\n } else {\n return PublicKey.fromString(value as string)\n }\n }\n\n /**\n * Verifies a signature against a message hash.\n * @param message 32-byte message hash to verify\n * @param signature Signature to verify\n * @returns True if signature is valid, false otherwise\n */\n verify(message: Uint8Array, signature: Signature | string): boolean {\n if (typeof signature === 'string') {\n signature = Signature.from(signature)\n }\n return secp256k1.verify(signature.data, message, this.key, {\n prehash: false,\n format: 'compact'\n })\n }\n\n /**\n * Returns the public key as a string for storage or transmission.\n * @returns Public key string with prefix (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n */\n toString(): string {\n return encodePublic(this.key, this.prefix)\n }\n\n /**\n * Returns JSON representation (same as toString()).\n * @returns Public key string\n */\n toJSON(): string {\n return this.toString()\n }\n\n /**\n * Returns a string representation for debugging.\n * @returns Formatted public key string\n */\n inspect(): string {\n return `PublicKey: ${this.toString()}`\n }\n}\n\nconst encodePublic = (key: Uint8Array, prefix: string): string => {\n const checksum = ripemd160(key)\n return prefix + bs58.encode(new Uint8Array([...key, ...checksum.subarray(0, 4)]))\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array): boolean => {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n","/** Class representing a hive asset,\n * e.g. `1.000 HIVE` or `12.112233 VESTS`. */\nexport class Asset {\n amount: number\n symbol: string\n\n constructor(amount: number, symbol: string) {\n this.amount = amount\n this.symbol = symbol === 'HIVE' ? 'STEEM' : symbol === 'HBD' ? 'SBD' : symbol\n }\n\n /** Create a new Asset instance from a string, e.g. `42.000 HIVE`. */\n static fromString(string: string, expectedSymbol: string | null = null): Asset {\n const [amountString, symbol] = string.split(' ')\n if (['STEEM', 'VESTS', 'SBD', 'TESTS', 'TBD', 'HIVE', 'HBD'].indexOf(symbol) === -1) {\n throw new Error(`Invalid asset symbol: ${symbol}`)\n }\n if (expectedSymbol && symbol !== expectedSymbol) {\n throw new Error(`Invalid asset, expected symbol: ${expectedSymbol} got: ${symbol}`)\n }\n const amount = Number.parseFloat(amountString)\n if (!Number.isFinite(amount)) {\n throw new Error(`Invalid asset amount: ${amountString}`)\n }\n return new Asset(amount, symbol)\n }\n\n /**\n * Convenience to create new Asset.\n * @param symbol Symbol to use when created from number. Will also be used to validate\n * the asset, throws if the passed value has a different symbol than this.\n */\n static from(value: number | string | Asset, symbol?: string | null): Asset {\n if (value instanceof Asset) {\n if (symbol && value.symbol !== symbol) {\n throw new Error(`Invalid asset, expected symbol: ${symbol} got: ${value.symbol}`)\n }\n return value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n return new Asset(value, symbol || 'STEEM')\n } else if (typeof value === 'string') {\n return Asset.fromString(value, symbol)\n } else {\n throw new Error(`Invalid asset '${String(value)}'`)\n }\n }\n\n // We convert HIVE & HBD strings to STEEM & SBD because the serialization should be based on STEEM & SBD\n\n /** Return asset precision. */\n getPrecision() {\n switch (this.symbol) {\n case 'TESTS':\n case 'TBD':\n case 'STEEM':\n case 'SBD':\n case 'HBD':\n case 'HIVE':\n return 3\n case 'VESTS':\n return 6\n default:\n return 3\n }\n }\n\n /** Return a string representation of this asset, e.g. `42.000 HIVE`. */\n toString() {\n return `${this.amount.toFixed(this.getPrecision())} ${this.symbol}`\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\n/** Buffer wrapper that serializes to a hex-encoded string. */\nexport class HexBuffer {\n buffer: Uint8Array\n /** Convenience to create a new HexBuffer, does not copy data if value passed is already a buffer. */\n static from(value: string | Uint8Array | HexBuffer) {\n if (value instanceof HexBuffer) {\n return value\n } else if (value instanceof Uint8Array) {\n return new HexBuffer(value)\n } else if (typeof value === 'string') {\n return new HexBuffer(hexToBytes(value))\n } else {\n return new HexBuffer(new Uint8Array(value))\n }\n }\n\n constructor(buffer: Uint8Array) {\n this.buffer = buffer\n }\n\n toString() {\n return bytesToHex(this.buffer)\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { Asset } from './Asset'\nimport { HexBuffer } from './HexBuffer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Operation } from '../types'\n\n// Operation ID constants for better maintainability\nconst OPERATION_IDS = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n // pow: 14,\n custom: 15,\n // report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n // pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n // custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49\n} as const\n\ntype OperationId = (typeof OPERATION_IDS)[keyof typeof OPERATION_IDS]\n\nconst VoidSerializer = () => {\n throw new Error('Void can not be serialized')\n}\nconst StringSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeVString(data)\n}\n\nconst Int16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeInt16(data)\n}\n\nconst Int64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeInt64(data)\n}\n\nconst UInt8Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint8(data)\n}\n\nconst UInt16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint16(data)\n}\n\nconst UInt32Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint32(data)\n}\n\nconst UInt64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeUint64(data)\n}\n\nconst BooleanSerializer = (buffer: ByteBuffer, data: number | boolean) => {\n buffer.writeByte(data ? 1 : 0)\n}\n\nconst StaticVariantSerializer = (itemSerializers: any) => {\n // return (buffer: ByteBuffer, data: any[]) => {\n // let id = data[0]\n // const item = data[1]\n // // id was/is supposed to be 0 or integer here but seems to have been changed in e.g. comment_options\n // // extensions: [\n // // [\n // // \"comment_payout_beneficiaries\",\n // // {\n // // \"beneficiaries\": [\n // // {\n // // \"account\": \"vimm\",\n // // \"weight\": 1000\n // // }\n // // ]\n // // }\n // // ]\n // // ]\n // // Keep it here just in case\n // // https://gitlab.syncad.com/hive/hive/-/issues/722\n // // \"comment_payout_beneficiaries\" was 0 and at some point it got changed\n // // It should still be serialized as a 0 or an integer\n // // Now the question is, always 0? will need an example transaction to prove otherwise\n // if (typeof id === 'string') {\n // if (id === 'update_proposal_end_date') {\n // id = 1\n // } else {\n // id = 0\n // }\n // }\n // buffer.writeVarint32(id)\n // itemSerializers[id](buffer, item)\n return (buffer: ByteBuffer, data: any) => {\n const [id, item] = data\n buffer.writeVarint32(id)\n itemSerializers[id](buffer, item)\n }\n}\n\n/**\n * Serialize asset.\n * @note This looses precision for amounts larger than 2^53-1/10^precision.\n * Should not be a problem in real-word usage.\n */\nconst AssetSerializer = (buffer: ByteBuffer, data: string | Asset) => {\n const asset = Asset.from(data)\n const precision = asset.getPrecision()\n buffer.writeInt64(Math.round(asset.amount * Math.pow(10, precision)))\n buffer.writeUint8(precision)\n for (let i = 0; i < 7; i++) {\n buffer.writeUint8(asset.symbol.charCodeAt(i) || 0)\n }\n}\n\nconst DateSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeUint32(Math.floor(new Date(data + 'Z').getTime() / 1000))\n}\n\nconst PublicKeySerializer = (buffer: ByteBuffer, data: string | PublicKey) => {\n if (\n data === null ||\n (typeof data === 'string' && data.slice(-39) === '1111111111111111111111111111111114T1Anm')\n ) {\n buffer.append(new Uint8Array(33).fill(0))\n } else {\n buffer.append(PublicKey.from(data).key)\n }\n}\n\nconst BinarySerializer = (size: null | number = null) => {\n return (buffer: ByteBuffer, data: string | Uint8Array | HexBuffer) => {\n data = HexBuffer.from(data)\n const len = data.buffer.length\n if (size) {\n if (len !== size) {\n throw new Error(`Unable to serialize binary. Expected ${size} bytes, got ${len}`)\n }\n } else {\n buffer.writeVarint32(len)\n }\n buffer.append(data.buffer)\n }\n}\n\nconst VariableBinarySerializer = BinarySerializer()\n\nconst FlatMapSerializer = (keySerializer: any, valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(data.length)\n for (const [key, value] of data) {\n keySerializer(buffer, key)\n valueSerializer(buffer, value)\n }\n }\n}\n\nconst ArraySerializer = (itemSerializer: any) => {\n return (buffer: ByteBuffer, data: any[]) => {\n buffer.writeVarint32(data.length)\n for (const item of data) {\n itemSerializer(buffer, item)\n }\n }\n}\n\nconst ObjectSerializer = (keySerializers: any) => {\n return (buffer: ByteBuffer, data: any) => {\n for (const [key, serializer] of keySerializers) {\n try {\n serializer(buffer, data[key])\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n }\n}\n\nconst OptionalSerializer = (valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any | undefined) => {\n if (data !== undefined) {\n buffer.writeByte(1)\n valueSerializer(buffer, data)\n } else {\n buffer.writeByte(0)\n }\n }\n}\n\nconst AuthoritySerializer = ObjectSerializer([\n ['weight_threshold', UInt32Serializer],\n ['account_auths', FlatMapSerializer(StringSerializer, UInt16Serializer)],\n ['key_auths', FlatMapSerializer(PublicKeySerializer, UInt16Serializer)]\n])\n\nconst BeneficiarySerializer = ObjectSerializer([\n ['account', StringSerializer],\n ['weight', UInt16Serializer]\n])\n\nconst PriceSerializer = ObjectSerializer([\n ['base', AssetSerializer],\n ['quote', AssetSerializer]\n])\n\n// const SignedBlockHeaderSerializer = ObjectSerializer([\n// ['previous', BinarySerializer(20)],\n// ['timestamp', DateSerializer],\n// ['witness', StringSerializer],\n// ['transaction_merkle_root', BinarySerializer(20)],\n// ['extensions', ArraySerializer(VoidSerializer)],\n// ['witness_signature', BinarySerializer(65)]\n// ])\n\nconst ChainPropertiesSerializer = ObjectSerializer([\n ['account_creation_fee', AssetSerializer],\n ['maximum_block_size', UInt32Serializer],\n ['hbd_interest_rate', UInt16Serializer]\n])\n\nconst OperationDataSerializer = (operationId: OperationId, definitions: any) => {\n const objectSerializer = ObjectSerializer(definitions)\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(operationId)\n objectSerializer(buffer, data)\n }\n}\n\nconst OperationSerializers: Record> = {}\n\nOperationSerializers.account_create = OperationDataSerializer(OPERATION_IDS.account_create, [\n ['fee', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_create_with_delegation = OperationDataSerializer(\n OPERATION_IDS.account_create_with_delegation,\n [\n ['fee', AssetSerializer],\n ['delegation', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update = OperationDataSerializer(OPERATION_IDS.account_update, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_witness_proxy = OperationDataSerializer(\n OPERATION_IDS.account_witness_proxy,\n [\n ['account', StringSerializer],\n ['proxy', StringSerializer]\n ]\n)\n\nOperationSerializers.account_witness_vote = OperationDataSerializer(\n OPERATION_IDS.account_witness_vote,\n [\n ['account', StringSerializer],\n ['witness', StringSerializer],\n ['approve', BooleanSerializer]\n ]\n)\n\nOperationSerializers.cancel_transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.cancel_transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer]\n ]\n)\n\nOperationSerializers.change_recovery_account = OperationDataSerializer(\n OPERATION_IDS.change_recovery_account,\n [\n ['account_to_recover', StringSerializer],\n ['new_recovery_account', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.claim_account = OperationDataSerializer(OPERATION_IDS.claim_account, [\n ['creator', StringSerializer],\n ['fee', AssetSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.claim_reward_balance = OperationDataSerializer(\n OPERATION_IDS.claim_reward_balance,\n [\n ['account', StringSerializer],\n ['reward_hive', AssetSerializer],\n ['reward_hbd', AssetSerializer],\n ['reward_vests', AssetSerializer]\n ]\n)\n\nOperationSerializers.comment = OperationDataSerializer(OPERATION_IDS.comment, [\n ['parent_author', StringSerializer],\n ['parent_permlink', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['title', StringSerializer],\n ['body', StringSerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.comment_options = OperationDataSerializer(OPERATION_IDS.comment_options, [\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['max_accepted_payout', AssetSerializer],\n ['percent_hbd', UInt16Serializer],\n ['allow_votes', BooleanSerializer],\n ['allow_curation_rewards', BooleanSerializer],\n [\n 'extensions',\n ArraySerializer(\n StaticVariantSerializer([\n ObjectSerializer([['beneficiaries', ArraySerializer(BeneficiarySerializer)]])\n ])\n )\n ]\n])\n\nOperationSerializers.convert = OperationDataSerializer(OPERATION_IDS.convert, [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n])\n\nOperationSerializers.create_claimed_account = OperationDataSerializer(\n OPERATION_IDS.create_claimed_account,\n [\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.custom = OperationDataSerializer(OPERATION_IDS.custom, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['id', UInt16Serializer],\n ['data', VariableBinarySerializer]\n])\n\n// Not used on chain\n// OperationSerializers.custom_binary = OperationDataSerializer(OPERATION_IDS.custom_binary, [\n// ['required_owner_auths', ArraySerializer(StringSerializer)],\n// ['required_active_auths', ArraySerializer(StringSerializer)],\n// ['required_posting_auths', ArraySerializer(StringSerializer)],\n// ['required_auths', ArraySerializer(AuthoritySerializer)],\n// ['id', StringSerializer],\n// ['data', VariableBinarySerializer]\n// ])\n\nOperationSerializers.custom_json = OperationDataSerializer(OPERATION_IDS.custom_json, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['required_posting_auths', ArraySerializer(StringSerializer)],\n ['id', StringSerializer],\n ['json', StringSerializer]\n])\n\nOperationSerializers.decline_voting_rights = OperationDataSerializer(\n OPERATION_IDS.decline_voting_rights,\n [\n ['account', StringSerializer],\n ['decline', BooleanSerializer]\n ]\n)\n\nOperationSerializers.delegate_vesting_shares = OperationDataSerializer(\n OPERATION_IDS.delegate_vesting_shares,\n [\n ['delegator', StringSerializer],\n ['delegatee', StringSerializer],\n ['vesting_shares', AssetSerializer]\n ]\n)\n\nOperationSerializers.delete_comment = OperationDataSerializer(OPERATION_IDS.delete_comment, [\n ['author', StringSerializer],\n ['permlink', StringSerializer]\n])\n\nOperationSerializers.escrow_approve = OperationDataSerializer(OPERATION_IDS.escrow_approve, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['approve', BooleanSerializer]\n])\n\nOperationSerializers.escrow_dispute = OperationDataSerializer(OPERATION_IDS.escrow_dispute, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer]\n])\n\nOperationSerializers.escrow_release = OperationDataSerializer(OPERATION_IDS.escrow_release, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['receiver', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer]\n])\n\nOperationSerializers.escrow_transfer = OperationDataSerializer(OPERATION_IDS.escrow_transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer],\n ['escrow_id', UInt32Serializer],\n ['agent', StringSerializer],\n ['fee', AssetSerializer],\n ['json_meta', StringSerializer],\n ['ratification_deadline', DateSerializer],\n ['escrow_expiration', DateSerializer]\n])\n\nOperationSerializers.feed_publish = OperationDataSerializer(OPERATION_IDS.feed_publish, [\n ['publisher', StringSerializer],\n ['exchange_rate', PriceSerializer]\n])\n\nOperationSerializers.limit_order_cancel = OperationDataSerializer(\n OPERATION_IDS.limit_order_cancel,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer]\n ]\n)\n\nOperationSerializers.limit_order_create = OperationDataSerializer(\n OPERATION_IDS.limit_order_create,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['min_to_receive', AssetSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.limit_order_create2 = OperationDataSerializer(\n OPERATION_IDS.limit_order_create2,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['exchange_rate', PriceSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.recover_account = OperationDataSerializer(OPERATION_IDS.recover_account, [\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['recent_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\n// Not used on chain\n// OperationSerializers.report_over_production = OperationDataSerializer(\n// OPERATION_IDS.report_over_production,\n// [\n// ['reporter', StringSerializer],\n// ['first_block', SignedBlockHeaderSerializer],\n// ['second_block', SignedBlockHeaderSerializer]\n// ]\n// )\n\nOperationSerializers.request_account_recovery = OperationDataSerializer(\n OPERATION_IDS.request_account_recovery,\n [\n ['recovery_account', StringSerializer],\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.reset_account = OperationDataSerializer(OPERATION_IDS.reset_account, [\n ['reset_account', StringSerializer],\n ['account_to_reset', StringSerializer],\n ['new_owner_authority', AuthoritySerializer]\n])\n\nOperationSerializers.set_reset_account = OperationDataSerializer(OPERATION_IDS.set_reset_account, [\n ['account', StringSerializer],\n ['current_reset_account', StringSerializer],\n ['reset_account', StringSerializer]\n])\n\nOperationSerializers.set_withdraw_vesting_route = OperationDataSerializer(\n OPERATION_IDS.set_withdraw_vesting_route,\n [\n ['from_account', StringSerializer],\n ['to_account', StringSerializer],\n ['percent', UInt16Serializer],\n ['auto_vest', BooleanSerializer]\n ]\n)\n\nOperationSerializers.transfer = OperationDataSerializer(OPERATION_IDS.transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n])\n\nOperationSerializers.transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_to_savings,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_vesting = OperationDataSerializer(\n OPERATION_IDS.transfer_to_vesting,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.vote = OperationDataSerializer(OPERATION_IDS.vote, [\n ['voter', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['weight', Int16Serializer]\n])\n\nOperationSerializers.withdraw_vesting = OperationDataSerializer(OPERATION_IDS.withdraw_vesting, [\n ['account', StringSerializer],\n ['vesting_shares', AssetSerializer]\n])\n\nOperationSerializers.witness_update = OperationDataSerializer(OPERATION_IDS.witness_update, [\n ['owner', StringSerializer],\n ['url', StringSerializer],\n ['block_signing_key', PublicKeySerializer],\n ['props', ChainPropertiesSerializer],\n ['fee', AssetSerializer]\n])\n\nOperationSerializers.witness_set_properties = OperationDataSerializer(\n OPERATION_IDS.witness_set_properties,\n [\n ['owner', StringSerializer],\n ['props', FlatMapSerializer(StringSerializer, VariableBinarySerializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update2 = OperationDataSerializer(OPERATION_IDS.account_update2, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', OptionalSerializer(PublicKeySerializer)],\n ['json_metadata', StringSerializer],\n ['posting_json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.create_proposal = OperationDataSerializer(OPERATION_IDS.create_proposal, [\n ['creator', StringSerializer],\n ['receiver', StringSerializer],\n ['start_date', DateSerializer],\n ['end_date', DateSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.update_proposal_votes = OperationDataSerializer(\n OPERATION_IDS.update_proposal_votes,\n [\n ['voter', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['approve', BooleanSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.remove_proposal = OperationDataSerializer(OPERATION_IDS.remove_proposal, [\n ['proposal_owner', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nconst ProposalUpdateSerializer = ObjectSerializer([['end_date', DateSerializer]])\n\nOperationSerializers.update_proposal = OperationDataSerializer(OPERATION_IDS.update_proposal, [\n ['proposal_id', UInt64Serializer],\n ['creator', StringSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n [\n 'extensions',\n ArraySerializer(StaticVariantSerializer([VoidSerializer, ProposalUpdateSerializer]))\n ]\n])\n\nOperationSerializers.collateralized_convert = OperationDataSerializer(\n OPERATION_IDS.collateralized_convert,\n [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.recurrent_transfer = OperationDataSerializer(\n OPERATION_IDS.recurrent_transfer,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer],\n ['recurrence', UInt16Serializer],\n ['executions', UInt16Serializer],\n [\n 'extensions',\n ArraySerializer(\n ObjectSerializer([\n ['type', UInt8Serializer],\n ['value', ObjectSerializer([['pair_id', UInt8Serializer]])]\n ])\n )\n ]\n ]\n)\n\nconst OperationSerializer = (buffer: ByteBuffer, operation: Operation) => {\n const serializer = OperationSerializers[operation[0]]\n if (!serializer) {\n throw new Error(`No serializer for operation: ${operation[0]}`)\n }\n try {\n serializer(buffer, operation[1])\n } catch (error: any) {\n error.message = `${operation[0]}: ${error.message}`\n throw error\n }\n}\n\nconst TransactionSerializer = ObjectSerializer([\n ['ref_block_num', UInt16Serializer],\n ['ref_block_prefix', UInt32Serializer],\n ['expiration', DateSerializer],\n ['operations', ArraySerializer(OperationSerializer)],\n ['extensions', ArraySerializer(StringSerializer)]\n])\n\nconst EncryptedMemoSerializer = ObjectSerializer([\n ['from', PublicKeySerializer],\n ['to', PublicKeySerializer],\n ['nonce', UInt64Serializer],\n ['check', UInt32Serializer],\n ['encrypted', BinarySerializer()]\n])\n\nexport const Serializer = {\n // Array: ArraySerializer,\n Asset: AssetSerializer,\n // Authority: AuthoritySerializer,\n // Binary: BinarySerializer,\n // Boolean: BooleanSerializer,\n // Date: DateSerializer,\n // FlatMap: FlatMapSerializer,\n // Int16: Int16Serializer,\n // Int32: Int32Serializer,\n // Int64: Int64Serializer,\n // Int8: Int8Serializer,\n Memo: EncryptedMemoSerializer,\n // Object: ObjectSerializer,\n // Operation: OperationSerializer,\n // Optional: OptionalSerializer,\n Price: PriceSerializer,\n PublicKey: PublicKeySerializer,\n // StaticVariant: StaticVariantSerializer,\n String: StringSerializer,\n Transaction: TransactionSerializer,\n UInt16: UInt16Serializer,\n UInt32: UInt32Serializer\n // UInt64: UInt64Serializer,\n // UInt8: UInt8Serializer,\n // Void: VoidSerializer\n}\n","export const sleep = (ms: number): Promise => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { config } from '../config'\nimport { CallResponse } from '../types'\nimport type { APIMethods } from '../api-types'\nimport { sleep } from './sleep'\n\n// ── Server identity (User-Agent) ────────────────────────────────────────────\n\n/**\n * True only when running under Node.js (SSR / server / CLI). Computed once.\n *\n * We attach a descriptive `User-Agent` exclusively here because that is the only\n * place it (a) takes effect and (b) is wanted:\n * - Node's undici fetch otherwise sends a bare `User-Agent: node`, which is\n * indistinguishable from any anonymous script in node/CDN analytics.\n * - Browsers treat `User-Agent` as a forbidden header and silently drop any\n * override, so setting it there is pointless (and we avoid the churn).\n * - React Native sets its own native UA (e.g. the mobile app's own string);\n * overriding it would relabel real mobile traffic, so we explicitly exclude\n * it via `navigator.product === 'ReactNative'`.\n */\nconst isNodeRuntime: boolean = (() => {\n try {\n const isReactNative =\n typeof navigator !== 'undefined' && (navigator as any).product === 'ReactNative'\n return (\n !isReactNative &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null\n )\n } catch {\n return false\n }\n})()\n\n/**\n * Headers that identify the caller on server-side requests. Returns the\n * configured `User-Agent` only under Node; an empty object everywhere else so\n * browser and React Native requests are left exactly as they were.\n */\nfunction serverIdentityHeaders(): Record {\n return isNodeRuntime ? { 'User-Agent': config.userAgent } : {}\n}\n\n// ── Error Types ─────────────────────────────────────────────────────────────\n\nexport class RPCError extends Error {\n name = 'RPCError'\n data?: any\n code: number\n stack: undefined = undefined\n constructor(rpcError: { message: string; code: number; data?: any }) {\n super(rpcError.message)\n this.code = rpcError.code\n if ('data' in rpcError) {\n this.data = rpcError.data\n }\n }\n}\n\n/**\n * Transport-level error thrown by jsonRPCCall for HTTP status errors (429, 503).\n * Carries node identity and rate-limit info so callers can record health\n * exactly once without double-counting.\n */\nclass NodeError extends Error {\n node: string\n /** Explicit server `Retry-After` in ms, or 0 when the 429 carried no usable header. */\n rateLimitMs: number\n /** True for an HTTP 429 regardless of whether a `Retry-After` header was present, so\n * a header-less rate limit is still cooled down (with escalating backoff) rather than\n * mis-recorded as a plain transport failure. */\n isRateLimit: boolean\n constructor(\n node: string,\n message: string,\n opts: { rateLimitMs?: number; isRateLimit?: boolean } = {}\n ) {\n super(message)\n this.node = node\n this.rateLimitMs = opts.rateLimitMs ?? 0\n this.isRateLimit = opts.isRateLimit ?? false\n }\n}\n\n/**\n * Parse an HTTP `Retry-After` header to milliseconds. Supports both forms in the\n * spec: `` (e.g. \"120\") and ``. Returns 0 when the header\n * is absent or unparseable (including a non-numeric junk value or a past date) so the\n * caller falls back to escalating backoff instead of a NaN/negative cooldown.\n */\nfunction parseRetryAfterMs(header: string | null): number {\n if (!header) return 0\n const secs = Number(header)\n if (Number.isFinite(secs)) return secs > 0 ? secs * 1000 : 0\n const dateMs = Date.parse(header)\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now()\n return delta > 0 ? delta : 0\n }\n return 0\n}\n\n/** Errors that indicate the request definitely never reached the server. */\nconst PRE_CONNECTION_ERRORS = ['ECONNREFUSED', 'ENOTFOUND', 'EHOSTUNREACH', 'EAI_AGAIN']\n\n/** Browser fetch network-failure messages — emitted by Chromium/Firefox/Safari\n * when CORS preflight fails, DNS fails, TLS fails, or the response is blocked.\n * These map to scenarios where retrying the same signed broadcast is safe: the\n * request either never reached the node, or its response was blocked but a\n * re-broadcast of the *same* signed tx will be deduped by Hive (same trx_id). */\nconst BROWSER_NETWORK_ERRORS = [\n 'Failed to fetch', // Chromium\n 'NetworkError when attempting to fetch', // Firefox\n 'Load failed', // Safari\n 'fetch failed' // Node 18+ undici / Bun — also covered via cause chain\n]\n\n/**\n * Concatenate the error's surface text + the messages/codes from up to 5\n * levels of nested `cause`. Node.js fetch wraps connection failures as\n * `TypeError('fetch failed')` with the real `code` (ECONNREFUSED, etc.)\n * nested in the cause chain. Browser fetch failures have no cause but\n * carry their identifier in `message`.\n */\nfunction flattenErrorText(e: any): string {\n if (!e) return ''\n const parts: string[] = [String(e.name || ''), String(e.message || ''), String(e.code || '')]\n let cause = e.cause\n for (let depth = 0; cause && depth < 5; depth++) {\n parts.push(String(cause.code || ''), String(cause.message || ''))\n cause = cause.cause\n }\n return parts.join(' ')\n}\n\n/**\n * Decide whether a broadcast attempt can safely be retried on another node.\n *\n * Safe to retry (same signed tx → Hive dedupes by trx_id at the mempool layer):\n * - Pre-connection failures (ECONNREFUSED, ENOTFOUND, etc.) — request never sent.\n * - Browser fetch network failures (CORS block, TLS error, DNS) — TypeError with\n * a well-known message string.\n * - JSON parse failures — node returned an HTML error page (typical for\n * Cloudflare 1033 tunnel-down / 5xx interstitials), so the request never\n * reached the Hive RPC layer.\n * - NodeError (HTTP 429/5xx surfaced from jsonRPCCall) — already known transient.\n *\n * NOT safe to retry:\n * - RPCError — the node accepted the request and the blockchain rejected it.\n * Retrying on another node would either get the same rejection or accept\n * a different one; surface the original error instead.\n */\nfunction isBroadcastSafeToRetry(e: any): boolean {\n if (!e) return false\n if (e instanceof NodeError) return true\n if (e instanceof RPCError) return false\n\n const text = flattenErrorText(e)\n if (PRE_CONNECTION_ERRORS.some((code) => text.includes(code))) return true\n if (BROWSER_NETWORK_ERRORS.some((msg) => text.includes(msg))) return true\n\n // res.json() against an HTML body (Cloudflare/proxy interstitials) throws\n // SyntaxError. The Hive RPC layer never saw the tx, so failover is safe.\n if (e instanceof SyntaxError) return true\n // Some runtimes surface JSON parse errors as plain Error with this text.\n if (/Unexpected token|JSON\\.parse|Unexpected end of JSON/i.test(text)) return true\n\n return false\n}\n\n// ── Node Health Tracker ─────────────────────────────────────────────────────\n\n/** Node-level health state tracked by NodeHealthTracker. */\ninterface NodeHealth {\n /** Global consecutive-failure counter. Resets on success. */\n consecutiveFailures: number\n /** Timestamp of the most recent failure. Used with the 30s cooldown window. */\n lastFailureTime: number\n /** Epoch ms after which the node is no longer rate-limited. */\n rateLimitedUntil: number\n /** Count of consecutive 429s (no intervening success) with no usable Retry-After.\n * Drives escalating backoff; reset by a success or by RATE_LIMIT_STREAK_RESET_MS. */\n rateLimitStreak: number\n /** Epoch ms of the most recent 429. Used to expire the escalation streak. */\n lastRateLimitAt: number\n /** Per-API failure counters. Some nodes disable specific API plugins; tracking\n * per-API lets us deprioritize a node only for the APIs that fail, not globally.\n * `defective` marks a cooldown set by recordDefectiveResponse (payload\n * validation failure) — unlike ordinary strike cooldowns it survives\n * recordSuccess and only expires on its own. */\n apiFailures: Map<\n string,\n { count: number; cooldownUntil: number; lastFailureTime: number; defective?: boolean }\n >\n /** Most recent head_block_number observed for this node. */\n headBlock: number\n /** Epoch ms when the head_block was recorded. Used to expire stale observations. */\n headBlockUpdatedAt: number\n\n // ── Latency tracking (adaptive ordering) ────────────────────────────────\n /** EWMA of observed round-trip ms. Fed by successful calls AND by slow/timeout\n * failures (so a node that returns 200 in 15s, or aborts at the timeout, is\n * ranked on its real slowness — not treated as merely \"healthy\"). `undefined`\n * until the first sample. */\n ewmaLatencyMs?: number\n /** Number of latency samples folded into the EWMA. Gates \"warmup\": below\n * LATENCY_MIN_SAMPLES the node is unproven and keeps its config-order prior. */\n latencySampleCount: number\n /** Epoch ms of the most recent latency sample. Used for usability expiry and to\n * decide when a node is overdue for an exploratory re-probe. */\n latencyUpdatedAt: number\n /** Epoch ms of the most recent exploratory promotion. Single-flight guard so a\n * burst of concurrent orderings doesn't all re-probe the same stale node. */\n lastProbeAt: number\n\n /**\n * Per-profile-key latency (same EWMA/warmup/expiry rules as the global one).\n * The global EWMA mixes cheap calls (get_accounts ~300ms) with heavy ones\n * (get_account_history, bridge.get_discussion — legitimately seconds), so it\n * ranks nodes fine but is the WRONG baseline for per-attempt deadlines: a\n * profile dominated by cheap calls would abort every legitimately-heavy call.\n * Deadlines/hedge delays therefore key on the FULL method for RPC\n * (\"condenser_api.get_account_history\") and api+endpoint template for REST —\n * an API prefix alone still mixes cheap and heavy methods. Ranking keeps the\n * global profile. Bounded: #nodes × #distinct methods called (code-defined,\n * not user input); fully cleared whenever the node's global profile expires\n * (the global clock advances on every sample, so global-stale ⇒ all stale).\n */\n apiLatency: Map\n}\n\n/**\n * JSON-RPC error codes that indicate the node itself is unhealthy, not that the\n * client sent a bad request. These should trigger failover to another node.\n *\n * Background: Hive nodes fronted by HAF/jussi/drone return HTTP 200 with a\n * JSON-RPC error body when a backing service (hivemind, postgrest, etc.) is down.\n * The HTTP layer looks healthy, so failover never triggers — the caller just gets\n * an error and gives up. This function identifies those node-level errors.\n */\nfunction isNodeLevelRPCError(code: number, message: string): boolean {\n // -32603: Internal error — node is having problems\n if (code === -32603) return true\n // -32000 to -32099: Server error range (implementation-defined server errors)\n if (code <= -32000 && code >= -32099) return true\n // -32601: Method not found — node may be missing this API plugin\n if (code === -32601) return true\n // -32602 with node-sick indicators (vs normal \"invalid params\" from bad client input)\n // e.g. \"Unable to parse endpoint data\" from HAF when a backing service is down\n if (code === -32602 && /unable to parse|endpoint data|internal/i.test(message)) return true\n return false\n}\n\n/** Extract the API prefix from a method name like \"rc_api.find_rc_accounts\" -> \"rc_api\". */\nfunction apiOf(method: string): string {\n const dot = method.indexOf('.')\n return dot > 0 ? method.slice(0, dot) : method\n}\n\n// ── Rate-limit (429) backoff constants ───────────────────────────────────────\n/** Base cooldown applied to a 429 with no usable `Retry-After` header. Matches the\n * previous flat default so first-offence behaviour is unchanged. */\nconst RATE_LIMIT_BASE_MS = 10_000\n/** Ceiling for the escalating header-less cooldown. Prevents a node from being\n * parked far longer than a real public node's throttle window. */\nconst RATE_LIMIT_MAX_MS = 60_000\n/** No 429 from a node for this long ⇒ its escalation streak resets to 0, so an\n * occasional throttle hours apart doesn't compound into a long park. */\nconst RATE_LIMIT_STREAK_RESET_MS = 120_000\n\n/** Per-API failure threshold before the node is deprioritized for that API only. */\nconst MAX_API_FAILURES_BEFORE_COOLDOWN = 2\n/** How long a node stays deprioritized for a specific API after repeated failures. */\nconst API_COOLDOWN_MS = 60_000\n/** How long head_block observations remain valid before being treated as unknown. */\nconst HEAD_BLOCK_MAX_AGE_MS = 120_000\n/** Maximum lag (in blocks) before a node is considered stale relative to the best-known head. */\nconst STALE_BLOCK_THRESHOLD = 30\n\n// ── Adaptive latency-ordering constants ──────────────────────────────────────\n/** EWMA smoothing weight for a new latency sample. 0.3 ⇒ ~5–6 samples to converge;\n * absorbs one-off GC/TLS spikes while still reacting to a real regional shift fast. */\nconst LATENCY_EWMA_ALPHA = 0.3\n/** Samples required before a node's latency is trusted for ranking. Below this the\n * node is \"warming\" and ranks at a neutral prior (config order via tiebreak), so a\n * single fluke never reorders the list and cold start == today's behavior. */\nconst LATENCY_MIN_SAMPLES = 3\n/** How long a latency sample stays usable for ranking. Past this a node reverts to\n * warming. Must be > LATENCY_REPROBE_MS so re-probes keep a busy node's profile fresh. */\nconst LATENCY_MAX_AGE_MS = 5 * 60_000\n/** A healthy node not sampled within this window is overdue for an exploratory\n * re-probe (promoted to front of ONE ordering). This is what lets a demoted node\n * climb back when it recovers — and what profiles a node that organic traffic never\n * reaches. 60s ⇒ ~1 probe/node/min worst case = negligible cost. */\nconst LATENCY_REPROBE_MS = 60_000\n/** Neutral score (ms) for an unproven/warming node: optimistic enough to sit ahead\n * of a proven-slow node (so we explore an unknown before hammering a known-slow one)\n * but behind a proven-fast node. Fixed, so a node makes at most ONE rank transition\n * when it crosses LATENCY_MIN_SAMPLES — no churn. */\nconst LATENCY_UNPROVEN_PRIOR_MS = 1_000\n/** A failed call only feeds a latency penalty if it was actually slow (≥ this). Keeps\n * a genuine timeout / slow-5xx (a far-region node case) visible to the ranker while an\n * instant ECONNREFUSED (a *down* node, handled by consecutiveFailures) is NOT mis-read\n * as \"slow\". The penalty value is the *measured* elapsed, never a static constant. */\nconst LATENCY_SLOW_FAILURE_MS = 2_000\n\n/**\n * Latency-ranking tuning, re-exported as a frozen bag so tests assert behaviour\n * against the real numbers instead of mirroring literals that can silently drift.\n * @internal — not part of the package's public API; for the co-located spec only.\n */\nexport const __LATENCY_TUNING__ = Object.freeze({\n EWMA_ALPHA: LATENCY_EWMA_ALPHA,\n MIN_SAMPLES: LATENCY_MIN_SAMPLES,\n MAX_AGE_MS: LATENCY_MAX_AGE_MS,\n REPROBE_MS: LATENCY_REPROBE_MS,\n UNPROVEN_PRIOR_MS: LATENCY_UNPROVEN_PRIOR_MS,\n SLOW_FAILURE_MS: LATENCY_SLOW_FAILURE_MS\n})\n\n/** @internal Exported for testing only. */\nexport class NodeHealthTracker {\n private health = new Map()\n\n private getOrCreate(node: string): NodeHealth {\n let h = this.health.get(node)\n if (!h) {\n h = {\n consecutiveFailures: 0,\n lastFailureTime: 0,\n rateLimitedUntil: 0,\n rateLimitStreak: 0,\n lastRateLimitAt: 0,\n apiFailures: new Map(),\n headBlock: 0,\n headBlockUpdatedAt: 0,\n ewmaLatencyMs: undefined,\n latencySampleCount: 0,\n latencyUpdatedAt: 0,\n // Stamp the probe clock at creation so a brand-new (never-sampled) node is\n // NOT treated as \"overdue for re-probe\" on its very first ordering pass.\n // With lastProbeAt=0 the re-probe gate (touch <= now - LATENCY_REPROBE_MS)\n // fired immediately, so the 2nd+ ordering on a cold worker promoted unproven\n // nodes ahead of the configured order for no measured reason. Seeding it to\n // \"now\" preserves configured order during warmup; a genuinely slow preferred\n // node is still demoted by its EWMA score (not by epoch-zero exploration),\n // and idle nodes are still re-probed once LATENCY_REPROBE_MS has truly elapsed.\n lastProbeAt: Date.now(),\n apiLatency: new Map()\n }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number, profileKey?: string): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 0\n // A success means the node recovered — clear the escalation streak so the next\n // throttle starts from the base cooldown. We deliberately do NOT clear an active\n // rateLimitedUntil window here: under concurrency a success from a request that was\n // already in flight can resolve *after* another request recorded a fresh 429\n // Retry-After, and erasing the window would put a just-throttled node back into\n // rotation early. The window expires on its own (short for header-less; the server's\n // value for an explicit Retry-After).\n h.rateLimitStreak = 0\n if (api) {\n // A successful API call clears that API's failure counter — but never an\n // ACTIVE defective-response cooldown: the \"success\" may itself be an\n // unvalidated read from the same lying node (validated calls are the\n // minority of traffic), and re-admitting it early defeats the decisive\n // penalty. That window expires on its own, like rateLimitedUntil above.\n const apiFail = h.apiFailures.get(api)\n if (!apiFail || !(apiFail.defective && apiFail.cooldownUntil > Date.now())) {\n h.apiFailures.delete(api)\n }\n }\n if (typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0) {\n // Latency profiles use the finest key available (full method / endpoint\n // template); the API prefix is only a fallback so bare callers still\n // profile SOMETHING. Failure state above stays per-API on purpose.\n this.recordLatency(h, durationMs, profileKey ?? api)\n }\n }\n\n /**\n * Record a *slow* failed call as a latency signal. The failure counters are\n * updated separately (recordFailure/recordError); this only feeds the EWMA so a\n * node that returns 200-but-too-slow, times out, or returns a slow 5xx is ranked\n * on its real slowness. Callers pass the MEASURED elapsed ms and only call this\n * when the call was genuinely slow (≥ LATENCY_SLOW_FAILURE_MS) — an instant\n * connection failure (a *down* node) must NOT look \"slow\".\n */\n recordSlowFailure(node: string, durationMs: number, profileKey?: string): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs, profileKey)\n }\n\n /**\n * Usable latency profile (EWMA ms), or `undefined` while unproven or stale.\n * With a `profileKey` (full RPC method / REST api+endpoint template),\n * returns that (node, key) profile ONLY — deliberately no fallback to the\n * mixed global profile, because an average dominated by cheap calls is the\n * wrong deadline baseline for a heavy method (that fallback is exactly the\n * \"2s window starves get_account_history\" failure mode). Without a key,\n * returns the global ranking profile. Both follow the same \"profiled and\n * fresh\" gate as the ranker.\n * @internal\n */\n getUsableLatencyMs(node: string, profileKey?: string): number | undefined {\n const h = this.health.get(node)\n if (!h) return undefined\n const now = Date.now()\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n return p &&\n p.sampleCount >= LATENCY_MIN_SAMPLES &&\n now - p.updatedAt <= LATENCY_MAX_AGE_MS\n ? p.ewmaMs\n : undefined\n }\n return this.isLatencyUsable(h, now) ? h.ewmaLatencyMs : undefined\n }\n\n /**\n * Censored latency sample for a request that was ABORTED because a hedge\n * completed first while it was still in flight. The elapsed-at-abort is a\n * *lower bound* on the true latency, so folding it in can only move the\n * node's EWMA toward the truth, never below it — which is what lets repeated\n * hedge-wins reorder the pool. Deliberately does NOT touch the failure\n * counters or rate-limit state: the node returned no error, it was merely\n * slow, and treating cancellation as failure would flap `isNodeHealthy`.\n * Callers must NOT record this for a primary that already settled on its own\n * (its outcome was recorded normally; a second sample would be fabricated).\n * Bypasses the `recordSlowFailure` 2s floor (a hedge can win well below it).\n * By construction the elapsed is ≥ the hedge delay, so only a degenerate\n * near-zero epsilon needs rejecting — anything under one LAN round trip is\n * noise, not a latency measurement.\n * @internal\n */\n recordCensoredLatency(node: string, elapsedMs: number, profileKey?: string): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 50) return\n this.recordLatency(this.getOrCreate(node), elapsedMs, profileKey)\n }\n\n /**\n * Fold a latency sample into the node's global EWMA (warmup + usability\n * bookkeeping) and, when a profile key is given, into that (node, key)\n * profile — the global one ranks nodes, the keyed one calibrates deadlines.\n */\n private recordLatency(h: NodeHealth, durationMs: number, profileKey?: string): void {\n const now = Date.now()\n // A profile older than the usable window starts fresh, so an idled process\n // re-learns from scratch rather than ranking on hour-old data. Every keyed\n // profile shares this clock (each sample updates both), so global-stale\n // implies every keyed profile is stale too — clear the map rather than\n // leave never-again-read tombstone entries for the life of the process.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\n h.apiLatency.clear()\n }\n h.ewmaLatencyMs =\n h.ewmaLatencyMs === undefined\n ? durationMs\n : LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * h.ewmaLatencyMs\n h.latencySampleCount++\n h.latencyUpdatedAt = now\n\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n if (!p || now - p.updatedAt > LATENCY_MAX_AGE_MS) {\n h.apiLatency.set(profileKey, { ewmaMs: durationMs, sampleCount: 1, updatedAt: now })\n } else {\n p.ewmaMs = LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * p.ewmaMs\n p.sampleCount++\n p.updatedAt = now\n }\n }\n }\n\n recordFailure(node: string, api?: string): void {\n const h = this.getOrCreate(node)\n if (api) {\n // API-specific failure: only update the per-API tracker.\n // This prevents e.g. 3 rc_api failures from marking the node\n // globally unhealthy for condenser_api too.\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n // Reset counter if previous cooldown expired OR last failure was >30s ago\n // (avoids sticky penalties from sparse failures hours apart)\n if (\n (existing.cooldownUntil > 0 && existing.cooldownUntil <= now) ||\n (existing.lastFailureTime > 0 && now - existing.lastFailureTime > 30_000)\n ) {\n existing.count = 0\n existing.cooldownUntil = 0\n }\n existing.count++\n existing.lastFailureTime = now\n if (existing.count >= MAX_API_FAILURES_BEFORE_COOLDOWN) {\n existing.cooldownUntil = now + API_COOLDOWN_MS\n }\n h.apiFailures.set(api, existing)\n } else {\n // Transport-level failure (no specific API): update global counter\n h.consecutiveFailures++\n h.lastFailureTime = Date.now()\n }\n }\n\n /**\n * A response that failed the caller's payload validation is a decisive,\n * reproducible node fault — the node answered 200 with data the caller KNOWS\n * to be impossible — so it trips the per-API cooldown immediately instead of\n * accruing ordinary strikes. Deliberately its own method rather than\n * recordFailure × N: ordinary strikes are cleared by any success, and a\n * top-ranked lying node keeps recording successes on the unvalidated calls\n * between probes, which would reset its strikes forever and keep it in\n * rotation (observed live). Scope stays per-API: the node may be perfectly\n * healthy for its other API families.\n */\n recordDefectiveResponse(node: string, api: string): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n existing.count = Math.max(existing.count + 1, MAX_API_FAILURES_BEFORE_COOLDOWN)\n existing.lastFailureTime = now\n existing.cooldownUntil = now + API_COOLDOWN_MS\n existing.defective = true\n h.apiFailures.set(api, existing)\n }\n\n /**\n * Cool down a rate-limited node. Honors an explicit server `Retry-After`\n * (`retryAfterMs`) exactly — the server told us when to return. With no usable\n * header, applies escalating backoff: BASE, 2×BASE, 4×BASE … capped at\n * RATE_LIMIT_MAX_MS, indexed by the node's consecutive-429 streak (reset by a\n * success or after RATE_LIMIT_STREAK_RESET_MS of quiet). This stops a throttled\n * public node from being re-admitted every 10s and re-hammered under sustained\n * load, which matters most when the fleet's own unlimited node is removed.\n */\n recordRateLimit(node: string, retryAfterMs?: number): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n // Expire a stale streak so an occasional throttle hours apart doesn't compound.\n if (h.rateLimitStreak > 0 && now - h.lastRateLimitAt > RATE_LIMIT_STREAK_RESET_MS) {\n h.rateLimitStreak = 0\n }\n const hasHeader = typeof retryAfterMs === 'number' && Number.isFinite(retryAfterMs) && retryAfterMs > 0\n const cooldown = hasHeader\n ? retryAfterMs!\n : Math.min(RATE_LIMIT_BASE_MS * 2 ** h.rateLimitStreak, RATE_LIMIT_MAX_MS)\n // Only a header-less 429 advances the escalation streak — an explicit Retry-After is\n // honored exactly and must not compound the header-less backoff (else several\n // Retry-After 429s would push a later header-less 429 straight to the 60s cap).\n if (!hasHeader) h.rateLimitStreak++\n h.lastRateLimitAt = now\n // Explicit Retry-After is honored exactly (the server's current instruction). A\n // header-less cooldown may only move the window FORWARD — it must never truncate a\n // longer window already set, e.g. a node parked for an hour by an explicit\n // Retry-After that is later retried as a last resort and returns a header-less 429\n // must not have its 1h window cut down to the 10s base.\n h.rateLimitedUntil = hasHeader\n ? now + cooldown\n : Math.max(h.rateLimitedUntil, now + cooldown)\n h.consecutiveFailures++\n h.lastFailureTime = now\n }\n\n /** Record an observed head_block_number for this node. */\n recordHeadBlock(node: string, blockNum: number): void {\n if (!blockNum || !Number.isFinite(blockNum)) return\n const h = this.getOrCreate(node)\n h.headBlock = blockNum\n h.headBlockUpdatedAt = Date.now()\n }\n\n /**\n * Consensus head block from recent observations. Uses the median rather than the\n * max to prevent a single bad/misconfigured node from poisoning the reference.\n * A node reporting an inflated head_block won't affect the median unless the\n * majority of nodes agree on that range.\n */\n private consensusHeadBlock(): number {\n const now = Date.now()\n const recent: number[] = []\n for (const h of this.health.values()) {\n if (h.headBlock > 0 && now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS) {\n recent.push(h.headBlock)\n }\n }\n if (recent.length < 2) return 0 // Need at least 2 observations to compare\n recent.sort((a, b) => a - b)\n // Median: for even length, use the lower-middle value (conservative)\n return recent[Math.floor((recent.length - 1) / 2)]\n }\n\n /** True if this node is healthy (globally and for the given API if provided). */\n isNodeHealthy(node: string, api?: string): boolean {\n const h = this.health.get(node)\n if (!h) return true // unknown nodes assumed healthy\n const now = Date.now()\n\n // Rate-limited and cooldown hasn't expired\n if (h.rateLimitedUntil > now) return false\n\n // Too many consecutive failures within the last 30 seconds\n if (h.consecutiveFailures >= 3 && now - h.lastFailureTime < 30_000) return false\n\n // Per-API cooldown: node may be healthy overall but missing this API plugin\n if (api) {\n const apiFail = h.apiFailures.get(api)\n if (apiFail && apiFail.cooldownUntil > now) return false\n }\n\n // Head-block staleness: deprioritize nodes lagging behind the consensus head\n const best = this.consensusHeadBlock()\n if (\n best > 0 &&\n h.headBlock > 0 &&\n now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS &&\n best - h.headBlock > STALE_BLOCK_THRESHOLD\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Order nodes best-first: healthy nodes sorted by adaptive latency score, then\n * unhealthy nodes appended. Capability / staleness / rate-limit filtering stays in\n * `isNodeHealthy` and is unchanged — latency only reorders WITHIN the healthy set,\n * and only WITHIN the array it is handed (so it never leaves the configured list).\n *\n * One ordering per pass MAY promote a healthy node overdue for a re-probe (never\n * sampled, or not sampled within LATENCY_REPROBE_MS) to the front — single-flight\n * via `lastProbeAt`. This is what lets a demoted node climb back when it recovers,\n * and profiles a node that organic traffic (always served by a faster peer) never\n * reaches. Cold start: with no profiles, every node scores the neutral prior and the\n * stable config-index tiebreak yields the original order — i.e. today's behavior.\n */\n getOrderedNodes(nodes: string[], api?: string): string[] {\n const healthy: string[] = []\n const unhealthy: string[] = []\n for (const node of nodes) {\n if (this.isNodeHealthy(node, api)) {\n healthy.push(node)\n } else {\n unhealthy.push(node)\n }\n }\n if (healthy.length <= 1) {\n return [...healthy, ...unhealthy]\n }\n const now = Date.now()\n // Every score in THIS pass falls back to config index on ties → a total,\n // transitive order with no memo (so no stale-denominator inversions).\n const ordered = healthy\n .map((node, i) => ({ node, i, score: this.scoreNode(node, now) }))\n .sort((a, b) => a.score - b.score || a.i - b.i)\n .map((d) => d.node)\n const probe = this.pickReprobeCandidate(healthy, now)\n if (probe && ordered[0] !== probe) {\n return [probe, ...ordered.filter((n) => n !== probe), ...unhealthy]\n }\n return [...ordered, ...unhealthy]\n }\n\n /** A node's latency is usable for ranking only if profiled (≥ MIN_SAMPLES) and fresh. */\n private isLatencyUsable(h: NodeHealth | undefined, now: number): boolean {\n return (\n !!h &&\n h.ewmaLatencyMs !== undefined &&\n h.latencySampleCount >= LATENCY_MIN_SAMPLES &&\n now - h.latencyUpdatedAt <= LATENCY_MAX_AGE_MS\n )\n }\n\n /**\n * Ranking score (lower = better). Unproven/warming nodes get a fixed neutral prior\n * so they sit ahead of a proven-slow node but behind a proven-fast one, and make at\n * most one rank transition when they cross MIN_SAMPLES (no churn).\n */\n private scoreNode(node: string, now: number): number {\n const h = this.health.get(node)\n if (!this.isLatencyUsable(h, now)) return LATENCY_UNPROVEN_PRIOR_MS\n return h!.ewmaLatencyMs!\n }\n\n /**\n * At most one healthy node overdue for an exploratory re-probe: never sampled, or\n * neither sampled nor re-probed within LATENCY_REPROBE_MS. Returns the stalest such\n * node and stamps `lastProbeAt` to single-flight it against concurrent orderings.\n *\n * Note: `getOrCreate` here materializes a health entry per node in the passed list.\n * The node list (`config.nodes`/`restNodes`) is treated as effectively static — set\n * once via `setNodes` — so the map is bounded. If a host is ever removed from the\n * list at runtime its stale entry is simply ignored (never re-surfaced) and is a\n * negligible, bounded amount of memory.\n */\n private pickReprobeCandidate(healthy: string[], now: number): string | undefined {\n const threshold = now - LATENCY_REPROBE_MS\n let cand: string | undefined\n let candTouch = Infinity\n for (const n of healthy) {\n const h = this.getOrCreate(n)\n const touch = Math.max(h.latencyUpdatedAt, h.lastProbeAt)\n if (touch <= threshold && touch < candTouch) {\n cand = n\n candTouch = touch\n }\n }\n if (cand) this.getOrCreate(cand).lastProbeAt = now\n return cand\n }\n}\n\n// Exported for the co-located specs only (asserting the call sites' effect on\n// health). Not re-exported by hive-tx/index.ts, so NOT part of the public API.\n// @internal\nexport const rpcHealthTracker = new NodeHealthTracker()\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\n\n// ── Hedged-request budget ────────────────────────────────────────────────────\n\n/**\n * Token bucket bounding hedged (duplicated) read requests to a fraction of\n * overall traffic. A hedge spends 1 token; every un-hedged success refills\n * `config.resilience.hedgeRefillPerSuccess` (default 0.1 ⇒ steady-state hedge\n * rate ≤ ~9% of successful traffic, with bursts up to `hedgeBucketCapacity`).\n * The self-limiting property this buys: under pool-wide slowness nearly every\n * request wants to hedge while successes (the refills) stagnate, so the bucket\n * drains and hedging auto-disables instead of doubling load into public-node\n * rate limits — the standard hedged-request guard (cf. gRPC's hedging throttle;\n * Dean & Barroso, \"The Tail at Scale\"). One instance per process shared across\n * concurrent calls; plain synchronous mutation is race-free on the JS event\n * loop. Reads config live so runtime tuning via `setResilience` applies.\n * @internal Exported for testing only.\n */\nexport class HedgeBudget {\n private tokens = config.resilience.hedgeBucketCapacity\n\n trySpend(): boolean {\n this.clamp()\n // Epsilon guards fractional-refill float accumulation (10 × 0.1 < 1 in FP64).\n if (this.tokens >= 1 - 1e-9) {\n this.tokens -= 1\n return true\n }\n return false\n }\n\n refill(): void {\n this.clamp()\n this.tokens = Math.min(\n config.resilience.hedgeBucketCapacity,\n this.tokens + config.resilience.hedgeRefillPerSuccess\n )\n }\n\n /** Capacity may be lowered at runtime; never let stored tokens exceed it. */\n private clamp(): void {\n if (this.tokens > config.resilience.hedgeBucketCapacity) {\n this.tokens = config.resilience.hedgeBucketCapacity\n }\n }\n\n /** @internal test hook */\n get available(): number {\n return this.tokens\n }\n\n /** @internal test hook */\n reset(tokens = config.resilience.hedgeBucketCapacity): void {\n this.tokens = tokens\n }\n}\n\n// @internal — exported for the co-located spec only, like the trackers above.\nexport const rpcHedgeBudget = new HedgeBudget()\n\n/**\n * Per-attempt timeout for a read call. A node profiled for THIS profile key\n * (full RPC method / REST api+endpoint template) is given `factor × EWMA` —\n * floored (≥2s) so a moderate spike on a fast call is not cut off, and capped\n * at the caller's ceiling so this can only ever *shorten* the wait. The\n * effect: a node running far above its own baseline for this exact kind of\n * call is abandoned early and failover starts in seconds instead of the full\n * fixed window.\n *\n * Two deliberate exclusions:\n * - `explicit` callers (who passed a timeout argument) keep exactly what they\n * asked for — the documented meaning of the parameter is preserved, and a\n * consumer who knows their call is heavy is never second-guessed.\n * - The profile is per (node, full method) with NO fallback to the node's\n * mixed global EWMA or even the API-prefix average: a baseline dominated by\n * cheap `condenser_api.get_accounts` calls must not set the deadline for a\n * heavy `condenser_api.get_account_history`. An unprofiled (node, method)\n * pair keeps the caller's timeout unchanged (cold start == old behavior).\n */\nfunction adaptiveAttemptTimeout(\n tracker: NodeHealthTracker,\n node: string,\n profileKey: string,\n callerTimeout: number,\n explicit: boolean\n): number {\n const r = config.resilience\n if (!r.adaptiveTimeout || explicit) return callerTimeout\n const ewma = tracker.getUsableLatencyMs(node, profileKey)\n if (ewma === undefined) return callerTimeout\n // EWMAs are fractional, but the result feeds AbortSignal.timeout(), which\n // Node rejects with ERR_OUT_OF_RANGE for non-integer delays (browsers coerce).\n return Math.ceil(\n Math.min(callerTimeout, Math.max(r.adaptiveTimeoutFloorMs, r.adaptiveTimeoutFactor * ewma))\n )\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/** Record a caught error on the health tracker (handles NodeError to avoid double-counting). */\nfunction recordError(tracker: NodeHealthTracker, node: string, e: any, api?: string): void {\n if (e instanceof NodeError) {\n if (e.isRateLimit) {\n // 0 → no usable Retry-After → let recordRateLimit apply escalating backoff.\n tracker.recordRateLimit(node, e.rateLimitMs || undefined)\n } else {\n tracker.recordFailure(node, api)\n }\n } else if (e instanceof RPCError) {\n // RPC-level errors are API-specific (e.g., disabled API)\n tracker.recordFailure(node, api)\n } else {\n // Transport-level failures (DNS, TLS, timeout) affect the whole node\n tracker.recordFailure(node)\n }\n}\n\n/**\n * Passively extract head_block_number from known RPC responses\n * (e.g. `condenser_api.get_dynamic_global_properties`, `database_api.get_dynamic_global_properties`).\n * Silently ignores responses without that shape.\n */\nfunction tryRecordHeadBlock(\n tracker: NodeHealthTracker,\n node: string,\n method: string,\n result: any\n): void {\n if (!result || typeof result !== 'object') return\n if (!method.includes('get_dynamic_global_properties')) return\n const block = (result as any).head_block_number\n if (typeof block === 'number') {\n tracker.recordHeadBlock(node, block)\n }\n}\n\n// ── AbortSignal helpers (browser fallbacks) ─────────────────────────────────\n\n/**\n * Build a TimeoutError \"reason\" for an aborted signal.\n * Prefers the standard `DOMException` when available. Runtimes that ship\n * `AbortController` without `DOMException` (notably React Native / Hermes,\n * old Node < 17) fall back to a plain Error tagged with `name: 'TimeoutError'`\n * — which is what consumers actually check on `signal.reason`.\n */\nfunction createTimeoutReason(): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException('The operation was aborted due to timeout', 'TimeoutError')\n }\n const err = new Error('The operation was aborted due to timeout')\n err.name = 'TimeoutError'\n return err\n}\n\n/** AbortSignal.timeout polyfill for pre-Chrome 103 / pre-Safari 16.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to clear the dangling timer. */\nfunction createTimeoutSignal(ms: number): { signal: AbortSignal; cleanup: () => void } {\n // Node's AbortSignal.timeout throws ERR_OUT_OF_RANGE on fractional delays\n // (browsers coerce them), so guard every caller here.\n ms = Math.ceil(ms)\n if (typeof AbortSignal.timeout === 'function') {\n return { signal: AbortSignal.timeout(ms), cleanup: () => {} }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(createTimeoutReason()), ms)\n return { signal: controller.signal, cleanup: () => clearTimeout(timer) }\n}\n\n/** AbortSignal.any polyfill for pre-Chrome 116 / pre-Safari 17.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to remove listeners from the input signals (prevents leaks when the\n * same long-lived signal is reused across many callRPC invocations). */\nfunction mergeSignals(\n primary: AbortSignal,\n secondary?: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!secondary) return { signal: primary, cleanup: () => {} }\n if (typeof AbortSignal.any === 'function') {\n return { signal: AbortSignal.any([primary, secondary]), cleanup: () => {} }\n }\n // Fallback: controller that aborts with the winning signal's reason\n const controller = new AbortController()\n if (primary.aborted) {\n controller.abort(primary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n if (secondary.aborted) {\n controller.abort(secondary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n\n const onPrimaryAbort = () => controller.abort(primary.reason)\n const onSecondaryAbort = () => controller.abort(secondary.reason)\n primary.addEventListener('abort', onPrimaryAbort, { once: true })\n secondary.addEventListener('abort', onSecondaryAbort, { once: true })\n\n const cleanup = () => {\n primary.removeEventListener('abort', onPrimaryAbort)\n secondary.removeEventListener('abort', onSecondaryAbort)\n }\n return { signal: controller.signal, cleanup }\n}\n\n/**\n * Low-level JSON-RPC call to a single node. No failover.\n * Throws RPCError for blockchain rejections, NodeError for HTTP 429/5xx,\n * and generic Error for other transport failures.\n * @param shouldRetry - If true, retries once on the same node for transient errors.\n */\nconst jsonRPCCall = async (\n url: string,\n method: string,\n params: any,\n timeout = config.timeout,\n shouldRetry = false,\n externalSignal?: AbortSignal\n) => {\n const id = Math.floor(Math.random() * 100_000_000)\n const body = {\n jsonrpc: '2.0',\n method,\n params,\n id\n }\n // Merge the per-call timeout with any external abort signal (e.g., SSR\n // request cancellation). Either one firing cancels the fetch.\n // Fallbacks for browsers without AbortSignal.timeout (pre-Chrome 103)\n // or AbortSignal.any (pre-Chrome 116).\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\n const { signal, cleanup: cleanupMerge } = mergeSignals(tSignal, externalSignal)\n const cleanup = () => {\n cleanupTimeout()\n cleanupMerge()\n }\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...serverIdentityHeaders() },\n signal\n })\n\n // Handle HTTP-level errors before parsing JSON.\n // Throw NodeError so callers can record health exactly once.\n if (res.status === 429) {\n throw new NodeError(url, `HTTP 429 Rate Limited`, {\n rateLimitMs: parseRetryAfterMs(res.headers.get('Retry-After')),\n isRateLimit: true\n })\n }\n // Any other 5xx is a node-level failure. Common cases:\n // 502 Bad Gateway — upstream HAF/jussi down\n // 503 Service Unavail — node draining / maintenance\n // 504 Gateway Timeout — slow upstream\n // 520-530 — Cloudflare interstitials (1033 tunnel error → 530)\n // Without this branch, the HTML error-page body would fall into res.json()\n // and throw a generic SyntaxError downstream, making failover guess at\n // whether the request reached the node.\n if (res.status >= 500 && res.status < 600) {\n throw new NodeError(url, `HTTP ${res.status} from ${url}`)\n }\n\n const result = (await res.json()) as CallResponse\n if (\n !result ||\n typeof result.id === 'undefined' ||\n result.id !== id ||\n result.jsonrpc !== '2.0'\n ) {\n throw new Error('JSONRPC id mismatch')\n }\n if ('result' in result) {\n return result.result\n }\n if ('error' in result) {\n const e = result.error\n if ('message' in e && 'code' in e) {\n throw new RPCError(e)\n }\n throw result.error\n }\n // No result and no error?\n throw result\n } catch (e) {\n if (e instanceof RPCError) {\n throw e\n }\n // NodeError should not be retried on the same node - it's an HTTP status issue\n if (e instanceof NodeError) {\n throw e\n }\n if (externalSignal?.aborted) {\n throw e\n }\n if (shouldRetry) {\n return jsonRPCCall(url, method, params, timeout, false, externalSignal)\n }\n throw e\n } finally {\n cleanup()\n }\n}\n\n/** Small jitter delay between failover attempts to prevent thundering herd. */\nfunction jitterDelay(): Promise {\n return sleep(50 + Math.random() * 50)\n}\n\n// ── Hedged read attempt ─────────────────────────────────────────────────────\n\n/**\n * One hedged READ attempt: start the primary node, and if it is still pending\n * after `max(hedgeDelayFloorMs, hedgeDelayFactor × primary EWMA)`, race a\n * duplicate against the next healthy untried node. First success wins and the\n * loser is aborted. Resolution rules (mirroring the sequential path exactly):\n *\n * - External abort (caller cancelled): reject immediately, record nothing.\n * - Authoritative RPCError (non-node-level blockchain rejection) from either\n * leg: an answer, not a fault — abort the other leg, reject immediately.\n * - Failover-class failure: record health for that leg (recordError +\n * recordSlowFailure — identical to the sequential catch); if the other leg\n * is still running, keep waiting on it; when both have failed, reject with\n * the last error so the outer loop continues its normal failover.\n * - Primary fails BEFORE the hedge fires: reject immediately (plain failover —\n * hedging only ever races slowness, never a node that failed fast).\n *\n * Health/budget bookkeeping on a win: winner records a normal success sample;\n * if the hedge won, the primary gets a censored latency sample (elapsed at\n * abort — a lower bound on its true latency) so repeated hedge-wins reorder\n * the pool; if the primary won without the hedge ever firing, the budget\n * refills. An aborted hedge leg records nothing (it was never given a fair\n * run). Broadcasts NEVER go through this path (double-broadcast risk) — it is\n * wired into `callRPC` only.\n */\nfunction hedgedRpcAttempt(opts: {\n method: string\n params: any[] | object\n api: string\n primary: string\n /**\n * Pre-selected healthy untried peers (up to a few, in rank order). The\n * actual hedge target is drawn uniformly at random at FIRE time: with many\n * concurrent callers behind one origin IP, always duplicating to the single\n * next-ranked node would concentrate the whole hedge stream on it and could\n * trip its per-IP rate limit — spreading over the top candidates keeps the\n * same budget bound without a single-target hotspot. Marked tried only if\n * the hedge actually fires.\n */\n hedgePool: string[]\n callerTimeout: number\n /** Caller passed an explicit timeout — adaptive shortening is disabled. */\n explicitTimeout: boolean\n /** The call's wall-clock deadline: a hedge must not START past it (it would\n * be a brand-new request the outer loop itself would refuse to start). */\n deadlineAt: number\n externalSignal?: AbortSignal\n /** Lets the outer loop add the hedge node to its tried-set at fire time. */\n onHedgeFired: (node: string) => void\n /** Caller-supplied payload validation — see callRPC's `validate` param. */\n validate?: (result: unknown) => boolean\n}): Promise {\n const {\n method,\n params,\n api,\n primary,\n hedgePool,\n callerTimeout,\n explicitTimeout,\n deadlineAt,\n externalSignal,\n onHedgeFired,\n validate\n } = opts\n return new Promise((resolve, reject) => {\n let done = false\n let pendingLegs = 0\n let hedgeFired = false\n /** The primary settled on its own (success OR failure). A censored latency\n * sample is only valid for a primary that was still in flight when the\n * hedge won — recording one after the primary already failed would\n * fabricate a second sample for a request whose outcome was recorded. */\n let primarySettled = false\n let lastError: any\n let hedgeTimer: ReturnType | undefined\n let primaryStart = 0\n const controllers: AbortController[] = []\n\n /** Settle exactly once: clear the timer, abort every other in-flight leg\n * (their rejections land behind the `done` guard and are dropped). */\n const finish = (settle: () => void) => {\n if (done) return\n done = true\n if (hedgeTimer !== undefined) {\n clearTimeout(hedgeTimer)\n hedgeTimer = undefined\n }\n for (const c of controllers) {\n if (!c.signal.aborted) c.abort()\n }\n settle()\n }\n\n const startLeg = (node: string, isHedge: boolean) => {\n pendingLegs++\n const controller = new AbortController()\n controllers.push(controller)\n // Merge our cancellation handle with the caller's signal; jsonRPCCall\n // merges the result with its own per-attempt timeout signal.\n const merged = mergeSignals(controller.signal, externalSignal)\n const legTimeout = adaptiveAttemptTimeout(\n rpcHealthTracker,\n node,\n method,\n callerTimeout,\n explicitTimeout\n )\n const start = Date.now()\n if (!isHedge) primaryStart = start\n jsonRPCCall(node, method, params, legTimeout, false, merged.signal)\n .then((res) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Same handling as the catch\n // path — record the fault against this node's API health, never\n // record a success for a lie, and let the other leg still win.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(\n `[hive-tx] response validation failed for ${method} from ${node}`\n )\n if (!isHedge && !hedgeFired) {\n finish(() => reject(lastError))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n return\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - start, method)\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n if (isHedge) {\n if (!primarySettled) {\n // Primary lost the race while still in flight: censored sample\n // (lower bound of its true latency) so the ranker learns without\n // marking it as failed. A primary that already failed was fully\n // recorded by its own catch — nothing more to record.\n rpcHealthTracker.recordCensoredLatency(primary, Date.now() - primaryStart, method)\n }\n } else if (!hedgeFired) {\n rpcHedgeBudget.refill()\n }\n finish(() => resolve(res as T))\n })\n .catch((e) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return // aborted loser (or late settle) — already resolved\n if (externalSignal?.aborted) {\n // Caller cancelled — bail without recording (mirrors sequential path).\n finish(() => reject(e))\n return\n }\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n // Authoritative rejection: an answer, not a node fault.\n finish(() => reject(e))\n return\n }\n // Failover-class failure — record exactly as the sequential catch does.\n recordError(rpcHealthTracker, node, e, api)\n rpcHealthTracker.recordSlowFailure(node, Date.now() - start, method)\n lastError = e\n if (!isHedge && !hedgeFired) {\n // Primary failed fast, before the hedge delay: plain failover.\n finish(() => reject(e))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n // else: the other leg is still in flight and may still win.\n })\n }\n\n startLeg(primary, false)\n\n // Delay from the primary's per-method profile (the eligibility gate\n // ensured it is usable); a raced expiry just means the floor applies. It is\n // then clamped BELOW the primary's own attempt window: for a heavy API\n // (EWMA > window/hedgeDelayFactor) the un-clamped delay would land past\n // the primary's timeout-abort — which clears this timer — so hedging would\n // silently never fire for exactly the heavy tail it exists to protect.\n // Firing at ~80% of the window keeps the duplicate meaningful (it starts\n // while the primary is still allowed to win) for every profile shape.\n const ewma = rpcHealthTracker.getUsableLatencyMs(primary, method) ?? 0\n const primaryWindow = adaptiveAttemptTimeout(\n rpcHealthTracker,\n primary,\n method,\n callerTimeout,\n explicitTimeout\n )\n const delay = Math.min(\n Math.max(config.resilience.hedgeDelayFloorMs, config.resilience.hedgeDelayFactor * ewma),\n 0.8 * primaryWindow\n )\n hedgeTimer = setTimeout(() => {\n hedgeTimer = undefined\n if (done || externalSignal?.aborted) return\n // Never START a duplicate past the call's wall-clock deadline — it would\n // extend the hold and spend a token on work the outer loop would refuse.\n if (Date.now() >= deadlineAt) return\n // Candidates were selected before the delay elapsed — re-check health at\n // fire time (one may have been rate-limited meanwhile) BEFORE spending a\n // token, so a stale pool costs nothing. Random draw spreads concurrent\n // callers' duplicates across the top candidates (see hedgePool doc).\n const live = hedgePool.filter((n) => rpcHealthTracker.isNodeHealthy(n, api))\n if (live.length === 0) return\n const target = live[Math.floor(Math.random() * live.length)]\n // Budget check at fire time, not arm time: only actual duplicates spend.\n if (!rpcHedgeBudget.trySpend()) return\n hedgeFired = true\n onHedgeFired(target)\n startLeg(target, true)\n }, delay)\n })\n}\n\n// ── Public API: callRPC ─────────────────────────────────────────────────────\n\n/**\n * Makes API calls to Hive blockchain nodes with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, jitter between retries,\n * and HTTP status awareness (429 rate limiting, 503).\n *\n * If the current node fails, it will automatically try the next healthy node.\n * When all nodes have been tried, wraps around to give earlier nodes another chance\n * until the full retry budget (config.retry) is exhausted.\n * RPCErrors (valid blockchain rejections) are never retried.\n *\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Maximum number of retry attempts (default: config.retry). The\n * wall-clock budget (`config.resilience.totalBudgetFactor` × timeout) may end\n * the failover walk before the retry count is exhausted.\n * @param validate - Optional payload validation. Some nodes return a valid\n * JSON-RPC envelope carrying an impossible payload (e.g. account rows with\n * metadata fields stripped to \"\"), which no transport-level check can catch.\n * When the callback returns false the response is treated as a node fault:\n * recorded against that node's per-API health (repeat offenders get an API\n * cooldown and are deprioritized) and the failover walk continues to the\n * next node instead of returning the lie. Keep validators conservative —\n * reject only payloads the caller KNOWS cannot be correct, or a strict\n * validator turns every node's honest answer into a failover storm.\n * @returns Promise resolving to the API response\n * @throws {RPCError} On blockchain-level errors (bad params, missing authority, etc.)\n * @throws {Error} If all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callRPC } from 'hive-tx'\n *\n * // Get account information\n * const accounts = await callRPC('condenser_api.get_accounts', [['alice']])\n *\n * // Custom timeout and retry settings\n * const data = await callRPC('condenser_api.get_content', ['alice', 'test-post'], 10_000, 5)\n * ```\n */\nexport const callRPC = async (\n method: string,\n params: any[] | object = [],\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal,\n validate?: (result: unknown) => boolean\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n // An explicit timeout argument is authoritative: adaptive shortening only\n // applies to callers who left the window to the SDK (timeout === undefined),\n // so `callRPC(m, p, 10_000)` still means \"give each attempt 10s\" exactly.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const api = apiOf(method)\n // Wall-clock budget across ALL failover attempts. Without it the worst case\n // is (retry+1) × timeout ≈ 30s — exactly the render pile-up this feature\n // exists to prevent — whenever the WHOLE pool is slow (adaptive timeouts\n // rise with the EWMAs and hedging self-throttles, both by design). The\n // deadline is checked before each new attempt AND before a hedge fires; an\n // in-flight attempt still finishes its own window, so the true ceiling is\n // deadline + one attempt window (up to ~2× the window if a hedge fired just\n // before the deadline and the attempt then waits out the hedge leg too).\n // Note this budget also bounds callers who passed an explicit `retry`: the\n // wall clock, not the attempt count, is the stronger promise here.\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Track nodes tried in the current round. When all nodes have been tried,\n // clear the set to allow a second round (wrap-around) using the retry budget.\n const triedInRound = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so nodes with an API-specific cooldown are deprioritized.\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n // Pick the healthiest untried node. If all tried, start a new round.\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n\n // Hedge eligibility for THIS attempt: opted in, the primary has a usable\n // latency profile for this exact method (so the hedge delay is grounded in\n // data — cold starts stay sequential), and healthy untried peers exist.\n let hedgePool: string[] = []\n if (\n config.resilience.hedge &&\n rpcHealthTracker.getUsableLatencyMs(node, method) !== undefined\n ) {\n hedgePool = orderedNodes\n .filter((n) => !triedInRound.has(n) && rpcHealthTracker.isNodeHealthy(n, api))\n .slice(0, 3)\n }\n\n if (hedgePool.length > 0) {\n try {\n // All health/budget recording happens inside the hedged attempt —\n // the catch below must NOT record again (unlike the sequential path).\n return await hedgedRpcAttempt({\n method,\n params,\n api,\n primary: node,\n hedgePool,\n callerTimeout: ceiling,\n explicitTimeout,\n deadlineAt: deadline,\n externalSignal: signal,\n onHedgeFired: (n) => triedInRound.add(n),\n validate\n })\n } catch (e: any) {\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n lastError = e\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n }\n\n const callStart = Date.now()\n try {\n const res = await jsonRPCCall(\n node,\n method,\n params,\n adaptiveAttemptTimeout(rpcHealthTracker, node, method, ceiling, explicitTimeout),\n false,\n signal\n )\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Count it against this node's API\n // health (never record a success or refill the hedge budget for a\n // lie) and fail over to the next node.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(`[hive-tx] response validation failed for ${method} from ${node}`)\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart, method)\n // An un-hedged success is what earns hedge budget back (see HedgeBudget).\n rpcHedgeBudget.refill()\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n return res as T\n } catch (e: any) {\n // RPCErrors: distinguish node-level failures from genuine blockchain rejections.\n // Node-level errors (e.g. -32602 \"Unable to parse endpoint data\" from a sick\n // HAF/jussi backend) should failover; real rejections (bad params, missing\n // authority, etc.) propagate immediately.\n if (e instanceof RPCError) {\n if (!isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n // Node-level RPC error — record failure and fall through to failover\n }\n // External abort — stop retrying immediately\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n // A genuinely slow failure (timeout/abort/slow-5xx) is also a latency signal so\n // a node that 200s-but-too-slow or aborts at the timeout is demoted by the\n // ranker, not only by the (transient) failure gate. Measured elapsed, never a\n // constant; recordSlowFailure ignores instant (down-node) failures.\n rpcHealthTracker.recordSlowFailure(node, Date.now() - callStart, method)\n lastError = e\n\n // Add jitter before trying next node\n if (attempt < retry) {\n await jitterDelay()\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callRPC for broadcasts ──────────────────────────────────────\n\n/**\n * Broadcast-safe RPC call. Only retries on pre-connection errors where the\n * request definitively never reached the server (ECONNREFUSED, ENOTFOUND, etc.).\n * On timeouts, HTTP errors, or any ambiguous failure, throws immediately to\n * prevent double-broadcasting transactions.\n *\n * Tries each node once (no wrap-around) since broadcast retries are dangerous.\n *\n * @internal Used by Transaction.broadcast()\n */\nexport const callRPCBroadcast = async (\n method: string,\n params: any[] | object = [],\n timeout = config.broadcastTimeout,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n const api = apiOf(method)\n // Track which nodes we've already tried - broadcasts must never retry the same node\n const triedNodes = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt < config.nodes.length; attempt++) {\n // Re-evaluate order each attempt so health changes are respected\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n const node = orderedNodes.find((n) => !triedNodes.has(n))\n if (!node) break\n triedNodes.add(node)\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n // Deliberately no latency sample for broadcasts: broadcast_transaction_synchronous\n // blocks for block inclusion (~1.5–3s+) regardless of the node's read speed, so\n // feeding it into the shared read EWMA would wrongly demote a fast node for reads.\n // The same nodes are profiled by callRPC read traffic, so a genuinely slow node is\n // still demoted there.\n rpcHealthTracker.recordSuccess(node, api)\n return res as T\n } catch (e: any) {\n // RPCErrors are valid blockchain rejections - never retry\n if (e instanceof RPCError) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n lastError = e\n\n // Broadcast safety: only fail over when the request is safe to re-send.\n // `broadcastOperations` signs the tx exactly once and `callRPCBroadcast`\n // reuses that signed payload across nodes, so any case where the next\n // node would dedupe by trx_id is fine. RPCErrors (real blockchain\n // rejections) propagate immediately — see isBroadcastSafeToRetry.\n if (!isBroadcastSafeToRetry(e)) {\n throw e\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callREST ────────────────────────────────────────────────────\n\nconst apiMethods: Record = {\n balance: '/balance-api',\n hafah: '/hafah-api',\n hafbe: '/hafbe-api',\n hivemind: '/hivemind-api',\n hivesense: '/hivesense-api',\n reputation: '/reputation-api',\n 'nft-tracker': '/nft-tracker-api',\n hafsql: '/hafsql',\n status: '/status-api'\n}\n\n/**\n * Makes REST API calls to Hive blockchain REST endpoints with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, and timeout support.\n * Wraps around the node list to honor the full retry budget.\n *\n * @template Api - The REST API method type (e.g., 'balance', 'hafah', 'hivemind', etc.)\n * @template P - The endpoint path type for the specified API\n *\n * @param api - The REST API method name to call\n * @param endpoint - The specific endpoint path within the API\n * @param params - Optional parameters for path and query string replacement\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Number of retry attempts before throwing an error (default:\n * config.retry). The wall-clock budget (`config.resilience.totalBudgetFactor`\n * × timeout) may end the failover walk before the retry count is exhausted.\n *\n * @returns Promise resolving to the API response data with proper typing\n * @throws Error if all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callREST } from 'hive-tx'\n *\n * // Get account balance\n * const balance = await callREST('balance', '/accounts/{account-name}/balances', { \"account-name\": 'alice' })\n *\n * // Custom timeout and retry settings\n * const data = await callREST('status', '/status', undefined, 10_000, 3)\n * ```\n */\nexport async function callREST(\n api: APIMethods,\n endpoint: string,\n params?: Record,\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal\n): Promise {\n if (!Array.isArray(config.restNodes)) {\n throw new Error('config.restNodes is not an array')\n }\n if (config.restNodes.length === 0) {\n throw new Error('config.restNodes is empty')\n }\n // Same contract as callRPC: an explicit timeout argument is authoritative\n // (no adaptive shortening), and a wall-clock deadline bounds the total\n // failover walk when the whole pool is slow.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Latency-profile key: api + endpoint TEMPLATE (pre-substitution, so the\n // cardinality is code-defined) — a cheap endpoint's baseline must not set\n // the deadline for a heavy one within the same REST api.\n const restProfileKey = `${api}:${endpoint}`\n // Per-API node override: an API served by only a subset of nodes (e.g.\n // hivesense) uses its own capable-host list so the small retry budget and\n // cold starts aren't wasted on nodes that 404/503 it. Any API without an\n // override (or with an empty one) falls back to the generic restNodes.\n const apiNodes =\n config.restNodesByApi?.[api]?.length\n ? config.restNodesByApi[api]!\n : config.restNodes\n const triedInRound = new Set()\n let lastError: any\n // Track whether the error was already recorded by the HTTP status handler\n let alreadyRecorded = false\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so per-API cooldowns are respected.\n const orderedNodes = restHealthTracker.getOrderedNodes(apiNodes, api)\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n const baseUrl = node + apiMethods[api]\n let path = endpoint as string\n const paramObj = params || ({} as Record)\n const processedPathParams = new Set()\n\n // Replace path params ONLY\n Object.entries(paramObj).forEach(([key, value]) => {\n if (path.includes(`{${key}}`)) {\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)))\n processedPathParams.add(key)\n }\n })\n const url = new URL(baseUrl + path)\n // Add ONLY remaining params as query (if any)\n Object.entries(paramObj).forEach(([key, value]) => {\n if (!processedPathParams.has(key)) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n })\n\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n alreadyRecorded = false\n // Adaptive per-attempt timeout (see adaptiveAttemptTimeout): a profiled\n // REST node is abandoned at factor×EWMA instead of the full fixed window.\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(\n adaptiveAttemptTimeout(restHealthTracker, node, restProfileKey, ceiling, explicitTimeout)\n )\n const { signal: restSignal, cleanup: cleanupMerge } = mergeSignals(tSignal, signal)\n const restCleanup = () => { cleanupTimeout(); cleanupMerge() }\n const restCallStart = Date.now()\n try {\n const response = await fetch(url.toString(), {\n signal: restSignal,\n headers: serverIdentityHeaders()\n })\n if (response.status === 404) {\n throw new Error('HTTP 404 - Hint: can happen on wrong params')\n }\n if (response.status === 429) {\n // 0 (no usable Retry-After) → undefined → escalating backoff in recordRateLimit.\n restHealthTracker.recordRateLimit(\n node,\n parseRetryAfterMs(response.headers.get('Retry-After')) || undefined\n )\n alreadyRecorded = true\n throw new Error(`HTTP 429 Rate Limited by ${node}`)\n }\n if (response.status === 503) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP 503 Service Unavailable from ${node}`)\n }\n if (!response.ok) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP ${response.status} from ${node}`)\n }\n restHealthTracker.recordSuccess(node, api, Date.now() - restCallStart, restProfileKey)\n return response.json() as any\n } catch (e: any) {\n // 404 is not a node issue, don't failover\n if (e?.message?.includes('HTTP 404')) {\n throw e\n }\n // External abort (caller unmounted / React Query cancelled the request) is the\n // client's decision, NOT a node fault. Mirror callRPC: bail before recording any\n // failure or slow-latency sample so a healthy REST node (e.g. an own node) is never\n // demoted by routine navigation/cancellation.\n if (signal?.aborted) {\n throw e\n }\n // Only record if not already recorded by 429/503 handler above\n if (!alreadyRecorded) {\n restHealthTracker.recordFailure(node, api)\n }\n // A slow failure (timeout/abort/slow-5xx — e.g. an own node from a far region) is a\n // latency signal too, so it is demoted by the ranker, not only the failure gate.\n // Measured elapsed; recordSlowFailure floors at LATENCY_SLOW_FAILURE_MS so a fast\n // 404/429 or instant down-node failure is NOT mis-read as \"slow\".\n restHealthTracker.recordSlowFailure(node, Date.now() - restCallStart, restProfileKey)\n lastError = e\n\n if (attempt < retry) {\n await jitterDelay()\n }\n } finally {\n restCleanup()\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callWithQuorum ───────────────────────────────────────────────\n\n/**\n * Make a JSONRPC call with quorum. The method will cross-check the result\n * with `quorum` number of nodes before returning the result.\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param quorum - Default: 2 (recommended)\n */\nexport const callWithQuorum = async (\n method: string,\n params: any[] | object = [],\n quorum = 2,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an Array')\n }\n if (quorum > config.nodes.length) {\n throw new Error('quorum > config.nodes.length')\n }\n // We call random nodes for better security (Fisher-Yates shuffle)\n const shuffleNodes = (arr: string[]) => {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n }\n let allNodes = shuffleNodes(config.nodes)\n let currentBatchSize = Math.min(quorum, allNodes.length)\n let allResults: any[] = []\n while (currentBatchSize > 0 && allNodes.length > 0) {\n // Take next batch of nodes\n const batchNodes = allNodes.splice(0, currentBatchSize)\n const promises: Promise[] = []\n const batchResults: any[] = []\n // Launch batch calls in parallel\n for (let i = 0; i < batchNodes.length; i++) {\n promises.push(\n jsonRPCCall(batchNodes[i], method, params, undefined, true, signal)\n .then((data) => batchResults.push(data))\n .catch(() => {})\n )\n }\n await Promise.all(promises)\n allResults.push(...batchResults)\n // Check for consensus in successful results\n const consensusResult = findConsensus(allResults, quorum)\n if (consensusResult) {\n return consensusResult\n }\n // Prepare next batch\n currentBatchSize = Math.min(quorum, allNodes.length)\n if (currentBatchSize === 0) {\n throw new Error('No more nodes available.')\n }\n }\n throw new Error(\"Couldn't reach quorum.\")\n}\n\nfunction findConsensus(results: any[], quorum: number) {\n const resultGroups = new Map()\n for (const result of results) {\n const key = JSON.stringify(result)\n if (!resultGroups.has(key)) {\n resultGroups.set(key, [])\n }\n resultGroups.get(key)!.push(result)\n }\n const consensusGroup = Array.from(resultGroups.values()).find((group) => group.length >= quorum)\n return consensusGroup ? consensusGroup[0] : null\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { PrivateKey } from './helpers/PrivateKey'\nimport {\n OperationName,\n OperationBody,\n TransactionType,\n TransactionStatus,\n BroadcastResult\n} from './types'\nimport { ByteBuffer } from './helpers/ByteBuffer'\nimport { Serializer } from './helpers/serializer'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { config } from './config'\nimport { callRPC, callRPCBroadcast, RPCError } from './helpers/call'\nimport { DigestData } from './types'\nimport { sleep } from './helpers/sleep'\n\nconst chainId = hexToBytes(config.chain_id)\n\ninterface TransactionOptions {\n transaction?: TransactionType | Transaction\n /**\n * Transaction expiration in milliseconds (ms) - max 86400000 (24 hours)\n * @default 60_000\n */\n expiration?: number\n}\n\nexport class Transaction {\n transaction?: TransactionType\n\n expiration: number = 60_000\n\n private txId?: string\n\n constructor(options?: TransactionOptions) {\n if (options?.transaction) {\n if (options.transaction instanceof Transaction) {\n this.transaction = options.transaction.transaction\n this.expiration = options.transaction.expiration\n } else {\n this.transaction = options.transaction\n }\n // A transaction built externally (e.g. from a hive-uri signing request)\n // may omit the `signatures` array. sign(), addSignature() and broadcast()\n // all assume it exists, so normalize it here to avoid\n // \"Cannot read property 'push' of undefined\" on sign.\n if (this.transaction && !Array.isArray(this.transaction.signatures)) {\n this.transaction.signatures = []\n }\n this.txId = this.digest().txId\n }\n if (options?.expiration) {\n this.expiration = options.expiration\n }\n }\n\n /**\n * Adds an operation to the transaction. If no transaction exists, creates one first.\n * @template O Operation name type for type safety\n * @param operationName The name/type of the operation to add (e.g., 'transfer', 'vote', 'comment')\n * @param operationBody The operation data/body for the specified operation type\n * @returns Promise that resolves when the operation is added\n * @throws Error if transaction creation fails or global properties cannot be retrieved\n */\n async addOperation(\n operationName: O,\n operationBody: OperationBody\n ): Promise {\n if (!this.transaction) {\n await this.createTransaction(this.expiration)\n }\n this.transaction!.operations.push([operationName, operationBody])\n }\n\n /**\n * Signs the transaction with the provided key(s), supporting both single and multi-signature transactions.\n * For multi-signature, you can sign with all keys at once or sign individually by calling this method multiple times.\n * @param keys Single PrivateKey or array of PrivateKeys to sign the transaction with\n * @returns The signed transaction\n * @throws Error if no transaction exists to sign\n */\n sign(keys: PrivateKey | PrivateKey[]): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n if (this.transaction) {\n const { digest, txId } = this.digest()\n if (!Array.isArray(keys)) {\n keys = [keys]\n }\n for (const key of keys) {\n const signature = key.sign(digest)\n this.transaction.signatures.push(signature.customToString())\n }\n this.txId = txId\n return this.transaction\n } else {\n throw new Error('No transaction to sign')\n }\n }\n\n /**\n * Broadcasts the signed transaction to the Hive network.\n * Automatically handles retries and duplicate transaction detection.\n * @param checkStatus By default (false) the transaction is not guaranteed to be included in a block.\n * For example the transaction can expire while waiting in mempool.\n * If you pass true here, the function will wait for the transaction to be either included or dropped\n * before returning a result.\n * @returns Promise resolving to broadcast result\n * @throws Error if no transaction exists or transaction is not signed or transaction got rejected\n */\n async broadcast(checkStatus = false): Promise {\n if (!this.transaction) {\n throw new Error(\n 'Attempted to broadcast an empty transaction. Add operations by .addOperation()'\n )\n }\n if (this.transaction.signatures.length === 0) {\n throw new Error(\n 'Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)'\n )\n }\n try {\n await callRPCBroadcast('condenser_api.broadcast_transaction', [this.transaction])\n } catch (e) {\n if (e instanceof RPCError && e.message.includes('Duplicate transaction check failed')) {\n // ignore duplicate transaction error as this can happen when we retry the broadcast\n } else {\n throw e\n }\n }\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n if (!checkStatus) {\n return { tx_id: this.txId, status: 'unknown' }\n }\n // Poll until the transaction reaches a final state or max attempts exceeded.\n // With 60 attempts: delays grow from 1.3s to 19s, total wait ~10 minutes.\n const maxPollAttempts = 60\n await sleep(1000)\n let status = await this.checkStatus()\n let i = 1\n while (\n status?.status !== 'within_irreversible_block' &&\n status?.status !== 'expired_irreversible' &&\n status?.status !== 'too_old' &&\n i < maxPollAttempts\n ) {\n await sleep(1000 + i * 300)\n status = await this.checkStatus()\n i++\n }\n return {\n tx_id: this.txId,\n status: (status?.status ?? 'unknown') as BroadcastResult['status']\n }\n }\n\n /**\n * Returns the transaction digest containing the transaction ID and hash.\n * The digest can be used to verify signatures and for transaction identification.\n * @returns DigestData containing transaction ID and hash\n * @throws Error if no transaction exists\n */\n digest(): DigestData {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n const temp = { ...this.transaction }\n try {\n Serializer.Transaction(buffer, temp)\n } catch (cause) {\n throw new Error('Unable to serialize transaction: ' + cause)\n }\n buffer.flip()\n const transactionData = new Uint8Array(buffer.toBuffer())\n const txId = bytesToHex(sha256(transactionData)).slice(0, 40)\n const digest = sha256(new Uint8Array([...chainId, ...transactionData]))\n return { digest, txId }\n }\n\n /**\n * Adds a signature to an already created transaction. Useful when signing with external tools.\n * Multiple signatures can be added one at a time for multi-signature transactions.\n * @param signature The signature string in hex format (must be exactly 130 characters)\n * @returns The transaction with the added signature\n * @throws Error if no transaction exists or signature format is invalid\n */\n addSignature(signature: string): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .create(operations)')\n }\n if (typeof signature !== 'string') {\n throw new Error('Signature must be string')\n }\n if (signature.length !== 130) {\n throw new Error('Signature must be 130 characters long')\n }\n this.transaction.signatures.push(signature)\n return this.transaction\n }\n\n /** Get status of this transaction. Usually called internally after broadcasting. */\n async checkStatus(): Promise {\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n return callRPC('transaction_status_api.find_transaction', {\n transaction_id: this.txId,\n expiration: this.transaction?.expiration\n })\n }\n\n /**\n * Creates the transaction structure and initializes it with blockchain data.\n * Retrieves current head block information and sets up reference block data.\n * @private\n * @param expiration Transaction expiration in milliseconds\n */\n private createTransaction = async (expiration: number) => {\n const props = await callRPC('condenser_api.get_dynamic_global_properties', [])\n const bytes = hexToBytes(props.head_block_id)\n const refBlockPrefix = Number(new Uint32Array(bytes.buffer, bytes.byteOffset + 4, 1)[0])\n const expirationIso = new Date(Date.now() + expiration).toISOString().slice(0, -5)\n this.transaction = {\n expiration: expirationIso,\n extensions: [],\n operations: [],\n ref_block_num: props.head_block_number & 0xffff,\n ref_block_prefix: refBlockPrefix,\n signatures: []\n }\n }\n}\n","import bs58 from 'bs58'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PublicKey } from './PublicKey'\nimport { Signature } from './Signature'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport type KeyRole = 'owner' | 'active' | 'posting' | 'memo'\n\nconst NETWORK_ID = new Uint8Array([0x80])\n\n/**\n * ECDSA (secp256k1) private key for signing and encryption operations.\n * Handles key generation, derivation from seeds/passwords, and cryptographic operations.\n *\n * All private keys are stored internally as Uint8Array and can be converted to/from\n * Wallet Import Format (WIF) strings for storage and transmission.\n *\n * @example\n * ```typescript\n * // From WIF string\n * const key = PrivateKey.from('5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw')\n *\n * // Generate random key\n * const randomKey = PrivateKey.randomKey()\n *\n * // From username and password\n * const loginKey = PrivateKey.fromLogin('username', 'password')\n *\n * // Sign a message\n * const signature = key.sign(someHash)\n *\n * // Get public key\n * const pubKey = key.createPublic()\n * ```\n */\nexport class PrivateKey {\n key: Uint8Array\n\n constructor(key: Uint8Array) {\n this.key = key\n try {\n secp256k1.getPublicKey(key)\n } catch (e) {\n throw new Error('invalid private key')\n }\n }\n\n /**\n * Creates a PrivateKey instance from a WIF string or raw Uint8Array.\n * Automatically detects the input type and uses the appropriate method.\n *\n * @param value - WIF formatted string or raw 32-byte key as Uint8Array\n * @returns New PrivateKey instance\n * @throws Error if the key format is invalid\n */\n static from(value: string | Uint8Array): PrivateKey {\n if (typeof value === 'string') {\n return PrivateKey.fromString(value)\n } else {\n return new PrivateKey(value)\n }\n }\n\n /**\n * Creates a PrivateKey from a Wallet Import Format (WIF) encoded string.\n *\n * @param wif - WIF encoded private key string\n * @returns New PrivateKey instance\n * @throws Error if WIF format is invalid or checksum fails\n */\n static fromString(wif: string): PrivateKey {\n return new PrivateKey(decodePrivate(wif).subarray(1))\n }\n\n /**\n * Creates a PrivateKey from a seed string or Uint8Array.\n * The seed is hashed with SHA256 to produce the private key.\n *\n * @param seed - Seed string (converted to bytes) or raw byte array\n * @returns New PrivateKey instance derived from seed\n */\n static fromSeed(seed: string | Uint8Array): PrivateKey {\n if (typeof seed === 'string') {\n const isHex = /^[0-9a-fA-F]+$/.test(seed)\n if (isHex) {\n seed = hexToBytes(seed)\n } else {\n // Convert non-hex string to Uint8Array using UTF-8 encoding\n // Avoid top-level TextEncoder — not available on all runtimes (e.g. Hermes)\n const bytes: number[] = []\n for (let i = 0; i < seed.length; i++) {\n let c = seed.charCodeAt(i)\n if (c < 0x80) {\n bytes.push(c)\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < seed.length) {\n const next = seed.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n seed = new Uint8Array(bytes)\n }\n }\n return new PrivateKey(sha256(seed))\n }\n\n /**\n * Derives a PrivateKey from username, password, and role using Hive's key derivation scheme.\n * This generates the same keys that the Hive wallet uses for login-based keys.\n *\n * @param username - Hive username\n * @param password - Master password (or seed phrase)\n * @param role - Key role ('owner', 'active', 'posting', 'memo')\n * @returns New PrivateKey instance for the specified role\n */\n static fromLogin(username: string, password: string, role: KeyRole = 'active'): PrivateKey {\n const seed = username + role + password\n return PrivateKey.fromSeed(seed)\n }\n\n /**\n * Signs a 32-byte message hash using ECDSA and returns a recoverable signature.\n * The signature includes recovery information to allow public key recovery.\n *\n * @param message - 32-byte message hash to sign (Uint8Array)\n * @returns Signature object containing the signature data\n */\n sign(message: Uint8Array): Signature {\n const rv = secp256k1.sign(message, this.key, {\n extraEntropy: true,\n format: 'recovered',\n prehash: false // prehash does sha256 on the message\n })\n const recovery = parseInt(bytesToHex(rv.subarray(0, 1)), 16)\n return Signature.from((recovery + 31).toString(16) + bytesToHex(rv.subarray(1)))\n }\n\n /**\n * Derives the corresponding public key for this private key.\n *\n * @param prefix - Optional address prefix (defaults to config.address_prefix)\n * @returns PublicKey instance derived from this private key\n */\n createPublic(prefix?: string): PublicKey {\n return new PublicKey(secp256k1.getPublicKey(this.key), prefix)\n }\n\n /**\n * Returns the private key as a Wallet Import Format (WIF) encoded string.\n * This includes network ID and checksum for safe storage/transmission.\n *\n * @returns WIF encoded private key string\n */\n toString(): string {\n return encodePrivate(new Uint8Array([...NETWORK_ID, ...this.key]))\n }\n\n /**\n * Returns a masked representation of the private key for debugging/logging.\n * Shows only the first and last 6 characters to avoid accidental exposure.\n * Use toString() to get the full key for export/serialization.\n *\n * @returns Masked key representation for safe logging\n */\n inspect(): string {\n const key = this.toString()\n return `PrivateKey: ${key.slice(0, 6)}...${key.slice(-6)}`\n }\n\n /**\n * Computes a shared secret using ECDH key exchange for memo encryption.\n * The shared secret is used as a key for AES encryption/decryption.\n *\n * @param publicKey - Other party's public key\n * @returns 64-byte shared secret as Uint8Array\n */\n getSharedSecret(publicKey: PublicKey): Uint8Array {\n const s = secp256k1.getSharedSecret(this.key, publicKey.key)\n // strip the parity byte\n return sha512(s.subarray(1))\n }\n\n /**\n * Generates a new cryptographically secure random private key.\n * Uses the secp256k1 key generation algorithm for security.\n * This method may take up to 250ms due to entropy collection.\n *\n * @returns New randomly generated PrivateKey instance\n */\n static randomKey(): PrivateKey {\n return new PrivateKey(secp256k1.keygen().secretKey)\n }\n}\n\nconst doubleSha256 = (input: Uint8Array) => {\n const dbl = sha256(sha256(input))\n return dbl\n}\n\n/** Encode bs58+doubleSha256-checksum private key. */\nconst encodePrivate = (key: Uint8Array) => {\n // assert.equal(key.readUInt8(0), 0x80, 'private key network id mismatch')\n const checksum = doubleSha256(key)\n return bs58.encode(new Uint8Array([...key, ...checksum.slice(0, 4)]))\n}\n\n/** Decode bs58+doubleSha256-checksum encoded private key. */\nconst decodePrivate = (encodedKey: string) => {\n const buffer = bs58.decode(encodedKey)\n if (!isUint8ArrayEqual(buffer.slice(0, 1), NETWORK_ID)) {\n throw new Error('Private key network id mismatch')\n }\n const checksum = buffer.slice(-4)\n const key = buffer.slice(0, -4)\n const checksumVerify = doubleSha256(key).slice(0, 4)\n if (!isUint8ArrayEqual(checksum, checksumVerify)) {\n throw new Error('Private key checksum mismatch')\n }\n return key\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array) => {\n if (a === b) return true\n if (a.byteLength !== b.byteLength) return false\n const len = a.byteLength\n let i = 0\n while (i < len && a[i] === b[i]) i++\n return i === len\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { cbc as AESCBC } from '@noble/ciphers/aes.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PrivateKey } from './PrivateKey'\nimport { PublicKey } from './PublicKey'\n\nexport const encrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n message: Uint8Array,\n nonce: bigint = uniqueNonce()\n) => crypt(privateKey, publicKey, nonce, message)\n\nexport const decrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum: number\n): Uint8Array => {\n const d = crypt(privateKey, publicKey, nonce, message, checksum)\n return d.message\n}\n\n/**\n * @arg message - Encrypted or plain text message (see checksum)\n * @arg checksum - shared secret checksum (null to encrypt, non-null to decrypt)\n */\nconst crypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum?: number\n): { nonce: bigint; message: Uint8Array; checksum: number } => {\n const nonceL = nonce\n const S = privateKey.getSharedSecret(publicKey)\n let ebuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n ebuf.writeUint64(nonceL)\n ebuf.append(S)\n ebuf.flip()\n\n const encryptionKey = sha512(new Uint8Array(ebuf.toBuffer()))\n const iv = encryptionKey.subarray(32, 48)\n const tag = encryptionKey.subarray(0, 32)\n\n // check if first 64 bit of sha256 hash treated as uint64_t truncated to 32 bits.\n const check = sha256(encryptionKey).subarray(0, 4)\n const cbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n cbuf.append(check)\n cbuf.flip()\n const check32 = cbuf.readUint32()\n if (checksum !== undefined) {\n if (check32 !== checksum) {\n throw new Error('Invalid key')\n }\n message = cryptoJsDecrypt(message, tag, iv)\n } else {\n message = cryptoJsEncrypt(message, tag, iv)\n }\n return { nonce: nonceL, message, checksum: check32 }\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} ciphertext - binary format\n * @return {Uint8Array} the decrypted message\n */\nconst cryptoJsDecrypt = (message: Uint8Array, tag: Uint8Array, iv: Uint8Array): Uint8Array => {\n let messageBuffer = message\n const decipher = AESCBC(tag, iv)\n messageBuffer = decipher.decrypt(messageBuffer)\n return messageBuffer\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} plaintext - binary format\n * @return {Uint8Array} binary\n */\nexport const cryptoJsEncrypt = (\n message: Uint8Array,\n tag: Uint8Array,\n iv: Uint8Array\n): Uint8Array => {\n let messageBuffer = message\n const cipher = AESCBC(tag, iv)\n messageBuffer = cipher.encrypt(messageBuffer)\n return messageBuffer\n}\n\nlet uniqueNonceEntropy: number | null = null\n\nconst uniqueNonce = (): bigint => {\n if (uniqueNonceEntropy === null) {\n const randomPrivateKey = secp256k1.utils.randomSecretKey()\n uniqueNonceEntropy = (randomPrivateKey[0] << 8) | randomPrivateKey[1]\n }\n let long = BigInt(Date.now())\n const entropy = ++uniqueNonceEntropy % 0x10000\n long = (long << BigInt(16)) | BigInt(entropy)\n return long\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\n\nconst PublicKeyDeserializer = (buf: ByteBuffer) => {\n const c = fixedBuf(buf, 33)\n return new PublicKey(c)\n}\n\nconst UInt64Deserializer = (b: ByteBuffer) => {\n return b.readUint64()\n}\n\nconst UInt32Deserializer = (b: ByteBuffer) => {\n return b.readUint32()\n}\n\nconst BinaryDeserializer = (b: ByteBuffer) => {\n const len = b.readVarint32()\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n}\n\nconst BufferDeserializer = (keyDeserializers: any) => (buf: Uint8Array) => {\n const obj: any = {}\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n buffer.append(buf)\n buffer.flip()\n for (const [key, deserializer] of keyDeserializers) {\n try {\n obj[key] = deserializer(buffer)\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n return obj\n}\n\nfunction fixedBuf(b: ByteBuffer, len: number) {\n if (!b) {\n throw Error('No buffer found on first parameter')\n } else {\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n }\n}\n\nconst EncryptedMemoDeserializer = BufferDeserializer([\n ['from', PublicKeyDeserializer],\n ['to', PublicKeyDeserializer],\n ['nonce', UInt64Deserializer],\n ['check', UInt32Deserializer],\n ['encrypted', BinaryDeserializer]\n])\n\nexport const Deserializer = {\n Memo: EncryptedMemoDeserializer\n}\n","import bs58 from 'bs58'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Serializer } from './serializer'\nimport { PrivateKey } from './PrivateKey'\nimport * as Aes from './aes'\nimport { PublicKey } from './PublicKey'\nimport { Deserializer } from './deserializer'\n\nexport type Memo = {\n /**\n * Encrypts a memo for secure private messaging\n */\n encode(\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n ): string\n\n /**\n * Decrypts a memo message\n */\n decode(privateKey: string | PrivateKey, memo: string): string\n}\n\n/**\n * Encodes a memo using AES encryption for secure private messaging on Hive.\n * Messages must start with '#' to be encrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Sender's private memo key (string WIF format or PrivateKey instance)\n * @param publicKey - Recipient's public memo key (string or PublicKey instance)\n * @param memo - Message to encrypt (must start with '#' for encryption)\n * @param testNonce - Optional nonce for testing (advanced usage)\n * @returns Encrypted memo string prefixed with '#'\n * @throws Error if encryption is not supported in current environment\n */\nconst encode = (\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n publicKey = toPublicObj(publicKey)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.writeVString(memo)\n const memoBuffer = new Uint8Array(mbuf.copy(0, mbuf.offset).toBuffer())\n const { nonce, message, checksum } = Aes.encrypt(privateKey, publicKey, memoBuffer, testNonce)\n const mbuf2 = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n Serializer.Memo(mbuf2, {\n check: checksum,\n encrypted: message,\n from: privateKey.createPublic(),\n nonce,\n to: publicKey\n })\n mbuf2.flip()\n const data = new Uint8Array(mbuf2.toBuffer())\n return '#' + bs58.encode(data)\n}\n\n/**\n * Decrypts an encrypted memo using AES decryption.\n * Messages must start with '#' to be decrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Recipient's private memo key (string WIF format or PrivateKey instance)\n * @param memo - Encrypted memo string (must start with '#' for decryption)\n * @returns Decrypted memo content with '#' prefix\n * @throws Error if decryption fails or encryption not supported in current environment\n */\nconst decode = (privateKey: string | PrivateKey, memo: string): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n // memo = bs58.decode(memo)\n let memoBuffer = Deserializer.Memo(bs58.decode(memo))\n const { from, to, nonce, check, encrypted } = memoBuffer\n const pubkey = privateKey.createPublic().toString()\n const otherpub =\n pubkey === new PublicKey(from.key).toString() ? new PublicKey(to.key) : new PublicKey(from.key)\n memoBuffer = Aes.decrypt(privateKey, otherpub, nonce, encrypted, check)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.append(memoBuffer)\n mbuf.flip()\n return '#' + mbuf.readVString()\n}\n\nlet encodeTest: boolean | undefined\nconst checkEncryption = () => {\n if (encodeTest === undefined) {\n let plaintext\n encodeTest = true // prevent infinate looping\n try {\n const wif = '5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw'\n const pubkey = 'STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA'\n const cyphertext = encode(wif, pubkey, '#memo爱')\n plaintext = decode(wif, cyphertext)\n } finally {\n encodeTest = plaintext === '#memo爱'\n }\n }\n if (encodeTest === false) {\n throw new Error('This environment does not support encryption.')\n }\n}\n\nconst toPrivateObj = (o: string | PrivateKey): PrivateKey => {\n if (typeof o === 'string') {\n return PrivateKey.fromString(o)\n } else {\n return o\n }\n}\nconst toPublicObj = (o: string | PublicKey): PublicKey => {\n if (typeof o === 'string') {\n return PublicKey.fromString(o)\n } else {\n return o\n }\n}\n\n/**\n * Memo utilities for encrypting and decrypting private messages between Hive users.\n * Uses AES encryption with ECDH key exchange for secure communication.\n *\n * Messages must start with '#' to be encrypted/decrypted.\n * Plain text messages (without '#') are returned unchanged.\n *\n * @example\n * ```typescript\n * import { Memo, PrivateKey, PublicKey } from 'hive-tx'\n *\n * // Encrypt a message\n * const encrypted = Memo.encode(senderPrivateKey, recipientPublicKey, '#Hello World')\n *\n * // Decrypt a message\n * const decrypted = Memo.decode(recipientPrivateKey, encrypted)\n * console.log(decrypted) // '#Hello World'\n * ```\n */\nexport const Memo = {\n decode,\n encode\n}\n","import { Serializer } from './serializer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\nimport { bytesToHex } from '@noble/hashes/utils.js'\n\nexport interface WitnessProps {\n account_creation_fee?: string\n account_subsidy_budget?: number\n account_subsidy_decay?: number\n key: PublicKey | string\n maximum_block_size?: number\n new_signing_key?: PublicKey | string | null\n hbd_exchange_rate?: { base: string; quote: string }\n hbd_interest_rate?: number\n url?: string\n}\n\n/** Return null for a valid username */\nexport const validateUsername = (username: string): null | string => {\n let suffix = 'Account name should '\n if (!username) {\n return suffix + 'not be empty.'\n }\n const length = username.length\n if (length < 3) {\n return suffix + 'be longer.'\n }\n if (length > 16) {\n return suffix + 'be shorter.'\n }\n if (/\\./.test(username)) {\n suffix = 'Each account segment should '\n }\n const ref = username.split('.')\n const len = ref.length\n for (let i = 0; i < len; i++) {\n const label = ref[i]\n if (!/^[a-z]/.test(label)) {\n return suffix + 'start with a lowercase letter.'\n }\n if (!/^[a-z0-9-]*$/.test(label)) {\n return suffix + 'have only lowercase letters, digits, or dashes.'\n }\n if (!/[a-z0-9]$/.test(label)) {\n return suffix + 'end with a lowercase letter or digit.'\n }\n if (label.length < 3) {\n return suffix + 'be longer.'\n }\n }\n return null\n}\n\nexport const operations = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n pow: 14,\n custom: 15,\n report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49,\n // virtual ops\n fill_convert_request: 50,\n author_reward: 51,\n curation_reward: 52,\n comment_reward: 53,\n liquidity_reward: 54,\n interest: 55,\n fill_vesting_withdraw: 56,\n fill_order: 57,\n shutdown_witness: 58,\n fill_transfer_from_savings: 59,\n hardfork: 60,\n comment_payout_update: 61,\n return_vesting_delegation: 62,\n comment_benefactor_reward: 63,\n producer_reward: 64,\n clear_null_account_balance: 65,\n proposal_pay: 66,\n sps_fund: 67,\n hardfork_hive: 68,\n hardfork_hive_restore: 69,\n delayed_voting: 70,\n consolidate_treasury_balance: 71,\n effective_comment_vote: 72,\n ineffective_delete_comment: 73,\n sps_convert: 74,\n expired_account_notification: 75,\n changed_recovery_account: 76,\n transfer_to_vesting_completed: 77,\n pow_reward: 78,\n vesting_shares_split: 79,\n account_created: 80,\n fill_collateralized_convert_request: 81,\n system_warning: 82,\n fill_recurrent_transfer: 83,\n failed_recurrent_transfer: 84,\n limit_order_cancelled: 85,\n producer_missed: 86,\n proposal_fee: 87,\n collateralized_convert_immediate_conversion: 88,\n escrow_approved: 89,\n escrow_rejected: 90,\n proxy_cleared: 91,\n declined_voting_rights: 92\n}\n\n/**\n * Make bitmask filter to be used with get_account_history call\n */\nexport const makeBitMaskFilter = (allowedOperations: number[]): [string | null, string | null] => {\n return allowedOperations\n .reduce(reduceFunction, [BigInt(0), BigInt(0)])\n .map((value: bigint) => (value !== BigInt(0) ? value.toString() : null)) as [string | null, string | null]\n}\nconst reduceFunction = (\n [low, high]: [bigint, bigint],\n allowedOperation: number\n): [bigint, bigint] => {\n if (allowedOperation < 64) {\n return [low | (BigInt(1) << BigInt(allowedOperation)), high]\n } else {\n return [low, high | (BigInt(1) << BigInt(allowedOperation - 64))]\n }\n}\n\nexport const buildWitnessSetProperties = (\n owner: string,\n props: WitnessProps\n): ['witness_set_properties', { extensions: never[]; owner: string; props: any }] => {\n const data = {\n extensions: [],\n owner,\n props: []\n }\n for (const key of Object.keys(props)) {\n if ((props as any)[key] === undefined) continue\n let type\n switch (key) {\n case 'key':\n case 'new_signing_key':\n type = Serializer.PublicKey\n break\n case 'account_subsidy_budget':\n case 'account_subsidy_decay':\n case 'maximum_block_size':\n type = Serializer.UInt32\n break\n case 'hbd_interest_rate':\n type = Serializer.UInt16\n break\n case 'url':\n type = Serializer.String\n break\n case 'hbd_exchange_rate':\n type = Serializer.Price\n break\n case 'account_creation_fee':\n type = Serializer.Asset\n break\n default:\n throw new Error(`Unknown witness prop: ${key}`)\n }\n data.props.push([key, serialize(type, props[key])])\n }\n data.props.sort((a: any, b: any) => a[0].localeCompare(b[0]))\n return ['witness_set_properties', data]\n}\n\nconst serialize = (serializer: any, data: any) => {\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n serializer(buffer, data)\n buffer.flip()\n // `props` values must be hex\n return bytesToHex(new Uint8Array(buffer.toBuffer()))\n}\n","/**\n * Re-exports hive-tx APIs and provides helper functions that bridge\n * API differences from the legacy dhive library.\n */\n\nimport {\n PrivateKey,\n Transaction,\n callRPCBroadcast,\n type BroadcastResult,\n} from \"../../hive-tx\";\nimport type { Operation, OperationName, OperationBody } from \"../../hive-tx\";\nimport { sha256 as nobleSha256 } from \"@noble/hashes/sha2.js\";\n\n// ── Re-exports ─────────────────────────────────────────────────────────────\n\nexport {\n Transaction as HiveTxTransaction,\n PrivateKey,\n PublicKey,\n Signature,\n Memo,\n config as hiveTxConfig,\n callRPC,\n callRPCBroadcast,\n callREST,\n callWithQuorum,\n utils as hiveTxUtils,\n} from \"../../hive-tx\";\n\nexport type {\n Operation,\n OperationName,\n OperationBody,\n AssetSymbol,\n BroadcastResult,\n AccountCreateOperation,\n CustomJsonOperation,\n // Referenced in ConfigManager.setResilience's public signature — must be\n // nameable from the main entry, not only from @ecency/sdk/hive.\n ResilienceOptions,\n} from \"../../hive-tx\";\n\n// ── Compat types (matching dhive shapes used throughout the codebase) ──────\n\n/** Compatible with dhive's TransactionConfirmation from broadcast_transaction_synchronous */\nexport interface TransactionConfirmation {\n id: string;\n block_num: number;\n trx_num: number;\n expired: boolean;\n}\n\n/** Authority role type used in key management */\nexport type AuthorityType = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\n/** SMT asset format (NAI representation) used in transaction history */\nexport interface SMTAsset {\n amount: string;\n precision: number;\n nai: string;\n}\n\n/** RC account data from rc_api.find_rc_accounts */\nexport interface RCAccount {\n account: string;\n rc_manabar: {\n current_mana: string | number;\n last_update_time: number;\n };\n max_rc: string | number;\n max_rc_creation_adjustment: {\n amount: string;\n precision: number;\n nai: string;\n };\n delegated_rc: number;\n received_delegated_rc: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Compute SHA-256 hash of a string or Uint8Array.\n * Drop-in replacement for dhive's `cryptoUtils.sha256()`.\n */\nexport function sha256(input: string | Uint8Array): Uint8Array {\n let data: Uint8Array;\n if (typeof input === \"string\") {\n // Inline UTF-8 encode — avoids TextEncoder which is unavailable on some\n // runtimes (React Native / Hermes).\n const bytes: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c < 0x80) {\n bytes.push(c);\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const next = input.charCodeAt(++i);\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff);\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n }\n }\n data = new Uint8Array(bytes);\n } else {\n data = input;\n }\n return nobleSha256(data);\n}\n\n/** Check if a string is a valid WIF-encoded private key. */\nexport function isWif(key: string): boolean {\n try {\n PrivateKey.fromString(key);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sign and broadcast operations, returning a dhive-compatible TransactionConfirmation.\n *\n * Uses broadcast_transaction_synchronous so the response includes block_num/trx_num,\n * matching the shape that the rest of the codebase expects from dhive's\n * `client.broadcast.sendOperations()`.\n *\n * @deprecated Prefer {@link broadcastOperationsAsync} (the default for\n * `useBroadcastMutation`); poll `transaction_status_api` if you need block\n * confirmation. Kept only for explicit `broadcastMode: 'sync'` opt-ins.\n */\nexport async function broadcastOperations(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return callRPCBroadcast(\"condenser_api.broadcast_transaction_synchronous\", [\n tx.transaction,\n ]);\n}\n\n/**\n * Sign and broadcast operations without waiting for block inclusion.\n *\n * Uses broadcast_transaction which returns as soon as the node accepts the\n * transaction into its mempool. Transport and RPC errors (network failures,\n * invalid operations, expired transactions) are still thrown immediately -\n * the only thing skipped is the wait for the transaction to appear in a block.\n *\n * Returns { tx_id, status: 'unknown' }. To confirm block inclusion afterward,\n * poll transaction_status_api with the returned tx_id.\n *\n * Prefer this for operations where faster response matters more than\n * immediate confirmation (e.g. votes, reblogs, follows).\n *\n * Use broadcastOperations() when you need block_num/trx_num confirmation\n * (e.g. transfers, account updates, key changes).\n */\nexport async function broadcastOperationsAsync(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return tx.broadcast(false);\n}\n\n// ── Mana calculations (ported from dhive's RCAPI) ──────────────────────────\n\ninterface Manabar {\n current_mana: string | number;\n last_update_time: number;\n}\n\ninterface ManaResult {\n current_mana: number;\n max_mana: number;\n percentage: number;\n}\n\nconst MANA_REGENERATION_SECONDS = 432000; // 5 days\n\nfunction calculateManabar(maxMana: number, manabar: Manabar): ManaResult {\n const delta = Date.now() / 1000 - manabar.last_update_time;\n let currentMana =\n Number(manabar.current_mana) +\n (delta * maxMana) / MANA_REGENERATION_SECONDS;\n let percentage = Math.round((currentMana / maxMana) * 10000);\n if (!isFinite(percentage) || percentage < 0) {\n percentage = 0;\n } else if (percentage > 10000) {\n percentage = 10000;\n }\n return { current_mana: currentMana, max_mana: maxMana, percentage };\n}\n\n/**\n * Get effective vesting shares for an account (matching dhive's getVests).\n * Subtracts delegated, adds received, accounts for pending withdrawals.\n */\nfunction getVests(account: any): number {\n const vests = parseFloat(account.vesting_shares);\n const delegated = parseFloat(account.delegated_vesting_shares);\n const received = parseFloat(account.received_vesting_shares);\n const withdrawRate = parseFloat(account.vesting_withdraw_rate);\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n return vests - withdrawVests - delegated + received;\n}\n\n/** Calculate voting power mana (equivalent to dhive client.rc.calculateVPMana) */\nexport function calculateVPMana(account: any): ManaResult {\n const maxMana = getVests(account) * 1e6;\n return calculateManabar(maxMana, account.voting_manabar);\n}\n\n/** Calculate RC mana (equivalent to dhive client.rc.calculateRCMana) */\nexport function calculateRCMana(rcAccount: RCAccount): ManaResult {\n return calculateManabar(\n Number(rcAccount.max_rc),\n rcAccount.rc_manabar\n );\n}\n\n// setHiveTxNodes and initHiveTx removed — config is now unified.\n// Use hiveTxConfig directly or ConfigManager.setHiveNodes().\n","/**\n * Chain error handling utilities\n * Extracted from web's operations.ts and mobile's dhive.ts error handling patterns\n */\n\nexport enum ErrorType {\n COMMON = \"common\",\n INFO = \"info\",\n INSUFFICIENT_RESOURCE_CREDITS = \"insufficient_resource_credits\",\n MISSING_AUTHORITY = \"missing_authority\",\n TOKEN_EXPIRED = \"token_expired\",\n NETWORK = \"network\",\n TIMEOUT = \"timeout\",\n VALIDATION = \"validation\",\n}\n\nexport interface ParsedChainError {\n message: string;\n type: ErrorType;\n originalError?: any;\n}\n\n/**\n * Parses Hive blockchain errors into standardized format.\n * Extracted from web's operations.ts and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string from a blockchain operation\n * @returns Parsed error with user-friendly message and categorized type\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * const parsed = parseChainError(error);\n * console.log(parsed.message); // \"Insufficient Resource Credits. Please wait or power up.\"\n * console.log(parsed.type); // ErrorType.INSUFFICIENT_RESOURCE_CREDITS\n * }\n * ```\n */\nexport function parseChainError(error: any): ParsedChainError {\n // Extract error strings from various error formats\n // Check both error_description and message independently for pattern matching\n const errorDescription = error?.error_description ? String(error.error_description) : '';\n const errorMessage = error?.message ? String(error.message) : '';\n // HiveSigner throws plain objects like { error: \"unauthorized\", error_description: \"...\" }\n const errorCode = error?.error ? String(error.error) : '';\n const errorString = errorDescription || errorMessage || String(error || '');\n\n // Helper function to test patterns against all error fields\n const testPattern = (pattern: RegExp): boolean => {\n // Check error code first (e.g. HiveSigner's { error: \"unauthorized\" })\n if (errorCode && pattern.test(errorCode)) return true;\n // Check error_description (priority)\n if (errorDescription && pattern.test(errorDescription)) return true;\n // Then check message\n if (errorMessage && pattern.test(errorMessage)) return true;\n // Finally check fallback errorString (handles plain string inputs)\n if (errorString && pattern.test(errorString)) return true;\n return false;\n };\n\n // Resource credits (from both web and mobile patterns)\n if (\n testPattern(/please wait to transact/i) ||\n testPattern(/insufficient rc/i) ||\n testPattern(/rc mana|rc account|resource credits/i)\n ) {\n return {\n message: \"Insufficient Resource Credits. Please wait or power up.\",\n type: ErrorType.INSUFFICIENT_RESOURCE_CREDITS,\n originalError: error,\n };\n }\n\n // Min comment interval (from web operations.ts line 29)\n if (testPattern(/you may only post once every/i)) {\n return {\n message: \"Please wait before posting again (minimum 3 second interval between comments).\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Identical vote (from web operations.ts line 31)\n if (testPattern(/your current vote on this comment is identical/i)) {\n return {\n message: \"You have already voted with the same weight.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Must claim something (from web operations.ts line 33)\n if (testPattern(/must claim something/i)) {\n return {\n message: \"You must claim rewards before performing this action.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot claim that much VESTS (from web operations.ts line 35)\n if (testPattern(/cannot claim that much vests/i)) {\n return {\n message: \"Cannot claim that amount. Please check your pending rewards.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot delete comment with positive votes (from web operations.ts line 42)\n if (testPattern(/cannot delete a comment with net positive/i)) {\n return {\n message: \"Cannot delete a comment with positive votes.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Comment has children (from web operations.ts line 44)\n if (testPattern(/children == 0/i)) {\n return {\n message: \"Cannot delete a comment with replies.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Comment already paid out (from web operations.ts line 46)\n if (testPattern(/comment_cashout/i)) {\n return {\n message: \"Cannot modify a comment that has already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Voting on paid out post (from web operations.ts line 48)\n if (testPattern(/votes evaluating for comment that is paid out is forbidden/i)) {\n return {\n message: \"Cannot vote on posts that have already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // No key available (SDK internal - from broadcastWithMethod when key not stored)\n if (testPattern(/no (active|owner|posting|memo) key available/i)) {\n return {\n message: \"Key not available. Please provide your key to sign this operation.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing active authority. Hive nodes return \"missing required active\n // authority\"; web operations.ts also throws the short form. Match both so the\n // auth fallback (auth-upgrade dialog) fires instead of misclassifying as a\n // generic chain error.\n if (testPattern(/missing (required )?active authority/i)) {\n return {\n message: \"Missing active authority. This operation requires your active key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing owner authority (\"missing required owner authority\" or short form)\n if (testPattern(/missing (required )?owner authority/i)) {\n return {\n message: \"Missing owner authority. This operation requires your owner key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing posting authority (general pattern)\n if (testPattern(/missing (required )?posting authority/i)) {\n return {\n message: \"Missing posting authority. Please check your login method.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Token expired / unauthorized (HiveSigner OAuth2 errors + general patterns)\n // HiveSigner returns: { error: \"invalid_grant\" } for invalid/expired tokens,\n // { error: \"unauthorized_access\" } for IP-based access denial\n if (\n errorCode === 'invalid_grant' ||\n errorCode === 'unauthorized_access' ||\n testPattern(/token expired/i) ||\n testPattern(/invalid token/i) ||\n testPattern(/\\bunauthorized\\b/i) ||\n testPattern(/\\bforbidden\\b/i)\n ) {\n return {\n message: \"Authentication token expired. Please log in again.\",\n type: ErrorType.TOKEN_EXPIRED,\n originalError: error,\n };\n }\n\n // Already reblogged\n if (testPattern(/has already reblogged/i) || testPattern(/already reblogged this post/i)) {\n return {\n message: \"You have already reblogged this post.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Duplicate transaction\n if (testPattern(/duplicate transaction/i)) {\n return {\n message: \"This transaction has already been processed.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Network errors (more specific patterns to avoid false positives)\n if (\n testPattern(/econnrefused/i) ||\n testPattern(/connection refused/i) ||\n testPattern(/failed to fetch/i) ||\n testPattern(/\\bnetwork[-\\s]?(request|error|timeout|unreachable|down|failed)\\b/i)\n ) {\n return {\n message: \"Network error. Please check your connection and try again.\",\n type: ErrorType.NETWORK,\n originalError: error,\n };\n }\n\n // Timeout errors\n if (testPattern(/timeout/i) || testPattern(/timed out/i)) {\n return {\n message: \"Request timed out. Please try again.\",\n type: ErrorType.TIMEOUT,\n originalError: error,\n };\n }\n\n // Account doesn't exist\n if (testPattern(/account.*does not exist/i) || testPattern(/account not found/i)) {\n return {\n message: \"Account not found. Please check the username.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Invalid memo key\n if (testPattern(/invalid memo key/i)) {\n return {\n message: \"Invalid memo key. Cannot encrypt message.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Insufficient funds (require both words in same string to avoid cross-field false positives)\n if (testPattern(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i)) {\n return {\n message: \"Insufficient funds for this transaction.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Generic validation errors (use word boundaries to be more specific)\n if (testPattern(/\\b(invalid|validation)\\b/i)) {\n // Truncate to 150 chars like other branches\n const message = (error?.message || errorString).substring(0, 150) || \"Validation error occurred\";\n return {\n message,\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Default: return original error message\n // Check for error_description first (from web operations.ts line 65-72)\n if (error?.error_description && typeof error.error_description === \"string\") {\n return {\n message: error.error_description.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Then check message field\n if (error?.message && typeof error.message === \"string\") {\n return {\n message: error.message.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Handle plain objects without message property (avoid \"[object Object]\")\n let message: string;\n if (typeof error === 'object' && error !== null) {\n // Check for common error properties\n if (error.error_description) {\n message = String(error.error_description);\n } else if (error.code) {\n message = `Error code: ${error.code}`;\n } else if (errorString && errorString !== '[object Object]') {\n message = errorString.substring(0, 150);\n } else {\n message = \"Unknown error occurred\";\n }\n } else {\n message = errorString.substring(0, 150) || \"Unknown error occurred\";\n }\n\n return {\n message,\n type: ErrorType.COMMON,\n originalError: error,\n };\n}\n\n/**\n * Formats error for display to user.\n * Returns tuple of [message, type] for backward compatibility with existing code.\n *\n * This function maintains compatibility with the old formatError signature from\n * web's operations.ts (line 59-84) and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string\n * @returns Tuple of [user-friendly message, error type]\n *\n * @example\n * ```typescript\n * try {\n * await transfer(...);\n * } catch (error) {\n * const [message, type] = formatError(error);\n * showToast(message, type);\n * }\n * ```\n */\nexport function formatError(error: any): [string, ErrorType] {\n const parsed = parseChainError(error);\n return [parsed.message, parsed.type];\n}\n\n/**\n * Checks if error indicates missing authority and should trigger auth fallback.\n * Used by the SDK's useBroadcastMutation to determine if it should retry with\n * an alternate authentication method.\n *\n * @param error - The error object or string\n * @returns true if auth fallback should be attempted\n *\n * @example\n * ```typescript\n * try {\n * await broadcast(operations);\n * } catch (error) {\n * if (shouldTriggerAuthFallback(error)) {\n * // Try with alternate auth method\n * await broadcastWithHiveAuth(operations);\n * }\n * }\n * ```\n */\nexport function shouldTriggerAuthFallback(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.MISSING_AUTHORITY || type === ErrorType.TOKEN_EXPIRED;\n}\n\n/**\n * Checks if error is a resource credits (RC) error.\n * Useful for showing specific UI feedback about RC issues.\n *\n * @param error - The error object or string\n * @returns true if the error is related to insufficient RC\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * if (isResourceCreditsError(error)) {\n * showRCWarning(); // Show specific RC education/power up UI\n * }\n * }\n * ```\n */\nexport function isResourceCreditsError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INSUFFICIENT_RESOURCE_CREDITS;\n}\n\n/**\n * Checks if error is informational (not critical).\n * Informational errors typically don't need retry logic.\n *\n * @param error - The error object or string\n * @returns true if the error is informational\n */\nexport function isInfoError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INFO;\n}\n\n/**\n * Checks if error is network-related and should be retried.\n *\n * @param error - The error object or string\n * @returns true if the error is network-related\n */\nexport function isNetworkError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.NETWORK || type === ErrorType.TIMEOUT;\n}\n","import {\n useMutation,\n type MutationKey,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { PrivateKey, RPCError } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { broadcastOperations, broadcastOperationsAsync, type TransactionConfirmation } from \"@/modules/core/hive-tx\";\nimport type { BroadcastResult } from \"../../../hive-tx\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { shouldTriggerAuthFallback } from \"@/modules/core/errors\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport hs from \"hivesigner\";\n\n/**\n * Broadcast mode controls whether the SDK waits for block inclusion.\n *\n * - `'async'` (default): Uses `broadcast_transaction` — returns once the node\n * accepts the transaction into its mempool. Transport and RPC errors are\n * still thrown immediately; only the block-inclusion wait is skipped.\n *\n * - `'sync'`: Uses `broadcast_transaction_synchronous` — waits for block\n * inclusion and returns `block_num`/`trx_num`. Deprecated; prefer `'async'`\n * and poll `transaction_status_api` if you need block confirmation.\n */\nexport type BroadcastMode = 'sync' | 'async';\n\n/**\n * Broadcasts operations using a specific auth method.\n *\n * @param method - Auth method to use ('key', 'hiveauth', 'hivesigner', 'keychain', 'custom')\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and configuration\n * @param authority - Key authority to use (posting, active, owner, or memo)\n * @param fetchedKey - Optional pre-fetched key to avoid duplicate fetches\n * @param fetchedToken - Optional pre-fetched access token to avoid duplicate fetches\n * @param broadcastMode - Whether to wait for block inclusion ('sync') or just mempool acceptance ('async')\n * @returns Transaction confirmation from the blockchain\n * @throws Error if method is not available or broadcast fails\n */\nasync function broadcastWithMethod(\n method: string,\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n fetchedKey?: string | null,\n fetchedToken?: string | null,\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n switch (method) {\n case 'key': {\n if (!adapter) {\n throw new Error('No adapter provided for key-based auth');\n }\n\n // Use pre-fetched key if provided, otherwise fetch it\n let key: string | null | undefined = fetchedKey;\n\n if (key === undefined) {\n // Key not pre-fetched, fetch it now based on authority\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n } else {\n throw new Error(\n `Owner key not supported by adapter. Owner operations (like account recovery) ` +\n `require master password login or manual key entry.`\n );\n }\n break;\n\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n } else {\n throw new Error(\n `Memo key not supported by adapter. Use memo encryption methods instead.`\n );\n }\n break;\n\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n }\n\n if (!key) {\n throw new Error(`No ${authority} key available for ${username}`);\n }\n\n // Attempt broadcast with key\n const privateKey = PrivateKey.fromString(key);\n if (broadcastMode === 'async') {\n return await broadcastOperationsAsync(ops, privateKey);\n }\n return await broadcastOperations(ops, privateKey);\n }\n\n case 'hiveauth': {\n if (!adapter?.broadcastWithHiveAuth) {\n throw new Error('HiveAuth not supported by adapter');\n }\n return await adapter.broadcastWithHiveAuth(username, ops, authority);\n }\n\n case 'hivesigner': {\n if (!adapter) {\n throw new Error('No adapter provided for HiveSigner auth');\n }\n\n // Access tokens only have posting authority — for active/owner/memo ops,\n // go directly to platform-specific HiveSigner broadcast (e.g., redirect to hivesigner.com)\n if (authority !== 'posting') {\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw new Error(`HiveSigner access token cannot sign ${authority} operations. No platform broadcast available.`);\n }\n\n // Try direct API broadcast with access token first (posting ops only)\n const token = fetchedToken !== undefined\n ? fetchedToken\n : await adapter.getAccessToken(username);\n\n if (token) {\n try {\n const client = new hs.Client({ accessToken: token });\n const response = await client.broadcast(ops);\n return response.result;\n } catch (tokenError) {\n // Token broadcast failed — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner && shouldTriggerAuthFallback(tokenError)) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw tokenError;\n }\n }\n\n // No token available — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n\n throw new Error(`No access token available for ${username}`);\n }\n\n case 'keychain': {\n if (!adapter?.broadcastWithKeychain) {\n throw new Error('Keychain not supported by adapter');\n }\n return await adapter.broadcastWithKeychain(username, ops, authority);\n }\n\n case 'custom': {\n if (!auth?.broadcast) {\n throw new Error('No custom broadcast function provided');\n }\n return (await auth.broadcast(ops, authority)) as TransactionConfirmation;\n }\n\n default:\n throw new Error(`Unknown auth method: ${method}`);\n }\n}\n\n/**\n * Attempts to broadcast operations using multiple auth methods in fallback chain.\n * Implements sophisticated fallback pattern from mobile app.\n *\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and fallback configuration\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n * @returns Transaction confirmation from the blockchain\n * @throws Error if all auth methods fail or if a non-auth error occurs\n *\n * @remarks\n * **Preferred Behavior (when adapter.getLoginType exists):**\n * - Calls adapter.getLoginType() to determine user's actual auth method\n * - Uses ONLY that method (no fallbacks) - more predictable and faster\n * - If it fails, throws the error immediately\n *\n * **Fallback Behavior (for backward compatibility):**\n * - Tries each auth method in the fallback chain order\n * - Only continues to next method if error is auth-related (missing authority, token expired)\n * - Stops immediately for non-auth errors (RC exhaustion, network errors, validation errors)\n * - Collects all errors and provides detailed failure message\n *\n * @example\n * ```typescript\n * // Preferred: Adapter with getLoginType (single method, no fallbacks)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter, // includes getLoginType()\n * };\n *\n * // Legacy: Explicit fallback chain (tries multiple methods)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter,\n * fallbackChain: ['key', 'hiveauth', 'hivesigner'],\n * };\n * ```\n */\nasync function broadcastWithFallback(\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n // PREFERRED APPROACH: If adapter provides getLoginType, use smart auth strategy\n // This avoids unnecessary fallback attempts and is more predictable\n if (adapter?.getLoginType) {\n const loginType = await adapter.getLoginType(username, authority);\n\n if (loginType) {\n // SMART AUTH STRATEGY: Optimize based on login type + authority + credentials\n\n // Check if user has granted ecency.app posting authority\n const hasPostingAuth = adapter.hasPostingAuthorization\n ? await adapter.hasPostingAuthorization(username)\n : false;\n\n // OPTIMIZATION: Use HiveSigner token for posting ops when posting auth is granted\n // This is faster than direct key signing or HiveAuth for key-based logins\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'key'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to direct key signing if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to key:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for keychain/MetaMask users with posting auth (faster, no popup)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'keychain'\n ) {\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n console.warn('[SDK] HiveSigner token auth failed, falling back to keychain/snap:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for HiveAuth users with posting auth (faster)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'hiveauth'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to HiveAuth if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to HiveAuth:', error);\n }\n }\n\n // Use user's actual login method\n try {\n return await broadcastWithMethod(loginType, username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Check if error is due to missing authority (e.g., posting key trying active op)\n if (shouldTriggerAuthFallback(error)) {\n // Show auth upgrade UI if available (only for posting/active operations)\n if (\n adapter.showAuthUpgradeUI &&\n (authority === 'posting' || authority === 'active')\n ) {\n // Guard against empty operations array\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n\n // User selected a specific method - delegate to broadcastWithMethod\n // This handles all auth methods (hiveauth, hivesigner, key, keychain, custom, etc.)\n // broadcastWithMethod already contains all necessary validation and method-specific logic\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // Not an auth error, or no upgrade UI available - throw original error\n throw error;\n }\n }\n\n // loginType is null — user's auth method is unknown (e.g., incomplete login data)\n if (authority === 'posting') {\n // For posting ops, try HiveSigner — access token is usually available for all logins\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (hsError) {\n if (shouldTriggerAuthFallback(hsError) && adapter.showAuthUpgradeUI) {\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`No login type available for ${username}. Please log in again.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n throw hsError;\n }\n } else if (authority === 'active' && adapter.showAuthUpgradeUI) {\n // For active ops, show auth upgrade dialog — no silent fallback possible\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // FALLBACK APPROACH: For backward compatibility, use fallback chain\n // This is only used if adapter doesn't provide getLoginType\n const chain = auth?.fallbackChain ?? ['key', 'hiveauth', 'hivesigner', 'keychain', 'custom'];\n const errors: Map = new Map();\n\n for (const method of chain) {\n try {\n // Check if method is available before attempting\n let shouldSkip = false;\n let skipReason = '';\n let prefetchedKey: string | null | undefined;\n let prefetchedToken: string | null | undefined;\n\n switch (method) {\n case 'key':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch key to check availability (will be reused in broadcast)\n let key: string | null | undefined;\n\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n }\n break;\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n }\n break;\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n\n if (!key) {\n shouldSkip = true;\n skipReason = `No ${authority} key available`;\n } else {\n prefetchedKey = key; // Store for reuse\n }\n }\n break;\n case 'hiveauth':\n if (!adapter?.broadcastWithHiveAuth) {\n shouldSkip = true;\n skipReason = 'HiveAuth not supported by adapter';\n }\n break;\n case 'hivesigner':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch token if available (will be reused in broadcast)\n const token = await adapter.getAccessToken(username);\n if (token) {\n prefetchedToken = token; // Store for reuse\n }\n // When no token but adapter exists, don't skip —\n // broadcastWithMethod can fall back to adapter.broadcastWithHiveSigner\n }\n break;\n case 'keychain':\n if (!adapter?.broadcastWithKeychain) {\n shouldSkip = true;\n skipReason = 'Keychain not supported by adapter';\n }\n break;\n case 'custom':\n if (!auth?.broadcast) {\n shouldSkip = true;\n skipReason = 'No custom broadcast function provided';\n }\n break;\n }\n\n if (shouldSkip) {\n errors.set(method, new Error(`Skipped: ${skipReason}`));\n continue;\n }\n\n // Method is available, attempt broadcast with pre-fetched credentials\n return await broadcastWithMethod(method, username, ops, auth, authority, prefetchedKey, prefetchedToken, broadcastMode);\n } catch (error) {\n // Record actual error from failed broadcast attempt\n errors.set(method, error as Error);\n\n // Only continue fallback if error suggests trying another method\n if (!shouldTriggerAuthFallback(error)) {\n // If it's not an auth error, throw immediately (e.g., RC error, network error)\n throw error;\n }\n }\n }\n\n // FIX #2: Improved error message distinguishes between skips and real failures\n const hasRealAttempts = Array.from(errors.values()).some(\n error => !error.message.startsWith('Skipped:')\n );\n\n if (!hasRealAttempts) {\n // All methods were skipped (none attempted)\n const skipReasons = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n throw new Error(\n `[SDK][Broadcast] No auth methods attempted for ${username}. ${skipReasons}`\n );\n }\n\n // At least one method was attempted but all failed\n const errorMessages = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n\n throw new Error(\n `[SDK][Broadcast] All auth methods failed for ${username}. Errors: ${errorMessages}`\n );\n}\n\n/**\n * React Query mutation hook for broadcasting Hive operations.\n * Supports multiple authentication methods with automatic fallback.\n *\n * @template T - Type of the mutation payload\n * @param mutationKey - React Query mutation key for cache management\n * @param username - Hive username (required for broadcast)\n * @param operations - Function that converts payload to Hive operations\n * @param onSuccess - Success callback after broadcast completes\n * @param auth - Authentication context (supports both legacy AuthContext and new AuthContextV2)\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Authentication Flow:**\n *\n * 1. **With AuthContextV2 + adapter + enableFallback** (recommended for new code):\n * - Tries auth methods in fallbackChain order\n * - Smart fallback: only retries on auth errors, not RC/network errors\n * - Uses platform adapter for storage, UI, and broadcasting\n *\n * 2. **With legacy AuthContext** (backward compatible):\n * - Tries auth.broadcast() first (custom implementation)\n * - Falls back to postingKey if available\n * - Falls back to accessToken (HiveSigner) if available\n * - Throws if no auth method available\n *\n * **Backward Compatibility:**\n * - All existing code using AuthContext will continue to work\n * - AuthContextV2 extends AuthContext, so it's a drop-in replacement\n * - enableFallback defaults to false if no adapter provided\n *\n * @example\n * ```typescript\n * // New pattern with platform adapter and fallback\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * },\n * 'posting'\n * );\n *\n * // Legacy pattern (still works)\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * { postingKey: 'wif-key' }\n * );\n * ```\n */\nexport function useBroadcastMutation(\n mutationKey: MutationKey = [],\n username: string | undefined,\n operations: (payload: T) => Operation[],\n onSuccess: UseMutationOptions[\"onSuccess\"] = () => {},\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n options?: {\n onMutate?: UseMutationOptions[\"onMutate\"];\n onError?: UseMutationOptions[\"onError\"];\n onSettled?: UseMutationOptions[\"onSettled\"];\n /**\n * Controls whether to wait for block inclusion or just mempool acceptance.\n *\n * - `'async'` (default): Returns after mempool acceptance. Recommended for\n * all operations; errors are still thrown immediately.\n *\n * - `'sync'`: Waits for block inclusion, returns block_num/trx_num.\n * Deprecated; prefer `'async'`.\n */\n broadcastMode?: BroadcastMode;\n }\n) {\n const broadcastMode = options?.broadcastMode ?? 'async';\n\n return useMutation({\n onSuccess,\n onMutate: options?.onMutate,\n onError: options?.onError,\n onSettled: options?.onSettled,\n mutationKey: [...mutationKey, username],\n mutationFn: async (payload: T) => {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n\n const ops = operations(payload);\n\n try {\n // New: Try auth methods in fallback chain (if enabled)\n if (auth?.enableFallback !== false && auth?.adapter) {\n return await broadcastWithFallback(username, ops, auth, authority, broadcastMode);\n }\n\n // Legacy behavior: try methods in fixed order (backward compatible)\n if (auth?.broadcast) {\n return await auth.broadcast(ops, authority);\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n // Legacy auth only supports posting authority\n if (authority !== 'posting') {\n throw new Error(\n `[SDK][Broadcast] Legacy auth only supports posting authority, but '${authority}' was requested. ` +\n `Use AuthContextV2 with an adapter for ${authority} operations.`\n );\n }\n\n const privateKey = PrivateKey.fromString(postingKey);\n\n return await broadcastOperations(\n ops,\n privateKey\n );\n }\n\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const client = new hs.Client({ accessToken });\n const response = await client.broadcast(ops);\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n } catch (e) {\n if (e instanceof RPCError) {\n // Normalize raw blockchain rejections (missing authority, RC exhaustion,\n // validation failures) from every broadcast path — sync and async — into\n // a plain Error whose message is preserved for downstream classification\n // (formatError), so React Query captures a handled mutation error.\n throw new Error(e.message);\n }\n throw e\n }\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\nimport hs from \"hivesigner\";\nimport type { AuthContext } from \"@/modules/core/types\";\n\nexport async function broadcastJson(\n username: string | undefined,\n id: string,\n payload: T,\n auth?: AuthContext\n) {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n const jjson = {\n id,\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify(payload),\n };\n\n if (auth?.broadcast) {\n return auth.broadcast([[\"custom_json\", jjson]], \"posting\");\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n const privateKey = PrivateKey.fromString(postingKey);\n\n return broadcastOperations(\n [[\"custom_json\", jjson]],\n privateKey\n );\n }\n\n // With hivesigner access token\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const response = await new hs.Client({\n accessToken,\n }).customJson([], [username], id, JSON.stringify(payload));\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n}\n","import type { BroadcastMode } from \"./use-broadcast-mutation\";\nimport type { PlatformAdapter } from \"@/modules/core/types\";\n\n/**\n * Delay (ms) before invalidating chain-derived queries after an async\n * broadcast. ~1.3 Hive blocks (3s/block) so the just-broadcast transaction has\n * landed in a block before we refetch — otherwise the refetch returns pre-tx\n * state (e.g. a stale wallet balance).\n */\nexport const BROADCAST_INCLUSION_DELAY_MS = 4000;\n\n/**\n * Invalidate queries after a broadcast, accounting for broadcast mode.\n *\n * - `'sync'`: the transaction already waited for block inclusion, so refetch\n * immediately (returns the adapter's promise so callers may await it).\n * - `'async'` (default) / undefined: the transaction is only in the mempool, so\n * a refetch now would read pre-tx state — defer by ~1 block.\n *\n * No-ops when the adapter can't invalidate.\n */\nexport function invalidateAfterBroadcast(\n adapter: PlatformAdapter | null | undefined,\n broadcastMode: BroadcastMode | undefined,\n keys: any[][]\n): void | Promise {\n if (!adapter?.invalidateQueries) return;\n if (broadcastMode === \"sync\") {\n // Method call (not an extracted reference) so `this` stays bound to adapter.\n return adapter.invalidateQueries(keys);\n }\n setTimeout(() => adapter.invalidateQueries?.(keys), BROADCAST_INCLUSION_DELAY_MS);\n}\n","export function withTimeoutSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n if (!signal) return timeoutSignal;\n\n // AbortSignal.any is available in Chrome 116+, Safari 17.4+, Firefox 124+.\n // Fall back to manual AbortController wiring for older browsers.\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([signal, timeoutSignal]);\n }\n\n const ac = new AbortController();\n const onAbort = () => {\n const reason = signal.aborted ? signal.reason : timeoutSignal.reason;\n ac.abort(reason);\n signal.removeEventListener(\"abort\", onAbort);\n timeoutSignal.removeEventListener(\"abort\", onAbort);\n };\n if (signal.aborted) {\n ac.abort(signal.reason);\n } else if (timeoutSignal.aborted) {\n ac.abort(timeoutSignal.reason);\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n timeoutSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return ac.signal;\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport {\n config as hiveTxConfig,\n setNodes as setHiveTxNodes,\n setRestNodes as setHiveTxRestNodes,\n setRestNodesByApi as setHiveTxRestNodesByApi,\n setUserAgent as setHiveTxUserAgent,\n setResilience as setHiveTxResilience,\n type ResilienceOptions,\n} from \"../../hive-tx\";\nimport type { APIMethods } from \"../../hive-tx/api-types\";\n\n// Safe environment variable access for browser builds\n// In browser builds, tsup will replace process.env.* with literal values at compile time\nconst isDevelopment = (() => {\n try {\n return process.env?.NODE_ENV === 'development';\n } catch {\n return false;\n }\n})();\n\nconst getHeliusApiKey = () => {\n try {\n return process.env?.VITE_HELIUS_API_KEY;\n } catch {\n return undefined;\n }\n};\n\n/** Timeout for internal API calls (search, private API). */\nexport const INTERNAL_API_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on `gcTime` for any query that runs during SSR.\n *\n * A long window is fine in a browser or native app, where the cache holds one\n * user's data and lives as long as the session. It is not fine in a server\n * renderer: every query schedules a gc timer, a pending timer is a GC root, and\n * `Query` holds the whole `QueryCache` — so one long-lived entry keeps\n * everything else that request cached reachable for its entire window. A server\n * process then settles at roughly `ingest rate × gcTime`, which is how\n * ecency.com's renderers ended up aborting on the old-space cap rather than\n * levelling off (2026-07-26).\n *\n * Two minutes is far longer than any single render, which is the only window a\n * server-side entry has to be reused before it is dehydrated into the payload.\n *\n * Note this bounds SDK queries at the source. `apps/web` additionally clamps\n * every query through `defaultQueryOptions`, which is what protects it from\n * options defined outside the SDK; hosts that do not clamp get the right\n * behaviour from these defaults alone.\n */\nexport const SERVER_GC_TIME_MS = 2 * 60 * 1000;\n\n/**\n * How `CONFIG.queryClient` is resolved.\n *\n * This used to be a plain `queryClient: new QueryClient()` property — a single\n * instance created at module import and shared by every caller for the lifetime\n * of the process. That is correct in a browser (one process, one user) but wrong\n * under SSR, where one process serves every request: each server render wrote its\n * fetched data into that one cache and nothing ever removed it, so the heap grew\n * monotonically until the renderer hit its old-space limit and aborted.\n *\n * A host that renders on the server registers a resolver (see\n * `ConfigManager.setQueryClientResolver`) which returns the *current request's*\n * client, so cached data dies with the request that produced it. Hosts that\n * genuinely want one long-lived client keep using `setQueryClient`, and callers\n * that configure nothing fall back to a lazily created instance.\n *\n * The resolver is consulted on every read rather than cached here on purpose:\n * request scoping is the host's concern, and only the host can know when one\n * request ends and the next begins.\n */\nlet queryClientResolver: (() => QueryClient) | undefined;\n\n/** Created on first use, and only when no resolver has been registered. */\nlet fallbackQueryClient: QueryClient | undefined;\n\nfunction resolveQueryClient(): QueryClient {\n if (queryClientResolver) {\n return queryClientResolver();\n }\n return (fallbackQueryClient ??= new QueryClient());\n}\n\nexport const CONFIG = {\n privateApiHost: \"https://ecency.com\",\n /**\n * Observer used for bridge calls when nobody is logged in. The bridge applies\n * this account's mute list to the response, marking muted authors' posts and\n * comments `stats.gray` so clients can dim or collapse them. Anonymous\n * visitors therefore inherit Ecency's moderation instead of seeing an\n * unfiltered firehose. Apps may override via `ConfigManager.setDefaultObserver`,\n * which expects a real account rather than \"\" (see that setter).\n *\n * Note this only *marks* content: the bridge still returns muted authors'\n * posts, so an observer never shortens a feed.\n */\n defaultObserver: \"ecency\",\n /**\n * First-party client identifier sent as the `X-Ecency-Client` header on\n * search/private API requests. Lets the origin distinguish Ecency's own\n * web/mobile/SSR traffic from third-party integrators (who should use the\n * keyed api.hivesearcher.com backend instead of the public proxy). This is\n * a routing marker, not a secret. Apps may override via\n * `ConfigManager.setClientId` (e.g. \"web\" or \"mobile\") for observability.\n */\n clientId: \"ecency-sdk\",\n imageHost: \"https://i.ecency.com\",\n /** Current Hive RPC nodes. Reads from the unified hive-tx config. */\n get hiveNodes(): string[] {\n return hiveTxConfig.nodes;\n },\n heliusApiKey: getHeliusApiKey(),\n /**\n * The React Query client all SDK code reads through `getQueryClient()`.\n * Backed by a resolver so an SSR host can scope it per request — see the\n * `queryClientResolver` note above. Assigning replaces the resolver with one\n * that always returns the assigned client, preserving the previous\n * \"one client, set once\" behaviour for browser and native hosts.\n */\n get queryClient(): QueryClient {\n return resolveQueryClient();\n },\n set queryClient(client: QueryClient) {\n queryClientResolver = () => client;\n },\n pollsApiHost: \"https://poll.ecency.com\",\n plausibleHost: \"https://pl.ecency.com\",\n // DMCA filtering - can be configured by the app\n dmcaAccounts: [] as string[],\n dmcaTags: [] as string[],\n dmcaPatterns: [] as string[],\n // Pre-compiled regex patterns for performance and security\n dmcaTagRegexes: [] as RegExp[],\n dmcaPatternRegexes: [] as RegExp[],\n // Track if DMCA has been initialized to avoid duplicate logs\n _dmcaInitialized: false,\n};\n\ntype DmcaListsInput = {\n accounts?: string[];\n tags?: string[];\n posts?: string[];\n};\n\nexport namespace ConfigManager {\n export function setQueryClient(client: QueryClient) {\n CONFIG.queryClient = client;\n }\n\n /**\n * Register how the SDK should obtain its React Query client, for hosts where\n * a single shared instance is wrong — principally SSR, where one process\n * serves many requests and a shared cache both leaks memory and risks serving\n * one request's data to another.\n *\n * `resolve` is called on every SDK cache access and should return the client\n * belonging to the request currently being handled. In a Next.js App Router\n * host that means wrapping the factory in React's `cache()`, which memoises\n * per request:\n *\n * ```ts\n * ConfigManager.setQueryClientResolver(() => getQueryClient());\n * ```\n *\n * Registering a resolver supersedes any client previously passed to\n * `setQueryClient`; assigning a client afterwards supersedes the resolver.\n */\n export function setQueryClientResolver(resolve: () => QueryClient) {\n queryClientResolver = resolve;\n }\n\n /**\n * Set the private API host\n * @param host - The private API host URL (e.g., \"https://ecency.com\" or \"\" for relative URLs)\n */\n export function setPrivateApiHost(host: string) {\n CONFIG.privateApiHost = host;\n }\n\n /**\n * Set the first-party client identifier sent as the `X-Ecency-Client` header\n * on search/private API requests (e.g. \"web\" or \"mobile\"). Defaults to\n * \"ecency-sdk\". Used by the origin to tell Ecency's own apps apart from\n * third-party integrators.\n * @param clientId - Short client label\n */\n export function setClientId(clientId: string) {\n CONFIG.clientId = clientId;\n }\n\n /**\n * Set the observer used for bridge calls made without a logged-in user.\n * Defaults to \"ecency\"; a third-party integrator should point this at their\n * own moderation account.\n *\n * Must be a real account. An empty value is rejected rather than treated as\n * an opt-out: consumers resolve the observer with `||`, and `getDiscussion`\n * separately falls back to the post author, so \"\" would not disable mute\n * marking. It would silently observe as someone else while being cached under\n * \"\", leaving the request and its cache key describing different things.\n * @param observer - Hive account whose mute list applies to anonymous reads\n * @throws If given an empty or whitespace-only value\n */\n export function setDefaultObserver(observer: string) {\n if (typeof observer !== \"string\" || observer.trim() === \"\") {\n throw new Error(\n \"setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; \" +\n \"observer resolution would fall back to the post author while caching under an empty key.\"\n );\n }\n\n CONFIG.defaultObserver = observer;\n }\n\n /**\n * Get a validated base URL for API requests\n * Returns a valid base URL that can be used with new URL(path, baseUrl)\n *\n * Priority:\n * 1. CONFIG.privateApiHost if set (dev/staging or explicit config)\n * 2. window.location.origin if in browser (production with relative URLs)\n * 3. 'https://ecency.com' as fallback for SSR (production default)\n *\n * @returns A valid base URL string\n * @throws Never throws - always returns a valid URL\n */\n export function getValidatedBaseUrl(): string {\n if (CONFIG.privateApiHost) {\n return CONFIG.privateApiHost;\n }\n\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n\n // Fallback for SSR when privateApiHost is empty (production case)\n return 'https://ecency.com';\n }\n\n /**\n * Set the polls API host\n * @param host - The polls API host URL (e.g., \"https://poll.ecency.com\")\n */\n export function setPollsApiHost(host: string) {\n CONFIG.pollsApiHost = host;\n }\n\n /**\n * Set the image host\n * @param host - The image host URL (e.g., \"https://i.ecency.com\")\n */\n export function setImageHost(host: string) {\n CONFIG.imageHost = host;\n }\n\n /**\n * Set Hive RPC nodes, replacing the default list.\n * Delegates to the unified hive-tx `setNodes` (single validated setter,\n * shared with the lean `@ecency/sdk/hive` entry) so node configuration is\n * defined in exactly one place.\n * @param nodes - Array of Hive RPC node URLs\n */\n export function setHiveNodes(nodes: string[]) {\n setHiveTxNodes(nodes);\n }\n\n /**\n * Set the REST-API node list, replacing the default `restNodes`. Lets an app\n * add/remove REST hosts at runtime (e.g. drop an own node being decommissioned,\n * or widen the public pool) without forking + republishing the SDK. Delegates to\n * the unified hive-tx `setRestNodes` (validated, shared with `@ecency/sdk/hive`).\n * @param nodes - Array of REST-capable node URLs (without a trailing slash)\n */\n export function setRestNodes(nodes: string[]) {\n setHiveTxRestNodes(nodes);\n }\n\n /**\n * Merge per-API REST node overrides. For each API a non-empty valid list pins it\n * to those hosts (so `callREST` never wastes its retry budget on a node that\n * 404/503s the API); an empty list removes the pin (falls back to `restNodes`).\n * Other APIs' pins (e.g. the built-in `hivesense`) are preserved. Delegates to the\n * unified hive-tx `setRestNodesByApi`.\n * @param map - Partial map of REST API name → capable node URLs\n */\n export function setRestNodesByApi(map: Partial>) {\n setHiveTxRestNodesByApi(map);\n }\n\n /**\n * Set the User-Agent sent on server-side (Node) requests to Hive nodes.\n * Lets an app label its own SSR/server traffic (otherwise Node's fetch sends a\n * bare `node` UA). No effect in browsers (User-Agent is a forbidden header) or\n * React Native (keeps its native UA). Delegates to the unified hive-tx setter.\n * @param userAgent - The User-Agent string (e.g. \"ecency-web-ssr (+https://ecency.com)\")\n */\n export function setUserAgent(userAgent: string) {\n setHiveTxUserAgent(userAgent);\n }\n\n /**\n * Tune read-call tail-latency resilience: adaptive per-attempt timeouts\n * (default on) and hedged requests (default OFF — a duplicate request races\n * the next healthy node when the primary stalls, bounded by a token bucket so\n * only the slow tail hedges and pool-wide slowness self-disables it). Partial:\n * only the fields provided are changed; invalid values are ignored\n * field-by-field. Delegates to the unified hive-tx `setResilience`.\n * @param opts - e.g. `{ hedge: true }` to opt into hedged reads\n */\n export function setResilience(opts: Partial) {\n setHiveTxResilience(opts);\n }\n\n /**\n * Static analysis: Check for known ReDoS-vulnerable patterns\n * @param pattern - Raw regex pattern string\n * @returns Object with risk level and reason\n */\n function analyzeRedosRisk(pattern: string): { safe: boolean; reason?: string } {\n // Check 1: Nested quantifiers (e.g., (a+)+, (a*)+, (a{1,})+)\n if (/(\\([^)]*[*+{][^)]*\\))[*+{]/.test(pattern)) {\n return { safe: false, reason: \"nested quantifiers detected\" };\n }\n\n // Check 2: Alternation with overlapping terms (e.g., (a|a)+, (ab|a)+)\n if (/\\([^|)]*\\|[^)]*\\)[*+{]/.test(pattern)) {\n return { safe: false, reason: \"alternation with quantifier (potential overlap)\" };\n }\n\n // Check 3: Catastrophic backtracking patterns (e.g., (a*)*b, (a+)+b)\n if (/\\([^)]*[*+][^)]*\\)[*+]/.test(pattern)) {\n return { safe: false, reason: \"repeated quantifiers (catastrophic backtracking risk)\" };\n }\n\n // Check 4: Greedy quantifiers followed by optional patterns (e.g., .*.*x, .+.+x)\n if (/\\.\\*\\.\\*/.test(pattern) || /\\.\\+\\.\\+/.test(pattern)) {\n return { safe: false, reason: \"multiple greedy quantifiers on wildcards\" };\n }\n\n // Check 5: Unbounded ranges with wildcards (e.g., .{1,999999})\n const unboundedRange = /\\.?\\{(\\d+),(\\d+)\\}/g;\n let match;\n while ((match = unboundedRange.exec(pattern)) !== null) {\n const [, min, max] = match;\n const range = parseInt(max, 10) - parseInt(min, 10);\n if (range > 1000) {\n return { safe: false, reason: `excessive range: {${min},${max}}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Runtime test: Execute regex against adversarial inputs with timeout\n * @param regex - Compiled regex\n * @returns Object indicating if regex passed runtime test\n */\n function testRegexPerformance(regex: RegExp): { safe: boolean; reason?: string } {\n // Test inputs designed to trigger ReDoS in vulnerable patterns\n const adversarialInputs = [\n // Nested quantifier attack\n \"a\".repeat(50) + \"x\",\n // Alternation attack\n \"ab\".repeat(50) + \"x\",\n // Wildcard attack\n \"x\".repeat(100),\n // Mixed attack\n \"aaa\".repeat(30) + \"bbb\".repeat(30) + \"x\",\n ];\n\n const maxExecutionTime = 5; // 5ms hard limit per test\n\n for (const input of adversarialInputs) {\n const start = Date.now();\n try {\n regex.test(input);\n const duration = Date.now() - start;\n\n if (duration > maxExecutionTime) {\n return {\n safe: false,\n reason: `runtime test exceeded ${maxExecutionTime}ms (took ${duration}ms on input length ${input.length})`\n };\n }\n } catch (err) {\n return { safe: false, reason: `runtime test threw error: ${err}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Safely compile a regex pattern with defense-in-depth validation\n * @param pattern - Raw regex pattern string\n * @param maxLength - Maximum allowed pattern length (default 200)\n * @returns Compiled RegExp or null if invalid/unsafe\n */\n function safeCompileRegex(pattern: string, maxLength = 200): RegExp | null {\n // Use the module-level isDevelopment constant\n\n try {\n // Layer 1: Basic validation\n if (!pattern) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: empty pattern`);\n }\n return null;\n }\n\n if (pattern.length > maxLength) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: length ${pattern.length} exceeds max ${maxLength} - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 2: Static ReDoS analysis\n const staticAnalysis = analyzeRedosRisk(pattern);\n if (!staticAnalysis.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${staticAnalysis.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 3: Compilation attempt\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (compileErr) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${pattern.substring(0, 50)}...`, compileErr);\n }\n return null;\n }\n\n // Layer 4: Runtime performance testing\n const runtimeTest = testRegexPerformance(regex);\n if (!runtimeTest.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${runtimeTest.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n return regex;\n } catch (err) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${pattern.substring(0, 50)}...`, err);\n }\n return null;\n }\n }\n\n /**\n * Set DMCA filtering lists\n * @param lists - DMCA lists object containing accounts/tags/posts arrays\n */\n export function setDmcaLists(\n lists: DmcaListsInput = {}\n ) {\n const coerceList = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n // Ensure we have a valid object to work with\n const input = lists || {};\n\n const resolved = {\n accounts: coerceList(input.accounts),\n tags: coerceList(input.tags),\n patterns: coerceList(input.posts),\n };\n\n CONFIG.dmcaAccounts = resolved.accounts;\n CONFIG.dmcaTags = resolved.tags;\n CONFIG.dmcaPatterns = resolved.patterns;\n\n // Pre-compile tag regex patterns (tags can be regex)\n CONFIG.dmcaTagRegexes = resolved.tags\n .map((pattern) => safeCompileRegex(pattern))\n .filter((r): r is RegExp => r !== null);\n\n // Post patterns are plain strings for exact matching, not regex\n // No compilation needed - they will be used with simple string comparison\n CONFIG.dmcaPatternRegexes = [];\n\n const rejectedTagCount = resolved.tags.length - CONFIG.dmcaTagRegexes.length;\n\n // Only log once to avoid noise during builds/hot reloads\n // Only show in development mode to avoid cluttering production console\n // Use the module-level isDevelopment constant\n\n if (!CONFIG._dmcaInitialized && isDevelopment) {\n console.log(`[SDK] DMCA configuration loaded:`);\n console.log(` - Accounts: ${resolved.accounts.length}`);\n console.log(` - Tag patterns: ${CONFIG.dmcaTagRegexes.length}/${resolved.tags.length} compiled (${rejectedTagCount} rejected)`);\n console.log(` - Post patterns: ${resolved.patterns.length} (using exact string matching)`);\n\n if (rejectedTagCount > 0) {\n console.warn(`[SDK] ${rejectedTagCount} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`);\n }\n }\n\n CONFIG._dmcaInitialized = true;\n }\n}\n","import {\n InfiniteData,\n QueryClient,\n QueryKey,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n useQuery,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { CONFIG } from \"./config\";\n\n/**\n * Builds a client with the SDK's defaults. It is only a factory — request\n * scoping is the host's job, via `ConfigManager.setQueryClientResolver`, since\n * only the host knows where one request ends and the next begins.\n */\nexport function makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // With SSR, we usually want to set some default staleTime\n // above 0 to avoid refetching immediately on the client\n // staleTime: 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n },\n },\n });\n}\nexport const getQueryClient = () => CONFIG.queryClient;\n\nexport namespace EcencyQueriesManager {\n export function getQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData(queryKey);\n }\n\n export function getInfiniteQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData>(queryKey);\n }\n\n export async function prefetchQuery(options: UseQueryOptions) {\n const queryClient = getQueryClient();\n await queryClient.prefetchQuery(options);\n return getQueryData(options.queryKey);\n }\n\n export async function prefetchInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n const queryClient = getQueryClient();\n await queryClient.prefetchInfiniteQuery(options);\n return getInfiniteQueryData(options.queryKey);\n }\n\n export function generateClientServerQuery(options: UseQueryOptions) {\n return {\n prefetch: () => prefetchQuery(options),\n getData: () => getQueryData(options.queryKey),\n useClientQuery: () => useQuery(options),\n fetchAndGet: () => getQueryClient().fetchQuery(options),\n };\n }\n\n export function generateClientServerInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n return {\n prefetch: () => prefetchInfiniteQuery(options),\n getData: () => getInfiniteQueryData(options.queryKey),\n useClientQuery: () => useInfiniteQuery(options),\n fetchAndGet: () => getQueryClient().fetchInfiniteQuery(options),\n };\n }\n}\n","export function encodeObj(o: any): string {\n return btoa(JSON.stringify(o));\n}\n\nexport function decodeObj(o: any): any {\n let dataToParse = atob(o);\n if (dataToParse[0] !== \"{\") {\n return undefined;\n }\n return JSON.parse(dataToParse);\n}\n","import type { SMTAsset } from \"@/modules/core/hive-tx\";\n\nexport enum Symbol {\n HIVE = \"HIVE\",\n HBD = \"HBD\",\n VESTS = \"VESTS\",\n}\n\nexport enum NaiMap {\n \"@@000000021\" = \"HIVE\",\n \"@@000000013\" = \"HBD\",\n \"@@000000037\" = \"VESTS\",\n}\n\nexport interface Asset {\n amount: number;\n symbol: Symbol;\n}\n\nexport function parseAsset(sval: string | SMTAsset): Asset {\n if (typeof sval === \"string\") {\n const sp = sval.split(\" \");\n return {\n amount: parseFloat(sp[0]),\n // @ts-ignore\n symbol: Symbol[sp[1]],\n };\n } else {\n return {\n amount: parseFloat(sval.amount.toString()) / Math.pow(10, sval.precision),\n // @ts-ignore\n symbol: NaiMap[sval.nai],\n };\n }\n}\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][SDK] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","export function isCommunity(value: unknown) {\n return typeof value === \"string\" ? /^hive-\\d+$/.test(value) : false;\n}\n","import { WrappedResponse } from \"../types/pagination\";\n\n/**\n * Type guard to check if response is wrapped with pagination metadata\n */\nexport function isWrappedResponse(response: any): response is WrappedResponse {\n return (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n \"pagination\" in response &&\n Array.isArray(response.data)\n );\n}\n\n/**\n * Normalize response to wrapped format for backwards compatibility\n * If the backend returns old format (array), convert it to wrapped format\n */\nexport function normalizeToWrappedResponse(\n response: T[] | WrappedResponse,\n limit: number\n): WrappedResponse {\n if (isWrappedResponse(response)) {\n return response;\n }\n\n // Old format - just an array\n // Since we don't have pagination metadata, assume no more pages\n return {\n data: Array.isArray(response) ? response : [],\n pagination: {\n total: Array.isArray(response) ? response.length : 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n}\n","export function vestsToHp(vests: number, hivePerMVests: number): number {\n return (vests / 1e6) * hivePerMVests;\n}\n","export function isEmptyDate(s: string | undefined): boolean {\n if (s === undefined) {\n return true;\n }\n\n return parseInt(s.split(\"-\")[0], 10) < 1980;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { DynamicProps } from \"../types\";\nimport { parseAsset } from \"../utils\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// This query powers wallet/HP/reward math that should stay close to chain state.\n// Keep a short refresh cadence despite the 5 RPC calls.\nconst DYNAMIC_PROPS_REFRESH_MS = 60 * 1000;\n\nexport function getDynamicPropsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.core.dynamicProps(),\n refetchInterval: DYNAMIC_PROPS_REFRESH_MS,\n staleTime: DYNAMIC_PROPS_REFRESH_MS,\n queryFn: async ({ signal }): Promise => {\n // Get raw blockchain data — all five calls are independent, run in parallel.\n // Hardfork properties is wrapped with catch since not all nodes support it.\n const [rawGlobalDynamic, rawFeedHistory, rawChainProps, rawRewardFund, rawHardforkProps] = await Promise.all([\n callRPC(\"condenser_api.get_dynamic_global_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_feed_history\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_chain_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_reward_fund\", [\"post\"], undefined, undefined, signal),\n callRPC(\"database_api.get_hardfork_properties\", {}, undefined, undefined, signal)\n .catch(() => ({ current_hardfork_version: \"1.28.0\", last_hardfork: 28 })),\n ]) as [any, any, any, any, any];\n\n // Calculate derived values for backward compatibility\n // parseAsset handles both string format (\"200905388484 HIVE\") and NAI format ({ amount, nai, precision })\n const totalVestingSharesAmount = parseAsset(rawGlobalDynamic.total_vesting_shares).amount;\n const totalVestingFundAmount = parseAsset(rawGlobalDynamic.total_vesting_fund_hive).amount;\n\n // Guard against division by zero/NaN/Infinity\n let hivePerMVests = 0;\n if (\n Number.isFinite(totalVestingSharesAmount) &&\n totalVestingSharesAmount !== 0 &&\n Number.isFinite(totalVestingFundAmount)\n ) {\n hivePerMVests = (totalVestingFundAmount / totalVestingSharesAmount) * 1e6;\n }\n const base = parseAsset(rawFeedHistory.current_median_history.base).amount;\n const quote = parseAsset(rawFeedHistory.current_median_history.quote).amount;\n const fundRecentClaims = parseFloat(rawRewardFund.recent_claims);\n const fundRewardBalance = parseAsset(rawRewardFund.reward_balance).amount;\n const votePowerReserveRate = Number(rawGlobalDynamic.vote_power_reserve_rate ?? 0);\n const authorRewardCurve = rawRewardFund.author_reward_curve ?? \"linear\";\n const contentConstant = Number(rawRewardFund.content_constant ?? 0);\n const currentHardforkVersion = String(rawHardforkProps.current_hardfork_version ?? \"0.0.0\");\n const lastHardfork = Number(rawHardforkProps.last_hardfork ?? 0);\n const hbdPrintRate = rawGlobalDynamic.hbd_print_rate;\n const hbdInterestRate = rawGlobalDynamic.hbd_interest_rate;\n const headBlock = rawGlobalDynamic.head_block_number;\n const totalVestingFund = totalVestingFundAmount;\n const totalVestingShares = totalVestingSharesAmount;\n const virtualSupply = parseAsset(rawGlobalDynamic.virtual_supply).amount;\n const vestingRewardPercent = rawGlobalDynamic.vesting_reward_percent || 0;\n const accountCreationFee = rawChainProps.account_creation_fee;\n\n return {\n // Backward compatible transformed fields (camelCase, parsed)\n hivePerMVests,\n base,\n quote,\n fundRecentClaims,\n fundRewardBalance,\n votePowerReserveRate,\n authorRewardCurve,\n contentConstant,\n currentHardforkVersion,\n lastHardfork,\n hbdPrintRate,\n hbdInterestRate,\n headBlock,\n totalVestingFund,\n totalVestingShares,\n virtualSupply,\n vestingRewardPercent,\n accountCreationFee,\n\n // Raw blockchain data (snake_case, unparsed) for direct use\n // Includes ALL fields from the blockchain responses\n raw: {\n globalDynamic: rawGlobalDynamic,\n feedHistory: rawFeedHistory,\n chainProps: rawChainProps,\n rewardFund: rawRewardFund,\n hardforkProps: rawHardforkProps,\n },\n } as DynamicProps;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface RewardFund {\n id: number;\n name: string;\n reward_balance: string;\n recent_claims: string;\n last_update: string;\n content_constant: string;\n percent_curation_rewards: number;\n percent_content_rewards: number;\n author_reward_curve: string;\n curation_reward_curve: string;\n}\n\n/**\n * Get reward fund information from the blockchain\n * @param fundName - Name of the reward fund (default: 'post')\n */\nexport function getRewardFundQueryOptions(fundName = \"post\") {\n return queryOptions({\n queryKey: QueryKeys.core.rewardFund(fundName),\n queryFn: () =>\n callRPC(\"condenser_api.get_reward_fund\", [\n fundName,\n ]) as Promise,\n });\n}\n","/**\n * Centralized query key definitions for all SDK queries.\n *\n * These key builders are the single source of truth for React Query cache keys.\n * Both SDK query options and web app consumers should reference these\n * instead of using inline string arrays.\n *\n * @example\n * ```typescript\n * import { QueryKeys } from \"@ecency/sdk\";\n *\n * // In query options\n * queryKey: QueryKeys.posts.entry(`/@${author}/${permlink}`)\n *\n * // In cache invalidation\n * queryClient.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) })\n * ```\n */\n/** Strip trailing undefined values so the key works as a prefix for partialMatchKey */\nfunction key(...parts: unknown[]): unknown[] {\n let end = parts.length;\n while (end > 0 && parts[end - 1] === undefined) {\n end--;\n }\n return parts.slice(0, end);\n}\n\nexport const QueryKeys = {\n // ===========================================================================\n // Posts\n // ===========================================================================\n posts: {\n entry: (entryPath: string) => [\"posts\", \"entry\", entryPath],\n postHeader: (author: string, permlink?: string) =>\n [\"posts\", \"post-header\", author, permlink],\n content: (author: string, permlink: string) =>\n [\"posts\", \"content\", author, permlink],\n contentReplies: (author: string, permlink: string) =>\n [\"posts\", \"content-replies\", author, permlink],\n accountPosts: (\n username: string,\n filter: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"account-posts\", username, filter, limit, observer],\n accountPostsPage: (\n username: string,\n filter: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n observer: string\n ) =>\n [\n \"posts\",\n \"account-posts-page\",\n username,\n filter,\n startAuthor,\n startPermlink,\n limit,\n observer,\n ],\n userPostVote: (username: string, author: string, permlink: string) =>\n [\"posts\", \"user-vote\", username, author, permlink],\n reblogs: (username: string, limit: number) =>\n [\"posts\", \"reblogs\", username, limit],\n entryActiveVotes: (author?: string, permlink?: string) =>\n [\"posts\", \"entry-active-votes\", author, permlink],\n rebloggedBy: (author: string, permlink: string) =>\n [\"posts\", \"reblogged-by\", author, permlink],\n tips: (author: string, permlink: string) =>\n [\"posts\", \"tips\", author, permlink],\n normalize: (author: string, permlink: string) =>\n [\"posts\", \"normalize\", author, permlink],\n drafts: (activeUsername?: string) =>\n [\"posts\", \"drafts\", activeUsername],\n draftsInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"drafts\", \"infinite\", activeUsername, limit),\n schedules: (activeUsername?: string) =>\n [\"posts\", \"schedules\", activeUsername],\n schedulesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"schedules\", \"infinite\", activeUsername, limit),\n fragments: (username?: string) =>\n [\"posts\", \"fragments\", username],\n fragmentsInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"fragments\", \"infinite\", username, limit),\n images: (username?: string) => [\"posts\", \"images\", username],\n galleryImages: (activeUsername?: string) =>\n [\"posts\", \"gallery-images\", activeUsername],\n imagesInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"images\", \"infinite\", username, limit),\n promoted: (type: string) => [\"posts\", \"promoted\", type],\n _promotedPrefix: [\"posts\", \"promoted\"],\n accountPostsBlogPrefix: (username: string) =>\n [\"posts\", \"account-posts\", username, \"blog\"] as const,\n postsRanked: (\n sort: string,\n tag: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"posts-ranked\", sort, tag, limit, observer],\n postsRankedPage: (\n sort: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n tag: string,\n observer: string\n ) =>\n [\n \"posts\",\n \"posts-ranked-page\",\n sort,\n startAuthor,\n startPermlink,\n limit,\n tag,\n observer,\n ],\n discussions: (\n author: string,\n permlink: string,\n order: string,\n observer: string\n ) => [\"posts\", \"discussions\", author, permlink, order, observer],\n discussion: (author: string, permlink: string, observer: string) =>\n [\"posts\", \"discussion\", author, permlink, observer],\n deletedEntry: (entryPath: string) =>\n [\"posts\", \"deleted-entry\", entryPath],\n commentHistory: (\n author: string,\n permlink: string,\n onlyMeta: boolean\n ) => [\"posts\", \"comment-history\", author, permlink, onlyMeta],\n trendingTags: () => [\"posts\", \"trending-tags\"],\n trendingTagsWithStats: (limit: number) =>\n [\"posts\", \"trending-tags\", \"stats\", limit],\n wavesFeed: (\n params: {\n containers?: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"feed\",\n params.tag ?? \"\",\n params.following ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n shortsFeed: (\n params: {\n containers?: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"shorts\",\n params.tag ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n wavesByHost: (host: string) =>\n [\"posts\", \"waves\", \"by-host\", host],\n wavesByTag: (host: string, tag: string) =>\n [\"posts\", \"waves\", \"by-tag\", host, tag],\n wavesFollowing: (host: string, username: string) =>\n [\"posts\", \"waves\", \"following\", host, username],\n wavesTrendingTags: (host: string, hours: number) =>\n [\"posts\", \"waves\", \"trending-tags\", host, hours],\n wavesByAccount: (host: string, username: string) =>\n [\"posts\", \"waves\", \"by-account\", host, username],\n wavesTrendingAuthors: (host: string) =>\n [\"posts\", \"waves\", \"trending-authors\", host],\n _prefix: [\"posts\"],\n },\n\n // ===========================================================================\n // Accounts\n // ===========================================================================\n accounts: {\n full: (username?: string) => [\"get-account-full\", username],\n list: (...usernames: string[]) =>\n [\"accounts\", \"list\", ...usernames],\n friends: (\n following: string,\n mode: string,\n followType: string,\n limit: number\n ) => [\"accounts\", \"friends\", following, mode, followType, limit],\n searchFriends: (username: string, mode: string, query: string) =>\n [\"accounts\", \"friends\", \"search\", username, mode, query],\n subscriptions: (username: string) =>\n [\"accounts\", \"subscriptions\", username],\n followCount: (username: string) =>\n [\"accounts\", \"follow-count\", username],\n recoveries: (username: string) =>\n [\"accounts\", \"recoveries\", username],\n pendingRecovery: (username: string) =>\n [\"accounts\", \"recoveries\", username, \"pending-request\"],\n checkWalletPending: (username: string, code: string | null) =>\n [\"accounts\", \"check-wallet-pending\", username, code],\n mutedUsers: (username: string) =>\n [\"accounts\", \"muted-users\", username],\n following: (\n follower: string,\n startFollowing: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"following\",\n follower,\n startFollowing,\n followType,\n limit,\n ],\n followers: (\n following: string,\n startFollower: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"followers\",\n following,\n startFollower,\n followType,\n limit,\n ],\n search: (query: string, excludeList?: string[]) =>\n [\"accounts\", \"search\", query, excludeList],\n profiles: (accounts: string[], observer: string) =>\n [\"accounts\", \"profiles\", accounts, observer],\n lookup: (query: string, limit: number) =>\n [\"accounts\", \"lookup\", query, limit],\n transactions: (username: string, group: string, limit: number) =>\n [\"accounts\", \"transactions\", username, group, limit],\n favorites: (activeUsername?: string) =>\n [\"accounts\", \"favorites\", activeUsername],\n favoritesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"favorites\", \"infinite\", activeUsername, limit),\n checkFavorite: (activeUsername: string, targetUsername: string) =>\n [\n \"accounts\",\n \"favorites\",\n \"check\",\n activeUsername,\n targetUsername,\n ],\n relations: (reference: string | undefined, target: string | undefined) =>\n [\"accounts\", \"relations\", reference, target],\n bots: () => [\"accounts\", \"bots\"],\n voteHistory: (username: string, limit: number) =>\n [\"accounts\", \"vote-history\", username, limit],\n reputations: (query: string, limit: number) =>\n [\"accounts\", \"reputations\", query, limit],\n bookmarks: (activeUsername?: string) =>\n [\"accounts\", \"bookmarks\", activeUsername],\n bookmarksInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"bookmarks\", \"infinite\", activeUsername, limit),\n referrals: (username: string) =>\n [\"accounts\", \"referrals\", username],\n referralsStats: (username: string) =>\n [\"accounts\", \"referrals-stats\", username],\n proMembers: () => [\"accounts\", \"pro-members\"],\n _prefix: [\"accounts\"],\n },\n\n // ===========================================================================\n // Notifications\n // ===========================================================================\n notifications: {\n announcements: () => [\"notifications\", \"announcements\"],\n spotlights: () => [\"notifications\", \"spotlights\"],\n list: (activeUsername?: string, filter?: string) =>\n [\"notifications\", activeUsername, filter],\n unreadCount: (activeUsername?: string) =>\n [\"notifications\", \"unread\", activeUsername],\n settings: (activeUsername?: string) =>\n [\"notifications\", \"settings\", activeUsername],\n _prefix: [\"notifications\"],\n },\n\n // ===========================================================================\n // Core\n // ===========================================================================\n core: {\n rewardFund: (fundName: string) =>\n [\"core\", \"reward-fund\", fundName],\n dynamicProps: () => [\"core\", \"dynamic-props\"],\n chainProperties: () => [\"core\", \"chain-properties\"],\n _prefix: [\"core\"],\n },\n\n // ===========================================================================\n // Communities\n // ===========================================================================\n communities: {\n single: (name?: string, observer?: string) =>\n [\"community\", \"single\", name, observer],\n /** Prefix key for matching all observer variants of a community */\n singlePrefix: (name: string) =>\n [\"community\", \"single\", name] as const,\n context: (username: string, communityName: string) =>\n [\"community\", \"context\", username, communityName],\n rewarded: () => [\"communities\", \"rewarded\"],\n list: (sort: string, query: string, limit: number) =>\n [\"communities\", \"list\", sort, query, limit],\n subscribers: (communityName: string) =>\n [\"communities\", \"subscribers\", communityName],\n subscribersInfinite: (communityName: string) =>\n [\"communities\", \"subscribers\", \"infinite\", communityName],\n accountNotifications: (account: string, limit: number) =>\n [\"communities\", \"account-notifications\", account, limit],\n },\n\n // ===========================================================================\n // Proposals\n // ===========================================================================\n proposals: {\n list: () => [\"proposals\", \"list\"],\n proposal: (id: number) => [\"proposals\", \"proposal\", id],\n votes: (proposalId: number, voter: string, limit: number) =>\n [\"proposals\", \"votes\", proposalId, voter, limit],\n votesPrefix: (proposalId: number) =>\n [\"proposals\", \"votes\", proposalId] as const,\n votesByUser: (voter: string) =>\n [\"proposals\", \"votes\", \"by-user\", voter],\n },\n\n // ===========================================================================\n // Search\n // ===========================================================================\n search: {\n topics: (q: string, limit: number) => [\"search\", \"topics\", q, limit],\n path: (q: string) => [\"search\", \"path\", q],\n account: (q: string, limit: number) =>\n [\"search\", \"account\", q, limit],\n results: (\n q: string,\n sort: string,\n hideLow: boolean | string,\n since?: string,\n scrollId?: string,\n votes?: number\n ) => {\n const normalizedHideLow = typeof hideLow === \"string\" ? hideLow === \"1\" || hideLow === \"true\" : hideLow;\n return [\"search\", q, sort, normalizedHideLow, since, scrollId, votes] as const;\n },\n controversialRising: (what: string, tag: string) =>\n [\"search\", \"controversial-rising\", what, tag],\n similarEntries: (author: string, permlink: string, content?: string) =>\n content\n ? [\"search\", \"similar-entries\", author, permlink, content]\n : [\"search\", \"similar-entries\", author, permlink],\n api: (\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n ) => key(\"search\", \"api\", q, sort, hideLow, since, votes, includeNsfw),\n },\n\n // ===========================================================================\n // Witnesses\n // ===========================================================================\n witnesses: {\n list: (limit: number) => [\"witnesses\", \"list\", limit],\n votes: (username: string | undefined) => [\"witnesses\", \"votes\", username],\n proxy: () => [\"witnesses\", \"proxy\"],\n voters: (\n witness: string,\n page: number,\n pageSize: number,\n sort: string,\n direction: string\n ) => [\"witnesses\", \"voters\", witness, page, pageSize, sort, direction],\n voterCount: (witness: string) =>\n [\"witnesses\", \"voter-count\", witness],\n },\n\n // ===========================================================================\n // Wallet\n // ===========================================================================\n wallet: {\n outgoingRcDelegations: (username: string, limit: number) =>\n [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n vestingDelegations: (username: string, limit: number) =>\n [\"wallet\", \"vesting-delegations\", username, limit],\n withdrawRoutes: (account: string) =>\n [\"wallet\", \"withdraw-routes\", account],\n incomingRc: (username: string) =>\n [\"wallet\", \"incoming-rc\", username],\n conversionRequests: (account: string) =>\n [\"wallet\", \"conversion-requests\", account],\n receivedVestingShares: (username: string) =>\n [\"wallet\", \"received-vesting-shares\", username],\n savingsWithdraw: (account: string) =>\n [\"wallet\", \"savings-withdraw\", account],\n openOrders: (user: string) =>\n [\"wallet\", \"open-orders\", user],\n collateralizedConversionRequests: (account: string) =>\n [\"wallet\", \"collateralized-conversion-requests\", account],\n recurrentTransfers: (username: string) =>\n [\"wallet\", \"recurrent-transfers\", username],\n balanceHistory: (username: string, coinType: string, pageSize: number) =>\n [\"wallet\", \"balance-history\", username, coinType, pageSize],\n aggregatedHistory: (\n username: string,\n coinType: string,\n granularity?: \"yearly\" | \"monthly\" | \"daily\"\n ) =>\n granularity === undefined\n ? [\"wallet\", \"aggregated-history\", username, coinType]\n : [\"wallet\", \"aggregated-history\", username, coinType, granularity],\n portfolio: (\n username: string,\n onlyEnabled: string,\n currency: string\n ) =>\n [\"wallet\", \"portfolio\", \"v2\", username, onlyEnabled, currency],\n },\n\n // ===========================================================================\n // Assets\n // ===========================================================================\n assets: {\n hiveGeneralInfo: (username: string) =>\n [\"assets\", \"hive\", \"general-info\", username],\n hiveTransactions: (username: string, limit: number, filterKey: string) =>\n [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n hiveWithdrawalRoutes: (username: string) =>\n [\"assets\", \"hive\", \"withdrawal-routes\", username],\n hiveMetrics: (bucketSeconds: number) =>\n [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n hbdGeneralInfo: (username: string) =>\n [\"assets\", \"hbd\", \"general-info\", username],\n hbdTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) => [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n hivePowerGeneralInfo: (username: string) =>\n [\"assets\", \"hive-power\", \"general-info\", username],\n hivePowerDelegates: (username: string) =>\n [\"assets\", \"hive-power\", \"delegates\", username],\n hivePowerDelegatings: (username: string) =>\n [\"assets\", \"hive-power\", \"delegatings\", username],\n hivePowerTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) =>\n [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n pointsGeneralInfo: (username: string) =>\n [\"assets\", \"points\", \"general-info\", username],\n pointsTransactions: (username: string, type: string) =>\n [\"assets\", \"points\", \"transactions\", username, type],\n ecencyAssetInfo: (username: string, asset: string, currency: string) =>\n [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n },\n\n // ===========================================================================\n // Market\n // ===========================================================================\n market: {\n statistics: () => [\"market\", \"statistics\"],\n orderBook: (limit: number) => [\"market\", \"order-book\", limit],\n history: (seconds: number, startDate: number, endDate: number) =>\n [\"market\", \"history\", seconds, startDate, endDate],\n feedHistory: () => [\"market\", \"feed-history\"],\n hiveHbdStats: () => [\"market\", \"hive-hbd-stats\"],\n data: (\n coin: string,\n vsCurrency: string,\n fromTs: number,\n toTs: number\n ) => [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n tradeHistory: (limit: number, start: number, end: number) =>\n [\"market\", \"trade-history\", limit, start, end],\n currentMedianHistoryPrice: () =>\n [\"market\", \"current-median-history-price\"],\n },\n\n // ===========================================================================\n // Analytics\n // ===========================================================================\n analytics: {\n discoverCuration: (duration: string) =>\n [\"analytics\", \"discover-curation\", duration],\n pageStats: (\n url: string,\n dimensions: string,\n metrics: string,\n dateRange: string\n ) =>\n [\"analytics\", \"page-stats\", url, dimensions, metrics, dateRange],\n discoverLeaderboard: (duration: string) =>\n [\"analytics\", \"discover-leaderboard\", duration],\n },\n\n // ===========================================================================\n // Promotions\n // ===========================================================================\n promotions: {\n promotePrice: () => [\"promotions\", \"promote-price\"],\n boostPlusPrices: () => [\"promotions\", \"boost-plus-prices\"],\n boostPlusAccounts: (account: string) =>\n [\"promotions\", \"boost-plus-accounts\", account],\n },\n\n // ===========================================================================\n // Resource Credits\n // ===========================================================================\n resourceCredits: {\n account: (username: string) =>\n [\"resource-credits\", \"account\", username],\n stats: () => [\"resource-credits\", \"stats\"],\n },\n\n // ===========================================================================\n // Points\n // ===========================================================================\n points: {\n points: (username: string, filter: number) =>\n [\"points\", username, filter],\n _prefix: (username: string) => [\"points\", username],\n },\n\n // ===========================================================================\n // Polls\n // ===========================================================================\n polls: {\n details: (author: string, permlink: string) =>\n [\"polls\", \"details\", author, permlink],\n vote: (author?: string, permlink?: string) =>\n author && permlink\n ? [\"polls\", \"vote\", author, permlink]\n : [\"polls\", \"vote\"],\n _prefix: [\"polls\"],\n },\n\n // ===========================================================================\n // Operations\n // ===========================================================================\n operations: {\n chainProperties: () => [\"operations\", \"chain-properties\"],\n },\n\n // ===========================================================================\n // Games\n // ===========================================================================\n games: {\n statusCheck: (gameType: string, username: string) =>\n [\"games\", \"status-check\", gameType, username],\n },\n\n quests: {\n status: (username: string | undefined) => [\"quests\", \"status\", username],\n },\n\n // ===========================================================================\n // Support Ecency\n // ===========================================================================\n support: {\n settings: (username: string | undefined) => [\"support\", \"settings\", username],\n _prefix: [\"support\"],\n },\n\n // ===========================================================================\n // Bad Actors\n // ===========================================================================\n badActors: {\n list: () => [\"bad-actors\", \"list\"],\n _prefix: [\"bad-actors\"],\n },\n\n // ===========================================================================\n // AI\n // ===========================================================================\n ai: {\n prices: () => [\"ai\", \"prices\"] as const,\n assistPrices: (username?: string) => [\"ai\", \"assist-prices\", username] as const,\n transcribePrice: (username?: string) => [\"ai\", \"transcribe-price\", username] as const,\n _prefix: [\"ai\"],\n },\n} as const;\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiImagePriceResponse } from \"../types\";\n\nexport function getAiGeneratePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.prices(),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-generate-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI generation prices: ${response.status}`);\n }\n\n return (await response.json()) as AiImagePriceResponse;\n },\n staleTime: 300_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiAssistPrice } from \"../types\";\n\nexport function getAiAssistPriceQueryOptions(username: string | undefined, accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.assistPrices(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-assist-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI assist prices: ${response.status}`);\n }\n\n return (await response.json()) as AiAssistPrice[];\n },\n staleTime: 60_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiTranscribePrice } from \"../types\";\n\n/**\n * Dictation pricing. Kept on its own route rather than folded into\n * /private-api/ai-assist-price: that endpoint returns a list of flat-cost actions and\n * shipped clients render every entry as a selectable assist action, so adding a\n * metered one there would surface in older clients as an action they cannot perform.\n *\n * Everything except `free_remaining` is static, so this is cheap to hold and lets the\n * client price a clip locally while the user is still recording.\n */\nexport function getAiTranscribePriceQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.ai.transcribePrice(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI transcribe price: ${response.status}`);\n }\n\n return (await response.json()) as AiTranscribePrice;\n },\n staleTime: 60_000,\n enabled: !!accessToken\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiGenerationResponse } from \"../types\";\n\nexport interface GenerateImageParams {\n prompt: string;\n aspect_ratio?: string;\n power?: number;\n // Pass a stable key to make a retry recover the same paid generation. If omitted a\n // fresh key is generated per call (only dedupes edge/proxy retries, not user retries).\n idempotency_key?: string;\n}\n\n// Generates a key matching the eepoints validator [A-Za-z0-9_-]{8,64}.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useGenerateImage(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"generate-image\"],\n mutationFn: async (params: GenerateImageParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-generate-image\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: accessToken,\n us: username,\n prompt: params.prompt,\n aspect_ratio: params.aspect_ratio ?? \"1:1\",\n power: params.power ?? 1,\n idempotency_key: params.idempotency_key ?? makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][GenerateImage] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n // 202 = the prediction is paid for and captured but not yet delivered to our image\n // host. Detect it by HTTP status BEFORE parsing (the body may be present or empty)\n // and surface it as a typed error so the caller can retry with the SAME\n // idempotency_key to fetch it — no second prediction, no second charge.\n if (response.status === 202) {\n let pendingData: Record = {};\n try {\n pendingData = await response.json();\n } catch {\n // empty / non-JSON 202 body is fine — the status alone drives recovery\n }\n const err = new Error(\"[SDK][AI][GenerateImage] – delivery pending\");\n (err as any).status = 202;\n (err as any).data = pendingData;\n throw err;\n }\n\n const data = (await response.json()) as AiGenerationResponse;\n\n return data;\n },\n onSuccess: () => {\n // Invalidate points cache since balance changed\n if (username) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiAssistResponse } from \"../types\";\n\nexport interface AiAssistParams {\n action: string;\n text: string;\n code?: string;\n}\n\n// Generates a key that matches the eepoints validator [A-Za-z0-9_-]{8,64}.\n// Used to dedupe duplicate POSTs caused by edge/proxy retries — same key on\n// retry returns the cached AI output without re-charging or re-calling Claude.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useAiAssist(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"assist\"],\n mutationFn: async (params: AiAssistParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][Assist] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][Assist] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-assist\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: params.code ?? accessToken,\n us: username,\n action: params.action,\n text: params.text,\n idempotency_key: makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][Assist] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n return (await response.json()) as AiAssistResponse;\n },\n onSuccess: (data) => {\n if (username) {\n // Invalidate points cache if cost was charged\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n // Invalidate assist prices to refresh free_remaining counts\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.assistPrices(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiTranscribeParams, AiTranscribeResponse } from \"../types\";\n\n// Matches the eepoints validator [A-Za-z0-9_-]{8,64}. Dedupes duplicate POSTs caused\n// by edge/proxy retries -- the same key returns the cached transcript without\n// re-charging or re-calling the vendor.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Transcribe an audio clip to text, charged per 30 seconds.\n *\n * Sends multipart/form-data rather than JSON because it carries a file. Unlike the\n * other AI mutations the charge is BURNED rather than moved to the treasury, so the\n * points transaction shows up as PointTransactionType.BURNED (997).\n */\nexport function useAiTranscribe(username: string | undefined, accessToken: string | undefined) {\n return useMutation({\n mutationKey: [\"ai\", \"transcribe\"],\n mutationFn: async (params: AiTranscribeParams): Promise => {\n if (!username) {\n throw new Error(\"[SDK][AI][Transcribe] – username wasn't provided\");\n }\n\n // Validate the token actually being sent, not just the bound one. A caller\n // that resolves a fresh token per call (because the bound one can expire\n // during a long recording) legitimately has nothing at hook construction.\n const code = params.code ?? accessToken;\n if (!code) {\n throw new Error(\"[SDK][AI][Transcribe] – access token wasn't found\");\n }\n\n const form = new FormData();\n form.append(\"code\", code);\n // `us` is resolved from the code server-side and is deliberately not sent:\n // upstream burns from whoever it names.\n form.append(\"duration_ms\", String(Math.round(params.durationMs)));\n // Caller-supplied key when there is one. Generating a fresh key per attempt\n // would defeat the dedupe in the one case it exists for: a POST that reached\n // the server whose response was lost. Retrying then would transcribe and\n // charge a second time. Same contract as useGenerateImage.\n form.append(\"idempotency_key\", params.idempotency_key ?? makeIdempotencyKey());\n form.append(\"audio\", params.audio, params.fileName ?? \"clip.webm\");\n\n const fetchApi = getBoundFetch();\n // No Content-Type header: fetch sets it, including the multipart boundary.\n // Setting it by hand drops the boundary and the body becomes unparseable.\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe\", {\n method: \"POST\",\n body: form\n });\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n // Object.assign rather than `as any` casts: callers need `status` to tell a\n // 402 (out of Points) from a 429 (rate limited) from a 400 (clip too long),\n // and this keeps that shape typed.\n throw Object.assign(\n new Error(\n `[SDK][AI][Transcribe] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n ),\n { status: response.status, data: parsed }\n );\n }\n\n return (await response.json()) as AiTranscribeResponse;\n },\n onSuccess: (data) => {\n if (username) {\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username)\n });\n }\n // Refresh free_remaining, which only Pro members ever have above zero.\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.transcribePrice(username)\n });\n }\n }\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport {\n AccountFollowStats,\n FullAccount,\n} from \"../types\";\nimport { parseProfileMetadata } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** The raw `condenser_api.get_accounts` row — every FullAccount field except the three\n * this query derives separately (follow_stats + reputation from bridge, profile parsed). */\ntype RawAccount = Omit;\n\n/** Minimal shape read from `bridge.get_profile` (hivemind social profile): it carries\n * the reputation score, the follower/following counts and hivemind's parsed\n * (normalized) profile — the latter is used only to cross-validate the chain row. */\ninterface BridgeProfile {\n reputation?: number;\n stats?: { followers?: number; following?: number };\n metadata?: { profile?: Record };\n}\n\n/** True when the chain row carries no account metadata at all. Legitimate for\n * accounts that never set a profile — but combined with a populated hivemind\n * profile it identifies a node serving stripped account rows. */\nfunction isMetadataStripped(account: RawAccount): boolean {\n return !account.posting_json_metadata && !account.json_metadata;\n}\n\n/** True when a hivemind `metadata.profile` object carries at least one real\n * value. Hivemind emits its fixed profile keys with empty strings for\n * accounts without a profile, so key presence alone proves nothing. */\nfunction hasProfileValues(profile?: Record | null): boolean {\n if (!profile) return false;\n return Object.values(profile).some((value) =>\n typeof value === \"string\" ? value.length > 0 : value != null\n );\n}\n\nexport function getAccountFullQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.full(username),\n queryFn: async ({ signal }) => {\n if (!username) {\n return null;\n }\n\n // Fetch the chain account (balances/keys/vesting) and the hivemind profile in\n // parallel — both only need the username. bridge.get_profile carries BOTH the\n // follower/following counts and the reputation score, so it replaces the old\n // second-layer condenser_api.get_follow_count RPC *and* the reputation-api REST\n // call: condenser_api.get_accounts no longer returns a usable reputation (it is 0\n // since the hardfork), and there is no reason to make two extra round-trips for\n // data one profile object already carries.\n const [response, bridgeProfile] = await Promise.all([\n callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so fail over to the next node instead of misreading it as\n // \"account does not exist\".\n (rows) => Array.isArray(rows)\n ),\n callRPC(\n \"bridge.get_profile\",\n { account: username },\n undefined,\n undefined,\n signal\n ).catch((e): BridgeProfile | null => {\n // A caller cancel (aborted signal) must propagate — only genuine RPC/transport\n // failures degrade to reputation 0 / no follow_stats.\n if (signal?.aborted) throw e;\n return null;\n })\n ]);\n if (!response?.[0]) {\n // The account does not exist (e.g. not yet finalized on-chain during\n // signup). Treat absence as a recoverable null instead of throwing, so\n // consumers (useQuery hooks and fetchQuery callers) surface it as empty\n // data rather than an unhandled rejection / error-boundary crash.\n return null;\n }\n\n let chainAccount = response[0];\n\n // Cross-validate the chain row against the hivemind profile fetched in\n // the same query. Some public nodes serve account rows with BOTH\n // metadata fields stripped to \"\" (observed in the wild) while their own\n // hivemind still returns the real profile — and a merge base built from\n // such a row wipes the user's profile on the next partial\n // account_update2. When the row claims \"no metadata\" but hivemind\n // disagrees, re-read once (failover may pick another node) and otherwise\n // fail the query: an error here is recoverable, a poisoned cache entry\n // is not.\n if (\n isMetadataStripped(chainAccount) &&\n hasProfileValues(bridgeProfile?.metadata?.profile)\n ) {\n // The re-read carries a payload validator: a stripped row is treated\n // as a node fault, so the failover walk moves on to other nodes (and\n // repeat offenders earn a per-API health cooldown) instead of asking\n // the same lying node twice.\n const reread = await callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n (rows) =>\n Array.isArray(rows) &&\n (!rows[0] || !isMetadataStripped(rows[0] as RawAccount))\n );\n if (reread[0] && !isMetadataStripped(reread[0])) {\n chainAccount = reread[0];\n } else {\n throw new Error(\n `[SDK][Accounts] – inconsistent account row for ${username}: empty json metadata while hivemind profile is populated`\n );\n }\n }\n\n const profile = parseProfileMetadata(chainAccount.posting_json_metadata);\n\n // bridge.get_profile.stats → follower/following counts; `reputation` is the\n // computed score (e.g. 78.29). accountReputation() floors an in-range score, so\n // it yields the same value the reputation-api used to return. Both degrade to a\n // safe default if the profile call failed.\n const stats = bridgeProfile?.stats;\n const follow_stats: AccountFollowStats | undefined = stats\n ? {\n account: chainAccount.name,\n follower_count: stats.followers ?? 0,\n following_count: stats.following ?? 0\n }\n : undefined;\n const reputationValue: number = bridgeProfile?.reputation ?? 0;\n\n return {\n name: chainAccount.name,\n owner: chainAccount.owner,\n active: chainAccount.active,\n posting: chainAccount.posting,\n memo_key: chainAccount.memo_key,\n post_count: chainAccount.post_count,\n created: chainAccount.created,\n posting_json_metadata: chainAccount.posting_json_metadata,\n last_vote_time: chainAccount.last_vote_time,\n last_post: chainAccount.last_post,\n json_metadata: chainAccount.json_metadata,\n reward_hive_balance: chainAccount.reward_hive_balance,\n reward_hbd_balance: chainAccount.reward_hbd_balance,\n reward_vesting_hive: chainAccount.reward_vesting_hive,\n reward_vesting_balance: chainAccount.reward_vesting_balance,\n balance: chainAccount.balance,\n hbd_balance: chainAccount.hbd_balance,\n savings_balance: chainAccount.savings_balance,\n savings_hbd_balance: chainAccount.savings_hbd_balance,\n savings_hbd_last_interest_payment:\n chainAccount.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update:\n chainAccount.savings_hbd_seconds_last_update,\n savings_hbd_seconds: chainAccount.savings_hbd_seconds,\n next_vesting_withdrawal: chainAccount.next_vesting_withdrawal,\n pending_claimed_accounts: chainAccount.pending_claimed_accounts,\n vesting_shares: chainAccount.vesting_shares,\n delegated_vesting_shares: chainAccount.delegated_vesting_shares,\n received_vesting_shares: chainAccount.received_vesting_shares,\n vesting_withdraw_rate: chainAccount.vesting_withdraw_rate,\n to_withdraw: chainAccount.to_withdraw,\n withdrawn: chainAccount.withdrawn,\n witness_votes: chainAccount.witness_votes,\n proxy: chainAccount.proxy,\n recovery_account: chainAccount.recovery_account,\n proxied_vsf_votes: chainAccount.proxied_vsf_votes,\n voting_manabar: chainAccount.voting_manabar,\n voting_power: chainAccount.voting_power,\n downvote_manabar: chainAccount.downvote_manabar,\n follow_stats,\n reputation: reputationValue,\n profile,\n } satisfies FullAccount;\n },\n enabled: !!username,\n staleTime: 60000,\n });\n}\n","import { AccountProfile, FullAccount } from \"../types\";\n\nexport type ProfileTokens = AccountProfile[\"tokens\"];\n\nconst DENIED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nfunction deepMerge>(target: T, source: Record): T {\n const result = { ...target } as Record;\n for (const key of Object.keys(source)) {\n if (DENIED_KEYS.has(key)) {\n continue;\n }\n const srcVal = source[key];\n const tgtVal = result[key];\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\n result[key] = deepMerge(tgtVal, srcVal);\n } else {\n result[key] = srcVal;\n }\n }\n return result as T;\n}\n\nexport interface BuildProfileMetadataArgs {\n existingProfile?: AccountProfile;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}\n\nfunction sanitizeTokens(\n tokens?: ProfileTokens | null\n): ProfileTokens | undefined {\n // Guard against corrupted data from blockchain where tokens is not an array\n if (!tokens || !Array.isArray(tokens)) {\n return undefined;\n }\n\n return tokens.map(({ meta, ...rest }) => {\n if (!meta || typeof meta !== \"object\") {\n return { ...rest, meta };\n }\n\n const { privateKey, username, ...safeMeta } = meta;\n return { ...rest, meta: safeMeta };\n });\n}\n\nexport function parseProfileMetadata(\n postingJsonMetadata?: string | null\n): AccountProfile {\n if (!postingJsonMetadata) {\n return {} as AccountProfile;\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n parsed.profile &&\n typeof parsed.profile === \"object\"\n ) {\n return parsed.profile as AccountProfile;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata:\", err, { length: postingJsonMetadata?.length ?? 0 });\n }\n\n return {} as AccountProfile;\n}\n\nexport function extractAccountProfile(\n data?: Pick | null\n): AccountProfile {\n return parseProfileMetadata(data?.posting_json_metadata);\n}\n\n/**\n * Choose between two account snapshots for a posting-metadata merge base.\n * Prefers `preferred` (typically the freshest cache entry) unless `fallback`\n * carries strictly more profile keys — guarding read-modify-write flows\n * against a snapshot whose metadata was served stripped by a misbehaving node\n * while another snapshot still holds the real profile. A partial update must\n * never shrink the profile while any snapshot still knows the full one.\n */\nexport function pickRicherMetadataSnapshot<\n T extends Pick\n>(\n preferred: T | null | undefined,\n fallback: T | null | undefined\n): T | null | undefined {\n if (!preferred) return fallback;\n if (!fallback) return preferred;\n const preferredKeys = Object.keys(\n parseProfileMetadata(preferred.posting_json_metadata)\n ).length;\n const fallbackKeys = Object.keys(\n parseProfileMetadata(fallback.posting_json_metadata)\n ).length;\n return fallbackKeys > preferredKeys ? fallback : preferred;\n}\n\n/**\n * Parse the FULL root object of posting_json_metadata, not just its `profile`\n * key. Returns {} for missing/invalid input or a non-object root.\n *\n * `parseProfileMetadata` intentionally returns only `parsed.profile`; this\n * helper exists so writers can carry forward any sibling top-level keys that\n * live alongside `profile` (data other Hive apps may store there) instead of\n * dropping them on the next update.\n */\nexport function parsePostingMetadataRoot(\n postingJsonMetadata?: string | null\n): Record {\n if (!postingJsonMetadata) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata root:\", err, {\n length: postingJsonMetadata?.length ?? 0,\n });\n }\n\n return {};\n}\n\n/**\n * Build the serialized `posting_json_metadata` string for an account_update2\n * operation. It deep-merges the profile (via {@link buildProfileMetadata}) over\n * the account's CURRENT on-chain profile AND preserves any non-`profile`\n * top-level keys present in the existing metadata, so a partial profile update\n * (e.g. only `pinned` or only `tokens`) never clobbers unrelated fields.\n */\nexport function buildPostingJsonMetadata({\n existingPostingJsonMetadata,\n profile,\n tokens,\n}: {\n existingPostingJsonMetadata?: string | null;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}): string {\n const root = parsePostingMetadataRoot(existingPostingJsonMetadata);\n const existingProfile = isPlainObject(root.profile)\n ? (root.profile as AccountProfile)\n : ({} as AccountProfile);\n\n const mergedProfile = buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n });\n\n return JSON.stringify({ ...root, profile: mergedProfile });\n}\n\nexport function buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n}: BuildProfileMetadataArgs): AccountProfile {\n const { tokens: profileTokens, version: _ignoredVersion, ...profileRest } =\n profile ?? {};\n\n const metadata = deepMerge(\n (existingProfile ?? {}) as Record,\n profileRest as Record,\n ) as AccountProfile;\n\n // Clean up corrupted tokens data from blockchain before processing\n if (metadata.tokens && !Array.isArray(metadata.tokens)) {\n metadata.tokens = undefined;\n }\n\n // tokens semantics:\n // undefined → no change, fall back to profileTokens from profile partial\n // null or [] → explicitly clear tokens\n // non-empty array → set tokens\n if (tokens !== undefined) {\n // Explicit intent from caller: null or [] clears, non-empty array sets\n metadata.tokens = tokens && tokens.length > 0 ? tokens : [];\n } else if (profileTokens !== undefined) {\n // Fall back to tokens from profile partial (including empty array to clear)\n metadata.tokens = profileTokens;\n }\n\n metadata.tokens = sanitizeTokens(metadata.tokens);\n metadata.version = 2;\n\n return metadata;\n}\n","import { FullAccount, AccountProfile } from \"../types\";\nimport { parseProfileMetadata } from \"./profile-metadata\";\n\n/**\n * Parses raw account data from Hive API into FullAccount type\n * Handles profile metadata extraction from posting_json_metadata or json_metadata\n */\nexport function parseAccounts(rawAccounts: any[]): FullAccount[] {\n return rawAccounts.map((x) => {\n const account: FullAccount = {\n name: x.name,\n owner: x.owner,\n active: x.active,\n posting: x.posting,\n memo_key: x.memo_key,\n post_count: x.post_count,\n created: x.created,\n reputation: x.reputation,\n posting_json_metadata: x.posting_json_metadata,\n last_vote_time: x.last_vote_time,\n last_post: x.last_post,\n json_metadata: x.json_metadata,\n reward_hive_balance: x.reward_hive_balance,\n reward_hbd_balance: x.reward_hbd_balance,\n reward_vesting_hive: x.reward_vesting_hive,\n reward_vesting_balance: x.reward_vesting_balance,\n balance: x.balance,\n hbd_balance: x.hbd_balance,\n savings_balance: x.savings_balance,\n savings_hbd_balance: x.savings_hbd_balance,\n savings_hbd_last_interest_payment: x.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update: x.savings_hbd_seconds_last_update,\n savings_hbd_seconds: x.savings_hbd_seconds,\n next_vesting_withdrawal: x.next_vesting_withdrawal,\n pending_claimed_accounts: x.pending_claimed_accounts,\n vesting_shares: x.vesting_shares,\n delegated_vesting_shares: x.delegated_vesting_shares,\n received_vesting_shares: x.received_vesting_shares,\n vesting_withdraw_rate: x.vesting_withdraw_rate,\n to_withdraw: x.to_withdraw,\n withdrawn: x.withdrawn,\n witness_votes: x.witness_votes,\n proxy: x.proxy,\n recovery_account: x.recovery_account,\n proxied_vsf_votes: x.proxied_vsf_votes,\n voting_manabar: x.voting_manabar,\n voting_power: x.voting_power,\n downvote_manabar: x.downvote_manabar,\n };\n\n // Try to parse profile from posting_json_metadata first\n let profile: AccountProfile | undefined = parseProfileMetadata(\n x.posting_json_metadata\n );\n\n // Fallback to json_metadata if posting_json_metadata didn't have a profile\n if (!profile || Object.keys(profile).length === 0) {\n try {\n const jsonMetadata = JSON.parse(x.json_metadata || \"{}\");\n if (jsonMetadata.profile) {\n profile = jsonMetadata.profile;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n // Ensure we always have a profile object\n if (!profile || Object.keys(profile).length === 0) {\n profile = {\n about: \"\",\n cover_image: \"\",\n location: \"\",\n name: \"\",\n profile_image: \"\",\n website: \"\",\n };\n }\n\n return { ...account, profile };\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { parseAccounts } from \"../utils/parse-accounts\";\nimport { FullAccount } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountsQueryOptions(usernames: string[]) {\n return queryOptions({\n queryKey: QueryKeys.accounts.list(...usernames),\n enabled: usernames.length > 0,\n queryFn: async (): Promise => {\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so the validator makes callRPC fail over to the next node\n // instead of resolving with a payload parseAccounts cannot map over.\n const response = (await callRPC(\n \"condenser_api.get_accounts\",\n [usernames],\n undefined,\n undefined,\n undefined,\n (rows) => Array.isArray(rows)\n )) as any[];\n return parseAccounts(response ?? []);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountFollowStats } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get follow count (followers and following) for an account\n */\nexport function getFollowCountQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followCount(username),\n queryFn: () =>\n callRPC(\"condenser_api.get_follow_count\", [\n username,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts following a user\n *\n * @param following - The account being followed\n * @param startFollower - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowersQueryOptions(\n following: string | undefined,\n startFollower: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followers(following!, startFollower, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_followers\", [\n following,\n startFollower,\n followType,\n limit,\n ]) as Promise,\n enabled: !!following,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts that a user is following\n *\n * @param follower - The account doing the following\n * @param startFollowing - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowingQueryOptions(\n follower: string,\n startFollowing: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.following(follower, startFollowing, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_following\", [\n follower,\n startFollowing,\n followType,\n limit,\n ]) as Promise,\n enabled: !!follower,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** `condenser_api.get_following` caps a single response at 1000 rows. */\nconst MUTED_USERS_PAGE_SIZE = 1000;\n\n/**\n * Safety valve for the paging loop: 20 pages is 20k muted accounts, far past\n * any real mute list. Bounds the work if a node ever stops advancing the\n * cursor, so a malformed response degrades to a truncated list rather than an\n * endless request loop.\n */\nconst MUTED_USERS_MAX_PAGES = 20;\n\n/**\n * Get the full list of accounts a user has muted.\n *\n * Pages until the list is exhausted instead of taking the first N. That is\n * load-bearing: this result dims muted authors in feeds and collapses their\n * comments (`entry-list-item-muted-content`, `discussion-list`), so a truncated\n * list silently renders muted accounts as though they were never muted.\n *\n * Takes no limit, on purpose. `QueryKeys.accounts.mutedUsers` keys on the\n * username alone, so a limit parameter meant callers requesting different\n * amounts shared one cache entry and whichever mounted first decided how much\n * of the list every other caller saw.\n *\n * @param username - The account whose mute list to fetch\n */\nexport function getMutedUsersQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.mutedUsers(username!),\n queryFn: async () => {\n const muted: string[] = [];\n let start = \"\";\n\n for (let page = 0; page < MUTED_USERS_MAX_PAGES; page++) {\n const response = (await callRPC(\"condenser_api.get_following\", [\n username,\n start,\n \"ignore\",\n MUTED_USERS_PAGE_SIZE,\n ])) as Follow[];\n\n if (!response?.length) {\n break;\n }\n\n let names = response.map((user) => user.following);\n\n // `start` is exclusive on Hive, so a page should not repeat the cursor.\n // Drop it defensively anyway: against a node treating `start` as\n // inclusive, this loop would otherwise re-append the same account until\n // it hit the page cap.\n if (names[0] === start) {\n names = names.slice(1);\n }\n\n if (!names.length) {\n break;\n }\n\n muted.push(...names);\n\n if (response.length < MUTED_USERS_PAGE_SIZE) {\n break;\n }\n\n start = names[names.length - 1];\n }\n\n return muted;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Lookup accounts by username prefix\n *\n * @param query - Username prefix to search for\n * @param limit - Maximum number of results (default: 50)\n */\nexport function lookupAccountsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.lookup(query, limit),\n queryFn: () =>\n callRPC(\"condenser_api.lookup_accounts\", [\n query,\n limit,\n ]) as Promise,\n enabled: !!query,\n staleTime: Infinity,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountsByUsernameQueryOptions(\n query: string,\n limit = 5,\n excludeList: string[] = []\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.search(query, excludeList),\n enabled: !!query,\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.lookup_accounts\", [query, limit])) as string[];\n return response.filter((item) =>\n excludeList.length > 0 ? !excludeList.includes(item) : true\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountProfile } from \"../types\";\n\ntype AccountProfileToken = NonNullable[number];\n\nexport type WalletMetadataCandidate = Partial & {\n currency?: string;\n show?: boolean;\n address?: string;\n publicKey?: string;\n privateKey?: string;\n username?: string;\n};\n\nexport interface CheckUsernameWalletsPendingResponse {\n exist: boolean;\n tokens?: WalletMetadataCandidate[];\n wallets?: WalletMetadataCandidate[];\n}\n\nconst RESERVED_META_KEYS = new Set([\n \"ownerPublicKey\",\n \"activePublicKey\",\n \"postingPublicKey\",\n \"memoPublicKey\",\n]);\n\ninterface WalletsEndpointResponseItem {\n token?: unknown;\n address?: unknown;\n status?: unknown;\n meta?: unknown;\n username?: unknown;\n}\n\nexport function checkUsernameWalletsPendingQueryOptions(\n username: string,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkWalletPending(username, code ?? null),\n queryFn: async () => {\n if (!username || !code) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/wallets\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code,\n }),\n }\n );\n\n if (!response.ok) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const payload = (await response.json()) as unknown;\n\n const wallets: WalletMetadataCandidate[] = Array.isArray(payload)\n ? payload.flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const walletItem = item as WalletsEndpointResponseItem;\n\n const symbol =\n typeof walletItem.token === \"string\"\n ? walletItem.token\n : undefined;\n\n if (!symbol) {\n return [];\n }\n\n const meta: Record =\n walletItem.meta && typeof walletItem.meta === \"object\"\n ? { ...(walletItem.meta as Record) }\n : {};\n\n const sanitizedMeta: Record = {};\n\n const address =\n typeof walletItem.address === \"string\" && walletItem.address\n ? walletItem.address\n : undefined;\n\n const statusShow =\n typeof walletItem.status === \"number\"\n ? walletItem.status === 3\n : undefined;\n\n const showFlag = statusShow ?? false;\n\n if (address) {\n sanitizedMeta.address = address;\n }\n\n sanitizedMeta.show = showFlag;\n\n const baseCandidate = {\n symbol,\n currency: symbol,\n address,\n show: showFlag,\n type: \"CHAIN\",\n meta: sanitizedMeta,\n } satisfies WalletMetadataCandidate;\n\n const metaTokenCandidates: WalletMetadataCandidate[] = [];\n\n for (const [metaSymbol, metaValue] of Object.entries(meta)) {\n if (typeof metaSymbol !== \"string\") {\n continue;\n }\n\n if (RESERVED_META_KEYS.has(metaSymbol)) {\n continue;\n }\n\n if (typeof metaValue !== \"string\" || !metaValue) {\n continue;\n }\n\n if (!/^[A-Z0-9]{2,10}$/.test(metaSymbol)) {\n continue;\n }\n\n metaTokenCandidates.push({\n symbol: metaSymbol,\n currency: metaSymbol,\n address: metaValue,\n show: showFlag,\n type: \"CHAIN\",\n meta: { address: metaValue, show: showFlag },\n });\n }\n\n return [baseCandidate, ...metaTokenCandidates];\n })\n : [];\n\n return {\n exist: wallets.length > 0,\n tokens: wallets.length ? wallets : undefined,\n wallets: wallets.length ? wallets : undefined,\n } satisfies CheckUsernameWalletsPendingResponse;\n },\n refetchOnMount: true,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountRelationship } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRelationshipBetweenAccountsQueryOptions(\n reference: string | undefined,\n target: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.relations(reference, target),\n enabled: !!reference && !!target,\n refetchOnMount: false,\n refetchInterval: 3_600_000,\n queryFn: async () => {\n const fallback: AccountRelationship = {\n follows: false,\n ignores: false,\n blacklists: false,\n follows_muted: false,\n follows_blacklists: false,\n };\n\n // `enabled` only gates the automatic useQuery run. fetchQuery and\n // prefetchQuery invoke queryFn regardless, so guard here as well rather\n // than sending a missing account name to the RPC and caching the result.\n if (!reference || !target) {\n return fallback;\n }\n\n const result = await callRPC(\"bridge.get_relationship_between_accounts\", [reference, target]);\n return (result ?? fallback) as AccountRelationship;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype Subscriptions = string[];\n\nexport function getAccountSubscriptionsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.subscriptions(username!),\n enabled: !!username,\n queryFn: async ({ signal }) => {\n const response = await callRPC(\"bridge.list_all_subscriptions\", {\n account: username,\n }, undefined, undefined, signal);\n return (response ?? []) as Subscriptions;\n },\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountBookmark } from \"../types\";\n\nexport function getBookmarksQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.bookmarks(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Bookmarks] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountBookmark[];\n },\n });\n}\n\nexport function getBookmarksInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.bookmarksInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bookmarks: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../types\";\n\nexport function getFavoritesQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.favorites(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountFavorite[];\n },\n });\n}\n\nexport function getFavoritesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.favoritesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/favorites?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch favorites: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n/**\n * Query options to check if a specific account is in the active user's favorites\n * @param activeUsername - The logged-in user's username\n * @param code - Access token for authentication\n * @param targetUsername - The username to check if favorited\n * @returns Query options for checking if target is favorited\n */\nexport function checkFavoriteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n targetUsername: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkFavorite(activeUsername!, targetUsername!),\n enabled: !!activeUsername && !!code && !!targetUsername,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n if (!targetUsername) {\n throw new Error(\"[SDK][Accounts][Favorites] – no target username\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-check\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n account: targetUsername,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n const result = await response.json();\n if (typeof result !== \"boolean\") {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check returned invalid type: expected boolean, got ${typeof result}`\n );\n }\n\n return result;\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetRecoveriesEmailResponse } from \"../types\";\n\nexport function getAccountRecoveriesQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n enabled: !!username && !!code,\n queryKey: QueryKeys.accounts.recoveries(username!),\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Accounts] Missing username or access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/recoveries\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n return response.json() as Promise;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountPendingRecoveryQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n enabled: !!username,\n queryKey: QueryKeys.accounts.pendingRecovery(username!),\n queryFn: () =>\n callRPC(\"database_api.find_change_recovery_account_requests\", { accounts: [username] }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountReputation } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountReputationsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.reputations(query, limit),\n enabled: !!query,\n queryFn: async (): Promise => {\n if (!query) {\n return [];\n }\n\n return callRPC(\"condenser_api.get_account_reputations\", [query, limit]) as Promise;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { utils } from \"../../../hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Transaction, OperationGroup } from \"../types/transaction\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { parseAsset, NaiMap } from \"@/modules/core/utils\";\n\nconst ops = utils.operations;\n\nexport const ACCOUNT_OPERATION_GROUPS: Record = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n};\n\nexport const ALL_ACCOUNT_OPERATIONS = [...Object.values(ACCOUNT_OPERATION_GROUPS)].reduce(\n (acc, val) => acc.concat(val),\n []\n);\n\ninterface TxPageRaw {\n entries: Transaction[];\n currentPage: number;\n}\n\n/**\n * Cursor for transaction pagination.\n * null = first request (returns newest page, API omits page param).\n * number = specific page to fetch (decrementing for older data).\n */\ntype TxCursor = number | null;\n\ninterface HafahOperation {\n op: {\n type: string;\n value: Record;\n };\n block: number;\n trx_id: string;\n op_pos: number;\n op_type_id: number;\n timestamp: string;\n virtual_op: boolean;\n operation_id: string;\n trx_in_block: number;\n}\n\ninterface HafahResponse {\n total_operations: number;\n total_pages: number;\n operations_result: HafahOperation[];\n}\n\n/**\n * Derive a safe, unique, and chronologically ordered `num` from REST fields.\n *\n * Layout: block * 10_000_000 + trx_in_block * 100 + op_pos\n * - trx_in_block: up to 99_999 (Hive max block size ~65K txs)\n * - op_pos: up to 99 (operations within a single transaction)\n * - Max value: 105_000_000 * 10_000_000 = 1.05e15, within MAX_SAFE_INTEGER (9.007e15)\n */\nfunction deriveNum(entry: HafahOperation): number {\n return entry.block * 10_000_000 + entry.trx_in_block * 100 + entry.op_pos;\n}\n\n/**\n * Strip the `_operation` suffix from the REST API type name\n * to match the Transaction type discriminants (e.g. \"transfer\").\n */\nfunction normalizeOpType(restType: string): string {\n return restType.replace(/_operation$/, \"\");\n}\n\n/**\n * Check if a value is a NAI asset object (e.g. { nai: \"@@000000021\", amount: \"1000\", precision: 3 }).\n */\nfunction isNaiAsset(v: unknown): v is { nai: string; amount: string; precision: number } {\n return typeof v === \"object\" && v !== null && \"nai\" in v && \"amount\" in v && \"precision\" in v;\n}\n\n/**\n * Convert a NAI asset object to a human-readable string like \"1.000 HIVE\".\n * Returns the value unchanged if it's not a NAI object.\n */\nfunction naiToString(v: unknown): unknown {\n if (!isNaiAsset(v)) return v;\n const parsed = parseAsset(v);\n const symbol = NaiMap[v.nai as keyof typeof NaiMap] ?? \"UNKNOWN\";\n return `${parsed.amount.toFixed(v.precision)} ${symbol}`;\n}\n\n/**\n * Convert all NAI asset objects in an operation's value to human-readable strings\n * so downstream renderers that expect \"1.000 HIVE\" don't crash with object values.\n */\nfunction normalizeOpValue(value: Record): Record {\n const result: Record = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = naiToString(v);\n }\n return result;\n}\n\n/**\n * Get account transaction history with pagination and filtering.\n * Uses the hafah-api REST endpoint for server-side op-type filtering\n * and real pagination metadata.\n *\n * @param username - Account name to get transactions for\n * @param limit - Number of transactions per page\n * @param group - Filter by operation group (transfers, market-orders, etc.)\n */\nexport function getTransactionsInfiniteQueryOptions(\n username?: string,\n limit = 20,\n group: OperationGroup | \"\" = \"\"\n) {\n const operationTypes = group\n ? ACCOUNT_OPERATION_GROUPS[group]\n : ALL_ACCOUNT_OPERATIONS;\n\n return infiniteQueryOptions<\n TxPageRaw,\n Error,\n InfiniteData,\n (string | number)[],\n TxCursor\n >({\n queryKey: QueryKeys.accounts.transactions(username ?? \"\", group, limit),\n initialPageParam: null as TxCursor,\n\n queryFn: async ({ pageParam, signal }: { pageParam: TxCursor; signal?: AbortSignal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"operation-types\": operationTypes.join(\",\"),\n \"page-size\": limit,\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number (decrementing)\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"hafah\",\n \"/accounts/{account-name}/operations\",\n params,\n undefined,\n undefined,\n signal\n )) as HafahResponse;\n\n const entries = response.operations_result.map((entry) => {\n const type = normalizeOpType(entry.op.type);\n const value = normalizeOpValue(entry.op.value);\n return {\n ...value,\n num: deriveNum(entry),\n type,\n timestamp: entry.timestamp,\n trx_id: entry.trx_id,\n } as Transaction;\n });\n\n return {\n entries,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getBotsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.bots(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/public/bots\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bots: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n refetchOnMount: true,\n staleTime: Infinity,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { ReferralItem } from \"../types/referral\";\n\ntype PageParam = { maxId?: number };\n\nexport function getReferralsInfiniteQueryOptions(username: string) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.referrals(username),\n initialPageParam: { maxId: undefined } as PageParam,\n queryFn: async ({ pageParam }: { pageParam: PageParam }) => {\n const { maxId } = pageParam ?? {};\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(`/private-api/referrals/${username}`, baseUrl);\n\n if (maxId !== undefined) {\n url.searchParams.set(\"max_id\", maxId.toString());\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referrals: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n getNextPageParam: (lastPage: ReferralItem[]) => {\n const nextMaxId = lastPage?.[lastPage.length - 1]?.id;\n return typeof nextMaxId === \"number\" ? ({ maxId: nextMaxId } as PageParam) : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ReferralStat } from \"../types/referral\";\n\ninterface ReferralStatsResponse {\n total?: number;\n rewarded?: number;\n}\n\nexport function getReferralsStatsQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.referralsStats(username),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/referrals/${username}/stats`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referral stats: ${response.status}`);\n }\n\n const data = await response.json() as ReferralStatsResponse;\n\n if (!data) {\n throw new Error(\"No Referrals for this user!\");\n }\n\n return {\n total: data.total ?? 0,\n rewarded: data.rewarded ?? 0,\n } as ReferralStat;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendsRow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FriendsPageParam {\n startFollowing: string;\n}\n\ntype FriendsPage = FriendsRow[];\n\n/**\n * Get list of friends (following/followers) with profile information\n *\n * @param following - The account whose friends to get\n * @param mode - \"following\" or \"followers\"\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Number of results per page (default: 100)\n * @param enabled - Whether query is enabled (default: true)\n */\nexport function getFriendsInfiniteQueryOptions(\n following: string,\n mode: \"following\" | \"followers\",\n options?: {\n followType?: string;\n limit?: number;\n enabled?: boolean;\n }\n) {\n const { followType = \"blog\", limit = 100, enabled = true } = options ?? {};\n\n return infiniteQueryOptions<\n FriendsPage,\n Error,\n InfiniteData,\n (string | number)[],\n FriendsPageParam\n >({\n queryKey: QueryKeys.accounts.friends(following, mode, followType, limit),\n initialPageParam: { startFollowing: \"\" } as FriendsPageParam,\n enabled,\n refetchOnMount: true,\n\n queryFn: async ({ pageParam }: { pageParam: FriendsPageParam }) => {\n const { startFollowing } = pageParam;\n\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [following, startFollowing === \"\" ? null : startFollowing, followType, limit])) as Follow[];\n\n const accountNames = response.map((e) =>\n mode === \"following\" ? e.following : e.follower\n );\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n const rows: FriendsPage = (accounts ?? []).map((a) => ({\n name: a.name,\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n }));\n\n return rows;\n },\n\n getNextPageParam: (lastPage: FriendsPage): FriendsPageParam | undefined =>\n lastPage && lastPage.length === limit\n ? { startFollowing: lastPage[lastPage.length - 1].name }\n : undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendSearchResult } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst SEARCH_LIMIT = 30;\n\n/**\n * Search friends (following/followers) by query string\n *\n * @param username - The account whose friends to search\n * @param mode - \"following\" or \"followers\"\n * @param query - Search query string\n */\nexport function getSearchFriendsQueryOptions(\n username: string,\n mode: \"following\" | \"followers\",\n query: string\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.searchFriends(username, mode, query),\n refetchOnMount: false,\n enabled: false, // Manual query via refetch\n queryFn: async (): Promise => {\n if (!query) return [];\n\n const start = query.slice(0, -1);\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [username, start, \"blog\", 1000])) as Follow[];\n\n const accountNames = response\n .map((e) => (mode === \"following\" ? e.following : e.follower))\n .filter((name) => name.toLowerCase().includes(query.toLowerCase()))\n .slice(0, SEARCH_LIMIT);\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n return (\n accounts?.map((a) => ({\n name: a.name,\n full_name: a.metadata.profile?.name || \"\",\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n })) ?? []\n );\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsQueryOptions(limit = 20) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTags(),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags\n .filter((x) => x.name !== \"\")\n .filter((x) => !x.name.startsWith(\"hive-\"))\n .map((x) => x.name)\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length > 0\n ? { afterTag: lastPage[lastPage.length - 1] }\n : undefined,\n staleTime: 60 * 60 * 1000, // 1 hour — tags change slowly\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { isCommunity } from \"@/modules/core/utils\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsWithStatsQueryOptions(limit = 250) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTagsWithStats(limit),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags.filter((tag) => tag.name !== \"\").filter((tag) => !isCommunity(tag.name))\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length ? { afterTag: lastPage[lastPage.length - 1].name } : undefined,\n staleTime: Infinity,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\n\nexport function getFragmentsQueryOptions(username: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.fragments(username),\n queryFn: async () => {\n if (!code) {\n return [];\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return response.json() as Promise;\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getFragmentsInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.fragmentsInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/fragments?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch fragments: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { ConfigManager, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n// TODO: replace any with Entry\nexport function getPromotedPostsQuery(\n type: \"feed\" | \"waves\" = \"feed\"\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.promoted(type),\n queryFn: async () => {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/promoted-entries\", baseUrl);\n if (type === \"waves\") {\n url.searchParams.append(\"short_content\", \"1\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n const data = await response.json();\n return data as T[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry, Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getEntryActiveVotesQueryOptions(entry?: Entry) {\n return queryOptions({\n queryKey: QueryKeys.posts.entryActiveVotes(entry?.author, entry?.permlink),\n queryFn: async () => {\n return callRPC(\"condenser_api.get_active_votes\", [\n entry?.author,\n entry?.permlink,\n ]) as Promise;\n },\n enabled: !!entry,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a specific user's vote on a post\n * Useful when post has >1000 votes to efficiently get one user's vote\n *\n * @param username - The voter's username\n * @param author - The post author\n * @param permlink - The post permlink\n */\nexport function getUserPostVoteQueryOptions(\n username: string | undefined,\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.userPostVote(username!, author!, permlink!),\n queryFn: async () => {\n const result = await callRPC(\"database_api.list_votes\", {\n start: [username, author, permlink],\n limit: 1,\n order: \"by_voter_comment\"\n });\n\n // Return first vote if found, otherwise null\n return (result?.votes?.[0] || null) as Vote | null;\n },\n enabled: !!username && !!author && !!permlink,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.content(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentRepliesQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.contentReplies(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content_replies\", {\n author,\n permlink,\n }) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostHeaderQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.postHeader(author, permlink),\n queryFn: async () => {\n return callRPC(\"bridge.get_post_header\", {\n author,\n permlink,\n }) as Promise;\n },\n initialData: null,\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { Entry } from \"../types\";\n\n/**\n * Filters and censors entries that match DMCA patterns\n * @param entry - Single entry or array of entries to filter\n * @returns Filtered entry/entries with DMCA content censored.\n * Note: Can return null/undefined if input is falsy - callers should guard against this.\n */\nexport function filterDmcaEntry(entry: Entry): Entry | null | undefined;\nexport function filterDmcaEntry(entries: Entry[]): Entry[];\nexport function filterDmcaEntry(entryOrEntries: Entry | Entry[] | null | undefined): Entry | Entry[] | null | undefined {\n if (Array.isArray(entryOrEntries)) {\n // Array elements are non-null Entries, so applyFilter never returns nullish here.\n return entryOrEntries.map((entry) => applyFilter(entry)) as Entry[];\n }\n return applyFilter(entryOrEntries);\n}\n\nfunction applyFilter(entry: Entry | null | undefined): Entry | null | undefined {\n if (!entry) return entry;\n\n const entryPath = `@${entry.author}/${entry.permlink}`;\n const isDmca =\n CONFIG.dmcaPatterns.includes(entryPath) ||\n CONFIG.dmcaPatternRegexes.some((regex) => regex.test(entryPath));\n\n if (isDmca) {\n return {\n ...entry,\n body: \"This post is not available due to a copyright/fraudulent claim.\",\n title: \"\",\n };\n }\n\n return entry;\n}\n","import { callWithQuorum } from \"../../hive-tx\";\nimport { Entry } from \"@/modules/posts/types\";\n\n/**\n * When the primary node returns null for a get_post call,\n * verify by querying multiple random nodes. If any node\n * returns the post, it exists (the first node was lagging).\n *\n * Uses callWithQuorum(quorum=1) which shuffles and queries\n * nodes in batches. Since it shuffles, it's unlikely to hit\n * the same node that just returned null first.\n */\nexport async function verifyPostOnAlternateNode(\n author: string,\n permlink: string,\n observer: string\n): Promise {\n try {\n const response = await callWithQuorum(\"bridge.get_post\", {\n author,\n permlink,\n observer,\n }, 1);\n\n if (\n response &&\n typeof response === \"object\" &&\n (response as Entry).author === author &&\n (response as Entry).permlink === permlink\n ) {\n return response as Entry;\n }\n } catch {\n // All nodes failed or returned null\n }\n\n return null;\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { verifyPostOnAlternateNode } from \"@/modules/bridge/verify-on-alternate-node\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostQueryOptions(\n author: string,\n permlink?: string,\n observer = \"\",\n num?: number\n) {\n const cleanPermlink = permlink?.trim();\n const entryPath = `/@${author}/${cleanPermlink ?? \"\"}`;\n\n return queryOptions({\n queryKey: QueryKeys.posts.entry(entryPath),\n queryFn: async () => {\n if (!cleanPermlink || cleanPermlink === \"undefined\") {\n return null;\n }\n\n // hive-tx tries nodes in order; the first healthy node (index 0) handles this call.\n // If it returns null, verifyPostOnAlternateNode skips index 0 and tries others.\n const response = await callRPC(\"bridge.get_post\", {\n author,\n permlink: cleanPermlink,\n observer,\n });\n\n if (!response) {\n // Primary node returned null — verify on alternate nodes\n // to guard against sync lag returning null for valid posts\n const verified = await verifyPostOnAlternateNode(author, cleanPermlink, observer);\n if (!verified) {\n return null;\n }\n const verifiedEntry = num !== undefined ? { ...verified, num } as Entry : verified as Entry;\n return filterDmcaEntry(verifiedEntry);\n }\n\n const entry = num !== undefined ? { ...response, num } as Entry : response as Entry;\n return filterDmcaEntry(entry);\n },\n enabled:\n !!author &&\n !!permlink &&\n permlink.trim() !== \"\" &&\n permlink.trim() !== \"undefined\",\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { AccountRelationship, Profile } from \"@/modules/accounts/types\";\nimport { Community } from \"@/modules/communities/types/community\";\nimport { Subscription } from \"@/modules/communities/types/subscription\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { filterDmcaEntry } from \"@/modules/posts/utils/filter-dmca-entries\";\n\ntype BridgeParams = Record | unknown[];\n\nexport function bridgeApiCall(endpoint: string, params: BridgeParams, signal?: AbortSignal): Promise {\n return callRPC(`bridge.${endpoint}`, params, undefined, undefined, signal) as Promise;\n}\n\nexport async function resolvePost(\n post: Entry,\n observer: string,\n num?: number,\n signal?: AbortSignal\n): Promise {\n const { json_metadata: json } = post;\n\n if (json?.original_author && json?.original_permlink && json.tags?.[0] === \"cross-post\") {\n try {\n const resp = await getPost(\n json.original_author,\n json.original_permlink,\n observer,\n num,\n signal\n );\n if (resp) {\n return {\n ...post,\n original_entry: resp,\n num,\n };\n }\n return post;\n } catch {\n return post;\n }\n }\n\n return { ...post, num };\n}\n\nasync function resolvePosts(posts: Entry[], observer: string, signal?: AbortSignal): Promise {\n const validatedPosts = posts.map(validateEntry);\n const resolved = await Promise.all(validatedPosts.map((p) => resolvePost(p, observer, undefined, signal)));\n return filterDmcaEntry(resolved) as Entry[];\n}\n\nexport async function getPostsRanked(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_ranked_posts\", {\n sort,\n start_author,\n start_permlink,\n limit,\n tag,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_ranked_posts returned ${typeof resp} instead of an array for sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\nexport async function getAccountPosts(\n sort: string,\n account: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n if (CONFIG.dmcaAccounts.includes(account)) {\n return [];\n }\n\n const resp = await bridgeApiCall(\"get_account_posts\", {\n sort,\n account,\n start_author,\n start_permlink,\n limit,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_account_posts returned ${typeof resp} instead of an array for account=${account}, sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\n/**\n * Validates that an Entry object has required properties with non-null values.\n */\nfunction validateEntry(entry: Entry): Entry {\n const newEntry: Entry = {\n ...entry,\n active_votes: Array.isArray(entry.active_votes) ? [...entry.active_votes] : [],\n beneficiaries: Array.isArray(entry.beneficiaries) ? [...entry.beneficiaries] : [],\n blacklists: Array.isArray(entry.blacklists) ? [...entry.blacklists] : [],\n replies: Array.isArray(entry.replies) ? [...entry.replies] : [],\n stats: entry.stats ? { ...entry.stats } : null,\n };\n\n const requiredStringProps: (keyof Entry)[] = [\n \"author\",\n \"title\",\n \"body\",\n \"created\",\n \"category\",\n \"permlink\",\n \"url\",\n \"updated\",\n ];\n\n for (const prop of requiredStringProps) {\n if (newEntry[prop] == null) {\n (newEntry as any)[prop] = \"\";\n }\n }\n\n if (newEntry.author_reputation == null) {\n newEntry.author_reputation = 0;\n }\n if (newEntry.children == null) {\n newEntry.children = 0;\n }\n if (newEntry.depth == null) {\n newEntry.depth = 0;\n }\n if (newEntry.net_rshares == null) {\n newEntry.net_rshares = 0;\n }\n if (newEntry.payout == null) {\n newEntry.payout = 0;\n }\n if (newEntry.percent_hbd == null) {\n newEntry.percent_hbd = 0;\n }\n\n if (!newEntry.stats) {\n newEntry.stats = {\n flag_weight: 0,\n gray: false,\n hide: false,\n total_votes: 0,\n };\n }\n\n if (newEntry.author_payout_value == null) {\n newEntry.author_payout_value = \"0.000 HBD\";\n }\n if (newEntry.curator_payout_value == null) {\n newEntry.curator_payout_value = \"0.000 HBD\";\n }\n if (newEntry.max_accepted_payout == null) {\n newEntry.max_accepted_payout = \"1000000.000 HBD\";\n }\n if (newEntry.payout_at == null) {\n newEntry.payout_at = \"\";\n }\n if (newEntry.pending_payout_value == null) {\n newEntry.pending_payout_value = \"0.000 HBD\";\n }\n if (newEntry.promoted == null) {\n newEntry.promoted = \"0.000 HBD\";\n }\n\n if (newEntry.is_paidout == null) {\n newEntry.is_paidout = false;\n }\n\n return newEntry;\n}\n\nexport async function getPost(\n author: string = \"\",\n permlink: string = \"\",\n observer: string = \"\",\n num?: number,\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_post\", {\n author,\n permlink,\n observer,\n }, signal);\n\n if (resp) {\n const validatedEntry = validateEntry(resp);\n const post = await resolvePost(validatedEntry, observer, num, signal);\n return filterDmcaEntry(post) as Entry;\n }\n\n return undefined;\n}\n\nexport async function getPostHeader(\n author: string = \"\",\n permlink: string = \"\"\n): Promise {\n const resp = await bridgeApiCall(\"get_post_header\", {\n author,\n permlink,\n });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getDiscussion(\n author: string,\n permlink: string,\n observer?: string\n): Promise | null> {\n const resp = await bridgeApiCall | null>(\"get_discussion\", {\n author,\n permlink,\n observer: observer || author,\n });\n\n if (resp) {\n const validatedResp: Record = {};\n for (const [key, entry] of Object.entries(resp)) {\n validatedResp[key] = validateEntry(entry);\n }\n return validatedResp;\n }\n return resp;\n}\n\nexport async function getCommunity(\n name: string,\n observer: string | undefined = \"\"\n): Promise {\n return bridgeApiCall(\"get_community\", { name, observer });\n}\n\nexport async function getCommunities(\n last: string = \"\",\n limit: number = 100,\n query?: string | null,\n sort: string = \"rank\",\n observer: string = \"\"\n): Promise {\n return bridgeApiCall(\"list_communities\", {\n last,\n limit,\n query,\n sort,\n observer,\n });\n}\n\nexport async function normalizePost(post: unknown): Promise {\n const resp = await bridgeApiCall(\"normalize_post\", { post });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getSubscriptions(account: string): Promise {\n return bridgeApiCall(\"list_all_subscriptions\", { account });\n}\n\nexport async function getSubscribers(community: string): Promise {\n return bridgeApiCall(\"list_subscribers\", { community });\n}\n\nexport async function getRelationshipBetweenAccounts(\n follower: string,\n following: string\n): Promise {\n return bridgeApiCall(\"get_relationship_between_accounts\", [\n follower,\n following,\n ]);\n}\n\nexport async function getProfiles(\n accounts: string[],\n observer?: string\n): Promise {\n return bridgeApiCall(\"get_profiles\", { accounts, observer });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getDiscussion } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport enum SortOrder {\n trending = \"trending\",\n author_reputation = \"author_reputation\",\n votes = \"votes\",\n created = \"created\",\n}\n\nfunction parseAsset(value: string): { amount: number; symbol: string } {\n const match = value.match(/^(\\d+\\.?\\d*)\\s*([A-Z]+)$/);\n if (!match) return { amount: 0, symbol: \"\" };\n return {\n amount: parseFloat(match[1]),\n symbol: match[2],\n };\n}\n\nexport function sortDiscussions(\n entry: Entry,\n discussion: Entry[],\n order: SortOrder\n) {\n const allPayout = (c: Entry) =>\n parseAsset(c.pending_payout_value).amount +\n parseAsset(c.author_payout_value).amount +\n parseAsset(c.curator_payout_value).amount;\n\n const absNegative = (a: Entry) => a.net_rshares < 0;\n const isPinned = (a: Entry) =>\n entry.json_metadata?.pinned_reply === `${a.author}/${a.permlink}`;\n\n const sortOrders = {\n trending: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const _a = allPayout(a);\n const _b = allPayout(b);\n if (_a !== _b) {\n return _b - _a;\n }\n\n return 0;\n },\n author_reputation: (a: Entry, b: Entry) => {\n const keyA = a.author_reputation;\n const keyB = b.author_reputation;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n votes: (a: Entry, b: Entry) => {\n const keyA = a.children;\n const keyB = b.children;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n created: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const keyA = Date.parse(a.created);\n const keyB = Date.parse(b.created);\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n };\n\n const sorted = discussion.sort(sortOrders[order]);\n const pinnedIndex = sorted.findIndex((i) => isPinned(i));\n const pinned = sorted[pinnedIndex];\n if (pinnedIndex >= 0) {\n sorted.splice(pinnedIndex, 1);\n sorted.unshift(pinned);\n }\n return sorted;\n}\n\nexport function getDiscussionsQueryOptions(\n entry: Entry,\n order: SortOrder = SortOrder.created,\n enabled: boolean = true,\n observer?: string\n) {\n // Anonymous readers fall back to CONFIG.defaultObserver rather than the post\n // author. Author-as-observer only helps the minority of authors who curate a\n // mute list; everyone else's comment section came back unfiltered, so the\n // shared moderation account is the better default for logged-out traffic.\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussions(entry?.author, entry?.permlink, order, resolvedObserver),\n queryFn: async () => {\n if (!entry) {\n return [];\n }\n\n const response = await callRPC(\"bridge.get_discussion\", {\n author: entry.author,\n permlink: entry.permlink,\n observer: resolvedObserver,\n });\n\n const results = response\n ? Array.from(Object.values(response as Record))\n : [];\n return filterDmcaEntry(results);\n },\n enabled: enabled && !!entry,\n select: (data: Entry[]) => sortDiscussions(entry, data, order),\n // Preserve optimistic entries during refetch by using structural sharing\n // This ensures newly added comments (is_optimistic: true) aren't wiped out\n // when blockchain hasn't indexed them yet\n structuralSharing: (oldData, newData) => {\n if (!oldData || !newData) return newData;\n\n // Find optimistic entries in old data that aren't in new data yet\n const optimisticEntries = (oldData as Entry[]).filter(\n (entry: Entry) => entry.is_optimistic === true\n );\n\n const fetchedPermlinks = new Set(\n (newData as Entry[]).map((e: Entry) => `${e.author}/${e.permlink}`)\n );\n\n const missingOptimistic = optimisticEntries.filter(\n (opt: Entry) => !fetchedPermlinks.has(`${opt.author}/${opt.permlink}`)\n );\n\n // If there are optimistic entries missing from new data, preserve them\n if (missingOptimistic.length > 0) {\n return [...(newData as Entry[]), ...missingOptimistic];\n }\n\n return newData;\n },\n });\n}\n\nexport function getDiscussionQueryOptions(\n author: string,\n permlink: string,\n observer?: string,\n enabled = true\n) {\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussion(author, permlink, resolvedObserver),\n enabled: enabled && !!author && !!permlink,\n queryFn: async () =>\n getDiscussion(author, permlink, resolvedObserver) as Promise | null>,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getAccountPosts } from \"@/modules/bridge\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n hasNextPage: boolean;\n};\ntype Page = Entry[];\n\nexport function getAccountPostsInfiniteQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return infiniteQueryOptions<\n Page,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.accountPosts(username ?? \"\", filter, limit, observer),\n enabled: !!username && enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n hasNextPage: true,\n } as PageParam,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!pageParam?.hasNextPage || !username) return [];\n\n const response = await getAccountPosts(\n filter,\n username,\n pageParam.author ?? \"\",\n pageParam.permlink ?? \"\",\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n\n getNextPageParam: (lastPage: Page): PageParam | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n // Only consider there's a next page if we got a full page of results\n // A partial page means we've reached the end\n const hasNextPage = (lastPage?.length ?? 0) === limit;\n\n if (!hasNextPage) {\n return undefined;\n }\n\n return {\n author: last?.author,\n permlink: last?.permlink,\n hasNextPage,\n };\n },\n });\n}\n\nexport function getAccountPostsQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.accountPostsPage(username ?? \"\", filter, start_author, start_permlink, limit, observer),\n enabled: !!username && enabled,\n queryFn: async ({ signal } = {} as any) => {\n if (!username) {\n return [];\n }\n\n const response = await getAccountPosts(\n filter,\n username,\n start_author,\n start_permlink,\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getPostsRanked } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n};\n\ninterface GetPostsRankedOptions {\n resolvePosts?: boolean;\n}\n\n/**\n * `select` runs on every render, and React Query only reuses its previous\n * result when both the data and the select function are unchanged. These\n * options are rebuilt on each render, so an inline arrow would be a new\n * function every time and every page would be re-sorted on every render.\n * One stable function per sort keeps that memoization working.\n */\nconst displaySelects = new Map<\n string,\n (data: InfiniteData) => InfiniteData\n>();\n\nfunction displaySelect(sort: string) {\n let select = displaySelects.get(sort);\n if (!select) {\n select = (data) => ({\n ...data,\n pages: data.pages.map((page) => orderForDisplay(page, sort)),\n });\n displaySelects.set(sort, select);\n }\n return select;\n}\n\n/**\n * Display order for one page.\n *\n * Pinned entries are captured before the created-date sort: the bridge surfaces\n * them at the head of the response in the community moderators' chosen order,\n * which the sort would scatter by age. Every pin is kept, since an earlier\n * post-sort find() kept one and silently dropped the rest, so multi-pin\n * communities never displayed their other pinned posts. Pins only occur on the\n * first page, cursor pages return none, so this is a no-op elsewhere.\n *\n * Applied in `select` rather than in the query function so it cannot reach the\n * pagination cursor.\n */\nfunction orderForDisplay(page: Entry[], sort: string): Entry[] {\n const pinned = page.filter((entry) => entry.stats?.is_pinned);\n const rest = page.filter((entry) => !entry.stats?.is_pinned);\n\n if (sort === \"hot\") {\n return [...pinned, ...rest];\n }\n\n const byCreated = [...rest].sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n return [...pinned, ...byCreated];\n}\n\nexport function getPostsRankedInfiniteQueryOptions(\n sort: string,\n tag: string,\n limit = 20,\n observer = \"\",\n enabled = true,\n _options: GetPostsRankedOptions = {}\n) {\n return infiniteQueryOptions<\n Entry[],\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.postsRanked(sort, tag, limit, observer),\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await callRPC(\"bridge.get_ranked_posts\", {\n sort,\n start_author: pageParam.author,\n start_permlink: pageParam.permlink,\n limit,\n tag: sanitizedTag,\n observer,\n }, undefined, undefined, signal);\n\n if (response === null || response === undefined) {\n return [];\n }\n\n if (!Array.isArray(response)) {\n throw new Error(\n `[SDK] get_ranked_posts returned ${typeof response} for sort=${sort}`\n );\n }\n\n // Kept in the bridge's own order. getNextPageParam takes the cursor from\n // the last entry of the page this returns, and the bridge continues from\n // that entry in ITS ranking, so reordering here made the next request\n // start from the middle of the previous ranked page: for trending, payout\n // and muted the last entry by date is not the last entry by rank, and\n // scrolling repeated some posts and skipped others. Display order is\n // applied in `select`, which React Query runs after pagination.\n return filterDmcaEntry(response as Entry[]);\n },\n select: displaySelect(sort),\n enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n } as PageParam,\n getNextPageParam: (lastPage: Entry[]) => {\n // React Query reads \"there is no next page\" from undefined alone, so\n // returning an object here always left it true. An infinite list\n // then keeps calling fetchNextPage at the end of the feed, appending an\n // empty page each time: the query state churns and the cache grows for as\n // long as the reader sits at the bottom.\n const last = lastPage?.[lastPage.length - 1];\n if (!last) {\n return undefined;\n }\n\n return { author: last.author, permlink: last.permlink };\n },\n });\n}\n\nexport function getPostsRankedQueryOptions(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.postsRankedPage(sort, start_author, start_permlink, limit, tag, observer),\n enabled,\n queryFn: async ({ signal } = {} as any) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await getPostsRanked(\n sort,\n start_author,\n start_permlink,\n limit,\n sanitizedTag,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface BlogEntry {\n author: string;\n permlink: string;\n blog: string;\n reblog_on: string;\n reblogged_on: string;\n entry_id: number;\n}\n\nexport interface Reblog {\n author: string;\n permlink: string;\n}\n\nexport function getReblogsQueryOptions(\n username?: string,\n activeUsername?: string,\n limit = 200\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.reblogs(username ?? \"\", limit),\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.get_blog_entries\", [\n username ?? activeUsername,\n 0,\n limit,\n ])) as BlogEntry[];\n\n return response\n .filter(\n (i) =>\n i.author !== activeUsername &&\n !i.reblogged_on.startsWith(\"1970-\")\n )\n .map((i) => ({ author: i.author, permlink: i.permlink })) as Reblog[];\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of usernames who reblogged a specific post\n */\nexport function getRebloggedByQueryOptions(author?: string, permlink?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.rebloggedBy(author ?? \"\", permlink ?? \"\"),\n queryFn: async () => {\n if (!author || !permlink) {\n return [];\n }\n\n const response = (await callRPC(\"condenser_api.get_reblogged_by\", [author, permlink])) as string[];\n\n return Array.isArray(response) ? response : [];\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Schedule } from \"../types/schedule\";\n\nexport function getSchedulesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.schedules(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getSchedulesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.schedulesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/schedules?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Draft } from \"../types/draft\";\n\nexport function getDraftsQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.drafts(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getDraftsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.draftsInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/drafts?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n const json = await response.json();\n // Normalize response for backwards compatibility\n // If backend doesn't support wrapped format yet, it returns Draft[]\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { UserImage } from \"../types/user-image\";\n\nasync function fetchUserImages(code: string | undefined): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nexport function getImagesQueryOptions(username?: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.images(username),\n queryFn: async () => {\n if (!username || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getGalleryImagesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.galleryImages(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getImagesInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.imagesInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/images?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nexport function getCommentHistoryQueryOptions(author: string, permlink: string, onlyMeta = false) {\n return queryOptions({\n queryKey: QueryKeys.posts.commentHistory(author, permlink, onlyMeta),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n onlyMeta: onlyMeta ? \"1\" : \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nfunction makeEntryPath(author: string, permlink: string): string {\n const cleanAuthor = author?.trim();\n const cleanPermlink = permlink?.trim();\n\n if (!cleanAuthor || !cleanPermlink) {\n throw new Error(\"Invalid entry path: author and permlink are required\");\n }\n\n // Normalize by removing any leading @ or / characters\n const normalizedAuthor = cleanAuthor.replace(/^@+/, \"\");\n const normalizedPermlink = cleanPermlink.replace(/^\\/+/, \"\");\n\n if (!normalizedAuthor || !normalizedPermlink) {\n throw new Error(\"Invalid entry path: author and permlink cannot be empty after normalization\");\n }\n\n return `@${normalizedAuthor}/${normalizedPermlink}`;\n}\n\nexport interface DeletedEntry {\n body: string;\n title: string;\n tags: string[];\n}\n\nexport function getDeletedEntryQueryOptions(author: string, permlink: string) {\n const cleanPermlink = permlink?.trim();\n const cleanAuthor = author?.trim();\n const isValid =\n !!cleanAuthor && !!cleanPermlink && cleanPermlink !== \"undefined\";\n\n const entryPath = isValid ? makeEntryPath(cleanAuthor, cleanPermlink) : \"\";\n\n return queryOptions({\n queryKey: QueryKeys.posts.deletedEntry(entryPath),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink: cleanPermlink || \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n select: (history): DeletedEntry | null => {\n if (!history?.list?.[0]) {\n return null;\n }\n const { body, title, tags } = history.list[0];\n return {\n body,\n title,\n tags,\n };\n },\n enabled: isValid,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { PostTipsResponse } from \"../types/post-tip\";\n\n/**\n * Tips for a single post.\n *\n * Addressed as a GET so the response can be cached. This was a POST, which no\n * cache may store, so the same tip totals were refetched on every mount. The\n * endpoint keys off nothing but author and permlink and needs no auth, and now\n * serves a Cache-Control, so a repeat read can come from the browser instead of\n * the network.\n *\n * `staleTime` is kept at or below the endpoint's own cache window rather than\n * extending it. react-query cannot see how old a response already was when\n * `fetch` served it from the browser cache, so it restarts its window from zero\n * on a body that may already be near expiry; worst-case staleness is the two\n * windows added together.\n */\nexport function getPostTipsQueryOptions(author: string, permlink: string, isEnabled = true) {\n return queryOptions({\n queryKey: QueryKeys.posts.tips(author, permlink),\n queryFn: async () => {\n const path = `/private-api/post-tips/${encodeURIComponent(author)}/${encodeURIComponent(permlink)}`;\n const response = await fetch(CONFIG.privateApiHost + path, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post tips: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink && isEnabled,\n staleTime: 60 * 1000,\n });\n}\n","import { Entry, WaveEntry } from \"../types\";\nimport { getDiscussionsQueryOptions, SortOrder } from \"../queries/get-discussions-query-options\";\nimport { CONFIG } from \"@/modules/core\";\n\ntype EntryWithPostId = Entry & { post_id: number };\n\nfunction normalizeContainer(entry: EntryWithPostId, host: string): WaveEntry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds send the publish time as `timestamp`, not `created`.\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n host\n } as WaveEntry;\n}\n\nfunction normalizeParent(entry: EntryWithPostId): Entry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id\n } as Entry;\n}\n\nexport function normalizeWaveEntryFromApi(\n entry:\n | (Entry & { post_id: number; container?: EntryWithPostId | null; parent?: EntryWithPostId | null })\n | null\n | undefined,\n host: string\n): WaveEntry | null {\n if (!entry) {\n return null;\n }\n\n const containerSource = entry.container ?? entry;\n const container = normalizeContainer(containerSource, host);\n\n const parent = entry.parent ? normalizeParent(entry.parent) : undefined;\n\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds (following / tag / account) send the publish\n // time as `timestamp`, not `created`; map it so the relative time renders on\n // every card (the For You feed already carries a real `created` from Hive RPC).\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n // The private-api waves feeds omit max_accepted_payout; default it (and the\n // payout strings) to the Hive shape so payout-rendering consumers run their\n // pending+author+curator summation instead of treating the value as missing.\n max_accepted_payout: entry.max_accepted_payout || \"1000000.000 HBD\",\n pending_payout_value: entry.pending_payout_value || \"0.000 HBD\",\n author_payout_value: entry.author_payout_value || \"0.000 HBD\",\n curator_payout_value: entry.curator_payout_value || \"0.000 HBD\",\n host,\n container,\n parent\n } as WaveEntry;\n}\n\nexport function toEntryArray(x: unknown): Entry[] {\n return Array.isArray(x) ? (x as Entry[]) : [];\n}\n\nexport async function getVisibleFirstLevelThreadItems(\n container: WaveEntry\n): Promise {\n const queryOptions = getDiscussionsQueryOptions(container, SortOrder.created, true);\n const discussionItemsRaw = await CONFIG.queryClient.fetchQuery(queryOptions);\n const discussionItems = toEntryArray(discussionItemsRaw);\n\n if (discussionItems.length <= 1) {\n return [];\n }\n\n const firstLevelItems = discussionItems.filter(\n ({ parent_author, parent_permlink }) =>\n parent_author === container.author && parent_permlink === container.permlink\n );\n\n if (firstLevelItems.length === 0) {\n return [];\n }\n\n const visibleItems = firstLevelItems.filter((item) => !item.stats?.gray);\n\n return visibleItems;\n}\n\nexport function mapThreadItemsToWaveEntries(\n items: Entry[],\n container: WaveEntry,\n host: string\n): WaveEntry[] {\n if (items.length === 0) {\n return [];\n }\n\n return items\n .map((item) => {\n const parent = items.find(\n (i) =>\n i.author === item.parent_author &&\n i.permlink === item.parent_permlink &&\n i.author !== host\n );\n\n return {\n ...item,\n id: item.post_id,\n host,\n container,\n parent\n } as WaveEntry;\n })\n .filter((entry) => entry.container.post_id !== entry.post_id)\n .sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\ntype WavesFeedRow = Entry & {\n post_id: number;\n // The wave's container account (e.g. ecency.waves, leothreads), so a mixed\n // cross-container feed can be rendered and acted on per item.\n host?: string;\n // Opaque keyset cursor pointing just past this row.\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type WavesFeedEntry = WaveEntry & { _cursor?: string };\n\nexport interface WavesFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only waves carrying this tag (across all containers). */\n tag?: string;\n /** Only waves from accounts this user follows (across all containers). */\n following?: string;\n /** Only this author's waves (across all containers); the per-author feed. */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedFeedParams {\n containers: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: WavesFeedParams): NormalizedFeedParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n following: params.following?.trim().toLowerCase() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchWavesFeedPage(\n { containers, tag, following, author, observer, limit }: NormalizedFeedParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/feed\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (following) {\n url.searchParams.set(\"following\", following);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves feed: ${response.status}`);\n }\n\n const data = (await response.json()) as WavesFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return { ...entry, _cursor: row._cursor } as WavesFeedEntry;\n })\n .filter((entry): entry is WavesFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container waves feed (the chronological \"For You\" stream, and\n * the Following / Tag feeds via filters).\n *\n * A single esync-backed call returns the newest waves across every indexed\n * container, already merged and time-ordered, with keyset (cursor) pagination,\n * replacing the per-container chain-RPC scan. The optional `tag` / `following`\n * filters narrow the same stream without changing the cursor.\n */\nexport function getWavesFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchWavesFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination. A short page (fewer than `limit` rows) is the\n // end-of-feed signal; on a full page the server always returns the next\n // cursor on the last row. Stopping (rather than looping) is the safe\n // fallback if that cursor were ever absent.\n getNextPageParam: (lastPage: WavesFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n\n/**\n * Page-one of the combined feed as a plain (non-infinite) query under a distinct\n * key, for the \"new waves\" poll. Separate from {@link getWavesFeedQueryOptions}\n * so refreshing it never truncates the infinite feed's loaded pages.\n */\nexport function getWavesLatestFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return queryOptions({\n queryKey: [\n ...QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n \"latest\"\n ],\n staleTime: 0,\n queryFn: ({ signal }) => fetchWavesFeedPage(normalized, undefined, signal)\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\n/** The 3Speak video a short embeds, as returned by esync /api/waves/shorts. */\nexport interface ShortVideo {\n platform: string;\n author: string;\n permlink: string;\n embed_url: string;\n thumbnail_url: string | null;\n duration_secs: number | null;\n}\n\ntype ShortsFeedRow = Entry & {\n post_id: number;\n host?: string;\n video?: ShortVideo;\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type ShortsFeedEntry = WaveEntry & {\n /** The embedded 3Speak video reference for the reels player. */\n video?: ShortVideo;\n _cursor?: string;\n};\n\nexport interface ShortsFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only shorts carrying this tag (across all containers). */\n tag?: string;\n /** Only this author's shorts (across all containers). */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedShortsParams {\n containers: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: ShortsFeedParams): NormalizedShortsParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchShortsFeedPage(\n { containers, tag, author, observer, limit }: NormalizedShortsParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/shorts\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch shorts feed: ${response.status}`);\n }\n\n const data = (await response.json()) as ShortsFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return {\n ...entry,\n // A lightweight feed row may omit active_votes; EntryVoteBtn (which uses\n // this entry as React Query initialData) calls .some() on it, so default\n // to an empty array to avoid a crash before the full post query loads.\n active_votes: entry.active_votes ?? [],\n video: row.video,\n _cursor: row._cursor\n } as ShortsFeedEntry;\n })\n .filter((entry): entry is ShortsFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container shorts (reels) feed: waves that embed a 3Speak video.\n *\n * Backed by esync /api/waves/shorts (via /private-api/waves/shorts). Same shape,\n * keyset pagination and filters as {@link getWavesFeedQueryOptions}, plus a\n * `video` block per item for the vertical reels player. There is no `following`\n * filter in v1.\n */\nexport function getShortsFeedQueryOptions(params: ShortsFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.shortsFeed({ containers, tag, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchShortsFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination: a short page (fewer than `limit` rows) ends the feed;\n // on a full page the server returns the next cursor on the last row.\n getNextPageParam: (lastPage: ShortsFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport {\n getVisibleFirstLevelThreadItems,\n mapThreadItemsToWaveEntries\n} from \"../utils/waves-helpers\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst THREAD_CONTAINER_BATCH_SIZE = 5;\nconst MAX_CONTAINERS_TO_SCAN = 50;\n\ninterface ThreadsResult {\n entries: WaveEntry[];\n}\n\nasync function getThreads(\n host: string,\n pageParam?: WaveEntry\n): Promise {\n let startAuthor = pageParam?.author;\n let startPermlink = pageParam?.permlink;\n let scannedContainers = 0;\n let skipContainerId = pageParam?.post_id;\n\n while (scannedContainers < MAX_CONTAINERS_TO_SCAN) {\n interface AccountPostsParams {\n sort: string;\n account: string;\n limit: number;\n start_author?: string;\n start_permlink?: string;\n }\n\n const rpcParams: AccountPostsParams = {\n sort: \"posts\", // ProfileFilter.posts\n account: host,\n limit: THREAD_CONTAINER_BATCH_SIZE,\n ...(startAuthor ? { start_author: startAuthor } : {}),\n ...(startPermlink ? { start_permlink: startPermlink } : {})\n };\n\n let containers: WaveEntry[];\n try {\n containers = (await callRPC(\"bridge.get_account_posts\", rpcParams)) as WaveEntry[];\n } catch (err) {\n console.error(\"[SDK] getThreads get_account_posts error:\", err);\n return null;\n }\n\n if (!containers || containers.length === 0) {\n return null;\n }\n\n const normalizedContainers = containers.map((container) => {\n container.id = container.post_id;\n container.host = host;\n return container;\n });\n\n for (const container of normalizedContainers) {\n if (skipContainerId && container.post_id === skipContainerId) {\n skipContainerId = undefined;\n continue;\n }\n\n scannedContainers += 1;\n\n if (container.stats?.gray) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n let visibleItems: Entry[];\n try {\n visibleItems = await getVisibleFirstLevelThreadItems(container);\n } catch (err) {\n // A transient bridge.get_discussion failure (RPC timeout, node error, or\n // an oversized response on a large late-day container) must not collapse\n // the whole feed. Treat this container as temporarily unavailable and scan\n // the next one — mirroring the empty-container handling below and the\n // get_account_posts guard above. The query's refetch interval retries it.\n console.error(\"[SDK] getThreads get_discussion error:\", err);\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n if (visibleItems.length === 0) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n return {\n entries: mapThreadItemsToWaveEntries(visibleItems, container, host)\n };\n }\n\n const lastContainer = normalizedContainers[normalizedContainers.length - 1];\n\n if (!lastContainer) {\n return null;\n }\n\n startAuthor = lastContainer.author;\n startPermlink = lastContainer.permlink;\n }\n\n return null;\n}\n\n// Page = array of WaveEntry; Cursor = WaveEntry (container) or undefined\ntype WavesPage = WaveEntry[];\ntype WavesCursor = WaveEntry | undefined;\n\nexport function getWavesByHostQueryOptions(host: string) {\n return infiniteQueryOptions<\n WavesPage,\n Error,\n InfiniteData,\n string[],\n WavesCursor\n >({\n queryKey: QueryKeys.posts.wavesByHost(host),\n initialPageParam: undefined as WavesCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WavesCursor }) => {\n const result = await getThreads(host, pageParam);\n if (!result) return []; // no items to show for this page\n\n return result.entries;\n },\n\n getNextPageParam: (lastPage: WavesPage): WavesCursor => lastPage?.[0]?.container,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesTagEntryResponse = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nconst DEFAULT_TAG_FEED_LIMIT = 40;\n\nexport function getWavesByTagQueryOptions(host: string, tag: string, limit = DEFAULT_TAG_FEED_LIMIT) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByTag(host, tag),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/tags\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"tag\", tag);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves by tag: ${response.status}`);\n }\n\n const data = await response.json() as WavesTagEntryResponse[];\n\n const result = data\n .slice(0, limit)\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n return result.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves by tag\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesFollowingEntry = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport function getWavesFollowingQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFollowing(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/following\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves following feed: ${response.status}`);\n }\n\n const data = await response.json() as WavesFollowingEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves following feed\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingTag } from \"../types\";\n\ninterface WavesTrendingTagResponse {\n tag: string;\n posts: number;\n}\n\nexport function getWavesTrendingTagsQueryOptions(host?: string, hours = 24) {\n // Omit the container for combined trending tags across all containers.\n const container = host?.trim() || undefined;\n\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingTags(container ?? \"\", hours),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/tags\", baseUrl);\n if (container) {\n url.searchParams.set(\"container\", container);\n }\n url.searchParams.set(\"hours\", hours.toString());\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending tags: ${response.status}`);\n }\n\n const data = await response.json() as WavesTrendingTagResponse[];\n\n return data.map(({ tag, posts }) => ({ tag, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending tags\", error);\n return [];\n }\n }\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ninterface WavesAccountEntry extends Entry {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n}\n\nexport function getWavesByAccountQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByAccount(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/account\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves for account: ${response.status}`);\n }\n\n const data = await response.json() as WavesAccountEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves for account\", error);\n throw error;\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingAuthor } from \"../types\";\n\nexport function getWavesTrendingAuthorsQueryOptions(host: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingAuthors(host),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/authors\", baseUrl);\n url.searchParams.set(\"container\", host);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending authors: ${response.status}`);\n }\n\n const data = await response.json() as WaveTrendingAuthor[];\n\n return data.map(({ author, posts }) => ({ author, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending authors\", error);\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"../types\";\nimport { normalizePost } from \"@/modules/bridge\";\n\nexport function getNormalizePostQueryOptions(\n post: { author?: string; permlink?: string } | undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.normalize(post?.author ?? \"\", post?.permlink ?? \"\"),\n enabled: enabled && !!post,\n queryFn: async () => normalizePost(post) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core/config\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { getPostQueryOptions } from \"@/modules/posts/queries\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ninterface VoteOperationDetails {\n voter: string;\n author: string;\n permlink: string;\n weight: number;\n}\n\ninterface AccountVoteHistoryItem {\n timestamp: string;\n op: [string, VoteOperationDetails];\n}\n\ntype AccountVoteHistoryRecord = [number, AccountVoteHistoryItem];\n\ninterface VoteHistoryResult extends VoteOperationDetails {\n num: number;\n timestamp: string;\n}\n\nexport interface VoteHistoryPageParam {\n start: number;\n}\n\nexport interface VoteHistoryPage {\n lastDate: number;\n lastItemFetched: number;\n entries: Entry[];\n}\n\nfunction isEntry(x: unknown): x is Entry {\n return (\n !!x &&\n typeof x === \"object\" &&\n \"author\" in x &&\n \"permlink\" in x &&\n \"active_votes\" in x\n );\n}\n\n/**\n * Calculate days since a date\n */\nfunction getDays(createdDate: string): number {\n const past = new Date(createdDate);\n const now = new Date();\n const diffMs = now.getTime() - past.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Get account vote history with entries\n *\n * @param username - Account name to get vote history for\n * @param limit - Number of history items per page (default: 20)\n * @param filters - Additional filters to pass to get_account_history\n * @param dayLimit - Only include votes from last N days (default: 7)\n */\nexport function getAccountVoteHistoryInfiniteQueryOptions(\n username: string,\n options?: {\n limit?: number;\n filters?: F[];\n dayLimit?: number;\n }\n) {\n const { limit = 20, filters = [], dayLimit = 7.0 } = options ?? {};\n\n return infiniteQueryOptions<\n VoteHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n VoteHistoryPageParam\n >({\n queryKey: QueryKeys.accounts.voteHistory(username, limit),\n initialPageParam: { start: -1 },\n\n queryFn: async ({ pageParam }: { pageParam: VoteHistoryPageParam }) => {\n const { start } = pageParam;\n\n const response = (await callRPC(\"condenser_api.get_account_history\", [username, start, limit, ...filters])) as AccountVoteHistoryRecord[];\n\n const mappedResults: VoteHistoryResult[] = response.map(([num, historyObj]) => ({\n ...historyObj.op[1],\n num,\n timestamp: historyObj.timestamp,\n }));\n\n const result = mappedResults.filter(\n (filtered) =>\n filtered.voter === username &&\n filtered.weight !== 0 &&\n getDays(filtered.timestamp) <= dayLimit\n );\n\n const entries: Entry[] = [];\n for (const obj of result) {\n const post = await CONFIG.queryClient.fetchQuery(\n getPostQueryOptions(obj.author, obj.permlink)\n );\n if (isEntry(post)) entries.push(post);\n }\n\n const [firstHistory] = response;\n\n return {\n lastDate: firstHistory ? getDays(firstHistory[1].timestamp) : 0,\n lastItemFetched: firstHistory ? firstHistory[0] : start,\n entries,\n };\n },\n\n getNextPageParam: (lastPage: VoteHistoryPage): VoteHistoryPageParam => ({\n start: lastPage.lastItemFetched,\n }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Profile } from \"../types\";\nimport { getProfiles } from \"@/modules/bridge\";\n\nexport function getProfilesQueryOptions(\n accounts: string[],\n observer?: string,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.profiles(accounts, observer ?? \"\"),\n enabled: enabled && accounts.length > 0,\n queryFn: async () => getProfiles(accounts, observer) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type {\n BalanceCoinType,\n BalanceHistoryEntry,\n BalanceHistoryResponse,\n} from \"../types\";\n\ninterface BalanceHistoryPage {\n entries: BalanceHistoryEntry[];\n currentPage: number;\n}\n\n/**\n * Cursor for balance history pagination.\n * null = first request (returns the newest page).\n * number = specific page to fetch (decrementing for older data).\n */\ntype BalanceHistoryCursor = number | null;\n\n/**\n * Get balance history for an account with pagination, newest first.\n * Uses the balance-api REST endpoint with direction=desc.\n *\n * Pagination: first call omits `page` to get the newest data.\n * The response includes `total_pages` so we know the current page number.\n * Subsequent calls decrement the page number to load older data.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param pageSize - Number of entries per page\n */\nexport function getBalanceHistoryInfiniteQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n pageSize = 200\n) {\n return infiniteQueryOptions<\n BalanceHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n BalanceHistoryCursor\n >({\n queryKey: QueryKeys.wallet.balanceHistory(\n username ?? \"\",\n coinType,\n pageSize\n ),\n initialPageParam: null as BalanceHistoryCursor,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"coin-type\": coinType,\n \"page-size\": pageSize,\n direction: \"desc\",\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"balance\",\n \"/accounts/{account-name}/balance-history\",\n params,\n undefined,\n undefined,\n signal\n )) as BalanceHistoryResponse;\n\n return {\n entries: response.operations_result,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n // Decrement page to go further back in time\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type { AggregatedBalanceEntry, BalanceCoinType } from \"../types\";\n\nexport type BalanceAggregationGranularity = \"yearly\" | \"monthly\" | \"daily\";\n\n/**\n * Get aggregated balance history for an account.\n * Uses the balance-api REST endpoint - enables yearly/monthly/daily summary\n * widgets that are impossible via RPC.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param granularity - yearly (default), monthly, or daily\n */\nexport function getAggregatedBalanceQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n granularity: BalanceAggregationGranularity = \"yearly\"\n) {\n return queryOptions({\n queryKey: QueryKeys.wallet.aggregatedHistory(\n username ?? \"\",\n coinType,\n granularity\n ),\n\n queryFn: async () => {\n if (!username) {\n return [];\n }\n\n return (await callREST(\n \"balance\",\n \"/accounts/{account-name}/aggregated-history\",\n {\n \"account-name\": username,\n \"coin-type\": coinType,\n granularity,\n }\n )) as AggregatedBalanceEntry[];\n },\n\n enabled: !!username,\n staleTime: 60_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport interface ProMembersResponse {\n /** Usernames of active Ecency Pro members. */\n members: string[];\n count: number;\n}\n\n/**\n * Public, cached roster of Ecency Pro members. Backed by a lightweight private-api\n * endpoint (no auth) so any surface can decorate a username with a Pro badge without\n * a per-user request.\n *\n * `staleTime` is deliberately shorter than the endpoint's own cache window and is\n * NOT raised to match it. react-query has no idea how old a response already was\n * when `fetch` served it from the browser cache: it treats a nine-minute-old\n * cached body as freshly fetched and starts its own window from zero. Worst-case\n * staleness is therefore the endpoint's window plus this one, so raising this to\n * match the server would roughly double it rather than align it.\n */\nexport function getProMembersQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.proMembers(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/pro-members\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch pro members: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Lowercased set of member usernames for O(1), case-insensitive membership checks. */\nexport function proMembersSet(members?: string[]): Set {\n return new Set((members ?? []).map((m) => m.toLowerCase()));\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { AccountProfile, FullAccount } from \"../types\";\nimport {\n buildPostingJsonMetadata,\n buildProfileMetadata,\n extractAccountProfile,\n pickRicherMetadataSnapshot,\n} from \"../utils/profile-metadata\";\n\ninterface Payload {\n profile: Partial;\n tokens: AccountProfile[\"tokens\"];\n}\n\n/**\n * React Query mutation hook for updating account profile metadata.\n *\n * This mutation broadcasts an account_update2 operation to update the user's\n * profile information (name, about, location, avatar, cover image, etc.).\n *\n * @param username - The username to update (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Profile Fields:**\n * - name: Display name\n * - about: Bio/description\n * - location: Location\n * - website: Website URL\n * - profile_image: Avatar URL\n * - cover_image: Cover/banner URL\n * - tokens: Social tokens (Twitter, Facebook, etc.)\n * - version: Profile metadata version (auto-set to 2)\n *\n * **Authentication:**\n * - Uses posting authority (account_update2 operation)\n * - Supports all auth methods via platform adapter\n *\n * **Post-Broadcast Actions:**\n * - Optimistically updates account cache with new profile data\n * - Invalidates account cache to refetch from blockchain\n *\n * @example\n * ```typescript\n * const updateProfile = useAccountUpdate(username, {\n * adapter: myAdapter,\n * });\n *\n * // Update profile\n * updateProfile.mutate({\n * profile: {\n * name: \"John Doe\",\n * about: \"Hive enthusiast\",\n * profile_image: \"https://...\",\n * }\n * });\n * ```\n */\nexport function useAccountUpdate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useBroadcastMutation(\n [\"accounts\", \"update\"],\n username,\n (payload: Partial) => {\n // Prefer the freshest cached snapshot. onMutate has just refetched the\n // account from chain, so this usually reflects the current on-chain\n // profile rather than a possibly stale/unloaded render-time value. If\n // the cache instead holds a metadata-poorer row than the render-time\n // snapshot (e.g. a node served a stripped account row), the richer\n // snapshot wins — a partial update must never shrink the profile while\n // any snapshot still knows the full one.\n const account = pickRicherMetadataSnapshot(\n queryClient.getQueryData(\n getAccountFullQueryOptions(username).queryKey\n ),\n data\n );\n\n if (!account) {\n throw new Error(\"[SDK][Accounts] – cannot update not existing account\");\n }\n\n return [\n [\n \"account_update2\",\n {\n account: username!,\n json_metadata: \"\",\n extensions: [] as [],\n // Read-modify-write the FULL on-chain metadata: deep-merge the\n // profile and preserve any non-`profile` top-level keys, so a\n // partial update never wipes unrelated fields.\n posting_json_metadata: buildPostingJsonMetadata({\n existingPostingJsonMetadata: account.posting_json_metadata,\n profile: payload.profile,\n tokens: payload.tokens,\n }),\n },\n ],\n ];\n },\n async (_data: unknown, variables: Partial) => {\n // Optimistic cache update\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n const obj = JSON.parse(JSON.stringify(data)) as FullAccount;\n obj.profile = buildProfileMetadata({\n existingProfile: extractAccountProfile(data),\n profile: variables.profile,\n tokens: variables.tokens,\n });\n\n return obj;\n }\n );\n\n // Invalidate cache to refetch from blockchain\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username)\n ]);\n },\n auth,\n undefined,\n {\n broadcastMode,\n // Before merging, force a fresh on-chain read so a stale or unloaded\n // cached snapshot cannot cause a partial update (e.g. pinning a post,\n // which sets only `pinned`) to overwrite the existing profile with a\n // near-empty object. Best-effort: if the refetch fails, the op builder\n // falls back to the cached snapshot.\n onMutate: async () => {\n if (!username) {\n return;\n }\n try {\n await queryClient.fetchQuery({\n ...getAccountFullQueryOptions(username),\n staleTime: 0,\n });\n } catch {\n // Ignore – fall back to whatever is already cached.\n }\n },\n }\n );\n}\n","import { broadcastJson, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getRelationshipBetweenAccountsQueryOptions, getAccountFullQueryOptions } from \"../queries\";\nimport { AccountRelationship } from \"../types\";\n\ntype Kind = \"toggle-ignore\" | \"toggle-follow\";\n\nexport function useAccountRelationsUpdate(\n reference: string | undefined,\n target: string | undefined,\n auth: AuthContext | undefined,\n onSuccess: (data: Partial | undefined) => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"relation\", \"update\", reference, target],\n mutationFn: async (kind: Kind) => {\n const relationsQuery = getRelationshipBetweenAccountsQueryOptions(\n reference!,\n target!\n );\n await getQueryClient().prefetchQuery(relationsQuery);\n const actualRelation = getQueryClient().getQueryData(\n relationsQuery.queryKey\n );\n\n await broadcastJson(\n reference,\n \"follow\",\n [\n \"follow\",\n {\n follower: reference,\n following: target,\n what: [\n ...(kind === \"toggle-ignore\" && !actualRelation?.ignores\n ? [\"ignore\"]\n : []),\n ...(kind === \"toggle-follow\" && !actualRelation?.follows\n ? [\"blog\"]\n : []),\n ],\n },\n ],\n auth\n );\n\n return {\n ...actualRelation,\n ignores:\n kind === \"toggle-ignore\"\n ? !actualRelation?.ignores\n : actualRelation?.ignores,\n follows:\n kind === \"toggle-follow\"\n ? !actualRelation?.follows\n : actualRelation?.follows,\n } satisfies Partial;\n },\n onError,\n onSuccess(data) {\n onSuccess(data);\n\n getQueryClient().setQueryData(\n QueryKeys.accounts.relations(reference!, target!),\n data\n );\n\n // Invalidate account query to refetch follow stats (follower_count, following_count)\n // This is needed because profile pages use staleTime: Infinity for performance\n if (target) {\n getQueryClient().invalidateQueries(\n getAccountFullQueryOptions(target)\n );\n }\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Content Operations\n * Operations for creating, voting, and managing content on Hive blockchain\n */\n\n/**\n * Builds a vote operation.\n * @param voter - Account casting the vote\n * @param author - Author of the post/comment\n * @param permlink - Permlink of the post/comment\n * @param weight - Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote)\n * @returns Vote operation\n */\nexport function buildVoteOp(\n voter: string,\n author: string,\n permlink: string,\n weight: number\n): Operation {\n if (!voter || !author || !permlink) {\n throw new Error(\"[SDK][buildVoteOp] Missing required parameters\");\n }\n if (weight < -10000 || weight > 10000) {\n throw new Error(\"[SDK][buildVoteOp] Weight must be between -10000 and 10000\");\n }\n\n return [\n \"vote\",\n {\n voter,\n author,\n permlink,\n weight,\n },\n ];\n}\n\n/**\n * Builds a comment operation (for posts or replies).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param parentAuthor - Parent author (empty string for top-level posts)\n * @param parentPermlink - Parent permlink (category/tag for top-level posts)\n * @param title - Title of the post (empty for comments)\n * @param body - Content body (required - cannot be empty)\n * @param jsonMetadata - JSON metadata object\n * @returns Comment operation\n */\nexport function buildCommentOp(\n author: string,\n permlink: string,\n parentAuthor: string,\n parentPermlink: string,\n title: string,\n body: string,\n jsonMetadata: Record\n): Operation {\n // Validate all required parameters including body\n if (!author || !permlink || parentPermlink === undefined || !body) {\n throw new Error(\"[SDK][buildCommentOp] Missing required parameters\");\n }\n\n return [\n \"comment\",\n {\n parent_author: parentAuthor,\n parent_permlink: parentPermlink,\n author,\n permlink,\n title,\n body,\n json_metadata: JSON.stringify(jsonMetadata),\n },\n ];\n}\n\n/**\n * Builds a comment options operation (for setting beneficiaries, rewards, etc.).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param maxAcceptedPayout - Maximum accepted payout (e.g., \"1000000.000 HBD\")\n * @param percentHbd - Percent of payout in HBD (10000 = 100%)\n * @param allowVotes - Allow votes on this content\n * @param allowCurationRewards - Allow curation rewards\n * @param extensions - Extensions array (for beneficiaries, etc.)\n * @returns Comment options operation\n */\nexport function buildCommentOptionsOp(\n author: string,\n permlink: string,\n maxAcceptedPayout: string,\n percentHbd: number,\n allowVotes: boolean,\n allowCurationRewards: boolean,\n extensions: any[]\n): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildCommentOptionsOp] Missing required parameters\");\n }\n\n return [\n \"comment_options\",\n {\n author,\n permlink,\n max_accepted_payout: maxAcceptedPayout,\n percent_hbd: percentHbd,\n allow_votes: allowVotes,\n allow_curation_rewards: allowCurationRewards,\n extensions,\n },\n ];\n}\n\n/**\n * Builds a delete comment operation.\n * @param author - Author of the comment/post to delete\n * @param permlink - Permlink of the comment/post to delete\n * @returns Delete comment operation\n */\nexport function buildDeleteCommentOp(author: string, permlink: string): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildDeleteCommentOp] Missing required parameters\");\n }\n\n return [\n \"delete_comment\",\n {\n author,\n permlink,\n },\n ];\n}\n\n/**\n * Builds a reblog operation (custom_json).\n * @param account - Account performing the reblog\n * @param author - Original post author\n * @param permlink - Original post permlink\n * @param deleteReblog - If true, removes the reblog\n * @returns Custom JSON operation for reblog\n */\nexport function buildReblogOp(\n account: string,\n author: string,\n permlink: string,\n deleteReblog: boolean = false\n): Operation {\n if (!account || !author || !permlink) {\n throw new Error(\"[SDK][buildReblogOp] Missing required parameters\");\n }\n\n const json: any = {\n account,\n author,\n permlink,\n };\n\n if (deleteReblog) {\n json.delete = \"delete\";\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\"reblog\", json]),\n required_auths: [],\n required_posting_auths: [account],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Wallet Operations\n * Operations for managing tokens, savings, vesting, and conversions\n */\n\n/**\n * Builds a transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer operation\n */\nexport function buildTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferOp] Missing required parameters\");\n }\n\n return [\n \"transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds multiple transfer operations for multiple recipients.\n * @param from - Sender account\n * @param destinations - Comma or space separated list of recipient accounts\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Array of transfer operations\n */\nexport function buildMultiTransferOps(\n from: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!from || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Create a transfer operation for each destination username\n return destArray.map((dest) =>\n buildTransferOp(from, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds a recurrent transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param recurrence - Recurrence in hours\n * @param executions - Number of executions (2 = executes twice)\n * @returns Recurrent transfer operation\n */\nexport function buildRecurrentTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n recurrence: number,\n executions: number\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Missing required parameters\");\n }\n if (recurrence < 24) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours\");\n }\n\n return [\n \"recurrent_transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n recurrence,\n executions,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a transfer to savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer to savings operation\n */\nexport function buildTransferToSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds a transfer from savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID (use timestamp)\n * @returns Transfer from savings operation\n */\nexport function buildTransferFromSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_from_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds a cancel transfer from savings operation.\n * @param from - Account that initiated the savings withdrawal\n * @param requestId - Request ID to cancel\n * @returns Cancel transfer from savings operation\n */\nexport function buildCancelTransferFromSavingsOp(\n from: string,\n requestId: number\n): Operation {\n if (!from || requestId === undefined) {\n throw new Error(\"[SDK][buildCancelTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"cancel_transfer_from_savings\",\n {\n from,\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds operations to claim savings interest.\n * Creates a transfer_from_savings and immediately cancels it to claim interest.\n * @param from - Account claiming interest\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"0.001 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID\n * @returns Array of operations [transfer_from_savings, cancel_transfer_from_savings]\n */\nexport function buildClaimInterestOps(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation[] {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildClaimInterestOps] Missing required parameters\");\n }\n\n return [\n buildTransferFromSavingsOp(from, to, amount, memo, requestId),\n buildCancelTransferFromSavingsOp(from, requestId),\n ];\n}\n\n/**\n * Builds a transfer to vesting operation (power up).\n * @param from - Account sending HIVE\n * @param to - Account receiving Hive Power\n * @param amount - Amount with HIVE symbol (e.g., \"1.000 HIVE\")\n * @returns Transfer to vesting operation\n */\nexport function buildTransferToVestingOp(\n from: string,\n to: string,\n amount: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToVestingOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_vesting\",\n {\n from,\n to,\n amount,\n },\n ];\n}\n\n/**\n * Builds a withdraw vesting operation (power down).\n * @param account - Account withdrawing vesting\n * @param vestingShares - Amount of VESTS to withdraw (e.g., \"1.000000 VESTS\")\n * @returns Withdraw vesting operation\n */\nexport function buildWithdrawVestingOp(\n account: string,\n vestingShares: string\n): Operation {\n if (!account || !vestingShares) {\n throw new Error(\"[SDK][buildWithdrawVestingOp] Missing required parameters\");\n }\n\n return [\n \"withdraw_vesting\",\n {\n account,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a delegate vesting shares operation (HP delegation).\n * @param delegator - Account delegating HP\n * @param delegatee - Account receiving HP delegation\n * @param vestingShares - Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\")\n * @returns Delegate vesting shares operation\n */\nexport function buildDelegateVestingSharesOp(\n delegator: string,\n delegatee: string,\n vestingShares: string\n): Operation {\n if (!delegator || !delegatee || !vestingShares) {\n throw new Error(\"[SDK][buildDelegateVestingSharesOp] Missing required parameters\");\n }\n\n return [\n \"delegate_vesting_shares\",\n {\n delegator,\n delegatee,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a set withdraw vesting route operation.\n * @param fromAccount - Account withdrawing vesting\n * @param toAccount - Account receiving withdrawn vesting\n * @param percent - Percentage to route (0-10000, where 10000 = 100%)\n * @param autoVest - Auto convert to vesting\n * @returns Set withdraw vesting route operation\n */\nexport function buildSetWithdrawVestingRouteOp(\n fromAccount: string,\n toAccount: string,\n percent: number,\n autoVest: boolean\n): Operation {\n if (!fromAccount || !toAccount || percent === undefined) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters\");\n }\n if (percent < 0 || percent > 10000) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000\");\n }\n\n return [\n \"set_withdraw_vesting_route\",\n {\n from_account: fromAccount,\n to_account: toAccount,\n percent,\n auto_vest: autoVest,\n },\n ];\n}\n\n/**\n * Builds a convert operation (HBD to HIVE).\n * @param owner - Account converting HBD\n * @param amount - Amount of HBD to convert (e.g., \"1.000 HBD\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Convert operation\n */\nexport function buildConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildConvertOp] Missing required parameters\");\n }\n\n return [\n \"convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a collateralized convert operation (HIVE to HBD via collateral).\n * @param owner - Account converting HIVE\n * @param amount - Amount of HIVE to convert (e.g., \"1.000 HIVE\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Collateralized convert operation\n */\nexport function buildCollateralizedConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildCollateralizedConvertOp] Missing required parameters\");\n }\n\n return [\n \"collateralized_convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a Hive Engine custom_json operation.\n * @param from - Account performing the operation\n * @param contractAction - Engine contract action (e.g., \"transfer\", \"stake\")\n * @param contractPayload - Payload for the contract action\n * @param contractName - Engine contract name (defaults to \"tokens\")\n * @returns Custom JSON operation\n */\nexport function buildEngineOp(\n from: string,\n contractAction: string,\n contractPayload: Record,\n contractName = \"tokens\"\n): Operation {\n return [\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [from],\n required_posting_auths: [],\n json: JSON.stringify({ contractName, contractAction, contractPayload }),\n }];\n}\n\n/**\n * Builds a scot_claim_token operation (posting authority).\n * @param account - Account claiming rewards\n * @param tokens - Array of token symbols to claim\n * @returns Custom JSON operation\n */\nexport function buildEngineClaimOp(\n account: string,\n tokens: string[]\n): Operation {\n return [\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [account],\n json: JSON.stringify(tokens.map((symbol) => ({ symbol }))),\n }];\n}\n\n/**\n * Builds a delegate RC operation (custom_json).\n * @param from - Account delegating RC\n * @param delegatees - Single delegatee or comma-separated list\n * @param maxRc - Maximum RC to delegate (in mana units)\n * @returns Custom JSON operation for RC delegation\n */\nexport function buildDelegateRcOp(\n from: string,\n delegatees: string,\n maxRc: string | number\n): Operation {\n if (!from || !delegatees || maxRc === undefined) {\n throw new Error(\"[SDK][buildDelegateRcOp] Missing required parameters\");\n }\n\n const delegateeArray = delegatees.includes(\",\")\n ? delegatees.split(\",\").map((d) => d.trim())\n : [delegatees];\n\n return [\n \"custom_json\",\n {\n id: \"rc\",\n json: JSON.stringify([\n \"delegate_rc\",\n {\n from,\n delegatees: delegateeArray,\n max_rc: maxRc,\n },\n ]),\n required_auths: [],\n required_posting_auths: [from],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Social Operations\n * Operations for following, muting, and managing social relationships\n */\n\n/**\n * Builds a follow operation (custom_json).\n * @param follower - Account following\n * @param following - Account to follow\n * @returns Custom JSON operation for follow\n */\nexport function buildFollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildFollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"blog\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unfollow operation (custom_json).\n * @param follower - Account unfollowing\n * @param following - Account to unfollow\n * @returns Custom JSON operation for unfollow\n */\nexport function buildUnfollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnfollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an ignore/mute operation (custom_json).\n * @param follower - Account ignoring\n * @param following - Account to ignore\n * @returns Custom JSON operation for ignore\n */\nexport function buildIgnoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildIgnoreOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"ignore\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unignore/unmute operation (custom_json).\n * @param follower - Account unignoring\n * @param following - Account to unignore\n * @returns Custom JSON operation for unignore\n */\nexport function buildUnignoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnignoreOp] Missing required parameters\");\n }\n\n return buildUnfollowOp(follower, following);\n}\n\n/**\n * Builds a Hive Notify set last read operation (custom_json).\n * @param username - Account setting last read\n * @param date - ISO date string (defaults to now)\n * @returns Array of custom JSON operations for setting last read\n */\nexport function buildSetLastReadOps(username: string, date?: string): Operation[] {\n if (!username) {\n throw new Error(\"[SDK][buildSetLastReadOps] Missing required parameters\");\n }\n\n const lastReadDate = date || new Date().toISOString().split(\".\")[0];\n\n const notifyOp: Operation = [\n \"custom_json\",\n {\n id: \"notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n const ecencyNotifyOp: Operation = [\n \"custom_json\",\n {\n id: \"ecency_notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n return [notifyOp, ecencyNotifyOp];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Governance Operations\n * Operations for witness voting, proposals, and proxy management\n */\n\n/**\n * Builds an account witness vote operation.\n * @param account - Account voting\n * @param witness - Witness account name\n * @param approve - True to approve, false to disapprove\n * @returns Account witness vote operation\n */\nexport function buildWitnessVoteOp(\n account: string,\n witness: string,\n approve: boolean\n): Operation {\n if (!account || !witness || approve === undefined) {\n throw new Error(\"[SDK][buildWitnessVoteOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_vote\",\n {\n account,\n witness,\n approve,\n },\n ];\n}\n\n/**\n * Builds an account witness proxy operation.\n * @param account - Account setting proxy\n * @param proxy - Proxy account name (empty string to remove proxy)\n * @returns Account witness proxy operation\n */\nexport function buildWitnessProxyOp(account: string, proxy: string): Operation {\n if (!account || proxy === undefined) {\n throw new Error(\"[SDK][buildWitnessProxyOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_proxy\",\n {\n account,\n proxy,\n },\n ];\n}\n\n/**\n * Payload for proposal creation\n */\nexport interface ProposalCreatePayload {\n receiver: string;\n subject: string;\n permlink: string;\n start: string;\n end: string;\n dailyPay: string;\n}\n\n/**\n * Builds a create proposal operation.\n * @param creator - Account creating the proposal\n * @param payload - Proposal details (must include start, end, and dailyPay)\n * @returns Create proposal operation\n */\nexport function buildProposalCreateOp(\n creator: string,\n payload: ProposalCreatePayload\n): Operation {\n // Validate required fields including start, end, and dailyPay\n if (\n !creator ||\n !payload.receiver ||\n !payload.subject ||\n !payload.permlink ||\n !payload.start ||\n !payload.end ||\n !payload.dailyPay\n ) {\n throw new Error(\"[SDK][buildProposalCreateOp] Missing required parameters\");\n }\n\n // Validate date format by attempting to parse them\n const startDate = new Date(payload.start);\n const endDate = new Date(payload.end);\n if (startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {\n throw new Error(\n \"[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings\"\n );\n }\n\n return [\n \"create_proposal\",\n {\n creator,\n receiver: payload.receiver,\n start_date: payload.start,\n end_date: payload.end,\n daily_pay: payload.dailyPay,\n subject: payload.subject,\n permlink: payload.permlink,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal votes operation.\n * @param voter - Account voting\n * @param proposalIds - Array of proposal IDs\n * @param approve - True to approve, false to disapprove\n * @returns Update proposal votes operation\n */\nexport function buildProposalVoteOp(\n voter: string,\n proposalIds: number[],\n approve: boolean\n): Operation {\n if (!voter || !proposalIds || proposalIds.length === 0 || approve === undefined) {\n throw new Error(\"[SDK][buildProposalVoteOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal_votes\",\n {\n voter,\n proposal_ids: proposalIds,\n approve,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a remove proposal operation.\n * @param proposalOwner - Owner of the proposal\n * @param proposalIds - Array of proposal IDs to remove\n * @returns Remove proposal operation\n */\nexport function buildRemoveProposalOp(\n proposalOwner: string,\n proposalIds: number[]\n): Operation {\n if (!proposalOwner || !proposalIds || proposalIds.length === 0) {\n throw new Error(\"[SDK][buildRemoveProposalOp] Missing required parameters\");\n }\n\n return [\n \"remove_proposal\",\n {\n proposal_owner: proposalOwner,\n proposal_ids: proposalIds,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal operation.\n * @param proposalId - Proposal ID to update (must be a valid number, including 0)\n * @param creator - Account that created the proposal\n * @param dailyPay - New daily pay amount\n * @param subject - New subject\n * @param permlink - New permlink\n * @returns Update proposal operation\n */\nexport function buildUpdateProposalOp(\n proposalId: number,\n creator: string,\n dailyPay: string,\n subject: string,\n permlink: string\n): Operation {\n // Validate proposalId properly - check for undefined/null instead of falsy\n // This allows proposalId of 0 which is a valid proposal ID\n if (\n proposalId === undefined ||\n proposalId === null ||\n typeof proposalId !== 'number' ||\n !creator ||\n !dailyPay ||\n !subject ||\n !permlink\n ) {\n throw new Error(\"[SDK][buildUpdateProposalOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal\",\n {\n proposal_id: proposalId,\n creator,\n daily_pay: dailyPay,\n subject,\n permlink,\n extensions: [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Community Operations\n * Operations for managing Hive communities\n */\n\n/**\n * Builds a subscribe to community operation (custom_json).\n * @param username - Account subscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for subscribe\n */\nexport function buildSubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildSubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"subscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds an unsubscribe from community operation (custom_json).\n * @param username - Account unsubscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for unsubscribe\n */\nexport function buildUnsubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildUnsubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"unsubscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a set user role in community operation (custom_json).\n * @param username - Account setting the role (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to set role for\n * @param role - Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\")\n * @returns Custom JSON operation for setRole\n */\nexport function buildSetRoleOp(\n username: string,\n community: string,\n account: string,\n role: string\n): Operation {\n if (!username || !community || !account || !role) {\n throw new Error(\n `[SDK][buildSetRoleOp] Missing required parameters: username=${username}, community=${community}, account=${account}, role=${role}`\n );\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"setRole\", { community, account, role }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Community properties for update\n */\nexport interface CommunityProps {\n title: string;\n about: string;\n lang: string;\n description: string;\n flag_text: string;\n is_nsfw: boolean;\n}\n\n/**\n * Builds an update community properties operation (custom_json).\n * @param username - Account updating (must be community admin)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param props - Properties to update\n * @returns Custom JSON operation for updateProps\n */\nexport function buildUpdateCommunityOp(\n username: string,\n community: string,\n props: CommunityProps\n): Operation {\n if (!username || !community || !props) {\n throw new Error(\"[SDK][buildUpdateCommunityOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"updateProps\", { community, props }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a pin/unpin post in community operation (custom_json).\n * @param username - Account pinning (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param pin - True to pin, false to unpin\n * @returns Custom JSON operation for pinPost/unpinPost\n */\nexport function buildPinPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n pin: boolean\n): Operation {\n if (!username || !community || !account || !permlink || pin === undefined) {\n throw new Error(\"[SDK][buildPinPostOp] Missing required parameters\");\n }\n\n const action = pin ? \"pinPost\" : \"unpinPost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute post in community operation (custom_json).\n * @param username - Account muting (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for mutePost/unmutePost\n */\nexport function buildMutePostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string,\n mute: boolean\n): Operation {\n if (\n !username ||\n !community ||\n !account ||\n !permlink ||\n mute === undefined\n ) {\n throw new Error(\"[SDK][buildMutePostOp] Missing required parameters\");\n }\n\n const action = mute ? \"mutePost\" : \"unmutePost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute user in community operation (custom_json).\n * @param username - Account performing mute (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to mute/unmute\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for muteUser/unmuteUser\n */\nexport function buildMuteUserOp(\n username: string,\n community: string,\n account: string,\n notes: string,\n mute: boolean\n): Operation {\n if (!username || !community || !account || mute === undefined) {\n throw new Error(\"[SDK][buildMuteUserOp] Missing required parameters\");\n }\n\n const action = mute ? \"muteUser\" : \"unmuteUser\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a flag post in community operation (custom_json).\n * @param username - Account flagging\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Flag reason/notes\n * @returns Custom JSON operation for flagPost\n */\nexport function buildFlagPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string\n): Operation {\n if (!username || !community || !account || !permlink) {\n throw new Error(\"[SDK][buildFlagPostOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"flagPost\", { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Market Operations\n * Operations for trading on the internal Hive market\n */\n\n/**\n * Transaction type for buy/sell operations\n */\nexport enum BuySellTransactionType {\n Buy = \"buy\",\n Sell = \"sell\",\n}\n\n/**\n * Order ID prefix for different order types\n */\nexport enum OrderIdPrefix {\n EMPTY = \"\",\n SWAP = \"9\",\n}\n\n/**\n * Builds a limit order create operation.\n * @param owner - Account creating the order\n * @param amountToSell - Amount and asset to sell\n * @param minToReceive - Minimum amount and asset to receive\n * @param fillOrKill - If true, order must be filled immediately or cancelled\n * @param expiration - Expiration date (ISO string)\n * @param orderId - Unique order ID\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOp(\n owner: string,\n amountToSell: string,\n minToReceive: string,\n fillOrKill: boolean,\n expiration: string,\n orderId: number\n): Operation {\n if (!owner || !amountToSell || !minToReceive || !expiration || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCreateOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_create\",\n {\n owner,\n orderid: orderId,\n amount_to_sell: amountToSell,\n min_to_receive: minToReceive,\n fill_or_kill: fillOrKill,\n expiration,\n },\n ];\n}\n\n/**\n * Helper to format number to 3 decimal places\n */\nfunction formatNumber(value: number, decimals: number = 3): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Builds a limit order create operation with automatic formatting.\n * This is a convenience method that handles buy/sell logic and formatting.\n *\n * For Buy orders: You're buying HIVE with HBD\n * - amountToSell: HBD amount you're spending\n * - minToReceive: HIVE amount you want to receive\n *\n * For Sell orders: You're selling HIVE for HBD\n * - amountToSell: HIVE amount you're selling\n * - minToReceive: HBD amount you want to receive\n *\n * @param owner - Account creating the order\n * @param amountToSell - Amount to sell (number)\n * @param minToReceive - Minimum to receive (number)\n * @param orderType - Buy or Sell\n * @param idPrefix - Order ID prefix\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOpWithType(\n owner: string,\n amountToSell: number,\n minToReceive: number,\n orderType: BuySellTransactionType,\n idPrefix: OrderIdPrefix = OrderIdPrefix.EMPTY\n): Operation {\n // Validate numeric inputs\n if (\n !owner ||\n orderType === undefined ||\n !Number.isFinite(amountToSell) ||\n amountToSell <= 0 ||\n !Number.isFinite(minToReceive) ||\n minToReceive <= 0\n ) {\n throw new Error(\"[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters\");\n }\n\n // Calculate expiration (27 days from now)\n const expiration = new Date(Date.now());\n expiration.setDate(expiration.getDate() + 27);\n const expirationStr = expiration.toISOString().split(\".\")[0];\n\n // Generate order ID\n const orderId = Number(\n `${idPrefix}${Math.floor(Date.now() / 1000)\n .toString()\n .slice(2)}`\n );\n\n // Format amounts based on order type\n // Buy: Sell HBD to buy HIVE\n // Sell: Sell HIVE to buy HBD\n const formattedAmountToSell =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(amountToSell, 3)} HBD`\n : `${formatNumber(amountToSell, 3)} HIVE`;\n\n const formattedMinToReceive =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(minToReceive, 3)} HIVE`\n : `${formatNumber(minToReceive, 3)} HBD`;\n\n return buildLimitOrderCreateOp(\n owner,\n formattedAmountToSell,\n formattedMinToReceive,\n false,\n expirationStr,\n orderId\n );\n}\n\n/**\n * Builds a limit order cancel operation.\n * @param owner - Account cancelling the order\n * @param orderId - Order ID to cancel\n * @returns Limit order cancel operation\n */\nexport function buildLimitOrderCancelOp(owner: string, orderId: number): Operation {\n if (!owner || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCancelOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_cancel\",\n {\n owner,\n orderid: orderId,\n },\n ];\n}\n\n/**\n * Builds a claim reward balance operation.\n * @param account - Account claiming rewards\n * @param rewardHive - HIVE reward to claim (e.g., \"0.000 HIVE\")\n * @param rewardHbd - HBD reward to claim (e.g., \"0.000 HBD\")\n * @param rewardVests - VESTS reward to claim (e.g., \"0.000000 VESTS\")\n * @returns Claim reward balance operation\n */\nexport function buildClaimRewardBalanceOp(\n account: string,\n rewardHive: string,\n rewardHbd: string,\n rewardVests: string\n): Operation {\n if (!account || !rewardHive || !rewardHbd || !rewardVests) {\n throw new Error(\"[SDK][buildClaimRewardBalanceOp] Missing required parameters\");\n }\n\n return [\n \"claim_reward_balance\",\n {\n account,\n reward_hive: rewardHive,\n reward_hbd: rewardHbd,\n reward_vests: rewardVests,\n },\n ];\n}\n","import type { Operation, Authority } from \"../../../hive-tx\";\n\nexport type { Authority };\n\n/**\n * Account Operations\n * Operations for managing accounts, keys, and permissions\n */\n\n/**\n * Builds an account update operation.\n * @param account - Account name\n * @param owner - Owner authority (optional)\n * @param active - Active authority (optional)\n * @param posting - Posting authority (optional)\n * @param memoKey - Memo public key\n * @param jsonMetadata - Account JSON metadata\n * @returns Account update operation\n */\nexport function buildAccountUpdateOp(\n account: string,\n owner: Authority | undefined,\n active: Authority | undefined,\n posting: Authority | undefined,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !memoKey) {\n throw new Error(\"[SDK][buildAccountUpdateOp] Missing required parameters\");\n }\n\n return [\n \"account_update\",\n {\n account,\n owner,\n active,\n posting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an account update2 operation (for posting_json_metadata).\n * @param account - Account name\n * @param jsonMetadata - Account JSON metadata (legacy, usually empty)\n * @param postingJsonMetadata - Posting JSON metadata string\n * @param extensions - Extensions array\n * @returns Account update2 operation\n */\nexport function buildAccountUpdate2Op(\n account: string,\n jsonMetadata: string,\n postingJsonMetadata: string,\n extensions: any[]\n): Operation {\n if (!account || postingJsonMetadata === undefined) {\n throw new Error(\"[SDK][buildAccountUpdate2Op] Missing required parameters\");\n }\n\n return [\n \"account_update2\",\n {\n account,\n json_metadata: jsonMetadata || \"\",\n posting_json_metadata: postingJsonMetadata,\n extensions: (extensions || []) as [],\n },\n ];\n}\n\n/**\n * Public keys for account creation\n */\nexport interface AccountKeys {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n}\n\n/**\n * Builds an account create operation.\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @param fee - Creation fee (e.g., \"3.000 HIVE\")\n * @returns Account create operation\n */\nexport function buildAccountCreateOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys,\n fee: string\n): Operation {\n if (!creator || !newAccountName || !keys || !fee) {\n throw new Error(\"[SDK][buildAccountCreateOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"account_create\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n fee,\n },\n ] satisfies Operation;\n}\n\n/**\n * Builds a create claimed account operation (using account creation tokens).\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @returns Create claimed account operation\n */\nexport function buildCreateClaimedAccountOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys\n): Operation {\n if (!creator || !newAccountName || !keys) {\n throw new Error(\"[SDK][buildCreateClaimedAccountOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"create_claimed_account\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds a claim account operation.\n * @param creator - Account claiming the token\n * @param fee - Fee for claiming (usually \"0.000 HIVE\" for RC-based claims)\n * @returns Claim account operation\n */\nexport function buildClaimAccountOp(creator: string, fee: string): Operation {\n if (!creator || !fee) {\n throw new Error(\"[SDK][buildClaimAccountOp] Missing required parameters\");\n }\n\n return [\n \"claim_account\",\n {\n creator,\n fee,\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds an operation to grant posting permission to another account.\n * Helper that modifies posting authority to add an account.\n * @param account - Account granting permission\n * @param currentPosting - Current posting authority\n * @param grantedAccount - Account to grant permission to\n * @param weightThreshold - Weight threshold of the granted account\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildGrantPostingPermissionOp(\n account: string,\n currentPosting: Authority,\n grantedAccount: string,\n weightThreshold: number,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !grantedAccount || !memoKey) {\n throw new Error(\"[SDK][buildGrantPostingPermissionOp] Missing required parameters\");\n }\n\n // Find existing account or create new entry to prevent duplicates\n const existingIndex = currentPosting.account_auths.findIndex(\n ([acc]) => acc === grantedAccount\n );\n\n const newAccountAuths = [...currentPosting.account_auths];\n if (existingIndex >= 0) {\n // Update existing entry with new weight\n newAccountAuths[existingIndex] = [grantedAccount, weightThreshold];\n } else {\n // Add new entry\n newAccountAuths.push([grantedAccount, weightThreshold]);\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: newAccountAuths,\n };\n\n // Sort account_auths alphabetically for consistency\n newPosting.account_auths.sort((a, b) => (a[0] > b[0] ? 1 : -1));\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an operation to revoke posting permission from an account.\n * Helper that modifies posting authority to remove an account.\n * @param account - Account revoking permission\n * @param currentPosting - Current posting authority\n * @param revokedAccount - Account to revoke permission from\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildRevokePostingPermissionOp(\n account: string,\n currentPosting: Authority,\n revokedAccount: string,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !revokedAccount || !memoKey) {\n throw new Error(\"[SDK][buildRevokePostingPermissionOp] Missing required parameters\");\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: currentPosting.account_auths.filter(\n ([acc]) => acc !== revokedAccount\n ),\n };\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds a change recovery account operation.\n * @param accountToRecover - Account to change recovery account for\n * @param newRecoveryAccount - New recovery account name\n * @param extensions - Extensions array\n * @returns Change recovery account operation\n */\nexport function buildChangeRecoveryAccountOp(\n accountToRecover: string,\n newRecoveryAccount: string,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newRecoveryAccount) {\n throw new Error(\"[SDK][buildChangeRecoveryAccountOp] Missing required parameters\");\n }\n\n return [\n \"change_recovery_account\",\n {\n account_to_recover: accountToRecover,\n new_recovery_account: newRecoveryAccount,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a request account recovery operation.\n * @param recoveryAccount - Recovery account performing the recovery\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param extensions - Extensions array\n * @returns Request account recovery operation\n */\nexport function buildRequestAccountRecoveryOp(\n recoveryAccount: string,\n accountToRecover: string,\n newOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {\n throw new Error(\"[SDK][buildRequestAccountRecoveryOp] Missing required parameters\");\n }\n\n return [\n \"request_account_recovery\",\n {\n recovery_account: recoveryAccount,\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a recover account operation.\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param recentOwnerAuthority - Recent owner authority (for proof)\n * @param extensions - Extensions array\n * @returns Recover account operation\n */\nexport function buildRecoverAccountOp(\n accountToRecover: string,\n newOwnerAuthority: Authority,\n recentOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newOwnerAuthority || !recentOwnerAuthority) {\n throw new Error(\"[SDK][buildRecoverAccountOp] Missing required parameters\");\n }\n\n return [\n \"recover_account\",\n {\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n recent_owner_authority: recentOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Ecency-Specific Operations\n * Custom operations for Ecency platform features (Points, Boost, Promote, etc.)\n */\n\n/**\n * Builds an Ecency Boost Plus subscription operation (custom_json).\n * @param user - User account\n * @param account - Account to subscribe\n * @param duration - Subscription duration in days (must be a valid finite number)\n * @returns Custom JSON operation for boost plus\n */\nexport function buildBoostPlusOp(\n user: string,\n account: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !account || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildBoostPlusOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_boost_plus\",\n json: JSON.stringify({\n user,\n account,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency RC top-up operation (custom_json): a short-term, RC-only\n * delegation to the user's OWN account, paid for with Ecency Points. Distinct\n * from Boost Plus (which delegates Hive Power). The RC amount is fixed\n * server-side, so the user only chooses a duration. Signed with active\n * authority because it spends Points. The actual on-chain `delegate_rc` is\n * broadcast by the Ecency relay account, not here.\n * @param user - User account (payer and recipient of the RC)\n * @param duration - Delegation duration in days (must be a valid finite number)\n * @returns Custom JSON operation for the RC top-up\n */\nexport function buildRcDelegationOp(user: string, duration: number): Operation {\n if (!user || !Number.isInteger(duration) || duration <= 0) {\n throw new Error(\"[SDK][buildRcDelegationOp] Missing or invalid parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_rc_delegation\",\n json: JSON.stringify({\n user,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency promote operation (custom_json).\n * @param user - User account\n * @param author - Post author\n * @param permlink - Post permlink\n * @param duration - Promotion duration in days (must be a valid finite number)\n * @returns Custom JSON operation for promote\n */\nexport function buildPromoteOp(\n user: string,\n author: string,\n permlink: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !author || !permlink || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildPromoteOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_promote\",\n json: JSON.stringify({\n user,\n author,\n permlink,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency point transfer operation (custom_json).\n * @param sender - Sender account\n * @param receiver - Receiver account\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Custom JSON operation for point transfer\n */\nexport function buildPointTransferOp(\n sender: string,\n receiver: string,\n amount: string,\n memo: string\n): Operation {\n if (!sender || !receiver || !amount) {\n throw new Error(\"[SDK][buildPointTransferOp] Missing required parameters\");\n }\n\n // Normalize \"POINTS\" to \"POINT\" — backend expects singular form\n const normalizedAmount = amount.replace(/POINTS\\b/, \"POINT\");\n\n return [\n \"custom_json\",\n {\n id: \"ecency_point_transfer\",\n json: JSON.stringify({\n sender,\n receiver,\n amount: normalizedAmount,\n memo: memo || \"\",\n }),\n required_auths: [sender],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds multiple Ecency point transfer operations for multiple recipients.\n * @param sender - Sender account\n * @param destinations - Comma or space separated list of recipients\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Array of custom JSON operations for point transfers\n */\nexport function buildMultiPointTransferOps(\n sender: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!sender || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Validate parsed destinations\n if (destArray.length === 0) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing valid destinations\");\n }\n\n // Create a point transfer operation for each destination\n return destArray.map((dest) =>\n buildPointTransferOp(sender, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds an Ecency community rewards registration operation (custom_json).\n * @param name - Account name to register\n * @returns Custom JSON operation for community registration\n */\nexport function buildCommunityRegistrationOp(name: string): Operation {\n if (!name) {\n throw new Error(\"[SDK][buildCommunityRegistrationOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_registration\",\n json: JSON.stringify({\n name,\n }),\n required_auths: [name],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic active authority custom_json operation.\n * Used for various Ecency operations that require active authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with active authority\n */\nexport function buildActiveCustomJsonOp(\n username: string,\n operationId: string,\n json: Record\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildActiveCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [username],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic posting authority custom_json operation.\n * Used for various operations that require posting authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with posting authority\n */\nexport function buildPostingCustomJsonOp(\n username: string,\n operationId: string,\n json: Record | any[]\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildPostingCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildFollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for following an account.\n */\nexport interface FollowPayload {\n /** Account to follow */\n following: string;\n}\n\n/**\n * React Query mutation hook for following an account.\n *\n * This mutation broadcasts a follow operation to the Hive blockchain,\n * adding the target account to the follower's \"blog\" follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const followMutation = useFollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Follow an account\n * followMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useFollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"follow\"],\n username,\n ({ following }) => [\n buildFollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnfollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unfollowing an account.\n */\nexport interface UnfollowPayload {\n /** Account to unfollow */\n following: string;\n}\n\n/**\n * React Query mutation hook for unfollowing an account.\n *\n * This mutation broadcasts an unfollow operation to the Hive blockchain,\n * removing the target account from the follower's follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const unfollowMutation = useUnfollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unfollow an account\n * unfollowMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useUnfollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"unfollow\"],\n username,\n ({ following }) => [\n buildUnfollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n author: string;\n permlink: string;\n}\n\nexport function useBookmarkAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"add\", username],\n mutationFn: async ({ author, permlink }: Payload) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useBookmarkDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"delete\", username],\n mutationFn: async (bookmarkId: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: bookmarkId,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useAccountFavoriteAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"add\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation, InfiniteData } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../../types\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAccountFavoriteDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"delete\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to delete favorite: ${response.status}`);\n }\n return response.json();\n },\n onMutate: async (account: string) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.accounts.favorites(username);\n const infinitePrefix = QueryKeys.accounts.favoritesInfinite(username);\n const checkKey = QueryKeys.accounts.checkFavorite(username, account);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n qc.cancelQueries({ queryKey: checkKey }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((f) => f.account !== account)\n );\n }\n\n const previousCheck = qc.getQueryData(checkKey);\n qc.setQueryData(checkKey, false);\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((f) => f.account !== account),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite, previousCheck };\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError: (err, account, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.accounts.favorites(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n if (context?.previousCheck !== undefined) {\n qc.setQueryData(\n QueryKeys.accounts.checkFavorite(username!, account),\n context.previousCheck\n );\n }\n onError(err);\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\nexport interface Keys {\n owner: PrivateKey;\n active: PrivateKey;\n posting: PrivateKey;\n memo_key: PrivateKey;\n}\n\ninterface Payload {\n keepCurrent?: boolean;\n currentKey: PrivateKey;\n keys: Keys[];\n keysToRevoke?: string[]; // Deprecated: will be treated as revoking from all authorities\n keysToRevokeByAuthority?: Partial>; // Authority-specific revocation\n}\n\nexport function dedupeAndSortKeyAuths(\n existing: Authority[\"key_auths\"],\n additions: [string, number][]\n): Authority[\"key_auths\"] {\n const merged = new Map();\n\n existing.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n additions.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n return Array.from(merged.entries())\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, weight]) => [key, weight] as [string, number]);\n}\n\ntype UpdateKeyAuthsOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdateKeyAuths(\n username: string,\n options?: UpdateKeyAuthsOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"keys-update\", username],\n mutationFn: async ({\n keys,\n keepCurrent = false,\n currentKey,\n keysToRevoke = [],\n keysToRevokeByAuthority = {}\n }: Payload) => {\n if (keys.length === 0) {\n throw new Error(\n \"[SDK][Update password] – no new keys provided\"\n );\n }\n\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update keys for anon user\"\n );\n }\n\n const prepareAuth = (keyName: keyof Keys) => {\n const auth: Authority = JSON.parse(JSON.stringify(accountData[keyName]));\n\n // Get keys to revoke for this specific authority\n const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];\n // Fallback to global keysToRevoke for backwards compatibility\n const allKeysToRevoke = [\n ...keysToRevokeForAuthority,\n ...(keysToRevokeByAuthority[keyName] === undefined ? keysToRevoke : [])\n ];\n\n // Filter out keys to revoke from existing keys (authority-specific)\n const existingKeys = keepCurrent\n ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString()))\n : [];\n\n auth.key_auths = dedupeAndSortKeyAuths(\n existingKeys,\n keys.map(\n (values, i) =>\n [values[keyName].createPublic().toString(), i + 1] as [\n string,\n number,\n ]\n )\n );\n\n return auth;\n };\n\n return broadcastOperations(\n [[\"account_update\", {\n account: username,\n json_metadata: accountData.json_metadata,\n owner: prepareAuth(\"owner\"),\n active: prepareAuth(\"active\"),\n posting: prepareAuth(\"posting\"),\n // Always use new memo key when adding new keys\n memo_key: keys[0].memo_key.createPublic().toString(),\n }]],\n currentKey\n );\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { useAccountUpdateKeyAuths } from \"./use-account-update-key-auths\";\n\ninterface Payload {\n newPassword: string;\n currentPassword: string;\n keepCurrent?: boolean;\n}\n\n/**\n * Only native Hive and custom passwords could be updated here\n * Seed based password cannot be updated here, it will be in an account always for now\n */\ntype UpdatePasswordOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdatePassword(\n username: string,\n options?: UpdatePasswordOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);\n\n return useMutation({\n mutationKey: [\"accounts\", \"password-update\", username],\n mutationFn: async ({\n newPassword,\n currentPassword,\n keepCurrent,\n }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update password for anon user\"\n );\n }\n const currentKey = PrivateKey.fromLogin(\n username,\n currentPassword,\n \"owner\"\n );\n\n return updateKeys({\n currentKey,\n keepCurrent,\n keys: [\n {\n owner: PrivateKey.fromLogin(username, newPassword, \"owner\"),\n active: PrivateKey.fromLogin(username, newPassword, \"active\"),\n posting: PrivateKey.fromLogin(username, newPassword, \"posting\"),\n memo_key: PrivateKey.fromLogin(username, newPassword, \"memo\"),\n },\n ],\n });\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { FullAccount } from \"../types\";\nimport hs from \"hivesigner\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n}\n\ntype RevokePostingOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountRevokePosting(\n username: string | undefined,\n options: RevokePostingOptions,\n auth?: AuthContext\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-posting\", data?.name],\n mutationFn: async ({ accountName, type, key }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot revoke posting for anonymous user\"\n );\n }\n\n const posting = JSON.parse(JSON.stringify(data.posting)) as FullAccount[\"posting\"];\n\n posting.account_auths = posting.account_auths.filter(\n ([account]) => account !== accountName\n );\n\n const operationBody = {\n account: data.name,\n posting,\n memo_key: data.memo_key,\n json_metadata: data.json_metadata,\n };\n\n if (type === \"key\" && key) {\n return broadcastOperations([[\"account_update\", operationBody]], key);\n } else if (type === \"keychain\") {\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.broadcast([[\"account_update\", operationBody]], \"active\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"account_update\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: (resp, payload, ctx) => {\n (options.onSuccess as\n | ((data: unknown, variables: CommonPayload, context: unknown) => unknown)\n | undefined)?.(resp, payload, ctx);\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) =>\n ({\n ...data,\n posting: {\n ...data?.posting,\n account_auths:\n data?.posting?.account_auths?.filter(\n ([account]) => account !== payload.accountName\n ) ?? [],\n },\n }) as FullAccount\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\" | \"ecency\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n email?: string;\n}\n\ntype UpdateRecoveryOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountUpdateRecovery(\n username: string | undefined,\n code: string | undefined,\n options: UpdateRecoveryOptions,\n auth?: AuthContext\n) {\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"recovery\", data?.name],\n mutationFn: async ({ accountName, type, key, email }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot change recovery for anonymous user\"\n );\n }\n\n const operationBody = {\n account_to_recover: data.name,\n new_recovery_account: accountName,\n extensions: [] as [],\n };\n\n if (type === \"ecency\") {\n if (!code) {\n throw new Error(\"[SDK][Accounts] – missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/recoveries-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n email,\n publicKeys: [\n ...data.owner.key_auths,\n ...data.active.key_auths,\n ...data.posting.key_auths,\n data.memo_key,\n ],\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx, so guard explicitly — otherwise the\n // caller's onSuccess shows a \"recovery updated\" toast on a failed request.\n // (The missing Content-Type header also made the backend skip JSON parsing.)\n if (!response.ok) {\n throw new Error(`[SDK][Accounts] Failed to add recovery: ${response.status}`);\n }\n\n return response;\n } else if (type === \"key\" && key) {\n return broadcastOperations(\n [[\"change_recovery_account\", operationBody]],\n key\n );\n } else if (type === \"keychain\") {\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.broadcast([[\"change_recovery_account\", operationBody]], \"owner\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"change_recovery_account\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: options.onSuccess,\n });\n}\n","import { PublicKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport { FullAccount } from \"../types\";\n\n/**\n * Check whether an authority would still meet its weight_threshold\n * after removing the given keys. This prevents revoking keys that\n * would leave an authority unable to sign (especially for multisig).\n */\nexport function canRevokeFromAuthority(\n auth: Authority,\n revokingKeyStrs: Set\n): boolean {\n const remainingWeight = auth.key_auths\n .filter(([key]) => !revokingKeyStrs.has(String(key)))\n .reduce((sum, [, weight]) => sum + weight, 0);\n\n // account_auths also contribute weight\n const accountWeight = (auth.account_auths ?? []).reduce(\n (sum: number, [, weight]: [string, number]) => sum + weight,\n 0\n );\n\n return (remainingWeight + accountWeight) >= auth.weight_threshold;\n}\n\n/**\n * Build an account_update operation that removes the given public keys\n * from the relevant authorities.\n *\n * Only includes the `owner` field when a revoking key actually exists\n * in the owner authority - omitting it allows active-level signing.\n *\n * Returns the operation payload (without the \"account_update\" tag) so\n * callers can wrap it as needed for their broadcast method.\n */\nexport function buildRevokeKeysOp(\n accountData: FullAccount,\n revokingKeys: PublicKey[]\n) {\n const revokingKeyStrs = new Set(revokingKeys.map((k) => k.toString()));\n\n const hasAnyKeyInAuth = (auth: Authority) =>\n auth.key_auths.some(\n ([key]: [string | PublicKey, number]) => revokingKeyStrs.has(String(key))\n );\n\n const prepareAuth = (auth: Authority): Authority => {\n const clone: Authority = JSON.parse(JSON.stringify(auth));\n clone.key_auths = clone.key_auths.filter(\n ([key]) => !revokingKeyStrs.has(key.toString())\n );\n return clone;\n };\n\n const needsOwnerUpdate = hasAnyKeyInAuth(accountData.owner);\n\n return {\n account: accountData.name,\n json_metadata: accountData.json_metadata,\n owner: needsOwnerUpdate ? prepareAuth(accountData.owner) : undefined,\n active: prepareAuth(accountData.active),\n posting: prepareAuth(accountData.posting),\n memo_key: accountData.memo_key\n };\n}\n","import { PrivateKey, PublicKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { buildRevokeKeysOp } from \"./build-revoke-keys-op\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ninterface Payload {\n currentKey: PrivateKey;\n /** Keys to revoke. Accepts a single key or an array. */\n revokingKey: PublicKey | PublicKey[];\n}\n\n/**\n * Revoke one or more keys from an account on the Hive blockchain.\n *\n * When revoking keys that exist only in active/posting authorities,\n * the owner field is omitted from the operation so active-level\n * signing is sufficient.\n */\ntype RevokeKeyOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountRevokeKey(\n username: string | undefined,\n options?: RevokeKeyOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-key\", accountData?.name],\n mutationFn: async ({ currentKey, revokingKey }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Revoke key] – cannot update keys for anon user\"\n );\n }\n\n const revokingKeys = Array.isArray(revokingKey) ? revokingKey : [revokingKey];\n const op = buildRevokeKeysOp(accountData, revokingKeys);\n\n return broadcastOperations([[\"account_update\", op]], currentKey);\n },\n ...options,\n });\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildClaimAccountOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for claiming account creation tokens.\n */\nexport interface ClaimAccountPayload {\n /** Creator account claiming the token */\n creator: string;\n /** Fee for claiming (usually \"0.000 HIVE\" for RC-based claims) */\n fee?: string;\n}\n\n/**\n * React Query mutation hook for claiming account creation tokens.\n *\n * This mutation broadcasts a claim_account operation to claim an account\n * creation token using Resource Credits (RC). The claimed token can later\n * be used to create a new account for free using the create_claimed_account\n * operation.\n *\n * @param username - The username claiming the account token (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account cache to update pending_claimed_accounts count\n * - Updates account query data to set pending_claimed_accounts = 0 optimistically\n *\n * **Operation Details:**\n * - Uses native claim_account operation\n * - Fee: \"0.000 HIVE\" (uses RC instead of HIVE)\n * - Authority: Active key (required for claiming)\n *\n * **RC Requirements:**\n * - Requires sufficient Resource Credits (RC)\n * - RC amount varies based on network conditions\n * - Claiming without sufficient RC will fail\n *\n * **Use Case:**\n * - Claim tokens in advance when RC is available\n * - Create accounts later without paying HIVE fee\n * - Useful for onboarding services and apps\n *\n * @example\n * ```typescript\n * const claimMutation = useClaimAccount(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Claim account token using RC\n * claimMutation.mutate({\n * creator: 'alice',\n * fee: '0.000 HIVE'\n * });\n * ```\n */\nexport function useClaimAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"claimAccount\"],\n username,\n ({ creator, fee = \"0.000 HIVE\" }) => [\n buildClaimAccountOp(creator, fee)\n ],\n async (_result: any, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(variables.creator),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildGrantPostingPermissionOp, type Authority } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface GrantPostingPermissionPayload {\n currentPosting: Authority;\n grantedAccount: string;\n weightThreshold: number;\n memoKey: string;\n jsonMetadata: string;\n}\n\nexport function useGrantPostingPermission(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"grant-posting-permission\"],\n username,\n (payload) => [\n buildGrantPostingPermissionOp(\n username!,\n payload.currentPosting,\n payload.grantedAccount,\n payload.weightThreshold,\n payload.memoKey,\n payload.jsonMetadata\n )\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildAccountCreateOp, buildCreateClaimedAccountOp, type AccountKeys } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface CreateAccountPayload {\n newAccountName: string;\n keys: AccountKeys;\n fee: string;\n /** If true, uses a claimed account token instead of paying the fee */\n useClaimed?: boolean;\n}\n\nexport function useCreateAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"create\"],\n username,\n (payload) => [\n payload.useClaimed\n ? buildCreateClaimedAccountOp(username!, payload.newAccountName, payload.keys)\n : buildAccountCreateOp(username!, payload.newAccountName, payload.keys, payload.fee)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { parseAsset } from \"@/modules/core/utils\";\nimport { DynamicProps } from \"@/modules/core/types\";\nimport { FullAccount } from \"../types\";\nimport { calculateVPMana, calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\n\nconst HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24; // 5 days\nconst HIVE_100_PERCENT = 10000;\nconst HIVE_VOTE_DUST_THRESHOLD = 50_000_000;\n\nfunction getEffectiveVests(account: FullAccount): number {\n const vesting = parseAsset(account.vesting_shares).amount;\n const received = parseAsset(account.received_vesting_shares).amount;\n const delegated = parseAsset(account.delegated_vesting_shares).amount;\n const withdrawRate = parseAsset(account.vesting_withdraw_rate).amount;\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n\n return vesting + received - delegated - withdrawVests;\n}\n\nfunction vestsToRshares(vests: number, votingPowerValue: number, votePerc: number): number {\n const vestingShares = vests * 1e6;\n const power = (votingPowerValue * votePerc) / 1e4 / 50 + 1;\n return (power * vestingShares) / 1e4;\n}\n\nfunction hasStableVoteHardfork(dynamicProps: DynamicProps): boolean {\n if (Number.isFinite(dynamicProps.lastHardfork)) {\n return dynamicProps.lastHardfork >= 28;\n }\n\n const [major = \"0\", minor = \"0\"] = (dynamicProps.currentHardforkVersion ?? \"0.0.0\").split(\".\");\n return Number(major) > 1 || (Number(major) === 1 && Number(minor) >= 28);\n}\n\nfunction stableVoteRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n weight: number\n): number {\n const reserveRate =\n dynamicProps.votePowerReserveRate ||\n Number(dynamicProps.raw?.globalDynamic?.vote_power_reserve_rate ?? 0);\n\n if (!Number.isFinite(reserveRate) || reserveRate <= 0) {\n return 0;\n }\n\n const effectiveVests = getEffectiveVests(account);\n if (!Number.isFinite(effectiveVests) || effectiveVests <= 0) {\n return 0;\n }\n\n const vestingShares = effectiveVests * 1e6;\n const usedMana =\n Math.ceil(\n (vestingShares * weight * 60 * 60 * 24) /\n HIVE_100_PERCENT /\n (reserveRate * HIVE_VOTING_MANA_REGENERATION_SECONDS)\n );\n\n const mana = calculateVPMana(account);\n const currentMana = Math.min(mana.current_mana, mana.max_mana);\n\n if (!Number.isFinite(currentMana) || usedMana > currentMana) {\n return 0;\n }\n\n return Math.max(usedMana - HIVE_VOTE_DUST_THRESHOLD, 0);\n}\n\nexport function votingRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n\n if (hasStableVoteHardfork(dynamicProps)) {\n return stableVoteRshares(account, dynamicProps, weight);\n }\n\n let totalVests = 0;\n try {\n totalVests = getEffectiveVests(account);\n if (!Number.isFinite(totalVests)) {\n return 0;\n }\n } catch {\n return 0;\n }\n\n return vestsToRshares(totalVests, votingPowerValue, weight);\n}\n\nexport function votingPower(account: FullAccount): number {\n const calc = calculateVPMana(account);\n return calc.percentage / 100;\n}\n\nexport function powerRechargeTime(power: number) {\n if (!Number.isFinite(power)) {\n throw new TypeError(\"Voting power must be a finite number\");\n }\n if (power < 0 || power > 100) {\n throw new RangeError(\"Voting power must be between 0 and 100\");\n }\n const missingPower = 100 - power;\n return (\n (missingPower * 100 * HIVE_VOTING_MANA_REGENERATION_SECONDS) / 10000\n );\n}\n\nexport function downVotingPower(account: FullAccount): number {\n const totalShares =\n parseFloat(account.vesting_shares) +\n parseFloat(account.received_vesting_shares) -\n parseFloat(account.delegated_vesting_shares);\n const elapsed = Math.floor(Date.now() / 1000) - account.downvote_manabar.last_update_time;\n const maxMana = (totalShares * 1000000) / 4;\n\n if (maxMana <= 0) {\n return 0;\n }\n\n let currentMana =\n parseFloat(account.downvote_manabar.current_mana.toString()) +\n (elapsed * maxMana) / HIVE_VOTING_MANA_REGENERATION_SECONDS;\n\n if (currentMana > maxMana) {\n currentMana = maxMana;\n }\n const currentManaPerc = (currentMana * 100) / maxMana;\n\n if (isNaN(currentManaPerc)) {\n return 0;\n }\n\n if (currentManaPerc > 100) {\n return 100;\n }\n return currentManaPerc;\n}\n\nexport function rcPower(account: RCAccount): number {\n const calc = calculateRCMana(account);\n return calc.percentage / 100;\n}\n\nexport function votingValue(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n const { fundRecentClaims, fundRewardBalance, base, quote } = dynamicProps;\n\n if (\n !Number.isFinite(fundRecentClaims) ||\n !Number.isFinite(fundRewardBalance) ||\n !Number.isFinite(base) ||\n !Number.isFinite(quote)\n ) {\n return 0;\n }\n\n if (fundRecentClaims === 0 || quote === 0) {\n return 0;\n }\n\n const rShares = votingRshares(account, dynamicProps, votingPowerValue, weight);\n\n if (!Number.isFinite(rShares)) {\n return 0;\n }\n\n return (rShares / fundRecentClaims) * fundRewardBalance * (base / quote);\n}\n","import type { Operation } from \"../../hive-tx\";\n\n/**\n * Authority levels for Hive blockchain operations.\n * - posting: Social operations (voting, commenting, reblogging)\n * - active: Financial and account management operations\n * - owner: Critical security operations (key changes, account recovery)\n * - memo: Memo encryption/decryption (rarely used for signing)\n */\nexport type AuthorityLevel = 'posting' | 'active' | 'owner' | 'memo';\n\n/**\n * Maps operation types to their required authority level.\n *\n * This mapping is used to determine which key is needed to sign a transaction,\n * enabling smart auth fallback and auth upgrade UI.\n *\n * @remarks\n * - Most social operations (vote, comment, reblog) require posting authority\n * - Financial operations (transfer, withdraw) require active authority\n * - Account management operations require active authority\n * - Security operations (password change, account recovery) require owner authority\n * - custom_json requires dynamic detection based on required_auths vs required_posting_auths\n */\nexport const OPERATION_AUTHORITY_MAP: Record = {\n // Posting authority operations\n vote: 'posting',\n comment: 'posting',\n delete_comment: 'posting',\n comment_options: 'posting',\n claim_reward_balance: 'posting',\n\n // Active authority operations - Financial\n cancel_transfer_from_savings: 'active',\n collateralized_convert: 'active',\n convert: 'active',\n delegate_vesting_shares: 'active',\n recurrent_transfer: 'active',\n set_withdraw_vesting_route: 'active',\n transfer: 'active',\n transfer_from_savings: 'active',\n transfer_to_savings: 'active',\n transfer_to_vesting: 'active',\n withdraw_vesting: 'active',\n\n // Active authority operations - Market\n limit_order_create: 'active',\n limit_order_cancel: 'active',\n\n // Active authority operations - Account Management\n account_update: 'active',\n account_update2: 'active',\n claim_account: 'active',\n create_claimed_account: 'active',\n\n // Active authority operations - Governance\n account_witness_proxy: 'active',\n account_witness_vote: 'active',\n remove_proposal: 'active',\n update_proposal_votes: 'active',\n\n // Owner authority operations - Security & Account Recovery\n change_recovery_account: 'owner',\n request_account_recovery: 'owner',\n recover_account: 'owner',\n reset_account: 'owner',\n set_reset_account: 'owner',\n\n // Note: Some operations are handled separately via content inspection:\n // - custom_json: via getCustomJsonAuthority() - posting or active based on required_auths\n // - create_proposal/update_proposal: via getProposalAuthority() - typically active\n};\n\n/**\n * Determines authority required for a custom_json operation.\n *\n * Custom JSON operations can require either posting or active authority\n * depending on which field is populated:\n * - required_auths (active authority)\n * - required_posting_auths (posting authority)\n *\n * @param customJsonOp - The custom_json operation to inspect\n * @returns 'active' if requires active authority, 'posting' if requires posting authority\n *\n * @example\n * ```typescript\n * // Reblog operation (posting authority)\n * const reblogOp: Operation = ['custom_json', {\n * required_auths: [],\n * required_posting_auths: ['alice'],\n * id: 'reblog',\n * json: '...'\n * }];\n * getCustomJsonAuthority(reblogOp); // Returns 'posting'\n *\n * // Some active authority custom_json\n * const activeOp: Operation = ['custom_json', {\n * required_auths: ['alice'],\n * required_posting_auths: [],\n * id: 'some_active_op',\n * json: '...'\n * }];\n * getCustomJsonAuthority(activeOp); // Returns 'active'\n * ```\n */\nexport function getCustomJsonAuthority(customJsonOp: Operation): AuthorityLevel {\n const opType = customJsonOp[0];\n const payload = customJsonOp[1];\n\n if (opType !== 'custom_json') {\n throw new Error('Operation is not a custom_json operation');\n }\n\n // Type assertion for custom_json payload\n const customJson = payload as {\n required_auths?: string[];\n required_posting_auths?: string[];\n id: string;\n json: string;\n };\n\n // If required_auths is set and non-empty, needs active authority\n if (customJson.required_auths && customJson.required_auths.length > 0) {\n return 'active';\n }\n\n // If only required_posting_auths is set, needs posting authority\n if (customJson.required_posting_auths && customJson.required_posting_auths.length > 0) {\n return 'posting';\n }\n\n // Default to posting for custom_json (most common case)\n return 'posting';\n}\n\n/**\n * Determines authority required for a proposal operation.\n *\n * Proposal operations (create_proposal, update_proposal) typically require\n * active authority as they involve financial commitments and funding allocations.\n *\n * @param proposalOp - The proposal operation to inspect\n * @returns 'active' authority requirement\n *\n * @remarks\n * Unlike custom_json, proposal operations don't have explicit required_auths fields.\n * They always use the creator's authority, which defaults to active for financial\n * operations involving the DAO treasury.\n *\n * @example\n * ```typescript\n * const proposalOp: Operation = ['create_proposal', {\n * creator: 'alice',\n * receiver: 'bob',\n * subject: 'My Proposal',\n * permlink: 'my-proposal',\n * start: '2026-03-01T00:00:00',\n * end: '2026-04-01T00:00:00',\n * daily_pay: '100.000 HBD',\n * extensions: []\n * }];\n * getProposalAuthority(proposalOp); // Returns 'active'\n * ```\n */\nexport function getProposalAuthority(proposalOp: Operation): AuthorityLevel {\n const opType = proposalOp[0];\n\n if (opType !== 'create_proposal' && opType !== 'update_proposal') {\n throw new Error('Operation is not a proposal operation');\n }\n\n // Proposal operations require active authority for financial operations\n return 'active';\n}\n\n/**\n * Determines the required authority level for any operation.\n *\n * Uses the OPERATION_AUTHORITY_MAP for standard operations, and dynamic\n * detection for custom_json operations.\n *\n * @param op - The operation to check\n * @returns 'posting' or 'active' authority requirement\n *\n * @example\n * ```typescript\n * const voteOp: Operation = ['vote', { voter: 'alice', author: 'bob', permlink: 'post', weight: 10000 }];\n * getOperationAuthority(voteOp); // Returns 'posting'\n *\n * const transferOp: Operation = ['transfer', { from: 'alice', to: 'bob', amount: '1.000 HIVE', memo: '' }];\n * getOperationAuthority(transferOp); // Returns 'active'\n * ```\n */\nexport function getOperationAuthority(op: Operation): AuthorityLevel {\n const opType = op[0];\n\n // Special handling for custom_json - requires content inspection\n if (opType === 'custom_json') {\n return getCustomJsonAuthority(op);\n }\n\n // Special handling for proposal operations - requires content inspection\n if (opType === 'create_proposal' || opType === 'update_proposal') {\n return getProposalAuthority(op);\n }\n\n // Use mapping for standard operations, default to posting if unknown\n return OPERATION_AUTHORITY_MAP[opType] ?? 'posting';\n}\n\n/**\n * Determines the highest authority level required for a list of operations.\n *\n * Useful when broadcasting multiple operations together - the highest authority\n * level required by any operation determines what key is needed for the batch.\n *\n * Authority hierarchy: owner > active > posting > memo\n *\n * @param ops - Array of operations\n * @returns Highest authority level required ('owner', 'active', or 'posting')\n *\n * @example\n * ```typescript\n * const ops: Operation[] = [\n * ['vote', { ... }], // posting\n * ['comment', { ... }], // posting\n * ];\n * getRequiredAuthority(ops); // Returns 'posting'\n *\n * const mixedOps: Operation[] = [\n * ['comment', { ... }], // posting\n * ['transfer', { ... }], // active\n * ];\n * getRequiredAuthority(mixedOps); // Returns 'active'\n *\n * const securityOps: Operation[] = [\n * ['transfer', { ... }], // active\n * ['change_recovery_account', { ... }], // owner\n * ];\n * getRequiredAuthority(securityOps); // Returns 'owner'\n * ```\n */\nexport function getRequiredAuthority(ops: Operation[]): AuthorityLevel {\n let highestAuthority: AuthorityLevel = 'posting';\n\n for (const op of ops) {\n const authority = getOperationAuthority(op);\n\n // Owner is highest - return immediately\n if (authority === 'owner') {\n return 'owner';\n }\n\n // Active is higher than posting\n if (authority === 'active' && highestAuthority === 'posting') {\n highestAuthority = 'active';\n }\n\n // Memo is lowest (same level as posting)\n // If we see memo but only have posting, stick with posting\n }\n\n return highestAuthority;\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { isWif, broadcastOperations } from \"@/modules/core/hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useSignOperationByKey(username: string | undefined) {\n return useMutation({\n mutationKey: [\"operations\", \"sign\", username],\n mutationFn: ({\n operation,\n keyOrSeed,\n }: {\n operation: Operation;\n keyOrSeed: string;\n }) => {\n if (!username) {\n throw new Error(\"[Operations][Sign] – cannot sign op with anon user\");\n }\n\n let privateKey: PrivateKey;\n if (keyOrSeed.split(\" \").length === 12) {\n privateKey = PrivateKey.fromLogin(username, keyOrSeed, \"active\");\n } else if (isWif(keyOrSeed)) {\n privateKey = PrivateKey.fromString(keyOrSeed);\n } else {\n privateKey = PrivateKey.from(keyOrSeed);\n }\n\n return broadcastOperations(\n [operation],\n privateKey\n );\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AuthContext } from \"@/modules/core/types\";\n\nexport function useSignOperationByKeychain(\n username: string | undefined,\n auth?: AuthContext,\n keyType: \"owner\" | \"active\" | \"posting\" | \"memo\" = \"active\"\n) {\n return useMutation({\n mutationKey: [\"operations\", \"sign-keychain\", username],\n mutationFn: ({ operation }: { operation: Operation }) => {\n if (!username) {\n throw new Error(\n \"[SDK][Keychain] – cannot sign operation with anon user\"\n );\n }\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Keychain] – missing keychain broadcaster\");\n }\n\n return auth.broadcast([operation], keyType);\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function useSignOperationByHivesigner(callbackUri = \"/\") {\n return useMutation({\n mutationKey: [\"operations\", \"sign-hivesigner\", callbackUri],\n mutationFn: async ({ operation }: { operation: Operation }) => {\n return hs.sendOperation(operation, { callback: callbackUri }, () => {});\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getChainPropertiesQueryOptions() {\n return queryOptions({\n queryKey: [\"operations\", \"chain-properties\"],\n queryFn: async () => {\n return await callRPC(\"condenser_api.get_chain_properties\", []);\n },\n });\n}\n","import { Fragment } from \"../types\";\n\n/**\n * Build the cache entry for an edited fragment.\n *\n * The `/private-api/fragments-update` endpoint returns only a minimal\n * acknowledgement, not the full fragment. Writing that response straight into\n * the query cache blanked out the edited snippet (the reported bug), so the\n * updated record is built from the values the user actually submitted, merged\n * over whatever fields the response does carry, on top of the existing cached\n * fragment (preserving id/created).\n */\nexport function applyFragmentUpdate(\n existing: Fragment,\n response: Partial | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...existing,\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n };\n}\n\n/**\n * Build the cache entry for a newly added fragment. Reaffirms the submitted\n * title/body over the server acknowledgement so a fresh snippet never renders\n * blank if the response omits them, while keeping any server-provided\n * id/timestamps.\n */\nexport function buildAddedFragment(\n response: Fragment | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n } as Fragment;\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { buildAddedFragment } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAddFragment(username: string, code: string | undefined) {\n return useMutation({\n mutationKey: [\"posts\", \"add-fragment\", username],\n mutationFn: async ({ title, body }: { title: string; body: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-add\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and insert a bogus fragment into the cache. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to add fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // Reaffirm the submitted title/body over the server acknowledgement so a\n // freshly added snippet never renders blank if the response omits them,\n // while keeping any server-provided id/timestamps.\n const newFragment = buildAddedFragment(response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [newFragment, ...(data ?? [])]\n );\n\n // Update infinite query cache - add new fragment to first page\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page, index) =>\n index === 0\n ? { ...page, data: [newFragment, ...page.data] }\n : page\n ),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { applyFragmentUpdate } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useEditFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"edit-fragment\", username],\n mutationFn: async ({\n fragmentId,\n title,\n body\n }: {\n fragmentId: string;\n title: string;\n body: string;\n }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-update\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and overwrite the cached fragment with bogus data. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to update fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // The /fragments-update endpoint returns a minimal acknowledgement, not the\n // full fragment, so writing the raw response into the cache blanked out the\n // edited snippet. Rebuild the fragment from the submitted values instead.\n const applyUpdate = (fragment: Fragment): Fragment =>\n applyFragmentUpdate(fragment, response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) =>\n data?.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ) ?? []\n );\n\n // Update infinite query cache - update fragment in all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useRemoveFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"remove-fragment\", username],\n mutationFn: async ({ fragmentId }: { fragmentId: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/fragments-delete\", {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // getBoundFetch returns the raw fetch, so a 401/403/500 resolves rather than\n // rejects. Without this guard onSuccess would run and strip the fragment from\n // cache on a failed delete (false success). Throw so onError fires instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to delete fragment: ${response.status}`);\n }\n\n return response;\n },\n onSuccess(_data, variables) {\n const queryClient = getQueryClient();\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [...(data ?? [])].filter(({ id }) => id !== variables.fragmentId)\n );\n\n // Update infinite query cache - remove fragment from all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((fragment) => fragment.id !== variables.fragmentId),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { ApiNotification, ApiNotificationSetting } from \"@/modules/notifications\";\nimport { Draft, DraftMetadata } from \"@/modules/posts/types/draft\";\nimport { Schedule } from \"@/modules/posts/types/schedule\";\nimport { ApiResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n if (!response.ok) {\n let errorData: unknown = undefined;\n try {\n errorData = await response.json();\n } catch {\n errorData = undefined;\n }\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = errorData;\n throw error;\n }\n\n // Handle empty responses gracefully (e.g., 204 No Content or empty body)\n const text = await response.text();\n if (!text || text.trim() === \"\") {\n return \"\" as T;\n }\n\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n // If JSON parsing fails, return empty string as fallback\n console.warn(\"[SDK] Failed to parse JSON response:\", e, \"Response:\", text);\n return \"\" as T;\n }\n}\n\nexport async function signUp(\n username: string,\n email: string,\n referral: string,\n captchaToken?: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/account-create\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, email, referral, captcha_token: captchaToken }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function subscribeEmail(\n email: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/subscribe\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function usrActivity(\n code: string | undefined,\n ty: number,\n bl: string | number = \"\",\n tx: string | number = \"\"\n): Promise {\n const params: {\n code: string | undefined;\n ty: number;\n bl?: string | number;\n tx?: string | number;\n } = { code, ty };\n\n if (bl) {\n params.bl = bl;\n }\n if (tx) {\n params.tx = tx;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/usr-activity\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(params),\n });\n\n await parseJsonResponse(response);\n}\n\nexport async function getNotifications(\n code: string | undefined,\n filter: string | null,\n since: string | null = null,\n user: string | null = null\n): Promise {\n const data: { code: string | undefined; filter?: string; since?: string; user?: string } = {\n code,\n };\n\n if (filter) {\n data.filter = filter;\n }\n\n if (since) {\n data.since = since;\n }\n\n if (user) {\n data.user = user;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function saveNotificationSetting(\n code: string | undefined,\n username: string,\n system: string,\n allows_notify: number,\n notify_types: number[],\n token: string\n): Promise {\n const data = {\n code,\n username,\n token,\n system,\n allows_notify,\n notify_types,\n };\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/register-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getNotificationSetting(\n code: string | undefined,\n username: string,\n token: string\n): Promise {\n const data = { code, username, token };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/detail-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function markNotifications(\n code: string | undefined,\n id?: string\n): Promise> {\n const data: { code: string | undefined; id?: string } = {\n code,\n };\n if (id) {\n data.id = id;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications/mark\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addImage(code: string | undefined, url: string): Promise> {\n const data = { code, url };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\n// Upload always targets the canonical Ecency image server, even when\n// the user has changed their viewing proxy (e.g. images.hive.blog).\n// i.ecency.com is the same imagehoster endpoint as images.ecency.com\n// (identical backend / token validation); it is the canonical host\n// because some ISPs SNI-filter the images.ecency.com hostname.\nconst UPLOAD_HOST = \"https://i.ecency.com\";\n\nexport async function uploadImage(\n file: File,\n token: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${UPLOAD_HOST}/hs/${token}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\n/**\n * Upload image using posting key signature (/:username/:signature path).\n * Works with any compatible image server (images.ecency.com, images.hive.blog).\n * The signature is sha256(\"ImageSigningChallenge\" + fileData) signed with the posting key.\n */\nexport async function uploadImageWithSignature(\n file: File,\n username: string,\n signature: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${CONFIG.imageHost}/${username}/${signature}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\nexport async function deleteImage(\n code: string | undefined,\n imageId: string\n): Promise> {\n const data = { code, id: imageId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addDraft(\n code: string | undefined,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function updateDraft(\n code: string | undefined,\n draftId: string,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, id: draftId, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-update\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function deleteDraft(\n code: string | undefined,\n draftId: string\n): Promise> {\n const data = { code, id: draftId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addSchedule(\n code: string | undefined,\n permlink: string,\n title: string,\n body: string,\n meta: Record,\n options: Record | null,\n schedule: string,\n reblog: boolean\n): Promise> {\n const data: Record = {\n code,\n permlink,\n title,\n body,\n meta,\n schedule,\n reblog,\n };\n\n if (options) {\n data.options = options;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function deleteSchedule(\n code: string | undefined,\n id: string\n): Promise> {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function moveSchedule(code: string | undefined, id: string): Promise {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-move\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getPromotedPost(\n code: string | undefined,\n author: string,\n permlink: string\n): Promise<{ author: string; permlink: string } | \"\"> {\n const data = { code, author, permlink };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/promoted-post\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ author: string; permlink: string } | \"\">(response);\n}\n\nexport async function onboardEmail(\n username: string,\n email: string,\n friend: string\n): Promise> {\n const dataBody = {\n username,\n email,\n friend,\n };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/account-create-friend\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(dataBody),\n }\n );\n\n return parseJsonResponse>(response);\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useAddDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"add\", username],\n mutationFn: async ({\n title,\n body,\n tags,\n meta,\n }: {\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addDraft\");\n }\n return addDraft(code, title, body, tags, meta);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full drafts list from the response (API returns complete list)\n if (data?.drafts) {\n qc.setQueryData(QueryKeys.posts.drafts(username), data.drafts);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n }\n // Also invalidate the infinite query so the drafts list refetches\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { updateDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useUpdateDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"update\", username],\n mutationFn: async ({\n draftId,\n title,\n body,\n tags,\n meta,\n }: {\n draftId: string;\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for updateDraft\");\n }\n return updateDraft(code, draftId, title, body, tags, meta);\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteDraft } from \"@/modules/private-api/requests\";\nimport type { Draft } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useDeleteDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"delete\", username],\n mutationFn: async ({ draftId }: { draftId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteDraft\");\n }\n return deleteDraft(code, draftId);\n },\n onMutate: async ({ draftId }) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.posts.drafts(username);\n const infinitePrefix = QueryKeys.posts.draftsInfinite(username);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((d) => d._id !== draftId)\n );\n }\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((d) => d._id !== draftId),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite };\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError: (err, _variables, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.posts.drafts(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n onError?.(err);\n },\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addSchedule } from \"@/modules/private-api/requests\";\n\nexport function useAddSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"add\", username],\n mutationFn: async ({\n permlink,\n title,\n body,\n meta,\n options,\n schedule,\n reblog,\n }: {\n permlink: string;\n title: string;\n body: string;\n meta: Record;\n options: Record | null;\n schedule: string;\n reblog: boolean;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addSchedule\");\n }\n return addSchedule(code, permlink, title, body, meta, options, schedule, reblog);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.schedules(username),\n });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteSchedule } from \"@/modules/private-api/requests\";\n\nexport function useDeleteSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"delete\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteSchedule\");\n }\n return deleteSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { moveSchedule } from \"@/modules/private-api/requests\";\n\nexport function useMoveSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"move\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for moveSchedule\");\n }\n return moveSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n // Also invalidate drafts since moving a schedule creates a draft\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to add an image URL to the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful addition\n * @param onError - Optional callback on error\n *\n * @example\n * const addImageMutation = useAddImage(username, code);\n * addImageMutation.mutate({ url: 'https://...' });\n */\nexport function useAddImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"add\", username],\n mutationFn: async ({ url, code: nextCode }: { url: string; code?: string }) => {\n const effectiveCode = nextCode ?? code;\n\n if (!username || !effectiveCode) {\n throw new Error(\"[SDK][Posts] – missing auth for addImage\");\n }\n return addImage(effectiveCode, url);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.images(username),\n });\n },\n onError,\n });\n}\n","import { useMutation, type InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport { deleteImage } from \"@/modules/private-api/requests\";\nimport type { UserImage } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\n/**\n * Hook to delete an image from the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful deletion\n * @param onError - Optional callback on error\n *\n * @example\n * const deleteImageMutation = useDeleteImage(username, code);\n * deleteImageMutation.mutate({ imageId: '123' });\n */\nexport function useDeleteImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"delete\", username],\n mutationFn: async ({ imageId }: { imageId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteImage\");\n }\n return deleteImage(code, imageId);\n },\n onSuccess: (_data, variables) => {\n onSuccess?.();\n const qc = getQueryClient();\n const { imageId } = variables;\n\n // Optimistic removal from regular cache\n qc.setQueryData(\n [\"posts\", \"images\", username],\n (prev) => prev?.filter((img) => img._id !== imageId)\n );\n\n // Optimistic removal from infinite cache pages\n qc.setQueriesData>>(\n { queryKey: [\"posts\", \"images\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((img) => img._id !== imageId),\n })),\n };\n }\n );\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { uploadImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to upload an image file to Ecency image hosting\n *\n * @param onSuccess - Optional callback on successful upload, receives { url: string }\n * @param onError - Optional callback on error\n *\n * Note: This hook uploads to Ecency's image server and requires a signature token.\n * The token should be generated using the user's posting key signature.\n *\n * @example\n * const uploadMutation = useUploadImage(\n * (data) => console.log('Uploaded:', data.url)\n * );\n * uploadMutation.mutate({ file, token });\n */\nexport function useUploadImage(\n onSuccess?: (data: { url: string }) => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"upload\"],\n mutationFn: async ({\n file,\n token,\n signal,\n }: {\n file: File;\n token: string;\n signal?: AbortSignal;\n }) => {\n return uploadImage(file, token, signal);\n },\n onSuccess,\n onError,\n });\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry, EntryVote } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nfunction makeEntryPath(author: string, permlink: string) {\n return `/@${author}/${permlink}`;\n}\n\nfunction getEntryFromCache(\n author: string,\n permlink: string,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n return queryClient.getQueryData(\n QueryKeys.posts.entry(makeEntryPath(author, permlink))\n );\n}\n\nfunction setEntryInCache(entry: Entry, qc?: QueryClient) {\n const queryClient = qc ?? getQueryClient();\n queryClient.setQueryData(\n QueryKeys.posts.entry(makeEntryPath(entry.author, entry.permlink)),\n entry\n );\n}\n\nfunction mutateEntry(\n author: string,\n permlink: string,\n updater: (entry: Entry) => Entry,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = makeEntryPath(author, permlink);\n const existing = queryClient.getQueryData(QueryKeys.posts.entry(path));\n if (!existing) return undefined;\n\n const updated = updater(existing);\n queryClient.setQueryData(QueryKeys.posts.entry(path), updated);\n return existing;\n}\n\n/**\n * SDK-level entry cache utilities. These operate on SDK cache keys\n * ([\"posts\", \"entry\", \"/@author/permlink\"]).\n *\n * Web layer can bridge these to its own QueryIdentifiers.ENTRY keys\n * during the migration period.\n */\nexport namespace EntriesCacheManagement {\n export function updateVotes(\n author: string,\n permlink: string,\n votes: EntryVote[],\n payout: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n active_votes: votes,\n stats: {\n ...(entry.stats || {\n gray: false,\n hide: false,\n flag_weight: 0,\n total_votes: 0,\n }),\n total_votes: votes.length,\n flag_weight: entry.stats?.flag_weight || 0,\n },\n total_votes: votes.length,\n payout,\n pending_payout_value: String(payout),\n }),\n qc\n );\n }\n\n export function updateReblogsCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n reblogs: count,\n }),\n qc\n );\n }\n\n export function updateRepliesCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n children: count,\n }),\n qc\n );\n }\n\n export function addReply(\n reply: Entry,\n parentAuthor: string,\n parentPermlink: string,\n qc?: QueryClient\n ) {\n mutateEntry(\n parentAuthor,\n parentPermlink,\n (entry) => ({\n ...entry,\n children: entry.children + 1,\n replies: [reply, ...entry.replies],\n }),\n qc\n );\n }\n\n export function updateEntries(entries: Entry[], qc?: QueryClient) {\n entries.forEach((entry) => setEntryInCache(entry, qc));\n }\n\n export function invalidateEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ) {\n const queryClient = qc ?? getQueryClient();\n queryClient.invalidateQueries({\n queryKey: QueryKeys.posts.entry(makeEntryPath(author, permlink)),\n });\n }\n\n export function getEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ): Entry | undefined {\n return getEntryFromCache(author, permlink, qc);\n }\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Whether the cached active_votes list already reflects the broadcast vote:\n * the voter is present for a vote (weight !== 0) or absent for an unvote\n * (weight === 0). Used to avoid stacking the SDK's post-broadcast optimistic\n * update on top of a platform-level optimistic update applied at press time.\n */\nexport function isVoteAlreadyReflected(\n activeVotes: Array<{ voter: string }>,\n voter: string | undefined,\n weight: number\n): boolean {\n const hasVoterRecord = activeVotes.some((v) => v.voter === voter);\n return weight !== 0 ? hasVoterRecord : !hasVoterRecord;\n}\n\n/**\n * Payload for voting on a post or comment.\n */\nexport interface VotePayload {\n /** Author of the post/comment to vote on */\n author: string;\n /** Permlink of the post/comment to vote on */\n permlink: string;\n /** Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote) */\n weight: number;\n /** Optional estimated payout change for optimistic UI */\n estimated?: number;\n}\n\n/**\n * Post-broadcast optimistic cache update for a vote: replaces the voter's\n * active_votes record and bumps the payout by `estimated`. Skipped when the\n * cached entry already reflects this vote (voter present for a vote, absent\n * for an unvote): platforms with their own at-press optimistic layer (e.g.\n * the mobile app) have applied it by the time the broadcast resolves, and\n * stacking a second update here double-counts the payout and clobbers the\n * platform's richer vote record until the deferred invalidation.\n */\nexport function applyVoteCacheUpdate(\n username: string | undefined,\n variables: VotePayload,\n qc?: QueryClient\n): void {\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink, qc);\n if (\n !entry?.active_votes ||\n isVoteAlreadyReflected(entry.active_votes, username, variables.weight)\n ) {\n return;\n }\n const newVotes = [\n ...entry.active_votes.filter((v) => v.voter !== username),\n ...(variables.weight !== 0 ? [{ rshares: variables.weight, voter: username! }] : [])\n ];\n const newPayout = entry.payout + (variables.estimated ?? 0);\n EntriesCacheManagement.updateVotes(\n variables.author,\n variables.permlink,\n newVotes,\n newPayout,\n qc\n );\n}\n\n/**\n * React Query mutation hook for voting on posts and comments.\n *\n * This mutation broadcasts a vote operation to the Hive blockchain,\n * supporting upvotes (positive weight) and downvotes (negative weight).\n *\n * @param username - The username of the voter (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 120) if adapter.recordActivity is available\n * - Invalidates post cache to refetch updated vote data\n * - Invalidates voting power cache to show updated VP\n *\n * **Vote Weight:**\n * - 10000 = 100% upvote\n * - 0 = remove vote\n * - -10000 = 100% downvote\n *\n * @example\n * ```typescript\n * const voteMutation = useVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Upvote a post\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 10000\n * });\n *\n * // Remove vote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 0\n * });\n *\n * // Downvote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: -10000\n * });\n * ```\n *\n * @remarks\n * broadcastMode: async — Votes don't require block confirmation.\n * The vote is accepted into the mempool immediately; UI can optimistically update.\n */\nexport function useVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"vote\"],\n username,\n ({ author, permlink, weight }) => [\n buildVoteOp(username!, author, permlink, weight)\n ],\n async (result: any, variables) => {\n // Optimistic vote list + payout update (no-op when the cache already\n // reflects this vote — see applyVoteCacheUpdate).\n applyVoteCacheUpdate(username, variables);\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(120, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n if (auth?.adapter?.invalidateQueries) {\n const doInvalidate = () => {\n auth.adapter!.invalidateQueries!([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.accounts.full(username)\n ]);\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(doInvalidate, 4000);\n } else {\n doInvalidate();\n }\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildReblogOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Payload for reblogging a post.\n */\nexport interface ReblogPayload {\n /** Original post author */\n author: string;\n /** Original post permlink */\n permlink: string;\n /** If true, removes the reblog instead of creating it */\n deleteReblog?: boolean;\n}\n\n/**\n * React Query mutation hook for reblogging posts.\n *\n * This mutation broadcasts a custom_json operation to reblog (or un-reblog)\n * a post to the user's blog feed.\n *\n * @param username - The username performing the reblog (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 130) if adapter.recordActivity is available\n * - Invalidates blog feed cache to show the reblogged post\n * - Invalidates post cache to update reblog status\n *\n * **Reblog vs Delete:**\n * - deleteReblog: false (default) - Creates a reblog\n * - deleteReblog: true - Removes an existing reblog\n *\n * @example\n * ```typescript\n * const reblogMutation = useReblog(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Reblog a post\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post'\n * });\n *\n * // Remove a reblog\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * deleteReblog: true\n * });\n * ```\n */\nexport function useReblog(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"reblog\"],\n username,\n ({ author, permlink, deleteReblog }) => [\n buildReblogOp(username!, author, permlink, deleteReblog ?? false)\n ],\n async (result: any, variables) => {\n // Optimistic reblog count update\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink);\n if (entry) {\n const newCount = Math.max(0, (entry.reblogs ?? 0) + (variables.deleteReblog ? -1 : 1));\n EntriesCacheManagement.updateReblogsCount(variables.author, variables.permlink, newCount);\n }\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(130, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n const invalidate = () => {\n const qc = getQueryClient();\n qc.invalidateQueries({\n queryKey: QueryKeys.posts.accountPostsBlogPrefix(username!),\n });\n if (auth?.adapter?.invalidateQueries) {\n auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.posts.rebloggedBy(variables.author, variables.permlink),\n ]);\n }\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(invalidate, 4000);\n } else {\n invalidate();\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Beneficiary account and weight.\n */\nexport interface Beneficiary {\n /** Beneficiary account name */\n account: string;\n /** Beneficiary weight (10000 = 100%) */\n weight: number;\n}\n\n/**\n * Payload for creating a comment or post.\n */\nexport interface CommentPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post */\n permlink: string;\n /** Parent author (empty string for top-level posts) */\n parentAuthor: string;\n /** Parent permlink (category/tag for top-level posts) */\n parentPermlink: string;\n /** Title of the post (empty for comments) */\n title: string;\n /** Content body */\n body: string;\n /** JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for creating posts and comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to create a new post or reply on the Hive blockchain.\n *\n * @param username - The username creating the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 100 for posts, 110 for comments) if adapter.recordActivity is available\n * - Invalidates feed caches to show the new content\n * - Invalidates parent post cache if this is a reply\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Post vs Comment:**\n * - Post: parentAuthor = \"\", parentPermlink = category/tag\n * - Comment: parentAuthor = parent author, parentPermlink = parent permlink\n *\n * @example\n * ```typescript\n * const commentMutation = useComment(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a post\n * commentMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post-20260209',\n * parentAuthor: '',\n * parentPermlink: 'technology',\n * title: 'My Awesome Post',\n * body: 'This is the post content...',\n * jsonMetadata: {\n * tags: ['technology', 'hive'],\n * app: 'ecency/3.0.0'\n * },\n * options: {\n * beneficiaries: [\n * { account: 'ecency', weight: 500 }\n * ]\n * }\n * });\n *\n * // Create a comment\n * commentMutation.mutate({\n * author: 'bob',\n * permlink: 're-alice-my-awesome-post-20260209',\n * parentAuthor: 'alice',\n * parentPermlink: 'my-awesome-post-20260209',\n * title: '',\n * body: 'Great post!',\n * jsonMetadata: { app: 'ecency/3.0.0' }\n * });\n * ```\n */\nexport function useComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"comment\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (result: any, variables) => {\n // Determine if this is a post or comment\n const isPost = !variables.parentAuthor;\n const activityType = isPost ? 100 : 110;\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(activityType, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation (always runs regardless of recordActivity outcome)\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (!isPost) {\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * Adds an optimistic entry to all discussions caches for the given root post.\n * Uses predicate matching to find all sort order variants.\n */\nexport function addOptimisticDiscussionEntry(\n entry: Entry,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n queryClient.setQueryData(queryKey, [entry, ...data]);\n }\n }\n}\n\n/**\n * Removes an entry from all discussions caches for the given root post.\n * Returns the previous state for rollback.\n */\nexport function removeOptimisticDiscussionEntry(\n author: string,\n permlink: string,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n): Map {\n const queryClient = qc ?? getQueryClient();\n const snapshots = new Map();\n\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n snapshots.set(queryKey, data);\n queryClient.setQueryData(\n queryKey,\n data.filter(\n (e) => e.author !== author || e.permlink !== permlink\n )\n );\n }\n }\n\n return snapshots;\n}\n\n/**\n * Restores discussion cache snapshots (for rollback on error).\n */\nexport function restoreDiscussionSnapshots(\n snapshots: Map,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n for (const [queryKey, data] of snapshots) {\n queryClient.setQueryData(queryKey, data);\n }\n}\n\n/**\n * Updates a specific entry in the SDK entry cache.\n * Returns the previous entry for rollback.\n */\nexport function updateEntryInCache(\n author: string,\n permlink: string,\n updates: Partial,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n const previous = queryClient.getQueryData(QueryKeys.posts.entry(path));\n\n if (previous) {\n queryClient.setQueryData(QueryKeys.posts.entry(path), {\n ...previous,\n ...updates,\n });\n }\n\n return previous;\n}\n\n/**\n * Restores an entry in cache (for rollback on error).\n */\nexport function restoreEntryInCache(\n author: string,\n permlink: string,\n entry: Entry,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n queryClient.setQueryData(QueryKeys.posts.entry(path), entry);\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDeleteCommentOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport {\n removeOptimisticDiscussionEntry,\n restoreDiscussionSnapshots,\n} from \"../cache/discussions-cache-utils\";\nimport type { Entry } from \"../types\";\n\n/**\n * Payload for deleting a comment or post.\n */\nexport interface DeleteCommentPayload {\n /** Author of the comment/post to delete */\n author: string;\n /** Permlink of the comment/post to delete */\n permlink: string;\n /** Optional: Parent author (for cache invalidation of discussions) */\n parentAuthor?: string;\n /** Optional: Parent permlink (for cache invalidation of discussions) */\n parentPermlink?: string;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n}\n\n/**\n * React Query mutation hook for deleting posts and comments.\n *\n * This mutation broadcasts a delete_comment operation to the Hive blockchain.\n * Includes optimistic removal from discussions cache with rollback on error.\n *\n * @param username - The username deleting the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n */\nexport function useDeleteComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"deleteComment\"],\n username,\n ({ author, permlink }) => [\n buildDeleteCommentOp(author, permlink)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (variables.parentAuthor && variables.parentPermlink) {\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n {\n broadcastMode,\n // Optimistic removal: remove from discussions cache before broadcast\n onMutate: async (variables) => {\n const rootAuthor = variables.rootAuthor || variables.parentAuthor;\n const rootPermlink = variables.rootPermlink || variables.parentPermlink;\n\n if (rootAuthor && rootPermlink) {\n const snapshots = removeOptimisticDiscussionEntry(\n variables.author,\n variables.permlink,\n rootAuthor,\n rootPermlink\n );\n return { snapshots };\n }\n return {};\n },\n // Rollback on error: restore discussions cache\n onError: (_error, _variables, context) => {\n const { snapshots } = (context as { snapshots?: Map }) ?? {};\n if (snapshots) {\n restoreDiscussionSnapshots(snapshots);\n }\n },\n }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Payload for creating a cross-post.\n */\nexport interface CrossPostPayload {\n /** Author of the cross-post (current user) */\n author: string;\n /** Permlink of the cross-post (usually: original-permlink-community-id) */\n permlink: string;\n /** Community ID to cross-post to (used as parent_permlink) */\n parentPermlink: string;\n /** Title of the cross-post (same as original) */\n title: string;\n /** Body of the cross-post (includes reference to original) */\n body: string;\n /** JSON metadata (must include original_author, original_permlink, tags, app) */\n jsonMetadata: Record;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"0.000 HBD\" for declined payout) */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n };\n}\n\n/**\n * React Query mutation hook for creating cross-posts.\n *\n * A cross-post is a special type of post that references an original post\n * and publishes it to a different community.\n *\n * @param username - The username creating the cross-post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates feed/blog caches to show the new cross-post\n *\n * **Operations:**\n * - Always includes a comment operation (with empty parent_author for top-level post)\n * - Optionally includes comment_options operation for rewards/beneficiaries\n *\n * **Metadata Requirements:**\n * The jsonMetadata must include:\n * - `original_author`: Author of the original post\n * - `original_permlink`: Permlink of the original post\n * - `tags`: Tags for the cross-post (typically [\"cross-post\"])\n * - `app`: Application identifier (e.g., \"ecency/3.0.0-vision\")\n *\n * @example\n * ```typescript\n * const crossPostMutation = useCrossPost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a cross-post\n * crossPostMutation.mutate({\n * author: 'alice',\n * permlink: 'great-post-hive-123456',\n * parentPermlink: 'hive-123456', // community ID\n * title: 'Great Post',\n * body: 'This is a cross post of [@bob/great-post](/technology/@bob/great-post) by @alice.

Check this out!',\n * jsonMetadata: {\n * app: 'ecency/3.0.0-vision',\n * tags: ['cross-post'],\n * original_author: 'bob',\n * original_permlink: 'great-post'\n * },\n * options: {\n * maxAcceptedPayout: '0.000 HBD',\n * allowCurationRewards: false\n * }\n * });\n * ```\n */\nexport function useCrossPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"cross-post\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (empty parent_author for top-level post)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n \"\", // empty parent_author for top-level post\n payload.parentPermlink, // community ID\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n } = payload.options;\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n [] // No beneficiaries for cross-posts\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n // Invalidate target community feed so cross-post appears\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.parentPermlink\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\nimport type { Beneficiary } from \"./use-comment\";\n\n/**\n * Payload for updating a reply/comment.\n */\nexport interface UpdateReplyPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post being updated */\n permlink: string;\n /** Parent author */\n parentAuthor: string;\n /** Parent permlink */\n parentPermlink: string;\n /** Title (empty for comments) */\n title: string;\n /** Updated content body */\n body: string;\n /** Updated JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for updating existing replies/comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to update an existing reply/comment on the Hive blockchain.\n *\n * @param username - The username updating the comment (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates parent post cache to reflect the updated comment\n * - Invalidates discussions cache (all sort orders)\n * - Invalidates RC cache (RC decreases after updating)\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Important:**\n * - Updates use the same comment operation as creating new comments\n * - The blockchain identifies this as an update based on matching author/permlink\n * - Only the author can update their own content\n * - Content can only be updated before payout (within 7 days)\n *\n * @example\n * ```typescript\n * const updateReplyMutation = useUpdateReply(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update a reply\n * updateReplyMutation.mutate({\n * author: 'alice',\n * permlink: 're-bob-my-post-20260209',\n * parentAuthor: 'bob',\n * parentPermlink: 'my-post-20260209',\n * title: '',\n * body: 'Updated comment content!',\n * jsonMetadata: {\n * tags: ['comment'],\n * app: 'ecency/3.0.0-vision'\n * },\n * rootAuthor: 'bob',\n * rootPermlink: 'my-post-20260209'\n * });\n * ```\n */\nexport function useUpdateReply(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"update-reply\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (same operation for create and update)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = _result?.id ?? _result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(110, txId, _result?.block_num).catch((error) => {\n console.debug(\"[SDK][Posts][useUpdateReply] recordActivity failed\", {\n activityType: 110,\n blockNum: _result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPromoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for promoting a post using Ecency Points.\n */\nexport interface PromotePayload {\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Promotion duration in days */\n duration: number;\n}\n\n/**\n * React Query mutation hook for promoting posts.\n *\n * This mutation broadcasts a custom_json operation to promote a post\n * using Ecency Points. The post will appear in promoted feeds for the\n * specified duration.\n *\n * @param username - The username promoting the post (required for broadcast, deducts points from this user)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates promoted posts cache to show newly promoted content\n * - Invalidates user points balance\n * - Invalidates post cache to update promotion status\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_promote\"\n * - JSON: {\"user\": \"username\", \"author\": \"postauthor\", \"permlink\": \"postpermlink\", \"duration\": 7}\n * - Authority: Active key (required for point spending)\n *\n * **Cost:**\n * - Costs Ecency Points based on duration\n * - User must have sufficient points balance\n *\n * @example\n * ```typescript\n * const promoteMutation = usePromote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Promote a post for 7 days\n * promoteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-great-post',\n * duration: 7\n * });\n * ```\n */\nexport function usePromote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"ecency\", \"promote\"],\n username,\n ({ author, permlink, duration }) => [\n buildPromoteOp(username!, author, permlink, duration)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate promoted posts feed\n [...QueryKeys.posts._promotedPrefix],\n // Invalidate user points balance\n [...QueryKeys.points._prefix(username!)],\n // Invalidate specific post cache to update promotion status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport type ValidatePostCreatingOptions = {\n delays?: number[];\n};\n\nconst DEFAULT_VALIDATE_POST_DELAYS = [3000, 3000, 3000];\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function getContent(author: string, permlink: string): Promise {\n return callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise;\n}\n\nexport async function validatePostCreating(\n author: string,\n permlink: string,\n attempts = 0,\n options?: ValidatePostCreatingOptions\n) {\n const delays = options?.delays ?? DEFAULT_VALIDATE_POST_DELAYS;\n\n let response: Entry | undefined;\n try {\n response = await getContent(author, permlink);\n } catch (e) {\n response = undefined;\n }\n\n if (response || attempts >= delays.length) {\n return;\n }\n\n const waitMs = delays[attempts];\n if (waitMs > 0) {\n await delay(waitMs);\n }\n\n return validatePostCreating(author, permlink, attempts + 1, options);\n}\n","export * from \"./use-record-activity\";\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ntype ActivityType =\n // Editor related\n | \"post-created\"\n | \"post-updated\"\n | \"post-scheduled\"\n | \"draft-created\"\n | \"video-published\"\n\n // Legacy editor related\n | \"legacy-post-created\"\n | \"legacy-post-updated\"\n | \"legacy-post-scheduled\"\n | \"legacy-draft-created\"\n | \"legacy-video-published\"\n\n // Perks related\n | \"perks-points-by-qr\"\n | \"perks-account-boost\"\n | \"perks-promote\"\n | \"perks-boost-plus\"\n | \"points-claimed\"\n | \"spin-rolled\"\n\n // Signup related\n | \"signed-up-with-wallets\"\n | \"signed-up-with-email\";\n\nexport interface RecordActivityOptions {\n url?: string;\n domain?: string;\n}\n\n/**\n * Get current location info safely (works in browser and Node.js)\n * Returns empty strings in non-browser environments\n */\nfunction getLocationInfo(): { url: string; domain: string } {\n if (typeof window !== \"undefined\" && window.location) {\n return {\n url: window.location.href,\n domain: window.location.host,\n };\n }\n return { url: \"\", domain: \"\" };\n}\n\nexport function useRecordActivity(\n username: string | undefined,\n activityType: ActivityType,\n options?: RecordActivityOptions\n) {\n return useMutation({\n mutationKey: [\"analytics\", activityType],\n mutationFn: async () => {\n if (!activityType) {\n throw new Error(\"[SDK][Analytics] – no activity type provided\");\n }\n const fetchApi = getBoundFetch();\n\n // Use provided values or auto-detect from browser environment\n // Falls back to empty strings in non-browser environments (Node.js, React Native, etc.)\n const locationInfo = getLocationInfo();\n const url = options?.url ?? locationInfo.url;\n const domain = options?.domain ?? locationInfo.domain;\n\n try {\n await fetchApi(CONFIG.plausibleHost + \"/api/event\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: activityType,\n url,\n domain,\n props: {\n username,\n },\n }),\n });\n } catch {\n // Analytics is fire-and-forget - network failures, ad blockers,\n // and CORS issues should not bubble up as user-facing errors\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { LeaderBoardDuration, LeaderBoardItem } from \"../types\";\n\nexport function getDiscoverLeaderboardQueryOptions(duration: LeaderBoardDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-leaderboard\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/leaderboard/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch leaderboard: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { CurationDuration, CurationItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getDiscoverCurationQueryOptions(duration: CurationDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-curation\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/curation/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch curation data: ${response.status}`);\n }\n\n const data = (await response.json()) as CurationItem[];\n\n // Fetch account data for efficiency calculation\n const accounts = data.map((item) => item.account);\n const accountsResponse = await callRPC(\"condenser_api.get_accounts\", [accounts]);\n\n // Calculate efficiency for each curator\n for (let index = 0; index < accountsResponse.length; index++) {\n const element = accountsResponse[index];\n const curator = data[index];\n\n // Convert Asset to string if needed\n const vestingShares = typeof element.vesting_shares === 'string'\n ? element.vesting_shares\n : element.vesting_shares.toString();\n const receivedVestingShares = typeof element.received_vesting_shares === 'string'\n ? element.received_vesting_shares\n : element.received_vesting_shares.toString();\n const delegatedVestingShares = typeof element.delegated_vesting_shares === 'string'\n ? element.delegated_vesting_shares\n : element.delegated_vesting_shares.toString();\n const vestingWithdrawRate = typeof element.vesting_withdraw_rate === 'string'\n ? element.vesting_withdraw_rate\n : element.vesting_withdraw_rate.toString();\n\n const effectiveVest: number =\n parseFloat(vestingShares) +\n parseFloat(receivedVestingShares) -\n parseFloat(delegatedVestingShares) -\n parseFloat(vestingWithdrawRate);\n // `hp` is the reward in Hive Power; the denominator stays in VESTS, which\n // is what the ranking has always compared. Every curator is scaled the\n // same way, so the ordering is unaffected by the unit mismatch.\n curator.efficiency = curator.hp / effectiveVest;\n }\n\n // Sort by efficiency descending\n data.sort((a: CurationItem, b: CurationItem) => b.efficiency - a.efficiency);\n\n return data;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PageStatsResponse } from \"../types\";\n\n/**\n * Get page statistics from the private analytics API\n *\n * @param url - URL to get stats for\n * @param dimensions - Dimensions to query (default: [])\n * @param metrics - Metrics to query (default: [\"visitors\", \"pageviews\", \"visit_duration\"])\n * @param dateRange - Date range for the query (e.g. \"day\", \"7d\", \"30d\", \"all\")\n */\nexport function getPageStatsQueryOptions(\n url: string,\n dimensions: string[] = [],\n metrics: string[] = [\"visitors\", \"pageviews\", \"visit_duration\"],\n dateRange?: string\n) {\n // Sort arrays to ensure stable query keys regardless of input order\n const sortedDimensions = [...dimensions].sort();\n const sortedMetrics = [...metrics].sort();\n\n return queryOptions({\n queryKey: [\"analytics\", \"page-stats\", url, sortedDimensions, sortedMetrics, dateRange],\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/api/stats\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n date_range: dateRange,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch page stats: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!url,\n // Analytics data should always be fresh - users expect current stats when changing range\n staleTime: 0,\n });\n}\n","/**\n * 3Speak takes an 11% beneficiary share on posts that embed one of its videos.\n *\n * This lives in the SDK because the rule is a payout contract that both the web app and the\n * mobile app have to apply identically. It was previously duplicated in each, which meant a\n * change to the weight, or to what counts as an embed, could land on one platform and not the\n * other and silently misroute revenue.\n */\n\n/** A beneficiary route as it appears in `comment_options`. */\nexport interface ThreeSpeakBeneficiaryRoute {\n account: string;\n weight: number;\n src?: string;\n}\n\nexport const THREESPEAK_BENEFICIARY_ACCOUNT = \"threespeakfund\";\n\n/** Beneficiary weight in basis points: 1100 = 11%. */\nexport const THREESPEAK_BENEFICIARY_WEIGHT = 1100;\n\n/**\n * Whether the body embeds a 3Speak video.\n *\n * Matches an actual embed url (e.g. `https://play.3speak.tv/embed?v=user/id`), not a plain\n * text mention of \"3speak.tv/embed\", which would otherwise attach an 11% route to a post that\n * merely talks about 3Speak.\n *\n * `3speak.tv` must be the host, either bare or under dot-delimited subdomains. The previous\n * `[a-z.]*` prefix also matched a lookalike domain such as `fake3speak.tv`, which would have\n * routed 11% of a user's rewards to threespeakfund for a video 3Speak never hosted. Matching\n * is case-insensitive because hostnames are, and a missed match means the route is silently\n * not attached rather than anything failing loudly.\n *\n * Note this requires an `/embed` path segment. The embed url is not built locally, it comes\n * back from 3Speak on upload, so if that shape ever changes this predicate stops recognising\n * it and the route is silently not attached.\n */\nexport function hasThreeSpeakEmbed(body: string): boolean {\n return /https?:\\/\\/([a-z0-9-]+\\.)*3speak\\.tv\\/embed[?/]/i.test(body);\n}\n\n/**\n * Ensures the 3Speak beneficiary is present, at the correct weight, when the body embeds a\n * 3Speak video. Other beneficiaries are preserved and the input is never mutated. Returns the\n * original array reference untouched when there is nothing to change, so callers can use it as\n * a cheap equality check.\n */\nexport function enforceThreeSpeakBeneficiary(\n beneficiaries: T[],\n body: string\n): (T | ThreeSpeakBeneficiaryRoute)[] {\n if (!hasThreeSpeakEmbed(body)) {\n return beneficiaries;\n }\n\n const existing = beneficiaries.find((b) => b.account === THREESPEAK_BENEFICIARY_ACCOUNT);\n\n if (existing && existing.weight === THREESPEAK_BENEFICIARY_WEIGHT) {\n return beneficiaries;\n }\n\n if (existing) {\n return beneficiaries.map((b) =>\n b.account === THREESPEAK_BENEFICIARY_ACCOUNT\n ? { ...b, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n : b\n );\n }\n\n return [\n ...beneficiaries,\n { account: THREESPEAK_BENEFICIARY_ACCOUNT, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n ];\n}\n\n/** Whether a beneficiary entry is the 3Speak route, which the UI locks from editing. */\nexport function isThreeSpeakBeneficiary(account: string): boolean {\n return account === THREESPEAK_BENEFICIARY_ACCOUNT;\n}\n","export * from \"./get-account-token-query-options\";\nexport * from \"./get-account-videos-query-options\";\n","export * from \"./get-decode-memo-query-options\";\n","import { queryOptions } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function getDecodeMemoQueryOptions(\n username: string,\n memo: string,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"hivesigner\", \"decode-memo\", username],\n queryFn: async () => {\n if (accessToken) {\n const hsClient = new hs.Client({\n accessToken,\n });\n return hsClient.decode(memo);\n }\n },\n });\n}\n","import * as queries from \"./queries\";\n\nconst HiveSignerIntegration = {\n queries,\n};\n\nexport { HiveSignerIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveSignerIntegration } from \"../../hivesigner\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\n\nexport function getAccountTokenQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"authenticate\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/login?username=${username}&hivesigner=true`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n const memoQueryOptions =\n HiveSignerIntegration.queries.getDecodeMemoQueryOptions(\n username,\n (await response.json()).memo,\n accessToken\n );\n await getQueryClient().prefetchQuery(memoQueryOptions);\n const { memoDecoded } = getQueryClient().getQueryData(\n memoQueryOptions.queryKey\n );\n\n return memoDecoded.replace(\"#\", \"\");\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ThreeSpeakVideo } from \"../types\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { getAccountTokenQueryOptions } from \"./get-account-token-query-options\";\n\nexport function getAccountVideosQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"videos\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const tokenQueryOptions = getAccountTokenQueryOptions(\n username,\n accessToken\n );\n\n await getQueryClient().prefetchQuery(tokenQueryOptions);\n const token = getQueryClient().getQueryData(tokenQueryOptions.queryKey);\n if (!token) {\n throw new Error(\"[SDK][Integrations][3Speak] – missing account token\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/api/my-videos`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n }\n );\n return (await response.json()) as ThreeSpeakVideo[];\n },\n });\n}\n","export * from \"./types\";\nexport * from \"./functions\";\nimport * as queries from \"./queries\";\n\nconst ThreeSpeakIntegration = {\n queries,\n};\n\nexport { ThreeSpeakIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/core\";\n\nexport function getHivePoshLinksQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"integrations\", \"hiveposh\", \"links\", username],\n retry: false, // Don't retry on user not found errors\n queryFn: async () => {\n try {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://hiveposh.com/api/v0/linked-accounts/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n // Handle 400 error when user is not registered on HivePosh\n if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n // Silently return null for \"User Not Connected\" errors\n if (errorData?.message === \"User Not Connected\") {\n return null;\n }\n }\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n\n return {\n twitter: {\n username: data.twitter_username,\n profile: data.twitter_profile,\n },\n reddit: {\n username: data.reddit_username,\n profile: data.reddit_profile,\n },\n } satisfies Record<\n \"twitter\" | \"reddit\",\n { username: string; profile: string }\n >;\n } catch (err) {\n // Silently handle all HivePosh API errors\n return null;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\n\nexport interface StatsResponse {\n results: [\n {\n metrics: number[];\n dimensions: string[];\n },\n ];\n query: {\n site_id: string;\n metrics: string[];\n date_range: string[];\n filters: string[];\n };\n}\ninterface UseStatsQueryOptions {\n url: string;\n dimensions?: string[];\n metrics?: string[];\n /**\n * Which dimension the `url` is matched against. `event:page` (default) matches\n * any visit that viewed the page; `visit:entry_page` matches only visits that\n * landed on it. The API route validates this against an allow-list.\n */\n filterBy?: \"event:page\" | \"visit:entry_page\";\n /**\n * Plausible `date_range`. Pass a tuple `[from, to]` (ISO `YYYY-MM-DD`) to scope\n * the query — e.g. a post's creation date through today. Scoping is essential:\n * ClickHouse orders events by `(site_id, toDate(timestamp), …)` and partitions\n * by month, so a bounded range prunes to a few granules instead of scanning the\n * whole history. Omitting it falls back to the route default (`\"all\"`), which on\n * a high-traffic site is a multi-second full scan. Plausible also accepts the\n * relative keywords `\"day\"`, `\"7d\"`, `\"30d\"`, `\"all\"`.\n */\n dateRange?: string | [string, string];\n enabled?: boolean;\n}\n\nexport function getStatsQueryOptions({\n url,\n dimensions = [],\n metrics = [\"visitors\", \"pageviews\", \"visit_duration\"],\n filterBy = \"event:page\",\n dateRange,\n enabled = true,\n}: UseStatsQueryOptions) {\n return queryOptions({\n queryKey: [\"integrations\", \"plausible\", url, dimensions, metrics, filterBy, dateRange],\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(`${CONFIG.privateApiHost}/api/stats`, {\n method: \"POST\",\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n filterBy,\n // Only forward a range when set, so the route keeps owning the default.\n ...(dateRange ? { date_range: dateRange } : {}),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // The proxy route returns 5xx (504/502) with an empty body on a Plausible\n // timeout/transport error, and Plausible itself can return a 4xx error JSON.\n // Without this guard those parse into an object with no `results`, and the UI\n // silently renders 0 — indistinguishable from a real zero. Throw instead so\n // React Query surfaces the error and retries.\n if (!response.ok) {\n throw new Error(`Failed to fetch Plausible stats: ${response.status}`);\n }\n\n return (await response.json()) as StatsResponse;\n },\n enabled: !!url && enabled,\n // Stats queries are now date-scoped and cheap; a single retry rides out a\n // transient slow scan without re-introducing the all-time pile-up.\n retry: 1,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRcStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"resource-credits\", \"stats\"],\n queryFn: async () => {\n const response = await callRPC(\"rc_api.get_rc_stats\", {});\n return response.rc_stats;\n },\n });\n}\n","import { callRPC } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getAccountRcQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"resource-credits\", \"account\", username],\n queryFn: async (): Promise => {\n const result = await callRPC(\"rc_api.find_rc_accounts\", {\n accounts: [username],\n });\n return result.rc_accounts;\n },\n enabled: !!username,\n });\n}\n","import { calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport type { RcStats } from \"../types/stats\";\n\n/**\n * Operations the RC pre-check can estimate. Mirrors the keys exposed by\n * `rc_api.get_rc_stats` (see {@link RcStats}[\"ops\"]).\n */\nexport type RcPrecheckOperation = keyof RcStats[\"ops\"];\n\nexport interface RcPrecheckInput {\n /** From `getAccountRcQueryOptions(username)` -> rcAccounts[0]. */\n rcAccount: RCAccount | null | undefined;\n /** From `getRcStatsQueryOptions()`. */\n rcStats: RcStats | null | undefined;\n /** The operation the user is about to broadcast. */\n operation: RcPrecheckOperation;\n /**\n * Safety multiplier applied to the average operation cost when deciding\n * whether the broadcast will \"likely fail\". Actual on-chain cost varies with\n * network load, so we keep headroom. Defaults to 1.2.\n */\n buffer?: number;\n}\n\nexport interface RcPrecheckResult {\n /** Both inputs were available, so the estimate is meaningful. */\n ready: boolean;\n /** Current RC mana of the account. */\n currentMana: number;\n /** Maximum RC mana of the account. */\n maxMana: number;\n /** Average RC cost of the operation. */\n avgCost: number;\n /** Average cost padded by `buffer`. */\n estimatedCost: number;\n /** `currentMana` is below the padded estimate -> broadcast likely fails. */\n willLikelyFail: boolean;\n /** RC shortfall vs the padded estimate (0 when not failing). */\n deficit: number;\n /** Roughly how many such operations the account can still afford. */\n remaining: number;\n}\n\nconst EMPTY: RcPrecheckResult = {\n ready: false,\n currentMana: 0,\n maxMana: 0,\n avgCost: 0,\n estimatedCost: 0,\n willLikelyFail: false,\n deficit: 0,\n remaining: 0,\n};\n\n/**\n * Pure, client-side estimate of whether an account has enough Resource Credits\n * to broadcast an operation, used to warn the user BEFORE they submit instead\n * of failing afterwards with the chain's \"Please wait to transact\" error.\n *\n * It is intentionally approximate: it uses the network-wide average cost from\n * `rc_api.get_rc_stats`, padded by a buffer. Treat `willLikelyFail` as a hint,\n * never a hard gate - the publish/comment/vote action must stay non-blocking.\n */\nexport function estimateRcPrecheck({\n rcAccount,\n rcStats,\n operation,\n buffer = 1.2,\n}: RcPrecheckInput): RcPrecheckResult {\n if (!rcAccount || !rcStats?.ops) {\n return EMPTY;\n }\n\n const { current_mana: currentMana, max_mana: maxMana } = calculateRCMana(rcAccount);\n const avgCost = Number(rcStats.ops[operation]?.avg_cost ?? 0);\n\n if (!(avgCost > 0)) {\n return { ...EMPTY, ready: true, currentMana, maxMana };\n }\n\n const safeBuffer = Number.isFinite(buffer) && buffer > 0 ? buffer : 1.2;\n const estimatedCost = avgCost * safeBuffer;\n const willLikelyFail = currentMana < estimatedCost;\n\n return {\n ready: true,\n currentMana,\n maxMana,\n avgCost,\n estimatedCost,\n willLikelyFail,\n deficit: willLikelyFail ? Math.ceil(estimatedCost - currentMana) : 0,\n remaining: Math.floor(currentMana / avgCost),\n };\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetGameStatus } from \"../types\";\n\nexport function getGameStatusCheckQueryOptions(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\"\n) {\n return queryOptions({\n queryKey: [\"games\", \"status-check\", gameType, username],\n enabled: !!username && !!code,\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/get-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()) as GetGameStatus;\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { GameClaim } from \"../types\";\nimport { useRecordActivity } from \"@/modules/analytics/mutations\";\n\nexport function useGameClaim(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\",\n key: string\n) {\n const { mutateAsync: recordActivity } = useRecordActivity(\n username,\n \"spin-rolled\"\n );\n\n return useMutation({\n mutationKey: [\"games\", \"post\", gameType, username],\n mutationFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/post-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n key,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (await response.json()) as GameClaim;\n },\n onSuccess() {\n recordActivity();\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { QuestsResponse } from \"../types\";\n\n/**\n * Read-only daily/weekly/monthly quest progress for a user. Aggregates the existing\n * points ledger (no auth required — same sensitivity as `/private-api/points`).\n */\nexport function getQuestsQueryOptions(username: string | undefined) {\n const name = username?.replace(\"@\", \"\");\n return queryOptions({\n queryKey: QueryKeys.quests.status(name),\n enabled: !!name,\n queryFn: async () => {\n if (!name) {\n throw new Error(\"[SDK][Quests] – username wasn't provided\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/quests\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ username: name }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch quests: ${response.status}`);\n }\n\n return (await response.json()) as QuestsResponse;\n },\n staleTime: 30000,\n refetchOnMount: true,\n });\n}\n","/**\n * Shared quest catalog — the single source of truth for which quests exist, their\n * encouraging goals, copy keys and icon hints. Lives in the SDK so the web and mobile\n * clients render an identical, harmonized set. The backend (`/private-api/quests`)\n * returns raw progress + the reward `cap`; this catalog layers the presentation.\n *\n * `goal` is an *encouraging, reachable* daily target and is intentionally independent of\n * the backend reward `cap` (the point at which the existing reward decays to ~0). It is\n * tunable here without any backend change.\n */\n\nexport type QuestTier = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface QuestCatalogEntry {\n id: string;\n tier: QuestTier;\n /** encouraging, reachable target for the period (tunable, not the reward cap) */\n goal: number;\n /** i18n key suffix; clients resolve e.g. `quests..title` / `.desc` */\n i18nKey: string;\n /** semantic icon hint; each client maps it to its own icon set */\n icon: string;\n}\n\nexport const QUEST_CATALOG: QuestCatalogEntry[] = [\n // Daily\n { id: \"checkin\", tier: \"daily\", goal: 1, i18nKey: \"checkin\", icon: \"check-circle\" },\n { id: \"post\", tier: \"daily\", goal: 1, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"daily\", goal: 3, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"daily\", goal: 10, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"daily\", goal: 1, i18nKey: \"reblog\", icon: \"repeat\" },\n { id: \"spin\", tier: \"daily\", goal: 1, i18nKey: \"spin\", icon: \"gift\" },\n // Weekly\n { id: \"post\", tier: \"weekly\", goal: 5, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"weekly\", goal: 15, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"weekly\", goal: 50, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"weekly\", goal: 5, i18nKey: \"reblog\", icon: \"repeat\" },\n // Monthly\n { id: \"post\", tier: \"monthly\", goal: 20, i18nKey: \"post\", icon: \"pencil\" },\n];\n\nexport function getQuestCatalogEntry(tier: QuestTier, id: string) {\n return QUEST_CATALOG.find((q) => q.tier === tier && q.id === id);\n}\n\n// Streak Freeze display config. MIRRORS the ePoints constants\n// (STREAK_FREEZE_PRICE / STREAK_FREEZE_MAX_OWNED) — the server is the source of truth\n// and validates every purchase; these drive the label + button state only, so a drift\n// here never over-charges (the buy is priced server-side).\nexport const STREAK_FREEZE_PRICE = 300;\nexport const STREAK_FREEZE_MAX_OWNED = 2;\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { StreakFreezeBuyResult } from \"../types\";\n\n/** A fresh idempotency key per purchase; guarded for runtimes without crypto.randomUUID. */\nfunction genIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * POST a single streak-freeze purchase. Throws on a non-2xx with the server's\n * `.status` + parsed `.data` attached so the caller can branch on 402 (insufficient)\n * / 409 (max owned). Exported for unit testing; the hook below wraps it.\n */\nexport async function buyStreakFreezeRequest(\n code: string\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/streak-freeze/buy\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code, idempotency_key: genIdempotencyKey() }),\n }\n );\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to buy streak freeze: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as StreakFreezeBuyResult;\n}\n\n/**\n * Buy one streak freeze (a Points-only sink). The server debits Points, caps owned\n * inventory, and is idempotent per key. On success the quests + points caches are\n * invalidated so the owned count and balance refresh. A 402 (insufficient) / 409 (max\n * owned) is rethrown with `.status` + `.data` so the caller can route to a Points top-up.\n */\nexport function useBuyStreakFreeze(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"streak-freeze\", \"buy\", name],\n mutationFn: async () => {\n if (!name || !code) {\n throw new Error(\"[SDK][StreakFreeze] – missing auth\");\n }\n return buyStreakFreezeRequest(code);\n },\n onSuccess() {\n // Balance only changes on a successful debit.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.points._prefix(name) });\n }\n },\n onSettled() {\n // Refresh freezes_owned on success AND error: a 409 (max owned) means the\n // client's count is stale, and without this the \"Protect streak\" button would\n // never hide and the user could keep re-triggering 409s.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.quests.status(name) });\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for subscribing to a community.\n */\nexport interface SubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for subscribing to a community.\n *\n * This mutation broadcasts a subscribe operation to the Hive blockchain,\n * adding the community to the user's subscription list.\n *\n * @param username - The username subscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"subscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const subscribeMutation = useSubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Subscribe to a community\n * subscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useSubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"subscribe\"],\n username,\n ({ community }) => [\n buildSubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnsubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unsubscribing from a community.\n */\nexport interface UnsubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for unsubscribing from a community.\n *\n * This mutation broadcasts an unsubscribe operation to the Hive blockchain,\n * removing the community from the user's subscription list.\n *\n * @param username - The username unsubscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"unsubscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const unsubscribeMutation = useUnsubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unsubscribe from a community\n * unsubscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useUnsubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"unsubscribe\"],\n username,\n ({ community }) => [\n buildUnsubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildMutePostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for muting/unmuting a post in a community.\n */\nexport interface MutePostPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Mute reason/notes (required even for unmute) */\n notes: string;\n /** True to mute, false to unmute */\n mute: boolean;\n}\n\n/**\n * React Query mutation hook for muting/unmuting posts in a community.\n *\n * This mutation broadcasts a custom_json operation to mute (or unmute)\n * a post within a community. Only community moderators/admins can mute posts.\n *\n * @param username - The username performing the mute (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community posts cache to hide muted content\n * - Invalidates post cache to update mute status\n * - Invalidates feed cache to remove muted posts from feeds\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"mutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Action (unmute): [\"unmutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Authority: Posting key\n *\n * **Mute vs Unmute:**\n * - mute: true - Mutes the post (hides from community feed)\n * - mute: false - Unmutes the post (restores to community feed)\n *\n * **Permission:**\n * - Only community moderators and admins can mute/unmute posts\n * - Attempting to mute without permission will fail with an error\n *\n * @example\n * ```typescript\n * const mutePostMutation = useMutePost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Mute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Violates community guidelines',\n * mute: true\n * });\n *\n * // Unmute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Resolved after editing',\n * mute: false\n * });\n * ```\n */\nexport function useMutePost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"mutePost\"],\n username,\n ({ community, author, permlink, notes, mute }) => [\n buildMutePostOp(username!, community, author, permlink, notes, mute)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n // Invalidate specific post cache to update mute status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n // Invalidate community data\n [\"community\", \"single\", variables.community],\n // Invalidate community feed/posts (matches all sort orders, limits, observers)\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.community\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetRoleOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community, CommunityTeam } from \"../types\";\n\n/**\n * Payload for setting a user's role in a community.\n */\nexport interface SetCommunityRolePayload {\n /** Account to set role for */\n account: string;\n /** Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\") */\n role: string;\n}\n\n/**\n * React Query mutation hook for setting a user's role in a community.\n *\n * This mutation broadcasts a setRole operation to the Hive blockchain,\n * updating the role of a community member. Only users with appropriate\n * permissions (community owner/admin) can set roles.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username setting the role (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated team member list\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"setRole\", {\"community\": \"hive-123456\", \"account\": \"user\", \"role\": \"mod\"}]\n * - Authority: Posting key\n *\n * **Role Types:**\n * - \"owner\" - Community owner (full permissions)\n * - \"admin\" - Administrator (can manage settings and team)\n * - \"mod\" - Moderator (can mute posts/users)\n * - \"member\" - Regular member (no special permissions)\n * - \"guest\" - Remove user from team (empty string also works)\n *\n * @example\n * ```typescript\n * const setRoleMutation = useSetCommunityRole('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Set a user as moderator\n * setRoleMutation.mutate({\n * account: 'alice',\n * role: 'mod'\n * });\n *\n * // Remove a user from the team\n * setRoleMutation.mutate({\n * account: 'bob',\n * role: 'guest'\n * });\n * ```\n */\nexport function useSetCommunityRole(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"set-role\", community],\n username,\n ({ account, role }) => [\n buildSetRoleOp(username!, community, account, role)\n ],\n async (_result: any, variables) => {\n // Optimistic team update in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n const team: CommunityTeam = [...(prev.team ?? [])];\n const idx = team.findIndex(([name]) => name === variables.account);\n if (idx >= 0) {\n team[idx] = [team[idx][0], variables.role, team[idx][2] ?? \"\"];\n } else {\n team.push([variables.account, variables.role, \"\"]);\n }\n return { ...prev, team };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries + context for affected user\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)],\n QueryKeys.communities.context(variables.account, community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUpdateCommunityOp, type CommunityProps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community } from \"../types\";\n\n/**\n * Payload for updating community properties.\n * Matches the CommunityProps interface from builders.\n */\nexport type UpdateCommunityPayload = CommunityProps;\n\n/**\n * React Query mutation hook for updating community properties.\n *\n * This mutation broadcasts an updateProps operation to the Hive blockchain,\n * modifying the community's metadata and settings. Only community admins\n * can update community properties.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username updating the community (required for broadcast, must be admin)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated properties\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"updateProps\", {\"community\": \"hive-123456\", \"props\": {...}}]\n * - Authority: Posting key\n *\n * **Properties:**\n * - title - Community display title\n * - about - Short description/tagline\n * - lang - Primary language code (e.g., \"en\")\n * - description - Full community description (markdown supported)\n * - flag_text - Custom text shown when flagging posts\n * - is_nsfw - Whether community contains NSFW content\n *\n * @example\n * ```typescript\n * const updateMutation = useUpdateCommunity('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update community properties\n * updateMutation.mutate({\n * title: 'My Awesome Community',\n * about: 'A place for awesome people',\n * lang: 'en',\n * description: '# Welcome\\nThis is our community description',\n * flag_text: 'Please explain why this content violates our rules',\n * is_nsfw: false\n * });\n * ```\n */\nexport function useUpdateCommunity(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"update\", community],\n username,\n (props) => [\n buildUpdateCommunityOp(username!, community, props)\n ],\n async (_result: any, variables) => {\n // Optimistic property merge in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n return { ...prev, ...(variables as unknown as Partial) };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)]\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommunityRegistrationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for community rewards registration.\n */\nexport interface CommunityRewardsRegisterPayload {\n /** Community account name (usually the community creator's account) */\n name: string;\n}\n\n/**\n * React Query mutation hook for registering to receive community rewards.\n *\n * This mutation broadcasts a custom_json operation to register a community\n * account to receive Ecency Points rewards for community activity.\n *\n * @param username - The username registering for community rewards (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to update registration status\n * - Invalidates points balance to reflect potential initial rewards\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_registration\"\n * - JSON: {\"name\": \"communityname\"}\n * - Authority: Active key (required for registration)\n *\n * **Purpose:**\n * - Enables communities to receive Ecency Points for activity\n * - One-time registration per community\n * - Can only be done by the community owner/creator\n *\n * @example\n * ```typescript\n * const registerMutation = useRegisterCommunityRewards(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Register community for rewards\n * registerMutation.mutate({\n * name: 'hive-123456'\n * });\n * ```\n */\nexport function useRegisterCommunityRewards(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"registerRewards\"],\n username,\n ({ name }) => [\n buildCommunityRegistrationOp(name)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate community cache to update registration status\n [...QueryKeys.communities.singlePrefix(variables.name)],\n // Invalidate points balance\n [...QueryKeys.points._prefix(username!)],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPinPostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface PinPostPayload {\n community: string;\n account: string;\n permlink: string;\n pin: boolean;\n}\n\nexport function usePinPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"pin-post\"],\n username,\n ({ community, account, permlink, pin }) => [\n buildPinPostOp(username!, community, account, permlink, pin)\n ],\n async (_result, variables) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.account}/${variables.permlink}`),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Communities } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunitiesQueryOptions(\n sort: string,\n query?: string,\n limit = 100,\n observer: string | undefined = undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.list(sort, query ?? \"\", limit),\n enabled,\n queryFn: async () => {\n const response = await callRPC(\"bridge.list_communities\", {\n last: \"\",\n limit,\n sort: sort === \"hot\" ? \"rank\" : sort,\n query: query ? query : null,\n observer,\n });\n return (\n response\n ? sort === \"hot\"\n ? response.sort(() => Math.random() - 0.5)\n : response\n : []\n ) as Communities;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { CommunityRole } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunityContextQueryOptions(\n username: string | undefined,\n communityName: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.context(username!, communityName!),\n enabled: !!username && !!communityName,\n queryFn: async () => {\n const response = await callRPC(\"bridge.get_community_context\", {\n account: username,\n name: communityName,\n });\n\n return {\n role: response?.role ?? \"guest\",\n subscribed: response?.subscribed ?? false,\n } satisfies {\n role: CommunityRole;\n subscribed: boolean;\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Community } from \"../types/community\";\nimport { getCommunity } from \"@/modules/bridge\";\nimport { QueryKeys } from \"@/modules/core\";\n\nexport function getCommunityQueryOptions(\n name: string | undefined,\n observer: string | undefined = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.single(name, observer),\n enabled: enabled && !!name,\n queryFn: async () => getCommunity(name ?? \"\", observer) as Promise,\n });\n}\n","import {\n InfiniteData,\n infiniteQueryOptions,\n queryOptions\n} from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Subscription } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * hivemind caps `bridge.list_subscribers` at 100 rows per call, regardless of a\n * larger requested limit.\n */\nexport const SUBSCRIBERS_PAGE_SIZE = 100;\n\ntype SubscribersPage = Subscription[];\ntype SubscribersCursor = string | null;\n\n/**\n * Fetches one page of subscribers.\n *\n * `last` is omitted on the first page rather than passed as an empty string:\n * hivemind reads `\"\"` as a real cursor positioned before the first account and\n * returns zero rows.\n */\nasync function fetchSubscribersPage(\n communityName: string,\n last: SubscribersCursor\n): Promise {\n const response = await callRPC(\"bridge.list_subscribers\", {\n community: communityName,\n limit: SUBSCRIBERS_PAGE_SIZE,\n ...(last ? { last } : {})\n });\n return (response as Subscription[] | null) ?? [];\n}\n\n/**\n * Get the first page of subscribers for a community.\n *\n * @deprecated Returns at most {@link SUBSCRIBERS_PAGE_SIZE} subscribers, which\n * for most communities is a small fraction of the total while looking like the\n * complete list. Prefer {@link getCommunitySubscribersInfiniteQueryOptions}\n * unless a single page is genuinely all that is wanted.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersQueryOptions(communityName: string) {\n return queryOptions({\n queryKey: QueryKeys.communities.subscribers(communityName),\n queryFn: async () => fetchSubscribersPage(communityName, null),\n staleTime: 60000\n });\n}\n\n/**\n * Get all subscribers for a community, paged with hivemind's `last` cursor.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersInfiniteQueryOptions(\n communityName: string\n) {\n return infiniteQueryOptions<\n SubscribersPage,\n Error,\n InfiniteData,\n string[],\n SubscribersCursor\n >({\n queryKey: QueryKeys.communities.subscribersInfinite(communityName),\n initialPageParam: null as SubscribersCursor,\n queryFn: async ({ pageParam }: { pageParam: SubscribersCursor }) =>\n fetchSubscribersPage(communityName, pageParam),\n // The cursor is the previous page's last account name. A short page is the\n // end of the list.\n getNextPageParam: (lastPage: SubscribersPage): SubscribersCursor =>\n lastPage?.length >= SUBSCRIBERS_PAGE_SIZE\n ? lastPage[lastPage.length - 1]?.[0] ?? null\n : null,\n staleTime: 60000\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountNotification } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype NotifPage = AccountNotification[];\ntype NotifCursor = number | null;\n\n/**\n * Get account notifications for a community (bridge API)\n *\n * @param account - The account/community name\n * @param limit - Number of notifications per page\n */\nexport function getAccountNotificationsInfiniteQueryOptions(\n account: string,\n limit: number\n) {\n return infiniteQueryOptions<\n NotifPage,\n Error,\n InfiniteData,\n (string | number)[],\n NotifCursor\n >({\n queryKey: QueryKeys.communities.accountNotifications(account, limit),\n initialPageParam: null as NotifCursor,\n\n // Errors are deliberately not caught. Returning [] on failure made an RPC\n // outage indistinguishable from an empty log: `isError` never became true,\n // so consumers rendered \"no activity\" for a failed request, and a failed\n // page produced no cursor and silently ended pagination. Let React Query\n // own the error so `isError` and retry behave normally.\n queryFn: async ({ pageParam }: { pageParam: NotifCursor }) => {\n const response = await callRPC(\"bridge.account_notifications\", {\n account,\n limit,\n last_id: pageParam ?? undefined,\n });\n return (response as AccountNotification[] | null) ?? [];\n },\n\n // A short page is the end of the log. Keying on \"empty\" alone would also\n // treat a truncated page as the end.\n getNextPageParam: (lastPage: NotifPage): NotifCursor =>\n lastPage?.length >= limit ? lastPage[lastPage.length - 1].id : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { RewardedCommunity } from \"../types/rewarded-community\";\n\nexport function getRewardedCommunitiesQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.communities.rewarded(),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/rewarded-communities\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch rewarded communities: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","export enum ROLES {\n OWNER = \"owner\",\n ADMIN = \"admin\",\n MOD = \"mod\",\n MEMBER = \"member\",\n GUEST = \"guest\",\n MUTED = \"muted\",\n}\n\nexport const roleMap: Record = {\n [ROLES.OWNER]: [\n ROLES.ADMIN,\n ROLES.MOD,\n ROLES.MEMBER,\n ROLES.GUEST,\n ROLES.MUTED,\n ],\n [ROLES.ADMIN]: [ROLES.MOD, ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n [ROLES.MOD]: [ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n};\n\nexport type CommunityTeam = Array>;\nexport type CommunityRole = (typeof ROLES)[keyof typeof ROLES]; // \"owner\" | \"member\" | ...\nexport type CommunityType = \"Topic\" | \"Journal\" | \"Council\";\n\nexport interface Community {\n about: string;\n admins?: string[];\n avatar_url: string;\n created_at: string;\n description: string;\n flag_text: string;\n id: number;\n is_nsfw: boolean;\n lang: string;\n name: string;\n num_authors: number;\n num_pending: number;\n subscribers: number;\n sum_pending: number;\n settings?: any;\n team: CommunityTeam;\n title: string;\n type_id: number;\n}\n\nexport type Communities = Community[];\n","import { CommunityRole, CommunityType, ROLES } from \"../types\";\n\nexport function getCommunityType(name: string, type_id: number): CommunityType {\n if (name.startsWith(\"hive-3\") || type_id === 3) return \"Council\";\n if (name.startsWith(\"hive-2\") || type_id === 2) return \"Journal\";\n return \"Topic\";\n}\n\nexport function getCommunityPermissions({\n communityType,\n userRole,\n subscribed,\n}: {\n communityType: CommunityType;\n userRole: CommunityRole;\n subscribed: boolean;\n}) {\n const canPost = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n if (communityType === \"Topic\") return true;\n\n // Journal & Council\n return [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD, ROLES.MEMBER].includes(\n userRole\n );\n })();\n\n const canComment = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n switch (communityType) {\n case \"Topic\":\n return true;\n case \"Journal\":\n return userRole !== ROLES.GUEST || subscribed;\n case \"Council\":\n return canPost;\n }\n })();\n\n const isModerator = [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD].includes(userRole);\n\n return {\n canPost,\n canComment,\n isModerator,\n };\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getNotificationsUnreadCountQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.unreadCount(activeUsername),\n queryFn: async () => {\n if (!code) {\n return 0;\n }\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/notifications/unread`,\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n const data = (await response.json()) as { count: number };\n return data.count;\n },\n enabled: !!activeUsername && !!code,\n initialData: 0,\n refetchInterval: 60000,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { NotificationFilter } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ApiNotification } from \"../types\";\n\nexport function getNotificationsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n filter: NotificationFilter | undefined = undefined\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.notifications.list(activeUsername, filter),\n queryFn: async ({ pageParam }) => {\n if (!code) {\n return [];\n }\n const data = {\n code,\n filter,\n since: pageParam,\n user: undefined,\n };\n\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/notifications\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }\n );\n\n if (!response.ok) {\n return [];\n }\n\n try {\n return (await response.json()) as ApiNotification[];\n } catch {\n return [];\n }\n },\n enabled: !!activeUsername && !!code,\n initialData: { pages: [], pageParams: [] },\n initialPageParam: \"\",\n getNextPageParam: (lastPage) => lastPage?.[lastPage.length - 1]?.id ?? \"\",\n refetchOnMount: true,\n });\n}\n","export enum NotificationFilter {\n VOTES = \"rvotes\",\n MENTIONS = \"mentions\",\n FAVORITES = \"nfavorites\",\n BOOKMARKS = \"nbookmarks\",\n FOLLOWS = \"follows\",\n REPLIES = \"replies\",\n REBLOGS = \"reblogs\",\n TRANSFERS = \"transfers\",\n DELEGATIONS = \"delegations\",\n PAYOUTS = \"payouts\",\n SCHEDULED_PUBLISHED = \"scheduled_published\",\n // Filter path is plural while the notification `type` string is singular\n // (`account_update`) - enotify routes on the plural form.\n ACCOUNT_UPDATES = \"account_updates\",\n WEEKLY_EARNINGS = \"weekly_earnings\",\n}\n","// Values are enotify's ACTIVITY_MAIN_TYPE_* ints and are validated server-side at\n// device registration, so they must match enotify constants.py exactly. Note payouts\n// is 19: the original 16 is commented out upstream and must not be reused.\nexport enum NotifyTypes {\n VOTE = 1,\n MENTION = 2,\n FOLLOW = 3,\n COMMENT = 4,\n RE_BLOG = 5,\n TRANSFERS = 6,\n DELEGATIONS = 10,\n FAVORITES = 13,\n BOOKMARKS = 15,\n PAYOUTS = 19,\n ACCOUNT_UPDATE = 20,\n WEEKLY_EARNINGS = 21,\n SCHEDULED_PUBLISHED = 22,\n ALLOW_NOTIFY = \"ALLOW_NOTIFY\",\n}\n\nexport const ALL_NOTIFY_TYPES = [\n NotifyTypes.VOTE,\n NotifyTypes.MENTION,\n NotifyTypes.FOLLOW,\n NotifyTypes.COMMENT,\n NotifyTypes.RE_BLOG,\n NotifyTypes.TRANSFERS,\n NotifyTypes.DELEGATIONS,\n NotifyTypes.FAVORITES,\n NotifyTypes.BOOKMARKS,\n NotifyTypes.PAYOUTS,\n NotifyTypes.ACCOUNT_UPDATE,\n NotifyTypes.WEEKLY_EARNINGS,\n NotifyTypes.SCHEDULED_PUBLISHED,\n] as const;\n\nexport enum NotificationViewType {\n ALL = \"All\",\n UNREAD = \"Unread\",\n READ = \"Read\",\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ApiNotificationSetting } from \"../types\";\nimport { ALL_NOTIFY_TYPES } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getNotificationsSettingsQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n initialMuted?: boolean\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.settings(activeUsername),\n queryFn: async () => {\n let token = activeUsername + \"-web\";\n if (!code) {\n throw new Error(\"Missing access token\");\n }\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/detail-device\",\n {\n body: JSON.stringify({\n code,\n username: activeUsername,\n token,\n }),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch notification settings: ${response.status}`);\n }\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n refetchOnMount: false,\n initialData: () => {\n return {\n status: 0,\n system: \"web\",\n allows_notify: 0,\n notify_types: initialMuted ? [] : ([...ALL_NOTIFY_TYPES] as number[]),\n } as ApiNotificationSetting;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Announcement } from \"../types/announcement\";\n\nexport function getAnnouncementsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.notifications.announcements(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/announcements\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch announcements: ${response.status}`);\n }\n\n const data = await response.json() as Announcement[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Spotlight } from \"../types/spotlight\";\n\n// `_accessToken` is accepted for call-site parity with mobile (which passes one) but is\n// intentionally unused: the spotlights endpoint is anonymous and only filters by date window.\nexport function getSpotlightsQueryOptions(_accessToken?: string) {\n return queryOptions({\n queryKey: QueryKeys.notifications.spotlights(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/spotlights\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch spotlights: ${response.status}`);\n }\n\n const data = (await response.json()) as Spotlight[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { useMutation, QueryKey, InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { markNotifications } from \"@/modules/private-api/requests\";\nimport { ApiNotification } from \"../types\";\n\ntype NotificationPage = ApiNotification[];\ntype InfiniteNotificationData = InfiniteData;\n\nfunction markNotificationRead(item: ApiNotification, id?: string): ApiNotification {\n return {\n ...item,\n read: (!id || id === item.id ? 1 : item.read) as 0 | 1,\n };\n}\n\nfunction isInfiniteData(data: unknown): data is InfiniteNotificationData {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"pages\" in data &&\n \"pageParams\" in data &&\n Array.isArray((data as InfiniteNotificationData).pages)\n );\n}\n\n/**\n * Hook to mark notifications as read with optimistic updates\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful mutation, receives unread count\n * @param onError - Optional callback on error\n *\n * @returns Mutation hook that accepts { id?: string }\n *\n * @example\n * ```typescript\n * const markAsRead = useMarkNotificationsRead(username, code);\n *\n * // Mark specific notification\n * markAsRead.mutate({ id: \"notification-id\" });\n *\n * // Mark all notifications (omit id)\n * markAsRead.mutate({});\n * ```\n */\nexport function useMarkNotificationsRead(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: (unreadCount?: number) => void,\n onError?: (e: Error) => void\n) {\n const queryClient = getQueryClient();\n\n return useMutation({\n mutationKey: [\"notifications\", \"mark-read\", username],\n\n mutationFn: async ({ id }: { id?: string }) => {\n if (!username || !code) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[SDK][Notifications] – missing auth for markNotifications\");\n }\n return;\n }\n return markNotifications(code, id);\n },\n\n // Optimistic update: Immediately mark notifications as read in cache\n onMutate: async ({ id }: { id?: string }) => {\n // Skip optimistic updates when auth is not available\n if (!username || !code) {\n return { previousData: [] };\n }\n\n // Cancel any outgoing refetches to prevent overwriting optimistic update\n await queryClient.cancelQueries({ queryKey: QueryKeys.notifications._prefix });\n\n // Snapshot current state for rollback\n const previousData: Array<[QueryKey, unknown]> = [];\n\n // Update infinite notification list queries (pages structure)\n const infiniteQueries = queryClient.getQueriesData({\n queryKey: QueryKeys.notifications._prefix,\n predicate: (query) => {\n const data = query.state.data;\n return isInfiniteData(data);\n },\n });\n\n infiniteQueries.forEach(([queryKey, data]) => {\n if (data && isInfiniteData(data)) {\n previousData.push([queryKey, data]);\n\n const updatedData: InfiniteNotificationData = {\n ...data,\n pages: data.pages.map((page) =>\n page.map((item) => markNotificationRead(item, id))\n ),\n };\n\n queryClient.setQueryData(queryKey, updatedData);\n }\n });\n\n // Optimistically decrement unread count\n const unreadKey = QueryKeys.notifications.unreadCount(username);\n const currentUnread = queryClient.getQueryData(unreadKey);\n if (typeof currentUnread === \"number\" && currentUnread > 0) {\n previousData.push([unreadKey, currentUnread]);\n\n if (!id) {\n // Mark all: set to 0\n queryClient.setQueryData(unreadKey, 0);\n } else {\n // Mark single: only decrement if the notification is currently unread\n const isUnread = infiniteQueries.some(([, d]) =>\n d?.pages.some((page) =>\n page.some((item) => item.id === id && item.read === 0)\n )\n );\n if (isUnread) {\n queryClient.setQueryData(unreadKey, currentUnread - 1);\n }\n }\n }\n\n // Return context for rollback\n return { previousData };\n },\n\n onSuccess: (response) => {\n // Extract unread count from response if available\n const unreadCount = typeof response === \"object\" && response !== null\n ? (response as { unread?: number }).unread\n : undefined;\n\n // Update unread count cache with server value\n if (typeof unreadCount === \"number\") {\n queryClient.setQueryData(\n QueryKeys.notifications.unreadCount(username),\n unreadCount\n );\n }\n\n onSuccess?.(unreadCount);\n },\n\n // Rollback optimistic update on error\n onError: (error, _variables, context) => {\n // Restore previous state\n if (context?.previousData) {\n context.previousData.forEach(([queryKey, data]) => {\n queryClient.setQueryData(queryKey, data);\n });\n }\n\n onError?.(error as Error);\n },\n\n // Always refetch after mutation settles\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: QueryKeys.notifications._prefix,\n });\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetLastReadOps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface SetLastReadPayload {\n date?: string;\n}\n\nexport function useSetLastRead(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"notifications\", \"set-last-read\"],\n username,\n ({ date }) => buildSetLastReadOps(username!, date),\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.notifications.unreadCount(username),\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a single proposal by ID\n */\nexport function getProposalQueryOptions(id: number) {\n return queryOptions({\n queryKey: [\"proposals\", \"proposal\", id],\n queryFn: async () => {\n const r = await callRPC(\"condenser_api.find_proposals\", [[id]]);\n const proposal = r[0];\n\n // Determine proposal status based on dates\n if (new Date(proposal.start_date) < new Date() && new Date(proposal.end_date) >= new Date()) {\n proposal.status = \"active\";\n } else if (new Date(proposal.end_date) < new Date()) {\n proposal.status = \"expired\";\n } else {\n proposal.status = \"inactive\";\n }\n\n return proposal as Proposal;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get all proposals, sorted with expired proposals at the end\n */\nexport function getProposalsQueryOptions() {\n return queryOptions({\n queryKey: [\"proposals\", \"list\"],\n queryFn: async () => {\n const response = (await callRPC(\"database_api.list_proposals\", {\n start: [-1],\n limit: 500,\n order: \"by_total_votes\",\n order_direction: \"descending\",\n status: \"all\",\n })) as { proposals: Proposal[] };\n\n const proposals = response.proposals;\n const expired = proposals.filter((x) => x.status === \"expired\");\n const others = proposals.filter((x) => x.status !== \"expired\");\n\n return [...others, ...expired];\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { FullAccount } from \"@/modules/accounts\";\nimport { parseAccounts } from \"@/modules/accounts/utils\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// One page = array of enriched vote rows\nexport type ProposalVoteRow = {\n id: number;\n voter: string;\n voterAccount: FullAccount;\n};\n\ntype Cursor = string; // we paginate by last voter name\n\n/**\n * Get proposal votes with pagination and enriched voter account data\n *\n * @param proposalId - The proposal ID\n * @param voter - Starting voter for pagination\n * @param limit - Number of votes per page\n */\nexport function getProposalVotesInfiniteQueryOptions(\n proposalId: number,\n voter: string,\n limit: number\n) {\n return infiniteQueryOptions<\n ProposalVoteRow[],\n Error,\n InfiniteData,\n (string | number)[],\n Cursor\n >({\n queryKey: [\"proposals\", \"votes\", proposalId, voter, limit],\n initialPageParam: voter as Cursor,\n refetchOnMount: true,\n staleTime: 0, // Always refetch on mount\n\n queryFn: async ({ pageParam }: { pageParam: Cursor }) => {\n const startParam = pageParam ?? voter;\n\n const response = (await callRPC(\"condenser_api.list_proposal_votes\", [\n [proposalId, startParam],\n limit,\n \"by_proposal_voter\",\n ])) as ProposalVote[];\n\n const list = response\n .filter((x) => x.proposal?.proposal_id === proposalId)\n .map((x) => ({ id: x.id, voter: x.voter }));\n\n const rawAccounts = await callRPC(\"condenser_api.get_accounts\", [list.map((l) => l.voter)]);\n const accounts = parseAccounts(rawAccounts);\n\n const page: ProposalVoteRow[] = list.map((i) => ({\n ...i,\n voterAccount: accounts.find((a) => i.voter === a.name)!,\n }));\n\n return page;\n },\n\n getNextPageParam: (lastPage: ProposalVoteRow[]): Cursor | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n return last?.voter ?? undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Fetches ALL proposal votes for a specific user in a single query.\n * Much more efficient than querying each proposal individually.\n * Uses \"by_voter_proposal\" order to get all votes by a user.\n */\nexport function getUserProposalVotesQueryOptions(voter: string) {\n return queryOptions({\n queryKey: [\"proposals\", \"votes\", \"by-user\", voter],\n enabled: !!voter && voter !== \"\",\n staleTime: 60 * 1000, // Cache for 1 minute\n queryFn: async () => {\n if (!voter || voter === \"\") {\n return [];\n }\n\n const response = (await callRPC(\"database_api.list_proposal_votes\", {\n start: [voter],\n limit: 1000,\n order: \"by_voter_proposal\",\n order_direction: \"ascending\",\n status: \"votable\",\n })) as { proposal_votes: ProposalVote[] };\n\n // Filter to only this user's votes (API might return votes after this user alphabetically)\n const userVotes = (response.proposal_votes || []).filter((vote) => vote.voter === voter);\n\n return userVotes;\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting on proposals.\n */\nexport interface ProposalVotePayload {\n /** Array of proposal IDs to vote on */\n proposalIds: number[];\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting on Hive proposals.\n *\n * This mutation broadcasts an update_proposal_votes operation to vote on\n * one or more proposals in the Hive Decentralized Fund (HDF).\n *\n * @param username - The username voting on proposals (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 150) if adapter.recordActivity is available\n * - Invalidates proposal list cache to show updated vote status\n * - Invalidates voter's proposal votes cache\n *\n * **Multiple Proposals:**\n * - You can vote on multiple proposals in a single transaction\n * - All proposals receive the same vote (approve or disapprove)\n * - Proposal IDs are integers, not strings\n *\n * **Vote Types:**\n * - approve: true - Vote in favor of the proposal(s)\n * - approve: false - Remove your vote from the proposal(s)\n *\n * @example\n * ```typescript\n * const proposalVoteMutation = useProposalVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Approve a single proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: true\n * });\n *\n * // Approve multiple proposals\n * proposalVoteMutation.mutate({\n * proposalIds: [123, 124, 125],\n * approve: true\n * });\n *\n * // Remove vote from a proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: false\n * });\n * ```\n */\nexport function useProposalVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"vote\"],\n username,\n ({ proposalIds, approve }) => [\n buildProposalVoteOp(username!, proposalIds, approve)\n ],\n async (result: any) => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(150, txId, result?.block_num).catch((error) => {\n console.debug(\"[SDK][Proposals][useProposalVote] recordActivity failed\", {\n activityType: 150,\n blockNum: result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.proposals.list(),\n QueryKeys.proposals.votesByUser(username!)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useProposalVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for proposal votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalCreateOp, type ProposalCreatePayload } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport { type ProposalCreatePayload };\n\nexport function useProposalCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"create\"],\n username,\n (payload) => [\n buildProposalCreateOp(username!, payload)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.proposals.list(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get vesting delegations for an account with infinite scroll support\n *\n * @param username - The account username\n * @param limit - Maximum number of results per page (default: 50)\n */\nexport function getVestingDelegationsQueryOptions(\n username?: string,\n limit = 50\n) {\n return infiniteQueryOptions({\n queryKey: [\"wallet\", \"vesting-delegations\", username, limit],\n initialPageParam: \"\" as string,\n queryFn: async ({ pageParam }: { pageParam: string }) => {\n // Request one extra item on subsequent pages to handle inclusive cursor\n const fetchLimit = pageParam ? limit + 1 : limit;\n\n const result = await callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n pageParam || \"\",\n fetchLimit,\n ]) as DelegatedVestingShare[];\n\n // Filter out duplicate first item on subsequent pages\n // Hive API is inclusive of the 'from' cursor\n if (pageParam && result.length > 0 && result[0]?.delegatee === pageParam) {\n // Return at most limit items after removing the duplicate\n return result.slice(1, limit + 1);\n }\n\n return result;\n },\n getNextPageParam: (lastPage: DelegatedVestingShare[]) => {\n // If we got fewer results than limit, we've reached the end\n if (!lastPage || lastPage.length < limit) {\n return undefined;\n }\n\n // Return the last delegatee as cursor for next page\n const lastDelegation = lastPage[lastPage.length - 1];\n return lastDelegation?.delegatee;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { AccountDelegations } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\n\n/**\n * Account vesting delegations via the HAF balance-api REST endpoint\n * (`/balance-api/accounts/{account-name}/delegations`).\n *\n * Unlike `condenser_api.get_vesting_delegations` (see\n * {@link getHivePowerDelegatesInfiniteQueryOptions}), this returns the\n * complete outgoing AND incoming lists in a single request, with `callREST`\n * handling multi-node failover. `amount` is raw vests (vests * 10^6).\n */\nexport function getAccountDelegationsQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"assets\", \"account-delegations\", username],\n enabled: !!username,\n queryFn: ({ signal }) =>\n callREST(\n \"balance\",\n \"/accounts/{account-name}/delegations\",\n { \"account-name\": username },\n undefined,\n undefined,\n signal\n ) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { VestingDelegationExpiration } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get expiring vesting delegations for an account.\n *\n * When a delegation is removed (set to 0 VESTS), the HP doesn't return\n * immediately — it enters a 5-day cooldown. This query fetches those\n * in-flight expirations so they can be shown alongside active delegations.\n *\n * Uses database_api.find_vesting_delegation_expirations which returns\n * vesting_shares as NAI asset objects ({amount, nai, precision}).\n *\n * @param username - The delegator account username\n */\nexport function getVestingDelegationExpirationsQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"vesting-delegation-expirations\", username],\n queryFn: async () => {\n if (!username) return [];\n const result = await callRPC(\"database_api.find_vesting_delegation_expirations\", { account: username }) as { delegations: VestingDelegationExpiration[] };\n return result.delegations;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HBD to HIVE conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CollateralizedConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get collateralized HIVE to HBD conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getCollateralizedConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"collateralized-conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_collateralized_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { SavingsWithdrawRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get pending savings withdrawal requests for an account\n *\n * @param account - The account username\n */\nexport function getSavingsWithdrawFromQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"savings-withdraw\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_savings_withdraw_from\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.request_id - b.request_id),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get power down (vesting withdrawal) routes for an account\n *\n * @param account - The account username\n */\nexport function getWithdrawRoutesQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"withdraw-routes\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n account,\n \"outgoing\",\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OpenOrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get open market orders for an account\n *\n * @param user - The account username\n */\nexport function getOpenOrdersQueryOptions(user: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"open-orders\", user],\n queryFn: () =>\n callRPC(\"condenser_api.get_open_orders\", [\n user,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.orderid - b.orderid),\n enabled: !!user,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { RcDirectDelegation, RcDirectDelegationsResponse } from \"../types/rc-direct-delegation\";\n\ntype RcPage = RcDirectDelegation[];\ntype RcCursor = string | null;\n\n/**\n * Get outgoing RC delegations for an account\n *\n * @param username - Account name to get delegations for\n * @param limit - Number of delegations per page\n */\nexport function getOutgoingRcDelegationsInfiniteQueryOptions(username: string, limit = 100) {\n return infiniteQueryOptions<\n RcPage,\n Error,\n InfiniteData,\n (string | number)[],\n RcCursor\n >({\n queryKey: [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n initialPageParam: null as RcCursor,\n\n queryFn: async ({ pageParam }: { pageParam: RcCursor }) => {\n const response = await callRPC(\"rc_api.list_rc_direct_delegations\", {\n start: [username, pageParam ?? \"\"],\n limit,\n })\n .then((r: any) => r as RcDirectDelegationsResponse);\n\n let delegations: RcDirectDelegation[] = response.rc_direct_delegations || [];\n\n // Filter out the starting delegation when paginating\n if (pageParam) {\n delegations = delegations.filter((delegation) => delegation.to !== pageParam);\n }\n\n return delegations;\n },\n\n getNextPageParam: (lastPage: RcPage): RcCursor =>\n lastPage.length === limit ? lastPage[lastPage.length - 1].to : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { IncomingRcResponse } from \"../types\";\n\nexport function getIncomingRcQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"wallet\", \"incoming-rc\", username],\n enabled: !!username,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] - Missing username for incoming RC\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/received-rc/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch incoming RC: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { ReceivedVestingShare } from \"../types/received-vesting-share\";\n\nexport function getReceivedVestingSharesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"received-vesting-shares\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch received vesting shares: ${response.status}`);\n }\n\n const data = (await response.json()) as { list: ReceivedVestingShare[] };\n return data.list;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { RecurrentTransfer } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get recurrent transfers for an account\n *\n * @param username - The account username\n */\nexport function getRecurrentTransfersQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"recurrent-transfers\", username],\n queryFn: () =>\n callRPC(\"condenser_api.find_recurrent_transfers\", [\n username,\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { ConfigManager } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\ntype PortfolioLayer = \"points\" | \"hive\" | \"chain\" | \"engine\";\n\ninterface TokenAction {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface PortfolioWalletItem {\n name: string;\n symbol: string;\n layer: PortfolioLayer;\n balance: number;\n fiatRate: number;\n currency: string;\n precision: number;\n address?: string;\n error?: string;\n pendingRewards?: number;\n pendingRewardsFiat?: number;\n liquid?: number;\n liquidFiat?: number;\n savings?: number;\n savingsFiat?: number;\n staked?: number;\n stakedFiat?: number;\n iconUrl?: string;\n actions?: TokenAction[];\n extraData?: Array<{ dataKey: string; value: any }>;\n apr?: number;\n}\n\nexport interface PortfolioResponse {\n username: string;\n currency?: string;\n wallets: PortfolioWalletItem[];\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const direct = Number.parseFloat(trimmed);\n if (Number.isFinite(direct)) {\n return direct;\n }\n\n const sanitized = trimmed.replace(/,/g, \"\");\n const match = sanitized.match(/[-+]?\\d+(?:\\.\\d+)?/);\n if (match) {\n const parsed = Number.parseFloat(match[0]);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseToken(rawToken: unknown): PortfolioWalletItem | undefined {\n if (!rawToken || typeof rawToken !== \"object\") {\n return undefined;\n }\n\n const token = rawToken as Record;\n\n // Portfolio v2 returns well-defined PortfolioItem structure\n return {\n name: normalizeString(token.name) ?? \"\",\n symbol: normalizeString(token.symbol) ?? \"\",\n layer: (normalizeString(token.layer) ?? \"hive\") as PortfolioLayer,\n balance: normalizeNumber(token.balance) ?? 0,\n fiatRate: normalizeNumber(token.fiatRate) ?? 0,\n currency: normalizeString(token.currency) ?? \"usd\",\n precision: normalizeNumber(token.precision) ?? 3,\n address: normalizeString(token.address),\n error: normalizeString(token.error),\n pendingRewards: normalizeNumber(token.pendingRewards),\n pendingRewardsFiat: normalizeNumber(token.pendingRewardsFiat),\n liquid: normalizeNumber(token.liquid),\n liquidFiat: normalizeNumber(token.liquidFiat),\n savings: normalizeNumber(token.savings),\n savingsFiat: normalizeNumber(token.savingsFiat),\n staked: normalizeNumber(token.staked),\n stakedFiat: normalizeNumber(token.stakedFiat),\n iconUrl: normalizeString(token.iconUrl),\n actions: (token.actions ?? []) as TokenAction[],\n extraData: (token.extraData ?? []) as Array<{ dataKey: string; value: any }>,\n apr: normalizeNumber(token.apr),\n };\n}\n\nfunction extractTokens(payload: unknown): unknown[] {\n if (!payload || typeof payload !== \"object\") {\n return [];\n }\n\n const containers = [payload];\n const record = payload as Record;\n if (record.data && typeof record.data === \"object\") {\n containers.push(record.data as Record);\n }\n if (record.result && typeof record.result === \"object\") {\n containers.push(record.result as Record);\n }\n if (record.portfolio && typeof record.portfolio === \"object\") {\n containers.push(record.portfolio as Record);\n }\n\n for (const container of containers) {\n if (Array.isArray(container)) {\n return container;\n }\n\n if (container && typeof container === \"object\") {\n for (const key of [\n \"wallets\",\n \"tokens\",\n \"assets\",\n \"items\",\n \"portfolio\",\n \"balances\",\n ]) {\n const value = (container as Record)[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n }\n\n return [];\n}\n\nfunction resolveUsername(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record;\n return (\n normalizeString(record.username) ??\n normalizeString(record.name) ??\n normalizeString(record.account)\n );\n}\n\n/**\n * Get portfolio query options for fetching user's wallet balances across all layers\n * @param username - Hive username\n * @param currency - Fiat currency code (default: \"usd\")\n * @param onlyEnabled - Only return enabled tokens (default: true)\n * @returns TanStack Query options for portfolio data\n */\nexport function getPortfolioQueryOptions(\n username: string,\n currency: string = \"usd\",\n onlyEnabled: boolean = true\n) {\n return queryOptions({\n queryKey: [\n \"wallet\",\n \"portfolio\",\n \"v2\",\n username,\n onlyEnabled ? \"only-enabled\" : \"all\",\n currency,\n ],\n enabled: Boolean(username),\n staleTime: 60000,\n refetchInterval: 120000,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] – username is required\");\n }\n\n const endpoint = `${ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, onlyEnabled, currency }),\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallet] – Portfolio request failed (${response.status})`\n );\n }\n\n const payload = (await response.json()) as unknown;\n const tokens = extractTokens(payload)\n .map((item) => parseToken(item))\n .filter((item): item is PortfolioWalletItem => Boolean(item))\n // Backend may still emit removed SPK-layer items; drop them defensively\n .filter((item) => (item.layer as string) !== \"spk\");\n\n if (!tokens.length) {\n throw new Error(\n \"[SDK][Wallet] – Portfolio payload contained no tokens\"\n );\n }\n\n return {\n username: resolveUsername(payload) ?? username,\n currency: normalizeString(\n (payload as Record | undefined)?.fiatCurrency ??\n (payload as Record | undefined)?.currency\n )?.toUpperCase(),\n wallets: tokens,\n };\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHiveAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n\n if (!accountData) {\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: 0,\n } satisfies GeneralAssetInfo;\n }\n\n const liquidBalance = parseAsset(accountData.balance).amount;\n const savingsBalance = parseAsset(accountData.savings_balance).amount;\n\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: liquidBalance + savingsBalance,\n parts: [\n {\n name: \"current\",\n balance: liquidBalance,\n },\n {\n name: \"savings\",\n balance: savingsBalance,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHbdAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hbd\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n\n const price = 1;\n\n if (!accountData) {\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance: 0,\n };\n }\n\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance:\n parseAsset(accountData.hbd_balance).amount +\n parseAsset(accountData?.savings_hbd_balance).amount,\n apr: ((dynamicProps?.hbdInterestRate ?? 0) / 100).toFixed(3),\n parts: [\n {\n name: \"current\",\n balance: parseAsset(accountData.hbd_balance).amount,\n },\n {\n name: \"savings\",\n balance: parseAsset(accountData.savings_hbd_balance).amount,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { isEmptyDate, parseAsset, vestsToHp } from \"@/modules/core/utils\";\n\nfunction getAPR(dynamicProps: DynamicProps) {\n const initialInflationRate = 9.5;\n const initialBlock = 7000000;\n const decreaseRate = 250000;\n const decreasePercentPerIncrement = 0.01;\n\n const headBlock = dynamicProps.headBlock;\n const deltaBlocks = headBlock - initialBlock;\n const decreaseIncrements = deltaBlocks / decreaseRate;\n\n let currentInflationRate =\n initialInflationRate - decreaseIncrements * decreasePercentPerIncrement;\n\n if (currentInflationRate < 0.95) {\n currentInflationRate = 0.95;\n }\n\n const vestingRewardPercent = dynamicProps.vestingRewardPercent / 10000;\n const virtualSupply = dynamicProps.virtualSupply;\n const totalVestingFunds = dynamicProps.totalVestingFund;\n\n return (\n (virtualSupply * currentInflationRate * vestingRewardPercent) /\n totalVestingFunds\n ).toFixed(3);\n}\n\nexport function getHivePowerAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n if (!dynamicProps || !accountData) {\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price: 0,\n accountBalance: 0,\n };\n }\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n const price = Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps.base / dynamicProps.quote;\n\n const vestingShares = parseAsset(accountData.vesting_shares).amount;\n const delegatedVests = parseAsset(\n accountData.delegated_vesting_shares\n ).amount;\n const receivedVests = parseAsset(\n accountData.received_vesting_shares\n ).amount;\n const withdrawRateVests = parseAsset(\n accountData.vesting_withdraw_rate\n ).amount;\n const remainingToWithdrawVests = Math.max(\n (Number(accountData.to_withdraw) - Number(accountData.withdrawn)) /\n 1e6,\n 0\n );\n const nextWithdrawalVests = !isEmptyDate(\n accountData.next_vesting_withdrawal\n )\n ? Math.min(withdrawRateVests, remainingToWithdrawVests)\n : 0;\n\n const hpBalance = +vestsToHp(\n vestingShares,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const outgoingDelegationsHp = +vestsToHp(\n delegatedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const incomingDelegationsHp = +vestsToHp(\n receivedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const pendingPowerDownHp = +vestsToHp(\n remainingToWithdrawVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const nextPowerDownHp = +vestsToHp(\n nextWithdrawalVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const totalBalance = Math.max(hpBalance - pendingPowerDownHp, 0);\n const availableHp = Math.max(hpBalance - outgoingDelegationsHp, 0);\n\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price,\n accountBalance: +totalBalance.toFixed(3),\n apr: getAPR(dynamicProps),\n parts: [\n {\n name: \"hp_balance\",\n balance: hpBalance,\n },\n {\n name: \"available\",\n balance: +availableHp.toFixed(3),\n },\n {\n name: \"outgoing_delegations\",\n balance: outgoingDelegationsHp,\n },\n {\n name: \"incoming_delegations\",\n balance: incomingDelegationsHp,\n },\n ...(pendingPowerDownHp > 0\n ? [\n {\n name: \"pending_power_down\",\n balance: +pendingPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ...(nextPowerDownHp > 0 && nextPowerDownHp !== pendingPowerDownHp\n ? [\n {\n name: \"next_power_down\",\n balance: +nextPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { utils } from \"../../../hive-tx\";\nimport { HiveOperationGroup } from \"../types\";\nconst ops = utils.operations;\n\nexport const HIVE_ACCOUNT_OPERATION_GROUPS: Record<\n HiveOperationGroup,\n number[]\n> = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n \"\": [],\n};\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nexport const HIVE_OPERATION_LIST = Object.keys(\n utils.operations\n) as HiveOperationName[];\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nconst operationOrders = utils.operations as Record<\n HiveOperationName,\n number\n>;\n\nexport const HIVE_OPERATION_ORDERS = operationOrders;\n\nexport const HIVE_OPERATION_NAME_BY_ID: Record =\n Object.entries(operationOrders).reduce((acc, [name, id]) => {\n acc[id] = name as HiveOperationName;\n return acc;\n }, {} as Record);\n","import { callRPC } from \"../../../hive-tx\";\nimport { utils } from \"../../../hive-tx\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { HIVE_ACCOUNT_OPERATION_GROUPS } from \"../consts\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationFilterKey,\n HiveOperationFilterValue,\n HiveOperationGroup,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nconst operationOrders = utils.operations;\n\nfunction isHiveOperationName(value: string): value is HiveOperationName {\n return Object.prototype.hasOwnProperty.call(operationOrders, value);\n}\n\nexport function resolveHiveOperationFilters(filters: HiveOperationFilter): {\n filterKey: HiveOperationFilterKey;\n filterArgs: any[];\n} {\n const rawValues: HiveOperationFilterValue[] = Array.isArray(filters)\n ? filters\n : [filters];\n\n const hasAll = rawValues.includes(\"\" as HiveOperationGroup);\n\n const uniqueValues = Array.from(\n new Set(\n rawValues.filter(\n (value): value is HiveOperationFilterValue =>\n value !== undefined &&\n value !== null &&\n value !== (\"\" as HiveOperationGroup)\n )\n )\n );\n\n const filterKey: HiveOperationFilterKey =\n hasAll || uniqueValues.length === 0\n ? \"all\"\n : uniqueValues\n .map((value) => value.toString())\n .sort()\n .join(\"|\");\n\n const operationIds = new Set();\n\n if (!hasAll) {\n uniqueValues.forEach((value) => {\n if (value in HIVE_ACCOUNT_OPERATION_GROUPS) {\n HIVE_ACCOUNT_OPERATION_GROUPS[value as HiveOperationGroup].forEach(\n (id) => operationIds.add(id)\n );\n return;\n }\n\n if (isHiveOperationName(value)) {\n operationIds.add(operationOrders[value]);\n }\n });\n }\n\n const filterArgs = makeBitMaskFilter(Array.from(operationIds));\n\n return {\n filterKey,\n filterArgs,\n };\n}\n\nfunction makeBitMaskFilter(allowedOperations: number[]) {\n let low = 0n;\n let high = 0n;\n\n allowedOperations.forEach((operation) => {\n if (operation < 64) {\n low |= 1n << BigInt(operation);\n } else {\n high |= 1n << BigInt(operation - 64);\n }\n });\n\n return [\n low !== 0n ? low.toString() : null,\n high !== 0n ? high.toString() : null,\n ];\n}\n\nexport function getHiveAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterArgs, filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n initialData: { pages: [], pageParams: [] },\n initialPageParam: -1,\n getNextPageParam: (lastPage, __) =>\n lastPage ? +(lastPage[lastPage.length - 1]?.num ?? 0) - 1 : -1,\n\n queryFn: async ({ pageParam }) => {\n const response = await callRPC(\n \"condenser_api.get_account_history\",\n [username, pageParam, limit, ...filterArgs]\n );\n\n return response.map(\n (x: any) =>\n ({\n num: x[0],\n type: x[1].op[0],\n timestamp: x[1].timestamp,\n trx_id: x[1].trx_id,\n ...x[1].op[1],\n }) satisfies HiveTransaction\n );\n },\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hivePayout = parseAsset(\n (item as AuthorReward).hive_payout\n );\n return hivePayout.amount > 0;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HIVE\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HIVE\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HIVE\"].includes(asset.symbol);\n\n case \"claim_reward_balance\":\n const rewardHive = parseAsset(\n (item as ClaimRewardBalance).reward_hive\n );\n return rewardHive.amount > 0;\n\n case \"curation_reward\":\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHbdAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hbdPayout = parseAsset(\n (item as AuthorReward).hbd_payout\n );\n return hbdPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardHbd = parseAsset(\n (item as ClaimRewardBalance).reward_hbd\n );\n return rewardHbd.amount > 0;\n\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HBD\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HBD\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HBD\"].includes(asset.symbol);\n\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n case \"proposal_pay\":\n case \"interest\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHivePowerAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n const userSelectedOperations = new Set(\n Array.isArray(filters) ? filters : [filters]\n );\n const hasAllFilter =\n userSelectedOperations.has(\"\" as any) || userSelectedOperations.size === 0;\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const vestingPayout = parseAsset(\n (item as AuthorReward).vesting_payout\n );\n return vestingPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardVests = parseAsset(\n (item as ClaimRewardBalance).reward_vests\n );\n return rewardVests.amount > 0;\n\n case \"transfer_to_vesting\":\n return true;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"recurrent_transfer\":\n return [\"VESTS\", \"HP\"].includes(parseAsset(item.amount).symbol);\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"VESTS\", \"HP\"].includes(asset.symbol);\n\n case \"curation_reward\":\n case \"withdraw_vesting\":\n case \"delegate_vesting_shares\":\n case \"fill_vesting_withdraw\":\n case \"return_vesting_delegation\":\n case \"producer_reward\":\n case \"set_withdraw_vesting_route\":\n return true;\n default:\n return hasAllFilter || userSelectedOperations.has(item.type);\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveMarketMetric } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nfunction subtractSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() - seconds * 1000);\n}\n\nexport function getHiveAssetMetricQueryOptions(bucketSeconds = 86_400) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n queryFn: async ({ pageParam: [startDate, endDate] }) => {\n const apiData: HiveMarketMetric[] = await callRPC(\"condenser_api.get_market_history\", [bucketSeconds, formatDate(startDate), formatDate(endDate)]\n );\n\n return apiData.map(({ hive, non_hive, open }) => ({\n close: non_hive.close / hive.close,\n open: non_hive.open / hive.open,\n low: non_hive.low / hive.low,\n high: non_hive.high / hive.high,\n volume: hive.volume,\n time: new Date(open),\n }));\n },\n initialPageParam: [\n subtractSeconds(new Date(), Math.max(100 * bucketSeconds, 28_800)),\n new Date(),\n ],\n getNextPageParam: (_, __, [prevStartDate]) => [\n subtractSeconds(prevStartDate, Math.max(100 * bucketSeconds, 28_800)),\n subtractSeconds(prevStartDate, bucketSeconds),\n ],\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHiveAssetWithdrawalRoutesQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"withdrawal-routes\", username],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n username,\n \"outgoing\",\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHivePowerDelegatesInfiniteQueryOptions(\n username: string,\n limit = 50\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegates\", username],\n enabled: !!username,\n queryFn: () =>\n callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n \"\",\n limit,\n ]) as Promise,\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { ReceivedVestingShare } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHivePowerDelegatingsQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegatings\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()).list as ReceivedVestingShare[];\n },\n select: (data) =>\n data.sort(\n (a, b) =>\n parseAsset(b.vesting_shares).amount -\n parseAsset(a.vesting_shares).amount\n ),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get the internal HIVE/HBD market order book\n *\n * @param limit - Maximum number of orders to fetch (default: 500)\n */\nexport function getOrderBookQueryOptions(limit = 500) {\n return queryOptions({\n queryKey: [\"market\", \"order-book\", limit],\n queryFn: () =>\n callRPC(\"condenser_api.get_order_book\", [\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market statistics from the blockchain\n */\nexport function getMarketStatisticsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"statistics\"],\n queryFn: () =>\n callRPC(\"condenser_api.get_ticker\", []) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketCandlestickDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market history (candlestick data)\n *\n * @param seconds - Bucket size in seconds\n * @param startDate - Start date for the data\n * @param endDate - End date for the data\n */\nexport function getMarketHistoryQueryOptions(\n seconds: number,\n startDate: Date,\n endDate: Date\n) {\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n return queryOptions({\n queryKey: [\"market\", \"history\", seconds, startDate.getTime(), endDate.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_market_history\", [\n seconds,\n formatDate(startDate),\n formatDate(endDate),\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveHbdStats, MarketCandlestickDataItem, MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get combined HIVE/HBD statistics including price, 24h change, and volume\n */\nexport function getHiveHbdStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"hive-hbd-stats\"],\n queryFn: async () => {\n // Get current market statistics\n const stats = (await callRPC(\"condenser_api.get_ticker\", [])) as MarketStatistics;\n\n // Get 24h market history\n const now = new Date();\n const oneDayAgo = new Date(now.getTime() - 86400000); // 24 hours ago\n\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n const dayChange = (await callRPC(\"condenser_api.get_market_history\", [86400, formatDate(oneDayAgo), formatDate(now)]\n )) as MarketCandlestickDataItem[];\n\n // Calculate stats\n const result: HiveHbdStats = {\n price: +stats.latest,\n close: dayChange[0] ? dayChange[0].non_hive.open / dayChange[0].hive.open : 0,\n high: dayChange[0] ? dayChange[0].non_hive.high / dayChange[0].hive.high : 0,\n low: dayChange[0] ? dayChange[0].non_hive.low / dayChange[0].hive.low : 0,\n percent: dayChange[0]\n ? 100 - ((dayChange[0].non_hive.open / dayChange[0].hive.open) * 100) / +stats.latest\n : 0,\n totalFromAsset: stats.hive_volume.split(\" \")[0],\n totalToAsset: stats.hbd_volume.split(\" \")[0],\n };\n\n return result;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketData } from \"../types\";\nimport { getBoundFetch } from \"@/modules/core\";\n\n/**\n * Get market chart data from CoinGecko API\n *\n * @param coin - Coin ID (e.g., \"hive\", \"bitcoin\")\n * @param vsCurrency - Currency to compare against (e.g., \"usd\", \"eur\")\n * @param fromTs - From timestamp (Unix timestamp in seconds)\n * @param toTs - To timestamp (Unix timestamp in seconds)\n */\nexport function getMarketDataQueryOptions(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n) {\n return queryOptions({\n queryKey: [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n queryFn: async ({ signal }) => {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n\n const response = await fetchApi(url, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch market data: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date) {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n}\n\nexport function getTradeHistoryQueryOptions(\n limit = 1000,\n startDate?: Date,\n endDate?: Date\n) {\n const end = endDate ?? new Date();\n const start =\n startDate ?? new Date(end.getTime() - 10 * 60 * 60 * 1000);\n\n return queryOptions({\n queryKey: [\"market\", \"trade-history\", limit, start.getTime(), end.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_trade_history\", [\n formatDate(start),\n formatDate(end),\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FeedHistoryItem {\n id: number;\n current_median_history: {\n base: string;\n quote: string;\n };\n market_median_history: {\n base: string;\n quote: string;\n };\n current_min_history: {\n base: string;\n quote: string;\n };\n current_max_history: {\n base: string;\n quote: string;\n };\n price_history: Array<{\n base: string;\n quote: string;\n }>;\n}\n\n/**\n * Get feed history from the blockchain\n * Returns price feed history including median prices\n */\nexport function getFeedHistoryQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"feed-history\"],\n queryFn: async () => {\n try {\n const feedHistory = await callRPC(\"condenser_api.get_feed_history\", []);\n return feedHistory as FeedHistoryItem;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface MedianHistoryPrice {\n base: string;\n quote: string;\n}\n\n/**\n * Get current median history price from the blockchain\n * Returns the current median price for HIVE/HBD conversion\n */\nexport function getCurrentMedianHistoryPriceQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"current-median-history-price\"],\n queryFn: async () => {\n try {\n const price = await callRPC(\"condenser_api.get_current_median_history_price\", []);\n return price as MedianHistoryPrice;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCreateOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCreatePayload {\n amountToSell: string;\n minToReceive: string;\n fillOrKill: boolean;\n expiration: string;\n orderId: number;\n}\n\nexport function useLimitOrderCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-create\"],\n username,\n (payload) => [\n buildLimitOrderCreateOp(\n username!,\n payload.amountToSell,\n payload.minToReceive,\n payload.fillOrKill,\n payload.expiration,\n payload.orderId\n )\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCancelOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCancelPayload {\n orderId: number;\n}\n\nexport function useLimitOrderCancel(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-cancel\"],\n username,\n ({ orderId }) => [\n buildLimitOrderCancelOp(username!, orderId)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { MarketData } from \"./types\";\nimport { CurrencyRates } from \"@/modules/private-api/types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n const data = (await response.json()) as T;\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n return data;\n}\n\nexport async function getMarketData(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n): Promise {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n const response = await fetchApi(url);\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRate(cur: string): Promise {\n if (cur === \"hbd\") {\n return 1;\n }\n\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${cur}`;\n const response = await fetchApi(url);\n const data = await parseJsonResponse<{ hive_dollar: Record }>(response);\n return data.hive_dollar[cur];\n}\n\nexport async function getCurrencyTokenRate(currency: string, token: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost +\n `/private-api/market-data/${currency === \"hbd\" ? \"usd\" : currency}/${token}`\n );\n\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRates(): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/market-data/latest\");\n return parseJsonResponse(response);\n}\n\nexport async function getHivePrice(): Promise<{ hive: { usd: number } }> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n \"https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd\"\n );\n return parseJsonResponse<{ hive: { usd: number } }>(response);\n}\n","import { ConfigManager, getBoundFetch } from \"@/modules/core\";\nimport type { HiveEngineOpenOrder } from \"./types\";\n\ntype EngineOrderBookEntry = {\n txId: string;\n timestamp: number;\n account: string;\n symbol: string;\n quantity: string;\n price: string;\n tokensLocked?: string;\n};\n\nconst ENGINE_RPC_HEADERS = { \"Content-type\": \"application/json\" };\n\nasync function engineRpc(payload: Record): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(`${baseUrl}/private-api/engine-api`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: ENGINE_RPC_HEADERS,\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – request failed with ${response.status}`\n );\n }\n\n const data = (await response.json()) as { result: T };\n return data.result;\n}\n\nasync function engineRpcSafe(\n payload: Record,\n fallback: T\n): Promise {\n try {\n return await engineRpc(payload);\n } catch (e) {\n return fallback;\n }\n}\n\nexport async function getHiveEngineOrderBook(\n symbol: string,\n limit: number = 50\n): Promise<{ buy: T[]; sell: T[] }> {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buy, sell] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"price\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"price\", descending: false }],\n },\n },\n []\n ),\n ]);\n\n const sortByPriceDesc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return right - left;\n });\n const sortByPriceAsc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return left - right;\n });\n\n return {\n buy: sortByPriceDesc(buy),\n sell: sortByPriceAsc(sell),\n };\n}\n\nexport async function getHiveEngineTradeHistory>(\n symbol: string,\n limit: number = 50\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"tradesHistory\",\n query: { symbol },\n limit,\n offset: 0,\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineOpenOrders(\n account: string,\n symbol: string,\n limit: number = 100\n): Promise {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol, account },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buyRaw, sellRaw] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n ]);\n\n const formatTotal = (quantity: string, price: string) =>\n (Number(quantity || 0) * Number(price || 0)).toFixed(8);\n\n const buy: HiveEngineOpenOrder[] = buyRaw.map((order) => ({\n id: order.txId,\n type: \"buy\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: order.tokensLocked ?? formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n const sell: HiveEngineOpenOrder[] = sellRaw.map((order) => ({\n id: order.txId,\n type: \"sell\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n return [...buy, ...sell].sort((a, b) => b.timestamp - a.timestamp) as T[];\n}\n\n/**\n * Market metrics, optionally narrowed to one symbol or to a list of them.\n *\n * An unfiltered call is served from a single page – the node caps `find` at 1000 rows\n * while Hive engine has far more traded tokens than that – so callers that only care\n * about specific symbols must pass them. Scanning the unfiltered page for a symbol\n * silently reports \"no market\" for everything outside it.\n */\nexport async function getHiveEngineMetrics>(\n symbol?: string | string[],\n account?: string\n): Promise {\n if (Array.isArray(symbol) && symbol.length === 0) {\n return [];\n }\n\n const symbolQuery = Array.isArray(symbol)\n ? { symbol: { $in: symbol } }\n : symbol\n ? { symbol }\n : {};\n\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"metrics\",\n query: {\n ...symbolQuery,\n ...(account ? { account } : {}),\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMarket>(\n account?: string,\n symbol?: string | string[]\n): Promise {\n return getHiveEngineMetrics(symbol, account);\n}\n\nexport async function getHiveEngineTokensBalances>(\n username: string\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"balances\",\n query: {\n account: username,\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMetadata>(\n tokens: string[]\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"tokens\",\n query: {\n symbol: { $in: tokens },\n },\n },\n id: 2,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokenTransactions>(\n username: string,\n symbol: string,\n limit: number,\n offset: number\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-account-history\", baseUrl);\n url.searchParams.set(\"account\", username);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"limit\", limit.toString());\n url.searchParams.set(\"offset\", offset.toString());\n\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – account history failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineTokenMetrics>(\n symbol: string,\n interval = \"daily\"\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-chart-api\", baseUrl);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"interval\", interval);\n\n const response = await fetchApi(url.toString(), {\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – chart failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineUnclaimedRewards>(\n username: string\n): Promise> {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(\n `${baseUrl}/private-api/engine-reward-api/${username}?hive=1`\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – rewards failed with ${response.status}`\n );\n }\n\n return (await response.json()) as Record;\n}\n","import { getHiveEngineTokensBalances } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenBalance } from \"../types\";\n\nexport function getHiveEngineTokensBalancesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"balances\", username] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensBalances(username);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMarketResponse } from \"../types\";\nimport { getHiveEngineTokensMarket } from \"../requests\";\n\nexport function getHiveEngineTokensMarketQueryOptions() {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"markets\"],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMarket();\n },\n });\n}\n","import { getHiveEngineTokensMetadata } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenMetadataResponse } from \"../types\";\n\nexport function getHiveEngineTokensMetadataQueryOptions(tokens: string[]) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"metadata-list\", tokens] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMetadata(tokens);\n },\n });\n}\n","import { getHiveEngineTokenTransactions } from \"../requests\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTransaction } from \"../types\";\n\nexport function getHiveEngineTokenTransactionsQueryOptions(\n username: string | undefined,\n symbol: string,\n limit = 20\n) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"transactions\", username],\n enabled: !!symbol && !!username,\n initialPageParam: 0,\n queryFn: async ({ pageParam }) => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n return getHiveEngineTokenTransactions(\n username,\n symbol,\n limit,\n pageParam as number\n );\n },\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n (lastPage?.length ?? 0) === limit ? (lastPageParam as number) + limit : undefined,\n getPreviousPageParam: (_firstPage, _allPages, firstPageParam) =>\n (firstPageParam as number) > 0 ? (firstPageParam as number) - limit : undefined,\n });\n}\n","import { getHiveEngineTokenMetrics } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMetric } from \"../types\";\n\nexport function getHiveEngineTokensMetricsQueryOptions(\n symbol: string,\n interval = \"daily\"\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokenMetrics(symbol, interval);\n },\n });\n}\n","import { getHiveEngineUnclaimedRewards } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenStatus } from \"../types\";\n\nexport function getHiveEngineUnclaimedRewardsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"unclaimed\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n enabled: !!username,\n queryFn: async () => {\n try {\n const data = await getHiveEngineUnclaimedRewards(\n username as string\n );\n return Object.values(data).filter(\n ({ pending_token }) => pending_token > 0\n );\n } catch (e) {\n return [];\n }\n },\n });\n}\n","import { getHiveEngineTokensMarket } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenInfo } from \"../types\";\n\nexport function getAllHiveEngineTokensQueryOptions(\n account?: string,\n symbol?: string | string[]\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"all-tokens\", account, symbol] as const,\n queryFn: async () => {\n return getHiveEngineTokensMarket(account, symbol);\n },\n });\n}\n","interface Options {\n fractionDigits?: number;\n prefix?: string;\n suffix?: string;\n}\n\nexport function formattedNumber(\n value: number | string,\n options: Options | undefined = undefined\n) {\n let opts: Options = {\n fractionDigits: 3,\n prefix: \"\",\n suffix: \"\",\n };\n\n if (options) {\n opts = { ...opts, ...options };\n }\n\n const { fractionDigits, prefix, suffix } = opts;\n\n let out = \"\";\n\n if (prefix) out += prefix + \" \";\n // turn too small values to zero. Bug: https://github.com/adamwdraper/Numeral-js/issues/563\n const av = Math.abs(parseFloat(value.toString())) < 0.0001 ? 0 : value;\n const num = typeof av === \"string\" ? parseFloat(av) : av;\n out += num.toLocaleString(\"en-US\", {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n useGrouping: true,\n });\n if (suffix) out += \" \" + suffix;\n\n return out;\n}\n","import { formattedNumber } from \"./formatted-number\";\n\ninterface HiveEngineTokenProps {\n symbol: string;\n name: string;\n icon: string;\n precision: number;\n stakingEnabled: boolean;\n delegationEnabled: boolean;\n balance: string;\n stake: string;\n delegationsIn: string;\n delegationsOut: string;\n usdValue: number;\n}\n\nexport class HiveEngineToken {\n symbol: string;\n name?: string;\n icon?: string;\n\n precision?: number;\n stakingEnabled?: boolean;\n delegationEnabled?: boolean;\n balance: number;\n stake: number;\n stakedBalance: number;\n delegationsIn: number;\n delegationsOut: number;\n usdValue: number;\n\n constructor(props: HiveEngineTokenProps) {\n this.symbol = props.symbol;\n this.name = props.name || \"\";\n this.icon = props.icon || \"\";\n\n this.precision = props.precision || 0;\n this.stakingEnabled = props.stakingEnabled || false;\n this.delegationEnabled = props.delegationEnabled || false;\n this.balance = parseFloat(props.balance) || 0;\n this.stake = parseFloat(props.stake) || 0;\n this.delegationsIn = parseFloat(props.delegationsIn) || 0;\n this.delegationsOut = parseFloat(props.delegationsOut) || 0;\n this.stakedBalance =\n this.stake + this.delegationsIn - this.delegationsOut;\n this.usdValue = props.usdValue;\n }\n\n hasDelegations = (): boolean => {\n if (!this.delegationEnabled) {\n return false;\n }\n\n return this.delegationsIn > 0 && this.delegationsOut > 0;\n };\n\n delegations = (): string => {\n if (!this.hasDelegations()) {\n return \"\";\n }\n\n return `(${formattedNumber(this.stake, {\n fractionDigits: this.precision,\n })} + ${formattedNumber(this.delegationsIn, {\n fractionDigits: this.precision,\n })} - ${formattedNumber(this.delegationsOut, {\n fractionDigits: this.precision,\n })})`;\n };\n\n staked = (): string => {\n if (!this.stakingEnabled) {\n return \"-\";\n }\n\n if (this.stakedBalance < 0.0001) {\n return this.stakedBalance.toString();\n }\n\n return formattedNumber(this.stakedBalance, {\n fractionDigits: this.precision,\n });\n };\n\n balanced = (): string => {\n if (this.balance < 0.0001) {\n return this.balance.toString();\n }\n\n return formattedNumber(this.balance, { fractionDigits: this.precision });\n };\n}\n","import {\n getHiveEngineTokensBalances,\n getHiveEngineTokensMarket,\n getHiveEngineTokensMetadata,\n} from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type {\n HiveEngineTokenBalance,\n Token,\n TokenMetadata,\n HiveEngineTokenInfo,\n} from \"../types\";\nimport { HiveEngineToken } from \"../utils\";\n\ninterface DynamicProps {\n base: number;\n quote: number;\n}\n\nexport function getHiveEngineBalancesWithUsdQueryOptions(\n account: string,\n dynamicProps?: DynamicProps,\n allTokens?: HiveEngineTokenInfo[]\n) {\n return queryOptions({\n queryKey: [\n \"assets\",\n \"hive-engine\",\n \"balances-with-usd\",\n account,\n dynamicProps,\n allTokens,\n ] as const,\n queryFn: async () => {\n if (!account) {\n throw new Error(\"[HiveEngine] No account in a balances query\");\n }\n\n const balances = await getHiveEngineTokensBalances(account);\n\n const tokens = await getHiveEngineTokensMetadata(\n balances.map((t) => t.symbol)\n );\n\n const pricePerHive = dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0;\n const providedMetrics: ReadonlyArray = Array.isArray(\n allTokens\n )\n ? allTokens\n : [];\n\n // Whatever the caller passed comes from an unfiltered metrics call, which the node\n // caps at 1000 rows – held tokens outside that page have no price and used to be\n // valued at zero, understating the wallet. Ask for the missing ones by symbol.\n const unpricedSymbols = balances\n .map((balance) => balance.symbol)\n .filter(\n (symbol) =>\n symbol !== \"SWAP.HIVE\" &&\n !providedMetrics.some((metric) => metric.symbol === symbol)\n );\n\n const metrics: ReadonlyArray = [\n ...providedMetrics,\n ...(unpricedSymbols.length\n ? await getHiveEngineTokensMarket(\n undefined,\n unpricedSymbols\n )\n : []),\n ];\n\n return balances.map((balance) => {\n const token = tokens.find((t) => t.symbol === balance.symbol);\n let tokenMetadata: TokenMetadata | undefined;\n\n if (token?.metadata) {\n try {\n tokenMetadata = JSON.parse(token.metadata) as TokenMetadata;\n } catch {\n tokenMetadata = undefined;\n }\n }\n\n const metric = metrics.find((m) => m.symbol === balance.symbol);\n const lastPrice = Number(metric?.lastPrice ?? \"0\");\n const balanceAmount = Number(balance.balance);\n\n const usdValue =\n balance.symbol === \"SWAP.HIVE\"\n ? pricePerHive * balanceAmount\n : lastPrice === 0\n ? 0\n : Number(\n (lastPrice * pricePerHive * balanceAmount).toFixed(10)\n );\n\n return new HiveEngineToken({\n symbol: balance.symbol,\n name: token?.name ?? balance.symbol,\n icon: tokenMetadata?.icon ?? \"\",\n precision: token?.precision ?? 0,\n stakingEnabled: token?.stakingEnabled ?? false,\n delegationEnabled: token?.delegationEnabled ?? false,\n balance: balance.balance,\n stake: balance.stake,\n delegationsIn: balance.delegationsIn,\n delegationsOut: balance.delegationsOut,\n usdValue,\n });\n });\n },\n enabled: !!account,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getHiveEngineTokensMetadataQueryOptions } from \"./get-hive-engine-tokens-metadata-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"./get-hive-engine-tokens-balances-query-options\";\nimport { getAllHiveEngineTokensQueryOptions } from \"./get-all-hive-engine-tokens-query-options\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"@/modules/wallet/queries/get-hive-asset-general-info-query-options\";\n\nexport function getHiveEngineTokenGeneralInfoQueryOptions(\n username?: string,\n symbol?: string\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"general-info\", username],\n enabled: !!symbol && !!username,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n const queryClient = getQueryClient();\n const hiveQuery = getHiveAssetGeneralInfoQueryOptions(username);\n await queryClient.prefetchQuery(hiveQuery);\n const hiveData = queryClient.getQueryData(\n hiveQuery.queryKey\n );\n\n const metadataList = await queryClient.ensureQueryData(\n getHiveEngineTokensMetadataQueryOptions([symbol])\n );\n\n const balanceList = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n // Scoped to this symbol: the unfiltered metrics call is capped at 1000 rows, so a\n // token outside that page reported no market and rendered a zero price.\n const marketList = await queryClient.ensureQueryData(\n getAllHiveEngineTokensQueryOptions(undefined, symbol)\n );\n\n const metadata = metadataList?.find((i) => i.symbol === symbol);\n const balance = balanceList?.find((i) => i.symbol === symbol);\n const market = marketList?.find((i) => i.symbol === symbol);\n\n const lastPrice = +(market?.lastPrice ?? \"0\");\n\n const liquidBalance = parseFloat(balance?.balance ?? \"0\");\n const stakedBalance = parseFloat(balance?.stake ?? \"0\");\n const unstakingBalance = parseFloat(balance?.pendingUnstake ?? \"0\");\n\n const parts: GeneralAssetInfo[\"parts\"] = [\n { name: \"liquid\", balance: liquidBalance },\n { name: \"staked\", balance: stakedBalance },\n ];\n\n if (unstakingBalance > 0) {\n parts.push({ name: \"unstaking\", balance: unstakingBalance });\n }\n\n return {\n name: symbol,\n title: metadata?.name ?? \"\",\n price: lastPrice === 0 ? 0 : Number(lastPrice * (hiveData?.price ?? 0)),\n accountBalance: liquidBalance + stakedBalance,\n layer: \"ENGINE\",\n parts,\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PointTransaction } from \"../types/point-transaction\";\n\ninterface PointsResponse {\n points: string;\n unclaimed_points: string;\n}\n\nexport function getPointsQueryOptions(username?: string, filter = 0) {\n return queryOptions({\n queryKey: [\"points\", username, filter],\n queryFn: async () => {\n if (!username) {\n throw new Error(\"Get points query – username wasn't provided\");\n }\n\n const name = username.replace(\"@\", \"\");\n\n // Get points\n const pointsResponse = await fetch(CONFIG.privateApiHost + \"/private-api/points\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name }),\n });\n\n if (!pointsResponse.ok) {\n throw new Error(`Failed to fetch points: ${pointsResponse.status}`);\n }\n\n const points = (await pointsResponse.json()) as PointsResponse;\n\n // Get transactions\n const transactionsResponse = await fetch(\n CONFIG.privateApiHost + \"/private-api/point-list\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name, type: filter }),\n }\n );\n\n if (!transactionsResponse.ok) {\n throw new Error(`Failed to fetch point transactions: ${transactionsResponse.status}`);\n }\n\n const transactions = (await transactionsResponse.json()) as PointTransaction[];\n\n return {\n points: points.points,\n uPoints: points.unclaimed_points,\n transactions,\n } as const;\n },\n staleTime: 30000,\n refetchOnMount: true,\n enabled: !!username,\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getPointsQueryOptions } from \"./get-points-query-options\";\n\nexport function getPointsAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getPointsQueryOptions(username));\n const data = getQueryClient().getQueryData(\n getPointsQueryOptions(username).queryKey\n );\n return {\n name: \"POINTS\",\n title: \"Ecency Points\",\n price: 0.002,\n accountBalance: +(data?.points ?? 0),\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { PointTransaction } from \"../types\";\nimport { PointTransactionType } from \"../types\";\nimport type { GeneralAssetTransaction } from \"@/modules/wallet/types\";\n\nexport function getPointsAssetTransactionsQueryOptions(\n username: string | undefined,\n type?: PointTransactionType\n) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"transactions\", username, type],\n queryFn: async () => {\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/point-list`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n type: type ?? 0,\n }),\n }\n );\n const data = (await response.json()) as PointTransaction[];\n return data.map(({ created, type, amount, id, sender, receiver, memo }) => ({\n created: new Date(created),\n type,\n results: [\n {\n amount: parseFloat(amount),\n asset: \"POINTS\",\n },\n ],\n id,\n from: sender ?? undefined,\n to: receiver ?? undefined,\n memo: memo ?? undefined,\n })) satisfies GeneralAssetTransaction[];\n },\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { getCurrencyRate } from \"@/modules/market\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"./get-hive-asset-general-info-query-options\";\nimport { getHbdAssetGeneralInfoQueryOptions } from \"./get-hbd-asset-general-info-query-options\";\nimport { getHivePowerAssetGeneralInfoQueryOptions } from \"./get-hive-power-asset-general-info-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getHiveEngineTokenGeneralInfoQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getPointsAssetGeneralInfoQueryOptions } from \"@/modules/points/queries\";\nimport {\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"./get-portfolio-query-options\";\n\ninterface Options {\n refetch?: boolean;\n currency?: string;\n}\n\nexport function getAccountWalletAssetInfoQueryOptions(\n username: string,\n asset: string,\n options: Options = { refetch: false }\n) {\n const queryClient = getQueryClient();\n const currency = options.currency ?? \"usd\";\n\n const fetchQuery = async (qo: any) => {\n if (options.refetch) {\n await queryClient.fetchQuery(qo);\n } else {\n await queryClient.prefetchQuery(qo);\n }\n return queryClient.getQueryData(qo.queryKey);\n };\n\n const convertPriceToUserCurrency = async (\n assetInfo: GeneralAssetInfo | undefined\n ): Promise => {\n if (!assetInfo || currency === \"usd\") {\n return assetInfo;\n }\n\n try {\n const conversionRate = await getCurrencyRate(currency);\n return {\n ...assetInfo,\n price: assetInfo.price * conversionRate,\n };\n } catch (error) {\n console.warn(`Failed to convert price from USD to ${currency}:`, error);\n return assetInfo;\n }\n };\n\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n\n const getPortfolioAssetInfo = async () => {\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const assetItem = portfolio.wallets.find(\n (item: PortfolioWalletItem) =>\n item.symbol.toUpperCase() === asset.toUpperCase()\n );\n\n if (!assetItem) return undefined;\n\n const parts: Array<{ name: string; balance: number }> = [];\n\n if (assetItem.liquid !== undefined && assetItem.liquid !== null) {\n parts.push({ name: \"liquid\", balance: assetItem.liquid });\n }\n\n if (assetItem.staked !== undefined && assetItem.staked !== null && assetItem.staked > 0) {\n parts.push({ name: \"staked\", balance: assetItem.staked });\n }\n\n if (assetItem.savings !== undefined && assetItem.savings !== null && assetItem.savings > 0) {\n parts.push({ name: \"savings\", balance: assetItem.savings });\n }\n\n if (assetItem.extraData && Array.isArray(assetItem.extraData)) {\n for (const extraItem of assetItem.extraData) {\n if (!extraItem || typeof extraItem !== \"object\") continue;\n\n const dataKey = extraItem.dataKey;\n const value = extraItem.value;\n\n if (typeof value === \"string\") {\n const cleanValue = value.replace(/,/g, \"\");\n const match = cleanValue.match(/[+-]?\\s*(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const numValue = Math.abs(Number.parseFloat(match[1]));\n\n if (dataKey === \"delegated_hive_power\") {\n parts.push({ name: \"outgoing_delegations\", balance: numValue });\n } else if (dataKey === \"received_hive_power\") {\n parts.push({ name: \"incoming_delegations\", balance: numValue });\n } else if (dataKey === \"powering_down_hive_power\") {\n parts.push({ name: \"pending_power_down\", balance: numValue });\n }\n }\n }\n }\n }\n\n return {\n name: assetItem.symbol,\n title: assetItem.name,\n price: assetItem.fiatRate,\n accountBalance: assetItem.balance,\n apr: assetItem.apr?.toString(),\n layer: assetItem.layer,\n pendingRewards: assetItem.pendingRewards,\n parts,\n } as GeneralAssetInfo;\n } catch {\n return undefined;\n }\n };\n\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n queryFn: async () => {\n const portfolioAssetInfo = await getPortfolioAssetInfo();\n\n if (portfolioAssetInfo && portfolioAssetInfo.price > 0) {\n return portfolioAssetInfo;\n }\n\n let assetInfo: GeneralAssetInfo | undefined;\n\n if (asset === \"HIVE\") {\n assetInfo = await fetchQuery(getHiveAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HP\") {\n assetInfo = await fetchQuery(getHivePowerAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HBD\") {\n assetInfo = await fetchQuery(getHbdAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"POINTS\") {\n assetInfo = await fetchQuery(getPointsAssetGeneralInfoQueryOptions(username));\n } else {\n // Check if it's a Hive Engine token\n const balances = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n if (balances.some((balance) => balance.symbol === asset)) {\n assetInfo = await fetchQuery(\n getHiveEngineTokenGeneralInfoQueryOptions(username, asset)\n );\n } else if (portfolioAssetInfo) {\n // Unknown asset but portfolio has data — use it as-is\n return portfolioAssetInfo;\n } else {\n throw new Error(\n `[SDK][Wallet] – unrecognized asset \"${asset}\"`\n );\n }\n }\n\n // If portfolio had rich data (parts, balance) but zero price,\n // merge the fallback price into the portfolio data\n if (portfolioAssetInfo && assetInfo && assetInfo.price > 0) {\n const converted = await convertPriceToUserCurrency(assetInfo);\n return {\n ...portfolioAssetInfo,\n price: converted!.price,\n };\n }\n\n return await convertPriceToUserCurrency(assetInfo);\n },\n });\n}\n","export enum AssetOperation {\n // Common\n Transfer = \"transfer\",\n\n // APR\n TransferToSavings = \"transfer-saving\",\n WithdrawFromSavings = \"withdraw-saving\",\n Delegate = \"delegate\",\n PowerUp = \"power-up\",\n PowerDown = \"power-down\",\n WithdrawRoutes = \"withdraw-routes\",\n ClaimInterest = \"claim-interest\",\n Swap = \"swap\",\n Convert = \"convert\",\n\n // Points\n Gift = \"gift\",\n Promote = \"promote\",\n Claim = \"claim\",\n Buy = \"buy\",\n\n // Layer 2\n Stake = \"stake\",\n Unstake = \"unstake\",\n Undelegate = \"undelegate\",\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for transferring tokens.\n */\nexport interface TransferPayload {\n /** Recipient account */\n to: string;\n /** Amount with asset symbol (e.g., \"1.000 HIVE\", \"5.000 HBD\") */\n amount: string;\n /** Transfer memo */\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring tokens.\n *\n * This mutation broadcasts a transfer operation to send HIVE or HBD\n * to another account. **Requires ACTIVE authority**.\n *\n * Uses `useBroadcastMutation` with the smart auth strategy:\n * - Adapter determines login type and dispatches to appropriate method\n * - If active key not available (common on web), triggers `showAuthUpgradeUI`\n * - Supports keychain, hivesigner, hiveauth, and direct key signing\n *\n * @param username - The username sending the transfer (required for broadcast)\n * @param auth - Authentication context with platform adapter\n *\n * @returns React Query mutation result\n */\nexport function useTransfer(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer\"],\n username,\n (payload) => [\n buildTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildPointTransferOp } from \"@/modules/operations/builders\";\n\nexport interface TransferPointPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring Ecency points.\n *\n * Uses `ecency_point_transfer` custom_json operation with ACTIVE authority.\n */\nexport function useTransferPoint(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-point\"],\n username,\n (payload) => [\n buildPointTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildDelegateVestingSharesOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for delegating Hive Power (vesting shares).\n */\nexport interface DelegateVestingSharesPayload {\n /** Account receiving HP delegation */\n delegatee: string;\n /** Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\"). Use \"0.000000 VESTS\" to remove delegation. */\n vestingShares: string;\n}\n\n/**\n * React Query mutation hook for delegating Hive Power (HP).\n *\n * This mutation broadcasts a delegate_vesting_shares operation to delegate HP\n * to another account. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username delegating HP (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Delegation operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Delegation Mechanics:**\n * - Delegated HP can be used by the delegatee for resource credits\n * - Delegatee CANNOT power down or transfer the delegated HP\n * - Delegation can be removed by setting vestingShares to \"0.000000 VESTS\"\n * - Removing delegation has a 5-day cooldown before HP returns to delegator\n *\n * **Post-Broadcast Actions:**\n * - Invalidates delegations list cache to show updated delegation\n * - Invalidates account data for both delegator and delegatee\n *\n * @example\n * ```typescript\n * const delegateMutation = useDelegateVestingShares(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Delegate HP\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '1000.000000 VESTS'\n * });\n *\n * // Remove delegation\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '0.000000 VESTS'\n * });\n * ```\n */\nexport function useDelegateVestingShares(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-vesting-shares\"],\n username,\n (payload) => [\n buildDelegateVestingSharesOp(\n username!,\n payload.delegatee,\n payload.vestingShares\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.delegatee),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildSetWithdrawVestingRouteOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for setting withdraw vesting route.\n */\nexport interface SetWithdrawVestingRoutePayload {\n /** Account receiving withdrawn vesting */\n toAccount: string;\n /** Percentage to route (0-10000, where 10000 = 100%). Already scaled. */\n percent: number;\n /** Auto convert to vesting (power up) */\n autoVest: boolean;\n}\n\n/**\n * React Query mutation hook for setting withdraw vesting route.\n *\n * This mutation broadcasts a set_withdraw_vesting_route operation to configure\n * where withdrawn VESTS (power down) are sent. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username setting withdraw route (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Withdraw route operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Withdraw Route Mechanics:**\n * - Routes a percentage of power down (withdraw_vesting) to another account\n * - Percent must be between 0-10000 (where 10000 = 100%)\n * - Multiple routes can be set, total cannot exceed 100%\n * - autoVest=true converts withdrawn VESTS to HP in destination account\n * - autoVest=false converts withdrawn VESTS to liquid HIVE\n *\n * **Post-Broadcast Actions:**\n * - Invalidates withdraw routes cache to show updated routes\n * - Invalidates account data for both accounts\n *\n * @example\n * ```typescript\n * const setRouteMutation = useSetWithdrawVestingRoute(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Route 50% of power down to another account (auto vest)\n * setRouteMutation.mutate({\n * toAccount: 'alice',\n * percent: 5000, // 50% (already scaled)\n * autoVest: true\n * });\n *\n * // Route 100% of power down to another account (liquid HIVE)\n * setRouteMutation.mutate({\n * toAccount: 'bob',\n * percent: 10000, // 100% (already scaled)\n * autoVest: false\n * });\n * ```\n */\nexport function useSetWithdrawVestingRoute(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"set-withdraw-vesting-route\"],\n username,\n (payload) => [\n buildSetWithdrawVestingRouteOp(\n username!,\n payload.toAccount,\n payload.percent,\n payload.autoVest\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.wallet.withdrawRoutes(username!),\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.toAccount)\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface TransferEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n memo: string;\n}\n\nexport function useTransferEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"transfer\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n memo: payload.memo\n }\n });\n return [[\"custom_json\", {\n required_auths: [username!],\n required_posting_auths: [],\n id: \"ssc-mainnet-hive\",\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\nexport function useTransferToSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-savings\"],\n username,\n (payload) => [\n buildTransferToSavingsOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferFromSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferFromSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useTransferFromSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-from-savings\"],\n username,\n (payload) => [\n buildTransferFromSavingsOp(username!, payload.to, payload.amount, payload.memo, payload.requestId)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToVestingOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToVestingPayload {\n to: string;\n amount: string;\n}\n\nexport function useTransferToVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-vesting\"],\n username,\n (payload) => [\n buildTransferToVestingOp(username!, payload.to, payload.amount)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildWithdrawVestingOp } from \"@/modules/operations/builders\";\n\nexport interface WithdrawVestingPayload {\n vestingShares: string;\n}\n\nexport function useWithdrawVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"withdraw-vesting\"],\n username,\n (payload) => [\n buildWithdrawVestingOp(username!, payload.vestingShares)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildConvertOp, buildCollateralizedConvertOp } from \"@/modules/operations/builders\";\n\nexport interface ConvertPayload {\n amount: string;\n requestId: number;\n collateralized?: boolean;\n}\n\nexport function useConvert(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"convert\"],\n username,\n (payload) => [\n payload.collateralized\n ? buildCollateralizedConvertOp(username!, payload.amount, payload.requestId)\n : buildConvertOp(username!, payload.amount, payload.requestId)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimInterestOps } from \"@/modules/operations/builders\";\n\nexport interface ClaimInterestPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useClaimInterest(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-interest\"],\n username,\n (payload) => buildClaimInterestOps(username!, payload.to, payload.amount, payload.memo, payload.requestId),\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimRewardBalanceOp } from \"@/modules/operations/builders\";\n\nexport interface ClaimRewardsPayload {\n rewardHive: string;\n rewardHbd: string;\n rewardVests: string;\n}\n\nconst CLAIM_REWARDS_INVALIDATION_DELAY_MS = 5000;\nconst pendingInvalidationTimers = new Map>();\n\nexport function useClaimRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-rewards\"],\n username,\n (payload) => [\n buildClaimRewardBalanceOp(username!, payload.rewardHive, payload.rewardHbd, payload.rewardVests)\n ],\n () => {\n const timerKey = username ?? \"__anonymous__\";\n const keysToInvalidate = [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n QueryKeys.assets.hiveGeneralInfo(username!),\n QueryKeys.assets.hbdGeneralInfo(username!),\n QueryKeys.assets.hivePowerGeneralInfo(username!),\n ];\n\n // Delay invalidation to allow blockchain to propagate the transaction.\n // Immediate invalidation would fetch stale (pre-confirmation) data.\n const existingTimer = pendingInvalidationTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n pendingInvalidationTimers.delete(timerKey);\n }\n\n const timer = setTimeout(async () => {\n try {\n const qc = getQueryClient();\n const results = await Promise.allSettled(\n keysToInvalidate.map((key) => qc.invalidateQueries({ queryKey: key }))\n );\n const rejected = results.filter((result) => result.status === \"rejected\");\n if (rejected.length > 0) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation rejected\", {\n username,\n rejectedCount: rejected.length,\n rejected\n });\n }\n } catch (error) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation failed\", {\n username,\n error\n });\n } finally {\n pendingInvalidationTimers.delete(timerKey);\n }\n }, CLAIM_REWARDS_INVALIDATION_DELAY_MS);\n\n pendingInvalidationTimers.set(timerKey, timer);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface DelegateEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useDelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"delegate\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UndelegateEngineTokenPayload {\n from: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUndelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"undelegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"undelegate\",\n contractPayload: {\n symbol: payload.symbol,\n from: payload.from,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface StakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useStakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"stake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"stake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UnstakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUnstakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"unstake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"unstake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface ClaimEngineRewardsPayload {\n tokens: string[];\n}\n\nexport function useClaimEngineRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-engine-rewards\"],\n username,\n (payload) => {\n const json = JSON.stringify(payload.tokens.map((symbol) => ({ symbol })));\n return [[\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [username!],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface EngineMarketOrderPayload {\n action: \"buy\" | \"sell\" | \"cancel\";\n symbol: string;\n quantity?: string;\n price?: string;\n orderId?: string;\n orderType?: \"buy\" | \"sell\";\n}\n\nexport function useEngineMarketOrder(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"engine-market-order\"],\n username,\n (payload) => {\n let contractPayload: Record;\n let contractAction: string;\n\n if (payload.action === \"cancel\") {\n contractAction = \"cancel\";\n contractPayload = {\n type: payload.orderType!,\n id: payload.orderId!,\n };\n } else {\n contractAction = payload.action;\n contractPayload = {\n symbol: payload.symbol,\n quantity: payload.quantity!,\n price: payload.price!,\n };\n }\n\n const json = JSON.stringify({\n contractName: \"market\",\n contractAction,\n contractPayload,\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport { AssetOperation } from \"../types\";\nimport {\n buildTransferOp,\n buildTransferToSavingsOp,\n buildTransferFromSavingsOp,\n buildTransferToVestingOp,\n buildWithdrawVestingOp,\n buildDelegateVestingSharesOp,\n buildSetWithdrawVestingRouteOp,\n buildConvertOp,\n buildClaimInterestOps,\n buildPointTransferOp,\n buildEngineOp,\n buildEngineClaimOp,\n} from \"@/modules/operations/builders\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface WalletOperationPayload {\n from: string;\n to?: string;\n amount?: string;\n memo?: string;\n request_id?: number;\n from_account?: string;\n to_account?: string;\n percent?: number;\n auto_vest?: boolean;\n mode?: string;\n [key: string]: unknown;\n}\n\nfunction buildHiveOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\", memo = \"\" } = payload;\n const requestId = payload.request_id ?? (Date.now() >>> 0);\n\n switch (asset) {\n case \"HIVE\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.PowerUp:\n return [buildTransferToVestingOp(from, to, amount)];\n }\n break;\n\n case \"HBD\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.ClaimInterest:\n return buildClaimInterestOps(from, to, amount, memo, requestId);\n case AssetOperation.Convert:\n return [buildConvertOp(from, amount, Math.floor(Date.now() / 1000))];\n }\n break;\n\n case \"HP\":\n switch (operation) {\n case AssetOperation.PowerDown:\n return [buildWithdrawVestingOp(from, amount)];\n case AssetOperation.Delegate:\n return [buildDelegateVestingSharesOp(from, to, amount)];\n case AssetOperation.WithdrawRoutes:\n return [buildSetWithdrawVestingRouteOp(\n payload.from_account ?? from,\n payload.to_account ?? to,\n payload.percent ?? 0,\n payload.auto_vest ?? false\n )];\n }\n break;\n\n case \"POINTS\":\n if (operation === AssetOperation.Transfer || operation === AssetOperation.Gift) {\n return [buildPointTransferOp(from, to, amount, memo)];\n }\n break;\n }\n\n return null;\n}\n\nfunction buildEngineOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\" } = payload;\n const quantity = typeof amount === \"string\" && amount.includes(\" \")\n ? amount.split(\" \")[0]\n : String(amount);\n\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildEngineOp(from, \"transfer\", {\n symbol: asset, to, quantity, memo: payload.memo ?? \"\"\n })];\n case AssetOperation.Stake:\n return [buildEngineOp(from, \"stake\", { symbol: asset, to, quantity })];\n case AssetOperation.Unstake:\n return [buildEngineOp(from, \"unstake\", { symbol: asset, to, quantity })];\n case AssetOperation.Delegate:\n return [buildEngineOp(from, \"delegate\", { symbol: asset, to, quantity })];\n case AssetOperation.Undelegate:\n return [buildEngineOp(from, \"undelegate\", { symbol: asset, from: to, quantity })];\n case AssetOperation.Claim:\n return [buildEngineClaimOp(from, [asset])];\n }\n\n return null;\n}\n\n/**\n * Determines authority level for a wallet operation.\n * Engine token claims use posting authority; everything else uses active.\n */\nfunction getWalletOperationAuthority(operation: AssetOperation): AuthorityLevel {\n if (operation === AssetOperation.Claim) {\n return 'posting';\n }\n return 'active';\n}\n\n/**\n * Meta-mutation hook that dispatches wallet operations based on asset and operation type.\n *\n * Supports HIVE, HBD, HP, POINTS, and Hive Engine tokens.\n * Uses `useBroadcastMutation` for unified auth handling via `AuthContextV2`.\n *\n * @param username - The Hive account performing the operation\n * @param asset - The asset symbol (e.g., \"HIVE\", \"HBD\", \"HP\", \"POINTS\", or engine token)\n * @param operation - The operation type from AssetOperation enum\n * @param auth - Auth context for broadcasting\n */\nexport function useWalletOperation(\n username: string | undefined,\n asset: string,\n operation: AssetOperation,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n operation as any\n );\n\n return useBroadcastMutation(\n [\"ecency-wallets\", asset, operation],\n username,\n (payload) => {\n // Try native Hive + POINTS operations\n const hiveOps = buildHiveOperations(asset, operation, payload);\n if (hiveOps) return hiveOps;\n\n // Try engine token operations\n const engineOps = buildEngineOperations(asset, operation, payload);\n if (engineOps) return engineOps;\n\n throw new Error(`[SDK][Wallet] – no operation builder for asset=\"${asset}\" operation=\"${operation}\"`);\n },\n () => {\n recordActivity();\n\n const keysToInvalidate: (string | undefined)[][] = [];\n\n // Invalidate asset-specific queries (prefix-matches all currency variants)\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, asset]);\n\n if (asset === \"HIVE\") {\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, \"HP\"]);\n }\n\n // Invalidate portfolio (prefix-matches all currency/filter variants)\n keysToInvalidate.push([\"wallet\", \"portfolio\", \"v2\", username]);\n\n // Delay invalidation to allow blockchain to process\n setTimeout(() => {\n keysToInvalidate.forEach((key) => {\n getQueryClient().invalidateQueries({ queryKey: key });\n });\n }, 5000);\n },\n auth,\n getWalletOperationAuthority(operation),\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDelegateRcOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface DelegateRcPayload {\n to: string;\n maxRc: string | number;\n}\n\nexport function useDelegateRc(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-rc\"],\n username,\n ({ to, maxRc }) => [\n buildDelegateRcOp(username!, to, maxRc)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n QueryKeys.resourceCredits.account(username!),\n QueryKeys.resourceCredits.account(variables.to),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting for a witness.\n */\nexport interface WitnessVotePayload {\n /** Witness account name to vote for/against */\n witness: string;\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting for a Hive witness.\n *\n * This mutation broadcasts an account_witness_vote operation to vote for\n * or remove a vote from a witness.\n *\n * @param username - The username voting for the witness (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account data cache to show updated witness votes\n * - Invalidates witness votes cache\n *\n * **Vote Types:**\n * - approve: true - Vote for the witness\n * - approve: false - Remove your vote from the witness\n *\n * **Authority Required:**\n * - Active authority is required for witness voting\n *\n * @example\n * ```typescript\n * const witnessVoteMutation = useWitnessVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Vote for a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: true\n * });\n *\n * // Remove vote from a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: false\n * });\n * ```\n */\nexport function useWitnessVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"vote\"],\n username,\n ({ witness, approve }) => [\n buildWitnessVoteOp(username!, witness, approve)\n ],\n async () => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.votes(username)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useWitnessVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for witness votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessProxyOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface WitnessProxyPayload {\n proxy: string;\n}\n\nexport function useWitnessProxy(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"proxy\"],\n username,\n ({ proxy }) => [\n buildWitnessProxyOp(username!, proxy)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.proxy(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Witness, WitnessVotersResponse } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\n\ntype WitnessPage = Witness[];\ntype WitnessCursor = number;\n\ninterface HafbeWitness {\n witness_name: string;\n rank: number;\n url: string;\n vests: string;\n votes_daily_change: string;\n voters_num: number;\n voters_num_daily_change: number;\n price_feed: number;\n bias: number;\n feed_updated_at: string;\n block_size: number;\n signing_key: string;\n version: string;\n missed_blocks: number;\n hbd_interest_rate: number;\n last_confirmed_block_num: number;\n account_creation_fee: number;\n}\n\ninterface HafbeWitnessesResponse {\n total_witnesses: number;\n total_pages: number;\n witnesses: HafbeWitness[];\n}\n\n/**\n * Map a hafbe-api witness to the SDK Witness shape so existing consumers\n * (e.g. the web app's transform()) keep working unchanged.\n */\nfunction mapRestWitness(w: HafbeWitness): Witness {\n return {\n owner: w.witness_name,\n total_missed: w.missed_blocks,\n url: w.url,\n props: {\n account_creation_fee: `${(w.account_creation_fee / 1000).toFixed(3)} HIVE`,\n account_subsidy_budget: 0,\n maximum_block_size: w.block_size,\n },\n hbd_exchange_rate: {\n base: `${w.price_feed.toFixed(3)} HBD`,\n },\n available_witness_account_subsidies: 0,\n running_version: w.version,\n signing_key: w.signing_key,\n last_hbd_exchange_update: w.feed_updated_at,\n rank: w.rank,\n vests: w.vests,\n voters_num: w.voters_num,\n voters_num_daily_change: w.voters_num_daily_change,\n price_feed: w.price_feed,\n hbd_interest_rate: w.hbd_interest_rate,\n last_confirmed_block_num: w.last_confirmed_block_num,\n };\n}\n\n/**\n * Get witnesses ordered by vote count (infinite scroll).\n * Uses the hafbe-api REST endpoint - replaces multi-call RPC assembly\n * with a single paginated call. Includes voter count, rank, and other\n * data that was previously unavailable.\n *\n * @param limit - Number of witnesses per page\n */\nexport function getWitnessesInfiniteQueryOptions(limit: number) {\n return infiniteQueryOptions<\n WitnessPage,\n Error,\n InfiniteData,\n (string | number)[],\n WitnessCursor\n >({\n queryKey: QueryKeys.witnesses.list(limit),\n initialPageParam: 1 as WitnessCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WitnessCursor }) => {\n const response = (await callREST(\n \"hafbe\",\n \"/witnesses\",\n {\n \"page-size\": limit,\n page: pageParam,\n }\n )) as HafbeWitnessesResponse;\n\n return response.witnesses.map(mapRestWitness);\n },\n\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n lastPage.length === limit ? lastPageParam + 1 : undefined,\n });\n}\n\nexport type WitnessVoterSortField =\n | \"vests\"\n | \"account_vests\"\n | \"proxied_vests\"\n | \"account_name\"\n | \"timestamp\";\n\nexport type WitnessVoterSortDirection = \"asc\" | \"desc\";\n\n/**\n * Get a single page of voters for a specific witness.\n *\n * Server-side pagination + sort: each page click fetches that page directly\n * from hafbe rather than scrolling through accumulated pages on the client.\n *\n * @param witness - Witness account name\n * @param page - 1-based page index\n * @param pageSize - Number of voters per page\n * @param sort - Field to sort by\n * @param direction - asc or desc\n */\nexport function getWitnessVotersPageQueryOptions(\n witness: string,\n page: number,\n pageSize: number,\n sort: WitnessVoterSortField = \"vests\",\n direction: WitnessVoterSortDirection = \"desc\"\n) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voters(witness, page, pageSize, sort, direction),\n queryFn: async ({ signal }) => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters\",\n {\n \"witness-name\": witness,\n \"page-size\": pageSize,\n page,\n sort,\n direction,\n },\n undefined,\n undefined,\n signal\n )) as WitnessVotersResponse;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n\n/**\n * Get total voter count for a witness.\n *\n * @param witness - Witness account name\n */\nexport function getWitnessVoterCountQueryOptions(witness: string) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voterCount(witness),\n queryFn: async () => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters/count\",\n { \"witness-name\": witness }\n )) as number;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n","export enum PointTransactionType {\n CHECKIN = 10,\n LOGIN = 20,\n CHECKIN_EXTRA = 30,\n POST = 100,\n COMMENT = 110,\n VOTE = 120,\n REBLOG = 130,\n DELEGATION = 150,\n REFERRAL = 160,\n COMMUNITY = 170,\n TRANSFER_SENT = 998,\n TRANSFER_INCOMING = 999,\n MINTED = 991,\n /**\n * Points burned out of supply rather than moved to the treasury. Written by the\n * AI surfaces (assist, image, transcribe), which pay a real per-request vendor\n * bill, so the Points are consumed rather than parked.\n *\n * The row carries no counterparty at all, which is what distinguishes it from\n * TRANSFER_SENT: `sender` and `receiver` are both null. A refund of a burn comes\n * back as this same type with a positive amount, so read the sign rather than\n * assuming a burn is always a debit.\n */\n BURNED = 997,\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPointsQueryOptions } from \"../queries\";\nimport type { Points } from \"../types\";\n\n/**\n * POST a points claim and return the parsed JSON body.\n *\n * The endpoint normally answers with JSON, but an edge/proxy layer can\n * occasionally return a 2xx whose body is an HTML interstitial or plain text\n * (ECENCY-NEXT-1FCJ). Calling `response.json()` on that throws a bare\n * `SyntaxError` that names neither the endpoint nor the cause. Instead we check\n * the content type first and fail with a STABLE, low-cardinality message\n * (content type + status) — never the raw body — so these group as a single\n * Sentry issue instead of fragmenting on every distinct HTML page.\n */\nexport async function claimPointsRequest(\n username: string | undefined,\n accessToken: string | undefined\n) {\n if (!username) {\n throw new Error(\"[SDK][Points][Claim] – username wasn't provided\");\n }\n\n if (!accessToken) {\n throw new Error(\"[SDK][Points][Claim] – access token wasn't found\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/points-claim\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n }\n );\n\n // Media types are case-insensitive; normalise once and reuse in every branch.\n const contentType = (response.headers.get(\"content-type\") ?? \"\")\n .split(\";\")[0]\n .trim()\n .toLowerCase();\n const body = await response.text();\n\n if (!response.ok) {\n if (response.status === 406) {\n try {\n return JSON.parse(body);\n } catch {\n return { message: body, code: response.status };\n }\n }\n // Only fold a short JSON error body into the message; an HTML gateway page\n // (e.g. 502/503) would otherwise fragment the Sentry group per distinct\n // page — the same problem the non-JSON guard below avoids for a 2xx body.\n const detail =\n body && contentType.includes(\"json\") ? `: ${body.slice(0, 200)}` : \"\";\n throw new Error(\n `[SDK][Points][Claim] – failed with status ${response.status}${detail}`\n );\n }\n\n if (!contentType.includes(\"json\")) {\n throw new Error(\n `[SDK][Points][Claim] – expected JSON but received \"${contentType || \"empty\"}\" response (status ${response.status})`\n );\n }\n\n try {\n return JSON.parse(body);\n } catch {\n throw new Error(\n `[SDK][Points][Claim] – malformed JSON response (status ${response.status})`\n );\n }\n}\n\nexport function useClaimPoints(\n username: string | undefined,\n accessToken: string | undefined,\n onSuccess?: () => void,\n onError?: Parameters[\"0\"][\"onError\"]\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n \"points-claimed\"\n );\n\n return useMutation({\n mutationFn: () => claimPointsRequest(username, accessToken),\n onError,\n onSuccess: () => {\n recordActivity();\n\n getQueryClient().setQueryData(\n getPointsQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n return {\n ...data,\n points: (\n parseFloat(data.points) + parseFloat(data.uPoints)\n ).toFixed(3),\n uPoints: \"0\",\n };\n }\n );\n\n onSuccess?.();\n },\n });\n}\n","// A token only counts at the start of the query or after whitespace, matching\n// the search API's parser. Unanchored, these matched inside ordinary words:\n// \"prototype:v2\" read as type=v2 and the API rejected it as an invalid type,\n// \"subcategory:hive-1\" filtered on category=hive-1 with a stray \"sub\" left as\n// required text. The boundary is captured rather than looked behind so it can\n// be put back when the token is stripped, keeping the neighbouring words apart\n// (a lookbehind would also be fine here, but this stays portable).\nconst author_re = /(^|\\s)author:([^\\s]+)/g;\nconst type_re = /(^|\\s)type:([^\\s]+)/g;\nconst category_re = /(^|\\s)category:([^\\s]+)/g;\nconst tag_re = /(^|\\s)tag:([^\\s]+)/g;\n\n// Index of the token value in a match; group 1 is the boundary.\nconst VALUE = 2;\n\nexport enum SearchType {\n ALL = \"\",\n POST = \"post\",\n COMMENT = \"comment\"\n}\n\nexport const MAX_SEARCH_TAGS = 5;\n\n// The search API applies both caps itself (see query_validator); mirrored here\n// so the client can refuse instead of turning a 400 into an empty result list.\nexport const MAX_SEARCH_QUERY_LENGTH = 100;\n\n/**\n * Both parsers match a token with /author:([^\\s]+)/, so a value containing a\n * space stops filtering at the space and the remainder silently becomes\n * required free text. Keep the first word only, which is what the API would\n * have filtered on anyway.\n */\nfunction firstToken(value: string): string {\n return value.trim().split(/\\s+/)[0] ?? \"\";\n}\n\n/**\n * Hive account names are lowercase and the API filters authors with an exact\n * term query, so \"@Demo\" has to become \"demo\" or it matches nothing.\n */\nexport function normalizeSearchAuthor(value: string): string {\n return firstToken(value).replace(/^@+/, \"\").toLowerCase();\n}\n\nexport function normalizeSearchCategory(value: string): string {\n // Leading \"#\" goes for the same reason it goes on tags: a category is matched\n // by an exact term query, and users write categories the way they write tags.\n return firstToken(value).replace(/^#+/, \"\").toLowerCase();\n}\n\n/**\n * Accepts what a user actually types (\"travel, photography\", \"#travel travel\")\n * and returns exact-match ready tags, deduped in first-seen order.\n */\nexport function normalizeSearchTags(value: string): string[] {\n const seen = new Set();\n\n return value\n .split(/[\\s,]+/)\n .map((tag) => tag.replace(/^#+/, \"\").toLowerCase())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n}\n\nexport interface SearchQueryParts {\n search?: string;\n author?: string;\n type?: SearchType;\n category?: string;\n /** Raw user input (\"a, b\") or an already split list. */\n tags?: string | string[];\n}\n\nexport interface BuiltSearchQuery {\n /** The `q` value to put in the URL. Round-trips through `SearchQuery`. */\n q: string;\n search: string;\n author: string;\n type: SearchType;\n category: string;\n tags: string[];\n}\n\n/**\n * Assembles the single `q` string that both this app and the search API parse\n * back into filters. Returns the normalized parts too, because the caller has\n * to validate the tag count and the total length before navigating.\n */\nexport function buildSearchQuery({\n search = \"\",\n author = \"\",\n type = SearchType.ALL,\n category = \"\",\n tags = []\n}: SearchQueryParts): BuiltSearchQuery {\n const normalizedSearch = search.trim().replace(/\\s+/g, \" \");\n const normalizedAuthor = normalizeSearchAuthor(author);\n const normalizedCategory = normalizeSearchCategory(category);\n const normalizedTags = normalizeSearchTags(Array.isArray(tags) ? tags.join(\",\") : tags);\n\n const parts = [normalizedSearch];\n\n if (normalizedAuthor) {\n parts.push(`author:${normalizedAuthor}`);\n }\n\n if (type) {\n parts.push(`type:${type}`);\n }\n\n if (normalizedCategory) {\n parts.push(`category:${normalizedCategory}`);\n }\n\n if (normalizedTags.length > 0) {\n // No space after the commas: a tag token ends at the first space, so\n // anything past one stops filtering and becomes required free text.\n parts.push(`tag:${normalizedTags.join(\",\")}`);\n }\n\n return {\n // Dropping the empty free text here is what keeps a filter-only query from\n // starting with a space.\n q: parts.filter((part) => part !== \"\").join(\" \"),\n search: normalizedSearch,\n author: normalizedAuthor,\n type,\n category: normalizedCategory,\n tags: normalizedTags\n };\n}\n\nexport class SearchQuery {\n public query: string = \"\";\n public search: string = \"\";\n public author: string = \"\";\n public type: SearchType = SearchType.ALL;\n public category: string = \"\";\n public tags: string[] = [];\n\n constructor(_query: string) {\n this.query = _query;\n this.search = _query;\n\n this.grabAuthor();\n this.grabType();\n this.grabCategory();\n this.grabTags();\n this.grabSearch();\n }\n\n private grab = (re: RegExp): string => {\n // @ts-ignore\n const matches = [...this.query.matchAll(re)];\n if (matches.length > 0) {\n return matches[0][VALUE].trim();\n }\n\n return \"\";\n };\n\n private grabAuthor = () => {\n this.author = this.grab(author_re);\n };\n\n private grabType = () => {\n const type = this.grab(type_re) as SearchType;\n if (Object.values(SearchType).includes(type)) {\n this.type = type as SearchType;\n }\n };\n\n private grabCategory = () => {\n this.category = this.grab(category_re);\n };\n\n private grabTags = () => {\n // Every tag: token counts, not just the first one. The API joins all of its\n // own tag: matches before splitting on commas, so reading only the first\n // token here under-reports the tags a query really applies and let a query\n // past the MAX_SEARCH_TAGS guard that the API then rejects with a 400.\n // A trailing comma (\"tag:a,\") must not yield an empty tag either - it would\n // be shown back as a phantom tag and counted against the same cap.\n const seen = new Set();\n\n this.tags = [...this.query.matchAll(tag_re)]\n .flatMap((match) => match[VALUE].split(\",\"))\n .map((tag) => tag.trim())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n };\n\n private grabSearch = () => {\n [author_re, type_re, category_re, tag_re].forEach((r) => {\n // Put the captured boundary back, or removing a mid-query token would\n // run the words either side of it together.\n this.search = this.search.replace(r, \"$1\");\n });\n\n while (this.search.indexOf(\" \") !== -1) {\n this.search = this.search.replace(\" \", \" \");\n }\n\n this.search = this.search.trim();\n };\n}\n","export type RequestError = Error & { status?: number; data?: unknown };\n\n/**\n * Reads a response body and, when the status is not OK, throws an error that\n * keeps both the status and the parsed body.\n *\n * The search backend answers a malformed query with an explanation the user can\n * act on (\"Maximum 5 tags!\", \"Query string too long! ...\", \"Parsed query is\n * empty!\"). Dropping the body leaves callers with a bare status: they can\n * neither tell the user what to change nor tell a deterministic rejection from\n * a transient failure worth retrying.\n *\n * Module-internal on purpose - it is not part of the published SDK surface.\n */\nexport async function parseJsonResponse(\n response: Response,\n /**\n * Shape guard for a SUCCESSFUL body. JSON.parse happily accepts `null`,\n * `\"maintenance\"` and `{\"error\": \"...\"}`, none of which are the payload the\n * caller asked for, and all of which would otherwise be returned as `T` and\n * cached as valid data. Callers that have a known shape pass a guard so an\n * unexpected 200 fails here instead of at the first property access.\n */\n isValid?: (data: unknown) => boolean\n): Promise {\n const parseBody = async (): Promise => {\n // Read the body ONCE. Calling json() and then falling back to text() on the\n // same response cannot work: json() consumes the stream, so the fallback\n // always threw and the raw body of a non-JSON failure (an HTML error page\n // from a proxy) was silently lost.\n let raw: string;\n try {\n raw = await response.text();\n } catch {\n return undefined;\n }\n\n if (raw === \"\") {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n // Raw text is a diagnostic, not a payload. On a failed response it is\n // what the caller shows or logs, but on a 2xx returning it would hand\n // back a string typed as the parsed body: callers reading `.results`\n // would see undefined and report an empty result set, and the\n // controversial/rising pager would throw on `resp.results.length`. An\n // unparseable success is a failure, so let it fall through to the throw\n // below rather than caching a string as a SearchResponse.\n return response.ok ? undefined : raw;\n }\n };\n\n const data = await parseBody();\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n if (data === undefined || (isValid !== undefined && !isValid(data))) {\n throw new Error(\"Response body was empty, invalid JSON, or not the expected shape\");\n }\n\n return data as T;\n}\n\n/**\n * The contract every /search-api consumer relies on: an object carrying a\n * `results` array. Enough to keep a stray 200 from reaching `resp.results.length`.\n */\nexport function isSearchResponse(data: unknown): boolean {\n return (\n typeof data === \"object\" &&\n data !== null &&\n Array.isArray((data as { results?: unknown }).results)\n );\n}\n","import { isServer } from \"@tanstack/react-query\";\nimport type { RequestError } from \"./parse-json-response\";\n\n/**\n * The app-wide default the browser QueryClient uses. Restated because supplying\n * a `retry` callback replaces React Query's own budget rather than adding to it.\n *\n * The 0 on the server is load-bearing: server QueryClients set `retry: false`\n * globally, and these queries are prefetched during SSR, so a flat 3 would\n * resurrect SSR retries against a single-region backend.\n */\nconst MAX_RETRIES = isServer ? 0 : 3;\n\n/**\n * Shared retry rule for every /search-api call.\n *\n * A 4xx is the backend rejecting the query itself (too many tags, over the\n * length cap, nothing left to search once the filters are parsed out).\n * Repeating it repeats the same answer, so the only effect is four requests\n * over several seconds before the UI can say what to change.\n *\n * 408 and 429 are the exceptions: they describe when the request arrived rather\n * than what it contained, and backing off is what resolves them. A client-side\n * timeout aborts the fetch and carries no status at all, so it falls through to\n * the normal budget like any other transport failure.\n */\nexport function searchRetryPolicy(failureCount: number, error: Error): boolean {\n const { status } = error as RequestError;\n const isTransient = status === 408 || status === 429;\n\n if (status !== undefined && status >= 400 && status < 500 && !isTransient) {\n return false;\n }\n\n return failureCount < MAX_RETRIES;\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function searchQueryOptions(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number\n) {\n return queryOptions({\n queryKey: QueryKeys.search.results(q, sort, hideLow, since, scroll_id, votes),\n queryFn: async ({ signal }) => {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (scroll_id) data.scroll_id = scroll_id;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n retry: searchRetryPolicy,\n });\n}\n\ntype PageParam = {\n sid: string | undefined;\n hasNextPage: boolean;\n};\n\nexport function getControversialRisingInfiniteQueryOptions(\n what: string,\n tag: string,\n enabled = true\n) {\n return infiniteQueryOptions<\n SearchResponse,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.search.controversialRising(what, tag),\n initialPageParam: { sid: undefined, hasNextPage: true } as PageParam,\n\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n if (!pageParam.hasNextPage) {\n return {\n hits: 0,\n took: 0,\n results: [],\n };\n }\n\n let sinceDate: Date | undefined;\n const now = new Date();\n\n switch (tag) {\n case \"today\":\n sinceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case \"week\":\n sinceDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case \"month\":\n sinceDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case \"year\":\n sinceDate = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);\n break;\n default:\n sinceDate = undefined;\n }\n\n const q = \"* type:post\";\n const sort = what === \"rising\" ? \"children\" : what;\n const since = sinceDate ? sinceDate.toISOString().split(\".\")[0] : undefined;\n const hideLow = \"0\";\n const votes = tag === \"today\" ? 50 : 200;\n\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (pageParam.sid) data.scroll_id = pageParam.sid;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n\n getNextPageParam: (resp: SearchResponse): PageParam => {\n return {\n sid: resp?.scroll_id,\n hasNextPage: resp.results.length > 0,\n };\n },\n\n enabled,\n retry: searchRetryPolicy,\n });\n}\n","import { CONFIG, INTERNAL_API_TIMEOUT_MS, getBoundFetch, withTimeoutSignal } from \"@/modules/core\";\nimport { SearchResponse } from \"./types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"./parse-json-response\";\n\nexport async function search(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number,\n signal?: AbortSignal\n): Promise {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) {\n data.since = since;\n }\n if (scroll_id) {\n data.scroll_id = scroll_id;\n }\n if (votes) {\n data.votes = votes;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function similar(\n params: {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n tags?: string[];\n since?: string;\n },\n signal?: AbortSignal,\n timeoutMs: number = INTERNAL_API_TIMEOUT_MS\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/similar\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(params),\n signal: withTimeoutSignal(timeoutMs, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function searchPath(q: string, signal?: AbortSignal): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n const data = await parseJsonResponse(response, Array.isArray);\n return data?.length > 0 ? data : [q];\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { similar } from \"../requests\";\nimport { SearchResult } from \"../types/search-response\";\n\n// Without a recency window the backend ranks across the entire historical\n// index and surfaces years-old posts. Constrain suggestions to the last\n// ~6 months so related posts stay fresh (it also bounds the backend's\n// more_like_this candidate set, which is what keeps it fast).\nconst SIMILAR_ENTRIES_SINCE_MS = 182 * 24 * 60 * 60 * 1000;\n\n// How many results the suggestions strip renders at most.\nconst SIMILAR_ENTRIES_TARGET = 4;\n\n// more_like_this only extracts a handful of significant terms, so an excerpt is\n// enough signal and keeps the request payload small.\nconst SIMILAR_ENTRIES_BODY_LIMIT = 3000;\n\n// On the server the prefetch sits on the entry-page render path, and the search\n// backend is single-region (EU) — so anything slower than this stalls SSR for a\n// non-essential \"related posts\" strip. Keep the SSR cap short and let the strip\n// fall back to a client fetch (only that render misses the in-HTML strip; it's\n// ISR-cached anyway). Do NOT raise this — 2s is the SSR budget.\nconst SIMILAR_ENTRIES_SSR_TIMEOUT_MS = 2000;\n\n// The client fetch doesn't block paint, so it previously had no cap and fell\n// through to the SDK's generic INTERNAL_API_TIMEOUT_MS (10s; CF's worker further\n// truncates at ~8s). Combined with React Query's default client retry (3×), a\n// /search-api/similar outage turned this best-effort strip into a multi-second\n// post-onload tail (observed as a ~29s \"fully loaded\" in GTmetrix). Cap the\n// client call short and disable retry (below) so a degraded backend just hides\n// the strip quickly instead of churning.\nconst SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS = 4000;\n\n// The strip is hidden below this many results. A lone suggestion looks\n// sparse. Exported so the web component shares one threshold (filter == render).\nexport const SIMILAR_ENTRIES_MIN_RENDER = 2;\n\n// Strip markdown image/link/URL noise before truncating, so more_like_this\n// keys on prose terms instead of image-CDN domains and file hashes (which\n// rarely match the index's sanitized body and just waste the term budget).\nfunction toMltExcerpt(body: string, limit: number): string {\n return body\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, \" \") // markdown images\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\") // markdown links -> keep link text\n .replace(/<[^>]+>/g, \" \") // html tags\n .replace(/https?:\\/\\/\\S+/g, \" \") // bare URLs\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, limit);\n}\n\n// Compact deterministic fingerprint (djb2) of the MLT inputs. Folded into the\n// cache key so an edited post (title/tags/body changed) refetches instead of\n// serving stale recommendations under the same author/permlink. Deterministic\n// so the SSR prefetch and the client compute the same key from the same entry.\nfunction fingerprint(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\ninterface Entry {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n json_metadata?: {\n // Hive's json_metadata is user-controlled and untyped on-chain: `tags` is\n // usually a string[] but some posts store it as a bare string (or other\n // junk). Typed as unknown on purpose so callers can't assume an array —\n // it's narrowed with a runtime guard below.\n tags?: unknown;\n };\n}\n\nexport function getSimilarEntriesQueryOptions(entry: Entry) {\n const title = entry.title ?? \"\";\n // `?? []` only guards null/undefined; a non-array tags value (e.g. a bare\n // string from json_metadata) slips through and crashes `.filter` — which\n // took down the entry-page SSR prefetch (Sentry ECENCY-NEXT-1FMA). Guard on\n // Array.isArray so only real arrays reach the filter.\n const rawTags = entry.json_metadata?.tags;\n const tags = (Array.isArray(rawTags) ? rawTags : []).filter(\n (tag): tag is string => typeof tag === \"string\" && tag !== \"\"\n );\n const body = toMltExcerpt(entry.body ?? \"\", SIMILAR_ENTRIES_BODY_LIMIT);\n const contentKey = fingerprint(`${title}|${tags.join(\",\")}|${body}`);\n\n return queryOptions({\n queryKey: QueryKeys.search.similarEntries(entry.author, entry.permlink, contentKey),\n queryFn: async ({ signal }) => {\n // Naive `YYYY-MM-DDTHH:mm:ss` (no `Z`) matches the search-api date\n // contract used elsewhere; a <14h skew on a 182-day boundary is immaterial.\n const since = new Date(Date.now() - SIMILAR_ENTRIES_SINCE_MS).toISOString().slice(0, 19);\n\n // Elasticsearch more_like_this recommendations: content-based \"related\n // posts\" ranked by shared significant terms in title/body/tags, scoped\n // to the recency window. The backend already excludes the source author,\n // spam and nsfw.\n const response = await similar(\n {\n author: entry.author,\n permlink: entry.permlink,\n title,\n body,\n tags,\n since\n },\n signal,\n // Short cap server-side so a slow cross-region call can't stall SSR;\n // a slightly longer (but still bounded) cap client-side so a degraded\n // backend can't hang the request on the SDK's generic 8s timeout.\n typeof window === \"undefined\"\n ? SIMILAR_ENTRIES_SSR_TIMEOUT_MS\n : SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS\n );\n\n // Light client guard mirroring the render contract: never the source\n // post, never nsfw, one per author, capped at the render target.\n const collected: SearchResult[] = [];\n const seenAuthors = new Set();\n for (const r of response.results) {\n if (collected.length >= SIMILAR_ENTRIES_TARGET) break;\n if (r.permlink === entry.permlink) continue;\n if ((r.tags ?? []).indexOf(\"nsfw\") !== -1) continue;\n if (seenAuthors.has(r.author)) continue;\n seenAuthors.add(r.author);\n collected.push(r);\n }\n\n return collected;\n },\n // The entry page server-prefetches this query and dehydrates it. Without a\n // staleTime, React Query treats the hydrated data as stale and refetches on\n // mount — issuing a *redundant* /search-api/similar XHR right after\n // hydration even though SSR already provided the data. That refetch was the\n // long post-onload tail in the waterfall (held open to the client timeout),\n // inflating GTmetrix \"Fully Loaded\" while the visible strip was already\n // populated from SSR. A staleTime makes the hydrated data fresh so the\n // client skips that refetch; if SSR delivered nothing (empty cache), the\n // client still fetches. Recommendations are stable per post (and the cache\n // key is content-fingerprinted), so 5 min matches the page's ISR cadence.\n staleTime: 5 * 60 * 1000,\n // Best-effort suggestions strip — never retry-storm a degraded backend.\n // The web QueryClient only disables retries on the server; the browser\n // client keeps React Query's default retry (3×) — and other SDK consumers\n // (e.g. mobile) may too — so pin retry:false here to cover every caller.\n retry: false\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { getProfiles } from \"@/modules/bridge\";\nimport { Profile } from \"@/modules/accounts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountQueryOptions(q: string, limit = 5) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.account(normalized, limit),\n queryFn: async (): Promise => {\n const usernames = (await callRPC(\"condenser_api.lookup_accounts\", [\n normalized,\n limit,\n ])) as string[];\n\n if (usernames.length === 0) {\n return [];\n }\n\n return getProfiles(usernames);\n },\n enabled: !!normalized,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { TrendingTag } from \"@/modules/posts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchTopicsQueryOptions(q: string, limit = 10) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.topics(normalized, limit),\n queryFn: async (): Promise => {\n const tags = (await callRPC(\"condenser_api.get_trending_tags\", [\n normalized,\n limit + 1,\n ])) as TrendingTag[];\n\n return tags\n .map((t) => t.name)\n .filter((name) => name !== \"\" && !name.startsWith(\"hive-\"))\n .slice(0, limit);\n },\n enabled: !!normalized,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function getSearchApiInfiniteQueryOptions(\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.search.api(q, sort, hideLow, since, votes, includeNsfw),\n queryFn: async ({ pageParam, signal }: { pageParam: string | undefined; signal: AbortSignal }) => {\n interface SearchApiPayload {\n q: string;\n sort: string;\n hide_low: boolean;\n since?: string;\n scroll_id?: string;\n votes?: number;\n include_nsfw?: number;\n }\n\n const payload: SearchApiPayload = { q, sort, hide_low: hideLow };\n\n if (since) {\n payload.since = since;\n }\n if (pageParam) {\n payload.scroll_id = pageParam;\n }\n if (votes !== undefined) {\n payload.votes = votes;\n }\n if (includeNsfw) {\n payload.include_nsfw = 1;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(payload),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body), instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: SearchResponse) => lastPage?.scroll_id,\n enabled: !!q,\n retry: searchRetryPolicy,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\n\nexport function getSearchPathQueryOptions(q: string) {\n return queryOptions({\n queryKey: [\"search\", \"path\", q],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n });\n\n if (!response.ok) {\n throw new Error(`Search path failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data?.length > 0) {\n return data as string[];\n }\n\n return [q];\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { SupportSettings } from \"../types\";\n\n/**\n * Fetch the active user's Support Ecency settings. The username is resolved\n * server-side from the validated `code`, so only the code is sent. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached. Exported for\n * unit testing; the query options below wrap it.\n */\nexport async function getSupportSettingsRequest(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to fetch support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Query options for the active user's Support Ecency settings\n * (beneficiary percent + curation holdback percent). Zeros mean both\n * opt-ins are off; the backend returns zeros when no row exists.\n */\nexport function getSupportSettingsQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n const name = username?.replace(\"@\", \"\");\n\n return queryOptions({\n queryKey: QueryKeys.support.settings(name),\n queryFn: () => {\n if (!code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return getSupportSettingsRequest(code);\n },\n enabled: !!name && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { QueryClient, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { SupportSettings, UpdateSupportSettingsPayload } from \"../types\";\n\n/**\n * POST a Support Ecency settings update. Both percents are integers within\n * 0..100 (0 = off); the gateway rejects anything else with a 400. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached so the caller\n * can surface the plain validation message. Exported for unit testing; the\n * hook below wraps it.\n */\nexport async function updateSupportSettingsRequest(\n code: string,\n payload: UpdateSupportSettingsPayload\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings-update\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n code,\n beneficiary_percent: payload.beneficiary_percent,\n curation_percent: payload.curation_percent,\n }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to update support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Sync the settings cache after a successful update: seed the fresh server\n * response and invalidate so any active observers refetch. Exported for unit\n * testing; `useUpdateSupportSettings` calls it from `onSuccess`.\n */\nexport function applySupportSettingsUpdate(\n queryClient: QueryClient,\n username: string,\n data: SupportSettings\n) {\n queryClient.setQueryData(QueryKeys.support.settings(username), data);\n return queryClient.invalidateQueries({ queryKey: QueryKeys.support.settings(username) });\n}\n\n/**\n * Update the user's voluntary Support Ecency opt-ins (post beneficiary percent\n * and curation holdback percent). On success the settings query is refreshed\n * so every surface (publish dialog, settings card, injection hooks) sees the\n * new preference.\n */\nexport function useUpdateSupportSettings(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"support\", \"settings-update\", name],\n mutationFn: async (payload: UpdateSupportSettingsPayload) => {\n if (!name || !code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return updateSupportSettingsRequest(code, payload);\n },\n onSuccess(data) {\n if (name) {\n applySupportSettingsUpdate(queryClient, name, data);\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getBoostPlusPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boost-plus-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\n/**\n * RC top-up pricing: duration -> Points cost tiers, served by the ePoints\n * backend via the private API. Reuses the {@link PromotePrice} shape\n * ({ duration, price }).\n */\nexport function getRcDelegationPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation prices: ${response.status}`);\n }\n\n return (await response.json()) as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface RcDelegationActive {\n user: string;\n expires: Date;\n}\n\n/**\n * The active (ON) RC top-up for a user, if any. Lets the UI block a duplicate\n * purchase up front (only one RC top-up is allowed at a time). Returns null\n * when the user has no active top-up.\n */\nexport function getRcDelegationActiveQueryOptions(username: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-active\", username],\n queryFn: async (): Promise => {\n if (!accessToken || !username) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-active\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken, username })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation active: ${response.status}`);\n }\n\n const responseData = (await response.json()) as { user?: string; expires?: string };\n\n return responseData && responseData.expires && responseData.user\n ? { user: responseData.user, expires: new Date(responseData.expires) }\n : null;\n },\n enabled: !!username && !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getPromotePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"promote-price\"],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/promote-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch promote prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface BoostPlusAccountPrice {\n account: string;\n expires: Date;\n}\n\nexport function getBoostPlusAccountPricesQueryOptions(account: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-accounts\", account],\n queryFn: async (): Promise => {\n if (!accessToken || !account) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boosted-plus-account\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken, account }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus account prices: ${response.status}`);\n }\n\n const responseData = await response.json() as {\n expires: string;\n account: string;\n };\n\n return responseData\n ? {\n account: responseData.account,\n expires: new Date(responseData.expires)\n }\n : null;\n },\n enabled: !!account && !!accessToken\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildBoostPlusOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface BoostPlusPayload {\n account: string;\n duration: number;\n}\n\nexport function useBoostPlus(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"boost-plus\"],\n username,\n ({ account, duration }) => [\n buildBoostPlusOp(username!, account, duration)\n ],\n async (_data, { account }) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.promotions.boostPlusAccounts(account),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildRcDelegationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface RcDelegationPayload {\n duration: number;\n}\n\n/**\n * Buys a short-term, RC-only delegation (RC top-up) for the active user, paid\n * with Ecency Points. Mirrors {@link useBoostPlus} but is RC-only (no Hive\n * Power / voting power transferred). Invalidates the user's account + RC caches\n * so the new RC shows up once the relay delegation lands.\n */\nexport function useRcDelegation(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"rc-delegation\"],\n username,\n ({ duration }) => [buildRcDelegationOp(username!, duration)],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!),\n [\"promotions\", \"rc-delegation-active\", username]\n ]);\n }\n },\n auth,\n \"active\",\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { HsTokenRenewResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nexport async function hsTokenRenew(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/auth-api/hs-token-refresh\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n const error = new Error(`Failed to refresh token: ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n const data = (await response.json()) as HsTokenRenewResponse;\n return data;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"../../core\";\n\nconst BAD_ACTORS_URL =\n \"https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt\";\n\nexport function getBadActorsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.badActors.list(),\n queryFn: async ({ signal }) => {\n const response = await fetch(BAD_ACTORS_URL, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bad actors list: ${response.status}`);\n }\n\n const text = await response.text();\n return new Set(text.split(\"\\n\").filter(Boolean));\n },\n staleTime: 24 * 60 * 60 * 1000,\n /**\n * Deliberately left unbounded, including under SSR.\n *\n * `Infinity` is the one value that schedules no gc timer at all —\n * `isValidTimeout` in query-core rejects non-finite timeouts, so\n * `scheduleGc` is a no-op. With no timer there is no GC root, and on a\n * per-request client the entry dies with the request that made it.\n * Replacing it with a finite window would *create* a timer that retains the\n * Query and, through it, that request's whole QueryCache — strictly worse\n * here than leaving it alone.\n */\n gcTime: Infinity\n });\n}\n","export const POLLS_PROTOCOL_VERSION = 1.1;\n\nexport enum PollPreferredInterpretation {\n NUMBER_OF_VOTES = \"number_of_votes\",\n TOKENS = \"tokens\",\n}\n\nexport interface PollChoiceVotes {\n total_votes: number;\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied: number | null;\n}\n\nexport interface PollChoice {\n choice_num: number;\n choice_text: string;\n votes?: PollChoiceVotes;\n}\n\nexport interface PollVoter {\n name: string;\n choices: number[];\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied?: number;\n}\n\nexport interface PollStats {\n total_voting_accounts_num: number;\n total_hive_hp?: number;\n total_hive_proxied_hp?: number;\n total_hive_hp_incl_proxied: number | null;\n}\n\nexport interface Poll {\n author: string;\n permlink: string;\n question: string;\n poll_choices: PollChoice[];\n poll_voters?: PollVoter[];\n poll_stats?: PollStats;\n poll_trx_id: string;\n status: string;\n end_time: string;\n preferred_interpretation: PollPreferredInterpretation | string;\n max_choices_voted: number;\n filter_account_age_days: number;\n protocol_version: number;\n created: string;\n post_title: string;\n post_body: string;\n parent_permlink: string;\n tags: string[];\n image: unknown[];\n token?: string | null;\n community_membership?: string[];\n allow_vote_changes?: boolean;\n ui_hide_res_until_voted?: boolean;\n platform?: string;\n}\n\nexport function mapMetaChoicesToPollChoices(metaChoices: string[]): PollChoice[] {\n if (!metaChoices) {\n return [];\n }\n\n return metaChoices.map((choice, index) => ({\n choice_num: index + 1,\n choice_text: choice,\n votes: {\n total_votes: 0,\n hive_hp: 0,\n hive_proxied_hp: 0,\n hive_hp_incl_proxied: 0,\n },\n }));\n}\n","import { isServer, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys, SERVER_GC_TIME_MS } from \"@/modules/core\";\nimport { getBoundFetch } from \"@/modules/core/utils\";\nimport type { Poll, PollChoice, PollVoter, PollStats } from \"../types\";\n\nfunction normalizePoll(raw: Record): Poll {\n const pollChoices = (raw.poll_choices as Record[] | undefined) ?? [];\n const pollVoters = (raw.poll_voters as Record[] | undefined) ?? [];\n const rawStats = raw.poll_stats as Record | undefined;\n\n const choices: PollChoice[] = pollChoices.map((c) => {\n const votes = c.votes as Record | undefined;\n return {\n choice_num: (c.choice_num as number) ?? 0,\n choice_text: (c.choice_text as string) ?? \"\",\n votes: votes\n ? {\n total_votes: (votes.total_votes as number) ?? 0,\n hive_hp: votes.hive_hp as number | undefined,\n hive_proxied_hp: votes.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: (votes.hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined,\n };\n });\n\n const voters: PollVoter[] = pollVoters.map((v) => ({\n name: (v.name as string) ?? \"\",\n choices: (v.choices as number[]) ?? [],\n hive_hp: v.hive_hp as number | undefined,\n hive_proxied_hp: v.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: v.hive_hp_incl_proxied as number | undefined,\n }));\n\n const stats: PollStats | undefined = rawStats\n ? {\n total_voting_accounts_num: (rawStats.total_voting_accounts_num as number) ?? 0,\n total_hive_hp: rawStats.total_hive_hp as number | undefined,\n total_hive_proxied_hp: rawStats.total_hive_proxied_hp as number | undefined,\n total_hive_hp_incl_proxied: (rawStats.total_hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined;\n\n return {\n author: (raw.author as string) ?? \"\",\n permlink: (raw.permlink as string) ?? \"\",\n question: (raw.question as string) ?? \"\",\n poll_choices: choices,\n poll_voters: voters,\n poll_stats: stats,\n poll_trx_id: (raw.poll_trx_id as string) ?? \"\",\n status: (raw.status as string) ?? \"\",\n end_time: (raw.end_time as string) ?? \"\",\n preferred_interpretation: (raw.preferred_interpretation as string) ?? \"number_of_votes\",\n max_choices_voted: (raw.max_choices_voted as number) ?? 1,\n filter_account_age_days: (raw.filter_account_age_days as number) ?? 0,\n protocol_version: (raw.protocol_version as number) ?? 0,\n created: (raw.created as string) ?? \"\",\n post_title: (raw.post_title as string) ?? \"\",\n post_body: (raw.post_body as string) ?? \"\",\n parent_permlink: (raw.parent_permlink as string) ?? \"\",\n tags: (raw.tags as string[]) ?? [],\n image: (raw.image as unknown[]) ?? [],\n token: raw.token as string | null | undefined,\n community_membership: raw.community_membership as string[] | undefined,\n allow_vote_changes: raw.allow_vote_changes as boolean | undefined,\n ui_hide_res_until_voted: (raw.ui_hide_res_until_voted as boolean | undefined) ?? false,\n platform: raw.platform as string | undefined,\n };\n}\n\nexport function getPollQueryOptions(\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.polls.details(author ?? \"\", permlink ?? \"\"),\n enabled: !!author && !!permlink,\n // Long in a browser, where a poll is cheap to keep and often revisited;\n // bounded during SSR, where holding it also holds that request's whole\n // cache. See SERVER_GC_TIME_MS.\n gcTime: isServer ? SERVER_GC_TIME_MS : 30 * 60 * 1000,\n queryFn: async (): Promise => {\n if (!author || !permlink) {\n throw new Error(\"[SDK][Polls] – missing author or permlink\");\n }\n\n const fetchApi = getBoundFetch();\n const url = `${CONFIG.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(author)}&permlink=eq.${encodeURIComponent(permlink)}`;\n const response = await fetchApi(url);\n\n if (!response.ok) {\n throw new Error(`[SDK][Polls] – fetch failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data) || !data[0]) {\n throw new Error(\"[SDK][Polls] – no poll data found\");\n }\n\n return normalizePoll(data[0]);\n },\n });\n}\n","import { QueryKeys, useBroadcastMutation } from \"@/modules/core\";\nimport type { BroadcastMode, AuthContextV2 } from \"@/modules/core\";\n\nexport interface PollVotePayload {\n pollTrxId: string;\n choices: number[];\n}\n\nexport function usePollVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n QueryKeys.polls.vote(),\n username ?? \"\",\n ({ pollTrxId, choices }) => {\n if (!username) {\n throw new Error(\"[SDK][Polls] Cannot vote without an authenticated username\");\n }\n return [\n [\n \"custom_json\",\n {\n id: \"polls\",\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify({\n poll: pollTrxId,\n action: \"vote\",\n choices,\n }),\n },\n ],\n ];\n },\n undefined,\n auth,\n \"posting\",\n { broadcastMode: broadcastMode ?? \"async\" }\n );\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/hive-tx/helpers/ByteBuffer.ts","../../src/hive-tx/config.ts","../../src/hive-tx/helpers/Signature.ts","../../src/hive-tx/helpers/PublicKey.ts","../../src/hive-tx/helpers/Asset.ts","../../src/hive-tx/helpers/HexBuffer.ts","../../src/hive-tx/helpers/serializer.ts","../../src/hive-tx/helpers/sleep.ts","../../src/hive-tx/helpers/call.ts","../../src/hive-tx/Transaction.ts","../../src/hive-tx/helpers/PrivateKey.ts","../../src/hive-tx/helpers/aes.ts","../../src/hive-tx/helpers/deserializer.ts","../../src/hive-tx/helpers/memo.ts","../../src/hive-tx/helpers/utils.ts","../../src/modules/core/hive-tx.ts","../../src/modules/core/errors/chain-errors.ts","../../src/modules/core/mutations/use-broadcast-mutation.ts","../../src/modules/core/mutations/broadcast-json.ts","../../src/modules/core/mutations/invalidate-after-broadcast.ts","../../src/modules/core/abort-signal.ts","../../src/modules/core/config.ts","../../src/modules/core/queries-manager.ts","../../src/modules/core/utils/decoder-encoder.ts","../../src/modules/core/utils/parse-asset.ts","../../src/modules/core/utils/get-bound-fetch.ts","../../src/modules/core/utils/is-community.ts","../../src/modules/core/utils/pagination-helpers.ts","../../src/modules/core/utils/vests-to-hp.ts","../../src/modules/core/utils/is-empty-date.ts","../../src/modules/core/queries/get-dynamic-props-query-options.ts","../../src/modules/core/queries/get-reward-fund-query-options.ts","../../src/modules/core/query-keys.ts","../../src/modules/ai/queries/get-ai-generate-price-query-options.ts","../../src/modules/ai/queries/get-ai-assist-price-query-options.ts","../../src/modules/ai/queries/get-ai-transcribe-price-query-options.ts","../../src/modules/ai/mutations/use-generate-image.ts","../../src/modules/ai/mutations/use-ai-assist.ts","../../src/modules/ai/mutations/use-ai-transcribe.ts","../../src/modules/accounts/queries/get-account-full-query-options.ts","../../src/modules/accounts/utils/profile-metadata.ts","../../src/modules/accounts/utils/parse-accounts.ts","../../src/modules/accounts/queries/get-accounts-query-options.ts","../../src/modules/accounts/queries/get-follow-count-query-options.ts","../../src/modules/accounts/queries/get-followers-query-options.ts","../../src/modules/accounts/queries/get-following-query-options.ts","../../src/modules/accounts/queries/get-muted-users-query-options.ts","../../src/modules/accounts/queries/lookup-accounts-query-options.ts","../../src/modules/accounts/queries/search-accounts-by-username-query-options.ts","../../src/modules/accounts/queries/check-username-wallets-pending-query-options.ts","../../src/modules/accounts/queries/get-relationship-between-accounts-query-options.ts","../../src/modules/accounts/queries/get-account-subscriptions-query-options.ts","../../src/modules/accounts/queries/get-bookmarks-query-options.ts","../../src/modules/accounts/queries/get-favorites-query-options.ts","../../src/modules/accounts/queries/check-favorite-query-options.ts","../../src/modules/accounts/queries/get-account-recoveries-query-options.ts","../../src/modules/accounts/queries/get-account-pending-recovery-query-options.ts","../../src/modules/accounts/queries/get-account-reputations-query-options.ts","../../src/modules/accounts/queries/get-transactions-infinite-query-options.ts","../../src/modules/accounts/queries/get-bots-query-options.ts","../../src/modules/accounts/queries/get-referrals-infinite-query-options.ts","../../src/modules/accounts/queries/get-referrals-stats-query-options.ts","../../src/modules/accounts/queries/get-friends-infinite-query-options.ts","../../src/modules/accounts/queries/get-search-friends-query-options.ts","../../src/modules/posts/queries/get-trending-tags-query-options.ts","../../src/modules/posts/queries/get-trending-tags-with-stats-query-options.ts","../../src/modules/posts/queries/get-fragments-query-options.ts","../../src/modules/posts/queries/get-promoted-posts-query-options.ts","../../src/modules/posts/queries/get-entry-active-votes-query-options.ts","../../src/modules/posts/queries/get-user-post-vote-query-options.ts","../../src/modules/posts/queries/get-content-query-options.ts","../../src/modules/posts/queries/get-content-replies-query-options.ts","../../src/modules/posts/queries/get-post-header-query-options.ts","../../src/modules/posts/utils/filter-dmca-entries.ts","../../src/modules/bridge/verify-on-alternate-node.ts","../../src/modules/posts/queries/get-post-query-options.ts","../../src/modules/bridge/requests.ts","../../src/modules/posts/queries/get-discussions-query-options.ts","../../src/modules/posts/queries/get-account-posts-query-options.ts","../../src/modules/posts/queries/get-posts-ranked-query-options.ts","../../src/modules/posts/queries/get-reblogs-query-options.ts","../../src/modules/posts/queries/get-reblogged-by-query-options.ts","../../src/modules/posts/queries/get-schedules-query-options.ts","../../src/modules/posts/queries/get-drafts-query-options.ts","../../src/modules/posts/queries/get-images-query-options.ts","../../src/modules/posts/queries/get-comment-history-query-options.ts","../../src/modules/posts/queries/get-deleted-entry-query-options.ts","../../src/modules/posts/queries/get-post-tips-query-options.ts","../../src/modules/posts/utils/waves-helpers.ts","../../src/modules/posts/queries/get-waves-feed-query-options.ts","../../src/modules/posts/queries/get-shorts-feed-query-options.ts","../../src/modules/posts/queries/get-waves-by-host-query-options.ts","../../src/modules/posts/queries/get-waves-by-tag-query-options.ts","../../src/modules/posts/queries/get-waves-following-query-options.ts","../../src/modules/posts/queries/get-waves-trending-tags-query-options.ts","../../src/modules/posts/queries/get-waves-by-account-query-options.ts","../../src/modules/posts/queries/get-waves-trending-authors-query-options.ts","../../src/modules/posts/queries/get-normalize-post-query-options.ts","../../src/modules/accounts/queries/get-account-vote-history-infinite-query-options.ts","../../src/modules/accounts/queries/get-profiles-query-options.ts","../../src/modules/accounts/queries/get-balance-history-query-options.ts","../../src/modules/accounts/queries/get-aggregated-balance-query-options.ts","../../src/modules/accounts/queries/get-pro-members-query-options.ts","../../src/modules/accounts/mutations/use-account-update.ts","../../src/modules/accounts/mutations/use-account-relations-update.ts","../../src/modules/operations/builders/content.ts","../../src/modules/operations/builders/wallet.ts","../../src/modules/operations/builders/social.ts","../../src/modules/operations/builders/governance.ts","../../src/modules/operations/builders/community.ts","../../src/modules/operations/builders/market.ts","../../src/modules/operations/builders/account.ts","../../src/modules/operations/builders/ecency.ts","../../src/modules/accounts/mutations/use-follow.ts","../../src/modules/accounts/mutations/use-unfollow.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-add.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-delete.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-add.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-delete.ts","../../src/modules/accounts/mutations/use-account-update-key-auths.ts","../../src/modules/accounts/mutations/use-account-update-password.ts","../../src/modules/accounts/mutations/use-account-revoke-posting.ts","../../src/modules/accounts/mutations/use-account-update-recovery.ts","../../src/modules/accounts/mutations/build-revoke-keys-op.ts","../../src/modules/accounts/mutations/use-account-revoke-key.ts","../../src/modules/accounts/mutations/use-claim-account.ts","../../src/modules/accounts/mutations/use-grant-posting-permission.ts","../../src/modules/accounts/mutations/use-create-account.ts","../../src/modules/accounts/utils/account-power.ts","../../src/modules/operations/authority-map.ts","../../src/modules/operations/mutations/sign-operation-by-key.ts","../../src/modules/operations/mutations/sign-operation-by-keychain.ts","../../src/modules/operations/mutations/sign-operation-by-hivesigner.ts","../../src/modules/operations/queries/get-chain-properties-query-options.ts","../../src/modules/posts/utils/fragment-cache-helpers.ts","../../src/modules/posts/mutations/add-fragment.ts","../../src/modules/posts/mutations/edit-fragment.ts","../../src/modules/posts/mutations/remove-fragment.ts","../../src/modules/private-api/requests.ts","../../src/modules/posts/mutations/use-add-draft.ts","../../src/modules/posts/mutations/use-update-draft.ts","../../src/modules/posts/mutations/use-delete-draft.ts","../../src/modules/posts/mutations/use-add-schedule.ts","../../src/modules/posts/mutations/use-delete-schedule.ts","../../src/modules/posts/mutations/use-move-schedule.ts","../../src/modules/posts/mutations/use-add-image.ts","../../src/modules/posts/mutations/use-delete-image.ts","../../src/modules/posts/mutations/use-upload-image.ts","../../src/modules/posts/cache/entries-cache-management.ts","../../src/modules/posts/mutations/use-vote.ts","../../src/modules/posts/mutations/use-reblog.ts","../../src/modules/posts/mutations/use-comment.ts","../../src/modules/posts/cache/discussions-cache-utils.ts","../../src/modules/posts/mutations/use-delete-comment.ts","../../src/modules/posts/mutations/use-cross-post.ts","../../src/modules/posts/mutations/use-update-reply.ts","../../src/modules/posts/mutations/use-promote.ts","../../src/modules/posts/utils/validate-post-creating.ts","../../src/modules/analytics/mutations/index.ts","../../src/modules/analytics/mutations/use-record-activity.ts","../../src/modules/analytics/queries/get-discover-leaderboard-query-options.ts","../../src/modules/analytics/queries/get-discover-curation-query-options.ts","../../src/modules/analytics/queries/get-page-stats-query-options.ts","../../src/modules/integrations/3speak/functions/beneficiary.ts","../../src/modules/integrations/3speak/queries/index.ts","../../src/modules/integrations/hivesigner/queries/index.ts","../../src/modules/integrations/hivesigner/queries/get-decode-memo-query-options.ts","../../src/modules/integrations/hivesigner/index.ts","../../src/modules/integrations/3speak/queries/get-account-token-query-options.ts","../../src/modules/integrations/3speak/queries/get-account-videos-query-options.ts","../../src/modules/integrations/3speak/index.ts","../../src/modules/integrations/hiveposh/queries/get-hiveposh-links-query-options.ts","../../src/modules/integrations/plausible/queries/get-stats-query-options.ts","../../src/modules/resource-credits/queries/get-rc-stats-query-options.ts","../../src/modules/resource-credits/queries/get-account-rc-query-options.ts","../../src/modules/resource-credits/utils/estimate-rc-precheck.ts","../../src/modules/games/queries/game-status-check-query-options.ts","../../src/modules/games/mutations/game-claim.ts","../../src/modules/quests/queries/get-quests-query-options.ts","../../src/modules/quests/catalog.ts","../../src/modules/quests/mutations/buy-streak-freeze.ts","../../src/modules/communities/mutations/use-subscribe-community.ts","../../src/modules/communities/mutations/use-unsubscribe-community.ts","../../src/modules/communities/mutations/use-mute-post.ts","../../src/modules/communities/mutations/use-set-community-role.ts","../../src/modules/communities/mutations/use-update-community.ts","../../src/modules/communities/mutations/use-register-community-rewards.ts","../../src/modules/communities/mutations/use-pin-post.ts","../../src/modules/communities/queries/get-communities-query-options.ts","../../src/modules/communities/queries/get-community-context-query-options.ts","../../src/modules/communities/queries/get-community-query-options.ts","../../src/modules/communities/queries/get-community-subscribers-query-options.ts","../../src/modules/communities/queries/get-account-notifications-infinite-query-options.ts","../../src/modules/communities/queries/get-rewarded-communities-query-options.ts","../../src/modules/communities/types/community.ts","../../src/modules/communities/utils/index.ts","../../src/modules/notifications/queries/get-notifications-unread-count-query-options.ts","../../src/modules/notifications/queries/get-notifications-infinite-query-options.ts","../../src/modules/notifications/enums/notification-filter.ts","../../src/modules/notifications/enums/notify-types.ts","../../src/modules/notifications/queries/get-notifications-settings-query-options.ts","../../src/modules/notifications/queries/get-announcements-query-options.ts","../../src/modules/notifications/queries/get-spotlights-query-options.ts","../../src/modules/notifications/mutations/use-mark-notifications-read.ts","../../src/modules/notifications/mutations/use-set-last-read.ts","../../src/modules/proposals/queries/get-proposal-query-options.ts","../../src/modules/proposals/queries/get-proposals-query-options.ts","../../src/modules/proposals/queries/get-proposal-votes-query-options.ts","../../src/modules/proposals/queries/get-user-proposal-votes-query-options.ts","../../src/modules/proposals/mutations/use-proposal-vote.ts","../../src/modules/proposals/mutations/use-proposal-create.ts","../../src/modules/wallet/queries/get-vesting-delegations-query-options.ts","../../src/modules/wallet/queries/get-account-delegations-query-options.ts","../../src/modules/wallet/queries/get-vesting-delegation-expirations-query-options.ts","../../src/modules/wallet/queries/get-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-collateralized-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-savings-withdraw-from-query-options.ts","../../src/modules/wallet/queries/get-withdraw-routes-query-options.ts","../../src/modules/wallet/queries/get-open-orders-query-options.ts","../../src/modules/wallet/queries/get-outgoing-rc-delegations-infinite-query-options.ts","../../src/modules/wallet/queries/get-incoming-rc-query-options.ts","../../src/modules/wallet/queries/get-received-vesting-shares-query-options.ts","../../src/modules/wallet/queries/get-recurrent-transfers-query-options.ts","../../src/modules/wallet/queries/get-portfolio-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-general-info-query-options.ts","../../src/modules/wallet/consts/hive-account-operation-groups.ts","../../src/modules/wallet/consts/hive-operation-list.ts","../../src/modules/wallet/consts/hive-operation-orders.ts","../../src/modules/wallet/queries/get-hive-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-metric-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-withdrawal-routes-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegates-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegatings-query-options.ts","../../src/modules/market/queries/get-order-book-query-options.ts","../../src/modules/market/queries/get-market-statistics-query-options.ts","../../src/modules/market/queries/get-market-history-query-options.ts","../../src/modules/market/queries/get-hive-hbd-stats-query-options.ts","../../src/modules/market/queries/get-market-data-query-options.ts","../../src/modules/market/queries/get-trade-history-query-options.ts","../../src/modules/market/queries/get-feed-history-query-options.ts","../../src/modules/market/queries/get-current-median-history-price-query-options.ts","../../src/modules/market/mutations/use-limit-order-create.ts","../../src/modules/market/mutations/use-limit-order-cancel.ts","../../src/modules/market/requests.ts","../../src/modules/hive-engine/requests.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-balances-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-market-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-metadata-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-transactions-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-metrics-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-unclaimed-rewards-query-options.ts","../../src/modules/hive-engine/queries/get-all-hive-engine-tokens-query-options.ts","../../src/modules/hive-engine/utils/formatted-number.ts","../../src/modules/hive-engine/utils/hive-engine-token.ts","../../src/modules/hive-engine/queries/get-hive-engine-balances-with-usd-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-general-info-query-options.ts","../../src/modules/points/queries/get-points-query-options.ts","../../src/modules/points/queries/get-points-asset-general-info-query-options.ts","../../src/modules/points/queries/get-points-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-account-wallet-asset-info-query-options.ts","../../src/modules/wallet/types/asset-operation.ts","../../src/modules/wallet/mutations/use-transfer.ts","../../src/modules/wallet/mutations/use-transfer-point.ts","../../src/modules/wallet/mutations/use-delegate-vesting-shares.ts","../../src/modules/wallet/mutations/use-set-withdraw-vesting-route.ts","../../src/modules/wallet/mutations/use-transfer-engine-token.ts","../../src/modules/wallet/mutations/use-transfer-to-savings.ts","../../src/modules/wallet/mutations/use-transfer-from-savings.ts","../../src/modules/wallet/mutations/use-transfer-to-vesting.ts","../../src/modules/wallet/mutations/use-withdraw-vesting.ts","../../src/modules/wallet/mutations/use-convert.ts","../../src/modules/wallet/mutations/use-claim-interest.ts","../../src/modules/wallet/mutations/use-claim-rewards.ts","../../src/modules/wallet/mutations/use-delegate-engine-token.ts","../../src/modules/wallet/mutations/use-undelegate-engine-token.ts","../../src/modules/wallet/mutations/use-stake-engine-token.ts","../../src/modules/wallet/mutations/use-unstake-engine-token.ts","../../src/modules/wallet/mutations/use-claim-engine-rewards.ts","../../src/modules/wallet/mutations/use-engine-market-order.ts","../../src/modules/wallet/mutations/use-wallet-operation.ts","../../src/modules/wallet/mutations/use-delegate-rc.ts","../../src/modules/witnesses/mutations/use-witness-vote.ts","../../src/modules/witnesses/mutations/use-witness-proxy.ts","../../src/modules/witnesses/queries/get-witnesses-query-options.ts","../../src/modules/points/types/point-transaction-type.ts","../../src/modules/points/mutations/use-claim-points.ts","../../src/modules/search/query-builder.ts","../../src/modules/search/parse-json-response.ts","../../src/modules/search/retry-policy.ts","../../src/modules/search/queries/get-search-query-options.ts","../../src/modules/search/requests.ts","../../src/modules/search/queries/get-similar-entries-query-options.ts","../../src/modules/search/queries/get-search-account-query-options.ts","../../src/modules/search/queries/get-search-topics-query-options.ts","../../src/modules/search/queries/get-search-api-infinite-query-options.ts","../../src/modules/search/queries/get-search-path-query-options.ts","../../src/modules/support/queries/get-support-settings-query-options.ts","../../src/modules/support/mutations/update-support-settings.ts","../../src/modules/promotions/queries/get-boost-plus-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-active-query-options.ts","../../src/modules/promotions/queries/get-promote-price-query-options.ts","../../src/modules/promotions/queries/get-boost-plus-account-prices-query-options.ts","../../src/modules/promotions/mutations/use-boost-plus.ts","../../src/modules/promotions/mutations/use-rc-delegation.ts","../../src/modules/auth/requests.ts","../../src/modules/bad-actors/queries/get-bad-actors-query-options.ts","../../src/modules/polls/types/poll.ts","../../src/modules/polls/queries/get-poll-query-options.ts","../../src/modules/polls/mutations/use-poll-vote.ts"],"names":["EMPTY_BUFFER","_encoder","_decoder","getEncoder","s","utf8","i","c","next","getDecoder","b","bytes","result","byte","codePoint","ByteBuffer","_ByteBuffer","capacity","littleEndian","buffers","buf","bb","view","offset","buffer","source","value","relative","src","copy","begin","end","target","targetOffset","sourceOffset","sourceLimit","targetRelative","len","current","length","forceCopy","limit","size","str","currentOffset","encoded","lenVarintSize","start","lenResult","lenValue","lenLength","config","sanitizeNodeList","nodes","n","setNodes","validNodes","setRestNodes","valid","setRestNodesByApi","map","api","list","setUserAgent","ua","setResilience","opts","r","bool","v","pos","Signature","_Signature","data","recovery","compressed","string","temp","hexToBytes","bytesToHex","message","sig","secp256k1","PublicKey","_PublicKey","key","prefix","wif","expectedPrefix","bs58","checksum","expectedChecksum","ripemd160","isUint8ArrayEqual","signature","encodePublic","a","Asset","_Asset","amount","symbol","expectedSymbol","amountString","HexBuffer","_HexBuffer","OPERATION_IDS","VoidSerializer","StringSerializer","Int16Serializer","Int64Serializer","UInt8Serializer","UInt16Serializer","UInt32Serializer","UInt64Serializer","BooleanSerializer","StaticVariantSerializer","itemSerializers","id","item","AssetSerializer","asset","precision","DateSerializer","PublicKeySerializer","BinarySerializer","VariableBinarySerializer","FlatMapSerializer","keySerializer","valueSerializer","ArraySerializer","itemSerializer","ObjectSerializer","keySerializers","serializer","error","OptionalSerializer","AuthoritySerializer","BeneficiarySerializer","PriceSerializer","ChainPropertiesSerializer","OperationDataSerializer","operationId","definitions","objectSerializer","OperationSerializers","ProposalUpdateSerializer","OperationSerializer","operation","TransactionSerializer","EncryptedMemoSerializer","Serializer","sleep","ms","resolve","isNodeRuntime","serverIdentityHeaders","RPCError","rpcError","NodeError","node","parseRetryAfterMs","header","secs","dateMs","delta","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","RATE_LIMIT_BASE_MS","RATE_LIMIT_MAX_MS","RATE_LIMIT_STREAK_RESET_MS","MAX_API_FAILURES_BEFORE_COOLDOWN","API_COOLDOWN_MS","HEAD_BLOCK_MAX_AGE_MS","STALE_BLOCK_THRESHOLD","LATENCY_EWMA_ALPHA","LATENCY_MIN_SAMPLES","LATENCY_MAX_AGE_MS","LATENCY_REPROBE_MS","LATENCY_UNPROVEN_PRIOR_MS","LATENCY_SLOW_FAILURE_MS","NodeHealthTracker","h","durationMs","profileKey","apiFail","now","p","elapsedMs","existing","retryAfterMs","hasHeader","cooldown","blockNum","recent","best","healthy","unhealthy","ordered","d","probe","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","HedgeBudget","tokens","rpcHedgeBudget","adaptiveAttemptTimeout","tracker","callerTimeout","explicit","ewma","recordError","e","tryRecordHeadBlock","block","createTimeoutReason","err","createTimeoutSignal","controller","timer","mergeSignals","primary","secondary","onPrimaryAbort","onSecondaryAbort","cleanup","jsonRPCCall","url","params","timeout","shouldRetry","externalSignal","body","tSignal","cleanupTimeout","signal","cleanupMerge","res","jitterDelay","hedgedRpcAttempt","hedgePool","explicitTimeout","deadlineAt","onHedgeFired","validate","reject","done","pendingLegs","hedgeFired","primarySettled","lastError","hedgeTimer","primaryStart","controllers","finish","settle","startLeg","isHedge","merged","legTimeout","primaryWindow","delay","live","callRPC","retry","ceiling","deadline","triedInRound","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","restProfileKey","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","restSignal","restCleanup","restCallStart","response","callWithQuorum","quorum","allNodes","arr","j","currentBatchSize","allResults","batchNodes","promises","batchResults","consensusResult","findConsensus","results","resultGroups","consensusGroup","group","chainId","Transaction","_Transaction","options","operationName","operationBody","keys","digest","txId","checkStatus","maxPollAttempts","status","transactionData","sha256","expiration","props","refBlockPrefix","expirationIso","NETWORK_ID","PrivateKey","_PrivateKey","decodePrivate","seed","username","password","role","rv","encodePrivate","publicKey","sha512","doubleSha256","input","encodedKey","checksumVerify","encrypt","privateKey","nonce","uniqueNonce","crypt","decrypt","nonceL","S","ebuf","encryptionKey","iv","tag","check","cbuf","check32","cryptoJsDecrypt","cryptoJsEncrypt","messageBuffer","AESCBC","uniqueNonceEntropy","randomPrivateKey","long","entropy","PublicKeyDeserializer","fixedBuf","UInt64Deserializer","UInt32Deserializer","BinaryDeserializer","bCopy","BufferDeserializer","keyDeserializers","obj","deserializer","EncryptedMemoDeserializer","Deserializer","encode","memo","testNonce","checkEncryption","toPrivateObj","toPublicObj","mbuf","memoBuffer","mbuf2","decode","from","to","encrypted","otherpub","encodeTest","plaintext","cyphertext","o","Memo","utils_exports","__export","buildWitnessSetProperties","makeBitMaskFilter","operations","validateUsername","suffix","ref","label","allowedOperations","reduceFunction","low","high","allowedOperation","owner","type","serialize","nobleSha256","isWif","broadcastOperations","ops","tx","op","broadcastOperationsAsync","MANA_REGENERATION_SECONDS","calculateManabar","maxMana","manabar","currentMana","percentage","getVests","account","vests","delegated","received","withdrawRate","alreadyWithdrawn","withdrawVests","calculateVPMana","calculateRCMana","rcAccount","ErrorType","parseChainError","errorDescription","errorMessage","errorCode","errorString","testPattern","pattern","formatError","parsed","shouldTriggerAuthFallback","isResourceCreditsError","isInfoError","isNetworkError","broadcastWithMethod","auth","authority","fetchedKey","fetchedToken","broadcastMode","adapter","token","hs","tokenError","broadcastWithFallback","loginType","hasPostingAuth","selectedMethod","hsError","chain","errors","shouldSkip","skipReason","prefetchedKey","prefetchedToken","skipReasons","errorMessages","useBroadcastMutation","mutationKey","onSuccess","useMutation","payload","postingKey","accessToken","broadcastJson","jjson","BROADCAST_INCLUSION_DELAY_MS","invalidateAfterBroadcast","withTimeoutSignal","timeoutMs","timeoutSignal","ac","onAbort","reason","isDevelopment","getHeliusApiKey","INTERNAL_API_TIMEOUT_MS","SERVER_GC_TIME_MS","queryClientResolver","fallbackQueryClient","resolveQueryClient","QueryClient","CONFIG","client","ConfigManager","setQueryClient","setQueryClientResolver","setPrivateApiHost","host","setClientId","clientId","setDefaultObserver","observer","getValidatedBaseUrl","setPollsApiHost","setImageHost","setHiveNodes","userAgent","analyzeRedosRisk","unboundedRange","match","min","max","testRegexPerformance","regex","adversarialInputs","maxExecutionTime","duration","safeCompileRegex","maxLength","staticAnalysis","compileErr","runtimeTest","setDmcaLists","lists","coerceList","resolved","rejectedTagCount","makeQueryClient","getQueryClient","EcencyQueriesManager","getQueryData","queryKey","getInfiniteQueryData","prefetchQuery","prefetchInfiniteQuery","generateClientServerQuery","useQuery","generateClientServerInfiniteQuery","useInfiniteQuery","encodeObj","decodeObj","dataToParse","Symbol","NaiMap","parseAsset","sval","sp","cachedFetch","getBoundFetch","isCommunity","isWrappedResponse","normalizeToWrappedResponse","vestsToHp","hivePerMVests","isEmptyDate","DYNAMIC_PROPS_REFRESH_MS","getDynamicPropsQueryOptions","queryOptions","QueryKeys","rawGlobalDynamic","rawFeedHistory","rawChainProps","rawRewardFund","rawHardforkProps","totalVestingSharesAmount","totalVestingFundAmount","base","quote","fundRecentClaims","fundRewardBalance","votePowerReserveRate","authorRewardCurve","contentConstant","currentHardforkVersion","lastHardfork","hbdPrintRate","hbdInterestRate","headBlock","totalVestingFund","totalVestingShares","virtualSupply","vestingRewardPercent","accountCreationFee","getRewardFundQueryOptions","fundName","entryPath","author","permlink","filter","startAuthor","startPermlink","activeUsername","sort","order","onlyMeta","hours","usernames","following","mode","followType","query","follower","startFollowing","startFollower","excludeList","accounts","targetUsername","reference","name","communityName","proposalId","voter","q","hideLow","since","scrollId","votes","what","content","includeNsfw","witness","page","pageSize","direction","user","coinType","granularity","onlyEnabled","currency","filterKey","bucketSeconds","seconds","startDate","endDate","coin","vsCurrency","fromTs","toTs","dimensions","metrics","dateRange","gameType","getAiGeneratePriceQueryOptions","getAiAssistPriceQueryOptions","getAiTranscribePriceQueryOptions","makeIdempotencyKey","useGenerateImage","pendingData","useAiAssist","useAiTranscribe","form","isMetadataStripped","hasProfileValues","profile","getAccountFullQueryOptions","bridgeProfile","rows","chainAccount","reread","parseProfileMetadata","stats","follow_stats","reputationValue","DENIED_KEYS","isPlainObject","proto","deepMerge","srcVal","tgtVal","sanitizeTokens","meta","rest","safeMeta","postingJsonMetadata","extractAccountProfile","pickRicherMetadataSnapshot","preferred","fallback","preferredKeys","parsePostingMetadataRoot","buildPostingJsonMetadata","existingPostingJsonMetadata","root","existingProfile","mergedProfile","buildProfileMetadata","profileTokens","_ignoredVersion","profileRest","metadata","parseAccounts","rawAccounts","x","jsonMetadata","getAccountsQueryOptions","getFollowCountQueryOptions","getFollowersQueryOptions","getFollowingQueryOptions","MUTED_USERS_PAGE_SIZE","MUTED_USERS_MAX_PAGES","getMutedUsersQueryOptions","muted","names","lookupAccountsQueryOptions","getSearchAccountsByUsernameQueryOptions","RESERVED_META_KEYS","checkUsernameWalletsPendingQueryOptions","wallets","walletItem","sanitizedMeta","address","showFlag","baseCandidate","metaTokenCandidates","metaSymbol","metaValue","getRelationshipBetweenAccountsQueryOptions","getAccountSubscriptionsQueryOptions","getBookmarksQueryOptions","getBookmarksInfiniteQueryOptions","infiniteQueryOptions","pageParam","json","lastPage","getFavoritesQueryOptions","getFavoritesInfiniteQueryOptions","checkFavoriteQueryOptions","getAccountRecoveriesQueryOptions","getAccountPendingRecoveryQueryOptions","getAccountReputationsQueryOptions","ACCOUNT_OPERATION_GROUPS","ALL_ACCOUNT_OPERATIONS","acc","val","deriveNum","entry","normalizeOpType","restType","isNaiAsset","naiToString","normalizeOpValue","k","getTransactionsInfiniteQueryOptions","operationTypes","nextPage","getBotsQueryOptions","getReferralsInfiniteQueryOptions","maxId","nextMaxId","getReferralsStatsQueryOptions","getFriendsInfiniteQueryOptions","enabled","accountNames","SEARCH_LIMIT","getSearchFriendsQueryOptions","getTrendingTagsQueryOptions","afterTag","tags","getTrendingTagsWithStatsQueryOptions","getFragmentsQueryOptions","getFragmentsInfiniteQueryOptions","getPromotedPostsQuery","getEntryActiveVotesQueryOptions","getUserPostVoteQueryOptions","getContentQueryOptions","getContentRepliesQueryOptions","getPostHeaderQueryOptions","filterDmcaEntry","entryOrEntries","applyFilter","verifyPostOnAlternateNode","getPostQueryOptions","num","cleanPermlink","verified","verifiedEntry","bridgeApiCall","resolvePost","post","resp","getPost","resolvePosts","posts","validatedPosts","validateEntry","getPostsRanked","start_author","start_permlink","getAccountPosts","newEntry","requiredStringProps","prop","validatedEntry","getPostHeader","getDiscussion","validatedResp","getCommunity","getCommunities","last","normalizePost","getSubscriptions","getSubscribers","community","getRelationshipBetweenAccounts","getProfiles","SortOrder","sortDiscussions","discussion","allPayout","absNegative","isPinned","sortOrders","_a","_b","keyA","keyB","sorted","pinnedIndex","pinned","getDiscussionsQueryOptions","resolvedObserver","oldData","newData","optimisticEntries","fetchedPermlinks","missingOptimistic","opt","getDiscussionQueryOptions","getAccountPostsInfiniteQueryOptions","hasNextPage","getAccountPostsQueryOptions","displaySelects","displaySelect","select","orderForDisplay","byCreated","getPostsRankedInfiniteQueryOptions","_options","sanitizedTag","getPostsRankedQueryOptions","getReblogsQueryOptions","getRebloggedByQueryOptions","getSchedulesQueryOptions","getSchedulesInfiniteQueryOptions","getDraftsQueryOptions","getDraftsInfiniteQueryOptions","fetchUserImages","getImagesQueryOptions","getGalleryImagesQueryOptions","getImagesInfiniteQueryOptions","getCommentHistoryQueryOptions","makeEntryPath","cleanAuthor","normalizedAuthor","normalizedPermlink","getDeletedEntryQueryOptions","isValid","history","title","getPostTipsQueryOptions","isEnabled","normalizeContainer","normalizeParent","normalizeWaveEntryFromApi","containerSource","container","parent","toEntryArray","getVisibleFirstLevelThreadItems","discussionItemsRaw","discussionItems","firstLevelItems","parent_author","parent_permlink","mapThreadItemsToWaveEntries","items","DEFAULT_FEED_LIMIT","normalizeParams","fetchWavesFeedPage","containers","cursor","row","getWavesFeedQueryOptions","normalized","getWavesLatestFeedQueryOptions","fetchShortsFeedPage","getShortsFeedQueryOptions","THREAD_CONTAINER_BATCH_SIZE","MAX_CONTAINERS_TO_SCAN","getThreads","scannedContainers","skipContainerId","rpcParams","normalizedContainers","visibleItems","lastContainer","getWavesByHostQueryOptions","DEFAULT_TAG_FEED_LIMIT","getWavesByTagQueryOptions","getWavesFollowingQueryOptions","normalizedUsername","flattened","getWavesTrendingTagsQueryOptions","getWavesByAccountQueryOptions","getWavesTrendingAuthorsQueryOptions","getNormalizePostQueryOptions","isEntry","getDays","createdDate","past","getAccountVoteHistoryInfiniteQueryOptions","filters","dayLimit","historyObj","filtered","entries","firstHistory","getProfilesQueryOptions","getBalanceHistoryInfiniteQueryOptions","getAggregatedBalanceQueryOptions","getProMembersQueryOptions","proMembersSet","members","m","useAccountUpdate","queryClient","useQueryClient","_data","variables","useAccountRelationsUpdate","onError","kind","relationsQuery","actualRelation","buildVoteOp","weight","buildCommentOp","parentAuthor","parentPermlink","buildCommentOptionsOp","maxAcceptedPayout","percentHbd","allowVotes","allowCurationRewards","extensions","buildDeleteCommentOp","buildReblogOp","deleteReblog","buildTransferOp","buildMultiTransferOps","destinations","dest","buildRecurrentTransferOp","recurrence","executions","buildTransferToSavingsOp","buildTransferFromSavingsOp","requestId","buildCancelTransferFromSavingsOp","buildClaimInterestOps","buildTransferToVestingOp","buildWithdrawVestingOp","vestingShares","buildDelegateVestingSharesOp","delegator","delegatee","buildSetWithdrawVestingRouteOp","fromAccount","toAccount","percent","autoVest","buildConvertOp","buildCollateralizedConvertOp","buildEngineOp","contractAction","contractPayload","contractName","buildEngineClaimOp","buildDelegateRcOp","delegatees","maxRc","delegateeArray","buildFollowOp","buildUnfollowOp","buildIgnoreOp","buildUnignoreOp","buildSetLastReadOps","date","lastReadDate","notifyOp","ecencyNotifyOp","buildWitnessVoteOp","approve","buildWitnessProxyOp","proxy","buildProposalCreateOp","creator","buildProposalVoteOp","proposalIds","buildRemoveProposalOp","proposalOwner","buildUpdateProposalOp","dailyPay","subject","buildSubscribeOp","buildUnsubscribeOp","buildSetRoleOp","buildUpdateCommunityOp","buildPinPostOp","pin","buildMutePostOp","notes","mute","buildMuteUserOp","buildFlagPostOp","BuySellTransactionType","OrderIdPrefix","buildLimitOrderCreateOp","amountToSell","minToReceive","fillOrKill","orderId","formatNumber","decimals","buildLimitOrderCreateOpWithType","orderType","idPrefix","expirationStr","formattedAmountToSell","formattedMinToReceive","buildLimitOrderCancelOp","buildClaimRewardBalanceOp","rewardHive","rewardHbd","rewardVests","buildAccountUpdateOp","active","posting","memoKey","buildAccountUpdate2Op","buildAccountCreateOp","newAccountName","fee","buildCreateClaimedAccountOp","buildClaimAccountOp","buildGrantPostingPermissionOp","currentPosting","grantedAccount","weightThreshold","existingIndex","newAccountAuths","newPosting","buildRevokePostingPermissionOp","revokedAccount","buildChangeRecoveryAccountOp","accountToRecover","newRecoveryAccount","buildRequestAccountRecoveryOp","recoveryAccount","newOwnerAuthority","buildRecoverAccountOp","recentOwnerAuthority","buildBoostPlusOp","buildRcDelegationOp","buildPromoteOp","buildPointTransferOp","sender","receiver","normalizedAmount","buildMultiPointTransferOps","destArray","buildCommunityRegistrationOp","buildActiveCustomJsonOp","buildPostingCustomJsonOp","useFollow","_result","useUnfollow","useBookmarkAdd","useBookmarkDelete","bookmarkId","useAccountFavoriteAdd","qc","useAccountFavoriteDelete","listKey","infinitePrefix","checkKey","previousList","f","previousCheck","infiniteQueries","previousInfinite","context","dedupeAndSortKeyAuths","additions","useAccountUpdateKeyAuths","accountData","keepCurrent","currentKey","keysToRevoke","keysToRevokeByAuthority","prepareAuth","keyName","allKeysToRevoke","existingKeys","values","useAccountUpdatePassword","updateKeys","newPassword","currentPassword","useAccountRevokePosting","accountName","ctx","useAccountUpdateRecovery","email","canRevokeFromAuthority","revokingKeyStrs","remainingWeight","sum","accountWeight","buildRevokeKeysOp","revokingKeys","hasAnyKeyInAuth","clone","needsOwnerUpdate","useAccountRevokeKey","revokingKey","useClaimAccount","useGrantPostingPermission","useCreateAccount","HIVE_VOTING_MANA_REGENERATION_SECONDS","HIVE_100_PERCENT","HIVE_VOTE_DUST_THRESHOLD","getEffectiveVests","vesting","vestsToRshares","votingPowerValue","votePerc","hasStableVoteHardfork","dynamicProps","major","minor","stableVoteRshares","reserveRate","effectiveVests","usedMana","mana","votingRshares","totalVests","votingPower","powerRechargeTime","power","downVotingPower","totalShares","elapsed","currentManaPerc","rcPower","votingValue","rShares","OPERATION_AUTHORITY_MAP","getCustomJsonAuthority","customJsonOp","opType","customJson","getProposalAuthority","proposalOp","getOperationAuthority","getRequiredAuthority","highestAuthority","useSignOperationByKey","keyOrSeed","useSignOperationByKeychain","keyType","useSignOperationByHivesigner","callbackUri","getChainPropertiesQueryOptions","applyFragmentUpdate","vars","buildAddedFragment","useAddFragment","newFragment","index","useEditFragment","fragmentId","applyUpdate","fragment","useRemoveFragment","parseJsonResponse","errorData","signUp","referral","captchaToken","subscribeEmail","usrActivity","ty","bl","getNotifications","saveNotificationSetting","system","allows_notify","notify_types","getNotificationSetting","markNotifications","addImage","UPLOAD_HOST","uploadImage","file","fetchApi","formData","uploadImageWithSignature","deleteImage","imageId","addDraft","updateDraft","draftId","deleteDraft","addSchedule","schedule","reblog","deleteSchedule","moveSchedule","getPromotedPost","onboardEmail","friend","dataBody","useAddDraft","useUpdateDraft","useDeleteDraft","_variables","useAddSchedule","useDeleteSchedule","useMoveSchedule","useAddImage","nextCode","effectiveCode","useDeleteImage","prev","img","useUploadImage","getEntryFromCache","setEntryInCache","mutateEntry","updater","updated","EntriesCacheManagement","updateVotes","payout","updateReblogsCount","count","updateRepliesCount","addReply","reply","updateEntries","invalidateEntry","getEntry","isVoteAlreadyReflected","activeVotes","hasVoterRecord","applyVoteCacheUpdate","newVotes","newPayout","useVote","doInvalidate","useReblog","newCount","invalidate","useComment","beneficiaries","sortedBeneficiaries","isPost","activityType","queriesToInvalidate","discussionsAuthor","discussionsPermlink","addOptimisticDiscussionEntry","rootAuthor","rootPermlink","queries","removeOptimisticDiscussionEntry","snapshots","restoreDiscussionSnapshots","updateEntryInCache","updates","previous","restoreEntryInCache","useDeleteComment","_error","useCrossPost","useUpdateReply","usePromote","DEFAULT_VALIDATE_POST_DELAYS","getContent","validatePostCreating","attempts","delays","waitMs","mutations_exports","useRecordActivity","getLocationInfo","locationInfo","domain","getDiscoverLeaderboardQueryOptions","getDiscoverCurationQueryOptions","accountsResponse","element","curator","receivedVestingShares","delegatedVestingShares","vestingWithdrawRate","effectiveVest","getPageStatsQueryOptions","sortedDimensions","sortedMetrics","THREESPEAK_BENEFICIARY_ACCOUNT","THREESPEAK_BENEFICIARY_WEIGHT","hasThreeSpeakEmbed","enforceThreeSpeakBeneficiary","isThreeSpeakBeneficiary","queries_exports","getAccountTokenQueryOptions","getAccountVideosQueryOptions","getDecodeMemoQueryOptions","HiveSignerIntegration","memoQueryOptions","memoDecoded","tokenQueryOptions","ThreeSpeakIntegration","getHivePoshLinksQueryOptions","getStatsQueryOptions","filterBy","getRcStatsQueryOptions","getAccountRcQueryOptions","EMPTY","estimateRcPrecheck","rcStats","avgCost","safeBuffer","estimatedCost","willLikelyFail","getGameStatusCheckQueryOptions","useGameClaim","recordActivity","getQuestsQueryOptions","QUEST_CATALOG","getQuestCatalogEntry","tier","STREAK_FREEZE_PRICE","STREAK_FREEZE_MAX_OWNED","genIdempotencyKey","buyStreakFreezeRequest","useBuyStreakFreeze","useSubscribeCommunity","useUnsubscribeCommunity","useMutePost","useSetCommunityRole","team","idx","useUpdateCommunity","useRegisterCommunityRewards","usePinPost","getCommunitiesQueryOptions","getCommunityContextQueryOptions","getCommunityQueryOptions","SUBSCRIBERS_PAGE_SIZE","fetchSubscribersPage","getCommunitySubscribersQueryOptions","getCommunitySubscribersInfiniteQueryOptions","getAccountNotificationsInfiniteQueryOptions","getRewardedCommunitiesQueryOptions","ROLES","roleMap","getCommunityType","type_id","getCommunityPermissions","communityType","userRole","subscribed","canPost","canComment","isModerator","getNotificationsUnreadCountQueryOptions","getNotificationsInfiniteQueryOptions","NotificationFilter","NotifyTypes","ALL_NOTIFY_TYPES","NotificationViewType","getNotificationsSettingsQueryOptions","initialMuted","getAnnouncementsQueryOptions","getSpotlightsQueryOptions","_accessToken","markNotificationRead","isInfiniteData","useMarkNotificationsRead","previousData","updatedData","unreadKey","currentUnread","unreadCount","useSetLastRead","getProposalQueryOptions","proposal","getProposalsQueryOptions","proposals","expired","getProposalVotesInfiniteQueryOptions","getUserProposalVotesQueryOptions","vote","useProposalVote","useProposalCreate","getVestingDelegationsQueryOptions","fetchLimit","getAccountDelegationsQueryOptions","getVestingDelegationExpirationsQueryOptions","getConversionRequestsQueryOptions","getCollateralizedConversionRequestsQueryOptions","getSavingsWithdrawFromQueryOptions","getWithdrawRoutesQueryOptions","getOpenOrdersQueryOptions","getOutgoingRcDelegationsInfiniteQueryOptions","delegations","delegation","getIncomingRcQueryOptions","getReceivedVestingSharesQueryOptions","getRecurrentTransfersQueryOptions","normalizeString","trimmed","normalizeNumber","direct","parseToken","rawToken","extractTokens","record","resolveUsername","getPortfolioQueryOptions","getHiveAssetGeneralInfoQueryOptions","marketTicker","marketPrice","liquidBalance","savingsBalance","getHbdAssetGeneralInfoQueryOptions","price","getAPR","currentInflationRate","totalVestingFunds","getHivePowerAssetGeneralInfoQueryOptions","delegatedVests","receivedVests","withdrawRateVests","remainingToWithdrawVests","nextWithdrawalVests","hpBalance","outgoingDelegationsHp","incomingDelegationsHp","pendingPowerDownHp","nextPowerDownHp","totalBalance","availableHp","HIVE_ACCOUNT_OPERATION_GROUPS","HIVE_OPERATION_LIST","operationOrders","HIVE_OPERATION_ORDERS","HIVE_OPERATION_NAME_BY_ID","isHiveOperationName","resolveHiveOperationFilters","rawValues","hasAll","uniqueValues","operationIds","filterArgs","getHiveAssetTransactionsQueryOptions","__","pages","pageParams","getHbdAssetTransactionsQueryOptions","getHivePowerAssetTransactionsQueryOptions","userSelectedOperations","hasAllFilter","formatDate","pad","subtractSeconds","getHiveAssetMetricQueryOptions","hive","non_hive","open","_","prevStartDate","getHiveAssetWithdrawalRoutesQueryOptions","getHivePowerDelegatesInfiniteQueryOptions","getHivePowerDelegatingsQueryOptions","getOrderBookQueryOptions","getMarketStatisticsQueryOptions","getMarketHistoryQueryOptions","getHiveHbdStatsQueryOptions","oneDayAgo","dayChange","getMarketDataQueryOptions","getTradeHistoryQueryOptions","getFeedHistoryQueryOptions","getCurrentMedianHistoryPriceQueryOptions","useLimitOrderCreate","useLimitOrderCancel","getMarketData","getCurrencyRate","cur","getCurrencyTokenRate","getCurrencyRates","getHivePrice","ENGINE_RPC_HEADERS","engineRpc","engineRpcSafe","getHiveEngineOrderBook","baseParams","buy","sell","sortByPriceDesc","left","sortByPriceAsc","right","getHiveEngineTradeHistory","getHiveEngineOpenOrders","buyRaw","sellRaw","formatTotal","quantity","getHiveEngineMetrics","symbolQuery","getHiveEngineTokensMarket","getHiveEngineTokensBalances","getHiveEngineTokensMetadata","getHiveEngineTokenTransactions","getHiveEngineTokenMetrics","interval","getHiveEngineUnclaimedRewards","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMarketQueryOptions","getHiveEngineTokensMetadataQueryOptions","getHiveEngineTokenTransactionsQueryOptions","_allPages","lastPageParam","_firstPage","firstPageParam","getHiveEngineTokensMetricsQueryOptions","getHiveEngineUnclaimedRewardsQueryOptions","pending_token","getAllHiveEngineTokensQueryOptions","formattedNumber","fractionDigits","out","av","HiveEngineToken","getHiveEngineBalancesWithUsdQueryOptions","allTokens","balances","t","pricePerHive","providedMetrics","unpricedSymbols","balance","metric","tokenMetadata","lastPrice","balanceAmount","usdValue","getHiveEngineTokenGeneralInfoQueryOptions","hiveQuery","hiveData","metadataList","balanceList","marketList","stakedBalance","unstakingBalance","getPointsQueryOptions","pointsResponse","points","transactionsResponse","transactions","getPointsAssetGeneralInfoQueryOptions","getPointsAssetTransactionsQueryOptions","created","getAccountWalletAssetInfoQueryOptions","fetchQuery","qo","convertPriceToUserCurrency","assetInfo","conversionRate","portfolioQuery","getPortfolioAssetInfo","assetItem","extraItem","dataKey","numValue","portfolioAssetInfo","converted","AssetOperation","useTransfer","useTransferPoint","useDelegateVestingShares","useSetWithdrawVestingRoute","useTransferEngineToken","useTransferToSavings","useTransferFromSavings","useTransferToVesting","useWithdrawVesting","useConvert","useClaimInterest","CLAIM_REWARDS_INVALIDATION_DELAY_MS","pendingInvalidationTimers","useClaimRewards","timerKey","keysToInvalidate","existingTimer","rejected","useDelegateEngineToken","useUndelegateEngineToken","useStakeEngineToken","useUnstakeEngineToken","useClaimEngineRewards","useEngineMarketOrder","buildHiveOperations","buildEngineOperations","getWalletOperationAuthority","useWalletOperation","hiveOps","engineOps","useDelegateRc","useWitnessVote","useWitnessProxy","mapRestWitness","w","getWitnessesInfiniteQueryOptions","getWitnessVotersPageQueryOptions","getWitnessVoterCountQueryOptions","PointTransactionType","claimPointsRequest","contentType","detail","useClaimPoints","author_re","type_re","category_re","tag_re","SearchType","MAX_SEARCH_TAGS","MAX_SEARCH_QUERY_LENGTH","firstToken","normalizeSearchAuthor","normalizeSearchCategory","normalizeSearchTags","seen","buildSearchQuery","search","category","normalizedSearch","normalizedCategory","normalizedTags","part","SearchQuery","_query","re","matches","raw","isSearchResponse","MAX_RETRIES","isServer","searchRetryPolicy","failureCount","isTransient","searchQueryOptions","scroll_id","getControversialRisingInfiniteQueryOptions","sinceDate","similar","searchPath","SIMILAR_ENTRIES_SINCE_MS","SIMILAR_ENTRIES_TARGET","SIMILAR_ENTRIES_BODY_LIMIT","SIMILAR_ENTRIES_SSR_TIMEOUT_MS","SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS","SIMILAR_ENTRIES_MIN_RENDER","toMltExcerpt","fingerprint","getSimilarEntriesQueryOptions","rawTags","contentKey","collected","seenAuthors","getSearchAccountQueryOptions","getSearchTopicsQueryOptions","getSearchApiInfiniteQueryOptions","getSearchPathQueryOptions","getSupportSettingsRequest","getSupportSettingsQueryOptions","updateSupportSettingsRequest","applySupportSettingsUpdate","useUpdateSupportSettings","getBoostPlusPricesQueryOptions","getRcDelegationPricesQueryOptions","getRcDelegationActiveQueryOptions","responseData","getPromotePriceQueryOptions","getBoostPlusAccountPricesQueryOptions","useBoostPlus","useRcDelegation","hsTokenRenew","BAD_ACTORS_URL","getBadActorsQueryOptions","POLLS_PROTOCOL_VERSION","PollPreferredInterpretation","mapMetaChoicesToPollChoices","metaChoices","choice","normalizePoll","pollChoices","pollVoters","rawStats","choices","voters","getPollQueryOptions","usePollVote","pollTrxId"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @license bytebuffer.ts (c) 2015 Daniel Wirtz \n * Backing buffer: ArrayBuffer, Accessor: DataView\n * Released under the Apache License, Version 2.0\n * see: https://github.com/dcodeIO/bytebuffer.ts for details\n * modified by @xmcl/bytebuffer\n * And customized for hive-tx\n */\n\nconst EMPTY_BUFFER = new ArrayBuffer(0)\n\n// Lazy-init to avoid crashing on runtimes that lack TextEncoder/TextDecoder\n// (notably React Native with Hermes). Falls back to manual UTF-8 encode/decode.\nlet _encoder: { encode(s: string): Uint8Array } | null = null\nlet _decoder: { decode(b: BufferSource): string } | null = null\n\nfunction getEncoder(): { encode(s: string): Uint8Array } {\n if (!_encoder) {\n if (typeof TextEncoder !== 'undefined') {\n _encoder = new TextEncoder()\n } else {\n _encoder = {\n encode(s: string): Uint8Array {\n // Manual UTF-8 encode fallback\n const utf8: number[] = []\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i)\n if (c < 0x80) {\n utf8.push(c)\n } else if (c < 0x800) {\n utf8.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {\n const next = s.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n utf8.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n utf8.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n return new Uint8Array(utf8)\n },\n }\n }\n }\n return _encoder\n}\n\nfunction getDecoder(): { decode(b: BufferSource): string } {\n if (!_decoder) {\n if (typeof TextDecoder !== 'undefined') {\n _decoder = new TextDecoder()\n } else {\n _decoder = {\n decode(b: BufferSource): string {\n const bytes = b instanceof ArrayBuffer ? new Uint8Array(b) : new Uint8Array((b as ArrayBufferView).buffer, (b as ArrayBufferView).byteOffset, (b as ArrayBufferView).byteLength)\n let result = ''\n for (let i = 0; i < bytes.length; ) {\n const byte = bytes[i]\n let codePoint: number\n if (byte < 0x80) { codePoint = byte; i += 1 }\n else if ((byte & 0xe0) === 0xc0) { codePoint = ((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f); i += 2 }\n else if ((byte & 0xf0) === 0xe0) { codePoint = ((byte & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f); i += 3 }\n else { codePoint = ((byte & 0x07) << 18) | ((bytes[i + 1] & 0x3f) << 12) | ((bytes[i + 2] & 0x3f) << 6) | (bytes[i + 3] & 0x3f); i += 4 }\n if (codePoint <= 0xffff) { result += String.fromCharCode(codePoint) }\n else { codePoint -= 0x10000; result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff)) }\n }\n return result\n },\n }\n }\n }\n return _decoder\n}\n\nexport class ByteBuffer {\n static LITTLE_ENDIAN = true\n static BIG_ENDIAN = false\n static DEFAULT_CAPACITY = 16\n static DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN\n\n buffer: ArrayBufferLike\n view: DataView\n offset: number\n markedOffset: number\n limit: number\n littleEndian: boolean\n\n constructor(\n capacity: number = ByteBuffer.DEFAULT_CAPACITY,\n littleEndian: boolean = ByteBuffer.DEFAULT_ENDIAN\n ) {\n this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity)\n this.view = capacity === 0 ? new DataView(EMPTY_BUFFER) : new DataView(this.buffer)\n this.offset = 0\n this.markedOffset = -1\n this.limit = capacity\n this.littleEndian = littleEndian\n }\n\n static allocate(capacity?: number, littleEndian?: boolean): ByteBuffer {\n return new ByteBuffer(capacity, littleEndian)\n }\n\n static concat(\n buffers: Array,\n littleEndian?: boolean\n ): ByteBuffer {\n let capacity = 0\n for (let i = 0; i < buffers.length; ++i) {\n const buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n capacity += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n capacity += buf.length\n } else if (buf instanceof ArrayBuffer) {\n capacity += buf.byteLength\n } else if (Array.isArray(buf)) {\n capacity += buf.length\n } else {\n throw TypeError('Illegal buffer')\n }\n }\n\n if (capacity === 0) {\n return new ByteBuffer(0, littleEndian)\n }\n\n const bb = new ByteBuffer(capacity, littleEndian)\n const view = new Uint8Array(bb.buffer)\n let offset = 0\n\n for (let i = 0; i < buffers.length; ++i) {\n let buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n view.set(new Uint8Array(buf.buffer, buf.offset, buf.limit - buf.offset), offset)\n offset += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n view.set(buf, offset)\n offset += buf.length\n } else if (buf instanceof ArrayBuffer) {\n view.set(new Uint8Array(buf), offset)\n offset += buf.byteLength\n } else {\n // Array\n view.set(buf as number[], offset)\n offset += (buf as number[]).length\n }\n }\n\n bb.limit = bb.offset = offset\n bb.offset = 0\n return bb\n }\n\n static wrap(\n buffer: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n littleEndian?: boolean\n ): ByteBuffer {\n if (buffer instanceof ByteBuffer) {\n const bb = buffer.clone()\n bb.markedOffset = -1\n return bb\n }\n\n let bb: ByteBuffer\n if (buffer instanceof Uint8Array) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.length > 0) {\n bb.buffer = buffer.buffer\n bb.offset = buffer.byteOffset\n bb.limit = buffer.byteOffset + buffer.byteLength\n bb.view = new DataView(buffer.buffer)\n }\n } else if (buffer instanceof ArrayBuffer) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.byteLength > 0) {\n bb.buffer = buffer\n bb.offset = 0\n bb.limit = buffer.byteLength\n bb.view = buffer.byteLength > 0 ? new DataView(buffer) : new DataView(EMPTY_BUFFER)\n }\n } else if (Array.isArray(buffer)) {\n bb = new ByteBuffer(buffer.length, littleEndian)\n bb.limit = buffer.length\n new Uint8Array(bb.buffer).set(buffer)\n } else {\n throw TypeError('Illegal buffer')\n }\n\n return bb\n }\n\n writeBytes(\n source: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n offset?: number\n ): ByteBuffer {\n return this.append(source, offset)\n }\n\n writeInt8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setInt8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeByte(value: number, offset?: number): ByteBuffer {\n return this.writeInt8(value, offset)\n }\n\n writeUint8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setUint8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeUInt8(value: number, offset?: number): ByteBuffer {\n return this.writeUint8(value, offset)\n }\n\n readUint8(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint8(offset)\n if (relative) this.offset += 1\n return value\n }\n\n readUInt8(offset?: number): number {\n return this.readUint8(offset)\n }\n\n writeInt16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setInt16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeShort(value: number, offset?: number): ByteBuffer {\n return this.writeInt16(value, offset)\n }\n\n writeUint16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setUint16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeUInt16(value: number, offset?: number): ByteBuffer {\n return this.writeUint16(value, offset)\n }\n\n writeInt32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setInt32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeInt(value: number, offset?: number): ByteBuffer {\n return this.writeInt32(value, offset)\n }\n\n writeUint32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setUint32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeUInt32(value: number, offset?: number): ByteBuffer {\n return this.writeUint32(value, offset)\n }\n\n readUint32(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint32(offset, this.littleEndian)\n if (relative) {\n this.offset += 4\n }\n return value\n }\n\n readUInt32 = this.readUint32\n\n append(source: ByteBuffer | ArrayBuffer | Uint8Array | number[], offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n let src: Uint8Array\n if (source instanceof ByteBuffer) {\n src = new Uint8Array(source.buffer, source.offset, source.limit - source.offset)\n source.offset += src.length\n } else if (source instanceof Uint8Array) {\n src = source\n } else if (source instanceof ArrayBuffer) {\n src = new Uint8Array(source)\n } else {\n src = new Uint8Array(source)\n }\n\n if (src.length <= 0) return this\n\n if (offset + src.length > this.buffer.byteLength) {\n this.resize(offset + src.length)\n }\n\n new Uint8Array(this.buffer).set(src, offset)\n\n if (relative) this.offset += src.length\n return this\n }\n\n clone(copy?: boolean): ByteBuffer {\n const bb = new ByteBuffer(0, this.littleEndian)\n if (copy) {\n bb.buffer = new ArrayBuffer(this.buffer.byteLength)\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer))\n bb.view = new DataView(bb.buffer)\n } else {\n bb.buffer = this.buffer\n bb.view = this.view\n }\n bb.offset = this.offset\n bb.markedOffset = this.markedOffset\n bb.limit = this.limit\n return bb\n }\n\n copy(begin?: number, end?: number): ByteBuffer {\n if (begin === undefined) begin = this.offset\n if (end === undefined) end = this.limit\n\n if (begin === end) {\n return new ByteBuffer(0, this.littleEndian)\n }\n\n const capacity = end - begin\n const bb = new ByteBuffer(capacity, this.littleEndian)\n bb.offset = 0\n bb.limit = capacity\n\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer).subarray(begin, end), 0)\n return bb\n }\n\n copyTo(\n target: ByteBuffer,\n targetOffset?: number,\n sourceOffset?: number,\n sourceLimit?: number\n ): ByteBuffer {\n const targetRelative = typeof targetOffset === 'undefined'\n const relative = typeof sourceOffset === 'undefined'\n targetOffset = targetRelative ? target.offset : targetOffset!\n sourceOffset = relative ? this.offset : sourceOffset!\n sourceLimit = sourceLimit === undefined ? this.limit : sourceLimit\n\n const len = sourceLimit - sourceOffset\n if (len === 0) return target\n\n target.ensureCapacity(targetOffset + len)\n new Uint8Array(target.buffer).set(\n new Uint8Array(this.buffer).subarray(sourceOffset, sourceLimit),\n targetOffset\n )\n\n if (relative) this.offset += len\n if (targetRelative) target.offset += len\n return this\n }\n\n ensureCapacity(capacity: number): ByteBuffer {\n let current = this.buffer.byteLength\n if (current < capacity) {\n return this.resize((current *= 2) > capacity ? current : capacity)\n }\n return this\n }\n\n flip(): ByteBuffer {\n this.limit = this.offset\n this.offset = 0\n return this\n }\n\n resize(capacity: number): ByteBuffer {\n if (this.buffer.byteLength < capacity) {\n const buffer = new ArrayBuffer(capacity)\n new Uint8Array(buffer).set(new Uint8Array(this.buffer))\n this.buffer = buffer\n this.view = new DataView(buffer)\n }\n return this\n }\n\n skip(length: number): ByteBuffer {\n this.offset += length\n return this\n }\n\n writeInt64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigInt64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeLong(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeInt64(value, offset)\n }\n\n readInt64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigInt64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readLong(offset?: number): bigint {\n return this.readInt64(offset)\n }\n\n writeUint64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigUint64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeUInt64(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeUint64(value, offset)\n }\n\n readUint64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigUint64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readUInt64(offset?: number): bigint {\n return this.readUint64(offset)\n }\n\n toBuffer(forceCopy?: boolean): ArrayBufferLike {\n const offset = this.offset\n const limit = this.limit\n if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) {\n return this.buffer\n }\n if (offset === limit) return EMPTY_BUFFER\n return this.buffer.slice(offset, limit)\n }\n\n toArrayBuffer(forceCopy?: boolean): ArrayBufferLike {\n return this.toBuffer(forceCopy)\n }\n\n writeVarint32(value: number, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const size = this.calculateVarint32(value)\n if (offset + size > this.buffer.byteLength) {\n this.resize(offset + size)\n }\n\n value >>>= 0\n while (value >= 0x80) {\n this.view.setUint8(offset++, (value & 0x7f) | 0x80)\n value >>>= 7\n }\n this.view.setUint8(offset++, value)\n\n if (relative) {\n this.offset = offset\n return this\n }\n return size\n }\n\n readVarint32(offset?: number): number | { value: number; length: number } {\n const relative = typeof offset === 'undefined'\n if (typeof offset === 'undefined') {\n offset = this.offset\n }\n let c = 0\n let value = 0 >>> 0\n let b: number\n do {\n b = this.view.getUint8(offset++)\n if (c < 5) {\n value |= (b & 0x7f) << (7 * c)\n }\n ++c\n } while ((b & 0x80) !== 0)\n value |= 0\n\n if (relative) {\n this.offset = offset\n return value\n }\n return { value, length: c }\n }\n\n calculateVarint32(value: number): number {\n value = value >>> 0\n if (value < 1 << 7) return 1\n else if (value < 1 << 14) return 2\n else if (value < 1 << 21) return 3\n else if (value < 1 << 28) return 4\n else return 5\n }\n\n writeVString(str: string, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n let currentOffset = relative ? this.offset : offset!\n\n const encoded = getEncoder().encode(str)\n const len = encoded.length\n const lenVarintSize = this.calculateVarint32(len)\n\n if (currentOffset + lenVarintSize + len > this.buffer.byteLength) {\n this.resize(currentOffset + lenVarintSize + len)\n }\n\n this.writeVarint32(len, currentOffset)\n currentOffset += lenVarintSize\n\n new Uint8Array(this.buffer).set(encoded, currentOffset)\n currentOffset += len\n\n if (relative) {\n this.offset = currentOffset\n return this\n }\n return currentOffset - (offset || 0)\n }\n\n readVString(offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const start = offset\n const lenResult = this.readVarint32(offset) as { value: number; length: number }\n const lenValue = lenResult.value\n const lenLength = lenResult.length\n\n offset += lenLength\n\n // TextDecoder can take Uint8Array view directly\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, lenValue))\n offset += lenValue\n\n if (relative) {\n this.offset = offset\n return str\n } else {\n return {\n string: str,\n length: offset - start\n }\n }\n }\n\n readUTF8String(length: number, offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n // const strBuffer = this.buffer.slice(offset, end)\n // Faster to view if Shared? No, Decoder takes buffer or view.\n // Making a view is cheap.\n // But DataView vs Uint8Array. TextDecoder takes BufferSource (ArrayBuffer or ArrayBufferView).\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, length))\n\n if (relative) {\n this.offset += length\n return str\n } else {\n return {\n string: str,\n length\n }\n }\n }\n}\n","import type { APIMethods } from './api-types'\n\n/**\n * Unified configuration for Hive blockchain connectivity.\n * This is the single source of truth for node endpoints, timeouts, and chain settings.\n * Mutate this object directly or use ConfigManager.setHiveNodes() for validated updates.\n */\nexport const config = {\n /**\n * Array of Hive API node endpoints for load balancing and failover.\n */\n nodes: [\n 'https://api.hive.blog',\n 'https://api.deathwing.me',\n 'https://api.openhive.network',\n 'https://techcoderx.com',\n 'https://api.syncad.com',\n 'https://rpc.mahdiyari.info',\n ],\n\n /**\n * Array of Hive API node endpoints that support REST APIs.\n * Note: Without the trailing /\n */\n restNodes: [\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://api.syncad.com',\n 'https://hiveapi.actifit.io',\n 'https://api.c0ff33a.uk'\n ],\n\n /**\n * Per-API REST node override. Some APIs are served by only a subset of\n * nodes; list just those capable hosts here so callREST never burns its\n * (small) retry budget on nodes that 404/503 the API, and a cold start\n * hits a capable node immediately. Any API not listed falls back to\n * `restNodes`. The health tracker still orders *within* this list.\n *\n * hivesense: empirically only ~2 public nodes serve /hivesense-api (the\n * other configured nodes 404/503 it; Ecency's own was decommissioned), so\n * pin them — otherwise the health tracker keeps rediscovering incapable\n * nodes each cooldown and cold starts waste attempts.\n */\n restNodesByApi: {\n hivesense: ['https://api.hive.blog', 'https://api.syncad.com']\n } as Partial>,\n\n /**\n * User-Agent sent on server-side (Node) HTTP requests to Hive nodes.\n *\n * Node's built-in fetch (undici) sends a bare `User-Agent: node` when none is\n * set, which is indistinguishable from any random Node script in node/CDN\n * analytics. A descriptive value lets operators tell their own SSR/server\n * traffic apart from anonymous scrapers. Only applied in Node — browsers\n * forbid overriding User-Agent (it is silently dropped) and React Native sets\n * its own native UA, so client and mobile traffic are untouched. Override via\n * `ConfigManager.setUserAgent()` (or `setUserAgent()` from `@ecency/sdk/hive`).\n */\n userAgent: 'ecency-sdk',\n\n /**\n * The Hive blockchain chain ID for transaction signing and verification.\n */\n chain_id: 'beeab0de00000000000000000000000000000000000000000000000000000000',\n\n /**\n * Address prefix used for public key formatting (STM for mainnet).\n */\n address_prefix: 'STM',\n\n /**\n * Timeout in milliseconds for read API calls (get_content, get_accounts, etc.).\n * Kept short so the health tracker can fail over to another node quickly.\n */\n timeout: 5_000,\n\n /**\n * Timeout in milliseconds for broadcast API calls.\n * Longer than read timeout because broadcast_transaction_synchronous waits\n * for block inclusion, which depends on the 3-second block interval and\n * network conditions.\n */\n broadcastTimeout: 15_000,\n\n /**\n * Number of retry attempts for failed API calls before throwing an error.\n * Total attempts = retry + 1. With ~7 nodes in the list, a budget of 5\n * means callRPC iterates through 6 distinct nodes before giving up, so a\n * single sick node (or two) can't surface as an unhandled error to the\n * caller while the rest of the list is healthy.\n */\n retry: 5,\n\n /**\n * Tail-latency resilience for READ calls. Motivation: on a shared public-node\n * pool a node can slow down or throttle *mid-request*; a fixed `timeout` means\n * the caller only notices after the full window, and under SSR concurrency\n * those stalled renders pile up. Two mechanisms, both scoped to reads only\n * (broadcasts never hedge and keep their fixed `broadcastTimeout`):\n *\n * - Adaptive per-attempt timeout (`adaptiveTimeout`, default ON): when a\n * node has a usable latency profile (EWMA), the per-attempt timeout becomes\n * `min(callerTimeout, max(floorMs, factor × EWMA))` — a node running far\n * above its own baseline is abandoned early and failover starts sooner.\n * Never *raises* the caller's timeout; unprofiled nodes keep it unchanged.\n *\n * - Hedged requests (`hedge`, default OFF — opt in via `setResilience`): if\n * the primary attempt is still pending after `max(hedgeDelayFloorMs,\n * hedgeDelayFactor × EWMA)`, a duplicate request is fired at the next\n * healthy untried node and the first success wins (the loser is aborted).\n * A token bucket (`hedgeBucketCapacity` burst, refilled by\n * `hedgeRefillPerSuccess` per un-hedged success) caps hedges to roughly\n * `hedgeRefillPerSuccess` of traffic, so only the slow tail hedges — and\n * under pool-wide slowness the bucket drains and hedging auto-disables\n * instead of amplifying load into public-node rate limits.\n */\n resilience: {\n adaptiveTimeout: true,\n adaptiveTimeoutFloorMs: 2_000,\n adaptiveTimeoutFactor: 4,\n hedge: false,\n hedgeDelayFloorMs: 750,\n hedgeDelayFactor: 2,\n hedgeBucketCapacity: 10,\n hedgeRefillPerSuccess: 0.1,\n /**\n * Wall-clock budget for one read call across ALL failover attempts, as a\n * multiple of the per-attempt timeout: no NEW attempt starts past\n * `totalBudgetFactor × timeout` (an in-flight attempt still finishes its\n * own window). Bounds the pathological pool-wide-slowness walk — without\n * it a read could hold its caller for (retry+1) × timeout ≈ 30s, which\n * under SSR concurrency is a memory pile-up, the exact incident this\n * feature exists for. Applies to reads only (callRPC / callREST);\n * broadcasts keep their try-each-node-once semantics.\n */\n totalBudgetFactor: 2\n }\n}\n\n/** Shape of the `config.resilience` bag (see its doc comment). */\nexport type ResilienceOptions = typeof config.resilience\n\n/**\n * Validated setter for the Hive RPC node list — replaces `config.nodes`.\n * Trims, drops non-http(s) entries, and de-dupes (order-preserving). A no-op\n * if nothing valid remains, so a bad input can't empty the list.\n *\n * Lives here, in the React-free `hive-tx` core, on purpose: it must be\n * reachable from BOTH the full `@ecency/sdk` entry (via\n * `ConfigManager.setHiveNodes`, which delegates here) and the lean\n * `@ecency/sdk/hive` server/CLI entry — without dragging react-query or the\n * DMCA/ReDoS surface of `ConfigManager` into the lean entry. Within a single\n * bundle this mutates the one `config` instance `callRPC` reads; the\n * cross-bundle single-instance guarantee is a separate (build-level) concern.\n */\n/**\n * Trim, drop non-string / non-http(s), and de-dupe (order-preserving) a node\n * list. Shared by `setNodes` and the REST-node setters below so all three\n * normalize identically.\n */\nconst sanitizeNodeList = (nodes: unknown): string[] =>\n Array.isArray(nodes)\n ? [\n ...new Set(\n nodes\n .filter((n): n is string => typeof n === 'string')\n // Trim, then strip trailing slashes so REST paths concatenate cleanly:\n // `callREST` builds `node + '/status-api'`, and a `https://host/` node would\n // otherwise yield `https://host//status-api`, which several HAF nodes 404.\n // De-dupe AFTER normalizing so `host` and `host/` collapse to one entry.\n .map((n) => n.trim().replace(/\\/+$/, ''))\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n : []\n\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = sanitizeNodeList(nodes)\n if (!validNodes.length) return\n config.nodes = validNodes\n}\n\n/**\n * Validated setter for the REST-API node list — replaces `config.restNodes`.\n * Same shape/guarantees as `setNodes` (trim, drop non-http(s), de-dupe, no-op on\n * empty). Exists because `restNodes` is otherwise baked into the SDK: an app that\n * wants to add/remove a REST host (e.g. drop an own node it is decommissioning, or\n * widen the public pool) previously had to fork + republish the SDK. With this, the\n * REST pool is app-configurable at runtime exactly like the read pool. Lives in the\n * React-free `hive-tx` core so both the full `@ecency/sdk` entry and the lean\n * `@ecency/sdk/hive` entry can reach it.\n */\nexport const setRestNodes = (nodes: string[]): void => {\n const valid = sanitizeNodeList(nodes)\n if (!valid.length) return\n config.restNodes = valid\n}\n\n/**\n * Merge validated per-API REST node overrides into `config.restNodesByApi`.\n * For each entry: a non-empty, valid list pins that API to those hosts; an empty or\n * all-invalid list REMOVES the pin so the API falls back to `restNodes`. Other APIs'\n * existing pins (e.g. the built-in `hivesense`) are preserved. Lets an app pin the\n * APIs it actually uses to known-capable hosts (so `callREST` never burns its small\n * retry budget on a node that 404/503s the API) without an SDK republish.\n */\nexport const setRestNodesByApi = (\n map: Partial>\n): void => {\n if (!map || typeof map !== 'object') return\n const next: Partial> = { ...config.restNodesByApi }\n for (const [api, list] of Object.entries(map)) {\n const valid = sanitizeNodeList(list)\n if (valid.length) {\n next[api as APIMethods] = valid\n } else {\n delete next[api as APIMethods]\n }\n }\n config.restNodesByApi = next\n}\n\n/**\n * Validated setter for the User-Agent sent on server-side (Node) requests.\n * Trims the input and ignores an empty value so a bad input can't blank out the\n * header. Like `setNodes`, it lives in the React-free `hive-tx` core so it is\n * reachable from both the full `@ecency/sdk` entry (via\n * `ConfigManager.setUserAgent`) and the lean `@ecency/sdk/hive` server/CLI entry.\n */\nexport const setUserAgent = (ua: string): void => {\n // Defensive against plain-JS / React Native callers that may pass a non-string\n // despite the `string` type (avoids throwing on `.trim()`).\n if (typeof ua !== 'string') return\n const value = ua.trim()\n // Ignore blank values, and reject control characters (CR, LF, and other\n // C0/DEL controls). An invalid header value would otherwise be stored and make\n // every subsequent fetch throw, and rejecting CR/LF closes a header-injection\n // vector for any caller that builds the UA from untrusted input.\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return\n config.userAgent = value\n}\n\n/**\n * Validated partial setter for `config.resilience` (adaptive read timeouts +\n * hedged requests — see the field's doc comment). Booleans must be booleans;\n * numeric fields must be finite and positive, with the refill rate additionally\n * capped at 1 so a typo can't turn the tail-hedge into a traffic doubler\n * (refill ≤ 1 ⇒ hedges can never exceed un-hedged successes). Invalid values\n * are ignored field-by-field, so one bad entry can't block the rest. Lives in\n * the React-free `hive-tx` core (like the other setters) so both `@ecency/sdk`\n * (via `ConfigManager.setResilience`) and the lean `@ecency/sdk/hive` entry\n * can reach it.\n */\nexport const setResilience = (opts: Partial): void => {\n if (!opts || typeof opts !== 'object') return\n const r = config.resilience\n const bool = (v: unknown): v is boolean => typeof v === 'boolean'\n const pos = (v: unknown): v is number =>\n typeof v === 'number' && Number.isFinite(v) && v > 0\n if (bool(opts.adaptiveTimeout)) r.adaptiveTimeout = opts.adaptiveTimeout\n // Floor must stay ≥ the tracker's slow-failure recording floor (2s): the\n // safety argument for adaptive timeouts is that an abort at the window IS\n // recorded as a slow sample, growing the EWMA so the window self-corrects\n // upward. A floor below 2s would abort without recording — the window could\n // never converge and a too-tight profile would starve that call forever.\n if (pos(opts.adaptiveTimeoutFloorMs)) {\n r.adaptiveTimeoutFloorMs = Math.max(opts.adaptiveTimeoutFloorMs, 2_000)\n }\n if (pos(opts.adaptiveTimeoutFactor)) r.adaptiveTimeoutFactor = opts.adaptiveTimeoutFactor\n if (bool(opts.hedge)) r.hedge = opts.hedge\n if (pos(opts.hedgeDelayFloorMs)) r.hedgeDelayFloorMs = opts.hedgeDelayFloorMs\n if (pos(opts.hedgeDelayFactor)) r.hedgeDelayFactor = opts.hedgeDelayFactor\n if (pos(opts.hedgeBucketCapacity)) r.hedgeBucketCapacity = opts.hedgeBucketCapacity\n // Refill must stay ≤ 1: at 1 token per success the hedge rate could reach\n // 100% of traffic, defeating the \"tail only\" contract. Cap rather than reject\n // so a caller asking for \"more hedging\" gets the safe maximum.\n if (pos(opts.hedgeRefillPerSuccess)) {\n r.hedgeRefillPerSuccess = Math.min(opts.hedgeRefillPerSuccess, 1)\n }\n // Below 1 the budget could not even cover the configured per-attempt window.\n if (pos(opts.totalBudgetFactor)) {\n r.totalBudgetFactor = Math.max(opts.totalBudgetFactor, 1)\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport class Signature {\n data: Uint8Array\n recovery: number\n private compressed: boolean\n\n /**\n * Creates a new Signature instance.\n * @param data Raw signature data (64 bytes)\n * @param recovery Recovery byte (0-3)\n * @param compressed Whether signature is compressed (default: true)\n */\n constructor(data: Uint8Array, recovery: number, compressed?: boolean) {\n this.data = data\n this.recovery = recovery\n this.compressed = compressed ?? true\n }\n\n /**\n * Creates a Signature from a hex string.\n * @param string 130-character hex string containing signature and recovery data\n * @returns New Signature instance\n * @throws Error if input is not a string\n */\n static from(string: string) {\n if (typeof string === 'string') {\n const temp = hexToBytes(string)\n let recovery = parseInt(bytesToHex(temp.subarray(0, 1)), 16) - 31\n let compressed = true\n // non-compressed signatures have -4\n // https://github.com/bitcoin/bitcoin/blob/95ea54ba089610019a74c1176a2c7c0dba144b1c/src/key.cpp#L257\n if (recovery < 0) {\n compressed = false\n recovery = recovery + 4\n }\n const data = temp.subarray(1)\n return new Signature(data, recovery, compressed)\n } else {\n throw new Error('Expected string for data')\n }\n }\n\n /**\n * Converts signature to 65-byte buffer format.\n * @returns 65-byte buffer containing recovery byte + signature data\n */\n toBuffer() {\n const buffer = new Uint8Array(65).fill(0)\n if (this.compressed) {\n buffer[0] = (this.recovery + 31) & 0xff\n } else {\n buffer[0] = (this.recovery + 27) & 0xff\n }\n buffer.set(this.data, 1)\n return buffer\n }\n\n /**\n * Returns signature as 130-character hex string.\n * @returns Hex string representation of signature\n */\n customToString() {\n return bytesToHex(this.toBuffer())\n }\n\n /**\n * Returns signature as 130-character hex string.\n * Overrides Object.prototype.toString() so that String(sig) and\n * template literals produce the hex representation instead of \"[object Object]\".\n * @returns Hex string representation of signature\n */\n toString() {\n return this.customToString()\n }\n\n /**\n * Recovers the public key from this signature and message.\n * @param message 32-byte message hash (Uint8Array) or 64-character hex string\n * @returns PublicKey that created this signature\n * @throws Error if message is not a valid 32-byte SHA256 hash\n */\n getPublicKey(message: Uint8Array | string): PublicKey {\n if (\n (message instanceof Uint8Array && message.length !== 32) ||\n (typeof message === 'string' && message.length !== 64)\n ) {\n throw new Error('Expected a valid sha256 hash as message')\n }\n if (typeof message === 'string') {\n message = hexToBytes(message)\n }\n const sig = secp256k1.Signature.fromBytes(this.data, 'compact')\n const temp = new secp256k1.Signature(sig.r, sig.s, this.recovery)\n return new PublicKey(temp.recoverPublicKey(message).toBytes())\n }\n}\n","import { ripemd160 } from '@noble/hashes/legacy.js'\nimport bs58 from 'bs58'\nimport { config } from '../config'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { Signature } from './Signature'\n\nexport class PublicKey {\n key: Uint8Array\n prefix: string\n\n /**\n * Creates a new PublicKey instance from raw bytes.\n * @param key Raw public key bytes (33 bytes, compressed format)\n * @param prefix Optional address prefix (defaults to the current config.address_prefix)\n */\n constructor(key: Uint8Array, prefix?: string) {\n this.key = key\n // Read config at call time so runtime mutations to config.address_prefix\n // (e.g. switching to a non-mainnet network) take effect for new instances.\n this.prefix = prefix ?? config.address_prefix\n }\n\n /**\n * Creates a PublicKey from a string representation.\n * The expected prefix is read from config.address_prefix at call time, so\n * consumers can switch networks at runtime.\n * @param wif Public key string (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n * @returns New PublicKey instance\n * @throws Error if the prefix, length, checksum, or curve point is invalid\n */\n static fromString(wif: string): PublicKey {\n const expectedPrefix = config.address_prefix\n if (typeof wif !== 'string' || wif.length <= expectedPrefix.length) {\n throw new Error('Invalid public key')\n }\n const prefix = wif.slice(0, expectedPrefix.length)\n if (prefix !== expectedPrefix) {\n throw new Error(`Public key must start with ${expectedPrefix}`)\n }\n let buffer: Uint8Array\n try {\n buffer = bs58.decode(wif.slice(expectedPrefix.length))\n } catch {\n throw new Error('Invalid public key encoding')\n }\n // 33-byte compressed secp256k1 point + 4-byte RIPEMD160 checksum\n if (buffer.length !== 37) {\n throw new Error('Invalid public key length')\n }\n const key = buffer.subarray(0, 33)\n const checksum = buffer.subarray(33, 37)\n const expectedChecksum = ripemd160(key).subarray(0, 4)\n if (!isUint8ArrayEqual(checksum, expectedChecksum)) {\n throw new Error('Public key checksum mismatch')\n }\n try {\n secp256k1.Point.fromBytes(key)\n } catch {\n throw new Error('Invalid public key')\n }\n return new PublicKey(key, prefix)\n }\n\n /**\n * Creates a PublicKey from a string or returns the instance if already a PublicKey.\n * @param value Public key string or PublicKey instance\n * @returns New or existing PublicKey instance\n */\n static from(value: string | PublicKey): PublicKey {\n if (value instanceof PublicKey) {\n return value\n } else {\n return PublicKey.fromString(value as string)\n }\n }\n\n /**\n * Verifies a signature against a message hash.\n * @param message 32-byte message hash to verify\n * @param signature Signature to verify\n * @returns True if signature is valid, false otherwise\n */\n verify(message: Uint8Array, signature: Signature | string): boolean {\n if (typeof signature === 'string') {\n signature = Signature.from(signature)\n }\n return secp256k1.verify(signature.data, message, this.key, {\n prehash: false,\n format: 'compact'\n })\n }\n\n /**\n * Returns the public key as a string for storage or transmission.\n * @returns Public key string with prefix (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n */\n toString(): string {\n return encodePublic(this.key, this.prefix)\n }\n\n /**\n * Returns JSON representation (same as toString()).\n * @returns Public key string\n */\n toJSON(): string {\n return this.toString()\n }\n\n /**\n * Returns a string representation for debugging.\n * @returns Formatted public key string\n */\n inspect(): string {\n return `PublicKey: ${this.toString()}`\n }\n}\n\nconst encodePublic = (key: Uint8Array, prefix: string): string => {\n const checksum = ripemd160(key)\n return prefix + bs58.encode(new Uint8Array([...key, ...checksum.subarray(0, 4)]))\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array): boolean => {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n","/** Class representing a hive asset,\n * e.g. `1.000 HIVE` or `12.112233 VESTS`. */\nexport class Asset {\n amount: number\n symbol: string\n\n constructor(amount: number, symbol: string) {\n this.amount = amount\n this.symbol = symbol === 'HIVE' ? 'STEEM' : symbol === 'HBD' ? 'SBD' : symbol\n }\n\n /** Create a new Asset instance from a string, e.g. `42.000 HIVE`. */\n static fromString(string: string, expectedSymbol: string | null = null): Asset {\n const [amountString, symbol] = string.split(' ')\n if (['STEEM', 'VESTS', 'SBD', 'TESTS', 'TBD', 'HIVE', 'HBD'].indexOf(symbol) === -1) {\n throw new Error(`Invalid asset symbol: ${symbol}`)\n }\n if (expectedSymbol && symbol !== expectedSymbol) {\n throw new Error(`Invalid asset, expected symbol: ${expectedSymbol} got: ${symbol}`)\n }\n const amount = Number.parseFloat(amountString)\n if (!Number.isFinite(amount)) {\n throw new Error(`Invalid asset amount: ${amountString}`)\n }\n return new Asset(amount, symbol)\n }\n\n /**\n * Convenience to create new Asset.\n * @param symbol Symbol to use when created from number. Will also be used to validate\n * the asset, throws if the passed value has a different symbol than this.\n */\n static from(value: number | string | Asset, symbol?: string | null): Asset {\n if (value instanceof Asset) {\n if (symbol && value.symbol !== symbol) {\n throw new Error(`Invalid asset, expected symbol: ${symbol} got: ${value.symbol}`)\n }\n return value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n return new Asset(value, symbol || 'STEEM')\n } else if (typeof value === 'string') {\n return Asset.fromString(value, symbol)\n } else {\n throw new Error(`Invalid asset '${String(value)}'`)\n }\n }\n\n // We convert HIVE & HBD strings to STEEM & SBD because the serialization should be based on STEEM & SBD\n\n /** Return asset precision. */\n getPrecision() {\n switch (this.symbol) {\n case 'TESTS':\n case 'TBD':\n case 'STEEM':\n case 'SBD':\n case 'HBD':\n case 'HIVE':\n return 3\n case 'VESTS':\n return 6\n default:\n return 3\n }\n }\n\n /** Return a string representation of this asset, e.g. `42.000 HIVE`. */\n toString() {\n return `${this.amount.toFixed(this.getPrecision())} ${this.symbol}`\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\n/** Buffer wrapper that serializes to a hex-encoded string. */\nexport class HexBuffer {\n buffer: Uint8Array\n /** Convenience to create a new HexBuffer, does not copy data if value passed is already a buffer. */\n static from(value: string | Uint8Array | HexBuffer) {\n if (value instanceof HexBuffer) {\n return value\n } else if (value instanceof Uint8Array) {\n return new HexBuffer(value)\n } else if (typeof value === 'string') {\n return new HexBuffer(hexToBytes(value))\n } else {\n return new HexBuffer(new Uint8Array(value))\n }\n }\n\n constructor(buffer: Uint8Array) {\n this.buffer = buffer\n }\n\n toString() {\n return bytesToHex(this.buffer)\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { Asset } from './Asset'\nimport { HexBuffer } from './HexBuffer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Operation } from '../types'\n\n// Operation ID constants for better maintainability\nconst OPERATION_IDS = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n // pow: 14,\n custom: 15,\n // report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n // pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n // custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49\n} as const\n\ntype OperationId = (typeof OPERATION_IDS)[keyof typeof OPERATION_IDS]\n\nconst VoidSerializer = () => {\n throw new Error('Void can not be serialized')\n}\nconst StringSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeVString(data)\n}\n\nconst Int16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeInt16(data)\n}\n\nconst Int64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeInt64(data)\n}\n\nconst UInt8Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint8(data)\n}\n\nconst UInt16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint16(data)\n}\n\nconst UInt32Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint32(data)\n}\n\nconst UInt64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeUint64(data)\n}\n\nconst BooleanSerializer = (buffer: ByteBuffer, data: number | boolean) => {\n buffer.writeByte(data ? 1 : 0)\n}\n\nconst StaticVariantSerializer = (itemSerializers: any) => {\n // return (buffer: ByteBuffer, data: any[]) => {\n // let id = data[0]\n // const item = data[1]\n // // id was/is supposed to be 0 or integer here but seems to have been changed in e.g. comment_options\n // // extensions: [\n // // [\n // // \"comment_payout_beneficiaries\",\n // // {\n // // \"beneficiaries\": [\n // // {\n // // \"account\": \"vimm\",\n // // \"weight\": 1000\n // // }\n // // ]\n // // }\n // // ]\n // // ]\n // // Keep it here just in case\n // // https://gitlab.syncad.com/hive/hive/-/issues/722\n // // \"comment_payout_beneficiaries\" was 0 and at some point it got changed\n // // It should still be serialized as a 0 or an integer\n // // Now the question is, always 0? will need an example transaction to prove otherwise\n // if (typeof id === 'string') {\n // if (id === 'update_proposal_end_date') {\n // id = 1\n // } else {\n // id = 0\n // }\n // }\n // buffer.writeVarint32(id)\n // itemSerializers[id](buffer, item)\n return (buffer: ByteBuffer, data: any) => {\n const [id, item] = data\n buffer.writeVarint32(id)\n itemSerializers[id](buffer, item)\n }\n}\n\n/**\n * Serialize asset.\n * @note This looses precision for amounts larger than 2^53-1/10^precision.\n * Should not be a problem in real-word usage.\n */\nconst AssetSerializer = (buffer: ByteBuffer, data: string | Asset) => {\n const asset = Asset.from(data)\n const precision = asset.getPrecision()\n buffer.writeInt64(Math.round(asset.amount * Math.pow(10, precision)))\n buffer.writeUint8(precision)\n for (let i = 0; i < 7; i++) {\n buffer.writeUint8(asset.symbol.charCodeAt(i) || 0)\n }\n}\n\nconst DateSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeUint32(Math.floor(new Date(data + 'Z').getTime() / 1000))\n}\n\nconst PublicKeySerializer = (buffer: ByteBuffer, data: string | PublicKey) => {\n if (\n data === null ||\n (typeof data === 'string' && data.slice(-39) === '1111111111111111111111111111111114T1Anm')\n ) {\n buffer.append(new Uint8Array(33).fill(0))\n } else {\n buffer.append(PublicKey.from(data).key)\n }\n}\n\nconst BinarySerializer = (size: null | number = null) => {\n return (buffer: ByteBuffer, data: string | Uint8Array | HexBuffer) => {\n data = HexBuffer.from(data)\n const len = data.buffer.length\n if (size) {\n if (len !== size) {\n throw new Error(`Unable to serialize binary. Expected ${size} bytes, got ${len}`)\n }\n } else {\n buffer.writeVarint32(len)\n }\n buffer.append(data.buffer)\n }\n}\n\nconst VariableBinarySerializer = BinarySerializer()\n\nconst FlatMapSerializer = (keySerializer: any, valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(data.length)\n for (const [key, value] of data) {\n keySerializer(buffer, key)\n valueSerializer(buffer, value)\n }\n }\n}\n\nconst ArraySerializer = (itemSerializer: any) => {\n return (buffer: ByteBuffer, data: any[]) => {\n buffer.writeVarint32(data.length)\n for (const item of data) {\n itemSerializer(buffer, item)\n }\n }\n}\n\nconst ObjectSerializer = (keySerializers: any) => {\n return (buffer: ByteBuffer, data: any) => {\n for (const [key, serializer] of keySerializers) {\n try {\n serializer(buffer, data[key])\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n }\n}\n\nconst OptionalSerializer = (valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any | undefined) => {\n if (data !== undefined) {\n buffer.writeByte(1)\n valueSerializer(buffer, data)\n } else {\n buffer.writeByte(0)\n }\n }\n}\n\nconst AuthoritySerializer = ObjectSerializer([\n ['weight_threshold', UInt32Serializer],\n ['account_auths', FlatMapSerializer(StringSerializer, UInt16Serializer)],\n ['key_auths', FlatMapSerializer(PublicKeySerializer, UInt16Serializer)]\n])\n\nconst BeneficiarySerializer = ObjectSerializer([\n ['account', StringSerializer],\n ['weight', UInt16Serializer]\n])\n\nconst PriceSerializer = ObjectSerializer([\n ['base', AssetSerializer],\n ['quote', AssetSerializer]\n])\n\n// const SignedBlockHeaderSerializer = ObjectSerializer([\n// ['previous', BinarySerializer(20)],\n// ['timestamp', DateSerializer],\n// ['witness', StringSerializer],\n// ['transaction_merkle_root', BinarySerializer(20)],\n// ['extensions', ArraySerializer(VoidSerializer)],\n// ['witness_signature', BinarySerializer(65)]\n// ])\n\nconst ChainPropertiesSerializer = ObjectSerializer([\n ['account_creation_fee', AssetSerializer],\n ['maximum_block_size', UInt32Serializer],\n ['hbd_interest_rate', UInt16Serializer]\n])\n\nconst OperationDataSerializer = (operationId: OperationId, definitions: any) => {\n const objectSerializer = ObjectSerializer(definitions)\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(operationId)\n objectSerializer(buffer, data)\n }\n}\n\nconst OperationSerializers: Record> = {}\n\nOperationSerializers.account_create = OperationDataSerializer(OPERATION_IDS.account_create, [\n ['fee', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_create_with_delegation = OperationDataSerializer(\n OPERATION_IDS.account_create_with_delegation,\n [\n ['fee', AssetSerializer],\n ['delegation', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update = OperationDataSerializer(OPERATION_IDS.account_update, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_witness_proxy = OperationDataSerializer(\n OPERATION_IDS.account_witness_proxy,\n [\n ['account', StringSerializer],\n ['proxy', StringSerializer]\n ]\n)\n\nOperationSerializers.account_witness_vote = OperationDataSerializer(\n OPERATION_IDS.account_witness_vote,\n [\n ['account', StringSerializer],\n ['witness', StringSerializer],\n ['approve', BooleanSerializer]\n ]\n)\n\nOperationSerializers.cancel_transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.cancel_transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer]\n ]\n)\n\nOperationSerializers.change_recovery_account = OperationDataSerializer(\n OPERATION_IDS.change_recovery_account,\n [\n ['account_to_recover', StringSerializer],\n ['new_recovery_account', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.claim_account = OperationDataSerializer(OPERATION_IDS.claim_account, [\n ['creator', StringSerializer],\n ['fee', AssetSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.claim_reward_balance = OperationDataSerializer(\n OPERATION_IDS.claim_reward_balance,\n [\n ['account', StringSerializer],\n ['reward_hive', AssetSerializer],\n ['reward_hbd', AssetSerializer],\n ['reward_vests', AssetSerializer]\n ]\n)\n\nOperationSerializers.comment = OperationDataSerializer(OPERATION_IDS.comment, [\n ['parent_author', StringSerializer],\n ['parent_permlink', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['title', StringSerializer],\n ['body', StringSerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.comment_options = OperationDataSerializer(OPERATION_IDS.comment_options, [\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['max_accepted_payout', AssetSerializer],\n ['percent_hbd', UInt16Serializer],\n ['allow_votes', BooleanSerializer],\n ['allow_curation_rewards', BooleanSerializer],\n [\n 'extensions',\n ArraySerializer(\n StaticVariantSerializer([\n ObjectSerializer([['beneficiaries', ArraySerializer(BeneficiarySerializer)]])\n ])\n )\n ]\n])\n\nOperationSerializers.convert = OperationDataSerializer(OPERATION_IDS.convert, [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n])\n\nOperationSerializers.create_claimed_account = OperationDataSerializer(\n OPERATION_IDS.create_claimed_account,\n [\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.custom = OperationDataSerializer(OPERATION_IDS.custom, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['id', UInt16Serializer],\n ['data', VariableBinarySerializer]\n])\n\n// Not used on chain\n// OperationSerializers.custom_binary = OperationDataSerializer(OPERATION_IDS.custom_binary, [\n// ['required_owner_auths', ArraySerializer(StringSerializer)],\n// ['required_active_auths', ArraySerializer(StringSerializer)],\n// ['required_posting_auths', ArraySerializer(StringSerializer)],\n// ['required_auths', ArraySerializer(AuthoritySerializer)],\n// ['id', StringSerializer],\n// ['data', VariableBinarySerializer]\n// ])\n\nOperationSerializers.custom_json = OperationDataSerializer(OPERATION_IDS.custom_json, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['required_posting_auths', ArraySerializer(StringSerializer)],\n ['id', StringSerializer],\n ['json', StringSerializer]\n])\n\nOperationSerializers.decline_voting_rights = OperationDataSerializer(\n OPERATION_IDS.decline_voting_rights,\n [\n ['account', StringSerializer],\n ['decline', BooleanSerializer]\n ]\n)\n\nOperationSerializers.delegate_vesting_shares = OperationDataSerializer(\n OPERATION_IDS.delegate_vesting_shares,\n [\n ['delegator', StringSerializer],\n ['delegatee', StringSerializer],\n ['vesting_shares', AssetSerializer]\n ]\n)\n\nOperationSerializers.delete_comment = OperationDataSerializer(OPERATION_IDS.delete_comment, [\n ['author', StringSerializer],\n ['permlink', StringSerializer]\n])\n\nOperationSerializers.escrow_approve = OperationDataSerializer(OPERATION_IDS.escrow_approve, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['approve', BooleanSerializer]\n])\n\nOperationSerializers.escrow_dispute = OperationDataSerializer(OPERATION_IDS.escrow_dispute, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer]\n])\n\nOperationSerializers.escrow_release = OperationDataSerializer(OPERATION_IDS.escrow_release, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['receiver', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer]\n])\n\nOperationSerializers.escrow_transfer = OperationDataSerializer(OPERATION_IDS.escrow_transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer],\n ['escrow_id', UInt32Serializer],\n ['agent', StringSerializer],\n ['fee', AssetSerializer],\n ['json_meta', StringSerializer],\n ['ratification_deadline', DateSerializer],\n ['escrow_expiration', DateSerializer]\n])\n\nOperationSerializers.feed_publish = OperationDataSerializer(OPERATION_IDS.feed_publish, [\n ['publisher', StringSerializer],\n ['exchange_rate', PriceSerializer]\n])\n\nOperationSerializers.limit_order_cancel = OperationDataSerializer(\n OPERATION_IDS.limit_order_cancel,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer]\n ]\n)\n\nOperationSerializers.limit_order_create = OperationDataSerializer(\n OPERATION_IDS.limit_order_create,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['min_to_receive', AssetSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.limit_order_create2 = OperationDataSerializer(\n OPERATION_IDS.limit_order_create2,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['exchange_rate', PriceSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.recover_account = OperationDataSerializer(OPERATION_IDS.recover_account, [\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['recent_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\n// Not used on chain\n// OperationSerializers.report_over_production = OperationDataSerializer(\n// OPERATION_IDS.report_over_production,\n// [\n// ['reporter', StringSerializer],\n// ['first_block', SignedBlockHeaderSerializer],\n// ['second_block', SignedBlockHeaderSerializer]\n// ]\n// )\n\nOperationSerializers.request_account_recovery = OperationDataSerializer(\n OPERATION_IDS.request_account_recovery,\n [\n ['recovery_account', StringSerializer],\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.reset_account = OperationDataSerializer(OPERATION_IDS.reset_account, [\n ['reset_account', StringSerializer],\n ['account_to_reset', StringSerializer],\n ['new_owner_authority', AuthoritySerializer]\n])\n\nOperationSerializers.set_reset_account = OperationDataSerializer(OPERATION_IDS.set_reset_account, [\n ['account', StringSerializer],\n ['current_reset_account', StringSerializer],\n ['reset_account', StringSerializer]\n])\n\nOperationSerializers.set_withdraw_vesting_route = OperationDataSerializer(\n OPERATION_IDS.set_withdraw_vesting_route,\n [\n ['from_account', StringSerializer],\n ['to_account', StringSerializer],\n ['percent', UInt16Serializer],\n ['auto_vest', BooleanSerializer]\n ]\n)\n\nOperationSerializers.transfer = OperationDataSerializer(OPERATION_IDS.transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n])\n\nOperationSerializers.transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_to_savings,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_vesting = OperationDataSerializer(\n OPERATION_IDS.transfer_to_vesting,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.vote = OperationDataSerializer(OPERATION_IDS.vote, [\n ['voter', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['weight', Int16Serializer]\n])\n\nOperationSerializers.withdraw_vesting = OperationDataSerializer(OPERATION_IDS.withdraw_vesting, [\n ['account', StringSerializer],\n ['vesting_shares', AssetSerializer]\n])\n\nOperationSerializers.witness_update = OperationDataSerializer(OPERATION_IDS.witness_update, [\n ['owner', StringSerializer],\n ['url', StringSerializer],\n ['block_signing_key', PublicKeySerializer],\n ['props', ChainPropertiesSerializer],\n ['fee', AssetSerializer]\n])\n\nOperationSerializers.witness_set_properties = OperationDataSerializer(\n OPERATION_IDS.witness_set_properties,\n [\n ['owner', StringSerializer],\n ['props', FlatMapSerializer(StringSerializer, VariableBinarySerializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update2 = OperationDataSerializer(OPERATION_IDS.account_update2, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', OptionalSerializer(PublicKeySerializer)],\n ['json_metadata', StringSerializer],\n ['posting_json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.create_proposal = OperationDataSerializer(OPERATION_IDS.create_proposal, [\n ['creator', StringSerializer],\n ['receiver', StringSerializer],\n ['start_date', DateSerializer],\n ['end_date', DateSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.update_proposal_votes = OperationDataSerializer(\n OPERATION_IDS.update_proposal_votes,\n [\n ['voter', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['approve', BooleanSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.remove_proposal = OperationDataSerializer(OPERATION_IDS.remove_proposal, [\n ['proposal_owner', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nconst ProposalUpdateSerializer = ObjectSerializer([['end_date', DateSerializer]])\n\nOperationSerializers.update_proposal = OperationDataSerializer(OPERATION_IDS.update_proposal, [\n ['proposal_id', UInt64Serializer],\n ['creator', StringSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n [\n 'extensions',\n ArraySerializer(StaticVariantSerializer([VoidSerializer, ProposalUpdateSerializer]))\n ]\n])\n\nOperationSerializers.collateralized_convert = OperationDataSerializer(\n OPERATION_IDS.collateralized_convert,\n [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.recurrent_transfer = OperationDataSerializer(\n OPERATION_IDS.recurrent_transfer,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer],\n ['recurrence', UInt16Serializer],\n ['executions', UInt16Serializer],\n [\n 'extensions',\n ArraySerializer(\n ObjectSerializer([\n ['type', UInt8Serializer],\n ['value', ObjectSerializer([['pair_id', UInt8Serializer]])]\n ])\n )\n ]\n ]\n)\n\nconst OperationSerializer = (buffer: ByteBuffer, operation: Operation) => {\n const serializer = OperationSerializers[operation[0]]\n if (!serializer) {\n throw new Error(`No serializer for operation: ${operation[0]}`)\n }\n try {\n serializer(buffer, operation[1])\n } catch (error: any) {\n error.message = `${operation[0]}: ${error.message}`\n throw error\n }\n}\n\nconst TransactionSerializer = ObjectSerializer([\n ['ref_block_num', UInt16Serializer],\n ['ref_block_prefix', UInt32Serializer],\n ['expiration', DateSerializer],\n ['operations', ArraySerializer(OperationSerializer)],\n ['extensions', ArraySerializer(StringSerializer)]\n])\n\nconst EncryptedMemoSerializer = ObjectSerializer([\n ['from', PublicKeySerializer],\n ['to', PublicKeySerializer],\n ['nonce', UInt64Serializer],\n ['check', UInt32Serializer],\n ['encrypted', BinarySerializer()]\n])\n\nexport const Serializer = {\n // Array: ArraySerializer,\n Asset: AssetSerializer,\n // Authority: AuthoritySerializer,\n // Binary: BinarySerializer,\n // Boolean: BooleanSerializer,\n // Date: DateSerializer,\n // FlatMap: FlatMapSerializer,\n // Int16: Int16Serializer,\n // Int32: Int32Serializer,\n // Int64: Int64Serializer,\n // Int8: Int8Serializer,\n Memo: EncryptedMemoSerializer,\n // Object: ObjectSerializer,\n // Operation: OperationSerializer,\n // Optional: OptionalSerializer,\n Price: PriceSerializer,\n PublicKey: PublicKeySerializer,\n // StaticVariant: StaticVariantSerializer,\n String: StringSerializer,\n Transaction: TransactionSerializer,\n UInt16: UInt16Serializer,\n UInt32: UInt32Serializer\n // UInt64: UInt64Serializer,\n // UInt8: UInt8Serializer,\n // Void: VoidSerializer\n}\n","export const sleep = (ms: number): Promise => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { config } from '../config'\nimport { CallResponse } from '../types'\nimport type { APIMethods } from '../api-types'\nimport { sleep } from './sleep'\n\n// ── Server identity (User-Agent) ────────────────────────────────────────────\n\n/**\n * True only when running under Node.js (SSR / server / CLI). Computed once.\n *\n * We attach a descriptive `User-Agent` exclusively here because that is the only\n * place it (a) takes effect and (b) is wanted:\n * - Node's undici fetch otherwise sends a bare `User-Agent: node`, which is\n * indistinguishable from any anonymous script in node/CDN analytics.\n * - Browsers treat `User-Agent` as a forbidden header and silently drop any\n * override, so setting it there is pointless (and we avoid the churn).\n * - React Native sets its own native UA (e.g. the mobile app's own string);\n * overriding it would relabel real mobile traffic, so we explicitly exclude\n * it via `navigator.product === 'ReactNative'`.\n */\nconst isNodeRuntime: boolean = (() => {\n try {\n const isReactNative =\n typeof navigator !== 'undefined' && (navigator as any).product === 'ReactNative'\n return (\n !isReactNative &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null\n )\n } catch {\n return false\n }\n})()\n\n/**\n * Headers that identify the caller on server-side requests. Returns the\n * configured `User-Agent` only under Node; an empty object everywhere else so\n * browser and React Native requests are left exactly as they were.\n */\nfunction serverIdentityHeaders(): Record {\n return isNodeRuntime ? { 'User-Agent': config.userAgent } : {}\n}\n\n// ── Error Types ─────────────────────────────────────────────────────────────\n\nexport class RPCError extends Error {\n name = 'RPCError'\n data?: any\n code: number\n stack: undefined = undefined\n constructor(rpcError: { message: string; code: number; data?: any }) {\n super(rpcError.message)\n this.code = rpcError.code\n if ('data' in rpcError) {\n this.data = rpcError.data\n }\n }\n}\n\n/**\n * Transport-level error thrown by jsonRPCCall for HTTP status errors (429, 503).\n * Carries node identity and rate-limit info so callers can record health\n * exactly once without double-counting.\n */\nclass NodeError extends Error {\n node: string\n /** Explicit server `Retry-After` in ms, or 0 when the 429 carried no usable header. */\n rateLimitMs: number\n /** True for an HTTP 429 regardless of whether a `Retry-After` header was present, so\n * a header-less rate limit is still cooled down (with escalating backoff) rather than\n * mis-recorded as a plain transport failure. */\n isRateLimit: boolean\n constructor(\n node: string,\n message: string,\n opts: { rateLimitMs?: number; isRateLimit?: boolean } = {}\n ) {\n super(message)\n this.node = node\n this.rateLimitMs = opts.rateLimitMs ?? 0\n this.isRateLimit = opts.isRateLimit ?? false\n }\n}\n\n/**\n * Parse an HTTP `Retry-After` header to milliseconds. Supports both forms in the\n * spec: `` (e.g. \"120\") and ``. Returns 0 when the header\n * is absent or unparseable (including a non-numeric junk value or a past date) so the\n * caller falls back to escalating backoff instead of a NaN/negative cooldown.\n */\nfunction parseRetryAfterMs(header: string | null): number {\n if (!header) return 0\n const secs = Number(header)\n if (Number.isFinite(secs)) return secs > 0 ? secs * 1000 : 0\n const dateMs = Date.parse(header)\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now()\n return delta > 0 ? delta : 0\n }\n return 0\n}\n\n/** Errors that indicate the request definitely never reached the server. */\nconst PRE_CONNECTION_ERRORS = ['ECONNREFUSED', 'ENOTFOUND', 'EHOSTUNREACH', 'EAI_AGAIN']\n\n/** Browser fetch network-failure messages — emitted by Chromium/Firefox/Safari\n * when CORS preflight fails, DNS fails, TLS fails, or the response is blocked.\n * These map to scenarios where retrying the same signed broadcast is safe: the\n * request either never reached the node, or its response was blocked but a\n * re-broadcast of the *same* signed tx will be deduped by Hive (same trx_id). */\nconst BROWSER_NETWORK_ERRORS = [\n 'Failed to fetch', // Chromium\n 'NetworkError when attempting to fetch', // Firefox\n 'Load failed', // Safari\n 'fetch failed' // Node 18+ undici / Bun — also covered via cause chain\n]\n\n/**\n * Concatenate the error's surface text + the messages/codes from up to 5\n * levels of nested `cause`. Node.js fetch wraps connection failures as\n * `TypeError('fetch failed')` with the real `code` (ECONNREFUSED, etc.)\n * nested in the cause chain. Browser fetch failures have no cause but\n * carry their identifier in `message`.\n */\nfunction flattenErrorText(e: any): string {\n if (!e) return ''\n const parts: string[] = [String(e.name || ''), String(e.message || ''), String(e.code || '')]\n let cause = e.cause\n for (let depth = 0; cause && depth < 5; depth++) {\n parts.push(String(cause.code || ''), String(cause.message || ''))\n cause = cause.cause\n }\n return parts.join(' ')\n}\n\n/**\n * Decide whether a broadcast attempt can safely be retried on another node.\n *\n * Safe to retry (same signed tx → Hive dedupes by trx_id at the mempool layer):\n * - Pre-connection failures (ECONNREFUSED, ENOTFOUND, etc.) — request never sent.\n * - Browser fetch network failures (CORS block, TLS error, DNS) — TypeError with\n * a well-known message string.\n * - JSON parse failures — node returned an HTML error page (typical for\n * Cloudflare 1033 tunnel-down / 5xx interstitials), so the request never\n * reached the Hive RPC layer.\n * - NodeError (HTTP 429/5xx surfaced from jsonRPCCall) — already known transient.\n *\n * NOT safe to retry:\n * - RPCError — the node accepted the request and the blockchain rejected it.\n * Retrying on another node would either get the same rejection or accept\n * a different one; surface the original error instead.\n */\nfunction isBroadcastSafeToRetry(e: any): boolean {\n if (!e) return false\n if (e instanceof NodeError) return true\n if (e instanceof RPCError) return false\n\n const text = flattenErrorText(e)\n if (PRE_CONNECTION_ERRORS.some((code) => text.includes(code))) return true\n if (BROWSER_NETWORK_ERRORS.some((msg) => text.includes(msg))) return true\n\n // res.json() against an HTML body (Cloudflare/proxy interstitials) throws\n // SyntaxError. The Hive RPC layer never saw the tx, so failover is safe.\n if (e instanceof SyntaxError) return true\n // Some runtimes surface JSON parse errors as plain Error with this text.\n if (/Unexpected token|JSON\\.parse|Unexpected end of JSON/i.test(text)) return true\n\n return false\n}\n\n// ── Node Health Tracker ─────────────────────────────────────────────────────\n\n/** Node-level health state tracked by NodeHealthTracker. */\ninterface NodeHealth {\n /** Global consecutive-failure counter. Resets on success. */\n consecutiveFailures: number\n /** Timestamp of the most recent failure. Used with the 30s cooldown window. */\n lastFailureTime: number\n /** Epoch ms after which the node is no longer rate-limited. */\n rateLimitedUntil: number\n /** Count of consecutive 429s (no intervening success) with no usable Retry-After.\n * Drives escalating backoff; reset by a success or by RATE_LIMIT_STREAK_RESET_MS. */\n rateLimitStreak: number\n /** Epoch ms of the most recent 429. Used to expire the escalation streak. */\n lastRateLimitAt: number\n /** Per-API failure counters. Some nodes disable specific API plugins; tracking\n * per-API lets us deprioritize a node only for the APIs that fail, not globally.\n * `defective` marks a cooldown set by recordDefectiveResponse (payload\n * validation failure) — unlike ordinary strike cooldowns it survives\n * recordSuccess and only expires on its own. */\n apiFailures: Map<\n string,\n { count: number; cooldownUntil: number; lastFailureTime: number; defective?: boolean }\n >\n /** Most recent head_block_number observed for this node. */\n headBlock: number\n /** Epoch ms when the head_block was recorded. Used to expire stale observations. */\n headBlockUpdatedAt: number\n\n // ── Latency tracking (adaptive ordering) ────────────────────────────────\n /** EWMA of observed round-trip ms. Fed by successful calls AND by slow/timeout\n * failures (so a node that returns 200 in 15s, or aborts at the timeout, is\n * ranked on its real slowness — not treated as merely \"healthy\"). `undefined`\n * until the first sample. */\n ewmaLatencyMs?: number\n /** Number of latency samples folded into the EWMA. Gates \"warmup\": below\n * LATENCY_MIN_SAMPLES the node is unproven and keeps its config-order prior. */\n latencySampleCount: number\n /** Epoch ms of the most recent latency sample. Used for usability expiry and to\n * decide when a node is overdue for an exploratory re-probe. */\n latencyUpdatedAt: number\n /** Epoch ms of the most recent exploratory promotion. Single-flight guard so a\n * burst of concurrent orderings doesn't all re-probe the same stale node. */\n lastProbeAt: number\n\n /**\n * Per-profile-key latency (same EWMA/warmup/expiry rules as the global one).\n * The global EWMA mixes cheap calls (get_accounts ~300ms) with heavy ones\n * (get_account_history, bridge.get_discussion — legitimately seconds), so it\n * ranks nodes fine but is the WRONG baseline for per-attempt deadlines: a\n * profile dominated by cheap calls would abort every legitimately-heavy call.\n * Deadlines/hedge delays therefore key on the FULL method for RPC\n * (\"condenser_api.get_account_history\") and api+endpoint template for REST —\n * an API prefix alone still mixes cheap and heavy methods. Ranking keeps the\n * global profile. Bounded: #nodes × #distinct methods called (code-defined,\n * not user input); fully cleared whenever the node's global profile expires\n * (the global clock advances on every sample, so global-stale ⇒ all stale).\n */\n apiLatency: Map\n}\n\n/**\n * JSON-RPC error codes that indicate the node itself is unhealthy, not that the\n * client sent a bad request. These should trigger failover to another node.\n *\n * Background: Hive nodes fronted by HAF/jussi/drone return HTTP 200 with a\n * JSON-RPC error body when a backing service (hivemind, postgrest, etc.) is down.\n * The HTTP layer looks healthy, so failover never triggers — the caller just gets\n * an error and gives up. This function identifies those node-level errors.\n */\nfunction isNodeLevelRPCError(code: number, message: string): boolean {\n // -32603: Internal error — node is having problems\n if (code === -32603) return true\n // -32000 to -32099: Server error range (implementation-defined server errors)\n if (code <= -32000 && code >= -32099) return true\n // -32601: Method not found — node may be missing this API plugin\n if (code === -32601) return true\n // -32602 with node-sick indicators (vs normal \"invalid params\" from bad client input)\n // e.g. \"Unable to parse endpoint data\" from HAF when a backing service is down\n if (code === -32602 && /unable to parse|endpoint data|internal/i.test(message)) return true\n return false\n}\n\n/** Extract the API prefix from a method name like \"rc_api.find_rc_accounts\" -> \"rc_api\". */\nfunction apiOf(method: string): string {\n const dot = method.indexOf('.')\n return dot > 0 ? method.slice(0, dot) : method\n}\n\n// ── Rate-limit (429) backoff constants ───────────────────────────────────────\n/** Base cooldown applied to a 429 with no usable `Retry-After` header. Matches the\n * previous flat default so first-offence behaviour is unchanged. */\nconst RATE_LIMIT_BASE_MS = 10_000\n/** Ceiling for the escalating header-less cooldown. Prevents a node from being\n * parked far longer than a real public node's throttle window. */\nconst RATE_LIMIT_MAX_MS = 60_000\n/** No 429 from a node for this long ⇒ its escalation streak resets to 0, so an\n * occasional throttle hours apart doesn't compound into a long park. */\nconst RATE_LIMIT_STREAK_RESET_MS = 120_000\n\n/** Per-API failure threshold before the node is deprioritized for that API only. */\nconst MAX_API_FAILURES_BEFORE_COOLDOWN = 2\n/** How long a node stays deprioritized for a specific API after repeated failures. */\nconst API_COOLDOWN_MS = 60_000\n/** How long head_block observations remain valid before being treated as unknown. */\nconst HEAD_BLOCK_MAX_AGE_MS = 120_000\n/** Maximum lag (in blocks) before a node is considered stale relative to the best-known head. */\nconst STALE_BLOCK_THRESHOLD = 30\n\n// ── Adaptive latency-ordering constants ──────────────────────────────────────\n/** EWMA smoothing weight for a new latency sample. 0.3 ⇒ ~5–6 samples to converge;\n * absorbs one-off GC/TLS spikes while still reacting to a real regional shift fast. */\nconst LATENCY_EWMA_ALPHA = 0.3\n/** Samples required before a node's latency is trusted for ranking. Below this the\n * node is \"warming\" and ranks at a neutral prior (config order via tiebreak), so a\n * single fluke never reorders the list and cold start == today's behavior. */\nconst LATENCY_MIN_SAMPLES = 3\n/** How long a latency sample stays usable for ranking. Past this a node reverts to\n * warming. Must be > LATENCY_REPROBE_MS so re-probes keep a busy node's profile fresh. */\nconst LATENCY_MAX_AGE_MS = 5 * 60_000\n/** A healthy node not sampled within this window is overdue for an exploratory\n * re-probe (promoted to front of ONE ordering). This is what lets a demoted node\n * climb back when it recovers — and what profiles a node that organic traffic never\n * reaches. 60s ⇒ ~1 probe/node/min worst case = negligible cost. */\nconst LATENCY_REPROBE_MS = 60_000\n/** Neutral score (ms) for an unproven/warming node: optimistic enough to sit ahead\n * of a proven-slow node (so we explore an unknown before hammering a known-slow one)\n * but behind a proven-fast node. Fixed, so a node makes at most ONE rank transition\n * when it crosses LATENCY_MIN_SAMPLES — no churn. */\nconst LATENCY_UNPROVEN_PRIOR_MS = 1_000\n/** A failed call only feeds a latency penalty if it was actually slow (≥ this). Keeps\n * a genuine timeout / slow-5xx (a far-region node case) visible to the ranker while an\n * instant ECONNREFUSED (a *down* node, handled by consecutiveFailures) is NOT mis-read\n * as \"slow\". The penalty value is the *measured* elapsed, never a static constant. */\nconst LATENCY_SLOW_FAILURE_MS = 2_000\n\n/**\n * Latency-ranking tuning, re-exported as a frozen bag so tests assert behaviour\n * against the real numbers instead of mirroring literals that can silently drift.\n * @internal — not part of the package's public API; for the co-located spec only.\n */\nexport const __LATENCY_TUNING__ = Object.freeze({\n EWMA_ALPHA: LATENCY_EWMA_ALPHA,\n MIN_SAMPLES: LATENCY_MIN_SAMPLES,\n MAX_AGE_MS: LATENCY_MAX_AGE_MS,\n REPROBE_MS: LATENCY_REPROBE_MS,\n UNPROVEN_PRIOR_MS: LATENCY_UNPROVEN_PRIOR_MS,\n SLOW_FAILURE_MS: LATENCY_SLOW_FAILURE_MS\n})\n\n/** @internal Exported for testing only. */\nexport class NodeHealthTracker {\n private health = new Map()\n\n private getOrCreate(node: string): NodeHealth {\n let h = this.health.get(node)\n if (!h) {\n h = {\n consecutiveFailures: 0,\n lastFailureTime: 0,\n rateLimitedUntil: 0,\n rateLimitStreak: 0,\n lastRateLimitAt: 0,\n apiFailures: new Map(),\n headBlock: 0,\n headBlockUpdatedAt: 0,\n ewmaLatencyMs: undefined,\n latencySampleCount: 0,\n latencyUpdatedAt: 0,\n // Stamp the probe clock at creation so a brand-new (never-sampled) node is\n // NOT treated as \"overdue for re-probe\" on its very first ordering pass.\n // With lastProbeAt=0 the re-probe gate (touch <= now - LATENCY_REPROBE_MS)\n // fired immediately, so the 2nd+ ordering on a cold worker promoted unproven\n // nodes ahead of the configured order for no measured reason. Seeding it to\n // \"now\" preserves configured order during warmup; a genuinely slow preferred\n // node is still demoted by its EWMA score (not by epoch-zero exploration),\n // and idle nodes are still re-probed once LATENCY_REPROBE_MS has truly elapsed.\n lastProbeAt: Date.now(),\n apiLatency: new Map()\n }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number, profileKey?: string): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 0\n // A success means the node recovered — clear the escalation streak so the next\n // throttle starts from the base cooldown. We deliberately do NOT clear an active\n // rateLimitedUntil window here: under concurrency a success from a request that was\n // already in flight can resolve *after* another request recorded a fresh 429\n // Retry-After, and erasing the window would put a just-throttled node back into\n // rotation early. The window expires on its own (short for header-less; the server's\n // value for an explicit Retry-After).\n h.rateLimitStreak = 0\n if (api) {\n // A successful API call clears that API's failure counter — but never an\n // ACTIVE defective-response cooldown: the \"success\" may itself be an\n // unvalidated read from the same lying node (validated calls are the\n // minority of traffic), and re-admitting it early defeats the decisive\n // penalty. That window expires on its own, like rateLimitedUntil above.\n const apiFail = h.apiFailures.get(api)\n if (!apiFail || !(apiFail.defective && apiFail.cooldownUntil > Date.now())) {\n h.apiFailures.delete(api)\n }\n }\n if (typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0) {\n // Latency profiles use the finest key available (full method / endpoint\n // template); the API prefix is only a fallback so bare callers still\n // profile SOMETHING. Failure state above stays per-API on purpose.\n this.recordLatency(h, durationMs, profileKey ?? api)\n }\n }\n\n /**\n * Record a *slow* failed call as a latency signal. The failure counters are\n * updated separately (recordFailure/recordError); this only feeds the EWMA so a\n * node that returns 200-but-too-slow, times out, or returns a slow 5xx is ranked\n * on its real slowness. Callers pass the MEASURED elapsed ms and only call this\n * when the call was genuinely slow (≥ LATENCY_SLOW_FAILURE_MS) — an instant\n * connection failure (a *down* node) must NOT look \"slow\".\n */\n recordSlowFailure(node: string, durationMs: number, profileKey?: string): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs, profileKey)\n }\n\n /**\n * Usable latency profile (EWMA ms), or `undefined` while unproven or stale.\n * With a `profileKey` (full RPC method / REST api+endpoint template),\n * returns that (node, key) profile ONLY — deliberately no fallback to the\n * mixed global profile, because an average dominated by cheap calls is the\n * wrong deadline baseline for a heavy method (that fallback is exactly the\n * \"2s window starves get_account_history\" failure mode). Without a key,\n * returns the global ranking profile. Both follow the same \"profiled and\n * fresh\" gate as the ranker.\n * @internal\n */\n getUsableLatencyMs(node: string, profileKey?: string): number | undefined {\n const h = this.health.get(node)\n if (!h) return undefined\n const now = Date.now()\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n return p &&\n p.sampleCount >= LATENCY_MIN_SAMPLES &&\n now - p.updatedAt <= LATENCY_MAX_AGE_MS\n ? p.ewmaMs\n : undefined\n }\n return this.isLatencyUsable(h, now) ? h.ewmaLatencyMs : undefined\n }\n\n /**\n * Censored latency sample for a request that was ABORTED because a hedge\n * completed first while it was still in flight. The elapsed-at-abort is a\n * *lower bound* on the true latency, so folding it in can only move the\n * node's EWMA toward the truth, never below it — which is what lets repeated\n * hedge-wins reorder the pool. Deliberately does NOT touch the failure\n * counters or rate-limit state: the node returned no error, it was merely\n * slow, and treating cancellation as failure would flap `isNodeHealthy`.\n * Callers must NOT record this for a primary that already settled on its own\n * (its outcome was recorded normally; a second sample would be fabricated).\n * Bypasses the `recordSlowFailure` 2s floor (a hedge can win well below it).\n * By construction the elapsed is ≥ the hedge delay, so only a degenerate\n * near-zero epsilon needs rejecting — anything under one LAN round trip is\n * noise, not a latency measurement.\n * @internal\n */\n recordCensoredLatency(node: string, elapsedMs: number, profileKey?: string): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 50) return\n this.recordLatency(this.getOrCreate(node), elapsedMs, profileKey)\n }\n\n /**\n * Fold a latency sample into the node's global EWMA (warmup + usability\n * bookkeeping) and, when a profile key is given, into that (node, key)\n * profile — the global one ranks nodes, the keyed one calibrates deadlines.\n */\n private recordLatency(h: NodeHealth, durationMs: number, profileKey?: string): void {\n const now = Date.now()\n // A profile older than the usable window starts fresh, so an idled process\n // re-learns from scratch rather than ranking on hour-old data. Every keyed\n // profile shares this clock (each sample updates both), so global-stale\n // implies every keyed profile is stale too — clear the map rather than\n // leave never-again-read tombstone entries for the life of the process.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\n h.apiLatency.clear()\n }\n h.ewmaLatencyMs =\n h.ewmaLatencyMs === undefined\n ? durationMs\n : LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * h.ewmaLatencyMs\n h.latencySampleCount++\n h.latencyUpdatedAt = now\n\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n if (!p || now - p.updatedAt > LATENCY_MAX_AGE_MS) {\n h.apiLatency.set(profileKey, { ewmaMs: durationMs, sampleCount: 1, updatedAt: now })\n } else {\n p.ewmaMs = LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * p.ewmaMs\n p.sampleCount++\n p.updatedAt = now\n }\n }\n }\n\n recordFailure(node: string, api?: string): void {\n const h = this.getOrCreate(node)\n if (api) {\n // API-specific failure: only update the per-API tracker.\n // This prevents e.g. 3 rc_api failures from marking the node\n // globally unhealthy for condenser_api too.\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n // Reset counter if previous cooldown expired OR last failure was >30s ago\n // (avoids sticky penalties from sparse failures hours apart)\n if (\n (existing.cooldownUntil > 0 && existing.cooldownUntil <= now) ||\n (existing.lastFailureTime > 0 && now - existing.lastFailureTime > 30_000)\n ) {\n existing.count = 0\n existing.cooldownUntil = 0\n }\n existing.count++\n existing.lastFailureTime = now\n if (existing.count >= MAX_API_FAILURES_BEFORE_COOLDOWN) {\n existing.cooldownUntil = now + API_COOLDOWN_MS\n }\n h.apiFailures.set(api, existing)\n } else {\n // Transport-level failure (no specific API): update global counter\n h.consecutiveFailures++\n h.lastFailureTime = Date.now()\n }\n }\n\n /**\n * A response that failed the caller's payload validation is a decisive,\n * reproducible node fault — the node answered 200 with data the caller KNOWS\n * to be impossible — so it trips the per-API cooldown immediately instead of\n * accruing ordinary strikes. Deliberately its own method rather than\n * recordFailure × N: ordinary strikes are cleared by any success, and a\n * top-ranked lying node keeps recording successes on the unvalidated calls\n * between probes, which would reset its strikes forever and keep it in\n * rotation (observed live). Scope stays per-API: the node may be perfectly\n * healthy for its other API families.\n */\n recordDefectiveResponse(node: string, api: string): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n existing.count = Math.max(existing.count + 1, MAX_API_FAILURES_BEFORE_COOLDOWN)\n existing.lastFailureTime = now\n existing.cooldownUntil = now + API_COOLDOWN_MS\n existing.defective = true\n h.apiFailures.set(api, existing)\n }\n\n /**\n * Cool down a rate-limited node. Honors an explicit server `Retry-After`\n * (`retryAfterMs`) exactly — the server told us when to return. With no usable\n * header, applies escalating backoff: BASE, 2×BASE, 4×BASE … capped at\n * RATE_LIMIT_MAX_MS, indexed by the node's consecutive-429 streak (reset by a\n * success or after RATE_LIMIT_STREAK_RESET_MS of quiet). This stops a throttled\n * public node from being re-admitted every 10s and re-hammered under sustained\n * load, which matters most when the fleet's own unlimited node is removed.\n */\n recordRateLimit(node: string, retryAfterMs?: number): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n // Expire a stale streak so an occasional throttle hours apart doesn't compound.\n if (h.rateLimitStreak > 0 && now - h.lastRateLimitAt > RATE_LIMIT_STREAK_RESET_MS) {\n h.rateLimitStreak = 0\n }\n const hasHeader = typeof retryAfterMs === 'number' && Number.isFinite(retryAfterMs) && retryAfterMs > 0\n const cooldown = hasHeader\n ? retryAfterMs!\n : Math.min(RATE_LIMIT_BASE_MS * 2 ** h.rateLimitStreak, RATE_LIMIT_MAX_MS)\n // Only a header-less 429 advances the escalation streak — an explicit Retry-After is\n // honored exactly and must not compound the header-less backoff (else several\n // Retry-After 429s would push a later header-less 429 straight to the 60s cap).\n if (!hasHeader) h.rateLimitStreak++\n h.lastRateLimitAt = now\n // Explicit Retry-After is honored exactly (the server's current instruction). A\n // header-less cooldown may only move the window FORWARD — it must never truncate a\n // longer window already set, e.g. a node parked for an hour by an explicit\n // Retry-After that is later retried as a last resort and returns a header-less 429\n // must not have its 1h window cut down to the 10s base.\n h.rateLimitedUntil = hasHeader\n ? now + cooldown\n : Math.max(h.rateLimitedUntil, now + cooldown)\n h.consecutiveFailures++\n h.lastFailureTime = now\n }\n\n /** Record an observed head_block_number for this node. */\n recordHeadBlock(node: string, blockNum: number): void {\n if (!blockNum || !Number.isFinite(blockNum)) return\n const h = this.getOrCreate(node)\n h.headBlock = blockNum\n h.headBlockUpdatedAt = Date.now()\n }\n\n /**\n * Consensus head block from recent observations. Uses the median rather than the\n * max to prevent a single bad/misconfigured node from poisoning the reference.\n * A node reporting an inflated head_block won't affect the median unless the\n * majority of nodes agree on that range.\n */\n private consensusHeadBlock(): number {\n const now = Date.now()\n const recent: number[] = []\n for (const h of this.health.values()) {\n if (h.headBlock > 0 && now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS) {\n recent.push(h.headBlock)\n }\n }\n if (recent.length < 2) return 0 // Need at least 2 observations to compare\n recent.sort((a, b) => a - b)\n // Median: for even length, use the lower-middle value (conservative)\n return recent[Math.floor((recent.length - 1) / 2)]\n }\n\n /** True if this node is healthy (globally and for the given API if provided). */\n isNodeHealthy(node: string, api?: string): boolean {\n const h = this.health.get(node)\n if (!h) return true // unknown nodes assumed healthy\n const now = Date.now()\n\n // Rate-limited and cooldown hasn't expired\n if (h.rateLimitedUntil > now) return false\n\n // Too many consecutive failures within the last 30 seconds\n if (h.consecutiveFailures >= 3 && now - h.lastFailureTime < 30_000) return false\n\n // Per-API cooldown: node may be healthy overall but missing this API plugin\n if (api) {\n const apiFail = h.apiFailures.get(api)\n if (apiFail && apiFail.cooldownUntil > now) return false\n }\n\n // Head-block staleness: deprioritize nodes lagging behind the consensus head\n const best = this.consensusHeadBlock()\n if (\n best > 0 &&\n h.headBlock > 0 &&\n now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS &&\n best - h.headBlock > STALE_BLOCK_THRESHOLD\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Order nodes best-first: healthy nodes sorted by adaptive latency score, then\n * unhealthy nodes appended. Capability / staleness / rate-limit filtering stays in\n * `isNodeHealthy` and is unchanged — latency only reorders WITHIN the healthy set,\n * and only WITHIN the array it is handed (so it never leaves the configured list).\n *\n * One ordering per pass MAY promote a healthy node overdue for a re-probe (never\n * sampled, or not sampled within LATENCY_REPROBE_MS) to the front — single-flight\n * via `lastProbeAt`. This is what lets a demoted node climb back when it recovers,\n * and profiles a node that organic traffic (always served by a faster peer) never\n * reaches. Cold start: with no profiles, every node scores the neutral prior and the\n * stable config-index tiebreak yields the original order — i.e. today's behavior.\n */\n getOrderedNodes(nodes: string[], api?: string): string[] {\n const healthy: string[] = []\n const unhealthy: string[] = []\n for (const node of nodes) {\n if (this.isNodeHealthy(node, api)) {\n healthy.push(node)\n } else {\n unhealthy.push(node)\n }\n }\n if (healthy.length <= 1) {\n return [...healthy, ...unhealthy]\n }\n const now = Date.now()\n // Every score in THIS pass falls back to config index on ties → a total,\n // transitive order with no memo (so no stale-denominator inversions).\n const ordered = healthy\n .map((node, i) => ({ node, i, score: this.scoreNode(node, now) }))\n .sort((a, b) => a.score - b.score || a.i - b.i)\n .map((d) => d.node)\n const probe = this.pickReprobeCandidate(healthy, now)\n if (probe && ordered[0] !== probe) {\n return [probe, ...ordered.filter((n) => n !== probe), ...unhealthy]\n }\n return [...ordered, ...unhealthy]\n }\n\n /** A node's latency is usable for ranking only if profiled (≥ MIN_SAMPLES) and fresh. */\n private isLatencyUsable(h: NodeHealth | undefined, now: number): boolean {\n return (\n !!h &&\n h.ewmaLatencyMs !== undefined &&\n h.latencySampleCount >= LATENCY_MIN_SAMPLES &&\n now - h.latencyUpdatedAt <= LATENCY_MAX_AGE_MS\n )\n }\n\n /**\n * Ranking score (lower = better). Unproven/warming nodes get a fixed neutral prior\n * so they sit ahead of a proven-slow node but behind a proven-fast one, and make at\n * most one rank transition when they cross MIN_SAMPLES (no churn).\n */\n private scoreNode(node: string, now: number): number {\n const h = this.health.get(node)\n if (!this.isLatencyUsable(h, now)) return LATENCY_UNPROVEN_PRIOR_MS\n return h!.ewmaLatencyMs!\n }\n\n /**\n * At most one healthy node overdue for an exploratory re-probe: never sampled, or\n * neither sampled nor re-probed within LATENCY_REPROBE_MS. Returns the stalest such\n * node and stamps `lastProbeAt` to single-flight it against concurrent orderings.\n *\n * Note: `getOrCreate` here materializes a health entry per node in the passed list.\n * The node list (`config.nodes`/`restNodes`) is treated as effectively static — set\n * once via `setNodes` — so the map is bounded. If a host is ever removed from the\n * list at runtime its stale entry is simply ignored (never re-surfaced) and is a\n * negligible, bounded amount of memory.\n */\n private pickReprobeCandidate(healthy: string[], now: number): string | undefined {\n const threshold = now - LATENCY_REPROBE_MS\n let cand: string | undefined\n let candTouch = Infinity\n for (const n of healthy) {\n const h = this.getOrCreate(n)\n const touch = Math.max(h.latencyUpdatedAt, h.lastProbeAt)\n if (touch <= threshold && touch < candTouch) {\n cand = n\n candTouch = touch\n }\n }\n if (cand) this.getOrCreate(cand).lastProbeAt = now\n return cand\n }\n}\n\n// Exported for the co-located specs only (asserting the call sites' effect on\n// health). Not re-exported by hive-tx/index.ts, so NOT part of the public API.\n// @internal\nexport const rpcHealthTracker = new NodeHealthTracker()\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\n\n// ── Hedged-request budget ────────────────────────────────────────────────────\n\n/**\n * Token bucket bounding hedged (duplicated) read requests to a fraction of\n * overall traffic. A hedge spends 1 token; every un-hedged success refills\n * `config.resilience.hedgeRefillPerSuccess` (default 0.1 ⇒ steady-state hedge\n * rate ≤ ~9% of successful traffic, with bursts up to `hedgeBucketCapacity`).\n * The self-limiting property this buys: under pool-wide slowness nearly every\n * request wants to hedge while successes (the refills) stagnate, so the bucket\n * drains and hedging auto-disables instead of doubling load into public-node\n * rate limits — the standard hedged-request guard (cf. gRPC's hedging throttle;\n * Dean & Barroso, \"The Tail at Scale\"). One instance per process shared across\n * concurrent calls; plain synchronous mutation is race-free on the JS event\n * loop. Reads config live so runtime tuning via `setResilience` applies.\n * @internal Exported for testing only.\n */\nexport class HedgeBudget {\n private tokens = config.resilience.hedgeBucketCapacity\n\n trySpend(): boolean {\n this.clamp()\n // Epsilon guards fractional-refill float accumulation (10 × 0.1 < 1 in FP64).\n if (this.tokens >= 1 - 1e-9) {\n this.tokens -= 1\n return true\n }\n return false\n }\n\n refill(): void {\n this.clamp()\n this.tokens = Math.min(\n config.resilience.hedgeBucketCapacity,\n this.tokens + config.resilience.hedgeRefillPerSuccess\n )\n }\n\n /** Capacity may be lowered at runtime; never let stored tokens exceed it. */\n private clamp(): void {\n if (this.tokens > config.resilience.hedgeBucketCapacity) {\n this.tokens = config.resilience.hedgeBucketCapacity\n }\n }\n\n /** @internal test hook */\n get available(): number {\n return this.tokens\n }\n\n /** @internal test hook */\n reset(tokens = config.resilience.hedgeBucketCapacity): void {\n this.tokens = tokens\n }\n}\n\n// @internal — exported for the co-located spec only, like the trackers above.\nexport const rpcHedgeBudget = new HedgeBudget()\n\n/**\n * Per-attempt timeout for a read call. A node profiled for THIS profile key\n * (full RPC method / REST api+endpoint template) is given `factor × EWMA` —\n * floored (≥2s) so a moderate spike on a fast call is not cut off, and capped\n * at the caller's ceiling so this can only ever *shorten* the wait. The\n * effect: a node running far above its own baseline for this exact kind of\n * call is abandoned early and failover starts in seconds instead of the full\n * fixed window.\n *\n * Two deliberate exclusions:\n * - `explicit` callers (who passed a timeout argument) keep exactly what they\n * asked for — the documented meaning of the parameter is preserved, and a\n * consumer who knows their call is heavy is never second-guessed.\n * - The profile is per (node, full method) with NO fallback to the node's\n * mixed global EWMA or even the API-prefix average: a baseline dominated by\n * cheap `condenser_api.get_accounts` calls must not set the deadline for a\n * heavy `condenser_api.get_account_history`. An unprofiled (node, method)\n * pair keeps the caller's timeout unchanged (cold start == old behavior).\n */\nfunction adaptiveAttemptTimeout(\n tracker: NodeHealthTracker,\n node: string,\n profileKey: string,\n callerTimeout: number,\n explicit: boolean\n): number {\n const r = config.resilience\n if (!r.adaptiveTimeout || explicit) return callerTimeout\n const ewma = tracker.getUsableLatencyMs(node, profileKey)\n if (ewma === undefined) return callerTimeout\n // EWMAs are fractional, but the result feeds AbortSignal.timeout(), which\n // Node rejects with ERR_OUT_OF_RANGE for non-integer delays (browsers coerce).\n return Math.ceil(\n Math.min(callerTimeout, Math.max(r.adaptiveTimeoutFloorMs, r.adaptiveTimeoutFactor * ewma))\n )\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/** Record a caught error on the health tracker (handles NodeError to avoid double-counting). */\nfunction recordError(tracker: NodeHealthTracker, node: string, e: any, api?: string): void {\n if (e instanceof NodeError) {\n if (e.isRateLimit) {\n // 0 → no usable Retry-After → let recordRateLimit apply escalating backoff.\n tracker.recordRateLimit(node, e.rateLimitMs || undefined)\n } else {\n tracker.recordFailure(node, api)\n }\n } else if (e instanceof RPCError) {\n // RPC-level errors are API-specific (e.g., disabled API)\n tracker.recordFailure(node, api)\n } else {\n // Transport-level failures (DNS, TLS, timeout) affect the whole node\n tracker.recordFailure(node)\n }\n}\n\n/**\n * Passively extract head_block_number from known RPC responses\n * (e.g. `condenser_api.get_dynamic_global_properties`, `database_api.get_dynamic_global_properties`).\n * Silently ignores responses without that shape.\n */\nfunction tryRecordHeadBlock(\n tracker: NodeHealthTracker,\n node: string,\n method: string,\n result: any\n): void {\n if (!result || typeof result !== 'object') return\n if (!method.includes('get_dynamic_global_properties')) return\n const block = (result as any).head_block_number\n if (typeof block === 'number') {\n tracker.recordHeadBlock(node, block)\n }\n}\n\n// ── AbortSignal helpers (browser fallbacks) ─────────────────────────────────\n\n/**\n * Build a TimeoutError \"reason\" for an aborted signal.\n * Prefers the standard `DOMException` when available. Runtimes that ship\n * `AbortController` without `DOMException` (notably React Native / Hermes,\n * old Node < 17) fall back to a plain Error tagged with `name: 'TimeoutError'`\n * — which is what consumers actually check on `signal.reason`.\n */\nfunction createTimeoutReason(): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException('The operation was aborted due to timeout', 'TimeoutError')\n }\n const err = new Error('The operation was aborted due to timeout')\n err.name = 'TimeoutError'\n return err\n}\n\n/** AbortSignal.timeout polyfill for pre-Chrome 103 / pre-Safari 16.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to clear the dangling timer. */\nfunction createTimeoutSignal(ms: number): { signal: AbortSignal; cleanup: () => void } {\n // Node's AbortSignal.timeout throws ERR_OUT_OF_RANGE on fractional delays\n // (browsers coerce them), so guard every caller here.\n ms = Math.ceil(ms)\n if (typeof AbortSignal.timeout === 'function') {\n return { signal: AbortSignal.timeout(ms), cleanup: () => {} }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(createTimeoutReason()), ms)\n return { signal: controller.signal, cleanup: () => clearTimeout(timer) }\n}\n\n/** AbortSignal.any polyfill for pre-Chrome 116 / pre-Safari 17.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to remove listeners from the input signals (prevents leaks when the\n * same long-lived signal is reused across many callRPC invocations). */\nfunction mergeSignals(\n primary: AbortSignal,\n secondary?: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!secondary) return { signal: primary, cleanup: () => {} }\n if (typeof AbortSignal.any === 'function') {\n return { signal: AbortSignal.any([primary, secondary]), cleanup: () => {} }\n }\n // Fallback: controller that aborts with the winning signal's reason\n const controller = new AbortController()\n if (primary.aborted) {\n controller.abort(primary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n if (secondary.aborted) {\n controller.abort(secondary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n\n const onPrimaryAbort = () => controller.abort(primary.reason)\n const onSecondaryAbort = () => controller.abort(secondary.reason)\n primary.addEventListener('abort', onPrimaryAbort, { once: true })\n secondary.addEventListener('abort', onSecondaryAbort, { once: true })\n\n const cleanup = () => {\n primary.removeEventListener('abort', onPrimaryAbort)\n secondary.removeEventListener('abort', onSecondaryAbort)\n }\n return { signal: controller.signal, cleanup }\n}\n\n/**\n * Low-level JSON-RPC call to a single node. No failover.\n * Throws RPCError for blockchain rejections, NodeError for HTTP 429/5xx,\n * and generic Error for other transport failures.\n * @param shouldRetry - If true, retries once on the same node for transient errors.\n */\nconst jsonRPCCall = async (\n url: string,\n method: string,\n params: any,\n timeout = config.timeout,\n shouldRetry = false,\n externalSignal?: AbortSignal\n) => {\n const id = Math.floor(Math.random() * 100_000_000)\n const body = {\n jsonrpc: '2.0',\n method,\n params,\n id\n }\n // Merge the per-call timeout with any external abort signal (e.g., SSR\n // request cancellation). Either one firing cancels the fetch.\n // Fallbacks for browsers without AbortSignal.timeout (pre-Chrome 103)\n // or AbortSignal.any (pre-Chrome 116).\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\n const { signal, cleanup: cleanupMerge } = mergeSignals(tSignal, externalSignal)\n const cleanup = () => {\n cleanupTimeout()\n cleanupMerge()\n }\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...serverIdentityHeaders() },\n signal\n })\n\n // Handle HTTP-level errors before parsing JSON.\n // Throw NodeError so callers can record health exactly once.\n if (res.status === 429) {\n throw new NodeError(url, `HTTP 429 Rate Limited`, {\n rateLimitMs: parseRetryAfterMs(res.headers.get('Retry-After')),\n isRateLimit: true\n })\n }\n // Any other 5xx is a node-level failure. Common cases:\n // 502 Bad Gateway — upstream HAF/jussi down\n // 503 Service Unavail — node draining / maintenance\n // 504 Gateway Timeout — slow upstream\n // 520-530 — Cloudflare interstitials (1033 tunnel error → 530)\n // Without this branch, the HTML error-page body would fall into res.json()\n // and throw a generic SyntaxError downstream, making failover guess at\n // whether the request reached the node.\n if (res.status >= 500 && res.status < 600) {\n throw new NodeError(url, `HTTP ${res.status} from ${url}`)\n }\n\n const result = (await res.json()) as CallResponse\n if (\n !result ||\n typeof result.id === 'undefined' ||\n result.id !== id ||\n result.jsonrpc !== '2.0'\n ) {\n throw new Error('JSONRPC id mismatch')\n }\n if ('result' in result) {\n return result.result\n }\n if ('error' in result) {\n const e = result.error\n if ('message' in e && 'code' in e) {\n throw new RPCError(e)\n }\n throw result.error\n }\n // No result and no error?\n throw result\n } catch (e) {\n if (e instanceof RPCError) {\n throw e\n }\n // NodeError should not be retried on the same node - it's an HTTP status issue\n if (e instanceof NodeError) {\n throw e\n }\n if (externalSignal?.aborted) {\n throw e\n }\n if (shouldRetry) {\n return jsonRPCCall(url, method, params, timeout, false, externalSignal)\n }\n throw e\n } finally {\n cleanup()\n }\n}\n\n/** Small jitter delay between failover attempts to prevent thundering herd. */\nfunction jitterDelay(): Promise {\n return sleep(50 + Math.random() * 50)\n}\n\n// ── Hedged read attempt ─────────────────────────────────────────────────────\n\n/**\n * One hedged READ attempt: start the primary node, and if it is still pending\n * after `max(hedgeDelayFloorMs, hedgeDelayFactor × primary EWMA)`, race a\n * duplicate against the next healthy untried node. First success wins and the\n * loser is aborted. Resolution rules (mirroring the sequential path exactly):\n *\n * - External abort (caller cancelled): reject immediately, record nothing.\n * - Authoritative RPCError (non-node-level blockchain rejection) from either\n * leg: an answer, not a fault — abort the other leg, reject immediately.\n * - Failover-class failure: record health for that leg (recordError +\n * recordSlowFailure — identical to the sequential catch); if the other leg\n * is still running, keep waiting on it; when both have failed, reject with\n * the last error so the outer loop continues its normal failover.\n * - Primary fails BEFORE the hedge fires: reject immediately (plain failover —\n * hedging only ever races slowness, never a node that failed fast).\n *\n * Health/budget bookkeeping on a win: winner records a normal success sample;\n * if the hedge won, the primary gets a censored latency sample (elapsed at\n * abort — a lower bound on its true latency) so repeated hedge-wins reorder\n * the pool; if the primary won without the hedge ever firing, the budget\n * refills. An aborted hedge leg records nothing (it was never given a fair\n * run). Broadcasts NEVER go through this path (double-broadcast risk) — it is\n * wired into `callRPC` only.\n */\nfunction hedgedRpcAttempt(opts: {\n method: string\n params: any[] | object\n api: string\n primary: string\n /**\n * Pre-selected healthy untried peers (up to a few, in rank order). The\n * actual hedge target is drawn uniformly at random at FIRE time: with many\n * concurrent callers behind one origin IP, always duplicating to the single\n * next-ranked node would concentrate the whole hedge stream on it and could\n * trip its per-IP rate limit — spreading over the top candidates keeps the\n * same budget bound without a single-target hotspot. Marked tried only if\n * the hedge actually fires.\n */\n hedgePool: string[]\n callerTimeout: number\n /** Caller passed an explicit timeout — adaptive shortening is disabled. */\n explicitTimeout: boolean\n /** The call's wall-clock deadline: a hedge must not START past it (it would\n * be a brand-new request the outer loop itself would refuse to start). */\n deadlineAt: number\n externalSignal?: AbortSignal\n /** Lets the outer loop add the hedge node to its tried-set at fire time. */\n onHedgeFired: (node: string) => void\n /** Caller-supplied payload validation — see callRPC's `validate` param. */\n validate?: (result: unknown) => boolean\n}): Promise {\n const {\n method,\n params,\n api,\n primary,\n hedgePool,\n callerTimeout,\n explicitTimeout,\n deadlineAt,\n externalSignal,\n onHedgeFired,\n validate\n } = opts\n return new Promise((resolve, reject) => {\n let done = false\n let pendingLegs = 0\n let hedgeFired = false\n /** The primary settled on its own (success OR failure). A censored latency\n * sample is only valid for a primary that was still in flight when the\n * hedge won — recording one after the primary already failed would\n * fabricate a second sample for a request whose outcome was recorded. */\n let primarySettled = false\n let lastError: any\n let hedgeTimer: ReturnType | undefined\n let primaryStart = 0\n const controllers: AbortController[] = []\n\n /** Settle exactly once: clear the timer, abort every other in-flight leg\n * (their rejections land behind the `done` guard and are dropped). */\n const finish = (settle: () => void) => {\n if (done) return\n done = true\n if (hedgeTimer !== undefined) {\n clearTimeout(hedgeTimer)\n hedgeTimer = undefined\n }\n for (const c of controllers) {\n if (!c.signal.aborted) c.abort()\n }\n settle()\n }\n\n const startLeg = (node: string, isHedge: boolean) => {\n pendingLegs++\n const controller = new AbortController()\n controllers.push(controller)\n // Merge our cancellation handle with the caller's signal; jsonRPCCall\n // merges the result with its own per-attempt timeout signal.\n const merged = mergeSignals(controller.signal, externalSignal)\n const legTimeout = adaptiveAttemptTimeout(\n rpcHealthTracker,\n node,\n method,\n callerTimeout,\n explicitTimeout\n )\n const start = Date.now()\n if (!isHedge) primaryStart = start\n jsonRPCCall(node, method, params, legTimeout, false, merged.signal)\n .then((res) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Same handling as the catch\n // path — record the fault against this node's API health, never\n // record a success for a lie, and let the other leg still win.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(\n `[hive-tx] response validation failed for ${method} from ${node}`\n )\n if (!isHedge && !hedgeFired) {\n finish(() => reject(lastError))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n return\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - start, method)\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n if (isHedge) {\n if (!primarySettled) {\n // Primary lost the race while still in flight: censored sample\n // (lower bound of its true latency) so the ranker learns without\n // marking it as failed. A primary that already failed was fully\n // recorded by its own catch — nothing more to record.\n rpcHealthTracker.recordCensoredLatency(primary, Date.now() - primaryStart, method)\n }\n } else if (!hedgeFired) {\n rpcHedgeBudget.refill()\n }\n finish(() => resolve(res as T))\n })\n .catch((e) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return // aborted loser (or late settle) — already resolved\n if (externalSignal?.aborted) {\n // Caller cancelled — bail without recording (mirrors sequential path).\n finish(() => reject(e))\n return\n }\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n // Authoritative rejection: an answer, not a node fault.\n finish(() => reject(e))\n return\n }\n // Failover-class failure — record exactly as the sequential catch does.\n recordError(rpcHealthTracker, node, e, api)\n rpcHealthTracker.recordSlowFailure(node, Date.now() - start, method)\n lastError = e\n if (!isHedge && !hedgeFired) {\n // Primary failed fast, before the hedge delay: plain failover.\n finish(() => reject(e))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n // else: the other leg is still in flight and may still win.\n })\n }\n\n startLeg(primary, false)\n\n // Delay from the primary's per-method profile (the eligibility gate\n // ensured it is usable); a raced expiry just means the floor applies. It is\n // then clamped BELOW the primary's own attempt window: for a heavy API\n // (EWMA > window/hedgeDelayFactor) the un-clamped delay would land past\n // the primary's timeout-abort — which clears this timer — so hedging would\n // silently never fire for exactly the heavy tail it exists to protect.\n // Firing at ~80% of the window keeps the duplicate meaningful (it starts\n // while the primary is still allowed to win) for every profile shape.\n const ewma = rpcHealthTracker.getUsableLatencyMs(primary, method) ?? 0\n const primaryWindow = adaptiveAttemptTimeout(\n rpcHealthTracker,\n primary,\n method,\n callerTimeout,\n explicitTimeout\n )\n const delay = Math.min(\n Math.max(config.resilience.hedgeDelayFloorMs, config.resilience.hedgeDelayFactor * ewma),\n 0.8 * primaryWindow\n )\n hedgeTimer = setTimeout(() => {\n hedgeTimer = undefined\n if (done || externalSignal?.aborted) return\n // Never START a duplicate past the call's wall-clock deadline — it would\n // extend the hold and spend a token on work the outer loop would refuse.\n if (Date.now() >= deadlineAt) return\n // Candidates were selected before the delay elapsed — re-check health at\n // fire time (one may have been rate-limited meanwhile) BEFORE spending a\n // token, so a stale pool costs nothing. Random draw spreads concurrent\n // callers' duplicates across the top candidates (see hedgePool doc).\n const live = hedgePool.filter((n) => rpcHealthTracker.isNodeHealthy(n, api))\n if (live.length === 0) return\n const target = live[Math.floor(Math.random() * live.length)]\n // Budget check at fire time, not arm time: only actual duplicates spend.\n if (!rpcHedgeBudget.trySpend()) return\n hedgeFired = true\n onHedgeFired(target)\n startLeg(target, true)\n }, delay)\n })\n}\n\n// ── Public API: callRPC ─────────────────────────────────────────────────────\n\n/**\n * Makes API calls to Hive blockchain nodes with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, jitter between retries,\n * and HTTP status awareness (429 rate limiting, 503).\n *\n * If the current node fails, it will automatically try the next healthy node.\n * When all nodes have been tried, wraps around to give earlier nodes another chance\n * until the full retry budget (config.retry) is exhausted.\n * RPCErrors (valid blockchain rejections) are never retried.\n *\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Maximum number of retry attempts (default: config.retry). The\n * wall-clock budget (`config.resilience.totalBudgetFactor` × timeout) may end\n * the failover walk before the retry count is exhausted.\n * @param validate - Optional payload validation. Some nodes return a valid\n * JSON-RPC envelope carrying an impossible payload (e.g. account rows with\n * metadata fields stripped to \"\"), which no transport-level check can catch.\n * When the callback returns false the response is treated as a node fault:\n * recorded against that node's per-API health (repeat offenders get an API\n * cooldown and are deprioritized) and the failover walk continues to the\n * next node instead of returning the lie. Keep validators conservative —\n * reject only payloads the caller KNOWS cannot be correct, or a strict\n * validator turns every node's honest answer into a failover storm.\n * @returns Promise resolving to the API response\n * @throws {RPCError} On blockchain-level errors (bad params, missing authority, etc.)\n * @throws {Error} If all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callRPC } from 'hive-tx'\n *\n * // Get account information\n * const accounts = await callRPC('condenser_api.get_accounts', [['alice']])\n *\n * // Custom timeout and retry settings\n * const data = await callRPC('condenser_api.get_content', ['alice', 'test-post'], 10_000, 5)\n * ```\n */\nexport const callRPC = async (\n method: string,\n params: any[] | object = [],\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal,\n validate?: (result: unknown) => boolean\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n // An explicit timeout argument is authoritative: adaptive shortening only\n // applies to callers who left the window to the SDK (timeout === undefined),\n // so `callRPC(m, p, 10_000)` still means \"give each attempt 10s\" exactly.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const api = apiOf(method)\n // Wall-clock budget across ALL failover attempts. Without it the worst case\n // is (retry+1) × timeout ≈ 30s — exactly the render pile-up this feature\n // exists to prevent — whenever the WHOLE pool is slow (adaptive timeouts\n // rise with the EWMAs and hedging self-throttles, both by design). The\n // deadline is checked before each new attempt AND before a hedge fires; an\n // in-flight attempt still finishes its own window, so the true ceiling is\n // deadline + one attempt window (up to ~2× the window if a hedge fired just\n // before the deadline and the attempt then waits out the hedge leg too).\n // Note this budget also bounds callers who passed an explicit `retry`: the\n // wall clock, not the attempt count, is the stronger promise here.\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Track nodes tried in the current round. When all nodes have been tried,\n // clear the set to allow a second round (wrap-around) using the retry budget.\n const triedInRound = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so nodes with an API-specific cooldown are deprioritized.\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n // Pick the healthiest untried node. If all tried, start a new round.\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n\n // Hedge eligibility for THIS attempt: opted in, the primary has a usable\n // latency profile for this exact method (so the hedge delay is grounded in\n // data — cold starts stay sequential), and healthy untried peers exist.\n let hedgePool: string[] = []\n if (\n config.resilience.hedge &&\n rpcHealthTracker.getUsableLatencyMs(node, method) !== undefined\n ) {\n hedgePool = orderedNodes\n .filter((n) => !triedInRound.has(n) && rpcHealthTracker.isNodeHealthy(n, api))\n .slice(0, 3)\n }\n\n if (hedgePool.length > 0) {\n try {\n // All health/budget recording happens inside the hedged attempt —\n // the catch below must NOT record again (unlike the sequential path).\n return await hedgedRpcAttempt({\n method,\n params,\n api,\n primary: node,\n hedgePool,\n callerTimeout: ceiling,\n explicitTimeout,\n deadlineAt: deadline,\n externalSignal: signal,\n onHedgeFired: (n) => triedInRound.add(n),\n validate\n })\n } catch (e: any) {\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n lastError = e\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n }\n\n const callStart = Date.now()\n try {\n const res = await jsonRPCCall(\n node,\n method,\n params,\n adaptiveAttemptTimeout(rpcHealthTracker, node, method, ceiling, explicitTimeout),\n false,\n signal\n )\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Count it against this node's API\n // health (never record a success or refill the hedge budget for a\n // lie) and fail over to the next node.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(`[hive-tx] response validation failed for ${method} from ${node}`)\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart, method)\n // An un-hedged success is what earns hedge budget back (see HedgeBudget).\n rpcHedgeBudget.refill()\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n return res as T\n } catch (e: any) {\n // RPCErrors: distinguish node-level failures from genuine blockchain rejections.\n // Node-level errors (e.g. -32602 \"Unable to parse endpoint data\" from a sick\n // HAF/jussi backend) should failover; real rejections (bad params, missing\n // authority, etc.) propagate immediately.\n if (e instanceof RPCError) {\n if (!isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n // Node-level RPC error — record failure and fall through to failover\n }\n // External abort — stop retrying immediately\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n // A genuinely slow failure (timeout/abort/slow-5xx) is also a latency signal so\n // a node that 200s-but-too-slow or aborts at the timeout is demoted by the\n // ranker, not only by the (transient) failure gate. Measured elapsed, never a\n // constant; recordSlowFailure ignores instant (down-node) failures.\n rpcHealthTracker.recordSlowFailure(node, Date.now() - callStart, method)\n lastError = e\n\n // Add jitter before trying next node\n if (attempt < retry) {\n await jitterDelay()\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callRPC for broadcasts ──────────────────────────────────────\n\n/**\n * Broadcast-safe RPC call. Only retries on pre-connection errors where the\n * request definitively never reached the server (ECONNREFUSED, ENOTFOUND, etc.).\n * On timeouts, HTTP errors, or any ambiguous failure, throws immediately to\n * prevent double-broadcasting transactions.\n *\n * Tries each node once (no wrap-around) since broadcast retries are dangerous.\n *\n * @internal Used by Transaction.broadcast()\n */\nexport const callRPCBroadcast = async (\n method: string,\n params: any[] | object = [],\n timeout = config.broadcastTimeout,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n const api = apiOf(method)\n // Track which nodes we've already tried - broadcasts must never retry the same node\n const triedNodes = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt < config.nodes.length; attempt++) {\n // Re-evaluate order each attempt so health changes are respected\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n const node = orderedNodes.find((n) => !triedNodes.has(n))\n if (!node) break\n triedNodes.add(node)\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n // Deliberately no latency sample for broadcasts: broadcast_transaction_synchronous\n // blocks for block inclusion (~1.5–3s+) regardless of the node's read speed, so\n // feeding it into the shared read EWMA would wrongly demote a fast node for reads.\n // The same nodes are profiled by callRPC read traffic, so a genuinely slow node is\n // still demoted there.\n rpcHealthTracker.recordSuccess(node, api)\n return res as T\n } catch (e: any) {\n // RPCErrors are valid blockchain rejections - never retry\n if (e instanceof RPCError) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n lastError = e\n\n // Broadcast safety: only fail over when the request is safe to re-send.\n // `broadcastOperations` signs the tx exactly once and `callRPCBroadcast`\n // reuses that signed payload across nodes, so any case where the next\n // node would dedupe by trx_id is fine. RPCErrors (real blockchain\n // rejections) propagate immediately — see isBroadcastSafeToRetry.\n if (!isBroadcastSafeToRetry(e)) {\n throw e\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callREST ────────────────────────────────────────────────────\n\nconst apiMethods: Record = {\n balance: '/balance-api',\n hafah: '/hafah-api',\n hafbe: '/hafbe-api',\n hivemind: '/hivemind-api',\n hivesense: '/hivesense-api',\n reputation: '/reputation-api',\n 'nft-tracker': '/nft-tracker-api',\n hafsql: '/hafsql',\n status: '/status-api'\n}\n\n/**\n * Makes REST API calls to Hive blockchain REST endpoints with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, and timeout support.\n * Wraps around the node list to honor the full retry budget.\n *\n * @template Api - The REST API method type (e.g., 'balance', 'hafah', 'hivemind', etc.)\n * @template P - The endpoint path type for the specified API\n *\n * @param api - The REST API method name to call\n * @param endpoint - The specific endpoint path within the API\n * @param params - Optional parameters for path and query string replacement\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Number of retry attempts before throwing an error (default:\n * config.retry). The wall-clock budget (`config.resilience.totalBudgetFactor`\n * × timeout) may end the failover walk before the retry count is exhausted.\n *\n * @returns Promise resolving to the API response data with proper typing\n * @throws Error if all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callREST } from 'hive-tx'\n *\n * // Get account balance\n * const balance = await callREST('balance', '/accounts/{account-name}/balances', { \"account-name\": 'alice' })\n *\n * // Custom timeout and retry settings\n * const data = await callREST('status', '/status', undefined, 10_000, 3)\n * ```\n */\nexport async function callREST(\n api: APIMethods,\n endpoint: string,\n params?: Record,\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal\n): Promise {\n if (!Array.isArray(config.restNodes)) {\n throw new Error('config.restNodes is not an array')\n }\n if (config.restNodes.length === 0) {\n throw new Error('config.restNodes is empty')\n }\n // Same contract as callRPC: an explicit timeout argument is authoritative\n // (no adaptive shortening), and a wall-clock deadline bounds the total\n // failover walk when the whole pool is slow.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Latency-profile key: api + endpoint TEMPLATE (pre-substitution, so the\n // cardinality is code-defined) — a cheap endpoint's baseline must not set\n // the deadline for a heavy one within the same REST api.\n const restProfileKey = `${api}:${endpoint}`\n // Per-API node override: an API served by only a subset of nodes (e.g.\n // hivesense) uses its own capable-host list so the small retry budget and\n // cold starts aren't wasted on nodes that 404/503 it. Any API without an\n // override (or with an empty one) falls back to the generic restNodes.\n const apiNodes =\n config.restNodesByApi?.[api]?.length\n ? config.restNodesByApi[api]!\n : config.restNodes\n const triedInRound = new Set()\n let lastError: any\n // Track whether the error was already recorded by the HTTP status handler\n let alreadyRecorded = false\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so per-API cooldowns are respected.\n const orderedNodes = restHealthTracker.getOrderedNodes(apiNodes, api)\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n const baseUrl = node + apiMethods[api]\n let path = endpoint as string\n const paramObj = params || ({} as Record)\n const processedPathParams = new Set()\n\n // Replace path params ONLY\n Object.entries(paramObj).forEach(([key, value]) => {\n if (path.includes(`{${key}}`)) {\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)))\n processedPathParams.add(key)\n }\n })\n const url = new URL(baseUrl + path)\n // Add ONLY remaining params as query (if any)\n Object.entries(paramObj).forEach(([key, value]) => {\n if (!processedPathParams.has(key)) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n })\n\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n alreadyRecorded = false\n // Adaptive per-attempt timeout (see adaptiveAttemptTimeout): a profiled\n // REST node is abandoned at factor×EWMA instead of the full fixed window.\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(\n adaptiveAttemptTimeout(restHealthTracker, node, restProfileKey, ceiling, explicitTimeout)\n )\n const { signal: restSignal, cleanup: cleanupMerge } = mergeSignals(tSignal, signal)\n const restCleanup = () => { cleanupTimeout(); cleanupMerge() }\n const restCallStart = Date.now()\n try {\n const response = await fetch(url.toString(), {\n signal: restSignal,\n headers: serverIdentityHeaders()\n })\n if (response.status === 404) {\n throw new Error('HTTP 404 - Hint: can happen on wrong params')\n }\n if (response.status === 429) {\n // 0 (no usable Retry-After) → undefined → escalating backoff in recordRateLimit.\n restHealthTracker.recordRateLimit(\n node,\n parseRetryAfterMs(response.headers.get('Retry-After')) || undefined\n )\n alreadyRecorded = true\n throw new Error(`HTTP 429 Rate Limited by ${node}`)\n }\n if (response.status === 503) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP 503 Service Unavailable from ${node}`)\n }\n if (!response.ok) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP ${response.status} from ${node}`)\n }\n restHealthTracker.recordSuccess(node, api, Date.now() - restCallStart, restProfileKey)\n return response.json() as any\n } catch (e: any) {\n // 404 is not a node issue, don't failover\n if (e?.message?.includes('HTTP 404')) {\n throw e\n }\n // External abort (caller unmounted / React Query cancelled the request) is the\n // client's decision, NOT a node fault. Mirror callRPC: bail before recording any\n // failure or slow-latency sample so a healthy REST node (e.g. an own node) is never\n // demoted by routine navigation/cancellation.\n if (signal?.aborted) {\n throw e\n }\n // Only record if not already recorded by 429/503 handler above\n if (!alreadyRecorded) {\n restHealthTracker.recordFailure(node, api)\n }\n // A slow failure (timeout/abort/slow-5xx — e.g. an own node from a far region) is a\n // latency signal too, so it is demoted by the ranker, not only the failure gate.\n // Measured elapsed; recordSlowFailure floors at LATENCY_SLOW_FAILURE_MS so a fast\n // 404/429 or instant down-node failure is NOT mis-read as \"slow\".\n restHealthTracker.recordSlowFailure(node, Date.now() - restCallStart, restProfileKey)\n lastError = e\n\n if (attempt < retry) {\n await jitterDelay()\n }\n } finally {\n restCleanup()\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callWithQuorum ───────────────────────────────────────────────\n\n/**\n * Make a JSONRPC call with quorum. The method will cross-check the result\n * with `quorum` number of nodes before returning the result.\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param quorum - Default: 2 (recommended)\n */\nexport const callWithQuorum = async (\n method: string,\n params: any[] | object = [],\n quorum = 2,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an Array')\n }\n if (quorum > config.nodes.length) {\n throw new Error('quorum > config.nodes.length')\n }\n // We call random nodes for better security (Fisher-Yates shuffle)\n const shuffleNodes = (arr: string[]) => {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n }\n let allNodes = shuffleNodes(config.nodes)\n let currentBatchSize = Math.min(quorum, allNodes.length)\n let allResults: any[] = []\n while (currentBatchSize > 0 && allNodes.length > 0) {\n // Take next batch of nodes\n const batchNodes = allNodes.splice(0, currentBatchSize)\n const promises: Promise[] = []\n const batchResults: any[] = []\n // Launch batch calls in parallel\n for (let i = 0; i < batchNodes.length; i++) {\n promises.push(\n jsonRPCCall(batchNodes[i], method, params, undefined, true, signal)\n .then((data) => batchResults.push(data))\n .catch(() => {})\n )\n }\n await Promise.all(promises)\n allResults.push(...batchResults)\n // Check for consensus in successful results\n const consensusResult = findConsensus(allResults, quorum)\n if (consensusResult) {\n return consensusResult\n }\n // Prepare next batch\n currentBatchSize = Math.min(quorum, allNodes.length)\n if (currentBatchSize === 0) {\n throw new Error('No more nodes available.')\n }\n }\n throw new Error(\"Couldn't reach quorum.\")\n}\n\nfunction findConsensus(results: any[], quorum: number) {\n const resultGroups = new Map()\n for (const result of results) {\n const key = JSON.stringify(result)\n if (!resultGroups.has(key)) {\n resultGroups.set(key, [])\n }\n resultGroups.get(key)!.push(result)\n }\n const consensusGroup = Array.from(resultGroups.values()).find((group) => group.length >= quorum)\n return consensusGroup ? consensusGroup[0] : null\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { PrivateKey } from './helpers/PrivateKey'\nimport {\n OperationName,\n OperationBody,\n TransactionType,\n TransactionStatus,\n BroadcastResult\n} from './types'\nimport { ByteBuffer } from './helpers/ByteBuffer'\nimport { Serializer } from './helpers/serializer'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { config } from './config'\nimport { callRPC, callRPCBroadcast, RPCError } from './helpers/call'\nimport { DigestData } from './types'\nimport { sleep } from './helpers/sleep'\n\nconst chainId = hexToBytes(config.chain_id)\n\ninterface TransactionOptions {\n transaction?: TransactionType | Transaction\n /**\n * Transaction expiration in milliseconds (ms) - max 86400000 (24 hours)\n * @default 60_000\n */\n expiration?: number\n}\n\nexport class Transaction {\n transaction?: TransactionType\n\n expiration: number = 60_000\n\n private txId?: string\n\n constructor(options?: TransactionOptions) {\n if (options?.transaction) {\n if (options.transaction instanceof Transaction) {\n this.transaction = options.transaction.transaction\n this.expiration = options.transaction.expiration\n } else {\n this.transaction = options.transaction\n }\n // A transaction built externally (e.g. from a hive-uri signing request)\n // may omit the `signatures` array. sign(), addSignature() and broadcast()\n // all assume it exists, so normalize it here to avoid\n // \"Cannot read property 'push' of undefined\" on sign.\n if (this.transaction && !Array.isArray(this.transaction.signatures)) {\n this.transaction.signatures = []\n }\n this.txId = this.digest().txId\n }\n if (options?.expiration) {\n this.expiration = options.expiration\n }\n }\n\n /**\n * Adds an operation to the transaction. If no transaction exists, creates one first.\n * @template O Operation name type for type safety\n * @param operationName The name/type of the operation to add (e.g., 'transfer', 'vote', 'comment')\n * @param operationBody The operation data/body for the specified operation type\n * @returns Promise that resolves when the operation is added\n * @throws Error if transaction creation fails or global properties cannot be retrieved\n */\n async addOperation(\n operationName: O,\n operationBody: OperationBody\n ): Promise {\n if (!this.transaction) {\n await this.createTransaction(this.expiration)\n }\n this.transaction!.operations.push([operationName, operationBody])\n }\n\n /**\n * Signs the transaction with the provided key(s), supporting both single and multi-signature transactions.\n * For multi-signature, you can sign with all keys at once or sign individually by calling this method multiple times.\n * @param keys Single PrivateKey or array of PrivateKeys to sign the transaction with\n * @returns The signed transaction\n * @throws Error if no transaction exists to sign\n */\n sign(keys: PrivateKey | PrivateKey[]): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n if (this.transaction) {\n const { digest, txId } = this.digest()\n if (!Array.isArray(keys)) {\n keys = [keys]\n }\n for (const key of keys) {\n const signature = key.sign(digest)\n this.transaction.signatures.push(signature.customToString())\n }\n this.txId = txId\n return this.transaction\n } else {\n throw new Error('No transaction to sign')\n }\n }\n\n /**\n * Broadcasts the signed transaction to the Hive network.\n * Automatically handles retries and duplicate transaction detection.\n * @param checkStatus By default (false) the transaction is not guaranteed to be included in a block.\n * For example the transaction can expire while waiting in mempool.\n * If you pass true here, the function will wait for the transaction to be either included or dropped\n * before returning a result.\n * @returns Promise resolving to broadcast result\n * @throws Error if no transaction exists or transaction is not signed or transaction got rejected\n */\n async broadcast(checkStatus = false): Promise {\n if (!this.transaction) {\n throw new Error(\n 'Attempted to broadcast an empty transaction. Add operations by .addOperation()'\n )\n }\n if (this.transaction.signatures.length === 0) {\n throw new Error(\n 'Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)'\n )\n }\n try {\n await callRPCBroadcast('condenser_api.broadcast_transaction', [this.transaction])\n } catch (e) {\n if (e instanceof RPCError && e.message.includes('Duplicate transaction check failed')) {\n // ignore duplicate transaction error as this can happen when we retry the broadcast\n } else {\n throw e\n }\n }\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n if (!checkStatus) {\n return { tx_id: this.txId, status: 'unknown' }\n }\n // Poll until the transaction reaches a final state or max attempts exceeded.\n // With 60 attempts: delays grow from 1.3s to 19s, total wait ~10 minutes.\n const maxPollAttempts = 60\n await sleep(1000)\n let status = await this.checkStatus()\n let i = 1\n while (\n status?.status !== 'within_irreversible_block' &&\n status?.status !== 'expired_irreversible' &&\n status?.status !== 'too_old' &&\n i < maxPollAttempts\n ) {\n await sleep(1000 + i * 300)\n status = await this.checkStatus()\n i++\n }\n return {\n tx_id: this.txId,\n status: (status?.status ?? 'unknown') as BroadcastResult['status']\n }\n }\n\n /**\n * Returns the transaction digest containing the transaction ID and hash.\n * The digest can be used to verify signatures and for transaction identification.\n * @returns DigestData containing transaction ID and hash\n * @throws Error if no transaction exists\n */\n digest(): DigestData {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n const temp = { ...this.transaction }\n try {\n Serializer.Transaction(buffer, temp)\n } catch (cause) {\n throw new Error('Unable to serialize transaction: ' + cause)\n }\n buffer.flip()\n const transactionData = new Uint8Array(buffer.toBuffer())\n const txId = bytesToHex(sha256(transactionData)).slice(0, 40)\n const digest = sha256(new Uint8Array([...chainId, ...transactionData]))\n return { digest, txId }\n }\n\n /**\n * Adds a signature to an already created transaction. Useful when signing with external tools.\n * Multiple signatures can be added one at a time for multi-signature transactions.\n * @param signature The signature string in hex format (must be exactly 130 characters)\n * @returns The transaction with the added signature\n * @throws Error if no transaction exists or signature format is invalid\n */\n addSignature(signature: string): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .create(operations)')\n }\n if (typeof signature !== 'string') {\n throw new Error('Signature must be string')\n }\n if (signature.length !== 130) {\n throw new Error('Signature must be 130 characters long')\n }\n this.transaction.signatures.push(signature)\n return this.transaction\n }\n\n /** Get status of this transaction. Usually called internally after broadcasting. */\n async checkStatus(): Promise {\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n return callRPC('transaction_status_api.find_transaction', {\n transaction_id: this.txId,\n expiration: this.transaction?.expiration\n })\n }\n\n /**\n * Creates the transaction structure and initializes it with blockchain data.\n * Retrieves current head block information and sets up reference block data.\n * @private\n * @param expiration Transaction expiration in milliseconds\n */\n private createTransaction = async (expiration: number) => {\n const props = await callRPC('condenser_api.get_dynamic_global_properties', [])\n const bytes = hexToBytes(props.head_block_id)\n const refBlockPrefix = Number(new Uint32Array(bytes.buffer, bytes.byteOffset + 4, 1)[0])\n const expirationIso = new Date(Date.now() + expiration).toISOString().slice(0, -5)\n this.transaction = {\n expiration: expirationIso,\n extensions: [],\n operations: [],\n ref_block_num: props.head_block_number & 0xffff,\n ref_block_prefix: refBlockPrefix,\n signatures: []\n }\n }\n}\n","import bs58 from 'bs58'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PublicKey } from './PublicKey'\nimport { Signature } from './Signature'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport type KeyRole = 'owner' | 'active' | 'posting' | 'memo'\n\nconst NETWORK_ID = new Uint8Array([0x80])\n\n/**\n * ECDSA (secp256k1) private key for signing and encryption operations.\n * Handles key generation, derivation from seeds/passwords, and cryptographic operations.\n *\n * All private keys are stored internally as Uint8Array and can be converted to/from\n * Wallet Import Format (WIF) strings for storage and transmission.\n *\n * @example\n * ```typescript\n * // From WIF string\n * const key = PrivateKey.from('5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw')\n *\n * // Generate random key\n * const randomKey = PrivateKey.randomKey()\n *\n * // From username and password\n * const loginKey = PrivateKey.fromLogin('username', 'password')\n *\n * // Sign a message\n * const signature = key.sign(someHash)\n *\n * // Get public key\n * const pubKey = key.createPublic()\n * ```\n */\nexport class PrivateKey {\n key: Uint8Array\n\n constructor(key: Uint8Array) {\n this.key = key\n try {\n secp256k1.getPublicKey(key)\n } catch (e) {\n throw new Error('invalid private key')\n }\n }\n\n /**\n * Creates a PrivateKey instance from a WIF string or raw Uint8Array.\n * Automatically detects the input type and uses the appropriate method.\n *\n * @param value - WIF formatted string or raw 32-byte key as Uint8Array\n * @returns New PrivateKey instance\n * @throws Error if the key format is invalid\n */\n static from(value: string | Uint8Array): PrivateKey {\n if (typeof value === 'string') {\n return PrivateKey.fromString(value)\n } else {\n return new PrivateKey(value)\n }\n }\n\n /**\n * Creates a PrivateKey from a Wallet Import Format (WIF) encoded string.\n *\n * @param wif - WIF encoded private key string\n * @returns New PrivateKey instance\n * @throws Error if WIF format is invalid or checksum fails\n */\n static fromString(wif: string): PrivateKey {\n return new PrivateKey(decodePrivate(wif).subarray(1))\n }\n\n /**\n * Creates a PrivateKey from a seed string or Uint8Array.\n * The seed is hashed with SHA256 to produce the private key.\n *\n * @param seed - Seed string (converted to bytes) or raw byte array\n * @returns New PrivateKey instance derived from seed\n */\n static fromSeed(seed: string | Uint8Array): PrivateKey {\n if (typeof seed === 'string') {\n const isHex = /^[0-9a-fA-F]+$/.test(seed)\n if (isHex) {\n seed = hexToBytes(seed)\n } else {\n // Convert non-hex string to Uint8Array using UTF-8 encoding\n // Avoid top-level TextEncoder — not available on all runtimes (e.g. Hermes)\n const bytes: number[] = []\n for (let i = 0; i < seed.length; i++) {\n let c = seed.charCodeAt(i)\n if (c < 0x80) {\n bytes.push(c)\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < seed.length) {\n const next = seed.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n seed = new Uint8Array(bytes)\n }\n }\n return new PrivateKey(sha256(seed))\n }\n\n /**\n * Derives a PrivateKey from username, password, and role using Hive's key derivation scheme.\n * This generates the same keys that the Hive wallet uses for login-based keys.\n *\n * @param username - Hive username\n * @param password - Master password (or seed phrase)\n * @param role - Key role ('owner', 'active', 'posting', 'memo')\n * @returns New PrivateKey instance for the specified role\n */\n static fromLogin(username: string, password: string, role: KeyRole = 'active'): PrivateKey {\n const seed = username + role + password\n return PrivateKey.fromSeed(seed)\n }\n\n /**\n * Signs a 32-byte message hash using ECDSA and returns a recoverable signature.\n * The signature includes recovery information to allow public key recovery.\n *\n * @param message - 32-byte message hash to sign (Uint8Array)\n * @returns Signature object containing the signature data\n */\n sign(message: Uint8Array): Signature {\n const rv = secp256k1.sign(message, this.key, {\n extraEntropy: true,\n format: 'recovered',\n prehash: false // prehash does sha256 on the message\n })\n const recovery = parseInt(bytesToHex(rv.subarray(0, 1)), 16)\n return Signature.from((recovery + 31).toString(16) + bytesToHex(rv.subarray(1)))\n }\n\n /**\n * Derives the corresponding public key for this private key.\n *\n * @param prefix - Optional address prefix (defaults to config.address_prefix)\n * @returns PublicKey instance derived from this private key\n */\n createPublic(prefix?: string): PublicKey {\n return new PublicKey(secp256k1.getPublicKey(this.key), prefix)\n }\n\n /**\n * Returns the private key as a Wallet Import Format (WIF) encoded string.\n * This includes network ID and checksum for safe storage/transmission.\n *\n * @returns WIF encoded private key string\n */\n toString(): string {\n return encodePrivate(new Uint8Array([...NETWORK_ID, ...this.key]))\n }\n\n /**\n * Returns a masked representation of the private key for debugging/logging.\n * Shows only the first and last 6 characters to avoid accidental exposure.\n * Use toString() to get the full key for export/serialization.\n *\n * @returns Masked key representation for safe logging\n */\n inspect(): string {\n const key = this.toString()\n return `PrivateKey: ${key.slice(0, 6)}...${key.slice(-6)}`\n }\n\n /**\n * Computes a shared secret using ECDH key exchange for memo encryption.\n * The shared secret is used as a key for AES encryption/decryption.\n *\n * @param publicKey - Other party's public key\n * @returns 64-byte shared secret as Uint8Array\n */\n getSharedSecret(publicKey: PublicKey): Uint8Array {\n const s = secp256k1.getSharedSecret(this.key, publicKey.key)\n // strip the parity byte\n return sha512(s.subarray(1))\n }\n\n /**\n * Generates a new cryptographically secure random private key.\n * Uses the secp256k1 key generation algorithm for security.\n * This method may take up to 250ms due to entropy collection.\n *\n * @returns New randomly generated PrivateKey instance\n */\n static randomKey(): PrivateKey {\n return new PrivateKey(secp256k1.keygen().secretKey)\n }\n}\n\nconst doubleSha256 = (input: Uint8Array) => {\n const dbl = sha256(sha256(input))\n return dbl\n}\n\n/** Encode bs58+doubleSha256-checksum private key. */\nconst encodePrivate = (key: Uint8Array) => {\n // assert.equal(key.readUInt8(0), 0x80, 'private key network id mismatch')\n const checksum = doubleSha256(key)\n return bs58.encode(new Uint8Array([...key, ...checksum.slice(0, 4)]))\n}\n\n/** Decode bs58+doubleSha256-checksum encoded private key. */\nconst decodePrivate = (encodedKey: string) => {\n const buffer = bs58.decode(encodedKey)\n if (!isUint8ArrayEqual(buffer.slice(0, 1), NETWORK_ID)) {\n throw new Error('Private key network id mismatch')\n }\n const checksum = buffer.slice(-4)\n const key = buffer.slice(0, -4)\n const checksumVerify = doubleSha256(key).slice(0, 4)\n if (!isUint8ArrayEqual(checksum, checksumVerify)) {\n throw new Error('Private key checksum mismatch')\n }\n return key\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array) => {\n if (a === b) return true\n if (a.byteLength !== b.byteLength) return false\n const len = a.byteLength\n let i = 0\n while (i < len && a[i] === b[i]) i++\n return i === len\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { cbc as AESCBC } from '@noble/ciphers/aes.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PrivateKey } from './PrivateKey'\nimport { PublicKey } from './PublicKey'\n\nexport const encrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n message: Uint8Array,\n nonce: bigint = uniqueNonce()\n) => crypt(privateKey, publicKey, nonce, message)\n\nexport const decrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum: number\n): Uint8Array => {\n const d = crypt(privateKey, publicKey, nonce, message, checksum)\n return d.message\n}\n\n/**\n * @arg message - Encrypted or plain text message (see checksum)\n * @arg checksum - shared secret checksum (null to encrypt, non-null to decrypt)\n */\nconst crypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum?: number\n): { nonce: bigint; message: Uint8Array; checksum: number } => {\n const nonceL = nonce\n const S = privateKey.getSharedSecret(publicKey)\n let ebuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n ebuf.writeUint64(nonceL)\n ebuf.append(S)\n ebuf.flip()\n\n const encryptionKey = sha512(new Uint8Array(ebuf.toBuffer()))\n const iv = encryptionKey.subarray(32, 48)\n const tag = encryptionKey.subarray(0, 32)\n\n // check if first 64 bit of sha256 hash treated as uint64_t truncated to 32 bits.\n const check = sha256(encryptionKey).subarray(0, 4)\n const cbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n cbuf.append(check)\n cbuf.flip()\n const check32 = cbuf.readUint32()\n if (checksum !== undefined) {\n if (check32 !== checksum) {\n throw new Error('Invalid key')\n }\n message = cryptoJsDecrypt(message, tag, iv)\n } else {\n message = cryptoJsEncrypt(message, tag, iv)\n }\n return { nonce: nonceL, message, checksum: check32 }\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} ciphertext - binary format\n * @return {Uint8Array} the decrypted message\n */\nconst cryptoJsDecrypt = (message: Uint8Array, tag: Uint8Array, iv: Uint8Array): Uint8Array => {\n let messageBuffer = message\n const decipher = AESCBC(tag, iv)\n messageBuffer = decipher.decrypt(messageBuffer)\n return messageBuffer\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} plaintext - binary format\n * @return {Uint8Array} binary\n */\nexport const cryptoJsEncrypt = (\n message: Uint8Array,\n tag: Uint8Array,\n iv: Uint8Array\n): Uint8Array => {\n let messageBuffer = message\n const cipher = AESCBC(tag, iv)\n messageBuffer = cipher.encrypt(messageBuffer)\n return messageBuffer\n}\n\nlet uniqueNonceEntropy: number | null = null\n\nconst uniqueNonce = (): bigint => {\n if (uniqueNonceEntropy === null) {\n const randomPrivateKey = secp256k1.utils.randomSecretKey()\n uniqueNonceEntropy = (randomPrivateKey[0] << 8) | randomPrivateKey[1]\n }\n let long = BigInt(Date.now())\n const entropy = ++uniqueNonceEntropy % 0x10000\n long = (long << BigInt(16)) | BigInt(entropy)\n return long\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\n\nconst PublicKeyDeserializer = (buf: ByteBuffer) => {\n const c = fixedBuf(buf, 33)\n return new PublicKey(c)\n}\n\nconst UInt64Deserializer = (b: ByteBuffer) => {\n return b.readUint64()\n}\n\nconst UInt32Deserializer = (b: ByteBuffer) => {\n return b.readUint32()\n}\n\nconst BinaryDeserializer = (b: ByteBuffer) => {\n const len = b.readVarint32()\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n}\n\nconst BufferDeserializer = (keyDeserializers: any) => (buf: Uint8Array) => {\n const obj: any = {}\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n buffer.append(buf)\n buffer.flip()\n for (const [key, deserializer] of keyDeserializers) {\n try {\n obj[key] = deserializer(buffer)\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n return obj\n}\n\nfunction fixedBuf(b: ByteBuffer, len: number) {\n if (!b) {\n throw Error('No buffer found on first parameter')\n } else {\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n }\n}\n\nconst EncryptedMemoDeserializer = BufferDeserializer([\n ['from', PublicKeyDeserializer],\n ['to', PublicKeyDeserializer],\n ['nonce', UInt64Deserializer],\n ['check', UInt32Deserializer],\n ['encrypted', BinaryDeserializer]\n])\n\nexport const Deserializer = {\n Memo: EncryptedMemoDeserializer\n}\n","import bs58 from 'bs58'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Serializer } from './serializer'\nimport { PrivateKey } from './PrivateKey'\nimport * as Aes from './aes'\nimport { PublicKey } from './PublicKey'\nimport { Deserializer } from './deserializer'\n\nexport type Memo = {\n /**\n * Encrypts a memo for secure private messaging\n */\n encode(\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n ): string\n\n /**\n * Decrypts a memo message\n */\n decode(privateKey: string | PrivateKey, memo: string): string\n}\n\n/**\n * Encodes a memo using AES encryption for secure private messaging on Hive.\n * Messages must start with '#' to be encrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Sender's private memo key (string WIF format or PrivateKey instance)\n * @param publicKey - Recipient's public memo key (string or PublicKey instance)\n * @param memo - Message to encrypt (must start with '#' for encryption)\n * @param testNonce - Optional nonce for testing (advanced usage)\n * @returns Encrypted memo string prefixed with '#'\n * @throws Error if encryption is not supported in current environment\n */\nconst encode = (\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n publicKey = toPublicObj(publicKey)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.writeVString(memo)\n const memoBuffer = new Uint8Array(mbuf.copy(0, mbuf.offset).toBuffer())\n const { nonce, message, checksum } = Aes.encrypt(privateKey, publicKey, memoBuffer, testNonce)\n const mbuf2 = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n Serializer.Memo(mbuf2, {\n check: checksum,\n encrypted: message,\n from: privateKey.createPublic(),\n nonce,\n to: publicKey\n })\n mbuf2.flip()\n const data = new Uint8Array(mbuf2.toBuffer())\n return '#' + bs58.encode(data)\n}\n\n/**\n * Decrypts an encrypted memo using AES decryption.\n * Messages must start with '#' to be decrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Recipient's private memo key (string WIF format or PrivateKey instance)\n * @param memo - Encrypted memo string (must start with '#' for decryption)\n * @returns Decrypted memo content with '#' prefix\n * @throws Error if decryption fails or encryption not supported in current environment\n */\nconst decode = (privateKey: string | PrivateKey, memo: string): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n // memo = bs58.decode(memo)\n let memoBuffer = Deserializer.Memo(bs58.decode(memo))\n const { from, to, nonce, check, encrypted } = memoBuffer\n const pubkey = privateKey.createPublic().toString()\n const otherpub =\n pubkey === new PublicKey(from.key).toString() ? new PublicKey(to.key) : new PublicKey(from.key)\n memoBuffer = Aes.decrypt(privateKey, otherpub, nonce, encrypted, check)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.append(memoBuffer)\n mbuf.flip()\n return '#' + mbuf.readVString()\n}\n\nlet encodeTest: boolean | undefined\nconst checkEncryption = () => {\n if (encodeTest === undefined) {\n let plaintext\n encodeTest = true // prevent infinate looping\n try {\n const wif = '5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw'\n const pubkey = 'STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA'\n const cyphertext = encode(wif, pubkey, '#memo爱')\n plaintext = decode(wif, cyphertext)\n } finally {\n encodeTest = plaintext === '#memo爱'\n }\n }\n if (encodeTest === false) {\n throw new Error('This environment does not support encryption.')\n }\n}\n\nconst toPrivateObj = (o: string | PrivateKey): PrivateKey => {\n if (typeof o === 'string') {\n return PrivateKey.fromString(o)\n } else {\n return o\n }\n}\nconst toPublicObj = (o: string | PublicKey): PublicKey => {\n if (typeof o === 'string') {\n return PublicKey.fromString(o)\n } else {\n return o\n }\n}\n\n/**\n * Memo utilities for encrypting and decrypting private messages between Hive users.\n * Uses AES encryption with ECDH key exchange for secure communication.\n *\n * Messages must start with '#' to be encrypted/decrypted.\n * Plain text messages (without '#') are returned unchanged.\n *\n * @example\n * ```typescript\n * import { Memo, PrivateKey, PublicKey } from 'hive-tx'\n *\n * // Encrypt a message\n * const encrypted = Memo.encode(senderPrivateKey, recipientPublicKey, '#Hello World')\n *\n * // Decrypt a message\n * const decrypted = Memo.decode(recipientPrivateKey, encrypted)\n * console.log(decrypted) // '#Hello World'\n * ```\n */\nexport const Memo = {\n decode,\n encode\n}\n","import { Serializer } from './serializer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\nimport { bytesToHex } from '@noble/hashes/utils.js'\n\nexport interface WitnessProps {\n account_creation_fee?: string\n account_subsidy_budget?: number\n account_subsidy_decay?: number\n key: PublicKey | string\n maximum_block_size?: number\n new_signing_key?: PublicKey | string | null\n hbd_exchange_rate?: { base: string; quote: string }\n hbd_interest_rate?: number\n url?: string\n}\n\n/** Return null for a valid username */\nexport const validateUsername = (username: string): null | string => {\n let suffix = 'Account name should '\n if (!username) {\n return suffix + 'not be empty.'\n }\n const length = username.length\n if (length < 3) {\n return suffix + 'be longer.'\n }\n if (length > 16) {\n return suffix + 'be shorter.'\n }\n if (/\\./.test(username)) {\n suffix = 'Each account segment should '\n }\n const ref = username.split('.')\n const len = ref.length\n for (let i = 0; i < len; i++) {\n const label = ref[i]\n if (!/^[a-z]/.test(label)) {\n return suffix + 'start with a lowercase letter.'\n }\n if (!/^[a-z0-9-]*$/.test(label)) {\n return suffix + 'have only lowercase letters, digits, or dashes.'\n }\n if (!/[a-z0-9]$/.test(label)) {\n return suffix + 'end with a lowercase letter or digit.'\n }\n if (label.length < 3) {\n return suffix + 'be longer.'\n }\n }\n return null\n}\n\nexport const operations = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n pow: 14,\n custom: 15,\n report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49,\n // virtual ops\n fill_convert_request: 50,\n author_reward: 51,\n curation_reward: 52,\n comment_reward: 53,\n liquidity_reward: 54,\n interest: 55,\n fill_vesting_withdraw: 56,\n fill_order: 57,\n shutdown_witness: 58,\n fill_transfer_from_savings: 59,\n hardfork: 60,\n comment_payout_update: 61,\n return_vesting_delegation: 62,\n comment_benefactor_reward: 63,\n producer_reward: 64,\n clear_null_account_balance: 65,\n proposal_pay: 66,\n sps_fund: 67,\n hardfork_hive: 68,\n hardfork_hive_restore: 69,\n delayed_voting: 70,\n consolidate_treasury_balance: 71,\n effective_comment_vote: 72,\n ineffective_delete_comment: 73,\n sps_convert: 74,\n expired_account_notification: 75,\n changed_recovery_account: 76,\n transfer_to_vesting_completed: 77,\n pow_reward: 78,\n vesting_shares_split: 79,\n account_created: 80,\n fill_collateralized_convert_request: 81,\n system_warning: 82,\n fill_recurrent_transfer: 83,\n failed_recurrent_transfer: 84,\n limit_order_cancelled: 85,\n producer_missed: 86,\n proposal_fee: 87,\n collateralized_convert_immediate_conversion: 88,\n escrow_approved: 89,\n escrow_rejected: 90,\n proxy_cleared: 91,\n declined_voting_rights: 92\n}\n\n/**\n * Make bitmask filter to be used with get_account_history call\n */\nexport const makeBitMaskFilter = (allowedOperations: number[]): [string | null, string | null] => {\n return allowedOperations\n .reduce(reduceFunction, [BigInt(0), BigInt(0)])\n .map((value: bigint) => (value !== BigInt(0) ? value.toString() : null)) as [string | null, string | null]\n}\nconst reduceFunction = (\n [low, high]: [bigint, bigint],\n allowedOperation: number\n): [bigint, bigint] => {\n if (allowedOperation < 64) {\n return [low | (BigInt(1) << BigInt(allowedOperation)), high]\n } else {\n return [low, high | (BigInt(1) << BigInt(allowedOperation - 64))]\n }\n}\n\nexport const buildWitnessSetProperties = (\n owner: string,\n props: WitnessProps\n): ['witness_set_properties', { extensions: never[]; owner: string; props: any }] => {\n const data = {\n extensions: [],\n owner,\n props: []\n }\n for (const key of Object.keys(props)) {\n if ((props as any)[key] === undefined) continue\n let type\n switch (key) {\n case 'key':\n case 'new_signing_key':\n type = Serializer.PublicKey\n break\n case 'account_subsidy_budget':\n case 'account_subsidy_decay':\n case 'maximum_block_size':\n type = Serializer.UInt32\n break\n case 'hbd_interest_rate':\n type = Serializer.UInt16\n break\n case 'url':\n type = Serializer.String\n break\n case 'hbd_exchange_rate':\n type = Serializer.Price\n break\n case 'account_creation_fee':\n type = Serializer.Asset\n break\n default:\n throw new Error(`Unknown witness prop: ${key}`)\n }\n data.props.push([key, serialize(type, props[key])])\n }\n data.props.sort((a: any, b: any) => a[0].localeCompare(b[0]))\n return ['witness_set_properties', data]\n}\n\nconst serialize = (serializer: any, data: any) => {\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n serializer(buffer, data)\n buffer.flip()\n // `props` values must be hex\n return bytesToHex(new Uint8Array(buffer.toBuffer()))\n}\n","/**\n * Re-exports hive-tx APIs and provides helper functions that bridge\n * API differences from the legacy dhive library.\n */\n\nimport {\n PrivateKey,\n Transaction,\n callRPCBroadcast,\n type BroadcastResult,\n} from \"../../hive-tx\";\nimport type { Operation, OperationName, OperationBody } from \"../../hive-tx\";\nimport { sha256 as nobleSha256 } from \"@noble/hashes/sha2.js\";\n\n// ── Re-exports ─────────────────────────────────────────────────────────────\n\nexport {\n Transaction as HiveTxTransaction,\n PrivateKey,\n PublicKey,\n Signature,\n Memo,\n config as hiveTxConfig,\n callRPC,\n callRPCBroadcast,\n callREST,\n callWithQuorum,\n utils as hiveTxUtils,\n} from \"../../hive-tx\";\n\nexport type {\n Operation,\n OperationName,\n OperationBody,\n AssetSymbol,\n BroadcastResult,\n AccountCreateOperation,\n CustomJsonOperation,\n // Referenced in ConfigManager.setResilience's public signature — must be\n // nameable from the main entry, not only from @ecency/sdk/hive.\n ResilienceOptions,\n} from \"../../hive-tx\";\n\n// ── Compat types (matching dhive shapes used throughout the codebase) ──────\n\n/** Compatible with dhive's TransactionConfirmation from broadcast_transaction_synchronous */\nexport interface TransactionConfirmation {\n id: string;\n block_num: number;\n trx_num: number;\n expired: boolean;\n}\n\n/** Authority role type used in key management */\nexport type AuthorityType = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\n/** SMT asset format (NAI representation) used in transaction history */\nexport interface SMTAsset {\n amount: string;\n precision: number;\n nai: string;\n}\n\n/** RC account data from rc_api.find_rc_accounts */\nexport interface RCAccount {\n account: string;\n rc_manabar: {\n current_mana: string | number;\n last_update_time: number;\n };\n max_rc: string | number;\n max_rc_creation_adjustment: {\n amount: string;\n precision: number;\n nai: string;\n };\n delegated_rc: number;\n received_delegated_rc: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Compute SHA-256 hash of a string or Uint8Array.\n * Drop-in replacement for dhive's `cryptoUtils.sha256()`.\n */\nexport function sha256(input: string | Uint8Array): Uint8Array {\n let data: Uint8Array;\n if (typeof input === \"string\") {\n // Inline UTF-8 encode — avoids TextEncoder which is unavailable on some\n // runtimes (React Native / Hermes).\n const bytes: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c < 0x80) {\n bytes.push(c);\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const next = input.charCodeAt(++i);\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff);\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n }\n }\n data = new Uint8Array(bytes);\n } else {\n data = input;\n }\n return nobleSha256(data);\n}\n\n/** Check if a string is a valid WIF-encoded private key. */\nexport function isWif(key: string): boolean {\n try {\n PrivateKey.fromString(key);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sign and broadcast operations, returning a dhive-compatible TransactionConfirmation.\n *\n * Uses broadcast_transaction_synchronous so the response includes block_num/trx_num,\n * matching the shape that the rest of the codebase expects from dhive's\n * `client.broadcast.sendOperations()`.\n *\n * @deprecated Prefer {@link broadcastOperationsAsync} (the default for\n * `useBroadcastMutation`); poll `transaction_status_api` if you need block\n * confirmation. Kept only for explicit `broadcastMode: 'sync'` opt-ins.\n */\nexport async function broadcastOperations(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return callRPCBroadcast(\"condenser_api.broadcast_transaction_synchronous\", [\n tx.transaction,\n ]);\n}\n\n/**\n * Sign and broadcast operations without waiting for block inclusion.\n *\n * Uses broadcast_transaction which returns as soon as the node accepts the\n * transaction into its mempool. Transport and RPC errors (network failures,\n * invalid operations, expired transactions) are still thrown immediately -\n * the only thing skipped is the wait for the transaction to appear in a block.\n *\n * Returns { tx_id, status: 'unknown' }. To confirm block inclusion afterward,\n * poll transaction_status_api with the returned tx_id.\n *\n * Prefer this for operations where faster response matters more than\n * immediate confirmation (e.g. votes, reblogs, follows).\n *\n * Use broadcastOperations() when you need block_num/trx_num confirmation\n * (e.g. transfers, account updates, key changes).\n */\nexport async function broadcastOperationsAsync(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return tx.broadcast(false);\n}\n\n// ── Mana calculations (ported from dhive's RCAPI) ──────────────────────────\n\ninterface Manabar {\n current_mana: string | number;\n last_update_time: number;\n}\n\ninterface ManaResult {\n current_mana: number;\n max_mana: number;\n percentage: number;\n}\n\nconst MANA_REGENERATION_SECONDS = 432000; // 5 days\n\nfunction calculateManabar(maxMana: number, manabar: Manabar): ManaResult {\n const delta = Date.now() / 1000 - manabar.last_update_time;\n let currentMana =\n Number(manabar.current_mana) +\n (delta * maxMana) / MANA_REGENERATION_SECONDS;\n let percentage = Math.round((currentMana / maxMana) * 10000);\n if (!isFinite(percentage) || percentage < 0) {\n percentage = 0;\n } else if (percentage > 10000) {\n percentage = 10000;\n }\n return { current_mana: currentMana, max_mana: maxMana, percentage };\n}\n\n/**\n * Get effective vesting shares for an account (matching dhive's getVests).\n * Subtracts delegated, adds received, accounts for pending withdrawals.\n */\nfunction getVests(account: any): number {\n const vests = parseFloat(account.vesting_shares);\n const delegated = parseFloat(account.delegated_vesting_shares);\n const received = parseFloat(account.received_vesting_shares);\n const withdrawRate = parseFloat(account.vesting_withdraw_rate);\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n return vests - withdrawVests - delegated + received;\n}\n\n/** Calculate voting power mana (equivalent to dhive client.rc.calculateVPMana) */\nexport function calculateVPMana(account: any): ManaResult {\n const maxMana = getVests(account) * 1e6;\n return calculateManabar(maxMana, account.voting_manabar);\n}\n\n/** Calculate RC mana (equivalent to dhive client.rc.calculateRCMana) */\nexport function calculateRCMana(rcAccount: RCAccount): ManaResult {\n return calculateManabar(\n Number(rcAccount.max_rc),\n rcAccount.rc_manabar\n );\n}\n\n// setHiveTxNodes and initHiveTx removed — config is now unified.\n// Use hiveTxConfig directly or ConfigManager.setHiveNodes().\n","/**\n * Chain error handling utilities\n * Extracted from web's operations.ts and mobile's dhive.ts error handling patterns\n */\n\nexport enum ErrorType {\n COMMON = \"common\",\n INFO = \"info\",\n INSUFFICIENT_RESOURCE_CREDITS = \"insufficient_resource_credits\",\n MISSING_AUTHORITY = \"missing_authority\",\n TOKEN_EXPIRED = \"token_expired\",\n NETWORK = \"network\",\n TIMEOUT = \"timeout\",\n VALIDATION = \"validation\",\n}\n\nexport interface ParsedChainError {\n message: string;\n type: ErrorType;\n originalError?: any;\n}\n\n/**\n * Parses Hive blockchain errors into standardized format.\n * Extracted from web's operations.ts and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string from a blockchain operation\n * @returns Parsed error with user-friendly message and categorized type\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * const parsed = parseChainError(error);\n * console.log(parsed.message); // \"Insufficient Resource Credits. Please wait or power up.\"\n * console.log(parsed.type); // ErrorType.INSUFFICIENT_RESOURCE_CREDITS\n * }\n * ```\n */\nexport function parseChainError(error: any): ParsedChainError {\n // Extract error strings from various error formats\n // Check both error_description and message independently for pattern matching\n const errorDescription = error?.error_description ? String(error.error_description) : '';\n const errorMessage = error?.message ? String(error.message) : '';\n // HiveSigner throws plain objects like { error: \"unauthorized\", error_description: \"...\" }\n const errorCode = error?.error ? String(error.error) : '';\n const errorString = errorDescription || errorMessage || String(error || '');\n\n // Helper function to test patterns against all error fields\n const testPattern = (pattern: RegExp): boolean => {\n // Check error code first (e.g. HiveSigner's { error: \"unauthorized\" })\n if (errorCode && pattern.test(errorCode)) return true;\n // Check error_description (priority)\n if (errorDescription && pattern.test(errorDescription)) return true;\n // Then check message\n if (errorMessage && pattern.test(errorMessage)) return true;\n // Finally check fallback errorString (handles plain string inputs)\n if (errorString && pattern.test(errorString)) return true;\n return false;\n };\n\n // Resource credits (from both web and mobile patterns)\n if (\n testPattern(/please wait to transact/i) ||\n testPattern(/insufficient rc/i) ||\n testPattern(/rc mana|rc account|resource credits/i)\n ) {\n return {\n message: \"Insufficient Resource Credits. Please wait or power up.\",\n type: ErrorType.INSUFFICIENT_RESOURCE_CREDITS,\n originalError: error,\n };\n }\n\n // Min comment interval (from web operations.ts line 29)\n if (testPattern(/you may only post once every/i)) {\n return {\n message: \"Please wait before posting again (minimum 3 second interval between comments).\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Identical vote (from web operations.ts line 31)\n if (testPattern(/your current vote on this comment is identical/i)) {\n return {\n message: \"You have already voted with the same weight.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Must claim something (from web operations.ts line 33)\n if (testPattern(/must claim something/i)) {\n return {\n message: \"You must claim rewards before performing this action.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot claim that much VESTS (from web operations.ts line 35)\n if (testPattern(/cannot claim that much vests/i)) {\n return {\n message: \"Cannot claim that amount. Please check your pending rewards.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot delete comment with positive votes (from web operations.ts line 42)\n if (testPattern(/cannot delete a comment with net positive/i)) {\n return {\n message: \"Cannot delete a comment with positive votes.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Comment has children (from web operations.ts line 44)\n if (testPattern(/children == 0/i)) {\n return {\n message: \"Cannot delete a comment with replies.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Comment already paid out (from web operations.ts line 46)\n if (testPattern(/comment_cashout/i)) {\n return {\n message: \"Cannot modify a comment that has already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Voting on paid out post (from web operations.ts line 48)\n if (testPattern(/votes evaluating for comment that is paid out is forbidden/i)) {\n return {\n message: \"Cannot vote on posts that have already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // No key available (SDK internal - from broadcastWithMethod when key not stored)\n if (testPattern(/no (active|owner|posting|memo) key available/i)) {\n return {\n message: \"Key not available. Please provide your key to sign this operation.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing active authority. Hive nodes return \"missing required active\n // authority\"; web operations.ts also throws the short form. Match both so the\n // auth fallback (auth-upgrade dialog) fires instead of misclassifying as a\n // generic chain error.\n if (testPattern(/missing (required )?active authority/i)) {\n return {\n message: \"Missing active authority. This operation requires your active key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing owner authority (\"missing required owner authority\" or short form)\n if (testPattern(/missing (required )?owner authority/i)) {\n return {\n message: \"Missing owner authority. This operation requires your owner key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing posting authority (general pattern)\n if (testPattern(/missing (required )?posting authority/i)) {\n return {\n message: \"Missing posting authority. Please check your login method.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Token expired / unauthorized (HiveSigner OAuth2 errors + general patterns)\n // HiveSigner returns: { error: \"invalid_grant\" } for invalid/expired tokens,\n // { error: \"unauthorized_access\" } for IP-based access denial\n if (\n errorCode === 'invalid_grant' ||\n errorCode === 'unauthorized_access' ||\n testPattern(/token expired/i) ||\n testPattern(/invalid token/i) ||\n testPattern(/\\bunauthorized\\b/i) ||\n testPattern(/\\bforbidden\\b/i)\n ) {\n return {\n message: \"Authentication token expired. Please log in again.\",\n type: ErrorType.TOKEN_EXPIRED,\n originalError: error,\n };\n }\n\n // Already reblogged\n if (testPattern(/has already reblogged/i) || testPattern(/already reblogged this post/i)) {\n return {\n message: \"You have already reblogged this post.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Duplicate transaction\n if (testPattern(/duplicate transaction/i)) {\n return {\n message: \"This transaction has already been processed.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Network errors (more specific patterns to avoid false positives)\n if (\n testPattern(/econnrefused/i) ||\n testPattern(/connection refused/i) ||\n testPattern(/failed to fetch/i) ||\n testPattern(/\\bnetwork[-\\s]?(request|error|timeout|unreachable|down|failed)\\b/i)\n ) {\n return {\n message: \"Network error. Please check your connection and try again.\",\n type: ErrorType.NETWORK,\n originalError: error,\n };\n }\n\n // Timeout errors\n if (testPattern(/timeout/i) || testPattern(/timed out/i)) {\n return {\n message: \"Request timed out. Please try again.\",\n type: ErrorType.TIMEOUT,\n originalError: error,\n };\n }\n\n // Account doesn't exist\n if (testPattern(/account.*does not exist/i) || testPattern(/account not found/i)) {\n return {\n message: \"Account not found. Please check the username.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Invalid memo key\n if (testPattern(/invalid memo key/i)) {\n return {\n message: \"Invalid memo key. Cannot encrypt message.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Insufficient funds (require both words in same string to avoid cross-field false positives)\n if (testPattern(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i)) {\n return {\n message: \"Insufficient funds for this transaction.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Generic validation errors (use word boundaries to be more specific)\n if (testPattern(/\\b(invalid|validation)\\b/i)) {\n // Truncate to 150 chars like other branches\n const message = (error?.message || errorString).substring(0, 150) || \"Validation error occurred\";\n return {\n message,\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Default: return original error message\n // Check for error_description first (from web operations.ts line 65-72)\n if (error?.error_description && typeof error.error_description === \"string\") {\n return {\n message: error.error_description.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Then check message field\n if (error?.message && typeof error.message === \"string\") {\n return {\n message: error.message.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Handle plain objects without message property (avoid \"[object Object]\")\n let message: string;\n if (typeof error === 'object' && error !== null) {\n // Check for common error properties\n if (error.error_description) {\n message = String(error.error_description);\n } else if (error.code) {\n message = `Error code: ${error.code}`;\n } else if (errorString && errorString !== '[object Object]') {\n message = errorString.substring(0, 150);\n } else {\n message = \"Unknown error occurred\";\n }\n } else {\n message = errorString.substring(0, 150) || \"Unknown error occurred\";\n }\n\n return {\n message,\n type: ErrorType.COMMON,\n originalError: error,\n };\n}\n\n/**\n * Formats error for display to user.\n * Returns tuple of [message, type] for backward compatibility with existing code.\n *\n * This function maintains compatibility with the old formatError signature from\n * web's operations.ts (line 59-84) and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string\n * @returns Tuple of [user-friendly message, error type]\n *\n * @example\n * ```typescript\n * try {\n * await transfer(...);\n * } catch (error) {\n * const [message, type] = formatError(error);\n * showToast(message, type);\n * }\n * ```\n */\nexport function formatError(error: any): [string, ErrorType] {\n const parsed = parseChainError(error);\n return [parsed.message, parsed.type];\n}\n\n/**\n * Checks if error indicates missing authority and should trigger auth fallback.\n * Used by the SDK's useBroadcastMutation to determine if it should retry with\n * an alternate authentication method.\n *\n * @param error - The error object or string\n * @returns true if auth fallback should be attempted\n *\n * @example\n * ```typescript\n * try {\n * await broadcast(operations);\n * } catch (error) {\n * if (shouldTriggerAuthFallback(error)) {\n * // Try with alternate auth method\n * await broadcastWithHiveAuth(operations);\n * }\n * }\n * ```\n */\nexport function shouldTriggerAuthFallback(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.MISSING_AUTHORITY || type === ErrorType.TOKEN_EXPIRED;\n}\n\n/**\n * Checks if error is a resource credits (RC) error.\n * Useful for showing specific UI feedback about RC issues.\n *\n * @param error - The error object or string\n * @returns true if the error is related to insufficient RC\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * if (isResourceCreditsError(error)) {\n * showRCWarning(); // Show specific RC education/power up UI\n * }\n * }\n * ```\n */\nexport function isResourceCreditsError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INSUFFICIENT_RESOURCE_CREDITS;\n}\n\n/**\n * Checks if error is informational (not critical).\n * Informational errors typically don't need retry logic.\n *\n * @param error - The error object or string\n * @returns true if the error is informational\n */\nexport function isInfoError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INFO;\n}\n\n/**\n * Checks if error is network-related and should be retried.\n *\n * @param error - The error object or string\n * @returns true if the error is network-related\n */\nexport function isNetworkError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.NETWORK || type === ErrorType.TIMEOUT;\n}\n","import {\n useMutation,\n type MutationKey,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { PrivateKey, RPCError } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { broadcastOperations, broadcastOperationsAsync, type TransactionConfirmation } from \"@/modules/core/hive-tx\";\nimport type { BroadcastResult } from \"../../../hive-tx\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { shouldTriggerAuthFallback } from \"@/modules/core/errors\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport hs from \"hivesigner\";\n\n/**\n * Broadcast mode controls whether the SDK waits for block inclusion.\n *\n * - `'async'` (default): Uses `broadcast_transaction` — returns once the node\n * accepts the transaction into its mempool. Transport and RPC errors are\n * still thrown immediately; only the block-inclusion wait is skipped.\n *\n * - `'sync'`: Uses `broadcast_transaction_synchronous` — waits for block\n * inclusion and returns `block_num`/`trx_num`. Deprecated; prefer `'async'`\n * and poll `transaction_status_api` if you need block confirmation.\n */\nexport type BroadcastMode = 'sync' | 'async';\n\n/**\n * Broadcasts operations using a specific auth method.\n *\n * @param method - Auth method to use ('key', 'hiveauth', 'hivesigner', 'keychain', 'custom')\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and configuration\n * @param authority - Key authority to use (posting, active, owner, or memo)\n * @param fetchedKey - Optional pre-fetched key to avoid duplicate fetches\n * @param fetchedToken - Optional pre-fetched access token to avoid duplicate fetches\n * @param broadcastMode - Whether to wait for block inclusion ('sync') or just mempool acceptance ('async')\n * @returns Transaction confirmation from the blockchain\n * @throws Error if method is not available or broadcast fails\n */\nasync function broadcastWithMethod(\n method: string,\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n fetchedKey?: string | null,\n fetchedToken?: string | null,\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n switch (method) {\n case 'key': {\n if (!adapter) {\n throw new Error('No adapter provided for key-based auth');\n }\n\n // Use pre-fetched key if provided, otherwise fetch it\n let key: string | null | undefined = fetchedKey;\n\n if (key === undefined) {\n // Key not pre-fetched, fetch it now based on authority\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n } else {\n throw new Error(\n `Owner key not supported by adapter. Owner operations (like account recovery) ` +\n `require master password login or manual key entry.`\n );\n }\n break;\n\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n } else {\n throw new Error(\n `Memo key not supported by adapter. Use memo encryption methods instead.`\n );\n }\n break;\n\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n }\n\n if (!key) {\n throw new Error(`No ${authority} key available for ${username}`);\n }\n\n // Attempt broadcast with key\n const privateKey = PrivateKey.fromString(key);\n if (broadcastMode === 'async') {\n return await broadcastOperationsAsync(ops, privateKey);\n }\n return await broadcastOperations(ops, privateKey);\n }\n\n case 'hiveauth': {\n if (!adapter?.broadcastWithHiveAuth) {\n throw new Error('HiveAuth not supported by adapter');\n }\n return await adapter.broadcastWithHiveAuth(username, ops, authority);\n }\n\n case 'hivesigner': {\n if (!adapter) {\n throw new Error('No adapter provided for HiveSigner auth');\n }\n\n // Access tokens only have posting authority — for active/owner/memo ops,\n // go directly to platform-specific HiveSigner broadcast (e.g., redirect to hivesigner.com)\n if (authority !== 'posting') {\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw new Error(`HiveSigner access token cannot sign ${authority} operations. No platform broadcast available.`);\n }\n\n // Try direct API broadcast with access token first (posting ops only)\n const token = fetchedToken !== undefined\n ? fetchedToken\n : await adapter.getAccessToken(username);\n\n if (token) {\n try {\n const client = new hs.Client({ accessToken: token });\n const response = await client.broadcast(ops);\n return response.result;\n } catch (tokenError) {\n // Token broadcast failed — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner && shouldTriggerAuthFallback(tokenError)) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw tokenError;\n }\n }\n\n // No token available — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n\n throw new Error(`No access token available for ${username}`);\n }\n\n case 'keychain': {\n if (!adapter?.broadcastWithKeychain) {\n throw new Error('Keychain not supported by adapter');\n }\n return await adapter.broadcastWithKeychain(username, ops, authority);\n }\n\n case 'custom': {\n if (!auth?.broadcast) {\n throw new Error('No custom broadcast function provided');\n }\n return (await auth.broadcast(ops, authority)) as TransactionConfirmation;\n }\n\n default:\n throw new Error(`Unknown auth method: ${method}`);\n }\n}\n\n/**\n * Attempts to broadcast operations using multiple auth methods in fallback chain.\n * Implements sophisticated fallback pattern from mobile app.\n *\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and fallback configuration\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n * @returns Transaction confirmation from the blockchain\n * @throws Error if all auth methods fail or if a non-auth error occurs\n *\n * @remarks\n * **Preferred Behavior (when adapter.getLoginType exists):**\n * - Calls adapter.getLoginType() to determine user's actual auth method\n * - Uses ONLY that method (no fallbacks) - more predictable and faster\n * - If it fails, throws the error immediately\n *\n * **Fallback Behavior (for backward compatibility):**\n * - Tries each auth method in the fallback chain order\n * - Only continues to next method if error is auth-related (missing authority, token expired)\n * - Stops immediately for non-auth errors (RC exhaustion, network errors, validation errors)\n * - Collects all errors and provides detailed failure message\n *\n * @example\n * ```typescript\n * // Preferred: Adapter with getLoginType (single method, no fallbacks)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter, // includes getLoginType()\n * };\n *\n * // Legacy: Explicit fallback chain (tries multiple methods)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter,\n * fallbackChain: ['key', 'hiveauth', 'hivesigner'],\n * };\n * ```\n */\nasync function broadcastWithFallback(\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n // PREFERRED APPROACH: If adapter provides getLoginType, use smart auth strategy\n // This avoids unnecessary fallback attempts and is more predictable\n if (adapter?.getLoginType) {\n const loginType = await adapter.getLoginType(username, authority);\n\n if (loginType) {\n // SMART AUTH STRATEGY: Optimize based on login type + authority + credentials\n\n // Check if user has granted ecency.app posting authority\n const hasPostingAuth = adapter.hasPostingAuthorization\n ? await adapter.hasPostingAuthorization(username)\n : false;\n\n // OPTIMIZATION: Use HiveSigner token for posting ops when posting auth is granted\n // This is faster than direct key signing or HiveAuth for key-based logins\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'key'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to direct key signing if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to key:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for keychain/MetaMask users with posting auth (faster, no popup)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'keychain'\n ) {\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n console.warn('[SDK] HiveSigner token auth failed, falling back to keychain/snap:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for HiveAuth users with posting auth (faster)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'hiveauth'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to HiveAuth if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to HiveAuth:', error);\n }\n }\n\n // Use user's actual login method\n try {\n return await broadcastWithMethod(loginType, username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Check if error is due to missing authority (e.g., posting key trying active op)\n if (shouldTriggerAuthFallback(error)) {\n // Show auth upgrade UI if available (only for posting/active operations)\n if (\n adapter.showAuthUpgradeUI &&\n (authority === 'posting' || authority === 'active')\n ) {\n // Guard against empty operations array\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n\n // User selected a specific method - delegate to broadcastWithMethod\n // This handles all auth methods (hiveauth, hivesigner, key, keychain, custom, etc.)\n // broadcastWithMethod already contains all necessary validation and method-specific logic\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // Not an auth error, or no upgrade UI available - throw original error\n throw error;\n }\n }\n\n // loginType is null — user's auth method is unknown (e.g., incomplete login data)\n if (authority === 'posting') {\n // For posting ops, try HiveSigner — access token is usually available for all logins\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (hsError) {\n if (shouldTriggerAuthFallback(hsError) && adapter.showAuthUpgradeUI) {\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`No login type available for ${username}. Please log in again.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n throw hsError;\n }\n } else if (authority === 'active' && adapter.showAuthUpgradeUI) {\n // For active ops, show auth upgrade dialog — no silent fallback possible\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // FALLBACK APPROACH: For backward compatibility, use fallback chain\n // This is only used if adapter doesn't provide getLoginType\n const chain = auth?.fallbackChain ?? ['key', 'hiveauth', 'hivesigner', 'keychain', 'custom'];\n const errors: Map = new Map();\n\n for (const method of chain) {\n try {\n // Check if method is available before attempting\n let shouldSkip = false;\n let skipReason = '';\n let prefetchedKey: string | null | undefined;\n let prefetchedToken: string | null | undefined;\n\n switch (method) {\n case 'key':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch key to check availability (will be reused in broadcast)\n let key: string | null | undefined;\n\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n }\n break;\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n }\n break;\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n\n if (!key) {\n shouldSkip = true;\n skipReason = `No ${authority} key available`;\n } else {\n prefetchedKey = key; // Store for reuse\n }\n }\n break;\n case 'hiveauth':\n if (!adapter?.broadcastWithHiveAuth) {\n shouldSkip = true;\n skipReason = 'HiveAuth not supported by adapter';\n }\n break;\n case 'hivesigner':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch token if available (will be reused in broadcast)\n const token = await adapter.getAccessToken(username);\n if (token) {\n prefetchedToken = token; // Store for reuse\n }\n // When no token but adapter exists, don't skip —\n // broadcastWithMethod can fall back to adapter.broadcastWithHiveSigner\n }\n break;\n case 'keychain':\n if (!adapter?.broadcastWithKeychain) {\n shouldSkip = true;\n skipReason = 'Keychain not supported by adapter';\n }\n break;\n case 'custom':\n if (!auth?.broadcast) {\n shouldSkip = true;\n skipReason = 'No custom broadcast function provided';\n }\n break;\n }\n\n if (shouldSkip) {\n errors.set(method, new Error(`Skipped: ${skipReason}`));\n continue;\n }\n\n // Method is available, attempt broadcast with pre-fetched credentials\n return await broadcastWithMethod(method, username, ops, auth, authority, prefetchedKey, prefetchedToken, broadcastMode);\n } catch (error) {\n // Record actual error from failed broadcast attempt\n errors.set(method, error as Error);\n\n // Only continue fallback if error suggests trying another method\n if (!shouldTriggerAuthFallback(error)) {\n // If it's not an auth error, throw immediately (e.g., RC error, network error)\n throw error;\n }\n }\n }\n\n // FIX #2: Improved error message distinguishes between skips and real failures\n const hasRealAttempts = Array.from(errors.values()).some(\n error => !error.message.startsWith('Skipped:')\n );\n\n if (!hasRealAttempts) {\n // All methods were skipped (none attempted)\n const skipReasons = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n throw new Error(\n `[SDK][Broadcast] No auth methods attempted for ${username}. ${skipReasons}`\n );\n }\n\n // At least one method was attempted but all failed\n const errorMessages = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n\n throw new Error(\n `[SDK][Broadcast] All auth methods failed for ${username}. Errors: ${errorMessages}`\n );\n}\n\n/**\n * React Query mutation hook for broadcasting Hive operations.\n * Supports multiple authentication methods with automatic fallback.\n *\n * @template T - Type of the mutation payload\n * @param mutationKey - React Query mutation key for cache management\n * @param username - Hive username (required for broadcast)\n * @param operations - Function that converts payload to Hive operations\n * @param onSuccess - Success callback after broadcast completes\n * @param auth - Authentication context (supports both legacy AuthContext and new AuthContextV2)\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Authentication Flow:**\n *\n * 1. **With AuthContextV2 + adapter + enableFallback** (recommended for new code):\n * - Tries auth methods in fallbackChain order\n * - Smart fallback: only retries on auth errors, not RC/network errors\n * - Uses platform adapter for storage, UI, and broadcasting\n *\n * 2. **With legacy AuthContext** (backward compatible):\n * - Tries auth.broadcast() first (custom implementation)\n * - Falls back to postingKey if available\n * - Falls back to accessToken (HiveSigner) if available\n * - Throws if no auth method available\n *\n * **Backward Compatibility:**\n * - All existing code using AuthContext will continue to work\n * - AuthContextV2 extends AuthContext, so it's a drop-in replacement\n * - enableFallback defaults to false if no adapter provided\n *\n * @example\n * ```typescript\n * // New pattern with platform adapter and fallback\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * },\n * 'posting'\n * );\n *\n * // Legacy pattern (still works)\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * { postingKey: 'wif-key' }\n * );\n * ```\n */\nexport function useBroadcastMutation(\n mutationKey: MutationKey = [],\n username: string | undefined,\n operations: (payload: T) => Operation[],\n onSuccess: UseMutationOptions[\"onSuccess\"] = () => {},\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n options?: {\n onMutate?: UseMutationOptions[\"onMutate\"];\n onError?: UseMutationOptions[\"onError\"];\n onSettled?: UseMutationOptions[\"onSettled\"];\n /**\n * Controls whether to wait for block inclusion or just mempool acceptance.\n *\n * - `'async'` (default): Returns after mempool acceptance. Recommended for\n * all operations; errors are still thrown immediately.\n *\n * - `'sync'`: Waits for block inclusion, returns block_num/trx_num.\n * Deprecated; prefer `'async'`.\n */\n broadcastMode?: BroadcastMode;\n }\n) {\n const broadcastMode = options?.broadcastMode ?? 'async';\n\n return useMutation({\n onSuccess,\n onMutate: options?.onMutate,\n onError: options?.onError,\n onSettled: options?.onSettled,\n mutationKey: [...mutationKey, username],\n mutationFn: async (payload: T) => {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n\n const ops = operations(payload);\n\n try {\n // New: Try auth methods in fallback chain (if enabled)\n if (auth?.enableFallback !== false && auth?.adapter) {\n return await broadcastWithFallback(username, ops, auth, authority, broadcastMode);\n }\n\n // Legacy behavior: try methods in fixed order (backward compatible)\n if (auth?.broadcast) {\n return await auth.broadcast(ops, authority);\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n // Legacy auth only supports posting authority\n if (authority !== 'posting') {\n throw new Error(\n `[SDK][Broadcast] Legacy auth only supports posting authority, but '${authority}' was requested. ` +\n `Use AuthContextV2 with an adapter for ${authority} operations.`\n );\n }\n\n const privateKey = PrivateKey.fromString(postingKey);\n\n return await broadcastOperations(\n ops,\n privateKey\n );\n }\n\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const client = new hs.Client({ accessToken });\n const response = await client.broadcast(ops);\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n } catch (e) {\n if (e instanceof RPCError) {\n // Normalize raw blockchain rejections (missing authority, RC exhaustion,\n // validation failures) from every broadcast path — sync and async — into\n // a plain Error whose message is preserved for downstream classification\n // (formatError), so React Query captures a handled mutation error.\n throw new Error(e.message);\n }\n throw e\n }\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\nimport hs from \"hivesigner\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport async function broadcastJson(\n username: string | undefined,\n id: string,\n payload: T,\n auth?: AuthContextV2\n) {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n const jjson = {\n id,\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify(payload),\n };\n\n if (auth?.broadcast) {\n return auth.broadcast([[\"custom_json\", jjson]], \"posting\");\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n const privateKey = PrivateKey.fromString(postingKey);\n\n return broadcastOperations(\n [[\"custom_json\", jjson]],\n privateKey\n );\n }\n\n // With hivesigner access token\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const response = await new hs.Client({\n accessToken,\n }).customJson([], [username], id, JSON.stringify(payload));\n return response.result;\n }\n\n /*\n * Adapter, as a last resort rather than first.\n *\n * `auth.broadcast` above is the deprecated V1 field, and an AuthContextV2\n * does not carry it, so a Keychain user whose posting key is not stored and\n * who has no HiveSigner token reached the throw below instead of being asked\n * to sign. The web app passes V2 everywhere (`getSdkAuthContext`), so this is\n * reachable today from follow and unfollow.\n *\n * Placed last on purpose: every branch above already works for the sessions\n * that reach it, and reordering would change which method signs for people\n * it currently serves. This only claims cases that were previously errors.\n */\n const adapter = auth?.adapter;\n if (adapter) {\n const ops: Parameters>[1] =\n [[\"custom_json\", jjson]];\n\n if (auth?.loginType === \"keychain\" && adapter.broadcastWithKeychain) {\n return adapter.broadcastWithKeychain(username, ops, \"posting\");\n }\n if (auth?.loginType === \"hiveauth\" && adapter.broadcastWithHiveAuth) {\n return adapter.broadcastWithHiveAuth(username, ops, \"posting\");\n }\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n}\n","import type { BroadcastMode } from \"./use-broadcast-mutation\";\nimport type { PlatformAdapter } from \"@/modules/core/types\";\n\n/**\n * Delay (ms) before invalidating chain-derived queries after an async\n * broadcast. ~1.3 Hive blocks (3s/block) so the just-broadcast transaction has\n * landed in a block before we refetch — otherwise the refetch returns pre-tx\n * state (e.g. a stale wallet balance).\n */\nexport const BROADCAST_INCLUSION_DELAY_MS = 4000;\n\n/**\n * Invalidate queries after a broadcast, accounting for broadcast mode.\n *\n * - `'sync'`: the transaction already waited for block inclusion, so refetch\n * immediately (returns the adapter's promise so callers may await it).\n * - `'async'` (default) / undefined: the transaction is only in the mempool, so\n * a refetch now would read pre-tx state — defer by ~1 block.\n *\n * No-ops when the adapter can't invalidate.\n */\nexport function invalidateAfterBroadcast(\n adapter: PlatformAdapter | null | undefined,\n broadcastMode: BroadcastMode | undefined,\n keys: any[][]\n): void | Promise {\n if (!adapter?.invalidateQueries) return;\n if (broadcastMode === \"sync\") {\n // Method call (not an extracted reference) so `this` stays bound to adapter.\n return adapter.invalidateQueries(keys);\n }\n setTimeout(() => adapter.invalidateQueries?.(keys), BROADCAST_INCLUSION_DELAY_MS);\n}\n","export function withTimeoutSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n if (!signal) return timeoutSignal;\n\n // AbortSignal.any is available in Chrome 116+, Safari 17.4+, Firefox 124+.\n // Fall back to manual AbortController wiring for older browsers.\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([signal, timeoutSignal]);\n }\n\n const ac = new AbortController();\n const onAbort = () => {\n const reason = signal.aborted ? signal.reason : timeoutSignal.reason;\n ac.abort(reason);\n signal.removeEventListener(\"abort\", onAbort);\n timeoutSignal.removeEventListener(\"abort\", onAbort);\n };\n if (signal.aborted) {\n ac.abort(signal.reason);\n } else if (timeoutSignal.aborted) {\n ac.abort(timeoutSignal.reason);\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n timeoutSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return ac.signal;\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport {\n config as hiveTxConfig,\n setNodes as setHiveTxNodes,\n setRestNodes as setHiveTxRestNodes,\n setRestNodesByApi as setHiveTxRestNodesByApi,\n setUserAgent as setHiveTxUserAgent,\n setResilience as setHiveTxResilience,\n type ResilienceOptions,\n} from \"../../hive-tx\";\nimport type { APIMethods } from \"../../hive-tx/api-types\";\n\n// Safe environment variable access for browser builds\n// In browser builds, tsup will replace process.env.* with literal values at compile time\nconst isDevelopment = (() => {\n try {\n return process.env?.NODE_ENV === 'development';\n } catch {\n return false;\n }\n})();\n\nconst getHeliusApiKey = () => {\n try {\n return process.env?.VITE_HELIUS_API_KEY;\n } catch {\n return undefined;\n }\n};\n\n/** Timeout for internal API calls (search, private API). */\nexport const INTERNAL_API_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on `gcTime` for any query that runs during SSR.\n *\n * A long window is fine in a browser or native app, where the cache holds one\n * user's data and lives as long as the session. It is not fine in a server\n * renderer: every query schedules a gc timer, a pending timer is a GC root, and\n * `Query` holds the whole `QueryCache` — so one long-lived entry keeps\n * everything else that request cached reachable for its entire window. A server\n * process then settles at roughly `ingest rate × gcTime`, which is how\n * ecency.com's renderers ended up aborting on the old-space cap rather than\n * levelling off (2026-07-26).\n *\n * Two minutes is far longer than any single render, which is the only window a\n * server-side entry has to be reused before it is dehydrated into the payload.\n *\n * Note this bounds SDK queries at the source. `apps/web` additionally clamps\n * every query through `defaultQueryOptions`, which is what protects it from\n * options defined outside the SDK; hosts that do not clamp get the right\n * behaviour from these defaults alone.\n */\nexport const SERVER_GC_TIME_MS = 2 * 60 * 1000;\n\n/**\n * How `CONFIG.queryClient` is resolved.\n *\n * This used to be a plain `queryClient: new QueryClient()` property — a single\n * instance created at module import and shared by every caller for the lifetime\n * of the process. That is correct in a browser (one process, one user) but wrong\n * under SSR, where one process serves every request: each server render wrote its\n * fetched data into that one cache and nothing ever removed it, so the heap grew\n * monotonically until the renderer hit its old-space limit and aborted.\n *\n * A host that renders on the server registers a resolver (see\n * `ConfigManager.setQueryClientResolver`) which returns the *current request's*\n * client, so cached data dies with the request that produced it. Hosts that\n * genuinely want one long-lived client keep using `setQueryClient`, and callers\n * that configure nothing fall back to a lazily created instance.\n *\n * The resolver is consulted on every read rather than cached here on purpose:\n * request scoping is the host's concern, and only the host can know when one\n * request ends and the next begins.\n */\nlet queryClientResolver: (() => QueryClient) | undefined;\n\n/** Created on first use, and only when no resolver has been registered. */\nlet fallbackQueryClient: QueryClient | undefined;\n\nfunction resolveQueryClient(): QueryClient {\n if (queryClientResolver) {\n return queryClientResolver();\n }\n return (fallbackQueryClient ??= new QueryClient());\n}\n\nexport const CONFIG = {\n privateApiHost: \"https://ecency.com\",\n /**\n * Observer used for bridge calls when nobody is logged in. The bridge applies\n * this account's mute list to the response, marking muted authors' posts and\n * comments `stats.gray` so clients can dim or collapse them. Anonymous\n * visitors therefore inherit Ecency's moderation instead of seeing an\n * unfiltered firehose. Apps may override via `ConfigManager.setDefaultObserver`,\n * which expects a real account rather than \"\" (see that setter).\n *\n * Note this only *marks* content: the bridge still returns muted authors'\n * posts, so an observer never shortens a feed.\n */\n defaultObserver: \"ecency\",\n /**\n * First-party client identifier sent as the `X-Ecency-Client` header on\n * search/private API requests. Lets the origin distinguish Ecency's own\n * web/mobile/SSR traffic from third-party integrators (who should use the\n * keyed api.hivesearcher.com backend instead of the public proxy). This is\n * a routing marker, not a secret. Apps may override via\n * `ConfigManager.setClientId` (e.g. \"web\" or \"mobile\") for observability.\n */\n clientId: \"ecency-sdk\",\n imageHost: \"https://i.ecency.com\",\n /** Current Hive RPC nodes. Reads from the unified hive-tx config. */\n get hiveNodes(): string[] {\n return hiveTxConfig.nodes;\n },\n heliusApiKey: getHeliusApiKey(),\n /**\n * The React Query client all SDK code reads through `getQueryClient()`.\n * Backed by a resolver so an SSR host can scope it per request — see the\n * `queryClientResolver` note above. Assigning replaces the resolver with one\n * that always returns the assigned client, preserving the previous\n * \"one client, set once\" behaviour for browser and native hosts.\n */\n get queryClient(): QueryClient {\n return resolveQueryClient();\n },\n set queryClient(client: QueryClient) {\n queryClientResolver = () => client;\n },\n pollsApiHost: \"https://poll.ecency.com\",\n plausibleHost: \"https://pl.ecency.com\",\n // DMCA filtering - can be configured by the app\n dmcaAccounts: [] as string[],\n dmcaTags: [] as string[],\n dmcaPatterns: [] as string[],\n // Pre-compiled regex patterns for performance and security\n dmcaTagRegexes: [] as RegExp[],\n dmcaPatternRegexes: [] as RegExp[],\n // Track if DMCA has been initialized to avoid duplicate logs\n _dmcaInitialized: false,\n};\n\ntype DmcaListsInput = {\n accounts?: string[];\n tags?: string[];\n posts?: string[];\n};\n\nexport namespace ConfigManager {\n export function setQueryClient(client: QueryClient) {\n CONFIG.queryClient = client;\n }\n\n /**\n * Register how the SDK should obtain its React Query client, for hosts where\n * a single shared instance is wrong — principally SSR, where one process\n * serves many requests and a shared cache both leaks memory and risks serving\n * one request's data to another.\n *\n * `resolve` is called on every SDK cache access and should return the client\n * belonging to the request currently being handled. In a Next.js App Router\n * host that means wrapping the factory in React's `cache()`, which memoises\n * per request:\n *\n * ```ts\n * ConfigManager.setQueryClientResolver(() => getQueryClient());\n * ```\n *\n * Registering a resolver supersedes any client previously passed to\n * `setQueryClient`; assigning a client afterwards supersedes the resolver.\n */\n export function setQueryClientResolver(resolve: () => QueryClient) {\n queryClientResolver = resolve;\n }\n\n /**\n * Set the private API host\n * @param host - The private API host URL (e.g., \"https://ecency.com\" or \"\" for relative URLs)\n */\n export function setPrivateApiHost(host: string) {\n CONFIG.privateApiHost = host;\n }\n\n /**\n * Set the first-party client identifier sent as the `X-Ecency-Client` header\n * on search/private API requests (e.g. \"web\" or \"mobile\"). Defaults to\n * \"ecency-sdk\". Used by the origin to tell Ecency's own apps apart from\n * third-party integrators.\n * @param clientId - Short client label\n */\n export function setClientId(clientId: string) {\n CONFIG.clientId = clientId;\n }\n\n /**\n * Set the observer used for bridge calls made without a logged-in user.\n * Defaults to \"ecency\"; a third-party integrator should point this at their\n * own moderation account.\n *\n * Must be a real account. An empty value is rejected rather than treated as\n * an opt-out: consumers resolve the observer with `||`, and `getDiscussion`\n * separately falls back to the post author, so \"\" would not disable mute\n * marking. It would silently observe as someone else while being cached under\n * \"\", leaving the request and its cache key describing different things.\n * @param observer - Hive account whose mute list applies to anonymous reads\n * @throws If given an empty or whitespace-only value\n */\n export function setDefaultObserver(observer: string) {\n if (typeof observer !== \"string\" || observer.trim() === \"\") {\n throw new Error(\n \"setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; \" +\n \"observer resolution would fall back to the post author while caching under an empty key.\"\n );\n }\n\n CONFIG.defaultObserver = observer;\n }\n\n /**\n * Get a validated base URL for API requests\n * Returns a valid base URL that can be used with new URL(path, baseUrl)\n *\n * Priority:\n * 1. CONFIG.privateApiHost if set (dev/staging or explicit config)\n * 2. window.location.origin if in browser (production with relative URLs)\n * 3. 'https://ecency.com' as fallback for SSR (production default)\n *\n * @returns A valid base URL string\n * @throws Never throws - always returns a valid URL\n */\n export function getValidatedBaseUrl(): string {\n if (CONFIG.privateApiHost) {\n return CONFIG.privateApiHost;\n }\n\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n\n // Fallback for SSR when privateApiHost is empty (production case)\n return 'https://ecency.com';\n }\n\n /**\n * Set the polls API host\n * @param host - The polls API host URL (e.g., \"https://poll.ecency.com\")\n */\n export function setPollsApiHost(host: string) {\n CONFIG.pollsApiHost = host;\n }\n\n /**\n * Set the image host\n * @param host - The image host URL (e.g., \"https://i.ecency.com\")\n */\n export function setImageHost(host: string) {\n CONFIG.imageHost = host;\n }\n\n /**\n * Set Hive RPC nodes, replacing the default list.\n * Delegates to the unified hive-tx `setNodes` (single validated setter,\n * shared with the lean `@ecency/sdk/hive` entry) so node configuration is\n * defined in exactly one place.\n * @param nodes - Array of Hive RPC node URLs\n */\n export function setHiveNodes(nodes: string[]) {\n setHiveTxNodes(nodes);\n }\n\n /**\n * Set the REST-API node list, replacing the default `restNodes`. Lets an app\n * add/remove REST hosts at runtime (e.g. drop an own node being decommissioned,\n * or widen the public pool) without forking + republishing the SDK. Delegates to\n * the unified hive-tx `setRestNodes` (validated, shared with `@ecency/sdk/hive`).\n * @param nodes - Array of REST-capable node URLs (without a trailing slash)\n */\n export function setRestNodes(nodes: string[]) {\n setHiveTxRestNodes(nodes);\n }\n\n /**\n * Merge per-API REST node overrides. For each API a non-empty valid list pins it\n * to those hosts (so `callREST` never wastes its retry budget on a node that\n * 404/503s the API); an empty list removes the pin (falls back to `restNodes`).\n * Other APIs' pins (e.g. the built-in `hivesense`) are preserved. Delegates to the\n * unified hive-tx `setRestNodesByApi`.\n * @param map - Partial map of REST API name → capable node URLs\n */\n export function setRestNodesByApi(map: Partial>) {\n setHiveTxRestNodesByApi(map);\n }\n\n /**\n * Set the User-Agent sent on server-side (Node) requests to Hive nodes.\n * Lets an app label its own SSR/server traffic (otherwise Node's fetch sends a\n * bare `node` UA). No effect in browsers (User-Agent is a forbidden header) or\n * React Native (keeps its native UA). Delegates to the unified hive-tx setter.\n * @param userAgent - The User-Agent string (e.g. \"ecency-web-ssr (+https://ecency.com)\")\n */\n export function setUserAgent(userAgent: string) {\n setHiveTxUserAgent(userAgent);\n }\n\n /**\n * Tune read-call tail-latency resilience: adaptive per-attempt timeouts\n * (default on) and hedged requests (default OFF — a duplicate request races\n * the next healthy node when the primary stalls, bounded by a token bucket so\n * only the slow tail hedges and pool-wide slowness self-disables it). Partial:\n * only the fields provided are changed; invalid values are ignored\n * field-by-field. Delegates to the unified hive-tx `setResilience`.\n * @param opts - e.g. `{ hedge: true }` to opt into hedged reads\n */\n export function setResilience(opts: Partial) {\n setHiveTxResilience(opts);\n }\n\n /**\n * Static analysis: Check for known ReDoS-vulnerable patterns\n * @param pattern - Raw regex pattern string\n * @returns Object with risk level and reason\n */\n function analyzeRedosRisk(pattern: string): { safe: boolean; reason?: string } {\n // Check 1: Nested quantifiers (e.g., (a+)+, (a*)+, (a{1,})+)\n if (/(\\([^)]*[*+{][^)]*\\))[*+{]/.test(pattern)) {\n return { safe: false, reason: \"nested quantifiers detected\" };\n }\n\n // Check 2: Alternation with overlapping terms (e.g., (a|a)+, (ab|a)+)\n if (/\\([^|)]*\\|[^)]*\\)[*+{]/.test(pattern)) {\n return { safe: false, reason: \"alternation with quantifier (potential overlap)\" };\n }\n\n // Check 3: Catastrophic backtracking patterns (e.g., (a*)*b, (a+)+b)\n if (/\\([^)]*[*+][^)]*\\)[*+]/.test(pattern)) {\n return { safe: false, reason: \"repeated quantifiers (catastrophic backtracking risk)\" };\n }\n\n // Check 4: Greedy quantifiers followed by optional patterns (e.g., .*.*x, .+.+x)\n if (/\\.\\*\\.\\*/.test(pattern) || /\\.\\+\\.\\+/.test(pattern)) {\n return { safe: false, reason: \"multiple greedy quantifiers on wildcards\" };\n }\n\n // Check 5: Unbounded ranges with wildcards (e.g., .{1,999999})\n const unboundedRange = /\\.?\\{(\\d+),(\\d+)\\}/g;\n let match;\n while ((match = unboundedRange.exec(pattern)) !== null) {\n const [, min, max] = match;\n const range = parseInt(max, 10) - parseInt(min, 10);\n if (range > 1000) {\n return { safe: false, reason: `excessive range: {${min},${max}}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Runtime test: Execute regex against adversarial inputs with timeout\n * @param regex - Compiled regex\n * @returns Object indicating if regex passed runtime test\n */\n function testRegexPerformance(regex: RegExp): { safe: boolean; reason?: string } {\n // Test inputs designed to trigger ReDoS in vulnerable patterns\n const adversarialInputs = [\n // Nested quantifier attack\n \"a\".repeat(50) + \"x\",\n // Alternation attack\n \"ab\".repeat(50) + \"x\",\n // Wildcard attack\n \"x\".repeat(100),\n // Mixed attack\n \"aaa\".repeat(30) + \"bbb\".repeat(30) + \"x\",\n ];\n\n const maxExecutionTime = 5; // 5ms hard limit per test\n\n for (const input of adversarialInputs) {\n const start = Date.now();\n try {\n regex.test(input);\n const duration = Date.now() - start;\n\n if (duration > maxExecutionTime) {\n return {\n safe: false,\n reason: `runtime test exceeded ${maxExecutionTime}ms (took ${duration}ms on input length ${input.length})`\n };\n }\n } catch (err) {\n return { safe: false, reason: `runtime test threw error: ${err}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Safely compile a regex pattern with defense-in-depth validation\n * @param pattern - Raw regex pattern string\n * @param maxLength - Maximum allowed pattern length (default 200)\n * @returns Compiled RegExp or null if invalid/unsafe\n */\n function safeCompileRegex(pattern: string, maxLength = 200): RegExp | null {\n // Use the module-level isDevelopment constant\n\n try {\n // Layer 1: Basic validation\n if (!pattern) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: empty pattern`);\n }\n return null;\n }\n\n if (pattern.length > maxLength) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: length ${pattern.length} exceeds max ${maxLength} - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 2: Static ReDoS analysis\n const staticAnalysis = analyzeRedosRisk(pattern);\n if (!staticAnalysis.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${staticAnalysis.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 3: Compilation attempt\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (compileErr) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${pattern.substring(0, 50)}...`, compileErr);\n }\n return null;\n }\n\n // Layer 4: Runtime performance testing\n const runtimeTest = testRegexPerformance(regex);\n if (!runtimeTest.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${runtimeTest.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n return regex;\n } catch (err) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${pattern.substring(0, 50)}...`, err);\n }\n return null;\n }\n }\n\n /**\n * Set DMCA filtering lists\n * @param lists - DMCA lists object containing accounts/tags/posts arrays\n */\n export function setDmcaLists(\n lists: DmcaListsInput = {}\n ) {\n const coerceList = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n // Ensure we have a valid object to work with\n const input = lists || {};\n\n const resolved = {\n accounts: coerceList(input.accounts),\n tags: coerceList(input.tags),\n patterns: coerceList(input.posts),\n };\n\n CONFIG.dmcaAccounts = resolved.accounts;\n CONFIG.dmcaTags = resolved.tags;\n CONFIG.dmcaPatterns = resolved.patterns;\n\n // Pre-compile tag regex patterns (tags can be regex)\n CONFIG.dmcaTagRegexes = resolved.tags\n .map((pattern) => safeCompileRegex(pattern))\n .filter((r): r is RegExp => r !== null);\n\n // Post patterns are plain strings for exact matching, not regex\n // No compilation needed - they will be used with simple string comparison\n CONFIG.dmcaPatternRegexes = [];\n\n const rejectedTagCount = resolved.tags.length - CONFIG.dmcaTagRegexes.length;\n\n // Only log once to avoid noise during builds/hot reloads\n // Only show in development mode to avoid cluttering production console\n // Use the module-level isDevelopment constant\n\n if (!CONFIG._dmcaInitialized && isDevelopment) {\n console.log(`[SDK] DMCA configuration loaded:`);\n console.log(` - Accounts: ${resolved.accounts.length}`);\n console.log(` - Tag patterns: ${CONFIG.dmcaTagRegexes.length}/${resolved.tags.length} compiled (${rejectedTagCount} rejected)`);\n console.log(` - Post patterns: ${resolved.patterns.length} (using exact string matching)`);\n\n if (rejectedTagCount > 0) {\n console.warn(`[SDK] ${rejectedTagCount} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`);\n }\n }\n\n CONFIG._dmcaInitialized = true;\n }\n}\n","import {\n InfiniteData,\n QueryClient,\n QueryKey,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n useQuery,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { CONFIG } from \"./config\";\n\n/**\n * Builds a client with the SDK's defaults. It is only a factory — request\n * scoping is the host's job, via `ConfigManager.setQueryClientResolver`, since\n * only the host knows where one request ends and the next begins.\n */\nexport function makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // With SSR, we usually want to set some default staleTime\n // above 0 to avoid refetching immediately on the client\n // staleTime: 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n },\n },\n });\n}\nexport const getQueryClient = () => CONFIG.queryClient;\n\nexport namespace EcencyQueriesManager {\n export function getQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData(queryKey);\n }\n\n export function getInfiniteQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData>(queryKey);\n }\n\n export async function prefetchQuery(options: UseQueryOptions) {\n const queryClient = getQueryClient();\n await queryClient.prefetchQuery(options);\n return getQueryData(options.queryKey);\n }\n\n export async function prefetchInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n const queryClient = getQueryClient();\n await queryClient.prefetchInfiniteQuery(options);\n return getInfiniteQueryData(options.queryKey);\n }\n\n export function generateClientServerQuery(options: UseQueryOptions) {\n return {\n prefetch: () => prefetchQuery(options),\n getData: () => getQueryData(options.queryKey),\n useClientQuery: () => useQuery(options),\n fetchAndGet: () => getQueryClient().fetchQuery(options),\n };\n }\n\n export function generateClientServerInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n return {\n prefetch: () => prefetchInfiniteQuery(options),\n getData: () => getInfiniteQueryData(options.queryKey),\n useClientQuery: () => useInfiniteQuery(options),\n fetchAndGet: () => getQueryClient().fetchInfiniteQuery(options),\n };\n }\n}\n","export function encodeObj(o: any): string {\n return btoa(JSON.stringify(o));\n}\n\nexport function decodeObj(o: any): any {\n let dataToParse = atob(o);\n if (dataToParse[0] !== \"{\") {\n return undefined;\n }\n return JSON.parse(dataToParse);\n}\n","import type { SMTAsset } from \"@/modules/core/hive-tx\";\n\nexport enum Symbol {\n HIVE = \"HIVE\",\n HBD = \"HBD\",\n VESTS = \"VESTS\",\n}\n\nexport enum NaiMap {\n \"@@000000021\" = \"HIVE\",\n \"@@000000013\" = \"HBD\",\n \"@@000000037\" = \"VESTS\",\n}\n\nexport interface Asset {\n amount: number;\n symbol: Symbol;\n}\n\nexport function parseAsset(sval: string | SMTAsset): Asset {\n if (typeof sval === \"string\") {\n const sp = sval.split(\" \");\n return {\n amount: parseFloat(sp[0]),\n // @ts-ignore\n symbol: Symbol[sp[1]],\n };\n } else {\n return {\n amount: parseFloat(sval.amount.toString()) / Math.pow(10, sval.precision),\n // @ts-ignore\n symbol: NaiMap[sval.nai],\n };\n }\n}\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][SDK] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","export function isCommunity(value: unknown) {\n return typeof value === \"string\" ? /^hive-\\d+$/.test(value) : false;\n}\n","import { WrappedResponse } from \"../types/pagination\";\n\n/**\n * Type guard to check if response is wrapped with pagination metadata\n */\nexport function isWrappedResponse(response: any): response is WrappedResponse {\n return (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n \"pagination\" in response &&\n Array.isArray(response.data)\n );\n}\n\n/**\n * Normalize response to wrapped format for backwards compatibility\n * If the backend returns old format (array), convert it to wrapped format\n */\nexport function normalizeToWrappedResponse(\n response: T[] | WrappedResponse,\n limit: number\n): WrappedResponse {\n if (isWrappedResponse(response)) {\n return response;\n }\n\n // Old format - just an array\n // Since we don't have pagination metadata, assume no more pages\n return {\n data: Array.isArray(response) ? response : [],\n pagination: {\n total: Array.isArray(response) ? response.length : 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n}\n","export function vestsToHp(vests: number, hivePerMVests: number): number {\n return (vests / 1e6) * hivePerMVests;\n}\n","export function isEmptyDate(s: string | undefined): boolean {\n if (s === undefined) {\n return true;\n }\n\n return parseInt(s.split(\"-\")[0], 10) < 1980;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { DynamicProps } from \"../types\";\nimport { parseAsset } from \"../utils\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// This query powers wallet/HP/reward math that should stay close to chain state.\n// Keep a short refresh cadence despite the 5 RPC calls.\nconst DYNAMIC_PROPS_REFRESH_MS = 60 * 1000;\n\nexport function getDynamicPropsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.core.dynamicProps(),\n refetchInterval: DYNAMIC_PROPS_REFRESH_MS,\n staleTime: DYNAMIC_PROPS_REFRESH_MS,\n queryFn: async ({ signal }): Promise => {\n // Get raw blockchain data — all five calls are independent, run in parallel.\n // Hardfork properties is wrapped with catch since not all nodes support it.\n const [rawGlobalDynamic, rawFeedHistory, rawChainProps, rawRewardFund, rawHardforkProps] = await Promise.all([\n callRPC(\"condenser_api.get_dynamic_global_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_feed_history\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_chain_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_reward_fund\", [\"post\"], undefined, undefined, signal),\n callRPC(\"database_api.get_hardfork_properties\", {}, undefined, undefined, signal)\n .catch(() => ({ current_hardfork_version: \"1.28.0\", last_hardfork: 28 })),\n ]) as [any, any, any, any, any];\n\n // Calculate derived values for backward compatibility\n // parseAsset handles both string format (\"200905388484 HIVE\") and NAI format ({ amount, nai, precision })\n const totalVestingSharesAmount = parseAsset(rawGlobalDynamic.total_vesting_shares).amount;\n const totalVestingFundAmount = parseAsset(rawGlobalDynamic.total_vesting_fund_hive).amount;\n\n // Guard against division by zero/NaN/Infinity\n let hivePerMVests = 0;\n if (\n Number.isFinite(totalVestingSharesAmount) &&\n totalVestingSharesAmount !== 0 &&\n Number.isFinite(totalVestingFundAmount)\n ) {\n hivePerMVests = (totalVestingFundAmount / totalVestingSharesAmount) * 1e6;\n }\n const base = parseAsset(rawFeedHistory.current_median_history.base).amount;\n const quote = parseAsset(rawFeedHistory.current_median_history.quote).amount;\n const fundRecentClaims = parseFloat(rawRewardFund.recent_claims);\n const fundRewardBalance = parseAsset(rawRewardFund.reward_balance).amount;\n const votePowerReserveRate = Number(rawGlobalDynamic.vote_power_reserve_rate ?? 0);\n const authorRewardCurve = rawRewardFund.author_reward_curve ?? \"linear\";\n const contentConstant = Number(rawRewardFund.content_constant ?? 0);\n const currentHardforkVersion = String(rawHardforkProps.current_hardfork_version ?? \"0.0.0\");\n const lastHardfork = Number(rawHardforkProps.last_hardfork ?? 0);\n const hbdPrintRate = rawGlobalDynamic.hbd_print_rate;\n const hbdInterestRate = rawGlobalDynamic.hbd_interest_rate;\n const headBlock = rawGlobalDynamic.head_block_number;\n const totalVestingFund = totalVestingFundAmount;\n const totalVestingShares = totalVestingSharesAmount;\n const virtualSupply = parseAsset(rawGlobalDynamic.virtual_supply).amount;\n const vestingRewardPercent = rawGlobalDynamic.vesting_reward_percent || 0;\n const accountCreationFee = rawChainProps.account_creation_fee;\n\n return {\n // Backward compatible transformed fields (camelCase, parsed)\n hivePerMVests,\n base,\n quote,\n fundRecentClaims,\n fundRewardBalance,\n votePowerReserveRate,\n authorRewardCurve,\n contentConstant,\n currentHardforkVersion,\n lastHardfork,\n hbdPrintRate,\n hbdInterestRate,\n headBlock,\n totalVestingFund,\n totalVestingShares,\n virtualSupply,\n vestingRewardPercent,\n accountCreationFee,\n\n // Raw blockchain data (snake_case, unparsed) for direct use\n // Includes ALL fields from the blockchain responses\n raw: {\n globalDynamic: rawGlobalDynamic,\n feedHistory: rawFeedHistory,\n chainProps: rawChainProps,\n rewardFund: rawRewardFund,\n hardforkProps: rawHardforkProps,\n },\n } as DynamicProps;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface RewardFund {\n id: number;\n name: string;\n reward_balance: string;\n recent_claims: string;\n last_update: string;\n content_constant: string;\n percent_curation_rewards: number;\n percent_content_rewards: number;\n author_reward_curve: string;\n curation_reward_curve: string;\n}\n\n/**\n * Get reward fund information from the blockchain\n * @param fundName - Name of the reward fund (default: 'post')\n */\nexport function getRewardFundQueryOptions(fundName = \"post\") {\n return queryOptions({\n queryKey: QueryKeys.core.rewardFund(fundName),\n queryFn: () =>\n callRPC(\"condenser_api.get_reward_fund\", [\n fundName,\n ]) as Promise,\n });\n}\n","/**\n * Centralized query key definitions for all SDK queries.\n *\n * These key builders are the single source of truth for React Query cache keys.\n * Both SDK query options and web app consumers should reference these\n * instead of using inline string arrays.\n *\n * @example\n * ```typescript\n * import { QueryKeys } from \"@ecency/sdk\";\n *\n * // In query options\n * queryKey: QueryKeys.posts.entry(`/@${author}/${permlink}`)\n *\n * // In cache invalidation\n * queryClient.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) })\n * ```\n */\n/** Strip trailing undefined values so the key works as a prefix for partialMatchKey */\nfunction key(...parts: unknown[]): unknown[] {\n let end = parts.length;\n while (end > 0 && parts[end - 1] === undefined) {\n end--;\n }\n return parts.slice(0, end);\n}\n\nexport const QueryKeys = {\n // ===========================================================================\n // Posts\n // ===========================================================================\n posts: {\n entry: (entryPath: string) => [\"posts\", \"entry\", entryPath],\n postHeader: (author: string, permlink?: string) =>\n [\"posts\", \"post-header\", author, permlink],\n content: (author: string, permlink: string) =>\n [\"posts\", \"content\", author, permlink],\n contentReplies: (author: string, permlink: string) =>\n [\"posts\", \"content-replies\", author, permlink],\n accountPosts: (\n username: string,\n filter: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"account-posts\", username, filter, limit, observer],\n accountPostsPage: (\n username: string,\n filter: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n observer: string\n ) =>\n [\n \"posts\",\n \"account-posts-page\",\n username,\n filter,\n startAuthor,\n startPermlink,\n limit,\n observer,\n ],\n userPostVote: (username: string, author: string, permlink: string) =>\n [\"posts\", \"user-vote\", username, author, permlink],\n reblogs: (username: string, limit: number) =>\n [\"posts\", \"reblogs\", username, limit],\n entryActiveVotes: (author?: string, permlink?: string) =>\n [\"posts\", \"entry-active-votes\", author, permlink],\n rebloggedBy: (author: string, permlink: string) =>\n [\"posts\", \"reblogged-by\", author, permlink],\n tips: (author: string, permlink: string) =>\n [\"posts\", \"tips\", author, permlink],\n normalize: (author: string, permlink: string) =>\n [\"posts\", \"normalize\", author, permlink],\n drafts: (activeUsername?: string) =>\n [\"posts\", \"drafts\", activeUsername],\n draftsInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"drafts\", \"infinite\", activeUsername, limit),\n schedules: (activeUsername?: string) =>\n [\"posts\", \"schedules\", activeUsername],\n schedulesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"schedules\", \"infinite\", activeUsername, limit),\n fragments: (username?: string) =>\n [\"posts\", \"fragments\", username],\n fragmentsInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"fragments\", \"infinite\", username, limit),\n images: (username?: string) => [\"posts\", \"images\", username],\n galleryImages: (activeUsername?: string) =>\n [\"posts\", \"gallery-images\", activeUsername],\n imagesInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"images\", \"infinite\", username, limit),\n promoted: (type: string) => [\"posts\", \"promoted\", type],\n _promotedPrefix: [\"posts\", \"promoted\"],\n accountPostsBlogPrefix: (username: string) =>\n [\"posts\", \"account-posts\", username, \"blog\"] as const,\n postsRanked: (\n sort: string,\n tag: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"posts-ranked\", sort, tag, limit, observer],\n postsRankedPage: (\n sort: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n tag: string,\n observer: string\n ) =>\n [\n \"posts\",\n \"posts-ranked-page\",\n sort,\n startAuthor,\n startPermlink,\n limit,\n tag,\n observer,\n ],\n discussions: (\n author: string,\n permlink: string,\n order: string,\n observer: string\n ) => [\"posts\", \"discussions\", author, permlink, order, observer],\n discussion: (author: string, permlink: string, observer: string) =>\n [\"posts\", \"discussion\", author, permlink, observer],\n deletedEntry: (entryPath: string) =>\n [\"posts\", \"deleted-entry\", entryPath],\n commentHistory: (\n author: string,\n permlink: string,\n onlyMeta: boolean\n ) => [\"posts\", \"comment-history\", author, permlink, onlyMeta],\n trendingTags: () => [\"posts\", \"trending-tags\"],\n trendingTagsWithStats: (limit: number) =>\n [\"posts\", \"trending-tags\", \"stats\", limit],\n wavesFeed: (\n params: {\n containers?: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"feed\",\n params.tag ?? \"\",\n params.following ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n shortsFeed: (\n params: {\n containers?: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"shorts\",\n params.tag ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n wavesByHost: (host: string) =>\n [\"posts\", \"waves\", \"by-host\", host],\n wavesByTag: (host: string, tag: string) =>\n [\"posts\", \"waves\", \"by-tag\", host, tag],\n wavesFollowing: (host: string, username: string) =>\n [\"posts\", \"waves\", \"following\", host, username],\n wavesTrendingTags: (host: string, hours: number) =>\n [\"posts\", \"waves\", \"trending-tags\", host, hours],\n wavesByAccount: (host: string, username: string) =>\n [\"posts\", \"waves\", \"by-account\", host, username],\n wavesTrendingAuthors: (host: string) =>\n [\"posts\", \"waves\", \"trending-authors\", host],\n _prefix: [\"posts\"],\n },\n\n // ===========================================================================\n // Accounts\n // ===========================================================================\n accounts: {\n full: (username?: string) => [\"get-account-full\", username],\n list: (...usernames: string[]) =>\n [\"accounts\", \"list\", ...usernames],\n friends: (\n following: string,\n mode: string,\n followType: string,\n limit: number\n ) => [\"accounts\", \"friends\", following, mode, followType, limit],\n searchFriends: (username: string, mode: string, query: string) =>\n [\"accounts\", \"friends\", \"search\", username, mode, query],\n subscriptions: (username: string) =>\n [\"accounts\", \"subscriptions\", username],\n followCount: (username: string) =>\n [\"accounts\", \"follow-count\", username],\n recoveries: (username: string) =>\n [\"accounts\", \"recoveries\", username],\n pendingRecovery: (username: string) =>\n [\"accounts\", \"recoveries\", username, \"pending-request\"],\n checkWalletPending: (username: string, code: string | null) =>\n [\"accounts\", \"check-wallet-pending\", username, code],\n mutedUsers: (username: string) =>\n [\"accounts\", \"muted-users\", username],\n following: (\n follower: string,\n startFollowing: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"following\",\n follower,\n startFollowing,\n followType,\n limit,\n ],\n followers: (\n following: string,\n startFollower: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"followers\",\n following,\n startFollower,\n followType,\n limit,\n ],\n search: (query: string, excludeList?: string[]) =>\n [\"accounts\", \"search\", query, excludeList],\n profiles: (accounts: string[], observer: string) =>\n [\"accounts\", \"profiles\", accounts, observer],\n lookup: (query: string, limit: number) =>\n [\"accounts\", \"lookup\", query, limit],\n transactions: (username: string, group: string, limit: number) =>\n [\"accounts\", \"transactions\", username, group, limit],\n favorites: (activeUsername?: string) =>\n [\"accounts\", \"favorites\", activeUsername],\n favoritesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"favorites\", \"infinite\", activeUsername, limit),\n checkFavorite: (activeUsername: string, targetUsername: string) =>\n [\n \"accounts\",\n \"favorites\",\n \"check\",\n activeUsername,\n targetUsername,\n ],\n relations: (reference: string | undefined, target: string | undefined) =>\n [\"accounts\", \"relations\", reference, target],\n bots: () => [\"accounts\", \"bots\"],\n voteHistory: (username: string, limit: number) =>\n [\"accounts\", \"vote-history\", username, limit],\n reputations: (query: string, limit: number) =>\n [\"accounts\", \"reputations\", query, limit],\n bookmarks: (activeUsername?: string) =>\n [\"accounts\", \"bookmarks\", activeUsername],\n bookmarksInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"bookmarks\", \"infinite\", activeUsername, limit),\n referrals: (username: string) =>\n [\"accounts\", \"referrals\", username],\n referralsStats: (username: string) =>\n [\"accounts\", \"referrals-stats\", username],\n proMembers: () => [\"accounts\", \"pro-members\"],\n _prefix: [\"accounts\"],\n },\n\n // ===========================================================================\n // Notifications\n // ===========================================================================\n notifications: {\n announcements: () => [\"notifications\", \"announcements\"],\n spotlights: () => [\"notifications\", \"spotlights\"],\n list: (activeUsername?: string, filter?: string) =>\n [\"notifications\", activeUsername, filter],\n unreadCount: (activeUsername?: string) =>\n [\"notifications\", \"unread\", activeUsername],\n settings: (activeUsername?: string) =>\n [\"notifications\", \"settings\", activeUsername],\n _prefix: [\"notifications\"],\n },\n\n // ===========================================================================\n // Core\n // ===========================================================================\n core: {\n rewardFund: (fundName: string) =>\n [\"core\", \"reward-fund\", fundName],\n dynamicProps: () => [\"core\", \"dynamic-props\"],\n chainProperties: () => [\"core\", \"chain-properties\"],\n _prefix: [\"core\"],\n },\n\n // ===========================================================================\n // Communities\n // ===========================================================================\n communities: {\n single: (name?: string, observer?: string) =>\n [\"community\", \"single\", name, observer],\n /** Prefix key for matching all observer variants of a community */\n singlePrefix: (name: string) =>\n [\"community\", \"single\", name] as const,\n context: (username: string, communityName: string) =>\n [\"community\", \"context\", username, communityName],\n rewarded: () => [\"communities\", \"rewarded\"],\n list: (sort: string, query: string, limit: number) =>\n [\"communities\", \"list\", sort, query, limit],\n subscribers: (communityName: string) =>\n [\"communities\", \"subscribers\", communityName],\n subscribersInfinite: (communityName: string) =>\n [\"communities\", \"subscribers\", \"infinite\", communityName],\n accountNotifications: (account: string, limit: number) =>\n [\"communities\", \"account-notifications\", account, limit],\n },\n\n // ===========================================================================\n // Proposals\n // ===========================================================================\n proposals: {\n list: () => [\"proposals\", \"list\"],\n proposal: (id: number) => [\"proposals\", \"proposal\", id],\n votes: (proposalId: number, voter: string, limit: number) =>\n [\"proposals\", \"votes\", proposalId, voter, limit],\n votesPrefix: (proposalId: number) =>\n [\"proposals\", \"votes\", proposalId] as const,\n votesByUser: (voter: string) =>\n [\"proposals\", \"votes\", \"by-user\", voter],\n },\n\n // ===========================================================================\n // Search\n // ===========================================================================\n search: {\n topics: (q: string, limit: number) => [\"search\", \"topics\", q, limit],\n path: (q: string) => [\"search\", \"path\", q],\n account: (q: string, limit: number) =>\n [\"search\", \"account\", q, limit],\n results: (\n q: string,\n sort: string,\n hideLow: boolean | string,\n since?: string,\n scrollId?: string,\n votes?: number\n ) => {\n const normalizedHideLow = typeof hideLow === \"string\" ? hideLow === \"1\" || hideLow === \"true\" : hideLow;\n return [\"search\", q, sort, normalizedHideLow, since, scrollId, votes] as const;\n },\n controversialRising: (what: string, tag: string) =>\n [\"search\", \"controversial-rising\", what, tag],\n similarEntries: (author: string, permlink: string, content?: string) =>\n content\n ? [\"search\", \"similar-entries\", author, permlink, content]\n : [\"search\", \"similar-entries\", author, permlink],\n api: (\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n ) => key(\"search\", \"api\", q, sort, hideLow, since, votes, includeNsfw),\n },\n\n // ===========================================================================\n // Witnesses\n // ===========================================================================\n witnesses: {\n list: (limit: number) => [\"witnesses\", \"list\", limit],\n votes: (username: string | undefined) => [\"witnesses\", \"votes\", username],\n proxy: () => [\"witnesses\", \"proxy\"],\n voters: (\n witness: string,\n page: number,\n pageSize: number,\n sort: string,\n direction: string\n ) => [\"witnesses\", \"voters\", witness, page, pageSize, sort, direction],\n voterCount: (witness: string) =>\n [\"witnesses\", \"voter-count\", witness],\n },\n\n // ===========================================================================\n // Wallet\n // ===========================================================================\n wallet: {\n outgoingRcDelegations: (username: string, limit: number) =>\n [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n vestingDelegations: (username: string, limit: number) =>\n [\"wallet\", \"vesting-delegations\", username, limit],\n withdrawRoutes: (account: string) =>\n [\"wallet\", \"withdraw-routes\", account],\n incomingRc: (username: string) =>\n [\"wallet\", \"incoming-rc\", username],\n conversionRequests: (account: string) =>\n [\"wallet\", \"conversion-requests\", account],\n receivedVestingShares: (username: string) =>\n [\"wallet\", \"received-vesting-shares\", username],\n savingsWithdraw: (account: string) =>\n [\"wallet\", \"savings-withdraw\", account],\n openOrders: (user: string) =>\n [\"wallet\", \"open-orders\", user],\n collateralizedConversionRequests: (account: string) =>\n [\"wallet\", \"collateralized-conversion-requests\", account],\n recurrentTransfers: (username: string) =>\n [\"wallet\", \"recurrent-transfers\", username],\n balanceHistory: (username: string, coinType: string, pageSize: number) =>\n [\"wallet\", \"balance-history\", username, coinType, pageSize],\n aggregatedHistory: (\n username: string,\n coinType: string,\n granularity?: \"yearly\" | \"monthly\" | \"daily\"\n ) =>\n granularity === undefined\n ? [\"wallet\", \"aggregated-history\", username, coinType]\n : [\"wallet\", \"aggregated-history\", username, coinType, granularity],\n portfolio: (\n username: string,\n onlyEnabled: string,\n currency: string\n ) =>\n [\"wallet\", \"portfolio\", \"v2\", username, onlyEnabled, currency],\n },\n\n // ===========================================================================\n // Assets\n // ===========================================================================\n assets: {\n hiveGeneralInfo: (username: string) =>\n [\"assets\", \"hive\", \"general-info\", username],\n hiveTransactions: (username: string, limit: number, filterKey: string) =>\n [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n hiveWithdrawalRoutes: (username: string) =>\n [\"assets\", \"hive\", \"withdrawal-routes\", username],\n hiveMetrics: (bucketSeconds: number) =>\n [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n hbdGeneralInfo: (username: string) =>\n [\"assets\", \"hbd\", \"general-info\", username],\n hbdTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) => [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n hivePowerGeneralInfo: (username: string) =>\n [\"assets\", \"hive-power\", \"general-info\", username],\n hivePowerDelegates: (username: string) =>\n [\"assets\", \"hive-power\", \"delegates\", username],\n hivePowerDelegatings: (username: string) =>\n [\"assets\", \"hive-power\", \"delegatings\", username],\n hivePowerTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) =>\n [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n pointsGeneralInfo: (username: string) =>\n [\"assets\", \"points\", \"general-info\", username],\n pointsTransactions: (username: string, type: string) =>\n [\"assets\", \"points\", \"transactions\", username, type],\n ecencyAssetInfo: (username: string, asset: string, currency: string) =>\n [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n },\n\n // ===========================================================================\n // Market\n // ===========================================================================\n market: {\n statistics: () => [\"market\", \"statistics\"],\n orderBook: (limit: number) => [\"market\", \"order-book\", limit],\n history: (seconds: number, startDate: number, endDate: number) =>\n [\"market\", \"history\", seconds, startDate, endDate],\n feedHistory: () => [\"market\", \"feed-history\"],\n hiveHbdStats: () => [\"market\", \"hive-hbd-stats\"],\n data: (\n coin: string,\n vsCurrency: string,\n fromTs: number,\n toTs: number\n ) => [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n tradeHistory: (limit: number, start: number, end: number) =>\n [\"market\", \"trade-history\", limit, start, end],\n currentMedianHistoryPrice: () =>\n [\"market\", \"current-median-history-price\"],\n },\n\n // ===========================================================================\n // Analytics\n // ===========================================================================\n analytics: {\n discoverCuration: (duration: string) =>\n [\"analytics\", \"discover-curation\", duration],\n pageStats: (\n url: string,\n dimensions: string,\n metrics: string,\n dateRange: string\n ) =>\n [\"analytics\", \"page-stats\", url, dimensions, metrics, dateRange],\n discoverLeaderboard: (duration: string) =>\n [\"analytics\", \"discover-leaderboard\", duration],\n },\n\n // ===========================================================================\n // Promotions\n // ===========================================================================\n promotions: {\n promotePrice: () => [\"promotions\", \"promote-price\"],\n boostPlusPrices: () => [\"promotions\", \"boost-plus-prices\"],\n boostPlusAccounts: (account: string) =>\n [\"promotions\", \"boost-plus-accounts\", account],\n },\n\n // ===========================================================================\n // Resource Credits\n // ===========================================================================\n resourceCredits: {\n account: (username: string) =>\n [\"resource-credits\", \"account\", username],\n stats: () => [\"resource-credits\", \"stats\"],\n },\n\n // ===========================================================================\n // Points\n // ===========================================================================\n points: {\n points: (username: string, filter: number) =>\n [\"points\", username, filter],\n _prefix: (username: string) => [\"points\", username],\n },\n\n // ===========================================================================\n // Polls\n // ===========================================================================\n polls: {\n details: (author: string, permlink: string) =>\n [\"polls\", \"details\", author, permlink],\n vote: (author?: string, permlink?: string) =>\n author && permlink\n ? [\"polls\", \"vote\", author, permlink]\n : [\"polls\", \"vote\"],\n _prefix: [\"polls\"],\n },\n\n // ===========================================================================\n // Operations\n // ===========================================================================\n operations: {\n chainProperties: () => [\"operations\", \"chain-properties\"],\n },\n\n // ===========================================================================\n // Games\n // ===========================================================================\n games: {\n statusCheck: (gameType: string, username: string) =>\n [\"games\", \"status-check\", gameType, username],\n },\n\n quests: {\n status: (username: string | undefined) => [\"quests\", \"status\", username],\n },\n\n // ===========================================================================\n // Support Ecency\n // ===========================================================================\n support: {\n settings: (username: string | undefined) => [\"support\", \"settings\", username],\n _prefix: [\"support\"],\n },\n\n // ===========================================================================\n // Bad Actors\n // ===========================================================================\n badActors: {\n list: () => [\"bad-actors\", \"list\"],\n _prefix: [\"bad-actors\"],\n },\n\n // ===========================================================================\n // AI\n // ===========================================================================\n ai: {\n prices: () => [\"ai\", \"prices\"] as const,\n assistPrices: (username?: string) => [\"ai\", \"assist-prices\", username] as const,\n transcribePrice: (username?: string) => [\"ai\", \"transcribe-price\", username] as const,\n _prefix: [\"ai\"],\n },\n} as const;\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiImagePriceResponse } from \"../types\";\n\nexport function getAiGeneratePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.prices(),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-generate-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI generation prices: ${response.status}`);\n }\n\n return (await response.json()) as AiImagePriceResponse;\n },\n staleTime: 300_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiAssistPrice } from \"../types\";\n\nexport function getAiAssistPriceQueryOptions(username: string | undefined, accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.assistPrices(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-assist-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI assist prices: ${response.status}`);\n }\n\n return (await response.json()) as AiAssistPrice[];\n },\n staleTime: 60_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiTranscribePrice } from \"../types\";\n\n/**\n * Dictation pricing. Kept on its own route rather than folded into\n * /private-api/ai-assist-price: that endpoint returns a list of flat-cost actions and\n * shipped clients render every entry as a selectable assist action, so adding a\n * metered one there would surface in older clients as an action they cannot perform.\n *\n * Everything except `free_remaining` is static, so this is cheap to hold and lets the\n * client price a clip locally while the user is still recording.\n */\nexport function getAiTranscribePriceQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.ai.transcribePrice(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI transcribe price: ${response.status}`);\n }\n\n return (await response.json()) as AiTranscribePrice;\n },\n staleTime: 60_000,\n enabled: !!accessToken\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiGenerationResponse } from \"../types\";\n\nexport interface GenerateImageParams {\n prompt: string;\n aspect_ratio?: string;\n power?: number;\n // Pass a stable key to make a retry recover the same paid generation. If omitted a\n // fresh key is generated per call (only dedupes edge/proxy retries, not user retries).\n idempotency_key?: string;\n}\n\n// Generates a key matching the eepoints validator [A-Za-z0-9_-]{8,64}.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useGenerateImage(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"generate-image\"],\n mutationFn: async (params: GenerateImageParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-generate-image\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: accessToken,\n us: username,\n prompt: params.prompt,\n aspect_ratio: params.aspect_ratio ?? \"1:1\",\n power: params.power ?? 1,\n idempotency_key: params.idempotency_key ?? makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][GenerateImage] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n // 202 = the prediction is paid for and captured but not yet delivered to our image\n // host. Detect it by HTTP status BEFORE parsing (the body may be present or empty)\n // and surface it as a typed error so the caller can retry with the SAME\n // idempotency_key to fetch it — no second prediction, no second charge.\n if (response.status === 202) {\n let pendingData: Record = {};\n try {\n pendingData = await response.json();\n } catch {\n // empty / non-JSON 202 body is fine — the status alone drives recovery\n }\n const err = new Error(\"[SDK][AI][GenerateImage] – delivery pending\");\n (err as any).status = 202;\n (err as any).data = pendingData;\n throw err;\n }\n\n const data = (await response.json()) as AiGenerationResponse;\n\n return data;\n },\n onSuccess: () => {\n // Invalidate points cache since balance changed\n if (username) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiAssistResponse } from \"../types\";\n\nexport interface AiAssistParams {\n action: string;\n text: string;\n code?: string;\n}\n\n// Generates a key that matches the eepoints validator [A-Za-z0-9_-]{8,64}.\n// Used to dedupe duplicate POSTs caused by edge/proxy retries — same key on\n// retry returns the cached AI output without re-charging or re-calling Claude.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useAiAssist(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"assist\"],\n mutationFn: async (params: AiAssistParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][Assist] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][Assist] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-assist\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: params.code ?? accessToken,\n us: username,\n action: params.action,\n text: params.text,\n idempotency_key: makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][Assist] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n return (await response.json()) as AiAssistResponse;\n },\n onSuccess: (data) => {\n if (username) {\n // Invalidate points cache if cost was charged\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n // Invalidate assist prices to refresh free_remaining counts\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.assistPrices(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiTranscribeParams, AiTranscribeResponse } from \"../types\";\n\n// Matches the eepoints validator [A-Za-z0-9_-]{8,64}. Dedupes duplicate POSTs caused\n// by edge/proxy retries -- the same key returns the cached transcript without\n// re-charging or re-calling the vendor.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Transcribe an audio clip to text, charged per 30 seconds.\n *\n * Sends multipart/form-data rather than JSON because it carries a file. Unlike the\n * other AI mutations the charge is BURNED rather than moved to the treasury, so the\n * points transaction shows up as PointTransactionType.BURNED (997).\n */\nexport function useAiTranscribe(username: string | undefined, accessToken: string | undefined) {\n return useMutation({\n mutationKey: [\"ai\", \"transcribe\"],\n mutationFn: async (params: AiTranscribeParams): Promise => {\n if (!username) {\n throw new Error(\"[SDK][AI][Transcribe] – username wasn't provided\");\n }\n\n // Validate the token actually being sent, not just the bound one. A caller\n // that resolves a fresh token per call (because the bound one can expire\n // during a long recording) legitimately has nothing at hook construction.\n const code = params.code ?? accessToken;\n if (!code) {\n throw new Error(\"[SDK][AI][Transcribe] – access token wasn't found\");\n }\n\n const form = new FormData();\n form.append(\"code\", code);\n // `us` is resolved from the code server-side and is deliberately not sent:\n // upstream burns from whoever it names.\n form.append(\"duration_ms\", String(Math.round(params.durationMs)));\n // Caller-supplied key when there is one. Generating a fresh key per attempt\n // would defeat the dedupe in the one case it exists for: a POST that reached\n // the server whose response was lost. Retrying then would transcribe and\n // charge a second time. Same contract as useGenerateImage.\n form.append(\"idempotency_key\", params.idempotency_key ?? makeIdempotencyKey());\n form.append(\"audio\", params.audio, params.fileName ?? \"clip.webm\");\n\n const fetchApi = getBoundFetch();\n // No Content-Type header: fetch sets it, including the multipart boundary.\n // Setting it by hand drops the boundary and the body becomes unparseable.\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe\", {\n method: \"POST\",\n body: form\n });\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n // Object.assign rather than `as any` casts: callers need `status` to tell a\n // 402 (out of Points) from a 429 (rate limited) from a 400 (clip too long),\n // and this keeps that shape typed.\n throw Object.assign(\n new Error(\n `[SDK][AI][Transcribe] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n ),\n { status: response.status, data: parsed }\n );\n }\n\n return (await response.json()) as AiTranscribeResponse;\n },\n onSuccess: (data) => {\n if (username) {\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username)\n });\n }\n // Refresh free_remaining, which only Pro members ever have above zero.\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.transcribePrice(username)\n });\n }\n }\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport {\n AccountFollowStats,\n FullAccount,\n} from \"../types\";\nimport { parseProfileMetadata } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** The raw `condenser_api.get_accounts` row — every FullAccount field except the three\n * this query derives separately (follow_stats + reputation from bridge, profile parsed). */\ntype RawAccount = Omit;\n\n/** Minimal shape read from `bridge.get_profile` (hivemind social profile): it carries\n * the reputation score, the follower/following counts and hivemind's parsed\n * (normalized) profile — the latter is used only to cross-validate the chain row. */\ninterface BridgeProfile {\n reputation?: number;\n stats?: { followers?: number; following?: number };\n metadata?: { profile?: Record };\n}\n\n/** True when the chain row carries no account metadata at all. Legitimate for\n * accounts that never set a profile — but combined with a populated hivemind\n * profile it identifies a node serving stripped account rows. */\nfunction isMetadataStripped(account: RawAccount): boolean {\n return !account.posting_json_metadata && !account.json_metadata;\n}\n\n/** True when a hivemind `metadata.profile` object carries at least one real\n * value. Hivemind emits its fixed profile keys with empty strings for\n * accounts without a profile, so key presence alone proves nothing. */\nfunction hasProfileValues(profile?: Record | null): boolean {\n if (!profile) return false;\n return Object.values(profile).some((value) =>\n typeof value === \"string\" ? value.length > 0 : value != null\n );\n}\n\nexport function getAccountFullQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.full(username),\n queryFn: async ({ signal }) => {\n if (!username) {\n return null;\n }\n\n // Fetch the chain account (balances/keys/vesting) and the hivemind profile in\n // parallel — both only need the username. bridge.get_profile carries BOTH the\n // follower/following counts and the reputation score, so it replaces the old\n // second-layer condenser_api.get_follow_count RPC *and* the reputation-api REST\n // call: condenser_api.get_accounts no longer returns a usable reputation (it is 0\n // since the hardfork), and there is no reason to make two extra round-trips for\n // data one profile object already carries.\n const [response, bridgeProfile] = await Promise.all([\n callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so fail over to the next node instead of misreading it as\n // \"account does not exist\".\n (rows) => Array.isArray(rows)\n ),\n callRPC(\n \"bridge.get_profile\",\n { account: username },\n undefined,\n undefined,\n signal\n ).catch((e): BridgeProfile | null => {\n // A caller cancel (aborted signal) must propagate — only genuine RPC/transport\n // failures degrade to reputation 0 / no follow_stats.\n if (signal?.aborted) throw e;\n return null;\n })\n ]);\n if (!response?.[0]) {\n // The account does not exist (e.g. not yet finalized on-chain during\n // signup). Treat absence as a recoverable null instead of throwing, so\n // consumers (useQuery hooks and fetchQuery callers) surface it as empty\n // data rather than an unhandled rejection / error-boundary crash.\n return null;\n }\n\n let chainAccount = response[0];\n\n // Cross-validate the chain row against the hivemind profile fetched in\n // the same query. Some public nodes serve account rows with BOTH\n // metadata fields stripped to \"\" (observed in the wild) while their own\n // hivemind still returns the real profile — and a merge base built from\n // such a row wipes the user's profile on the next partial\n // account_update2. When the row claims \"no metadata\" but hivemind\n // disagrees, re-read once (failover may pick another node) and otherwise\n // fail the query: an error here is recoverable, a poisoned cache entry\n // is not.\n if (\n isMetadataStripped(chainAccount) &&\n hasProfileValues(bridgeProfile?.metadata?.profile)\n ) {\n // The re-read carries a payload validator: a stripped row is treated\n // as a node fault, so the failover walk moves on to other nodes (and\n // repeat offenders earn a per-API health cooldown) instead of asking\n // the same lying node twice.\n const reread = await callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n (rows) =>\n Array.isArray(rows) &&\n (!rows[0] || !isMetadataStripped(rows[0] as RawAccount))\n );\n if (reread[0] && !isMetadataStripped(reread[0])) {\n chainAccount = reread[0];\n } else {\n throw new Error(\n `[SDK][Accounts] – inconsistent account row for ${username}: empty json metadata while hivemind profile is populated`\n );\n }\n }\n\n const profile = parseProfileMetadata(chainAccount.posting_json_metadata);\n\n // bridge.get_profile.stats → follower/following counts; `reputation` is the\n // computed score (e.g. 78.29). accountReputation() floors an in-range score, so\n // it yields the same value the reputation-api used to return. Both degrade to a\n // safe default if the profile call failed.\n const stats = bridgeProfile?.stats;\n const follow_stats: AccountFollowStats | undefined = stats\n ? {\n account: chainAccount.name,\n follower_count: stats.followers ?? 0,\n following_count: stats.following ?? 0\n }\n : undefined;\n const reputationValue: number = bridgeProfile?.reputation ?? 0;\n\n return {\n name: chainAccount.name,\n owner: chainAccount.owner,\n active: chainAccount.active,\n posting: chainAccount.posting,\n memo_key: chainAccount.memo_key,\n post_count: chainAccount.post_count,\n created: chainAccount.created,\n posting_json_metadata: chainAccount.posting_json_metadata,\n last_vote_time: chainAccount.last_vote_time,\n last_post: chainAccount.last_post,\n json_metadata: chainAccount.json_metadata,\n reward_hive_balance: chainAccount.reward_hive_balance,\n reward_hbd_balance: chainAccount.reward_hbd_balance,\n reward_vesting_hive: chainAccount.reward_vesting_hive,\n reward_vesting_balance: chainAccount.reward_vesting_balance,\n balance: chainAccount.balance,\n hbd_balance: chainAccount.hbd_balance,\n savings_balance: chainAccount.savings_balance,\n savings_hbd_balance: chainAccount.savings_hbd_balance,\n savings_hbd_last_interest_payment:\n chainAccount.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update:\n chainAccount.savings_hbd_seconds_last_update,\n savings_hbd_seconds: chainAccount.savings_hbd_seconds,\n next_vesting_withdrawal: chainAccount.next_vesting_withdrawal,\n pending_claimed_accounts: chainAccount.pending_claimed_accounts,\n vesting_shares: chainAccount.vesting_shares,\n delegated_vesting_shares: chainAccount.delegated_vesting_shares,\n received_vesting_shares: chainAccount.received_vesting_shares,\n vesting_withdraw_rate: chainAccount.vesting_withdraw_rate,\n to_withdraw: chainAccount.to_withdraw,\n withdrawn: chainAccount.withdrawn,\n witness_votes: chainAccount.witness_votes,\n proxy: chainAccount.proxy,\n recovery_account: chainAccount.recovery_account,\n proxied_vsf_votes: chainAccount.proxied_vsf_votes,\n voting_manabar: chainAccount.voting_manabar,\n voting_power: chainAccount.voting_power,\n downvote_manabar: chainAccount.downvote_manabar,\n follow_stats,\n reputation: reputationValue,\n profile,\n } satisfies FullAccount;\n },\n enabled: !!username,\n staleTime: 60000,\n });\n}\n","import { AccountProfile, FullAccount } from \"../types\";\n\nexport type ProfileTokens = AccountProfile[\"tokens\"];\n\nconst DENIED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nfunction deepMerge>(target: T, source: Record): T {\n const result = { ...target } as Record;\n for (const key of Object.keys(source)) {\n if (DENIED_KEYS.has(key)) {\n continue;\n }\n const srcVal = source[key];\n const tgtVal = result[key];\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\n result[key] = deepMerge(tgtVal, srcVal);\n } else {\n result[key] = srcVal;\n }\n }\n return result as T;\n}\n\nexport interface BuildProfileMetadataArgs {\n existingProfile?: AccountProfile;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}\n\nfunction sanitizeTokens(\n tokens?: ProfileTokens | null\n): ProfileTokens | undefined {\n // Guard against corrupted data from blockchain where tokens is not an array\n if (!tokens || !Array.isArray(tokens)) {\n return undefined;\n }\n\n return tokens.map(({ meta, ...rest }) => {\n if (!meta || typeof meta !== \"object\") {\n return { ...rest, meta };\n }\n\n const { privateKey, username, ...safeMeta } = meta;\n return { ...rest, meta: safeMeta };\n });\n}\n\nexport function parseProfileMetadata(\n postingJsonMetadata?: string | null\n): AccountProfile {\n if (!postingJsonMetadata) {\n return {} as AccountProfile;\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n parsed.profile &&\n typeof parsed.profile === \"object\"\n ) {\n return parsed.profile as AccountProfile;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata:\", err, { length: postingJsonMetadata?.length ?? 0 });\n }\n\n return {} as AccountProfile;\n}\n\nexport function extractAccountProfile(\n data?: Pick | null\n): AccountProfile {\n return parseProfileMetadata(data?.posting_json_metadata);\n}\n\n/**\n * Choose between two account snapshots for a posting-metadata merge base.\n * Prefers `preferred` (typically the freshest cache entry) unless `fallback`\n * carries strictly more profile keys — guarding read-modify-write flows\n * against a snapshot whose metadata was served stripped by a misbehaving node\n * while another snapshot still holds the real profile. A partial update must\n * never shrink the profile while any snapshot still knows the full one.\n */\nexport function pickRicherMetadataSnapshot<\n T extends Pick\n>(\n preferred: T | null | undefined,\n fallback: T | null | undefined\n): T | null | undefined {\n if (!preferred) return fallback;\n if (!fallback) return preferred;\n const preferredKeys = Object.keys(\n parseProfileMetadata(preferred.posting_json_metadata)\n ).length;\n const fallbackKeys = Object.keys(\n parseProfileMetadata(fallback.posting_json_metadata)\n ).length;\n return fallbackKeys > preferredKeys ? fallback : preferred;\n}\n\n/**\n * Parse the FULL root object of posting_json_metadata, not just its `profile`\n * key. Returns {} for missing/invalid input or a non-object root.\n *\n * `parseProfileMetadata` intentionally returns only `parsed.profile`; this\n * helper exists so writers can carry forward any sibling top-level keys that\n * live alongside `profile` (data other Hive apps may store there) instead of\n * dropping them on the next update.\n */\nexport function parsePostingMetadataRoot(\n postingJsonMetadata?: string | null\n): Record {\n if (!postingJsonMetadata) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata root:\", err, {\n length: postingJsonMetadata?.length ?? 0,\n });\n }\n\n return {};\n}\n\n/**\n * Build the serialized `posting_json_metadata` string for an account_update2\n * operation. It deep-merges the profile (via {@link buildProfileMetadata}) over\n * the account's CURRENT on-chain profile AND preserves any non-`profile`\n * top-level keys present in the existing metadata, so a partial profile update\n * (e.g. only `pinned` or only `tokens`) never clobbers unrelated fields.\n */\nexport function buildPostingJsonMetadata({\n existingPostingJsonMetadata,\n profile,\n tokens,\n}: {\n existingPostingJsonMetadata?: string | null;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}): string {\n const root = parsePostingMetadataRoot(existingPostingJsonMetadata);\n const existingProfile = isPlainObject(root.profile)\n ? (root.profile as AccountProfile)\n : ({} as AccountProfile);\n\n const mergedProfile = buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n });\n\n return JSON.stringify({ ...root, profile: mergedProfile });\n}\n\nexport function buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n}: BuildProfileMetadataArgs): AccountProfile {\n const { tokens: profileTokens, version: _ignoredVersion, ...profileRest } =\n profile ?? {};\n\n const metadata = deepMerge(\n (existingProfile ?? {}) as Record,\n profileRest as Record,\n ) as AccountProfile;\n\n // Clean up corrupted tokens data from blockchain before processing\n if (metadata.tokens && !Array.isArray(metadata.tokens)) {\n metadata.tokens = undefined;\n }\n\n // tokens semantics:\n // undefined → no change, fall back to profileTokens from profile partial\n // null or [] → explicitly clear tokens\n // non-empty array → set tokens\n if (tokens !== undefined) {\n // Explicit intent from caller: null or [] clears, non-empty array sets\n metadata.tokens = tokens && tokens.length > 0 ? tokens : [];\n } else if (profileTokens !== undefined) {\n // Fall back to tokens from profile partial (including empty array to clear)\n metadata.tokens = profileTokens;\n }\n\n metadata.tokens = sanitizeTokens(metadata.tokens);\n metadata.version = 2;\n\n return metadata;\n}\n","import { FullAccount, AccountProfile } from \"../types\";\nimport { parseProfileMetadata } from \"./profile-metadata\";\n\n/**\n * Parses raw account data from Hive API into FullAccount type\n * Handles profile metadata extraction from posting_json_metadata or json_metadata\n */\nexport function parseAccounts(rawAccounts: any[]): FullAccount[] {\n return rawAccounts.map((x) => {\n const account: FullAccount = {\n name: x.name,\n owner: x.owner,\n active: x.active,\n posting: x.posting,\n memo_key: x.memo_key,\n post_count: x.post_count,\n created: x.created,\n reputation: x.reputation,\n posting_json_metadata: x.posting_json_metadata,\n last_vote_time: x.last_vote_time,\n last_post: x.last_post,\n json_metadata: x.json_metadata,\n reward_hive_balance: x.reward_hive_balance,\n reward_hbd_balance: x.reward_hbd_balance,\n reward_vesting_hive: x.reward_vesting_hive,\n reward_vesting_balance: x.reward_vesting_balance,\n balance: x.balance,\n hbd_balance: x.hbd_balance,\n savings_balance: x.savings_balance,\n savings_hbd_balance: x.savings_hbd_balance,\n savings_hbd_last_interest_payment: x.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update: x.savings_hbd_seconds_last_update,\n savings_hbd_seconds: x.savings_hbd_seconds,\n next_vesting_withdrawal: x.next_vesting_withdrawal,\n pending_claimed_accounts: x.pending_claimed_accounts,\n vesting_shares: x.vesting_shares,\n delegated_vesting_shares: x.delegated_vesting_shares,\n received_vesting_shares: x.received_vesting_shares,\n vesting_withdraw_rate: x.vesting_withdraw_rate,\n to_withdraw: x.to_withdraw,\n withdrawn: x.withdrawn,\n witness_votes: x.witness_votes,\n proxy: x.proxy,\n recovery_account: x.recovery_account,\n proxied_vsf_votes: x.proxied_vsf_votes,\n voting_manabar: x.voting_manabar,\n voting_power: x.voting_power,\n downvote_manabar: x.downvote_manabar,\n };\n\n // Try to parse profile from posting_json_metadata first\n let profile: AccountProfile | undefined = parseProfileMetadata(\n x.posting_json_metadata\n );\n\n // Fallback to json_metadata if posting_json_metadata didn't have a profile\n if (!profile || Object.keys(profile).length === 0) {\n try {\n const jsonMetadata = JSON.parse(x.json_metadata || \"{}\");\n if (jsonMetadata.profile) {\n profile = jsonMetadata.profile;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n // Ensure we always have a profile object\n if (!profile || Object.keys(profile).length === 0) {\n profile = {\n about: \"\",\n cover_image: \"\",\n location: \"\",\n name: \"\",\n profile_image: \"\",\n website: \"\",\n };\n }\n\n return { ...account, profile };\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { parseAccounts } from \"../utils/parse-accounts\";\nimport { FullAccount } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountsQueryOptions(usernames: string[]) {\n return queryOptions({\n queryKey: QueryKeys.accounts.list(...usernames),\n enabled: usernames.length > 0,\n queryFn: async (): Promise => {\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so the validator makes callRPC fail over to the next node\n // instead of resolving with a payload parseAccounts cannot map over.\n const response = (await callRPC(\n \"condenser_api.get_accounts\",\n [usernames],\n undefined,\n undefined,\n undefined,\n (rows) => Array.isArray(rows)\n )) as any[];\n return parseAccounts(response ?? []);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountFollowStats } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get follow count (followers and following) for an account\n */\nexport function getFollowCountQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followCount(username),\n queryFn: () =>\n callRPC(\"condenser_api.get_follow_count\", [\n username,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts following a user\n *\n * @param following - The account being followed\n * @param startFollower - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowersQueryOptions(\n following: string | undefined,\n startFollower: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followers(following!, startFollower, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_followers\", [\n following,\n startFollower,\n followType,\n limit,\n ]) as Promise,\n enabled: !!following,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts that a user is following\n *\n * @param follower - The account doing the following\n * @param startFollowing - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowingQueryOptions(\n follower: string,\n startFollowing: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.following(follower, startFollowing, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_following\", [\n follower,\n startFollowing,\n followType,\n limit,\n ]) as Promise,\n enabled: !!follower,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** `condenser_api.get_following` caps a single response at 1000 rows. */\nconst MUTED_USERS_PAGE_SIZE = 1000;\n\n/**\n * Safety valve for the paging loop: 20 pages is 20k muted accounts, far past\n * any real mute list. Bounds the work if a node ever stops advancing the\n * cursor, so a malformed response degrades to a truncated list rather than an\n * endless request loop.\n */\nconst MUTED_USERS_MAX_PAGES = 20;\n\n/**\n * Get the full list of accounts a user has muted.\n *\n * Pages until the list is exhausted instead of taking the first N. That is\n * load-bearing: this result dims muted authors in feeds and collapses their\n * comments (`entry-list-item-muted-content`, `discussion-list`), so a truncated\n * list silently renders muted accounts as though they were never muted.\n *\n * Takes no limit, on purpose. `QueryKeys.accounts.mutedUsers` keys on the\n * username alone, so a limit parameter meant callers requesting different\n * amounts shared one cache entry and whichever mounted first decided how much\n * of the list every other caller saw.\n *\n * @param username - The account whose mute list to fetch\n */\nexport function getMutedUsersQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.mutedUsers(username!),\n queryFn: async () => {\n const muted: string[] = [];\n let start = \"\";\n\n for (let page = 0; page < MUTED_USERS_MAX_PAGES; page++) {\n const response = (await callRPC(\"condenser_api.get_following\", [\n username,\n start,\n \"ignore\",\n MUTED_USERS_PAGE_SIZE,\n ])) as Follow[];\n\n if (!response?.length) {\n break;\n }\n\n let names = response.map((user) => user.following);\n\n // `start` is exclusive on Hive, so a page should not repeat the cursor.\n // Drop it defensively anyway: against a node treating `start` as\n // inclusive, this loop would otherwise re-append the same account until\n // it hit the page cap.\n if (names[0] === start) {\n names = names.slice(1);\n }\n\n if (!names.length) {\n break;\n }\n\n muted.push(...names);\n\n if (response.length < MUTED_USERS_PAGE_SIZE) {\n break;\n }\n\n start = names[names.length - 1];\n }\n\n return muted;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Lookup accounts by username prefix\n *\n * @param query - Username prefix to search for\n * @param limit - Maximum number of results (default: 50)\n */\nexport function lookupAccountsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.lookup(query, limit),\n queryFn: () =>\n callRPC(\"condenser_api.lookup_accounts\", [\n query,\n limit,\n ]) as Promise,\n enabled: !!query,\n staleTime: Infinity,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountsByUsernameQueryOptions(\n query: string,\n limit = 5,\n excludeList: string[] = []\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.search(query, excludeList),\n enabled: !!query,\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.lookup_accounts\", [query, limit])) as string[];\n return response.filter((item) =>\n excludeList.length > 0 ? !excludeList.includes(item) : true\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountProfile } from \"../types\";\n\ntype AccountProfileToken = NonNullable[number];\n\nexport type WalletMetadataCandidate = Partial & {\n currency?: string;\n show?: boolean;\n address?: string;\n publicKey?: string;\n privateKey?: string;\n username?: string;\n};\n\nexport interface CheckUsernameWalletsPendingResponse {\n exist: boolean;\n tokens?: WalletMetadataCandidate[];\n wallets?: WalletMetadataCandidate[];\n}\n\nconst RESERVED_META_KEYS = new Set([\n \"ownerPublicKey\",\n \"activePublicKey\",\n \"postingPublicKey\",\n \"memoPublicKey\",\n]);\n\ninterface WalletsEndpointResponseItem {\n token?: unknown;\n address?: unknown;\n status?: unknown;\n meta?: unknown;\n username?: unknown;\n}\n\nexport function checkUsernameWalletsPendingQueryOptions(\n username: string,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkWalletPending(username, code ?? null),\n queryFn: async () => {\n if (!username || !code) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/wallets\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code,\n }),\n }\n );\n\n if (!response.ok) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const payload = (await response.json()) as unknown;\n\n const wallets: WalletMetadataCandidate[] = Array.isArray(payload)\n ? payload.flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const walletItem = item as WalletsEndpointResponseItem;\n\n const symbol =\n typeof walletItem.token === \"string\"\n ? walletItem.token\n : undefined;\n\n if (!symbol) {\n return [];\n }\n\n const meta: Record =\n walletItem.meta && typeof walletItem.meta === \"object\"\n ? { ...(walletItem.meta as Record) }\n : {};\n\n const sanitizedMeta: Record = {};\n\n const address =\n typeof walletItem.address === \"string\" && walletItem.address\n ? walletItem.address\n : undefined;\n\n const statusShow =\n typeof walletItem.status === \"number\"\n ? walletItem.status === 3\n : undefined;\n\n const showFlag = statusShow ?? false;\n\n if (address) {\n sanitizedMeta.address = address;\n }\n\n sanitizedMeta.show = showFlag;\n\n const baseCandidate = {\n symbol,\n currency: symbol,\n address,\n show: showFlag,\n type: \"CHAIN\",\n meta: sanitizedMeta,\n } satisfies WalletMetadataCandidate;\n\n const metaTokenCandidates: WalletMetadataCandidate[] = [];\n\n for (const [metaSymbol, metaValue] of Object.entries(meta)) {\n if (typeof metaSymbol !== \"string\") {\n continue;\n }\n\n if (RESERVED_META_KEYS.has(metaSymbol)) {\n continue;\n }\n\n if (typeof metaValue !== \"string\" || !metaValue) {\n continue;\n }\n\n if (!/^[A-Z0-9]{2,10}$/.test(metaSymbol)) {\n continue;\n }\n\n metaTokenCandidates.push({\n symbol: metaSymbol,\n currency: metaSymbol,\n address: metaValue,\n show: showFlag,\n type: \"CHAIN\",\n meta: { address: metaValue, show: showFlag },\n });\n }\n\n return [baseCandidate, ...metaTokenCandidates];\n })\n : [];\n\n return {\n exist: wallets.length > 0,\n tokens: wallets.length ? wallets : undefined,\n wallets: wallets.length ? wallets : undefined,\n } satisfies CheckUsernameWalletsPendingResponse;\n },\n refetchOnMount: true,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountRelationship } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRelationshipBetweenAccountsQueryOptions(\n reference: string | undefined,\n target: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.relations(reference, target),\n enabled: !!reference && !!target,\n refetchOnMount: false,\n refetchInterval: 3_600_000,\n queryFn: async () => {\n const fallback: AccountRelationship = {\n follows: false,\n ignores: false,\n blacklists: false,\n follows_muted: false,\n follows_blacklists: false,\n };\n\n // `enabled` only gates the automatic useQuery run. fetchQuery and\n // prefetchQuery invoke queryFn regardless, so guard here as well rather\n // than sending a missing account name to the RPC and caching the result.\n if (!reference || !target) {\n return fallback;\n }\n\n const result = await callRPC(\"bridge.get_relationship_between_accounts\", [reference, target]);\n return (result ?? fallback) as AccountRelationship;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype Subscriptions = string[];\n\nexport function getAccountSubscriptionsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.subscriptions(username!),\n enabled: !!username,\n queryFn: async ({ signal }) => {\n const response = await callRPC(\"bridge.list_all_subscriptions\", {\n account: username,\n }, undefined, undefined, signal);\n return (response ?? []) as Subscriptions;\n },\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountBookmark } from \"../types\";\n\nexport function getBookmarksQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.bookmarks(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Bookmarks] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountBookmark[];\n },\n });\n}\n\nexport function getBookmarksInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.bookmarksInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bookmarks: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../types\";\n\nexport function getFavoritesQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.favorites(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountFavorite[];\n },\n });\n}\n\nexport function getFavoritesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.favoritesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/favorites?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch favorites: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n/**\n * Query options to check if a specific account is in the active user's favorites\n * @param activeUsername - The logged-in user's username\n * @param code - Access token for authentication\n * @param targetUsername - The username to check if favorited\n * @returns Query options for checking if target is favorited\n */\nexport function checkFavoriteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n targetUsername: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkFavorite(activeUsername!, targetUsername!),\n enabled: !!activeUsername && !!code && !!targetUsername,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n if (!targetUsername) {\n throw new Error(\"[SDK][Accounts][Favorites] – no target username\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-check\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n account: targetUsername,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n const result = await response.json();\n if (typeof result !== \"boolean\") {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check returned invalid type: expected boolean, got ${typeof result}`\n );\n }\n\n return result;\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetRecoveriesEmailResponse } from \"../types\";\n\nexport function getAccountRecoveriesQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n enabled: !!username && !!code,\n queryKey: QueryKeys.accounts.recoveries(username!),\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Accounts] Missing username or access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/recoveries\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n return response.json() as Promise;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountPendingRecoveryQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n enabled: !!username,\n queryKey: QueryKeys.accounts.pendingRecovery(username!),\n queryFn: () =>\n callRPC(\"database_api.find_change_recovery_account_requests\", { accounts: [username] }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountReputation } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountReputationsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.reputations(query, limit),\n enabled: !!query,\n queryFn: async (): Promise => {\n if (!query) {\n return [];\n }\n\n return callRPC(\"condenser_api.get_account_reputations\", [query, limit]) as Promise;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { utils } from \"../../../hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Transaction, OperationGroup } from \"../types/transaction\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { parseAsset, NaiMap } from \"@/modules/core/utils\";\n\nconst ops = utils.operations;\n\nexport const ACCOUNT_OPERATION_GROUPS: Record = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n};\n\nexport const ALL_ACCOUNT_OPERATIONS = [...Object.values(ACCOUNT_OPERATION_GROUPS)].reduce(\n (acc, val) => acc.concat(val),\n []\n);\n\ninterface TxPageRaw {\n entries: Transaction[];\n currentPage: number;\n}\n\n/**\n * Cursor for transaction pagination.\n * null = first request (returns newest page, API omits page param).\n * number = specific page to fetch (decrementing for older data).\n */\ntype TxCursor = number | null;\n\ninterface HafahOperation {\n op: {\n type: string;\n value: Record;\n };\n block: number;\n trx_id: string;\n op_pos: number;\n op_type_id: number;\n timestamp: string;\n virtual_op: boolean;\n operation_id: string;\n trx_in_block: number;\n}\n\ninterface HafahResponse {\n total_operations: number;\n total_pages: number;\n operations_result: HafahOperation[];\n}\n\n/**\n * Derive a safe, unique, and chronologically ordered `num` from REST fields.\n *\n * Layout: block * 10_000_000 + trx_in_block * 100 + op_pos\n * - trx_in_block: up to 99_999 (Hive max block size ~65K txs)\n * - op_pos: up to 99 (operations within a single transaction)\n * - Max value: 105_000_000 * 10_000_000 = 1.05e15, within MAX_SAFE_INTEGER (9.007e15)\n */\nfunction deriveNum(entry: HafahOperation): number {\n return entry.block * 10_000_000 + entry.trx_in_block * 100 + entry.op_pos;\n}\n\n/**\n * Strip the `_operation` suffix from the REST API type name\n * to match the Transaction type discriminants (e.g. \"transfer\").\n */\nfunction normalizeOpType(restType: string): string {\n return restType.replace(/_operation$/, \"\");\n}\n\n/**\n * Check if a value is a NAI asset object (e.g. { nai: \"@@000000021\", amount: \"1000\", precision: 3 }).\n */\nfunction isNaiAsset(v: unknown): v is { nai: string; amount: string; precision: number } {\n return typeof v === \"object\" && v !== null && \"nai\" in v && \"amount\" in v && \"precision\" in v;\n}\n\n/**\n * Convert a NAI asset object to a human-readable string like \"1.000 HIVE\".\n * Returns the value unchanged if it's not a NAI object.\n */\nfunction naiToString(v: unknown): unknown {\n if (!isNaiAsset(v)) return v;\n const parsed = parseAsset(v);\n const symbol = NaiMap[v.nai as keyof typeof NaiMap] ?? \"UNKNOWN\";\n return `${parsed.amount.toFixed(v.precision)} ${symbol}`;\n}\n\n/**\n * Convert all NAI asset objects in an operation's value to human-readable strings\n * so downstream renderers that expect \"1.000 HIVE\" don't crash with object values.\n */\nfunction normalizeOpValue(value: Record): Record {\n const result: Record = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = naiToString(v);\n }\n return result;\n}\n\n/**\n * Get account transaction history with pagination and filtering.\n * Uses the hafah-api REST endpoint for server-side op-type filtering\n * and real pagination metadata.\n *\n * @param username - Account name to get transactions for\n * @param limit - Number of transactions per page\n * @param group - Filter by operation group (transfers, market-orders, etc.)\n */\nexport function getTransactionsInfiniteQueryOptions(\n username?: string,\n limit = 20,\n group: OperationGroup | \"\" = \"\"\n) {\n const operationTypes = group\n ? ACCOUNT_OPERATION_GROUPS[group]\n : ALL_ACCOUNT_OPERATIONS;\n\n return infiniteQueryOptions<\n TxPageRaw,\n Error,\n InfiniteData,\n (string | number)[],\n TxCursor\n >({\n queryKey: QueryKeys.accounts.transactions(username ?? \"\", group, limit),\n initialPageParam: null as TxCursor,\n\n queryFn: async ({ pageParam, signal }: { pageParam: TxCursor; signal?: AbortSignal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"operation-types\": operationTypes.join(\",\"),\n \"page-size\": limit,\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number (decrementing)\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"hafah\",\n \"/accounts/{account-name}/operations\",\n params,\n undefined,\n undefined,\n signal\n )) as HafahResponse;\n\n const entries = response.operations_result.map((entry) => {\n const type = normalizeOpType(entry.op.type);\n const value = normalizeOpValue(entry.op.value);\n return {\n ...value,\n num: deriveNum(entry),\n type,\n timestamp: entry.timestamp,\n trx_id: entry.trx_id,\n } as Transaction;\n });\n\n return {\n entries,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getBotsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.bots(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/public/bots\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bots: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n refetchOnMount: true,\n staleTime: Infinity,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { ReferralItem } from \"../types/referral\";\n\ntype PageParam = { maxId?: number };\n\nexport function getReferralsInfiniteQueryOptions(username: string) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.referrals(username),\n initialPageParam: { maxId: undefined } as PageParam,\n queryFn: async ({ pageParam }: { pageParam: PageParam }) => {\n const { maxId } = pageParam ?? {};\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(`/private-api/referrals/${username}`, baseUrl);\n\n if (maxId !== undefined) {\n url.searchParams.set(\"max_id\", maxId.toString());\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referrals: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n getNextPageParam: (lastPage: ReferralItem[]) => {\n const nextMaxId = lastPage?.[lastPage.length - 1]?.id;\n return typeof nextMaxId === \"number\" ? ({ maxId: nextMaxId } as PageParam) : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ReferralStat } from \"../types/referral\";\n\ninterface ReferralStatsResponse {\n total?: number;\n rewarded?: number;\n}\n\nexport function getReferralsStatsQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.referralsStats(username),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/referrals/${username}/stats`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referral stats: ${response.status}`);\n }\n\n const data = await response.json() as ReferralStatsResponse;\n\n if (!data) {\n throw new Error(\"No Referrals for this user!\");\n }\n\n return {\n total: data.total ?? 0,\n rewarded: data.rewarded ?? 0,\n } as ReferralStat;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendsRow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FriendsPageParam {\n startFollowing: string;\n}\n\ntype FriendsPage = FriendsRow[];\n\n/**\n * Get list of friends (following/followers) with profile information\n *\n * @param following - The account whose friends to get\n * @param mode - \"following\" or \"followers\"\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Number of results per page (default: 100)\n * @param enabled - Whether query is enabled (default: true)\n */\nexport function getFriendsInfiniteQueryOptions(\n following: string,\n mode: \"following\" | \"followers\",\n options?: {\n followType?: string;\n limit?: number;\n enabled?: boolean;\n }\n) {\n const { followType = \"blog\", limit = 100, enabled = true } = options ?? {};\n\n return infiniteQueryOptions<\n FriendsPage,\n Error,\n InfiniteData,\n (string | number)[],\n FriendsPageParam\n >({\n queryKey: QueryKeys.accounts.friends(following, mode, followType, limit),\n initialPageParam: { startFollowing: \"\" } as FriendsPageParam,\n enabled,\n refetchOnMount: true,\n\n queryFn: async ({ pageParam }: { pageParam: FriendsPageParam }) => {\n const { startFollowing } = pageParam;\n\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [following, startFollowing === \"\" ? null : startFollowing, followType, limit])) as Follow[];\n\n const accountNames = response.map((e) =>\n mode === \"following\" ? e.following : e.follower\n );\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n const rows: FriendsPage = (accounts ?? []).map((a) => ({\n name: a.name,\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n }));\n\n return rows;\n },\n\n getNextPageParam: (lastPage: FriendsPage): FriendsPageParam | undefined =>\n lastPage && lastPage.length === limit\n ? { startFollowing: lastPage[lastPage.length - 1].name }\n : undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendSearchResult } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst SEARCH_LIMIT = 30;\n\n/**\n * Search friends (following/followers) by query string\n *\n * @param username - The account whose friends to search\n * @param mode - \"following\" or \"followers\"\n * @param query - Search query string\n */\nexport function getSearchFriendsQueryOptions(\n username: string,\n mode: \"following\" | \"followers\",\n query: string\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.searchFriends(username, mode, query),\n refetchOnMount: false,\n enabled: false, // Manual query via refetch\n queryFn: async (): Promise => {\n if (!query) return [];\n\n const start = query.slice(0, -1);\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [username, start, \"blog\", 1000])) as Follow[];\n\n const accountNames = response\n .map((e) => (mode === \"following\" ? e.following : e.follower))\n .filter((name) => name.toLowerCase().includes(query.toLowerCase()))\n .slice(0, SEARCH_LIMIT);\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n return (\n accounts?.map((a) => ({\n name: a.name,\n full_name: a.metadata.profile?.name || \"\",\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n })) ?? []\n );\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsQueryOptions(limit = 20) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTags(),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags\n .filter((x) => x.name !== \"\")\n .filter((x) => !x.name.startsWith(\"hive-\"))\n .map((x) => x.name)\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length > 0\n ? { afterTag: lastPage[lastPage.length - 1] }\n : undefined,\n staleTime: 60 * 60 * 1000, // 1 hour — tags change slowly\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { isCommunity } from \"@/modules/core/utils\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsWithStatsQueryOptions(limit = 250) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTagsWithStats(limit),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags.filter((tag) => tag.name !== \"\").filter((tag) => !isCommunity(tag.name))\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length ? { afterTag: lastPage[lastPage.length - 1].name } : undefined,\n staleTime: Infinity,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\n\nexport function getFragmentsQueryOptions(username: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.fragments(username),\n queryFn: async () => {\n if (!code) {\n return [];\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return response.json() as Promise;\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getFragmentsInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.fragmentsInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/fragments?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch fragments: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { ConfigManager, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n// TODO: replace any with Entry\nexport function getPromotedPostsQuery(\n type: \"feed\" | \"waves\" = \"feed\"\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.promoted(type),\n queryFn: async () => {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/promoted-entries\", baseUrl);\n if (type === \"waves\") {\n url.searchParams.append(\"short_content\", \"1\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n const data = await response.json();\n return data as T[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry, Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getEntryActiveVotesQueryOptions(entry?: Entry) {\n return queryOptions({\n queryKey: QueryKeys.posts.entryActiveVotes(entry?.author, entry?.permlink),\n queryFn: async () => {\n return callRPC(\"condenser_api.get_active_votes\", [\n entry?.author,\n entry?.permlink,\n ]) as Promise;\n },\n enabled: !!entry,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a specific user's vote on a post\n * Useful when post has >1000 votes to efficiently get one user's vote\n *\n * @param username - The voter's username\n * @param author - The post author\n * @param permlink - The post permlink\n */\nexport function getUserPostVoteQueryOptions(\n username: string | undefined,\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.userPostVote(username!, author!, permlink!),\n queryFn: async () => {\n const result = await callRPC(\"database_api.list_votes\", {\n start: [username, author, permlink],\n limit: 1,\n order: \"by_voter_comment\"\n });\n\n // Return first vote if found, otherwise null\n return (result?.votes?.[0] || null) as Vote | null;\n },\n enabled: !!username && !!author && !!permlink,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.content(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentRepliesQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.contentReplies(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content_replies\", {\n author,\n permlink,\n }) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostHeaderQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.postHeader(author, permlink),\n queryFn: async () => {\n return callRPC(\"bridge.get_post_header\", {\n author,\n permlink,\n }) as Promise;\n },\n initialData: null,\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { Entry } from \"../types\";\n\n/**\n * Filters and censors entries that match DMCA patterns\n * @param entry - Single entry or array of entries to filter\n * @returns Filtered entry/entries with DMCA content censored.\n * Note: Can return null/undefined if input is falsy - callers should guard against this.\n */\nexport function filterDmcaEntry(entry: Entry): Entry | null | undefined;\nexport function filterDmcaEntry(entries: Entry[]): Entry[];\nexport function filterDmcaEntry(entryOrEntries: Entry | Entry[] | null | undefined): Entry | Entry[] | null | undefined {\n if (Array.isArray(entryOrEntries)) {\n // Array elements are non-null Entries, so applyFilter never returns nullish here.\n return entryOrEntries.map((entry) => applyFilter(entry)) as Entry[];\n }\n return applyFilter(entryOrEntries);\n}\n\nfunction applyFilter(entry: Entry | null | undefined): Entry | null | undefined {\n if (!entry) return entry;\n\n const entryPath = `@${entry.author}/${entry.permlink}`;\n const isDmca =\n CONFIG.dmcaPatterns.includes(entryPath) ||\n CONFIG.dmcaPatternRegexes.some((regex) => regex.test(entryPath));\n\n if (isDmca) {\n return {\n ...entry,\n body: \"This post is not available due to a copyright/fraudulent claim.\",\n title: \"\",\n };\n }\n\n return entry;\n}\n","import { callWithQuorum } from \"../../hive-tx\";\nimport { Entry } from \"@/modules/posts/types\";\n\n/**\n * When the primary node returns null for a get_post call,\n * verify by querying multiple random nodes. If any node\n * returns the post, it exists (the first node was lagging).\n *\n * Uses callWithQuorum(quorum=1) which shuffles and queries\n * nodes in batches. Since it shuffles, it's unlikely to hit\n * the same node that just returned null first.\n */\nexport async function verifyPostOnAlternateNode(\n author: string,\n permlink: string,\n observer: string\n): Promise {\n try {\n const response = await callWithQuorum(\"bridge.get_post\", {\n author,\n permlink,\n observer,\n }, 1);\n\n if (\n response &&\n typeof response === \"object\" &&\n (response as Entry).author === author &&\n (response as Entry).permlink === permlink\n ) {\n return response as Entry;\n }\n } catch {\n // All nodes failed or returned null\n }\n\n return null;\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { verifyPostOnAlternateNode } from \"@/modules/bridge/verify-on-alternate-node\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostQueryOptions(\n author: string,\n permlink?: string,\n observer = \"\",\n num?: number\n) {\n const cleanPermlink = permlink?.trim();\n const entryPath = `/@${author}/${cleanPermlink ?? \"\"}`;\n\n return queryOptions({\n queryKey: QueryKeys.posts.entry(entryPath),\n queryFn: async () => {\n if (!cleanPermlink || cleanPermlink === \"undefined\") {\n return null;\n }\n\n // hive-tx tries nodes in order; the first healthy node (index 0) handles this call.\n // If it returns null, verifyPostOnAlternateNode skips index 0 and tries others.\n const response = await callRPC(\"bridge.get_post\", {\n author,\n permlink: cleanPermlink,\n observer,\n });\n\n if (!response) {\n // Primary node returned null — verify on alternate nodes\n // to guard against sync lag returning null for valid posts\n const verified = await verifyPostOnAlternateNode(author, cleanPermlink, observer);\n if (!verified) {\n return null;\n }\n const verifiedEntry = num !== undefined ? { ...verified, num } as Entry : verified as Entry;\n return filterDmcaEntry(verifiedEntry);\n }\n\n const entry = num !== undefined ? { ...response, num } as Entry : response as Entry;\n return filterDmcaEntry(entry);\n },\n enabled:\n !!author &&\n !!permlink &&\n permlink.trim() !== \"\" &&\n permlink.trim() !== \"undefined\",\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { AccountRelationship, Profile } from \"@/modules/accounts/types\";\nimport { Community } from \"@/modules/communities/types/community\";\nimport { Subscription } from \"@/modules/communities/types/subscription\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { filterDmcaEntry } from \"@/modules/posts/utils/filter-dmca-entries\";\n\ntype BridgeParams = Record | unknown[];\n\nexport function bridgeApiCall(endpoint: string, params: BridgeParams, signal?: AbortSignal): Promise {\n return callRPC(`bridge.${endpoint}`, params, undefined, undefined, signal) as Promise;\n}\n\nexport async function resolvePost(\n post: Entry,\n observer: string,\n num?: number,\n signal?: AbortSignal\n): Promise {\n const { json_metadata: json } = post;\n\n if (json?.original_author && json?.original_permlink && json.tags?.[0] === \"cross-post\") {\n try {\n const resp = await getPost(\n json.original_author,\n json.original_permlink,\n observer,\n num,\n signal\n );\n if (resp) {\n return {\n ...post,\n original_entry: resp,\n num,\n };\n }\n return post;\n } catch {\n return post;\n }\n }\n\n return { ...post, num };\n}\n\nasync function resolvePosts(posts: Entry[], observer: string, signal?: AbortSignal): Promise {\n const validatedPosts = posts.map(validateEntry);\n const resolved = await Promise.all(validatedPosts.map((p) => resolvePost(p, observer, undefined, signal)));\n return filterDmcaEntry(resolved) as Entry[];\n}\n\nexport async function getPostsRanked(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_ranked_posts\", {\n sort,\n start_author,\n start_permlink,\n limit,\n tag,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_ranked_posts returned ${typeof resp} instead of an array for sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\nexport async function getAccountPosts(\n sort: string,\n account: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n if (CONFIG.dmcaAccounts.includes(account)) {\n return [];\n }\n\n const resp = await bridgeApiCall(\"get_account_posts\", {\n sort,\n account,\n start_author,\n start_permlink,\n limit,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_account_posts returned ${typeof resp} instead of an array for account=${account}, sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\n/**\n * Validates that an Entry object has required properties with non-null values.\n */\nfunction validateEntry(entry: Entry): Entry {\n const newEntry: Entry = {\n ...entry,\n active_votes: Array.isArray(entry.active_votes) ? [...entry.active_votes] : [],\n beneficiaries: Array.isArray(entry.beneficiaries) ? [...entry.beneficiaries] : [],\n blacklists: Array.isArray(entry.blacklists) ? [...entry.blacklists] : [],\n replies: Array.isArray(entry.replies) ? [...entry.replies] : [],\n stats: entry.stats ? { ...entry.stats } : null,\n };\n\n const requiredStringProps: (keyof Entry)[] = [\n \"author\",\n \"title\",\n \"body\",\n \"created\",\n \"category\",\n \"permlink\",\n \"url\",\n \"updated\",\n ];\n\n for (const prop of requiredStringProps) {\n if (newEntry[prop] == null) {\n (newEntry as any)[prop] = \"\";\n }\n }\n\n if (newEntry.author_reputation == null) {\n newEntry.author_reputation = 0;\n }\n if (newEntry.children == null) {\n newEntry.children = 0;\n }\n if (newEntry.depth == null) {\n newEntry.depth = 0;\n }\n if (newEntry.net_rshares == null) {\n newEntry.net_rshares = 0;\n }\n if (newEntry.payout == null) {\n newEntry.payout = 0;\n }\n if (newEntry.percent_hbd == null) {\n newEntry.percent_hbd = 0;\n }\n\n if (!newEntry.stats) {\n newEntry.stats = {\n flag_weight: 0,\n gray: false,\n hide: false,\n total_votes: 0,\n };\n }\n\n if (newEntry.author_payout_value == null) {\n newEntry.author_payout_value = \"0.000 HBD\";\n }\n if (newEntry.curator_payout_value == null) {\n newEntry.curator_payout_value = \"0.000 HBD\";\n }\n if (newEntry.max_accepted_payout == null) {\n newEntry.max_accepted_payout = \"1000000.000 HBD\";\n }\n if (newEntry.payout_at == null) {\n newEntry.payout_at = \"\";\n }\n if (newEntry.pending_payout_value == null) {\n newEntry.pending_payout_value = \"0.000 HBD\";\n }\n if (newEntry.promoted == null) {\n newEntry.promoted = \"0.000 HBD\";\n }\n\n if (newEntry.is_paidout == null) {\n newEntry.is_paidout = false;\n }\n\n return newEntry;\n}\n\nexport async function getPost(\n author: string = \"\",\n permlink: string = \"\",\n observer: string = \"\",\n num?: number,\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_post\", {\n author,\n permlink,\n observer,\n }, signal);\n\n if (resp) {\n const validatedEntry = validateEntry(resp);\n const post = await resolvePost(validatedEntry, observer, num, signal);\n return filterDmcaEntry(post) as Entry;\n }\n\n return undefined;\n}\n\nexport async function getPostHeader(\n author: string = \"\",\n permlink: string = \"\"\n): Promise {\n const resp = await bridgeApiCall(\"get_post_header\", {\n author,\n permlink,\n });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getDiscussion(\n author: string,\n permlink: string,\n observer?: string\n): Promise | null> {\n const resp = await bridgeApiCall | null>(\"get_discussion\", {\n author,\n permlink,\n observer: observer || author,\n });\n\n if (resp) {\n const validatedResp: Record = {};\n for (const [key, entry] of Object.entries(resp)) {\n validatedResp[key] = validateEntry(entry);\n }\n return validatedResp;\n }\n return resp;\n}\n\nexport async function getCommunity(\n name: string,\n observer: string | undefined = \"\"\n): Promise {\n return bridgeApiCall(\"get_community\", { name, observer });\n}\n\nexport async function getCommunities(\n last: string = \"\",\n limit: number = 100,\n query?: string | null,\n sort: string = \"rank\",\n observer: string = \"\"\n): Promise {\n return bridgeApiCall(\"list_communities\", {\n last,\n limit,\n query,\n sort,\n observer,\n });\n}\n\nexport async function normalizePost(post: unknown): Promise {\n const resp = await bridgeApiCall(\"normalize_post\", { post });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getSubscriptions(account: string): Promise {\n return bridgeApiCall(\"list_all_subscriptions\", { account });\n}\n\nexport async function getSubscribers(community: string): Promise {\n return bridgeApiCall(\"list_subscribers\", { community });\n}\n\nexport async function getRelationshipBetweenAccounts(\n follower: string,\n following: string\n): Promise {\n return bridgeApiCall(\"get_relationship_between_accounts\", [\n follower,\n following,\n ]);\n}\n\nexport async function getProfiles(\n accounts: string[],\n observer?: string\n): Promise {\n return bridgeApiCall(\"get_profiles\", { accounts, observer });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getDiscussion } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport enum SortOrder {\n trending = \"trending\",\n author_reputation = \"author_reputation\",\n votes = \"votes\",\n created = \"created\",\n}\n\nfunction parseAsset(value: string): { amount: number; symbol: string } {\n const match = value.match(/^(\\d+\\.?\\d*)\\s*([A-Z]+)$/);\n if (!match) return { amount: 0, symbol: \"\" };\n return {\n amount: parseFloat(match[1]),\n symbol: match[2],\n };\n}\n\nexport function sortDiscussions(\n entry: Entry,\n discussion: Entry[],\n order: SortOrder\n) {\n const allPayout = (c: Entry) =>\n parseAsset(c.pending_payout_value).amount +\n parseAsset(c.author_payout_value).amount +\n parseAsset(c.curator_payout_value).amount;\n\n const absNegative = (a: Entry) => a.net_rshares < 0;\n const isPinned = (a: Entry) =>\n entry.json_metadata?.pinned_reply === `${a.author}/${a.permlink}`;\n\n const sortOrders = {\n trending: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const _a = allPayout(a);\n const _b = allPayout(b);\n if (_a !== _b) {\n return _b - _a;\n }\n\n return 0;\n },\n author_reputation: (a: Entry, b: Entry) => {\n const keyA = a.author_reputation;\n const keyB = b.author_reputation;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n votes: (a: Entry, b: Entry) => {\n const keyA = a.children;\n const keyB = b.children;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n created: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const keyA = Date.parse(a.created);\n const keyB = Date.parse(b.created);\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n };\n\n const sorted = discussion.sort(sortOrders[order]);\n const pinnedIndex = sorted.findIndex((i) => isPinned(i));\n const pinned = sorted[pinnedIndex];\n if (pinnedIndex >= 0) {\n sorted.splice(pinnedIndex, 1);\n sorted.unshift(pinned);\n }\n return sorted;\n}\n\nexport function getDiscussionsQueryOptions(\n entry: Entry,\n order: SortOrder = SortOrder.created,\n enabled: boolean = true,\n observer?: string\n) {\n // Anonymous readers fall back to CONFIG.defaultObserver rather than the post\n // author. Author-as-observer only helps the minority of authors who curate a\n // mute list; everyone else's comment section came back unfiltered, so the\n // shared moderation account is the better default for logged-out traffic.\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussions(entry?.author, entry?.permlink, order, resolvedObserver),\n queryFn: async () => {\n if (!entry) {\n return [];\n }\n\n const response = await callRPC(\"bridge.get_discussion\", {\n author: entry.author,\n permlink: entry.permlink,\n observer: resolvedObserver,\n });\n\n const results = response\n ? Array.from(Object.values(response as Record))\n : [];\n return filterDmcaEntry(results);\n },\n enabled: enabled && !!entry,\n select: (data: Entry[]) => sortDiscussions(entry, data, order),\n // Preserve optimistic entries during refetch by using structural sharing\n // This ensures newly added comments (is_optimistic: true) aren't wiped out\n // when blockchain hasn't indexed them yet\n structuralSharing: (oldData, newData) => {\n if (!oldData || !newData) return newData;\n\n // Find optimistic entries in old data that aren't in new data yet\n const optimisticEntries = (oldData as Entry[]).filter(\n (entry: Entry) => entry.is_optimistic === true\n );\n\n const fetchedPermlinks = new Set(\n (newData as Entry[]).map((e: Entry) => `${e.author}/${e.permlink}`)\n );\n\n const missingOptimistic = optimisticEntries.filter(\n (opt: Entry) => !fetchedPermlinks.has(`${opt.author}/${opt.permlink}`)\n );\n\n // If there are optimistic entries missing from new data, preserve them\n if (missingOptimistic.length > 0) {\n return [...(newData as Entry[]), ...missingOptimistic];\n }\n\n return newData;\n },\n });\n}\n\nexport function getDiscussionQueryOptions(\n author: string,\n permlink: string,\n observer?: string,\n enabled = true\n) {\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussion(author, permlink, resolvedObserver),\n enabled: enabled && !!author && !!permlink,\n queryFn: async () =>\n getDiscussion(author, permlink, resolvedObserver) as Promise | null>,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getAccountPosts } from \"@/modules/bridge\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n hasNextPage: boolean;\n};\ntype Page = Entry[];\n\nexport function getAccountPostsInfiniteQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return infiniteQueryOptions<\n Page,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.accountPosts(username ?? \"\", filter, limit, observer),\n enabled: !!username && enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n hasNextPage: true,\n } as PageParam,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!pageParam?.hasNextPage || !username) return [];\n\n const response = await getAccountPosts(\n filter,\n username,\n pageParam.author ?? \"\",\n pageParam.permlink ?? \"\",\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n\n getNextPageParam: (lastPage: Page): PageParam | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n // Only consider there's a next page if we got a full page of results\n // A partial page means we've reached the end\n const hasNextPage = (lastPage?.length ?? 0) === limit;\n\n if (!hasNextPage) {\n return undefined;\n }\n\n return {\n author: last?.author,\n permlink: last?.permlink,\n hasNextPage,\n };\n },\n });\n}\n\nexport function getAccountPostsQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.accountPostsPage(username ?? \"\", filter, start_author, start_permlink, limit, observer),\n enabled: !!username && enabled,\n queryFn: async ({ signal } = {} as any) => {\n if (!username) {\n return [];\n }\n\n const response = await getAccountPosts(\n filter,\n username,\n start_author,\n start_permlink,\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getPostsRanked } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n};\n\ninterface GetPostsRankedOptions {\n resolvePosts?: boolean;\n}\n\n/**\n * `select` runs on every render, and React Query only reuses its previous\n * result when both the data and the select function are unchanged. These\n * options are rebuilt on each render, so an inline arrow would be a new\n * function every time and every page would be re-sorted on every render.\n * One stable function per sort keeps that memoization working.\n */\nconst displaySelects = new Map<\n string,\n (data: InfiniteData) => InfiniteData\n>();\n\nfunction displaySelect(sort: string) {\n let select = displaySelects.get(sort);\n if (!select) {\n select = (data) => ({\n ...data,\n pages: data.pages.map((page) => orderForDisplay(page, sort)),\n });\n displaySelects.set(sort, select);\n }\n return select;\n}\n\n/**\n * Display order for one page.\n *\n * Pinned entries are captured before the created-date sort: the bridge surfaces\n * them at the head of the response in the community moderators' chosen order,\n * which the sort would scatter by age. Every pin is kept, since an earlier\n * post-sort find() kept one and silently dropped the rest, so multi-pin\n * communities never displayed their other pinned posts. Pins only occur on the\n * first page, cursor pages return none, so this is a no-op elsewhere.\n *\n * Applied in `select` rather than in the query function so it cannot reach the\n * pagination cursor.\n */\nfunction orderForDisplay(page: Entry[], sort: string): Entry[] {\n const pinned = page.filter((entry) => entry.stats?.is_pinned);\n const rest = page.filter((entry) => !entry.stats?.is_pinned);\n\n if (sort === \"hot\") {\n return [...pinned, ...rest];\n }\n\n const byCreated = [...rest].sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n return [...pinned, ...byCreated];\n}\n\nexport function getPostsRankedInfiniteQueryOptions(\n sort: string,\n tag: string,\n limit = 20,\n observer = \"\",\n enabled = true,\n _options: GetPostsRankedOptions = {}\n) {\n return infiniteQueryOptions<\n Entry[],\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.postsRanked(sort, tag, limit, observer),\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await callRPC(\"bridge.get_ranked_posts\", {\n sort,\n start_author: pageParam.author,\n start_permlink: pageParam.permlink,\n limit,\n tag: sanitizedTag,\n observer,\n }, undefined, undefined, signal);\n\n if (response === null || response === undefined) {\n return [];\n }\n\n if (!Array.isArray(response)) {\n throw new Error(\n `[SDK] get_ranked_posts returned ${typeof response} for sort=${sort}`\n );\n }\n\n // Kept in the bridge's own order. getNextPageParam takes the cursor from\n // the last entry of the page this returns, and the bridge continues from\n // that entry in ITS ranking, so reordering here made the next request\n // start from the middle of the previous ranked page: for trending, payout\n // and muted the last entry by date is not the last entry by rank, and\n // scrolling repeated some posts and skipped others. Display order is\n // applied in `select`, which React Query runs after pagination.\n return filterDmcaEntry(response as Entry[]);\n },\n select: displaySelect(sort),\n enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n } as PageParam,\n getNextPageParam: (lastPage: Entry[]) => {\n // React Query reads \"there is no next page\" from undefined alone, so\n // returning an object here always left it true. An infinite list\n // then keeps calling fetchNextPage at the end of the feed, appending an\n // empty page each time: the query state churns and the cache grows for as\n // long as the reader sits at the bottom.\n const last = lastPage?.[lastPage.length - 1];\n if (!last) {\n return undefined;\n }\n\n return { author: last.author, permlink: last.permlink };\n },\n });\n}\n\nexport function getPostsRankedQueryOptions(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.postsRankedPage(sort, start_author, start_permlink, limit, tag, observer),\n enabled,\n queryFn: async ({ signal } = {} as any) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await getPostsRanked(\n sort,\n start_author,\n start_permlink,\n limit,\n sanitizedTag,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface BlogEntry {\n author: string;\n permlink: string;\n blog: string;\n reblog_on: string;\n reblogged_on: string;\n entry_id: number;\n}\n\nexport interface Reblog {\n author: string;\n permlink: string;\n}\n\nexport function getReblogsQueryOptions(\n username?: string,\n activeUsername?: string,\n limit = 200\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.reblogs(username ?? \"\", limit),\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.get_blog_entries\", [\n username ?? activeUsername,\n 0,\n limit,\n ])) as BlogEntry[];\n\n return response\n .filter(\n (i) =>\n i.author !== activeUsername &&\n !i.reblogged_on.startsWith(\"1970-\")\n )\n .map((i) => ({ author: i.author, permlink: i.permlink })) as Reblog[];\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of usernames who reblogged a specific post\n */\nexport function getRebloggedByQueryOptions(author?: string, permlink?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.rebloggedBy(author ?? \"\", permlink ?? \"\"),\n queryFn: async () => {\n if (!author || !permlink) {\n return [];\n }\n\n const response = (await callRPC(\"condenser_api.get_reblogged_by\", [author, permlink])) as string[];\n\n return Array.isArray(response) ? response : [];\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Schedule } from \"../types/schedule\";\n\nexport function getSchedulesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.schedules(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getSchedulesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.schedulesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/schedules?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Draft } from \"../types/draft\";\n\nexport function getDraftsQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.drafts(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getDraftsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.draftsInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/drafts?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n const json = await response.json();\n // Normalize response for backwards compatibility\n // If backend doesn't support wrapped format yet, it returns Draft[]\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { UserImage } from \"../types/user-image\";\n\nasync function fetchUserImages(code: string | undefined): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nexport function getImagesQueryOptions(username?: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.images(username),\n queryFn: async () => {\n if (!username || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getGalleryImagesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.galleryImages(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getImagesInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.imagesInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/images?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nexport function getCommentHistoryQueryOptions(author: string, permlink: string, onlyMeta = false) {\n return queryOptions({\n queryKey: QueryKeys.posts.commentHistory(author, permlink, onlyMeta),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n onlyMeta: onlyMeta ? \"1\" : \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nfunction makeEntryPath(author: string, permlink: string): string {\n const cleanAuthor = author?.trim();\n const cleanPermlink = permlink?.trim();\n\n if (!cleanAuthor || !cleanPermlink) {\n throw new Error(\"Invalid entry path: author and permlink are required\");\n }\n\n // Normalize by removing any leading @ or / characters\n const normalizedAuthor = cleanAuthor.replace(/^@+/, \"\");\n const normalizedPermlink = cleanPermlink.replace(/^\\/+/, \"\");\n\n if (!normalizedAuthor || !normalizedPermlink) {\n throw new Error(\"Invalid entry path: author and permlink cannot be empty after normalization\");\n }\n\n return `@${normalizedAuthor}/${normalizedPermlink}`;\n}\n\nexport interface DeletedEntry {\n body: string;\n title: string;\n tags: string[];\n}\n\nexport function getDeletedEntryQueryOptions(author: string, permlink: string) {\n const cleanPermlink = permlink?.trim();\n const cleanAuthor = author?.trim();\n const isValid =\n !!cleanAuthor && !!cleanPermlink && cleanPermlink !== \"undefined\";\n\n const entryPath = isValid ? makeEntryPath(cleanAuthor, cleanPermlink) : \"\";\n\n return queryOptions({\n queryKey: QueryKeys.posts.deletedEntry(entryPath),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink: cleanPermlink || \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n select: (history): DeletedEntry | null => {\n if (!history?.list?.[0]) {\n return null;\n }\n const { body, title, tags } = history.list[0];\n return {\n body,\n title,\n tags,\n };\n },\n enabled: isValid,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { PostTipsResponse } from \"../types/post-tip\";\n\n/**\n * Tips for a single post.\n *\n * Addressed as a GET so the response can be cached. This was a POST, which no\n * cache may store, so the same tip totals were refetched on every mount. The\n * endpoint keys off nothing but author and permlink and needs no auth, and now\n * serves a Cache-Control, so a repeat read can come from the browser instead of\n * the network.\n *\n * `staleTime` is kept at or below the endpoint's own cache window rather than\n * extending it. react-query cannot see how old a response already was when\n * `fetch` served it from the browser cache, so it restarts its window from zero\n * on a body that may already be near expiry; worst-case staleness is the two\n * windows added together.\n */\nexport function getPostTipsQueryOptions(author: string, permlink: string, isEnabled = true) {\n return queryOptions({\n queryKey: QueryKeys.posts.tips(author, permlink),\n queryFn: async () => {\n const path = `/private-api/post-tips/${encodeURIComponent(author)}/${encodeURIComponent(permlink)}`;\n const response = await fetch(CONFIG.privateApiHost + path, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post tips: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink && isEnabled,\n staleTime: 60 * 1000,\n });\n}\n","import { Entry, WaveEntry } from \"../types\";\nimport { getDiscussionsQueryOptions, SortOrder } from \"../queries/get-discussions-query-options\";\nimport { CONFIG } from \"@/modules/core\";\n\ntype EntryWithPostId = Entry & { post_id: number };\n\nfunction normalizeContainer(entry: EntryWithPostId, host: string): WaveEntry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds send the publish time as `timestamp`, not `created`.\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n host\n } as WaveEntry;\n}\n\nfunction normalizeParent(entry: EntryWithPostId): Entry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id\n } as Entry;\n}\n\nexport function normalizeWaveEntryFromApi(\n entry:\n | (Entry & { post_id: number; container?: EntryWithPostId | null; parent?: EntryWithPostId | null })\n | null\n | undefined,\n host: string\n): WaveEntry | null {\n if (!entry) {\n return null;\n }\n\n const containerSource = entry.container ?? entry;\n const container = normalizeContainer(containerSource, host);\n\n const parent = entry.parent ? normalizeParent(entry.parent) : undefined;\n\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds (following / tag / account) send the publish\n // time as `timestamp`, not `created`; map it so the relative time renders on\n // every card (the For You feed already carries a real `created` from Hive RPC).\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n // The private-api waves feeds omit max_accepted_payout; default it (and the\n // payout strings) to the Hive shape so payout-rendering consumers run their\n // pending+author+curator summation instead of treating the value as missing.\n max_accepted_payout: entry.max_accepted_payout || \"1000000.000 HBD\",\n pending_payout_value: entry.pending_payout_value || \"0.000 HBD\",\n author_payout_value: entry.author_payout_value || \"0.000 HBD\",\n curator_payout_value: entry.curator_payout_value || \"0.000 HBD\",\n host,\n container,\n parent\n } as WaveEntry;\n}\n\nexport function toEntryArray(x: unknown): Entry[] {\n return Array.isArray(x) ? (x as Entry[]) : [];\n}\n\nexport async function getVisibleFirstLevelThreadItems(\n container: WaveEntry\n): Promise {\n const queryOptions = getDiscussionsQueryOptions(container, SortOrder.created, true);\n const discussionItemsRaw = await CONFIG.queryClient.fetchQuery(queryOptions);\n const discussionItems = toEntryArray(discussionItemsRaw);\n\n if (discussionItems.length <= 1) {\n return [];\n }\n\n const firstLevelItems = discussionItems.filter(\n ({ parent_author, parent_permlink }) =>\n parent_author === container.author && parent_permlink === container.permlink\n );\n\n if (firstLevelItems.length === 0) {\n return [];\n }\n\n const visibleItems = firstLevelItems.filter((item) => !item.stats?.gray);\n\n return visibleItems;\n}\n\nexport function mapThreadItemsToWaveEntries(\n items: Entry[],\n container: WaveEntry,\n host: string\n): WaveEntry[] {\n if (items.length === 0) {\n return [];\n }\n\n return items\n .map((item) => {\n const parent = items.find(\n (i) =>\n i.author === item.parent_author &&\n i.permlink === item.parent_permlink &&\n i.author !== host\n );\n\n return {\n ...item,\n id: item.post_id,\n host,\n container,\n parent\n } as WaveEntry;\n })\n .filter((entry) => entry.container.post_id !== entry.post_id)\n .sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\ntype WavesFeedRow = Entry & {\n post_id: number;\n // The wave's container account (e.g. ecency.waves, leothreads), so a mixed\n // cross-container feed can be rendered and acted on per item.\n host?: string;\n // Opaque keyset cursor pointing just past this row.\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type WavesFeedEntry = WaveEntry & { _cursor?: string };\n\nexport interface WavesFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only waves carrying this tag (across all containers). */\n tag?: string;\n /** Only waves from accounts this user follows (across all containers). */\n following?: string;\n /** Only this author's waves (across all containers); the per-author feed. */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedFeedParams {\n containers: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: WavesFeedParams): NormalizedFeedParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n following: params.following?.trim().toLowerCase() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchWavesFeedPage(\n { containers, tag, following, author, observer, limit }: NormalizedFeedParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/feed\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (following) {\n url.searchParams.set(\"following\", following);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves feed: ${response.status}`);\n }\n\n const data = (await response.json()) as WavesFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return { ...entry, _cursor: row._cursor } as WavesFeedEntry;\n })\n .filter((entry): entry is WavesFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container waves feed (the chronological \"For You\" stream, and\n * the Following / Tag feeds via filters).\n *\n * A single esync-backed call returns the newest waves across every indexed\n * container, already merged and time-ordered, with keyset (cursor) pagination,\n * replacing the per-container chain-RPC scan. The optional `tag` / `following`\n * filters narrow the same stream without changing the cursor.\n */\nexport function getWavesFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchWavesFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination. A short page (fewer than `limit` rows) is the\n // end-of-feed signal; on a full page the server always returns the next\n // cursor on the last row. Stopping (rather than looping) is the safe\n // fallback if that cursor were ever absent.\n getNextPageParam: (lastPage: WavesFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n\n/**\n * Page-one of the combined feed as a plain (non-infinite) query under a distinct\n * key, for the \"new waves\" poll. Separate from {@link getWavesFeedQueryOptions}\n * so refreshing it never truncates the infinite feed's loaded pages.\n */\nexport function getWavesLatestFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return queryOptions({\n queryKey: [\n ...QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n \"latest\"\n ],\n staleTime: 0,\n queryFn: ({ signal }) => fetchWavesFeedPage(normalized, undefined, signal)\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\n/** The 3Speak video a short embeds, as returned by esync /api/waves/shorts. */\nexport interface ShortVideo {\n platform: string;\n author: string;\n permlink: string;\n embed_url: string;\n thumbnail_url: string | null;\n duration_secs: number | null;\n}\n\ntype ShortsFeedRow = Entry & {\n post_id: number;\n host?: string;\n video?: ShortVideo;\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type ShortsFeedEntry = WaveEntry & {\n /** The embedded 3Speak video reference for the reels player. */\n video?: ShortVideo;\n _cursor?: string;\n};\n\nexport interface ShortsFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only shorts carrying this tag (across all containers). */\n tag?: string;\n /** Only this author's shorts (across all containers). */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedShortsParams {\n containers: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: ShortsFeedParams): NormalizedShortsParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchShortsFeedPage(\n { containers, tag, author, observer, limit }: NormalizedShortsParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/shorts\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch shorts feed: ${response.status}`);\n }\n\n const data = (await response.json()) as ShortsFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return {\n ...entry,\n // A lightweight feed row may omit active_votes; EntryVoteBtn (which uses\n // this entry as React Query initialData) calls .some() on it, so default\n // to an empty array to avoid a crash before the full post query loads.\n active_votes: entry.active_votes ?? [],\n video: row.video,\n _cursor: row._cursor\n } as ShortsFeedEntry;\n })\n .filter((entry): entry is ShortsFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container shorts (reels) feed: waves that embed a 3Speak video.\n *\n * Backed by esync /api/waves/shorts (via /private-api/waves/shorts). Same shape,\n * keyset pagination and filters as {@link getWavesFeedQueryOptions}, plus a\n * `video` block per item for the vertical reels player. There is no `following`\n * filter in v1.\n */\nexport function getShortsFeedQueryOptions(params: ShortsFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.shortsFeed({ containers, tag, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchShortsFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination: a short page (fewer than `limit` rows) ends the feed;\n // on a full page the server returns the next cursor on the last row.\n getNextPageParam: (lastPage: ShortsFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport {\n getVisibleFirstLevelThreadItems,\n mapThreadItemsToWaveEntries\n} from \"../utils/waves-helpers\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst THREAD_CONTAINER_BATCH_SIZE = 5;\nconst MAX_CONTAINERS_TO_SCAN = 50;\n\ninterface ThreadsResult {\n entries: WaveEntry[];\n}\n\nasync function getThreads(\n host: string,\n pageParam?: WaveEntry\n): Promise {\n let startAuthor = pageParam?.author;\n let startPermlink = pageParam?.permlink;\n let scannedContainers = 0;\n let skipContainerId = pageParam?.post_id;\n\n while (scannedContainers < MAX_CONTAINERS_TO_SCAN) {\n interface AccountPostsParams {\n sort: string;\n account: string;\n limit: number;\n start_author?: string;\n start_permlink?: string;\n }\n\n const rpcParams: AccountPostsParams = {\n sort: \"posts\", // ProfileFilter.posts\n account: host,\n limit: THREAD_CONTAINER_BATCH_SIZE,\n ...(startAuthor ? { start_author: startAuthor } : {}),\n ...(startPermlink ? { start_permlink: startPermlink } : {})\n };\n\n let containers: WaveEntry[];\n try {\n containers = (await callRPC(\"bridge.get_account_posts\", rpcParams)) as WaveEntry[];\n } catch (err) {\n console.error(\"[SDK] getThreads get_account_posts error:\", err);\n return null;\n }\n\n if (!containers || containers.length === 0) {\n return null;\n }\n\n const normalizedContainers = containers.map((container) => {\n container.id = container.post_id;\n container.host = host;\n return container;\n });\n\n for (const container of normalizedContainers) {\n if (skipContainerId && container.post_id === skipContainerId) {\n skipContainerId = undefined;\n continue;\n }\n\n scannedContainers += 1;\n\n if (container.stats?.gray) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n let visibleItems: Entry[];\n try {\n visibleItems = await getVisibleFirstLevelThreadItems(container);\n } catch (err) {\n // A transient bridge.get_discussion failure (RPC timeout, node error, or\n // an oversized response on a large late-day container) must not collapse\n // the whole feed. Treat this container as temporarily unavailable and scan\n // the next one — mirroring the empty-container handling below and the\n // get_account_posts guard above. The query's refetch interval retries it.\n console.error(\"[SDK] getThreads get_discussion error:\", err);\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n if (visibleItems.length === 0) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n return {\n entries: mapThreadItemsToWaveEntries(visibleItems, container, host)\n };\n }\n\n const lastContainer = normalizedContainers[normalizedContainers.length - 1];\n\n if (!lastContainer) {\n return null;\n }\n\n startAuthor = lastContainer.author;\n startPermlink = lastContainer.permlink;\n }\n\n return null;\n}\n\n// Page = array of WaveEntry; Cursor = WaveEntry (container) or undefined\ntype WavesPage = WaveEntry[];\ntype WavesCursor = WaveEntry | undefined;\n\nexport function getWavesByHostQueryOptions(host: string) {\n return infiniteQueryOptions<\n WavesPage,\n Error,\n InfiniteData,\n string[],\n WavesCursor\n >({\n queryKey: QueryKeys.posts.wavesByHost(host),\n initialPageParam: undefined as WavesCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WavesCursor }) => {\n const result = await getThreads(host, pageParam);\n if (!result) return []; // no items to show for this page\n\n return result.entries;\n },\n\n getNextPageParam: (lastPage: WavesPage): WavesCursor => lastPage?.[0]?.container,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesTagEntryResponse = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nconst DEFAULT_TAG_FEED_LIMIT = 40;\n\nexport function getWavesByTagQueryOptions(host: string, tag: string, limit = DEFAULT_TAG_FEED_LIMIT) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByTag(host, tag),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/tags\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"tag\", tag);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves by tag: ${response.status}`);\n }\n\n const data = await response.json() as WavesTagEntryResponse[];\n\n const result = data\n .slice(0, limit)\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n return result.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves by tag\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesFollowingEntry = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport function getWavesFollowingQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFollowing(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/following\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves following feed: ${response.status}`);\n }\n\n const data = await response.json() as WavesFollowingEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves following feed\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingTag } from \"../types\";\n\ninterface WavesTrendingTagResponse {\n tag: string;\n posts: number;\n}\n\nexport function getWavesTrendingTagsQueryOptions(host?: string, hours = 24) {\n // Omit the container for combined trending tags across all containers.\n const container = host?.trim() || undefined;\n\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingTags(container ?? \"\", hours),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/tags\", baseUrl);\n if (container) {\n url.searchParams.set(\"container\", container);\n }\n url.searchParams.set(\"hours\", hours.toString());\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending tags: ${response.status}`);\n }\n\n const data = await response.json() as WavesTrendingTagResponse[];\n\n return data.map(({ tag, posts }) => ({ tag, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending tags\", error);\n return [];\n }\n }\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ninterface WavesAccountEntry extends Entry {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n}\n\nexport function getWavesByAccountQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByAccount(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/account\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves for account: ${response.status}`);\n }\n\n const data = await response.json() as WavesAccountEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves for account\", error);\n throw error;\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingAuthor } from \"../types\";\n\nexport function getWavesTrendingAuthorsQueryOptions(host: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingAuthors(host),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/authors\", baseUrl);\n url.searchParams.set(\"container\", host);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending authors: ${response.status}`);\n }\n\n const data = await response.json() as WaveTrendingAuthor[];\n\n return data.map(({ author, posts }) => ({ author, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending authors\", error);\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"../types\";\nimport { normalizePost } from \"@/modules/bridge\";\n\nexport function getNormalizePostQueryOptions(\n post: { author?: string; permlink?: string } | undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.normalize(post?.author ?? \"\", post?.permlink ?? \"\"),\n enabled: enabled && !!post,\n queryFn: async () => normalizePost(post) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core/config\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { getPostQueryOptions } from \"@/modules/posts/queries\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ninterface VoteOperationDetails {\n voter: string;\n author: string;\n permlink: string;\n weight: number;\n}\n\ninterface AccountVoteHistoryItem {\n timestamp: string;\n op: [string, VoteOperationDetails];\n}\n\ntype AccountVoteHistoryRecord = [number, AccountVoteHistoryItem];\n\ninterface VoteHistoryResult extends VoteOperationDetails {\n num: number;\n timestamp: string;\n}\n\nexport interface VoteHistoryPageParam {\n start: number;\n}\n\nexport interface VoteHistoryPage {\n lastDate: number;\n lastItemFetched: number;\n entries: Entry[];\n}\n\nfunction isEntry(x: unknown): x is Entry {\n return (\n !!x &&\n typeof x === \"object\" &&\n \"author\" in x &&\n \"permlink\" in x &&\n \"active_votes\" in x\n );\n}\n\n/**\n * Calculate days since a date\n */\nfunction getDays(createdDate: string): number {\n const past = new Date(createdDate);\n const now = new Date();\n const diffMs = now.getTime() - past.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Get account vote history with entries\n *\n * @param username - Account name to get vote history for\n * @param limit - Number of history items per page (default: 20)\n * @param filters - Additional filters to pass to get_account_history\n * @param dayLimit - Only include votes from last N days (default: 7)\n */\nexport function getAccountVoteHistoryInfiniteQueryOptions(\n username: string,\n options?: {\n limit?: number;\n filters?: F[];\n dayLimit?: number;\n }\n) {\n const { limit = 20, filters = [], dayLimit = 7.0 } = options ?? {};\n\n return infiniteQueryOptions<\n VoteHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n VoteHistoryPageParam\n >({\n queryKey: QueryKeys.accounts.voteHistory(username, limit),\n initialPageParam: { start: -1 },\n\n queryFn: async ({ pageParam }: { pageParam: VoteHistoryPageParam }) => {\n const { start } = pageParam;\n\n const response = (await callRPC(\"condenser_api.get_account_history\", [username, start, limit, ...filters])) as AccountVoteHistoryRecord[];\n\n const mappedResults: VoteHistoryResult[] = response.map(([num, historyObj]) => ({\n ...historyObj.op[1],\n num,\n timestamp: historyObj.timestamp,\n }));\n\n const result = mappedResults.filter(\n (filtered) =>\n filtered.voter === username &&\n filtered.weight !== 0 &&\n getDays(filtered.timestamp) <= dayLimit\n );\n\n const entries: Entry[] = [];\n for (const obj of result) {\n const post = await CONFIG.queryClient.fetchQuery(\n getPostQueryOptions(obj.author, obj.permlink)\n );\n if (isEntry(post)) entries.push(post);\n }\n\n const [firstHistory] = response;\n\n return {\n lastDate: firstHistory ? getDays(firstHistory[1].timestamp) : 0,\n lastItemFetched: firstHistory ? firstHistory[0] : start,\n entries,\n };\n },\n\n getNextPageParam: (lastPage: VoteHistoryPage): VoteHistoryPageParam => ({\n start: lastPage.lastItemFetched,\n }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Profile } from \"../types\";\nimport { getProfiles } from \"@/modules/bridge\";\n\nexport function getProfilesQueryOptions(\n accounts: string[],\n observer?: string,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.profiles(accounts, observer ?? \"\"),\n enabled: enabled && accounts.length > 0,\n queryFn: async () => getProfiles(accounts, observer) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type {\n BalanceCoinType,\n BalanceHistoryEntry,\n BalanceHistoryResponse,\n} from \"../types\";\n\ninterface BalanceHistoryPage {\n entries: BalanceHistoryEntry[];\n currentPage: number;\n}\n\n/**\n * Cursor for balance history pagination.\n * null = first request (returns the newest page).\n * number = specific page to fetch (decrementing for older data).\n */\ntype BalanceHistoryCursor = number | null;\n\n/**\n * Get balance history for an account with pagination, newest first.\n * Uses the balance-api REST endpoint with direction=desc.\n *\n * Pagination: first call omits `page` to get the newest data.\n * The response includes `total_pages` so we know the current page number.\n * Subsequent calls decrement the page number to load older data.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param pageSize - Number of entries per page\n */\nexport function getBalanceHistoryInfiniteQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n pageSize = 200\n) {\n return infiniteQueryOptions<\n BalanceHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n BalanceHistoryCursor\n >({\n queryKey: QueryKeys.wallet.balanceHistory(\n username ?? \"\",\n coinType,\n pageSize\n ),\n initialPageParam: null as BalanceHistoryCursor,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"coin-type\": coinType,\n \"page-size\": pageSize,\n direction: \"desc\",\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"balance\",\n \"/accounts/{account-name}/balance-history\",\n params,\n undefined,\n undefined,\n signal\n )) as BalanceHistoryResponse;\n\n return {\n entries: response.operations_result,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n // Decrement page to go further back in time\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type { AggregatedBalanceEntry, BalanceCoinType } from \"../types\";\n\nexport type BalanceAggregationGranularity = \"yearly\" | \"monthly\" | \"daily\";\n\n/**\n * Get aggregated balance history for an account.\n * Uses the balance-api REST endpoint - enables yearly/monthly/daily summary\n * widgets that are impossible via RPC.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param granularity - yearly (default), monthly, or daily\n */\nexport function getAggregatedBalanceQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n granularity: BalanceAggregationGranularity = \"yearly\"\n) {\n return queryOptions({\n queryKey: QueryKeys.wallet.aggregatedHistory(\n username ?? \"\",\n coinType,\n granularity\n ),\n\n queryFn: async () => {\n if (!username) {\n return [];\n }\n\n return (await callREST(\n \"balance\",\n \"/accounts/{account-name}/aggregated-history\",\n {\n \"account-name\": username,\n \"coin-type\": coinType,\n granularity,\n }\n )) as AggregatedBalanceEntry[];\n },\n\n enabled: !!username,\n staleTime: 60_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport interface ProMembersResponse {\n /** Usernames of active Ecency Pro members. */\n members: string[];\n count: number;\n}\n\n/**\n * Public, cached roster of Ecency Pro members. Backed by a lightweight private-api\n * endpoint (no auth) so any surface can decorate a username with a Pro badge without\n * a per-user request.\n *\n * `staleTime` is deliberately shorter than the endpoint's own cache window and is\n * NOT raised to match it. react-query has no idea how old a response already was\n * when `fetch` served it from the browser cache: it treats a nine-minute-old\n * cached body as freshly fetched and starts its own window from zero. Worst-case\n * staleness is therefore the endpoint's window plus this one, so raising this to\n * match the server would roughly double it rather than align it.\n */\nexport function getProMembersQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.proMembers(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/pro-members\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch pro members: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Lowercased set of member usernames for O(1), case-insensitive membership checks. */\nexport function proMembersSet(members?: string[]): Set {\n return new Set((members ?? []).map((m) => m.toLowerCase()));\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { AccountProfile, FullAccount } from \"../types\";\nimport {\n buildPostingJsonMetadata,\n buildProfileMetadata,\n extractAccountProfile,\n pickRicherMetadataSnapshot,\n} from \"../utils/profile-metadata\";\n\ninterface Payload {\n profile: Partial;\n tokens: AccountProfile[\"tokens\"];\n}\n\n/**\n * React Query mutation hook for updating account profile metadata.\n *\n * This mutation broadcasts an account_update2 operation to update the user's\n * profile information (name, about, location, avatar, cover image, etc.).\n *\n * @param username - The username to update (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Profile Fields:**\n * - name: Display name\n * - about: Bio/description\n * - location: Location\n * - website: Website URL\n * - profile_image: Avatar URL\n * - cover_image: Cover/banner URL\n * - tokens: Social tokens (Twitter, Facebook, etc.)\n * - version: Profile metadata version (auto-set to 2)\n *\n * **Authentication:**\n * - Uses posting authority (account_update2 operation)\n * - Supports all auth methods via platform adapter\n *\n * **Post-Broadcast Actions:**\n * - Optimistically updates account cache with new profile data\n * - Invalidates account cache to refetch from blockchain\n *\n * @example\n * ```typescript\n * const updateProfile = useAccountUpdate(username, {\n * adapter: myAdapter,\n * });\n *\n * // Update profile\n * updateProfile.mutate({\n * profile: {\n * name: \"John Doe\",\n * about: \"Hive enthusiast\",\n * profile_image: \"https://...\",\n * }\n * });\n * ```\n */\nexport function useAccountUpdate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useBroadcastMutation(\n [\"accounts\", \"update\"],\n username,\n (payload: Partial) => {\n // Prefer the freshest cached snapshot. onMutate has just refetched the\n // account from chain, so this usually reflects the current on-chain\n // profile rather than a possibly stale/unloaded render-time value. If\n // the cache instead holds a metadata-poorer row than the render-time\n // snapshot (e.g. a node served a stripped account row), the richer\n // snapshot wins — a partial update must never shrink the profile while\n // any snapshot still knows the full one.\n const account = pickRicherMetadataSnapshot(\n queryClient.getQueryData(\n getAccountFullQueryOptions(username).queryKey\n ),\n data\n );\n\n if (!account) {\n throw new Error(\"[SDK][Accounts] – cannot update not existing account\");\n }\n\n return [\n [\n \"account_update2\",\n {\n account: username!,\n json_metadata: \"\",\n extensions: [] as [],\n // Read-modify-write the FULL on-chain metadata: deep-merge the\n // profile and preserve any non-`profile` top-level keys, so a\n // partial update never wipes unrelated fields.\n posting_json_metadata: buildPostingJsonMetadata({\n existingPostingJsonMetadata: account.posting_json_metadata,\n profile: payload.profile,\n tokens: payload.tokens,\n }),\n },\n ],\n ];\n },\n async (_data: unknown, variables: Partial) => {\n // Optimistic cache update\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n const obj = JSON.parse(JSON.stringify(data)) as FullAccount;\n obj.profile = buildProfileMetadata({\n existingProfile: extractAccountProfile(data),\n profile: variables.profile,\n tokens: variables.tokens,\n });\n\n return obj;\n }\n );\n\n // Invalidate cache to refetch from blockchain\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username)\n ]);\n },\n auth,\n undefined,\n {\n broadcastMode,\n // Before merging, force a fresh on-chain read so a stale or unloaded\n // cached snapshot cannot cause a partial update (e.g. pinning a post,\n // which sets only `pinned`) to overwrite the existing profile with a\n // near-empty object. Best-effort: if the refetch fails, the op builder\n // falls back to the cached snapshot.\n onMutate: async () => {\n if (!username) {\n return;\n }\n try {\n await queryClient.fetchQuery({\n ...getAccountFullQueryOptions(username),\n staleTime: 0,\n });\n } catch {\n // Ignore – fall back to whatever is already cached.\n }\n },\n }\n );\n}\n","import { broadcastJson, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getRelationshipBetweenAccountsQueryOptions, getAccountFullQueryOptions } from \"../queries\";\nimport { AccountRelationship } from \"../types\";\n\ntype Kind = \"toggle-ignore\" | \"toggle-follow\";\n\nexport function useAccountRelationsUpdate(\n reference: string | undefined,\n target: string | undefined,\n auth: AuthContext | undefined,\n onSuccess: (data: Partial | undefined) => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"relation\", \"update\", reference, target],\n mutationFn: async (kind: Kind) => {\n const relationsQuery = getRelationshipBetweenAccountsQueryOptions(\n reference!,\n target!\n );\n await getQueryClient().prefetchQuery(relationsQuery);\n const actualRelation = getQueryClient().getQueryData(\n relationsQuery.queryKey\n );\n\n await broadcastJson(\n reference,\n \"follow\",\n [\n \"follow\",\n {\n follower: reference,\n following: target,\n what: [\n ...(kind === \"toggle-ignore\" && !actualRelation?.ignores\n ? [\"ignore\"]\n : []),\n ...(kind === \"toggle-follow\" && !actualRelation?.follows\n ? [\"blog\"]\n : []),\n ],\n },\n ],\n auth\n );\n\n return {\n ...actualRelation,\n ignores:\n kind === \"toggle-ignore\"\n ? !actualRelation?.ignores\n : actualRelation?.ignores,\n follows:\n kind === \"toggle-follow\"\n ? !actualRelation?.follows\n : actualRelation?.follows,\n } satisfies Partial;\n },\n onError,\n onSuccess(data) {\n onSuccess(data);\n\n getQueryClient().setQueryData(\n QueryKeys.accounts.relations(reference!, target!),\n data\n );\n\n // Invalidate account query to refetch follow stats (follower_count, following_count)\n // This is needed because profile pages use staleTime: Infinity for performance\n if (target) {\n getQueryClient().invalidateQueries(\n getAccountFullQueryOptions(target)\n );\n }\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Content Operations\n * Operations for creating, voting, and managing content on Hive blockchain\n */\n\n/**\n * Builds a vote operation.\n * @param voter - Account casting the vote\n * @param author - Author of the post/comment\n * @param permlink - Permlink of the post/comment\n * @param weight - Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote)\n * @returns Vote operation\n */\nexport function buildVoteOp(\n voter: string,\n author: string,\n permlink: string,\n weight: number\n): Operation {\n if (!voter || !author || !permlink) {\n throw new Error(\"[SDK][buildVoteOp] Missing required parameters\");\n }\n if (weight < -10000 || weight > 10000) {\n throw new Error(\"[SDK][buildVoteOp] Weight must be between -10000 and 10000\");\n }\n\n return [\n \"vote\",\n {\n voter,\n author,\n permlink,\n weight,\n },\n ];\n}\n\n/**\n * Builds a comment operation (for posts or replies).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param parentAuthor - Parent author (empty string for top-level posts)\n * @param parentPermlink - Parent permlink (category/tag for top-level posts)\n * @param title - Title of the post (empty for comments)\n * @param body - Content body (required - cannot be empty)\n * @param jsonMetadata - JSON metadata object\n * @returns Comment operation\n */\nexport function buildCommentOp(\n author: string,\n permlink: string,\n parentAuthor: string,\n parentPermlink: string,\n title: string,\n body: string,\n jsonMetadata: Record\n): Operation {\n // Validate all required parameters including body\n if (!author || !permlink || parentPermlink === undefined || !body) {\n throw new Error(\"[SDK][buildCommentOp] Missing required parameters\");\n }\n\n return [\n \"comment\",\n {\n parent_author: parentAuthor,\n parent_permlink: parentPermlink,\n author,\n permlink,\n title,\n body,\n json_metadata: JSON.stringify(jsonMetadata),\n },\n ];\n}\n\n/**\n * Builds a comment options operation (for setting beneficiaries, rewards, etc.).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param maxAcceptedPayout - Maximum accepted payout (e.g., \"1000000.000 HBD\")\n * @param percentHbd - Percent of payout in HBD (10000 = 100%)\n * @param allowVotes - Allow votes on this content\n * @param allowCurationRewards - Allow curation rewards\n * @param extensions - Extensions array (for beneficiaries, etc.)\n * @returns Comment options operation\n */\nexport function buildCommentOptionsOp(\n author: string,\n permlink: string,\n maxAcceptedPayout: string,\n percentHbd: number,\n allowVotes: boolean,\n allowCurationRewards: boolean,\n extensions: any[]\n): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildCommentOptionsOp] Missing required parameters\");\n }\n\n return [\n \"comment_options\",\n {\n author,\n permlink,\n max_accepted_payout: maxAcceptedPayout,\n percent_hbd: percentHbd,\n allow_votes: allowVotes,\n allow_curation_rewards: allowCurationRewards,\n extensions,\n },\n ];\n}\n\n/**\n * Builds a delete comment operation.\n * @param author - Author of the comment/post to delete\n * @param permlink - Permlink of the comment/post to delete\n * @returns Delete comment operation\n */\nexport function buildDeleteCommentOp(author: string, permlink: string): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildDeleteCommentOp] Missing required parameters\");\n }\n\n return [\n \"delete_comment\",\n {\n author,\n permlink,\n },\n ];\n}\n\n/**\n * Builds a reblog operation (custom_json).\n * @param account - Account performing the reblog\n * @param author - Original post author\n * @param permlink - Original post permlink\n * @param deleteReblog - If true, removes the reblog\n * @returns Custom JSON operation for reblog\n */\nexport function buildReblogOp(\n account: string,\n author: string,\n permlink: string,\n deleteReblog: boolean = false\n): Operation {\n if (!account || !author || !permlink) {\n throw new Error(\"[SDK][buildReblogOp] Missing required parameters\");\n }\n\n const json: any = {\n account,\n author,\n permlink,\n };\n\n if (deleteReblog) {\n json.delete = \"delete\";\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\"reblog\", json]),\n required_auths: [],\n required_posting_auths: [account],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Wallet Operations\n * Operations for managing tokens, savings, vesting, and conversions\n */\n\n/**\n * Builds a transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer operation\n */\nexport function buildTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferOp] Missing required parameters\");\n }\n\n return [\n \"transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds multiple transfer operations for multiple recipients.\n * @param from - Sender account\n * @param destinations - Comma or space separated list of recipient accounts\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Array of transfer operations\n */\nexport function buildMultiTransferOps(\n from: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!from || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Create a transfer operation for each destination username\n return destArray.map((dest) =>\n buildTransferOp(from, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds a recurrent transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param recurrence - Recurrence in hours\n * @param executions - Number of executions (2 = executes twice)\n * @returns Recurrent transfer operation\n */\nexport function buildRecurrentTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n recurrence: number,\n executions: number\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Missing required parameters\");\n }\n if (recurrence < 24) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours\");\n }\n\n return [\n \"recurrent_transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n recurrence,\n executions,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a transfer to savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer to savings operation\n */\nexport function buildTransferToSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds a transfer from savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID (use timestamp)\n * @returns Transfer from savings operation\n */\nexport function buildTransferFromSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_from_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds a cancel transfer from savings operation.\n * @param from - Account that initiated the savings withdrawal\n * @param requestId - Request ID to cancel\n * @returns Cancel transfer from savings operation\n */\nexport function buildCancelTransferFromSavingsOp(\n from: string,\n requestId: number\n): Operation {\n if (!from || requestId === undefined) {\n throw new Error(\"[SDK][buildCancelTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"cancel_transfer_from_savings\",\n {\n from,\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds operations to claim savings interest.\n * Creates a transfer_from_savings and immediately cancels it to claim interest.\n * @param from - Account claiming interest\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"0.001 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID\n * @returns Array of operations [transfer_from_savings, cancel_transfer_from_savings]\n */\nexport function buildClaimInterestOps(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation[] {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildClaimInterestOps] Missing required parameters\");\n }\n\n return [\n buildTransferFromSavingsOp(from, to, amount, memo, requestId),\n buildCancelTransferFromSavingsOp(from, requestId),\n ];\n}\n\n/**\n * Builds a transfer to vesting operation (power up).\n * @param from - Account sending HIVE\n * @param to - Account receiving Hive Power\n * @param amount - Amount with HIVE symbol (e.g., \"1.000 HIVE\")\n * @returns Transfer to vesting operation\n */\nexport function buildTransferToVestingOp(\n from: string,\n to: string,\n amount: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToVestingOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_vesting\",\n {\n from,\n to,\n amount,\n },\n ];\n}\n\n/**\n * Builds a withdraw vesting operation (power down).\n * @param account - Account withdrawing vesting\n * @param vestingShares - Amount of VESTS to withdraw (e.g., \"1.000000 VESTS\")\n * @returns Withdraw vesting operation\n */\nexport function buildWithdrawVestingOp(\n account: string,\n vestingShares: string\n): Operation {\n if (!account || !vestingShares) {\n throw new Error(\"[SDK][buildWithdrawVestingOp] Missing required parameters\");\n }\n\n return [\n \"withdraw_vesting\",\n {\n account,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a delegate vesting shares operation (HP delegation).\n * @param delegator - Account delegating HP\n * @param delegatee - Account receiving HP delegation\n * @param vestingShares - Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\")\n * @returns Delegate vesting shares operation\n */\nexport function buildDelegateVestingSharesOp(\n delegator: string,\n delegatee: string,\n vestingShares: string\n): Operation {\n if (!delegator || !delegatee || !vestingShares) {\n throw new Error(\"[SDK][buildDelegateVestingSharesOp] Missing required parameters\");\n }\n\n return [\n \"delegate_vesting_shares\",\n {\n delegator,\n delegatee,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a set withdraw vesting route operation.\n * @param fromAccount - Account withdrawing vesting\n * @param toAccount - Account receiving withdrawn vesting\n * @param percent - Percentage to route (0-10000, where 10000 = 100%)\n * @param autoVest - Auto convert to vesting\n * @returns Set withdraw vesting route operation\n */\nexport function buildSetWithdrawVestingRouteOp(\n fromAccount: string,\n toAccount: string,\n percent: number,\n autoVest: boolean\n): Operation {\n if (!fromAccount || !toAccount || percent === undefined) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters\");\n }\n if (percent < 0 || percent > 10000) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000\");\n }\n\n return [\n \"set_withdraw_vesting_route\",\n {\n from_account: fromAccount,\n to_account: toAccount,\n percent,\n auto_vest: autoVest,\n },\n ];\n}\n\n/**\n * Builds a convert operation (HBD to HIVE).\n * @param owner - Account converting HBD\n * @param amount - Amount of HBD to convert (e.g., \"1.000 HBD\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Convert operation\n */\nexport function buildConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildConvertOp] Missing required parameters\");\n }\n\n return [\n \"convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a collateralized convert operation (HIVE to HBD via collateral).\n * @param owner - Account converting HIVE\n * @param amount - Amount of HIVE to convert (e.g., \"1.000 HIVE\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Collateralized convert operation\n */\nexport function buildCollateralizedConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildCollateralizedConvertOp] Missing required parameters\");\n }\n\n return [\n \"collateralized_convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a Hive Engine custom_json operation.\n * @param from - Account performing the operation\n * @param contractAction - Engine contract action (e.g., \"transfer\", \"stake\")\n * @param contractPayload - Payload for the contract action\n * @param contractName - Engine contract name (defaults to \"tokens\")\n * @returns Custom JSON operation\n */\nexport function buildEngineOp(\n from: string,\n contractAction: string,\n contractPayload: Record,\n contractName = \"tokens\"\n): Operation {\n return [\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [from],\n required_posting_auths: [],\n json: JSON.stringify({ contractName, contractAction, contractPayload }),\n }];\n}\n\n/**\n * Builds a scot_claim_token operation (posting authority).\n * @param account - Account claiming rewards\n * @param tokens - Array of token symbols to claim\n * @returns Custom JSON operation\n */\nexport function buildEngineClaimOp(\n account: string,\n tokens: string[]\n): Operation {\n return [\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [account],\n json: JSON.stringify(tokens.map((symbol) => ({ symbol }))),\n }];\n}\n\n/**\n * Builds a delegate RC operation (custom_json).\n * @param from - Account delegating RC\n * @param delegatees - Single delegatee or comma-separated list\n * @param maxRc - Maximum RC to delegate (in mana units)\n * @returns Custom JSON operation for RC delegation\n */\nexport function buildDelegateRcOp(\n from: string,\n delegatees: string,\n maxRc: string | number\n): Operation {\n if (!from || !delegatees || maxRc === undefined) {\n throw new Error(\"[SDK][buildDelegateRcOp] Missing required parameters\");\n }\n\n const delegateeArray = delegatees.includes(\",\")\n ? delegatees.split(\",\").map((d) => d.trim())\n : [delegatees];\n\n return [\n \"custom_json\",\n {\n id: \"rc\",\n json: JSON.stringify([\n \"delegate_rc\",\n {\n from,\n delegatees: delegateeArray,\n max_rc: maxRc,\n },\n ]),\n required_auths: [],\n required_posting_auths: [from],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Social Operations\n * Operations for following, muting, and managing social relationships\n */\n\n/**\n * Builds a follow operation (custom_json).\n * @param follower - Account following\n * @param following - Account to follow\n * @returns Custom JSON operation for follow\n */\nexport function buildFollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildFollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"blog\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unfollow operation (custom_json).\n * @param follower - Account unfollowing\n * @param following - Account to unfollow\n * @returns Custom JSON operation for unfollow\n */\nexport function buildUnfollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnfollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an ignore/mute operation (custom_json).\n * @param follower - Account ignoring\n * @param following - Account to ignore\n * @returns Custom JSON operation for ignore\n */\nexport function buildIgnoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildIgnoreOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"ignore\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unignore/unmute operation (custom_json).\n * @param follower - Account unignoring\n * @param following - Account to unignore\n * @returns Custom JSON operation for unignore\n */\nexport function buildUnignoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnignoreOp] Missing required parameters\");\n }\n\n return buildUnfollowOp(follower, following);\n}\n\n/**\n * Builds a Hive Notify set last read operation (custom_json).\n * @param username - Account setting last read\n * @param date - ISO date string (defaults to now)\n * @returns Array of custom JSON operations for setting last read\n */\nexport function buildSetLastReadOps(username: string, date?: string): Operation[] {\n if (!username) {\n throw new Error(\"[SDK][buildSetLastReadOps] Missing required parameters\");\n }\n\n const lastReadDate = date || new Date().toISOString().split(\".\")[0];\n\n const notifyOp: Operation = [\n \"custom_json\",\n {\n id: \"notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n const ecencyNotifyOp: Operation = [\n \"custom_json\",\n {\n id: \"ecency_notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n return [notifyOp, ecencyNotifyOp];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Governance Operations\n * Operations for witness voting, proposals, and proxy management\n */\n\n/**\n * Builds an account witness vote operation.\n * @param account - Account voting\n * @param witness - Witness account name\n * @param approve - True to approve, false to disapprove\n * @returns Account witness vote operation\n */\nexport function buildWitnessVoteOp(\n account: string,\n witness: string,\n approve: boolean\n): Operation {\n if (!account || !witness || approve === undefined) {\n throw new Error(\"[SDK][buildWitnessVoteOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_vote\",\n {\n account,\n witness,\n approve,\n },\n ];\n}\n\n/**\n * Builds an account witness proxy operation.\n * @param account - Account setting proxy\n * @param proxy - Proxy account name (empty string to remove proxy)\n * @returns Account witness proxy operation\n */\nexport function buildWitnessProxyOp(account: string, proxy: string): Operation {\n if (!account || proxy === undefined) {\n throw new Error(\"[SDK][buildWitnessProxyOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_proxy\",\n {\n account,\n proxy,\n },\n ];\n}\n\n/**\n * Payload for proposal creation\n */\nexport interface ProposalCreatePayload {\n receiver: string;\n subject: string;\n permlink: string;\n start: string;\n end: string;\n dailyPay: string;\n}\n\n/**\n * Builds a create proposal operation.\n * @param creator - Account creating the proposal\n * @param payload - Proposal details (must include start, end, and dailyPay)\n * @returns Create proposal operation\n */\nexport function buildProposalCreateOp(\n creator: string,\n payload: ProposalCreatePayload\n): Operation {\n // Validate required fields including start, end, and dailyPay\n if (\n !creator ||\n !payload.receiver ||\n !payload.subject ||\n !payload.permlink ||\n !payload.start ||\n !payload.end ||\n !payload.dailyPay\n ) {\n throw new Error(\"[SDK][buildProposalCreateOp] Missing required parameters\");\n }\n\n // Validate date format by attempting to parse them\n const startDate = new Date(payload.start);\n const endDate = new Date(payload.end);\n if (startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {\n throw new Error(\n \"[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings\"\n );\n }\n\n return [\n \"create_proposal\",\n {\n creator,\n receiver: payload.receiver,\n start_date: payload.start,\n end_date: payload.end,\n daily_pay: payload.dailyPay,\n subject: payload.subject,\n permlink: payload.permlink,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal votes operation.\n * @param voter - Account voting\n * @param proposalIds - Array of proposal IDs\n * @param approve - True to approve, false to disapprove\n * @returns Update proposal votes operation\n */\nexport function buildProposalVoteOp(\n voter: string,\n proposalIds: number[],\n approve: boolean\n): Operation {\n if (!voter || !proposalIds || proposalIds.length === 0 || approve === undefined) {\n throw new Error(\"[SDK][buildProposalVoteOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal_votes\",\n {\n voter,\n proposal_ids: proposalIds,\n approve,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a remove proposal operation.\n * @param proposalOwner - Owner of the proposal\n * @param proposalIds - Array of proposal IDs to remove\n * @returns Remove proposal operation\n */\nexport function buildRemoveProposalOp(\n proposalOwner: string,\n proposalIds: number[]\n): Operation {\n if (!proposalOwner || !proposalIds || proposalIds.length === 0) {\n throw new Error(\"[SDK][buildRemoveProposalOp] Missing required parameters\");\n }\n\n return [\n \"remove_proposal\",\n {\n proposal_owner: proposalOwner,\n proposal_ids: proposalIds,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal operation.\n * @param proposalId - Proposal ID to update (must be a valid number, including 0)\n * @param creator - Account that created the proposal\n * @param dailyPay - New daily pay amount\n * @param subject - New subject\n * @param permlink - New permlink\n * @returns Update proposal operation\n */\nexport function buildUpdateProposalOp(\n proposalId: number,\n creator: string,\n dailyPay: string,\n subject: string,\n permlink: string\n): Operation {\n // Validate proposalId properly - check for undefined/null instead of falsy\n // This allows proposalId of 0 which is a valid proposal ID\n if (\n proposalId === undefined ||\n proposalId === null ||\n typeof proposalId !== 'number' ||\n !creator ||\n !dailyPay ||\n !subject ||\n !permlink\n ) {\n throw new Error(\"[SDK][buildUpdateProposalOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal\",\n {\n proposal_id: proposalId,\n creator,\n daily_pay: dailyPay,\n subject,\n permlink,\n extensions: [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Community Operations\n * Operations for managing Hive communities\n */\n\n/**\n * Builds a subscribe to community operation (custom_json).\n * @param username - Account subscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for subscribe\n */\nexport function buildSubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildSubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"subscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds an unsubscribe from community operation (custom_json).\n * @param username - Account unsubscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for unsubscribe\n */\nexport function buildUnsubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildUnsubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"unsubscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a set user role in community operation (custom_json).\n * @param username - Account setting the role (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to set role for\n * @param role - Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\")\n * @returns Custom JSON operation for setRole\n */\nexport function buildSetRoleOp(\n username: string,\n community: string,\n account: string,\n role: string\n): Operation {\n if (!username || !community || !account || !role) {\n throw new Error(\n `[SDK][buildSetRoleOp] Missing required parameters: username=${username}, community=${community}, account=${account}, role=${role}`\n );\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"setRole\", { community, account, role }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Community properties for update\n */\nexport interface CommunityProps {\n title: string;\n about: string;\n lang: string;\n description: string;\n flag_text: string;\n is_nsfw: boolean;\n}\n\n/**\n * Builds an update community properties operation (custom_json).\n * @param username - Account updating (must be community admin)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param props - Properties to update\n * @returns Custom JSON operation for updateProps\n */\nexport function buildUpdateCommunityOp(\n username: string,\n community: string,\n props: CommunityProps\n): Operation {\n if (!username || !community || !props) {\n throw new Error(\"[SDK][buildUpdateCommunityOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"updateProps\", { community, props }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a pin/unpin post in community operation (custom_json).\n * @param username - Account pinning (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param pin - True to pin, false to unpin\n * @returns Custom JSON operation for pinPost/unpinPost\n */\nexport function buildPinPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n pin: boolean\n): Operation {\n if (!username || !community || !account || !permlink || pin === undefined) {\n throw new Error(\"[SDK][buildPinPostOp] Missing required parameters\");\n }\n\n const action = pin ? \"pinPost\" : \"unpinPost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute post in community operation (custom_json).\n * @param username - Account muting (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for mutePost/unmutePost\n */\nexport function buildMutePostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string,\n mute: boolean\n): Operation {\n if (\n !username ||\n !community ||\n !account ||\n !permlink ||\n mute === undefined\n ) {\n throw new Error(\"[SDK][buildMutePostOp] Missing required parameters\");\n }\n\n const action = mute ? \"mutePost\" : \"unmutePost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute user in community operation (custom_json).\n * @param username - Account performing mute (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to mute/unmute\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for muteUser/unmuteUser\n */\nexport function buildMuteUserOp(\n username: string,\n community: string,\n account: string,\n notes: string,\n mute: boolean\n): Operation {\n if (!username || !community || !account || mute === undefined) {\n throw new Error(\"[SDK][buildMuteUserOp] Missing required parameters\");\n }\n\n const action = mute ? \"muteUser\" : \"unmuteUser\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a flag post in community operation (custom_json).\n * @param username - Account flagging\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Flag reason/notes\n * @returns Custom JSON operation for flagPost\n */\nexport function buildFlagPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string\n): Operation {\n if (!username || !community || !account || !permlink) {\n throw new Error(\"[SDK][buildFlagPostOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"flagPost\", { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Market Operations\n * Operations for trading on the internal Hive market\n */\n\n/**\n * Transaction type for buy/sell operations\n */\nexport enum BuySellTransactionType {\n Buy = \"buy\",\n Sell = \"sell\",\n}\n\n/**\n * Order ID prefix for different order types\n */\nexport enum OrderIdPrefix {\n EMPTY = \"\",\n SWAP = \"9\",\n}\n\n/**\n * Builds a limit order create operation.\n * @param owner - Account creating the order\n * @param amountToSell - Amount and asset to sell\n * @param minToReceive - Minimum amount and asset to receive\n * @param fillOrKill - If true, order must be filled immediately or cancelled\n * @param expiration - Expiration date (ISO string)\n * @param orderId - Unique order ID\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOp(\n owner: string,\n amountToSell: string,\n minToReceive: string,\n fillOrKill: boolean,\n expiration: string,\n orderId: number\n): Operation {\n if (!owner || !amountToSell || !minToReceive || !expiration || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCreateOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_create\",\n {\n owner,\n orderid: orderId,\n amount_to_sell: amountToSell,\n min_to_receive: minToReceive,\n fill_or_kill: fillOrKill,\n expiration,\n },\n ];\n}\n\n/**\n * Helper to format number to 3 decimal places\n */\nfunction formatNumber(value: number, decimals: number = 3): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Builds a limit order create operation with automatic formatting.\n * This is a convenience method that handles buy/sell logic and formatting.\n *\n * For Buy orders: You're buying HIVE with HBD\n * - amountToSell: HBD amount you're spending\n * - minToReceive: HIVE amount you want to receive\n *\n * For Sell orders: You're selling HIVE for HBD\n * - amountToSell: HIVE amount you're selling\n * - minToReceive: HBD amount you want to receive\n *\n * @param owner - Account creating the order\n * @param amountToSell - Amount to sell (number)\n * @param minToReceive - Minimum to receive (number)\n * @param orderType - Buy or Sell\n * @param idPrefix - Order ID prefix\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOpWithType(\n owner: string,\n amountToSell: number,\n minToReceive: number,\n orderType: BuySellTransactionType,\n idPrefix: OrderIdPrefix = OrderIdPrefix.EMPTY\n): Operation {\n // Validate numeric inputs\n if (\n !owner ||\n orderType === undefined ||\n !Number.isFinite(amountToSell) ||\n amountToSell <= 0 ||\n !Number.isFinite(minToReceive) ||\n minToReceive <= 0\n ) {\n throw new Error(\"[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters\");\n }\n\n // Calculate expiration (27 days from now)\n const expiration = new Date(Date.now());\n expiration.setDate(expiration.getDate() + 27);\n const expirationStr = expiration.toISOString().split(\".\")[0];\n\n // Generate order ID\n const orderId = Number(\n `${idPrefix}${Math.floor(Date.now() / 1000)\n .toString()\n .slice(2)}`\n );\n\n // Format amounts based on order type\n // Buy: Sell HBD to buy HIVE\n // Sell: Sell HIVE to buy HBD\n const formattedAmountToSell =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(amountToSell, 3)} HBD`\n : `${formatNumber(amountToSell, 3)} HIVE`;\n\n const formattedMinToReceive =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(minToReceive, 3)} HIVE`\n : `${formatNumber(minToReceive, 3)} HBD`;\n\n return buildLimitOrderCreateOp(\n owner,\n formattedAmountToSell,\n formattedMinToReceive,\n false,\n expirationStr,\n orderId\n );\n}\n\n/**\n * Builds a limit order cancel operation.\n * @param owner - Account cancelling the order\n * @param orderId - Order ID to cancel\n * @returns Limit order cancel operation\n */\nexport function buildLimitOrderCancelOp(owner: string, orderId: number): Operation {\n if (!owner || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCancelOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_cancel\",\n {\n owner,\n orderid: orderId,\n },\n ];\n}\n\n/**\n * Builds a claim reward balance operation.\n * @param account - Account claiming rewards\n * @param rewardHive - HIVE reward to claim (e.g., \"0.000 HIVE\")\n * @param rewardHbd - HBD reward to claim (e.g., \"0.000 HBD\")\n * @param rewardVests - VESTS reward to claim (e.g., \"0.000000 VESTS\")\n * @returns Claim reward balance operation\n */\nexport function buildClaimRewardBalanceOp(\n account: string,\n rewardHive: string,\n rewardHbd: string,\n rewardVests: string\n): Operation {\n if (!account || !rewardHive || !rewardHbd || !rewardVests) {\n throw new Error(\"[SDK][buildClaimRewardBalanceOp] Missing required parameters\");\n }\n\n return [\n \"claim_reward_balance\",\n {\n account,\n reward_hive: rewardHive,\n reward_hbd: rewardHbd,\n reward_vests: rewardVests,\n },\n ];\n}\n","import type { Operation, Authority } from \"../../../hive-tx\";\n\nexport type { Authority };\n\n/**\n * Account Operations\n * Operations for managing accounts, keys, and permissions\n */\n\n/**\n * Builds an account update operation.\n * @param account - Account name\n * @param owner - Owner authority (optional)\n * @param active - Active authority (optional)\n * @param posting - Posting authority (optional)\n * @param memoKey - Memo public key\n * @param jsonMetadata - Account JSON metadata\n * @returns Account update operation\n */\nexport function buildAccountUpdateOp(\n account: string,\n owner: Authority | undefined,\n active: Authority | undefined,\n posting: Authority | undefined,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !memoKey) {\n throw new Error(\"[SDK][buildAccountUpdateOp] Missing required parameters\");\n }\n\n return [\n \"account_update\",\n {\n account,\n owner,\n active,\n posting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an account update2 operation (for posting_json_metadata).\n * @param account - Account name\n * @param jsonMetadata - Account JSON metadata (legacy, usually empty)\n * @param postingJsonMetadata - Posting JSON metadata string\n * @param extensions - Extensions array\n * @returns Account update2 operation\n */\nexport function buildAccountUpdate2Op(\n account: string,\n jsonMetadata: string,\n postingJsonMetadata: string,\n extensions: any[]\n): Operation {\n if (!account || postingJsonMetadata === undefined) {\n throw new Error(\"[SDK][buildAccountUpdate2Op] Missing required parameters\");\n }\n\n return [\n \"account_update2\",\n {\n account,\n json_metadata: jsonMetadata || \"\",\n posting_json_metadata: postingJsonMetadata,\n extensions: (extensions || []) as [],\n },\n ];\n}\n\n/**\n * Public keys for account creation\n */\nexport interface AccountKeys {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n}\n\n/**\n * Builds an account create operation.\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @param fee - Creation fee (e.g., \"3.000 HIVE\")\n * @returns Account create operation\n */\nexport function buildAccountCreateOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys,\n fee: string\n): Operation {\n if (!creator || !newAccountName || !keys || !fee) {\n throw new Error(\"[SDK][buildAccountCreateOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"account_create\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n fee,\n },\n ] satisfies Operation;\n}\n\n/**\n * Builds a create claimed account operation (using account creation tokens).\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @returns Create claimed account operation\n */\nexport function buildCreateClaimedAccountOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys\n): Operation {\n if (!creator || !newAccountName || !keys) {\n throw new Error(\"[SDK][buildCreateClaimedAccountOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"create_claimed_account\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds a claim account operation.\n * @param creator - Account claiming the token\n * @param fee - Fee for claiming (usually \"0.000 HIVE\" for RC-based claims)\n * @returns Claim account operation\n */\nexport function buildClaimAccountOp(creator: string, fee: string): Operation {\n if (!creator || !fee) {\n throw new Error(\"[SDK][buildClaimAccountOp] Missing required parameters\");\n }\n\n return [\n \"claim_account\",\n {\n creator,\n fee,\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds an operation to grant posting permission to another account.\n * Helper that modifies posting authority to add an account.\n * @param account - Account granting permission\n * @param currentPosting - Current posting authority\n * @param grantedAccount - Account to grant permission to\n * @param weightThreshold - Weight threshold of the granted account\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildGrantPostingPermissionOp(\n account: string,\n currentPosting: Authority,\n grantedAccount: string,\n weightThreshold: number,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !grantedAccount || !memoKey) {\n throw new Error(\"[SDK][buildGrantPostingPermissionOp] Missing required parameters\");\n }\n\n // Find existing account or create new entry to prevent duplicates\n const existingIndex = currentPosting.account_auths.findIndex(\n ([acc]) => acc === grantedAccount\n );\n\n const newAccountAuths = [...currentPosting.account_auths];\n if (existingIndex >= 0) {\n // Update existing entry with new weight\n newAccountAuths[existingIndex] = [grantedAccount, weightThreshold];\n } else {\n // Add new entry\n newAccountAuths.push([grantedAccount, weightThreshold]);\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: newAccountAuths,\n };\n\n // Sort account_auths alphabetically for consistency\n newPosting.account_auths.sort((a, b) => (a[0] > b[0] ? 1 : -1));\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an operation to revoke posting permission from an account.\n * Helper that modifies posting authority to remove an account.\n * @param account - Account revoking permission\n * @param currentPosting - Current posting authority\n * @param revokedAccount - Account to revoke permission from\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildRevokePostingPermissionOp(\n account: string,\n currentPosting: Authority,\n revokedAccount: string,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !revokedAccount || !memoKey) {\n throw new Error(\"[SDK][buildRevokePostingPermissionOp] Missing required parameters\");\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: currentPosting.account_auths.filter(\n ([acc]) => acc !== revokedAccount\n ),\n };\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds a change recovery account operation.\n * @param accountToRecover - Account to change recovery account for\n * @param newRecoveryAccount - New recovery account name\n * @param extensions - Extensions array\n * @returns Change recovery account operation\n */\nexport function buildChangeRecoveryAccountOp(\n accountToRecover: string,\n newRecoveryAccount: string,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newRecoveryAccount) {\n throw new Error(\"[SDK][buildChangeRecoveryAccountOp] Missing required parameters\");\n }\n\n return [\n \"change_recovery_account\",\n {\n account_to_recover: accountToRecover,\n new_recovery_account: newRecoveryAccount,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a request account recovery operation.\n * @param recoveryAccount - Recovery account performing the recovery\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param extensions - Extensions array\n * @returns Request account recovery operation\n */\nexport function buildRequestAccountRecoveryOp(\n recoveryAccount: string,\n accountToRecover: string,\n newOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {\n throw new Error(\"[SDK][buildRequestAccountRecoveryOp] Missing required parameters\");\n }\n\n return [\n \"request_account_recovery\",\n {\n recovery_account: recoveryAccount,\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a recover account operation.\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param recentOwnerAuthority - Recent owner authority (for proof)\n * @param extensions - Extensions array\n * @returns Recover account operation\n */\nexport function buildRecoverAccountOp(\n accountToRecover: string,\n newOwnerAuthority: Authority,\n recentOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newOwnerAuthority || !recentOwnerAuthority) {\n throw new Error(\"[SDK][buildRecoverAccountOp] Missing required parameters\");\n }\n\n return [\n \"recover_account\",\n {\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n recent_owner_authority: recentOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Ecency-Specific Operations\n * Custom operations for Ecency platform features (Points, Boost, Promote, etc.)\n */\n\n/**\n * Builds an Ecency Boost Plus subscription operation (custom_json).\n * @param user - User account\n * @param account - Account to subscribe\n * @param duration - Subscription duration in days (must be a valid finite number)\n * @returns Custom JSON operation for boost plus\n */\nexport function buildBoostPlusOp(\n user: string,\n account: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !account || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildBoostPlusOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_boost_plus\",\n json: JSON.stringify({\n user,\n account,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency RC top-up operation (custom_json): a short-term, RC-only\n * delegation to the user's OWN account, paid for with Ecency Points. Distinct\n * from Boost Plus (which delegates Hive Power). The RC amount is fixed\n * server-side, so the user only chooses a duration. Signed with active\n * authority because it spends Points. The actual on-chain `delegate_rc` is\n * broadcast by the Ecency relay account, not here.\n * @param user - User account (payer and recipient of the RC)\n * @param duration - Delegation duration in days (must be a valid finite number)\n * @returns Custom JSON operation for the RC top-up\n */\nexport function buildRcDelegationOp(user: string, duration: number): Operation {\n if (!user || !Number.isInteger(duration) || duration <= 0) {\n throw new Error(\"[SDK][buildRcDelegationOp] Missing or invalid parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_rc_delegation\",\n json: JSON.stringify({\n user,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency promote operation (custom_json).\n * @param user - User account\n * @param author - Post author\n * @param permlink - Post permlink\n * @param duration - Promotion duration in days (must be a valid finite number)\n * @returns Custom JSON operation for promote\n */\nexport function buildPromoteOp(\n user: string,\n author: string,\n permlink: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !author || !permlink || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildPromoteOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_promote\",\n json: JSON.stringify({\n user,\n author,\n permlink,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency point transfer operation (custom_json).\n * @param sender - Sender account\n * @param receiver - Receiver account\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Custom JSON operation for point transfer\n */\nexport function buildPointTransferOp(\n sender: string,\n receiver: string,\n amount: string,\n memo: string\n): Operation {\n if (!sender || !receiver || !amount) {\n throw new Error(\"[SDK][buildPointTransferOp] Missing required parameters\");\n }\n\n // Normalize \"POINTS\" to \"POINT\" — backend expects singular form\n const normalizedAmount = amount.replace(/POINTS\\b/, \"POINT\");\n\n return [\n \"custom_json\",\n {\n id: \"ecency_point_transfer\",\n json: JSON.stringify({\n sender,\n receiver,\n amount: normalizedAmount,\n memo: memo || \"\",\n }),\n required_auths: [sender],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds multiple Ecency point transfer operations for multiple recipients.\n * @param sender - Sender account\n * @param destinations - Comma or space separated list of recipients\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Array of custom JSON operations for point transfers\n */\nexport function buildMultiPointTransferOps(\n sender: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!sender || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Validate parsed destinations\n if (destArray.length === 0) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing valid destinations\");\n }\n\n // Create a point transfer operation for each destination\n return destArray.map((dest) =>\n buildPointTransferOp(sender, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds an Ecency community rewards registration operation (custom_json).\n * @param name - Account name to register\n * @returns Custom JSON operation for community registration\n */\nexport function buildCommunityRegistrationOp(name: string): Operation {\n if (!name) {\n throw new Error(\"[SDK][buildCommunityRegistrationOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_registration\",\n json: JSON.stringify({\n name,\n }),\n required_auths: [name],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic active authority custom_json operation.\n * Used for various Ecency operations that require active authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with active authority\n */\nexport function buildActiveCustomJsonOp(\n username: string,\n operationId: string,\n json: Record\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildActiveCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [username],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic posting authority custom_json operation.\n * Used for various operations that require posting authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with posting authority\n */\nexport function buildPostingCustomJsonOp(\n username: string,\n operationId: string,\n json: Record | any[]\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildPostingCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildFollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for following an account.\n */\nexport interface FollowPayload {\n /** Account to follow */\n following: string;\n}\n\n/**\n * React Query mutation hook for following an account.\n *\n * This mutation broadcasts a follow operation to the Hive blockchain,\n * adding the target account to the follower's \"blog\" follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const followMutation = useFollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Follow an account\n * followMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useFollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"follow\"],\n username,\n ({ following }) => [\n buildFollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnfollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unfollowing an account.\n */\nexport interface UnfollowPayload {\n /** Account to unfollow */\n following: string;\n}\n\n/**\n * React Query mutation hook for unfollowing an account.\n *\n * This mutation broadcasts an unfollow operation to the Hive blockchain,\n * removing the target account from the follower's follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const unfollowMutation = useUnfollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unfollow an account\n * unfollowMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useUnfollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"unfollow\"],\n username,\n ({ following }) => [\n buildUnfollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n author: string;\n permlink: string;\n}\n\nexport function useBookmarkAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"add\", username],\n mutationFn: async ({ author, permlink }: Payload) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useBookmarkDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"delete\", username],\n mutationFn: async (bookmarkId: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: bookmarkId,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useAccountFavoriteAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"add\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation, InfiniteData } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../../types\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAccountFavoriteDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"delete\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to delete favorite: ${response.status}`);\n }\n return response.json();\n },\n onMutate: async (account: string) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.accounts.favorites(username);\n const infinitePrefix = QueryKeys.accounts.favoritesInfinite(username);\n const checkKey = QueryKeys.accounts.checkFavorite(username, account);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n qc.cancelQueries({ queryKey: checkKey }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((f) => f.account !== account)\n );\n }\n\n const previousCheck = qc.getQueryData(checkKey);\n qc.setQueryData(checkKey, false);\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((f) => f.account !== account),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite, previousCheck };\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError: (err, account, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.accounts.favorites(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n if (context?.previousCheck !== undefined) {\n qc.setQueryData(\n QueryKeys.accounts.checkFavorite(username!, account),\n context.previousCheck\n );\n }\n onError(err);\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\nexport interface Keys {\n owner: PrivateKey;\n active: PrivateKey;\n posting: PrivateKey;\n memo_key: PrivateKey;\n}\n\ninterface Payload {\n keepCurrent?: boolean;\n currentKey: PrivateKey;\n keys: Keys[];\n keysToRevoke?: string[]; // Deprecated: will be treated as revoking from all authorities\n keysToRevokeByAuthority?: Partial>; // Authority-specific revocation\n}\n\nexport function dedupeAndSortKeyAuths(\n existing: Authority[\"key_auths\"],\n additions: [string, number][]\n): Authority[\"key_auths\"] {\n const merged = new Map();\n\n existing.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n additions.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n return Array.from(merged.entries())\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, weight]) => [key, weight] as [string, number]);\n}\n\ntype UpdateKeyAuthsOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdateKeyAuths(\n username: string,\n options?: UpdateKeyAuthsOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"keys-update\", username],\n mutationFn: async ({\n keys,\n keepCurrent = false,\n currentKey,\n keysToRevoke = [],\n keysToRevokeByAuthority = {}\n }: Payload) => {\n if (keys.length === 0) {\n throw new Error(\n \"[SDK][Update password] – no new keys provided\"\n );\n }\n\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update keys for anon user\"\n );\n }\n\n const prepareAuth = (keyName: keyof Keys) => {\n const auth: Authority = JSON.parse(JSON.stringify(accountData[keyName]));\n\n // Get keys to revoke for this specific authority\n const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];\n // Fallback to global keysToRevoke for backwards compatibility\n const allKeysToRevoke = [\n ...keysToRevokeForAuthority,\n ...(keysToRevokeByAuthority[keyName] === undefined ? keysToRevoke : [])\n ];\n\n // Filter out keys to revoke from existing keys (authority-specific)\n const existingKeys = keepCurrent\n ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString()))\n : [];\n\n auth.key_auths = dedupeAndSortKeyAuths(\n existingKeys,\n keys.map(\n (values, i) =>\n [values[keyName].createPublic().toString(), i + 1] as [\n string,\n number,\n ]\n )\n );\n\n return auth;\n };\n\n return broadcastOperations(\n [[\"account_update\", {\n account: username,\n json_metadata: accountData.json_metadata,\n owner: prepareAuth(\"owner\"),\n active: prepareAuth(\"active\"),\n posting: prepareAuth(\"posting\"),\n // Always use new memo key when adding new keys\n memo_key: keys[0].memo_key.createPublic().toString(),\n }]],\n currentKey\n );\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { useAccountUpdateKeyAuths } from \"./use-account-update-key-auths\";\n\ninterface Payload {\n newPassword: string;\n currentPassword: string;\n keepCurrent?: boolean;\n}\n\n/**\n * Only native Hive and custom passwords could be updated here\n * Seed based password cannot be updated here, it will be in an account always for now\n */\ntype UpdatePasswordOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdatePassword(\n username: string,\n options?: UpdatePasswordOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);\n\n return useMutation({\n mutationKey: [\"accounts\", \"password-update\", username],\n mutationFn: async ({\n newPassword,\n currentPassword,\n keepCurrent,\n }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update password for anon user\"\n );\n }\n const currentKey = PrivateKey.fromLogin(\n username,\n currentPassword,\n \"owner\"\n );\n\n return updateKeys({\n currentKey,\n keepCurrent,\n keys: [\n {\n owner: PrivateKey.fromLogin(username, newPassword, \"owner\"),\n active: PrivateKey.fromLogin(username, newPassword, \"active\"),\n posting: PrivateKey.fromLogin(username, newPassword, \"posting\"),\n memo_key: PrivateKey.fromLogin(username, newPassword, \"memo\"),\n },\n ],\n });\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { FullAccount } from \"../types\";\nimport hs from \"hivesigner\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n}\n\ntype RevokePostingOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountRevokePosting(\n username: string | undefined,\n options: RevokePostingOptions,\n auth?: AuthContextV2\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-posting\", data?.name],\n mutationFn: async ({ accountName, type, key }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot revoke posting for anonymous user\"\n );\n }\n\n const posting = JSON.parse(JSON.stringify(data.posting)) as FullAccount[\"posting\"];\n\n posting.account_auths = posting.account_auths.filter(\n ([account]) => account !== accountName\n );\n\n const operationBody = {\n account: data.name,\n posting,\n memo_key: data.memo_key,\n json_metadata: data.json_metadata,\n };\n\n if (type === \"key\" && key) {\n return broadcastOperations([[\"account_update\", operationBody]], key);\n } else if (type === \"keychain\") {\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.adapter.broadcastWithKeychain(\n data.name,\n [[\"account_update\", operationBody]],\n \"active\"\n );\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"account_update\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: (resp, payload, ctx) => {\n (options.onSuccess as\n | ((data: unknown, variables: CommonPayload, context: unknown) => unknown)\n | undefined)?.(resp, payload, ctx);\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) =>\n ({\n ...data,\n posting: {\n ...data?.posting,\n account_auths:\n data?.posting?.account_auths?.filter(\n ([account]) => account !== payload.accountName\n ) ?? [],\n },\n }) as FullAccount\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\" | \"ecency\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n email?: string;\n}\n\ntype UpdateRecoveryOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountUpdateRecovery(\n username: string | undefined,\n code: string | undefined,\n options: UpdateRecoveryOptions,\n auth?: AuthContextV2\n) {\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"recovery\", data?.name],\n mutationFn: async ({ accountName, type, key, email }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot change recovery for anonymous user\"\n );\n }\n\n const operationBody = {\n account_to_recover: data.name,\n new_recovery_account: accountName,\n extensions: [] as [],\n };\n\n if (type === \"ecency\") {\n if (!code) {\n throw new Error(\"[SDK][Accounts] – missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/recoveries-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n email,\n publicKeys: [\n ...data.owner.key_auths,\n ...data.active.key_auths,\n ...data.posting.key_auths,\n data.memo_key,\n ],\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx, so guard explicitly — otherwise the\n // caller's onSuccess shows a \"recovery updated\" toast on a failed request.\n // (The missing Content-Type header also made the backend skip JSON parsing.)\n if (!response.ok) {\n throw new Error(`[SDK][Accounts] Failed to add recovery: ${response.status}`);\n }\n\n return response;\n } else if (type === \"key\" && key) {\n return broadcastOperations(\n [[\"change_recovery_account\", operationBody]],\n key\n );\n } else if (type === \"keychain\") {\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.adapter.broadcastWithKeychain(data.name, [[\"change_recovery_account\", operationBody]], \"owner\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"change_recovery_account\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: options.onSuccess,\n });\n}\n","import { PublicKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport { FullAccount } from \"../types\";\n\n/**\n * Check whether an authority would still meet its weight_threshold\n * after removing the given keys. This prevents revoking keys that\n * would leave an authority unable to sign (especially for multisig).\n */\nexport function canRevokeFromAuthority(\n auth: Authority,\n revokingKeyStrs: Set\n): boolean {\n const remainingWeight = auth.key_auths\n .filter(([key]) => !revokingKeyStrs.has(String(key)))\n .reduce((sum, [, weight]) => sum + weight, 0);\n\n // account_auths also contribute weight\n const accountWeight = (auth.account_auths ?? []).reduce(\n (sum: number, [, weight]: [string, number]) => sum + weight,\n 0\n );\n\n return (remainingWeight + accountWeight) >= auth.weight_threshold;\n}\n\n/**\n * Build an account_update operation that removes the given public keys\n * from the relevant authorities.\n *\n * Only includes the `owner` field when a revoking key actually exists\n * in the owner authority - omitting it allows active-level signing.\n *\n * Returns the operation payload (without the \"account_update\" tag) so\n * callers can wrap it as needed for their broadcast method.\n */\nexport function buildRevokeKeysOp(\n accountData: FullAccount,\n revokingKeys: PublicKey[]\n) {\n const revokingKeyStrs = new Set(revokingKeys.map((k) => k.toString()));\n\n const hasAnyKeyInAuth = (auth: Authority) =>\n auth.key_auths.some(\n ([key]: [string | PublicKey, number]) => revokingKeyStrs.has(String(key))\n );\n\n const prepareAuth = (auth: Authority): Authority => {\n const clone: Authority = JSON.parse(JSON.stringify(auth));\n clone.key_auths = clone.key_auths.filter(\n ([key]) => !revokingKeyStrs.has(key.toString())\n );\n return clone;\n };\n\n const needsOwnerUpdate = hasAnyKeyInAuth(accountData.owner);\n\n return {\n account: accountData.name,\n json_metadata: accountData.json_metadata,\n owner: needsOwnerUpdate ? prepareAuth(accountData.owner) : undefined,\n active: prepareAuth(accountData.active),\n posting: prepareAuth(accountData.posting),\n memo_key: accountData.memo_key\n };\n}\n","import { PrivateKey, PublicKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { buildRevokeKeysOp } from \"./build-revoke-keys-op\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ninterface Payload {\n currentKey: PrivateKey;\n /** Keys to revoke. Accepts a single key or an array. */\n revokingKey: PublicKey | PublicKey[];\n}\n\n/**\n * Revoke one or more keys from an account on the Hive blockchain.\n *\n * When revoking keys that exist only in active/posting authorities,\n * the owner field is omitted from the operation so active-level\n * signing is sufficient.\n */\ntype RevokeKeyOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountRevokeKey(\n username: string | undefined,\n options?: RevokeKeyOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-key\", accountData?.name],\n mutationFn: async ({ currentKey, revokingKey }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Revoke key] – cannot update keys for anon user\"\n );\n }\n\n const revokingKeys = Array.isArray(revokingKey) ? revokingKey : [revokingKey];\n const op = buildRevokeKeysOp(accountData, revokingKeys);\n\n return broadcastOperations([[\"account_update\", op]], currentKey);\n },\n ...options,\n });\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildClaimAccountOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for claiming account creation tokens.\n */\nexport interface ClaimAccountPayload {\n /** Creator account claiming the token */\n creator: string;\n /** Fee for claiming (usually \"0.000 HIVE\" for RC-based claims) */\n fee?: string;\n}\n\n/**\n * React Query mutation hook for claiming account creation tokens.\n *\n * This mutation broadcasts a claim_account operation to claim an account\n * creation token using Resource Credits (RC). The claimed token can later\n * be used to create a new account for free using the create_claimed_account\n * operation.\n *\n * @param username - The username claiming the account token (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account cache to update pending_claimed_accounts count\n * - Updates account query data to set pending_claimed_accounts = 0 optimistically\n *\n * **Operation Details:**\n * - Uses native claim_account operation\n * - Fee: \"0.000 HIVE\" (uses RC instead of HIVE)\n * - Authority: Active key (required for claiming)\n *\n * **RC Requirements:**\n * - Requires sufficient Resource Credits (RC)\n * - RC amount varies based on network conditions\n * - Claiming without sufficient RC will fail\n *\n * **Use Case:**\n * - Claim tokens in advance when RC is available\n * - Create accounts later without paying HIVE fee\n * - Useful for onboarding services and apps\n *\n * @example\n * ```typescript\n * const claimMutation = useClaimAccount(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Claim account token using RC\n * claimMutation.mutate({\n * creator: 'alice',\n * fee: '0.000 HIVE'\n * });\n * ```\n */\nexport function useClaimAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"claimAccount\"],\n username,\n ({ creator, fee = \"0.000 HIVE\" }) => [\n buildClaimAccountOp(creator, fee)\n ],\n async (_result: any, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(variables.creator),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildGrantPostingPermissionOp, type Authority } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface GrantPostingPermissionPayload {\n currentPosting: Authority;\n grantedAccount: string;\n weightThreshold: number;\n memoKey: string;\n jsonMetadata: string;\n}\n\nexport function useGrantPostingPermission(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"grant-posting-permission\"],\n username,\n (payload) => [\n buildGrantPostingPermissionOp(\n username!,\n payload.currentPosting,\n payload.grantedAccount,\n payload.weightThreshold,\n payload.memoKey,\n payload.jsonMetadata\n )\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildAccountCreateOp, buildCreateClaimedAccountOp, type AccountKeys } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface CreateAccountPayload {\n newAccountName: string;\n keys: AccountKeys;\n fee: string;\n /** If true, uses a claimed account token instead of paying the fee */\n useClaimed?: boolean;\n}\n\nexport function useCreateAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"create\"],\n username,\n (payload) => [\n payload.useClaimed\n ? buildCreateClaimedAccountOp(username!, payload.newAccountName, payload.keys)\n : buildAccountCreateOp(username!, payload.newAccountName, payload.keys, payload.fee)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { parseAsset } from \"@/modules/core/utils\";\nimport { DynamicProps } from \"@/modules/core/types\";\nimport { FullAccount } from \"../types\";\nimport { calculateVPMana, calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\n\nconst HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24; // 5 days\nconst HIVE_100_PERCENT = 10000;\nconst HIVE_VOTE_DUST_THRESHOLD = 50_000_000;\n\nfunction getEffectiveVests(account: FullAccount): number {\n const vesting = parseAsset(account.vesting_shares).amount;\n const received = parseAsset(account.received_vesting_shares).amount;\n const delegated = parseAsset(account.delegated_vesting_shares).amount;\n const withdrawRate = parseAsset(account.vesting_withdraw_rate).amount;\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n\n return vesting + received - delegated - withdrawVests;\n}\n\nfunction vestsToRshares(vests: number, votingPowerValue: number, votePerc: number): number {\n const vestingShares = vests * 1e6;\n const power = (votingPowerValue * votePerc) / 1e4 / 50 + 1;\n return (power * vestingShares) / 1e4;\n}\n\nfunction hasStableVoteHardfork(dynamicProps: DynamicProps): boolean {\n if (Number.isFinite(dynamicProps.lastHardfork)) {\n return dynamicProps.lastHardfork >= 28;\n }\n\n const [major = \"0\", minor = \"0\"] = (dynamicProps.currentHardforkVersion ?? \"0.0.0\").split(\".\");\n return Number(major) > 1 || (Number(major) === 1 && Number(minor) >= 28);\n}\n\nfunction stableVoteRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n weight: number\n): number {\n const reserveRate =\n dynamicProps.votePowerReserveRate ||\n Number(dynamicProps.raw?.globalDynamic?.vote_power_reserve_rate ?? 0);\n\n if (!Number.isFinite(reserveRate) || reserveRate <= 0) {\n return 0;\n }\n\n const effectiveVests = getEffectiveVests(account);\n if (!Number.isFinite(effectiveVests) || effectiveVests <= 0) {\n return 0;\n }\n\n const vestingShares = effectiveVests * 1e6;\n const usedMana =\n Math.ceil(\n (vestingShares * weight * 60 * 60 * 24) /\n HIVE_100_PERCENT /\n (reserveRate * HIVE_VOTING_MANA_REGENERATION_SECONDS)\n );\n\n const mana = calculateVPMana(account);\n const currentMana = Math.min(mana.current_mana, mana.max_mana);\n\n if (!Number.isFinite(currentMana) || usedMana > currentMana) {\n return 0;\n }\n\n return Math.max(usedMana - HIVE_VOTE_DUST_THRESHOLD, 0);\n}\n\nexport function votingRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n\n if (hasStableVoteHardfork(dynamicProps)) {\n return stableVoteRshares(account, dynamicProps, weight);\n }\n\n let totalVests = 0;\n try {\n totalVests = getEffectiveVests(account);\n if (!Number.isFinite(totalVests)) {\n return 0;\n }\n } catch {\n return 0;\n }\n\n return vestsToRshares(totalVests, votingPowerValue, weight);\n}\n\nexport function votingPower(account: FullAccount): number {\n const calc = calculateVPMana(account);\n return calc.percentage / 100;\n}\n\nexport function powerRechargeTime(power: number) {\n if (!Number.isFinite(power)) {\n throw new TypeError(\"Voting power must be a finite number\");\n }\n if (power < 0 || power > 100) {\n throw new RangeError(\"Voting power must be between 0 and 100\");\n }\n const missingPower = 100 - power;\n return (\n (missingPower * 100 * HIVE_VOTING_MANA_REGENERATION_SECONDS) / 10000\n );\n}\n\nexport function downVotingPower(account: FullAccount): number {\n const totalShares =\n parseFloat(account.vesting_shares) +\n parseFloat(account.received_vesting_shares) -\n parseFloat(account.delegated_vesting_shares);\n const elapsed = Math.floor(Date.now() / 1000) - account.downvote_manabar.last_update_time;\n const maxMana = (totalShares * 1000000) / 4;\n\n if (maxMana <= 0) {\n return 0;\n }\n\n let currentMana =\n parseFloat(account.downvote_manabar.current_mana.toString()) +\n (elapsed * maxMana) / HIVE_VOTING_MANA_REGENERATION_SECONDS;\n\n if (currentMana > maxMana) {\n currentMana = maxMana;\n }\n const currentManaPerc = (currentMana * 100) / maxMana;\n\n if (isNaN(currentManaPerc)) {\n return 0;\n }\n\n if (currentManaPerc > 100) {\n return 100;\n }\n return currentManaPerc;\n}\n\nexport function rcPower(account: RCAccount): number {\n const calc = calculateRCMana(account);\n return calc.percentage / 100;\n}\n\nexport function votingValue(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n const { fundRecentClaims, fundRewardBalance, base, quote } = dynamicProps;\n\n if (\n !Number.isFinite(fundRecentClaims) ||\n !Number.isFinite(fundRewardBalance) ||\n !Number.isFinite(base) ||\n !Number.isFinite(quote)\n ) {\n return 0;\n }\n\n if (fundRecentClaims === 0 || quote === 0) {\n return 0;\n }\n\n const rShares = votingRshares(account, dynamicProps, votingPowerValue, weight);\n\n if (!Number.isFinite(rShares)) {\n return 0;\n }\n\n return (rShares / fundRecentClaims) * fundRewardBalance * (base / quote);\n}\n","import type { Operation } from \"../../hive-tx\";\n\n/**\n * Authority levels for Hive blockchain operations.\n * - posting: Social operations (voting, commenting, reblogging)\n * - active: Financial and account management operations\n * - owner: Critical security operations (key changes, account recovery)\n * - memo: Memo encryption/decryption (rarely used for signing)\n */\nexport type AuthorityLevel = 'posting' | 'active' | 'owner' | 'memo';\n\n/**\n * Maps operation types to their required authority level.\n *\n * This mapping is used to determine which key is needed to sign a transaction,\n * enabling smart auth fallback and auth upgrade UI.\n *\n * @remarks\n * - Most social operations (vote, comment, reblog) require posting authority\n * - Financial operations (transfer, withdraw) require active authority\n * - Account management operations require active authority\n * - Security operations (password change, account recovery) require owner authority\n * - custom_json requires dynamic detection based on required_auths vs required_posting_auths\n */\nexport const OPERATION_AUTHORITY_MAP: Record = {\n // Posting authority operations\n vote: 'posting',\n comment: 'posting',\n delete_comment: 'posting',\n comment_options: 'posting',\n claim_reward_balance: 'posting',\n\n // Active authority operations - Financial\n cancel_transfer_from_savings: 'active',\n collateralized_convert: 'active',\n convert: 'active',\n delegate_vesting_shares: 'active',\n recurrent_transfer: 'active',\n set_withdraw_vesting_route: 'active',\n transfer: 'active',\n transfer_from_savings: 'active',\n transfer_to_savings: 'active',\n transfer_to_vesting: 'active',\n withdraw_vesting: 'active',\n\n // Active authority operations - Market\n limit_order_create: 'active',\n limit_order_cancel: 'active',\n\n // Active authority operations - Account Management\n account_update: 'active',\n account_update2: 'active',\n claim_account: 'active',\n create_claimed_account: 'active',\n\n // Active authority operations - Governance\n account_witness_proxy: 'active',\n account_witness_vote: 'active',\n remove_proposal: 'active',\n update_proposal_votes: 'active',\n\n // Owner authority operations - Security & Account Recovery\n change_recovery_account: 'owner',\n request_account_recovery: 'owner',\n recover_account: 'owner',\n reset_account: 'owner',\n set_reset_account: 'owner',\n\n // Note: Some operations are handled separately via content inspection:\n // - custom_json: via getCustomJsonAuthority() - posting or active based on required_auths\n // - create_proposal/update_proposal: via getProposalAuthority() - typically active\n};\n\n/**\n * Determines authority required for a custom_json operation.\n *\n * Custom JSON operations can require either posting or active authority\n * depending on which field is populated:\n * - required_auths (active authority)\n * - required_posting_auths (posting authority)\n *\n * @param customJsonOp - The custom_json operation to inspect\n * @returns 'active' if requires active authority, 'posting' if requires posting authority\n *\n * @example\n * ```typescript\n * // Reblog operation (posting authority)\n * const reblogOp: Operation = ['custom_json', {\n * required_auths: [],\n * required_posting_auths: ['alice'],\n * id: 'reblog',\n * json: '...'\n * }];\n * getCustomJsonAuthority(reblogOp); // Returns 'posting'\n *\n * // Some active authority custom_json\n * const activeOp: Operation = ['custom_json', {\n * required_auths: ['alice'],\n * required_posting_auths: [],\n * id: 'some_active_op',\n * json: '...'\n * }];\n * getCustomJsonAuthority(activeOp); // Returns 'active'\n * ```\n */\nexport function getCustomJsonAuthority(customJsonOp: Operation): AuthorityLevel {\n const opType = customJsonOp[0];\n const payload = customJsonOp[1];\n\n if (opType !== 'custom_json') {\n throw new Error('Operation is not a custom_json operation');\n }\n\n // Type assertion for custom_json payload\n const customJson = payload as {\n required_auths?: string[];\n required_posting_auths?: string[];\n id: string;\n json: string;\n };\n\n // If required_auths is set and non-empty, needs active authority\n if (customJson.required_auths && customJson.required_auths.length > 0) {\n return 'active';\n }\n\n // If only required_posting_auths is set, needs posting authority\n if (customJson.required_posting_auths && customJson.required_posting_auths.length > 0) {\n return 'posting';\n }\n\n // Default to posting for custom_json (most common case)\n return 'posting';\n}\n\n/**\n * Determines authority required for a proposal operation.\n *\n * Proposal operations (create_proposal, update_proposal) typically require\n * active authority as they involve financial commitments and funding allocations.\n *\n * @param proposalOp - The proposal operation to inspect\n * @returns 'active' authority requirement\n *\n * @remarks\n * Unlike custom_json, proposal operations don't have explicit required_auths fields.\n * They always use the creator's authority, which defaults to active for financial\n * operations involving the DAO treasury.\n *\n * @example\n * ```typescript\n * const proposalOp: Operation = ['create_proposal', {\n * creator: 'alice',\n * receiver: 'bob',\n * subject: 'My Proposal',\n * permlink: 'my-proposal',\n * start: '2026-03-01T00:00:00',\n * end: '2026-04-01T00:00:00',\n * daily_pay: '100.000 HBD',\n * extensions: []\n * }];\n * getProposalAuthority(proposalOp); // Returns 'active'\n * ```\n */\nexport function getProposalAuthority(proposalOp: Operation): AuthorityLevel {\n const opType = proposalOp[0];\n\n if (opType !== 'create_proposal' && opType !== 'update_proposal') {\n throw new Error('Operation is not a proposal operation');\n }\n\n // Proposal operations require active authority for financial operations\n return 'active';\n}\n\n/**\n * Determines the required authority level for any operation.\n *\n * Uses the OPERATION_AUTHORITY_MAP for standard operations, and dynamic\n * detection for custom_json operations.\n *\n * @param op - The operation to check\n * @returns 'posting' or 'active' authority requirement\n *\n * @example\n * ```typescript\n * const voteOp: Operation = ['vote', { voter: 'alice', author: 'bob', permlink: 'post', weight: 10000 }];\n * getOperationAuthority(voteOp); // Returns 'posting'\n *\n * const transferOp: Operation = ['transfer', { from: 'alice', to: 'bob', amount: '1.000 HIVE', memo: '' }];\n * getOperationAuthority(transferOp); // Returns 'active'\n * ```\n */\nexport function getOperationAuthority(op: Operation): AuthorityLevel {\n const opType = op[0];\n\n // Special handling for custom_json - requires content inspection\n if (opType === 'custom_json') {\n return getCustomJsonAuthority(op);\n }\n\n // Special handling for proposal operations - requires content inspection\n if (opType === 'create_proposal' || opType === 'update_proposal') {\n return getProposalAuthority(op);\n }\n\n // Use mapping for standard operations, default to posting if unknown\n return OPERATION_AUTHORITY_MAP[opType] ?? 'posting';\n}\n\n/**\n * Determines the highest authority level required for a list of operations.\n *\n * Useful when broadcasting multiple operations together - the highest authority\n * level required by any operation determines what key is needed for the batch.\n *\n * Authority hierarchy: owner > active > posting > memo\n *\n * @param ops - Array of operations\n * @returns Highest authority level required ('owner', 'active', or 'posting')\n *\n * @example\n * ```typescript\n * const ops: Operation[] = [\n * ['vote', { ... }], // posting\n * ['comment', { ... }], // posting\n * ];\n * getRequiredAuthority(ops); // Returns 'posting'\n *\n * const mixedOps: Operation[] = [\n * ['comment', { ... }], // posting\n * ['transfer', { ... }], // active\n * ];\n * getRequiredAuthority(mixedOps); // Returns 'active'\n *\n * const securityOps: Operation[] = [\n * ['transfer', { ... }], // active\n * ['change_recovery_account', { ... }], // owner\n * ];\n * getRequiredAuthority(securityOps); // Returns 'owner'\n * ```\n */\nexport function getRequiredAuthority(ops: Operation[]): AuthorityLevel {\n let highestAuthority: AuthorityLevel = 'posting';\n\n for (const op of ops) {\n const authority = getOperationAuthority(op);\n\n // Owner is highest - return immediately\n if (authority === 'owner') {\n return 'owner';\n }\n\n // Active is higher than posting\n if (authority === 'active' && highestAuthority === 'posting') {\n highestAuthority = 'active';\n }\n\n // Memo is lowest (same level as posting)\n // If we see memo but only have posting, stick with posting\n }\n\n return highestAuthority;\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { isWif, broadcastOperations } from \"@/modules/core/hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useSignOperationByKey(username: string | undefined) {\n return useMutation({\n mutationKey: [\"operations\", \"sign\", username],\n mutationFn: ({\n operation,\n keyOrSeed,\n }: {\n operation: Operation;\n keyOrSeed: string;\n }) => {\n if (!username) {\n throw new Error(\"[Operations][Sign] – cannot sign op with anon user\");\n }\n\n let privateKey: PrivateKey;\n if (keyOrSeed.split(\" \").length === 12) {\n privateKey = PrivateKey.fromLogin(username, keyOrSeed, \"active\");\n } else if (isWif(keyOrSeed)) {\n privateKey = PrivateKey.fromString(keyOrSeed);\n } else {\n privateKey = PrivateKey.from(keyOrSeed);\n }\n\n return broadcastOperations(\n [operation],\n privateKey\n );\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport function useSignOperationByKeychain(\n username: string | undefined,\n auth?: AuthContextV2,\n keyType: \"owner\" | \"active\" | \"posting\" | \"memo\" = \"active\"\n) {\n return useMutation({\n mutationKey: [\"operations\", \"sign-keychain\", username],\n mutationFn: ({ operation }: { operation: Operation }) => {\n if (!username) {\n throw new Error(\n \"[SDK][Keychain] – cannot sign operation with anon user\"\n );\n }\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Keychain] – missing keychain broadcaster\");\n }\n\n return auth.adapter.broadcastWithKeychain(username, [operation], keyType);\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function useSignOperationByHivesigner(callbackUri = \"/\") {\n return useMutation({\n mutationKey: [\"operations\", \"sign-hivesigner\", callbackUri],\n mutationFn: async ({ operation }: { operation: Operation }) => {\n return hs.sendOperation(operation, { callback: callbackUri }, () => {});\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getChainPropertiesQueryOptions() {\n return queryOptions({\n queryKey: [\"operations\", \"chain-properties\"],\n queryFn: async () => {\n return await callRPC(\"condenser_api.get_chain_properties\", []);\n },\n });\n}\n","import { Fragment } from \"../types\";\n\n/**\n * Build the cache entry for an edited fragment.\n *\n * The `/private-api/fragments-update` endpoint returns only a minimal\n * acknowledgement, not the full fragment. Writing that response straight into\n * the query cache blanked out the edited snippet (the reported bug), so the\n * updated record is built from the values the user actually submitted, merged\n * over whatever fields the response does carry, on top of the existing cached\n * fragment (preserving id/created).\n */\nexport function applyFragmentUpdate(\n existing: Fragment,\n response: Partial | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...existing,\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n };\n}\n\n/**\n * Build the cache entry for a newly added fragment. Reaffirms the submitted\n * title/body over the server acknowledgement so a fresh snippet never renders\n * blank if the response omits them, while keeping any server-provided\n * id/timestamps.\n */\nexport function buildAddedFragment(\n response: Fragment | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n } as Fragment;\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { buildAddedFragment } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAddFragment(username: string, code: string | undefined) {\n return useMutation({\n mutationKey: [\"posts\", \"add-fragment\", username],\n mutationFn: async ({ title, body }: { title: string; body: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-add\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and insert a bogus fragment into the cache. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to add fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // Reaffirm the submitted title/body over the server acknowledgement so a\n // freshly added snippet never renders blank if the response omits them,\n // while keeping any server-provided id/timestamps.\n const newFragment = buildAddedFragment(response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [newFragment, ...(data ?? [])]\n );\n\n // Update infinite query cache - add new fragment to first page\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page, index) =>\n index === 0\n ? { ...page, data: [newFragment, ...page.data] }\n : page\n ),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { applyFragmentUpdate } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useEditFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"edit-fragment\", username],\n mutationFn: async ({\n fragmentId,\n title,\n body\n }: {\n fragmentId: string;\n title: string;\n body: string;\n }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-update\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and overwrite the cached fragment with bogus data. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to update fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // The /fragments-update endpoint returns a minimal acknowledgement, not the\n // full fragment, so writing the raw response into the cache blanked out the\n // edited snippet. Rebuild the fragment from the submitted values instead.\n const applyUpdate = (fragment: Fragment): Fragment =>\n applyFragmentUpdate(fragment, response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) =>\n data?.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ) ?? []\n );\n\n // Update infinite query cache - update fragment in all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useRemoveFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"remove-fragment\", username],\n mutationFn: async ({ fragmentId }: { fragmentId: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/fragments-delete\", {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // getBoundFetch returns the raw fetch, so a 401/403/500 resolves rather than\n // rejects. Without this guard onSuccess would run and strip the fragment from\n // cache on a failed delete (false success). Throw so onError fires instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to delete fragment: ${response.status}`);\n }\n\n return response;\n },\n onSuccess(_data, variables) {\n const queryClient = getQueryClient();\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [...(data ?? [])].filter(({ id }) => id !== variables.fragmentId)\n );\n\n // Update infinite query cache - remove fragment from all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((fragment) => fragment.id !== variables.fragmentId),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { ApiNotification, ApiNotificationSetting } from \"@/modules/notifications\";\nimport { Draft, DraftMetadata } from \"@/modules/posts/types/draft\";\nimport { Schedule } from \"@/modules/posts/types/schedule\";\nimport { ApiResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n if (!response.ok) {\n let errorData: unknown = undefined;\n try {\n errorData = await response.json();\n } catch {\n errorData = undefined;\n }\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = errorData;\n throw error;\n }\n\n // Handle empty responses gracefully (e.g., 204 No Content or empty body)\n const text = await response.text();\n if (!text || text.trim() === \"\") {\n return \"\" as T;\n }\n\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n // If JSON parsing fails, return empty string as fallback\n console.warn(\"[SDK] Failed to parse JSON response:\", e, \"Response:\", text);\n return \"\" as T;\n }\n}\n\nexport async function signUp(\n username: string,\n email: string,\n referral: string,\n captchaToken?: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/account-create\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, email, referral, captcha_token: captchaToken }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function subscribeEmail(\n email: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/subscribe\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function usrActivity(\n code: string | undefined,\n ty: number,\n bl: string | number = \"\",\n tx: string | number = \"\"\n): Promise {\n const params: {\n code: string | undefined;\n ty: number;\n bl?: string | number;\n tx?: string | number;\n } = { code, ty };\n\n if (bl) {\n params.bl = bl;\n }\n if (tx) {\n params.tx = tx;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/usr-activity\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(params),\n });\n\n await parseJsonResponse(response);\n}\n\nexport async function getNotifications(\n code: string | undefined,\n filter: string | null,\n since: string | null = null,\n user: string | null = null\n): Promise {\n const data: { code: string | undefined; filter?: string; since?: string; user?: string } = {\n code,\n };\n\n if (filter) {\n data.filter = filter;\n }\n\n if (since) {\n data.since = since;\n }\n\n if (user) {\n data.user = user;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function saveNotificationSetting(\n code: string | undefined,\n username: string,\n system: string,\n allows_notify: number,\n notify_types: number[],\n token: string\n): Promise {\n const data = {\n code,\n username,\n token,\n system,\n allows_notify,\n notify_types,\n };\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/register-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getNotificationSetting(\n code: string | undefined,\n username: string,\n token: string\n): Promise {\n const data = { code, username, token };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/detail-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function markNotifications(\n code: string | undefined,\n id?: string\n): Promise> {\n const data: { code: string | undefined; id?: string } = {\n code,\n };\n if (id) {\n data.id = id;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications/mark\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addImage(code: string | undefined, url: string): Promise> {\n const data = { code, url };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\n// Upload always targets the canonical Ecency image server, even when\n// the user has changed their viewing proxy (e.g. images.hive.blog).\n// i.ecency.com is the same imagehoster endpoint as images.ecency.com\n// (identical backend / token validation); it is the canonical host\n// because some ISPs SNI-filter the images.ecency.com hostname.\nconst UPLOAD_HOST = \"https://i.ecency.com\";\n\nexport async function uploadImage(\n file: File,\n token: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${UPLOAD_HOST}/hs/${token}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\n/**\n * Upload image using posting key signature (/:username/:signature path).\n * Works with any compatible image server (images.ecency.com, images.hive.blog).\n * The signature is sha256(\"ImageSigningChallenge\" + fileData) signed with the posting key.\n */\nexport async function uploadImageWithSignature(\n file: File,\n username: string,\n signature: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${CONFIG.imageHost}/${username}/${signature}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\nexport async function deleteImage(\n code: string | undefined,\n imageId: string\n): Promise> {\n const data = { code, id: imageId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addDraft(\n code: string | undefined,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function updateDraft(\n code: string | undefined,\n draftId: string,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, id: draftId, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-update\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function deleteDraft(\n code: string | undefined,\n draftId: string\n): Promise> {\n const data = { code, id: draftId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addSchedule(\n code: string | undefined,\n permlink: string,\n title: string,\n body: string,\n meta: Record,\n options: Record | null,\n schedule: string,\n reblog: boolean\n): Promise> {\n const data: Record = {\n code,\n permlink,\n title,\n body,\n meta,\n schedule,\n reblog,\n };\n\n if (options) {\n data.options = options;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function deleteSchedule(\n code: string | undefined,\n id: string\n): Promise> {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function moveSchedule(code: string | undefined, id: string): Promise {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-move\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getPromotedPost(\n code: string | undefined,\n author: string,\n permlink: string\n): Promise<{ author: string; permlink: string } | \"\"> {\n const data = { code, author, permlink };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/promoted-post\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ author: string; permlink: string } | \"\">(response);\n}\n\nexport async function onboardEmail(\n username: string,\n email: string,\n friend: string\n): Promise> {\n const dataBody = {\n username,\n email,\n friend,\n };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/account-create-friend\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(dataBody),\n }\n );\n\n return parseJsonResponse>(response);\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useAddDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"add\", username],\n mutationFn: async ({\n title,\n body,\n tags,\n meta,\n }: {\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addDraft\");\n }\n return addDraft(code, title, body, tags, meta);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full drafts list from the response (API returns complete list)\n if (data?.drafts) {\n qc.setQueryData(QueryKeys.posts.drafts(username), data.drafts);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n }\n // Also invalidate the infinite query so the drafts list refetches\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { updateDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useUpdateDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"update\", username],\n mutationFn: async ({\n draftId,\n title,\n body,\n tags,\n meta,\n }: {\n draftId: string;\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for updateDraft\");\n }\n return updateDraft(code, draftId, title, body, tags, meta);\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteDraft } from \"@/modules/private-api/requests\";\nimport type { Draft } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useDeleteDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"delete\", username],\n mutationFn: async ({ draftId }: { draftId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteDraft\");\n }\n return deleteDraft(code, draftId);\n },\n onMutate: async ({ draftId }) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.posts.drafts(username);\n const infinitePrefix = QueryKeys.posts.draftsInfinite(username);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((d) => d._id !== draftId)\n );\n }\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((d) => d._id !== draftId),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite };\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError: (err, _variables, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.posts.drafts(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n onError?.(err);\n },\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addSchedule } from \"@/modules/private-api/requests\";\n\nexport function useAddSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"add\", username],\n mutationFn: async ({\n permlink,\n title,\n body,\n meta,\n options,\n schedule,\n reblog,\n }: {\n permlink: string;\n title: string;\n body: string;\n meta: Record;\n options: Record | null;\n schedule: string;\n reblog: boolean;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addSchedule\");\n }\n return addSchedule(code, permlink, title, body, meta, options, schedule, reblog);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.schedules(username),\n });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteSchedule } from \"@/modules/private-api/requests\";\n\nexport function useDeleteSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"delete\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteSchedule\");\n }\n return deleteSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { moveSchedule } from \"@/modules/private-api/requests\";\n\nexport function useMoveSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"move\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for moveSchedule\");\n }\n return moveSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n // Also invalidate drafts since moving a schedule creates a draft\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to add an image URL to the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful addition\n * @param onError - Optional callback on error\n *\n * @example\n * const addImageMutation = useAddImage(username, code);\n * addImageMutation.mutate({ url: 'https://...' });\n */\nexport function useAddImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"add\", username],\n mutationFn: async ({ url, code: nextCode }: { url: string; code?: string }) => {\n const effectiveCode = nextCode ?? code;\n\n if (!username || !effectiveCode) {\n throw new Error(\"[SDK][Posts] – missing auth for addImage\");\n }\n return addImage(effectiveCode, url);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.images(username),\n });\n },\n onError,\n });\n}\n","import { useMutation, type InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport { deleteImage } from \"@/modules/private-api/requests\";\nimport type { UserImage } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\n/**\n * Hook to delete an image from the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful deletion\n * @param onError - Optional callback on error\n *\n * @example\n * const deleteImageMutation = useDeleteImage(username, code);\n * deleteImageMutation.mutate({ imageId: '123' });\n */\nexport function useDeleteImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"delete\", username],\n mutationFn: async ({ imageId }: { imageId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteImage\");\n }\n return deleteImage(code, imageId);\n },\n onSuccess: (_data, variables) => {\n onSuccess?.();\n const qc = getQueryClient();\n const { imageId } = variables;\n\n // Optimistic removal from regular cache\n qc.setQueryData(\n [\"posts\", \"images\", username],\n (prev) => prev?.filter((img) => img._id !== imageId)\n );\n\n // Optimistic removal from infinite cache pages\n qc.setQueriesData>>(\n { queryKey: [\"posts\", \"images\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((img) => img._id !== imageId),\n })),\n };\n }\n );\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { uploadImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to upload an image file to Ecency image hosting\n *\n * @param onSuccess - Optional callback on successful upload, receives { url: string }\n * @param onError - Optional callback on error\n *\n * Note: This hook uploads to Ecency's image server and requires a signature token.\n * The token should be generated using the user's posting key signature.\n *\n * @example\n * const uploadMutation = useUploadImage(\n * (data) => console.log('Uploaded:', data.url)\n * );\n * uploadMutation.mutate({ file, token });\n */\nexport function useUploadImage(\n onSuccess?: (data: { url: string }) => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"upload\"],\n mutationFn: async ({\n file,\n token,\n signal,\n }: {\n file: File;\n token: string;\n signal?: AbortSignal;\n }) => {\n return uploadImage(file, token, signal);\n },\n onSuccess,\n onError,\n });\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry, EntryVote } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nfunction makeEntryPath(author: string, permlink: string) {\n return `/@${author}/${permlink}`;\n}\n\nfunction getEntryFromCache(\n author: string,\n permlink: string,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n return queryClient.getQueryData(\n QueryKeys.posts.entry(makeEntryPath(author, permlink))\n );\n}\n\nfunction setEntryInCache(entry: Entry, qc?: QueryClient) {\n const queryClient = qc ?? getQueryClient();\n queryClient.setQueryData(\n QueryKeys.posts.entry(makeEntryPath(entry.author, entry.permlink)),\n entry\n );\n}\n\nfunction mutateEntry(\n author: string,\n permlink: string,\n updater: (entry: Entry) => Entry,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = makeEntryPath(author, permlink);\n const existing = queryClient.getQueryData(QueryKeys.posts.entry(path));\n if (!existing) return undefined;\n\n const updated = updater(existing);\n queryClient.setQueryData(QueryKeys.posts.entry(path), updated);\n return existing;\n}\n\n/**\n * SDK-level entry cache utilities. These operate on SDK cache keys\n * ([\"posts\", \"entry\", \"/@author/permlink\"]).\n *\n * Web layer can bridge these to its own QueryIdentifiers.ENTRY keys\n * during the migration period.\n */\nexport namespace EntriesCacheManagement {\n export function updateVotes(\n author: string,\n permlink: string,\n votes: EntryVote[],\n payout: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n active_votes: votes,\n stats: {\n ...(entry.stats || {\n gray: false,\n hide: false,\n flag_weight: 0,\n total_votes: 0,\n }),\n total_votes: votes.length,\n flag_weight: entry.stats?.flag_weight || 0,\n },\n total_votes: votes.length,\n payout,\n pending_payout_value: String(payout),\n }),\n qc\n );\n }\n\n export function updateReblogsCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n reblogs: count,\n }),\n qc\n );\n }\n\n export function updateRepliesCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n children: count,\n }),\n qc\n );\n }\n\n export function addReply(\n reply: Entry,\n parentAuthor: string,\n parentPermlink: string,\n qc?: QueryClient\n ) {\n mutateEntry(\n parentAuthor,\n parentPermlink,\n (entry) => ({\n ...entry,\n children: entry.children + 1,\n replies: [reply, ...entry.replies],\n }),\n qc\n );\n }\n\n export function updateEntries(entries: Entry[], qc?: QueryClient) {\n entries.forEach((entry) => setEntryInCache(entry, qc));\n }\n\n export function invalidateEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ) {\n const queryClient = qc ?? getQueryClient();\n queryClient.invalidateQueries({\n queryKey: QueryKeys.posts.entry(makeEntryPath(author, permlink)),\n });\n }\n\n export function getEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ): Entry | undefined {\n return getEntryFromCache(author, permlink, qc);\n }\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Whether the cached active_votes list already reflects the broadcast vote:\n * the voter is present for a vote (weight !== 0) or absent for an unvote\n * (weight === 0). Used to avoid stacking the SDK's post-broadcast optimistic\n * update on top of a platform-level optimistic update applied at press time.\n */\nexport function isVoteAlreadyReflected(\n activeVotes: Array<{ voter: string }>,\n voter: string | undefined,\n weight: number\n): boolean {\n const hasVoterRecord = activeVotes.some((v) => v.voter === voter);\n return weight !== 0 ? hasVoterRecord : !hasVoterRecord;\n}\n\n/**\n * Payload for voting on a post or comment.\n */\nexport interface VotePayload {\n /** Author of the post/comment to vote on */\n author: string;\n /** Permlink of the post/comment to vote on */\n permlink: string;\n /** Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote) */\n weight: number;\n /** Optional estimated payout change for optimistic UI */\n estimated?: number;\n}\n\n/**\n * Post-broadcast optimistic cache update for a vote: replaces the voter's\n * active_votes record and bumps the payout by `estimated`. Skipped when the\n * cached entry already reflects this vote (voter present for a vote, absent\n * for an unvote): platforms with their own at-press optimistic layer (e.g.\n * the mobile app) have applied it by the time the broadcast resolves, and\n * stacking a second update here double-counts the payout and clobbers the\n * platform's richer vote record until the deferred invalidation.\n */\nexport function applyVoteCacheUpdate(\n username: string | undefined,\n variables: VotePayload,\n qc?: QueryClient\n): void {\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink, qc);\n if (\n !entry?.active_votes ||\n isVoteAlreadyReflected(entry.active_votes, username, variables.weight)\n ) {\n return;\n }\n const newVotes = [\n ...entry.active_votes.filter((v) => v.voter !== username),\n ...(variables.weight !== 0 ? [{ rshares: variables.weight, voter: username! }] : [])\n ];\n const newPayout = entry.payout + (variables.estimated ?? 0);\n EntriesCacheManagement.updateVotes(\n variables.author,\n variables.permlink,\n newVotes,\n newPayout,\n qc\n );\n}\n\n/**\n * React Query mutation hook for voting on posts and comments.\n *\n * This mutation broadcasts a vote operation to the Hive blockchain,\n * supporting upvotes (positive weight) and downvotes (negative weight).\n *\n * @param username - The username of the voter (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 120) if adapter.recordActivity is available\n * - Invalidates post cache to refetch updated vote data\n * - Invalidates voting power cache to show updated VP\n *\n * **Vote Weight:**\n * - 10000 = 100% upvote\n * - 0 = remove vote\n * - -10000 = 100% downvote\n *\n * @example\n * ```typescript\n * const voteMutation = useVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Upvote a post\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 10000\n * });\n *\n * // Remove vote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 0\n * });\n *\n * // Downvote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: -10000\n * });\n * ```\n *\n * @remarks\n * broadcastMode: async — Votes don't require block confirmation.\n * The vote is accepted into the mempool immediately; UI can optimistically update.\n */\nexport function useVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"vote\"],\n username,\n ({ author, permlink, weight }) => [\n buildVoteOp(username!, author, permlink, weight)\n ],\n async (result: any, variables) => {\n // Optimistic vote list + payout update (no-op when the cache already\n // reflects this vote — see applyVoteCacheUpdate).\n applyVoteCacheUpdate(username, variables);\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(120, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n if (auth?.adapter?.invalidateQueries) {\n const doInvalidate = () => {\n auth.adapter!.invalidateQueries!([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.accounts.full(username)\n ]);\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(doInvalidate, 4000);\n } else {\n doInvalidate();\n }\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildReblogOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Payload for reblogging a post.\n */\nexport interface ReblogPayload {\n /** Original post author */\n author: string;\n /** Original post permlink */\n permlink: string;\n /** If true, removes the reblog instead of creating it */\n deleteReblog?: boolean;\n}\n\n/**\n * React Query mutation hook for reblogging posts.\n *\n * This mutation broadcasts a custom_json operation to reblog (or un-reblog)\n * a post to the user's blog feed.\n *\n * @param username - The username performing the reblog (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 130) if adapter.recordActivity is available\n * - Invalidates blog feed cache to show the reblogged post\n * - Invalidates post cache to update reblog status\n *\n * **Reblog vs Delete:**\n * - deleteReblog: false (default) - Creates a reblog\n * - deleteReblog: true - Removes an existing reblog\n *\n * @example\n * ```typescript\n * const reblogMutation = useReblog(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Reblog a post\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post'\n * });\n *\n * // Remove a reblog\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * deleteReblog: true\n * });\n * ```\n */\nexport function useReblog(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"reblog\"],\n username,\n ({ author, permlink, deleteReblog }) => [\n buildReblogOp(username!, author, permlink, deleteReblog ?? false)\n ],\n async (result: any, variables) => {\n // Optimistic reblog count update\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink);\n if (entry) {\n const newCount = Math.max(0, (entry.reblogs ?? 0) + (variables.deleteReblog ? -1 : 1));\n EntriesCacheManagement.updateReblogsCount(variables.author, variables.permlink, newCount);\n }\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(130, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n const invalidate = () => {\n const qc = getQueryClient();\n qc.invalidateQueries({\n queryKey: QueryKeys.posts.accountPostsBlogPrefix(username!),\n });\n if (auth?.adapter?.invalidateQueries) {\n auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.posts.rebloggedBy(variables.author, variables.permlink),\n ]);\n }\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(invalidate, 4000);\n } else {\n invalidate();\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Beneficiary account and weight.\n */\nexport interface Beneficiary {\n /** Beneficiary account name */\n account: string;\n /** Beneficiary weight (10000 = 100%) */\n weight: number;\n}\n\n/**\n * Payload for creating a comment or post.\n */\nexport interface CommentPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post */\n permlink: string;\n /** Parent author (empty string for top-level posts) */\n parentAuthor: string;\n /** Parent permlink (category/tag for top-level posts) */\n parentPermlink: string;\n /** Title of the post (empty for comments) */\n title: string;\n /** Content body */\n body: string;\n /** JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for creating posts and comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to create a new post or reply on the Hive blockchain.\n *\n * @param username - The username creating the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 100 for posts, 110 for comments) if adapter.recordActivity is available\n * - Invalidates feed caches to show the new content\n * - Invalidates parent post cache if this is a reply\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Post vs Comment:**\n * - Post: parentAuthor = \"\", parentPermlink = category/tag\n * - Comment: parentAuthor = parent author, parentPermlink = parent permlink\n *\n * @example\n * ```typescript\n * const commentMutation = useComment(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a post\n * commentMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post-20260209',\n * parentAuthor: '',\n * parentPermlink: 'technology',\n * title: 'My Awesome Post',\n * body: 'This is the post content...',\n * jsonMetadata: {\n * tags: ['technology', 'hive'],\n * app: 'ecency/3.0.0'\n * },\n * options: {\n * beneficiaries: [\n * { account: 'ecency', weight: 500 }\n * ]\n * }\n * });\n *\n * // Create a comment\n * commentMutation.mutate({\n * author: 'bob',\n * permlink: 're-alice-my-awesome-post-20260209',\n * parentAuthor: 'alice',\n * parentPermlink: 'my-awesome-post-20260209',\n * title: '',\n * body: 'Great post!',\n * jsonMetadata: { app: 'ecency/3.0.0' }\n * });\n * ```\n */\nexport function useComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"comment\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (result: any, variables) => {\n // Determine if this is a post or comment\n const isPost = !variables.parentAuthor;\n const activityType = isPost ? 100 : 110;\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(activityType, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation (always runs regardless of recordActivity outcome)\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (!isPost) {\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * Adds an optimistic entry to all discussions caches for the given root post.\n * Uses predicate matching to find all sort order variants.\n */\nexport function addOptimisticDiscussionEntry(\n entry: Entry,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n queryClient.setQueryData(queryKey, [entry, ...data]);\n }\n }\n}\n\n/**\n * Removes an entry from all discussions caches for the given root post.\n * Returns the previous state for rollback.\n */\nexport function removeOptimisticDiscussionEntry(\n author: string,\n permlink: string,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n): Map {\n const queryClient = qc ?? getQueryClient();\n const snapshots = new Map();\n\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n snapshots.set(queryKey, data);\n queryClient.setQueryData(\n queryKey,\n data.filter(\n (e) => e.author !== author || e.permlink !== permlink\n )\n );\n }\n }\n\n return snapshots;\n}\n\n/**\n * Restores discussion cache snapshots (for rollback on error).\n */\nexport function restoreDiscussionSnapshots(\n snapshots: Map,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n for (const [queryKey, data] of snapshots) {\n queryClient.setQueryData(queryKey, data);\n }\n}\n\n/**\n * Updates a specific entry in the SDK entry cache.\n * Returns the previous entry for rollback.\n */\nexport function updateEntryInCache(\n author: string,\n permlink: string,\n updates: Partial,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n const previous = queryClient.getQueryData(QueryKeys.posts.entry(path));\n\n if (previous) {\n queryClient.setQueryData(QueryKeys.posts.entry(path), {\n ...previous,\n ...updates,\n });\n }\n\n return previous;\n}\n\n/**\n * Restores an entry in cache (for rollback on error).\n */\nexport function restoreEntryInCache(\n author: string,\n permlink: string,\n entry: Entry,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n queryClient.setQueryData(QueryKeys.posts.entry(path), entry);\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDeleteCommentOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport {\n removeOptimisticDiscussionEntry,\n restoreDiscussionSnapshots,\n} from \"../cache/discussions-cache-utils\";\nimport type { Entry } from \"../types\";\n\n/**\n * Payload for deleting a comment or post.\n */\nexport interface DeleteCommentPayload {\n /** Author of the comment/post to delete */\n author: string;\n /** Permlink of the comment/post to delete */\n permlink: string;\n /** Optional: Parent author (for cache invalidation of discussions) */\n parentAuthor?: string;\n /** Optional: Parent permlink (for cache invalidation of discussions) */\n parentPermlink?: string;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n}\n\n/**\n * React Query mutation hook for deleting posts and comments.\n *\n * This mutation broadcasts a delete_comment operation to the Hive blockchain.\n * Includes optimistic removal from discussions cache with rollback on error.\n *\n * @param username - The username deleting the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n */\nexport function useDeleteComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"deleteComment\"],\n username,\n ({ author, permlink }) => [\n buildDeleteCommentOp(author, permlink)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (variables.parentAuthor && variables.parentPermlink) {\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n {\n broadcastMode,\n // Optimistic removal: remove from discussions cache before broadcast\n onMutate: async (variables) => {\n const rootAuthor = variables.rootAuthor || variables.parentAuthor;\n const rootPermlink = variables.rootPermlink || variables.parentPermlink;\n\n if (rootAuthor && rootPermlink) {\n const snapshots = removeOptimisticDiscussionEntry(\n variables.author,\n variables.permlink,\n rootAuthor,\n rootPermlink\n );\n return { snapshots };\n }\n return {};\n },\n // Rollback on error: restore discussions cache\n onError: (_error, _variables, context) => {\n const { snapshots } = (context as { snapshots?: Map }) ?? {};\n if (snapshots) {\n restoreDiscussionSnapshots(snapshots);\n }\n },\n }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Payload for creating a cross-post.\n */\nexport interface CrossPostPayload {\n /** Author of the cross-post (current user) */\n author: string;\n /** Permlink of the cross-post (usually: original-permlink-community-id) */\n permlink: string;\n /** Community ID to cross-post to (used as parent_permlink) */\n parentPermlink: string;\n /** Title of the cross-post (same as original) */\n title: string;\n /** Body of the cross-post (includes reference to original) */\n body: string;\n /** JSON metadata (must include original_author, original_permlink, tags, app) */\n jsonMetadata: Record;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"0.000 HBD\" for declined payout) */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n };\n}\n\n/**\n * React Query mutation hook for creating cross-posts.\n *\n * A cross-post is a special type of post that references an original post\n * and publishes it to a different community.\n *\n * @param username - The username creating the cross-post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates feed/blog caches to show the new cross-post\n *\n * **Operations:**\n * - Always includes a comment operation (with empty parent_author for top-level post)\n * - Optionally includes comment_options operation for rewards/beneficiaries\n *\n * **Metadata Requirements:**\n * The jsonMetadata must include:\n * - `original_author`: Author of the original post\n * - `original_permlink`: Permlink of the original post\n * - `tags`: Tags for the cross-post (typically [\"cross-post\"])\n * - `app`: Application identifier (e.g., \"ecency/3.0.0-vision\")\n *\n * @example\n * ```typescript\n * const crossPostMutation = useCrossPost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a cross-post\n * crossPostMutation.mutate({\n * author: 'alice',\n * permlink: 'great-post-hive-123456',\n * parentPermlink: 'hive-123456', // community ID\n * title: 'Great Post',\n * body: 'This is a cross post of [@bob/great-post](/technology/@bob/great-post) by @alice.

Check this out!',\n * jsonMetadata: {\n * app: 'ecency/3.0.0-vision',\n * tags: ['cross-post'],\n * original_author: 'bob',\n * original_permlink: 'great-post'\n * },\n * options: {\n * maxAcceptedPayout: '0.000 HBD',\n * allowCurationRewards: false\n * }\n * });\n * ```\n */\nexport function useCrossPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"cross-post\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (empty parent_author for top-level post)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n \"\", // empty parent_author for top-level post\n payload.parentPermlink, // community ID\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n } = payload.options;\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n [] // No beneficiaries for cross-posts\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n // Invalidate target community feed so cross-post appears\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.parentPermlink\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\nimport type { Beneficiary } from \"./use-comment\";\n\n/**\n * Payload for updating a reply/comment.\n */\nexport interface UpdateReplyPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post being updated */\n permlink: string;\n /** Parent author */\n parentAuthor: string;\n /** Parent permlink */\n parentPermlink: string;\n /** Title (empty for comments) */\n title: string;\n /** Updated content body */\n body: string;\n /** Updated JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for updating existing replies/comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to update an existing reply/comment on the Hive blockchain.\n *\n * @param username - The username updating the comment (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates parent post cache to reflect the updated comment\n * - Invalidates discussions cache (all sort orders)\n * - Invalidates RC cache (RC decreases after updating)\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Important:**\n * - Updates use the same comment operation as creating new comments\n * - The blockchain identifies this as an update based on matching author/permlink\n * - Only the author can update their own content\n * - Content can only be updated before payout (within 7 days)\n *\n * @example\n * ```typescript\n * const updateReplyMutation = useUpdateReply(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update a reply\n * updateReplyMutation.mutate({\n * author: 'alice',\n * permlink: 're-bob-my-post-20260209',\n * parentAuthor: 'bob',\n * parentPermlink: 'my-post-20260209',\n * title: '',\n * body: 'Updated comment content!',\n * jsonMetadata: {\n * tags: ['comment'],\n * app: 'ecency/3.0.0-vision'\n * },\n * rootAuthor: 'bob',\n * rootPermlink: 'my-post-20260209'\n * });\n * ```\n */\nexport function useUpdateReply(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"update-reply\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (same operation for create and update)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = _result?.id ?? _result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(110, txId, _result?.block_num).catch((error) => {\n console.debug(\"[SDK][Posts][useUpdateReply] recordActivity failed\", {\n activityType: 110,\n blockNum: _result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPromoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for promoting a post using Ecency Points.\n */\nexport interface PromotePayload {\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Promotion duration in days */\n duration: number;\n}\n\n/**\n * React Query mutation hook for promoting posts.\n *\n * This mutation broadcasts a custom_json operation to promote a post\n * using Ecency Points. The post will appear in promoted feeds for the\n * specified duration.\n *\n * @param username - The username promoting the post (required for broadcast, deducts points from this user)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates promoted posts cache to show newly promoted content\n * - Invalidates user points balance\n * - Invalidates post cache to update promotion status\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_promote\"\n * - JSON: {\"user\": \"username\", \"author\": \"postauthor\", \"permlink\": \"postpermlink\", \"duration\": 7}\n * - Authority: Active key (required for point spending)\n *\n * **Cost:**\n * - Costs Ecency Points based on duration\n * - User must have sufficient points balance\n *\n * @example\n * ```typescript\n * const promoteMutation = usePromote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Promote a post for 7 days\n * promoteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-great-post',\n * duration: 7\n * });\n * ```\n */\nexport function usePromote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"ecency\", \"promote\"],\n username,\n ({ author, permlink, duration }) => [\n buildPromoteOp(username!, author, permlink, duration)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate promoted posts feed\n [...QueryKeys.posts._promotedPrefix],\n // Invalidate user points balance\n [...QueryKeys.points._prefix(username!)],\n // Invalidate specific post cache to update promotion status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport type ValidatePostCreatingOptions = {\n delays?: number[];\n};\n\nconst DEFAULT_VALIDATE_POST_DELAYS = [3000, 3000, 3000];\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function getContent(author: string, permlink: string): Promise {\n return callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise;\n}\n\nexport async function validatePostCreating(\n author: string,\n permlink: string,\n attempts = 0,\n options?: ValidatePostCreatingOptions\n) {\n const delays = options?.delays ?? DEFAULT_VALIDATE_POST_DELAYS;\n\n let response: Entry | undefined;\n try {\n response = await getContent(author, permlink);\n } catch (e) {\n response = undefined;\n }\n\n if (response || attempts >= delays.length) {\n return;\n }\n\n const waitMs = delays[attempts];\n if (waitMs > 0) {\n await delay(waitMs);\n }\n\n return validatePostCreating(author, permlink, attempts + 1, options);\n}\n","export * from \"./use-record-activity\";\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ntype ActivityType =\n // Editor related\n | \"post-created\"\n | \"post-updated\"\n | \"post-scheduled\"\n | \"draft-created\"\n | \"video-published\"\n\n // Legacy editor related\n | \"legacy-post-created\"\n | \"legacy-post-updated\"\n | \"legacy-post-scheduled\"\n | \"legacy-draft-created\"\n | \"legacy-video-published\"\n\n // Perks related\n | \"perks-points-by-qr\"\n | \"perks-account-boost\"\n | \"perks-promote\"\n | \"perks-boost-plus\"\n | \"points-claimed\"\n | \"spin-rolled\"\n\n // Signup related\n | \"signed-up-with-wallets\"\n | \"signed-up-with-email\";\n\nexport interface RecordActivityOptions {\n url?: string;\n domain?: string;\n}\n\n/**\n * Get current location info safely (works in browser and Node.js)\n * Returns empty strings in non-browser environments\n */\nfunction getLocationInfo(): { url: string; domain: string } {\n if (typeof window !== \"undefined\" && window.location) {\n return {\n url: window.location.href,\n domain: window.location.host,\n };\n }\n return { url: \"\", domain: \"\" };\n}\n\nexport function useRecordActivity(\n username: string | undefined,\n activityType: ActivityType,\n options?: RecordActivityOptions\n) {\n return useMutation({\n mutationKey: [\"analytics\", activityType],\n mutationFn: async () => {\n if (!activityType) {\n throw new Error(\"[SDK][Analytics] – no activity type provided\");\n }\n const fetchApi = getBoundFetch();\n\n // Use provided values or auto-detect from browser environment\n // Falls back to empty strings in non-browser environments (Node.js, React Native, etc.)\n const locationInfo = getLocationInfo();\n const url = options?.url ?? locationInfo.url;\n const domain = options?.domain ?? locationInfo.domain;\n\n try {\n await fetchApi(CONFIG.plausibleHost + \"/api/event\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: activityType,\n url,\n domain,\n props: {\n username,\n },\n }),\n });\n } catch {\n // Analytics is fire-and-forget - network failures, ad blockers,\n // and CORS issues should not bubble up as user-facing errors\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { LeaderBoardDuration, LeaderBoardItem } from \"../types\";\n\nexport function getDiscoverLeaderboardQueryOptions(duration: LeaderBoardDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-leaderboard\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/leaderboard/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch leaderboard: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { CurationDuration, CurationItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getDiscoverCurationQueryOptions(duration: CurationDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-curation\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/curation/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch curation data: ${response.status}`);\n }\n\n const data = (await response.json()) as CurationItem[];\n\n // Fetch account data for efficiency calculation\n const accounts = data.map((item) => item.account);\n const accountsResponse = await callRPC(\"condenser_api.get_accounts\", [accounts]);\n\n // Calculate efficiency for each curator\n for (let index = 0; index < accountsResponse.length; index++) {\n const element = accountsResponse[index];\n const curator = data[index];\n\n // Convert Asset to string if needed\n const vestingShares = typeof element.vesting_shares === 'string'\n ? element.vesting_shares\n : element.vesting_shares.toString();\n const receivedVestingShares = typeof element.received_vesting_shares === 'string'\n ? element.received_vesting_shares\n : element.received_vesting_shares.toString();\n const delegatedVestingShares = typeof element.delegated_vesting_shares === 'string'\n ? element.delegated_vesting_shares\n : element.delegated_vesting_shares.toString();\n const vestingWithdrawRate = typeof element.vesting_withdraw_rate === 'string'\n ? element.vesting_withdraw_rate\n : element.vesting_withdraw_rate.toString();\n\n const effectiveVest: number =\n parseFloat(vestingShares) +\n parseFloat(receivedVestingShares) -\n parseFloat(delegatedVestingShares) -\n parseFloat(vestingWithdrawRate);\n // `hp` is the reward in Hive Power; the denominator stays in VESTS, which\n // is what the ranking has always compared. Every curator is scaled the\n // same way, so the ordering is unaffected by the unit mismatch.\n curator.efficiency = curator.hp / effectiveVest;\n }\n\n // Sort by efficiency descending\n data.sort((a: CurationItem, b: CurationItem) => b.efficiency - a.efficiency);\n\n return data;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PageStatsResponse } from \"../types\";\n\n/**\n * Get page statistics from the private analytics API\n *\n * @param url - URL to get stats for\n * @param dimensions - Dimensions to query (default: [])\n * @param metrics - Metrics to query (default: [\"visitors\", \"pageviews\", \"visit_duration\"])\n * @param dateRange - Date range for the query (e.g. \"day\", \"7d\", \"30d\", \"all\")\n */\nexport function getPageStatsQueryOptions(\n url: string,\n dimensions: string[] = [],\n metrics: string[] = [\"visitors\", \"pageviews\", \"visit_duration\"],\n dateRange?: string\n) {\n // Sort arrays to ensure stable query keys regardless of input order\n const sortedDimensions = [...dimensions].sort();\n const sortedMetrics = [...metrics].sort();\n\n return queryOptions({\n queryKey: [\"analytics\", \"page-stats\", url, sortedDimensions, sortedMetrics, dateRange],\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/api/stats\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n date_range: dateRange,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch page stats: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!url,\n // Analytics data should always be fresh - users expect current stats when changing range\n staleTime: 0,\n });\n}\n","/**\n * 3Speak takes an 11% beneficiary share on posts that embed one of its videos.\n *\n * This lives in the SDK because the rule is a payout contract that both the web app and the\n * mobile app have to apply identically. It was previously duplicated in each, which meant a\n * change to the weight, or to what counts as an embed, could land on one platform and not the\n * other and silently misroute revenue.\n */\n\n/** A beneficiary route as it appears in `comment_options`. */\nexport interface ThreeSpeakBeneficiaryRoute {\n account: string;\n weight: number;\n src?: string;\n}\n\nexport const THREESPEAK_BENEFICIARY_ACCOUNT = \"threespeakfund\";\n\n/** Beneficiary weight in basis points: 1100 = 11%. */\nexport const THREESPEAK_BENEFICIARY_WEIGHT = 1100;\n\n/**\n * Whether the body embeds a 3Speak video.\n *\n * Matches an actual embed url (e.g. `https://play.3speak.tv/embed?v=user/id`), not a plain\n * text mention of \"3speak.tv/embed\", which would otherwise attach an 11% route to a post that\n * merely talks about 3Speak.\n *\n * `3speak.tv` must be the host, either bare or under dot-delimited subdomains. The previous\n * `[a-z.]*` prefix also matched a lookalike domain such as `fake3speak.tv`, which would have\n * routed 11% of a user's rewards to threespeakfund for a video 3Speak never hosted. Matching\n * is case-insensitive because hostnames are, and a missed match means the route is silently\n * not attached rather than anything failing loudly.\n *\n * Note this requires an `/embed` path segment. The embed url is not built locally, it comes\n * back from 3Speak on upload, so if that shape ever changes this predicate stops recognising\n * it and the route is silently not attached.\n */\nexport function hasThreeSpeakEmbed(body: string): boolean {\n return /https?:\\/\\/([a-z0-9-]+\\.)*3speak\\.tv\\/embed[?/]/i.test(body);\n}\n\n/**\n * Ensures the 3Speak beneficiary is present, at the correct weight, when the body embeds a\n * 3Speak video. Other beneficiaries are preserved and the input is never mutated. Returns the\n * original array reference untouched when there is nothing to change, so callers can use it as\n * a cheap equality check.\n */\nexport function enforceThreeSpeakBeneficiary(\n beneficiaries: T[],\n body: string\n): (T | ThreeSpeakBeneficiaryRoute)[] {\n if (!hasThreeSpeakEmbed(body)) {\n return beneficiaries;\n }\n\n const existing = beneficiaries.find((b) => b.account === THREESPEAK_BENEFICIARY_ACCOUNT);\n\n if (existing && existing.weight === THREESPEAK_BENEFICIARY_WEIGHT) {\n return beneficiaries;\n }\n\n if (existing) {\n return beneficiaries.map((b) =>\n b.account === THREESPEAK_BENEFICIARY_ACCOUNT\n ? { ...b, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n : b\n );\n }\n\n return [\n ...beneficiaries,\n { account: THREESPEAK_BENEFICIARY_ACCOUNT, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n ];\n}\n\n/** Whether a beneficiary entry is the 3Speak route, which the UI locks from editing. */\nexport function isThreeSpeakBeneficiary(account: string): boolean {\n return account === THREESPEAK_BENEFICIARY_ACCOUNT;\n}\n","export * from \"./get-account-token-query-options\";\nexport * from \"./get-account-videos-query-options\";\n","export * from \"./get-decode-memo-query-options\";\n","import { queryOptions } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function getDecodeMemoQueryOptions(\n username: string,\n memo: string,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"hivesigner\", \"decode-memo\", username],\n queryFn: async () => {\n if (accessToken) {\n const hsClient = new hs.Client({\n accessToken,\n });\n return hsClient.decode(memo);\n }\n },\n });\n}\n","import * as queries from \"./queries\";\n\nconst HiveSignerIntegration = {\n queries,\n};\n\nexport { HiveSignerIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveSignerIntegration } from \"../../hivesigner\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\n\nexport function getAccountTokenQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"authenticate\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/login?username=${username}&hivesigner=true`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n const memoQueryOptions =\n HiveSignerIntegration.queries.getDecodeMemoQueryOptions(\n username,\n (await response.json()).memo,\n accessToken\n );\n await getQueryClient().prefetchQuery(memoQueryOptions);\n const { memoDecoded } = getQueryClient().getQueryData(\n memoQueryOptions.queryKey\n );\n\n return memoDecoded.replace(\"#\", \"\");\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ThreeSpeakVideo } from \"../types\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { getAccountTokenQueryOptions } from \"./get-account-token-query-options\";\n\nexport function getAccountVideosQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"videos\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const tokenQueryOptions = getAccountTokenQueryOptions(\n username,\n accessToken\n );\n\n await getQueryClient().prefetchQuery(tokenQueryOptions);\n const token = getQueryClient().getQueryData(tokenQueryOptions.queryKey);\n if (!token) {\n throw new Error(\"[SDK][Integrations][3Speak] – missing account token\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/api/my-videos`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n }\n );\n return (await response.json()) as ThreeSpeakVideo[];\n },\n });\n}\n","export * from \"./types\";\nexport * from \"./functions\";\nimport * as queries from \"./queries\";\n\nconst ThreeSpeakIntegration = {\n queries,\n};\n\nexport { ThreeSpeakIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/core\";\n\nexport function getHivePoshLinksQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"integrations\", \"hiveposh\", \"links\", username],\n retry: false, // Don't retry on user not found errors\n queryFn: async () => {\n try {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://hiveposh.com/api/v0/linked-accounts/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n // Handle 400 error when user is not registered on HivePosh\n if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n // Silently return null for \"User Not Connected\" errors\n if (errorData?.message === \"User Not Connected\") {\n return null;\n }\n }\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n\n return {\n twitter: {\n username: data.twitter_username,\n profile: data.twitter_profile,\n },\n reddit: {\n username: data.reddit_username,\n profile: data.reddit_profile,\n },\n } satisfies Record<\n \"twitter\" | \"reddit\",\n { username: string; profile: string }\n >;\n } catch (err) {\n // Silently handle all HivePosh API errors\n return null;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\n\nexport interface StatsResponse {\n results: [\n {\n metrics: number[];\n dimensions: string[];\n },\n ];\n query: {\n site_id: string;\n metrics: string[];\n date_range: string[];\n filters: string[];\n };\n}\ninterface UseStatsQueryOptions {\n url: string;\n dimensions?: string[];\n metrics?: string[];\n /**\n * Which dimension the `url` is matched against. `event:page` (default) matches\n * any visit that viewed the page; `visit:entry_page` matches only visits that\n * landed on it. The API route validates this against an allow-list.\n */\n filterBy?: \"event:page\" | \"visit:entry_page\";\n /**\n * Plausible `date_range`. Pass a tuple `[from, to]` (ISO `YYYY-MM-DD`) to scope\n * the query — e.g. a post's creation date through today. Scoping is essential:\n * ClickHouse orders events by `(site_id, toDate(timestamp), …)` and partitions\n * by month, so a bounded range prunes to a few granules instead of scanning the\n * whole history. Omitting it falls back to the route default (`\"all\"`), which on\n * a high-traffic site is a multi-second full scan. Plausible also accepts the\n * relative keywords `\"day\"`, `\"7d\"`, `\"30d\"`, `\"all\"`.\n */\n dateRange?: string | [string, string];\n enabled?: boolean;\n}\n\nexport function getStatsQueryOptions({\n url,\n dimensions = [],\n metrics = [\"visitors\", \"pageviews\", \"visit_duration\"],\n filterBy = \"event:page\",\n dateRange,\n enabled = true,\n}: UseStatsQueryOptions) {\n return queryOptions({\n queryKey: [\"integrations\", \"plausible\", url, dimensions, metrics, filterBy, dateRange],\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(`${CONFIG.privateApiHost}/api/stats`, {\n method: \"POST\",\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n filterBy,\n // Only forward a range when set, so the route keeps owning the default.\n ...(dateRange ? { date_range: dateRange } : {}),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // The proxy route returns 5xx (504/502) with an empty body on a Plausible\n // timeout/transport error, and Plausible itself can return a 4xx error JSON.\n // Without this guard those parse into an object with no `results`, and the UI\n // silently renders 0 — indistinguishable from a real zero. Throw instead so\n // React Query surfaces the error and retries.\n if (!response.ok) {\n throw new Error(`Failed to fetch Plausible stats: ${response.status}`);\n }\n\n return (await response.json()) as StatsResponse;\n },\n enabled: !!url && enabled,\n // Stats queries are now date-scoped and cheap; a single retry rides out a\n // transient slow scan without re-introducing the all-time pile-up.\n retry: 1,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRcStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"resource-credits\", \"stats\"],\n queryFn: async () => {\n const response = await callRPC(\"rc_api.get_rc_stats\", {});\n return response.rc_stats;\n },\n });\n}\n","import { callRPC } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getAccountRcQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"resource-credits\", \"account\", username],\n queryFn: async (): Promise => {\n const result = await callRPC(\"rc_api.find_rc_accounts\", {\n accounts: [username],\n });\n return result.rc_accounts;\n },\n enabled: !!username,\n });\n}\n","import { calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport type { RcStats } from \"../types/stats\";\n\n/**\n * Operations the RC pre-check can estimate. Mirrors the keys exposed by\n * `rc_api.get_rc_stats` (see {@link RcStats}[\"ops\"]).\n */\nexport type RcPrecheckOperation = keyof RcStats[\"ops\"];\n\nexport interface RcPrecheckInput {\n /** From `getAccountRcQueryOptions(username)` -> rcAccounts[0]. */\n rcAccount: RCAccount | null | undefined;\n /** From `getRcStatsQueryOptions()`. */\n rcStats: RcStats | null | undefined;\n /** The operation the user is about to broadcast. */\n operation: RcPrecheckOperation;\n /**\n * Safety multiplier applied to the average operation cost when deciding\n * whether the broadcast will \"likely fail\". Actual on-chain cost varies with\n * network load, so we keep headroom. Defaults to 1.2.\n */\n buffer?: number;\n}\n\nexport interface RcPrecheckResult {\n /** Both inputs were available, so the estimate is meaningful. */\n ready: boolean;\n /** Current RC mana of the account. */\n currentMana: number;\n /** Maximum RC mana of the account. */\n maxMana: number;\n /** Average RC cost of the operation. */\n avgCost: number;\n /** Average cost padded by `buffer`. */\n estimatedCost: number;\n /** `currentMana` is below the padded estimate -> broadcast likely fails. */\n willLikelyFail: boolean;\n /** RC shortfall vs the padded estimate (0 when not failing). */\n deficit: number;\n /** Roughly how many such operations the account can still afford. */\n remaining: number;\n}\n\nconst EMPTY: RcPrecheckResult = {\n ready: false,\n currentMana: 0,\n maxMana: 0,\n avgCost: 0,\n estimatedCost: 0,\n willLikelyFail: false,\n deficit: 0,\n remaining: 0,\n};\n\n/**\n * Pure, client-side estimate of whether an account has enough Resource Credits\n * to broadcast an operation, used to warn the user BEFORE they submit instead\n * of failing afterwards with the chain's \"Please wait to transact\" error.\n *\n * It is intentionally approximate: it uses the network-wide average cost from\n * `rc_api.get_rc_stats`, padded by a buffer. Treat `willLikelyFail` as a hint,\n * never a hard gate - the publish/comment/vote action must stay non-blocking.\n */\nexport function estimateRcPrecheck({\n rcAccount,\n rcStats,\n operation,\n buffer = 1.2,\n}: RcPrecheckInput): RcPrecheckResult {\n if (!rcAccount || !rcStats?.ops) {\n return EMPTY;\n }\n\n const { current_mana: currentMana, max_mana: maxMana } = calculateRCMana(rcAccount);\n const avgCost = Number(rcStats.ops[operation]?.avg_cost ?? 0);\n\n if (!(avgCost > 0)) {\n return { ...EMPTY, ready: true, currentMana, maxMana };\n }\n\n const safeBuffer = Number.isFinite(buffer) && buffer > 0 ? buffer : 1.2;\n const estimatedCost = avgCost * safeBuffer;\n const willLikelyFail = currentMana < estimatedCost;\n\n return {\n ready: true,\n currentMana,\n maxMana,\n avgCost,\n estimatedCost,\n willLikelyFail,\n deficit: willLikelyFail ? Math.ceil(estimatedCost - currentMana) : 0,\n remaining: Math.floor(currentMana / avgCost),\n };\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetGameStatus } from \"../types\";\n\nexport function getGameStatusCheckQueryOptions(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\"\n) {\n return queryOptions({\n queryKey: [\"games\", \"status-check\", gameType, username],\n enabled: !!username && !!code,\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/get-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()) as GetGameStatus;\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { GameClaim } from \"../types\";\nimport { useRecordActivity } from \"@/modules/analytics/mutations\";\n\nexport function useGameClaim(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\",\n key: string\n) {\n const { mutateAsync: recordActivity } = useRecordActivity(\n username,\n \"spin-rolled\"\n );\n\n return useMutation({\n mutationKey: [\"games\", \"post\", gameType, username],\n mutationFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/post-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n key,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (await response.json()) as GameClaim;\n },\n onSuccess() {\n recordActivity();\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { QuestsResponse } from \"../types\";\n\n/**\n * Read-only daily/weekly/monthly quest progress for a user. Aggregates the existing\n * points ledger (no auth required — same sensitivity as `/private-api/points`).\n */\nexport function getQuestsQueryOptions(username: string | undefined) {\n const name = username?.replace(\"@\", \"\");\n return queryOptions({\n queryKey: QueryKeys.quests.status(name),\n enabled: !!name,\n queryFn: async () => {\n if (!name) {\n throw new Error(\"[SDK][Quests] – username wasn't provided\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/quests\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ username: name }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch quests: ${response.status}`);\n }\n\n return (await response.json()) as QuestsResponse;\n },\n staleTime: 30000,\n refetchOnMount: true,\n });\n}\n","/**\n * Shared quest catalog — the single source of truth for which quests exist, their\n * encouraging goals, copy keys and icon hints. Lives in the SDK so the web and mobile\n * clients render an identical, harmonized set. The backend (`/private-api/quests`)\n * returns raw progress + the reward `cap`; this catalog layers the presentation.\n *\n * `goal` is an *encouraging, reachable* daily target and is intentionally independent of\n * the backend reward `cap` (the point at which the existing reward decays to ~0). It is\n * tunable here without any backend change.\n */\n\nexport type QuestTier = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface QuestCatalogEntry {\n id: string;\n tier: QuestTier;\n /** encouraging, reachable target for the period (tunable, not the reward cap) */\n goal: number;\n /** i18n key suffix; clients resolve e.g. `quests..title` / `.desc` */\n i18nKey: string;\n /** semantic icon hint; each client maps it to its own icon set */\n icon: string;\n}\n\nexport const QUEST_CATALOG: QuestCatalogEntry[] = [\n // Daily\n { id: \"checkin\", tier: \"daily\", goal: 1, i18nKey: \"checkin\", icon: \"check-circle\" },\n { id: \"post\", tier: \"daily\", goal: 1, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"daily\", goal: 3, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"daily\", goal: 10, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"daily\", goal: 1, i18nKey: \"reblog\", icon: \"repeat\" },\n { id: \"spin\", tier: \"daily\", goal: 1, i18nKey: \"spin\", icon: \"gift\" },\n // Weekly\n { id: \"post\", tier: \"weekly\", goal: 5, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"weekly\", goal: 15, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"weekly\", goal: 50, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"weekly\", goal: 5, i18nKey: \"reblog\", icon: \"repeat\" },\n // Monthly\n { id: \"post\", tier: \"monthly\", goal: 20, i18nKey: \"post\", icon: \"pencil\" },\n];\n\nexport function getQuestCatalogEntry(tier: QuestTier, id: string) {\n return QUEST_CATALOG.find((q) => q.tier === tier && q.id === id);\n}\n\n// Streak Freeze display config. MIRRORS the ePoints constants\n// (STREAK_FREEZE_PRICE / STREAK_FREEZE_MAX_OWNED) — the server is the source of truth\n// and validates every purchase; these drive the label + button state only, so a drift\n// here never over-charges (the buy is priced server-side).\nexport const STREAK_FREEZE_PRICE = 300;\nexport const STREAK_FREEZE_MAX_OWNED = 2;\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { StreakFreezeBuyResult } from \"../types\";\n\n/** A fresh idempotency key per purchase; guarded for runtimes without crypto.randomUUID. */\nfunction genIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * POST a single streak-freeze purchase. Throws on a non-2xx with the server's\n * `.status` + parsed `.data` attached so the caller can branch on 402 (insufficient)\n * / 409 (max owned). Exported for unit testing; the hook below wraps it.\n */\nexport async function buyStreakFreezeRequest(\n code: string\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/streak-freeze/buy\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code, idempotency_key: genIdempotencyKey() }),\n }\n );\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to buy streak freeze: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as StreakFreezeBuyResult;\n}\n\n/**\n * Buy one streak freeze (a Points-only sink). The server debits Points, caps owned\n * inventory, and is idempotent per key. On success the quests + points caches are\n * invalidated so the owned count and balance refresh. A 402 (insufficient) / 409 (max\n * owned) is rethrown with `.status` + `.data` so the caller can route to a Points top-up.\n */\nexport function useBuyStreakFreeze(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"streak-freeze\", \"buy\", name],\n mutationFn: async () => {\n if (!name || !code) {\n throw new Error(\"[SDK][StreakFreeze] – missing auth\");\n }\n return buyStreakFreezeRequest(code);\n },\n onSuccess() {\n // Balance only changes on a successful debit.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.points._prefix(name) });\n }\n },\n onSettled() {\n // Refresh freezes_owned on success AND error: a 409 (max owned) means the\n // client's count is stale, and without this the \"Protect streak\" button would\n // never hide and the user could keep re-triggering 409s.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.quests.status(name) });\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for subscribing to a community.\n */\nexport interface SubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for subscribing to a community.\n *\n * This mutation broadcasts a subscribe operation to the Hive blockchain,\n * adding the community to the user's subscription list.\n *\n * @param username - The username subscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"subscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const subscribeMutation = useSubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Subscribe to a community\n * subscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useSubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"subscribe\"],\n username,\n ({ community }) => [\n buildSubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnsubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unsubscribing from a community.\n */\nexport interface UnsubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for unsubscribing from a community.\n *\n * This mutation broadcasts an unsubscribe operation to the Hive blockchain,\n * removing the community from the user's subscription list.\n *\n * @param username - The username unsubscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"unsubscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const unsubscribeMutation = useUnsubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unsubscribe from a community\n * unsubscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useUnsubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"unsubscribe\"],\n username,\n ({ community }) => [\n buildUnsubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildMutePostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for muting/unmuting a post in a community.\n */\nexport interface MutePostPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Mute reason/notes (required even for unmute) */\n notes: string;\n /** True to mute, false to unmute */\n mute: boolean;\n}\n\n/**\n * React Query mutation hook for muting/unmuting posts in a community.\n *\n * This mutation broadcasts a custom_json operation to mute (or unmute)\n * a post within a community. Only community moderators/admins can mute posts.\n *\n * @param username - The username performing the mute (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community posts cache to hide muted content\n * - Invalidates post cache to update mute status\n * - Invalidates feed cache to remove muted posts from feeds\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"mutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Action (unmute): [\"unmutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Authority: Posting key\n *\n * **Mute vs Unmute:**\n * - mute: true - Mutes the post (hides from community feed)\n * - mute: false - Unmutes the post (restores to community feed)\n *\n * **Permission:**\n * - Only community moderators and admins can mute/unmute posts\n * - Attempting to mute without permission will fail with an error\n *\n * @example\n * ```typescript\n * const mutePostMutation = useMutePost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Mute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Violates community guidelines',\n * mute: true\n * });\n *\n * // Unmute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Resolved after editing',\n * mute: false\n * });\n * ```\n */\nexport function useMutePost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"mutePost\"],\n username,\n ({ community, author, permlink, notes, mute }) => [\n buildMutePostOp(username!, community, author, permlink, notes, mute)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n // Invalidate specific post cache to update mute status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n // Invalidate community data\n [\"community\", \"single\", variables.community],\n // Invalidate community feed/posts (matches all sort orders, limits, observers)\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.community\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetRoleOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community, CommunityTeam } from \"../types\";\n\n/**\n * Payload for setting a user's role in a community.\n */\nexport interface SetCommunityRolePayload {\n /** Account to set role for */\n account: string;\n /** Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\") */\n role: string;\n}\n\n/**\n * React Query mutation hook for setting a user's role in a community.\n *\n * This mutation broadcasts a setRole operation to the Hive blockchain,\n * updating the role of a community member. Only users with appropriate\n * permissions (community owner/admin) can set roles.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username setting the role (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated team member list\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"setRole\", {\"community\": \"hive-123456\", \"account\": \"user\", \"role\": \"mod\"}]\n * - Authority: Posting key\n *\n * **Role Types:**\n * - \"owner\" - Community owner (full permissions)\n * - \"admin\" - Administrator (can manage settings and team)\n * - \"mod\" - Moderator (can mute posts/users)\n * - \"member\" - Regular member (no special permissions)\n * - \"guest\" - Remove user from team (empty string also works)\n *\n * @example\n * ```typescript\n * const setRoleMutation = useSetCommunityRole('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Set a user as moderator\n * setRoleMutation.mutate({\n * account: 'alice',\n * role: 'mod'\n * });\n *\n * // Remove a user from the team\n * setRoleMutation.mutate({\n * account: 'bob',\n * role: 'guest'\n * });\n * ```\n */\nexport function useSetCommunityRole(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"set-role\", community],\n username,\n ({ account, role }) => [\n buildSetRoleOp(username!, community, account, role)\n ],\n async (_result: any, variables) => {\n // Optimistic team update in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n const team: CommunityTeam = [...(prev.team ?? [])];\n const idx = team.findIndex(([name]) => name === variables.account);\n if (idx >= 0) {\n team[idx] = [team[idx][0], variables.role, team[idx][2] ?? \"\"];\n } else {\n team.push([variables.account, variables.role, \"\"]);\n }\n return { ...prev, team };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries + context for affected user\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)],\n QueryKeys.communities.context(variables.account, community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUpdateCommunityOp, type CommunityProps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community } from \"../types\";\n\n/**\n * Payload for updating community properties.\n * Matches the CommunityProps interface from builders.\n */\nexport type UpdateCommunityPayload = CommunityProps;\n\n/**\n * React Query mutation hook for updating community properties.\n *\n * This mutation broadcasts an updateProps operation to the Hive blockchain,\n * modifying the community's metadata and settings. Only community admins\n * can update community properties.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username updating the community (required for broadcast, must be admin)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated properties\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"updateProps\", {\"community\": \"hive-123456\", \"props\": {...}}]\n * - Authority: Posting key\n *\n * **Properties:**\n * - title - Community display title\n * - about - Short description/tagline\n * - lang - Primary language code (e.g., \"en\")\n * - description - Full community description (markdown supported)\n * - flag_text - Custom text shown when flagging posts\n * - is_nsfw - Whether community contains NSFW content\n *\n * @example\n * ```typescript\n * const updateMutation = useUpdateCommunity('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update community properties\n * updateMutation.mutate({\n * title: 'My Awesome Community',\n * about: 'A place for awesome people',\n * lang: 'en',\n * description: '# Welcome\\nThis is our community description',\n * flag_text: 'Please explain why this content violates our rules',\n * is_nsfw: false\n * });\n * ```\n */\nexport function useUpdateCommunity(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"update\", community],\n username,\n (props) => [\n buildUpdateCommunityOp(username!, community, props)\n ],\n async (_result: any, variables) => {\n // Optimistic property merge in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n return { ...prev, ...(variables as unknown as Partial) };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)]\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommunityRegistrationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for community rewards registration.\n */\nexport interface CommunityRewardsRegisterPayload {\n /** Community account name (usually the community creator's account) */\n name: string;\n}\n\n/**\n * React Query mutation hook for registering to receive community rewards.\n *\n * This mutation broadcasts a custom_json operation to register a community\n * account to receive Ecency Points rewards for community activity.\n *\n * @param username - The username registering for community rewards (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to update registration status\n * - Invalidates points balance to reflect potential initial rewards\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_registration\"\n * - JSON: {\"name\": \"communityname\"}\n * - Authority: Active key (required for registration)\n *\n * **Purpose:**\n * - Enables communities to receive Ecency Points for activity\n * - One-time registration per community\n * - Can only be done by the community owner/creator\n *\n * @example\n * ```typescript\n * const registerMutation = useRegisterCommunityRewards(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Register community for rewards\n * registerMutation.mutate({\n * name: 'hive-123456'\n * });\n * ```\n */\nexport function useRegisterCommunityRewards(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"registerRewards\"],\n username,\n ({ name }) => [\n buildCommunityRegistrationOp(name)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate community cache to update registration status\n [...QueryKeys.communities.singlePrefix(variables.name)],\n // Invalidate points balance\n [...QueryKeys.points._prefix(username!)],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPinPostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface PinPostPayload {\n community: string;\n account: string;\n permlink: string;\n pin: boolean;\n}\n\nexport function usePinPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"pin-post\"],\n username,\n ({ community, account, permlink, pin }) => [\n buildPinPostOp(username!, community, account, permlink, pin)\n ],\n async (_result, variables) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.account}/${variables.permlink}`),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Communities } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunitiesQueryOptions(\n sort: string,\n query?: string,\n limit = 100,\n observer: string | undefined = undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.list(sort, query ?? \"\", limit),\n enabled,\n queryFn: async () => {\n const response = await callRPC(\"bridge.list_communities\", {\n last: \"\",\n limit,\n sort: sort === \"hot\" ? \"rank\" : sort,\n query: query ? query : null,\n observer,\n });\n return (\n response\n ? sort === \"hot\"\n ? response.sort(() => Math.random() - 0.5)\n : response\n : []\n ) as Communities;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { CommunityRole } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunityContextQueryOptions(\n username: string | undefined,\n communityName: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.context(username!, communityName!),\n enabled: !!username && !!communityName,\n queryFn: async () => {\n const response = await callRPC(\"bridge.get_community_context\", {\n account: username,\n name: communityName,\n });\n\n return {\n role: response?.role ?? \"guest\",\n subscribed: response?.subscribed ?? false,\n } satisfies {\n role: CommunityRole;\n subscribed: boolean;\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Community } from \"../types/community\";\nimport { getCommunity } from \"@/modules/bridge\";\nimport { QueryKeys } from \"@/modules/core\";\n\nexport function getCommunityQueryOptions(\n name: string | undefined,\n observer: string | undefined = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.single(name, observer),\n enabled: enabled && !!name,\n queryFn: async () => getCommunity(name ?? \"\", observer) as Promise,\n });\n}\n","import {\n InfiniteData,\n infiniteQueryOptions,\n queryOptions\n} from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Subscription } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * hivemind caps `bridge.list_subscribers` at 100 rows per call, regardless of a\n * larger requested limit.\n */\nexport const SUBSCRIBERS_PAGE_SIZE = 100;\n\ntype SubscribersPage = Subscription[];\ntype SubscribersCursor = string | null;\n\n/**\n * Fetches one page of subscribers.\n *\n * `last` is omitted on the first page rather than passed as an empty string:\n * hivemind reads `\"\"` as a real cursor positioned before the first account and\n * returns zero rows.\n */\nasync function fetchSubscribersPage(\n communityName: string,\n last: SubscribersCursor\n): Promise {\n const response = await callRPC(\"bridge.list_subscribers\", {\n community: communityName,\n limit: SUBSCRIBERS_PAGE_SIZE,\n ...(last ? { last } : {})\n });\n return (response as Subscription[] | null) ?? [];\n}\n\n/**\n * Get the first page of subscribers for a community.\n *\n * @deprecated Returns at most {@link SUBSCRIBERS_PAGE_SIZE} subscribers, which\n * for most communities is a small fraction of the total while looking like the\n * complete list. Prefer {@link getCommunitySubscribersInfiniteQueryOptions}\n * unless a single page is genuinely all that is wanted.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersQueryOptions(communityName: string) {\n return queryOptions({\n queryKey: QueryKeys.communities.subscribers(communityName),\n queryFn: async () => fetchSubscribersPage(communityName, null),\n staleTime: 60000\n });\n}\n\n/**\n * Get all subscribers for a community, paged with hivemind's `last` cursor.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersInfiniteQueryOptions(\n communityName: string\n) {\n return infiniteQueryOptions<\n SubscribersPage,\n Error,\n InfiniteData,\n string[],\n SubscribersCursor\n >({\n queryKey: QueryKeys.communities.subscribersInfinite(communityName),\n initialPageParam: null as SubscribersCursor,\n queryFn: async ({ pageParam }: { pageParam: SubscribersCursor }) =>\n fetchSubscribersPage(communityName, pageParam),\n // The cursor is the previous page's last account name. A short page is the\n // end of the list.\n getNextPageParam: (lastPage: SubscribersPage): SubscribersCursor =>\n lastPage?.length >= SUBSCRIBERS_PAGE_SIZE\n ? lastPage[lastPage.length - 1]?.[0] ?? null\n : null,\n staleTime: 60000\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountNotification } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype NotifPage = AccountNotification[];\ntype NotifCursor = number | null;\n\n/**\n * Get account notifications for a community (bridge API)\n *\n * @param account - The account/community name\n * @param limit - Number of notifications per page\n */\nexport function getAccountNotificationsInfiniteQueryOptions(\n account: string,\n limit: number\n) {\n return infiniteQueryOptions<\n NotifPage,\n Error,\n InfiniteData,\n (string | number)[],\n NotifCursor\n >({\n queryKey: QueryKeys.communities.accountNotifications(account, limit),\n initialPageParam: null as NotifCursor,\n\n // Errors are deliberately not caught. Returning [] on failure made an RPC\n // outage indistinguishable from an empty log: `isError` never became true,\n // so consumers rendered \"no activity\" for a failed request, and a failed\n // page produced no cursor and silently ended pagination. Let React Query\n // own the error so `isError` and retry behave normally.\n queryFn: async ({ pageParam }: { pageParam: NotifCursor }) => {\n const response = await callRPC(\"bridge.account_notifications\", {\n account,\n limit,\n last_id: pageParam ?? undefined,\n });\n return (response as AccountNotification[] | null) ?? [];\n },\n\n // A short page is the end of the log. Keying on \"empty\" alone would also\n // treat a truncated page as the end.\n getNextPageParam: (lastPage: NotifPage): NotifCursor =>\n lastPage?.length >= limit ? lastPage[lastPage.length - 1].id : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { RewardedCommunity } from \"../types/rewarded-community\";\n\nexport function getRewardedCommunitiesQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.communities.rewarded(),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/rewarded-communities\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch rewarded communities: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","export enum ROLES {\n OWNER = \"owner\",\n ADMIN = \"admin\",\n MOD = \"mod\",\n MEMBER = \"member\",\n GUEST = \"guest\",\n MUTED = \"muted\",\n}\n\nexport const roleMap: Record = {\n [ROLES.OWNER]: [\n ROLES.ADMIN,\n ROLES.MOD,\n ROLES.MEMBER,\n ROLES.GUEST,\n ROLES.MUTED,\n ],\n [ROLES.ADMIN]: [ROLES.MOD, ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n [ROLES.MOD]: [ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n};\n\nexport type CommunityTeam = Array>;\nexport type CommunityRole = (typeof ROLES)[keyof typeof ROLES]; // \"owner\" | \"member\" | ...\nexport type CommunityType = \"Topic\" | \"Journal\" | \"Council\";\n\nexport interface Community {\n about: string;\n admins?: string[];\n avatar_url: string;\n created_at: string;\n description: string;\n flag_text: string;\n id: number;\n is_nsfw: boolean;\n lang: string;\n name: string;\n num_authors: number;\n num_pending: number;\n subscribers: number;\n sum_pending: number;\n settings?: any;\n team: CommunityTeam;\n title: string;\n type_id: number;\n}\n\nexport type Communities = Community[];\n","import { CommunityRole, CommunityType, ROLES } from \"../types\";\n\nexport function getCommunityType(name: string, type_id: number): CommunityType {\n if (name.startsWith(\"hive-3\") || type_id === 3) return \"Council\";\n if (name.startsWith(\"hive-2\") || type_id === 2) return \"Journal\";\n return \"Topic\";\n}\n\nexport function getCommunityPermissions({\n communityType,\n userRole,\n subscribed,\n}: {\n communityType: CommunityType;\n userRole: CommunityRole;\n subscribed: boolean;\n}) {\n const canPost = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n if (communityType === \"Topic\") return true;\n\n // Journal & Council\n return [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD, ROLES.MEMBER].includes(\n userRole\n );\n })();\n\n const canComment = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n switch (communityType) {\n case \"Topic\":\n return true;\n case \"Journal\":\n return userRole !== ROLES.GUEST || subscribed;\n case \"Council\":\n return canPost;\n }\n })();\n\n const isModerator = [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD].includes(userRole);\n\n return {\n canPost,\n canComment,\n isModerator,\n };\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getNotificationsUnreadCountQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.unreadCount(activeUsername),\n queryFn: async () => {\n if (!code) {\n return 0;\n }\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/notifications/unread`,\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n const data = (await response.json()) as { count: number };\n return data.count;\n },\n enabled: !!activeUsername && !!code,\n initialData: 0,\n refetchInterval: 60000,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { NotificationFilter } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ApiNotification } from \"../types\";\n\nexport function getNotificationsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n filter: NotificationFilter | undefined = undefined\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.notifications.list(activeUsername, filter),\n queryFn: async ({ pageParam }) => {\n if (!code) {\n return [];\n }\n const data = {\n code,\n filter,\n since: pageParam,\n user: undefined,\n };\n\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/notifications\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }\n );\n\n if (!response.ok) {\n return [];\n }\n\n try {\n return (await response.json()) as ApiNotification[];\n } catch {\n return [];\n }\n },\n enabled: !!activeUsername && !!code,\n initialData: { pages: [], pageParams: [] },\n initialPageParam: \"\",\n getNextPageParam: (lastPage) => lastPage?.[lastPage.length - 1]?.id ?? \"\",\n refetchOnMount: true,\n });\n}\n","export enum NotificationFilter {\n VOTES = \"rvotes\",\n MENTIONS = \"mentions\",\n FAVORITES = \"nfavorites\",\n BOOKMARKS = \"nbookmarks\",\n FOLLOWS = \"follows\",\n REPLIES = \"replies\",\n REBLOGS = \"reblogs\",\n TRANSFERS = \"transfers\",\n DELEGATIONS = \"delegations\",\n PAYOUTS = \"payouts\",\n SCHEDULED_PUBLISHED = \"scheduled_published\",\n // Filter path is plural while the notification `type` string is singular\n // (`account_update`) - enotify routes on the plural form.\n ACCOUNT_UPDATES = \"account_updates\",\n WEEKLY_EARNINGS = \"weekly_earnings\",\n}\n","// Values are enotify's ACTIVITY_MAIN_TYPE_* ints and are validated server-side at\n// device registration, so they must match enotify constants.py exactly. Note payouts\n// is 19: the original 16 is commented out upstream and must not be reused.\nexport enum NotifyTypes {\n VOTE = 1,\n MENTION = 2,\n FOLLOW = 3,\n COMMENT = 4,\n RE_BLOG = 5,\n TRANSFERS = 6,\n DELEGATIONS = 10,\n FAVORITES = 13,\n BOOKMARKS = 15,\n PAYOUTS = 19,\n ACCOUNT_UPDATE = 20,\n WEEKLY_EARNINGS = 21,\n SCHEDULED_PUBLISHED = 22,\n ALLOW_NOTIFY = \"ALLOW_NOTIFY\",\n}\n\nexport const ALL_NOTIFY_TYPES = [\n NotifyTypes.VOTE,\n NotifyTypes.MENTION,\n NotifyTypes.FOLLOW,\n NotifyTypes.COMMENT,\n NotifyTypes.RE_BLOG,\n NotifyTypes.TRANSFERS,\n NotifyTypes.DELEGATIONS,\n NotifyTypes.FAVORITES,\n NotifyTypes.BOOKMARKS,\n NotifyTypes.PAYOUTS,\n NotifyTypes.ACCOUNT_UPDATE,\n NotifyTypes.WEEKLY_EARNINGS,\n NotifyTypes.SCHEDULED_PUBLISHED,\n] as const;\n\nexport enum NotificationViewType {\n ALL = \"All\",\n UNREAD = \"Unread\",\n READ = \"Read\",\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ApiNotificationSetting } from \"../types\";\nimport { ALL_NOTIFY_TYPES } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getNotificationsSettingsQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n initialMuted?: boolean\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.settings(activeUsername),\n queryFn: async () => {\n let token = activeUsername + \"-web\";\n if (!code) {\n throw new Error(\"Missing access token\");\n }\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/detail-device\",\n {\n body: JSON.stringify({\n code,\n username: activeUsername,\n token,\n }),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch notification settings: ${response.status}`);\n }\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n refetchOnMount: false,\n initialData: () => {\n return {\n status: 0,\n system: \"web\",\n allows_notify: 0,\n notify_types: initialMuted ? [] : ([...ALL_NOTIFY_TYPES] as number[]),\n } as ApiNotificationSetting;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Announcement } from \"../types/announcement\";\n\nexport function getAnnouncementsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.notifications.announcements(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/announcements\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch announcements: ${response.status}`);\n }\n\n const data = await response.json() as Announcement[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Spotlight } from \"../types/spotlight\";\n\n// `_accessToken` is accepted for call-site parity with mobile (which passes one) but is\n// intentionally unused: the spotlights endpoint is anonymous and only filters by date window.\nexport function getSpotlightsQueryOptions(_accessToken?: string) {\n return queryOptions({\n queryKey: QueryKeys.notifications.spotlights(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/spotlights\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch spotlights: ${response.status}`);\n }\n\n const data = (await response.json()) as Spotlight[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { useMutation, QueryKey, InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { markNotifications } from \"@/modules/private-api/requests\";\nimport { ApiNotification } from \"../types\";\n\ntype NotificationPage = ApiNotification[];\ntype InfiniteNotificationData = InfiniteData;\n\nfunction markNotificationRead(item: ApiNotification, id?: string): ApiNotification {\n return {\n ...item,\n read: (!id || id === item.id ? 1 : item.read) as 0 | 1,\n };\n}\n\nfunction isInfiniteData(data: unknown): data is InfiniteNotificationData {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"pages\" in data &&\n \"pageParams\" in data &&\n Array.isArray((data as InfiniteNotificationData).pages)\n );\n}\n\n/**\n * Hook to mark notifications as read with optimistic updates\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful mutation, receives unread count\n * @param onError - Optional callback on error\n *\n * @returns Mutation hook that accepts { id?: string }\n *\n * @example\n * ```typescript\n * const markAsRead = useMarkNotificationsRead(username, code);\n *\n * // Mark specific notification\n * markAsRead.mutate({ id: \"notification-id\" });\n *\n * // Mark all notifications (omit id)\n * markAsRead.mutate({});\n * ```\n */\nexport function useMarkNotificationsRead(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: (unreadCount?: number) => void,\n onError?: (e: Error) => void\n) {\n const queryClient = getQueryClient();\n\n return useMutation({\n mutationKey: [\"notifications\", \"mark-read\", username],\n\n mutationFn: async ({ id }: { id?: string }) => {\n if (!username || !code) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[SDK][Notifications] – missing auth for markNotifications\");\n }\n return;\n }\n return markNotifications(code, id);\n },\n\n // Optimistic update: Immediately mark notifications as read in cache\n onMutate: async ({ id }: { id?: string }) => {\n // Skip optimistic updates when auth is not available\n if (!username || !code) {\n return { previousData: [] };\n }\n\n // Cancel any outgoing refetches to prevent overwriting optimistic update\n await queryClient.cancelQueries({ queryKey: QueryKeys.notifications._prefix });\n\n // Snapshot current state for rollback\n const previousData: Array<[QueryKey, unknown]> = [];\n\n // Update infinite notification list queries (pages structure)\n const infiniteQueries = queryClient.getQueriesData({\n queryKey: QueryKeys.notifications._prefix,\n predicate: (query) => {\n const data = query.state.data;\n return isInfiniteData(data);\n },\n });\n\n infiniteQueries.forEach(([queryKey, data]) => {\n if (data && isInfiniteData(data)) {\n previousData.push([queryKey, data]);\n\n const updatedData: InfiniteNotificationData = {\n ...data,\n pages: data.pages.map((page) =>\n page.map((item) => markNotificationRead(item, id))\n ),\n };\n\n queryClient.setQueryData(queryKey, updatedData);\n }\n });\n\n // Optimistically decrement unread count\n const unreadKey = QueryKeys.notifications.unreadCount(username);\n const currentUnread = queryClient.getQueryData(unreadKey);\n if (typeof currentUnread === \"number\" && currentUnread > 0) {\n previousData.push([unreadKey, currentUnread]);\n\n if (!id) {\n // Mark all: set to 0\n queryClient.setQueryData(unreadKey, 0);\n } else {\n // Mark single: only decrement if the notification is currently unread\n const isUnread = infiniteQueries.some(([, d]) =>\n d?.pages.some((page) =>\n page.some((item) => item.id === id && item.read === 0)\n )\n );\n if (isUnread) {\n queryClient.setQueryData(unreadKey, currentUnread - 1);\n }\n }\n }\n\n // Return context for rollback\n return { previousData };\n },\n\n onSuccess: (response) => {\n // Extract unread count from response if available\n const unreadCount = typeof response === \"object\" && response !== null\n ? (response as { unread?: number }).unread\n : undefined;\n\n // Update unread count cache with server value\n if (typeof unreadCount === \"number\") {\n queryClient.setQueryData(\n QueryKeys.notifications.unreadCount(username),\n unreadCount\n );\n }\n\n onSuccess?.(unreadCount);\n },\n\n // Rollback optimistic update on error\n onError: (error, _variables, context) => {\n // Restore previous state\n if (context?.previousData) {\n context.previousData.forEach(([queryKey, data]) => {\n queryClient.setQueryData(queryKey, data);\n });\n }\n\n onError?.(error as Error);\n },\n\n // Always refetch after mutation settles\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: QueryKeys.notifications._prefix,\n });\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetLastReadOps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface SetLastReadPayload {\n date?: string;\n}\n\nexport function useSetLastRead(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"notifications\", \"set-last-read\"],\n username,\n ({ date }) => buildSetLastReadOps(username!, date),\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.notifications.unreadCount(username),\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a single proposal by ID\n */\nexport function getProposalQueryOptions(id: number) {\n return queryOptions({\n queryKey: [\"proposals\", \"proposal\", id],\n queryFn: async () => {\n const r = await callRPC(\"condenser_api.find_proposals\", [[id]]);\n const proposal = r[0];\n\n // Determine proposal status based on dates\n if (new Date(proposal.start_date) < new Date() && new Date(proposal.end_date) >= new Date()) {\n proposal.status = \"active\";\n } else if (new Date(proposal.end_date) < new Date()) {\n proposal.status = \"expired\";\n } else {\n proposal.status = \"inactive\";\n }\n\n return proposal as Proposal;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get all proposals, sorted with expired proposals at the end\n */\nexport function getProposalsQueryOptions() {\n return queryOptions({\n queryKey: [\"proposals\", \"list\"],\n queryFn: async () => {\n const response = (await callRPC(\"database_api.list_proposals\", {\n start: [-1],\n limit: 500,\n order: \"by_total_votes\",\n order_direction: \"descending\",\n status: \"all\",\n })) as { proposals: Proposal[] };\n\n const proposals = response.proposals;\n const expired = proposals.filter((x) => x.status === \"expired\");\n const others = proposals.filter((x) => x.status !== \"expired\");\n\n return [...others, ...expired];\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { FullAccount } from \"@/modules/accounts\";\nimport { parseAccounts } from \"@/modules/accounts/utils\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// One page = array of enriched vote rows\nexport type ProposalVoteRow = {\n id: number;\n voter: string;\n voterAccount: FullAccount;\n};\n\ntype Cursor = string; // we paginate by last voter name\n\n/**\n * Get proposal votes with pagination and enriched voter account data\n *\n * @param proposalId - The proposal ID\n * @param voter - Starting voter for pagination\n * @param limit - Number of votes per page\n */\nexport function getProposalVotesInfiniteQueryOptions(\n proposalId: number,\n voter: string,\n limit: number\n) {\n return infiniteQueryOptions<\n ProposalVoteRow[],\n Error,\n InfiniteData,\n (string | number)[],\n Cursor\n >({\n queryKey: [\"proposals\", \"votes\", proposalId, voter, limit],\n initialPageParam: voter as Cursor,\n refetchOnMount: true,\n staleTime: 0, // Always refetch on mount\n\n queryFn: async ({ pageParam }: { pageParam: Cursor }) => {\n const startParam = pageParam ?? voter;\n\n const response = (await callRPC(\"condenser_api.list_proposal_votes\", [\n [proposalId, startParam],\n limit,\n \"by_proposal_voter\",\n ])) as ProposalVote[];\n\n const list = response\n .filter((x) => x.proposal?.proposal_id === proposalId)\n .map((x) => ({ id: x.id, voter: x.voter }));\n\n const rawAccounts = await callRPC(\"condenser_api.get_accounts\", [list.map((l) => l.voter)]);\n const accounts = parseAccounts(rawAccounts);\n\n const page: ProposalVoteRow[] = list.map((i) => ({\n ...i,\n voterAccount: accounts.find((a) => i.voter === a.name)!,\n }));\n\n return page;\n },\n\n getNextPageParam: (lastPage: ProposalVoteRow[]): Cursor | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n return last?.voter ?? undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Fetches ALL proposal votes for a specific user in a single query.\n * Much more efficient than querying each proposal individually.\n * Uses \"by_voter_proposal\" order to get all votes by a user.\n */\nexport function getUserProposalVotesQueryOptions(voter: string) {\n return queryOptions({\n queryKey: [\"proposals\", \"votes\", \"by-user\", voter],\n enabled: !!voter && voter !== \"\",\n staleTime: 60 * 1000, // Cache for 1 minute\n queryFn: async () => {\n if (!voter || voter === \"\") {\n return [];\n }\n\n const response = (await callRPC(\"database_api.list_proposal_votes\", {\n start: [voter],\n limit: 1000,\n order: \"by_voter_proposal\",\n order_direction: \"ascending\",\n status: \"votable\",\n })) as { proposal_votes: ProposalVote[] };\n\n // Filter to only this user's votes (API might return votes after this user alphabetically)\n const userVotes = (response.proposal_votes || []).filter((vote) => vote.voter === voter);\n\n return userVotes;\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting on proposals.\n */\nexport interface ProposalVotePayload {\n /** Array of proposal IDs to vote on */\n proposalIds: number[];\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting on Hive proposals.\n *\n * This mutation broadcasts an update_proposal_votes operation to vote on\n * one or more proposals in the Hive Decentralized Fund (HDF).\n *\n * @param username - The username voting on proposals (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 150) if adapter.recordActivity is available\n * - Invalidates proposal list cache to show updated vote status\n * - Invalidates voter's proposal votes cache\n *\n * **Multiple Proposals:**\n * - You can vote on multiple proposals in a single transaction\n * - All proposals receive the same vote (approve or disapprove)\n * - Proposal IDs are integers, not strings\n *\n * **Vote Types:**\n * - approve: true - Vote in favor of the proposal(s)\n * - approve: false - Remove your vote from the proposal(s)\n *\n * @example\n * ```typescript\n * const proposalVoteMutation = useProposalVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Approve a single proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: true\n * });\n *\n * // Approve multiple proposals\n * proposalVoteMutation.mutate({\n * proposalIds: [123, 124, 125],\n * approve: true\n * });\n *\n * // Remove vote from a proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: false\n * });\n * ```\n */\nexport function useProposalVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"vote\"],\n username,\n ({ proposalIds, approve }) => [\n buildProposalVoteOp(username!, proposalIds, approve)\n ],\n async (result: any) => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(150, txId, result?.block_num).catch((error) => {\n console.debug(\"[SDK][Proposals][useProposalVote] recordActivity failed\", {\n activityType: 150,\n blockNum: result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.proposals.list(),\n QueryKeys.proposals.votesByUser(username!)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useProposalVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for proposal votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalCreateOp, type ProposalCreatePayload } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport { type ProposalCreatePayload };\n\nexport function useProposalCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"create\"],\n username,\n (payload) => [\n buildProposalCreateOp(username!, payload)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.proposals.list(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get vesting delegations for an account with infinite scroll support\n *\n * @param username - The account username\n * @param limit - Maximum number of results per page (default: 50)\n */\nexport function getVestingDelegationsQueryOptions(\n username?: string,\n limit = 50\n) {\n return infiniteQueryOptions({\n queryKey: [\"wallet\", \"vesting-delegations\", username, limit],\n initialPageParam: \"\" as string,\n queryFn: async ({ pageParam }: { pageParam: string }) => {\n // Request one extra item on subsequent pages to handle inclusive cursor\n const fetchLimit = pageParam ? limit + 1 : limit;\n\n const result = await callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n pageParam || \"\",\n fetchLimit,\n ]) as DelegatedVestingShare[];\n\n // Filter out duplicate first item on subsequent pages\n // Hive API is inclusive of the 'from' cursor\n if (pageParam && result.length > 0 && result[0]?.delegatee === pageParam) {\n // Return at most limit items after removing the duplicate\n return result.slice(1, limit + 1);\n }\n\n return result;\n },\n getNextPageParam: (lastPage: DelegatedVestingShare[]) => {\n // If we got fewer results than limit, we've reached the end\n if (!lastPage || lastPage.length < limit) {\n return undefined;\n }\n\n // Return the last delegatee as cursor for next page\n const lastDelegation = lastPage[lastPage.length - 1];\n return lastDelegation?.delegatee;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { AccountDelegations } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\n\n/**\n * Account vesting delegations via the HAF balance-api REST endpoint\n * (`/balance-api/accounts/{account-name}/delegations`).\n *\n * Unlike `condenser_api.get_vesting_delegations` (see\n * {@link getHivePowerDelegatesInfiniteQueryOptions}), this returns the\n * complete outgoing AND incoming lists in a single request, with `callREST`\n * handling multi-node failover. `amount` is raw vests (vests * 10^6).\n */\nexport function getAccountDelegationsQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"assets\", \"account-delegations\", username],\n enabled: !!username,\n queryFn: ({ signal }) =>\n callREST(\n \"balance\",\n \"/accounts/{account-name}/delegations\",\n { \"account-name\": username },\n undefined,\n undefined,\n signal\n ) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { VestingDelegationExpiration } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get expiring vesting delegations for an account.\n *\n * When a delegation is removed (set to 0 VESTS), the HP doesn't return\n * immediately — it enters a 5-day cooldown. This query fetches those\n * in-flight expirations so they can be shown alongside active delegations.\n *\n * Uses database_api.find_vesting_delegation_expirations which returns\n * vesting_shares as NAI asset objects ({amount, nai, precision}).\n *\n * @param username - The delegator account username\n */\nexport function getVestingDelegationExpirationsQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"vesting-delegation-expirations\", username],\n queryFn: async () => {\n if (!username) return [];\n const result = await callRPC(\"database_api.find_vesting_delegation_expirations\", { account: username }) as { delegations: VestingDelegationExpiration[] };\n return result.delegations;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HBD to HIVE conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CollateralizedConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get collateralized HIVE to HBD conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getCollateralizedConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"collateralized-conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_collateralized_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { SavingsWithdrawRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get pending savings withdrawal requests for an account\n *\n * @param account - The account username\n */\nexport function getSavingsWithdrawFromQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"savings-withdraw\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_savings_withdraw_from\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.request_id - b.request_id),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get power down (vesting withdrawal) routes for an account\n *\n * @param account - The account username\n */\nexport function getWithdrawRoutesQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"withdraw-routes\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n account,\n \"outgoing\",\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OpenOrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get open market orders for an account\n *\n * @param user - The account username\n */\nexport function getOpenOrdersQueryOptions(user: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"open-orders\", user],\n queryFn: () =>\n callRPC(\"condenser_api.get_open_orders\", [\n user,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.orderid - b.orderid),\n enabled: !!user,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { RcDirectDelegation, RcDirectDelegationsResponse } from \"../types/rc-direct-delegation\";\n\ntype RcPage = RcDirectDelegation[];\ntype RcCursor = string | null;\n\n/**\n * Get outgoing RC delegations for an account\n *\n * @param username - Account name to get delegations for\n * @param limit - Number of delegations per page\n */\nexport function getOutgoingRcDelegationsInfiniteQueryOptions(username: string, limit = 100) {\n return infiniteQueryOptions<\n RcPage,\n Error,\n InfiniteData,\n (string | number)[],\n RcCursor\n >({\n queryKey: [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n initialPageParam: null as RcCursor,\n\n queryFn: async ({ pageParam }: { pageParam: RcCursor }) => {\n const response = await callRPC(\"rc_api.list_rc_direct_delegations\", {\n start: [username, pageParam ?? \"\"],\n limit,\n })\n .then((r: any) => r as RcDirectDelegationsResponse);\n\n let delegations: RcDirectDelegation[] = response.rc_direct_delegations || [];\n\n // Filter out the starting delegation when paginating\n if (pageParam) {\n delegations = delegations.filter((delegation) => delegation.to !== pageParam);\n }\n\n return delegations;\n },\n\n getNextPageParam: (lastPage: RcPage): RcCursor =>\n lastPage.length === limit ? lastPage[lastPage.length - 1].to : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { IncomingRcResponse } from \"../types\";\n\nexport function getIncomingRcQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"wallet\", \"incoming-rc\", username],\n enabled: !!username,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] - Missing username for incoming RC\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/received-rc/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch incoming RC: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { ReceivedVestingShare } from \"../types/received-vesting-share\";\n\nexport function getReceivedVestingSharesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"received-vesting-shares\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch received vesting shares: ${response.status}`);\n }\n\n const data = (await response.json()) as { list: ReceivedVestingShare[] };\n return data.list;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { RecurrentTransfer } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get recurrent transfers for an account\n *\n * @param username - The account username\n */\nexport function getRecurrentTransfersQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"recurrent-transfers\", username],\n queryFn: () =>\n callRPC(\"condenser_api.find_recurrent_transfers\", [\n username,\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { ConfigManager } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\ntype PortfolioLayer = \"points\" | \"hive\" | \"chain\" | \"engine\";\n\ninterface TokenAction {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface PortfolioWalletItem {\n name: string;\n symbol: string;\n layer: PortfolioLayer;\n balance: number;\n fiatRate: number;\n currency: string;\n precision: number;\n address?: string;\n error?: string;\n pendingRewards?: number;\n pendingRewardsFiat?: number;\n liquid?: number;\n liquidFiat?: number;\n savings?: number;\n savingsFiat?: number;\n staked?: number;\n stakedFiat?: number;\n iconUrl?: string;\n actions?: TokenAction[];\n extraData?: Array<{ dataKey: string; value: any }>;\n apr?: number;\n}\n\nexport interface PortfolioResponse {\n username: string;\n currency?: string;\n wallets: PortfolioWalletItem[];\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const direct = Number.parseFloat(trimmed);\n if (Number.isFinite(direct)) {\n return direct;\n }\n\n const sanitized = trimmed.replace(/,/g, \"\");\n const match = sanitized.match(/[-+]?\\d+(?:\\.\\d+)?/);\n if (match) {\n const parsed = Number.parseFloat(match[0]);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseToken(rawToken: unknown): PortfolioWalletItem | undefined {\n if (!rawToken || typeof rawToken !== \"object\") {\n return undefined;\n }\n\n const token = rawToken as Record;\n\n // Portfolio v2 returns well-defined PortfolioItem structure\n return {\n name: normalizeString(token.name) ?? \"\",\n symbol: normalizeString(token.symbol) ?? \"\",\n layer: (normalizeString(token.layer) ?? \"hive\") as PortfolioLayer,\n balance: normalizeNumber(token.balance) ?? 0,\n fiatRate: normalizeNumber(token.fiatRate) ?? 0,\n currency: normalizeString(token.currency) ?? \"usd\",\n precision: normalizeNumber(token.precision) ?? 3,\n address: normalizeString(token.address),\n error: normalizeString(token.error),\n pendingRewards: normalizeNumber(token.pendingRewards),\n pendingRewardsFiat: normalizeNumber(token.pendingRewardsFiat),\n liquid: normalizeNumber(token.liquid),\n liquidFiat: normalizeNumber(token.liquidFiat),\n savings: normalizeNumber(token.savings),\n savingsFiat: normalizeNumber(token.savingsFiat),\n staked: normalizeNumber(token.staked),\n stakedFiat: normalizeNumber(token.stakedFiat),\n iconUrl: normalizeString(token.iconUrl),\n actions: (token.actions ?? []) as TokenAction[],\n extraData: (token.extraData ?? []) as Array<{ dataKey: string; value: any }>,\n apr: normalizeNumber(token.apr),\n };\n}\n\nfunction extractTokens(payload: unknown): unknown[] {\n if (!payload || typeof payload !== \"object\") {\n return [];\n }\n\n const containers = [payload];\n const record = payload as Record;\n if (record.data && typeof record.data === \"object\") {\n containers.push(record.data as Record);\n }\n if (record.result && typeof record.result === \"object\") {\n containers.push(record.result as Record);\n }\n if (record.portfolio && typeof record.portfolio === \"object\") {\n containers.push(record.portfolio as Record);\n }\n\n for (const container of containers) {\n if (Array.isArray(container)) {\n return container;\n }\n\n if (container && typeof container === \"object\") {\n for (const key of [\n \"wallets\",\n \"tokens\",\n \"assets\",\n \"items\",\n \"portfolio\",\n \"balances\",\n ]) {\n const value = (container as Record)[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n }\n\n return [];\n}\n\nfunction resolveUsername(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record;\n return (\n normalizeString(record.username) ??\n normalizeString(record.name) ??\n normalizeString(record.account)\n );\n}\n\n/**\n * Get portfolio query options for fetching user's wallet balances across all layers\n * @param username - Hive username\n * @param currency - Fiat currency code (default: \"usd\")\n * @param onlyEnabled - Only return enabled tokens (default: true)\n * @returns TanStack Query options for portfolio data\n */\nexport function getPortfolioQueryOptions(\n username: string,\n currency: string = \"usd\",\n onlyEnabled: boolean = true\n) {\n return queryOptions({\n queryKey: [\n \"wallet\",\n \"portfolio\",\n \"v2\",\n username,\n onlyEnabled ? \"only-enabled\" : \"all\",\n currency,\n ],\n enabled: Boolean(username),\n staleTime: 60000,\n refetchInterval: 120000,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] – username is required\");\n }\n\n const endpoint = `${ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, onlyEnabled, currency }),\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallet] – Portfolio request failed (${response.status})`\n );\n }\n\n const payload = (await response.json()) as unknown;\n const tokens = extractTokens(payload)\n .map((item) => parseToken(item))\n .filter((item): item is PortfolioWalletItem => Boolean(item))\n // Backend may still emit removed SPK-layer items; drop them defensively\n .filter((item) => (item.layer as string) !== \"spk\");\n\n if (!tokens.length) {\n throw new Error(\n \"[SDK][Wallet] – Portfolio payload contained no tokens\"\n );\n }\n\n return {\n username: resolveUsername(payload) ?? username,\n currency: normalizeString(\n (payload as Record | undefined)?.fiatCurrency ??\n (payload as Record | undefined)?.currency\n )?.toUpperCase(),\n wallets: tokens,\n };\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHiveAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n\n if (!accountData) {\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: 0,\n } satisfies GeneralAssetInfo;\n }\n\n const liquidBalance = parseAsset(accountData.balance).amount;\n const savingsBalance = parseAsset(accountData.savings_balance).amount;\n\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: liquidBalance + savingsBalance,\n parts: [\n {\n name: \"current\",\n balance: liquidBalance,\n },\n {\n name: \"savings\",\n balance: savingsBalance,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHbdAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hbd\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n\n const price = 1;\n\n if (!accountData) {\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance: 0,\n };\n }\n\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance:\n parseAsset(accountData.hbd_balance).amount +\n parseAsset(accountData?.savings_hbd_balance).amount,\n apr: ((dynamicProps?.hbdInterestRate ?? 0) / 100).toFixed(3),\n parts: [\n {\n name: \"current\",\n balance: parseAsset(accountData.hbd_balance).amount,\n },\n {\n name: \"savings\",\n balance: parseAsset(accountData.savings_hbd_balance).amount,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { isEmptyDate, parseAsset, vestsToHp } from \"@/modules/core/utils\";\n\nfunction getAPR(dynamicProps: DynamicProps) {\n const initialInflationRate = 9.5;\n const initialBlock = 7000000;\n const decreaseRate = 250000;\n const decreasePercentPerIncrement = 0.01;\n\n const headBlock = dynamicProps.headBlock;\n const deltaBlocks = headBlock - initialBlock;\n const decreaseIncrements = deltaBlocks / decreaseRate;\n\n let currentInflationRate =\n initialInflationRate - decreaseIncrements * decreasePercentPerIncrement;\n\n if (currentInflationRate < 0.95) {\n currentInflationRate = 0.95;\n }\n\n const vestingRewardPercent = dynamicProps.vestingRewardPercent / 10000;\n const virtualSupply = dynamicProps.virtualSupply;\n const totalVestingFunds = dynamicProps.totalVestingFund;\n\n return (\n (virtualSupply * currentInflationRate * vestingRewardPercent) /\n totalVestingFunds\n ).toFixed(3);\n}\n\nexport function getHivePowerAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n if (!dynamicProps || !accountData) {\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price: 0,\n accountBalance: 0,\n };\n }\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n const price = Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps.base / dynamicProps.quote;\n\n const vestingShares = parseAsset(accountData.vesting_shares).amount;\n const delegatedVests = parseAsset(\n accountData.delegated_vesting_shares\n ).amount;\n const receivedVests = parseAsset(\n accountData.received_vesting_shares\n ).amount;\n const withdrawRateVests = parseAsset(\n accountData.vesting_withdraw_rate\n ).amount;\n const remainingToWithdrawVests = Math.max(\n (Number(accountData.to_withdraw) - Number(accountData.withdrawn)) /\n 1e6,\n 0\n );\n const nextWithdrawalVests = !isEmptyDate(\n accountData.next_vesting_withdrawal\n )\n ? Math.min(withdrawRateVests, remainingToWithdrawVests)\n : 0;\n\n const hpBalance = +vestsToHp(\n vestingShares,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const outgoingDelegationsHp = +vestsToHp(\n delegatedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const incomingDelegationsHp = +vestsToHp(\n receivedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const pendingPowerDownHp = +vestsToHp(\n remainingToWithdrawVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const nextPowerDownHp = +vestsToHp(\n nextWithdrawalVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const totalBalance = Math.max(hpBalance - pendingPowerDownHp, 0);\n const availableHp = Math.max(hpBalance - outgoingDelegationsHp, 0);\n\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price,\n accountBalance: +totalBalance.toFixed(3),\n apr: getAPR(dynamicProps),\n parts: [\n {\n name: \"hp_balance\",\n balance: hpBalance,\n },\n {\n name: \"available\",\n balance: +availableHp.toFixed(3),\n },\n {\n name: \"outgoing_delegations\",\n balance: outgoingDelegationsHp,\n },\n {\n name: \"incoming_delegations\",\n balance: incomingDelegationsHp,\n },\n ...(pendingPowerDownHp > 0\n ? [\n {\n name: \"pending_power_down\",\n balance: +pendingPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ...(nextPowerDownHp > 0 && nextPowerDownHp !== pendingPowerDownHp\n ? [\n {\n name: \"next_power_down\",\n balance: +nextPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { utils } from \"../../../hive-tx\";\nimport { HiveOperationGroup } from \"../types\";\nconst ops = utils.operations;\n\nexport const HIVE_ACCOUNT_OPERATION_GROUPS: Record<\n HiveOperationGroup,\n number[]\n> = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n \"\": [],\n};\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nexport const HIVE_OPERATION_LIST = Object.keys(\n utils.operations\n) as HiveOperationName[];\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nconst operationOrders = utils.operations as Record<\n HiveOperationName,\n number\n>;\n\nexport const HIVE_OPERATION_ORDERS = operationOrders;\n\nexport const HIVE_OPERATION_NAME_BY_ID: Record =\n Object.entries(operationOrders).reduce((acc, [name, id]) => {\n acc[id] = name as HiveOperationName;\n return acc;\n }, {} as Record);\n","import { callRPC } from \"../../../hive-tx\";\nimport { utils } from \"../../../hive-tx\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { HIVE_ACCOUNT_OPERATION_GROUPS } from \"../consts\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationFilterKey,\n HiveOperationFilterValue,\n HiveOperationGroup,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nconst operationOrders = utils.operations;\n\nfunction isHiveOperationName(value: string): value is HiveOperationName {\n return Object.prototype.hasOwnProperty.call(operationOrders, value);\n}\n\nexport function resolveHiveOperationFilters(filters: HiveOperationFilter): {\n filterKey: HiveOperationFilterKey;\n filterArgs: any[];\n} {\n const rawValues: HiveOperationFilterValue[] = Array.isArray(filters)\n ? filters\n : [filters];\n\n const hasAll = rawValues.includes(\"\" as HiveOperationGroup);\n\n const uniqueValues = Array.from(\n new Set(\n rawValues.filter(\n (value): value is HiveOperationFilterValue =>\n value !== undefined &&\n value !== null &&\n value !== (\"\" as HiveOperationGroup)\n )\n )\n );\n\n const filterKey: HiveOperationFilterKey =\n hasAll || uniqueValues.length === 0\n ? \"all\"\n : uniqueValues\n .map((value) => value.toString())\n .sort()\n .join(\"|\");\n\n const operationIds = new Set();\n\n if (!hasAll) {\n uniqueValues.forEach((value) => {\n if (value in HIVE_ACCOUNT_OPERATION_GROUPS) {\n HIVE_ACCOUNT_OPERATION_GROUPS[value as HiveOperationGroup].forEach(\n (id) => operationIds.add(id)\n );\n return;\n }\n\n if (isHiveOperationName(value)) {\n operationIds.add(operationOrders[value]);\n }\n });\n }\n\n const filterArgs = makeBitMaskFilter(Array.from(operationIds));\n\n return {\n filterKey,\n filterArgs,\n };\n}\n\nfunction makeBitMaskFilter(allowedOperations: number[]) {\n let low = 0n;\n let high = 0n;\n\n allowedOperations.forEach((operation) => {\n if (operation < 64) {\n low |= 1n << BigInt(operation);\n } else {\n high |= 1n << BigInt(operation - 64);\n }\n });\n\n return [\n low !== 0n ? low.toString() : null,\n high !== 0n ? high.toString() : null,\n ];\n}\n\nexport function getHiveAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterArgs, filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n initialData: { pages: [], pageParams: [] },\n initialPageParam: -1,\n getNextPageParam: (lastPage, __) =>\n lastPage ? +(lastPage[lastPage.length - 1]?.num ?? 0) - 1 : -1,\n\n queryFn: async ({ pageParam }) => {\n const response = await callRPC(\n \"condenser_api.get_account_history\",\n [username, pageParam, limit, ...filterArgs]\n );\n\n return response.map(\n (x: any) =>\n ({\n num: x[0],\n type: x[1].op[0],\n timestamp: x[1].timestamp,\n trx_id: x[1].trx_id,\n ...x[1].op[1],\n }) satisfies HiveTransaction\n );\n },\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hivePayout = parseAsset(\n (item as AuthorReward).hive_payout\n );\n return hivePayout.amount > 0;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HIVE\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HIVE\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HIVE\"].includes(asset.symbol);\n\n case \"claim_reward_balance\":\n const rewardHive = parseAsset(\n (item as ClaimRewardBalance).reward_hive\n );\n return rewardHive.amount > 0;\n\n case \"curation_reward\":\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHbdAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hbdPayout = parseAsset(\n (item as AuthorReward).hbd_payout\n );\n return hbdPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardHbd = parseAsset(\n (item as ClaimRewardBalance).reward_hbd\n );\n return rewardHbd.amount > 0;\n\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HBD\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HBD\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HBD\"].includes(asset.symbol);\n\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n case \"proposal_pay\":\n case \"interest\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHivePowerAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n const userSelectedOperations = new Set(\n Array.isArray(filters) ? filters : [filters]\n );\n const hasAllFilter =\n userSelectedOperations.has(\"\" as any) || userSelectedOperations.size === 0;\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const vestingPayout = parseAsset(\n (item as AuthorReward).vesting_payout\n );\n return vestingPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardVests = parseAsset(\n (item as ClaimRewardBalance).reward_vests\n );\n return rewardVests.amount > 0;\n\n case \"transfer_to_vesting\":\n return true;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"recurrent_transfer\":\n return [\"VESTS\", \"HP\"].includes(parseAsset(item.amount).symbol);\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"VESTS\", \"HP\"].includes(asset.symbol);\n\n case \"curation_reward\":\n case \"withdraw_vesting\":\n case \"delegate_vesting_shares\":\n case \"fill_vesting_withdraw\":\n case \"return_vesting_delegation\":\n case \"producer_reward\":\n case \"set_withdraw_vesting_route\":\n return true;\n default:\n return hasAllFilter || userSelectedOperations.has(item.type);\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveMarketMetric } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nfunction subtractSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() - seconds * 1000);\n}\n\nexport function getHiveAssetMetricQueryOptions(bucketSeconds = 86_400) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n queryFn: async ({ pageParam: [startDate, endDate] }) => {\n const apiData: HiveMarketMetric[] = await callRPC(\"condenser_api.get_market_history\", [bucketSeconds, formatDate(startDate), formatDate(endDate)]\n );\n\n return apiData.map(({ hive, non_hive, open }) => ({\n close: non_hive.close / hive.close,\n open: non_hive.open / hive.open,\n low: non_hive.low / hive.low,\n high: non_hive.high / hive.high,\n volume: hive.volume,\n time: new Date(open),\n }));\n },\n initialPageParam: [\n subtractSeconds(new Date(), Math.max(100 * bucketSeconds, 28_800)),\n new Date(),\n ],\n getNextPageParam: (_, __, [prevStartDate]) => [\n subtractSeconds(prevStartDate, Math.max(100 * bucketSeconds, 28_800)),\n subtractSeconds(prevStartDate, bucketSeconds),\n ],\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHiveAssetWithdrawalRoutesQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"withdrawal-routes\", username],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n username,\n \"outgoing\",\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHivePowerDelegatesInfiniteQueryOptions(\n username: string,\n limit = 50\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegates\", username],\n enabled: !!username,\n queryFn: () =>\n callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n \"\",\n limit,\n ]) as Promise,\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { ReceivedVestingShare } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHivePowerDelegatingsQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegatings\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()).list as ReceivedVestingShare[];\n },\n select: (data) =>\n data.sort(\n (a, b) =>\n parseAsset(b.vesting_shares).amount -\n parseAsset(a.vesting_shares).amount\n ),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get the internal HIVE/HBD market order book\n *\n * @param limit - Maximum number of orders to fetch (default: 500)\n */\nexport function getOrderBookQueryOptions(limit = 500) {\n return queryOptions({\n queryKey: [\"market\", \"order-book\", limit],\n queryFn: () =>\n callRPC(\"condenser_api.get_order_book\", [\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market statistics from the blockchain\n */\nexport function getMarketStatisticsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"statistics\"],\n queryFn: () =>\n callRPC(\"condenser_api.get_ticker\", []) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketCandlestickDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market history (candlestick data)\n *\n * @param seconds - Bucket size in seconds\n * @param startDate - Start date for the data\n * @param endDate - End date for the data\n */\nexport function getMarketHistoryQueryOptions(\n seconds: number,\n startDate: Date,\n endDate: Date\n) {\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n return queryOptions({\n queryKey: [\"market\", \"history\", seconds, startDate.getTime(), endDate.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_market_history\", [\n seconds,\n formatDate(startDate),\n formatDate(endDate),\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveHbdStats, MarketCandlestickDataItem, MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get combined HIVE/HBD statistics including price, 24h change, and volume\n */\nexport function getHiveHbdStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"hive-hbd-stats\"],\n queryFn: async () => {\n // Get current market statistics\n const stats = (await callRPC(\"condenser_api.get_ticker\", [])) as MarketStatistics;\n\n // Get 24h market history\n const now = new Date();\n const oneDayAgo = new Date(now.getTime() - 86400000); // 24 hours ago\n\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n const dayChange = (await callRPC(\"condenser_api.get_market_history\", [86400, formatDate(oneDayAgo), formatDate(now)]\n )) as MarketCandlestickDataItem[];\n\n // Calculate stats\n const result: HiveHbdStats = {\n price: +stats.latest,\n close: dayChange[0] ? dayChange[0].non_hive.open / dayChange[0].hive.open : 0,\n high: dayChange[0] ? dayChange[0].non_hive.high / dayChange[0].hive.high : 0,\n low: dayChange[0] ? dayChange[0].non_hive.low / dayChange[0].hive.low : 0,\n percent: dayChange[0]\n ? 100 - ((dayChange[0].non_hive.open / dayChange[0].hive.open) * 100) / +stats.latest\n : 0,\n totalFromAsset: stats.hive_volume.split(\" \")[0],\n totalToAsset: stats.hbd_volume.split(\" \")[0],\n };\n\n return result;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketData } from \"../types\";\nimport { getBoundFetch } from \"@/modules/core\";\n\n/**\n * Get market chart data from CoinGecko API\n *\n * @param coin - Coin ID (e.g., \"hive\", \"bitcoin\")\n * @param vsCurrency - Currency to compare against (e.g., \"usd\", \"eur\")\n * @param fromTs - From timestamp (Unix timestamp in seconds)\n * @param toTs - To timestamp (Unix timestamp in seconds)\n */\nexport function getMarketDataQueryOptions(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n) {\n return queryOptions({\n queryKey: [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n queryFn: async ({ signal }) => {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n\n const response = await fetchApi(url, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch market data: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date) {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n}\n\nexport function getTradeHistoryQueryOptions(\n limit = 1000,\n startDate?: Date,\n endDate?: Date\n) {\n const end = endDate ?? new Date();\n const start =\n startDate ?? new Date(end.getTime() - 10 * 60 * 60 * 1000);\n\n return queryOptions({\n queryKey: [\"market\", \"trade-history\", limit, start.getTime(), end.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_trade_history\", [\n formatDate(start),\n formatDate(end),\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FeedHistoryItem {\n id: number;\n current_median_history: {\n base: string;\n quote: string;\n };\n market_median_history: {\n base: string;\n quote: string;\n };\n current_min_history: {\n base: string;\n quote: string;\n };\n current_max_history: {\n base: string;\n quote: string;\n };\n price_history: Array<{\n base: string;\n quote: string;\n }>;\n}\n\n/**\n * Get feed history from the blockchain\n * Returns price feed history including median prices\n */\nexport function getFeedHistoryQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"feed-history\"],\n queryFn: async () => {\n try {\n const feedHistory = await callRPC(\"condenser_api.get_feed_history\", []);\n return feedHistory as FeedHistoryItem;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface MedianHistoryPrice {\n base: string;\n quote: string;\n}\n\n/**\n * Get current median history price from the blockchain\n * Returns the current median price for HIVE/HBD conversion\n */\nexport function getCurrentMedianHistoryPriceQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"current-median-history-price\"],\n queryFn: async () => {\n try {\n const price = await callRPC(\"condenser_api.get_current_median_history_price\", []);\n return price as MedianHistoryPrice;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCreateOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCreatePayload {\n amountToSell: string;\n minToReceive: string;\n fillOrKill: boolean;\n expiration: string;\n orderId: number;\n}\n\nexport function useLimitOrderCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-create\"],\n username,\n (payload) => [\n buildLimitOrderCreateOp(\n username!,\n payload.amountToSell,\n payload.minToReceive,\n payload.fillOrKill,\n payload.expiration,\n payload.orderId\n )\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCancelOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCancelPayload {\n orderId: number;\n}\n\nexport function useLimitOrderCancel(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-cancel\"],\n username,\n ({ orderId }) => [\n buildLimitOrderCancelOp(username!, orderId)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { MarketData } from \"./types\";\nimport { CurrencyRates } from \"@/modules/private-api/types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n const data = (await response.json()) as T;\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n return data;\n}\n\nexport async function getMarketData(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n): Promise {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n const response = await fetchApi(url);\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRate(cur: string): Promise {\n if (cur === \"hbd\") {\n return 1;\n }\n\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${cur}`;\n const response = await fetchApi(url);\n const data = await parseJsonResponse<{ hive_dollar: Record }>(response);\n return data.hive_dollar[cur];\n}\n\nexport async function getCurrencyTokenRate(currency: string, token: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost +\n `/private-api/market-data/${currency === \"hbd\" ? \"usd\" : currency}/${token}`\n );\n\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRates(): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/market-data/latest\");\n return parseJsonResponse(response);\n}\n\nexport async function getHivePrice(): Promise<{ hive: { usd: number } }> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n \"https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd\"\n );\n return parseJsonResponse<{ hive: { usd: number } }>(response);\n}\n","import { ConfigManager, getBoundFetch } from \"@/modules/core\";\nimport type { HiveEngineOpenOrder } from \"./types\";\n\ntype EngineOrderBookEntry = {\n txId: string;\n timestamp: number;\n account: string;\n symbol: string;\n quantity: string;\n price: string;\n tokensLocked?: string;\n};\n\nconst ENGINE_RPC_HEADERS = { \"Content-type\": \"application/json\" };\n\nasync function engineRpc(payload: Record): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(`${baseUrl}/private-api/engine-api`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: ENGINE_RPC_HEADERS,\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – request failed with ${response.status}`\n );\n }\n\n const data = (await response.json()) as { result: T };\n return data.result;\n}\n\nasync function engineRpcSafe(\n payload: Record,\n fallback: T\n): Promise {\n try {\n return await engineRpc(payload);\n } catch (e) {\n return fallback;\n }\n}\n\nexport async function getHiveEngineOrderBook(\n symbol: string,\n limit: number = 50\n): Promise<{ buy: T[]; sell: T[] }> {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buy, sell] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"price\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"price\", descending: false }],\n },\n },\n []\n ),\n ]);\n\n const sortByPriceDesc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return right - left;\n });\n const sortByPriceAsc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return left - right;\n });\n\n return {\n buy: sortByPriceDesc(buy),\n sell: sortByPriceAsc(sell),\n };\n}\n\nexport async function getHiveEngineTradeHistory>(\n symbol: string,\n limit: number = 50\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"tradesHistory\",\n query: { symbol },\n limit,\n offset: 0,\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineOpenOrders(\n account: string,\n symbol: string,\n limit: number = 100\n): Promise {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol, account },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buyRaw, sellRaw] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n ]);\n\n const formatTotal = (quantity: string, price: string) =>\n (Number(quantity || 0) * Number(price || 0)).toFixed(8);\n\n const buy: HiveEngineOpenOrder[] = buyRaw.map((order) => ({\n id: order.txId,\n type: \"buy\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: order.tokensLocked ?? formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n const sell: HiveEngineOpenOrder[] = sellRaw.map((order) => ({\n id: order.txId,\n type: \"sell\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n return [...buy, ...sell].sort((a, b) => b.timestamp - a.timestamp) as T[];\n}\n\n/**\n * Market metrics, optionally narrowed to one symbol or to a list of them.\n *\n * An unfiltered call is served from a single page – the node caps `find` at 1000 rows\n * while Hive engine has far more traded tokens than that – so callers that only care\n * about specific symbols must pass them. Scanning the unfiltered page for a symbol\n * silently reports \"no market\" for everything outside it.\n */\nexport async function getHiveEngineMetrics>(\n symbol?: string | string[],\n account?: string\n): Promise {\n if (Array.isArray(symbol) && symbol.length === 0) {\n return [];\n }\n\n const symbolQuery = Array.isArray(symbol)\n ? { symbol: { $in: symbol } }\n : symbol\n ? { symbol }\n : {};\n\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"metrics\",\n query: {\n ...symbolQuery,\n ...(account ? { account } : {}),\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMarket>(\n account?: string,\n symbol?: string | string[]\n): Promise {\n return getHiveEngineMetrics(symbol, account);\n}\n\nexport async function getHiveEngineTokensBalances>(\n username: string\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"balances\",\n query: {\n account: username,\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMetadata>(\n tokens: string[]\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"tokens\",\n query: {\n symbol: { $in: tokens },\n },\n },\n id: 2,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokenTransactions>(\n username: string,\n symbol: string,\n limit: number,\n offset: number\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-account-history\", baseUrl);\n url.searchParams.set(\"account\", username);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"limit\", limit.toString());\n url.searchParams.set(\"offset\", offset.toString());\n\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – account history failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineTokenMetrics>(\n symbol: string,\n interval = \"daily\"\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-chart-api\", baseUrl);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"interval\", interval);\n\n const response = await fetchApi(url.toString(), {\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – chart failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineUnclaimedRewards>(\n username: string\n): Promise> {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(\n `${baseUrl}/private-api/engine-reward-api/${username}?hive=1`\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – rewards failed with ${response.status}`\n );\n }\n\n return (await response.json()) as Record;\n}\n","import { getHiveEngineTokensBalances } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenBalance } from \"../types\";\n\nexport function getHiveEngineTokensBalancesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"balances\", username] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensBalances(username);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMarketResponse } from \"../types\";\nimport { getHiveEngineTokensMarket } from \"../requests\";\n\nexport function getHiveEngineTokensMarketQueryOptions() {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"markets\"],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMarket();\n },\n });\n}\n","import { getHiveEngineTokensMetadata } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenMetadataResponse } from \"../types\";\n\nexport function getHiveEngineTokensMetadataQueryOptions(tokens: string[]) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"metadata-list\", tokens] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMetadata(tokens);\n },\n });\n}\n","import { getHiveEngineTokenTransactions } from \"../requests\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTransaction } from \"../types\";\n\nexport function getHiveEngineTokenTransactionsQueryOptions(\n username: string | undefined,\n symbol: string,\n limit = 20\n) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"transactions\", username],\n enabled: !!symbol && !!username,\n initialPageParam: 0,\n queryFn: async ({ pageParam }) => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n return getHiveEngineTokenTransactions(\n username,\n symbol,\n limit,\n pageParam as number\n );\n },\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n (lastPage?.length ?? 0) === limit ? (lastPageParam as number) + limit : undefined,\n getPreviousPageParam: (_firstPage, _allPages, firstPageParam) =>\n (firstPageParam as number) > 0 ? (firstPageParam as number) - limit : undefined,\n });\n}\n","import { getHiveEngineTokenMetrics } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMetric } from \"../types\";\n\nexport function getHiveEngineTokensMetricsQueryOptions(\n symbol: string,\n interval = \"daily\"\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokenMetrics(symbol, interval);\n },\n });\n}\n","import { getHiveEngineUnclaimedRewards } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenStatus } from \"../types\";\n\nexport function getHiveEngineUnclaimedRewardsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"unclaimed\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n enabled: !!username,\n queryFn: async () => {\n try {\n const data = await getHiveEngineUnclaimedRewards(\n username as string\n );\n return Object.values(data).filter(\n ({ pending_token }) => pending_token > 0\n );\n } catch (e) {\n return [];\n }\n },\n });\n}\n","import { getHiveEngineTokensMarket } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenInfo } from \"../types\";\n\nexport function getAllHiveEngineTokensQueryOptions(\n account?: string,\n symbol?: string | string[]\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"all-tokens\", account, symbol] as const,\n queryFn: async () => {\n return getHiveEngineTokensMarket(account, symbol);\n },\n });\n}\n","interface Options {\n fractionDigits?: number;\n prefix?: string;\n suffix?: string;\n}\n\nexport function formattedNumber(\n value: number | string,\n options: Options | undefined = undefined\n) {\n let opts: Options = {\n fractionDigits: 3,\n prefix: \"\",\n suffix: \"\",\n };\n\n if (options) {\n opts = { ...opts, ...options };\n }\n\n const { fractionDigits, prefix, suffix } = opts;\n\n let out = \"\";\n\n if (prefix) out += prefix + \" \";\n // turn too small values to zero. Bug: https://github.com/adamwdraper/Numeral-js/issues/563\n const av = Math.abs(parseFloat(value.toString())) < 0.0001 ? 0 : value;\n const num = typeof av === \"string\" ? parseFloat(av) : av;\n out += num.toLocaleString(\"en-US\", {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n useGrouping: true,\n });\n if (suffix) out += \" \" + suffix;\n\n return out;\n}\n","import { formattedNumber } from \"./formatted-number\";\n\ninterface HiveEngineTokenProps {\n symbol: string;\n name: string;\n icon: string;\n precision: number;\n stakingEnabled: boolean;\n delegationEnabled: boolean;\n balance: string;\n stake: string;\n delegationsIn: string;\n delegationsOut: string;\n usdValue: number;\n}\n\nexport class HiveEngineToken {\n symbol: string;\n name?: string;\n icon?: string;\n\n precision?: number;\n stakingEnabled?: boolean;\n delegationEnabled?: boolean;\n balance: number;\n stake: number;\n stakedBalance: number;\n delegationsIn: number;\n delegationsOut: number;\n usdValue: number;\n\n constructor(props: HiveEngineTokenProps) {\n this.symbol = props.symbol;\n this.name = props.name || \"\";\n this.icon = props.icon || \"\";\n\n this.precision = props.precision || 0;\n this.stakingEnabled = props.stakingEnabled || false;\n this.delegationEnabled = props.delegationEnabled || false;\n this.balance = parseFloat(props.balance) || 0;\n this.stake = parseFloat(props.stake) || 0;\n this.delegationsIn = parseFloat(props.delegationsIn) || 0;\n this.delegationsOut = parseFloat(props.delegationsOut) || 0;\n this.stakedBalance =\n this.stake + this.delegationsIn - this.delegationsOut;\n this.usdValue = props.usdValue;\n }\n\n hasDelegations = (): boolean => {\n if (!this.delegationEnabled) {\n return false;\n }\n\n return this.delegationsIn > 0 && this.delegationsOut > 0;\n };\n\n delegations = (): string => {\n if (!this.hasDelegations()) {\n return \"\";\n }\n\n return `(${formattedNumber(this.stake, {\n fractionDigits: this.precision,\n })} + ${formattedNumber(this.delegationsIn, {\n fractionDigits: this.precision,\n })} - ${formattedNumber(this.delegationsOut, {\n fractionDigits: this.precision,\n })})`;\n };\n\n staked = (): string => {\n if (!this.stakingEnabled) {\n return \"-\";\n }\n\n if (this.stakedBalance < 0.0001) {\n return this.stakedBalance.toString();\n }\n\n return formattedNumber(this.stakedBalance, {\n fractionDigits: this.precision,\n });\n };\n\n balanced = (): string => {\n if (this.balance < 0.0001) {\n return this.balance.toString();\n }\n\n return formattedNumber(this.balance, { fractionDigits: this.precision });\n };\n}\n","import {\n getHiveEngineTokensBalances,\n getHiveEngineTokensMarket,\n getHiveEngineTokensMetadata,\n} from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type {\n HiveEngineTokenBalance,\n Token,\n TokenMetadata,\n HiveEngineTokenInfo,\n} from \"../types\";\nimport { HiveEngineToken } from \"../utils\";\n\ninterface DynamicProps {\n base: number;\n quote: number;\n}\n\nexport function getHiveEngineBalancesWithUsdQueryOptions(\n account: string,\n dynamicProps?: DynamicProps,\n allTokens?: HiveEngineTokenInfo[]\n) {\n return queryOptions({\n queryKey: [\n \"assets\",\n \"hive-engine\",\n \"balances-with-usd\",\n account,\n dynamicProps,\n allTokens,\n ] as const,\n queryFn: async () => {\n if (!account) {\n throw new Error(\"[HiveEngine] No account in a balances query\");\n }\n\n const balances = await getHiveEngineTokensBalances(account);\n\n const tokens = await getHiveEngineTokensMetadata(\n balances.map((t) => t.symbol)\n );\n\n const pricePerHive = dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0;\n const providedMetrics: ReadonlyArray = Array.isArray(\n allTokens\n )\n ? allTokens\n : [];\n\n // Whatever the caller passed comes from an unfiltered metrics call, which the node\n // caps at 1000 rows – held tokens outside that page have no price and used to be\n // valued at zero, understating the wallet. Ask for the missing ones by symbol.\n const unpricedSymbols = balances\n .map((balance) => balance.symbol)\n .filter(\n (symbol) =>\n symbol !== \"SWAP.HIVE\" &&\n !providedMetrics.some((metric) => metric.symbol === symbol)\n );\n\n const metrics: ReadonlyArray = [\n ...providedMetrics,\n ...(unpricedSymbols.length\n ? await getHiveEngineTokensMarket(\n undefined,\n unpricedSymbols\n )\n : []),\n ];\n\n return balances.map((balance) => {\n const token = tokens.find((t) => t.symbol === balance.symbol);\n let tokenMetadata: TokenMetadata | undefined;\n\n if (token?.metadata) {\n try {\n tokenMetadata = JSON.parse(token.metadata) as TokenMetadata;\n } catch {\n tokenMetadata = undefined;\n }\n }\n\n const metric = metrics.find((m) => m.symbol === balance.symbol);\n const lastPrice = Number(metric?.lastPrice ?? \"0\");\n const balanceAmount = Number(balance.balance);\n\n const usdValue =\n balance.symbol === \"SWAP.HIVE\"\n ? pricePerHive * balanceAmount\n : lastPrice === 0\n ? 0\n : Number(\n (lastPrice * pricePerHive * balanceAmount).toFixed(10)\n );\n\n return new HiveEngineToken({\n symbol: balance.symbol,\n name: token?.name ?? balance.symbol,\n icon: tokenMetadata?.icon ?? \"\",\n precision: token?.precision ?? 0,\n stakingEnabled: token?.stakingEnabled ?? false,\n delegationEnabled: token?.delegationEnabled ?? false,\n balance: balance.balance,\n stake: balance.stake,\n delegationsIn: balance.delegationsIn,\n delegationsOut: balance.delegationsOut,\n usdValue,\n });\n });\n },\n enabled: !!account,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getHiveEngineTokensMetadataQueryOptions } from \"./get-hive-engine-tokens-metadata-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"./get-hive-engine-tokens-balances-query-options\";\nimport { getAllHiveEngineTokensQueryOptions } from \"./get-all-hive-engine-tokens-query-options\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"@/modules/wallet/queries/get-hive-asset-general-info-query-options\";\n\nexport function getHiveEngineTokenGeneralInfoQueryOptions(\n username?: string,\n symbol?: string\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"general-info\", username],\n enabled: !!symbol && !!username,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n const queryClient = getQueryClient();\n const hiveQuery = getHiveAssetGeneralInfoQueryOptions(username);\n await queryClient.prefetchQuery(hiveQuery);\n const hiveData = queryClient.getQueryData(\n hiveQuery.queryKey\n );\n\n const metadataList = await queryClient.ensureQueryData(\n getHiveEngineTokensMetadataQueryOptions([symbol])\n );\n\n const balanceList = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n // Scoped to this symbol: the unfiltered metrics call is capped at 1000 rows, so a\n // token outside that page reported no market and rendered a zero price.\n const marketList = await queryClient.ensureQueryData(\n getAllHiveEngineTokensQueryOptions(undefined, symbol)\n );\n\n const metadata = metadataList?.find((i) => i.symbol === symbol);\n const balance = balanceList?.find((i) => i.symbol === symbol);\n const market = marketList?.find((i) => i.symbol === symbol);\n\n const lastPrice = +(market?.lastPrice ?? \"0\");\n\n const liquidBalance = parseFloat(balance?.balance ?? \"0\");\n const stakedBalance = parseFloat(balance?.stake ?? \"0\");\n const unstakingBalance = parseFloat(balance?.pendingUnstake ?? \"0\");\n\n const parts: GeneralAssetInfo[\"parts\"] = [\n { name: \"liquid\", balance: liquidBalance },\n { name: \"staked\", balance: stakedBalance },\n ];\n\n if (unstakingBalance > 0) {\n parts.push({ name: \"unstaking\", balance: unstakingBalance });\n }\n\n return {\n name: symbol,\n title: metadata?.name ?? \"\",\n price: lastPrice === 0 ? 0 : Number(lastPrice * (hiveData?.price ?? 0)),\n accountBalance: liquidBalance + stakedBalance,\n layer: \"ENGINE\",\n parts,\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PointTransaction } from \"../types/point-transaction\";\n\ninterface PointsResponse {\n points: string;\n unclaimed_points: string;\n}\n\nexport function getPointsQueryOptions(username?: string, filter = 0) {\n return queryOptions({\n queryKey: [\"points\", username, filter],\n queryFn: async () => {\n if (!username) {\n throw new Error(\"Get points query – username wasn't provided\");\n }\n\n const name = username.replace(\"@\", \"\");\n\n // Get points\n const pointsResponse = await fetch(CONFIG.privateApiHost + \"/private-api/points\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name }),\n });\n\n if (!pointsResponse.ok) {\n throw new Error(`Failed to fetch points: ${pointsResponse.status}`);\n }\n\n const points = (await pointsResponse.json()) as PointsResponse;\n\n // Get transactions\n const transactionsResponse = await fetch(\n CONFIG.privateApiHost + \"/private-api/point-list\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name, type: filter }),\n }\n );\n\n if (!transactionsResponse.ok) {\n throw new Error(`Failed to fetch point transactions: ${transactionsResponse.status}`);\n }\n\n const transactions = (await transactionsResponse.json()) as PointTransaction[];\n\n return {\n points: points.points,\n uPoints: points.unclaimed_points,\n transactions,\n } as const;\n },\n staleTime: 30000,\n refetchOnMount: true,\n enabled: !!username,\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getPointsQueryOptions } from \"./get-points-query-options\";\n\nexport function getPointsAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getPointsQueryOptions(username));\n const data = getQueryClient().getQueryData(\n getPointsQueryOptions(username).queryKey\n );\n return {\n name: \"POINTS\",\n title: \"Ecency Points\",\n price: 0.002,\n accountBalance: +(data?.points ?? 0),\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { PointTransaction } from \"../types\";\nimport { PointTransactionType } from \"../types\";\nimport type { GeneralAssetTransaction } from \"@/modules/wallet/types\";\n\nexport function getPointsAssetTransactionsQueryOptions(\n username: string | undefined,\n type?: PointTransactionType\n) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"transactions\", username, type],\n queryFn: async () => {\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/point-list`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n type: type ?? 0,\n }),\n }\n );\n const data = (await response.json()) as PointTransaction[];\n return data.map(({ created, type, amount, id, sender, receiver, memo }) => ({\n created: new Date(created),\n type,\n results: [\n {\n amount: parseFloat(amount),\n asset: \"POINTS\",\n },\n ],\n id,\n from: sender ?? undefined,\n to: receiver ?? undefined,\n memo: memo ?? undefined,\n })) satisfies GeneralAssetTransaction[];\n },\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { getCurrencyRate } from \"@/modules/market\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"./get-hive-asset-general-info-query-options\";\nimport { getHbdAssetGeneralInfoQueryOptions } from \"./get-hbd-asset-general-info-query-options\";\nimport { getHivePowerAssetGeneralInfoQueryOptions } from \"./get-hive-power-asset-general-info-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getHiveEngineTokenGeneralInfoQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getPointsAssetGeneralInfoQueryOptions } from \"@/modules/points/queries\";\nimport {\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"./get-portfolio-query-options\";\n\ninterface Options {\n refetch?: boolean;\n currency?: string;\n}\n\nexport function getAccountWalletAssetInfoQueryOptions(\n username: string,\n asset: string,\n options: Options = { refetch: false }\n) {\n const queryClient = getQueryClient();\n const currency = options.currency ?? \"usd\";\n\n const fetchQuery = async (qo: any) => {\n if (options.refetch) {\n await queryClient.fetchQuery(qo);\n } else {\n await queryClient.prefetchQuery(qo);\n }\n return queryClient.getQueryData(qo.queryKey);\n };\n\n const convertPriceToUserCurrency = async (\n assetInfo: GeneralAssetInfo | undefined\n ): Promise => {\n if (!assetInfo || currency === \"usd\") {\n return assetInfo;\n }\n\n try {\n const conversionRate = await getCurrencyRate(currency);\n return {\n ...assetInfo,\n price: assetInfo.price * conversionRate,\n };\n } catch (error) {\n console.warn(`Failed to convert price from USD to ${currency}:`, error);\n return assetInfo;\n }\n };\n\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n\n const getPortfolioAssetInfo = async () => {\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const assetItem = portfolio.wallets.find(\n (item: PortfolioWalletItem) =>\n item.symbol.toUpperCase() === asset.toUpperCase()\n );\n\n if (!assetItem) return undefined;\n\n const parts: Array<{ name: string; balance: number }> = [];\n\n if (assetItem.liquid !== undefined && assetItem.liquid !== null) {\n parts.push({ name: \"liquid\", balance: assetItem.liquid });\n }\n\n if (assetItem.staked !== undefined && assetItem.staked !== null && assetItem.staked > 0) {\n parts.push({ name: \"staked\", balance: assetItem.staked });\n }\n\n if (assetItem.savings !== undefined && assetItem.savings !== null && assetItem.savings > 0) {\n parts.push({ name: \"savings\", balance: assetItem.savings });\n }\n\n if (assetItem.extraData && Array.isArray(assetItem.extraData)) {\n for (const extraItem of assetItem.extraData) {\n if (!extraItem || typeof extraItem !== \"object\") continue;\n\n const dataKey = extraItem.dataKey;\n const value = extraItem.value;\n\n if (typeof value === \"string\") {\n const cleanValue = value.replace(/,/g, \"\");\n const match = cleanValue.match(/[+-]?\\s*(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const numValue = Math.abs(Number.parseFloat(match[1]));\n\n if (dataKey === \"delegated_hive_power\") {\n parts.push({ name: \"outgoing_delegations\", balance: numValue });\n } else if (dataKey === \"received_hive_power\") {\n parts.push({ name: \"incoming_delegations\", balance: numValue });\n } else if (dataKey === \"powering_down_hive_power\") {\n parts.push({ name: \"pending_power_down\", balance: numValue });\n }\n }\n }\n }\n }\n\n return {\n name: assetItem.symbol,\n title: assetItem.name,\n price: assetItem.fiatRate,\n accountBalance: assetItem.balance,\n apr: assetItem.apr?.toString(),\n layer: assetItem.layer,\n pendingRewards: assetItem.pendingRewards,\n parts,\n } as GeneralAssetInfo;\n } catch {\n return undefined;\n }\n };\n\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n queryFn: async () => {\n const portfolioAssetInfo = await getPortfolioAssetInfo();\n\n if (portfolioAssetInfo && portfolioAssetInfo.price > 0) {\n return portfolioAssetInfo;\n }\n\n let assetInfo: GeneralAssetInfo | undefined;\n\n if (asset === \"HIVE\") {\n assetInfo = await fetchQuery(getHiveAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HP\") {\n assetInfo = await fetchQuery(getHivePowerAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HBD\") {\n assetInfo = await fetchQuery(getHbdAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"POINTS\") {\n assetInfo = await fetchQuery(getPointsAssetGeneralInfoQueryOptions(username));\n } else {\n // Check if it's a Hive Engine token\n const balances = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n if (balances.some((balance) => balance.symbol === asset)) {\n assetInfo = await fetchQuery(\n getHiveEngineTokenGeneralInfoQueryOptions(username, asset)\n );\n } else if (portfolioAssetInfo) {\n // Unknown asset but portfolio has data — use it as-is\n return portfolioAssetInfo;\n } else {\n throw new Error(\n `[SDK][Wallet] – unrecognized asset \"${asset}\"`\n );\n }\n }\n\n // If portfolio had rich data (parts, balance) but zero price,\n // merge the fallback price into the portfolio data\n if (portfolioAssetInfo && assetInfo && assetInfo.price > 0) {\n const converted = await convertPriceToUserCurrency(assetInfo);\n return {\n ...portfolioAssetInfo,\n price: converted!.price,\n };\n }\n\n return await convertPriceToUserCurrency(assetInfo);\n },\n });\n}\n","export enum AssetOperation {\n // Common\n Transfer = \"transfer\",\n\n // APR\n TransferToSavings = \"transfer-saving\",\n WithdrawFromSavings = \"withdraw-saving\",\n Delegate = \"delegate\",\n PowerUp = \"power-up\",\n PowerDown = \"power-down\",\n WithdrawRoutes = \"withdraw-routes\",\n ClaimInterest = \"claim-interest\",\n Swap = \"swap\",\n Convert = \"convert\",\n\n // Points\n Gift = \"gift\",\n Promote = \"promote\",\n Claim = \"claim\",\n Buy = \"buy\",\n\n // Layer 2\n Stake = \"stake\",\n Unstake = \"unstake\",\n Undelegate = \"undelegate\",\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for transferring tokens.\n */\nexport interface TransferPayload {\n /** Recipient account */\n to: string;\n /** Amount with asset symbol (e.g., \"1.000 HIVE\", \"5.000 HBD\") */\n amount: string;\n /** Transfer memo */\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring tokens.\n *\n * This mutation broadcasts a transfer operation to send HIVE or HBD\n * to another account. **Requires ACTIVE authority**.\n *\n * Uses `useBroadcastMutation` with the smart auth strategy:\n * - Adapter determines login type and dispatches to appropriate method\n * - If active key not available (common on web), triggers `showAuthUpgradeUI`\n * - Supports keychain, hivesigner, hiveauth, and direct key signing\n *\n * @param username - The username sending the transfer (required for broadcast)\n * @param auth - Authentication context with platform adapter\n *\n * @returns React Query mutation result\n */\nexport function useTransfer(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer\"],\n username,\n (payload) => [\n buildTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildPointTransferOp } from \"@/modules/operations/builders\";\n\nexport interface TransferPointPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring Ecency points.\n *\n * Uses `ecency_point_transfer` custom_json operation with ACTIVE authority.\n */\nexport function useTransferPoint(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-point\"],\n username,\n (payload) => [\n buildPointTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildDelegateVestingSharesOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for delegating Hive Power (vesting shares).\n */\nexport interface DelegateVestingSharesPayload {\n /** Account receiving HP delegation */\n delegatee: string;\n /** Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\"). Use \"0.000000 VESTS\" to remove delegation. */\n vestingShares: string;\n}\n\n/**\n * React Query mutation hook for delegating Hive Power (HP).\n *\n * This mutation broadcasts a delegate_vesting_shares operation to delegate HP\n * to another account. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username delegating HP (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Delegation operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Delegation Mechanics:**\n * - Delegated HP can be used by the delegatee for resource credits\n * - Delegatee CANNOT power down or transfer the delegated HP\n * - Delegation can be removed by setting vestingShares to \"0.000000 VESTS\"\n * - Removing delegation has a 5-day cooldown before HP returns to delegator\n *\n * **Post-Broadcast Actions:**\n * - Invalidates delegations list cache to show updated delegation\n * - Invalidates account data for both delegator and delegatee\n *\n * @example\n * ```typescript\n * const delegateMutation = useDelegateVestingShares(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Delegate HP\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '1000.000000 VESTS'\n * });\n *\n * // Remove delegation\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '0.000000 VESTS'\n * });\n * ```\n */\nexport function useDelegateVestingShares(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-vesting-shares\"],\n username,\n (payload) => [\n buildDelegateVestingSharesOp(\n username!,\n payload.delegatee,\n payload.vestingShares\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.delegatee),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildSetWithdrawVestingRouteOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for setting withdraw vesting route.\n */\nexport interface SetWithdrawVestingRoutePayload {\n /** Account receiving withdrawn vesting */\n toAccount: string;\n /** Percentage to route (0-10000, where 10000 = 100%). Already scaled. */\n percent: number;\n /** Auto convert to vesting (power up) */\n autoVest: boolean;\n}\n\n/**\n * React Query mutation hook for setting withdraw vesting route.\n *\n * This mutation broadcasts a set_withdraw_vesting_route operation to configure\n * where withdrawn VESTS (power down) are sent. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username setting withdraw route (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Withdraw route operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Withdraw Route Mechanics:**\n * - Routes a percentage of power down (withdraw_vesting) to another account\n * - Percent must be between 0-10000 (where 10000 = 100%)\n * - Multiple routes can be set, total cannot exceed 100%\n * - autoVest=true converts withdrawn VESTS to HP in destination account\n * - autoVest=false converts withdrawn VESTS to liquid HIVE\n *\n * **Post-Broadcast Actions:**\n * - Invalidates withdraw routes cache to show updated routes\n * - Invalidates account data for both accounts\n *\n * @example\n * ```typescript\n * const setRouteMutation = useSetWithdrawVestingRoute(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Route 50% of power down to another account (auto vest)\n * setRouteMutation.mutate({\n * toAccount: 'alice',\n * percent: 5000, // 50% (already scaled)\n * autoVest: true\n * });\n *\n * // Route 100% of power down to another account (liquid HIVE)\n * setRouteMutation.mutate({\n * toAccount: 'bob',\n * percent: 10000, // 100% (already scaled)\n * autoVest: false\n * });\n * ```\n */\nexport function useSetWithdrawVestingRoute(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"set-withdraw-vesting-route\"],\n username,\n (payload) => [\n buildSetWithdrawVestingRouteOp(\n username!,\n payload.toAccount,\n payload.percent,\n payload.autoVest\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.wallet.withdrawRoutes(username!),\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.toAccount)\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface TransferEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n memo: string;\n}\n\nexport function useTransferEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"transfer\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n memo: payload.memo\n }\n });\n return [[\"custom_json\", {\n required_auths: [username!],\n required_posting_auths: [],\n id: \"ssc-mainnet-hive\",\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\nexport function useTransferToSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-savings\"],\n username,\n (payload) => [\n buildTransferToSavingsOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferFromSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferFromSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useTransferFromSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-from-savings\"],\n username,\n (payload) => [\n buildTransferFromSavingsOp(username!, payload.to, payload.amount, payload.memo, payload.requestId)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToVestingOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToVestingPayload {\n to: string;\n amount: string;\n}\n\nexport function useTransferToVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-vesting\"],\n username,\n (payload) => [\n buildTransferToVestingOp(username!, payload.to, payload.amount)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildWithdrawVestingOp } from \"@/modules/operations/builders\";\n\nexport interface WithdrawVestingPayload {\n vestingShares: string;\n}\n\nexport function useWithdrawVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"withdraw-vesting\"],\n username,\n (payload) => [\n buildWithdrawVestingOp(username!, payload.vestingShares)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildConvertOp, buildCollateralizedConvertOp } from \"@/modules/operations/builders\";\n\nexport interface ConvertPayload {\n amount: string;\n requestId: number;\n collateralized?: boolean;\n}\n\nexport function useConvert(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"convert\"],\n username,\n (payload) => [\n payload.collateralized\n ? buildCollateralizedConvertOp(username!, payload.amount, payload.requestId)\n : buildConvertOp(username!, payload.amount, payload.requestId)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimInterestOps } from \"@/modules/operations/builders\";\n\nexport interface ClaimInterestPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useClaimInterest(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-interest\"],\n username,\n (payload) => buildClaimInterestOps(username!, payload.to, payload.amount, payload.memo, payload.requestId),\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimRewardBalanceOp } from \"@/modules/operations/builders\";\n\nexport interface ClaimRewardsPayload {\n rewardHive: string;\n rewardHbd: string;\n rewardVests: string;\n}\n\nconst CLAIM_REWARDS_INVALIDATION_DELAY_MS = 5000;\nconst pendingInvalidationTimers = new Map>();\n\nexport function useClaimRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-rewards\"],\n username,\n (payload) => [\n buildClaimRewardBalanceOp(username!, payload.rewardHive, payload.rewardHbd, payload.rewardVests)\n ],\n () => {\n const timerKey = username ?? \"__anonymous__\";\n const keysToInvalidate = [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n QueryKeys.assets.hiveGeneralInfo(username!),\n QueryKeys.assets.hbdGeneralInfo(username!),\n QueryKeys.assets.hivePowerGeneralInfo(username!),\n ];\n\n // Delay invalidation to allow blockchain to propagate the transaction.\n // Immediate invalidation would fetch stale (pre-confirmation) data.\n const existingTimer = pendingInvalidationTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n pendingInvalidationTimers.delete(timerKey);\n }\n\n const timer = setTimeout(async () => {\n try {\n const qc = getQueryClient();\n const results = await Promise.allSettled(\n keysToInvalidate.map((key) => qc.invalidateQueries({ queryKey: key }))\n );\n const rejected = results.filter((result) => result.status === \"rejected\");\n if (rejected.length > 0) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation rejected\", {\n username,\n rejectedCount: rejected.length,\n rejected\n });\n }\n } catch (error) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation failed\", {\n username,\n error\n });\n } finally {\n pendingInvalidationTimers.delete(timerKey);\n }\n }, CLAIM_REWARDS_INVALIDATION_DELAY_MS);\n\n pendingInvalidationTimers.set(timerKey, timer);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface DelegateEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useDelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"delegate\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UndelegateEngineTokenPayload {\n from: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUndelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"undelegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"undelegate\",\n contractPayload: {\n symbol: payload.symbol,\n from: payload.from,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface StakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useStakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"stake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"stake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UnstakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUnstakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"unstake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"unstake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface ClaimEngineRewardsPayload {\n tokens: string[];\n}\n\nexport function useClaimEngineRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-engine-rewards\"],\n username,\n (payload) => {\n const json = JSON.stringify(payload.tokens.map((symbol) => ({ symbol })));\n return [[\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [username!],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface EngineMarketOrderPayload {\n action: \"buy\" | \"sell\" | \"cancel\";\n symbol: string;\n quantity?: string;\n price?: string;\n orderId?: string;\n orderType?: \"buy\" | \"sell\";\n}\n\nexport function useEngineMarketOrder(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"engine-market-order\"],\n username,\n (payload) => {\n let contractPayload: Record;\n let contractAction: string;\n\n if (payload.action === \"cancel\") {\n contractAction = \"cancel\";\n contractPayload = {\n type: payload.orderType!,\n id: payload.orderId!,\n };\n } else {\n contractAction = payload.action;\n contractPayload = {\n symbol: payload.symbol,\n quantity: payload.quantity!,\n price: payload.price!,\n };\n }\n\n const json = JSON.stringify({\n contractName: \"market\",\n contractAction,\n contractPayload,\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport { AssetOperation } from \"../types\";\nimport {\n buildTransferOp,\n buildTransferToSavingsOp,\n buildTransferFromSavingsOp,\n buildTransferToVestingOp,\n buildWithdrawVestingOp,\n buildDelegateVestingSharesOp,\n buildSetWithdrawVestingRouteOp,\n buildConvertOp,\n buildClaimInterestOps,\n buildPointTransferOp,\n buildEngineOp,\n buildEngineClaimOp,\n} from \"@/modules/operations/builders\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface WalletOperationPayload {\n from: string;\n to?: string;\n amount?: string;\n memo?: string;\n request_id?: number;\n from_account?: string;\n to_account?: string;\n percent?: number;\n auto_vest?: boolean;\n mode?: string;\n [key: string]: unknown;\n}\n\nfunction buildHiveOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\", memo = \"\" } = payload;\n const requestId = payload.request_id ?? (Date.now() >>> 0);\n\n switch (asset) {\n case \"HIVE\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.PowerUp:\n return [buildTransferToVestingOp(from, to, amount)];\n }\n break;\n\n case \"HBD\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.ClaimInterest:\n return buildClaimInterestOps(from, to, amount, memo, requestId);\n case AssetOperation.Convert:\n return [buildConvertOp(from, amount, Math.floor(Date.now() / 1000))];\n }\n break;\n\n case \"HP\":\n switch (operation) {\n case AssetOperation.PowerDown:\n return [buildWithdrawVestingOp(from, amount)];\n case AssetOperation.Delegate:\n return [buildDelegateVestingSharesOp(from, to, amount)];\n case AssetOperation.WithdrawRoutes:\n return [buildSetWithdrawVestingRouteOp(\n payload.from_account ?? from,\n payload.to_account ?? to,\n payload.percent ?? 0,\n payload.auto_vest ?? false\n )];\n }\n break;\n\n case \"POINTS\":\n if (operation === AssetOperation.Transfer || operation === AssetOperation.Gift) {\n return [buildPointTransferOp(from, to, amount, memo)];\n }\n break;\n }\n\n return null;\n}\n\nfunction buildEngineOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\" } = payload;\n const quantity = typeof amount === \"string\" && amount.includes(\" \")\n ? amount.split(\" \")[0]\n : String(amount);\n\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildEngineOp(from, \"transfer\", {\n symbol: asset, to, quantity, memo: payload.memo ?? \"\"\n })];\n case AssetOperation.Stake:\n return [buildEngineOp(from, \"stake\", { symbol: asset, to, quantity })];\n case AssetOperation.Unstake:\n return [buildEngineOp(from, \"unstake\", { symbol: asset, to, quantity })];\n case AssetOperation.Delegate:\n return [buildEngineOp(from, \"delegate\", { symbol: asset, to, quantity })];\n case AssetOperation.Undelegate:\n return [buildEngineOp(from, \"undelegate\", { symbol: asset, from: to, quantity })];\n case AssetOperation.Claim:\n return [buildEngineClaimOp(from, [asset])];\n }\n\n return null;\n}\n\n/**\n * Determines authority level for a wallet operation.\n * Engine token claims use posting authority; everything else uses active.\n */\nfunction getWalletOperationAuthority(operation: AssetOperation): AuthorityLevel {\n if (operation === AssetOperation.Claim) {\n return 'posting';\n }\n return 'active';\n}\n\n/**\n * Meta-mutation hook that dispatches wallet operations based on asset and operation type.\n *\n * Supports HIVE, HBD, HP, POINTS, and Hive Engine tokens.\n * Uses `useBroadcastMutation` for unified auth handling via `AuthContextV2`.\n *\n * @param username - The Hive account performing the operation\n * @param asset - The asset symbol (e.g., \"HIVE\", \"HBD\", \"HP\", \"POINTS\", or engine token)\n * @param operation - The operation type from AssetOperation enum\n * @param auth - Auth context for broadcasting\n */\nexport function useWalletOperation(\n username: string | undefined,\n asset: string,\n operation: AssetOperation,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n operation as any\n );\n\n return useBroadcastMutation(\n [\"ecency-wallets\", asset, operation],\n username,\n (payload) => {\n // Try native Hive + POINTS operations\n const hiveOps = buildHiveOperations(asset, operation, payload);\n if (hiveOps) return hiveOps;\n\n // Try engine token operations\n const engineOps = buildEngineOperations(asset, operation, payload);\n if (engineOps) return engineOps;\n\n throw new Error(`[SDK][Wallet] – no operation builder for asset=\"${asset}\" operation=\"${operation}\"`);\n },\n () => {\n recordActivity();\n\n const keysToInvalidate: (string | undefined)[][] = [];\n\n // Invalidate asset-specific queries (prefix-matches all currency variants)\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, asset]);\n\n if (asset === \"HIVE\") {\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, \"HP\"]);\n }\n\n // Invalidate portfolio (prefix-matches all currency/filter variants)\n keysToInvalidate.push([\"wallet\", \"portfolio\", \"v2\", username]);\n\n // Delay invalidation to allow blockchain to process\n setTimeout(() => {\n keysToInvalidate.forEach((key) => {\n getQueryClient().invalidateQueries({ queryKey: key });\n });\n }, 5000);\n },\n auth,\n getWalletOperationAuthority(operation),\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDelegateRcOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface DelegateRcPayload {\n to: string;\n maxRc: string | number;\n}\n\nexport function useDelegateRc(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-rc\"],\n username,\n ({ to, maxRc }) => [\n buildDelegateRcOp(username!, to, maxRc)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n QueryKeys.resourceCredits.account(username!),\n QueryKeys.resourceCredits.account(variables.to),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting for a witness.\n */\nexport interface WitnessVotePayload {\n /** Witness account name to vote for/against */\n witness: string;\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting for a Hive witness.\n *\n * This mutation broadcasts an account_witness_vote operation to vote for\n * or remove a vote from a witness.\n *\n * @param username - The username voting for the witness (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account data cache to show updated witness votes\n * - Invalidates witness votes cache\n *\n * **Vote Types:**\n * - approve: true - Vote for the witness\n * - approve: false - Remove your vote from the witness\n *\n * **Authority Required:**\n * - Active authority is required for witness voting\n *\n * @example\n * ```typescript\n * const witnessVoteMutation = useWitnessVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Vote for a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: true\n * });\n *\n * // Remove vote from a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: false\n * });\n * ```\n */\nexport function useWitnessVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"vote\"],\n username,\n ({ witness, approve }) => [\n buildWitnessVoteOp(username!, witness, approve)\n ],\n async () => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.votes(username)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useWitnessVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for witness votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessProxyOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface WitnessProxyPayload {\n proxy: string;\n}\n\nexport function useWitnessProxy(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"proxy\"],\n username,\n ({ proxy }) => [\n buildWitnessProxyOp(username!, proxy)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.proxy(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Witness, WitnessVotersResponse } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\n\ntype WitnessPage = Witness[];\ntype WitnessCursor = number;\n\ninterface HafbeWitness {\n witness_name: string;\n rank: number;\n url: string;\n vests: string;\n votes_daily_change: string;\n voters_num: number;\n voters_num_daily_change: number;\n price_feed: number;\n bias: number;\n feed_updated_at: string;\n block_size: number;\n signing_key: string;\n version: string;\n missed_blocks: number;\n hbd_interest_rate: number;\n last_confirmed_block_num: number;\n account_creation_fee: number;\n}\n\ninterface HafbeWitnessesResponse {\n total_witnesses: number;\n total_pages: number;\n witnesses: HafbeWitness[];\n}\n\n/**\n * Map a hafbe-api witness to the SDK Witness shape so existing consumers\n * (e.g. the web app's transform()) keep working unchanged.\n */\nfunction mapRestWitness(w: HafbeWitness): Witness {\n return {\n owner: w.witness_name,\n total_missed: w.missed_blocks,\n url: w.url,\n props: {\n account_creation_fee: `${(w.account_creation_fee / 1000).toFixed(3)} HIVE`,\n account_subsidy_budget: 0,\n maximum_block_size: w.block_size,\n },\n hbd_exchange_rate: {\n base: `${w.price_feed.toFixed(3)} HBD`,\n },\n available_witness_account_subsidies: 0,\n running_version: w.version,\n signing_key: w.signing_key,\n last_hbd_exchange_update: w.feed_updated_at,\n rank: w.rank,\n vests: w.vests,\n voters_num: w.voters_num,\n voters_num_daily_change: w.voters_num_daily_change,\n price_feed: w.price_feed,\n hbd_interest_rate: w.hbd_interest_rate,\n last_confirmed_block_num: w.last_confirmed_block_num,\n };\n}\n\n/**\n * Get witnesses ordered by vote count (infinite scroll).\n * Uses the hafbe-api REST endpoint - replaces multi-call RPC assembly\n * with a single paginated call. Includes voter count, rank, and other\n * data that was previously unavailable.\n *\n * @param limit - Number of witnesses per page\n */\nexport function getWitnessesInfiniteQueryOptions(limit: number) {\n return infiniteQueryOptions<\n WitnessPage,\n Error,\n InfiniteData,\n (string | number)[],\n WitnessCursor\n >({\n queryKey: QueryKeys.witnesses.list(limit),\n initialPageParam: 1 as WitnessCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WitnessCursor }) => {\n const response = (await callREST(\n \"hafbe\",\n \"/witnesses\",\n {\n \"page-size\": limit,\n page: pageParam,\n }\n )) as HafbeWitnessesResponse;\n\n return response.witnesses.map(mapRestWitness);\n },\n\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n lastPage.length === limit ? lastPageParam + 1 : undefined,\n });\n}\n\nexport type WitnessVoterSortField =\n | \"vests\"\n | \"account_vests\"\n | \"proxied_vests\"\n | \"account_name\"\n | \"timestamp\";\n\nexport type WitnessVoterSortDirection = \"asc\" | \"desc\";\n\n/**\n * Get a single page of voters for a specific witness.\n *\n * Server-side pagination + sort: each page click fetches that page directly\n * from hafbe rather than scrolling through accumulated pages on the client.\n *\n * @param witness - Witness account name\n * @param page - 1-based page index\n * @param pageSize - Number of voters per page\n * @param sort - Field to sort by\n * @param direction - asc or desc\n */\nexport function getWitnessVotersPageQueryOptions(\n witness: string,\n page: number,\n pageSize: number,\n sort: WitnessVoterSortField = \"vests\",\n direction: WitnessVoterSortDirection = \"desc\"\n) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voters(witness, page, pageSize, sort, direction),\n queryFn: async ({ signal }) => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters\",\n {\n \"witness-name\": witness,\n \"page-size\": pageSize,\n page,\n sort,\n direction,\n },\n undefined,\n undefined,\n signal\n )) as WitnessVotersResponse;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n\n/**\n * Get total voter count for a witness.\n *\n * @param witness - Witness account name\n */\nexport function getWitnessVoterCountQueryOptions(witness: string) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voterCount(witness),\n queryFn: async () => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters/count\",\n { \"witness-name\": witness }\n )) as number;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n","export enum PointTransactionType {\n CHECKIN = 10,\n LOGIN = 20,\n CHECKIN_EXTRA = 30,\n POST = 100,\n COMMENT = 110,\n VOTE = 120,\n REBLOG = 130,\n DELEGATION = 150,\n REFERRAL = 160,\n COMMUNITY = 170,\n TRANSFER_SENT = 998,\n TRANSFER_INCOMING = 999,\n MINTED = 991,\n /**\n * Points burned out of supply rather than moved to the treasury. Written by the\n * AI surfaces (assist, image, transcribe), which pay a real per-request vendor\n * bill, so the Points are consumed rather than parked.\n *\n * The row carries no counterparty at all, which is what distinguishes it from\n * TRANSFER_SENT: `sender` and `receiver` are both null. A refund of a burn comes\n * back as this same type with a positive amount, so read the sign rather than\n * assuming a burn is always a debit.\n */\n BURNED = 997,\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPointsQueryOptions } from \"../queries\";\nimport type { Points } from \"../types\";\n\n/**\n * POST a points claim and return the parsed JSON body.\n *\n * The endpoint normally answers with JSON, but an edge/proxy layer can\n * occasionally return a 2xx whose body is an HTML interstitial or plain text\n * (ECENCY-NEXT-1FCJ). Calling `response.json()` on that throws a bare\n * `SyntaxError` that names neither the endpoint nor the cause. Instead we check\n * the content type first and fail with a STABLE, low-cardinality message\n * (content type + status) — never the raw body — so these group as a single\n * Sentry issue instead of fragmenting on every distinct HTML page.\n */\nexport async function claimPointsRequest(\n username: string | undefined,\n accessToken: string | undefined\n) {\n if (!username) {\n throw new Error(\"[SDK][Points][Claim] – username wasn't provided\");\n }\n\n if (!accessToken) {\n throw new Error(\"[SDK][Points][Claim] – access token wasn't found\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/points-claim\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n }\n );\n\n // Media types are case-insensitive; normalise once and reuse in every branch.\n const contentType = (response.headers.get(\"content-type\") ?? \"\")\n .split(\";\")[0]\n .trim()\n .toLowerCase();\n const body = await response.text();\n\n if (!response.ok) {\n if (response.status === 406) {\n try {\n return JSON.parse(body);\n } catch {\n return { message: body, code: response.status };\n }\n }\n // Only fold a short JSON error body into the message; an HTML gateway page\n // (e.g. 502/503) would otherwise fragment the Sentry group per distinct\n // page — the same problem the non-JSON guard below avoids for a 2xx body.\n const detail =\n body && contentType.includes(\"json\") ? `: ${body.slice(0, 200)}` : \"\";\n throw new Error(\n `[SDK][Points][Claim] – failed with status ${response.status}${detail}`\n );\n }\n\n if (!contentType.includes(\"json\")) {\n throw new Error(\n `[SDK][Points][Claim] – expected JSON but received \"${contentType || \"empty\"}\" response (status ${response.status})`\n );\n }\n\n try {\n return JSON.parse(body);\n } catch {\n throw new Error(\n `[SDK][Points][Claim] – malformed JSON response (status ${response.status})`\n );\n }\n}\n\nexport function useClaimPoints(\n username: string | undefined,\n accessToken: string | undefined,\n onSuccess?: () => void,\n onError?: Parameters[\"0\"][\"onError\"]\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n \"points-claimed\"\n );\n\n return useMutation({\n mutationFn: () => claimPointsRequest(username, accessToken),\n onError,\n onSuccess: () => {\n recordActivity();\n\n getQueryClient().setQueryData(\n getPointsQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n return {\n ...data,\n points: (\n parseFloat(data.points) + parseFloat(data.uPoints)\n ).toFixed(3),\n uPoints: \"0\",\n };\n }\n );\n\n onSuccess?.();\n },\n });\n}\n","// A token only counts at the start of the query or after whitespace, matching\n// the search API's parser. Unanchored, these matched inside ordinary words:\n// \"prototype:v2\" read as type=v2 and the API rejected it as an invalid type,\n// \"subcategory:hive-1\" filtered on category=hive-1 with a stray \"sub\" left as\n// required text. The boundary is captured rather than looked behind so it can\n// be put back when the token is stripped, keeping the neighbouring words apart\n// (a lookbehind would also be fine here, but this stays portable).\nconst author_re = /(^|\\s)author:([^\\s]+)/g;\nconst type_re = /(^|\\s)type:([^\\s]+)/g;\nconst category_re = /(^|\\s)category:([^\\s]+)/g;\nconst tag_re = /(^|\\s)tag:([^\\s]+)/g;\n\n// Index of the token value in a match; group 1 is the boundary.\nconst VALUE = 2;\n\nexport enum SearchType {\n ALL = \"\",\n POST = \"post\",\n COMMENT = \"comment\"\n}\n\nexport const MAX_SEARCH_TAGS = 5;\n\n// The search API applies both caps itself (see query_validator); mirrored here\n// so the client can refuse instead of turning a 400 into an empty result list.\nexport const MAX_SEARCH_QUERY_LENGTH = 100;\n\n/**\n * Both parsers match a token with /author:([^\\s]+)/, so a value containing a\n * space stops filtering at the space and the remainder silently becomes\n * required free text. Keep the first word only, which is what the API would\n * have filtered on anyway.\n */\nfunction firstToken(value: string): string {\n return value.trim().split(/\\s+/)[0] ?? \"\";\n}\n\n/**\n * Hive account names are lowercase and the API filters authors with an exact\n * term query, so \"@Demo\" has to become \"demo\" or it matches nothing.\n */\nexport function normalizeSearchAuthor(value: string): string {\n return firstToken(value).replace(/^@+/, \"\").toLowerCase();\n}\n\nexport function normalizeSearchCategory(value: string): string {\n // Leading \"#\" goes for the same reason it goes on tags: a category is matched\n // by an exact term query, and users write categories the way they write tags.\n return firstToken(value).replace(/^#+/, \"\").toLowerCase();\n}\n\n/**\n * Accepts what a user actually types (\"travel, photography\", \"#travel travel\")\n * and returns exact-match ready tags, deduped in first-seen order.\n */\nexport function normalizeSearchTags(value: string): string[] {\n const seen = new Set();\n\n return value\n .split(/[\\s,]+/)\n .map((tag) => tag.replace(/^#+/, \"\").toLowerCase())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n}\n\nexport interface SearchQueryParts {\n search?: string;\n author?: string;\n type?: SearchType;\n category?: string;\n /** Raw user input (\"a, b\") or an already split list. */\n tags?: string | string[];\n}\n\nexport interface BuiltSearchQuery {\n /** The `q` value to put in the URL. Round-trips through `SearchQuery`. */\n q: string;\n search: string;\n author: string;\n type: SearchType;\n category: string;\n tags: string[];\n}\n\n/**\n * Assembles the single `q` string that both this app and the search API parse\n * back into filters. Returns the normalized parts too, because the caller has\n * to validate the tag count and the total length before navigating.\n */\nexport function buildSearchQuery({\n search = \"\",\n author = \"\",\n type = SearchType.ALL,\n category = \"\",\n tags = []\n}: SearchQueryParts): BuiltSearchQuery {\n const normalizedSearch = search.trim().replace(/\\s+/g, \" \");\n const normalizedAuthor = normalizeSearchAuthor(author);\n const normalizedCategory = normalizeSearchCategory(category);\n const normalizedTags = normalizeSearchTags(Array.isArray(tags) ? tags.join(\",\") : tags);\n\n const parts = [normalizedSearch];\n\n if (normalizedAuthor) {\n parts.push(`author:${normalizedAuthor}`);\n }\n\n if (type) {\n parts.push(`type:${type}`);\n }\n\n if (normalizedCategory) {\n parts.push(`category:${normalizedCategory}`);\n }\n\n if (normalizedTags.length > 0) {\n // No space after the commas: a tag token ends at the first space, so\n // anything past one stops filtering and becomes required free text.\n parts.push(`tag:${normalizedTags.join(\",\")}`);\n }\n\n return {\n // Dropping the empty free text here is what keeps a filter-only query from\n // starting with a space.\n q: parts.filter((part) => part !== \"\").join(\" \"),\n search: normalizedSearch,\n author: normalizedAuthor,\n type,\n category: normalizedCategory,\n tags: normalizedTags\n };\n}\n\nexport class SearchQuery {\n public query: string = \"\";\n public search: string = \"\";\n public author: string = \"\";\n public type: SearchType = SearchType.ALL;\n public category: string = \"\";\n public tags: string[] = [];\n\n constructor(_query: string) {\n this.query = _query;\n this.search = _query;\n\n this.grabAuthor();\n this.grabType();\n this.grabCategory();\n this.grabTags();\n this.grabSearch();\n }\n\n private grab = (re: RegExp): string => {\n // @ts-ignore\n const matches = [...this.query.matchAll(re)];\n if (matches.length > 0) {\n return matches[0][VALUE].trim();\n }\n\n return \"\";\n };\n\n private grabAuthor = () => {\n this.author = this.grab(author_re);\n };\n\n private grabType = () => {\n const type = this.grab(type_re) as SearchType;\n if (Object.values(SearchType).includes(type)) {\n this.type = type as SearchType;\n }\n };\n\n private grabCategory = () => {\n this.category = this.grab(category_re);\n };\n\n private grabTags = () => {\n // Every tag: token counts, not just the first one. The API joins all of its\n // own tag: matches before splitting on commas, so reading only the first\n // token here under-reports the tags a query really applies and let a query\n // past the MAX_SEARCH_TAGS guard that the API then rejects with a 400.\n // A trailing comma (\"tag:a,\") must not yield an empty tag either - it would\n // be shown back as a phantom tag and counted against the same cap.\n const seen = new Set();\n\n this.tags = [...this.query.matchAll(tag_re)]\n .flatMap((match) => match[VALUE].split(\",\"))\n .map((tag) => tag.trim())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n };\n\n private grabSearch = () => {\n [author_re, type_re, category_re, tag_re].forEach((r) => {\n // Put the captured boundary back, or removing a mid-query token would\n // run the words either side of it together.\n this.search = this.search.replace(r, \"$1\");\n });\n\n while (this.search.indexOf(\" \") !== -1) {\n this.search = this.search.replace(\" \", \" \");\n }\n\n this.search = this.search.trim();\n };\n}\n","export type RequestError = Error & { status?: number; data?: unknown };\n\n/**\n * Reads a response body and, when the status is not OK, throws an error that\n * keeps both the status and the parsed body.\n *\n * The search backend answers a malformed query with an explanation the user can\n * act on (\"Maximum 5 tags!\", \"Query string too long! ...\", \"Parsed query is\n * empty!\"). Dropping the body leaves callers with a bare status: they can\n * neither tell the user what to change nor tell a deterministic rejection from\n * a transient failure worth retrying.\n *\n * Module-internal on purpose - it is not part of the published SDK surface.\n */\nexport async function parseJsonResponse(\n response: Response,\n /**\n * Shape guard for a SUCCESSFUL body. JSON.parse happily accepts `null`,\n * `\"maintenance\"` and `{\"error\": \"...\"}`, none of which are the payload the\n * caller asked for, and all of which would otherwise be returned as `T` and\n * cached as valid data. Callers that have a known shape pass a guard so an\n * unexpected 200 fails here instead of at the first property access.\n */\n isValid?: (data: unknown) => boolean\n): Promise {\n const parseBody = async (): Promise => {\n // Read the body ONCE. Calling json() and then falling back to text() on the\n // same response cannot work: json() consumes the stream, so the fallback\n // always threw and the raw body of a non-JSON failure (an HTML error page\n // from a proxy) was silently lost.\n let raw: string;\n try {\n raw = await response.text();\n } catch {\n return undefined;\n }\n\n if (raw === \"\") {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n // Raw text is a diagnostic, not a payload. On a failed response it is\n // what the caller shows or logs, but on a 2xx returning it would hand\n // back a string typed as the parsed body: callers reading `.results`\n // would see undefined and report an empty result set, and the\n // controversial/rising pager would throw on `resp.results.length`. An\n // unparseable success is a failure, so let it fall through to the throw\n // below rather than caching a string as a SearchResponse.\n return response.ok ? undefined : raw;\n }\n };\n\n const data = await parseBody();\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n if (data === undefined || (isValid !== undefined && !isValid(data))) {\n throw new Error(\"Response body was empty, invalid JSON, or not the expected shape\");\n }\n\n return data as T;\n}\n\n/**\n * The contract every /search-api consumer relies on: an object carrying a\n * `results` array. Enough to keep a stray 200 from reaching `resp.results.length`.\n */\nexport function isSearchResponse(data: unknown): boolean {\n return (\n typeof data === \"object\" &&\n data !== null &&\n Array.isArray((data as { results?: unknown }).results)\n );\n}\n","import { isServer } from \"@tanstack/react-query\";\nimport type { RequestError } from \"./parse-json-response\";\n\n/**\n * The app-wide default the browser QueryClient uses. Restated because supplying\n * a `retry` callback replaces React Query's own budget rather than adding to it.\n *\n * The 0 on the server is load-bearing: server QueryClients set `retry: false`\n * globally, and these queries are prefetched during SSR, so a flat 3 would\n * resurrect SSR retries against a single-region backend.\n */\nconst MAX_RETRIES = isServer ? 0 : 3;\n\n/**\n * Shared retry rule for every /search-api call.\n *\n * A 4xx is the backend rejecting the query itself (too many tags, over the\n * length cap, nothing left to search once the filters are parsed out).\n * Repeating it repeats the same answer, so the only effect is four requests\n * over several seconds before the UI can say what to change.\n *\n * 408 and 429 are the exceptions: they describe when the request arrived rather\n * than what it contained, and backing off is what resolves them. A client-side\n * timeout aborts the fetch and carries no status at all, so it falls through to\n * the normal budget like any other transport failure.\n */\nexport function searchRetryPolicy(failureCount: number, error: Error): boolean {\n const { status } = error as RequestError;\n const isTransient = status === 408 || status === 429;\n\n if (status !== undefined && status >= 400 && status < 500 && !isTransient) {\n return false;\n }\n\n return failureCount < MAX_RETRIES;\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function searchQueryOptions(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number\n) {\n return queryOptions({\n queryKey: QueryKeys.search.results(q, sort, hideLow, since, scroll_id, votes),\n queryFn: async ({ signal }) => {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (scroll_id) data.scroll_id = scroll_id;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n retry: searchRetryPolicy,\n });\n}\n\ntype PageParam = {\n sid: string | undefined;\n hasNextPage: boolean;\n};\n\nexport function getControversialRisingInfiniteQueryOptions(\n what: string,\n tag: string,\n enabled = true\n) {\n return infiniteQueryOptions<\n SearchResponse,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.search.controversialRising(what, tag),\n initialPageParam: { sid: undefined, hasNextPage: true } as PageParam,\n\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n if (!pageParam.hasNextPage) {\n return {\n hits: 0,\n took: 0,\n results: [],\n };\n }\n\n let sinceDate: Date | undefined;\n const now = new Date();\n\n switch (tag) {\n case \"today\":\n sinceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case \"week\":\n sinceDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case \"month\":\n sinceDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case \"year\":\n sinceDate = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);\n break;\n default:\n sinceDate = undefined;\n }\n\n const q = \"* type:post\";\n const sort = what === \"rising\" ? \"children\" : what;\n const since = sinceDate ? sinceDate.toISOString().split(\".\")[0] : undefined;\n const hideLow = \"0\";\n const votes = tag === \"today\" ? 50 : 200;\n\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (pageParam.sid) data.scroll_id = pageParam.sid;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n\n getNextPageParam: (resp: SearchResponse): PageParam => {\n return {\n sid: resp?.scroll_id,\n hasNextPage: resp.results.length > 0,\n };\n },\n\n enabled,\n retry: searchRetryPolicy,\n });\n}\n","import { CONFIG, INTERNAL_API_TIMEOUT_MS, getBoundFetch, withTimeoutSignal } from \"@/modules/core\";\nimport { SearchResponse } from \"./types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"./parse-json-response\";\n\nexport async function search(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number,\n signal?: AbortSignal\n): Promise {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) {\n data.since = since;\n }\n if (scroll_id) {\n data.scroll_id = scroll_id;\n }\n if (votes) {\n data.votes = votes;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function similar(\n params: {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n tags?: string[];\n since?: string;\n },\n signal?: AbortSignal,\n timeoutMs: number = INTERNAL_API_TIMEOUT_MS\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/similar\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(params),\n signal: withTimeoutSignal(timeoutMs, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function searchPath(q: string, signal?: AbortSignal): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n const data = await parseJsonResponse(response, Array.isArray);\n return data?.length > 0 ? data : [q];\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { similar } from \"../requests\";\nimport { SearchResult } from \"../types/search-response\";\n\n// Without a recency window the backend ranks across the entire historical\n// index and surfaces years-old posts. Constrain suggestions to the last\n// ~6 months so related posts stay fresh (it also bounds the backend's\n// more_like_this candidate set, which is what keeps it fast).\nconst SIMILAR_ENTRIES_SINCE_MS = 182 * 24 * 60 * 60 * 1000;\n\n// How many results the suggestions strip renders at most.\nconst SIMILAR_ENTRIES_TARGET = 4;\n\n// more_like_this only extracts a handful of significant terms, so an excerpt is\n// enough signal and keeps the request payload small.\nconst SIMILAR_ENTRIES_BODY_LIMIT = 3000;\n\n// On the server the prefetch sits on the entry-page render path, and the search\n// backend is single-region (EU) — so anything slower than this stalls SSR for a\n// non-essential \"related posts\" strip. Keep the SSR cap short and let the strip\n// fall back to a client fetch (only that render misses the in-HTML strip; it's\n// ISR-cached anyway). Do NOT raise this — 2s is the SSR budget.\nconst SIMILAR_ENTRIES_SSR_TIMEOUT_MS = 2000;\n\n// The client fetch doesn't block paint, so it previously had no cap and fell\n// through to the SDK's generic INTERNAL_API_TIMEOUT_MS (10s; CF's worker further\n// truncates at ~8s). Combined with React Query's default client retry (3×), a\n// /search-api/similar outage turned this best-effort strip into a multi-second\n// post-onload tail (observed as a ~29s \"fully loaded\" in GTmetrix). Cap the\n// client call short and disable retry (below) so a degraded backend just hides\n// the strip quickly instead of churning.\nconst SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS = 4000;\n\n// The strip is hidden below this many results. A lone suggestion looks\n// sparse. Exported so the web component shares one threshold (filter == render).\nexport const SIMILAR_ENTRIES_MIN_RENDER = 2;\n\n// Strip markdown image/link/URL noise before truncating, so more_like_this\n// keys on prose terms instead of image-CDN domains and file hashes (which\n// rarely match the index's sanitized body and just waste the term budget).\nfunction toMltExcerpt(body: string, limit: number): string {\n return body\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, \" \") // markdown images\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\") // markdown links -> keep link text\n .replace(/<[^>]+>/g, \" \") // html tags\n .replace(/https?:\\/\\/\\S+/g, \" \") // bare URLs\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, limit);\n}\n\n// Compact deterministic fingerprint (djb2) of the MLT inputs. Folded into the\n// cache key so an edited post (title/tags/body changed) refetches instead of\n// serving stale recommendations under the same author/permlink. Deterministic\n// so the SSR prefetch and the client compute the same key from the same entry.\nfunction fingerprint(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\ninterface Entry {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n json_metadata?: {\n // Hive's json_metadata is user-controlled and untyped on-chain: `tags` is\n // usually a string[] but some posts store it as a bare string (or other\n // junk). Typed as unknown on purpose so callers can't assume an array —\n // it's narrowed with a runtime guard below.\n tags?: unknown;\n };\n}\n\nexport function getSimilarEntriesQueryOptions(entry: Entry) {\n const title = entry.title ?? \"\";\n // `?? []` only guards null/undefined; a non-array tags value (e.g. a bare\n // string from json_metadata) slips through and crashes `.filter` — which\n // took down the entry-page SSR prefetch (Sentry ECENCY-NEXT-1FMA). Guard on\n // Array.isArray so only real arrays reach the filter.\n const rawTags = entry.json_metadata?.tags;\n const tags = (Array.isArray(rawTags) ? rawTags : []).filter(\n (tag): tag is string => typeof tag === \"string\" && tag !== \"\"\n );\n const body = toMltExcerpt(entry.body ?? \"\", SIMILAR_ENTRIES_BODY_LIMIT);\n const contentKey = fingerprint(`${title}|${tags.join(\",\")}|${body}`);\n\n return queryOptions({\n queryKey: QueryKeys.search.similarEntries(entry.author, entry.permlink, contentKey),\n queryFn: async ({ signal }) => {\n // Naive `YYYY-MM-DDTHH:mm:ss` (no `Z`) matches the search-api date\n // contract used elsewhere; a <14h skew on a 182-day boundary is immaterial.\n const since = new Date(Date.now() - SIMILAR_ENTRIES_SINCE_MS).toISOString().slice(0, 19);\n\n // Elasticsearch more_like_this recommendations: content-based \"related\n // posts\" ranked by shared significant terms in title/body/tags, scoped\n // to the recency window. The backend already excludes the source author,\n // spam and nsfw.\n const response = await similar(\n {\n author: entry.author,\n permlink: entry.permlink,\n title,\n body,\n tags,\n since\n },\n signal,\n // Short cap server-side so a slow cross-region call can't stall SSR;\n // a slightly longer (but still bounded) cap client-side so a degraded\n // backend can't hang the request on the SDK's generic 8s timeout.\n typeof window === \"undefined\"\n ? SIMILAR_ENTRIES_SSR_TIMEOUT_MS\n : SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS\n );\n\n // Light client guard mirroring the render contract: never the source\n // post, never nsfw, one per author, capped at the render target.\n const collected: SearchResult[] = [];\n const seenAuthors = new Set();\n for (const r of response.results) {\n if (collected.length >= SIMILAR_ENTRIES_TARGET) break;\n if (r.permlink === entry.permlink) continue;\n if ((r.tags ?? []).indexOf(\"nsfw\") !== -1) continue;\n if (seenAuthors.has(r.author)) continue;\n seenAuthors.add(r.author);\n collected.push(r);\n }\n\n return collected;\n },\n // The entry page server-prefetches this query and dehydrates it. Without a\n // staleTime, React Query treats the hydrated data as stale and refetches on\n // mount — issuing a *redundant* /search-api/similar XHR right after\n // hydration even though SSR already provided the data. That refetch was the\n // long post-onload tail in the waterfall (held open to the client timeout),\n // inflating GTmetrix \"Fully Loaded\" while the visible strip was already\n // populated from SSR. A staleTime makes the hydrated data fresh so the\n // client skips that refetch; if SSR delivered nothing (empty cache), the\n // client still fetches. Recommendations are stable per post (and the cache\n // key is content-fingerprinted), so 5 min matches the page's ISR cadence.\n staleTime: 5 * 60 * 1000,\n // Best-effort suggestions strip — never retry-storm a degraded backend.\n // The web QueryClient only disables retries on the server; the browser\n // client keeps React Query's default retry (3×) — and other SDK consumers\n // (e.g. mobile) may too — so pin retry:false here to cover every caller.\n retry: false\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { getProfiles } from \"@/modules/bridge\";\nimport { Profile } from \"@/modules/accounts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountQueryOptions(q: string, limit = 5) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.account(normalized, limit),\n queryFn: async (): Promise => {\n const usernames = (await callRPC(\"condenser_api.lookup_accounts\", [\n normalized,\n limit,\n ])) as string[];\n\n if (usernames.length === 0) {\n return [];\n }\n\n return getProfiles(usernames);\n },\n enabled: !!normalized,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { TrendingTag } from \"@/modules/posts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchTopicsQueryOptions(q: string, limit = 10) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.topics(normalized, limit),\n queryFn: async (): Promise => {\n const tags = (await callRPC(\"condenser_api.get_trending_tags\", [\n normalized,\n limit + 1,\n ])) as TrendingTag[];\n\n return tags\n .map((t) => t.name)\n .filter((name) => name !== \"\" && !name.startsWith(\"hive-\"))\n .slice(0, limit);\n },\n enabled: !!normalized,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function getSearchApiInfiniteQueryOptions(\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.search.api(q, sort, hideLow, since, votes, includeNsfw),\n queryFn: async ({ pageParam, signal }: { pageParam: string | undefined; signal: AbortSignal }) => {\n interface SearchApiPayload {\n q: string;\n sort: string;\n hide_low: boolean;\n since?: string;\n scroll_id?: string;\n votes?: number;\n include_nsfw?: number;\n }\n\n const payload: SearchApiPayload = { q, sort, hide_low: hideLow };\n\n if (since) {\n payload.since = since;\n }\n if (pageParam) {\n payload.scroll_id = pageParam;\n }\n if (votes !== undefined) {\n payload.votes = votes;\n }\n if (includeNsfw) {\n payload.include_nsfw = 1;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(payload),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body), instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: SearchResponse) => lastPage?.scroll_id,\n enabled: !!q,\n retry: searchRetryPolicy,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\n\nexport function getSearchPathQueryOptions(q: string) {\n return queryOptions({\n queryKey: [\"search\", \"path\", q],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n });\n\n if (!response.ok) {\n throw new Error(`Search path failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data?.length > 0) {\n return data as string[];\n }\n\n return [q];\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { SupportSettings } from \"../types\";\n\n/**\n * Fetch the active user's Support Ecency settings. The username is resolved\n * server-side from the validated `code`, so only the code is sent. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached. Exported for\n * unit testing; the query options below wrap it.\n */\nexport async function getSupportSettingsRequest(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to fetch support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Query options for the active user's Support Ecency settings\n * (beneficiary percent + curation holdback percent). Zeros mean both\n * opt-ins are off; the backend returns zeros when no row exists.\n */\nexport function getSupportSettingsQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n const name = username?.replace(\"@\", \"\");\n\n return queryOptions({\n queryKey: QueryKeys.support.settings(name),\n queryFn: () => {\n if (!code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return getSupportSettingsRequest(code);\n },\n enabled: !!name && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { QueryClient, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { SupportSettings, UpdateSupportSettingsPayload } from \"../types\";\n\n/**\n * POST a Support Ecency settings update. Both percents are integers within\n * 0..100 (0 = off); the gateway rejects anything else with a 400. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached so the caller\n * can surface the plain validation message. Exported for unit testing; the\n * hook below wraps it.\n */\nexport async function updateSupportSettingsRequest(\n code: string,\n payload: UpdateSupportSettingsPayload\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings-update\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n code,\n beneficiary_percent: payload.beneficiary_percent,\n curation_percent: payload.curation_percent,\n }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to update support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Sync the settings cache after a successful update: seed the fresh server\n * response and invalidate so any active observers refetch. Exported for unit\n * testing; `useUpdateSupportSettings` calls it from `onSuccess`.\n */\nexport function applySupportSettingsUpdate(\n queryClient: QueryClient,\n username: string,\n data: SupportSettings\n) {\n queryClient.setQueryData(QueryKeys.support.settings(username), data);\n return queryClient.invalidateQueries({ queryKey: QueryKeys.support.settings(username) });\n}\n\n/**\n * Update the user's voluntary Support Ecency opt-ins (post beneficiary percent\n * and curation holdback percent). On success the settings query is refreshed\n * so every surface (publish dialog, settings card, injection hooks) sees the\n * new preference.\n */\nexport function useUpdateSupportSettings(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"support\", \"settings-update\", name],\n mutationFn: async (payload: UpdateSupportSettingsPayload) => {\n if (!name || !code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return updateSupportSettingsRequest(code, payload);\n },\n onSuccess(data) {\n if (name) {\n applySupportSettingsUpdate(queryClient, name, data);\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getBoostPlusPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boost-plus-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\n/**\n * RC top-up pricing: duration -> Points cost tiers, served by the ePoints\n * backend via the private API. Reuses the {@link PromotePrice} shape\n * ({ duration, price }).\n */\nexport function getRcDelegationPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation prices: ${response.status}`);\n }\n\n return (await response.json()) as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface RcDelegationActive {\n user: string;\n expires: Date;\n}\n\n/**\n * The active (ON) RC top-up for a user, if any. Lets the UI block a duplicate\n * purchase up front (only one RC top-up is allowed at a time). Returns null\n * when the user has no active top-up.\n */\nexport function getRcDelegationActiveQueryOptions(username: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-active\", username],\n queryFn: async (): Promise => {\n if (!accessToken || !username) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-active\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken, username })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation active: ${response.status}`);\n }\n\n const responseData = (await response.json()) as { user?: string; expires?: string };\n\n return responseData && responseData.expires && responseData.user\n ? { user: responseData.user, expires: new Date(responseData.expires) }\n : null;\n },\n enabled: !!username && !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getPromotePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"promote-price\"],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/promote-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch promote prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface BoostPlusAccountPrice {\n account: string;\n expires: Date;\n}\n\nexport function getBoostPlusAccountPricesQueryOptions(account: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-accounts\", account],\n queryFn: async (): Promise => {\n if (!accessToken || !account) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boosted-plus-account\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken, account }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus account prices: ${response.status}`);\n }\n\n const responseData = await response.json() as {\n expires: string;\n account: string;\n };\n\n return responseData\n ? {\n account: responseData.account,\n expires: new Date(responseData.expires)\n }\n : null;\n },\n enabled: !!account && !!accessToken\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildBoostPlusOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface BoostPlusPayload {\n account: string;\n duration: number;\n}\n\nexport function useBoostPlus(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"boost-plus\"],\n username,\n ({ account, duration }) => [\n buildBoostPlusOp(username!, account, duration)\n ],\n async (_data, { account }) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.promotions.boostPlusAccounts(account),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildRcDelegationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface RcDelegationPayload {\n duration: number;\n}\n\n/**\n * Buys a short-term, RC-only delegation (RC top-up) for the active user, paid\n * with Ecency Points. Mirrors {@link useBoostPlus} but is RC-only (no Hive\n * Power / voting power transferred). Invalidates the user's account + RC caches\n * so the new RC shows up once the relay delegation lands.\n */\nexport function useRcDelegation(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"rc-delegation\"],\n username,\n ({ duration }) => [buildRcDelegationOp(username!, duration)],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!),\n [\"promotions\", \"rc-delegation-active\", username]\n ]);\n }\n },\n auth,\n \"active\",\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { HsTokenRenewResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nexport async function hsTokenRenew(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/auth-api/hs-token-refresh\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n const error = new Error(`Failed to refresh token: ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n const data = (await response.json()) as HsTokenRenewResponse;\n return data;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"../../core\";\n\nconst BAD_ACTORS_URL =\n \"https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt\";\n\nexport function getBadActorsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.badActors.list(),\n queryFn: async ({ signal }) => {\n const response = await fetch(BAD_ACTORS_URL, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bad actors list: ${response.status}`);\n }\n\n const text = await response.text();\n return new Set(text.split(\"\\n\").filter(Boolean));\n },\n staleTime: 24 * 60 * 60 * 1000,\n /**\n * Deliberately left unbounded, including under SSR.\n *\n * `Infinity` is the one value that schedules no gc timer at all —\n * `isValidTimeout` in query-core rejects non-finite timeouts, so\n * `scheduleGc` is a no-op. With no timer there is no GC root, and on a\n * per-request client the entry dies with the request that made it.\n * Replacing it with a finite window would *create* a timer that retains the\n * Query and, through it, that request's whole QueryCache — strictly worse\n * here than leaving it alone.\n */\n gcTime: Infinity\n });\n}\n","export const POLLS_PROTOCOL_VERSION = 1.1;\n\nexport enum PollPreferredInterpretation {\n NUMBER_OF_VOTES = \"number_of_votes\",\n TOKENS = \"tokens\",\n}\n\nexport interface PollChoiceVotes {\n total_votes: number;\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied: number | null;\n}\n\nexport interface PollChoice {\n choice_num: number;\n choice_text: string;\n votes?: PollChoiceVotes;\n}\n\nexport interface PollVoter {\n name: string;\n choices: number[];\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied?: number;\n}\n\nexport interface PollStats {\n total_voting_accounts_num: number;\n total_hive_hp?: number;\n total_hive_proxied_hp?: number;\n total_hive_hp_incl_proxied: number | null;\n}\n\nexport interface Poll {\n author: string;\n permlink: string;\n question: string;\n poll_choices: PollChoice[];\n poll_voters?: PollVoter[];\n poll_stats?: PollStats;\n poll_trx_id: string;\n status: string;\n end_time: string;\n preferred_interpretation: PollPreferredInterpretation | string;\n max_choices_voted: number;\n filter_account_age_days: number;\n protocol_version: number;\n created: string;\n post_title: string;\n post_body: string;\n parent_permlink: string;\n tags: string[];\n image: unknown[];\n token?: string | null;\n community_membership?: string[];\n allow_vote_changes?: boolean;\n ui_hide_res_until_voted?: boolean;\n platform?: string;\n}\n\nexport function mapMetaChoicesToPollChoices(metaChoices: string[]): PollChoice[] {\n if (!metaChoices) {\n return [];\n }\n\n return metaChoices.map((choice, index) => ({\n choice_num: index + 1,\n choice_text: choice,\n votes: {\n total_votes: 0,\n hive_hp: 0,\n hive_proxied_hp: 0,\n hive_hp_incl_proxied: 0,\n },\n }));\n}\n","import { isServer, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys, SERVER_GC_TIME_MS } from \"@/modules/core\";\nimport { getBoundFetch } from \"@/modules/core/utils\";\nimport type { Poll, PollChoice, PollVoter, PollStats } from \"../types\";\n\nfunction normalizePoll(raw: Record): Poll {\n const pollChoices = (raw.poll_choices as Record[] | undefined) ?? [];\n const pollVoters = (raw.poll_voters as Record[] | undefined) ?? [];\n const rawStats = raw.poll_stats as Record | undefined;\n\n const choices: PollChoice[] = pollChoices.map((c) => {\n const votes = c.votes as Record | undefined;\n return {\n choice_num: (c.choice_num as number) ?? 0,\n choice_text: (c.choice_text as string) ?? \"\",\n votes: votes\n ? {\n total_votes: (votes.total_votes as number) ?? 0,\n hive_hp: votes.hive_hp as number | undefined,\n hive_proxied_hp: votes.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: (votes.hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined,\n };\n });\n\n const voters: PollVoter[] = pollVoters.map((v) => ({\n name: (v.name as string) ?? \"\",\n choices: (v.choices as number[]) ?? [],\n hive_hp: v.hive_hp as number | undefined,\n hive_proxied_hp: v.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: v.hive_hp_incl_proxied as number | undefined,\n }));\n\n const stats: PollStats | undefined = rawStats\n ? {\n total_voting_accounts_num: (rawStats.total_voting_accounts_num as number) ?? 0,\n total_hive_hp: rawStats.total_hive_hp as number | undefined,\n total_hive_proxied_hp: rawStats.total_hive_proxied_hp as number | undefined,\n total_hive_hp_incl_proxied: (rawStats.total_hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined;\n\n return {\n author: (raw.author as string) ?? \"\",\n permlink: (raw.permlink as string) ?? \"\",\n question: (raw.question as string) ?? \"\",\n poll_choices: choices,\n poll_voters: voters,\n poll_stats: stats,\n poll_trx_id: (raw.poll_trx_id as string) ?? \"\",\n status: (raw.status as string) ?? \"\",\n end_time: (raw.end_time as string) ?? \"\",\n preferred_interpretation: (raw.preferred_interpretation as string) ?? \"number_of_votes\",\n max_choices_voted: (raw.max_choices_voted as number) ?? 1,\n filter_account_age_days: (raw.filter_account_age_days as number) ?? 0,\n protocol_version: (raw.protocol_version as number) ?? 0,\n created: (raw.created as string) ?? \"\",\n post_title: (raw.post_title as string) ?? \"\",\n post_body: (raw.post_body as string) ?? \"\",\n parent_permlink: (raw.parent_permlink as string) ?? \"\",\n tags: (raw.tags as string[]) ?? [],\n image: (raw.image as unknown[]) ?? [],\n token: raw.token as string | null | undefined,\n community_membership: raw.community_membership as string[] | undefined,\n allow_vote_changes: raw.allow_vote_changes as boolean | undefined,\n ui_hide_res_until_voted: (raw.ui_hide_res_until_voted as boolean | undefined) ?? false,\n platform: raw.platform as string | undefined,\n };\n}\n\nexport function getPollQueryOptions(\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.polls.details(author ?? \"\", permlink ?? \"\"),\n enabled: !!author && !!permlink,\n // Long in a browser, where a poll is cheap to keep and often revisited;\n // bounded during SSR, where holding it also holds that request's whole\n // cache. See SERVER_GC_TIME_MS.\n gcTime: isServer ? SERVER_GC_TIME_MS : 30 * 60 * 1000,\n queryFn: async (): Promise => {\n if (!author || !permlink) {\n throw new Error(\"[SDK][Polls] – missing author or permlink\");\n }\n\n const fetchApi = getBoundFetch();\n const url = `${CONFIG.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(author)}&permlink=eq.${encodeURIComponent(permlink)}`;\n const response = await fetchApi(url);\n\n if (!response.ok) {\n throw new Error(`[SDK][Polls] – fetch failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data) || !data[0]) {\n throw new Error(\"[SDK][Polls] – no poll data found\");\n }\n\n return normalizePoll(data[0]);\n },\n });\n}\n","import { QueryKeys, useBroadcastMutation } from \"@/modules/core\";\nimport type { BroadcastMode, AuthContextV2 } from \"@/modules/core\";\n\nexport interface PollVotePayload {\n pollTrxId: string;\n choices: number[];\n}\n\nexport function usePollVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n QueryKeys.polls.vote(),\n username ?? \"\",\n ({ pollTrxId, choices }) => {\n if (!username) {\n throw new Error(\"[SDK][Polls] Cannot vote without an authenticated username\");\n }\n return [\n [\n \"custom_json\",\n {\n id: \"polls\",\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify({\n poll: pollTrxId,\n action: \"vote\",\n choices,\n }),\n },\n ],\n ];\n },\n undefined,\n auth,\n \"posting\",\n { broadcastMode: broadcastMode ?? \"async\" }\n );\n}\n"]} \ No newline at end of file diff --git a/packages/sdk/dist/node/index.mjs b/packages/sdk/dist/node/index.mjs index 6148c4e69e..f50404c7d9 100644 --- a/packages/sdk/dist/node/index.mjs +++ b/packages/sdk/dist/node/index.mjs @@ -1,4 +1,4 @@ -import {useQuery,useInfiniteQuery,useMutation,QueryClient,queryOptions,infiniteQueryOptions,useQueryClient,isServer}from'@tanstack/react-query';import {hexToBytes,bytesToHex}from'@noble/hashes/utils.js';import {ripemd160}from'@noble/hashes/legacy.js';import en from'bs58';import {secp256k1}from'@noble/curves/secp256k1.js';import {sha256,sha512}from'@noble/hashes/sha2.js';import {cbc}from'@noble/ciphers/aes.js';import Un from'hivesigner';var bo=Object.defineProperty;var ft=(e,t)=>{for(var r in t)bo(e,r,{get:t[r],enumerable:true});};var mt=new ArrayBuffer(0),gt=null,yt=null;function vo(){return gt||(typeof TextEncoder<"u"?gt=new TextEncoder:gt={encode(e){let t=[];for(let r=0;r>6,128|n&63);else if(n>=55296&&n<=56319&&r+1>18,128|n>>12&63,128|n>>6&63,128|n&63);}else t.push(224|n>>12,128|n>>6&63,128|n&63);}return new Uint8Array(t)}}),gt}function Gr(){return yt||(typeof TextDecoder<"u"?yt=new TextDecoder:yt={decode(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r="";for(let n=0;n>10),56320+(o&1023)));}return r}}),yt}var I=class e{static LITTLE_ENDIAN=true;static BIG_ENDIAN=false;static DEFAULT_CAPACITY=16;static DEFAULT_ENDIAN=e.BIG_ENDIAN;buffer;view;offset;markedOffset;limit;littleEndian;constructor(t=e.DEFAULT_CAPACITY,r=e.DEFAULT_ENDIAN){this.buffer=t===0?mt:new ArrayBuffer(t),this.view=t===0?new DataView(mt):new DataView(this.buffer),this.offset=0,this.markedOffset=-1,this.limit=t,this.littleEndian=r;}static allocate(t,r){return new e(t,r)}static concat(t,r){let n=0;for(let a=0;a0&&(n.buffer=t.buffer,n.offset=t.byteOffset,n.limit=t.byteOffset+t.byteLength,n.view=new DataView(t.buffer));else if(t instanceof ArrayBuffer)n=new e(0,r),t.byteLength>0&&(n.buffer=t,n.offset=0,n.limit=t.byteLength,n.view=t.byteLength>0?new DataView(t):new DataView(mt));else if(Array.isArray(t))n=new e(t.length,r),n.limit=t.length,new Uint8Array(n.buffer).set(t);else throw TypeError("Illegal buffer");return n}writeBytes(t,r){return this.append(t,r)}writeInt8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setInt8(r,t),n&&(this.offset+=1),this}writeByte(t,r){return this.writeInt8(t,r)}writeUint8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setUint8(r,t),n&&(this.offset+=1),this}writeUInt8(t,r){return this.writeUint8(t,r)}readUint8(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint8(t);return r&&(this.offset+=1),n}readUInt8(t){return this.readUint8(t)}writeInt16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setInt16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeShort(t,r){return this.writeInt16(t,r)}writeUint16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setUint16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeUInt16(t,r){return this.writeUint16(t,r)}writeInt32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setInt32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeInt(t,r){return this.writeInt32(t,r)}writeUint32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setUint32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeUInt32(t,r){return this.writeUint32(t,r)}readUint32(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint32(t,this.littleEndian);return r&&(this.offset+=4),n}readUInt32=this.readUint32;append(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i;return t instanceof e?(i=new Uint8Array(t.buffer,t.offset,t.limit-t.offset),t.offset+=i.length):t instanceof Uint8Array?i=t:t instanceof ArrayBuffer?i=new Uint8Array(t):i=new Uint8Array(t),i.length<=0?this:(r+i.length>this.buffer.byteLength&&this.resize(r+i.length),new Uint8Array(this.buffer).set(i,r),n&&(this.offset+=i.length),this)}clone(t){let r=new e(0,this.littleEndian);return t?(r.buffer=new ArrayBuffer(this.buffer.byteLength),new Uint8Array(r.buffer).set(new Uint8Array(this.buffer)),r.view=new DataView(r.buffer)):(r.buffer=this.buffer,r.view=this.view),r.offset=this.offset,r.markedOffset=this.markedOffset,r.limit=this.limit,r}copy(t,r){if(t===void 0&&(t=this.offset),r===void 0&&(r=this.limit),t===r)return new e(0,this.littleEndian);let n=r-t,i=new e(n,this.littleEndian);return i.offset=0,i.limit=n,new Uint8Array(i.buffer).set(new Uint8Array(this.buffer).subarray(t,r),0),i}copyTo(t,r,n,i){let o=typeof r>"u",s=typeof n>"u";r=o?t.offset:r,n=s?this.offset:n,i=i===void 0?this.limit:i;let a=i-n;return a===0?t:(t.ensureCapacity(r+a),new Uint8Array(t.buffer).set(new Uint8Array(this.buffer).subarray(n,i),r),s&&(this.offset+=a),o&&(t.offset+=a),this)}ensureCapacity(t){let r=this.buffer.byteLength;return rt?r:t):this}flip(){return this.limit=this.offset,this.offset=0,this}resize(t){if(this.buffer.byteLength"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigInt64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeLong(t,r){return this.writeInt64(t,r)}readInt64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigInt64(t,this.littleEndian);return r&&(this.offset+=8),n}readLong(t){return this.readInt64(t)}writeUint64(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigUint64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeUInt64(t,r){return this.writeUint64(t,r)}readUint64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigUint64(t,this.littleEndian);return r&&(this.offset+=8),n}readUInt64(t){return this.readUint64(t)}toBuffer(t){let r=this.offset,n=this.limit;return !t&&r===0&&n===this.buffer.byteLength?this.buffer:r===n?mt:this.buffer.slice(r,n)}toArrayBuffer(t){return this.toBuffer(t)}writeVarint32(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=this.calculateVarint32(t);for(r+i>this.buffer.byteLength&&this.resize(r+i),t>>>=0;t>=128;)this.view.setUint8(r++,t&127|128),t>>>=7;return this.view.setUint8(r++,t),n?(this.offset=r,this):i}readVarint32(t){let r=typeof t>"u";typeof t>"u"&&(t=this.offset);let n=0,i=0,o;do o=this.view.getUint8(t++),n<5&&(i|=(o&127)<<7*n),++n;while((o&128)!==0);return i|=0,r?(this.offset=t,i):{value:i,length:n}}calculateVarint32(t){return t=t>>>0,t<128?1:t<16384?2:t<1<<21?3:t<1<<28?4:5}writeVString(t,r){let n=typeof r>"u",i=n?this.offset:r,o=vo().encode(t),s=o.length,a=this.calculateVarint32(s);return i+a+s>this.buffer.byteLength&&this.resize(i+a+s),this.writeVarint32(s,i),i+=a,new Uint8Array(this.buffer).set(o,i),i+=s,n?(this.offset=i,this):i-(r||0)}readVString(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=t,i=this.readVarint32(t),o=i.value,s=i.length;t+=s;let a=Gr().decode(new Uint8Array(this.buffer,t,o));return t+=o,r?(this.offset=t,a):{string:a,length:t-n}}readUTF8String(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=Gr().decode(new Uint8Array(this.buffer,r,t));return n?(this.offset+=t,i):{string:i,length:t}}};var x={nodes:["https://api.hive.blog","https://api.deathwing.me","https://api.openhive.network","https://techcoderx.com","https://api.syncad.com","https://rpc.mahdiyari.info"],restNodes:["https://api.hive.blog","https://rpc.mahdiyari.info","https://api.syncad.com","https://hiveapi.actifit.io","https://api.c0ff33a.uk"],restNodesByApi:{hivesense:["https://api.hive.blog","https://api.syncad.com"]},userAgent:"ecency-sdk",chain_id:"beeab0de00000000000000000000000000000000000000000000000000000000",address_prefix:"STM",timeout:5e3,broadcastTimeout:15e3,retry:5,resilience:{adaptiveTimeout:true,adaptiveTimeoutFloorMs:2e3,adaptiveTimeoutFactor:4,hedge:false,hedgeDelayFloorMs:750,hedgeDelayFactor:2,hedgeBucketCapacity:10,hedgeRefillPerSuccess:.1,totalBudgetFactor:2}},Lt=e=>Array.isArray(e)?[...new Set(e.filter(t=>typeof t=="string").map(t=>t.trim().replace(/\/+$/,"")).filter(t=>t.length>0&&/^https?:\/\/.+/.test(t)))]:[],$t=e=>{let t=Lt(e);t.length&&(x.nodes=t);},Wt=e=>{let t=Lt(e);t.length&&(x.restNodes=t);},Gt=e=>{if(!e||typeof e!="object")return;let t={...x.restNodesByApi};for(let[r,n]of Object.entries(e)){let i=Lt(n);i.length?t[r]=i:delete t[r];}x.restNodesByApi=t;},zt=e=>{if(typeof e!="string")return;let t=e.trim();!t||/[\u0000-\u001f\u007f]/.test(t)||(x.userAgent=t);},Jt=e=>{if(!e||typeof e!="object")return;let t=x.resilience,r=i=>typeof i=="boolean",n=i=>typeof i=="number"&&Number.isFinite(i)&&i>0;r(e.adaptiveTimeout)&&(t.adaptiveTimeout=e.adaptiveTimeout),n(e.adaptiveTimeoutFloorMs)&&(t.adaptiveTimeoutFloorMs=Math.max(e.adaptiveTimeoutFloorMs,2e3)),n(e.adaptiveTimeoutFactor)&&(t.adaptiveTimeoutFactor=e.adaptiveTimeoutFactor),r(e.hedge)&&(t.hedge=e.hedge),n(e.hedgeDelayFloorMs)&&(t.hedgeDelayFloorMs=e.hedgeDelayFloorMs),n(e.hedgeDelayFactor)&&(t.hedgeDelayFactor=e.hedgeDelayFactor),n(e.hedgeBucketCapacity)&&(t.hedgeBucketCapacity=e.hedgeBucketCapacity),n(e.hedgeRefillPerSuccess)&&(t.hedgeRefillPerSuccess=Math.min(e.hedgeRefillPerSuccess,1)),n(e.totalBudgetFactor)&&(t.totalBudgetFactor=Math.max(e.totalBudgetFactor,1));};var Ae=class e{data;recovery;compressed;constructor(t,r,n){this.data=t,this.recovery=r,this.compressed=n??true;}static from(t){if(typeof t=="string"){let r=hexToBytes(t),n=parseInt(bytesToHex(r.subarray(0,1)),16)-31,i=true;n<0&&(i=false,n=n+4);let o=r.subarray(1);return new e(o,n,i)}else throw new Error("Expected string for data")}toBuffer(){let t=new Uint8Array(65).fill(0);return this.compressed?t[0]=this.recovery+31&255:t[0]=this.recovery+27&255,t.set(this.data,1),t}customToString(){return bytesToHex(this.toBuffer())}toString(){return this.customToString()}getPublicKey(t){if(t instanceof Uint8Array&&t.length!==32||typeof t=="string"&&t.length!==64)throw new Error("Expected a valid sha256 hash as message");typeof t=="string"&&(t=hexToBytes(t));let r=secp256k1.Signature.fromBytes(this.data,"compact"),n=new secp256k1.Signature(r.r,r.s,this.recovery);return new J(n.recoverPublicKey(t).toBytes())}};var J=class e{key;prefix;constructor(t,r){this.key=t,this.prefix=r??x.address_prefix;}static fromString(t){let r=x.address_prefix;if(typeof t!="string"||t.length<=r.length)throw new Error("Invalid public key");let n=t.slice(0,r.length);if(n!==r)throw new Error(`Public key must start with ${r}`);let i;try{i=en.decode(t.slice(r.length));}catch{throw new Error("Invalid public key encoding")}if(i.length!==37)throw new Error("Invalid public key length");let o=i.subarray(0,33),s=i.subarray(33,37),a=ripemd160(o).subarray(0,4);if(!Po(s,a))throw new Error("Public key checksum mismatch");try{secp256k1.Point.fromBytes(o);}catch{throw new Error("Invalid public key")}return new e(o,n)}static from(t){return t instanceof e?t:e.fromString(t)}verify(t,r){return typeof r=="string"&&(r=Ae.from(r)),secp256k1.verify(r.data,t,this.key,{prehash:false,format:"compact"})}toString(){return Ao(this.key,this.prefix)}toJSON(){return this.toString()}inspect(){return `PublicKey: ${this.toString()}`}},Ao=(e,t)=>{let r=ripemd160(e);return t+en.encode(new Uint8Array([...e,...r.subarray(0,4)]))},Po=(e,t)=>{if(e.byteLength!==t.byteLength)return false;for(let r=0;r{throw new Error("Void can not be serialized")},_=(e,t)=>{e.writeVString(t);},Eo=(e,t)=>{e.writeInt16(t);},rn=(e,t)=>{e.writeInt64(t);},tn=(e,t)=>{e.writeUint8(t);},ce=(e,t)=>{e.writeUint16(t);},Y=(e,t)=>{e.writeUint32(t);},nn=(e,t)=>{e.writeUint64(t);},ge=(e,t)=>{e.writeByte(t?1:0);},on=e=>(t,r)=>{let[n,i]=r;t.writeVarint32(n),e[n](t,i);},q=(e,t)=>{let r=ht.from(t),n=r.getPrecision();e.writeInt64(Math.round(r.amount*Math.pow(10,n))),e.writeUint8(n);for(let i=0;i<7;i++)e.writeUint8(r.symbol.charCodeAt(i)||0);},Pe=(e,t)=>{e.writeUint32(Math.floor(new Date(t+"Z").getTime()/1e3));},fe=(e,t)=>{t===null||typeof t=="string"&&t.slice(-39)==="1111111111111111111111111111111114T1Anm"?e.append(new Uint8Array(33).fill(0)):e.append(J.from(t).key);},sn=(e=null)=>(t,r)=>{r=wt.from(r);let n=r.buffer.length;if(e){if(n!==e)throw new Error(`Unable to serialize binary. Expected ${e} bytes, got ${n}`)}else t.writeVarint32(n);t.append(r.buffer);},an=sn(),Yt=(e,t)=>(r,n)=>{r.writeVarint32(n.length);for(let[i,o]of n)e(r,i),t(r,o);},V=e=>(t,r)=>{t.writeVarint32(r.length);for(let n of r)e(t,n);},ue=e=>(t,r)=>{for(let[n,i]of e)try{i(t,r[n]);}catch(o){throw o.message=`${n}: ${o.message}`,o}},ke=e=>(t,r)=>{r!==void 0?(t.writeByte(1),e(t,r)):t.writeByte(0);},W=ue([["weight_threshold",Y],["account_auths",Yt(_,ce)],["key_auths",Yt(fe,ce)]]),So=ue([["account",_],["weight",ce]]),Xt=ue([["base",q],["quote",q]]),ko=ue([["account_creation_fee",q],["maximum_block_size",Y],["hbd_interest_rate",ce]]),R=(e,t)=>{let r=ue(t);return (n,i)=>{n.writeVarint32(e),r(n,i);}},k={};k.account_create=R(T.account_create,[["fee",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_]]);k.account_create_with_delegation=R(T.account_create_with_delegation,[["fee",q],["delegation",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.account_update=R(T.account_update,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",fe],["json_metadata",_]]);k.account_witness_proxy=R(T.account_witness_proxy,[["account",_],["proxy",_]]);k.account_witness_vote=R(T.account_witness_vote,[["account",_],["witness",_],["approve",ge]]);k.cancel_transfer_from_savings=R(T.cancel_transfer_from_savings,[["from",_],["request_id",Y]]);k.change_recovery_account=R(T.change_recovery_account,[["account_to_recover",_],["new_recovery_account",_],["extensions",V(ie)]]);k.claim_account=R(T.claim_account,[["creator",_],["fee",q],["extensions",V(ie)]]);k.claim_reward_balance=R(T.claim_reward_balance,[["account",_],["reward_hive",q],["reward_hbd",q],["reward_vests",q]]);k.comment=R(T.comment,[["parent_author",_],["parent_permlink",_],["author",_],["permlink",_],["title",_],["body",_],["json_metadata",_]]);k.comment_options=R(T.comment_options,[["author",_],["permlink",_],["max_accepted_payout",q],["percent_hbd",ce],["allow_votes",ge],["allow_curation_rewards",ge],["extensions",V(on([ue([["beneficiaries",V(So)]])]))]]);k.convert=R(T.convert,[["owner",_],["requestid",Y],["amount",q]]);k.create_claimed_account=R(T.create_claimed_account,[["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.custom=R(T.custom,[["required_auths",V(_)],["id",ce],["data",an]]);k.custom_json=R(T.custom_json,[["required_auths",V(_)],["required_posting_auths",V(_)],["id",_],["json",_]]);k.decline_voting_rights=R(T.decline_voting_rights,[["account",_],["decline",ge]]);k.delegate_vesting_shares=R(T.delegate_vesting_shares,[["delegator",_],["delegatee",_],["vesting_shares",q]]);k.delete_comment=R(T.delete_comment,[["author",_],["permlink",_]]);k.escrow_approve=R(T.escrow_approve,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y],["approve",ge]]);k.escrow_dispute=R(T.escrow_dispute,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y]]);k.escrow_release=R(T.escrow_release,[["from",_],["to",_],["agent",_],["who",_],["receiver",_],["escrow_id",Y],["hbd_amount",q],["hive_amount",q]]);k.escrow_transfer=R(T.escrow_transfer,[["from",_],["to",_],["hbd_amount",q],["hive_amount",q],["escrow_id",Y],["agent",_],["fee",q],["json_meta",_],["ratification_deadline",Pe],["escrow_expiration",Pe]]);k.feed_publish=R(T.feed_publish,[["publisher",_],["exchange_rate",Xt]]);k.limit_order_cancel=R(T.limit_order_cancel,[["owner",_],["orderid",Y]]);k.limit_order_create=R(T.limit_order_create,[["owner",_],["orderid",Y],["amount_to_sell",q],["min_to_receive",q],["fill_or_kill",ge],["expiration",Pe]]);k.limit_order_create2=R(T.limit_order_create2,[["owner",_],["orderid",Y],["amount_to_sell",q],["exchange_rate",Xt],["fill_or_kill",ge],["expiration",Pe]]);k.recover_account=R(T.recover_account,[["account_to_recover",_],["new_owner_authority",W],["recent_owner_authority",W],["extensions",V(ie)]]);k.request_account_recovery=R(T.request_account_recovery,[["recovery_account",_],["account_to_recover",_],["new_owner_authority",W],["extensions",V(ie)]]);k.reset_account=R(T.reset_account,[["reset_account",_],["account_to_reset",_],["new_owner_authority",W]]);k.set_reset_account=R(T.set_reset_account,[["account",_],["current_reset_account",_],["reset_account",_]]);k.set_withdraw_vesting_route=R(T.set_withdraw_vesting_route,[["from_account",_],["to_account",_],["percent",ce],["auto_vest",ge]]);k.transfer=R(T.transfer,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_from_savings=R(T.transfer_from_savings,[["from",_],["request_id",Y],["to",_],["amount",q],["memo",_]]);k.transfer_to_savings=R(T.transfer_to_savings,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_to_vesting=R(T.transfer_to_vesting,[["from",_],["to",_],["amount",q]]);k.vote=R(T.vote,[["voter",_],["author",_],["permlink",_],["weight",Eo]]);k.withdraw_vesting=R(T.withdraw_vesting,[["account",_],["vesting_shares",q]]);k.witness_update=R(T.witness_update,[["owner",_],["url",_],["block_signing_key",fe],["props",ko],["fee",q]]);k.witness_set_properties=R(T.witness_set_properties,[["owner",_],["props",Yt(_,an)],["extensions",V(ie)]]);k.account_update2=R(T.account_update2,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",ke(fe)],["json_metadata",_],["posting_json_metadata",_],["extensions",V(ie)]]);k.create_proposal=R(T.create_proposal,[["creator",_],["receiver",_],["start_date",Pe],["end_date",Pe],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(ie)]]);k.update_proposal_votes=R(T.update_proposal_votes,[["voter",_],["proposal_ids",V(rn)],["approve",ge],["extensions",V(ie)]]);k.remove_proposal=R(T.remove_proposal,[["proposal_owner",_],["proposal_ids",V(rn)],["extensions",V(ie)]]);var Co=ue([["end_date",Pe]]);k.update_proposal=R(T.update_proposal,[["proposal_id",nn],["creator",_],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(on([ie,Co]))]]);k.collateralized_convert=R(T.collateralized_convert,[["owner",_],["requestid",Y],["amount",q]]);k.recurrent_transfer=R(T.recurrent_transfer,[["from",_],["to",_],["amount",q],["memo",_],["recurrence",ce],["executions",ce],["extensions",V(ue([["type",tn],["value",ue([["pair_id",tn]])]]))]]);var To=(e,t)=>{let r=k[t[0]];if(!r)throw new Error(`No serializer for operation: ${t[0]}`);try{r(e,t[1]);}catch(n){throw n.message=`${t[0]}: ${n.message}`,n}},Ro=ue([["ref_block_num",ce],["ref_block_prefix",Y],["expiration",Pe],["operations",V(To)],["extensions",V(_)]]),Fo=ue([["from",fe],["to",fe],["nonce",nn],["check",Y],["encrypted",sn()]]),pe={Asset:q,Memo:Fo,Price:Xt,PublicKey:fe,String:_,Transaction:Ro,UInt16:ce,UInt32:Y};var Ye=e=>new Promise(t=>setTimeout(t,e));var qo=(()=>{try{return !(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof process<"u"&&process.versions!=null&&process.versions.node!=null}catch{return false}})();function ln(){return qo?{"User-Agent":x.userAgent}:{}}var X=class extends Error{name="RPCError";data;code;stack=void 0;constructor(t){super(t.message),this.code=t.code,"data"in t&&(this.data=t.data);}},Ce=class extends Error{node;rateLimitMs;isRateLimit;constructor(t,r,n={}){super(r),this.node=t,this.rateLimitMs=n.rateLimitMs??0,this.isRateLimit=n.isRateLimit??false;}};function dn(e){if(!e)return 0;let t=Number(e);if(Number.isFinite(t))return t>0?t*1e3:0;let r=Date.parse(e);if(Number.isFinite(r)){let n=r-Date.now();return n>0?n:0}return 0}var Io=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],Do=["Failed to fetch","NetworkError when attempting to fetch","Load failed","fetch failed"];function Ko(e){if(!e)return "";let t=[String(e.name||""),String(e.message||""),String(e.code||"")],r=e.cause;for(let n=0;r&&n<5;n++)t.push(String(r.code||""),String(r.message||"")),r=r.cause;return t.join(" ")}function Bo(e){if(!e)return false;if(e instanceof Ce)return true;if(e instanceof X)return false;let t=Ko(e);return !!(Io.some(r=>t.includes(r))||Do.some(r=>t.includes(r))||e instanceof SyntaxError||/Unexpected token|JSON\.parse|Unexpected end of JSON/i.test(t))}function Zt(e,t){return !!(e===-32603||e<=-32e3&&e>=-32099||e===-32601||e===-32602&&/unable to parse|endpoint data|internal/i.test(t))}function fn(e){let t=e.indexOf(".");return t>0?e.slice(0,t):e}var Mo=1e4,No=6e4,Qo=12e4,cn=2,un=6e4,pn=12e4,Ho=30,Xe=.3,er=3,Ze=5*6e4,mn=6e4,gn=1e3,yn=2e3,bt=class{health=new Map;getOrCreate(t){let r=this.health.get(t);return r||(r={consecutiveFailures:0,lastFailureTime:0,rateLimitedUntil:0,rateLimitStreak:0,lastRateLimitAt:0,apiFailures:new Map,headBlock:0,headBlockUpdatedAt:0,ewmaLatencyMs:void 0,latencySampleCount:0,latencyUpdatedAt:0,lastProbeAt:Date.now(),apiLatency:new Map},this.health.set(t,r)),r}recordSuccess(t,r,n,i){let o=this.getOrCreate(t);if(o.consecutiveFailures=0,o.rateLimitStreak=0,r){let s=o.apiFailures.get(r);(!s||!(s.defective&&s.cooldownUntil>Date.now()))&&o.apiFailures.delete(r);}typeof n=="number"&&Number.isFinite(n)&&n>=0&&this.recordLatency(o,n,i??r);}recordSlowFailure(t,r,n){!Number.isFinite(r)||r=er&&i-o.updatedAt<=Ze?o.ewmaMs:void 0}return this.isLatencyUsable(n,i)?n.ewmaLatencyMs:void 0}recordCensoredLatency(t,r,n){!Number.isFinite(r)||r<50||this.recordLatency(this.getOrCreate(t),r,n);}recordLatency(t,r,n){let i=Date.now();if(t.latencyUpdatedAt>0&&i-t.latencyUpdatedAt>Ze&&(t.ewmaLatencyMs=void 0,t.latencySampleCount=0,t.apiLatency.clear()),t.ewmaLatencyMs=t.ewmaLatencyMs===void 0?r:Xe*r+(1-Xe)*t.ewmaLatencyMs,t.latencySampleCount++,t.latencyUpdatedAt=i,n!==void 0){let o=t.apiLatency.get(n);!o||i-o.updatedAt>Ze?t.apiLatency.set(n,{ewmaMs:r,sampleCount:1,updatedAt:i}):(o.ewmaMs=Xe*r+(1-Xe)*o.ewmaMs,o.sampleCount++,o.updatedAt=i);}}recordFailure(t,r){let n=this.getOrCreate(t);if(r){let i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};(o.cooldownUntil>0&&o.cooldownUntil<=i||o.lastFailureTime>0&&i-o.lastFailureTime>3e4)&&(o.count=0,o.cooldownUntil=0),o.count++,o.lastFailureTime=i,o.count>=cn&&(o.cooldownUntil=i+un),n.apiFailures.set(r,o);}else n.consecutiveFailures++,n.lastFailureTime=Date.now();}recordDefectiveResponse(t,r){let n=this.getOrCreate(t),i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};o.count=Math.max(o.count+1,cn),o.lastFailureTime=i,o.cooldownUntil=i+un,o.defective=true,n.apiFailures.set(r,o);}recordRateLimit(t,r){let n=this.getOrCreate(t),i=Date.now();n.rateLimitStreak>0&&i-n.lastRateLimitAt>Qo&&(n.rateLimitStreak=0);let o=typeof r=="number"&&Number.isFinite(r)&&r>0,s=o?r:Math.min(Mo*2**n.rateLimitStreak,No);o||n.rateLimitStreak++,n.lastRateLimitAt=i,n.rateLimitedUntil=o?i+s:Math.max(n.rateLimitedUntil,i+s),n.consecutiveFailures++,n.lastFailureTime=i;}recordHeadBlock(t,r){if(!r||!Number.isFinite(r))return;let n=this.getOrCreate(t);n.headBlock=r,n.headBlockUpdatedAt=Date.now();}consensusHeadBlock(){let t=Date.now(),r=[];for(let n of this.health.values())n.headBlock>0&&t-n.headBlockUpdatedAt<=pn&&r.push(n.headBlock);return r.length<2?0:(r.sort((n,i)=>n-i),r[Math.floor((r.length-1)/2)])}isNodeHealthy(t,r){let n=this.health.get(t);if(!n)return true;let i=Date.now();if(n.rateLimitedUntil>i||n.consecutiveFailures>=3&&i-n.lastFailureTime<3e4)return false;if(r){let s=n.apiFailures.get(r);if(s&&s.cooldownUntil>i)return false}let o=this.consensusHeadBlock();return !(o>0&&n.headBlock>0&&i-n.headBlockUpdatedAt<=pn&&o-n.headBlock>Ho)}getOrderedNodes(t,r){let n=[],i=[];for(let u of t)this.isNodeHealthy(u,r)?n.push(u):i.push(u);if(n.length<=1)return [...n,...i];let o=Date.now(),s=n.map((u,p)=>({node:u,i:p,score:this.scoreNode(u,o)})).sort((u,p)=>u.score-p.score||u.i-p.i).map(u=>u.node),a=this.pickReprobeCandidate(n,o);return a&&s[0]!==a?[a,...s.filter(u=>u!==a),...i]:[...s,...i]}isLatencyUsable(t,r){return !!t&&t.ewmaLatencyMs!==void 0&&t.latencySampleCount>=er&&r-t.latencyUpdatedAt<=Ze}scoreNode(t,r){let n=this.health.get(t);return this.isLatencyUsable(n,r)?n.ewmaLatencyMs:gn}pickReprobeCandidate(t,r){let n=r-mn,i,o=1/0;for(let s of t){let a=this.getOrCreate(s),u=Math.max(a.latencyUpdatedAt,a.lastProbeAt);u<=n&&u=1-1e-9?(this.tokens-=1,true):false}refill(){this.clamp(),this.tokens=Math.min(x.resilience.hedgeBucketCapacity,this.tokens+x.resilience.hedgeRefillPerSuccess);}clamp(){this.tokens>x.resilience.hedgeBucketCapacity&&(this.tokens=x.resilience.hedgeBucketCapacity);}get available(){return this.tokens}reset(t=x.resilience.hedgeBucketCapacity){this.tokens=t;}},rr=new tr;function vt(e,t,r,n,i){let o=x.resilience;if(!o.adaptiveTimeout||i)return n;let s=e.getUsableLatencyMs(t,r);return s===void 0?n:Math.ceil(Math.min(n,Math.max(o.adaptiveTimeoutFloorMs,o.adaptiveTimeoutFactor*s)))}function nr(e,t,r,n){r instanceof Ce?r.isRateLimit?e.recordRateLimit(t,r.rateLimitMs||void 0):e.recordFailure(t,n):r instanceof X?e.recordFailure(t,n):e.recordFailure(t);}function hn(e,t,r,n){if(!n||typeof n!="object"||!r.includes("get_dynamic_global_properties"))return;let i=n.head_block_number;typeof i=="number"&&e.recordHeadBlock(t,i);}function Uo(){if(typeof DOMException<"u")return new DOMException("The operation was aborted due to timeout","TimeoutError");let e=new Error("The operation was aborted due to timeout");return e.name="TimeoutError",e}function wn(e){if(e=Math.ceil(e),typeof AbortSignal.timeout=="function")return {signal:AbortSignal.timeout(e),cleanup:()=>{}};let t=new AbortController,r=setTimeout(()=>t.abort(Uo()),e);return {signal:t.signal,cleanup:()=>clearTimeout(r)}}function ir(e,t){if(!t)return {signal:e,cleanup:()=>{}};if(typeof AbortSignal.any=="function")return {signal:AbortSignal.any([e,t]),cleanup:()=>{}};let r=new AbortController;if(e.aborted)return r.abort(e.reason),{signal:r.signal,cleanup:()=>{}};if(t.aborted)return r.abort(t.reason),{signal:r.signal,cleanup:()=>{}};let n=()=>r.abort(e.reason),i=()=>r.abort(t.reason);e.addEventListener("abort",n,{once:true}),t.addEventListener("abort",i,{once:true});let o=()=>{e.removeEventListener("abort",n),t.removeEventListener("abort",i);};return {signal:r.signal,cleanup:o}}var et=async(e,t,r,n=x.timeout,i=false,o)=>{let s=Math.floor(Math.random()*1e8),a={jsonrpc:"2.0",method:t,params:r,id:s},{signal:u,cleanup:p}=wn(n),{signal:l,cleanup:f}=ir(u,o),m=()=>{p(),f();};try{let y=await fetch(e,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",...ln()},signal:l});if(y.status===429)throw new Ce(e,"HTTP 429 Rate Limited",{rateLimitMs:dn(y.headers.get("Retry-After")),isRateLimit:!0});if(y.status>=500&&y.status<600)throw new Ce(e,`HTTP ${y.status} from ${e}`);let h=await y.json();if(!h||typeof h.id>"u"||h.id!==s||h.jsonrpc!=="2.0")throw new Error("JSONRPC id mismatch");if("result"in h)return h.result;if("error"in h){let E=h.error;throw "message"in E&&"code"in E?new X(E):h.error}throw h}catch(y){if(y instanceof X||y instanceof Ce||o?.aborted)throw y;if(i)return et(e,t,r,n,false,o);throw y}finally{m();}};function _t(){return Ye(50+Math.random()*50)}function Vo(e){let{method:t,params:r,api:n,primary:i,hedgePool:o,callerTimeout:s,explicitTimeout:a,deadlineAt:u,externalSignal:p,onHedgeFired:l,validate:f}=e;return new Promise((m,y)=>{let h=false,E=0,O=false,A=false,P,L,U=0,B=[],Q=z=>{if(!h){h=true,L!==void 0&&(clearTimeout(L),L=void 0);for(let F of B)F.signal.aborted||F.abort();z();}},$=(z,F)=>{E++;let de=new AbortController;B.push(de);let Je=ir(de.signal,p),_o=vt(j,z,t,s,a),jt=Date.now();F||(U=jt),et(z,t,r,_o,false,Je.signal).then(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(f&&!f(ne)){if(j.recordDefectiveResponse(z,n),P=new Error(`[hive-tx] response validation failed for ${t} from ${z}`),!F&&!O){Q(()=>y(P));return}E===0&&Q(()=>y(P));return}j.recordSuccess(z,n,Date.now()-jt,t),hn(j,z,t,ne),F?A||j.recordCensoredLatency(i,Date.now()-U,t):O||rr.refill(),Q(()=>m(ne));}}).catch(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(p?.aborted){Q(()=>y(ne));return}if(ne instanceof X&&!Zt(ne.code,ne.message)){Q(()=>y(ne));return}if(nr(j,z,ne,n),j.recordSlowFailure(z,Date.now()-jt,t),P=ne,!F&&!O){Q(()=>y(ne));return}E===0&&Q(()=>y(P));}});};$(i,false);let Se=j.getUsableLatencyMs(i,t)??0,ze=vt(j,i,t,s,a),Vt=Math.min(Math.max(x.resilience.hedgeDelayFloorMs,x.resilience.hedgeDelayFactor*Se),.8*ze);L=setTimeout(()=>{if(L=void 0,h||p?.aborted||Date.now()>=u)return;let z=o.filter(de=>j.isNodeHealthy(de,n));if(z.length===0)return;let F=z[Math.floor(Math.random()*z.length)];rr.trySpend()&&(O=true,l(F),$(F,true));},Vt);})}var g=async(e,t=[],r,n=x.retry,i,o)=>{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let s=r!==void 0,a=r??x.timeout,u=fn(e),p=Date.now()+x.resilience.totalBudgetFactor*a,l=new Set,f;for(let m=0;m<=n&&!(m>0&&Date.now()>=p);m++){let y=j.getOrderedNodes(x.nodes,u),h=y.find(A=>!l.has(A));h||(l.clear(),h=y[0]),l.add(h);let E=[];if(x.resilience.hedge&&j.getUsableLatencyMs(h,e)!==void 0&&(E=y.filter(A=>!l.has(A)&&j.isNodeHealthy(A,u)).slice(0,3)),E.length>0)try{return await Vo({method:e,params:t,api:u,primary:h,hedgePool:E,callerTimeout:a,explicitTimeout:s,deadlineAt:p,externalSignal:i,onHedgeFired:A=>l.add(A),validate:o})}catch(A){if(A instanceof X&&!Zt(A.code,A.message)||i?.aborted)throw A;f=A,m{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let i=fn(e),o=new Set,s;for(let a=0;a!o.has(l));if(!p)break;if(o.add(p),n?.aborted)throw new Error("Aborted");try{let l=await et(p,e,t,r,!1,n);return j.recordSuccess(p,i),l}catch(l){if(l instanceof X||n?.aborted||(nr(j,p,l,i),s=l,!Bo(l)))throw l}}throw s},jo={balance:"/balance-api",hafah:"/hafah-api",hafbe:"/hafbe-api",hivemind:"/hivemind-api",hivesense:"/hivesense-api",reputation:"/reputation-api","nft-tracker":"/nft-tracker-api",hafsql:"/hafsql",status:"/status-api"};async function ee(e,t,r,n,i=x.retry,o){if(!Array.isArray(x.restNodes))throw new Error("config.restNodes is not an array");if(x.restNodes.length===0)throw new Error("config.restNodes is empty");let s=n!==void 0,a=n??x.timeout,u=Date.now()+x.resilience.totalBudgetFactor*a,p=`${e}:${t}`,l=x.restNodesByApi?.[e]?.length?x.restNodesByApi[e]:x.restNodes,f=new Set,m,y=false;for(let h=0;h<=i&&!(h>0&&Date.now()>=u);h++){let E=Oe.getOrderedNodes(l,e),O=E.find(F=>!f.has(F));O||(f.clear(),O=E[0]),f.add(O);let A=O+jo[e],P=t,L=r||{},U=new Set;Object.entries(L).forEach(([F,de])=>{P.includes(`{${F}}`)&&(P=P.replace(`{${F}}`,encodeURIComponent(String(de))),U.add(F));});let B=new URL(A+P);if(Object.entries(L).forEach(([F,de])=>{U.has(F)||(Array.isArray(de)?de.forEach(Je=>B.searchParams.append(F,String(Je))):B.searchParams.set(F,String(de)));}),o?.aborted)throw new Error("Aborted");y=false;let{signal:Q,cleanup:$}=wn(vt(Oe,O,p,a,s)),{signal:Se,cleanup:ze}=ir(Q,o),Vt=()=>{$(),ze();},z=Date.now();try{let F=await fetch(B.toString(),{signal:Se,headers:ln()});if(F.status===404)throw new Error("HTTP 404 - Hint: can happen on wrong params");if(F.status===429)throw Oe.recordRateLimit(O,dn(F.headers.get("Retry-After"))||void 0),y=!0,new Error(`HTTP 429 Rate Limited by ${O}`);if(F.status===503)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP 503 Service Unavailable from ${O}`);if(!F.ok)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP ${F.status} from ${O}`);return Oe.recordSuccess(O,e,Date.now()-z,p),F.json()}catch(F){if(F?.message?.includes("HTTP 404")||o?.aborted)throw F;y||Oe.recordFailure(O,e),Oe.recordSlowFailure(O,Date.now()-z,p),m=F,h{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an Array");if(r>x.nodes.length)throw new Error("quorum > config.nodes.length");let o=(u=>{let p=[...u];for(let l=p.length-1;l>0;l--){let f=Math.floor(Math.random()*(l+1));[p[l],p[f]]=[p[f],p[l]];}return p})(x.nodes),s=Math.min(r,o.length),a=[];for(;s>0&&o.length>0;){let u=o.splice(0,s),p=[],l=[];for(let m=0;ml.push(y)).catch(()=>{}));await Promise.all(p),a.push(...l);let f=Lo(a,r);if(f)return f;if(s=Math.min(r,o.length),s===0)throw new Error("No more nodes available.")}throw new Error("Couldn't reach quorum.")};function Lo(e,t){let r=new Map;for(let i of e){let o=JSON.stringify(i);r.has(o)||r.set(o,[]),r.get(o).push(i);}let n=Array.from(r.values()).find(i=>i.length>=t);return n?n[0]:null}var Wo=hexToBytes(x.chain_id),Te=class e{transaction;expiration=6e4;txId;constructor(t){t?.transaction&&(t.transaction instanceof e?(this.transaction=t.transaction.transaction,this.expiration=t.transaction.expiration):this.transaction=t.transaction,this.transaction&&!Array.isArray(this.transaction.signatures)&&(this.transaction.signatures=[]),this.txId=this.digest().txId),t?.expiration&&(this.expiration=t.expiration);}async addOperation(t,r){this.transaction||await this.createTransaction(this.expiration),this.transaction.operations.push([t,r]);}sign(t){if(!this.transaction)throw new Error("First create a transaction by .addOperation()");if(this.transaction){let{digest:r,txId:n}=this.digest();Array.isArray(t)||(t=[t]);for(let i of t){let o=i.sign(r);this.transaction.signatures.push(o.customToString());}return this.txId=n,this.transaction}else throw new Error("No transaction to sign")}async broadcast(t=false){if(!this.transaction)throw new Error("Attempted to broadcast an empty transaction. Add operations by .addOperation()");if(this.transaction.signatures.length===0)throw new Error("Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)");try{await Qe("condenser_api.broadcast_transaction",[this.transaction]);}catch(o){if(!(o instanceof X&&o.message.includes("Duplicate transaction check failed")))throw o}if(this.txId||(this.txId=this.digest().txId),!t)return {tx_id:this.txId,status:"unknown"};let r=60;await Ye(1e3);let n=await this.checkStatus(),i=1;for(;n?.status!=="within_irreversible_block"&&n?.status!=="expired_irreversible"&&n?.status!=="too_old"&&i{let r=await g("condenser_api.get_dynamic_global_properties",[]),n=hexToBytes(r.head_block_id),i=Number(new Uint32Array(n.buffer,n.byteOffset+4,1)[0]),o=new Date(Date.now()+t).toISOString().slice(0,-5);this.transaction={expiration:o,extensions:[],operations:[],ref_block_num:r.head_block_number&65535,ref_block_prefix:i,signatures:[]};}};var On=new Uint8Array([128]),H=class e{key;constructor(t){this.key=t;try{secp256k1.getPublicKey(t);}catch{throw new Error("invalid private key")}}static from(t){return typeof t=="string"?e.fromString(t):new e(t)}static fromString(t){return new e(Yo(t).subarray(1))}static fromSeed(t){if(typeof t=="string")if(/^[0-9a-fA-F]+$/.test(t))t=hexToBytes(t);else {let n=[];for(let i=0;i>6,128|o&63);else if(o>=55296&&o<=56319&&i+1>18,128|o>>12&63,128|o>>6&63,128|o&63);}else n.push(224|o>>12,128|o>>6&63,128|o&63);}t=new Uint8Array(n);}return new e(sha256(t))}static fromLogin(t,r,n="active"){let i=t+n+r;return e.fromSeed(i)}sign(t){let r=secp256k1.sign(t,this.key,{extraEntropy:true,format:"recovered",prehash:false}),n=parseInt(bytesToHex(r.subarray(0,1)),16);return Ae.from((n+31).toString(16)+bytesToHex(r.subarray(1)))}createPublic(t){return new J(secp256k1.getPublicKey(this.key),t)}toString(){return Jo(new Uint8Array([...On,...this.key]))}inspect(){let t=this.toString();return `PrivateKey: ${t.slice(0,6)}...${t.slice(-6)}`}getSharedSecret(t){let r=secp256k1.getSharedSecret(this.key,t.key);return sha512(r.subarray(1))}static randomKey(){return new e(secp256k1.keygen().secretKey)}},xn=e=>sha256(sha256(e)),Jo=e=>{let t=xn(e);return en.encode(new Uint8Array([...e,...t.slice(0,4)]))},Yo=e=>{let t=en.decode(e);if(!An(t.slice(0,1),On))throw new Error("Private key network id mismatch");let r=t.slice(-4),n=t.slice(0,-4),i=xn(n).slice(0,4);if(!An(r,i))throw new Error("Private key checksum mismatch");return n},An=(e,t)=>{if(e===t)return true;if(e.byteLength!==t.byteLength)return false;let r=e.byteLength,n=0;for(;nCn(e,t,n,r),kn=(e,t,r,n,i)=>Cn(e,t,r,n,i).message,Cn=(e,t,r,n,i)=>{let o=r,s=e.getSharedSecret(t),a=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);a.writeUint64(o),a.append(s),a.flip();let u=sha512(new Uint8Array(a.toBuffer())),p=u.subarray(32,48),l=u.subarray(0,32),f=sha256(u).subarray(0,4),m=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);m.append(f),m.flip();let y=m.readUint32();if(i!==void 0){if(y!==i)throw new Error("Invalid key");n=ts(n,l,p);}else n=rs(n,l,p);return {nonce:o,message:n,checksum:y}},ts=(e,t,r)=>{let n=e;return n=cbc(t,r).decrypt(n),n},rs=(e,t,r)=>{let n=e;return n=cbc(t,r).encrypt(n),n},sr=null,ns=()=>{if(sr===null){let r=secp256k1.utils.randomSecretKey();sr=r[0]<<8|r[1];}let e=BigInt(Date.now()),t=++sr%65536;return e=e<{let t=us(e,33);return new J(t)},os=e=>e.readUint64(),ss=e=>e.readUint32(),as=e=>{let t=e.readVarint32(),r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())},cs=e=>t=>{let r={},n=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);n.append(t),n.flip();for(let[i,o]of e)try{r[i]=o(n);}catch(s){throw s.message=`${i}: ${s.message}`,s}return r};function us(e,t){if(e){let r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())}else throw Error("No buffer found on first parameter")}var ps=cs([["from",Tn],["to",Tn],["nonce",os],["check",ss],["encrypted",as]]),Rn={Memo:ps};var qn=(e,t,r,n)=>{if(!r.startsWith("#"))return r;r=r.substring(1),Dn(),e=Kn(e),t=ls(t);let i=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);i.writeVString(r);let o=new Uint8Array(i.copy(0,i.offset).toBuffer()),{nonce:s,message:a,checksum:u}=Sn(e,t,o,n),p=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);pe.Memo(p,{check:u,encrypted:a,from:e.createPublic(),nonce:s,to:t}),p.flip();let l=new Uint8Array(p.toBuffer());return "#"+en.encode(l)},In=(e,t)=>{if(!t.startsWith("#"))return t;t=t.substring(1),Dn(),e=Kn(e);let r=Rn.Memo(en.decode(t)),{from:n,to:i,nonce:o,check:s,encrypted:a}=r,p=e.createPublic().toString()===new J(n.key).toString()?new J(i.key):new J(n.key);r=kn(e,p,o,a,s);let l=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return l.append(r),l.flip(),"#"+l.readVString()},Pt,Dn=()=>{if(Pt===void 0){let e;Pt=true;try{let t="5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw",n=qn(t,"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA","#memo\u7231");e=In(t,n);}finally{Pt=e==="#memo\u7231";}}if(Pt===false)throw new Error("This environment does not support encryption.")},Kn=e=>typeof e=="string"?H.fromString(e):e,ls=e=>typeof e=="string"?J.fromString(e):e,Bn={decode:In,encode:qn};var re={};ft(re,{buildWitnessSetProperties:()=>hs,makeBitMaskFilter:()=>gs,operations:()=>ms,validateUsername:()=>fs});var fs=e=>{let t="Account name should ";if(!e)return t+"not be empty.";let r=e.length;if(r<3)return t+"be longer.";if(r>16)return t+"be shorter.";/\./.test(e)&&(t="Each account segment should ");let n=e.split("."),i=n.length;for(let o=0;oe.reduce(ys,[BigInt(0),BigInt(0)]).map(t=>t!==BigInt(0)?t.toString():null),ys=([e,t],r)=>r<64?[e|BigInt(1)<{let r={extensions:[],owner:e,props:[]};for(let n of Object.keys(t)){if(t[n]===void 0)continue;let i;switch(n){case "key":case "new_signing_key":i=pe.PublicKey;break;case "account_subsidy_budget":case "account_subsidy_decay":case "maximum_block_size":i=pe.UInt32;break;case "hbd_interest_rate":i=pe.UInt16;break;case "url":i=pe.String;break;case "hbd_exchange_rate":i=pe.Price;break;case "account_creation_fee":i=pe.Asset;break;default:throw new Error(`Unknown witness prop: ${n}`)}r.props.push([n,ws(i,t[n])]);}return r.props.sort((n,i)=>n[0].localeCompare(i[0])),["witness_set_properties",r]},ws=(e,t)=>{let r=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return e(r,t),r.flip(),bytesToHex(new Uint8Array(r.toBuffer()))};function tm(e){let t;if(typeof e=="string"){let r=[];for(let n=0;n>6,128|i&63);else if(i>=55296&&i<=56319&&n+1>18,128|i>>12&63,128|i>>6&63,128|i&63);}else r.push(224|i>>12,128|i>>6&63,128|i&63);}t=new Uint8Array(r);}else t=e;return sha256(t)}function Mn(e){try{return H.fromString(e),!0}catch{return false}}async function Z(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),Qe("condenser_api.broadcast_transaction_synchronous",[r.transaction])}async function Nn(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),r.broadcast(false)}var bs=432e3;function Qn(e,t){let r=Date.now()/1e3-t.last_update_time,n=Number(t.current_mana)+r*e/bs,i=Math.round(n/e*1e4);return !isFinite(i)||i<0?i=0:i>1e4&&(i=1e4),{current_mana:n,max_mana:e,percentage:i}}function vs(e){let t=parseFloat(e.vesting_shares),r=parseFloat(e.delegated_vesting_shares),n=parseFloat(e.received_vesting_shares),i=parseFloat(e.vesting_withdraw_rate),o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t-s-r+n}function ar(e){let t=vs(e)*1e6;return Qn(t,e.voting_manabar)}function Ot(e){return Qn(Number(e.max_rc),e.rc_manabar)}var Hn=(u=>(u.COMMON="common",u.INFO="info",u.INSUFFICIENT_RESOURCE_CREDITS="insufficient_resource_credits",u.MISSING_AUTHORITY="missing_authority",u.TOKEN_EXPIRED="token_expired",u.NETWORK="network",u.TIMEOUT="timeout",u.VALIDATION="validation",u))(Hn||{});function He(e){let t=e?.error_description?String(e.error_description):"",r=e?.message?String(e.message):"",n=e?.error?String(e.error):"",i=t||r||String(e||""),o=a=>!!(n&&a.test(n)||t&&a.test(t)||r&&a.test(r)||i&&a.test(i));if(o(/please wait to transact/i)||o(/insufficient rc/i)||o(/rc mana|rc account|resource credits/i))return {message:"Insufficient Resource Credits. Please wait or power up.",type:"insufficient_resource_credits",originalError:e};if(o(/you may only post once every/i))return {message:"Please wait before posting again (minimum 3 second interval between comments).",type:"common",originalError:e};if(o(/your current vote on this comment is identical/i))return {message:"You have already voted with the same weight.",type:"info",originalError:e};if(o(/must claim something/i))return {message:"You must claim rewards before performing this action.",type:"info",originalError:e};if(o(/cannot claim that much vests/i))return {message:"Cannot claim that amount. Please check your pending rewards.",type:"info",originalError:e};if(o(/cannot delete a comment with net positive/i))return {message:"Cannot delete a comment with positive votes.",type:"info",originalError:e};if(o(/children == 0/i))return {message:"Cannot delete a comment with replies.",type:"common",originalError:e};if(o(/comment_cashout/i))return {message:"Cannot modify a comment that has already been paid out.",type:"common",originalError:e};if(o(/votes evaluating for comment that is paid out is forbidden/i))return {message:"Cannot vote on posts that have already been paid out.",type:"common",originalError:e};if(o(/no (active|owner|posting|memo) key available/i))return {message:"Key not available. Please provide your key to sign this operation.",type:"missing_authority",originalError:e};if(o(/missing (required )?active authority/i))return {message:"Missing active authority. This operation requires your active key.",type:"missing_authority",originalError:e};if(o(/missing (required )?owner authority/i))return {message:"Missing owner authority. This operation requires your owner key.",type:"missing_authority",originalError:e};if(o(/missing (required )?posting authority/i))return {message:"Missing posting authority. Please check your login method.",type:"missing_authority",originalError:e};if(n==="invalid_grant"||n==="unauthorized_access"||o(/token expired/i)||o(/invalid token/i)||o(/\bunauthorized\b/i)||o(/\bforbidden\b/i))return {message:"Authentication token expired. Please log in again.",type:"token_expired",originalError:e};if(o(/has already reblogged/i)||o(/already reblogged this post/i))return {message:"You have already reblogged this post.",type:"info",originalError:e};if(o(/duplicate transaction/i))return {message:"This transaction has already been processed.",type:"info",originalError:e};if(o(/econnrefused/i)||o(/connection refused/i)||o(/failed to fetch/i)||o(/\bnetwork[-\s]?(request|error|timeout|unreachable|down|failed)\b/i))return {message:"Network error. Please check your connection and try again.",type:"network",originalError:e};if(o(/timeout/i)||o(/timed out/i))return {message:"Request timed out. Please try again.",type:"timeout",originalError:e};if(o(/account.*does not exist/i)||o(/account not found/i))return {message:"Account not found. Please check the username.",type:"validation",originalError:e};if(o(/invalid memo key/i))return {message:"Invalid memo key. Cannot encrypt message.",type:"validation",originalError:e};if(o(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i))return {message:"Insufficient funds for this transaction.",type:"validation",originalError:e};if(o(/\b(invalid|validation)\b/i))return {message:(e?.message||i).substring(0,150)||"Validation error occurred",type:"validation",originalError:e};if(e?.error_description&&typeof e.error_description=="string")return {message:e.error_description.substring(0,150),type:"common",originalError:e};if(e?.message&&typeof e.message=="string")return {message:e.message.substring(0,150),type:"common",originalError:e};let s;return typeof e=="object"&&e!==null?e.error_description?s=String(e.error_description):e.code?s=`Error code: ${e.code}`:i&&i!=="[object Object]"?s=i.substring(0,150):s="Unknown error occurred":s=i.substring(0,150)||"Unknown error occurred",{message:s,type:"common",originalError:e}}function As(e){let t=He(e);return [t.message,t.type]}function ye(e){let{type:t}=He(e);return t==="missing_authority"||t==="token_expired"}function Ps(e){let{type:t}=He(e);return t==="insufficient_resource_credits"}function Os(e){let{type:t}=He(e);return t==="info"}function xs(e){let{type:t}=He(e);return t==="network"||t==="timeout"}async function he(e,t,r,n,i="posting",o,s,a="async"){let u=n?.adapter;switch(e){case "key":{if(!u)throw new Error("No adapter provided for key-based auth");let p=o;if(p===void 0)switch(i){case "owner":if(u.getOwnerKey)p=await u.getOwnerKey(t);else throw new Error("Owner key not supported by adapter. Owner operations (like account recovery) require master password login or manual key entry.");break;case "active":u.getActiveKey&&(p=await u.getActiveKey(t));break;case "memo":if(u.getMemoKey)p=await u.getMemoKey(t);else throw new Error("Memo key not supported by adapter. Use memo encryption methods instead.");break;default:p=await u.getPostingKey(t);break}if(!p)throw new Error(`No ${i} key available for ${t}`);let l=H.fromString(p);return a==="async"?await Nn(r,l):await Z(r,l)}case "hiveauth":{if(!u?.broadcastWithHiveAuth)throw new Error("HiveAuth not supported by adapter");return await u.broadcastWithHiveAuth(t,r,i)}case "hivesigner":{if(!u)throw new Error("No adapter provided for HiveSigner auth");if(i!=="posting"){if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`HiveSigner access token cannot sign ${i} operations. No platform broadcast available.`)}let p=s!==void 0?s:await u.getAccessToken(t);if(p)try{return (await new Un.Client({accessToken:p}).broadcast(r)).result}catch(l){if(u.broadcastWithHiveSigner&&ye(l))return await u.broadcastWithHiveSigner(t,r,i);throw l}if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`No access token available for ${t}`)}case "keychain":{if(!u?.broadcastWithKeychain)throw new Error("Keychain not supported by adapter");return await u.broadcastWithKeychain(t,r,i)}case "custom":{if(!n?.broadcast)throw new Error("No custom broadcast function provided");return await n.broadcast(r,i)}default:throw new Error(`Unknown auth method: ${e}`)}}async function Ss(e,t,r,n="posting",i="async"){let o=r?.adapter;if(o?.getLoginType){let l=await o.getLoginType(e,n);if(l){let f=o.hasPostingAuthorization?await o.hasPostingAuthorization(e):false;if(n==="posting"&&f&&l==="key")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to key:",m);}if(n==="posting"&&f&&l==="keychain")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to keychain/snap:",m);}if(n==="posting"&&f&&l==="hiveauth")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to HiveAuth:",m);}try{return await he(l,e,t,r,n,void 0,void 0,i)}catch(m){if(ye(m)&&o.showAuthUpgradeUI&&(n==="posting"||n==="active")){let y=t.length>0?t[0][0]:"unknown",h=await o.showAuthUpgradeUI(n,y);if(!h)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(h,e,t,r,n,void 0,void 0,i)}throw m}}if(n==="posting")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(f){if(ye(f)&&o.showAuthUpgradeUI){let m=t.length>0?t[0][0]:"unknown",y=await o.showAuthUpgradeUI(n,m);if(!y)throw new Error(`No login type available for ${e}. Please log in again.`);return await he(y,e,t,r,n,void 0,void 0,i)}throw f}else if(n==="active"&&o.showAuthUpgradeUI){let f=t.length>0?t[0][0]:"unknown",m=await o.showAuthUpgradeUI(n,f);if(!m)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(m,e,t,r,n,void 0,void 0,i)}}let s=r?.fallbackChain??["key","hiveauth","hivesigner","keychain","custom"],a=new Map;for(let l of s)try{let f=!1,m="",y,h;switch(l){case "key":if(!o)f=!0,m="No adapter provided";else {let E;switch(n){case "owner":o.getOwnerKey&&(E=await o.getOwnerKey(e));break;case "active":o.getActiveKey&&(E=await o.getActiveKey(e));break;case "memo":o.getMemoKey&&(E=await o.getMemoKey(e));break;default:E=await o.getPostingKey(e);break}E?y=E:(f=!0,m=`No ${n} key available`);}break;case "hiveauth":o?.broadcastWithHiveAuth||(f=!0,m="HiveAuth not supported by adapter");break;case "hivesigner":if(!o)f=!0,m="No adapter provided";else {let E=await o.getAccessToken(e);E&&(h=E);}break;case "keychain":o?.broadcastWithKeychain||(f=!0,m="Keychain not supported by adapter");break;case "custom":r?.broadcast||(f=!0,m="No custom broadcast function provided");break}if(f){a.set(l,new Error(`Skipped: ${m}`));continue}return await he(l,e,t,r,n,y,h,i)}catch(f){if(a.set(l,f),!ye(f))throw f}if(!Array.from(a.values()).some(l=>!l.message.startsWith("Skipped:"))){let l=Array.from(a.entries()).map(([f,m])=>`${f}: ${m.message}`).join(", ");throw new Error(`[SDK][Broadcast] No auth methods attempted for ${e}. ${l}`)}let p=Array.from(a.entries()).map(([l,f])=>`${l}: ${f.message}`).join(", ");throw new Error(`[SDK][Broadcast] All auth methods failed for ${e}. Errors: ${p}`)}function v(e=[],t,r,n=()=>{},i,o="posting",s){let a=s?.broadcastMode??"async";return useMutation({onSuccess:n,onMutate:s?.onMutate,onError:s?.onError,onSettled:s?.onSettled,mutationKey:[...e,t],mutationFn:async u=>{if(!t)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let p=r(u);try{if(i?.enableFallback!==!1&&i?.adapter)return await Ss(t,p,i,o,a);if(i?.broadcast)return await i.broadcast(p,o);let l=i?.postingKey;if(l){if(o!=="posting")throw new Error(`[SDK][Broadcast] Legacy auth only supports posting authority, but '${o}' was requested. Use AuthContextV2 with an adapter for ${o} operations.`);let m=H.fromString(l);return await Z(p,m)}let f=i?.accessToken;if(f)return (await new Un.Client({accessToken:f}).broadcast(p)).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}catch(l){throw l instanceof X?new Error(l.message):l}}})}async function Vn(e,t,r,n){if(!e)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let i={id:t,required_auths:[],required_posting_auths:[e],json:JSON.stringify(r)};if(n?.broadcast)return n.broadcast([["custom_json",i]],"posting");let o=n?.postingKey;if(o){let a=H.fromString(o);return Z([["custom_json",i]],a)}let s=n?.accessToken;if(s)return (await new Un.Client({accessToken:s}).customJson([],[e],t,JSON.stringify(r))).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}var hm=4e3;function S(e,t,r){if(e?.invalidateQueries){if(t==="sync")return e.invalidateQueries(r);setTimeout(()=>e.invalidateQueries?.(r),4e3);}}function we(e,t){let r=AbortSignal.timeout(e);if(!t)return r;if(typeof AbortSignal.any=="function")return AbortSignal.any([t,r]);let n=new AbortController,i=()=>{let o=t.aborted?t.reason:r.reason;n.abort(o),t.removeEventListener("abort",i),r.removeEventListener("abort",i);};return t.aborted?n.abort(t.reason):r.aborted?n.abort(r.reason):(t.addEventListener("abort",i,{once:true}),r.addEventListener("abort",i,{once:true})),n.signal}var Re=(()=>{try{return process.env?.NODE_ENV==="development"}catch{return false}})(),Ts=()=>{try{return process.env?.VITE_HELIUS_API_KEY}catch{return}},_e=1e4,jn=120*1e3,xt,Rs;function Fs(){return xt?xt():Rs??=new QueryClient}var d={privateApiHost:"https://ecency.com",defaultObserver:"ecency",clientId:"ecency-sdk",imageHost:"https://i.ecency.com",get hiveNodes(){return x.nodes},heliusApiKey:Ts(),get queryClient(){return Fs()},set queryClient(e){xt=()=>e;},pollsApiHost:"https://poll.ecency.com",plausibleHost:"https://pl.ecency.com",dmcaAccounts:[],dmcaTags:[],dmcaPatterns:[],dmcaTagRegexes:[],dmcaPatternRegexes:[],_dmcaInitialized:false},N;(A=>{function e(P){d.queryClient=P;}A.setQueryClient=e;function t(P){xt=P;}A.setQueryClientResolver=t;function r(P){d.privateApiHost=P;}A.setPrivateApiHost=r;function n(P){d.clientId=P;}A.setClientId=n;function i(P){if(typeof P!="string"||P.trim()==="")throw new Error("setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; observer resolution would fall back to the post author while caching under an empty key.");d.defaultObserver=P;}A.setDefaultObserver=i;function o(){return d.privateApiHost?d.privateApiHost:typeof window<"u"&&window.location?.origin?window.location.origin:"https://ecency.com"}A.getValidatedBaseUrl=o;function s(P){d.pollsApiHost=P;}A.setPollsApiHost=s;function a(P){d.imageHost=P;}A.setImageHost=a;function u(P){$t(P);}A.setHiveNodes=u;function p(P){Wt(P);}A.setRestNodes=p;function l(P){Gt(P);}A.setRestNodesByApi=l;function f(P){zt(P);}A.setUserAgent=f;function m(P){Jt(P);}A.setResilience=m;function y(P){if(/(\([^)]*[*+{][^)]*\))[*+{]/.test(P))return {safe:false,reason:"nested quantifiers detected"};if(/\([^|)]*\|[^)]*\)[*+{]/.test(P))return {safe:false,reason:"alternation with quantifier (potential overlap)"};if(/\([^)]*[*+][^)]*\)[*+]/.test(P))return {safe:false,reason:"repeated quantifiers (catastrophic backtracking risk)"};if(/\.\*\.\*/.test(P)||/\.\+\.\+/.test(P))return {safe:false,reason:"multiple greedy quantifiers on wildcards"};let L=/\.?\{(\d+),(\d+)\}/g,U;for(;(U=L.exec(P))!==null;){let[,B,Q]=U;if(parseInt(Q,10)-parseInt(B,10)>1e3)return {safe:false,reason:`excessive range: {${B},${Q}}`}}return {safe:true}}function h(P){let L=["a".repeat(50)+"x","ab".repeat(50)+"x","x".repeat(100),"aaa".repeat(30)+"bbb".repeat(30)+"x"],U=5;for(let B of L){let Q=Date.now();try{P.test(B);let $=Date.now()-Q;if($>U)return {safe:!1,reason:`runtime test exceeded ${U}ms (took ${$}ms on input length ${B.length})`}}catch($){return {safe:false,reason:`runtime test threw error: ${$}`}}}return {safe:true}}function E(P,L=200){try{if(!P)return Re&&console.warn("[SDK] DMCA pattern rejected: empty pattern"),null;if(P.length>L)return Re&&console.warn(`[SDK] DMCA pattern rejected: length ${P.length} exceeds max ${L} - pattern: ${P.substring(0,50)}...`),null;let U=y(P);if(!U.safe)return Re&&console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${U.reason}) - pattern: ${P.substring(0,50)}...`),null;let B;try{B=new RegExp(P);}catch($){return Re&&console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${P.substring(0,50)}...`,$),null}let Q=h(B);return Q.safe?B:(Re&&console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${Q.reason}) - pattern: ${P.substring(0,50)}...`),null)}catch(U){return Re&&console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${P.substring(0,50)}...`,U),null}}function O(P={}){let L=$=>Array.isArray($)?$.filter(Se=>typeof Se=="string"):[],U=P||{},B={accounts:L(U.accounts),tags:L(U.tags),patterns:L(U.posts)};d.dmcaAccounts=B.accounts,d.dmcaTags=B.tags,d.dmcaPatterns=B.patterns,d.dmcaTagRegexes=B.tags.map($=>E($)).filter($=>$!==null),d.dmcaPatternRegexes=[];let Q=B.tags.length-d.dmcaTagRegexes.length;!d._dmcaInitialized&&Re&&(console.log("[SDK] DMCA configuration loaded:"),console.log(` - Accounts: ${B.accounts.length}`),console.log(` - Tag patterns: ${d.dmcaTagRegexes.length}/${B.tags.length} compiled (${Q} rejected)`),console.log(` - Post patterns: ${B.patterns.length} (using exact string matching)`),Q>0&&console.warn(`[SDK] ${Q} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`)),d._dmcaInitialized=true;}A.setDmcaLists=O;})(N||={});function Cm(){return new QueryClient({defaultOptions:{queries:{refetchOnWindowFocus:false,refetchOnMount:false}}})}var b=()=>d.queryClient,Ks;(s=>{function e(a){return b().getQueryData(a)}s.getQueryData=e;function t(a){return b().getQueryData(a)}s.getInfiniteQueryData=t;async function r(a){return await b().prefetchQuery(a),e(a.queryKey)}s.prefetchQuery=r;async function n(a){return await b().prefetchInfiniteQuery(a),t(a.queryKey)}s.prefetchInfiniteQuery=n;function i(a){return {prefetch:()=>r(a),getData:()=>e(a.queryKey),useClientQuery:()=>useQuery(a),fetchAndGet:()=>b().fetchQuery(a)}}s.generateClientServerQuery=i;function o(a){return {prefetch:()=>n(a),getData:()=>t(a.queryKey),useClientQuery:()=>useInfiniteQuery(a),fetchAndGet:()=>b().fetchInfiniteQuery(a)}}s.generateClientServerInfiniteQuery=o;})(Ks||={});function Rm(e){return btoa(JSON.stringify(e))}function Fm(e){let t=atob(e);if(t[0]==="{")return JSON.parse(t)}var Ln=(n=>(n.HIVE="HIVE",n.HBD="HBD",n.VESTS="VESTS",n))(Ln||{}),Et=(e=>(e["@@000000021"]="HIVE",e["@@000000013"]="HBD",e["@@000000037"]="VESTS",e))(Et||{});function C(e){if(typeof e=="string"){let t=e.split(" ");return {amount:parseFloat(t[0]),symbol:Ln[t[1]]}}else return {amount:parseFloat(e.amount.toString())/Math.pow(10,e.precision),symbol:Et[e.nai]}}var cr;function w(){if(!cr){if(typeof globalThis.fetch!="function")throw new Error("[Ecency][SDK] - global fetch is not available");cr=globalThis.fetch.bind(globalThis);}return cr}function $n(e){return typeof e=="string"?/^hive-\d+$/.test(e):false}function Bs(e){return e&&typeof e=="object"&&"data"in e&&"pagination"in e&&Array.isArray(e.data)}function oe(e,t){return Bs(e)?e:{data:Array.isArray(e)?e:[],pagination:{total:Array.isArray(e)?e.length:0,limit:t,offset:0,has_next:false}}}function Ue(e,t){return e/1e6*t}function Wn(e){return e===void 0?true:parseInt(e.split("-")[0],10)<1980}var Gn=60*1e3;function be(){return queryOptions({queryKey:c.core.dynamicProps(),refetchInterval:Gn,staleTime:Gn,queryFn:async({signal:e})=>{let[t,r,n,i,o]=await Promise.all([g("condenser_api.get_dynamic_global_properties",[],void 0,void 0,e),g("condenser_api.get_feed_history",[],void 0,void 0,e),g("condenser_api.get_chain_properties",[],void 0,void 0,e),g("condenser_api.get_reward_fund",["post"],void 0,void 0,e),g("database_api.get_hardfork_properties",{},void 0,void 0,e).catch(()=>({current_hardfork_version:"1.28.0",last_hardfork:28}))]),s=C(t.total_vesting_shares).amount,a=C(t.total_vesting_fund_hive).amount,u=0;Number.isFinite(s)&&s!==0&&Number.isFinite(a)&&(u=a/s*1e6);let p=C(r.current_median_history.base).amount,l=C(r.current_median_history.quote).amount,f=parseFloat(i.recent_claims),m=C(i.reward_balance).amount,y=Number(t.vote_power_reserve_rate??0),h=i.author_reward_curve??"linear",E=Number(i.content_constant??0),O=String(o.current_hardfork_version??"0.0.0"),A=Number(o.last_hardfork??0),P=t.hbd_print_rate,L=t.hbd_interest_rate,U=t.head_block_number,B=a,Q=s,$=C(t.virtual_supply).amount,Se=t.vesting_reward_percent||0,ze=n.account_creation_fee;return {hivePerMVests:u,base:p,quote:l,fundRecentClaims:f,fundRewardBalance:m,votePowerReserveRate:y,authorRewardCurve:h,contentConstant:E,currentHardforkVersion:O,lastHardfork:A,hbdPrintRate:P,hbdInterestRate:L,headBlock:U,totalVestingFund:B,totalVestingShares:Q,virtualSupply:$,vestingRewardPercent:Se,accountCreationFee:ze,raw:{globalDynamic:t,feedHistory:r,chainProps:n,rewardFund:i,hardforkProps:o}}}})}function Gm(e="post"){return queryOptions({queryKey:c.core.rewardFund(e),queryFn:()=>g("condenser_api.get_reward_fund",[e])})}function Fe(...e){let t=e.length;for(;t>0&&e[t-1]===void 0;)t--;return e.slice(0,t)}var c={posts:{entry:e=>["posts","entry",e],postHeader:(e,t)=>["posts","post-header",e,t],content:(e,t)=>["posts","content",e,t],contentReplies:(e,t)=>["posts","content-replies",e,t],accountPosts:(e,t,r,n)=>["posts","account-posts",e,t,r,n],accountPostsPage:(e,t,r,n,i,o)=>["posts","account-posts-page",e,t,r,n,i,o],userPostVote:(e,t,r)=>["posts","user-vote",e,t,r],reblogs:(e,t)=>["posts","reblogs",e,t],entryActiveVotes:(e,t)=>["posts","entry-active-votes",e,t],rebloggedBy:(e,t)=>["posts","reblogged-by",e,t],tips:(e,t)=>["posts","tips",e,t],normalize:(e,t)=>["posts","normalize",e,t],drafts:e=>["posts","drafts",e],draftsInfinite:(e,t)=>Fe("posts","drafts","infinite",e,t),schedules:e=>["posts","schedules",e],schedulesInfinite:(e,t)=>Fe("posts","schedules","infinite",e,t),fragments:e=>["posts","fragments",e],fragmentsInfinite:(e,t)=>Fe("posts","fragments","infinite",e,t),images:e=>["posts","images",e],galleryImages:e=>["posts","gallery-images",e],imagesInfinite:(e,t)=>Fe("posts","images","infinite",e,t),promoted:e=>["posts","promoted",e],_promotedPrefix:["posts","promoted"],accountPostsBlogPrefix:e=>["posts","account-posts",e,"blog"],postsRanked:(e,t,r,n)=>["posts","posts-ranked",e,t,r,n],postsRankedPage:(e,t,r,n,i,o)=>["posts","posts-ranked-page",e,t,r,n,i,o],discussions:(e,t,r,n)=>["posts","discussions",e,t,r,n],discussion:(e,t,r)=>["posts","discussion",e,t,r],deletedEntry:e=>["posts","deleted-entry",e],commentHistory:(e,t,r)=>["posts","comment-history",e,t,r],trendingTags:()=>["posts","trending-tags"],trendingTagsWithStats:e=>["posts","trending-tags","stats",e],wavesFeed:(e={})=>["posts","waves","feed",e.tag??"",e.following??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],shortsFeed:(e={})=>["posts","waves","shorts",e.tag??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],wavesByHost:e=>["posts","waves","by-host",e],wavesByTag:(e,t)=>["posts","waves","by-tag",e,t],wavesFollowing:(e,t)=>["posts","waves","following",e,t],wavesTrendingTags:(e,t)=>["posts","waves","trending-tags",e,t],wavesByAccount:(e,t)=>["posts","waves","by-account",e,t],wavesTrendingAuthors:e=>["posts","waves","trending-authors",e],_prefix:["posts"]},accounts:{full:e=>["get-account-full",e],list:(...e)=>["accounts","list",...e],friends:(e,t,r,n)=>["accounts","friends",e,t,r,n],searchFriends:(e,t,r)=>["accounts","friends","search",e,t,r],subscriptions:e=>["accounts","subscriptions",e],followCount:e=>["accounts","follow-count",e],recoveries:e=>["accounts","recoveries",e],pendingRecovery:e=>["accounts","recoveries",e,"pending-request"],checkWalletPending:(e,t)=>["accounts","check-wallet-pending",e,t],mutedUsers:e=>["accounts","muted-users",e],following:(e,t,r,n)=>["accounts","following",e,t,r,n],followers:(e,t,r,n)=>["accounts","followers",e,t,r,n],search:(e,t)=>["accounts","search",e,t],profiles:(e,t)=>["accounts","profiles",e,t],lookup:(e,t)=>["accounts","lookup",e,t],transactions:(e,t,r)=>["accounts","transactions",e,t,r],favorites:e=>["accounts","favorites",e],favoritesInfinite:(e,t)=>Fe("accounts","favorites","infinite",e,t),checkFavorite:(e,t)=>["accounts","favorites","check",e,t],relations:(e,t)=>["accounts","relations",e,t],bots:()=>["accounts","bots"],voteHistory:(e,t)=>["accounts","vote-history",e,t],reputations:(e,t)=>["accounts","reputations",e,t],bookmarks:e=>["accounts","bookmarks",e],bookmarksInfinite:(e,t)=>Fe("accounts","bookmarks","infinite",e,t),referrals:e=>["accounts","referrals",e],referralsStats:e=>["accounts","referrals-stats",e],proMembers:()=>["accounts","pro-members"],_prefix:["accounts"]},notifications:{announcements:()=>["notifications","announcements"],spotlights:()=>["notifications","spotlights"],list:(e,t)=>["notifications",e,t],unreadCount:e=>["notifications","unread",e],settings:e=>["notifications","settings",e],_prefix:["notifications"]},core:{rewardFund:e=>["core","reward-fund",e],dynamicProps:()=>["core","dynamic-props"],chainProperties:()=>["core","chain-properties"],_prefix:["core"]},communities:{single:(e,t)=>["community","single",e,t],singlePrefix:e=>["community","single",e],context:(e,t)=>["community","context",e,t],rewarded:()=>["communities","rewarded"],list:(e,t,r)=>["communities","list",e,t,r],subscribers:e=>["communities","subscribers",e],subscribersInfinite:e=>["communities","subscribers","infinite",e],accountNotifications:(e,t)=>["communities","account-notifications",e,t]},proposals:{list:()=>["proposals","list"],proposal:e=>["proposals","proposal",e],votes:(e,t,r)=>["proposals","votes",e,t,r],votesPrefix:e=>["proposals","votes",e],votesByUser:e=>["proposals","votes","by-user",e]},search:{topics:(e,t)=>["search","topics",e,t],path:e=>["search","path",e],account:(e,t)=>["search","account",e,t],results:(e,t,r,n,i,o)=>["search",e,t,typeof r=="string"?r==="1"||r==="true":r,n,i,o],controversialRising:(e,t)=>["search","controversial-rising",e,t],similarEntries:(e,t,r)=>r?["search","similar-entries",e,t,r]:["search","similar-entries",e,t],api:(e,t,r,n,i,o)=>Fe("search","api",e,t,r,n,i,o)},witnesses:{list:e=>["witnesses","list",e],votes:e=>["witnesses","votes",e],proxy:()=>["witnesses","proxy"],voters:(e,t,r,n,i)=>["witnesses","voters",e,t,r,n,i],voterCount:e=>["witnesses","voter-count",e]},wallet:{outgoingRcDelegations:(e,t)=>["wallet","outgoing-rc-delegations",e,t],vestingDelegations:(e,t)=>["wallet","vesting-delegations",e,t],withdrawRoutes:e=>["wallet","withdraw-routes",e],incomingRc:e=>["wallet","incoming-rc",e],conversionRequests:e=>["wallet","conversion-requests",e],receivedVestingShares:e=>["wallet","received-vesting-shares",e],savingsWithdraw:e=>["wallet","savings-withdraw",e],openOrders:e=>["wallet","open-orders",e],collateralizedConversionRequests:e=>["wallet","collateralized-conversion-requests",e],recurrentTransfers:e=>["wallet","recurrent-transfers",e],balanceHistory:(e,t,r)=>["wallet","balance-history",e,t,r],aggregatedHistory:(e,t,r)=>r===void 0?["wallet","aggregated-history",e,t]:["wallet","aggregated-history",e,t,r],portfolio:(e,t,r)=>["wallet","portfolio","v2",e,t,r]},assets:{hiveGeneralInfo:e=>["assets","hive","general-info",e],hiveTransactions:(e,t,r)=>["assets","hive","transactions",e,t,r],hiveWithdrawalRoutes:e=>["assets","hive","withdrawal-routes",e],hiveMetrics:e=>["assets","hive","metrics",e],hbdGeneralInfo:e=>["assets","hbd","general-info",e],hbdTransactions:(e,t,r)=>["assets","hbd","transactions",e,t,r],hivePowerGeneralInfo:e=>["assets","hive-power","general-info",e],hivePowerDelegates:e=>["assets","hive-power","delegates",e],hivePowerDelegatings:e=>["assets","hive-power","delegatings",e],hivePowerTransactions:(e,t,r)=>["assets","hive-power","transactions",e,t,r],pointsGeneralInfo:e=>["assets","points","general-info",e],pointsTransactions:(e,t)=>["assets","points","transactions",e,t],ecencyAssetInfo:(e,t,r)=>["ecency-wallets","asset-info",e,t,r]},market:{statistics:()=>["market","statistics"],orderBook:e=>["market","order-book",e],history:(e,t,r)=>["market","history",e,t,r],feedHistory:()=>["market","feed-history"],hiveHbdStats:()=>["market","hive-hbd-stats"],data:(e,t,r,n)=>["market","data",e,t,r,n],tradeHistory:(e,t,r)=>["market","trade-history",e,t,r],currentMedianHistoryPrice:()=>["market","current-median-history-price"]},analytics:{discoverCuration:e=>["analytics","discover-curation",e],pageStats:(e,t,r,n)=>["analytics","page-stats",e,t,r,n],discoverLeaderboard:e=>["analytics","discover-leaderboard",e]},promotions:{promotePrice:()=>["promotions","promote-price"],boostPlusPrices:()=>["promotions","boost-plus-prices"],boostPlusAccounts:e=>["promotions","boost-plus-accounts",e]},resourceCredits:{account:e=>["resource-credits","account",e],stats:()=>["resource-credits","stats"]},points:{points:(e,t)=>["points",e,t],_prefix:e=>["points",e]},polls:{details:(e,t)=>["polls","details",e,t],vote:(e,t)=>e&&t?["polls","vote",e,t]:["polls","vote"],_prefix:["polls"]},operations:{chainProperties:()=>["operations","chain-properties"]},games:{statusCheck:(e,t)=>["games","status-check",e,t]},quests:{status:e=>["quests","status",e]},support:{settings:e=>["support","settings",e],_prefix:["support"]},badActors:{list:()=>["bad-actors","list"],_prefix:["bad-actors"]},ai:{prices:()=>["ai","prices"],assistPrices:e=>["ai","assist-prices",e],transcribePrice:e=>["ai","transcribe-price",e],_prefix:["ai"]}};function Zm(e){return queryOptions({queryKey:c.ai.prices(),queryFn:async()=>{let r=await w()(d.privateApiHost+"/private-api/ai-generate-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch AI generation prices: ${r.status}`);return await r.json()},staleTime:3e5,enabled:!!e})}function ng(e,t){return queryOptions({queryKey:c.ai.assistPrices(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-assist-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI assist prices: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function ag(e,t){return queryOptions({queryKey:c.ai.transcribePrice(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-transcribe-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI transcribe price: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function js(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function lg(e,t){return useMutation({mutationKey:["ai","generate-image"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][GenerateImage] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][GenerateImage] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-generate-image",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,us:e,prompt:r.prompt,aspect_ratio:r.aspect_ratio??"1:1",power:r.power??1,idempotency_key:r.idempotency_key??js()})});if(!i.ok){let s=await i.text(),a={};try{a=JSON.parse(s);}catch{}let u=new Error(`[SDK][AI][GenerateImage] \u2013 failed with status ${i.status}${s?`: ${s}`:""}`);throw u.status=i.status,u.data=a,u}if(i.status===202){let s={};try{s=await i.json();}catch{}let a=new Error("[SDK][AI][GenerateImage] \u2013 delivery pending");throw a.status=202,a.data=s,a}return await i.json()},onSuccess:()=>{e&&b().invalidateQueries({queryKey:c.points._prefix(e)});}})}function $s(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function gg(e,t){return useMutation({mutationKey:["ai","assist"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Assist] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][Assist] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-assist",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r.code??t,us:e,action:r.action,text:r.text,idempotency_key:$s()})});if(!i.ok){let o=await i.text(),s={};try{s=JSON.parse(o);}catch{}let a=new Error(`[SDK][AI][Assist] \u2013 failed with status ${i.status}${o?`: ${o}`:""}`);throw a.status=i.status,a.data=s,a}return await i.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.assistPrices(e)}));}})}function Gs(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function _g(e,t){return useMutation({mutationKey:["ai","transcribe"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Transcribe] \u2013 username wasn't provided");let n=r.code??t;if(!n)throw new Error("[SDK][AI][Transcribe] \u2013 access token wasn't found");let i=new FormData;i.append("code",n),i.append("duration_ms",String(Math.round(r.durationMs))),i.append("idempotency_key",r.idempotency_key??Gs()),i.append("audio",r.audio,r.fileName??"clip.webm");let s=await w()(d.privateApiHost+"/private-api/ai-transcribe",{method:"POST",body:i});if(!s.ok){let a=await s.text(),u={};try{u=JSON.parse(a);}catch{}throw Object.assign(new Error(`[SDK][AI][Transcribe] \u2013 failed with status ${s.status}${a?`: ${a}`:""}`),{status:s.status,data:u})}return await s.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.transcribePrice(e)}));}})}function ur(e){return !e.posting_json_metadata&&!e.json_metadata}function Js(e){return e?Object.values(e).some(t=>typeof t=="string"?t.length>0:t!=null):false}function M(e){return queryOptions({queryKey:c.accounts.full(e),queryFn:async({signal:t})=>{if(!e)return null;let[r,n]=await Promise.all([g("condenser_api.get_accounts",[[e]],void 0,void 0,t,p=>Array.isArray(p)),g("bridge.get_profile",{account:e},void 0,void 0,t).catch(p=>{if(t?.aborted)throw p;return null})]);if(!r?.[0])return null;let i=r[0];if(ur(i)&&Js(n?.metadata?.profile)){let p=await g("condenser_api.get_accounts",[[e]],void 0,void 0,t,l=>Array.isArray(l)&&(!l[0]||!ur(l[0])));if(p[0]&&!ur(p[0]))i=p[0];else throw new Error(`[SDK][Accounts] \u2013 inconsistent account row for ${e}: empty json metadata while hivemind profile is populated`)}let o=qe(i.posting_json_metadata),s=n?.stats,a=s?{account:i.name,follower_count:s.followers??0,following_count:s.following??0}:void 0,u=n?.reputation??0;return {name:i.name,owner:i.owner,active:i.active,posting:i.posting,memo_key:i.memo_key,post_count:i.post_count,created:i.created,posting_json_metadata:i.posting_json_metadata,last_vote_time:i.last_vote_time,last_post:i.last_post,json_metadata:i.json_metadata,reward_hive_balance:i.reward_hive_balance,reward_hbd_balance:i.reward_hbd_balance,reward_vesting_hive:i.reward_vesting_hive,reward_vesting_balance:i.reward_vesting_balance,balance:i.balance,hbd_balance:i.hbd_balance,savings_balance:i.savings_balance,savings_hbd_balance:i.savings_hbd_balance,savings_hbd_last_interest_payment:i.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:i.savings_hbd_seconds_last_update,savings_hbd_seconds:i.savings_hbd_seconds,next_vesting_withdrawal:i.next_vesting_withdrawal,pending_claimed_accounts:i.pending_claimed_accounts,vesting_shares:i.vesting_shares,delegated_vesting_shares:i.delegated_vesting_shares,received_vesting_shares:i.received_vesting_shares,vesting_withdraw_rate:i.vesting_withdraw_rate,to_withdraw:i.to_withdraw,withdrawn:i.withdrawn,witness_votes:i.witness_votes,proxy:i.proxy,recovery_account:i.recovery_account,proxied_vsf_votes:i.proxied_vsf_votes,voting_manabar:i.voting_manabar,voting_power:i.voting_power,downvote_manabar:i.downvote_manabar,follow_stats:a,reputation:u,profile:o}},enabled:!!e,staleTime:6e4})}var Ys=new Set(["__proto__","constructor","prototype"]);function St(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function zn(e,t){let r={...e};for(let n of Object.keys(t)){if(Ys.has(n))continue;let i=t[n],o=r[n];St(i)&&St(o)?r[n]=zn(o,i):r[n]=i;}return r}function Xs(e){if(!(!e||!Array.isArray(e)))return e.map(({meta:t,...r})=>{if(!t||typeof t!="object")return {...r,meta:t};let{privateKey:n,username:i,...o}=t;return {...r,meta:o}})}function qe(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.profile&&typeof t.profile=="object")return t.profile}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata:",t,{length:e?.length??0});}return {}}function Jn(e){return qe(e?.posting_json_metadata)}function Yn(e,t){if(!e)return t;if(!t)return e;let r=Object.keys(qe(e.posting_json_metadata)).length;return Object.keys(qe(t.posting_json_metadata)).length>r?t:e}function Zs(e){if(!e)return {};try{let t=JSON.parse(e);if(St(t))return t}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata root:",t,{length:e?.length??0});}return {}}function Xn({existingPostingJsonMetadata:e,profile:t,tokens:r}){let n=Zs(e),i=St(n.profile)?n.profile:{},o=pr({existingProfile:i,profile:t,tokens:r});return JSON.stringify({...n,profile:o})}function pr({existingProfile:e,profile:t,tokens:r}){let{tokens:n,version:i,...o}=t??{},s=zn(e??{},o);return s.tokens&&!Array.isArray(s.tokens)&&(s.tokens=void 0),r!==void 0?s.tokens=r&&r.length>0?r:[]:n!==void 0&&(s.tokens=n),s.tokens=Xs(s.tokens),s.version=2,s}function kt(e){return e.map(t=>{let r={name:t.name,owner:t.owner,active:t.active,posting:t.posting,memo_key:t.memo_key,post_count:t.post_count,created:t.created,reputation:t.reputation,posting_json_metadata:t.posting_json_metadata,last_vote_time:t.last_vote_time,last_post:t.last_post,json_metadata:t.json_metadata,reward_hive_balance:t.reward_hive_balance,reward_hbd_balance:t.reward_hbd_balance,reward_vesting_hive:t.reward_vesting_hive,reward_vesting_balance:t.reward_vesting_balance,balance:t.balance,hbd_balance:t.hbd_balance,savings_balance:t.savings_balance,savings_hbd_balance:t.savings_hbd_balance,savings_hbd_last_interest_payment:t.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:t.savings_hbd_seconds_last_update,savings_hbd_seconds:t.savings_hbd_seconds,next_vesting_withdrawal:t.next_vesting_withdrawal,pending_claimed_accounts:t.pending_claimed_accounts,vesting_shares:t.vesting_shares,delegated_vesting_shares:t.delegated_vesting_shares,received_vesting_shares:t.received_vesting_shares,vesting_withdraw_rate:t.vesting_withdraw_rate,to_withdraw:t.to_withdraw,withdrawn:t.withdrawn,witness_votes:t.witness_votes,proxy:t.proxy,recovery_account:t.recovery_account,proxied_vsf_votes:t.proxied_vsf_votes,voting_manabar:t.voting_manabar,voting_power:t.voting_power,downvote_manabar:t.downvote_manabar},n=qe(t.posting_json_metadata);if(!n||Object.keys(n).length===0)try{let i=JSON.parse(t.json_metadata||"{}");i.profile&&(n=i.profile);}catch{}return (!n||Object.keys(n).length===0)&&(n={about:"",cover_image:"",location:"",name:"",profile_image:"",website:""}),{...r,profile:n}})}function qg(e){return queryOptions({queryKey:c.accounts.list(...e),enabled:e.length>0,queryFn:async()=>{let t=await g("condenser_api.get_accounts",[e],void 0,void 0,void 0,r=>Array.isArray(r));return kt(t??[])}})}function Mg(e){return queryOptions({queryKey:c.accounts.followCount(e),queryFn:()=>g("condenser_api.get_follow_count",[e])})}function Vg(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.followers(e,t,r,n),queryFn:()=>g("condenser_api.get_followers",[e,t,r,n]),enabled:!!e})}function Gg(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.following(e,t,r,n),queryFn:()=>g("condenser_api.get_following",[e,t,r,n]),enabled:!!e})}var Zn=1e3,oa=20;function Zg(e){return queryOptions({queryKey:c.accounts.mutedUsers(e),queryFn:async()=>{let t=[],r="";for(let n=0;ns.following);if(o[0]===r&&(o=o.slice(1)),!o.length||(t.push(...o),i.lengthg("condenser_api.lookup_accounts",[e,t]),enabled:!!e,staleTime:1/0})}function uy(e,t=5,r=[]){return queryOptions({queryKey:c.accounts.search(e,r),enabled:!!e,queryFn:async()=>(await g("condenser_api.lookup_accounts",[e,t])).filter(i=>r.length>0?!r.includes(i):true)})}var ua=new Set(["ownerPublicKey","activePublicKey","postingPublicKey","memoPublicKey"]);function fy(e,t){return queryOptions({queryKey:c.accounts.checkWalletPending(e,t??null),queryFn:async()=>{if(!e||!t)return {exist:false};let n=await w()(d.privateApiHost+"/private-api/wallets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,code:t})});if(!n.ok)return {exist:false};let i=await n.json(),o=Array.isArray(i)?i.flatMap(s=>{if(!s||typeof s!="object")return [];let a=s,u=typeof a.token=="string"?a.token:void 0;if(!u)return [];let p=a.meta&&typeof a.meta=="object"?{...a.meta}:{},l={},f=typeof a.address=="string"&&a.address?a.address:void 0,y=(typeof a.status=="number"?a.status===3:void 0)??false;f&&(l.address=f),l.show=y;let h={symbol:u,currency:u,address:f,show:y,type:"CHAIN",meta:l},E=[];for(let[O,A]of Object.entries(p))typeof O=="string"&&(ua.has(O)||typeof A!="string"||!A||/^[A-Z0-9]{2,10}$/.test(O)&&E.push({symbol:O,currency:O,address:A,show:y,type:"CHAIN",meta:{address:A,show:y}}));return [h,...E]}):[];return {exist:o.length>0,tokens:o.length?o:void 0,wallets:o.length?o:void 0}},refetchOnMount:true})}function ei(e,t){return queryOptions({queryKey:c.accounts.relations(e,t),enabled:!!e&&!!t,refetchOnMount:false,refetchInterval:36e5,queryFn:async()=>{let r={follows:false,ignores:false,blacklists:false,follows_muted:false,follows_blacklists:false};return !e||!t?r:await g("bridge.get_relationship_between_accounts",[e,t])??r}})}function Ay(e){return queryOptions({queryKey:c.accounts.subscriptions(e),enabled:!!e,queryFn:async({signal:t})=>await g("bridge.list_all_subscriptions",{account:e},void 0,void 0,t)??[]})}function Ey(e,t){return queryOptions({queryKey:c.accounts.bookmarks(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Bookmarks] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/bookmarks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Sy(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.bookmarksInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch bookmarks: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ry(e,t){return queryOptions({queryKey:c.accounts.favorites(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Fy(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.favoritesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/favorites?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch favorites: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ky(e,t,r){return queryOptions({queryKey:c.accounts.checkFavorite(e,r),enabled:!!e&&!!t&&!!r,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");if(!r)throw new Error("[SDK][Accounts][Favorites] \u2013 no target username");let i=await w()(d.privateApiHost+"/private-api/favorites-check",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:r})});if(!i.ok)throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check failed with status ${i.status}: ${i.statusText}`);let o=await i.json();if(typeof o!="boolean")throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check returned invalid type: expected boolean, got ${typeof o}`);return o}})}function Qy(e,t){return queryOptions({enabled:!!e&&!!t,queryKey:c.accounts.recoveries(e),queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts] Missing username or access token");return (await w()(d.privateApiHost+"/private-api/recoveries",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Ly(e){return queryOptions({enabled:!!e,queryKey:c.accounts.pendingRecovery(e),queryFn:()=>g("database_api.find_change_recovery_account_requests",{accounts:[e]})})}function Jy(e,t=50){return queryOptions({queryKey:c.accounts.reputations(e,t),enabled:!!e,queryFn:async()=>e?g("condenser_api.get_account_reputations",[e,t]):[]})}var D=re.operations,ti={transfers:[D.transfer,D.transfer_to_savings,D.transfer_from_savings,D.cancel_transfer_from_savings,D.recurrent_transfer,D.fill_recurrent_transfer,D.escrow_transfer,D.fill_recurrent_transfer],"market-orders":[D.fill_convert_request,D.fill_order,D.fill_collateralized_convert_request,D.limit_order_create2,D.limit_order_create,D.limit_order_cancel],interests:[D.interest],"stake-operations":[D.return_vesting_delegation,D.withdraw_vesting,D.transfer_to_vesting,D.set_withdraw_vesting_route,D.update_proposal_votes,D.fill_vesting_withdraw,D.account_witness_proxy,D.delegate_vesting_shares],rewards:[D.author_reward,D.curation_reward,D.producer_reward,D.claim_reward_balance,D.comment_benefactor_reward,D.liquidity_reward,D.proposal_pay]},va=[...Object.values(ti)].reduce((e,t)=>e.concat(t),[]);function Aa(e){return e.block*1e7+e.trx_in_block*100+e.op_pos}function Pa(e){return e.replace(/_operation$/,"")}function Oa(e){return typeof e=="object"&&e!==null&&"nai"in e&&"amount"in e&&"precision"in e}function xa(e){if(!Oa(e))return e;let t=C(e),r=Et[e.nai]??"UNKNOWN";return `${t.amount.toFixed(e.precision)} ${r}`}function Ea(e){let t={};for(let[r,n]of Object.entries(e))t[r]=xa(n);return t}function ih(e,t=20,r=""){let n=r?ti[r]:va;return infiniteQueryOptions({queryKey:c.accounts.transactions(e??"",r,t),initialPageParam:null,queryFn:async({pageParam:i,signal:o})=>{if(!e)return {entries:[],currentPage:0};let s={"account-name":e,"operation-types":n.join(","),"page-size":t};i!==null&&(s.page=i);let a=await ee("hafah","/accounts/{account-name}/operations",s,void 0,void 0,o);return {entries:a.operations_result.map(p=>{let l=Pa(p.op.type);return {...Ea(p.op.value),num:Aa(p),type:l,timestamp:p.timestamp,trx_id:p.trx_id}}),currentPage:i??a.total_pages}},getNextPageParam:i=>{let o=i.currentPage-1;return o>=1?o:void 0}})}function ch(){return queryOptions({queryKey:c.accounts.bots(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/public/bots",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch bots: ${e.status}`);return e.json()},refetchOnMount:true,staleTime:1/0})}function dh(e){return infiniteQueryOptions({queryKey:c.accounts.referrals(e),initialPageParam:{maxId:void 0},queryFn:async({pageParam:t})=>{let{maxId:r}=t??{},n=N.getValidatedBaseUrl(),i=new URL(`/private-api/referrals/${e}`,n);r!==void 0&&i.searchParams.set("max_id",r.toString());let o=await fetch(i.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`Failed to fetch referrals: ${o.status}`);return o.json()},getNextPageParam:t=>{let r=t?.[t.length-1]?.id;return typeof r=="number"?{maxId:r}:void 0}})}function yh(e){return queryOptions({queryKey:c.accounts.referralsStats(e),queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/referrals/${e}/stats`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch referral stats: ${t.status}`);let r=await t.json();if(!r)throw new Error("No Referrals for this user!");return {total:r.total??0,rewarded:r.rewarded??0}}})}function Ah(e,t,r){let{followType:n="blog",limit:i=100,enabled:o=true}=r??{};return infiniteQueryOptions({queryKey:c.accounts.friends(e,t,n,i),initialPageParam:{startFollowing:""},enabled:o,refetchOnMount:true,queryFn:async({pageParam:s})=>{let{startFollowing:a}=s,l=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,a===""?null:a,n,i])).map(y=>t==="following"?y.following:y.follower);return (await g("bridge.get_profiles",{accounts:l,observer:void 0})??[]).map(y=>({name:y.name,reputation:y.reputation,active:y.active}))},getNextPageParam:s=>s&&s.length===i?{startFollowing:s[s.length-1].name}:void 0})}var Fa=30;function Sh(e,t,r){return queryOptions({queryKey:c.accounts.searchFriends(e,t,r),refetchOnMount:false,enabled:false,queryFn:async()=>{if(!r)return [];let n=r.slice(0,-1),s=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,n,"blog",1e3])).map(u=>t==="following"?u.following:u.follower).filter(u=>u.toLowerCase().includes(r.toLowerCase())).slice(0,Fa);return (await g("bridge.get_profiles",{accounts:s,observer:void 0}))?.map(u=>({name:u.name,full_name:u.metadata.profile?.name||"",reputation:u.reputation,active:u.active}))??[]}})}function Fh(e=20){return infiniteQueryOptions({queryKey:c.posts.trendingTags(),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!n.name.startsWith("hive-")).map(n=>n.name)),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length>0?{afterTag:t[t.length-1]}:void 0,staleTime:3600*1e3})}function Mh(e=250){return infiniteQueryOptions({queryKey:c.posts.trendingTagsWithStats(e),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!$n(n.name))),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length?{afterTag:t[t.length-1].name}:void 0,staleTime:1/0})}function Ve(e,t){return queryOptions({queryKey:c.posts.fragments(e),queryFn:async()=>t?(await w()(d.privateApiHost+"/private-api/fragments",{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json():[],enabled:!!e&&!!t})}function Uh(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.fragmentsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/fragments?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch fragments: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function $h(e="feed"){return queryOptions({queryKey:c.posts.promoted(e),queryFn:async()=>{let t=N.getValidatedBaseUrl(),r=new URL("/private-api/promoted-entries",t);return e==="waves"&&r.searchParams.append("short_content","1"),await(await w()(r.toString(),{method:"GET",headers:{"Content-Type":"application/json"}})).json()}})}function Yh(e){return queryOptions({queryKey:c.posts.entryActiveVotes(e?.author,e?.permlink),queryFn:async()=>g("condenser_api.get_active_votes",[e?.author,e?.permlink]),enabled:!!e})}function rw(e,t,r){return queryOptions({queryKey:c.posts.userPostVote(e,t,r),queryFn:async()=>(await g("database_api.list_votes",{start:[e,t,r],limit:1,order:"by_voter_comment"}))?.votes?.[0]||null,enabled:!!e&&!!t&&!!r})}function aw(e,t){return queryOptions({queryKey:c.posts.content(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content",[e,t])})}function dw(e,t){return queryOptions({queryKey:c.posts.contentReplies(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content_replies",{author:e,permlink:t})})}function hw(e,t){return queryOptions({queryKey:c.posts.postHeader(e,t),queryFn:async()=>g("bridge.get_post_header",{author:e,permlink:t}),initialData:null})}function te(e){return Array.isArray(e)?e.map(t=>ri(t)):ri(e)}function ri(e){if(!e)return e;let t=`@${e.author}/${e.permlink}`;return d.dmcaPatterns.includes(t)||d.dmcaPatternRegexes.some(n=>n.test(t))?{...e,body:"This post is not available due to a copyright/fraudulent claim.",title:""}:e}async function ni(e,t,r){try{let n=await At("bridge.get_post",{author:e,permlink:t,observer:r},1);if(n&&typeof n=="object"&&n.author===e&&n.permlink===t)return n}catch{}return null}function ii(e,t,r="",n){let i=t?.trim(),o=`/@${e}/${i??""}`;return queryOptions({queryKey:c.posts.entry(o),queryFn:async()=>{if(!i||i==="undefined")return null;let s=await g("bridge.get_post",{author:e,permlink:i,observer:r});if(!s){let u=await ni(e,i,r);if(!u)return null;let p=n!==void 0?{...u,num:n}:u;return te(p)}let a=n!==void 0?{...s,num:n}:s;return te(a)},enabled:!!e&&!!t&&t.trim()!==""&&t.trim()!=="undefined"})}function se(e,t,r){return g(`bridge.${e}`,t,void 0,void 0,r)}async function oi(e,t,r,n){let{json_metadata:i}=e;if(i?.original_author&&i?.original_permlink&&i.tags?.[0]==="cross-post")try{let o=await ja(i.original_author,i.original_permlink,t,r,n);return o?{...e,original_entry:o,num:r}:e}catch{return e}return {...e,num:r}}async function si(e,t,r){let n=e.map(rt),i=await Promise.all(n.map(o=>oi(o,t,void 0,r)));return te(i)}async function ai(e,t="",r="",n=20,i="",o="",s){let a=await se("get_ranked_posts",{sort:e,start_author:t,start_permlink:r,limit:n,tag:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_ranked_posts returned ${typeof a} instead of an array for sort=${e}; treating as no results.`),null)}async function lr(e,t,r="",n="",i=20,o="",s){if(d.dmcaAccounts.includes(t))return [];let a=await se("get_account_posts",{sort:e,account:t,start_author:r,start_permlink:n,limit:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_account_posts returned ${typeof a} instead of an array for account=${t}, sort=${e}; treating as no results.`),null)}function rt(e){let t={...e,active_votes:Array.isArray(e.active_votes)?[...e.active_votes]:[],beneficiaries:Array.isArray(e.beneficiaries)?[...e.beneficiaries]:[],blacklists:Array.isArray(e.blacklists)?[...e.blacklists]:[],replies:Array.isArray(e.replies)?[...e.replies]:[],stats:e.stats?{...e.stats}:null},r=["author","title","body","created","category","permlink","url","updated"];for(let n of r)t[n]==null&&(t[n]="");return t.author_reputation==null&&(t.author_reputation=0),t.children==null&&(t.children=0),t.depth==null&&(t.depth=0),t.net_rshares==null&&(t.net_rshares=0),t.payout==null&&(t.payout=0),t.percent_hbd==null&&(t.percent_hbd=0),t.stats||(t.stats={flag_weight:0,gray:false,hide:false,total_votes:0}),t.author_payout_value==null&&(t.author_payout_value="0.000 HBD"),t.curator_payout_value==null&&(t.curator_payout_value="0.000 HBD"),t.max_accepted_payout==null&&(t.max_accepted_payout="1000000.000 HBD"),t.payout_at==null&&(t.payout_at=""),t.pending_payout_value==null&&(t.pending_payout_value="0.000 HBD"),t.promoted==null&&(t.promoted="0.000 HBD"),t.is_paidout==null&&(t.is_paidout=false),t}async function ja(e="",t="",r="",n,i){let o=await se("get_post",{author:e,permlink:t,observer:r},i);if(o){let s=rt(o),a=await oi(s,r,n,i);return te(a)}}async function Fw(e="",t=""){let r=await se("get_post_header",{author:e,permlink:t});return r&&rt(r)}async function ci(e,t,r){let n=await se("get_discussion",{author:e,permlink:t,observer:r||e});if(n){let i={};for(let[o,s]of Object.entries(n))i[o]=rt(s);return i}return n}async function ui(e,t=""){return se("get_community",{name:e,observer:t})}async function qw(e="",t=100,r,n="rank",i=""){return se("list_communities",{last:e,limit:t,query:r,sort:n,observer:i})}async function pi(e){let t=await se("normalize_post",{post:e});return t&&rt(t)}async function Iw(e){return se("list_all_subscriptions",{account:e})}async function Dw(e){return se("list_subscribers",{community:e})}async function Kw(e,t){return se("get_relationship_between_accounts",[e,t])}async function Ct(e,t){return se("get_profiles",{accounts:e,observer:t})}var di=(i=>(i.trending="trending",i.author_reputation="author_reputation",i.votes="votes",i.created="created",i))(di||{});function dr(e){let t=e.match(/^(\d+\.?\d*)\s*([A-Z]+)$/);return t?{amount:parseFloat(t[1]),symbol:t[2]}:{amount:0,symbol:""}}function La(e,t,r){let n=l=>dr(l.pending_payout_value).amount+dr(l.author_payout_value).amount+dr(l.curator_payout_value).amount,i=l=>l.net_rshares<0,o=l=>e.json_metadata?.pinned_reply===`${l.author}/${l.permlink}`,s={trending:(l,f)=>{if(i(l))return 1;if(i(f))return -1;let m=n(l),y=n(f);return m!==y?y-m:0},author_reputation:(l,f)=>{let m=l.author_reputation,y=f.author_reputation;return m>y?-1:m{let m=l.children,y=f.children;return m>y?-1:m{if(i(l))return 1;if(i(f))return -1;let m=Date.parse(l.created),y=Date.parse(f.created);return m>y?-1:mo(l)),p=a[u];return u>=0&&(a.splice(u,1),a.unshift(p)),a}function fi(e,t="created",r=true,n){let i=n||d.defaultObserver;return queryOptions({queryKey:c.posts.discussions(e?.author,e?.permlink,t,i),queryFn:async()=>{if(!e)return [];let o=await g("bridge.get_discussion",{author:e.author,permlink:e.permlink,observer:i}),s=o?Array.from(Object.values(o)):[];return te(s)},enabled:r&&!!e,select:o=>La(e,o,t),structuralSharing:(o,s)=>{if(!o||!s)return s;let a=o.filter(l=>l.is_optimistic===true),u=new Set(s.map(l=>`${l.author}/${l.permlink}`)),p=a.filter(l=>!u.has(`${l.author}/${l.permlink}`));return p.length>0?[...s,...p]:s}})}function Vw(e,t,r,n=true){let i=r||d.defaultObserver;return queryOptions({queryKey:c.posts.discussion(e,t,i),enabled:n&&!!e&&!!t,queryFn:async()=>ci(e,t,i)})}function Jw(e,t="posts",r=20,n="",i=true){return infiniteQueryOptions({queryKey:c.posts.accountPosts(e??"",t,r,n),enabled:!!e&&i,initialPageParam:{author:void 0,permlink:void 0,hasNextPage:true},queryFn:async({pageParam:o,signal:s})=>{if(!o?.hasNextPage||!e)return [];let a=await lr(t,e,o.author??"",o.permlink??"",r,n,s);return te(a??[])},getNextPageParam:o=>{let s=o?.[o.length-1],a=(o?.length??0)===r;if(a)return {author:s?.author,permlink:s?.permlink,hasNextPage:a}}})}function Yw(e,t="posts",r="",n="",i=20,o="",s=true){return queryOptions({queryKey:c.posts.accountPostsPage(e??"",t,r,n,i,o),enabled:!!e&&s,queryFn:async({signal:a}={})=>{if(!e)return [];let u=await lr(t,e,r,n,i,o,a);return te(u??[])}})}var mi=new Map;function Ja(e){let t=mi.get(e);return t||(t=r=>({...r,pages:r.pages.map(n=>Ya(n,e))}),mi.set(e,t)),t}function Ya(e,t){let r=e.filter(o=>o.stats?.is_pinned),n=e.filter(o=>!o.stats?.is_pinned);if(t==="hot")return [...r,...n];let i=[...n].sort((o,s)=>new Date(s.created).getTime()-new Date(o.created).getTime());return [...r,...i]}function o_(e,t,r=20,n="",i=true,o={}){return infiniteQueryOptions({queryKey:c.posts.postsRanked(e,t,r,n),queryFn:async({pageParam:s,signal:a})=>{let u=t;d.dmcaTagRegexes.some(l=>l.test(t))&&(u="");let p=await g("bridge.get_ranked_posts",{sort:e,start_author:s.author,start_permlink:s.permlink,limit:r,tag:u,observer:n},void 0,void 0,a);if(p==null)return [];if(!Array.isArray(p))throw new Error(`[SDK] get_ranked_posts returned ${typeof p} for sort=${e}`);return te(p)},select:Ja(e),enabled:i,initialPageParam:{author:void 0,permlink:void 0},getNextPageParam:s=>{let a=s?.[s.length-1];if(a)return {author:a.author,permlink:a.permlink}}})}function s_(e,t="",r="",n=20,i="",o="",s=true){return queryOptions({queryKey:c.posts.postsRankedPage(e,t,r,n,i,o),enabled:s,queryFn:async({signal:a}={})=>{let u=i;d.dmcaTagRegexes.some(l=>l.test(i))&&(u="");let p=await ai(e,t,r,n,u,o,a);return te(p??[])}})}function l_(e,t,r=200){return queryOptions({queryKey:c.posts.reblogs(e??"",r),queryFn:async()=>(await g("condenser_api.get_blog_entries",[e??t,0,r])).filter(i=>i.author!==t&&!i.reblogged_on.startsWith("1970-")).map(i=>({author:i.author,permlink:i.permlink})),enabled:!!e})}function y_(e,t){return queryOptions({queryKey:c.posts.rebloggedBy(e??"",t??""),queryFn:async()=>{if(!e||!t)return [];let r=await g("condenser_api.get_reblogged_by",[e,t]);return Array.isArray(r)?r:[]},enabled:!!e&&!!t})}function b_(e,t){return queryOptions({queryKey:c.posts.schedules(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/schedules",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch schedules: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function v_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.schedulesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/schedules?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch schedules: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function x_(e,t){return queryOptions({queryKey:c.posts.drafts(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch drafts: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function E_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.draftsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/drafts?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch drafts: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}async function yi(e){let r=await w()(d.privateApiHost+"/private-api/images",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch images: ${r.status}`);return r.json()}function T_(e,t){return queryOptions({queryKey:c.posts.images(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function R_(e,t){return queryOptions({queryKey:c.posts.galleryImages(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function F_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.imagesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/images?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch images: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function K_(e,t,r=false){return queryOptions({queryKey:c.posts.commentHistory(e,t,r),queryFn:async({signal:n})=>{let i=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:t,onlyMeta:r?"1":""}),signal:n});if(!i.ok)throw new Error(`Failed to fetch comment history: ${i.status}`);return i.json()},enabled:!!e&&!!t})}function ac(e,t){let r=e?.trim(),n=t?.trim();if(!r||!n)throw new Error("Invalid entry path: author and permlink are required");let i=r.replace(/^@+/,""),o=n.replace(/^\/+/,"");if(!i||!o)throw new Error("Invalid entry path: author and permlink cannot be empty after normalization");return `@${i}/${o}`}function Q_(e,t){let r=t?.trim(),n=e?.trim(),i=!!n&&!!r&&r!=="undefined",o=i?ac(n,r):"";return queryOptions({queryKey:c.posts.deletedEntry(o),queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:r||""}),signal:s});if(!a.ok)throw new Error(`Failed to fetch comment history: ${a.status}`);return a.json()},select:s=>{if(!s?.list?.[0])return null;let{body:a,title:u,tags:p}=s.list[0];return {body:a,title:u,tags:p}},enabled:i})}function j_(e,t,r=true){return queryOptions({queryKey:c.posts.tips(e,t),queryFn:async()=>{let n=`/private-api/post-tips/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,i=await fetch(d.privateApiHost+n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch post tips: ${i.status}`);return i.json()},enabled:!!e&&!!t&&r,staleTime:60*1e3})}function uc(e,t){return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,host:t}}function pc(e){return {...e,id:e.id??e.post_id}}function me(e,t){if(!e)return null;let r=e.container??e,n=uc(r,t),i=e.parent?pc(e.parent):void 0;return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,max_accepted_payout:e.max_accepted_payout||"1000000.000 HBD",pending_payout_value:e.pending_payout_value||"0.000 HBD",author_payout_value:e.author_payout_value||"0.000 HBD",curator_payout_value:e.curator_payout_value||"0.000 HBD",host:t,container:n,parent:i}}function lc(e){return Array.isArray(e)?e:[]}async function hi(e){let t=fi(e,"created",true),r=await d.queryClient.fetchQuery(t),n=lc(r);if(n.length<=1)return [];let i=n.filter(({parent_author:s,parent_permlink:a})=>s===e.author&&a===e.permlink);return i.length===0?[]:i.filter(s=>!s.stats?.gray)}function wi(e,t,r){return e.length===0?[]:e.map(n=>{let i=e.find(o=>o.author===n.parent_author&&o.permlink===n.parent_permlink&&o.author!==r);return {...n,id:n.post_id,host:r,container:t,parent:i}}).filter(n=>n.container.post_id!==n.post_id).sort((n,i)=>new Date(i.created).getTime()-new Date(n.created).getTime())}var mc=20;function _i(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,following:e.following?.trim().toLowerCase()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??mc}}async function bi({containers:e,tag:t,following:r,author:n,observer:i,limit:o},s,a){let u=N.getValidatedBaseUrl(),p=new URL("/private-api/waves/feed",u);p.searchParams.set("limit",String(o)),s&&p.searchParams.set("cursor",s),e.forEach(m=>p.searchParams.append("container",m)),t&&p.searchParams.set("tag",t),r&&p.searchParams.set("following",r),n&&p.searchParams.set("author",n),i&&p.searchParams.set("observer",i);let l=await fetch(p.toString(),{method:"GET",signal:a});if(!l.ok)throw new Error(`Failed to fetch waves feed: ${l.status}`);let f=await l.json();return !Array.isArray(f)||f.length===0?[]:f.map(m=>{let y=me(m,m.host??"");return y?{...y,_cursor:m._cursor}:null}).filter(m=>!!m)}function X_(e={}){let t=_i(e),{containers:r,tag:n,following:i,author:o,observer:s,limit:a}=t;return infiniteQueryOptions({queryKey:c.posts.wavesFeed({containers:r,tag:n,following:i,author:o,observer:s,limit:a}),initialPageParam:void 0,queryFn:({pageParam:u,signal:p})=>bi(t,u,p),getNextPageParam:u=>{if(!(u.lengthbi(t,void 0,u)})}var yc=20;function hc(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??yc}}async function wc({containers:e,tag:t,author:r,observer:n,limit:i},o,s){let a=N.getValidatedBaseUrl(),u=new URL("/private-api/waves/shorts",a);u.searchParams.set("limit",String(i)),o&&u.searchParams.set("cursor",o),e.forEach(f=>u.searchParams.append("container",f)),t&&u.searchParams.set("tag",t),r&&u.searchParams.set("author",r),n&&u.searchParams.set("observer",n);let p=await fetch(u.toString(),{method:"GET",signal:s});if(!p.ok)throw new Error(`Failed to fetch shorts feed: ${p.status}`);let l=await p.json();return !Array.isArray(l)||l.length===0?[]:l.map(f=>{let m=me(f,f.host??"");return m?{...m,active_votes:m.active_votes??[],video:f.video,_cursor:f._cursor}:null}).filter(f=>!!f)}function ib(e={}){let t=hc(e),{containers:r,tag:n,author:i,observer:o,limit:s}=t;return infiniteQueryOptions({queryKey:c.posts.shortsFeed({containers:r,tag:n,author:i,observer:o,limit:s}),initialPageParam:void 0,queryFn:({pageParam:a,signal:u})=>wc(t,a,u),getNextPageParam:a=>{if(!(a.length(l.id=l.post_id,l.host=e,l));for(let l of u){if(o&&l.post_id===o){o=void 0;continue}if(i+=1,l.stats?.gray){r=l.author,n=l.permlink;continue}let f;try{f=await hi(l);}catch(m){console.error("[SDK] getThreads get_discussion error:",m),r=l.author,n=l.permlink;continue}if(f.length===0){r=l.author,n=l.permlink;continue}return {entries:wi(f,l,e)}}let p=u[u.length-1];if(!p)return null;r=p.author,n=p.permlink;}return null}function lb(e){return infiniteQueryOptions({queryKey:c.posts.wavesByHost(e),initialPageParam:void 0,queryFn:async({pageParam:t})=>{let r=await Ac(e,t);return r?r.entries:[]},getNextPageParam:t=>t?.[0]?.container})}var Oc=40;function yb(e,t,r=Oc){return infiniteQueryOptions({queryKey:c.posts.wavesByTag(e,t),initialPageParam:void 0,queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/tags",i);o.searchParams.set("container",e),o.searchParams.set("tag",t);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves by tag: ${s.status}`);return (await s.json()).slice(0,r).map(p=>me(p,e)).filter(p=>!!p).sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves by tag",i),[]}},getNextPageParam:()=>{}})}function vb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesFollowing(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/following",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves following feed: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves following feed",i),[]}},getNextPageParam:()=>{}})}function xb(e,t=24){let r=e?.trim()||void 0;return queryOptions({queryKey:c.posts.wavesTrendingTags(r??"",t),queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/trending/tags",i);r&&o.searchParams.set("container",r),o.searchParams.set("hours",t.toString());let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves trending tags: ${s.status}`);return (await s.json()).map(({tag:u,posts:p})=>({tag:u,posts:p}))}catch(i){return console.error("[SDK] Failed to fetch waves trending tags",i),[]}}})}function Tb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesByAccount(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/account",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves for account: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){throw console.error("[SDK] Failed to fetch waves for account",i),i}},getNextPageParam:()=>{}})}function Ib(e){return queryOptions({queryKey:c.posts.wavesTrendingAuthors(e),queryFn:async({signal:t})=>{try{let r=N.getValidatedBaseUrl(),n=new URL("/private-api/waves/trending/authors",r);n.searchParams.set("container",e);let i=await fetch(n.toString(),{method:"GET",signal:t});if(!i.ok)throw new Error(`Failed to fetch waves trending authors: ${i.status}`);return (await i.json()).map(({author:s,posts:a})=>({author:s,posts:a}))}catch(r){throw console.error("[SDK] Failed to fetch waves trending authors",r),r}}})}function Nb(e,t=true){return queryOptions({queryKey:c.posts.normalize(e?.author??"",e?.permlink??""),enabled:t&&!!e,queryFn:async()=>pi(e)})}function Rc(e){return !!e&&typeof e=="object"&&"author"in e&&"permlink"in e&&"active_votes"in e}function vi(e){let t=new Date(e);return (new Date().getTime()-t.getTime())/(1e3*60*60*24)}function Wb(e,t){let{limit:r=20,filters:n=[],dayLimit:i=7}=t??{};return infiniteQueryOptions({queryKey:c.accounts.voteHistory(e,r),initialPageParam:{start:-1},queryFn:async({pageParam:o})=>{let{start:s}=o,a=await g("condenser_api.get_account_history",[e,s,r,...n]),p=a.map(([m,y])=>({...y.op[1],num:m,timestamp:y.timestamp})).filter(m=>m.voter===e&&m.weight!==0&&vi(m.timestamp)<=i),l=[];for(let m of p){let y=await d.queryClient.fetchQuery(ii(m.author,m.permlink));Rc(y)&&l.push(y);}let[f]=a;return {lastDate:f?vi(f[1].timestamp):0,lastItemFetched:f?f[0]:s,entries:l}},getNextPageParam:o=>({start:o.lastItemFetched})})}function Xb(e,t,r=true){return queryOptions({queryKey:c.accounts.profiles(e,t??""),enabled:r&&e.length>0,queryFn:async()=>Ct(e,t)})}function iv(e,t="HIVE",r=200){return infiniteQueryOptions({queryKey:c.wallet.balanceHistory(e??"",t,r),initialPageParam:null,queryFn:async({pageParam:n,signal:i})=>{if(!e)return {entries:[],currentPage:0};let o={"account-name":e,"coin-type":t,"page-size":r,direction:"desc"};n!==null&&(o.page=n);let s=await ee("balance","/accounts/{account-name}/balance-history",o,void 0,void 0,i);return {entries:s.operations_result,currentPage:n??s.total_pages}},getNextPageParam:n=>{let i=n.currentPage-1;return i>=1?i:void 0},enabled:!!e})}function uv(e,t="HIVE",r="yearly"){return queryOptions({queryKey:c.wallet.aggregatedHistory(e??"",t,r),queryFn:async()=>e?await ee("balance","/accounts/{account-name}/aggregated-history",{"account-name":e,"coin-type":t,granularity:r}):[],enabled:!!e,staleTime:6e4})}function fv(){return queryOptions({queryKey:c.accounts.proMembers(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/pro-members",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch pro members: ${e.status}`);return e.json()},staleTime:300*1e3})}function mv(e){return new Set((e??[]).map(t=>t.toLowerCase()))}function bv(e,t,r){let n=useQueryClient(),{data:i}=useQuery(M(e));return v(["accounts","update"],e,o=>{let s=Yn(n.getQueryData(M(e).queryKey),i);if(!s)throw new Error("[SDK][Accounts] \u2013 cannot update not existing account");return [["account_update2",{account:e,json_metadata:"",extensions:[],posting_json_metadata:Xn({existingPostingJsonMetadata:s.posting_json_metadata,profile:o.profile,tokens:o.tokens})}]]},async(o,s)=>{n.setQueryData(M(e).queryKey,a=>{if(!a)return a;let u=JSON.parse(JSON.stringify(a));return u.profile=pr({existingProfile:Jn(a),profile:s.profile,tokens:s.tokens}),u}),await S(t?.adapter,r,[c.accounts.full(e)]);},t,void 0,{broadcastMode:r,onMutate:async()=>{if(e)try{await n.fetchQuery({...M(e),staleTime:0});}catch{}}})}function xv(e,t,r,n,i){return useMutation({mutationKey:["accounts","relation","update",e,t],mutationFn:async o=>{let s=ei(e,t);await b().prefetchQuery(s);let a=b().getQueryData(s.queryKey);return await Vn(e,"follow",["follow",{follower:e,following:t,what:[...o==="toggle-ignore"&&!a?.ignores?["ignore"]:[],...o==="toggle-follow"&&!a?.follows?["blog"]:[]]}],r),{...a,ignores:o==="toggle-ignore"?!a?.ignores:a?.ignores,follows:o==="toggle-follow"?!a?.follows:a?.follows}},onError:i,onSuccess(o){n(o),b().setQueryData(c.accounts.relations(e,t),o),t&&b().invalidateQueries(M(t));}})}function fr(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildVoteOp] Missing required parameters");if(n<-1e4||n>1e4)throw new Error("[SDK][buildVoteOp] Weight must be between -10000 and 10000");return ["vote",{voter:e,author:t,permlink:r,weight:n}]}function Ie(e,t,r,n,i,o,s){if(!e||!t||n===void 0||!o)throw new Error("[SDK][buildCommentOp] Missing required parameters");return ["comment",{parent_author:r,parent_permlink:n,author:e,permlink:t,title:i,body:o,json_metadata:JSON.stringify(s)}]}function De(e,t,r,n,i,o,s){if(!e||!t)throw new Error("[SDK][buildCommentOptionsOp] Missing required parameters");return ["comment_options",{author:e,permlink:t,max_accepted_payout:r,percent_hbd:n,allow_votes:i,allow_curation_rewards:o,extensions:s}]}function mr(e,t){if(!e||!t)throw new Error("[SDK][buildDeleteCommentOp] Missing required parameters");return ["delete_comment",{author:e,permlink:t}]}function gr(e,t,r,n=false){if(!e||!t||!r)throw new Error("[SDK][buildReblogOp] Missing required parameters");let i={account:e,author:t,permlink:r};return n&&(i.delete="delete"),["custom_json",{id:"follow",json:JSON.stringify(["reblog",i]),required_auths:[],required_posting_auths:[e]}]}function Ke(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferOp] Missing required parameters");return ["transfer",{from:e,to:t,amount:r,memo:n||""}]}function Nc(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiTransferOps] Missing required parameters");return t.trim().split(/[\s,]+/).filter(Boolean).map(o=>Ke(e,o.trim(),r,n))}function Qc(e,t,r,n,i,o){if(!e||!t||!r)throw new Error("[SDK][buildRecurrentTransferOp] Missing required parameters");if(i<24)throw new Error("[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours");return ["recurrent_transfer",{from:e,to:t,amount:r,memo:n||"",recurrence:i,executions:o,extensions:[]}]}function je(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferToSavingsOp] Missing required parameters");return ["transfer_to_savings",{from:e,to:t,amount:r,memo:n||""}]}function Be(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildTransferFromSavingsOp] Missing required parameters");return ["transfer_from_savings",{from:e,to:t,amount:r,memo:n||"",request_id:i}]}function Ai(e,t){if(!e||t===void 0)throw new Error("[SDK][buildCancelTransferFromSavingsOp] Missing required parameters");return ["cancel_transfer_from_savings",{from:e,request_id:t}]}function nt(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildClaimInterestOps] Missing required parameters");return [Be(e,t,r,n,i),Ai(e,i)]}function it(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildTransferToVestingOp] Missing required parameters");return ["transfer_to_vesting",{from:e,to:t,amount:r}]}function ot(e,t){if(!e||!t)throw new Error("[SDK][buildWithdrawVestingOp] Missing required parameters");return ["withdraw_vesting",{account:e,vesting_shares:t}]}function st(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildDelegateVestingSharesOp] Missing required parameters");return ["delegate_vesting_shares",{delegator:e,delegatee:t,vesting_shares:r}]}function at(e,t,r,n){if(!e||!t||r===void 0)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters");if(r<0||r>1e4)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");return ["set_withdraw_vesting_route",{from_account:e,to_account:t,percent:r,auto_vest:n}]}function ct(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildConvertOp] Missing required parameters");return ["convert",{owner:e,amount:t,requestid:r}]}function yr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildCollateralizedConvertOp] Missing required parameters");return ["collateralized_convert",{owner:e,amount:t,requestid:r}]}function Me(e,t,r,n="tokens"){return ["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:JSON.stringify({contractName:n,contractAction:t,contractPayload:r})}]}function hr(e,t){return ["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:JSON.stringify(t.map(r=>({symbol:r})))}]}function wr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildDelegateRcOp] Missing required parameters");let n=t.includes(",")?t.split(",").map(i=>i.trim()):[t];return ["custom_json",{id:"rc",json:JSON.stringify(["delegate_rc",{from:e,delegatees:n,max_rc:r}]),required_auths:[],required_posting_auths:[e]}]}function _r(e,t){if(!e||!t)throw new Error("[SDK][buildFollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["blog"]}]),required_auths:[],required_posting_auths:[e]}]}function Tt(e,t){if(!e||!t)throw new Error("[SDK][buildUnfollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:[]}]),required_auths:[],required_posting_auths:[e]}]}function Hc(e,t){if(!e||!t)throw new Error("[SDK][buildIgnoreOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["ignore"]}]),required_auths:[],required_posting_auths:[e]}]}function Uc(e,t){if(!e||!t)throw new Error("[SDK][buildUnignoreOp] Missing required parameters");return Tt(e,t)}function br(e,t){if(!e)throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");let r=t||new Date().toISOString().split(".")[0],n=["custom_json",{id:"notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}],i=["custom_json",{id:"ecency_notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}];return [n,i]}function vr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");return ["account_witness_vote",{account:e,witness:t,approve:r}]}function Ar(e,t){if(!e||t===void 0)throw new Error("[SDK][buildWitnessProxyOp] Missing required parameters");return ["account_witness_proxy",{account:e,proxy:t}]}function Pr(e,t){if(!e||!t.receiver||!t.subject||!t.permlink||!t.start||!t.end||!t.dailyPay)throw new Error("[SDK][buildProposalCreateOp] Missing required parameters");let r=new Date(t.start),n=new Date(t.end);if(r.toString()==="Invalid Date"||n.toString()==="Invalid Date")throw new Error("[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings");return ["create_proposal",{creator:e,receiver:t.receiver,start_date:t.start,end_date:t.end,daily_pay:t.dailyPay,subject:t.subject,permlink:t.permlink,extensions:[]}]}function Or(e,t,r){if(!e||!t||t.length===0||r===void 0)throw new Error("[SDK][buildProposalVoteOp] Missing required parameters");return ["update_proposal_votes",{voter:e,proposal_ids:t,approve:r,extensions:[]}]}function Vc(e,t){if(!e||!t||t.length===0)throw new Error("[SDK][buildRemoveProposalOp] Missing required parameters");return ["remove_proposal",{proposal_owner:e,proposal_ids:t,extensions:[]}]}function jc(e,t,r,n,i){if(e==null||typeof e!="number"||!t||!r||!n||!i)throw new Error("[SDK][buildUpdateProposalOp] Missing required parameters");return ["update_proposal",{proposal_id:e,creator:t,daily_pay:r,subject:n,permlink:i,extensions:[]}]}function xr(e,t){if(!e||!t)throw new Error("[SDK][buildSubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["subscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Er(e,t){if(!e||!t)throw new Error("[SDK][buildUnsubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["unsubscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Sr(e,t,r,n){if(!e||!t||!r||!n)throw new Error(`[SDK][buildSetRoleOp] Missing required parameters: username=${e}, community=${t}, account=${r}, role=${n}`);return ["custom_json",{id:"community",json:JSON.stringify(["setRole",{community:t,account:r,role:n}]),required_auths:[],required_posting_auths:[e]}]}function kr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildUpdateCommunityOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["updateProps",{community:t,props:r}]),required_auths:[],required_posting_auths:[e]}]}function Cr(e,t,r,n,i){if(!e||!t||!r||!n||i===void 0)throw new Error("[SDK][buildPinPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"pinPost":"unpinPost",{community:t,account:r,permlink:n}]),required_auths:[],required_posting_auths:[e]}]}function Tr(e,t,r,n,i,o){if(!e||!t||!r||!n||o===void 0)throw new Error("[SDK][buildMutePostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([o?"mutePost":"unmutePost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}function Lc(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildMuteUserOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"muteUser":"unmuteUser",{community:t,account:r,notes:n}]),required_auths:[],required_posting_auths:[e]}]}function $c(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildFlagPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["flagPost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}var Pi=(r=>(r.Buy="buy",r.Sell="sell",r))(Pi||{}),Oi=(r=>(r.EMPTY="",r.SWAP="9",r))(Oi||{});function Ft(e,t,r,n,i,o){if(!e||!t||!r||!i||o===void 0)throw new Error("[SDK][buildLimitOrderCreateOp] Missing required parameters");return ["limit_order_create",{owner:e,orderid:o,amount_to_sell:t,min_to_receive:r,fill_or_kill:n,expiration:i}]}function Rt(e,t=3){return e.toFixed(t)}function Wc(e,t,r,n,i=""){if(!e||n===void 0||!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new Error("[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters");let o=new Date(Date.now());o.setDate(o.getDate()+27);let s=o.toISOString().split(".")[0],a=+`${i}${Math.floor(Date.now()/1e3).toString().slice(2)}`,u=n==="buy"?`${Rt(t,3)} HBD`:`${Rt(t,3)} HIVE`,p=n==="buy"?`${Rt(r,3)} HIVE`:`${Rt(r,3)} HBD`;return Ft(e,u,p,false,s,a)}function Rr(e,t){if(!e||t===void 0)throw new Error("[SDK][buildLimitOrderCancelOp] Missing required parameters");return ["limit_order_cancel",{owner:e,orderid:t}]}function Fr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildClaimRewardBalanceOp] Missing required parameters");return ["claim_reward_balance",{account:e,reward_hive:t,reward_hbd:r,reward_vests:n}]}function Gc(e,t,r,n,i,o){if(!e||!i)throw new Error("[SDK][buildAccountUpdateOp] Missing required parameters");return ["account_update",{account:e,owner:t,active:r,posting:n,memo_key:i,json_metadata:o}]}function zc(e,t,r,n){if(!e||r===void 0)throw new Error("[SDK][buildAccountUpdate2Op] Missing required parameters");return ["account_update2",{account:e,json_metadata:t||"",posting_json_metadata:r,extensions:n||[]}]}function qr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildAccountCreateOp] Missing required parameters");let i={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},o={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},s={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["account_create",{creator:e,new_account_name:t,owner:i,active:o,posting:s,memo_key:r.memoPublicKey,json_metadata:"",fee:n}]}function Ir(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildCreateClaimedAccountOp] Missing required parameters");let n={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},i={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},o={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["create_claimed_account",{creator:e,new_account_name:t,owner:n,active:i,posting:o,memo_key:r.memoPublicKey,json_metadata:"",extensions:[]}]}function Dr(e,t){if(!e||!t)throw new Error("[SDK][buildClaimAccountOp] Missing required parameters");return ["claim_account",{creator:e,fee:t,extensions:[]}]}function Kr(e,t,r,n,i,o){if(!e||!t||!r||!i)throw new Error("[SDK][buildGrantPostingPermissionOp] Missing required parameters");let s=t.account_auths.findIndex(([p])=>p===r),a=[...t.account_auths];s>=0?a[s]=[r,n]:a.push([r,n]);let u={...t,account_auths:a};return u.account_auths.sort((p,l)=>p[0]>l[0]?1:-1),["account_update",{account:e,posting:u,memo_key:i,json_metadata:o}]}function Jc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildRevokePostingPermissionOp] Missing required parameters");let o={...t,account_auths:t.account_auths.filter(([s])=>s!==r)};return ["account_update",{account:e,posting:o,memo_key:n,json_metadata:i}]}function Yc(e,t,r=[]){if(!e||!t)throw new Error("[SDK][buildChangeRecoveryAccountOp] Missing required parameters");return ["change_recovery_account",{account_to_recover:e,new_recovery_account:t,extensions:r}]}function Xc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");return ["request_account_recovery",{recovery_account:e,account_to_recover:t,new_owner_authority:r,extensions:n}]}function Zc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRecoverAccountOp] Missing required parameters");return ["recover_account",{account_to_recover:e,new_owner_authority:t,recent_owner_authority:r,extensions:n}]}function Br(e,t,r){if(!e||!t||!Number.isFinite(r))throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");return ["custom_json",{id:"ecency_boost_plus",json:JSON.stringify({user:e,account:t,duration:r}),required_auths:[e],required_posting_auths:[]}]}function Mr(e,t){if(!e||!Number.isInteger(t)||t<=0)throw new Error("[SDK][buildRcDelegationOp] Missing or invalid parameters");return ["custom_json",{id:"ecency_rc_delegation",json:JSON.stringify({user:e,duration:t}),required_auths:[e],required_posting_auths:[]}]}function Nr(e,t,r,n){if(!e||!t||!r||!Number.isFinite(n))throw new Error("[SDK][buildPromoteOp] Missing required parameters");return ["custom_json",{id:"ecency_promote",json:JSON.stringify({user:e,author:t,permlink:r,duration:n}),required_auths:[e],required_posting_auths:[]}]}function Le(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildPointTransferOp] Missing required parameters");let i=r.replace(/POINTS\b/,"POINT");return ["custom_json",{id:"ecency_point_transfer",json:JSON.stringify({sender:e,receiver:t,amount:i,memo:n||""}),required_auths:[e],required_posting_auths:[]}]}function eu(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");let i=t.trim().split(/[\s,]+/).filter(Boolean);if(i.length===0)throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");return i.map(o=>Le(e,o.trim(),r,n))}function Qr(e){if(!e)throw new Error("[SDK][buildCommunityRegistrationOp] Missing required parameters");return ["custom_json",{id:"ecency_registration",json:JSON.stringify({name:e}),required_auths:[e],required_posting_auths:[]}]}function tu(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildActiveCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[e],required_posting_auths:[]}]}function ru(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildPostingCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[],required_posting_auths:[e]}]}function $v(e,t,r){return v(["accounts","follow"],e,({following:n})=>[_r(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function Jv(e,t,r){return v(["accounts","unfollow"],e,({following:n})=>[Tt(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function eA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","add",e],mutationFn:async({author:i,permlink:o})=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:i,permlink:o,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function iA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:i,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function cA(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","add",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/favorites-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})})).json()},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:n})}function fA(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");let s=await w()(d.privateApiHost+"/private-api/favorites-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})});if(!s.ok)throw new Error(`Failed to delete favorite: ${s.status}`);return s.json()},onMutate:async i=>{if(!e)return;let o=b(),s=c.accounts.favorites(e),a=c.accounts.favoritesInfinite(e),u=c.accounts.checkFavorite(e,i);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a}),o.cancelQueries({queryKey:u})]);let p=o.getQueryData(s);p&&o.setQueryData(s,p.filter(y=>y.account!==i));let l=o.getQueryData(u);o.setQueryData(u,false);let f=o.getQueriesData({queryKey:a}),m=new Map(f);for(let[y,h]of f)h&&o.setQueryData(y,{...h,pages:h.pages.map(E=>({...E,data:E.data.filter(O=>O.account!==i)}))});return {previousList:p,previousInfinite:m,previousCheck:l}},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.accounts.favorites(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);s?.previousCheck!==void 0&&a.setQueryData(c.accounts.checkFavorite(e,o),s.previousCheck),n(i);}})}function uu(e,t){let r=new Map;return e.forEach(([n,i])=>{r.set(n.toString(),i);}),t.forEach(([n,i])=>{r.set(n.toString(),i);}),Array.from(r.entries()).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i])}function xi(e,t){let{data:r}=useQuery(M(e));return useMutation({mutationKey:["accounts","keys-update",e],mutationFn:async({keys:n,keepCurrent:i=false,currentKey:o,keysToRevoke:s=[],keysToRevokeByAuthority:a={}})=>{if(n.length===0)throw new Error("[SDK][Update password] \u2013 no new keys provided");if(!r)throw new Error("[SDK][Update password] \u2013 cannot update keys for anon user");let u=p=>{let l=JSON.parse(JSON.stringify(r[p])),m=[...a[p]||[],...a[p]===void 0?s:[]],y=i?l.key_auths.filter(([h])=>!m.includes(h.toString())):[];return l.key_auths=uu(y,n.map((h,E)=>[h[p].createPublic().toString(),E+1])),l};return Z([["account_update",{account:e,json_metadata:r.json_metadata,owner:u("owner"),active:u("active"),posting:u("posting"),memo_key:n[0].memo_key.createPublic().toString()}]],o)},...t})}function PA(e,t){let{data:r}=useQuery(M(e)),{mutateAsync:n}=xi(e);return useMutation({mutationKey:["accounts","password-update",e],mutationFn:async({newPassword:i,currentPassword:o,keepCurrent:s})=>{if(!r)throw new Error("[SDK][Update password] \u2013 cannot update password for anon user");let a=H.fromLogin(e,o,"owner");return n({currentKey:a,keepCurrent:s,keys:[{owner:H.fromLogin(e,i,"owner"),active:H.fromLogin(e,i,"active"),posting:H.fromLogin(e,i,"posting"),memo_key:H.fromLogin(e,i,"memo")}]})},...t})}function CA(e,t,r){let n=useQueryClient(),{data:i}=useQuery(M(e));return useMutation({mutationKey:["accounts","revoke-posting",i?.name],mutationFn:async({accountName:o,type:s,key:a})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user");let u=JSON.parse(JSON.stringify(i.posting));u.account_auths=u.account_auths.filter(([l])=>l!==o);let p={account:i.name,posting:u,memo_key:i.memo_key,json_metadata:i.json_metadata};if(s==="key"&&a)return Z([["account_update",p]],a);if(s==="keychain"){if(!r?.broadcast)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return r.broadcast([["account_update",p]],"active")}else return !t.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing."),Un.sendOperation(["account_update",p],t.hsCallbackUrl?{callback:t.hsCallbackUrl}:{},()=>{})},onError:t.onError,onSuccess:(o,s,a)=>{t.onSuccess?.(o,s,a),n.setQueryData(M(e).queryKey,u=>({...u,posting:{...u?.posting,account_auths:u?.posting?.account_auths?.filter(([p])=>p!==s.accountName)??[]}}));}})}function KA(e,t,r,n){let{data:i}=useQuery(M(e));return useMutation({mutationKey:["accounts","recovery",i?.name],mutationFn:async({accountName:o,type:s,key:a,email:u})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user");let p={account_to_recover:i.name,new_recovery_account:o,extensions:[]};if(s==="ecency"){if(!t)throw new Error("[SDK][Accounts] \u2013 missing access token");let f=await w()(d.privateApiHost+"/private-api/recoveries-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,email:u,publicKeys:[...i.owner.key_auths,...i.active.key_auths,...i.posting.key_auths,i.memo_key]})});if(!f.ok)throw new Error(`[SDK][Accounts] Failed to add recovery: ${f.status}`);return f}else {if(s==="key"&&a)return Z([["change_recovery_account",p]],a);if(s==="keychain"){if(!n?.broadcast)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return n.broadcast([["change_recovery_account",p]],"owner")}else return !r.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing."),Un.sendOperation(["change_recovery_account",p],r.hsCallbackUrl?{callback:r.hsCallbackUrl}:{},()=>{})}},onError:r.onError,onSuccess:r.onSuccess})}function MA(e,t){let r=e.key_auths.filter(([i])=>!t.has(String(i))).reduce((i,[,o])=>i+o,0),n=(e.account_auths??[]).reduce((i,[,o])=>i+o,0);return r+n>=e.weight_threshold}function Ei(e,t){let r=new Set(t.map(s=>s.toString())),n=s=>s.key_auths.some(([a])=>r.has(String(a))),i=s=>{let a=JSON.parse(JSON.stringify(s));return a.key_auths=a.key_auths.filter(([u])=>!r.has(u.toString())),a},o=n(e.owner);return {account:e.name,json_metadata:e.json_metadata,owner:o?i(e.owner):void 0,active:i(e.active),posting:i(e.posting),memo_key:e.memo_key}}function jA(e,t){let{data:r}=useQuery(M(e));return useMutation({mutationKey:["accounts","revoke-key",r?.name],mutationFn:async({currentKey:n,revokingKey:i})=>{if(!r)throw new Error("[SDK][Revoke key] \u2013 cannot update keys for anon user");let o=Array.isArray(i)?i:[i],s=Ei(r,o);return Z([["account_update",s]],n)},...t})}function GA(e,t,r){return v(["accounts","claimAccount"],e,({creator:n,fee:i="0.000 HIVE"})=>[Dr(n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(i.creator)]);},t,"active",{broadcastMode:r})}function XA(e,t,r){return v(["accounts","grant-posting-permission"],e,n=>[Kr(e,n.currentPosting,n.grantedAccount,n.weightThreshold,n.memoKey,n.jsonMetadata)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}function rP(e,t,r){return v(["accounts","create"],e,n=>[n.useClaimed?Ir(e,n.newAccountName,n.keys):qr(e,n.newAccountName,n.keys,n.fee)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}var Hr=300*60*24,vu=1e4,Au=5e7;function Si(e){let t=C(e.vesting_shares).amount,r=C(e.received_vesting_shares).amount,n=C(e.delegated_vesting_shares).amount,i=C(e.vesting_withdraw_rate).amount,o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t+r-n-s}function Pu(e,t,r){let n=e*1e6;return (t*r/1e4/50+1)*n/1e4}function Ou(e){if(Number.isFinite(e.lastHardfork))return e.lastHardfork>=28;let[t="0",r="0"]=(e.currentHardforkVersion??"0.0.0").split(".");return Number(t)>1||Number(t)===1&&Number(r)>=28}function xu(e,t,r){let n=t.votePowerReserveRate||Number(t.raw?.globalDynamic?.vote_power_reserve_rate??0);if(!Number.isFinite(n)||n<=0)return 0;let i=Si(e);if(!Number.isFinite(i)||i<=0)return 0;let o=i*1e6,s=Math.ceil(o*r*60*60*24/vu/(n*Hr)),a=ar(e),u=Math.min(a.current_mana,a.max_mana);return !Number.isFinite(u)||s>u?0:Math.max(s-Au,0)}function Eu(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;if(Ou(t))return xu(e,t,n);let i=0;try{if(i=Si(e),!Number.isFinite(i))return 0}catch{return 0}return Pu(i,r,n)}function sP(e){return ar(e).percentage/100}function aP(e){if(!Number.isFinite(e))throw new TypeError("Voting power must be a finite number");if(e<0||e>100)throw new RangeError("Voting power must be between 0 and 100");return (100-e)*100*Hr/1e4}function cP(e){let t=parseFloat(e.vesting_shares)+parseFloat(e.received_vesting_shares)-parseFloat(e.delegated_vesting_shares),r=Math.floor(Date.now()/1e3)-e.downvote_manabar.last_update_time,n=t*1e6/4;if(n<=0)return 0;let i=parseFloat(e.downvote_manabar.current_mana.toString())+r*n/Hr;i>n&&(i=n);let o=i*100/n;return isNaN(o)?0:o>100?100:o}function uP(e){return Ot(e).percentage/100}function pP(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;let{fundRecentClaims:i,fundRewardBalance:o,base:s,quote:a}=t;if(!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(a)||i===0||a===0)return 0;let u=Eu(e,t,r,n);return Number.isFinite(u)?u/i*o*(s/a):0}var Su={vote:"posting",comment:"posting",delete_comment:"posting",comment_options:"posting",claim_reward_balance:"posting",cancel_transfer_from_savings:"active",collateralized_convert:"active",convert:"active",delegate_vesting_shares:"active",recurrent_transfer:"active",set_withdraw_vesting_route:"active",transfer:"active",transfer_from_savings:"active",transfer_to_savings:"active",transfer_to_vesting:"active",withdraw_vesting:"active",limit_order_create:"active",limit_order_cancel:"active",account_update:"active",account_update2:"active",claim_account:"active",create_claimed_account:"active",account_witness_proxy:"active",account_witness_vote:"active",remove_proposal:"active",update_proposal_votes:"active",change_recovery_account:"owner",request_account_recovery:"owner",recover_account:"owner",reset_account:"owner",set_reset_account:"owner"};function ku(e){let t=e[0],r=e[1];if(t!=="custom_json")throw new Error("Operation is not a custom_json operation");let n=r;return n.required_auths&&n.required_auths.length>0?"active":(n.required_posting_auths&&n.required_posting_auths.length>0,"posting")}function Cu(e){let t=e[0];if(t!=="create_proposal"&&t!=="update_proposal")throw new Error("Operation is not a proposal operation");return "active"}function Tu(e){let t=e[0];return t==="custom_json"?ku(e):t==="create_proposal"||t==="update_proposal"?Cu(e):Su[t]??"posting"}function dP(e){let t="posting";for(let r of e){let n=Tu(r);if(n==="owner")return "owner";n==="active"&&t==="posting"&&(t="active");}return t}function hP(e){return useMutation({mutationKey:["operations","sign",e],mutationFn:({operation:t,keyOrSeed:r})=>{if(!e)throw new Error("[Operations][Sign] \u2013 cannot sign op with anon user");let n;return r.split(" ").length===12?n=H.fromLogin(e,r,"active"):Mn(r)?n=H.fromString(r):n=H.from(r),Z([t],n)}})}function bP(e,t,r="active"){return useMutation({mutationKey:["operations","sign-keychain",e],mutationFn:({operation:n})=>{if(!e)throw new Error("[SDK][Keychain] \u2013\xA0cannot sign operation with anon user");if(!t?.broadcast)throw new Error("[SDK][Keychain] \u2013 missing keychain broadcaster");return t.broadcast([n],r)}})}function OP(e="/"){return useMutation({mutationKey:["operations","sign-hivesigner",e],mutationFn:async({operation:t})=>Un.sendOperation(t,{callback:e},()=>{})})}function kP(){return queryOptions({queryKey:["operations","chain-properties"],queryFn:async()=>await g("condenser_api.get_chain_properties",[])})}function ki(e,t,r){return {...e,...t??{},title:r.title,body:r.body}}function Ci(e,t){return {...e??{},title:t.title,body:t.body}}function KP(e,t){return useMutation({mutationKey:["posts","add-fragment",e],mutationFn:async({title:r,body:n})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let o=await w()(d.privateApiHost+"/private-api/fragments-add",{method:"POST",body:JSON.stringify({code:t,title:r,body:n}),headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`[SDK][Posts] Failed to add fragment: ${o.status}`);return o.json()},onSuccess(r,n){let i=b(),o=Ci(r,n);i.setQueryData(Ve(e,t).queryKey,s=>[o,...s??[]]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map((a,u)=>u===0?{...a,data:[o,...a.data]}:a)});}})}function VP(e,t){return useMutation({mutationKey:["posts","edit-fragment",e],mutationFn:async({fragmentId:r,title:n,body:i})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let s=await w()(d.privateApiHost+"/private-api/fragments-update",{method:"POST",body:JSON.stringify({code:t,id:r,title:n,body:i}),headers:{"Content-Type":"application/json"}});if(!s.ok)throw new Error(`[SDK][Posts] Failed to update fragment: ${s.status}`);return s.json()},onSuccess(r,n){let i=b(),o=s=>ki(s,r,n);i.setQueryData(Ve(e,t).queryKey,s=>s?.map(a=>a.id===n.fragmentId?o(a):a)??[]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map(a=>({...a,data:a.data.map(u=>u.id===n.fragmentId?o(u):u)}))});}})}function zP(e,t){return useMutation({mutationKey:["posts","remove-fragment",e],mutationFn:async({fragmentId:r})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let i=await w()(d.privateApiHost+"/private-api/fragments-delete",{method:"POST",body:JSON.stringify({code:t,id:r}),headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`[SDK][Posts] Failed to delete fragment: ${i.status}`);return i},onSuccess(r,n){let i=b();i.setQueryData(Ve(e,t).queryKey,o=>[...o??[]].filter(({id:s})=>s!==n.fragmentId)),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},o=>o&&{...o,pages:o.pages.map(s=>({...s,data:s.data.filter(a=>a.id!==n.fragmentId)}))});}})}async function G(e){if(!e.ok){let r;try{r=await e.json();}catch{r=void 0;}let n=new Error(`Request failed with status ${e.status}`);throw n.status=e.status,n.data=r,n}let t=await e.text();if(!t||t.trim()==="")return "";try{return JSON.parse(t)}catch(r){return console.warn("[SDK] Failed to parse JSON response:",r,"Response:",t),""}}async function XP(e,t,r,n){let o=await w()(d.privateApiHost+"/private-api/account-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,email:t,referral:r,captcha_token:n})}),s=await G(o);return {status:o.status,data:s}}async function ZP(e){let r=await w()(d.privateApiHost+"/private-api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e})}),n=await G(r);return {status:r.status,data:n}}async function e0(e,t,r="",n=""){let i={code:e,ty:t};r&&(i.bl=r),n&&(i.tx=n);let s=await w()(d.privateApiHost+"/private-api/usr-activity",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});await G(s);}async function t0(e,t,r=null,n=null){let i={code:e};t&&(i.filter=t),r&&(i.since=r),n&&(i.user=n);let s=await w()(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return G(s)}async function r0(e,t,r,n,i,o){let s={code:e,username:t,token:o,system:r,allows_notify:n,notify_types:i},u=await w()(d.privateApiHost+"/private-api/register-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function n0(e,t,r){let n={code:e,username:t,token:r},o=await w()(d.privateApiHost+"/private-api/detail-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function Ti(e,t){let r={code:e};t&&(r.id=t);let i=await w()(d.privateApiHost+"/private-api/notifications/mark",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ri(e,t){let r={code:e,url:t},i=await w()(d.privateApiHost+"/private-api/images-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}var Nu="https://i.ecency.com";async function Fi(e,t,r){let n=w(),i=new FormData;i.append("file",e);let o=await n(`${Nu}/hs/${t}`,{method:"POST",body:i,signal:r});return G(o)}async function i0(e,t,r,n){let i=w(),o=new FormData;o.append("file",e);let s=await i(`${d.imageHost}/${t}/${r}`,{method:"POST",body:o,signal:n});return G(s)}async function qi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/images-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ii(e,t,r,n,i){let o={code:e,title:t,body:r,tags:n,meta:i},a=await w()(d.privateApiHost+"/private-api/drafts-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});return G(a)}async function Di(e,t,r,n,i,o){let s={code:e,id:t,title:r,body:n,tags:i,meta:o},u=await w()(d.privateApiHost+"/private-api/drafts-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function Ki(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/drafts-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Bi(e,t,r,n,i,o,s,a){let u={code:e,permlink:t,title:r,body:n,meta:i,schedule:s,reblog:a};o&&(u.options=o);let l=await w()(d.privateApiHost+"/private-api/schedules-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return G(l)}async function Mi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ni(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function o0(e,t,r){let n={code:e,author:t,permlink:r},o=await w()(d.privateApiHost+"/private-api/promoted-post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function s0(e,t,r){let n={username:e,email:t,friend:r},o=await w()(d.privateApiHost+"/private-api/account-create-friend",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}function l0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","add",e],mutationFn:async({title:i,body:o,tags:s,meta:a})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addDraft");return Ii(t,i,o,s,a)},onSuccess:i=>{r?.();let o=b();i?.drafts?o.setQueryData(c.posts.drafts(e),i.drafts):o.invalidateQueries({queryKey:c.posts.drafts(e)}),o.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function y0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","update",e],mutationFn:async({draftId:i,title:o,body:s,tags:a,meta:u})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for updateDraft");return Di(t,i,o,s,a,u)},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function A0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","delete",e],mutationFn:async({draftId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteDraft");return Ki(t,i)},onMutate:async({draftId:i})=>{if(!e)return;let o=b(),s=c.posts.drafts(e),a=c.posts.draftsInfinite(e);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a})]);let u=o.getQueryData(s);u&&o.setQueryData(s,u.filter(f=>f._id!==i));let p=o.getQueriesData({queryKey:a}),l=new Map(p);for(let[f,m]of p)m&&o.setQueryData(f,{...m,pages:m.pages.map(y=>({...y,data:y.data.filter(h=>h._id!==i)}))});return {previousList:u,previousInfinite:l}},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.posts.drafts(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);n?.(i);}})}function S0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","add",e],mutationFn:async({permlink:i,title:o,body:s,meta:a,options:u,schedule:p,reblog:l})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addSchedule");return Bi(t,i,o,s,a,u,p,l)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function F0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","delete",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteSchedule");return Mi(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function B0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","move",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for moveSchedule");return Ni(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)}),o.invalidateQueries({queryKey:c.posts.drafts(e)});},onError:n})}function U0(e,t,r,n){return useMutation({mutationKey:["posts","images","add",e],mutationFn:async({url:i,code:o})=>{let s=o??t;if(!e||!s)throw new Error("[SDK][Posts] \u2013 missing auth for addImage");return Ri(s,i)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.images(e)});},onError:n})}function W0(e,t,r,n){return useMutation({mutationKey:["posts","images","delete",e],mutationFn:async({imageId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteImage");return qi(t,i)},onSuccess:(i,o)=>{r?.();let s=b(),{imageId:a}=o;s.setQueryData(["posts","images",e],u=>u?.filter(p=>p._id!==a)),s.setQueriesData({queryKey:["posts","images","infinite",e]},u=>u&&{...u,pages:u.pages.map(p=>({...p,data:p.data.filter(l=>l._id!==a)}))});},onError:n})}function Y0(e,t){return useMutation({mutationKey:["posts","images","upload"],mutationFn:async({file:r,token:n,signal:i})=>Fi(r,n,i),onSuccess:e,onError:t})}function It(e,t){return `/@${e}/${t}`}function zu(e,t,r){return (r??b()).getQueryData(c.posts.entry(It(e,t)))}function Ju(e,t){(t??b()).setQueryData(c.posts.entry(It(e.author,e.permlink)),e);}function qt(e,t,r,n){let i=n??b(),o=It(e,t),s=i.getQueryData(c.posts.entry(o));if(!s)return;let a=r(s);return i.setQueryData(c.posts.entry(o),a),s}var Ne;(a=>{function e(u,p,l,f,m){qt(u,p,y=>({...y,active_votes:l,stats:{...y.stats||{gray:false,hide:false,flag_weight:0,total_votes:0},total_votes:l.length,flag_weight:y.stats?.flag_weight||0},total_votes:l.length,payout:f,pending_payout_value:String(f)}),m);}a.updateVotes=e;function t(u,p,l,f){qt(u,p,m=>({...m,reblogs:l}),f);}a.updateReblogsCount=t;function r(u,p,l,f){qt(u,p,m=>({...m,children:l}),f);}a.updateRepliesCount=r;function n(u,p,l,f){qt(p,l,m=>({...m,children:m.children+1,replies:[u,...m.replies]}),f);}a.addReply=n;function i(u,p){u.forEach(l=>Ju(l,p));}a.updateEntries=i;function o(u,p,l){(l??b()).invalidateQueries({queryKey:c.posts.entry(It(u,p))});}a.invalidateEntry=o;function s(u,p,l){return zu(u,p,l)}a.getEntry=s;})(Ne||={});function Yu(e,t,r){let n=e.some(i=>i.voter===t);return r!==0?n:!n}function Xu(e,t,r){let n=Ne.getEntry(t.author,t.permlink,r);if(!n?.active_votes||Yu(n.active_votes,e,t.weight))return;let i=[...n.active_votes.filter(s=>s.voter!==e),...t.weight!==0?[{rshares:t.weight,voter:e}]:[]],o=n.payout+(t.estimated??0);Ne.updateVotes(t.author,t.permlink,i,o,r);}function iO(e,t,r){return v(["posts","vote"],e,({author:n,permlink:i,weight:o})=>[fr(e,n,i,o)],async(n,i)=>{Xu(e,i);let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(120,o,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let s=()=>{t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.accounts.full(e)]);};(r??"async")==="async"?setTimeout(s,4e3):s();}},t,"posting",{broadcastMode:r??"async"})}function uO(e,t,r){return v(["posts","reblog"],e,({author:n,permlink:i,deleteReblog:o})=>[gr(e,n,i,o??false)],async(n,i)=>{let o=Ne.getEntry(i.author,i.permlink);if(o){let p=Math.max(0,(o.reblogs??0)+(i.deleteReblog?-1:1));Ne.updateReblogsCount(i.author,i.permlink,p);}let s=n?.id??n?.tx_id;t?.adapter?.recordActivity&&s&&t.adapter.recordActivity(130,s,n?.block_num).catch(()=>{});let a=()=>{b().invalidateQueries({queryKey:c.posts.accountPostsBlogPrefix(e)}),t?.adapter?.invalidateQueries&&t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.posts.rebloggedBy(i.author,i.permlink)]);};(r??"async")==="async"?setTimeout(a,4e3):a();},t,"posting",{broadcastMode:r??"async"})}function fO(e,t,r){return v(["posts","comment"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=!i.parentAuthor,s=o?100:110,a=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&a&&t.adapter.recordActivity(s,a,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let u=[c.accounts.full(e),c.resourceCredits.account(e)];if(!o){u.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let p=i.rootAuthor||i.parentAuthor,l=i.rootPermlink||i.parentPermlink;u.push({predicate:f=>{let m=f.queryKey;return Array.isArray(m)&&m[0]==="posts"&&m[1]==="discussions"&&m[2]===p&&m[3]===l}});}await t.adapter.invalidateQueries(u);}},t,"posting",{broadcastMode:r})}function yO(e,t,r,n){let i=n??b(),o=i.getQueriesData({predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="discussions"&&a[2]===t&&a[3]===r}});for(let[s,a]of o)a&&i.setQueryData(s,[e,...a]);}function Qi(e,t,r,n,i){let o=i??b(),s=new Map,a=o.getQueriesData({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===r&&p[3]===n}});for(let[u,p]of a)p&&(s.set(u,p),o.setQueryData(u,p.filter(l=>l.author!==e||l.permlink!==t)));return s}function Hi(e,t){let r=t??b();for(let[n,i]of e)r.setQueryData(n,i);}function hO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`,s=i.getQueryData(c.posts.entry(o));return s&&i.setQueryData(c.posts.entry(o),{...s,...r}),s}function wO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`;i.setQueryData(c.posts.entry(o),r);}function PO(e,t,r){return v(["posts","deleteComment"],e,({author:n,permlink:i})=>[mr(n,i)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e)];if(i.parentAuthor&&i.parentPermlink){o.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let s=i.rootAuthor||i.parentAuthor,a=i.rootPermlink||i.parentPermlink;o.push({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===s&&p[3]===a}});}await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r,onMutate:async n=>{let i=n.rootAuthor||n.parentAuthor,o=n.rootPermlink||n.parentPermlink;return i&&o?{snapshots:Qi(n.author,n.permlink,i,o)}:{}},onError:(n,i,o)=>{let{snapshots:s}=o??{};s&&Hi(s);}})}function SO(e,t,r){return v(["posts","cross-post"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,"",n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true}=n.options;i.push(De(n.author,n.permlink,o,s,a,u,[]));}return i},async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e),{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.parentPermlink}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"async"})}function RO(e,t,r){return v(["posts","update-reply"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(110,o,n?.block_num).catch(s=>{console.debug("[SDK][Posts][useUpdateReply] recordActivity failed",{activityType:110,blockNum:n?.block_num,transactionId:o,error:s});}),t?.adapter?.invalidateQueries){let s=[c.resourceCredits.account(e)];s.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let a=i.rootAuthor||i.parentAuthor,u=i.rootPermlink||i.parentPermlink;s.push({predicate:p=>{let l=p.queryKey;return Array.isArray(l)&&l[0]==="posts"&&l[1]==="discussions"&&l[2]===a&&l[3]===u}}),await t.adapter.invalidateQueries(s);}},t,"posting",{broadcastMode:r})}function DO(e,t,r){return v(["ecency","promote"],e,({author:n,permlink:i,duration:o})=>[Nr(e,n,i,o)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.posts._promotedPrefix],[...c.points._prefix(e)],c.posts.entry(`/@${i.author}/${i.permlink}`)]);},t,"active",{broadcastMode:r})}var Zu=[3e3,3e3,3e3],ep=e=>new Promise(t=>setTimeout(t,e));async function tp(e,t){return g("condenser_api.get_content",[e,t])}async function rp(e,t,r=0,n){let i=n?.delays??Zu,o;try{o=await tp(e,t);}catch{o=void 0;}if(o||r>=i.length)return;let s=i[r];return s>0&&await ep(s),rp(e,t,r+1,n)}var $e={};ft($e,{useRecordActivity:()=>Ur});function ip(){return typeof window<"u"&&window.location?{url:window.location.href,domain:window.location.host}:{url:"",domain:""}}function Ur(e,t,r){return useMutation({mutationKey:["analytics",t],mutationFn:async()=>{if(!t)throw new Error("[SDK][Analytics] \u2013 no activity type provided");let n=w(),i=ip(),o=r?.url??i.url,s=r?.domain??i.domain;try{await n(d.plausibleHost+"/api/event",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,url:o,domain:s,props:{username:e}})});}catch{}}})}function LO(e){return queryOptions({queryKey:["analytics","discover-leaderboard",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/leaderboard/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch leaderboard: ${r.status}`);return r.json()}})}function JO(e){return queryOptions({queryKey:["analytics","discover-curation",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/curation/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch curation data: ${r.status}`);let n=await r.json(),i=n.map(s=>s.account),o=await g("condenser_api.get_accounts",[i]);for(let s=0;sa.efficiency-s.efficiency),n}})}function ex(e,t=[],r=["visitors","pageviews","visit_duration"],n){let i=[...t].sort(),o=[...r].sort();return queryOptions({queryKey:["analytics","page-stats",e,i,o,n],queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/api/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,date_range:n}),signal:s});if(!a.ok)throw new Error(`Failed to fetch page stats: ${a.status}`);return a.json()},enabled:!!e,staleTime:0})}var Dt="threespeakfund",sx=1100;function cp(e){return /https?:\/\/([a-z0-9-]+\.)*3speak\.tv\/embed[?/]/i.test(e)}function ax(e,t){if(!cp(t))return e;let r=e.find(n=>n.account===Dt);return r&&r.weight===1100?e:r?e.map(n=>n.account===Dt?{...n,weight:1100}:n):[...e,{account:Dt,weight:1100}]}function cx(e){return e===Dt}var Lr={};ft(Lr,{getAccountTokenQueryOptions:()=>jr,getAccountVideosQueryOptions:()=>mp});var Vr={};ft(Vr,{getDecodeMemoQueryOptions:()=>lp});function lp(e,t,r){return queryOptions({queryKey:["integrations","hivesigner","decode-memo",e],queryFn:async()=>{if(r)return new Un.Client({accessToken:r}).decode(t)}})}var Ui={queries:Vr};function jr(e,t){return queryOptions({queryKey:["integrations","3speak","authenticate",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let n=await w()(`https://studio.3speak.tv/mobile/login?username=${e}&hivesigner=true`,{headers:{"Content-Type":"application/json"}}),i=Ui.queries.getDecodeMemoQueryOptions(e,(await n.json()).memo,t);await b().prefetchQuery(i);let{memoDecoded:o}=b().getQueryData(i.queryKey);return o.replace("#","")}})}function mp(e,t){return queryOptions({queryKey:["integrations","3speak","videos",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let r=jr(e,t);await b().prefetchQuery(r);let n=b().getQueryData(r.queryKey);if(!n)throw new Error("[SDK][Integrations][3Speak] \u2013 missing account token");return await(await w()("https://studio.3speak.tv/mobile/api/my-videos",{headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}})).json()}})}var xx={queries:Lr};function Rx(e){return queryOptions({queryKey:["integrations","hiveposh","links",e],retry:false,queryFn:async()=>{try{let r=await w()(`https://hiveposh.com/api/v0/linked-accounts/${e}`,{headers:{"Content-Type":"application/json"}});if(r.status===400&&(await r.json().catch(()=>({})))?.message==="User Not Connected"||!r.ok)return null;let n=await r.json();return {twitter:{username:n.twitter_username,profile:n.twitter_profile},reddit:{username:n.reddit_username,profile:n.reddit_profile}}}catch{return null}}})}function Dx({url:e,dimensions:t=[],metrics:r=["visitors","pageviews","visit_duration"],filterBy:n="event:page",dateRange:i,enabled:o=true}){return queryOptions({queryKey:["integrations","plausible",e,t,r,n,i],queryFn:async()=>{let a=await w()(`${d.privateApiHost}/api/stats`,{method:"POST",body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,filterBy:n,...i?{date_range:i}:{}}),headers:{"Content-Type":"application/json"}});if(!a.ok)throw new Error(`Failed to fetch Plausible stats: ${a.status}`);return await a.json()},enabled:!!e&&o,retry:1})}function Nx(){return queryOptions({queryKey:["resource-credits","stats"],queryFn:async()=>(await g("rc_api.get_rc_stats",{})).rc_stats})}function Vx(e){return queryOptions({queryKey:["resource-credits","account",e],queryFn:async()=>(await g("rc_api.find_rc_accounts",{accounts:[e]})).rc_accounts,enabled:!!e})}var Vi={ready:false,currentMana:0,maxMana:0,avgCost:0,estimatedCost:0,willLikelyFail:false,deficit:0,remaining:0};function $x({rcAccount:e,rcStats:t,operation:r,buffer:n=1.2}){if(!e||!t?.ops)return Vi;let{current_mana:i,max_mana:o}=Ot(e),s=Number(t.ops[r]?.avg_cost??0);if(!(s>0))return {...Vi,ready:true,currentMana:i,maxMana:o};let a=Number.isFinite(n)&&n>0?n:1.2,u=s*a,p=i{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/get-game",{method:"POST",body:JSON.stringify({game_type:r,code:t}),headers:{"Content-Type":"application/json"}})).json()}})}function tE(e,t,r,n){let{mutateAsync:i}=Ur(e,"spin-rolled");return useMutation({mutationKey:["games","post",r,e],mutationFn:async()=>{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/post-game",{method:"POST",body:JSON.stringify({game_type:r,code:t,key:n}),headers:{"Content-Type":"application/json"}})).json()},onSuccess(){i();}})}function oE(e){let t=e?.replace("@","");return queryOptions({queryKey:c.quests.status(t),enabled:!!t,queryFn:async()=>{if(!t)throw new Error("[SDK][Quests] \u2013 username wasn't provided");let n=await w()(d.privateApiHost+"/private-api/quests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t})});if(!n.ok)throw new Error(`Failed to fetch quests: ${n.status}`);return await n.json()},staleTime:3e4,refetchOnMount:true})}var Ap=[{id:"checkin",tier:"daily",goal:1,i18nKey:"checkin",icon:"check-circle"},{id:"post",tier:"daily",goal:1,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"daily",goal:3,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"daily",goal:10,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"daily",goal:1,i18nKey:"reblog",icon:"repeat"},{id:"spin",tier:"daily",goal:1,i18nKey:"spin",icon:"gift"},{id:"post",tier:"weekly",goal:5,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"weekly",goal:15,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"weekly",goal:50,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"weekly",goal:5,i18nKey:"reblog",icon:"repeat"},{id:"post",tier:"monthly",goal:20,i18nKey:"post",icon:"pencil"}];function aE(e,t){return Ap.find(r=>r.tier===e&&r.id===t)}var cE=300,uE=2;function xp(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}async function Ep(e){let r=await w()(d.privateApiHost+"/private-api/streak-freeze/buy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,idempotency_key:xp()})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to buy streak freeze: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function fE(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["streak-freeze","buy",n],mutationFn:async()=>{if(!n||!t)throw new Error("[SDK][StreakFreeze] \u2013 missing auth");return Ep(t)},onSuccess(){n&&r.invalidateQueries({queryKey:c.points._prefix(n)});},onSettled(){n&&r.invalidateQueries({queryKey:c.quests.status(n)});}})}function hE(e,t,r){return v(["communities","subscribe"],e,({community:n})=>[xr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"async"})}function vE(e,t,r){return v(["communities","unsubscribe"],e,({community:n})=>[Er(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"sync"})}function xE(e,t,r){return v(["communities","mutePost"],e,({community:n,author:i,permlink:o,notes:s,mute:a})=>[Tr(e,n,i,o,s,a)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.posts.entry(`/@${i.author}/${i.permlink}`),["community","single",i.community],{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.community}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"sync"})}function CE(e,t,r,n){return v(["communities","set-role",e],t,({account:i,role:o})=>[Sr(t,e,i,o)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>{if(!a)return a;let u=[...a.team??[]],p=u.findIndex(([l])=>l===o.account);return p>=0?u[p]=[u[p][0],o.role,u[p][2]??""]:u.push([o.account,o.role,""]),{...a,team:u}}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)],c.communities.context(o.account,e)]);},r,"posting",{broadcastMode:n??"async"})}function qE(e,t,r,n){return v(["communities","update",e],t,i=>[kr(t,e,i)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>a&&{...a,...o}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)]]);},r,"posting",{broadcastMode:n??"async"})}function BE(e,t,r){return v(["communities","registerRewards"],e,({name:n})=>[Qr(n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.communities.singlePrefix(i.name)],[...c.points._prefix(e)]]);},t,"active",{broadcastMode:r})}function HE(e,t,r){return v(["communities","pin-post"],e,({community:n,account:i,permlink:o,pin:s})=>[Cr(e,n,i,o,s)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.posts.entry(`/@${i.account}/${i.permlink}`),[...c.communities.singlePrefix(i.community)]]);},t,"posting",{broadcastMode:r??"async"})}function $E(e,t,r=100,n=void 0,i=true){return queryOptions({queryKey:c.communities.list(e,t??"",r),enabled:i,queryFn:async()=>{let o=await g("bridge.list_communities",{last:"",limit:r,sort:e==="hot"?"rank":e,query:t||null,observer:n});return o?e==="hot"?o.sort(()=>Math.random()-.5):o:[]}})}function YE(e,t){return queryOptions({queryKey:c.communities.context(e,t),enabled:!!e&&!!t,queryFn:async()=>{let r=await g("bridge.get_community_context",{account:e,name:t});return {role:r?.role??"guest",subscribed:r?.subscribed??false}}})}function rS(e,t="",r=true){return queryOptions({queryKey:c.communities.single(e,t),enabled:r&&!!e,queryFn:async()=>ui(e??"",t)})}var ji=100;async function Li(e,t){return await g("bridge.list_subscribers",{community:e,limit:ji,...t?{last:t}:{}})??[]}function cS(e){return queryOptions({queryKey:c.communities.subscribers(e),queryFn:async()=>Li(e,null),staleTime:6e4})}function uS(e){return infiniteQueryOptions({queryKey:c.communities.subscribersInfinite(e),initialPageParam:null,queryFn:async({pageParam:t})=>Li(e,t),getNextPageParam:t=>t?.length>=ji?t[t.length-1]?.[0]??null:null,staleTime:6e4})}function gS(e,t){return infiniteQueryOptions({queryKey:c.communities.accountNotifications(e,t),initialPageParam:null,queryFn:async({pageParam:r})=>await g("bridge.account_notifications",{account:e,limit:t,last_id:r??void 0})??[],getNextPageParam:r=>r?.length>=t?r[r.length-1].id:null})}function _S(){return queryOptions({queryKey:c.communities.rewarded(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/rewarded-communities",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch rewarded communities: ${e.status}`);return e.json()}})}var Ip=(s=>(s.OWNER="owner",s.ADMIN="admin",s.MOD="mod",s.MEMBER="member",s.GUEST="guest",s.MUTED="muted",s))(Ip||{}),vS={owner:["admin","mod","member","guest","muted"],admin:["mod","member","guest","muted"],mod:["member","guest","muted"]};function PS(e,t){return e.startsWith("hive-3")||t===3?"Council":e.startsWith("hive-2")||t===2?"Journal":"Topic"}function OS({communityType:e,userRole:t,subscribed:r}){let n=t==="muted"?false:e==="Topic"?true:["owner","admin","mod","member"].includes(t),i=(()=>{if(t==="muted")return false;switch(e){case "Topic":return true;case "Journal":return t!=="guest"||r;case "Council":return n}})(),o=["owner","admin","mod"].includes(t);return {canPost:n,canComment:i,isModerator:o}}function kS(e,t){return queryOptions({queryKey:c.notifications.unreadCount(e),queryFn:async()=>t?(await(await fetch(`${d.privateApiHost}/private-api/notifications/unread`,{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json()).count:0,enabled:!!e&&!!t,initialData:0,refetchInterval:6e4})}function FS(e,t,r=void 0){return infiniteQueryOptions({queryKey:c.notifications.list(e,r),queryFn:async({pageParam:n})=>{if(!t)return [];let i={code:t,filter:r,since:n,user:void 0},o=await fetch(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!o.ok)return [];try{return await o.json()}catch{return []}},enabled:!!e&&!!t,initialData:{pages:[],pageParams:[]},initialPageParam:"",getNextPageParam:n=>n?.[n.length-1]?.id??"",refetchOnMount:true})}var Bp=(y=>(y.VOTES="rvotes",y.MENTIONS="mentions",y.FAVORITES="nfavorites",y.BOOKMARKS="nbookmarks",y.FOLLOWS="follows",y.REPLIES="replies",y.REBLOGS="reblogs",y.TRANSFERS="transfers",y.DELEGATIONS="delegations",y.PAYOUTS="payouts",y.SCHEDULED_PUBLISHED="scheduled_published",y.ACCOUNT_UPDATES="account_updates",y.WEEKLY_EARNINGS="weekly_earnings",y))(Bp||{});var Mp=(h=>(h[h.VOTE=1]="VOTE",h[h.MENTION=2]="MENTION",h[h.FOLLOW=3]="FOLLOW",h[h.COMMENT=4]="COMMENT",h[h.RE_BLOG=5]="RE_BLOG",h[h.TRANSFERS=6]="TRANSFERS",h[h.DELEGATIONS=10]="DELEGATIONS",h[h.FAVORITES=13]="FAVORITES",h[h.BOOKMARKS=15]="BOOKMARKS",h[h.PAYOUTS=19]="PAYOUTS",h[h.ACCOUNT_UPDATE=20]="ACCOUNT_UPDATE",h[h.WEEKLY_EARNINGS=21]="WEEKLY_EARNINGS",h[h.SCHEDULED_PUBLISHED=22]="SCHEDULED_PUBLISHED",h.ALLOW_NOTIFY="ALLOW_NOTIFY",h))(Mp||{}),$i=[1,2,3,4,5,6,10,13,15,19,20,21,22],Np=(n=>(n.ALL="All",n.UNREAD="Unread",n.READ="Read",n))(Np||{});function NS(e,t,r){return queryOptions({queryKey:c.notifications.settings(e),queryFn:async()=>{let n=e+"-web";if(!t)throw new Error("Missing access token");let i=await fetch(d.privateApiHost+"/private-api/detail-device",{body:JSON.stringify({code:t,username:e,token:n}),method:"POST",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch notification settings: ${i.status}`);return i.json()},enabled:!!e&&!!t,refetchOnMount:false,initialData:()=>({status:0,system:"web",allows_notify:0,notify_types:r?[]:[...$i]})})}function VS(){return queryOptions({queryKey:c.notifications.announcements(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/announcements",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch announcements: ${e.status}`);return await e.json()||[]},staleTime:36e5})}function WS(e){return queryOptions({queryKey:c.notifications.spotlights(),queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/spotlights",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch spotlights: ${t.status}`);return await t.json()||[]},staleTime:36e5})}function jp(e,t){return {...e,read:!t||t===e.id?1:e.read}}function Wi(e){return typeof e=="object"&&e!==null&&"pages"in e&&"pageParams"in e&&Array.isArray(e.pages)}function ek(e,t,r,n){let i=b();return useMutation({mutationKey:["notifications","mark-read",e],mutationFn:async({id:o})=>{if(!e||!t){process.env.NODE_ENV!=="production"&&console.warn("[SDK][Notifications] \u2013 missing auth for markNotifications");return}return Ti(t,o)},onMutate:async({id:o})=>{if(!e||!t)return {previousData:[]};await i.cancelQueries({queryKey:c.notifications._prefix});let s=[],a=i.getQueriesData({queryKey:c.notifications._prefix,predicate:l=>{let f=l.state.data;return Wi(f)}});a.forEach(([l,f])=>{if(f&&Wi(f)){s.push([l,f]);let m={...f,pages:f.pages.map(y=>y.map(h=>jp(h,o)))};i.setQueryData(l,m);}});let u=c.notifications.unreadCount(e),p=i.getQueryData(u);return typeof p=="number"&&p>0&&(s.push([u,p]),o?a.some(([,f])=>f?.pages.some(m=>m.some(y=>y.id===o&&y.read===0)))&&i.setQueryData(u,p-1):i.setQueryData(u,0)),{previousData:s}},onSuccess:o=>{let s=typeof o=="object"&&o!==null?o.unread:void 0;typeof s=="number"&&i.setQueryData(c.notifications.unreadCount(e),s),r?.(s);},onError:(o,s,a)=>{a?.previousData&&a.previousData.forEach(([u,p])=>{i.setQueryData(u,p);}),n?.(o);},onSettled:()=>{i.invalidateQueries({queryKey:c.notifications._prefix});}})}function ik(e,t,r){return v(["notifications","set-last-read"],e,({date:n})=>br(e,n),async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.notifications.unreadCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function ck(e){return queryOptions({queryKey:["proposals","proposal",e],queryFn:async()=>{let r=(await g("condenser_api.find_proposals",[[e]]))[0];return new Date(r.start_date)=new Date?r.status="active":new Date(r.end_date){let t=(await g("database_api.list_proposals",{start:[-1],limit:500,order:"by_total_votes",order_direction:"descending",status:"all"})).proposals,r=t.filter(i=>i.status==="expired");return [...t.filter(i=>i.status!=="expired"),...r]}})}function wk(e,t,r){return infiniteQueryOptions({queryKey:["proposals","votes",e,t,r],initialPageParam:t,refetchOnMount:true,staleTime:0,queryFn:async({pageParam:n})=>{let s=(await g("condenser_api.list_proposal_votes",[[e,n??t],r,"by_proposal_voter"])).filter(l=>l.proposal?.proposal_id===e).map(l=>({id:l.id,voter:l.voter})),a=await g("condenser_api.get_accounts",[s.map(l=>l.voter)]),u=kt(a);return s.map(l=>({...l,voterAccount:u.find(f=>l.voter===f.name)}))},getNextPageParam:n=>n?.[n.length-1]?.voter??void 0})}function Ak(e){return queryOptions({queryKey:["proposals","votes","by-user",e],enabled:!!e&&e!=="",staleTime:60*1e3,queryFn:async()=>!e||e===""?[]:((await g("database_api.list_proposal_votes",{start:[e],limit:1e3,order:"by_voter_proposal",order_direction:"ascending",status:"votable"})).proposal_votes||[]).filter(n=>n.voter===e)})}function Ek(e,t,r){return v(["proposals","vote"],e,({proposalIds:n,approve:i})=>[Or(e,n,i)],async n=>{try{let i=n?.id??n?.tx_id;t?.adapter?.recordActivity&&i&&t.adapter.recordActivity(150,i,n?.block_num).catch(o=>{console.debug("[SDK][Proposals][useProposalVote] recordActivity failed",{activityType:150,blockNum:n?.block_num,transactionId:i,error:o});}),t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.proposals.list(),c.proposals.votesByUser(e)]);}catch(i){console.warn("[useProposalVote] Post-broadcast side-effect failed:",i);}},t,"active",{broadcastMode:r})}function Tk(e,t,r){return v(["proposals","create"],e,n=>[Pr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.proposals.list()]);},t,"active",{broadcastMode:r})}function Ik(e,t=50){return infiniteQueryOptions({queryKey:["wallet","vesting-delegations",e,t],initialPageParam:"",queryFn:async({pageParam:r})=>{let n=r?t+1:t,i=await g("condenser_api.get_vesting_delegations",[e,r||"",n]);return r&&i.length>0&&i[0]?.delegatee===r?i.slice(1,t+1):i},getNextPageParam:r=>!r||r.lengthee("balance","/accounts/{account-name}/delegations",{"account-name":e},void 0,void 0,t)})}function Uk(e){return queryOptions({queryKey:["wallet","vesting-delegation-expirations",e],queryFn:async()=>e?(await g("database_api.find_vesting_delegation_expirations",{account:e})).delegations:[],enabled:!!e})}function $k(e){return queryOptions({queryKey:["wallet","conversion-requests",e],queryFn:()=>g("condenser_api.get_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function Jk(e){return queryOptions({queryKey:["wallet","collateralized-conversion-requests",e],queryFn:()=>g("condenser_api.get_collateralized_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function eC(e){return queryOptions({queryKey:["wallet","savings-withdraw",e],queryFn:()=>g("condenser_api.get_savings_withdraw_from",[e]),select:t=>t.sort((r,n)=>r.request_id-n.request_id)})}function iC(e){return queryOptions({queryKey:["wallet","withdraw-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"])})}function cC(e){return queryOptions({queryKey:["wallet","open-orders",e],queryFn:()=>g("condenser_api.get_open_orders",[e]),select:t=>t.sort((r,n)=>r.orderid-n.orderid),enabled:!!e})}function fC(e,t=100){return infiniteQueryOptions({queryKey:["wallet","outgoing-rc-delegations",e,t],initialPageParam:null,queryFn:async({pageParam:r})=>{let i=(await g("rc_api.list_rc_direct_delegations",{start:[e,r??""],limit:t}).then(o=>o)).rc_direct_delegations||[];return r&&(i=i.filter(o=>o.to!==r)),i},getNextPageParam:r=>r.length===t?r[r.length-1].to:null})}function hC(e){return queryOptions({queryKey:["wallet","incoming-rc",e],enabled:!!e,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] - Missing username for incoming RC");let r=await w()(`${d.privateApiHost}/private-api/received-rc/${e}`);if(!r.ok)throw new Error(`Failed to fetch incoming RC: ${r.status}`);return r.json()}})}function vC(e){return queryOptions({queryKey:["wallet","received-vesting-shares",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`);if(!t.ok)throw new Error(`Failed to fetch received vesting shares: ${t.status}`);return (await t.json()).list}})}function xC(e){return queryOptions({queryKey:["wallet","recurrent-transfers",e],queryFn:()=>g("condenser_api.find_recurrent_transfers",[e]),enabled:!!e})}function le(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}}function ae(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return;let r=Number.parseFloat(t);if(Number.isFinite(r))return r;let i=t.replace(/,/g,"").match(/[-+]?\d+(?:\.\d+)?/);if(i){let o=Number.parseFloat(i[0]);if(Number.isFinite(o))return o}}}function cl(e){if(!e||typeof e!="object")return;let t=e;return {name:le(t.name)??"",symbol:le(t.symbol)??"",layer:le(t.layer)??"hive",balance:ae(t.balance)??0,fiatRate:ae(t.fiatRate)??0,currency:le(t.currency)??"usd",precision:ae(t.precision)??3,address:le(t.address),error:le(t.error),pendingRewards:ae(t.pendingRewards),pendingRewardsFiat:ae(t.pendingRewardsFiat),liquid:ae(t.liquid),liquidFiat:ae(t.liquidFiat),savings:ae(t.savings),savingsFiat:ae(t.savingsFiat),staked:ae(t.staked),stakedFiat:ae(t.stakedFiat),iconUrl:le(t.iconUrl),actions:t.actions??[],extraData:t.extraData??[],apr:ae(t.apr)}}function ul(e){if(!e||typeof e!="object")return [];let t=[e],r=e;r.data&&typeof r.data=="object"&&t.push(r.data),r.result&&typeof r.result=="object"&&t.push(r.result),r.portfolio&&typeof r.portfolio=="object"&&t.push(r.portfolio);for(let n of t){if(Array.isArray(n))return n;if(n&&typeof n=="object")for(let i of ["wallets","tokens","assets","items","portfolio","balances"]){let o=n[i];if(Array.isArray(o))return o}}return []}function pl(e){if(!e||typeof e!="object")return;let t=e;return le(t.username)??le(t.name)??le(t.account)}function Gi(e,t="usd",r=true){return queryOptions({queryKey:["wallet","portfolio","v2",e,r?"only-enabled":"all",t],enabled:!!e,staleTime:6e4,refetchInterval:12e4,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] \u2013 username is required");let n=`${N.getValidatedBaseUrl()}/wallet-api/portfolio-v2`,i=await fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({username:e,onlyEnabled:r,currency:t})});if(!i.ok)throw new Error(`[SDK][Wallet] \u2013 Portfolio request failed (${i.status})`);let o=await i.json(),s=ul(o).map(a=>cl(a)).filter(a=>!!a).filter(a=>a.layer!=="spk");if(!s.length)throw new Error("[SDK][Wallet] \u2013 Portfolio payload contained no tokens");return {username:pl(o)??e,currency:le(o?.fiatCurrency??o?.currency)?.toUpperCase(),wallets:s}}})}function Kt(e){return queryOptions({queryKey:["assets","hive","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey),n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??"");if(!r)return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:0};let o=C(r.balance).amount,s=C(r.savings_balance).amount;return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:o+s,parts:[{name:"current",balance:o},{name:"savings",balance:s}]}}})}function zi(e){return queryOptions({queryKey:["assets","hbd","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(M(e).queryKey),r=b().getQueryData(be().queryKey),n=1;return t?{name:"HBD",title:"Hive Dollar",price:n,accountBalance:C(t.hbd_balance).amount+C(t?.savings_hbd_balance).amount,apr:((r?.hbdInterestRate??0)/100).toFixed(3),parts:[{name:"current",balance:C(t.hbd_balance).amount},{name:"savings",balance:C(t.savings_hbd_balance).amount}]}:{name:"HBD",title:"Hive Dollar",price:n,accountBalance:0}}})}function ml(e){let u=9.5-(e.headBlock-7e6)/25e4*.01;u<.95&&(u=.95);let p=e.vestingRewardPercent/1e4,l=e.virtualSupply,f=e.totalVestingFund;return (l*u*p/f).toFixed(3)}function Ji(e){return queryOptions({queryKey:["assets","hive-power","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey);if(!t||!r)return {name:"HP",title:"Hive Power",price:0,accountBalance:0};let n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??""),o=Number.isFinite(i)?i:t.base/t.quote,s=C(r.vesting_shares).amount,a=C(r.delegated_vesting_shares).amount,u=C(r.received_vesting_shares).amount,p=C(r.vesting_withdraw_rate).amount,l=Math.max((Number(r.to_withdraw)-Number(r.withdrawn))/1e6,0),f=Wn(r.next_vesting_withdrawal)?0:Math.min(p,l),m=+Ue(s,t.hivePerMVests).toFixed(3),y=+Ue(a,t.hivePerMVests).toFixed(3),h=+Ue(u,t.hivePerMVests).toFixed(3),E=+Ue(l,t.hivePerMVests).toFixed(3),O=+Ue(f,t.hivePerMVests).toFixed(3),A=Math.max(m-E,0),P=Math.max(m-y,0);return {name:"HP",title:"Hive Power",price:o,accountBalance:+A.toFixed(3),apr:ml(t),parts:[{name:"hp_balance",balance:m},{name:"available",balance:+P.toFixed(3)},{name:"outgoing_delegations",balance:y},{name:"incoming_delegations",balance:h},...E>0?[{name:"pending_power_down",balance:+E.toFixed(3)}]:[],...O>0&&O!==E?[{name:"next_power_down",balance:+O.toFixed(3)}]:[]]}}})}var K=re.operations,$r={transfers:[K.transfer,K.transfer_to_savings,K.transfer_from_savings,K.cancel_transfer_from_savings,K.recurrent_transfer,K.fill_recurrent_transfer,K.escrow_transfer,K.fill_recurrent_transfer],"market-orders":[K.fill_convert_request,K.fill_order,K.fill_collateralized_convert_request,K.limit_order_create2,K.limit_order_create,K.limit_order_cancel],interests:[K.interest],"stake-operations":[K.return_vesting_delegation,K.withdraw_vesting,K.transfer_to_vesting,K.set_withdraw_vesting_route,K.update_proposal_votes,K.fill_vesting_withdraw,K.account_witness_proxy,K.delegate_vesting_shares],rewards:[K.author_reward,K.curation_reward,K.producer_reward,K.claim_reward_balance,K.comment_benefactor_reward,K.liquidity_reward,K.proposal_pay],"":[]};var JC=Object.keys(re.operations);var Yi=re.operations,ZC=Yi,eT=Object.entries(Yi).reduce((e,[t,r])=>(e[r]=t,e),{});var Xi=re.operations;function yl(e){return Object.prototype.hasOwnProperty.call(Xi,e)}function ut(e){let t=Array.isArray(e)?e:[e],r=t.includes(""),n=Array.from(new Set(t.filter(a=>a!=null&&a!==""))),i=r||n.length===0?"all":n.map(a=>a.toString()).sort().join("|"),o=new Set;r||n.forEach(a=>{if(a in $r){$r[a].forEach(u=>o.add(u));return}yl(a)&&o.add(Xi[a]);});let s=hl(Array.from(o));return {filterKey:i,filterArgs:s}}function hl(e){let t=0n,r=0n;return e.forEach(n=>{n<64?t|=1n<o?+(o[o.length-1]?.num??0)-1:-1,queryFn:async({pageParam:o})=>(await g("condenser_api.get_account_history",[e,o,t,...n])).map(a=>({num:a[0],type:a[1].op[0],timestamp:a[1].timestamp,trx_id:a[1].trx_id,...a[1].op[1]})),select:({pages:o,pageParams:s})=>({pageParams:s,pages:o.map(a=>a.filter(u=>{switch(u.type){case "author_reward":case "comment_benefactor_reward":return C(u.hive_payout).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(u.amount).symbol==="HIVE";case "transfer_from_savings":return C(u.amount).symbol==="HIVE";case "fill_recurrent_transfer":let l=C(u.amount);return ["HIVE"].includes(l.symbol);case "claim_reward_balance":return C(u.reward_hive).amount>0;case "curation_reward":case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":return true;case "limit_order_create2":return true;default:return false}}))})})}function lT(e,t=20,r=[]){let{filterKey:n}=ut(r);return infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hbd","transactions",e,t,n],select:({pages:i,pageParams:o})=>({pageParams:o,pages:i.map(s=>s.filter(a=>{switch(a.type){case "author_reward":case "comment_benefactor_reward":return C(a.hbd_payout).amount>0;case "claim_reward_balance":return C(a.reward_hbd).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(a.amount).symbol==="HBD";case "transfer_from_savings":return C(a.amount).symbol==="HBD";case "fill_recurrent_transfer":let l=C(a.amount);return ["HBD"].includes(l.symbol);case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":case "proposal_pay":case "interest":return true;case "limit_order_create2":return true;default:return false}}))})})}function yT(e,t=20,r=[]){let{filterKey:n}=ut(r),i=new Set(Array.isArray(r)?r:[r]),o=i.has("")||i.size===0;return infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hive-power","transactions",e,t,n],select:({pages:s,pageParams:a})=>({pageParams:a,pages:s.map(u=>u.filter(p=>{switch(p.type){case "author_reward":case "comment_benefactor_reward":return C(p.vesting_payout).amount>0;case "claim_reward_balance":return C(p.reward_vests).amount>0;case "transfer_to_vesting":return true;case "transfer":case "transfer_to_savings":case "recurrent_transfer":return ["VESTS","HP"].includes(C(p.amount).symbol);case "fill_recurrent_transfer":let m=C(p.amount);return ["VESTS","HP"].includes(m.symbol);case "curation_reward":case "withdraw_vesting":case "delegate_vesting_shares":case "fill_vesting_withdraw":case "return_vesting_delegation":case "producer_reward":case "set_withdraw_vesting_route":return true;default:return o||i.has(p.type)}}))})})}function Zi(e){let t=r=>r.toString().padStart(2,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Wr(e,t){return new Date(e.getTime()-t*1e3)}function bT(e=86400){return infiniteQueryOptions({queryKey:["assets","hive","metrics",e],queryFn:async({pageParam:[t,r]})=>(await g("condenser_api.get_market_history",[e,Zi(t),Zi(r)])).map(({hive:i,non_hive:o,open:s})=>({close:o.close/i.close,open:o.open/i.open,low:o.low/i.low,high:o.high/i.high,volume:i.volume,time:new Date(s)})),initialPageParam:[Wr(new Date,Math.max(100*e,28800)),new Date],getNextPageParam:(t,r,[n])=>[Wr(n,Math.max(100*e,28800)),Wr(n,e)]})}function OT(e){return queryOptions({queryKey:["assets","hive","withdrawal-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"]),enabled:!!e})}function kT(e,t=50){return queryOptions({queryKey:["assets","hive-power","delegates",e],enabled:!!e,queryFn:()=>g("condenser_api.get_vesting_delegations",[e,"",t])})}function qT(e){return queryOptions({queryKey:["assets","hive-power","delegatings",e],queryFn:async()=>(await(await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`,{headers:{"Content-Type":"application/json"}})).json()).list,select:t=>t.sort((r,n)=>C(n.vesting_shares).amount-C(r.vesting_shares).amount)})}function BT(e=500){return queryOptions({queryKey:["market","order-book",e],queryFn:()=>g("condenser_api.get_order_book",[e])})}function HT(){return queryOptions({queryKey:["market","statistics"],queryFn:()=>g("condenser_api.get_ticker",[])})}function LT(e,t,r){let n=i=>i.toISOString().replace(/\.\d{3}Z$/,"");return queryOptions({queryKey:["market","history",e,t.getTime(),r.getTime()],queryFn:()=>g("condenser_api.get_market_history",[e,n(t),n(r)])})}function zT(){return queryOptions({queryKey:["market","hive-hbd-stats"],queryFn:async()=>{let e=await g("condenser_api.get_ticker",[]),t=new Date,r=new Date(t.getTime()-864e5),n=s=>s.toISOString().replace(/\.\d{3}Z$/,""),i=await g("condenser_api.get_market_history",[86400,n(r),n(t)]);return {price:+e.latest,close:i[0]?i[0].non_hive.open/i[0].hive.open:0,high:i[0]?i[0].non_hive.high/i[0].hive.high:0,low:i[0]?i[0].non_hive.low/i[0].hive.low:0,percent:i[0]?100-i[0].non_hive.open/i[0].hive.open*100/+e.latest:0,totalFromAsset:e.hive_volume.split(" ")[0],totalToAsset:e.hbd_volume.split(" ")[0]}}})}function ZT(e,t,r,n){return queryOptions({queryKey:["market","data",e,t,r,n],queryFn:async({signal:i})=>{let o=w(),s=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,a=await o(s,{signal:i});if(!a.ok)throw new Error(`Failed to fetch market data: ${a.status}`);return a.json()}})}function eo(e){return e.toISOString().replace(/\.\d{3}Z$/,"")}function nR(e=1e3,t,r){let n=r??new Date,i=t??new Date(n.getTime()-600*60*1e3);return queryOptions({queryKey:["market","trade-history",e,i.getTime(),n.getTime()],queryFn:()=>g("condenser_api.get_trade_history",[eo(i),eo(n),e])})}function aR(){return queryOptions({queryKey:["market","feed-history"],queryFn:async()=>{try{return await g("condenser_api.get_feed_history",[])}catch(e){throw e}}})}function lR(){return queryOptions({queryKey:["market","current-median-history-price"],queryFn:async()=>{try{return await g("condenser_api.get_current_median_history_price",[])}catch(e){throw e}}})}function gR(e,t,r){return v(["market","limit-order-create"],e,n=>[Ft(e,n.amountToSell,n.minToReceive,n.fillOrKill,n.expiration,n.orderId)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function _R(e,t,r){return v(["market","limit-order-cancel"],e,({orderId:n})=>[Rr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}async function pt(e){let t=await e.json();if(!e.ok){let r=new Error(`Request failed with status ${e.status}`);throw r.status=e.status,r.data=t,r}return t}async function AR(e,t,r,n){let i=w(),o=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,s=await i(o);return pt(s)}async function to(e){if(e==="hbd")return 1;let t=w(),r=`https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${e}`,n=await t(r);return (await pt(n)).hive_dollar[e]}async function PR(e,t){let n=await w()(d.privateApiHost+`/private-api/market-data/${e==="hbd"?"usd":e}/${t}`);return pt(n)}async function OR(){let t=await w()(d.privateApiHost+"/private-api/market-data/latest");return pt(t)}async function xR(){let t=await w()("https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd");return pt(t)}var Fl={"Content-type":"application/json"};async function ql(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-api`,{method:"POST",body:JSON.stringify(e),headers:Fl});if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 request failed with ${n.status}`);return (await n.json()).result}async function xe(e,t){try{return await ql(e)}catch{return t}}async function kR(e,t=50){let r={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:e},limit:t,offset:0},id:1},[n,i]=await Promise.all([xe({...r,params:{...r.params,table:"buyBook",indexes:[{index:"price",descending:true}]}},[]),xe({...r,params:{...r.params,table:"sellBook",indexes:[{index:"price",descending:false}]}},[])]),o=a=>a.sort((u,p)=>{let l=Number(u.price??0);return Number(p.price??0)-l}),s=a=>a.sort((u,p)=>{let l=Number(u.price??0),f=Number(p.price??0);return l-f});return {buy:o(n),sell:s(i)}}async function CR(e,t=50){return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"tradesHistory",query:{symbol:e},limit:t,offset:0,indexes:[{index:"timestamp",descending:true}]},id:1},[])}async function TR(e,t,r=100){let n={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:t,account:e},limit:r,offset:0},id:1},[i,o]=await Promise.all([xe({...n,params:{...n.params,table:"buyBook",indexes:[{index:"timestamp",descending:true}]}},[]),xe({...n,params:{...n.params,table:"sellBook",indexes:[{index:"timestamp",descending:true}]}},[])]),s=(p,l)=>(Number(p||0)*Number(l||0)).toFixed(8),a=i.map(p=>({id:p.txId,type:"buy",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:p.tokensLocked??s(p.quantity,p.price),timestamp:Number(p.timestamp??0)})),u=o.map(p=>({id:p.txId,type:"sell",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:s(p.quantity,p.price),timestamp:Number(p.timestamp??0)}));return [...a,...u].sort((p,l)=>l.timestamp-p.timestamp)}async function Il(e,t){if(Array.isArray(e)&&e.length===0)return [];let r=Array.isArray(e)?{symbol:{$in:e}}:e?{symbol:e}:{};return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"metrics",query:{...r,...t?{account:t}:{}}},id:1},[])}async function We(e,t){return Il(t,e)}async function Mt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"balances",query:{account:e}},id:1},[])}async function Nt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"tokens",query:{symbol:{$in:e}}},id:2},[])}async function ro(e,t,r,n){let i=w(),o=N.getValidatedBaseUrl(),s=new URL("/private-api/engine-account-history",o);s.searchParams.set("account",e),s.searchParams.set("symbol",t),s.searchParams.set("limit",r.toString()),s.searchParams.set("offset",n.toString());let a=await i(s.toString(),{method:"GET",headers:{"Content-type":"application/json"}});if(!a.ok)throw new Error(`[SDK][HiveEngine] \u2013 account history failed with ${a.status}`);return await a.json()}async function no(e,t="daily"){let r=w(),n=N.getValidatedBaseUrl(),i=new URL("/private-api/engine-chart-api",n);i.searchParams.set("symbol",e),i.searchParams.set("interval",t);let o=await r(i.toString(),{headers:{"Content-type":"application/json"}});if(!o.ok)throw new Error(`[SDK][HiveEngine] \u2013 chart failed with ${o.status}`);return await o.json()}async function io(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-reward-api/${e}?hive=1`);if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 rewards failed with ${n.status}`);return await n.json()}function Qt(e){return queryOptions({queryKey:["assets","hive-engine","balances",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Mt(e)})}function BR(){return queryOptions({queryKey:["assets","hive-engine","markets"],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>We()})}function oo(e){return queryOptions({queryKey:["assets","hive-engine","metadata-list",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Nt(e)})}function jR(e,t,r=20){return infiniteQueryOptions({queryKey:["assets","hive-engine",t,"transactions",e],enabled:!!t&&!!e,initialPageParam:0,queryFn:async({pageParam:n})=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");return ro(e,t,r,n)},getNextPageParam:(n,i,o)=>(n?.length??0)===r?o+r:void 0,getPreviousPageParam:(n,i,o)=>o>0?o-r:void 0})}function GR(e,t="daily"){return queryOptions({queryKey:["assets","hive-engine",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>no(e,t)})}function XR(e){return queryOptions({queryKey:["assets","hive-engine","unclaimed",e],staleTime:6e4,refetchInterval:9e4,enabled:!!e,queryFn:async()=>{try{let t=await io(e);return Object.values(t).filter(({pending_token:r})=>r>0)}catch{return []}}})}function so(e,t){return queryOptions({queryKey:["assets","hive-engine","all-tokens",e,t],queryFn:async()=>We(e,t)})}function Ge(e,t=void 0){let r={fractionDigits:3,prefix:"",suffix:""};t&&(r={...r,...t});let{fractionDigits:n,prefix:i,suffix:o}=r,s="";i&&(s+=i+" ");let a=Math.abs(parseFloat(e.toString()))<1e-4?0:e,u=typeof a=="string"?parseFloat(a):a;return s+=u.toLocaleString("en-US",{minimumFractionDigits:n,maximumFractionDigits:n,useGrouping:true}),o&&(s+=" "+o),s}var Ht=class{symbol;name;icon;precision;stakingEnabled;delegationEnabled;balance;stake;stakedBalance;delegationsIn;delegationsOut;usdValue;constructor(t){this.symbol=t.symbol,this.name=t.name||"",this.icon=t.icon||"",this.precision=t.precision||0,this.stakingEnabled=t.stakingEnabled||false,this.delegationEnabled=t.delegationEnabled||false,this.balance=parseFloat(t.balance)||0,this.stake=parseFloat(t.stake)||0,this.delegationsIn=parseFloat(t.delegationsIn)||0,this.delegationsOut=parseFloat(t.delegationsOut)||0,this.stakedBalance=this.stake+this.delegationsIn-this.delegationsOut,this.usdValue=t.usdValue;}hasDelegations=()=>this.delegationEnabled?this.delegationsIn>0&&this.delegationsOut>0:false;delegations=()=>this.hasDelegations()?`(${Ge(this.stake,{fractionDigits:this.precision})} + ${Ge(this.delegationsIn,{fractionDigits:this.precision})} - ${Ge(this.delegationsOut,{fractionDigits:this.precision})})`:"";staked=()=>this.stakingEnabled?this.stakedBalance<1e-4?this.stakedBalance.toString():Ge(this.stakedBalance,{fractionDigits:this.precision}):"-";balanced=()=>this.balance<1e-4?this.balance.toString():Ge(this.balance,{fractionDigits:this.precision})};function uF(e,t,r){return queryOptions({queryKey:["assets","hive-engine","balances-with-usd",e,t,r],queryFn:async()=>{if(!e)throw new Error("[HiveEngine] No account in a balances query");let n=await Mt(e),i=await Nt(n.map(p=>p.symbol)),o=t?t.base/t.quote:0,s=Array.isArray(r)?r:[],a=n.map(p=>p.symbol).filter(p=>p!=="SWAP.HIVE"&&!s.some(l=>l.symbol===p)),u=[...s,...a.length?await We(void 0,a):[]];return n.map(p=>{let l=i.find(O=>O.symbol===p.symbol),f;if(l?.metadata)try{f=JSON.parse(l.metadata);}catch{f=void 0;}let m=u.find(O=>O.symbol===p.symbol),y=Number(m?.lastPrice??"0"),h=Number(p.balance),E=p.symbol==="SWAP.HIVE"?o*h:y===0?0:Number((y*o*h).toFixed(10));return new Ht({symbol:p.symbol,name:l?.name??p.symbol,icon:f?.icon??"",precision:l?.precision??0,stakingEnabled:l?.stakingEnabled??false,delegationEnabled:l?.delegationEnabled??false,balance:p.balance,stake:p.stake,delegationsIn:p.delegationsIn,delegationsOut:p.delegationsOut,usdValue:E})})},enabled:!!e})}function ao(e,t){return queryOptions({queryKey:["assets","hive-engine",t,"general-info",e],enabled:!!t&&!!e,staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");let r=b(),n=Kt(e);await r.prefetchQuery(n);let i=r.getQueryData(n.queryKey),o=await r.ensureQueryData(oo([t])),s=await r.ensureQueryData(Qt(e)),a=await r.ensureQueryData(so(void 0,t)),u=o?.find(O=>O.symbol===t),p=s?.find(O=>O.symbol===t),f=+(a?.find(O=>O.symbol===t)?.lastPrice??"0"),m=parseFloat(p?.balance??"0"),y=parseFloat(p?.stake??"0"),h=parseFloat(p?.pendingUnstake??"0"),E=[{name:"liquid",balance:m},{name:"staked",balance:y}];return h>0&&E.push({name:"unstaking",balance:h}),{name:t,title:u?.name??"",price:f===0?0:Number(f*(i?.price??0)),accountBalance:m+y,layer:"ENGINE",parts:E}}})}function lt(e,t=0){return queryOptions({queryKey:["points",e,t],queryFn:async()=>{if(!e)throw new Error("Get points query \u2013 username wasn't provided");let r=e.replace("@",""),n=await fetch(d.privateApiHost+"/private-api/points",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r})});if(!n.ok)throw new Error(`Failed to fetch points: ${n.status}`);let i=await n.json(),o=await fetch(d.privateApiHost+"/private-api/point-list",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,type:t})});if(!o.ok)throw new Error(`Failed to fetch point transactions: ${o.status}`);let s=await o.json();return {points:i.points,uPoints:i.unclaimed_points,transactions:s}},staleTime:3e4,refetchOnMount:true,enabled:!!e})}function co(e){return queryOptions({queryKey:["assets","points","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>(await b().prefetchQuery(lt(e)),{name:"POINTS",title:"Ecency Points",price:.002,accountBalance:+(b().getQueryData(lt(e).queryKey)?.points??0)})})}function SF(e,t){return queryOptions({queryKey:["assets","points","transactions",e,t],queryFn:async()=>(await(await fetch(`${d.privateApiHost}/private-api/point-list`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,type:t??0})})).json()).map(({created:i,type:o,amount:s,id:a,sender:u,receiver:p,memo:l})=>({created:new Date(i),type:o,results:[{amount:parseFloat(s),asset:"POINTS"}],id:a,from:u??void 0,to:p??void 0,memo:l??void 0}))})}function NF(e,t,r={refetch:false}){let n=b(),i=r.currency??"usd",o=async p=>(r.refetch?await n.fetchQuery(p):await n.prefetchQuery(p),n.getQueryData(p.queryKey)),s=async p=>{if(!p||i==="usd")return p;try{let l=await to(i);return {...p,price:p.price*l}}catch(l){return console.warn(`Failed to convert price from USD to ${i}:`,l),p}},a=Gi(e,i,true),u=async()=>{try{let l=(await n.fetchQuery(a)).wallets.find(m=>m.symbol.toUpperCase()===t.toUpperCase());if(!l)return;let f=[];if(l.liquid!==void 0&&l.liquid!==null&&f.push({name:"liquid",balance:l.liquid}),l.staked!==void 0&&l.staked!==null&&l.staked>0&&f.push({name:"staked",balance:l.staked}),l.savings!==void 0&&l.savings!==null&&l.savings>0&&f.push({name:"savings",balance:l.savings}),l.extraData&&Array.isArray(l.extraData))for(let m of l.extraData){if(!m||typeof m!="object")continue;let y=m.dataKey,h=m.value;if(typeof h=="string"){let O=h.replace(/,/g,"").match(/[+-]?\s*(\d+(?:\.\d+)?)/);if(O){let A=Math.abs(Number.parseFloat(O[1]));y==="delegated_hive_power"?f.push({name:"outgoing_delegations",balance:A}):y==="received_hive_power"?f.push({name:"incoming_delegations",balance:A}):y==="powering_down_hive_power"&&f.push({name:"pending_power_down",balance:A});}}}return {name:l.symbol,title:l.name,price:l.fiatRate,accountBalance:l.balance,apr:l.apr?.toString(),layer:l.layer,pendingRewards:l.pendingRewards,parts:f}}catch{return}};return queryOptions({queryKey:["ecency-wallets","asset-info",e,t,i],queryFn:async()=>{let p=await u();if(p&&p.price>0)return p;let l;if(t==="HIVE")l=await o(Kt(e));else if(t==="HP")l=await o(Ji(e));else if(t==="HBD")l=await o(zi(e));else if(t==="POINTS")l=await o(co(e));else if((await n.ensureQueryData(Qt(e))).some(m=>m.symbol===t))l=await o(ao(e,t));else {if(p)return p;throw new Error(`[SDK][Wallet] \u2013 unrecognized asset "${t}"`)}if(p&&l&&l.price>0){let f=await s(l);return {...p,price:f.price}}return await s(l)}})}var Gl=(A=>(A.Transfer="transfer",A.TransferToSavings="transfer-saving",A.WithdrawFromSavings="withdraw-saving",A.Delegate="delegate",A.PowerUp="power-up",A.PowerDown="power-down",A.WithdrawRoutes="withdraw-routes",A.ClaimInterest="claim-interest",A.Swap="swap",A.Convert="convert",A.Gift="gift",A.Promote="promote",A.Claim="claim",A.Buy="buy",A.Stake="stake",A.Unstake="unstake",A.Undelegate="undelegate",A))(Gl||{});function LF(e,t,r){return v(["wallet","transfer"],e,n=>[Ke(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function JF(e,t,r){return v(["wallet","transfer-point"],e,n=>[Le(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function tq(e,t,r){return v(["wallet","delegate-vesting-shares"],e,n=>[st(e,n.delegatee,n.vestingShares)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.delegatee),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function sq(e,t,r){return v(["wallet","set-withdraw-vesting-route"],e,n=>[at(e,n.toAccount,n.percent,n.autoVest)],async(n,i)=>{await S(t?.adapter,r,[c.wallet.withdrawRoutes(e),c.accounts.full(e),c.accounts.full(i.toAccount)]);},t,"active",{broadcastMode:r})}function pq(e,t,r){return v(["wallet","transfer-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"transfer",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity,memo:n.memo}});return [["custom_json",{required_auths:[e],required_posting_auths:[],id:"ssc-mainnet-hive",json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function gq(e,t,r){return v(["wallet","transfer-to-savings"],e,n=>[je(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function bq(e,t,r){return v(["wallet","transfer-from-savings"],e,n=>[Be(e,n.to,n.amount,n.memo,n.requestId)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function xq(e,t,r){return v(["wallet","transfer-to-vesting"],e,n=>[it(e,n.to,n.amount)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Tq(e,t,r){return v(["wallet","withdraw-vesting"],e,n=>[ot(e,n.vestingShares)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Dq(e,t,r){return v(["wallet","convert"],e,n=>[n.collateralized?yr(e,n.amount,n.requestId):ct(e,n.amount,n.requestId)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Qq(e,t,r){return v(["wallet","claim-interest"],e,n=>nt(e,n.to,n.amount,n.memo,n.requestId),async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}var zl=5e3,Ut=new Map;function Lq(e,t,r){return v(["wallet","claim-rewards"],e,n=>[Fr(e,n.rewardHive,n.rewardHbd,n.rewardVests)],()=>{let n=e??"__anonymous__",i=[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e],c.assets.hiveGeneralInfo(e),c.assets.hbdGeneralInfo(e),c.assets.hivePowerGeneralInfo(e)],o=Ut.get(n);o&&(clearTimeout(o),Ut.delete(n));let s=setTimeout(async()=>{try{let a=b(),p=(await Promise.allSettled(i.map(l=>a.invalidateQueries({queryKey:l})))).filter(l=>l.status==="rejected");p.length>0&&console.error("[SDK][Wallet][useClaimRewards] delayed invalidation rejected",{username:e,rejectedCount:p.length,rejected:p});}catch(a){console.error("[SDK][Wallet][useClaimRewards] delayed invalidation failed",{username:e,error:a});}finally{Ut.delete(n);}},zl);Ut.set(n,s);},t,"posting",{broadcastMode:r})}function zq(e,t,r){return v(["wallet","delegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"delegate",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Zq(e,t,r){return v(["wallet","undelegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"undelegate",contractPayload:{symbol:n.symbol,from:n.from,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function nI(e,t,r){return v(["wallet","stake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"stake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function aI(e,t,r){return v(["wallet","unstake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"unstake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function lI(e,t,r){return v(["wallet","claim-engine-rewards"],e,n=>{let i=JSON.stringify(n.tokens.map(o=>({symbol:o})));return [["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"posting",{broadcastMode:r})}function gI(e,t,r){return v(["wallet","engine-market-order"],e,n=>{let i,o;n.action==="cancel"?(o="cancel",i={type:n.orderType,id:n.orderId}):(o=n.action,i={symbol:n.symbol,quantity:n.quantity,price:n.price});let s=JSON.stringify({contractName:"market",contractAction:o,contractPayload:i});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:s}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Jl(e,t,r){let{from:n,to:i="",amount:o="",memo:s=""}=r,a=r.request_id??Date.now()>>>0;switch(e){case "HIVE":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "power-up":return [it(n,i,o)]}break;case "HBD":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "claim-interest":return nt(n,i,o,s,a);case "convert":return [ct(n,o,Math.floor(Date.now()/1e3))]}break;case "HP":switch(t){case "power-down":return [ot(n,o)];case "delegate":return [st(n,i,o)];case "withdraw-routes":return [at(r.from_account??n,r.to_account??i,r.percent??0,r.auto_vest??false)]}break;case "POINTS":if(t==="transfer"||t==="gift")return [Le(n,i,o,s)];break}return null}function Yl(e,t,r){let{from:n,to:i="",amount:o=""}=r,s=typeof o=="string"&&o.includes(" ")?o.split(" ")[0]:String(o);switch(t){case "transfer":return [Me(n,"transfer",{symbol:e,to:i,quantity:s,memo:r.memo??""})];case "stake":return [Me(n,"stake",{symbol:e,to:i,quantity:s})];case "unstake":return [Me(n,"unstake",{symbol:e,to:i,quantity:s})];case "delegate":return [Me(n,"delegate",{symbol:e,to:i,quantity:s})];case "undelegate":return [Me(n,"undelegate",{symbol:e,from:i,quantity:s})];case "claim":return [hr(n,[e])]}return null}function Xl(e){return e==="claim"?"posting":"active"}function vI(e,t,r,n,i){let{mutateAsync:o}=$e.useRecordActivity(e,r);return v(["ecency-wallets",t,r],e,s=>{let a=Jl(t,r,s);if(a)return a;let u=Yl(t,r,s);if(u)return u;throw new Error(`[SDK][Wallet] \u2013 no operation builder for asset="${t}" operation="${r}"`)},()=>{o();let s=[];s.push(["ecency-wallets","asset-info",e,t]),t==="HIVE"&&s.push(["ecency-wallets","asset-info",e,"HP"]),s.push(["wallet","portfolio","v2",e]),setTimeout(()=>{s.forEach(a=>{b().invalidateQueries({queryKey:a});});},5e3);},n,Xl(r),{broadcastMode:i})}function xI(e,t,r){return v(["wallet","delegate-rc"],e,({to:n,maxRc:i})=>[wr(e,n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),c.resourceCredits.account(e),c.resourceCredits.account(i.to)]);},t,"active",{broadcastMode:r})}function CI(e,t,r){return v(["witnesses","vote"],e,({witness:n,approve:i})=>[vr(e,n,i)],async()=>{try{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.votes(e)]);}catch(n){console.warn("[useWitnessVote] Post-broadcast side-effect failed:",n);}},t,"active",{broadcastMode:r})}function qI(e,t,r){return v(["witnesses","proxy"],e,({proxy:n})=>[Ar(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.proxy()]);},t,"active",{broadcastMode:r})}function ed(e){return {owner:e.witness_name,total_missed:e.missed_blocks,url:e.url,props:{account_creation_fee:`${(e.account_creation_fee/1e3).toFixed(3)} HIVE`,account_subsidy_budget:0,maximum_block_size:e.block_size},hbd_exchange_rate:{base:`${e.price_feed.toFixed(3)} HBD`},available_witness_account_subsidies:0,running_version:e.version,signing_key:e.signing_key,last_hbd_exchange_update:e.feed_updated_at,rank:e.rank,vests:e.vests,voters_num:e.voters_num,voters_num_daily_change:e.voters_num_daily_change,price_feed:e.price_feed,hbd_interest_rate:e.hbd_interest_rate,last_confirmed_block_num:e.last_confirmed_block_num}}function NI(e){return infiniteQueryOptions({queryKey:c.witnesses.list(e),initialPageParam:1,queryFn:async({pageParam:t})=>(await ee("hafbe","/witnesses",{"page-size":e,page:t})).witnesses.map(ed),getNextPageParam:(t,r,n)=>t.length===e?n+1:void 0})}function QI(e,t,r,n="vests",i="desc"){return queryOptions({queryKey:c.witnesses.voters(e,t,r,n,i),queryFn:async({signal:o})=>await ee("hafbe","/witnesses/{witness-name}/voters",{"witness-name":e,"page-size":r,page:t,sort:n,direction:i},void 0,void 0,o),enabled:!!e,staleTime:6e4})}function HI(e){return queryOptions({queryKey:c.witnesses.voterCount(e),queryFn:async()=>await ee("hafbe","/witnesses/{witness-name}/voters/count",{"witness-name":e}),enabled:!!e,staleTime:6e4})}var td=(h=>(h[h.CHECKIN=10]="CHECKIN",h[h.LOGIN=20]="LOGIN",h[h.CHECKIN_EXTRA=30]="CHECKIN_EXTRA",h[h.POST=100]="POST",h[h.COMMENT=110]="COMMENT",h[h.VOTE=120]="VOTE",h[h.REBLOG=130]="REBLOG",h[h.DELEGATION=150]="DELEGATION",h[h.REFERRAL=160]="REFERRAL",h[h.COMMUNITY=170]="COMMUNITY",h[h.TRANSFER_SENT=998]="TRANSFER_SENT",h[h.TRANSFER_INCOMING=999]="TRANSFER_INCOMING",h[h.MINTED=991]="MINTED",h[h.BURNED=997]="BURNED",h))(td||{});async function nd(e,t){if(!e)throw new Error("[SDK][Points][Claim] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][Points][Claim] \u2013 access token wasn't found");let n=await w()(d.privateApiHost+"/private-api/points-claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})}),i=(n.headers.get("content-type")??"").split(";")[0].trim().toLowerCase(),o=await n.text();if(!n.ok){if(n.status===406)try{return JSON.parse(o)}catch{return {message:o,code:n.status}}let s=o&&i.includes("json")?`: ${o.slice(0,200)}`:"";throw new Error(`[SDK][Points][Claim] \u2013 failed with status ${n.status}${s}`)}if(!i.includes("json"))throw new Error(`[SDK][Points][Claim] \u2013 expected JSON but received "${i||"empty"}" response (status ${n.status})`);try{return JSON.parse(o)}catch{throw new Error(`[SDK][Points][Claim] \u2013 malformed JSON response (status ${n.status})`)}}function GI(e,t,r,n){let{mutateAsync:i}=$e.useRecordActivity(e,"points-claimed");return useMutation({mutationFn:()=>nd(e,t),onError:n,onSuccess:()=>{i(),b().setQueryData(lt(e).queryKey,o=>o&&{...o,points:(parseFloat(o.points)+parseFloat(o.uPoints)).toFixed(3),uPoints:"0"}),r?.();}})}var po=/(^|\s)author:([^\s]+)/g,lo=/(^|\s)type:([^\s]+)/g,fo=/(^|\s)category:([^\s]+)/g,mo=/(^|\s)tag:([^\s]+)/g;var yo=(n=>(n.ALL="",n.POST="post",n.COMMENT="comment",n))(yo||{}),JI=5,YI=100;function ho(e){return e.trim().split(/\s+/)[0]??""}function id(e){return ho(e).replace(/^@+/,"").toLowerCase()}function od(e){return ho(e).replace(/^#+/,"").toLowerCase()}function sd(e){let t=new Set;return e.split(/[\s,]+/).map(r=>r.replace(/^#+/,"").toLowerCase()).filter(r=>r===""||t.has(r)?false:(t.add(r),true))}function XI({search:e="",author:t="",type:r="",category:n="",tags:i=[]}){let o=e.trim().replace(/\s+/g," "),s=id(t),a=od(n),u=sd(Array.isArray(i)?i.join(","):i),p=[o];return s&&p.push(`author:${s}`),r&&p.push(`type:${r}`),a&&p.push(`category:${a}`),u.length>0&&p.push(`tag:${u.join(",")}`),{q:p.filter(l=>l!=="").join(" "),search:o,author:s,type:r,category:a,tags:u}}var go=class{query="";search="";author="";type="";category="";tags=[];constructor(t){this.query=t,this.search=t,this.grabAuthor(),this.grabType(),this.grabCategory(),this.grabTags(),this.grabSearch();}grab=t=>{let r=[...this.query.matchAll(t)];return r.length>0?r[0][2].trim():""};grabAuthor=()=>{this.author=this.grab(po);};grabType=()=>{let t=this.grab(lo);Object.values(yo).includes(t)&&(this.type=t);};grabCategory=()=>{this.category=this.grab(fo);};grabTags=()=>{let t=new Set;this.tags=[...this.query.matchAll(mo)].flatMap(r=>r[2].split(",")).map(r=>r.trim()).filter(r=>r===""||t.has(r)?false:(t.add(r),true));};grabSearch=()=>{for([po,lo,fo,mo].forEach(t=>{this.search=this.search.replace(t,"$1");});this.search.indexOf(" ")!==-1;)this.search=this.search.replace(" "," ");this.search=this.search.trim();}};async function ve(e,t){let n=await(async()=>{let i;try{i=await e.text();}catch{return}if(i!=="")try{return JSON.parse(i)}catch{return e.ok?void 0:i}})();if(!e.ok){let i=new Error(`Request failed with status ${e.status}`);throw i.status=e.status,i.data=n,i}if(n===void 0||t!==void 0&&!t(n))throw new Error("Response body was empty, invalid JSON, or not the expected shape");return n}function Ee(e){return typeof e=="object"&&e!==null&&Array.isArray(e.results)}var cd=isServer?0:3;function dt(e,t){let{status:r}=t,n=r===408||r===429;return r!==void 0&&r>=400&&r<500&&!n?false:e{let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let u=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(u,Ee)},retry:dt})}function uD(e,t,r=true){return infiniteQueryOptions({queryKey:c.search.controversialRising(e,t),initialPageParam:{sid:void 0,hasNextPage:true},queryFn:async({pageParam:n,signal:i})=>{if(!n.hasNextPage)return {hits:0,took:0,results:[]};let o,s=new Date;switch(t){case "today":o=new Date(s.getTime()-1440*60*1e3);break;case "week":o=new Date(s.getTime()-10080*60*1e3);break;case "month":o=new Date(s.getTime()-720*60*60*1e3);break;case "year":o=new Date(s.getTime()-365*24*60*60*1e3);break;default:o=void 0;}let a="* type:post",u=e==="rising"?"children":e,p=o?o.toISOString().split(".")[0]:void 0,l="0",f=t==="today"?50:200,m={q:a,sort:u,hide_low:l};p&&(m.since=p),n.sid&&(m.scroll_id=n.sid),(m.votes=f);let y=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(m),signal:we(_e,i)});return ve(y,Ee)},getNextPageParam:n=>({sid:n?.scroll_id,hasNextPage:n.results.length>0}),enabled:r,retry:dt})}async function fD(e,t,r,n,i,o,s){let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let p=await w()(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(p,Ee)}async function wo(e,t,r=_e){let i=await w()(d.privateApiHost+"/search-api/similar",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(e),signal:we(r,t)});return ve(i,Ee)}async function mD(e,t){let n=await w()(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e}),signal:we(_e,t)}),i=await ve(n,Array.isArray);return i?.length>0?i:[e]}var dd=4368*60*60*1e3,fd=4,md=3e3,gd=2e3,yd=4e3,_D=2;function hd(e,t){return e.replace(/!\[[^\]]*\]\([^)]*\)/g," ").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim().slice(0,t)}function wd(e){let t=5381;for(let r=0;r>>0).toString(36)}function bD(e){let t=e.title??"",r=e.json_metadata?.tags,n=(Array.isArray(r)?r:[]).filter(s=>typeof s=="string"&&s!==""),i=hd(e.body??"",md),o=wd(`${t}|${n.join(",")}|${i}`);return queryOptions({queryKey:c.search.similarEntries(e.author,e.permlink,o),queryFn:async({signal:s})=>{let a=new Date(Date.now()-dd).toISOString().slice(0,19),u=await wo({author:e.author,permlink:e.permlink,title:t,body:i,tags:n,since:a},s,typeof window>"u"?gd:yd),p=[],l=new Set;for(let f of u.results){if(p.length>=fd)break;f.permlink!==e.permlink&&(f.tags??[]).indexOf("nsfw")===-1&&(l.has(f.author)||(l.add(f.author),p.push(f)));}return p},staleTime:300*1e3,retry:false})}function ED(e,t=5){let r=e.trim();return queryOptions({queryKey:c.search.account(r,t),queryFn:async()=>{let n=await g("condenser_api.lookup_accounts",[r,t]);return n.length===0?[]:Ct(n)},enabled:!!r})}function RD(e,t=10){let r=e.trim();return queryOptions({queryKey:c.search.topics(r,t),queryFn:async()=>(await g("condenser_api.get_trending_tags",[r,t+1])).map(i=>i.name).filter(i=>i!==""&&!i.startsWith("hive-")).slice(0,t),enabled:!!r})}function BD(e,t,r,n,i,o){return infiniteQueryOptions({queryKey:c.search.api(e,t,r,n,i,o),queryFn:async({pageParam:s,signal:a})=>{let u={q:e,sort:t,hide_low:r};n&&(u.since=n),s&&(u.scroll_id=s),i!==void 0&&(u.votes=i),o&&(u.include_nsfw=1);let p=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(u),signal:we(_e,a)});return ve(p,Ee)},initialPageParam:void 0,getNextPageParam:s=>s?.scroll_id,enabled:!!e,retry:dt})}function HD(e){return queryOptions({queryKey:["search","path",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e})});if(!t.ok)throw new Error(`Search path failed: ${t.status}`);let r=await t.json();return r?.length>0?r:[e]}})}async function Od(e){let r=await w()(d.privateApiHost+"/private-api/support-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to fetch support settings: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function LD(e,t){let r=e?.replace("@","");return queryOptions({queryKey:c.support.settings(r),queryFn:()=>{if(!t)throw new Error("[SDK][Support] missing auth");return Od(t)},enabled:!!r&&!!t})}async function Sd(e,t){let n=await w()(d.privateApiHost+"/private-api/support-settings-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,beneficiary_percent:t.beneficiary_percent,curation_percent:t.curation_percent})});if(!n.ok){let i;try{i=await n.json();}catch{}let o=i?.message??`Failed to update support settings: ${n.status}`,s=new Error(o);throw s.status=n.status,s.data=i,s}return await n.json()}function kd(e,t,r){return e.setQueryData(c.support.settings(t),r),e.invalidateQueries({queryKey:c.support.settings(t)})}function JD(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["support","settings-update",n],mutationFn:async i=>{if(!n||!t)throw new Error("[SDK][Support] missing auth");return Sd(t,i)},onSuccess(i){n&&kd(r,n,i);}})}function eK(e){return queryOptions({queryKey:["promotions","boost-plus-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/boost-plus-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch boost plus prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function iK(e){return queryOptions({queryKey:["promotions","rc-delegation-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/rc-delegation-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch RC delegation prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function cK(e,t){return queryOptions({queryKey:["promotions","rc-delegation-active",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/rc-delegation-active",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,username:e})});if(!r.ok)throw new Error(`Failed to fetch RC delegation active: ${r.status}`);let n=await r.json();return n&&n.expires&&n.user?{user:n.user,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function dK(e){return queryOptions({queryKey:["promotions","promote-price"],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/promote-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch promote prices: ${t.status}`);return await t.json()},enabled:!!e})}function yK(e,t){return queryOptions({queryKey:["promotions","boost-plus-accounts",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/boosted-plus-account",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:e})});if(!r.ok)throw new Error(`Failed to fetch boost plus account prices: ${r.status}`);let n=await r.json();return n?{account:n.account,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function bK(e,t,r){return v(["promotions","boost-plus"],e,({account:n,duration:i})=>[Br(e,n,i)],async(n,{account:i})=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.promotions.boostPlusAccounts(i)]);},t,"active",{broadcastMode:r})}function OK(e,t,r){return v(["promotions","rc-delegation"],e,({duration:n})=>[Mr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.resourceCredits.account(e),["promotions","rc-delegation-active",e]]);},t,"active",{broadcastMode:r})}async function SK(e){let r=await w()(d.privateApiHost+"/auth-api/hs-token-refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let i;try{i=await r.json();}catch{i=void 0;}let o=new Error(`Failed to refresh token: ${r.status}`);throw o.status=r.status,o.data=i,o}return await r.json()}var Dd="https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt";function RK(){return queryOptions({queryKey:c.badActors.list(),queryFn:async({signal:e})=>{let t=await fetch(Dd,{signal:e});if(!t.ok)throw new Error(`Failed to fetch bad actors list: ${t.status}`);let r=await t.text();return new Set(r.split(` +import {useQuery,useInfiniteQuery,useMutation,QueryClient,queryOptions,infiniteQueryOptions,useQueryClient,isServer}from'@tanstack/react-query';import {hexToBytes,bytesToHex}from'@noble/hashes/utils.js';import {ripemd160}from'@noble/hashes/legacy.js';import en from'bs58';import {secp256k1}from'@noble/curves/secp256k1.js';import {sha256,sha512}from'@noble/hashes/sha2.js';import {cbc}from'@noble/ciphers/aes.js';import Un from'hivesigner';var bo=Object.defineProperty;var ft=(e,t)=>{for(var r in t)bo(e,r,{get:t[r],enumerable:true});};var mt=new ArrayBuffer(0),gt=null,yt=null;function vo(){return gt||(typeof TextEncoder<"u"?gt=new TextEncoder:gt={encode(e){let t=[];for(let r=0;r>6,128|n&63);else if(n>=55296&&n<=56319&&r+1>18,128|n>>12&63,128|n>>6&63,128|n&63);}else t.push(224|n>>12,128|n>>6&63,128|n&63);}return new Uint8Array(t)}}),gt}function Gr(){return yt||(typeof TextDecoder<"u"?yt=new TextDecoder:yt={decode(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r="";for(let n=0;n>10),56320+(o&1023)));}return r}}),yt}var I=class e{static LITTLE_ENDIAN=true;static BIG_ENDIAN=false;static DEFAULT_CAPACITY=16;static DEFAULT_ENDIAN=e.BIG_ENDIAN;buffer;view;offset;markedOffset;limit;littleEndian;constructor(t=e.DEFAULT_CAPACITY,r=e.DEFAULT_ENDIAN){this.buffer=t===0?mt:new ArrayBuffer(t),this.view=t===0?new DataView(mt):new DataView(this.buffer),this.offset=0,this.markedOffset=-1,this.limit=t,this.littleEndian=r;}static allocate(t,r){return new e(t,r)}static concat(t,r){let n=0;for(let a=0;a0&&(n.buffer=t.buffer,n.offset=t.byteOffset,n.limit=t.byteOffset+t.byteLength,n.view=new DataView(t.buffer));else if(t instanceof ArrayBuffer)n=new e(0,r),t.byteLength>0&&(n.buffer=t,n.offset=0,n.limit=t.byteLength,n.view=t.byteLength>0?new DataView(t):new DataView(mt));else if(Array.isArray(t))n=new e(t.length,r),n.limit=t.length,new Uint8Array(n.buffer).set(t);else throw TypeError("Illegal buffer");return n}writeBytes(t,r){return this.append(t,r)}writeInt8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setInt8(r,t),n&&(this.offset+=1),this}writeByte(t,r){return this.writeInt8(t,r)}writeUint8(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+1>this.buffer.byteLength&&this.resize(r+1),this.view.setUint8(r,t),n&&(this.offset+=1),this}writeUInt8(t,r){return this.writeUint8(t,r)}readUint8(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint8(t);return r&&(this.offset+=1),n}readUInt8(t){return this.readUint8(t)}writeInt16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setInt16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeShort(t,r){return this.writeInt16(t,r)}writeUint16(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+2>this.buffer.byteLength&&this.resize(r+2),this.view.setUint16(r,t,this.littleEndian),n&&(this.offset+=2),this}writeUInt16(t,r){return this.writeUint16(t,r)}writeInt32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setInt32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeInt(t,r){return this.writeInt32(t,r)}writeUint32(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,r+4>this.buffer.byteLength&&this.resize(r+4),this.view.setUint32(r,t,this.littleEndian),n&&(this.offset+=4),this}writeUInt32(t,r){return this.writeUint32(t,r)}readUint32(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getUint32(t,this.littleEndian);return r&&(this.offset+=4),n}readUInt32=this.readUint32;append(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i;return t instanceof e?(i=new Uint8Array(t.buffer,t.offset,t.limit-t.offset),t.offset+=i.length):t instanceof Uint8Array?i=t:t instanceof ArrayBuffer?i=new Uint8Array(t):i=new Uint8Array(t),i.length<=0?this:(r+i.length>this.buffer.byteLength&&this.resize(r+i.length),new Uint8Array(this.buffer).set(i,r),n&&(this.offset+=i.length),this)}clone(t){let r=new e(0,this.littleEndian);return t?(r.buffer=new ArrayBuffer(this.buffer.byteLength),new Uint8Array(r.buffer).set(new Uint8Array(this.buffer)),r.view=new DataView(r.buffer)):(r.buffer=this.buffer,r.view=this.view),r.offset=this.offset,r.markedOffset=this.markedOffset,r.limit=this.limit,r}copy(t,r){if(t===void 0&&(t=this.offset),r===void 0&&(r=this.limit),t===r)return new e(0,this.littleEndian);let n=r-t,i=new e(n,this.littleEndian);return i.offset=0,i.limit=n,new Uint8Array(i.buffer).set(new Uint8Array(this.buffer).subarray(t,r),0),i}copyTo(t,r,n,i){let o=typeof r>"u",s=typeof n>"u";r=o?t.offset:r,n=s?this.offset:n,i=i===void 0?this.limit:i;let a=i-n;return a===0?t:(t.ensureCapacity(r+a),new Uint8Array(t.buffer).set(new Uint8Array(this.buffer).subarray(n,i),r),s&&(this.offset+=a),o&&(t.offset+=a),this)}ensureCapacity(t){let r=this.buffer.byteLength;return rt?r:t):this}flip(){return this.limit=this.offset,this.offset=0,this}resize(t){if(this.buffer.byteLength"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigInt64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeLong(t,r){return this.writeInt64(t,r)}readInt64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigInt64(t,this.littleEndian);return r&&(this.offset+=8),n}readLong(t){return this.readInt64(t)}writeUint64(t,r){let n=typeof r>"u";return n?r=this.offset:r=r,typeof t=="number"&&(t=BigInt(t)),r+8>this.buffer.byteLength&&this.resize(r+8),this.view.setBigUint64(r,t,this.littleEndian),n&&(this.offset+=8),this}writeUInt64(t,r){return this.writeUint64(t,r)}readUint64(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=this.view.getBigUint64(t,this.littleEndian);return r&&(this.offset+=8),n}readUInt64(t){return this.readUint64(t)}toBuffer(t){let r=this.offset,n=this.limit;return !t&&r===0&&n===this.buffer.byteLength?this.buffer:r===n?mt:this.buffer.slice(r,n)}toArrayBuffer(t){return this.toBuffer(t)}writeVarint32(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=this.calculateVarint32(t);for(r+i>this.buffer.byteLength&&this.resize(r+i),t>>>=0;t>=128;)this.view.setUint8(r++,t&127|128),t>>>=7;return this.view.setUint8(r++,t),n?(this.offset=r,this):i}readVarint32(t){let r=typeof t>"u";typeof t>"u"&&(t=this.offset);let n=0,i=0,o;do o=this.view.getUint8(t++),n<5&&(i|=(o&127)<<7*n),++n;while((o&128)!==0);return i|=0,r?(this.offset=t,i):{value:i,length:n}}calculateVarint32(t){return t=t>>>0,t<128?1:t<16384?2:t<1<<21?3:t<1<<28?4:5}writeVString(t,r){let n=typeof r>"u",i=n?this.offset:r,o=vo().encode(t),s=o.length,a=this.calculateVarint32(s);return i+a+s>this.buffer.byteLength&&this.resize(i+a+s),this.writeVarint32(s,i),i+=a,new Uint8Array(this.buffer).set(o,i),i+=s,n?(this.offset=i,this):i-(r||0)}readVString(t){let r=typeof t>"u";r?t=this.offset:t=t;let n=t,i=this.readVarint32(t),o=i.value,s=i.length;t+=s;let a=Gr().decode(new Uint8Array(this.buffer,t,o));return t+=o,r?(this.offset=t,a):{string:a,length:t-n}}readUTF8String(t,r){let n=typeof r>"u";n?r=this.offset:r=r;let i=Gr().decode(new Uint8Array(this.buffer,r,t));return n?(this.offset+=t,i):{string:i,length:t}}};var x={nodes:["https://api.hive.blog","https://api.deathwing.me","https://api.openhive.network","https://techcoderx.com","https://api.syncad.com","https://rpc.mahdiyari.info"],restNodes:["https://api.hive.blog","https://rpc.mahdiyari.info","https://api.syncad.com","https://hiveapi.actifit.io","https://api.c0ff33a.uk"],restNodesByApi:{hivesense:["https://api.hive.blog","https://api.syncad.com"]},userAgent:"ecency-sdk",chain_id:"beeab0de00000000000000000000000000000000000000000000000000000000",address_prefix:"STM",timeout:5e3,broadcastTimeout:15e3,retry:5,resilience:{adaptiveTimeout:true,adaptiveTimeoutFloorMs:2e3,adaptiveTimeoutFactor:4,hedge:false,hedgeDelayFloorMs:750,hedgeDelayFactor:2,hedgeBucketCapacity:10,hedgeRefillPerSuccess:.1,totalBudgetFactor:2}},Lt=e=>Array.isArray(e)?[...new Set(e.filter(t=>typeof t=="string").map(t=>t.trim().replace(/\/+$/,"")).filter(t=>t.length>0&&/^https?:\/\/.+/.test(t)))]:[],$t=e=>{let t=Lt(e);t.length&&(x.nodes=t);},Wt=e=>{let t=Lt(e);t.length&&(x.restNodes=t);},Gt=e=>{if(!e||typeof e!="object")return;let t={...x.restNodesByApi};for(let[r,n]of Object.entries(e)){let i=Lt(n);i.length?t[r]=i:delete t[r];}x.restNodesByApi=t;},zt=e=>{if(typeof e!="string")return;let t=e.trim();!t||/[\u0000-\u001f\u007f]/.test(t)||(x.userAgent=t);},Jt=e=>{if(!e||typeof e!="object")return;let t=x.resilience,r=i=>typeof i=="boolean",n=i=>typeof i=="number"&&Number.isFinite(i)&&i>0;r(e.adaptiveTimeout)&&(t.adaptiveTimeout=e.adaptiveTimeout),n(e.adaptiveTimeoutFloorMs)&&(t.adaptiveTimeoutFloorMs=Math.max(e.adaptiveTimeoutFloorMs,2e3)),n(e.adaptiveTimeoutFactor)&&(t.adaptiveTimeoutFactor=e.adaptiveTimeoutFactor),r(e.hedge)&&(t.hedge=e.hedge),n(e.hedgeDelayFloorMs)&&(t.hedgeDelayFloorMs=e.hedgeDelayFloorMs),n(e.hedgeDelayFactor)&&(t.hedgeDelayFactor=e.hedgeDelayFactor),n(e.hedgeBucketCapacity)&&(t.hedgeBucketCapacity=e.hedgeBucketCapacity),n(e.hedgeRefillPerSuccess)&&(t.hedgeRefillPerSuccess=Math.min(e.hedgeRefillPerSuccess,1)),n(e.totalBudgetFactor)&&(t.totalBudgetFactor=Math.max(e.totalBudgetFactor,1));};var Ae=class e{data;recovery;compressed;constructor(t,r,n){this.data=t,this.recovery=r,this.compressed=n??true;}static from(t){if(typeof t=="string"){let r=hexToBytes(t),n=parseInt(bytesToHex(r.subarray(0,1)),16)-31,i=true;n<0&&(i=false,n=n+4);let o=r.subarray(1);return new e(o,n,i)}else throw new Error("Expected string for data")}toBuffer(){let t=new Uint8Array(65).fill(0);return this.compressed?t[0]=this.recovery+31&255:t[0]=this.recovery+27&255,t.set(this.data,1),t}customToString(){return bytesToHex(this.toBuffer())}toString(){return this.customToString()}getPublicKey(t){if(t instanceof Uint8Array&&t.length!==32||typeof t=="string"&&t.length!==64)throw new Error("Expected a valid sha256 hash as message");typeof t=="string"&&(t=hexToBytes(t));let r=secp256k1.Signature.fromBytes(this.data,"compact"),n=new secp256k1.Signature(r.r,r.s,this.recovery);return new J(n.recoverPublicKey(t).toBytes())}};var J=class e{key;prefix;constructor(t,r){this.key=t,this.prefix=r??x.address_prefix;}static fromString(t){let r=x.address_prefix;if(typeof t!="string"||t.length<=r.length)throw new Error("Invalid public key");let n=t.slice(0,r.length);if(n!==r)throw new Error(`Public key must start with ${r}`);let i;try{i=en.decode(t.slice(r.length));}catch{throw new Error("Invalid public key encoding")}if(i.length!==37)throw new Error("Invalid public key length");let o=i.subarray(0,33),s=i.subarray(33,37),a=ripemd160(o).subarray(0,4);if(!Po(s,a))throw new Error("Public key checksum mismatch");try{secp256k1.Point.fromBytes(o);}catch{throw new Error("Invalid public key")}return new e(o,n)}static from(t){return t instanceof e?t:e.fromString(t)}verify(t,r){return typeof r=="string"&&(r=Ae.from(r)),secp256k1.verify(r.data,t,this.key,{prehash:false,format:"compact"})}toString(){return Ao(this.key,this.prefix)}toJSON(){return this.toString()}inspect(){return `PublicKey: ${this.toString()}`}},Ao=(e,t)=>{let r=ripemd160(e);return t+en.encode(new Uint8Array([...e,...r.subarray(0,4)]))},Po=(e,t)=>{if(e.byteLength!==t.byteLength)return false;for(let r=0;r{throw new Error("Void can not be serialized")},_=(e,t)=>{e.writeVString(t);},Eo=(e,t)=>{e.writeInt16(t);},rn=(e,t)=>{e.writeInt64(t);},tn=(e,t)=>{e.writeUint8(t);},ce=(e,t)=>{e.writeUint16(t);},Y=(e,t)=>{e.writeUint32(t);},nn=(e,t)=>{e.writeUint64(t);},ge=(e,t)=>{e.writeByte(t?1:0);},on=e=>(t,r)=>{let[n,i]=r;t.writeVarint32(n),e[n](t,i);},q=(e,t)=>{let r=ht.from(t),n=r.getPrecision();e.writeInt64(Math.round(r.amount*Math.pow(10,n))),e.writeUint8(n);for(let i=0;i<7;i++)e.writeUint8(r.symbol.charCodeAt(i)||0);},Pe=(e,t)=>{e.writeUint32(Math.floor(new Date(t+"Z").getTime()/1e3));},fe=(e,t)=>{t===null||typeof t=="string"&&t.slice(-39)==="1111111111111111111111111111111114T1Anm"?e.append(new Uint8Array(33).fill(0)):e.append(J.from(t).key);},sn=(e=null)=>(t,r)=>{r=wt.from(r);let n=r.buffer.length;if(e){if(n!==e)throw new Error(`Unable to serialize binary. Expected ${e} bytes, got ${n}`)}else t.writeVarint32(n);t.append(r.buffer);},an=sn(),Yt=(e,t)=>(r,n)=>{r.writeVarint32(n.length);for(let[i,o]of n)e(r,i),t(r,o);},V=e=>(t,r)=>{t.writeVarint32(r.length);for(let n of r)e(t,n);},ue=e=>(t,r)=>{for(let[n,i]of e)try{i(t,r[n]);}catch(o){throw o.message=`${n}: ${o.message}`,o}},ke=e=>(t,r)=>{r!==void 0?(t.writeByte(1),e(t,r)):t.writeByte(0);},W=ue([["weight_threshold",Y],["account_auths",Yt(_,ce)],["key_auths",Yt(fe,ce)]]),So=ue([["account",_],["weight",ce]]),Xt=ue([["base",q],["quote",q]]),ko=ue([["account_creation_fee",q],["maximum_block_size",Y],["hbd_interest_rate",ce]]),R=(e,t)=>{let r=ue(t);return (n,i)=>{n.writeVarint32(e),r(n,i);}},k={};k.account_create=R(T.account_create,[["fee",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_]]);k.account_create_with_delegation=R(T.account_create_with_delegation,[["fee",q],["delegation",q],["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.account_update=R(T.account_update,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",fe],["json_metadata",_]]);k.account_witness_proxy=R(T.account_witness_proxy,[["account",_],["proxy",_]]);k.account_witness_vote=R(T.account_witness_vote,[["account",_],["witness",_],["approve",ge]]);k.cancel_transfer_from_savings=R(T.cancel_transfer_from_savings,[["from",_],["request_id",Y]]);k.change_recovery_account=R(T.change_recovery_account,[["account_to_recover",_],["new_recovery_account",_],["extensions",V(ie)]]);k.claim_account=R(T.claim_account,[["creator",_],["fee",q],["extensions",V(ie)]]);k.claim_reward_balance=R(T.claim_reward_balance,[["account",_],["reward_hive",q],["reward_hbd",q],["reward_vests",q]]);k.comment=R(T.comment,[["parent_author",_],["parent_permlink",_],["author",_],["permlink",_],["title",_],["body",_],["json_metadata",_]]);k.comment_options=R(T.comment_options,[["author",_],["permlink",_],["max_accepted_payout",q],["percent_hbd",ce],["allow_votes",ge],["allow_curation_rewards",ge],["extensions",V(on([ue([["beneficiaries",V(So)]])]))]]);k.convert=R(T.convert,[["owner",_],["requestid",Y],["amount",q]]);k.create_claimed_account=R(T.create_claimed_account,[["creator",_],["new_account_name",_],["owner",W],["active",W],["posting",W],["memo_key",fe],["json_metadata",_],["extensions",V(ie)]]);k.custom=R(T.custom,[["required_auths",V(_)],["id",ce],["data",an]]);k.custom_json=R(T.custom_json,[["required_auths",V(_)],["required_posting_auths",V(_)],["id",_],["json",_]]);k.decline_voting_rights=R(T.decline_voting_rights,[["account",_],["decline",ge]]);k.delegate_vesting_shares=R(T.delegate_vesting_shares,[["delegator",_],["delegatee",_],["vesting_shares",q]]);k.delete_comment=R(T.delete_comment,[["author",_],["permlink",_]]);k.escrow_approve=R(T.escrow_approve,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y],["approve",ge]]);k.escrow_dispute=R(T.escrow_dispute,[["from",_],["to",_],["agent",_],["who",_],["escrow_id",Y]]);k.escrow_release=R(T.escrow_release,[["from",_],["to",_],["agent",_],["who",_],["receiver",_],["escrow_id",Y],["hbd_amount",q],["hive_amount",q]]);k.escrow_transfer=R(T.escrow_transfer,[["from",_],["to",_],["hbd_amount",q],["hive_amount",q],["escrow_id",Y],["agent",_],["fee",q],["json_meta",_],["ratification_deadline",Pe],["escrow_expiration",Pe]]);k.feed_publish=R(T.feed_publish,[["publisher",_],["exchange_rate",Xt]]);k.limit_order_cancel=R(T.limit_order_cancel,[["owner",_],["orderid",Y]]);k.limit_order_create=R(T.limit_order_create,[["owner",_],["orderid",Y],["amount_to_sell",q],["min_to_receive",q],["fill_or_kill",ge],["expiration",Pe]]);k.limit_order_create2=R(T.limit_order_create2,[["owner",_],["orderid",Y],["amount_to_sell",q],["exchange_rate",Xt],["fill_or_kill",ge],["expiration",Pe]]);k.recover_account=R(T.recover_account,[["account_to_recover",_],["new_owner_authority",W],["recent_owner_authority",W],["extensions",V(ie)]]);k.request_account_recovery=R(T.request_account_recovery,[["recovery_account",_],["account_to_recover",_],["new_owner_authority",W],["extensions",V(ie)]]);k.reset_account=R(T.reset_account,[["reset_account",_],["account_to_reset",_],["new_owner_authority",W]]);k.set_reset_account=R(T.set_reset_account,[["account",_],["current_reset_account",_],["reset_account",_]]);k.set_withdraw_vesting_route=R(T.set_withdraw_vesting_route,[["from_account",_],["to_account",_],["percent",ce],["auto_vest",ge]]);k.transfer=R(T.transfer,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_from_savings=R(T.transfer_from_savings,[["from",_],["request_id",Y],["to",_],["amount",q],["memo",_]]);k.transfer_to_savings=R(T.transfer_to_savings,[["from",_],["to",_],["amount",q],["memo",_]]);k.transfer_to_vesting=R(T.transfer_to_vesting,[["from",_],["to",_],["amount",q]]);k.vote=R(T.vote,[["voter",_],["author",_],["permlink",_],["weight",Eo]]);k.withdraw_vesting=R(T.withdraw_vesting,[["account",_],["vesting_shares",q]]);k.witness_update=R(T.witness_update,[["owner",_],["url",_],["block_signing_key",fe],["props",ko],["fee",q]]);k.witness_set_properties=R(T.witness_set_properties,[["owner",_],["props",Yt(_,an)],["extensions",V(ie)]]);k.account_update2=R(T.account_update2,[["account",_],["owner",ke(W)],["active",ke(W)],["posting",ke(W)],["memo_key",ke(fe)],["json_metadata",_],["posting_json_metadata",_],["extensions",V(ie)]]);k.create_proposal=R(T.create_proposal,[["creator",_],["receiver",_],["start_date",Pe],["end_date",Pe],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(ie)]]);k.update_proposal_votes=R(T.update_proposal_votes,[["voter",_],["proposal_ids",V(rn)],["approve",ge],["extensions",V(ie)]]);k.remove_proposal=R(T.remove_proposal,[["proposal_owner",_],["proposal_ids",V(rn)],["extensions",V(ie)]]);var Co=ue([["end_date",Pe]]);k.update_proposal=R(T.update_proposal,[["proposal_id",nn],["creator",_],["daily_pay",q],["subject",_],["permlink",_],["extensions",V(on([ie,Co]))]]);k.collateralized_convert=R(T.collateralized_convert,[["owner",_],["requestid",Y],["amount",q]]);k.recurrent_transfer=R(T.recurrent_transfer,[["from",_],["to",_],["amount",q],["memo",_],["recurrence",ce],["executions",ce],["extensions",V(ue([["type",tn],["value",ue([["pair_id",tn]])]]))]]);var To=(e,t)=>{let r=k[t[0]];if(!r)throw new Error(`No serializer for operation: ${t[0]}`);try{r(e,t[1]);}catch(n){throw n.message=`${t[0]}: ${n.message}`,n}},Ro=ue([["ref_block_num",ce],["ref_block_prefix",Y],["expiration",Pe],["operations",V(To)],["extensions",V(_)]]),Fo=ue([["from",fe],["to",fe],["nonce",nn],["check",Y],["encrypted",sn()]]),pe={Asset:q,Memo:Fo,Price:Xt,PublicKey:fe,String:_,Transaction:Ro,UInt16:ce,UInt32:Y};var Ye=e=>new Promise(t=>setTimeout(t,e));var qo=(()=>{try{return !(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof process<"u"&&process.versions!=null&&process.versions.node!=null}catch{return false}})();function ln(){return qo?{"User-Agent":x.userAgent}:{}}var X=class extends Error{name="RPCError";data;code;stack=void 0;constructor(t){super(t.message),this.code=t.code,"data"in t&&(this.data=t.data);}},Ce=class extends Error{node;rateLimitMs;isRateLimit;constructor(t,r,n={}){super(r),this.node=t,this.rateLimitMs=n.rateLimitMs??0,this.isRateLimit=n.isRateLimit??false;}};function dn(e){if(!e)return 0;let t=Number(e);if(Number.isFinite(t))return t>0?t*1e3:0;let r=Date.parse(e);if(Number.isFinite(r)){let n=r-Date.now();return n>0?n:0}return 0}var Io=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],Do=["Failed to fetch","NetworkError when attempting to fetch","Load failed","fetch failed"];function Ko(e){if(!e)return "";let t=[String(e.name||""),String(e.message||""),String(e.code||"")],r=e.cause;for(let n=0;r&&n<5;n++)t.push(String(r.code||""),String(r.message||"")),r=r.cause;return t.join(" ")}function Bo(e){if(!e)return false;if(e instanceof Ce)return true;if(e instanceof X)return false;let t=Ko(e);return !!(Io.some(r=>t.includes(r))||Do.some(r=>t.includes(r))||e instanceof SyntaxError||/Unexpected token|JSON\.parse|Unexpected end of JSON/i.test(t))}function Zt(e,t){return !!(e===-32603||e<=-32e3&&e>=-32099||e===-32601||e===-32602&&/unable to parse|endpoint data|internal/i.test(t))}function fn(e){let t=e.indexOf(".");return t>0?e.slice(0,t):e}var Mo=1e4,No=6e4,Qo=12e4,cn=2,un=6e4,pn=12e4,Ho=30,Xe=.3,er=3,Ze=5*6e4,mn=6e4,gn=1e3,yn=2e3,bt=class{health=new Map;getOrCreate(t){let r=this.health.get(t);return r||(r={consecutiveFailures:0,lastFailureTime:0,rateLimitedUntil:0,rateLimitStreak:0,lastRateLimitAt:0,apiFailures:new Map,headBlock:0,headBlockUpdatedAt:0,ewmaLatencyMs:void 0,latencySampleCount:0,latencyUpdatedAt:0,lastProbeAt:Date.now(),apiLatency:new Map},this.health.set(t,r)),r}recordSuccess(t,r,n,i){let o=this.getOrCreate(t);if(o.consecutiveFailures=0,o.rateLimitStreak=0,r){let s=o.apiFailures.get(r);(!s||!(s.defective&&s.cooldownUntil>Date.now()))&&o.apiFailures.delete(r);}typeof n=="number"&&Number.isFinite(n)&&n>=0&&this.recordLatency(o,n,i??r);}recordSlowFailure(t,r,n){!Number.isFinite(r)||r=er&&i-o.updatedAt<=Ze?o.ewmaMs:void 0}return this.isLatencyUsable(n,i)?n.ewmaLatencyMs:void 0}recordCensoredLatency(t,r,n){!Number.isFinite(r)||r<50||this.recordLatency(this.getOrCreate(t),r,n);}recordLatency(t,r,n){let i=Date.now();if(t.latencyUpdatedAt>0&&i-t.latencyUpdatedAt>Ze&&(t.ewmaLatencyMs=void 0,t.latencySampleCount=0,t.apiLatency.clear()),t.ewmaLatencyMs=t.ewmaLatencyMs===void 0?r:Xe*r+(1-Xe)*t.ewmaLatencyMs,t.latencySampleCount++,t.latencyUpdatedAt=i,n!==void 0){let o=t.apiLatency.get(n);!o||i-o.updatedAt>Ze?t.apiLatency.set(n,{ewmaMs:r,sampleCount:1,updatedAt:i}):(o.ewmaMs=Xe*r+(1-Xe)*o.ewmaMs,o.sampleCount++,o.updatedAt=i);}}recordFailure(t,r){let n=this.getOrCreate(t);if(r){let i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};(o.cooldownUntil>0&&o.cooldownUntil<=i||o.lastFailureTime>0&&i-o.lastFailureTime>3e4)&&(o.count=0,o.cooldownUntil=0),o.count++,o.lastFailureTime=i,o.count>=cn&&(o.cooldownUntil=i+un),n.apiFailures.set(r,o);}else n.consecutiveFailures++,n.lastFailureTime=Date.now();}recordDefectiveResponse(t,r){let n=this.getOrCreate(t),i=Date.now(),o=n.apiFailures.get(r)??{count:0,cooldownUntil:0,lastFailureTime:0};o.count=Math.max(o.count+1,cn),o.lastFailureTime=i,o.cooldownUntil=i+un,o.defective=true,n.apiFailures.set(r,o);}recordRateLimit(t,r){let n=this.getOrCreate(t),i=Date.now();n.rateLimitStreak>0&&i-n.lastRateLimitAt>Qo&&(n.rateLimitStreak=0);let o=typeof r=="number"&&Number.isFinite(r)&&r>0,s=o?r:Math.min(Mo*2**n.rateLimitStreak,No);o||n.rateLimitStreak++,n.lastRateLimitAt=i,n.rateLimitedUntil=o?i+s:Math.max(n.rateLimitedUntil,i+s),n.consecutiveFailures++,n.lastFailureTime=i;}recordHeadBlock(t,r){if(!r||!Number.isFinite(r))return;let n=this.getOrCreate(t);n.headBlock=r,n.headBlockUpdatedAt=Date.now();}consensusHeadBlock(){let t=Date.now(),r=[];for(let n of this.health.values())n.headBlock>0&&t-n.headBlockUpdatedAt<=pn&&r.push(n.headBlock);return r.length<2?0:(r.sort((n,i)=>n-i),r[Math.floor((r.length-1)/2)])}isNodeHealthy(t,r){let n=this.health.get(t);if(!n)return true;let i=Date.now();if(n.rateLimitedUntil>i||n.consecutiveFailures>=3&&i-n.lastFailureTime<3e4)return false;if(r){let s=n.apiFailures.get(r);if(s&&s.cooldownUntil>i)return false}let o=this.consensusHeadBlock();return !(o>0&&n.headBlock>0&&i-n.headBlockUpdatedAt<=pn&&o-n.headBlock>Ho)}getOrderedNodes(t,r){let n=[],i=[];for(let u of t)this.isNodeHealthy(u,r)?n.push(u):i.push(u);if(n.length<=1)return [...n,...i];let o=Date.now(),s=n.map((u,p)=>({node:u,i:p,score:this.scoreNode(u,o)})).sort((u,p)=>u.score-p.score||u.i-p.i).map(u=>u.node),a=this.pickReprobeCandidate(n,o);return a&&s[0]!==a?[a,...s.filter(u=>u!==a),...i]:[...s,...i]}isLatencyUsable(t,r){return !!t&&t.ewmaLatencyMs!==void 0&&t.latencySampleCount>=er&&r-t.latencyUpdatedAt<=Ze}scoreNode(t,r){let n=this.health.get(t);return this.isLatencyUsable(n,r)?n.ewmaLatencyMs:gn}pickReprobeCandidate(t,r){let n=r-mn,i,o=1/0;for(let s of t){let a=this.getOrCreate(s),u=Math.max(a.latencyUpdatedAt,a.lastProbeAt);u<=n&&u=1-1e-9?(this.tokens-=1,true):false}refill(){this.clamp(),this.tokens=Math.min(x.resilience.hedgeBucketCapacity,this.tokens+x.resilience.hedgeRefillPerSuccess);}clamp(){this.tokens>x.resilience.hedgeBucketCapacity&&(this.tokens=x.resilience.hedgeBucketCapacity);}get available(){return this.tokens}reset(t=x.resilience.hedgeBucketCapacity){this.tokens=t;}},rr=new tr;function vt(e,t,r,n,i){let o=x.resilience;if(!o.adaptiveTimeout||i)return n;let s=e.getUsableLatencyMs(t,r);return s===void 0?n:Math.ceil(Math.min(n,Math.max(o.adaptiveTimeoutFloorMs,o.adaptiveTimeoutFactor*s)))}function nr(e,t,r,n){r instanceof Ce?r.isRateLimit?e.recordRateLimit(t,r.rateLimitMs||void 0):e.recordFailure(t,n):r instanceof X?e.recordFailure(t,n):e.recordFailure(t);}function hn(e,t,r,n){if(!n||typeof n!="object"||!r.includes("get_dynamic_global_properties"))return;let i=n.head_block_number;typeof i=="number"&&e.recordHeadBlock(t,i);}function Uo(){if(typeof DOMException<"u")return new DOMException("The operation was aborted due to timeout","TimeoutError");let e=new Error("The operation was aborted due to timeout");return e.name="TimeoutError",e}function wn(e){if(e=Math.ceil(e),typeof AbortSignal.timeout=="function")return {signal:AbortSignal.timeout(e),cleanup:()=>{}};let t=new AbortController,r=setTimeout(()=>t.abort(Uo()),e);return {signal:t.signal,cleanup:()=>clearTimeout(r)}}function ir(e,t){if(!t)return {signal:e,cleanup:()=>{}};if(typeof AbortSignal.any=="function")return {signal:AbortSignal.any([e,t]),cleanup:()=>{}};let r=new AbortController;if(e.aborted)return r.abort(e.reason),{signal:r.signal,cleanup:()=>{}};if(t.aborted)return r.abort(t.reason),{signal:r.signal,cleanup:()=>{}};let n=()=>r.abort(e.reason),i=()=>r.abort(t.reason);e.addEventListener("abort",n,{once:true}),t.addEventListener("abort",i,{once:true});let o=()=>{e.removeEventListener("abort",n),t.removeEventListener("abort",i);};return {signal:r.signal,cleanup:o}}var et=async(e,t,r,n=x.timeout,i=false,o)=>{let s=Math.floor(Math.random()*1e8),a={jsonrpc:"2.0",method:t,params:r,id:s},{signal:u,cleanup:p}=wn(n),{signal:l,cleanup:f}=ir(u,o),m=()=>{p(),f();};try{let y=await fetch(e,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",...ln()},signal:l});if(y.status===429)throw new Ce(e,"HTTP 429 Rate Limited",{rateLimitMs:dn(y.headers.get("Retry-After")),isRateLimit:!0});if(y.status>=500&&y.status<600)throw new Ce(e,`HTTP ${y.status} from ${e}`);let h=await y.json();if(!h||typeof h.id>"u"||h.id!==s||h.jsonrpc!=="2.0")throw new Error("JSONRPC id mismatch");if("result"in h)return h.result;if("error"in h){let E=h.error;throw "message"in E&&"code"in E?new X(E):h.error}throw h}catch(y){if(y instanceof X||y instanceof Ce||o?.aborted)throw y;if(i)return et(e,t,r,n,false,o);throw y}finally{m();}};function _t(){return Ye(50+Math.random()*50)}function Vo(e){let{method:t,params:r,api:n,primary:i,hedgePool:o,callerTimeout:s,explicitTimeout:a,deadlineAt:u,externalSignal:p,onHedgeFired:l,validate:f}=e;return new Promise((m,y)=>{let h=false,E=0,O=false,A=false,P,L,U=0,B=[],Q=z=>{if(!h){h=true,L!==void 0&&(clearTimeout(L),L=void 0);for(let F of B)F.signal.aborted||F.abort();z();}},$=(z,F)=>{E++;let de=new AbortController;B.push(de);let Je=ir(de.signal,p),_o=vt(j,z,t,s,a),jt=Date.now();F||(U=jt),et(z,t,r,_o,false,Je.signal).then(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(f&&!f(ne)){if(j.recordDefectiveResponse(z,n),P=new Error(`[hive-tx] response validation failed for ${t} from ${z}`),!F&&!O){Q(()=>y(P));return}E===0&&Q(()=>y(P));return}j.recordSuccess(z,n,Date.now()-jt,t),hn(j,z,t,ne),F?A||j.recordCensoredLatency(i,Date.now()-U,t):O||rr.refill(),Q(()=>m(ne));}}).catch(ne=>{if(Je.cleanup(),E--,F||(A=true),!h){if(p?.aborted){Q(()=>y(ne));return}if(ne instanceof X&&!Zt(ne.code,ne.message)){Q(()=>y(ne));return}if(nr(j,z,ne,n),j.recordSlowFailure(z,Date.now()-jt,t),P=ne,!F&&!O){Q(()=>y(ne));return}E===0&&Q(()=>y(P));}});};$(i,false);let Se=j.getUsableLatencyMs(i,t)??0,ze=vt(j,i,t,s,a),Vt=Math.min(Math.max(x.resilience.hedgeDelayFloorMs,x.resilience.hedgeDelayFactor*Se),.8*ze);L=setTimeout(()=>{if(L=void 0,h||p?.aborted||Date.now()>=u)return;let z=o.filter(de=>j.isNodeHealthy(de,n));if(z.length===0)return;let F=z[Math.floor(Math.random()*z.length)];rr.trySpend()&&(O=true,l(F),$(F,true));},Vt);})}var g=async(e,t=[],r,n=x.retry,i,o)=>{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let s=r!==void 0,a=r??x.timeout,u=fn(e),p=Date.now()+x.resilience.totalBudgetFactor*a,l=new Set,f;for(let m=0;m<=n&&!(m>0&&Date.now()>=p);m++){let y=j.getOrderedNodes(x.nodes,u),h=y.find(A=>!l.has(A));h||(l.clear(),h=y[0]),l.add(h);let E=[];if(x.resilience.hedge&&j.getUsableLatencyMs(h,e)!==void 0&&(E=y.filter(A=>!l.has(A)&&j.isNodeHealthy(A,u)).slice(0,3)),E.length>0)try{return await Vo({method:e,params:t,api:u,primary:h,hedgePool:E,callerTimeout:a,explicitTimeout:s,deadlineAt:p,externalSignal:i,onHedgeFired:A=>l.add(A),validate:o})}catch(A){if(A instanceof X&&!Zt(A.code,A.message)||i?.aborted)throw A;f=A,m{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an array");if(x.nodes.length===0)throw new Error("config.nodes is empty");let i=fn(e),o=new Set,s;for(let a=0;a!o.has(l));if(!p)break;if(o.add(p),n?.aborted)throw new Error("Aborted");try{let l=await et(p,e,t,r,!1,n);return j.recordSuccess(p,i),l}catch(l){if(l instanceof X||n?.aborted||(nr(j,p,l,i),s=l,!Bo(l)))throw l}}throw s},jo={balance:"/balance-api",hafah:"/hafah-api",hafbe:"/hafbe-api",hivemind:"/hivemind-api",hivesense:"/hivesense-api",reputation:"/reputation-api","nft-tracker":"/nft-tracker-api",hafsql:"/hafsql",status:"/status-api"};async function ee(e,t,r,n,i=x.retry,o){if(!Array.isArray(x.restNodes))throw new Error("config.restNodes is not an array");if(x.restNodes.length===0)throw new Error("config.restNodes is empty");let s=n!==void 0,a=n??x.timeout,u=Date.now()+x.resilience.totalBudgetFactor*a,p=`${e}:${t}`,l=x.restNodesByApi?.[e]?.length?x.restNodesByApi[e]:x.restNodes,f=new Set,m,y=false;for(let h=0;h<=i&&!(h>0&&Date.now()>=u);h++){let E=Oe.getOrderedNodes(l,e),O=E.find(F=>!f.has(F));O||(f.clear(),O=E[0]),f.add(O);let A=O+jo[e],P=t,L=r||{},U=new Set;Object.entries(L).forEach(([F,de])=>{P.includes(`{${F}}`)&&(P=P.replace(`{${F}}`,encodeURIComponent(String(de))),U.add(F));});let B=new URL(A+P);if(Object.entries(L).forEach(([F,de])=>{U.has(F)||(Array.isArray(de)?de.forEach(Je=>B.searchParams.append(F,String(Je))):B.searchParams.set(F,String(de)));}),o?.aborted)throw new Error("Aborted");y=false;let{signal:Q,cleanup:$}=wn(vt(Oe,O,p,a,s)),{signal:Se,cleanup:ze}=ir(Q,o),Vt=()=>{$(),ze();},z=Date.now();try{let F=await fetch(B.toString(),{signal:Se,headers:ln()});if(F.status===404)throw new Error("HTTP 404 - Hint: can happen on wrong params");if(F.status===429)throw Oe.recordRateLimit(O,dn(F.headers.get("Retry-After"))||void 0),y=!0,new Error(`HTTP 429 Rate Limited by ${O}`);if(F.status===503)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP 503 Service Unavailable from ${O}`);if(!F.ok)throw Oe.recordFailure(O,e),y=!0,new Error(`HTTP ${F.status} from ${O}`);return Oe.recordSuccess(O,e,Date.now()-z,p),F.json()}catch(F){if(F?.message?.includes("HTTP 404")||o?.aborted)throw F;y||Oe.recordFailure(O,e),Oe.recordSlowFailure(O,Date.now()-z,p),m=F,h{if(!Array.isArray(x.nodes))throw new Error("config.nodes is not an Array");if(r>x.nodes.length)throw new Error("quorum > config.nodes.length");let o=(u=>{let p=[...u];for(let l=p.length-1;l>0;l--){let f=Math.floor(Math.random()*(l+1));[p[l],p[f]]=[p[f],p[l]];}return p})(x.nodes),s=Math.min(r,o.length),a=[];for(;s>0&&o.length>0;){let u=o.splice(0,s),p=[],l=[];for(let m=0;ml.push(y)).catch(()=>{}));await Promise.all(p),a.push(...l);let f=Lo(a,r);if(f)return f;if(s=Math.min(r,o.length),s===0)throw new Error("No more nodes available.")}throw new Error("Couldn't reach quorum.")};function Lo(e,t){let r=new Map;for(let i of e){let o=JSON.stringify(i);r.has(o)||r.set(o,[]),r.get(o).push(i);}let n=Array.from(r.values()).find(i=>i.length>=t);return n?n[0]:null}var Wo=hexToBytes(x.chain_id),Te=class e{transaction;expiration=6e4;txId;constructor(t){t?.transaction&&(t.transaction instanceof e?(this.transaction=t.transaction.transaction,this.expiration=t.transaction.expiration):this.transaction=t.transaction,this.transaction&&!Array.isArray(this.transaction.signatures)&&(this.transaction.signatures=[]),this.txId=this.digest().txId),t?.expiration&&(this.expiration=t.expiration);}async addOperation(t,r){this.transaction||await this.createTransaction(this.expiration),this.transaction.operations.push([t,r]);}sign(t){if(!this.transaction)throw new Error("First create a transaction by .addOperation()");if(this.transaction){let{digest:r,txId:n}=this.digest();Array.isArray(t)||(t=[t]);for(let i of t){let o=i.sign(r);this.transaction.signatures.push(o.customToString());}return this.txId=n,this.transaction}else throw new Error("No transaction to sign")}async broadcast(t=false){if(!this.transaction)throw new Error("Attempted to broadcast an empty transaction. Add operations by .addOperation()");if(this.transaction.signatures.length===0)throw new Error("Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)");try{await Qe("condenser_api.broadcast_transaction",[this.transaction]);}catch(o){if(!(o instanceof X&&o.message.includes("Duplicate transaction check failed")))throw o}if(this.txId||(this.txId=this.digest().txId),!t)return {tx_id:this.txId,status:"unknown"};let r=60;await Ye(1e3);let n=await this.checkStatus(),i=1;for(;n?.status!=="within_irreversible_block"&&n?.status!=="expired_irreversible"&&n?.status!=="too_old"&&i{let r=await g("condenser_api.get_dynamic_global_properties",[]),n=hexToBytes(r.head_block_id),i=Number(new Uint32Array(n.buffer,n.byteOffset+4,1)[0]),o=new Date(Date.now()+t).toISOString().slice(0,-5);this.transaction={expiration:o,extensions:[],operations:[],ref_block_num:r.head_block_number&65535,ref_block_prefix:i,signatures:[]};}};var On=new Uint8Array([128]),H=class e{key;constructor(t){this.key=t;try{secp256k1.getPublicKey(t);}catch{throw new Error("invalid private key")}}static from(t){return typeof t=="string"?e.fromString(t):new e(t)}static fromString(t){return new e(Yo(t).subarray(1))}static fromSeed(t){if(typeof t=="string")if(/^[0-9a-fA-F]+$/.test(t))t=hexToBytes(t);else {let n=[];for(let i=0;i>6,128|o&63);else if(o>=55296&&o<=56319&&i+1>18,128|o>>12&63,128|o>>6&63,128|o&63);}else n.push(224|o>>12,128|o>>6&63,128|o&63);}t=new Uint8Array(n);}return new e(sha256(t))}static fromLogin(t,r,n="active"){let i=t+n+r;return e.fromSeed(i)}sign(t){let r=secp256k1.sign(t,this.key,{extraEntropy:true,format:"recovered",prehash:false}),n=parseInt(bytesToHex(r.subarray(0,1)),16);return Ae.from((n+31).toString(16)+bytesToHex(r.subarray(1)))}createPublic(t){return new J(secp256k1.getPublicKey(this.key),t)}toString(){return Jo(new Uint8Array([...On,...this.key]))}inspect(){let t=this.toString();return `PrivateKey: ${t.slice(0,6)}...${t.slice(-6)}`}getSharedSecret(t){let r=secp256k1.getSharedSecret(this.key,t.key);return sha512(r.subarray(1))}static randomKey(){return new e(secp256k1.keygen().secretKey)}},xn=e=>sha256(sha256(e)),Jo=e=>{let t=xn(e);return en.encode(new Uint8Array([...e,...t.slice(0,4)]))},Yo=e=>{let t=en.decode(e);if(!An(t.slice(0,1),On))throw new Error("Private key network id mismatch");let r=t.slice(-4),n=t.slice(0,-4),i=xn(n).slice(0,4);if(!An(r,i))throw new Error("Private key checksum mismatch");return n},An=(e,t)=>{if(e===t)return true;if(e.byteLength!==t.byteLength)return false;let r=e.byteLength,n=0;for(;nCn(e,t,n,r),kn=(e,t,r,n,i)=>Cn(e,t,r,n,i).message,Cn=(e,t,r,n,i)=>{let o=r,s=e.getSharedSecret(t),a=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);a.writeUint64(o),a.append(s),a.flip();let u=sha512(new Uint8Array(a.toBuffer())),p=u.subarray(32,48),l=u.subarray(0,32),f=sha256(u).subarray(0,4),m=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);m.append(f),m.flip();let y=m.readUint32();if(i!==void 0){if(y!==i)throw new Error("Invalid key");n=ts(n,l,p);}else n=rs(n,l,p);return {nonce:o,message:n,checksum:y}},ts=(e,t,r)=>{let n=e;return n=cbc(t,r).decrypt(n),n},rs=(e,t,r)=>{let n=e;return n=cbc(t,r).encrypt(n),n},sr=null,ns=()=>{if(sr===null){let r=secp256k1.utils.randomSecretKey();sr=r[0]<<8|r[1];}let e=BigInt(Date.now()),t=++sr%65536;return e=e<{let t=us(e,33);return new J(t)},os=e=>e.readUint64(),ss=e=>e.readUint32(),as=e=>{let t=e.readVarint32(),r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())},cs=e=>t=>{let r={},n=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);n.append(t),n.flip();for(let[i,o]of e)try{r[i]=o(n);}catch(s){throw s.message=`${i}: ${s.message}`,s}return r};function us(e,t){if(e){let r=e.copy(e.offset,e.offset+t);return e.skip(t),new Uint8Array(r.toBuffer())}else throw Error("No buffer found on first parameter")}var ps=cs([["from",Tn],["to",Tn],["nonce",os],["check",ss],["encrypted",as]]),Rn={Memo:ps};var qn=(e,t,r,n)=>{if(!r.startsWith("#"))return r;r=r.substring(1),Dn(),e=Kn(e),t=ls(t);let i=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);i.writeVString(r);let o=new Uint8Array(i.copy(0,i.offset).toBuffer()),{nonce:s,message:a,checksum:u}=Sn(e,t,o,n),p=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);pe.Memo(p,{check:u,encrypted:a,from:e.createPublic(),nonce:s,to:t}),p.flip();let l=new Uint8Array(p.toBuffer());return "#"+en.encode(l)},In=(e,t)=>{if(!t.startsWith("#"))return t;t=t.substring(1),Dn(),e=Kn(e);let r=Rn.Memo(en.decode(t)),{from:n,to:i,nonce:o,check:s,encrypted:a}=r,p=e.createPublic().toString()===new J(n.key).toString()?new J(i.key):new J(n.key);r=kn(e,p,o,a,s);let l=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return l.append(r),l.flip(),"#"+l.readVString()},Pt,Dn=()=>{if(Pt===void 0){let e;Pt=true;try{let t="5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw",n=qn(t,"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA","#memo\u7231");e=In(t,n);}finally{Pt=e==="#memo\u7231";}}if(Pt===false)throw new Error("This environment does not support encryption.")},Kn=e=>typeof e=="string"?H.fromString(e):e,ls=e=>typeof e=="string"?J.fromString(e):e,Bn={decode:In,encode:qn};var re={};ft(re,{buildWitnessSetProperties:()=>hs,makeBitMaskFilter:()=>gs,operations:()=>ms,validateUsername:()=>fs});var fs=e=>{let t="Account name should ";if(!e)return t+"not be empty.";let r=e.length;if(r<3)return t+"be longer.";if(r>16)return t+"be shorter.";/\./.test(e)&&(t="Each account segment should ");let n=e.split("."),i=n.length;for(let o=0;oe.reduce(ys,[BigInt(0),BigInt(0)]).map(t=>t!==BigInt(0)?t.toString():null),ys=([e,t],r)=>r<64?[e|BigInt(1)<{let r={extensions:[],owner:e,props:[]};for(let n of Object.keys(t)){if(t[n]===void 0)continue;let i;switch(n){case "key":case "new_signing_key":i=pe.PublicKey;break;case "account_subsidy_budget":case "account_subsidy_decay":case "maximum_block_size":i=pe.UInt32;break;case "hbd_interest_rate":i=pe.UInt16;break;case "url":i=pe.String;break;case "hbd_exchange_rate":i=pe.Price;break;case "account_creation_fee":i=pe.Asset;break;default:throw new Error(`Unknown witness prop: ${n}`)}r.props.push([n,ws(i,t[n])]);}return r.props.sort((n,i)=>n[0].localeCompare(i[0])),["witness_set_properties",r]},ws=(e,t)=>{let r=new I(I.DEFAULT_CAPACITY,I.LITTLE_ENDIAN);return e(r,t),r.flip(),bytesToHex(new Uint8Array(r.toBuffer()))};function tm(e){let t;if(typeof e=="string"){let r=[];for(let n=0;n>6,128|i&63);else if(i>=55296&&i<=56319&&n+1>18,128|i>>12&63,128|i>>6&63,128|i&63);}else r.push(224|i>>12,128|i>>6&63,128|i&63);}t=new Uint8Array(r);}else t=e;return sha256(t)}function Mn(e){try{return H.fromString(e),!0}catch{return false}}async function Z(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),Qe("condenser_api.broadcast_transaction_synchronous",[r.transaction])}async function Nn(e,t){let r=new Te;for(let n of e)await r.addOperation(n[0],n[1]);return r.sign(t),r.broadcast(false)}var bs=432e3;function Qn(e,t){let r=Date.now()/1e3-t.last_update_time,n=Number(t.current_mana)+r*e/bs,i=Math.round(n/e*1e4);return !isFinite(i)||i<0?i=0:i>1e4&&(i=1e4),{current_mana:n,max_mana:e,percentage:i}}function vs(e){let t=parseFloat(e.vesting_shares),r=parseFloat(e.delegated_vesting_shares),n=parseFloat(e.received_vesting_shares),i=parseFloat(e.vesting_withdraw_rate),o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t-s-r+n}function ar(e){let t=vs(e)*1e6;return Qn(t,e.voting_manabar)}function Ot(e){return Qn(Number(e.max_rc),e.rc_manabar)}var Hn=(u=>(u.COMMON="common",u.INFO="info",u.INSUFFICIENT_RESOURCE_CREDITS="insufficient_resource_credits",u.MISSING_AUTHORITY="missing_authority",u.TOKEN_EXPIRED="token_expired",u.NETWORK="network",u.TIMEOUT="timeout",u.VALIDATION="validation",u))(Hn||{});function He(e){let t=e?.error_description?String(e.error_description):"",r=e?.message?String(e.message):"",n=e?.error?String(e.error):"",i=t||r||String(e||""),o=a=>!!(n&&a.test(n)||t&&a.test(t)||r&&a.test(r)||i&&a.test(i));if(o(/please wait to transact/i)||o(/insufficient rc/i)||o(/rc mana|rc account|resource credits/i))return {message:"Insufficient Resource Credits. Please wait or power up.",type:"insufficient_resource_credits",originalError:e};if(o(/you may only post once every/i))return {message:"Please wait before posting again (minimum 3 second interval between comments).",type:"common",originalError:e};if(o(/your current vote on this comment is identical/i))return {message:"You have already voted with the same weight.",type:"info",originalError:e};if(o(/must claim something/i))return {message:"You must claim rewards before performing this action.",type:"info",originalError:e};if(o(/cannot claim that much vests/i))return {message:"Cannot claim that amount. Please check your pending rewards.",type:"info",originalError:e};if(o(/cannot delete a comment with net positive/i))return {message:"Cannot delete a comment with positive votes.",type:"info",originalError:e};if(o(/children == 0/i))return {message:"Cannot delete a comment with replies.",type:"common",originalError:e};if(o(/comment_cashout/i))return {message:"Cannot modify a comment that has already been paid out.",type:"common",originalError:e};if(o(/votes evaluating for comment that is paid out is forbidden/i))return {message:"Cannot vote on posts that have already been paid out.",type:"common",originalError:e};if(o(/no (active|owner|posting|memo) key available/i))return {message:"Key not available. Please provide your key to sign this operation.",type:"missing_authority",originalError:e};if(o(/missing (required )?active authority/i))return {message:"Missing active authority. This operation requires your active key.",type:"missing_authority",originalError:e};if(o(/missing (required )?owner authority/i))return {message:"Missing owner authority. This operation requires your owner key.",type:"missing_authority",originalError:e};if(o(/missing (required )?posting authority/i))return {message:"Missing posting authority. Please check your login method.",type:"missing_authority",originalError:e};if(n==="invalid_grant"||n==="unauthorized_access"||o(/token expired/i)||o(/invalid token/i)||o(/\bunauthorized\b/i)||o(/\bforbidden\b/i))return {message:"Authentication token expired. Please log in again.",type:"token_expired",originalError:e};if(o(/has already reblogged/i)||o(/already reblogged this post/i))return {message:"You have already reblogged this post.",type:"info",originalError:e};if(o(/duplicate transaction/i))return {message:"This transaction has already been processed.",type:"info",originalError:e};if(o(/econnrefused/i)||o(/connection refused/i)||o(/failed to fetch/i)||o(/\bnetwork[-\s]?(request|error|timeout|unreachable|down|failed)\b/i))return {message:"Network error. Please check your connection and try again.",type:"network",originalError:e};if(o(/timeout/i)||o(/timed out/i))return {message:"Request timed out. Please try again.",type:"timeout",originalError:e};if(o(/account.*does not exist/i)||o(/account not found/i))return {message:"Account not found. Please check the username.",type:"validation",originalError:e};if(o(/invalid memo key/i))return {message:"Invalid memo key. Cannot encrypt message.",type:"validation",originalError:e};if(o(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i))return {message:"Insufficient funds for this transaction.",type:"validation",originalError:e};if(o(/\b(invalid|validation)\b/i))return {message:(e?.message||i).substring(0,150)||"Validation error occurred",type:"validation",originalError:e};if(e?.error_description&&typeof e.error_description=="string")return {message:e.error_description.substring(0,150),type:"common",originalError:e};if(e?.message&&typeof e.message=="string")return {message:e.message.substring(0,150),type:"common",originalError:e};let s;return typeof e=="object"&&e!==null?e.error_description?s=String(e.error_description):e.code?s=`Error code: ${e.code}`:i&&i!=="[object Object]"?s=i.substring(0,150):s="Unknown error occurred":s=i.substring(0,150)||"Unknown error occurred",{message:s,type:"common",originalError:e}}function As(e){let t=He(e);return [t.message,t.type]}function ye(e){let{type:t}=He(e);return t==="missing_authority"||t==="token_expired"}function Ps(e){let{type:t}=He(e);return t==="insufficient_resource_credits"}function Os(e){let{type:t}=He(e);return t==="info"}function xs(e){let{type:t}=He(e);return t==="network"||t==="timeout"}async function he(e,t,r,n,i="posting",o,s,a="async"){let u=n?.adapter;switch(e){case "key":{if(!u)throw new Error("No adapter provided for key-based auth");let p=o;if(p===void 0)switch(i){case "owner":if(u.getOwnerKey)p=await u.getOwnerKey(t);else throw new Error("Owner key not supported by adapter. Owner operations (like account recovery) require master password login or manual key entry.");break;case "active":u.getActiveKey&&(p=await u.getActiveKey(t));break;case "memo":if(u.getMemoKey)p=await u.getMemoKey(t);else throw new Error("Memo key not supported by adapter. Use memo encryption methods instead.");break;default:p=await u.getPostingKey(t);break}if(!p)throw new Error(`No ${i} key available for ${t}`);let l=H.fromString(p);return a==="async"?await Nn(r,l):await Z(r,l)}case "hiveauth":{if(!u?.broadcastWithHiveAuth)throw new Error("HiveAuth not supported by adapter");return await u.broadcastWithHiveAuth(t,r,i)}case "hivesigner":{if(!u)throw new Error("No adapter provided for HiveSigner auth");if(i!=="posting"){if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`HiveSigner access token cannot sign ${i} operations. No platform broadcast available.`)}let p=s!==void 0?s:await u.getAccessToken(t);if(p)try{return (await new Un.Client({accessToken:p}).broadcast(r)).result}catch(l){if(u.broadcastWithHiveSigner&&ye(l))return await u.broadcastWithHiveSigner(t,r,i);throw l}if(u.broadcastWithHiveSigner)return await u.broadcastWithHiveSigner(t,r,i);throw new Error(`No access token available for ${t}`)}case "keychain":{if(!u?.broadcastWithKeychain)throw new Error("Keychain not supported by adapter");return await u.broadcastWithKeychain(t,r,i)}case "custom":{if(!n?.broadcast)throw new Error("No custom broadcast function provided");return await n.broadcast(r,i)}default:throw new Error(`Unknown auth method: ${e}`)}}async function Ss(e,t,r,n="posting",i="async"){let o=r?.adapter;if(o?.getLoginType){let l=await o.getLoginType(e,n);if(l){let f=o.hasPostingAuthorization?await o.hasPostingAuthorization(e):false;if(n==="posting"&&f&&l==="key")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to key:",m);}if(n==="posting"&&f&&l==="keychain")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to keychain/snap:",m);}if(n==="posting"&&f&&l==="hiveauth")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(m){if(!ye(m))throw m;console.warn("[SDK] HiveSigner token auth failed, falling back to HiveAuth:",m);}try{return await he(l,e,t,r,n,void 0,void 0,i)}catch(m){if(ye(m)&&o.showAuthUpgradeUI&&(n==="posting"||n==="active")){let y=t.length>0?t[0][0]:"unknown",h=await o.showAuthUpgradeUI(n,y);if(!h)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(h,e,t,r,n,void 0,void 0,i)}throw m}}if(n==="posting")try{return await he("hivesigner",e,t,r,n,void 0,void 0,i)}catch(f){if(ye(f)&&o.showAuthUpgradeUI){let m=t.length>0?t[0][0]:"unknown",y=await o.showAuthUpgradeUI(n,m);if(!y)throw new Error(`No login type available for ${e}. Please log in again.`);return await he(y,e,t,r,n,void 0,void 0,i)}throw f}else if(n==="active"&&o.showAuthUpgradeUI){let f=t.length>0?t[0][0]:"unknown",m=await o.showAuthUpgradeUI(n,f);if(!m)throw new Error(`Operation requires ${n} authority. User declined alternate auth.`);return await he(m,e,t,r,n,void 0,void 0,i)}}let s=r?.fallbackChain??["key","hiveauth","hivesigner","keychain","custom"],a=new Map;for(let l of s)try{let f=!1,m="",y,h;switch(l){case "key":if(!o)f=!0,m="No adapter provided";else {let E;switch(n){case "owner":o.getOwnerKey&&(E=await o.getOwnerKey(e));break;case "active":o.getActiveKey&&(E=await o.getActiveKey(e));break;case "memo":o.getMemoKey&&(E=await o.getMemoKey(e));break;default:E=await o.getPostingKey(e);break}E?y=E:(f=!0,m=`No ${n} key available`);}break;case "hiveauth":o?.broadcastWithHiveAuth||(f=!0,m="HiveAuth not supported by adapter");break;case "hivesigner":if(!o)f=!0,m="No adapter provided";else {let E=await o.getAccessToken(e);E&&(h=E);}break;case "keychain":o?.broadcastWithKeychain||(f=!0,m="Keychain not supported by adapter");break;case "custom":r?.broadcast||(f=!0,m="No custom broadcast function provided");break}if(f){a.set(l,new Error(`Skipped: ${m}`));continue}return await he(l,e,t,r,n,y,h,i)}catch(f){if(a.set(l,f),!ye(f))throw f}if(!Array.from(a.values()).some(l=>!l.message.startsWith("Skipped:"))){let l=Array.from(a.entries()).map(([f,m])=>`${f}: ${m.message}`).join(", ");throw new Error(`[SDK][Broadcast] No auth methods attempted for ${e}. ${l}`)}let p=Array.from(a.entries()).map(([l,f])=>`${l}: ${f.message}`).join(", ");throw new Error(`[SDK][Broadcast] All auth methods failed for ${e}. Errors: ${p}`)}function v(e=[],t,r,n=()=>{},i,o="posting",s){let a=s?.broadcastMode??"async";return useMutation({onSuccess:n,onMutate:s?.onMutate,onError:s?.onError,onSettled:s?.onSettled,mutationKey:[...e,t],mutationFn:async u=>{if(!t)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let p=r(u);try{if(i?.enableFallback!==!1&&i?.adapter)return await Ss(t,p,i,o,a);if(i?.broadcast)return await i.broadcast(p,o);let l=i?.postingKey;if(l){if(o!=="posting")throw new Error(`[SDK][Broadcast] Legacy auth only supports posting authority, but '${o}' was requested. Use AuthContextV2 with an adapter for ${o} operations.`);let m=H.fromString(l);return await Z(p,m)}let f=i?.accessToken;if(f)return (await new Un.Client({accessToken:f}).broadcast(p)).result;throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}catch(l){throw l instanceof X?new Error(l.message):l}}})}async function Vn(e,t,r,n){if(!e)throw new Error("[Core][Broadcast] Attempted to call broadcast API with anon user");let i={id:t,required_auths:[],required_posting_auths:[e],json:JSON.stringify(r)};if(n?.broadcast)return n.broadcast([["custom_json",i]],"posting");let o=n?.postingKey;if(o){let u=H.fromString(o);return Z([["custom_json",i]],u)}let s=n?.accessToken;if(s)return (await new Un.Client({accessToken:s}).customJson([],[e],t,JSON.stringify(r))).result;let a=n?.adapter;if(a){let u=[["custom_json",i]];if(n?.loginType==="keychain"&&a.broadcastWithKeychain)return a.broadcastWithKeychain(e,u,"posting");if(n?.loginType==="hiveauth"&&a.broadcastWithHiveAuth)return a.broadcastWithHiveAuth(e,u,"posting")}throw new Error("[SDK][Broadcast] \u2013 cannot broadcast w/o posting key or token")}var hm=4e3;function S(e,t,r){if(e?.invalidateQueries){if(t==="sync")return e.invalidateQueries(r);setTimeout(()=>e.invalidateQueries?.(r),4e3);}}function we(e,t){let r=AbortSignal.timeout(e);if(!t)return r;if(typeof AbortSignal.any=="function")return AbortSignal.any([t,r]);let n=new AbortController,i=()=>{let o=t.aborted?t.reason:r.reason;n.abort(o),t.removeEventListener("abort",i),r.removeEventListener("abort",i);};return t.aborted?n.abort(t.reason):r.aborted?n.abort(r.reason):(t.addEventListener("abort",i,{once:true}),r.addEventListener("abort",i,{once:true})),n.signal}var Re=(()=>{try{return process.env?.NODE_ENV==="development"}catch{return false}})(),Ts=()=>{try{return process.env?.VITE_HELIUS_API_KEY}catch{return}},_e=1e4,jn=120*1e3,xt,Rs;function Fs(){return xt?xt():Rs??=new QueryClient}var d={privateApiHost:"https://ecency.com",defaultObserver:"ecency",clientId:"ecency-sdk",imageHost:"https://i.ecency.com",get hiveNodes(){return x.nodes},heliusApiKey:Ts(),get queryClient(){return Fs()},set queryClient(e){xt=()=>e;},pollsApiHost:"https://poll.ecency.com",plausibleHost:"https://pl.ecency.com",dmcaAccounts:[],dmcaTags:[],dmcaPatterns:[],dmcaTagRegexes:[],dmcaPatternRegexes:[],_dmcaInitialized:false},N;(A=>{function e(P){d.queryClient=P;}A.setQueryClient=e;function t(P){xt=P;}A.setQueryClientResolver=t;function r(P){d.privateApiHost=P;}A.setPrivateApiHost=r;function n(P){d.clientId=P;}A.setClientId=n;function i(P){if(typeof P!="string"||P.trim()==="")throw new Error("setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; observer resolution would fall back to the post author while caching under an empty key.");d.defaultObserver=P;}A.setDefaultObserver=i;function o(){return d.privateApiHost?d.privateApiHost:typeof window<"u"&&window.location?.origin?window.location.origin:"https://ecency.com"}A.getValidatedBaseUrl=o;function s(P){d.pollsApiHost=P;}A.setPollsApiHost=s;function a(P){d.imageHost=P;}A.setImageHost=a;function u(P){$t(P);}A.setHiveNodes=u;function p(P){Wt(P);}A.setRestNodes=p;function l(P){Gt(P);}A.setRestNodesByApi=l;function f(P){zt(P);}A.setUserAgent=f;function m(P){Jt(P);}A.setResilience=m;function y(P){if(/(\([^)]*[*+{][^)]*\))[*+{]/.test(P))return {safe:false,reason:"nested quantifiers detected"};if(/\([^|)]*\|[^)]*\)[*+{]/.test(P))return {safe:false,reason:"alternation with quantifier (potential overlap)"};if(/\([^)]*[*+][^)]*\)[*+]/.test(P))return {safe:false,reason:"repeated quantifiers (catastrophic backtracking risk)"};if(/\.\*\.\*/.test(P)||/\.\+\.\+/.test(P))return {safe:false,reason:"multiple greedy quantifiers on wildcards"};let L=/\.?\{(\d+),(\d+)\}/g,U;for(;(U=L.exec(P))!==null;){let[,B,Q]=U;if(parseInt(Q,10)-parseInt(B,10)>1e3)return {safe:false,reason:`excessive range: {${B},${Q}}`}}return {safe:true}}function h(P){let L=["a".repeat(50)+"x","ab".repeat(50)+"x","x".repeat(100),"aaa".repeat(30)+"bbb".repeat(30)+"x"],U=5;for(let B of L){let Q=Date.now();try{P.test(B);let $=Date.now()-Q;if($>U)return {safe:!1,reason:`runtime test exceeded ${U}ms (took ${$}ms on input length ${B.length})`}}catch($){return {safe:false,reason:`runtime test threw error: ${$}`}}}return {safe:true}}function E(P,L=200){try{if(!P)return Re&&console.warn("[SDK] DMCA pattern rejected: empty pattern"),null;if(P.length>L)return Re&&console.warn(`[SDK] DMCA pattern rejected: length ${P.length} exceeds max ${L} - pattern: ${P.substring(0,50)}...`),null;let U=y(P);if(!U.safe)return Re&&console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${U.reason}) - pattern: ${P.substring(0,50)}...`),null;let B;try{B=new RegExp(P);}catch($){return Re&&console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${P.substring(0,50)}...`,$),null}let Q=h(B);return Q.safe?B:(Re&&console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${Q.reason}) - pattern: ${P.substring(0,50)}...`),null)}catch(U){return Re&&console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${P.substring(0,50)}...`,U),null}}function O(P={}){let L=$=>Array.isArray($)?$.filter(Se=>typeof Se=="string"):[],U=P||{},B={accounts:L(U.accounts),tags:L(U.tags),patterns:L(U.posts)};d.dmcaAccounts=B.accounts,d.dmcaTags=B.tags,d.dmcaPatterns=B.patterns,d.dmcaTagRegexes=B.tags.map($=>E($)).filter($=>$!==null),d.dmcaPatternRegexes=[];let Q=B.tags.length-d.dmcaTagRegexes.length;!d._dmcaInitialized&&Re&&(console.log("[SDK] DMCA configuration loaded:"),console.log(` - Accounts: ${B.accounts.length}`),console.log(` - Tag patterns: ${d.dmcaTagRegexes.length}/${B.tags.length} compiled (${Q} rejected)`),console.log(` - Post patterns: ${B.patterns.length} (using exact string matching)`),Q>0&&console.warn(`[SDK] ${Q} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`)),d._dmcaInitialized=true;}A.setDmcaLists=O;})(N||={});function Cm(){return new QueryClient({defaultOptions:{queries:{refetchOnWindowFocus:false,refetchOnMount:false}}})}var b=()=>d.queryClient,Ks;(s=>{function e(a){return b().getQueryData(a)}s.getQueryData=e;function t(a){return b().getQueryData(a)}s.getInfiniteQueryData=t;async function r(a){return await b().prefetchQuery(a),e(a.queryKey)}s.prefetchQuery=r;async function n(a){return await b().prefetchInfiniteQuery(a),t(a.queryKey)}s.prefetchInfiniteQuery=n;function i(a){return {prefetch:()=>r(a),getData:()=>e(a.queryKey),useClientQuery:()=>useQuery(a),fetchAndGet:()=>b().fetchQuery(a)}}s.generateClientServerQuery=i;function o(a){return {prefetch:()=>n(a),getData:()=>t(a.queryKey),useClientQuery:()=>useInfiniteQuery(a),fetchAndGet:()=>b().fetchInfiniteQuery(a)}}s.generateClientServerInfiniteQuery=o;})(Ks||={});function Rm(e){return btoa(JSON.stringify(e))}function Fm(e){let t=atob(e);if(t[0]==="{")return JSON.parse(t)}var Ln=(n=>(n.HIVE="HIVE",n.HBD="HBD",n.VESTS="VESTS",n))(Ln||{}),Et=(e=>(e["@@000000021"]="HIVE",e["@@000000013"]="HBD",e["@@000000037"]="VESTS",e))(Et||{});function C(e){if(typeof e=="string"){let t=e.split(" ");return {amount:parseFloat(t[0]),symbol:Ln[t[1]]}}else return {amount:parseFloat(e.amount.toString())/Math.pow(10,e.precision),symbol:Et[e.nai]}}var cr;function w(){if(!cr){if(typeof globalThis.fetch!="function")throw new Error("[Ecency][SDK] - global fetch is not available");cr=globalThis.fetch.bind(globalThis);}return cr}function $n(e){return typeof e=="string"?/^hive-\d+$/.test(e):false}function Bs(e){return e&&typeof e=="object"&&"data"in e&&"pagination"in e&&Array.isArray(e.data)}function oe(e,t){return Bs(e)?e:{data:Array.isArray(e)?e:[],pagination:{total:Array.isArray(e)?e.length:0,limit:t,offset:0,has_next:false}}}function Ue(e,t){return e/1e6*t}function Wn(e){return e===void 0?true:parseInt(e.split("-")[0],10)<1980}var Gn=60*1e3;function be(){return queryOptions({queryKey:c.core.dynamicProps(),refetchInterval:Gn,staleTime:Gn,queryFn:async({signal:e})=>{let[t,r,n,i,o]=await Promise.all([g("condenser_api.get_dynamic_global_properties",[],void 0,void 0,e),g("condenser_api.get_feed_history",[],void 0,void 0,e),g("condenser_api.get_chain_properties",[],void 0,void 0,e),g("condenser_api.get_reward_fund",["post"],void 0,void 0,e),g("database_api.get_hardfork_properties",{},void 0,void 0,e).catch(()=>({current_hardfork_version:"1.28.0",last_hardfork:28}))]),s=C(t.total_vesting_shares).amount,a=C(t.total_vesting_fund_hive).amount,u=0;Number.isFinite(s)&&s!==0&&Number.isFinite(a)&&(u=a/s*1e6);let p=C(r.current_median_history.base).amount,l=C(r.current_median_history.quote).amount,f=parseFloat(i.recent_claims),m=C(i.reward_balance).amount,y=Number(t.vote_power_reserve_rate??0),h=i.author_reward_curve??"linear",E=Number(i.content_constant??0),O=String(o.current_hardfork_version??"0.0.0"),A=Number(o.last_hardfork??0),P=t.hbd_print_rate,L=t.hbd_interest_rate,U=t.head_block_number,B=a,Q=s,$=C(t.virtual_supply).amount,Se=t.vesting_reward_percent||0,ze=n.account_creation_fee;return {hivePerMVests:u,base:p,quote:l,fundRecentClaims:f,fundRewardBalance:m,votePowerReserveRate:y,authorRewardCurve:h,contentConstant:E,currentHardforkVersion:O,lastHardfork:A,hbdPrintRate:P,hbdInterestRate:L,headBlock:U,totalVestingFund:B,totalVestingShares:Q,virtualSupply:$,vestingRewardPercent:Se,accountCreationFee:ze,raw:{globalDynamic:t,feedHistory:r,chainProps:n,rewardFund:i,hardforkProps:o}}}})}function Gm(e="post"){return queryOptions({queryKey:c.core.rewardFund(e),queryFn:()=>g("condenser_api.get_reward_fund",[e])})}function Fe(...e){let t=e.length;for(;t>0&&e[t-1]===void 0;)t--;return e.slice(0,t)}var c={posts:{entry:e=>["posts","entry",e],postHeader:(e,t)=>["posts","post-header",e,t],content:(e,t)=>["posts","content",e,t],contentReplies:(e,t)=>["posts","content-replies",e,t],accountPosts:(e,t,r,n)=>["posts","account-posts",e,t,r,n],accountPostsPage:(e,t,r,n,i,o)=>["posts","account-posts-page",e,t,r,n,i,o],userPostVote:(e,t,r)=>["posts","user-vote",e,t,r],reblogs:(e,t)=>["posts","reblogs",e,t],entryActiveVotes:(e,t)=>["posts","entry-active-votes",e,t],rebloggedBy:(e,t)=>["posts","reblogged-by",e,t],tips:(e,t)=>["posts","tips",e,t],normalize:(e,t)=>["posts","normalize",e,t],drafts:e=>["posts","drafts",e],draftsInfinite:(e,t)=>Fe("posts","drafts","infinite",e,t),schedules:e=>["posts","schedules",e],schedulesInfinite:(e,t)=>Fe("posts","schedules","infinite",e,t),fragments:e=>["posts","fragments",e],fragmentsInfinite:(e,t)=>Fe("posts","fragments","infinite",e,t),images:e=>["posts","images",e],galleryImages:e=>["posts","gallery-images",e],imagesInfinite:(e,t)=>Fe("posts","images","infinite",e,t),promoted:e=>["posts","promoted",e],_promotedPrefix:["posts","promoted"],accountPostsBlogPrefix:e=>["posts","account-posts",e,"blog"],postsRanked:(e,t,r,n)=>["posts","posts-ranked",e,t,r,n],postsRankedPage:(e,t,r,n,i,o)=>["posts","posts-ranked-page",e,t,r,n,i,o],discussions:(e,t,r,n)=>["posts","discussions",e,t,r,n],discussion:(e,t,r)=>["posts","discussion",e,t,r],deletedEntry:e=>["posts","deleted-entry",e],commentHistory:(e,t,r)=>["posts","comment-history",e,t,r],trendingTags:()=>["posts","trending-tags"],trendingTagsWithStats:e=>["posts","trending-tags","stats",e],wavesFeed:(e={})=>["posts","waves","feed",e.tag??"",e.following??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],shortsFeed:(e={})=>["posts","waves","shorts",e.tag??"",e.author??"",e.observer??"",e.limit??0,[...e.containers??[]].sort().join(",")],wavesByHost:e=>["posts","waves","by-host",e],wavesByTag:(e,t)=>["posts","waves","by-tag",e,t],wavesFollowing:(e,t)=>["posts","waves","following",e,t],wavesTrendingTags:(e,t)=>["posts","waves","trending-tags",e,t],wavesByAccount:(e,t)=>["posts","waves","by-account",e,t],wavesTrendingAuthors:e=>["posts","waves","trending-authors",e],_prefix:["posts"]},accounts:{full:e=>["get-account-full",e],list:(...e)=>["accounts","list",...e],friends:(e,t,r,n)=>["accounts","friends",e,t,r,n],searchFriends:(e,t,r)=>["accounts","friends","search",e,t,r],subscriptions:e=>["accounts","subscriptions",e],followCount:e=>["accounts","follow-count",e],recoveries:e=>["accounts","recoveries",e],pendingRecovery:e=>["accounts","recoveries",e,"pending-request"],checkWalletPending:(e,t)=>["accounts","check-wallet-pending",e,t],mutedUsers:e=>["accounts","muted-users",e],following:(e,t,r,n)=>["accounts","following",e,t,r,n],followers:(e,t,r,n)=>["accounts","followers",e,t,r,n],search:(e,t)=>["accounts","search",e,t],profiles:(e,t)=>["accounts","profiles",e,t],lookup:(e,t)=>["accounts","lookup",e,t],transactions:(e,t,r)=>["accounts","transactions",e,t,r],favorites:e=>["accounts","favorites",e],favoritesInfinite:(e,t)=>Fe("accounts","favorites","infinite",e,t),checkFavorite:(e,t)=>["accounts","favorites","check",e,t],relations:(e,t)=>["accounts","relations",e,t],bots:()=>["accounts","bots"],voteHistory:(e,t)=>["accounts","vote-history",e,t],reputations:(e,t)=>["accounts","reputations",e,t],bookmarks:e=>["accounts","bookmarks",e],bookmarksInfinite:(e,t)=>Fe("accounts","bookmarks","infinite",e,t),referrals:e=>["accounts","referrals",e],referralsStats:e=>["accounts","referrals-stats",e],proMembers:()=>["accounts","pro-members"],_prefix:["accounts"]},notifications:{announcements:()=>["notifications","announcements"],spotlights:()=>["notifications","spotlights"],list:(e,t)=>["notifications",e,t],unreadCount:e=>["notifications","unread",e],settings:e=>["notifications","settings",e],_prefix:["notifications"]},core:{rewardFund:e=>["core","reward-fund",e],dynamicProps:()=>["core","dynamic-props"],chainProperties:()=>["core","chain-properties"],_prefix:["core"]},communities:{single:(e,t)=>["community","single",e,t],singlePrefix:e=>["community","single",e],context:(e,t)=>["community","context",e,t],rewarded:()=>["communities","rewarded"],list:(e,t,r)=>["communities","list",e,t,r],subscribers:e=>["communities","subscribers",e],subscribersInfinite:e=>["communities","subscribers","infinite",e],accountNotifications:(e,t)=>["communities","account-notifications",e,t]},proposals:{list:()=>["proposals","list"],proposal:e=>["proposals","proposal",e],votes:(e,t,r)=>["proposals","votes",e,t,r],votesPrefix:e=>["proposals","votes",e],votesByUser:e=>["proposals","votes","by-user",e]},search:{topics:(e,t)=>["search","topics",e,t],path:e=>["search","path",e],account:(e,t)=>["search","account",e,t],results:(e,t,r,n,i,o)=>["search",e,t,typeof r=="string"?r==="1"||r==="true":r,n,i,o],controversialRising:(e,t)=>["search","controversial-rising",e,t],similarEntries:(e,t,r)=>r?["search","similar-entries",e,t,r]:["search","similar-entries",e,t],api:(e,t,r,n,i,o)=>Fe("search","api",e,t,r,n,i,o)},witnesses:{list:e=>["witnesses","list",e],votes:e=>["witnesses","votes",e],proxy:()=>["witnesses","proxy"],voters:(e,t,r,n,i)=>["witnesses","voters",e,t,r,n,i],voterCount:e=>["witnesses","voter-count",e]},wallet:{outgoingRcDelegations:(e,t)=>["wallet","outgoing-rc-delegations",e,t],vestingDelegations:(e,t)=>["wallet","vesting-delegations",e,t],withdrawRoutes:e=>["wallet","withdraw-routes",e],incomingRc:e=>["wallet","incoming-rc",e],conversionRequests:e=>["wallet","conversion-requests",e],receivedVestingShares:e=>["wallet","received-vesting-shares",e],savingsWithdraw:e=>["wallet","savings-withdraw",e],openOrders:e=>["wallet","open-orders",e],collateralizedConversionRequests:e=>["wallet","collateralized-conversion-requests",e],recurrentTransfers:e=>["wallet","recurrent-transfers",e],balanceHistory:(e,t,r)=>["wallet","balance-history",e,t,r],aggregatedHistory:(e,t,r)=>r===void 0?["wallet","aggregated-history",e,t]:["wallet","aggregated-history",e,t,r],portfolio:(e,t,r)=>["wallet","portfolio","v2",e,t,r]},assets:{hiveGeneralInfo:e=>["assets","hive","general-info",e],hiveTransactions:(e,t,r)=>["assets","hive","transactions",e,t,r],hiveWithdrawalRoutes:e=>["assets","hive","withdrawal-routes",e],hiveMetrics:e=>["assets","hive","metrics",e],hbdGeneralInfo:e=>["assets","hbd","general-info",e],hbdTransactions:(e,t,r)=>["assets","hbd","transactions",e,t,r],hivePowerGeneralInfo:e=>["assets","hive-power","general-info",e],hivePowerDelegates:e=>["assets","hive-power","delegates",e],hivePowerDelegatings:e=>["assets","hive-power","delegatings",e],hivePowerTransactions:(e,t,r)=>["assets","hive-power","transactions",e,t,r],pointsGeneralInfo:e=>["assets","points","general-info",e],pointsTransactions:(e,t)=>["assets","points","transactions",e,t],ecencyAssetInfo:(e,t,r)=>["ecency-wallets","asset-info",e,t,r]},market:{statistics:()=>["market","statistics"],orderBook:e=>["market","order-book",e],history:(e,t,r)=>["market","history",e,t,r],feedHistory:()=>["market","feed-history"],hiveHbdStats:()=>["market","hive-hbd-stats"],data:(e,t,r,n)=>["market","data",e,t,r,n],tradeHistory:(e,t,r)=>["market","trade-history",e,t,r],currentMedianHistoryPrice:()=>["market","current-median-history-price"]},analytics:{discoverCuration:e=>["analytics","discover-curation",e],pageStats:(e,t,r,n)=>["analytics","page-stats",e,t,r,n],discoverLeaderboard:e=>["analytics","discover-leaderboard",e]},promotions:{promotePrice:()=>["promotions","promote-price"],boostPlusPrices:()=>["promotions","boost-plus-prices"],boostPlusAccounts:e=>["promotions","boost-plus-accounts",e]},resourceCredits:{account:e=>["resource-credits","account",e],stats:()=>["resource-credits","stats"]},points:{points:(e,t)=>["points",e,t],_prefix:e=>["points",e]},polls:{details:(e,t)=>["polls","details",e,t],vote:(e,t)=>e&&t?["polls","vote",e,t]:["polls","vote"],_prefix:["polls"]},operations:{chainProperties:()=>["operations","chain-properties"]},games:{statusCheck:(e,t)=>["games","status-check",e,t]},quests:{status:e=>["quests","status",e]},support:{settings:e=>["support","settings",e],_prefix:["support"]},badActors:{list:()=>["bad-actors","list"],_prefix:["bad-actors"]},ai:{prices:()=>["ai","prices"],assistPrices:e=>["ai","assist-prices",e],transcribePrice:e=>["ai","transcribe-price",e],_prefix:["ai"]}};function Zm(e){return queryOptions({queryKey:c.ai.prices(),queryFn:async()=>{let r=await w()(d.privateApiHost+"/private-api/ai-generate-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch AI generation prices: ${r.status}`);return await r.json()},staleTime:3e5,enabled:!!e})}function ng(e,t){return queryOptions({queryKey:c.ai.assistPrices(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-assist-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI assist prices: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function ag(e,t){return queryOptions({queryKey:c.ai.transcribePrice(e),queryFn:async()=>{let n=await w()(d.privateApiHost+"/private-api/ai-transcribe-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch AI transcribe price: ${n.status}`);return await n.json()},staleTime:6e4,enabled:!!t})}function js(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function lg(e,t){return useMutation({mutationKey:["ai","generate-image"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][GenerateImage] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][GenerateImage] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-generate-image",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,us:e,prompt:r.prompt,aspect_ratio:r.aspect_ratio??"1:1",power:r.power??1,idempotency_key:r.idempotency_key??js()})});if(!i.ok){let s=await i.text(),a={};try{a=JSON.parse(s);}catch{}let u=new Error(`[SDK][AI][GenerateImage] \u2013 failed with status ${i.status}${s?`: ${s}`:""}`);throw u.status=i.status,u.data=a,u}if(i.status===202){let s={};try{s=await i.json();}catch{}let a=new Error("[SDK][AI][GenerateImage] \u2013 delivery pending");throw a.status=202,a.data=s,a}return await i.json()},onSuccess:()=>{e&&b().invalidateQueries({queryKey:c.points._prefix(e)});}})}function $s(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function gg(e,t){return useMutation({mutationKey:["ai","assist"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Assist] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][AI][Assist] \u2013 access token wasn't found");let i=await w()(d.privateApiHost+"/private-api/ai-assist",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r.code??t,us:e,action:r.action,text:r.text,idempotency_key:$s()})});if(!i.ok){let o=await i.text(),s={};try{s=JSON.parse(o);}catch{}let a=new Error(`[SDK][AI][Assist] \u2013 failed with status ${i.status}${o?`: ${o}`:""}`);throw a.status=i.status,a.data=s,a}return await i.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.assistPrices(e)}));}})}function Gs(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();let e=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(e);else for(let t=0;tt.toString(16).padStart(2,"0")).join("")}function _g(e,t){return useMutation({mutationKey:["ai","transcribe"],mutationFn:async r=>{if(!e)throw new Error("[SDK][AI][Transcribe] \u2013 username wasn't provided");let n=r.code??t;if(!n)throw new Error("[SDK][AI][Transcribe] \u2013 access token wasn't found");let i=new FormData;i.append("code",n),i.append("duration_ms",String(Math.round(r.durationMs))),i.append("idempotency_key",r.idempotency_key??Gs()),i.append("audio",r.audio,r.fileName??"clip.webm");let s=await w()(d.privateApiHost+"/private-api/ai-transcribe",{method:"POST",body:i});if(!s.ok){let a=await s.text(),u={};try{u=JSON.parse(a);}catch{}throw Object.assign(new Error(`[SDK][AI][Transcribe] \u2013 failed with status ${s.status}${a?`: ${a}`:""}`),{status:s.status,data:u})}return await s.json()},onSuccess:r=>{e&&(r.cost>0&&b().invalidateQueries({queryKey:c.points._prefix(e)}),b().invalidateQueries({queryKey:c.ai.transcribePrice(e)}));}})}function ur(e){return !e.posting_json_metadata&&!e.json_metadata}function Js(e){return e?Object.values(e).some(t=>typeof t=="string"?t.length>0:t!=null):false}function M(e){return queryOptions({queryKey:c.accounts.full(e),queryFn:async({signal:t})=>{if(!e)return null;let[r,n]=await Promise.all([g("condenser_api.get_accounts",[[e]],void 0,void 0,t,p=>Array.isArray(p)),g("bridge.get_profile",{account:e},void 0,void 0,t).catch(p=>{if(t?.aborted)throw p;return null})]);if(!r?.[0])return null;let i=r[0];if(ur(i)&&Js(n?.metadata?.profile)){let p=await g("condenser_api.get_accounts",[[e]],void 0,void 0,t,l=>Array.isArray(l)&&(!l[0]||!ur(l[0])));if(p[0]&&!ur(p[0]))i=p[0];else throw new Error(`[SDK][Accounts] \u2013 inconsistent account row for ${e}: empty json metadata while hivemind profile is populated`)}let o=qe(i.posting_json_metadata),s=n?.stats,a=s?{account:i.name,follower_count:s.followers??0,following_count:s.following??0}:void 0,u=n?.reputation??0;return {name:i.name,owner:i.owner,active:i.active,posting:i.posting,memo_key:i.memo_key,post_count:i.post_count,created:i.created,posting_json_metadata:i.posting_json_metadata,last_vote_time:i.last_vote_time,last_post:i.last_post,json_metadata:i.json_metadata,reward_hive_balance:i.reward_hive_balance,reward_hbd_balance:i.reward_hbd_balance,reward_vesting_hive:i.reward_vesting_hive,reward_vesting_balance:i.reward_vesting_balance,balance:i.balance,hbd_balance:i.hbd_balance,savings_balance:i.savings_balance,savings_hbd_balance:i.savings_hbd_balance,savings_hbd_last_interest_payment:i.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:i.savings_hbd_seconds_last_update,savings_hbd_seconds:i.savings_hbd_seconds,next_vesting_withdrawal:i.next_vesting_withdrawal,pending_claimed_accounts:i.pending_claimed_accounts,vesting_shares:i.vesting_shares,delegated_vesting_shares:i.delegated_vesting_shares,received_vesting_shares:i.received_vesting_shares,vesting_withdraw_rate:i.vesting_withdraw_rate,to_withdraw:i.to_withdraw,withdrawn:i.withdrawn,witness_votes:i.witness_votes,proxy:i.proxy,recovery_account:i.recovery_account,proxied_vsf_votes:i.proxied_vsf_votes,voting_manabar:i.voting_manabar,voting_power:i.voting_power,downvote_manabar:i.downvote_manabar,follow_stats:a,reputation:u,profile:o}},enabled:!!e,staleTime:6e4})}var Ys=new Set(["__proto__","constructor","prototype"]);function St(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function zn(e,t){let r={...e};for(let n of Object.keys(t)){if(Ys.has(n))continue;let i=t[n],o=r[n];St(i)&&St(o)?r[n]=zn(o,i):r[n]=i;}return r}function Xs(e){if(!(!e||!Array.isArray(e)))return e.map(({meta:t,...r})=>{if(!t||typeof t!="object")return {...r,meta:t};let{privateKey:n,username:i,...o}=t;return {...r,meta:o}})}function qe(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&t.profile&&typeof t.profile=="object")return t.profile}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata:",t,{length:e?.length??0});}return {}}function Jn(e){return qe(e?.posting_json_metadata)}function Yn(e,t){if(!e)return t;if(!t)return e;let r=Object.keys(qe(e.posting_json_metadata)).length;return Object.keys(qe(t.posting_json_metadata)).length>r?t:e}function Zs(e){if(!e)return {};try{let t=JSON.parse(e);if(St(t))return t}catch(t){console.warn("[SDK] Failed to parse posting_json_metadata root:",t,{length:e?.length??0});}return {}}function Xn({existingPostingJsonMetadata:e,profile:t,tokens:r}){let n=Zs(e),i=St(n.profile)?n.profile:{},o=pr({existingProfile:i,profile:t,tokens:r});return JSON.stringify({...n,profile:o})}function pr({existingProfile:e,profile:t,tokens:r}){let{tokens:n,version:i,...o}=t??{},s=zn(e??{},o);return s.tokens&&!Array.isArray(s.tokens)&&(s.tokens=void 0),r!==void 0?s.tokens=r&&r.length>0?r:[]:n!==void 0&&(s.tokens=n),s.tokens=Xs(s.tokens),s.version=2,s}function kt(e){return e.map(t=>{let r={name:t.name,owner:t.owner,active:t.active,posting:t.posting,memo_key:t.memo_key,post_count:t.post_count,created:t.created,reputation:t.reputation,posting_json_metadata:t.posting_json_metadata,last_vote_time:t.last_vote_time,last_post:t.last_post,json_metadata:t.json_metadata,reward_hive_balance:t.reward_hive_balance,reward_hbd_balance:t.reward_hbd_balance,reward_vesting_hive:t.reward_vesting_hive,reward_vesting_balance:t.reward_vesting_balance,balance:t.balance,hbd_balance:t.hbd_balance,savings_balance:t.savings_balance,savings_hbd_balance:t.savings_hbd_balance,savings_hbd_last_interest_payment:t.savings_hbd_last_interest_payment,savings_hbd_seconds_last_update:t.savings_hbd_seconds_last_update,savings_hbd_seconds:t.savings_hbd_seconds,next_vesting_withdrawal:t.next_vesting_withdrawal,pending_claimed_accounts:t.pending_claimed_accounts,vesting_shares:t.vesting_shares,delegated_vesting_shares:t.delegated_vesting_shares,received_vesting_shares:t.received_vesting_shares,vesting_withdraw_rate:t.vesting_withdraw_rate,to_withdraw:t.to_withdraw,withdrawn:t.withdrawn,witness_votes:t.witness_votes,proxy:t.proxy,recovery_account:t.recovery_account,proxied_vsf_votes:t.proxied_vsf_votes,voting_manabar:t.voting_manabar,voting_power:t.voting_power,downvote_manabar:t.downvote_manabar},n=qe(t.posting_json_metadata);if(!n||Object.keys(n).length===0)try{let i=JSON.parse(t.json_metadata||"{}");i.profile&&(n=i.profile);}catch{}return (!n||Object.keys(n).length===0)&&(n={about:"",cover_image:"",location:"",name:"",profile_image:"",website:""}),{...r,profile:n}})}function qg(e){return queryOptions({queryKey:c.accounts.list(...e),enabled:e.length>0,queryFn:async()=>{let t=await g("condenser_api.get_accounts",[e],void 0,void 0,void 0,r=>Array.isArray(r));return kt(t??[])}})}function Mg(e){return queryOptions({queryKey:c.accounts.followCount(e),queryFn:()=>g("condenser_api.get_follow_count",[e])})}function Vg(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.followers(e,t,r,n),queryFn:()=>g("condenser_api.get_followers",[e,t,r,n]),enabled:!!e})}function Gg(e,t,r="blog",n=100){return queryOptions({queryKey:c.accounts.following(e,t,r,n),queryFn:()=>g("condenser_api.get_following",[e,t,r,n]),enabled:!!e})}var Zn=1e3,oa=20;function Zg(e){return queryOptions({queryKey:c.accounts.mutedUsers(e),queryFn:async()=>{let t=[],r="";for(let n=0;ns.following);if(o[0]===r&&(o=o.slice(1)),!o.length||(t.push(...o),i.lengthg("condenser_api.lookup_accounts",[e,t]),enabled:!!e,staleTime:1/0})}function uy(e,t=5,r=[]){return queryOptions({queryKey:c.accounts.search(e,r),enabled:!!e,queryFn:async()=>(await g("condenser_api.lookup_accounts",[e,t])).filter(i=>r.length>0?!r.includes(i):true)})}var ua=new Set(["ownerPublicKey","activePublicKey","postingPublicKey","memoPublicKey"]);function fy(e,t){return queryOptions({queryKey:c.accounts.checkWalletPending(e,t??null),queryFn:async()=>{if(!e||!t)return {exist:false};let n=await w()(d.privateApiHost+"/private-api/wallets",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,code:t})});if(!n.ok)return {exist:false};let i=await n.json(),o=Array.isArray(i)?i.flatMap(s=>{if(!s||typeof s!="object")return [];let a=s,u=typeof a.token=="string"?a.token:void 0;if(!u)return [];let p=a.meta&&typeof a.meta=="object"?{...a.meta}:{},l={},f=typeof a.address=="string"&&a.address?a.address:void 0,y=(typeof a.status=="number"?a.status===3:void 0)??false;f&&(l.address=f),l.show=y;let h={symbol:u,currency:u,address:f,show:y,type:"CHAIN",meta:l},E=[];for(let[O,A]of Object.entries(p))typeof O=="string"&&(ua.has(O)||typeof A!="string"||!A||/^[A-Z0-9]{2,10}$/.test(O)&&E.push({symbol:O,currency:O,address:A,show:y,type:"CHAIN",meta:{address:A,show:y}}));return [h,...E]}):[];return {exist:o.length>0,tokens:o.length?o:void 0,wallets:o.length?o:void 0}},refetchOnMount:true})}function ei(e,t){return queryOptions({queryKey:c.accounts.relations(e,t),enabled:!!e&&!!t,refetchOnMount:false,refetchInterval:36e5,queryFn:async()=>{let r={follows:false,ignores:false,blacklists:false,follows_muted:false,follows_blacklists:false};return !e||!t?r:await g("bridge.get_relationship_between_accounts",[e,t])??r}})}function Ay(e){return queryOptions({queryKey:c.accounts.subscriptions(e),enabled:!!e,queryFn:async({signal:t})=>await g("bridge.list_all_subscriptions",{account:e},void 0,void 0,t)??[]})}function Ey(e,t){return queryOptions({queryKey:c.accounts.bookmarks(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Bookmarks] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/bookmarks",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Sy(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.bookmarksInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch bookmarks: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ry(e,t){return queryOptions({queryKey:c.accounts.favorites(e),enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/favorites",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Fy(e,t,r=10){return infiniteQueryOptions({queryKey:c.accounts.favoritesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/favorites?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch favorites: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function Ky(e,t,r){return queryOptions({queryKey:c.accounts.checkFavorite(e,r),enabled:!!e&&!!t&&!!r,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts][Favorites] \u2013 missing auth");if(!r)throw new Error("[SDK][Accounts][Favorites] \u2013 no target username");let i=await w()(d.privateApiHost+"/private-api/favorites-check",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:r})});if(!i.ok)throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check failed with status ${i.status}: ${i.statusText}`);let o=await i.json();if(typeof o!="boolean")throw new Error(`[SDK][Accounts][Favorites] \u2013 favorites-check returned invalid type: expected boolean, got ${typeof o}`);return o}})}function Qy(e,t){return queryOptions({enabled:!!e&&!!t,queryKey:c.accounts.recoveries(e),queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Accounts] Missing username or access token");return (await w()(d.privateApiHost+"/private-api/recoveries",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})})).json()}})}function Ly(e){return queryOptions({enabled:!!e,queryKey:c.accounts.pendingRecovery(e),queryFn:()=>g("database_api.find_change_recovery_account_requests",{accounts:[e]})})}function Jy(e,t=50){return queryOptions({queryKey:c.accounts.reputations(e,t),enabled:!!e,queryFn:async()=>e?g("condenser_api.get_account_reputations",[e,t]):[]})}var D=re.operations,ti={transfers:[D.transfer,D.transfer_to_savings,D.transfer_from_savings,D.cancel_transfer_from_savings,D.recurrent_transfer,D.fill_recurrent_transfer,D.escrow_transfer,D.fill_recurrent_transfer],"market-orders":[D.fill_convert_request,D.fill_order,D.fill_collateralized_convert_request,D.limit_order_create2,D.limit_order_create,D.limit_order_cancel],interests:[D.interest],"stake-operations":[D.return_vesting_delegation,D.withdraw_vesting,D.transfer_to_vesting,D.set_withdraw_vesting_route,D.update_proposal_votes,D.fill_vesting_withdraw,D.account_witness_proxy,D.delegate_vesting_shares],rewards:[D.author_reward,D.curation_reward,D.producer_reward,D.claim_reward_balance,D.comment_benefactor_reward,D.liquidity_reward,D.proposal_pay]},va=[...Object.values(ti)].reduce((e,t)=>e.concat(t),[]);function Aa(e){return e.block*1e7+e.trx_in_block*100+e.op_pos}function Pa(e){return e.replace(/_operation$/,"")}function Oa(e){return typeof e=="object"&&e!==null&&"nai"in e&&"amount"in e&&"precision"in e}function xa(e){if(!Oa(e))return e;let t=C(e),r=Et[e.nai]??"UNKNOWN";return `${t.amount.toFixed(e.precision)} ${r}`}function Ea(e){let t={};for(let[r,n]of Object.entries(e))t[r]=xa(n);return t}function ih(e,t=20,r=""){let n=r?ti[r]:va;return infiniteQueryOptions({queryKey:c.accounts.transactions(e??"",r,t),initialPageParam:null,queryFn:async({pageParam:i,signal:o})=>{if(!e)return {entries:[],currentPage:0};let s={"account-name":e,"operation-types":n.join(","),"page-size":t};i!==null&&(s.page=i);let a=await ee("hafah","/accounts/{account-name}/operations",s,void 0,void 0,o);return {entries:a.operations_result.map(p=>{let l=Pa(p.op.type);return {...Ea(p.op.value),num:Aa(p),type:l,timestamp:p.timestamp,trx_id:p.trx_id}}),currentPage:i??a.total_pages}},getNextPageParam:i=>{let o=i.currentPage-1;return o>=1?o:void 0}})}function ch(){return queryOptions({queryKey:c.accounts.bots(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/public/bots",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch bots: ${e.status}`);return e.json()},refetchOnMount:true,staleTime:1/0})}function dh(e){return infiniteQueryOptions({queryKey:c.accounts.referrals(e),initialPageParam:{maxId:void 0},queryFn:async({pageParam:t})=>{let{maxId:r}=t??{},n=N.getValidatedBaseUrl(),i=new URL(`/private-api/referrals/${e}`,n);r!==void 0&&i.searchParams.set("max_id",r.toString());let o=await fetch(i.toString(),{method:"GET",headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`Failed to fetch referrals: ${o.status}`);return o.json()},getNextPageParam:t=>{let r=t?.[t.length-1]?.id;return typeof r=="number"?{maxId:r}:void 0}})}function yh(e){return queryOptions({queryKey:c.accounts.referralsStats(e),queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/referrals/${e}/stats`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch referral stats: ${t.status}`);let r=await t.json();if(!r)throw new Error("No Referrals for this user!");return {total:r.total??0,rewarded:r.rewarded??0}}})}function Ah(e,t,r){let{followType:n="blog",limit:i=100,enabled:o=true}=r??{};return infiniteQueryOptions({queryKey:c.accounts.friends(e,t,n,i),initialPageParam:{startFollowing:""},enabled:o,refetchOnMount:true,queryFn:async({pageParam:s})=>{let{startFollowing:a}=s,l=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,a===""?null:a,n,i])).map(y=>t==="following"?y.following:y.follower);return (await g("bridge.get_profiles",{accounts:l,observer:void 0})??[]).map(y=>({name:y.name,reputation:y.reputation,active:y.active}))},getNextPageParam:s=>s&&s.length===i?{startFollowing:s[s.length-1].name}:void 0})}var Fa=30;function Sh(e,t,r){return queryOptions({queryKey:c.accounts.searchFriends(e,t,r),refetchOnMount:false,enabled:false,queryFn:async()=>{if(!r)return [];let n=r.slice(0,-1),s=(await g(`condenser_api.${t==="following"?"get_following":"get_followers"}`,[e,n,"blog",1e3])).map(u=>t==="following"?u.following:u.follower).filter(u=>u.toLowerCase().includes(r.toLowerCase())).slice(0,Fa);return (await g("bridge.get_profiles",{accounts:s,observer:void 0}))?.map(u=>({name:u.name,full_name:u.metadata.profile?.name||"",reputation:u.reputation,active:u.active}))??[]}})}function Fh(e=20){return infiniteQueryOptions({queryKey:c.posts.trendingTags(),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!n.name.startsWith("hive-")).map(n=>n.name)),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length>0?{afterTag:t[t.length-1]}:void 0,staleTime:3600*1e3})}function Mh(e=250){return infiniteQueryOptions({queryKey:c.posts.trendingTagsWithStats(e),queryFn:async({pageParam:{afterTag:t}})=>g("condenser_api.get_trending_tags",[t,e]).then(r=>r.filter(n=>n.name!=="").filter(n=>!$n(n.name))),initialPageParam:{afterTag:""},getNextPageParam:t=>t?.length?{afterTag:t[t.length-1].name}:void 0,staleTime:1/0})}function Ve(e,t){return queryOptions({queryKey:c.posts.fragments(e),queryFn:async()=>t?(await w()(d.privateApiHost+"/private-api/fragments",{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json():[],enabled:!!e&&!!t})}function Uh(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.fragmentsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/fragments?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch fragments: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function $h(e="feed"){return queryOptions({queryKey:c.posts.promoted(e),queryFn:async()=>{let t=N.getValidatedBaseUrl(),r=new URL("/private-api/promoted-entries",t);return e==="waves"&&r.searchParams.append("short_content","1"),await(await w()(r.toString(),{method:"GET",headers:{"Content-Type":"application/json"}})).json()}})}function Yh(e){return queryOptions({queryKey:c.posts.entryActiveVotes(e?.author,e?.permlink),queryFn:async()=>g("condenser_api.get_active_votes",[e?.author,e?.permlink]),enabled:!!e})}function rw(e,t,r){return queryOptions({queryKey:c.posts.userPostVote(e,t,r),queryFn:async()=>(await g("database_api.list_votes",{start:[e,t,r],limit:1,order:"by_voter_comment"}))?.votes?.[0]||null,enabled:!!e&&!!t&&!!r})}function aw(e,t){return queryOptions({queryKey:c.posts.content(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content",[e,t])})}function dw(e,t){return queryOptions({queryKey:c.posts.contentReplies(e,t),enabled:!!e&&!!t,queryFn:async()=>g("condenser_api.get_content_replies",{author:e,permlink:t})})}function hw(e,t){return queryOptions({queryKey:c.posts.postHeader(e,t),queryFn:async()=>g("bridge.get_post_header",{author:e,permlink:t}),initialData:null})}function te(e){return Array.isArray(e)?e.map(t=>ri(t)):ri(e)}function ri(e){if(!e)return e;let t=`@${e.author}/${e.permlink}`;return d.dmcaPatterns.includes(t)||d.dmcaPatternRegexes.some(n=>n.test(t))?{...e,body:"This post is not available due to a copyright/fraudulent claim.",title:""}:e}async function ni(e,t,r){try{let n=await At("bridge.get_post",{author:e,permlink:t,observer:r},1);if(n&&typeof n=="object"&&n.author===e&&n.permlink===t)return n}catch{}return null}function ii(e,t,r="",n){let i=t?.trim(),o=`/@${e}/${i??""}`;return queryOptions({queryKey:c.posts.entry(o),queryFn:async()=>{if(!i||i==="undefined")return null;let s=await g("bridge.get_post",{author:e,permlink:i,observer:r});if(!s){let u=await ni(e,i,r);if(!u)return null;let p=n!==void 0?{...u,num:n}:u;return te(p)}let a=n!==void 0?{...s,num:n}:s;return te(a)},enabled:!!e&&!!t&&t.trim()!==""&&t.trim()!=="undefined"})}function se(e,t,r){return g(`bridge.${e}`,t,void 0,void 0,r)}async function oi(e,t,r,n){let{json_metadata:i}=e;if(i?.original_author&&i?.original_permlink&&i.tags?.[0]==="cross-post")try{let o=await ja(i.original_author,i.original_permlink,t,r,n);return o?{...e,original_entry:o,num:r}:e}catch{return e}return {...e,num:r}}async function si(e,t,r){let n=e.map(rt),i=await Promise.all(n.map(o=>oi(o,t,void 0,r)));return te(i)}async function ai(e,t="",r="",n=20,i="",o="",s){let a=await se("get_ranked_posts",{sort:e,start_author:t,start_permlink:r,limit:n,tag:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_ranked_posts returned ${typeof a} instead of an array for sort=${e}; treating as no results.`),null)}async function lr(e,t,r="",n="",i=20,o="",s){if(d.dmcaAccounts.includes(t))return [];let a=await se("get_account_posts",{sort:e,account:t,start_author:r,start_permlink:n,limit:i,observer:o},s);return Array.isArray(a)?si(a,o,s):(a!=null&&console.warn(`[SDK] get_account_posts returned ${typeof a} instead of an array for account=${t}, sort=${e}; treating as no results.`),null)}function rt(e){let t={...e,active_votes:Array.isArray(e.active_votes)?[...e.active_votes]:[],beneficiaries:Array.isArray(e.beneficiaries)?[...e.beneficiaries]:[],blacklists:Array.isArray(e.blacklists)?[...e.blacklists]:[],replies:Array.isArray(e.replies)?[...e.replies]:[],stats:e.stats?{...e.stats}:null},r=["author","title","body","created","category","permlink","url","updated"];for(let n of r)t[n]==null&&(t[n]="");return t.author_reputation==null&&(t.author_reputation=0),t.children==null&&(t.children=0),t.depth==null&&(t.depth=0),t.net_rshares==null&&(t.net_rshares=0),t.payout==null&&(t.payout=0),t.percent_hbd==null&&(t.percent_hbd=0),t.stats||(t.stats={flag_weight:0,gray:false,hide:false,total_votes:0}),t.author_payout_value==null&&(t.author_payout_value="0.000 HBD"),t.curator_payout_value==null&&(t.curator_payout_value="0.000 HBD"),t.max_accepted_payout==null&&(t.max_accepted_payout="1000000.000 HBD"),t.payout_at==null&&(t.payout_at=""),t.pending_payout_value==null&&(t.pending_payout_value="0.000 HBD"),t.promoted==null&&(t.promoted="0.000 HBD"),t.is_paidout==null&&(t.is_paidout=false),t}async function ja(e="",t="",r="",n,i){let o=await se("get_post",{author:e,permlink:t,observer:r},i);if(o){let s=rt(o),a=await oi(s,r,n,i);return te(a)}}async function Fw(e="",t=""){let r=await se("get_post_header",{author:e,permlink:t});return r&&rt(r)}async function ci(e,t,r){let n=await se("get_discussion",{author:e,permlink:t,observer:r||e});if(n){let i={};for(let[o,s]of Object.entries(n))i[o]=rt(s);return i}return n}async function ui(e,t=""){return se("get_community",{name:e,observer:t})}async function qw(e="",t=100,r,n="rank",i=""){return se("list_communities",{last:e,limit:t,query:r,sort:n,observer:i})}async function pi(e){let t=await se("normalize_post",{post:e});return t&&rt(t)}async function Iw(e){return se("list_all_subscriptions",{account:e})}async function Dw(e){return se("list_subscribers",{community:e})}async function Kw(e,t){return se("get_relationship_between_accounts",[e,t])}async function Ct(e,t){return se("get_profiles",{accounts:e,observer:t})}var di=(i=>(i.trending="trending",i.author_reputation="author_reputation",i.votes="votes",i.created="created",i))(di||{});function dr(e){let t=e.match(/^(\d+\.?\d*)\s*([A-Z]+)$/);return t?{amount:parseFloat(t[1]),symbol:t[2]}:{amount:0,symbol:""}}function La(e,t,r){let n=l=>dr(l.pending_payout_value).amount+dr(l.author_payout_value).amount+dr(l.curator_payout_value).amount,i=l=>l.net_rshares<0,o=l=>e.json_metadata?.pinned_reply===`${l.author}/${l.permlink}`,s={trending:(l,f)=>{if(i(l))return 1;if(i(f))return -1;let m=n(l),y=n(f);return m!==y?y-m:0},author_reputation:(l,f)=>{let m=l.author_reputation,y=f.author_reputation;return m>y?-1:m{let m=l.children,y=f.children;return m>y?-1:m{if(i(l))return 1;if(i(f))return -1;let m=Date.parse(l.created),y=Date.parse(f.created);return m>y?-1:mo(l)),p=a[u];return u>=0&&(a.splice(u,1),a.unshift(p)),a}function fi(e,t="created",r=true,n){let i=n||d.defaultObserver;return queryOptions({queryKey:c.posts.discussions(e?.author,e?.permlink,t,i),queryFn:async()=>{if(!e)return [];let o=await g("bridge.get_discussion",{author:e.author,permlink:e.permlink,observer:i}),s=o?Array.from(Object.values(o)):[];return te(s)},enabled:r&&!!e,select:o=>La(e,o,t),structuralSharing:(o,s)=>{if(!o||!s)return s;let a=o.filter(l=>l.is_optimistic===true),u=new Set(s.map(l=>`${l.author}/${l.permlink}`)),p=a.filter(l=>!u.has(`${l.author}/${l.permlink}`));return p.length>0?[...s,...p]:s}})}function Vw(e,t,r,n=true){let i=r||d.defaultObserver;return queryOptions({queryKey:c.posts.discussion(e,t,i),enabled:n&&!!e&&!!t,queryFn:async()=>ci(e,t,i)})}function Jw(e,t="posts",r=20,n="",i=true){return infiniteQueryOptions({queryKey:c.posts.accountPosts(e??"",t,r,n),enabled:!!e&&i,initialPageParam:{author:void 0,permlink:void 0,hasNextPage:true},queryFn:async({pageParam:o,signal:s})=>{if(!o?.hasNextPage||!e)return [];let a=await lr(t,e,o.author??"",o.permlink??"",r,n,s);return te(a??[])},getNextPageParam:o=>{let s=o?.[o.length-1],a=(o?.length??0)===r;if(a)return {author:s?.author,permlink:s?.permlink,hasNextPage:a}}})}function Yw(e,t="posts",r="",n="",i=20,o="",s=true){return queryOptions({queryKey:c.posts.accountPostsPage(e??"",t,r,n,i,o),enabled:!!e&&s,queryFn:async({signal:a}={})=>{if(!e)return [];let u=await lr(t,e,r,n,i,o,a);return te(u??[])}})}var mi=new Map;function Ja(e){let t=mi.get(e);return t||(t=r=>({...r,pages:r.pages.map(n=>Ya(n,e))}),mi.set(e,t)),t}function Ya(e,t){let r=e.filter(o=>o.stats?.is_pinned),n=e.filter(o=>!o.stats?.is_pinned);if(t==="hot")return [...r,...n];let i=[...n].sort((o,s)=>new Date(s.created).getTime()-new Date(o.created).getTime());return [...r,...i]}function o_(e,t,r=20,n="",i=true,o={}){return infiniteQueryOptions({queryKey:c.posts.postsRanked(e,t,r,n),queryFn:async({pageParam:s,signal:a})=>{let u=t;d.dmcaTagRegexes.some(l=>l.test(t))&&(u="");let p=await g("bridge.get_ranked_posts",{sort:e,start_author:s.author,start_permlink:s.permlink,limit:r,tag:u,observer:n},void 0,void 0,a);if(p==null)return [];if(!Array.isArray(p))throw new Error(`[SDK] get_ranked_posts returned ${typeof p} for sort=${e}`);return te(p)},select:Ja(e),enabled:i,initialPageParam:{author:void 0,permlink:void 0},getNextPageParam:s=>{let a=s?.[s.length-1];if(a)return {author:a.author,permlink:a.permlink}}})}function s_(e,t="",r="",n=20,i="",o="",s=true){return queryOptions({queryKey:c.posts.postsRankedPage(e,t,r,n,i,o),enabled:s,queryFn:async({signal:a}={})=>{let u=i;d.dmcaTagRegexes.some(l=>l.test(i))&&(u="");let p=await ai(e,t,r,n,u,o,a);return te(p??[])}})}function l_(e,t,r=200){return queryOptions({queryKey:c.posts.reblogs(e??"",r),queryFn:async()=>(await g("condenser_api.get_blog_entries",[e??t,0,r])).filter(i=>i.author!==t&&!i.reblogged_on.startsWith("1970-")).map(i=>({author:i.author,permlink:i.permlink})),enabled:!!e})}function y_(e,t){return queryOptions({queryKey:c.posts.rebloggedBy(e??"",t??""),queryFn:async()=>{if(!e||!t)return [];let r=await g("condenser_api.get_reblogged_by",[e,t]);return Array.isArray(r)?r:[]},enabled:!!e&&!!t})}function b_(e,t){return queryOptions({queryKey:c.posts.schedules(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/schedules",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch schedules: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function v_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.schedulesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/schedules?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch schedules: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function x_(e,t){return queryOptions({queryKey:c.posts.drafts(e),queryFn:async()=>{if(!e||!t)return [];let n=await w()(d.privateApiHost+"/private-api/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!n.ok)throw new Error(`Failed to fetch drafts: ${n.status}`);return n.json()},enabled:!!e&&!!t})}function E_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.draftsInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/drafts?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch drafts: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}async function yi(e){let r=await w()(d.privateApiHost+"/private-api/images",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok)throw new Error(`Failed to fetch images: ${r.status}`);return r.json()}function T_(e,t){return queryOptions({queryKey:c.posts.images(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function R_(e,t){return queryOptions({queryKey:c.posts.galleryImages(e),queryFn:async()=>!e||!t?[]:yi(t),enabled:!!e&&!!t})}function F_(e,t,r=10){return infiniteQueryOptions({queryKey:c.posts.imagesInfinite(e,r),queryFn:async({pageParam:n=0})=>{if(!e||!t)return {data:[],pagination:{total:0,limit:r,offset:0,has_next:false}};let o=await w()(`${d.privateApiHost}/private-api/images?format=wrapped&offset=${n}&limit=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})});if(!o.ok)throw new Error(`Failed to fetch images: ${o.status}`);let s=await o.json();return oe(s,r)},initialPageParam:0,getNextPageParam:n=>{if(n.pagination.has_next)return n.pagination.offset+n.pagination.limit},enabled:!!e&&!!t})}function K_(e,t,r=false){return queryOptions({queryKey:c.posts.commentHistory(e,t,r),queryFn:async({signal:n})=>{let i=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:t,onlyMeta:r?"1":""}),signal:n});if(!i.ok)throw new Error(`Failed to fetch comment history: ${i.status}`);return i.json()},enabled:!!e&&!!t})}function ac(e,t){let r=e?.trim(),n=t?.trim();if(!r||!n)throw new Error("Invalid entry path: author and permlink are required");let i=r.replace(/^@+/,""),o=n.replace(/^\/+/,"");if(!i||!o)throw new Error("Invalid entry path: author and permlink cannot be empty after normalization");return `@${i}/${o}`}function Q_(e,t){let r=t?.trim(),n=e?.trim(),i=!!n&&!!r&&r!=="undefined",o=i?ac(n,r):"";return queryOptions({queryKey:c.posts.deletedEntry(o),queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/private-api/comment-history",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:e,permlink:r||""}),signal:s});if(!a.ok)throw new Error(`Failed to fetch comment history: ${a.status}`);return a.json()},select:s=>{if(!s?.list?.[0])return null;let{body:a,title:u,tags:p}=s.list[0];return {body:a,title:u,tags:p}},enabled:i})}function j_(e,t,r=true){return queryOptions({queryKey:c.posts.tips(e,t),queryFn:async()=>{let n=`/private-api/post-tips/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,i=await fetch(d.privateApiHost+n,{method:"GET",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch post tips: ${i.status}`);return i.json()},enabled:!!e&&!!t&&r,staleTime:60*1e3})}function uc(e,t){return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,host:t}}function pc(e){return {...e,id:e.id??e.post_id}}function me(e,t){if(!e)return null;let r=e.container??e,n=uc(r,t),i=e.parent?pc(e.parent):void 0;return {...e,id:e.id??e.post_id,created:e.created??e.timestamp,max_accepted_payout:e.max_accepted_payout||"1000000.000 HBD",pending_payout_value:e.pending_payout_value||"0.000 HBD",author_payout_value:e.author_payout_value||"0.000 HBD",curator_payout_value:e.curator_payout_value||"0.000 HBD",host:t,container:n,parent:i}}function lc(e){return Array.isArray(e)?e:[]}async function hi(e){let t=fi(e,"created",true),r=await d.queryClient.fetchQuery(t),n=lc(r);if(n.length<=1)return [];let i=n.filter(({parent_author:s,parent_permlink:a})=>s===e.author&&a===e.permlink);return i.length===0?[]:i.filter(s=>!s.stats?.gray)}function wi(e,t,r){return e.length===0?[]:e.map(n=>{let i=e.find(o=>o.author===n.parent_author&&o.permlink===n.parent_permlink&&o.author!==r);return {...n,id:n.post_id,host:r,container:t,parent:i}}).filter(n=>n.container.post_id!==n.post_id).sort((n,i)=>new Date(i.created).getTime()-new Date(n.created).getTime())}var mc=20;function _i(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,following:e.following?.trim().toLowerCase()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??mc}}async function bi({containers:e,tag:t,following:r,author:n,observer:i,limit:o},s,a){let u=N.getValidatedBaseUrl(),p=new URL("/private-api/waves/feed",u);p.searchParams.set("limit",String(o)),s&&p.searchParams.set("cursor",s),e.forEach(m=>p.searchParams.append("container",m)),t&&p.searchParams.set("tag",t),r&&p.searchParams.set("following",r),n&&p.searchParams.set("author",n),i&&p.searchParams.set("observer",i);let l=await fetch(p.toString(),{method:"GET",signal:a});if(!l.ok)throw new Error(`Failed to fetch waves feed: ${l.status}`);let f=await l.json();return !Array.isArray(f)||f.length===0?[]:f.map(m=>{let y=me(m,m.host??"");return y?{...y,_cursor:m._cursor}:null}).filter(m=>!!m)}function X_(e={}){let t=_i(e),{containers:r,tag:n,following:i,author:o,observer:s,limit:a}=t;return infiniteQueryOptions({queryKey:c.posts.wavesFeed({containers:r,tag:n,following:i,author:o,observer:s,limit:a}),initialPageParam:void 0,queryFn:({pageParam:u,signal:p})=>bi(t,u,p),getNextPageParam:u=>{if(!(u.lengthbi(t,void 0,u)})}var yc=20;function hc(e){return {containers:e.containers??[],tag:e.tag?.trim()||void 0,author:e.author?.trim().toLowerCase()||void 0,observer:e.observer?.trim().toLowerCase()||void 0,limit:e.limit??yc}}async function wc({containers:e,tag:t,author:r,observer:n,limit:i},o,s){let a=N.getValidatedBaseUrl(),u=new URL("/private-api/waves/shorts",a);u.searchParams.set("limit",String(i)),o&&u.searchParams.set("cursor",o),e.forEach(f=>u.searchParams.append("container",f)),t&&u.searchParams.set("tag",t),r&&u.searchParams.set("author",r),n&&u.searchParams.set("observer",n);let p=await fetch(u.toString(),{method:"GET",signal:s});if(!p.ok)throw new Error(`Failed to fetch shorts feed: ${p.status}`);let l=await p.json();return !Array.isArray(l)||l.length===0?[]:l.map(f=>{let m=me(f,f.host??"");return m?{...m,active_votes:m.active_votes??[],video:f.video,_cursor:f._cursor}:null}).filter(f=>!!f)}function ib(e={}){let t=hc(e),{containers:r,tag:n,author:i,observer:o,limit:s}=t;return infiniteQueryOptions({queryKey:c.posts.shortsFeed({containers:r,tag:n,author:i,observer:o,limit:s}),initialPageParam:void 0,queryFn:({pageParam:a,signal:u})=>wc(t,a,u),getNextPageParam:a=>{if(!(a.length(l.id=l.post_id,l.host=e,l));for(let l of u){if(o&&l.post_id===o){o=void 0;continue}if(i+=1,l.stats?.gray){r=l.author,n=l.permlink;continue}let f;try{f=await hi(l);}catch(m){console.error("[SDK] getThreads get_discussion error:",m),r=l.author,n=l.permlink;continue}if(f.length===0){r=l.author,n=l.permlink;continue}return {entries:wi(f,l,e)}}let p=u[u.length-1];if(!p)return null;r=p.author,n=p.permlink;}return null}function lb(e){return infiniteQueryOptions({queryKey:c.posts.wavesByHost(e),initialPageParam:void 0,queryFn:async({pageParam:t})=>{let r=await Ac(e,t);return r?r.entries:[]},getNextPageParam:t=>t?.[0]?.container})}var Oc=40;function yb(e,t,r=Oc){return infiniteQueryOptions({queryKey:c.posts.wavesByTag(e,t),initialPageParam:void 0,queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/tags",i);o.searchParams.set("container",e),o.searchParams.set("tag",t);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves by tag: ${s.status}`);return (await s.json()).slice(0,r).map(p=>me(p,e)).filter(p=>!!p).sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves by tag",i),[]}},getNextPageParam:()=>{}})}function vb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesFollowing(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/following",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",headers:{"Content-Type":"application/json"},signal:n});if(!s.ok)throw new Error(`Failed to fetch waves following feed: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){return console.error("[SDK] Failed to fetch waves following feed",i),[]}},getNextPageParam:()=>{}})}function xb(e,t=24){let r=e?.trim()||void 0;return queryOptions({queryKey:c.posts.wavesTrendingTags(r??"",t),queryFn:async({signal:n})=>{try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/trending/tags",i);r&&o.searchParams.set("container",r),o.searchParams.set("hours",t.toString());let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves trending tags: ${s.status}`);return (await s.json()).map(({tag:u,posts:p})=>({tag:u,posts:p}))}catch(i){return console.error("[SDK] Failed to fetch waves trending tags",i),[]}}})}function Tb(e,t){let r=t?.trim().toLowerCase();return infiniteQueryOptions({queryKey:c.posts.wavesByAccount(e,r??""),enabled:!!r,initialPageParam:void 0,queryFn:async({signal:n})=>{if(!r)return [];try{let i=N.getValidatedBaseUrl(),o=new URL("/private-api/waves/account",i);o.searchParams.set("container",e),o.searchParams.set("username",r);let s=await fetch(o.toString(),{method:"GET",signal:n});if(!s.ok)throw new Error(`Failed to fetch waves for account: ${s.status}`);let a=await s.json();if(!Array.isArray(a)||a.length===0)return [];let u=a.map(p=>me(p,e)).filter(p=>!!p);return u.length===0?[]:u.sort((p,l)=>new Date(l.created).getTime()-new Date(p.created).getTime())}catch(i){throw console.error("[SDK] Failed to fetch waves for account",i),i}},getNextPageParam:()=>{}})}function Ib(e){return queryOptions({queryKey:c.posts.wavesTrendingAuthors(e),queryFn:async({signal:t})=>{try{let r=N.getValidatedBaseUrl(),n=new URL("/private-api/waves/trending/authors",r);n.searchParams.set("container",e);let i=await fetch(n.toString(),{method:"GET",signal:t});if(!i.ok)throw new Error(`Failed to fetch waves trending authors: ${i.status}`);return (await i.json()).map(({author:s,posts:a})=>({author:s,posts:a}))}catch(r){throw console.error("[SDK] Failed to fetch waves trending authors",r),r}}})}function Nb(e,t=true){return queryOptions({queryKey:c.posts.normalize(e?.author??"",e?.permlink??""),enabled:t&&!!e,queryFn:async()=>pi(e)})}function Rc(e){return !!e&&typeof e=="object"&&"author"in e&&"permlink"in e&&"active_votes"in e}function vi(e){let t=new Date(e);return (new Date().getTime()-t.getTime())/(1e3*60*60*24)}function Wb(e,t){let{limit:r=20,filters:n=[],dayLimit:i=7}=t??{};return infiniteQueryOptions({queryKey:c.accounts.voteHistory(e,r),initialPageParam:{start:-1},queryFn:async({pageParam:o})=>{let{start:s}=o,a=await g("condenser_api.get_account_history",[e,s,r,...n]),p=a.map(([m,y])=>({...y.op[1],num:m,timestamp:y.timestamp})).filter(m=>m.voter===e&&m.weight!==0&&vi(m.timestamp)<=i),l=[];for(let m of p){let y=await d.queryClient.fetchQuery(ii(m.author,m.permlink));Rc(y)&&l.push(y);}let[f]=a;return {lastDate:f?vi(f[1].timestamp):0,lastItemFetched:f?f[0]:s,entries:l}},getNextPageParam:o=>({start:o.lastItemFetched})})}function Xb(e,t,r=true){return queryOptions({queryKey:c.accounts.profiles(e,t??""),enabled:r&&e.length>0,queryFn:async()=>Ct(e,t)})}function iv(e,t="HIVE",r=200){return infiniteQueryOptions({queryKey:c.wallet.balanceHistory(e??"",t,r),initialPageParam:null,queryFn:async({pageParam:n,signal:i})=>{if(!e)return {entries:[],currentPage:0};let o={"account-name":e,"coin-type":t,"page-size":r,direction:"desc"};n!==null&&(o.page=n);let s=await ee("balance","/accounts/{account-name}/balance-history",o,void 0,void 0,i);return {entries:s.operations_result,currentPage:n??s.total_pages}},getNextPageParam:n=>{let i=n.currentPage-1;return i>=1?i:void 0},enabled:!!e})}function uv(e,t="HIVE",r="yearly"){return queryOptions({queryKey:c.wallet.aggregatedHistory(e??"",t,r),queryFn:async()=>e?await ee("balance","/accounts/{account-name}/aggregated-history",{"account-name":e,"coin-type":t,granularity:r}):[],enabled:!!e,staleTime:6e4})}function fv(){return queryOptions({queryKey:c.accounts.proMembers(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/pro-members",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch pro members: ${e.status}`);return e.json()},staleTime:300*1e3})}function mv(e){return new Set((e??[]).map(t=>t.toLowerCase()))}function bv(e,t,r){let n=useQueryClient(),{data:i}=useQuery(M(e));return v(["accounts","update"],e,o=>{let s=Yn(n.getQueryData(M(e).queryKey),i);if(!s)throw new Error("[SDK][Accounts] \u2013 cannot update not existing account");return [["account_update2",{account:e,json_metadata:"",extensions:[],posting_json_metadata:Xn({existingPostingJsonMetadata:s.posting_json_metadata,profile:o.profile,tokens:o.tokens})}]]},async(o,s)=>{n.setQueryData(M(e).queryKey,a=>{if(!a)return a;let u=JSON.parse(JSON.stringify(a));return u.profile=pr({existingProfile:Jn(a),profile:s.profile,tokens:s.tokens}),u}),await S(t?.adapter,r,[c.accounts.full(e)]);},t,void 0,{broadcastMode:r,onMutate:async()=>{if(e)try{await n.fetchQuery({...M(e),staleTime:0});}catch{}}})}function xv(e,t,r,n,i){return useMutation({mutationKey:["accounts","relation","update",e,t],mutationFn:async o=>{let s=ei(e,t);await b().prefetchQuery(s);let a=b().getQueryData(s.queryKey);return await Vn(e,"follow",["follow",{follower:e,following:t,what:[...o==="toggle-ignore"&&!a?.ignores?["ignore"]:[],...o==="toggle-follow"&&!a?.follows?["blog"]:[]]}],r),{...a,ignores:o==="toggle-ignore"?!a?.ignores:a?.ignores,follows:o==="toggle-follow"?!a?.follows:a?.follows}},onError:i,onSuccess(o){n(o),b().setQueryData(c.accounts.relations(e,t),o),t&&b().invalidateQueries(M(t));}})}function fr(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildVoteOp] Missing required parameters");if(n<-1e4||n>1e4)throw new Error("[SDK][buildVoteOp] Weight must be between -10000 and 10000");return ["vote",{voter:e,author:t,permlink:r,weight:n}]}function Ie(e,t,r,n,i,o,s){if(!e||!t||n===void 0||!o)throw new Error("[SDK][buildCommentOp] Missing required parameters");return ["comment",{parent_author:r,parent_permlink:n,author:e,permlink:t,title:i,body:o,json_metadata:JSON.stringify(s)}]}function De(e,t,r,n,i,o,s){if(!e||!t)throw new Error("[SDK][buildCommentOptionsOp] Missing required parameters");return ["comment_options",{author:e,permlink:t,max_accepted_payout:r,percent_hbd:n,allow_votes:i,allow_curation_rewards:o,extensions:s}]}function mr(e,t){if(!e||!t)throw new Error("[SDK][buildDeleteCommentOp] Missing required parameters");return ["delete_comment",{author:e,permlink:t}]}function gr(e,t,r,n=false){if(!e||!t||!r)throw new Error("[SDK][buildReblogOp] Missing required parameters");let i={account:e,author:t,permlink:r};return n&&(i.delete="delete"),["custom_json",{id:"follow",json:JSON.stringify(["reblog",i]),required_auths:[],required_posting_auths:[e]}]}function Ke(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferOp] Missing required parameters");return ["transfer",{from:e,to:t,amount:r,memo:n||""}]}function Nc(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiTransferOps] Missing required parameters");return t.trim().split(/[\s,]+/).filter(Boolean).map(o=>Ke(e,o.trim(),r,n))}function Qc(e,t,r,n,i,o){if(!e||!t||!r)throw new Error("[SDK][buildRecurrentTransferOp] Missing required parameters");if(i<24)throw new Error("[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours");return ["recurrent_transfer",{from:e,to:t,amount:r,memo:n||"",recurrence:i,executions:o,extensions:[]}]}function je(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildTransferToSavingsOp] Missing required parameters");return ["transfer_to_savings",{from:e,to:t,amount:r,memo:n||""}]}function Be(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildTransferFromSavingsOp] Missing required parameters");return ["transfer_from_savings",{from:e,to:t,amount:r,memo:n||"",request_id:i}]}function Ai(e,t){if(!e||t===void 0)throw new Error("[SDK][buildCancelTransferFromSavingsOp] Missing required parameters");return ["cancel_transfer_from_savings",{from:e,request_id:t}]}function nt(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildClaimInterestOps] Missing required parameters");return [Be(e,t,r,n,i),Ai(e,i)]}function it(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildTransferToVestingOp] Missing required parameters");return ["transfer_to_vesting",{from:e,to:t,amount:r}]}function ot(e,t){if(!e||!t)throw new Error("[SDK][buildWithdrawVestingOp] Missing required parameters");return ["withdraw_vesting",{account:e,vesting_shares:t}]}function st(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildDelegateVestingSharesOp] Missing required parameters");return ["delegate_vesting_shares",{delegator:e,delegatee:t,vesting_shares:r}]}function at(e,t,r,n){if(!e||!t||r===void 0)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters");if(r<0||r>1e4)throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");return ["set_withdraw_vesting_route",{from_account:e,to_account:t,percent:r,auto_vest:n}]}function ct(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildConvertOp] Missing required parameters");return ["convert",{owner:e,amount:t,requestid:r}]}function yr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildCollateralizedConvertOp] Missing required parameters");return ["collateralized_convert",{owner:e,amount:t,requestid:r}]}function Me(e,t,r,n="tokens"){return ["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:JSON.stringify({contractName:n,contractAction:t,contractPayload:r})}]}function hr(e,t){return ["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:JSON.stringify(t.map(r=>({symbol:r})))}]}function wr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildDelegateRcOp] Missing required parameters");let n=t.includes(",")?t.split(",").map(i=>i.trim()):[t];return ["custom_json",{id:"rc",json:JSON.stringify(["delegate_rc",{from:e,delegatees:n,max_rc:r}]),required_auths:[],required_posting_auths:[e]}]}function _r(e,t){if(!e||!t)throw new Error("[SDK][buildFollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["blog"]}]),required_auths:[],required_posting_auths:[e]}]}function Tt(e,t){if(!e||!t)throw new Error("[SDK][buildUnfollowOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:[]}]),required_auths:[],required_posting_auths:[e]}]}function Hc(e,t){if(!e||!t)throw new Error("[SDK][buildIgnoreOp] Missing required parameters");return ["custom_json",{id:"follow",json:JSON.stringify(["follow",{follower:e,following:t,what:["ignore"]}]),required_auths:[],required_posting_auths:[e]}]}function Uc(e,t){if(!e||!t)throw new Error("[SDK][buildUnignoreOp] Missing required parameters");return Tt(e,t)}function br(e,t){if(!e)throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");let r=t||new Date().toISOString().split(".")[0],n=["custom_json",{id:"notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}],i=["custom_json",{id:"ecency_notify",json:JSON.stringify(["setLastRead",{date:r}]),required_auths:[],required_posting_auths:[e]}];return [n,i]}function vr(e,t,r){if(!e||!t||r===void 0)throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");return ["account_witness_vote",{account:e,witness:t,approve:r}]}function Ar(e,t){if(!e||t===void 0)throw new Error("[SDK][buildWitnessProxyOp] Missing required parameters");return ["account_witness_proxy",{account:e,proxy:t}]}function Pr(e,t){if(!e||!t.receiver||!t.subject||!t.permlink||!t.start||!t.end||!t.dailyPay)throw new Error("[SDK][buildProposalCreateOp] Missing required parameters");let r=new Date(t.start),n=new Date(t.end);if(r.toString()==="Invalid Date"||n.toString()==="Invalid Date")throw new Error("[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings");return ["create_proposal",{creator:e,receiver:t.receiver,start_date:t.start,end_date:t.end,daily_pay:t.dailyPay,subject:t.subject,permlink:t.permlink,extensions:[]}]}function Or(e,t,r){if(!e||!t||t.length===0||r===void 0)throw new Error("[SDK][buildProposalVoteOp] Missing required parameters");return ["update_proposal_votes",{voter:e,proposal_ids:t,approve:r,extensions:[]}]}function Vc(e,t){if(!e||!t||t.length===0)throw new Error("[SDK][buildRemoveProposalOp] Missing required parameters");return ["remove_proposal",{proposal_owner:e,proposal_ids:t,extensions:[]}]}function jc(e,t,r,n,i){if(e==null||typeof e!="number"||!t||!r||!n||!i)throw new Error("[SDK][buildUpdateProposalOp] Missing required parameters");return ["update_proposal",{proposal_id:e,creator:t,daily_pay:r,subject:n,permlink:i,extensions:[]}]}function xr(e,t){if(!e||!t)throw new Error("[SDK][buildSubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["subscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Er(e,t){if(!e||!t)throw new Error("[SDK][buildUnsubscribeOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["unsubscribe",{community:t}]),required_auths:[],required_posting_auths:[e]}]}function Sr(e,t,r,n){if(!e||!t||!r||!n)throw new Error(`[SDK][buildSetRoleOp] Missing required parameters: username=${e}, community=${t}, account=${r}, role=${n}`);return ["custom_json",{id:"community",json:JSON.stringify(["setRole",{community:t,account:r,role:n}]),required_auths:[],required_posting_auths:[e]}]}function kr(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildUpdateCommunityOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["updateProps",{community:t,props:r}]),required_auths:[],required_posting_auths:[e]}]}function Cr(e,t,r,n,i){if(!e||!t||!r||!n||i===void 0)throw new Error("[SDK][buildPinPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"pinPost":"unpinPost",{community:t,account:r,permlink:n}]),required_auths:[],required_posting_auths:[e]}]}function Tr(e,t,r,n,i,o){if(!e||!t||!r||!n||o===void 0)throw new Error("[SDK][buildMutePostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([o?"mutePost":"unmutePost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}function Lc(e,t,r,n,i){if(!e||!t||!r||i===void 0)throw new Error("[SDK][buildMuteUserOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify([i?"muteUser":"unmuteUser",{community:t,account:r,notes:n}]),required_auths:[],required_posting_auths:[e]}]}function $c(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildFlagPostOp] Missing required parameters");return ["custom_json",{id:"community",json:JSON.stringify(["flagPost",{community:t,account:r,permlink:n,notes:i}]),required_auths:[],required_posting_auths:[e]}]}var Pi=(r=>(r.Buy="buy",r.Sell="sell",r))(Pi||{}),Oi=(r=>(r.EMPTY="",r.SWAP="9",r))(Oi||{});function Ft(e,t,r,n,i,o){if(!e||!t||!r||!i||o===void 0)throw new Error("[SDK][buildLimitOrderCreateOp] Missing required parameters");return ["limit_order_create",{owner:e,orderid:o,amount_to_sell:t,min_to_receive:r,fill_or_kill:n,expiration:i}]}function Rt(e,t=3){return e.toFixed(t)}function Wc(e,t,r,n,i=""){if(!e||n===void 0||!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new Error("[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters");let o=new Date(Date.now());o.setDate(o.getDate()+27);let s=o.toISOString().split(".")[0],a=+`${i}${Math.floor(Date.now()/1e3).toString().slice(2)}`,u=n==="buy"?`${Rt(t,3)} HBD`:`${Rt(t,3)} HIVE`,p=n==="buy"?`${Rt(r,3)} HIVE`:`${Rt(r,3)} HBD`;return Ft(e,u,p,false,s,a)}function Rr(e,t){if(!e||t===void 0)throw new Error("[SDK][buildLimitOrderCancelOp] Missing required parameters");return ["limit_order_cancel",{owner:e,orderid:t}]}function Fr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildClaimRewardBalanceOp] Missing required parameters");return ["claim_reward_balance",{account:e,reward_hive:t,reward_hbd:r,reward_vests:n}]}function Gc(e,t,r,n,i,o){if(!e||!i)throw new Error("[SDK][buildAccountUpdateOp] Missing required parameters");return ["account_update",{account:e,owner:t,active:r,posting:n,memo_key:i,json_metadata:o}]}function zc(e,t,r,n){if(!e||r===void 0)throw new Error("[SDK][buildAccountUpdate2Op] Missing required parameters");return ["account_update2",{account:e,json_metadata:t||"",posting_json_metadata:r,extensions:n||[]}]}function qr(e,t,r,n){if(!e||!t||!r||!n)throw new Error("[SDK][buildAccountCreateOp] Missing required parameters");let i={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},o={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},s={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["account_create",{creator:e,new_account_name:t,owner:i,active:o,posting:s,memo_key:r.memoPublicKey,json_metadata:"",fee:n}]}function Ir(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildCreateClaimedAccountOp] Missing required parameters");let n={weight_threshold:1,account_auths:[],key_auths:[[r.ownerPublicKey,1]]},i={weight_threshold:1,account_auths:[],key_auths:[[r.activePublicKey,1]]},o={weight_threshold:1,account_auths:[["ecency.app",1]],key_auths:[[r.postingPublicKey,1]]};return ["create_claimed_account",{creator:e,new_account_name:t,owner:n,active:i,posting:o,memo_key:r.memoPublicKey,json_metadata:"",extensions:[]}]}function Dr(e,t){if(!e||!t)throw new Error("[SDK][buildClaimAccountOp] Missing required parameters");return ["claim_account",{creator:e,fee:t,extensions:[]}]}function Kr(e,t,r,n,i,o){if(!e||!t||!r||!i)throw new Error("[SDK][buildGrantPostingPermissionOp] Missing required parameters");let s=t.account_auths.findIndex(([p])=>p===r),a=[...t.account_auths];s>=0?a[s]=[r,n]:a.push([r,n]);let u={...t,account_auths:a};return u.account_auths.sort((p,l)=>p[0]>l[0]?1:-1),["account_update",{account:e,posting:u,memo_key:i,json_metadata:o}]}function Jc(e,t,r,n,i){if(!e||!t||!r||!n)throw new Error("[SDK][buildRevokePostingPermissionOp] Missing required parameters");let o={...t,account_auths:t.account_auths.filter(([s])=>s!==r)};return ["account_update",{account:e,posting:o,memo_key:n,json_metadata:i}]}function Yc(e,t,r=[]){if(!e||!t)throw new Error("[SDK][buildChangeRecoveryAccountOp] Missing required parameters");return ["change_recovery_account",{account_to_recover:e,new_recovery_account:t,extensions:r}]}function Xc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");return ["request_account_recovery",{recovery_account:e,account_to_recover:t,new_owner_authority:r,extensions:n}]}function Zc(e,t,r,n=[]){if(!e||!t||!r)throw new Error("[SDK][buildRecoverAccountOp] Missing required parameters");return ["recover_account",{account_to_recover:e,new_owner_authority:t,recent_owner_authority:r,extensions:n}]}function Br(e,t,r){if(!e||!t||!Number.isFinite(r))throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");return ["custom_json",{id:"ecency_boost_plus",json:JSON.stringify({user:e,account:t,duration:r}),required_auths:[e],required_posting_auths:[]}]}function Mr(e,t){if(!e||!Number.isInteger(t)||t<=0)throw new Error("[SDK][buildRcDelegationOp] Missing or invalid parameters");return ["custom_json",{id:"ecency_rc_delegation",json:JSON.stringify({user:e,duration:t}),required_auths:[e],required_posting_auths:[]}]}function Nr(e,t,r,n){if(!e||!t||!r||!Number.isFinite(n))throw new Error("[SDK][buildPromoteOp] Missing required parameters");return ["custom_json",{id:"ecency_promote",json:JSON.stringify({user:e,author:t,permlink:r,duration:n}),required_auths:[e],required_posting_auths:[]}]}function Le(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildPointTransferOp] Missing required parameters");let i=r.replace(/POINTS\b/,"POINT");return ["custom_json",{id:"ecency_point_transfer",json:JSON.stringify({sender:e,receiver:t,amount:i,memo:n||""}),required_auths:[e],required_posting_auths:[]}]}function eu(e,t,r,n){if(!e||!t||!r)throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");let i=t.trim().split(/[\s,]+/).filter(Boolean);if(i.length===0)throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");return i.map(o=>Le(e,o.trim(),r,n))}function Qr(e){if(!e)throw new Error("[SDK][buildCommunityRegistrationOp] Missing required parameters");return ["custom_json",{id:"ecency_registration",json:JSON.stringify({name:e}),required_auths:[e],required_posting_auths:[]}]}function tu(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildActiveCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[e],required_posting_auths:[]}]}function ru(e,t,r){if(!e||!t||!r)throw new Error("[SDK][buildPostingCustomJsonOp] Missing required parameters");return ["custom_json",{id:t,json:JSON.stringify(r),required_auths:[],required_posting_auths:[e]}]}function $v(e,t,r){return v(["accounts","follow"],e,({following:n})=>[_r(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function Jv(e,t,r){return v(["accounts","unfollow"],e,({following:n})=>[Tt(e,n)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.relations(e,i.following),c.accounts.full(i.following),c.accounts.followCount(i.following),c.accounts.followCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function eA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","add",e],mutationFn:async({author:i,permlink:o})=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({author:i,permlink:o,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function iA(e,t,r,n){return useMutation({mutationKey:["accounts","bookmarks","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/bookmarks-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:i,code:t})})).json()},onSuccess:()=>{r(),b().invalidateQueries({queryKey:["accounts","bookmarks",e]});},onError:n})}function cA(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","add",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");return (await w()(d.privateApiHost+"/private-api/favorites-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})})).json()},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:n})}function fA(e,t,r,n){return useMutation({mutationKey:["accounts","favorites","delete",e],mutationFn:async i=>{if(!e||!t)throw new Error("[SDK][Account][Favorites] \u2013 missing auth");let s=await w()(d.privateApiHost+"/private-api/favorites-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({account:i,code:t})});if(!s.ok)throw new Error(`Failed to delete favorite: ${s.status}`);return s.json()},onMutate:async i=>{if(!e)return;let o=b(),s=c.accounts.favorites(e),a=c.accounts.favoritesInfinite(e),u=c.accounts.checkFavorite(e,i);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a}),o.cancelQueries({queryKey:u})]);let p=o.getQueryData(s);p&&o.setQueryData(s,p.filter(y=>y.account!==i));let l=o.getQueryData(u);o.setQueryData(u,false);let f=o.getQueriesData({queryKey:a}),m=new Map(f);for(let[y,h]of f)h&&o.setQueryData(y,{...h,pages:h.pages.map(E=>({...E,data:E.data.filter(O=>O.account!==i)}))});return {previousList:p,previousInfinite:m,previousCheck:l}},onSuccess:(i,o)=>{r();let s=b();s.invalidateQueries({queryKey:c.accounts.favorites(e)}),s.invalidateQueries({queryKey:c.accounts.favoritesInfinite(e)}),s.invalidateQueries({queryKey:c.accounts.checkFavorite(e,o)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.accounts.favorites(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);s?.previousCheck!==void 0&&a.setQueryData(c.accounts.checkFavorite(e,o),s.previousCheck),n(i);}})}function uu(e,t){let r=new Map;return e.forEach(([n,i])=>{r.set(n.toString(),i);}),t.forEach(([n,i])=>{r.set(n.toString(),i);}),Array.from(r.entries()).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i])}function xi(e,t){let{data:r}=useQuery(M(e));return useMutation({mutationKey:["accounts","keys-update",e],mutationFn:async({keys:n,keepCurrent:i=false,currentKey:o,keysToRevoke:s=[],keysToRevokeByAuthority:a={}})=>{if(n.length===0)throw new Error("[SDK][Update password] \u2013 no new keys provided");if(!r)throw new Error("[SDK][Update password] \u2013 cannot update keys for anon user");let u=p=>{let l=JSON.parse(JSON.stringify(r[p])),m=[...a[p]||[],...a[p]===void 0?s:[]],y=i?l.key_auths.filter(([h])=>!m.includes(h.toString())):[];return l.key_auths=uu(y,n.map((h,E)=>[h[p].createPublic().toString(),E+1])),l};return Z([["account_update",{account:e,json_metadata:r.json_metadata,owner:u("owner"),active:u("active"),posting:u("posting"),memo_key:n[0].memo_key.createPublic().toString()}]],o)},...t})}function PA(e,t){let{data:r}=useQuery(M(e)),{mutateAsync:n}=xi(e);return useMutation({mutationKey:["accounts","password-update",e],mutationFn:async({newPassword:i,currentPassword:o,keepCurrent:s})=>{if(!r)throw new Error("[SDK][Update password] \u2013 cannot update password for anon user");let a=H.fromLogin(e,o,"owner");return n({currentKey:a,keepCurrent:s,keys:[{owner:H.fromLogin(e,i,"owner"),active:H.fromLogin(e,i,"active"),posting:H.fromLogin(e,i,"posting"),memo_key:H.fromLogin(e,i,"memo")}]})},...t})}function CA(e,t,r){let n=useQueryClient(),{data:i}=useQuery(M(e));return useMutation({mutationKey:["accounts","revoke-posting",i?.name],mutationFn:async({accountName:o,type:s,key:a})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user");let u=JSON.parse(JSON.stringify(i.posting));u.account_auths=u.account_auths.filter(([l])=>l!==o);let p={account:i.name,posting:u,memo_key:i.memo_key,json_metadata:i.json_metadata};if(s==="key"&&a)return Z([["account_update",p]],a);if(s==="keychain"){if(!r?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return r.adapter.broadcastWithKeychain(i.name,[["account_update",p]],"active")}else return !t.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing."),Un.sendOperation(["account_update",p],t.hsCallbackUrl?{callback:t.hsCallbackUrl}:{},()=>{})},onError:t.onError,onSuccess:(o,s,a)=>{t.onSuccess?.(o,s,a),n.setQueryData(M(e).queryKey,u=>({...u,posting:{...u?.posting,account_auths:u?.posting?.account_auths?.filter(([p])=>p!==s.accountName)??[]}}));}})}function KA(e,t,r,n){let{data:i}=useQuery(M(e));return useMutation({mutationKey:["accounts","recovery",i?.name],mutationFn:async({accountName:o,type:s,key:a,email:u})=>{if(!i)throw new Error("[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user");let p={account_to_recover:i.name,new_recovery_account:o,extensions:[]};if(s==="ecency"){if(!t)throw new Error("[SDK][Accounts] \u2013 missing access token");let f=await w()(d.privateApiHost+"/private-api/recoveries-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,email:u,publicKeys:[...i.owner.key_auths,...i.active.key_auths,...i.posting.key_auths,i.memo_key]})});if(!f.ok)throw new Error(`[SDK][Accounts] Failed to add recovery: ${f.status}`);return f}else {if(s==="key"&&a)return Z([["change_recovery_account",p]],a);if(s==="keychain"){if(!n?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");return n.adapter.broadcastWithKeychain(i.name,[["change_recovery_account",p]],"owner")}else return !r.hsCallbackUrl&&process.env.NODE_ENV==="development"&&console.warn("[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing."),Un.sendOperation(["change_recovery_account",p],r.hsCallbackUrl?{callback:r.hsCallbackUrl}:{},()=>{})}},onError:r.onError,onSuccess:r.onSuccess})}function MA(e,t){let r=e.key_auths.filter(([i])=>!t.has(String(i))).reduce((i,[,o])=>i+o,0),n=(e.account_auths??[]).reduce((i,[,o])=>i+o,0);return r+n>=e.weight_threshold}function Ei(e,t){let r=new Set(t.map(s=>s.toString())),n=s=>s.key_auths.some(([a])=>r.has(String(a))),i=s=>{let a=JSON.parse(JSON.stringify(s));return a.key_auths=a.key_auths.filter(([u])=>!r.has(u.toString())),a},o=n(e.owner);return {account:e.name,json_metadata:e.json_metadata,owner:o?i(e.owner):void 0,active:i(e.active),posting:i(e.posting),memo_key:e.memo_key}}function jA(e,t){let{data:r}=useQuery(M(e));return useMutation({mutationKey:["accounts","revoke-key",r?.name],mutationFn:async({currentKey:n,revokingKey:i})=>{if(!r)throw new Error("[SDK][Revoke key] \u2013 cannot update keys for anon user");let o=Array.isArray(i)?i:[i],s=Ei(r,o);return Z([["account_update",s]],n)},...t})}function GA(e,t,r){return v(["accounts","claimAccount"],e,({creator:n,fee:i="0.000 HIVE"})=>[Dr(n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(i.creator)]);},t,"active",{broadcastMode:r})}function XA(e,t,r){return v(["accounts","grant-posting-permission"],e,n=>[Kr(e,n.currentPosting,n.grantedAccount,n.weightThreshold,n.memoKey,n.jsonMetadata)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}function rP(e,t,r){return v(["accounts","create"],e,n=>[n.useClaimed?Ir(e,n.newAccountName,n.keys):qr(e,n.newAccountName,n.keys,n.fee)],async()=>{await S(t?.adapter,r,[c.accounts.full(e)]);},t,"active",{broadcastMode:r})}var Hr=300*60*24,vu=1e4,Au=5e7;function Si(e){let t=C(e.vesting_shares).amount,r=C(e.received_vesting_shares).amount,n=C(e.delegated_vesting_shares).amount,i=C(e.vesting_withdraw_rate).amount,o=(Number(e.to_withdraw)-Number(e.withdrawn))/1e6,s=Math.min(i,o);return t+r-n-s}function Pu(e,t,r){let n=e*1e6;return (t*r/1e4/50+1)*n/1e4}function Ou(e){if(Number.isFinite(e.lastHardfork))return e.lastHardfork>=28;let[t="0",r="0"]=(e.currentHardforkVersion??"0.0.0").split(".");return Number(t)>1||Number(t)===1&&Number(r)>=28}function xu(e,t,r){let n=t.votePowerReserveRate||Number(t.raw?.globalDynamic?.vote_power_reserve_rate??0);if(!Number.isFinite(n)||n<=0)return 0;let i=Si(e);if(!Number.isFinite(i)||i<=0)return 0;let o=i*1e6,s=Math.ceil(o*r*60*60*24/vu/(n*Hr)),a=ar(e),u=Math.min(a.current_mana,a.max_mana);return !Number.isFinite(u)||s>u?0:Math.max(s-Au,0)}function Eu(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;if(Ou(t))return xu(e,t,n);let i=0;try{if(i=Si(e),!Number.isFinite(i))return 0}catch{return 0}return Pu(i,r,n)}function sP(e){return ar(e).percentage/100}function aP(e){if(!Number.isFinite(e))throw new TypeError("Voting power must be a finite number");if(e<0||e>100)throw new RangeError("Voting power must be between 0 and 100");return (100-e)*100*Hr/1e4}function cP(e){let t=parseFloat(e.vesting_shares)+parseFloat(e.received_vesting_shares)-parseFloat(e.delegated_vesting_shares),r=Math.floor(Date.now()/1e3)-e.downvote_manabar.last_update_time,n=t*1e6/4;if(n<=0)return 0;let i=parseFloat(e.downvote_manabar.current_mana.toString())+r*n/Hr;i>n&&(i=n);let o=i*100/n;return isNaN(o)?0:o>100?100:o}function uP(e){return Ot(e).percentage/100}function pP(e,t,r,n=1e4){if(!Number.isFinite(r)||!Number.isFinite(n))return 0;let{fundRecentClaims:i,fundRewardBalance:o,base:s,quote:a}=t;if(!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(a)||i===0||a===0)return 0;let u=Eu(e,t,r,n);return Number.isFinite(u)?u/i*o*(s/a):0}var Su={vote:"posting",comment:"posting",delete_comment:"posting",comment_options:"posting",claim_reward_balance:"posting",cancel_transfer_from_savings:"active",collateralized_convert:"active",convert:"active",delegate_vesting_shares:"active",recurrent_transfer:"active",set_withdraw_vesting_route:"active",transfer:"active",transfer_from_savings:"active",transfer_to_savings:"active",transfer_to_vesting:"active",withdraw_vesting:"active",limit_order_create:"active",limit_order_cancel:"active",account_update:"active",account_update2:"active",claim_account:"active",create_claimed_account:"active",account_witness_proxy:"active",account_witness_vote:"active",remove_proposal:"active",update_proposal_votes:"active",change_recovery_account:"owner",request_account_recovery:"owner",recover_account:"owner",reset_account:"owner",set_reset_account:"owner"};function ku(e){let t=e[0],r=e[1];if(t!=="custom_json")throw new Error("Operation is not a custom_json operation");let n=r;return n.required_auths&&n.required_auths.length>0?"active":(n.required_posting_auths&&n.required_posting_auths.length>0,"posting")}function Cu(e){let t=e[0];if(t!=="create_proposal"&&t!=="update_proposal")throw new Error("Operation is not a proposal operation");return "active"}function Tu(e){let t=e[0];return t==="custom_json"?ku(e):t==="create_proposal"||t==="update_proposal"?Cu(e):Su[t]??"posting"}function dP(e){let t="posting";for(let r of e){let n=Tu(r);if(n==="owner")return "owner";n==="active"&&t==="posting"&&(t="active");}return t}function hP(e){return useMutation({mutationKey:["operations","sign",e],mutationFn:({operation:t,keyOrSeed:r})=>{if(!e)throw new Error("[Operations][Sign] \u2013 cannot sign op with anon user");let n;return r.split(" ").length===12?n=H.fromLogin(e,r,"active"):Mn(r)?n=H.fromString(r):n=H.from(r),Z([t],n)}})}function bP(e,t,r="active"){return useMutation({mutationKey:["operations","sign-keychain",e],mutationFn:({operation:n})=>{if(!e)throw new Error("[SDK][Keychain] \u2013\xA0cannot sign operation with anon user");if(!t?.adapter?.broadcastWithKeychain)throw new Error("[SDK][Keychain] \u2013 missing keychain broadcaster");return t.adapter.broadcastWithKeychain(e,[n],r)}})}function OP(e="/"){return useMutation({mutationKey:["operations","sign-hivesigner",e],mutationFn:async({operation:t})=>Un.sendOperation(t,{callback:e},()=>{})})}function kP(){return queryOptions({queryKey:["operations","chain-properties"],queryFn:async()=>await g("condenser_api.get_chain_properties",[])})}function ki(e,t,r){return {...e,...t??{},title:r.title,body:r.body}}function Ci(e,t){return {...e??{},title:t.title,body:t.body}}function KP(e,t){return useMutation({mutationKey:["posts","add-fragment",e],mutationFn:async({title:r,body:n})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let o=await w()(d.privateApiHost+"/private-api/fragments-add",{method:"POST",body:JSON.stringify({code:t,title:r,body:n}),headers:{"Content-Type":"application/json"}});if(!o.ok)throw new Error(`[SDK][Posts] Failed to add fragment: ${o.status}`);return o.json()},onSuccess(r,n){let i=b(),o=Ci(r,n);i.setQueryData(Ve(e,t).queryKey,s=>[o,...s??[]]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map((a,u)=>u===0?{...a,data:[o,...a.data]}:a)});}})}function VP(e,t){return useMutation({mutationKey:["posts","edit-fragment",e],mutationFn:async({fragmentId:r,title:n,body:i})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let s=await w()(d.privateApiHost+"/private-api/fragments-update",{method:"POST",body:JSON.stringify({code:t,id:r,title:n,body:i}),headers:{"Content-Type":"application/json"}});if(!s.ok)throw new Error(`[SDK][Posts] Failed to update fragment: ${s.status}`);return s.json()},onSuccess(r,n){let i=b(),o=s=>ki(s,r,n);i.setQueryData(Ve(e,t).queryKey,s=>s?.map(a=>a.id===n.fragmentId?o(a):a)??[]),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},s=>s&&{...s,pages:s.pages.map(a=>({...a,data:a.data.map(u=>u.id===n.fragmentId?o(u):u)}))});}})}function zP(e,t){return useMutation({mutationKey:["posts","remove-fragment",e],mutationFn:async({fragmentId:r})=>{if(!t)throw new Error("[SDK][Posts] Missing access token");let i=await w()(d.privateApiHost+"/private-api/fragments-delete",{method:"POST",body:JSON.stringify({code:t,id:r}),headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`[SDK][Posts] Failed to delete fragment: ${i.status}`);return i},onSuccess(r,n){let i=b();i.setQueryData(Ve(e,t).queryKey,o=>[...o??[]].filter(({id:s})=>s!==n.fragmentId)),i.setQueriesData({queryKey:["posts","fragments","infinite",e]},o=>o&&{...o,pages:o.pages.map(s=>({...s,data:s.data.filter(a=>a.id!==n.fragmentId)}))});}})}async function G(e){if(!e.ok){let r;try{r=await e.json();}catch{r=void 0;}let n=new Error(`Request failed with status ${e.status}`);throw n.status=e.status,n.data=r,n}let t=await e.text();if(!t||t.trim()==="")return "";try{return JSON.parse(t)}catch(r){return console.warn("[SDK] Failed to parse JSON response:",r,"Response:",t),""}}async function XP(e,t,r,n){let o=await w()(d.privateApiHost+"/private-api/account-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,email:t,referral:r,captcha_token:n})}),s=await G(o);return {status:o.status,data:s}}async function ZP(e){let r=await w()(d.privateApiHost+"/private-api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e})}),n=await G(r);return {status:r.status,data:n}}async function e0(e,t,r="",n=""){let i={code:e,ty:t};r&&(i.bl=r),n&&(i.tx=n);let s=await w()(d.privateApiHost+"/private-api/usr-activity",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});await G(s);}async function t0(e,t,r=null,n=null){let i={code:e};t&&(i.filter=t),r&&(i.since=r),n&&(i.user=n);let s=await w()(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});return G(s)}async function r0(e,t,r,n,i,o){let s={code:e,username:t,token:o,system:r,allows_notify:n,notify_types:i},u=await w()(d.privateApiHost+"/private-api/register-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function n0(e,t,r){let n={code:e,username:t,token:r},o=await w()(d.privateApiHost+"/private-api/detail-device",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function Ti(e,t){let r={code:e};t&&(r.id=t);let i=await w()(d.privateApiHost+"/private-api/notifications/mark",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ri(e,t){let r={code:e,url:t},i=await w()(d.privateApiHost+"/private-api/images-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}var Nu="https://i.ecency.com";async function Fi(e,t,r){let n=w(),i=new FormData;i.append("file",e);let o=await n(`${Nu}/hs/${t}`,{method:"POST",body:i,signal:r});return G(o)}async function i0(e,t,r,n){let i=w(),o=new FormData;o.append("file",e);let s=await i(`${d.imageHost}/${t}/${r}`,{method:"POST",body:o,signal:n});return G(s)}async function qi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/images-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ii(e,t,r,n,i){let o={code:e,title:t,body:r,tags:n,meta:i},a=await w()(d.privateApiHost+"/private-api/drafts-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});return G(a)}async function Di(e,t,r,n,i,o){let s={code:e,id:t,title:r,body:n,tags:i,meta:o},u=await w()(d.privateApiHost+"/private-api/drafts-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return G(u)}async function Ki(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/drafts-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Bi(e,t,r,n,i,o,s,a){let u={code:e,permlink:t,title:r,body:n,meta:i,schedule:s,reblog:a};o&&(u.options=o);let l=await w()(d.privateApiHost+"/private-api/schedules-add",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return G(l)}async function Mi(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function Ni(e,t){let r={code:e,id:t},i=await w()(d.privateApiHost+"/private-api/schedules-move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return G(i)}async function o0(e,t,r){let n={code:e,author:t,permlink:r},o=await w()(d.privateApiHost+"/private-api/promoted-post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}async function s0(e,t,r){let n={username:e,email:t,friend:r},o=await w()(d.privateApiHost+"/private-api/account-create-friend",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});return G(o)}function l0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","add",e],mutationFn:async({title:i,body:o,tags:s,meta:a})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addDraft");return Ii(t,i,o,s,a)},onSuccess:i=>{r?.();let o=b();i?.drafts?o.setQueryData(c.posts.drafts(e),i.drafts):o.invalidateQueries({queryKey:c.posts.drafts(e)}),o.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function y0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","update",e],mutationFn:async({draftId:i,title:o,body:s,tags:a,meta:u})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for updateDraft");return Di(t,i,o,s,a,u)},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:n})}function A0(e,t,r,n){return useMutation({mutationKey:["posts","drafts","delete",e],mutationFn:async({draftId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteDraft");return Ki(t,i)},onMutate:async({draftId:i})=>{if(!e)return;let o=b(),s=c.posts.drafts(e),a=c.posts.draftsInfinite(e);await Promise.all([o.cancelQueries({queryKey:s}),o.cancelQueries({queryKey:a})]);let u=o.getQueryData(s);u&&o.setQueryData(s,u.filter(f=>f._id!==i));let p=o.getQueriesData({queryKey:a}),l=new Map(p);for(let[f,m]of p)m&&o.setQueryData(f,{...m,pages:m.pages.map(y=>({...y,data:y.data.filter(h=>h._id!==i)}))});return {previousList:u,previousInfinite:l}},onSuccess:()=>{r?.();let i=b();i.invalidateQueries({queryKey:c.posts.drafts(e)}),i.invalidateQueries({queryKey:c.posts.draftsInfinite(e)});},onError:(i,o,s)=>{let a=b();if(s?.previousList&&a.setQueryData(c.posts.drafts(e),s.previousList),s?.previousInfinite)for(let[u,p]of s.previousInfinite)a.setQueryData(u,p);n?.(i);}})}function S0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","add",e],mutationFn:async({permlink:i,title:o,body:s,meta:a,options:u,schedule:p,reblog:l})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for addSchedule");return Bi(t,i,o,s,a,u,p,l)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function F0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","delete",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteSchedule");return Mi(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)});},onError:n})}function B0(e,t,r,n){return useMutation({mutationKey:["posts","schedules","move",e],mutationFn:async({id:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for moveSchedule");return Ni(t,i)},onSuccess:i=>{r?.();let o=b();i?o.setQueryData(c.posts.schedules(e),i):o.invalidateQueries({queryKey:c.posts.schedules(e)}),o.invalidateQueries({queryKey:c.posts.drafts(e)});},onError:n})}function U0(e,t,r,n){return useMutation({mutationKey:["posts","images","add",e],mutationFn:async({url:i,code:o})=>{let s=o??t;if(!e||!s)throw new Error("[SDK][Posts] \u2013 missing auth for addImage");return Ri(s,i)},onSuccess:()=>{r?.(),b().invalidateQueries({queryKey:c.posts.images(e)});},onError:n})}function W0(e,t,r,n){return useMutation({mutationKey:["posts","images","delete",e],mutationFn:async({imageId:i})=>{if(!e||!t)throw new Error("[SDK][Posts] \u2013 missing auth for deleteImage");return qi(t,i)},onSuccess:(i,o)=>{r?.();let s=b(),{imageId:a}=o;s.setQueryData(["posts","images",e],u=>u?.filter(p=>p._id!==a)),s.setQueriesData({queryKey:["posts","images","infinite",e]},u=>u&&{...u,pages:u.pages.map(p=>({...p,data:p.data.filter(l=>l._id!==a)}))});},onError:n})}function Y0(e,t){return useMutation({mutationKey:["posts","images","upload"],mutationFn:async({file:r,token:n,signal:i})=>Fi(r,n,i),onSuccess:e,onError:t})}function It(e,t){return `/@${e}/${t}`}function zu(e,t,r){return (r??b()).getQueryData(c.posts.entry(It(e,t)))}function Ju(e,t){(t??b()).setQueryData(c.posts.entry(It(e.author,e.permlink)),e);}function qt(e,t,r,n){let i=n??b(),o=It(e,t),s=i.getQueryData(c.posts.entry(o));if(!s)return;let a=r(s);return i.setQueryData(c.posts.entry(o),a),s}var Ne;(a=>{function e(u,p,l,f,m){qt(u,p,y=>({...y,active_votes:l,stats:{...y.stats||{gray:false,hide:false,flag_weight:0,total_votes:0},total_votes:l.length,flag_weight:y.stats?.flag_weight||0},total_votes:l.length,payout:f,pending_payout_value:String(f)}),m);}a.updateVotes=e;function t(u,p,l,f){qt(u,p,m=>({...m,reblogs:l}),f);}a.updateReblogsCount=t;function r(u,p,l,f){qt(u,p,m=>({...m,children:l}),f);}a.updateRepliesCount=r;function n(u,p,l,f){qt(p,l,m=>({...m,children:m.children+1,replies:[u,...m.replies]}),f);}a.addReply=n;function i(u,p){u.forEach(l=>Ju(l,p));}a.updateEntries=i;function o(u,p,l){(l??b()).invalidateQueries({queryKey:c.posts.entry(It(u,p))});}a.invalidateEntry=o;function s(u,p,l){return zu(u,p,l)}a.getEntry=s;})(Ne||={});function Yu(e,t,r){let n=e.some(i=>i.voter===t);return r!==0?n:!n}function Xu(e,t,r){let n=Ne.getEntry(t.author,t.permlink,r);if(!n?.active_votes||Yu(n.active_votes,e,t.weight))return;let i=[...n.active_votes.filter(s=>s.voter!==e),...t.weight!==0?[{rshares:t.weight,voter:e}]:[]],o=n.payout+(t.estimated??0);Ne.updateVotes(t.author,t.permlink,i,o,r);}function iO(e,t,r){return v(["posts","vote"],e,({author:n,permlink:i,weight:o})=>[fr(e,n,i,o)],async(n,i)=>{Xu(e,i);let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(120,o,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let s=()=>{t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.accounts.full(e)]);};(r??"async")==="async"?setTimeout(s,4e3):s();}},t,"posting",{broadcastMode:r??"async"})}function uO(e,t,r){return v(["posts","reblog"],e,({author:n,permlink:i,deleteReblog:o})=>[gr(e,n,i,o??false)],async(n,i)=>{let o=Ne.getEntry(i.author,i.permlink);if(o){let p=Math.max(0,(o.reblogs??0)+(i.deleteReblog?-1:1));Ne.updateReblogsCount(i.author,i.permlink,p);}let s=n?.id??n?.tx_id;t?.adapter?.recordActivity&&s&&t.adapter.recordActivity(130,s,n?.block_num).catch(()=>{});let a=()=>{b().invalidateQueries({queryKey:c.posts.accountPostsBlogPrefix(e)}),t?.adapter?.invalidateQueries&&t.adapter.invalidateQueries([c.posts.entry(`/@${i.author}/${i.permlink}`),c.posts.rebloggedBy(i.author,i.permlink)]);};(r??"async")==="async"?setTimeout(a,4e3):a();},t,"posting",{broadcastMode:r??"async"})}function fO(e,t,r){return v(["posts","comment"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=!i.parentAuthor,s=o?100:110,a=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&a&&t.adapter.recordActivity(s,a,n?.block_num).catch(()=>{}),t?.adapter?.invalidateQueries){let u=[c.accounts.full(e),c.resourceCredits.account(e)];if(!o){u.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let p=i.rootAuthor||i.parentAuthor,l=i.rootPermlink||i.parentPermlink;u.push({predicate:f=>{let m=f.queryKey;return Array.isArray(m)&&m[0]==="posts"&&m[1]==="discussions"&&m[2]===p&&m[3]===l}});}await t.adapter.invalidateQueries(u);}},t,"posting",{broadcastMode:r})}function yO(e,t,r,n){let i=n??b(),o=i.getQueriesData({predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="discussions"&&a[2]===t&&a[3]===r}});for(let[s,a]of o)a&&i.setQueryData(s,[e,...a]);}function Qi(e,t,r,n,i){let o=i??b(),s=new Map,a=o.getQueriesData({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===r&&p[3]===n}});for(let[u,p]of a)p&&(s.set(u,p),o.setQueryData(u,p.filter(l=>l.author!==e||l.permlink!==t)));return s}function Hi(e,t){let r=t??b();for(let[n,i]of e)r.setQueryData(n,i);}function hO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`,s=i.getQueryData(c.posts.entry(o));return s&&i.setQueryData(c.posts.entry(o),{...s,...r}),s}function wO(e,t,r,n){let i=n??b(),o=`/@${e}/${t}`;i.setQueryData(c.posts.entry(o),r);}function PO(e,t,r){return v(["posts","deleteComment"],e,({author:n,permlink:i})=>[mr(n,i)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e)];if(i.parentAuthor&&i.parentPermlink){o.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let s=i.rootAuthor||i.parentAuthor,a=i.rootPermlink||i.parentPermlink;o.push({predicate:u=>{let p=u.queryKey;return Array.isArray(p)&&p[0]==="posts"&&p[1]==="discussions"&&p[2]===s&&p[3]===a}});}await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r,onMutate:async n=>{let i=n.rootAuthor||n.parentAuthor,o=n.rootPermlink||n.parentPermlink;return i&&o?{snapshots:Qi(n.author,n.permlink,i,o)}:{}},onError:(n,i,o)=>{let{snapshots:s}=o??{};s&&Hi(s);}})}function SO(e,t,r){return v(["posts","cross-post"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,"",n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true}=n.options;i.push(De(n.author,n.permlink,o,s,a,u,[]));}return i},async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.accounts.full(e),{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.parentPermlink}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"async"})}function RO(e,t,r){return v(["posts","update-reply"],e,n=>{let i=[];if(i.push(Ie(n.author,n.permlink,n.parentAuthor,n.parentPermlink,n.title,n.body,n.jsonMetadata)),n.options){let{maxAcceptedPayout:o="1000000.000 HBD",percentHbd:s=1e4,allowVotes:a=true,allowCurationRewards:u=true,beneficiaries:p=[]}=n.options,l=[];if(p.length>0){let f=[...p].sort((m,y)=>m.account.localeCompare(y.account));l.push([0,{beneficiaries:f.map(m=>({account:m.account,weight:m.weight}))}]);}i.push(De(n.author,n.permlink,o,s,a,u,l));}return i},async(n,i)=>{let o=n?.id??n?.tx_id;if(t?.adapter?.recordActivity&&o&&t.adapter.recordActivity(110,o,n?.block_num).catch(s=>{console.debug("[SDK][Posts][useUpdateReply] recordActivity failed",{activityType:110,blockNum:n?.block_num,transactionId:o,error:s});}),t?.adapter?.invalidateQueries){let s=[c.resourceCredits.account(e)];s.push(c.posts.entry(`/@${i.parentAuthor}/${i.parentPermlink}`));let a=i.rootAuthor||i.parentAuthor,u=i.rootPermlink||i.parentPermlink;s.push({predicate:p=>{let l=p.queryKey;return Array.isArray(l)&&l[0]==="posts"&&l[1]==="discussions"&&l[2]===a&&l[3]===u}}),await t.adapter.invalidateQueries(s);}},t,"posting",{broadcastMode:r})}function DO(e,t,r){return v(["ecency","promote"],e,({author:n,permlink:i,duration:o})=>[Nr(e,n,i,o)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.posts._promotedPrefix],[...c.points._prefix(e)],c.posts.entry(`/@${i.author}/${i.permlink}`)]);},t,"active",{broadcastMode:r})}var Zu=[3e3,3e3,3e3],ep=e=>new Promise(t=>setTimeout(t,e));async function tp(e,t){return g("condenser_api.get_content",[e,t])}async function rp(e,t,r=0,n){let i=n?.delays??Zu,o;try{o=await tp(e,t);}catch{o=void 0;}if(o||r>=i.length)return;let s=i[r];return s>0&&await ep(s),rp(e,t,r+1,n)}var $e={};ft($e,{useRecordActivity:()=>Ur});function ip(){return typeof window<"u"&&window.location?{url:window.location.href,domain:window.location.host}:{url:"",domain:""}}function Ur(e,t,r){return useMutation({mutationKey:["analytics",t],mutationFn:async()=>{if(!t)throw new Error("[SDK][Analytics] \u2013 no activity type provided");let n=w(),i=ip(),o=r?.url??i.url,s=r?.domain??i.domain;try{await n(d.plausibleHost+"/api/event",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,url:o,domain:s,props:{username:e}})});}catch{}}})}function LO(e){return queryOptions({queryKey:["analytics","discover-leaderboard",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/leaderboard/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch leaderboard: ${r.status}`);return r.json()}})}function JO(e){return queryOptions({queryKey:["analytics","discover-curation",e],queryFn:async({signal:t})=>{let r=await fetch(d.privateApiHost+`/private-api/curation/${e}`,{signal:t});if(!r.ok)throw new Error(`Failed to fetch curation data: ${r.status}`);let n=await r.json(),i=n.map(s=>s.account),o=await g("condenser_api.get_accounts",[i]);for(let s=0;sa.efficiency-s.efficiency),n}})}function ex(e,t=[],r=["visitors","pageviews","visit_duration"],n){let i=[...t].sort(),o=[...r].sort();return queryOptions({queryKey:["analytics","page-stats",e,i,o,n],queryFn:async({signal:s})=>{let a=await fetch(d.privateApiHost+"/api/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,date_range:n}),signal:s});if(!a.ok)throw new Error(`Failed to fetch page stats: ${a.status}`);return a.json()},enabled:!!e,staleTime:0})}var Dt="threespeakfund",sx=1100;function cp(e){return /https?:\/\/([a-z0-9-]+\.)*3speak\.tv\/embed[?/]/i.test(e)}function ax(e,t){if(!cp(t))return e;let r=e.find(n=>n.account===Dt);return r&&r.weight===1100?e:r?e.map(n=>n.account===Dt?{...n,weight:1100}:n):[...e,{account:Dt,weight:1100}]}function cx(e){return e===Dt}var Lr={};ft(Lr,{getAccountTokenQueryOptions:()=>jr,getAccountVideosQueryOptions:()=>mp});var Vr={};ft(Vr,{getDecodeMemoQueryOptions:()=>lp});function lp(e,t,r){return queryOptions({queryKey:["integrations","hivesigner","decode-memo",e],queryFn:async()=>{if(r)return new Un.Client({accessToken:r}).decode(t)}})}var Ui={queries:Vr};function jr(e,t){return queryOptions({queryKey:["integrations","3speak","authenticate",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let n=await w()(`https://studio.3speak.tv/mobile/login?username=${e}&hivesigner=true`,{headers:{"Content-Type":"application/json"}}),i=Ui.queries.getDecodeMemoQueryOptions(e,(await n.json()).memo,t);await b().prefetchQuery(i);let{memoDecoded:o}=b().getQueryData(i.queryKey);return o.replace("#","")}})}function mp(e,t){return queryOptions({queryKey:["integrations","3speak","videos",e],enabled:!!e&&!!t,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Integrations][3Speak] \u2013\xA0anon user");let r=jr(e,t);await b().prefetchQuery(r);let n=b().getQueryData(r.queryKey);if(!n)throw new Error("[SDK][Integrations][3Speak] \u2013 missing account token");return await(await w()("https://studio.3speak.tv/mobile/api/my-videos",{headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}})).json()}})}var xx={queries:Lr};function Rx(e){return queryOptions({queryKey:["integrations","hiveposh","links",e],retry:false,queryFn:async()=>{try{let r=await w()(`https://hiveposh.com/api/v0/linked-accounts/${e}`,{headers:{"Content-Type":"application/json"}});if(r.status===400&&(await r.json().catch(()=>({})))?.message==="User Not Connected"||!r.ok)return null;let n=await r.json();return {twitter:{username:n.twitter_username,profile:n.twitter_profile},reddit:{username:n.reddit_username,profile:n.reddit_profile}}}catch{return null}}})}function Dx({url:e,dimensions:t=[],metrics:r=["visitors","pageviews","visit_duration"],filterBy:n="event:page",dateRange:i,enabled:o=true}){return queryOptions({queryKey:["integrations","plausible",e,t,r,n,i],queryFn:async()=>{let a=await w()(`${d.privateApiHost}/api/stats`,{method:"POST",body:JSON.stringify({metrics:r,url:encodeURIComponent(e),dimensions:t,filterBy:n,...i?{date_range:i}:{}}),headers:{"Content-Type":"application/json"}});if(!a.ok)throw new Error(`Failed to fetch Plausible stats: ${a.status}`);return await a.json()},enabled:!!e&&o,retry:1})}function Nx(){return queryOptions({queryKey:["resource-credits","stats"],queryFn:async()=>(await g("rc_api.get_rc_stats",{})).rc_stats})}function Vx(e){return queryOptions({queryKey:["resource-credits","account",e],queryFn:async()=>(await g("rc_api.find_rc_accounts",{accounts:[e]})).rc_accounts,enabled:!!e})}var Vi={ready:false,currentMana:0,maxMana:0,avgCost:0,estimatedCost:0,willLikelyFail:false,deficit:0,remaining:0};function $x({rcAccount:e,rcStats:t,operation:r,buffer:n=1.2}){if(!e||!t?.ops)return Vi;let{current_mana:i,max_mana:o}=Ot(e),s=Number(t.ops[r]?.avg_cost??0);if(!(s>0))return {...Vi,ready:true,currentMana:i,maxMana:o};let a=Number.isFinite(n)&&n>0?n:1.2,u=s*a,p=i{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/get-game",{method:"POST",body:JSON.stringify({game_type:r,code:t}),headers:{"Content-Type":"application/json"}})).json()}})}function tE(e,t,r,n){let{mutateAsync:i}=Ur(e,"spin-rolled");return useMutation({mutationKey:["games","post",r,e],mutationFn:async()=>{if(!e||!t)throw new Error("[SDK][Games] \u2013 missing auth");return await(await w()(d.privateApiHost+"/private-api/post-game",{method:"POST",body:JSON.stringify({game_type:r,code:t,key:n}),headers:{"Content-Type":"application/json"}})).json()},onSuccess(){i();}})}function oE(e){let t=e?.replace("@","");return queryOptions({queryKey:c.quests.status(t),enabled:!!t,queryFn:async()=>{if(!t)throw new Error("[SDK][Quests] \u2013 username wasn't provided");let n=await w()(d.privateApiHost+"/private-api/quests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t})});if(!n.ok)throw new Error(`Failed to fetch quests: ${n.status}`);return await n.json()},staleTime:3e4,refetchOnMount:true})}var Ap=[{id:"checkin",tier:"daily",goal:1,i18nKey:"checkin",icon:"check-circle"},{id:"post",tier:"daily",goal:1,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"daily",goal:3,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"daily",goal:10,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"daily",goal:1,i18nKey:"reblog",icon:"repeat"},{id:"spin",tier:"daily",goal:1,i18nKey:"spin",icon:"gift"},{id:"post",tier:"weekly",goal:5,i18nKey:"post",icon:"pencil"},{id:"comment",tier:"weekly",goal:15,i18nKey:"comment",icon:"comment"},{id:"vote",tier:"weekly",goal:50,i18nKey:"vote",icon:"chevron-up-circle"},{id:"reblog",tier:"weekly",goal:5,i18nKey:"reblog",icon:"repeat"},{id:"post",tier:"monthly",goal:20,i18nKey:"post",icon:"pencil"}];function aE(e,t){return Ap.find(r=>r.tier===e&&r.id===t)}var cE=300,uE=2;function xp(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}async function Ep(e){let r=await w()(d.privateApiHost+"/private-api/streak-freeze/buy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,idempotency_key:xp()})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to buy streak freeze: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function fE(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["streak-freeze","buy",n],mutationFn:async()=>{if(!n||!t)throw new Error("[SDK][StreakFreeze] \u2013 missing auth");return Ep(t)},onSuccess(){n&&r.invalidateQueries({queryKey:c.points._prefix(n)});},onSettled(){n&&r.invalidateQueries({queryKey:c.quests.status(n)});}})}function hE(e,t,r){return v(["communities","subscribe"],e,({community:n})=>[xr(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"async"})}function vE(e,t,r){return v(["communities","unsubscribe"],e,({community:n})=>[Er(e,n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.subscriptions(e),[...c.communities.singlePrefix(i.community)],c.communities.context(e,i.community)]);},t,"posting",{broadcastMode:r??"sync"})}function xE(e,t,r){return v(["communities","mutePost"],e,({community:n,author:i,permlink:o,notes:s,mute:a})=>[Tr(e,n,i,o,s,a)],async(n,i)=>{if(t?.adapter?.invalidateQueries){let o=[c.posts.entry(`/@${i.author}/${i.permlink}`),["community","single",i.community],{predicate:s=>{let a=s.queryKey;return Array.isArray(a)&&a[0]==="posts"&&a[1]==="posts-ranked"&&a[3]===i.community}}];await t.adapter.invalidateQueries(o);}},t,"posting",{broadcastMode:r??"sync"})}function CE(e,t,r,n){return v(["communities","set-role",e],t,({account:i,role:o})=>[Sr(t,e,i,o)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>{if(!a)return a;let u=[...a.team??[]],p=u.findIndex(([l])=>l===o.account);return p>=0?u[p]=[u[p][0],o.role,u[p][2]??""]:u.push([o.account,o.role,""]),{...a,team:u}}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)],c.communities.context(o.account,e)]);},r,"posting",{broadcastMode:n??"async"})}function qE(e,t,r,n){return v(["communities","update",e],t,i=>[kr(t,e,i)],async(i,o)=>{b().setQueriesData({queryKey:c.communities.singlePrefix(e)},a=>a&&{...a,...o}),r?.adapter?.invalidateQueries&&await r.adapter.invalidateQueries([[...c.communities.singlePrefix(e)]]);},r,"posting",{broadcastMode:n??"async"})}function BE(e,t,r){return v(["communities","registerRewards"],e,({name:n})=>[Qr(n)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([[...c.communities.singlePrefix(i.name)],[...c.points._prefix(e)]]);},t,"active",{broadcastMode:r})}function HE(e,t,r){return v(["communities","pin-post"],e,({community:n,account:i,permlink:o,pin:s})=>[Cr(e,n,i,o,s)],async(n,i)=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.posts.entry(`/@${i.account}/${i.permlink}`),[...c.communities.singlePrefix(i.community)]]);},t,"posting",{broadcastMode:r??"async"})}function $E(e,t,r=100,n=void 0,i=true){return queryOptions({queryKey:c.communities.list(e,t??"",r),enabled:i,queryFn:async()=>{let o=await g("bridge.list_communities",{last:"",limit:r,sort:e==="hot"?"rank":e,query:t||null,observer:n});return o?e==="hot"?o.sort(()=>Math.random()-.5):o:[]}})}function YE(e,t){return queryOptions({queryKey:c.communities.context(e,t),enabled:!!e&&!!t,queryFn:async()=>{let r=await g("bridge.get_community_context",{account:e,name:t});return {role:r?.role??"guest",subscribed:r?.subscribed??false}}})}function rS(e,t="",r=true){return queryOptions({queryKey:c.communities.single(e,t),enabled:r&&!!e,queryFn:async()=>ui(e??"",t)})}var ji=100;async function Li(e,t){return await g("bridge.list_subscribers",{community:e,limit:ji,...t?{last:t}:{}})??[]}function cS(e){return queryOptions({queryKey:c.communities.subscribers(e),queryFn:async()=>Li(e,null),staleTime:6e4})}function uS(e){return infiniteQueryOptions({queryKey:c.communities.subscribersInfinite(e),initialPageParam:null,queryFn:async({pageParam:t})=>Li(e,t),getNextPageParam:t=>t?.length>=ji?t[t.length-1]?.[0]??null:null,staleTime:6e4})}function gS(e,t){return infiniteQueryOptions({queryKey:c.communities.accountNotifications(e,t),initialPageParam:null,queryFn:async({pageParam:r})=>await g("bridge.account_notifications",{account:e,limit:t,last_id:r??void 0})??[],getNextPageParam:r=>r?.length>=t?r[r.length-1].id:null})}function _S(){return queryOptions({queryKey:c.communities.rewarded(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/rewarded-communities",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch rewarded communities: ${e.status}`);return e.json()}})}var Ip=(s=>(s.OWNER="owner",s.ADMIN="admin",s.MOD="mod",s.MEMBER="member",s.GUEST="guest",s.MUTED="muted",s))(Ip||{}),vS={owner:["admin","mod","member","guest","muted"],admin:["mod","member","guest","muted"],mod:["member","guest","muted"]};function PS(e,t){return e.startsWith("hive-3")||t===3?"Council":e.startsWith("hive-2")||t===2?"Journal":"Topic"}function OS({communityType:e,userRole:t,subscribed:r}){let n=t==="muted"?false:e==="Topic"?true:["owner","admin","mod","member"].includes(t),i=(()=>{if(t==="muted")return false;switch(e){case "Topic":return true;case "Journal":return t!=="guest"||r;case "Council":return n}})(),o=["owner","admin","mod"].includes(t);return {canPost:n,canComment:i,isModerator:o}}function kS(e,t){return queryOptions({queryKey:c.notifications.unreadCount(e),queryFn:async()=>t?(await(await fetch(`${d.privateApiHost}/private-api/notifications/unread`,{method:"POST",body:JSON.stringify({code:t}),headers:{"Content-Type":"application/json"}})).json()).count:0,enabled:!!e&&!!t,initialData:0,refetchInterval:6e4})}function FS(e,t,r=void 0){return infiniteQueryOptions({queryKey:c.notifications.list(e,r),queryFn:async({pageParam:n})=>{if(!t)return [];let i={code:t,filter:r,since:n,user:void 0},o=await fetch(d.privateApiHost+"/private-api/notifications",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!o.ok)return [];try{return await o.json()}catch{return []}},enabled:!!e&&!!t,initialData:{pages:[],pageParams:[]},initialPageParam:"",getNextPageParam:n=>n?.[n.length-1]?.id??"",refetchOnMount:true})}var Bp=(y=>(y.VOTES="rvotes",y.MENTIONS="mentions",y.FAVORITES="nfavorites",y.BOOKMARKS="nbookmarks",y.FOLLOWS="follows",y.REPLIES="replies",y.REBLOGS="reblogs",y.TRANSFERS="transfers",y.DELEGATIONS="delegations",y.PAYOUTS="payouts",y.SCHEDULED_PUBLISHED="scheduled_published",y.ACCOUNT_UPDATES="account_updates",y.WEEKLY_EARNINGS="weekly_earnings",y))(Bp||{});var Mp=(h=>(h[h.VOTE=1]="VOTE",h[h.MENTION=2]="MENTION",h[h.FOLLOW=3]="FOLLOW",h[h.COMMENT=4]="COMMENT",h[h.RE_BLOG=5]="RE_BLOG",h[h.TRANSFERS=6]="TRANSFERS",h[h.DELEGATIONS=10]="DELEGATIONS",h[h.FAVORITES=13]="FAVORITES",h[h.BOOKMARKS=15]="BOOKMARKS",h[h.PAYOUTS=19]="PAYOUTS",h[h.ACCOUNT_UPDATE=20]="ACCOUNT_UPDATE",h[h.WEEKLY_EARNINGS=21]="WEEKLY_EARNINGS",h[h.SCHEDULED_PUBLISHED=22]="SCHEDULED_PUBLISHED",h.ALLOW_NOTIFY="ALLOW_NOTIFY",h))(Mp||{}),$i=[1,2,3,4,5,6,10,13,15,19,20,21,22],Np=(n=>(n.ALL="All",n.UNREAD="Unread",n.READ="Read",n))(Np||{});function NS(e,t,r){return queryOptions({queryKey:c.notifications.settings(e),queryFn:async()=>{let n=e+"-web";if(!t)throw new Error("Missing access token");let i=await fetch(d.privateApiHost+"/private-api/detail-device",{body:JSON.stringify({code:t,username:e,token:n}),method:"POST",headers:{"Content-Type":"application/json"}});if(!i.ok)throw new Error(`Failed to fetch notification settings: ${i.status}`);return i.json()},enabled:!!e&&!!t,refetchOnMount:false,initialData:()=>({status:0,system:"web",allows_notify:0,notify_types:r?[]:[...$i]})})}function VS(){return queryOptions({queryKey:c.notifications.announcements(),queryFn:async()=>{let e=await fetch(d.privateApiHost+"/private-api/announcements",{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to fetch announcements: ${e.status}`);return await e.json()||[]},staleTime:36e5})}function WS(e){return queryOptions({queryKey:c.notifications.spotlights(),queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/spotlights",{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch spotlights: ${t.status}`);return await t.json()||[]},staleTime:36e5})}function jp(e,t){return {...e,read:!t||t===e.id?1:e.read}}function Wi(e){return typeof e=="object"&&e!==null&&"pages"in e&&"pageParams"in e&&Array.isArray(e.pages)}function ek(e,t,r,n){let i=b();return useMutation({mutationKey:["notifications","mark-read",e],mutationFn:async({id:o})=>{if(!e||!t){process.env.NODE_ENV!=="production"&&console.warn("[SDK][Notifications] \u2013 missing auth for markNotifications");return}return Ti(t,o)},onMutate:async({id:o})=>{if(!e||!t)return {previousData:[]};await i.cancelQueries({queryKey:c.notifications._prefix});let s=[],a=i.getQueriesData({queryKey:c.notifications._prefix,predicate:l=>{let f=l.state.data;return Wi(f)}});a.forEach(([l,f])=>{if(f&&Wi(f)){s.push([l,f]);let m={...f,pages:f.pages.map(y=>y.map(h=>jp(h,o)))};i.setQueryData(l,m);}});let u=c.notifications.unreadCount(e),p=i.getQueryData(u);return typeof p=="number"&&p>0&&(s.push([u,p]),o?a.some(([,f])=>f?.pages.some(m=>m.some(y=>y.id===o&&y.read===0)))&&i.setQueryData(u,p-1):i.setQueryData(u,0)),{previousData:s}},onSuccess:o=>{let s=typeof o=="object"&&o!==null?o.unread:void 0;typeof s=="number"&&i.setQueryData(c.notifications.unreadCount(e),s),r?.(s);},onError:(o,s,a)=>{a?.previousData&&a.previousData.forEach(([u,p])=>{i.setQueryData(u,p);}),n?.(o);},onSettled:()=>{i.invalidateQueries({queryKey:c.notifications._prefix});}})}function ik(e,t,r){return v(["notifications","set-last-read"],e,({date:n})=>br(e,n),async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.notifications.unreadCount(e)]);},t,"posting",{broadcastMode:r??"async"})}function ck(e){return queryOptions({queryKey:["proposals","proposal",e],queryFn:async()=>{let r=(await g("condenser_api.find_proposals",[[e]]))[0];return new Date(r.start_date)=new Date?r.status="active":new Date(r.end_date){let t=(await g("database_api.list_proposals",{start:[-1],limit:500,order:"by_total_votes",order_direction:"descending",status:"all"})).proposals,r=t.filter(i=>i.status==="expired");return [...t.filter(i=>i.status!=="expired"),...r]}})}function wk(e,t,r){return infiniteQueryOptions({queryKey:["proposals","votes",e,t,r],initialPageParam:t,refetchOnMount:true,staleTime:0,queryFn:async({pageParam:n})=>{let s=(await g("condenser_api.list_proposal_votes",[[e,n??t],r,"by_proposal_voter"])).filter(l=>l.proposal?.proposal_id===e).map(l=>({id:l.id,voter:l.voter})),a=await g("condenser_api.get_accounts",[s.map(l=>l.voter)]),u=kt(a);return s.map(l=>({...l,voterAccount:u.find(f=>l.voter===f.name)}))},getNextPageParam:n=>n?.[n.length-1]?.voter??void 0})}function Ak(e){return queryOptions({queryKey:["proposals","votes","by-user",e],enabled:!!e&&e!=="",staleTime:60*1e3,queryFn:async()=>!e||e===""?[]:((await g("database_api.list_proposal_votes",{start:[e],limit:1e3,order:"by_voter_proposal",order_direction:"ascending",status:"votable"})).proposal_votes||[]).filter(n=>n.voter===e)})}function Ek(e,t,r){return v(["proposals","vote"],e,({proposalIds:n,approve:i})=>[Or(e,n,i)],async n=>{try{let i=n?.id??n?.tx_id;t?.adapter?.recordActivity&&i&&t.adapter.recordActivity(150,i,n?.block_num).catch(o=>{console.debug("[SDK][Proposals][useProposalVote] recordActivity failed",{activityType:150,blockNum:n?.block_num,transactionId:i,error:o});}),t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.proposals.list(),c.proposals.votesByUser(e)]);}catch(i){console.warn("[useProposalVote] Post-broadcast side-effect failed:",i);}},t,"active",{broadcastMode:r})}function Tk(e,t,r){return v(["proposals","create"],e,n=>[Pr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.proposals.list()]);},t,"active",{broadcastMode:r})}function Ik(e,t=50){return infiniteQueryOptions({queryKey:["wallet","vesting-delegations",e,t],initialPageParam:"",queryFn:async({pageParam:r})=>{let n=r?t+1:t,i=await g("condenser_api.get_vesting_delegations",[e,r||"",n]);return r&&i.length>0&&i[0]?.delegatee===r?i.slice(1,t+1):i},getNextPageParam:r=>!r||r.lengthee("balance","/accounts/{account-name}/delegations",{"account-name":e},void 0,void 0,t)})}function Uk(e){return queryOptions({queryKey:["wallet","vesting-delegation-expirations",e],queryFn:async()=>e?(await g("database_api.find_vesting_delegation_expirations",{account:e})).delegations:[],enabled:!!e})}function $k(e){return queryOptions({queryKey:["wallet","conversion-requests",e],queryFn:()=>g("condenser_api.get_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function Jk(e){return queryOptions({queryKey:["wallet","collateralized-conversion-requests",e],queryFn:()=>g("condenser_api.get_collateralized_conversion_requests",[e]),select:t=>t.sort((r,n)=>r.requestid-n.requestid)})}function eC(e){return queryOptions({queryKey:["wallet","savings-withdraw",e],queryFn:()=>g("condenser_api.get_savings_withdraw_from",[e]),select:t=>t.sort((r,n)=>r.request_id-n.request_id)})}function iC(e){return queryOptions({queryKey:["wallet","withdraw-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"])})}function cC(e){return queryOptions({queryKey:["wallet","open-orders",e],queryFn:()=>g("condenser_api.get_open_orders",[e]),select:t=>t.sort((r,n)=>r.orderid-n.orderid),enabled:!!e})}function fC(e,t=100){return infiniteQueryOptions({queryKey:["wallet","outgoing-rc-delegations",e,t],initialPageParam:null,queryFn:async({pageParam:r})=>{let i=(await g("rc_api.list_rc_direct_delegations",{start:[e,r??""],limit:t}).then(o=>o)).rc_direct_delegations||[];return r&&(i=i.filter(o=>o.to!==r)),i},getNextPageParam:r=>r.length===t?r[r.length-1].to:null})}function hC(e){return queryOptions({queryKey:["wallet","incoming-rc",e],enabled:!!e,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] - Missing username for incoming RC");let r=await w()(`${d.privateApiHost}/private-api/received-rc/${e}`);if(!r.ok)throw new Error(`Failed to fetch incoming RC: ${r.status}`);return r.json()}})}function vC(e){return queryOptions({queryKey:["wallet","received-vesting-shares",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`);if(!t.ok)throw new Error(`Failed to fetch received vesting shares: ${t.status}`);return (await t.json()).list}})}function xC(e){return queryOptions({queryKey:["wallet","recurrent-transfers",e],queryFn:()=>g("condenser_api.find_recurrent_transfers",[e]),enabled:!!e})}function le(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}}function ae(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return;let r=Number.parseFloat(t);if(Number.isFinite(r))return r;let i=t.replace(/,/g,"").match(/[-+]?\d+(?:\.\d+)?/);if(i){let o=Number.parseFloat(i[0]);if(Number.isFinite(o))return o}}}function cl(e){if(!e||typeof e!="object")return;let t=e;return {name:le(t.name)??"",symbol:le(t.symbol)??"",layer:le(t.layer)??"hive",balance:ae(t.balance)??0,fiatRate:ae(t.fiatRate)??0,currency:le(t.currency)??"usd",precision:ae(t.precision)??3,address:le(t.address),error:le(t.error),pendingRewards:ae(t.pendingRewards),pendingRewardsFiat:ae(t.pendingRewardsFiat),liquid:ae(t.liquid),liquidFiat:ae(t.liquidFiat),savings:ae(t.savings),savingsFiat:ae(t.savingsFiat),staked:ae(t.staked),stakedFiat:ae(t.stakedFiat),iconUrl:le(t.iconUrl),actions:t.actions??[],extraData:t.extraData??[],apr:ae(t.apr)}}function ul(e){if(!e||typeof e!="object")return [];let t=[e],r=e;r.data&&typeof r.data=="object"&&t.push(r.data),r.result&&typeof r.result=="object"&&t.push(r.result),r.portfolio&&typeof r.portfolio=="object"&&t.push(r.portfolio);for(let n of t){if(Array.isArray(n))return n;if(n&&typeof n=="object")for(let i of ["wallets","tokens","assets","items","portfolio","balances"]){let o=n[i];if(Array.isArray(o))return o}}return []}function pl(e){if(!e||typeof e!="object")return;let t=e;return le(t.username)??le(t.name)??le(t.account)}function Gi(e,t="usd",r=true){return queryOptions({queryKey:["wallet","portfolio","v2",e,r?"only-enabled":"all",t],enabled:!!e,staleTime:6e4,refetchInterval:12e4,queryFn:async()=>{if(!e)throw new Error("[SDK][Wallet] \u2013 username is required");let n=`${N.getValidatedBaseUrl()}/wallet-api/portfolio-v2`,i=await fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({username:e,onlyEnabled:r,currency:t})});if(!i.ok)throw new Error(`[SDK][Wallet] \u2013 Portfolio request failed (${i.status})`);let o=await i.json(),s=ul(o).map(a=>cl(a)).filter(a=>!!a).filter(a=>a.layer!=="spk");if(!s.length)throw new Error("[SDK][Wallet] \u2013 Portfolio payload contained no tokens");return {username:pl(o)??e,currency:le(o?.fiatCurrency??o?.currency)?.toUpperCase(),wallets:s}}})}function Kt(e){return queryOptions({queryKey:["assets","hive","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey),n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??"");if(!r)return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:0};let o=C(r.balance).amount,s=C(r.savings_balance).amount;return {name:"HIVE",title:"Hive",price:Number.isFinite(i)?i:t?t.base/t.quote:0,accountBalance:o+s,parts:[{name:"current",balance:o},{name:"savings",balance:s}]}}})}function zi(e){return queryOptions({queryKey:["assets","hbd","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(M(e).queryKey),r=b().getQueryData(be().queryKey),n=1;return t?{name:"HBD",title:"Hive Dollar",price:n,accountBalance:C(t.hbd_balance).amount+C(t?.savings_hbd_balance).amount,apr:((r?.hbdInterestRate??0)/100).toFixed(3),parts:[{name:"current",balance:C(t.hbd_balance).amount},{name:"savings",balance:C(t.savings_hbd_balance).amount}]}:{name:"HBD",title:"Hive Dollar",price:n,accountBalance:0}}})}function ml(e){let u=9.5-(e.headBlock-7e6)/25e4*.01;u<.95&&(u=.95);let p=e.vestingRewardPercent/1e4,l=e.virtualSupply,f=e.totalVestingFund;return (l*u*p/f).toFixed(3)}function Ji(e){return queryOptions({queryKey:["assets","hive-power","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{await b().prefetchQuery(be()),await b().prefetchQuery(M(e));let t=b().getQueryData(be().queryKey),r=b().getQueryData(M(e).queryKey);if(!t||!r)return {name:"HP",title:"Hive Power",price:0,accountBalance:0};let n=await g("condenser_api.get_ticker",[]).catch(()=>{}),i=Number.parseFloat(n?.latest??""),o=Number.isFinite(i)?i:t.base/t.quote,s=C(r.vesting_shares).amount,a=C(r.delegated_vesting_shares).amount,u=C(r.received_vesting_shares).amount,p=C(r.vesting_withdraw_rate).amount,l=Math.max((Number(r.to_withdraw)-Number(r.withdrawn))/1e6,0),f=Wn(r.next_vesting_withdrawal)?0:Math.min(p,l),m=+Ue(s,t.hivePerMVests).toFixed(3),y=+Ue(a,t.hivePerMVests).toFixed(3),h=+Ue(u,t.hivePerMVests).toFixed(3),E=+Ue(l,t.hivePerMVests).toFixed(3),O=+Ue(f,t.hivePerMVests).toFixed(3),A=Math.max(m-E,0),P=Math.max(m-y,0);return {name:"HP",title:"Hive Power",price:o,accountBalance:+A.toFixed(3),apr:ml(t),parts:[{name:"hp_balance",balance:m},{name:"available",balance:+P.toFixed(3)},{name:"outgoing_delegations",balance:y},{name:"incoming_delegations",balance:h},...E>0?[{name:"pending_power_down",balance:+E.toFixed(3)}]:[],...O>0&&O!==E?[{name:"next_power_down",balance:+O.toFixed(3)}]:[]]}}})}var K=re.operations,$r={transfers:[K.transfer,K.transfer_to_savings,K.transfer_from_savings,K.cancel_transfer_from_savings,K.recurrent_transfer,K.fill_recurrent_transfer,K.escrow_transfer,K.fill_recurrent_transfer],"market-orders":[K.fill_convert_request,K.fill_order,K.fill_collateralized_convert_request,K.limit_order_create2,K.limit_order_create,K.limit_order_cancel],interests:[K.interest],"stake-operations":[K.return_vesting_delegation,K.withdraw_vesting,K.transfer_to_vesting,K.set_withdraw_vesting_route,K.update_proposal_votes,K.fill_vesting_withdraw,K.account_witness_proxy,K.delegate_vesting_shares],rewards:[K.author_reward,K.curation_reward,K.producer_reward,K.claim_reward_balance,K.comment_benefactor_reward,K.liquidity_reward,K.proposal_pay],"":[]};var JC=Object.keys(re.operations);var Yi=re.operations,ZC=Yi,eT=Object.entries(Yi).reduce((e,[t,r])=>(e[r]=t,e),{});var Xi=re.operations;function yl(e){return Object.prototype.hasOwnProperty.call(Xi,e)}function ut(e){let t=Array.isArray(e)?e:[e],r=t.includes(""),n=Array.from(new Set(t.filter(a=>a!=null&&a!==""))),i=r||n.length===0?"all":n.map(a=>a.toString()).sort().join("|"),o=new Set;r||n.forEach(a=>{if(a in $r){$r[a].forEach(u=>o.add(u));return}yl(a)&&o.add(Xi[a]);});let s=hl(Array.from(o));return {filterKey:i,filterArgs:s}}function hl(e){let t=0n,r=0n;return e.forEach(n=>{n<64?t|=1n<o?+(o[o.length-1]?.num??0)-1:-1,queryFn:async({pageParam:o})=>(await g("condenser_api.get_account_history",[e,o,t,...n])).map(a=>({num:a[0],type:a[1].op[0],timestamp:a[1].timestamp,trx_id:a[1].trx_id,...a[1].op[1]})),select:({pages:o,pageParams:s})=>({pageParams:s,pages:o.map(a=>a.filter(u=>{switch(u.type){case "author_reward":case "comment_benefactor_reward":return C(u.hive_payout).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(u.amount).symbol==="HIVE";case "transfer_from_savings":return C(u.amount).symbol==="HIVE";case "fill_recurrent_transfer":let l=C(u.amount);return ["HIVE"].includes(l.symbol);case "claim_reward_balance":return C(u.reward_hive).amount>0;case "curation_reward":case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":return true;case "limit_order_create2":return true;default:return false}}))})})}function lT(e,t=20,r=[]){let{filterKey:n}=ut(r);return infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hbd","transactions",e,t,n],select:({pages:i,pageParams:o})=>({pageParams:o,pages:i.map(s=>s.filter(a=>{switch(a.type){case "author_reward":case "comment_benefactor_reward":return C(a.hbd_payout).amount>0;case "claim_reward_balance":return C(a.reward_hbd).amount>0;case "transfer":case "transfer_to_savings":case "transfer_to_vesting":case "recurrent_transfer":return C(a.amount).symbol==="HBD";case "transfer_from_savings":return C(a.amount).symbol==="HBD";case "fill_recurrent_transfer":let l=C(a.amount);return ["HBD"].includes(l.symbol);case "cancel_transfer_from_savings":case "fill_order":case "limit_order_create":case "limit_order_cancel":case "fill_convert_request":case "fill_collateralized_convert_request":case "proposal_pay":case "interest":return true;case "limit_order_create2":return true;default:return false}}))})})}function yT(e,t=20,r=[]){let{filterKey:n}=ut(r),i=new Set(Array.isArray(r)?r:[r]),o=i.has("")||i.size===0;return infiniteQueryOptions({...Bt(e,t,r),queryKey:["assets","hive-power","transactions",e,t,n],select:({pages:s,pageParams:a})=>({pageParams:a,pages:s.map(u=>u.filter(p=>{switch(p.type){case "author_reward":case "comment_benefactor_reward":return C(p.vesting_payout).amount>0;case "claim_reward_balance":return C(p.reward_vests).amount>0;case "transfer_to_vesting":return true;case "transfer":case "transfer_to_savings":case "recurrent_transfer":return ["VESTS","HP"].includes(C(p.amount).symbol);case "fill_recurrent_transfer":let m=C(p.amount);return ["VESTS","HP"].includes(m.symbol);case "curation_reward":case "withdraw_vesting":case "delegate_vesting_shares":case "fill_vesting_withdraw":case "return_vesting_delegation":case "producer_reward":case "set_withdraw_vesting_route":return true;default:return o||i.has(p.type)}}))})})}function Zi(e){let t=r=>r.toString().padStart(2,"0");return `${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Wr(e,t){return new Date(e.getTime()-t*1e3)}function bT(e=86400){return infiniteQueryOptions({queryKey:["assets","hive","metrics",e],queryFn:async({pageParam:[t,r]})=>(await g("condenser_api.get_market_history",[e,Zi(t),Zi(r)])).map(({hive:i,non_hive:o,open:s})=>({close:o.close/i.close,open:o.open/i.open,low:o.low/i.low,high:o.high/i.high,volume:i.volume,time:new Date(s)})),initialPageParam:[Wr(new Date,Math.max(100*e,28800)),new Date],getNextPageParam:(t,r,[n])=>[Wr(n,Math.max(100*e,28800)),Wr(n,e)]})}function OT(e){return queryOptions({queryKey:["assets","hive","withdrawal-routes",e],queryFn:()=>g("condenser_api.get_withdraw_routes",[e,"outgoing"]),enabled:!!e})}function kT(e,t=50){return queryOptions({queryKey:["assets","hive-power","delegates",e],enabled:!!e,queryFn:()=>g("condenser_api.get_vesting_delegations",[e,"",t])})}function qT(e){return queryOptions({queryKey:["assets","hive-power","delegatings",e],queryFn:async()=>(await(await fetch(d.privateApiHost+`/private-api/received-vesting/${e}`,{headers:{"Content-Type":"application/json"}})).json()).list,select:t=>t.sort((r,n)=>C(n.vesting_shares).amount-C(r.vesting_shares).amount)})}function BT(e=500){return queryOptions({queryKey:["market","order-book",e],queryFn:()=>g("condenser_api.get_order_book",[e])})}function HT(){return queryOptions({queryKey:["market","statistics"],queryFn:()=>g("condenser_api.get_ticker",[])})}function LT(e,t,r){let n=i=>i.toISOString().replace(/\.\d{3}Z$/,"");return queryOptions({queryKey:["market","history",e,t.getTime(),r.getTime()],queryFn:()=>g("condenser_api.get_market_history",[e,n(t),n(r)])})}function zT(){return queryOptions({queryKey:["market","hive-hbd-stats"],queryFn:async()=>{let e=await g("condenser_api.get_ticker",[]),t=new Date,r=new Date(t.getTime()-864e5),n=s=>s.toISOString().replace(/\.\d{3}Z$/,""),i=await g("condenser_api.get_market_history",[86400,n(r),n(t)]);return {price:+e.latest,close:i[0]?i[0].non_hive.open/i[0].hive.open:0,high:i[0]?i[0].non_hive.high/i[0].hive.high:0,low:i[0]?i[0].non_hive.low/i[0].hive.low:0,percent:i[0]?100-i[0].non_hive.open/i[0].hive.open*100/+e.latest:0,totalFromAsset:e.hive_volume.split(" ")[0],totalToAsset:e.hbd_volume.split(" ")[0]}}})}function ZT(e,t,r,n){return queryOptions({queryKey:["market","data",e,t,r,n],queryFn:async({signal:i})=>{let o=w(),s=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,a=await o(s,{signal:i});if(!a.ok)throw new Error(`Failed to fetch market data: ${a.status}`);return a.json()}})}function eo(e){return e.toISOString().replace(/\.\d{3}Z$/,"")}function nR(e=1e3,t,r){let n=r??new Date,i=t??new Date(n.getTime()-600*60*1e3);return queryOptions({queryKey:["market","trade-history",e,i.getTime(),n.getTime()],queryFn:()=>g("condenser_api.get_trade_history",[eo(i),eo(n),e])})}function aR(){return queryOptions({queryKey:["market","feed-history"],queryFn:async()=>{try{return await g("condenser_api.get_feed_history",[])}catch(e){throw e}}})}function lR(){return queryOptions({queryKey:["market","current-median-history-price"],queryFn:async()=>{try{return await g("condenser_api.get_current_median_history_price",[])}catch(e){throw e}}})}function gR(e,t,r){return v(["market","limit-order-create"],e,n=>[Ft(e,n.amountToSell,n.minToReceive,n.fillOrKill,n.expiration,n.orderId)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function _R(e,t,r){return v(["market","limit-order-cancel"],e,({orderId:n})=>[Rr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.wallet.openOrders(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}async function pt(e){let t=await e.json();if(!e.ok){let r=new Error(`Request failed with status ${e.status}`);throw r.status=e.status,r.data=t,r}return t}async function AR(e,t,r,n){let i=w(),o=`https://api.coingecko.com/api/v3/coins/${e}/market_chart/range?vs_currency=${t}&from=${r}&to=${n}`,s=await i(o);return pt(s)}async function to(e){if(e==="hbd")return 1;let t=w(),r=`https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${e}`,n=await t(r);return (await pt(n)).hive_dollar[e]}async function PR(e,t){let n=await w()(d.privateApiHost+`/private-api/market-data/${e==="hbd"?"usd":e}/${t}`);return pt(n)}async function OR(){let t=await w()(d.privateApiHost+"/private-api/market-data/latest");return pt(t)}async function xR(){let t=await w()("https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd");return pt(t)}var Fl={"Content-type":"application/json"};async function ql(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-api`,{method:"POST",body:JSON.stringify(e),headers:Fl});if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 request failed with ${n.status}`);return (await n.json()).result}async function xe(e,t){try{return await ql(e)}catch{return t}}async function kR(e,t=50){let r={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:e},limit:t,offset:0},id:1},[n,i]=await Promise.all([xe({...r,params:{...r.params,table:"buyBook",indexes:[{index:"price",descending:true}]}},[]),xe({...r,params:{...r.params,table:"sellBook",indexes:[{index:"price",descending:false}]}},[])]),o=a=>a.sort((u,p)=>{let l=Number(u.price??0);return Number(p.price??0)-l}),s=a=>a.sort((u,p)=>{let l=Number(u.price??0),f=Number(p.price??0);return l-f});return {buy:o(n),sell:s(i)}}async function CR(e,t=50){return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"tradesHistory",query:{symbol:e},limit:t,offset:0,indexes:[{index:"timestamp",descending:true}]},id:1},[])}async function TR(e,t,r=100){let n={jsonrpc:"2.0",method:"find",params:{contract:"market",query:{symbol:t,account:e},limit:r,offset:0},id:1},[i,o]=await Promise.all([xe({...n,params:{...n.params,table:"buyBook",indexes:[{index:"timestamp",descending:true}]}},[]),xe({...n,params:{...n.params,table:"sellBook",indexes:[{index:"timestamp",descending:true}]}},[])]),s=(p,l)=>(Number(p||0)*Number(l||0)).toFixed(8),a=i.map(p=>({id:p.txId,type:"buy",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:p.tokensLocked??s(p.quantity,p.price),timestamp:Number(p.timestamp??0)})),u=o.map(p=>({id:p.txId,type:"sell",account:p.account,symbol:p.symbol,quantity:p.quantity,price:p.price,total:s(p.quantity,p.price),timestamp:Number(p.timestamp??0)}));return [...a,...u].sort((p,l)=>l.timestamp-p.timestamp)}async function Il(e,t){if(Array.isArray(e)&&e.length===0)return [];let r=Array.isArray(e)?{symbol:{$in:e}}:e?{symbol:e}:{};return xe({jsonrpc:"2.0",method:"find",params:{contract:"market",table:"metrics",query:{...r,...t?{account:t}:{}}},id:1},[])}async function We(e,t){return Il(t,e)}async function Mt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"balances",query:{account:e}},id:1},[])}async function Nt(e){return xe({jsonrpc:"2.0",method:"find",params:{contract:"tokens",table:"tokens",query:{symbol:{$in:e}}},id:2},[])}async function ro(e,t,r,n){let i=w(),o=N.getValidatedBaseUrl(),s=new URL("/private-api/engine-account-history",o);s.searchParams.set("account",e),s.searchParams.set("symbol",t),s.searchParams.set("limit",r.toString()),s.searchParams.set("offset",n.toString());let a=await i(s.toString(),{method:"GET",headers:{"Content-type":"application/json"}});if(!a.ok)throw new Error(`[SDK][HiveEngine] \u2013 account history failed with ${a.status}`);return await a.json()}async function no(e,t="daily"){let r=w(),n=N.getValidatedBaseUrl(),i=new URL("/private-api/engine-chart-api",n);i.searchParams.set("symbol",e),i.searchParams.set("interval",t);let o=await r(i.toString(),{headers:{"Content-type":"application/json"}});if(!o.ok)throw new Error(`[SDK][HiveEngine] \u2013 chart failed with ${o.status}`);return await o.json()}async function io(e){let t=w(),r=N.getValidatedBaseUrl(),n=await t(`${r}/private-api/engine-reward-api/${e}?hive=1`);if(!n.ok)throw new Error(`[SDK][HiveEngine] \u2013 rewards failed with ${n.status}`);return await n.json()}function Qt(e){return queryOptions({queryKey:["assets","hive-engine","balances",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Mt(e)})}function BR(){return queryOptions({queryKey:["assets","hive-engine","markets"],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>We()})}function oo(e){return queryOptions({queryKey:["assets","hive-engine","metadata-list",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>Nt(e)})}function jR(e,t,r=20){return infiniteQueryOptions({queryKey:["assets","hive-engine",t,"transactions",e],enabled:!!t&&!!e,initialPageParam:0,queryFn:async({pageParam:n})=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");return ro(e,t,r,n)},getNextPageParam:(n,i,o)=>(n?.length??0)===r?o+r:void 0,getPreviousPageParam:(n,i,o)=>o>0?o-r:void 0})}function GR(e,t="daily"){return queryOptions({queryKey:["assets","hive-engine",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>no(e,t)})}function XR(e){return queryOptions({queryKey:["assets","hive-engine","unclaimed",e],staleTime:6e4,refetchInterval:9e4,enabled:!!e,queryFn:async()=>{try{let t=await io(e);return Object.values(t).filter(({pending_token:r})=>r>0)}catch{return []}}})}function so(e,t){return queryOptions({queryKey:["assets","hive-engine","all-tokens",e,t],queryFn:async()=>We(e,t)})}function Ge(e,t=void 0){let r={fractionDigits:3,prefix:"",suffix:""};t&&(r={...r,...t});let{fractionDigits:n,prefix:i,suffix:o}=r,s="";i&&(s+=i+" ");let a=Math.abs(parseFloat(e.toString()))<1e-4?0:e,u=typeof a=="string"?parseFloat(a):a;return s+=u.toLocaleString("en-US",{minimumFractionDigits:n,maximumFractionDigits:n,useGrouping:true}),o&&(s+=" "+o),s}var Ht=class{symbol;name;icon;precision;stakingEnabled;delegationEnabled;balance;stake;stakedBalance;delegationsIn;delegationsOut;usdValue;constructor(t){this.symbol=t.symbol,this.name=t.name||"",this.icon=t.icon||"",this.precision=t.precision||0,this.stakingEnabled=t.stakingEnabled||false,this.delegationEnabled=t.delegationEnabled||false,this.balance=parseFloat(t.balance)||0,this.stake=parseFloat(t.stake)||0,this.delegationsIn=parseFloat(t.delegationsIn)||0,this.delegationsOut=parseFloat(t.delegationsOut)||0,this.stakedBalance=this.stake+this.delegationsIn-this.delegationsOut,this.usdValue=t.usdValue;}hasDelegations=()=>this.delegationEnabled?this.delegationsIn>0&&this.delegationsOut>0:false;delegations=()=>this.hasDelegations()?`(${Ge(this.stake,{fractionDigits:this.precision})} + ${Ge(this.delegationsIn,{fractionDigits:this.precision})} - ${Ge(this.delegationsOut,{fractionDigits:this.precision})})`:"";staked=()=>this.stakingEnabled?this.stakedBalance<1e-4?this.stakedBalance.toString():Ge(this.stakedBalance,{fractionDigits:this.precision}):"-";balanced=()=>this.balance<1e-4?this.balance.toString():Ge(this.balance,{fractionDigits:this.precision})};function uF(e,t,r){return queryOptions({queryKey:["assets","hive-engine","balances-with-usd",e,t,r],queryFn:async()=>{if(!e)throw new Error("[HiveEngine] No account in a balances query");let n=await Mt(e),i=await Nt(n.map(p=>p.symbol)),o=t?t.base/t.quote:0,s=Array.isArray(r)?r:[],a=n.map(p=>p.symbol).filter(p=>p!=="SWAP.HIVE"&&!s.some(l=>l.symbol===p)),u=[...s,...a.length?await We(void 0,a):[]];return n.map(p=>{let l=i.find(O=>O.symbol===p.symbol),f;if(l?.metadata)try{f=JSON.parse(l.metadata);}catch{f=void 0;}let m=u.find(O=>O.symbol===p.symbol),y=Number(m?.lastPrice??"0"),h=Number(p.balance),E=p.symbol==="SWAP.HIVE"?o*h:y===0?0:Number((y*o*h).toFixed(10));return new Ht({symbol:p.symbol,name:l?.name??p.symbol,icon:f?.icon??"",precision:l?.precision??0,stakingEnabled:l?.stakingEnabled??false,delegationEnabled:l?.delegationEnabled??false,balance:p.balance,stake:p.stake,delegationsIn:p.delegationsIn,delegationsOut:p.delegationsOut,usdValue:E})})},enabled:!!e})}function ao(e,t){return queryOptions({queryKey:["assets","hive-engine",t,"general-info",e],enabled:!!t&&!!e,staleTime:6e4,refetchInterval:9e4,queryFn:async()=>{if(!t||!e)throw new Error("[SDK][HiveEngine] \u2013 token or username missed");let r=b(),n=Kt(e);await r.prefetchQuery(n);let i=r.getQueryData(n.queryKey),o=await r.ensureQueryData(oo([t])),s=await r.ensureQueryData(Qt(e)),a=await r.ensureQueryData(so(void 0,t)),u=o?.find(O=>O.symbol===t),p=s?.find(O=>O.symbol===t),f=+(a?.find(O=>O.symbol===t)?.lastPrice??"0"),m=parseFloat(p?.balance??"0"),y=parseFloat(p?.stake??"0"),h=parseFloat(p?.pendingUnstake??"0"),E=[{name:"liquid",balance:m},{name:"staked",balance:y}];return h>0&&E.push({name:"unstaking",balance:h}),{name:t,title:u?.name??"",price:f===0?0:Number(f*(i?.price??0)),accountBalance:m+y,layer:"ENGINE",parts:E}}})}function lt(e,t=0){return queryOptions({queryKey:["points",e,t],queryFn:async()=>{if(!e)throw new Error("Get points query \u2013 username wasn't provided");let r=e.replace("@",""),n=await fetch(d.privateApiHost+"/private-api/points",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r})});if(!n.ok)throw new Error(`Failed to fetch points: ${n.status}`);let i=await n.json(),o=await fetch(d.privateApiHost+"/private-api/point-list",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:r,type:t})});if(!o.ok)throw new Error(`Failed to fetch point transactions: ${o.status}`);let s=await o.json();return {points:i.points,uPoints:i.unclaimed_points,transactions:s}},staleTime:3e4,refetchOnMount:true,enabled:!!e})}function co(e){return queryOptions({queryKey:["assets","points","general-info",e],staleTime:6e4,refetchInterval:9e4,queryFn:async()=>(await b().prefetchQuery(lt(e)),{name:"POINTS",title:"Ecency Points",price:.002,accountBalance:+(b().getQueryData(lt(e).queryKey)?.points??0)})})}function SF(e,t){return queryOptions({queryKey:["assets","points","transactions",e,t],queryFn:async()=>(await(await fetch(`${d.privateApiHost}/private-api/point-list`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,type:t??0})})).json()).map(({created:i,type:o,amount:s,id:a,sender:u,receiver:p,memo:l})=>({created:new Date(i),type:o,results:[{amount:parseFloat(s),asset:"POINTS"}],id:a,from:u??void 0,to:p??void 0,memo:l??void 0}))})}function NF(e,t,r={refetch:false}){let n=b(),i=r.currency??"usd",o=async p=>(r.refetch?await n.fetchQuery(p):await n.prefetchQuery(p),n.getQueryData(p.queryKey)),s=async p=>{if(!p||i==="usd")return p;try{let l=await to(i);return {...p,price:p.price*l}}catch(l){return console.warn(`Failed to convert price from USD to ${i}:`,l),p}},a=Gi(e,i,true),u=async()=>{try{let l=(await n.fetchQuery(a)).wallets.find(m=>m.symbol.toUpperCase()===t.toUpperCase());if(!l)return;let f=[];if(l.liquid!==void 0&&l.liquid!==null&&f.push({name:"liquid",balance:l.liquid}),l.staked!==void 0&&l.staked!==null&&l.staked>0&&f.push({name:"staked",balance:l.staked}),l.savings!==void 0&&l.savings!==null&&l.savings>0&&f.push({name:"savings",balance:l.savings}),l.extraData&&Array.isArray(l.extraData))for(let m of l.extraData){if(!m||typeof m!="object")continue;let y=m.dataKey,h=m.value;if(typeof h=="string"){let O=h.replace(/,/g,"").match(/[+-]?\s*(\d+(?:\.\d+)?)/);if(O){let A=Math.abs(Number.parseFloat(O[1]));y==="delegated_hive_power"?f.push({name:"outgoing_delegations",balance:A}):y==="received_hive_power"?f.push({name:"incoming_delegations",balance:A}):y==="powering_down_hive_power"&&f.push({name:"pending_power_down",balance:A});}}}return {name:l.symbol,title:l.name,price:l.fiatRate,accountBalance:l.balance,apr:l.apr?.toString(),layer:l.layer,pendingRewards:l.pendingRewards,parts:f}}catch{return}};return queryOptions({queryKey:["ecency-wallets","asset-info",e,t,i],queryFn:async()=>{let p=await u();if(p&&p.price>0)return p;let l;if(t==="HIVE")l=await o(Kt(e));else if(t==="HP")l=await o(Ji(e));else if(t==="HBD")l=await o(zi(e));else if(t==="POINTS")l=await o(co(e));else if((await n.ensureQueryData(Qt(e))).some(m=>m.symbol===t))l=await o(ao(e,t));else {if(p)return p;throw new Error(`[SDK][Wallet] \u2013 unrecognized asset "${t}"`)}if(p&&l&&l.price>0){let f=await s(l);return {...p,price:f.price}}return await s(l)}})}var Gl=(A=>(A.Transfer="transfer",A.TransferToSavings="transfer-saving",A.WithdrawFromSavings="withdraw-saving",A.Delegate="delegate",A.PowerUp="power-up",A.PowerDown="power-down",A.WithdrawRoutes="withdraw-routes",A.ClaimInterest="claim-interest",A.Swap="swap",A.Convert="convert",A.Gift="gift",A.Promote="promote",A.Claim="claim",A.Buy="buy",A.Stake="stake",A.Unstake="unstake",A.Undelegate="undelegate",A))(Gl||{});function LF(e,t,r){return v(["wallet","transfer"],e,n=>[Ke(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function JF(e,t,r){return v(["wallet","transfer-point"],e,n=>[Le(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function tq(e,t,r){return v(["wallet","delegate-vesting-shares"],e,n=>[st(e,n.delegatee,n.vestingShares)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.delegatee),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function sq(e,t,r){return v(["wallet","set-withdraw-vesting-route"],e,n=>[at(e,n.toAccount,n.percent,n.autoVest)],async(n,i)=>{await S(t?.adapter,r,[c.wallet.withdrawRoutes(e),c.accounts.full(e),c.accounts.full(i.toAccount)]);},t,"active",{broadcastMode:r})}function pq(e,t,r){return v(["wallet","transfer-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"transfer",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity,memo:n.memo}});return [["custom_json",{required_auths:[e],required_posting_auths:[],id:"ssc-mainnet-hive",json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function gq(e,t,r){return v(["wallet","transfer-to-savings"],e,n=>[je(e,n.to,n.amount,n.memo)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function bq(e,t,r){return v(["wallet","transfer-from-savings"],e,n=>[Be(e,n.to,n.amount,n.memo,n.requestId)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function xq(e,t,r){return v(["wallet","transfer-to-vesting"],e,n=>[it(e,n.to,n.amount)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Tq(e,t,r){return v(["wallet","withdraw-vesting"],e,n=>[ot(e,n.vestingShares)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Dq(e,t,r){return v(["wallet","convert"],e,n=>[n.collateralized?yr(e,n.amount,n.requestId):ct(e,n.amount,n.requestId)],async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Qq(e,t,r){return v(["wallet","claim-interest"],e,n=>nt(e,n.to,n.amount,n.memo,n.requestId),async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}var zl=5e3,Ut=new Map;function Lq(e,t,r){return v(["wallet","claim-rewards"],e,n=>[Fr(e,n.rewardHive,n.rewardHbd,n.rewardVests)],()=>{let n=e??"__anonymous__",i=[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e],c.assets.hiveGeneralInfo(e),c.assets.hbdGeneralInfo(e),c.assets.hivePowerGeneralInfo(e)],o=Ut.get(n);o&&(clearTimeout(o),Ut.delete(n));let s=setTimeout(async()=>{try{let a=b(),p=(await Promise.allSettled(i.map(l=>a.invalidateQueries({queryKey:l})))).filter(l=>l.status==="rejected");p.length>0&&console.error("[SDK][Wallet][useClaimRewards] delayed invalidation rejected",{username:e,rejectedCount:p.length,rejected:p});}catch(a){console.error("[SDK][Wallet][useClaimRewards] delayed invalidation failed",{username:e,error:a});}finally{Ut.delete(n);}},zl);Ut.set(n,s);},t,"posting",{broadcastMode:r})}function zq(e,t,r){return v(["wallet","delegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"delegate",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Zq(e,t,r){return v(["wallet","undelegate-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"undelegate",contractPayload:{symbol:n.symbol,from:n.from,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function nI(e,t,r){return v(["wallet","stake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"stake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function aI(e,t,r){return v(["wallet","unstake-engine-token"],e,n=>{let i=JSON.stringify({contractName:"tokens",contractAction:"unstake",contractPayload:{symbol:n.symbol,to:n.to,quantity:n.quantity}});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function lI(e,t,r){return v(["wallet","claim-engine-rewards"],e,n=>{let i=JSON.stringify(n.tokens.map(o=>({symbol:o})));return [["custom_json",{id:"scot_claim_token",required_auths:[],required_posting_auths:[e],json:i}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"posting",{broadcastMode:r})}function gI(e,t,r){return v(["wallet","engine-market-order"],e,n=>{let i,o;n.action==="cancel"?(o="cancel",i={type:n.orderType,id:n.orderId}):(o=n.action,i={symbol:n.symbol,quantity:n.quantity,price:n.price});let s=JSON.stringify({contractName:"market",contractAction:o,contractPayload:i});return [["custom_json",{id:"ssc-mainnet-hive",required_auths:[e],required_posting_auths:[],json:s}]]},async()=>{await S(t?.adapter,r,[c.accounts.full(e),["ecency-wallets","asset-info",e],["wallet","portfolio","v2",e]]);},t,"active",{broadcastMode:r})}function Jl(e,t,r){let{from:n,to:i="",amount:o="",memo:s=""}=r,a=r.request_id??Date.now()>>>0;switch(e){case "HIVE":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "power-up":return [it(n,i,o)]}break;case "HBD":switch(t){case "transfer":return [Ke(n,i,o,s)];case "transfer-saving":return [je(n,i,o,s)];case "withdraw-saving":return [Be(n,i,o,s,a)];case "claim-interest":return nt(n,i,o,s,a);case "convert":return [ct(n,o,Math.floor(Date.now()/1e3))]}break;case "HP":switch(t){case "power-down":return [ot(n,o)];case "delegate":return [st(n,i,o)];case "withdraw-routes":return [at(r.from_account??n,r.to_account??i,r.percent??0,r.auto_vest??false)]}break;case "POINTS":if(t==="transfer"||t==="gift")return [Le(n,i,o,s)];break}return null}function Yl(e,t,r){let{from:n,to:i="",amount:o=""}=r,s=typeof o=="string"&&o.includes(" ")?o.split(" ")[0]:String(o);switch(t){case "transfer":return [Me(n,"transfer",{symbol:e,to:i,quantity:s,memo:r.memo??""})];case "stake":return [Me(n,"stake",{symbol:e,to:i,quantity:s})];case "unstake":return [Me(n,"unstake",{symbol:e,to:i,quantity:s})];case "delegate":return [Me(n,"delegate",{symbol:e,to:i,quantity:s})];case "undelegate":return [Me(n,"undelegate",{symbol:e,from:i,quantity:s})];case "claim":return [hr(n,[e])]}return null}function Xl(e){return e==="claim"?"posting":"active"}function vI(e,t,r,n,i){let{mutateAsync:o}=$e.useRecordActivity(e,r);return v(["ecency-wallets",t,r],e,s=>{let a=Jl(t,r,s);if(a)return a;let u=Yl(t,r,s);if(u)return u;throw new Error(`[SDK][Wallet] \u2013 no operation builder for asset="${t}" operation="${r}"`)},()=>{o();let s=[];s.push(["ecency-wallets","asset-info",e,t]),t==="HIVE"&&s.push(["ecency-wallets","asset-info",e,"HP"]),s.push(["wallet","portfolio","v2",e]),setTimeout(()=>{s.forEach(a=>{b().invalidateQueries({queryKey:a});});},5e3);},n,Xl(r),{broadcastMode:i})}function xI(e,t,r){return v(["wallet","delegate-rc"],e,({to:n,maxRc:i})=>[wr(e,n,i)],async(n,i)=>{await S(t?.adapter,r,[c.accounts.full(e),c.accounts.full(i.to),c.resourceCredits.account(e),c.resourceCredits.account(i.to)]);},t,"active",{broadcastMode:r})}function CI(e,t,r){return v(["witnesses","vote"],e,({witness:n,approve:i})=>[vr(e,n,i)],async()=>{try{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.votes(e)]);}catch(n){console.warn("[useWitnessVote] Post-broadcast side-effect failed:",n);}},t,"active",{broadcastMode:r})}function qI(e,t,r){return v(["witnesses","proxy"],e,({proxy:n})=>[Ar(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.witnesses.proxy()]);},t,"active",{broadcastMode:r})}function ed(e){return {owner:e.witness_name,total_missed:e.missed_blocks,url:e.url,props:{account_creation_fee:`${(e.account_creation_fee/1e3).toFixed(3)} HIVE`,account_subsidy_budget:0,maximum_block_size:e.block_size},hbd_exchange_rate:{base:`${e.price_feed.toFixed(3)} HBD`},available_witness_account_subsidies:0,running_version:e.version,signing_key:e.signing_key,last_hbd_exchange_update:e.feed_updated_at,rank:e.rank,vests:e.vests,voters_num:e.voters_num,voters_num_daily_change:e.voters_num_daily_change,price_feed:e.price_feed,hbd_interest_rate:e.hbd_interest_rate,last_confirmed_block_num:e.last_confirmed_block_num}}function NI(e){return infiniteQueryOptions({queryKey:c.witnesses.list(e),initialPageParam:1,queryFn:async({pageParam:t})=>(await ee("hafbe","/witnesses",{"page-size":e,page:t})).witnesses.map(ed),getNextPageParam:(t,r,n)=>t.length===e?n+1:void 0})}function QI(e,t,r,n="vests",i="desc"){return queryOptions({queryKey:c.witnesses.voters(e,t,r,n,i),queryFn:async({signal:o})=>await ee("hafbe","/witnesses/{witness-name}/voters",{"witness-name":e,"page-size":r,page:t,sort:n,direction:i},void 0,void 0,o),enabled:!!e,staleTime:6e4})}function HI(e){return queryOptions({queryKey:c.witnesses.voterCount(e),queryFn:async()=>await ee("hafbe","/witnesses/{witness-name}/voters/count",{"witness-name":e}),enabled:!!e,staleTime:6e4})}var td=(h=>(h[h.CHECKIN=10]="CHECKIN",h[h.LOGIN=20]="LOGIN",h[h.CHECKIN_EXTRA=30]="CHECKIN_EXTRA",h[h.POST=100]="POST",h[h.COMMENT=110]="COMMENT",h[h.VOTE=120]="VOTE",h[h.REBLOG=130]="REBLOG",h[h.DELEGATION=150]="DELEGATION",h[h.REFERRAL=160]="REFERRAL",h[h.COMMUNITY=170]="COMMUNITY",h[h.TRANSFER_SENT=998]="TRANSFER_SENT",h[h.TRANSFER_INCOMING=999]="TRANSFER_INCOMING",h[h.MINTED=991]="MINTED",h[h.BURNED=997]="BURNED",h))(td||{});async function nd(e,t){if(!e)throw new Error("[SDK][Points][Claim] \u2013 username wasn't provided");if(!t)throw new Error("[SDK][Points][Claim] \u2013 access token wasn't found");let n=await w()(d.privateApiHost+"/private-api/points-claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t})}),i=(n.headers.get("content-type")??"").split(";")[0].trim().toLowerCase(),o=await n.text();if(!n.ok){if(n.status===406)try{return JSON.parse(o)}catch{return {message:o,code:n.status}}let s=o&&i.includes("json")?`: ${o.slice(0,200)}`:"";throw new Error(`[SDK][Points][Claim] \u2013 failed with status ${n.status}${s}`)}if(!i.includes("json"))throw new Error(`[SDK][Points][Claim] \u2013 expected JSON but received "${i||"empty"}" response (status ${n.status})`);try{return JSON.parse(o)}catch{throw new Error(`[SDK][Points][Claim] \u2013 malformed JSON response (status ${n.status})`)}}function GI(e,t,r,n){let{mutateAsync:i}=$e.useRecordActivity(e,"points-claimed");return useMutation({mutationFn:()=>nd(e,t),onError:n,onSuccess:()=>{i(),b().setQueryData(lt(e).queryKey,o=>o&&{...o,points:(parseFloat(o.points)+parseFloat(o.uPoints)).toFixed(3),uPoints:"0"}),r?.();}})}var po=/(^|\s)author:([^\s]+)/g,lo=/(^|\s)type:([^\s]+)/g,fo=/(^|\s)category:([^\s]+)/g,mo=/(^|\s)tag:([^\s]+)/g;var yo=(n=>(n.ALL="",n.POST="post",n.COMMENT="comment",n))(yo||{}),JI=5,YI=100;function ho(e){return e.trim().split(/\s+/)[0]??""}function id(e){return ho(e).replace(/^@+/,"").toLowerCase()}function od(e){return ho(e).replace(/^#+/,"").toLowerCase()}function sd(e){let t=new Set;return e.split(/[\s,]+/).map(r=>r.replace(/^#+/,"").toLowerCase()).filter(r=>r===""||t.has(r)?false:(t.add(r),true))}function XI({search:e="",author:t="",type:r="",category:n="",tags:i=[]}){let o=e.trim().replace(/\s+/g," "),s=id(t),a=od(n),u=sd(Array.isArray(i)?i.join(","):i),p=[o];return s&&p.push(`author:${s}`),r&&p.push(`type:${r}`),a&&p.push(`category:${a}`),u.length>0&&p.push(`tag:${u.join(",")}`),{q:p.filter(l=>l!=="").join(" "),search:o,author:s,type:r,category:a,tags:u}}var go=class{query="";search="";author="";type="";category="";tags=[];constructor(t){this.query=t,this.search=t,this.grabAuthor(),this.grabType(),this.grabCategory(),this.grabTags(),this.grabSearch();}grab=t=>{let r=[...this.query.matchAll(t)];return r.length>0?r[0][2].trim():""};grabAuthor=()=>{this.author=this.grab(po);};grabType=()=>{let t=this.grab(lo);Object.values(yo).includes(t)&&(this.type=t);};grabCategory=()=>{this.category=this.grab(fo);};grabTags=()=>{let t=new Set;this.tags=[...this.query.matchAll(mo)].flatMap(r=>r[2].split(",")).map(r=>r.trim()).filter(r=>r===""||t.has(r)?false:(t.add(r),true));};grabSearch=()=>{for([po,lo,fo,mo].forEach(t=>{this.search=this.search.replace(t,"$1");});this.search.indexOf(" ")!==-1;)this.search=this.search.replace(" "," ");this.search=this.search.trim();}};async function ve(e,t){let n=await(async()=>{let i;try{i=await e.text();}catch{return}if(i!=="")try{return JSON.parse(i)}catch{return e.ok?void 0:i}})();if(!e.ok){let i=new Error(`Request failed with status ${e.status}`);throw i.status=e.status,i.data=n,i}if(n===void 0||t!==void 0&&!t(n))throw new Error("Response body was empty, invalid JSON, or not the expected shape");return n}function Ee(e){return typeof e=="object"&&e!==null&&Array.isArray(e.results)}var cd=isServer?0:3;function dt(e,t){let{status:r}=t,n=r===408||r===429;return r!==void 0&&r>=400&&r<500&&!n?false:e{let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let u=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(u,Ee)},retry:dt})}function uD(e,t,r=true){return infiniteQueryOptions({queryKey:c.search.controversialRising(e,t),initialPageParam:{sid:void 0,hasNextPage:true},queryFn:async({pageParam:n,signal:i})=>{if(!n.hasNextPage)return {hits:0,took:0,results:[]};let o,s=new Date;switch(t){case "today":o=new Date(s.getTime()-1440*60*1e3);break;case "week":o=new Date(s.getTime()-10080*60*1e3);break;case "month":o=new Date(s.getTime()-720*60*60*1e3);break;case "year":o=new Date(s.getTime()-365*24*60*60*1e3);break;default:o=void 0;}let a="* type:post",u=e==="rising"?"children":e,p=o?o.toISOString().split(".")[0]:void 0,l="0",f=t==="today"?50:200,m={q:a,sort:u,hide_low:l};p&&(m.since=p),n.sid&&(m.scroll_id=n.sid),(m.votes=f);let y=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(m),signal:we(_e,i)});return ve(y,Ee)},getNextPageParam:n=>({sid:n?.scroll_id,hasNextPage:n.results.length>0}),enabled:r,retry:dt})}async function fD(e,t,r,n,i,o,s){let a={q:e,sort:t,hide_low:r};n&&(a.since=n),i&&(a.scroll_id=i),o&&(a.votes=o);let p=await w()(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(a),signal:we(_e,s)});return ve(p,Ee)}async function wo(e,t,r=_e){let i=await w()(d.privateApiHost+"/search-api/similar",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(e),signal:we(r,t)});return ve(i,Ee)}async function mD(e,t){let n=await w()(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e}),signal:we(_e,t)}),i=await ve(n,Array.isArray);return i?.length>0?i:[e]}var dd=4368*60*60*1e3,fd=4,md=3e3,gd=2e3,yd=4e3,_D=2;function hd(e,t){return e.replace(/!\[[^\]]*\]\([^)]*\)/g," ").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim().slice(0,t)}function wd(e){let t=5381;for(let r=0;r>>0).toString(36)}function bD(e){let t=e.title??"",r=e.json_metadata?.tags,n=(Array.isArray(r)?r:[]).filter(s=>typeof s=="string"&&s!==""),i=hd(e.body??"",md),o=wd(`${t}|${n.join(",")}|${i}`);return queryOptions({queryKey:c.search.similarEntries(e.author,e.permlink,o),queryFn:async({signal:s})=>{let a=new Date(Date.now()-dd).toISOString().slice(0,19),u=await wo({author:e.author,permlink:e.permlink,title:t,body:i,tags:n,since:a},s,typeof window>"u"?gd:yd),p=[],l=new Set;for(let f of u.results){if(p.length>=fd)break;f.permlink!==e.permlink&&(f.tags??[]).indexOf("nsfw")===-1&&(l.has(f.author)||(l.add(f.author),p.push(f)));}return p},staleTime:300*1e3,retry:false})}function ED(e,t=5){let r=e.trim();return queryOptions({queryKey:c.search.account(r,t),queryFn:async()=>{let n=await g("condenser_api.lookup_accounts",[r,t]);return n.length===0?[]:Ct(n)},enabled:!!r})}function RD(e,t=10){let r=e.trim();return queryOptions({queryKey:c.search.topics(r,t),queryFn:async()=>(await g("condenser_api.get_trending_tags",[r,t+1])).map(i=>i.name).filter(i=>i!==""&&!i.startsWith("hive-")).slice(0,t),enabled:!!r})}function BD(e,t,r,n,i,o){return infiniteQueryOptions({queryKey:c.search.api(e,t,r,n,i,o),queryFn:async({pageParam:s,signal:a})=>{let u={q:e,sort:t,hide_low:r};n&&(u.since=n),s&&(u.scroll_id=s),i!==void 0&&(u.votes=i),o&&(u.include_nsfw=1);let p=await fetch(d.privateApiHost+"/search-api/search",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify(u),signal:we(_e,a)});return ve(p,Ee)},initialPageParam:void 0,getNextPageParam:s=>s?.scroll_id,enabled:!!e,retry:dt})}function HD(e){return queryOptions({queryKey:["search","path",e],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/search-api/search-path",{method:"POST",headers:{"Content-Type":"application/json","X-Ecency-Client":d.clientId},body:JSON.stringify({q:e})});if(!t.ok)throw new Error(`Search path failed: ${t.status}`);let r=await t.json();return r?.length>0?r:[e]}})}async function Od(e){let r=await w()(d.privateApiHost+"/private-api/support-settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let n;try{n=await r.json();}catch{}let i=n?.message??`Failed to fetch support settings: ${r.status}`,o=new Error(i);throw o.status=r.status,o.data=n,o}return await r.json()}function LD(e,t){let r=e?.replace("@","");return queryOptions({queryKey:c.support.settings(r),queryFn:()=>{if(!t)throw new Error("[SDK][Support] missing auth");return Od(t)},enabled:!!r&&!!t})}async function Sd(e,t){let n=await w()(d.privateApiHost+"/private-api/support-settings-update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,beneficiary_percent:t.beneficiary_percent,curation_percent:t.curation_percent})});if(!n.ok){let i;try{i=await n.json();}catch{}let o=i?.message??`Failed to update support settings: ${n.status}`,s=new Error(o);throw s.status=n.status,s.data=i,s}return await n.json()}function kd(e,t,r){return e.setQueryData(c.support.settings(t),r),e.invalidateQueries({queryKey:c.support.settings(t)})}function JD(e,t){let r=useQueryClient(),n=e?.replace("@","");return useMutation({mutationKey:["support","settings-update",n],mutationFn:async i=>{if(!n||!t)throw new Error("[SDK][Support] missing auth");return Sd(t,i)},onSuccess(i){n&&kd(r,n,i);}})}function eK(e){return queryOptions({queryKey:["promotions","boost-plus-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/boost-plus-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch boost plus prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function iK(e){return queryOptions({queryKey:["promotions","rc-delegation-prices"],queryFn:async()=>{if(!e)return [];let t=await fetch(d.privateApiHost+"/private-api/rc-delegation-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch RC delegation prices: ${t.status}`);return await t.json()},staleTime:1/0,enabled:!!e})}function cK(e,t){return queryOptions({queryKey:["promotions","rc-delegation-active",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/rc-delegation-active",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,username:e})});if(!r.ok)throw new Error(`Failed to fetch RC delegation active: ${r.status}`);let n=await r.json();return n&&n.expires&&n.user?{user:n.user,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function dK(e){return queryOptions({queryKey:["promotions","promote-price"],queryFn:async()=>{let t=await fetch(d.privateApiHost+"/private-api/promote-price",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok)throw new Error(`Failed to fetch promote prices: ${t.status}`);return await t.json()},enabled:!!e})}function yK(e,t){return queryOptions({queryKey:["promotions","boost-plus-accounts",e],queryFn:async()=>{if(!t||!e)return null;let r=await fetch(d.privateApiHost+"/private-api/boosted-plus-account",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:t,account:e})});if(!r.ok)throw new Error(`Failed to fetch boost plus account prices: ${r.status}`);let n=await r.json();return n?{account:n.account,expires:new Date(n.expires)}:null},enabled:!!e&&!!t})}function bK(e,t,r){return v(["promotions","boost-plus"],e,({account:n,duration:i})=>[Br(e,n,i)],async(n,{account:i})=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.promotions.boostPlusAccounts(i)]);},t,"active",{broadcastMode:r})}function OK(e,t,r){return v(["promotions","rc-delegation"],e,({duration:n})=>[Mr(e,n)],async()=>{t?.adapter?.invalidateQueries&&await t.adapter.invalidateQueries([c.accounts.full(e),c.resourceCredits.account(e),["promotions","rc-delegation-active",e]]);},t,"active",{broadcastMode:r})}async function SK(e){let r=await w()(d.privateApiHost+"/auth-api/hs-token-refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!r.ok){let i;try{i=await r.json();}catch{i=void 0;}let o=new Error(`Failed to refresh token: ${r.status}`);throw o.status=r.status,o.data=i,o}return await r.json()}var Dd="https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt";function RK(){return queryOptions({queryKey:c.badActors.list(),queryFn:async({signal:e})=>{let t=await fetch(Dd,{signal:e});if(!t.ok)throw new Error(`Failed to fetch bad actors list: ${t.status}`);let r=await t.text();return new Set(r.split(` `).filter(Boolean))},staleTime:1440*60*1e3,gcTime:1/0})}var qK=1.1,Kd=(r=>(r.NUMBER_OF_VOTES="number_of_votes",r.TOKENS="tokens",r))(Kd||{});function IK(e){return e?e.map((t,r)=>({choice_num:r+1,choice_text:t,votes:{total_votes:0,hive_hp:0,hive_proxied_hp:0,hive_hp_incl_proxied:0}})):[]}function Nd(e){let t=e.poll_choices??[],r=e.poll_voters??[],n=e.poll_stats,i=t.map(a=>{let u=a.votes;return {choice_num:a.choice_num??0,choice_text:a.choice_text??"",votes:u?{total_votes:u.total_votes??0,hive_hp:u.hive_hp,hive_proxied_hp:u.hive_proxied_hp,hive_hp_incl_proxied:u.hive_hp_incl_proxied??null}:void 0}}),o=r.map(a=>({name:a.name??"",choices:a.choices??[],hive_hp:a.hive_hp,hive_proxied_hp:a.hive_proxied_hp,hive_hp_incl_proxied:a.hive_hp_incl_proxied})),s=n?{total_voting_accounts_num:n.total_voting_accounts_num??0,total_hive_hp:n.total_hive_hp,total_hive_proxied_hp:n.total_hive_proxied_hp,total_hive_hp_incl_proxied:n.total_hive_hp_incl_proxied??null}:void 0;return {author:e.author??"",permlink:e.permlink??"",question:e.question??"",poll_choices:i,poll_voters:o,poll_stats:s,poll_trx_id:e.poll_trx_id??"",status:e.status??"",end_time:e.end_time??"",preferred_interpretation:e.preferred_interpretation??"number_of_votes",max_choices_voted:e.max_choices_voted??1,filter_account_age_days:e.filter_account_age_days??0,protocol_version:e.protocol_version??0,created:e.created??"",post_title:e.post_title??"",post_body:e.post_body??"",parent_permlink:e.parent_permlink??"",tags:e.tags??[],image:e.image??[],token:e.token,community_membership:e.community_membership,allow_vote_changes:e.allow_vote_changes,ui_hide_res_until_voted:e.ui_hide_res_until_voted??false,platform:e.platform}}function NK(e,t){return queryOptions({queryKey:c.polls.details(e??"",t??""),enabled:!!e&&!!t,gcTime:isServer?jn:1800*1e3,queryFn:async()=>{if(!e||!t)throw new Error("[SDK][Polls] \u2013 missing author or permlink");let r=w(),n=`${d.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(e)}&permlink=eq.${encodeURIComponent(t)}`,i=await r(n);if(!i.ok)throw new Error(`[SDK][Polls] \u2013 fetch failed: ${i.status}`);let o=await i.json();if(!Array.isArray(o)||!o[0])throw new Error("[SDK][Polls] \u2013 no poll data found");return Nd(o[0])}})}function UK(e,t,r){return v(c.polls.vote(),e??"",({pollTrxId:n,choices:i})=>{if(!e)throw new Error("[SDK][Polls] Cannot vote without an authenticated username");return [["custom_json",{id:"polls",required_auths:[],required_posting_auths:[e],json:JSON.stringify({poll:n,action:"vote",choices:i})}]]},void 0,t,"posting",{broadcastMode:r??"async"})}/** * @license bytebuffer.ts (c) 2015 Daniel Wirtz * Backing buffer: ArrayBuffer, Accessor: DataView diff --git a/packages/sdk/dist/node/index.mjs.map b/packages/sdk/dist/node/index.mjs.map index d095685c16..33970ef518 100644 --- a/packages/sdk/dist/node/index.mjs.map +++ b/packages/sdk/dist/node/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/hive-tx/helpers/ByteBuffer.ts","../../src/hive-tx/config.ts","../../src/hive-tx/helpers/Signature.ts","../../src/hive-tx/helpers/PublicKey.ts","../../src/hive-tx/helpers/Asset.ts","../../src/hive-tx/helpers/HexBuffer.ts","../../src/hive-tx/helpers/serializer.ts","../../src/hive-tx/helpers/sleep.ts","../../src/hive-tx/helpers/call.ts","../../src/hive-tx/Transaction.ts","../../src/hive-tx/helpers/PrivateKey.ts","../../src/hive-tx/helpers/aes.ts","../../src/hive-tx/helpers/deserializer.ts","../../src/hive-tx/helpers/memo.ts","../../src/hive-tx/helpers/utils.ts","../../src/modules/core/hive-tx.ts","../../src/modules/core/errors/chain-errors.ts","../../src/modules/core/mutations/use-broadcast-mutation.ts","../../src/modules/core/mutations/broadcast-json.ts","../../src/modules/core/mutations/invalidate-after-broadcast.ts","../../src/modules/core/abort-signal.ts","../../src/modules/core/config.ts","../../src/modules/core/queries-manager.ts","../../src/modules/core/utils/decoder-encoder.ts","../../src/modules/core/utils/parse-asset.ts","../../src/modules/core/utils/get-bound-fetch.ts","../../src/modules/core/utils/is-community.ts","../../src/modules/core/utils/pagination-helpers.ts","../../src/modules/core/utils/vests-to-hp.ts","../../src/modules/core/utils/is-empty-date.ts","../../src/modules/core/queries/get-dynamic-props-query-options.ts","../../src/modules/core/queries/get-reward-fund-query-options.ts","../../src/modules/core/query-keys.ts","../../src/modules/ai/queries/get-ai-generate-price-query-options.ts","../../src/modules/ai/queries/get-ai-assist-price-query-options.ts","../../src/modules/ai/queries/get-ai-transcribe-price-query-options.ts","../../src/modules/ai/mutations/use-generate-image.ts","../../src/modules/ai/mutations/use-ai-assist.ts","../../src/modules/ai/mutations/use-ai-transcribe.ts","../../src/modules/accounts/queries/get-account-full-query-options.ts","../../src/modules/accounts/utils/profile-metadata.ts","../../src/modules/accounts/utils/parse-accounts.ts","../../src/modules/accounts/queries/get-accounts-query-options.ts","../../src/modules/accounts/queries/get-follow-count-query-options.ts","../../src/modules/accounts/queries/get-followers-query-options.ts","../../src/modules/accounts/queries/get-following-query-options.ts","../../src/modules/accounts/queries/get-muted-users-query-options.ts","../../src/modules/accounts/queries/lookup-accounts-query-options.ts","../../src/modules/accounts/queries/search-accounts-by-username-query-options.ts","../../src/modules/accounts/queries/check-username-wallets-pending-query-options.ts","../../src/modules/accounts/queries/get-relationship-between-accounts-query-options.ts","../../src/modules/accounts/queries/get-account-subscriptions-query-options.ts","../../src/modules/accounts/queries/get-bookmarks-query-options.ts","../../src/modules/accounts/queries/get-favorites-query-options.ts","../../src/modules/accounts/queries/check-favorite-query-options.ts","../../src/modules/accounts/queries/get-account-recoveries-query-options.ts","../../src/modules/accounts/queries/get-account-pending-recovery-query-options.ts","../../src/modules/accounts/queries/get-account-reputations-query-options.ts","../../src/modules/accounts/queries/get-transactions-infinite-query-options.ts","../../src/modules/accounts/queries/get-bots-query-options.ts","../../src/modules/accounts/queries/get-referrals-infinite-query-options.ts","../../src/modules/accounts/queries/get-referrals-stats-query-options.ts","../../src/modules/accounts/queries/get-friends-infinite-query-options.ts","../../src/modules/accounts/queries/get-search-friends-query-options.ts","../../src/modules/posts/queries/get-trending-tags-query-options.ts","../../src/modules/posts/queries/get-trending-tags-with-stats-query-options.ts","../../src/modules/posts/queries/get-fragments-query-options.ts","../../src/modules/posts/queries/get-promoted-posts-query-options.ts","../../src/modules/posts/queries/get-entry-active-votes-query-options.ts","../../src/modules/posts/queries/get-user-post-vote-query-options.ts","../../src/modules/posts/queries/get-content-query-options.ts","../../src/modules/posts/queries/get-content-replies-query-options.ts","../../src/modules/posts/queries/get-post-header-query-options.ts","../../src/modules/posts/utils/filter-dmca-entries.ts","../../src/modules/bridge/verify-on-alternate-node.ts","../../src/modules/posts/queries/get-post-query-options.ts","../../src/modules/bridge/requests.ts","../../src/modules/posts/queries/get-discussions-query-options.ts","../../src/modules/posts/queries/get-account-posts-query-options.ts","../../src/modules/posts/queries/get-posts-ranked-query-options.ts","../../src/modules/posts/queries/get-reblogs-query-options.ts","../../src/modules/posts/queries/get-reblogged-by-query-options.ts","../../src/modules/posts/queries/get-schedules-query-options.ts","../../src/modules/posts/queries/get-drafts-query-options.ts","../../src/modules/posts/queries/get-images-query-options.ts","../../src/modules/posts/queries/get-comment-history-query-options.ts","../../src/modules/posts/queries/get-deleted-entry-query-options.ts","../../src/modules/posts/queries/get-post-tips-query-options.ts","../../src/modules/posts/utils/waves-helpers.ts","../../src/modules/posts/queries/get-waves-feed-query-options.ts","../../src/modules/posts/queries/get-shorts-feed-query-options.ts","../../src/modules/posts/queries/get-waves-by-host-query-options.ts","../../src/modules/posts/queries/get-waves-by-tag-query-options.ts","../../src/modules/posts/queries/get-waves-following-query-options.ts","../../src/modules/posts/queries/get-waves-trending-tags-query-options.ts","../../src/modules/posts/queries/get-waves-by-account-query-options.ts","../../src/modules/posts/queries/get-waves-trending-authors-query-options.ts","../../src/modules/posts/queries/get-normalize-post-query-options.ts","../../src/modules/accounts/queries/get-account-vote-history-infinite-query-options.ts","../../src/modules/accounts/queries/get-profiles-query-options.ts","../../src/modules/accounts/queries/get-balance-history-query-options.ts","../../src/modules/accounts/queries/get-aggregated-balance-query-options.ts","../../src/modules/accounts/queries/get-pro-members-query-options.ts","../../src/modules/accounts/mutations/use-account-update.ts","../../src/modules/accounts/mutations/use-account-relations-update.ts","../../src/modules/operations/builders/content.ts","../../src/modules/operations/builders/wallet.ts","../../src/modules/operations/builders/social.ts","../../src/modules/operations/builders/governance.ts","../../src/modules/operations/builders/community.ts","../../src/modules/operations/builders/market.ts","../../src/modules/operations/builders/account.ts","../../src/modules/operations/builders/ecency.ts","../../src/modules/accounts/mutations/use-follow.ts","../../src/modules/accounts/mutations/use-unfollow.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-add.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-delete.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-add.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-delete.ts","../../src/modules/accounts/mutations/use-account-update-key-auths.ts","../../src/modules/accounts/mutations/use-account-update-password.ts","../../src/modules/accounts/mutations/use-account-revoke-posting.ts","../../src/modules/accounts/mutations/use-account-update-recovery.ts","../../src/modules/accounts/mutations/build-revoke-keys-op.ts","../../src/modules/accounts/mutations/use-account-revoke-key.ts","../../src/modules/accounts/mutations/use-claim-account.ts","../../src/modules/accounts/mutations/use-grant-posting-permission.ts","../../src/modules/accounts/mutations/use-create-account.ts","../../src/modules/accounts/utils/account-power.ts","../../src/modules/operations/authority-map.ts","../../src/modules/operations/mutations/sign-operation-by-key.ts","../../src/modules/operations/mutations/sign-operation-by-keychain.ts","../../src/modules/operations/mutations/sign-operation-by-hivesigner.ts","../../src/modules/operations/queries/get-chain-properties-query-options.ts","../../src/modules/posts/utils/fragment-cache-helpers.ts","../../src/modules/posts/mutations/add-fragment.ts","../../src/modules/posts/mutations/edit-fragment.ts","../../src/modules/posts/mutations/remove-fragment.ts","../../src/modules/private-api/requests.ts","../../src/modules/posts/mutations/use-add-draft.ts","../../src/modules/posts/mutations/use-update-draft.ts","../../src/modules/posts/mutations/use-delete-draft.ts","../../src/modules/posts/mutations/use-add-schedule.ts","../../src/modules/posts/mutations/use-delete-schedule.ts","../../src/modules/posts/mutations/use-move-schedule.ts","../../src/modules/posts/mutations/use-add-image.ts","../../src/modules/posts/mutations/use-delete-image.ts","../../src/modules/posts/mutations/use-upload-image.ts","../../src/modules/posts/cache/entries-cache-management.ts","../../src/modules/posts/mutations/use-vote.ts","../../src/modules/posts/mutations/use-reblog.ts","../../src/modules/posts/mutations/use-comment.ts","../../src/modules/posts/cache/discussions-cache-utils.ts","../../src/modules/posts/mutations/use-delete-comment.ts","../../src/modules/posts/mutations/use-cross-post.ts","../../src/modules/posts/mutations/use-update-reply.ts","../../src/modules/posts/mutations/use-promote.ts","../../src/modules/posts/utils/validate-post-creating.ts","../../src/modules/analytics/mutations/index.ts","../../src/modules/analytics/mutations/use-record-activity.ts","../../src/modules/analytics/queries/get-discover-leaderboard-query-options.ts","../../src/modules/analytics/queries/get-discover-curation-query-options.ts","../../src/modules/analytics/queries/get-page-stats-query-options.ts","../../src/modules/integrations/3speak/functions/beneficiary.ts","../../src/modules/integrations/3speak/queries/index.ts","../../src/modules/integrations/hivesigner/queries/index.ts","../../src/modules/integrations/hivesigner/queries/get-decode-memo-query-options.ts","../../src/modules/integrations/hivesigner/index.ts","../../src/modules/integrations/3speak/queries/get-account-token-query-options.ts","../../src/modules/integrations/3speak/queries/get-account-videos-query-options.ts","../../src/modules/integrations/3speak/index.ts","../../src/modules/integrations/hiveposh/queries/get-hiveposh-links-query-options.ts","../../src/modules/integrations/plausible/queries/get-stats-query-options.ts","../../src/modules/resource-credits/queries/get-rc-stats-query-options.ts","../../src/modules/resource-credits/queries/get-account-rc-query-options.ts","../../src/modules/resource-credits/utils/estimate-rc-precheck.ts","../../src/modules/games/queries/game-status-check-query-options.ts","../../src/modules/games/mutations/game-claim.ts","../../src/modules/quests/queries/get-quests-query-options.ts","../../src/modules/quests/catalog.ts","../../src/modules/quests/mutations/buy-streak-freeze.ts","../../src/modules/communities/mutations/use-subscribe-community.ts","../../src/modules/communities/mutations/use-unsubscribe-community.ts","../../src/modules/communities/mutations/use-mute-post.ts","../../src/modules/communities/mutations/use-set-community-role.ts","../../src/modules/communities/mutations/use-update-community.ts","../../src/modules/communities/mutations/use-register-community-rewards.ts","../../src/modules/communities/mutations/use-pin-post.ts","../../src/modules/communities/queries/get-communities-query-options.ts","../../src/modules/communities/queries/get-community-context-query-options.ts","../../src/modules/communities/queries/get-community-query-options.ts","../../src/modules/communities/queries/get-community-subscribers-query-options.ts","../../src/modules/communities/queries/get-account-notifications-infinite-query-options.ts","../../src/modules/communities/queries/get-rewarded-communities-query-options.ts","../../src/modules/communities/types/community.ts","../../src/modules/communities/utils/index.ts","../../src/modules/notifications/queries/get-notifications-unread-count-query-options.ts","../../src/modules/notifications/queries/get-notifications-infinite-query-options.ts","../../src/modules/notifications/enums/notification-filter.ts","../../src/modules/notifications/enums/notify-types.ts","../../src/modules/notifications/queries/get-notifications-settings-query-options.ts","../../src/modules/notifications/queries/get-announcements-query-options.ts","../../src/modules/notifications/queries/get-spotlights-query-options.ts","../../src/modules/notifications/mutations/use-mark-notifications-read.ts","../../src/modules/notifications/mutations/use-set-last-read.ts","../../src/modules/proposals/queries/get-proposal-query-options.ts","../../src/modules/proposals/queries/get-proposals-query-options.ts","../../src/modules/proposals/queries/get-proposal-votes-query-options.ts","../../src/modules/proposals/queries/get-user-proposal-votes-query-options.ts","../../src/modules/proposals/mutations/use-proposal-vote.ts","../../src/modules/proposals/mutations/use-proposal-create.ts","../../src/modules/wallet/queries/get-vesting-delegations-query-options.ts","../../src/modules/wallet/queries/get-account-delegations-query-options.ts","../../src/modules/wallet/queries/get-vesting-delegation-expirations-query-options.ts","../../src/modules/wallet/queries/get-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-collateralized-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-savings-withdraw-from-query-options.ts","../../src/modules/wallet/queries/get-withdraw-routes-query-options.ts","../../src/modules/wallet/queries/get-open-orders-query-options.ts","../../src/modules/wallet/queries/get-outgoing-rc-delegations-infinite-query-options.ts","../../src/modules/wallet/queries/get-incoming-rc-query-options.ts","../../src/modules/wallet/queries/get-received-vesting-shares-query-options.ts","../../src/modules/wallet/queries/get-recurrent-transfers-query-options.ts","../../src/modules/wallet/queries/get-portfolio-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-general-info-query-options.ts","../../src/modules/wallet/consts/hive-account-operation-groups.ts","../../src/modules/wallet/consts/hive-operation-list.ts","../../src/modules/wallet/consts/hive-operation-orders.ts","../../src/modules/wallet/queries/get-hive-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-metric-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-withdrawal-routes-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegates-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegatings-query-options.ts","../../src/modules/market/queries/get-order-book-query-options.ts","../../src/modules/market/queries/get-market-statistics-query-options.ts","../../src/modules/market/queries/get-market-history-query-options.ts","../../src/modules/market/queries/get-hive-hbd-stats-query-options.ts","../../src/modules/market/queries/get-market-data-query-options.ts","../../src/modules/market/queries/get-trade-history-query-options.ts","../../src/modules/market/queries/get-feed-history-query-options.ts","../../src/modules/market/queries/get-current-median-history-price-query-options.ts","../../src/modules/market/mutations/use-limit-order-create.ts","../../src/modules/market/mutations/use-limit-order-cancel.ts","../../src/modules/market/requests.ts","../../src/modules/hive-engine/requests.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-balances-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-market-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-metadata-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-transactions-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-metrics-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-unclaimed-rewards-query-options.ts","../../src/modules/hive-engine/queries/get-all-hive-engine-tokens-query-options.ts","../../src/modules/hive-engine/utils/formatted-number.ts","../../src/modules/hive-engine/utils/hive-engine-token.ts","../../src/modules/hive-engine/queries/get-hive-engine-balances-with-usd-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-general-info-query-options.ts","../../src/modules/points/queries/get-points-query-options.ts","../../src/modules/points/queries/get-points-asset-general-info-query-options.ts","../../src/modules/points/queries/get-points-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-account-wallet-asset-info-query-options.ts","../../src/modules/wallet/types/asset-operation.ts","../../src/modules/wallet/mutations/use-transfer.ts","../../src/modules/wallet/mutations/use-transfer-point.ts","../../src/modules/wallet/mutations/use-delegate-vesting-shares.ts","../../src/modules/wallet/mutations/use-set-withdraw-vesting-route.ts","../../src/modules/wallet/mutations/use-transfer-engine-token.ts","../../src/modules/wallet/mutations/use-transfer-to-savings.ts","../../src/modules/wallet/mutations/use-transfer-from-savings.ts","../../src/modules/wallet/mutations/use-transfer-to-vesting.ts","../../src/modules/wallet/mutations/use-withdraw-vesting.ts","../../src/modules/wallet/mutations/use-convert.ts","../../src/modules/wallet/mutations/use-claim-interest.ts","../../src/modules/wallet/mutations/use-claim-rewards.ts","../../src/modules/wallet/mutations/use-delegate-engine-token.ts","../../src/modules/wallet/mutations/use-undelegate-engine-token.ts","../../src/modules/wallet/mutations/use-stake-engine-token.ts","../../src/modules/wallet/mutations/use-unstake-engine-token.ts","../../src/modules/wallet/mutations/use-claim-engine-rewards.ts","../../src/modules/wallet/mutations/use-engine-market-order.ts","../../src/modules/wallet/mutations/use-wallet-operation.ts","../../src/modules/wallet/mutations/use-delegate-rc.ts","../../src/modules/witnesses/mutations/use-witness-vote.ts","../../src/modules/witnesses/mutations/use-witness-proxy.ts","../../src/modules/witnesses/queries/get-witnesses-query-options.ts","../../src/modules/points/types/point-transaction-type.ts","../../src/modules/points/mutations/use-claim-points.ts","../../src/modules/search/query-builder.ts","../../src/modules/search/parse-json-response.ts","../../src/modules/search/retry-policy.ts","../../src/modules/search/queries/get-search-query-options.ts","../../src/modules/search/requests.ts","../../src/modules/search/queries/get-similar-entries-query-options.ts","../../src/modules/search/queries/get-search-account-query-options.ts","../../src/modules/search/queries/get-search-topics-query-options.ts","../../src/modules/search/queries/get-search-api-infinite-query-options.ts","../../src/modules/search/queries/get-search-path-query-options.ts","../../src/modules/support/queries/get-support-settings-query-options.ts","../../src/modules/support/mutations/update-support-settings.ts","../../src/modules/promotions/queries/get-boost-plus-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-active-query-options.ts","../../src/modules/promotions/queries/get-promote-price-query-options.ts","../../src/modules/promotions/queries/get-boost-plus-account-prices-query-options.ts","../../src/modules/promotions/mutations/use-boost-plus.ts","../../src/modules/promotions/mutations/use-rc-delegation.ts","../../src/modules/auth/requests.ts","../../src/modules/bad-actors/queries/get-bad-actors-query-options.ts","../../src/modules/polls/types/poll.ts","../../src/modules/polls/queries/get-poll-query-options.ts","../../src/modules/polls/mutations/use-poll-vote.ts"],"names":["EMPTY_BUFFER","_encoder","_decoder","getEncoder","s","utf8","i","c","next","getDecoder","b","bytes","result","byte","codePoint","ByteBuffer","_ByteBuffer","capacity","littleEndian","buffers","buf","bb","view","offset","buffer","source","value","relative","src","copy","begin","end","target","targetOffset","sourceOffset","sourceLimit","targetRelative","len","current","length","forceCopy","limit","size","str","currentOffset","encoded","lenVarintSize","start","lenResult","lenValue","lenLength","config","sanitizeNodeList","nodes","n","setNodes","validNodes","setRestNodes","valid","setRestNodesByApi","map","api","list","setUserAgent","ua","setResilience","opts","r","bool","v","pos","Signature","_Signature","data","recovery","compressed","string","temp","hexToBytes","bytesToHex","message","sig","secp256k1","PublicKey","_PublicKey","key","prefix","wif","expectedPrefix","bs58","checksum","expectedChecksum","ripemd160","isUint8ArrayEqual","signature","encodePublic","a","Asset","_Asset","amount","symbol","expectedSymbol","amountString","HexBuffer","_HexBuffer","OPERATION_IDS","VoidSerializer","StringSerializer","Int16Serializer","Int64Serializer","UInt8Serializer","UInt16Serializer","UInt32Serializer","UInt64Serializer","BooleanSerializer","StaticVariantSerializer","itemSerializers","id","item","AssetSerializer","asset","precision","DateSerializer","PublicKeySerializer","BinarySerializer","VariableBinarySerializer","FlatMapSerializer","keySerializer","valueSerializer","ArraySerializer","itemSerializer","ObjectSerializer","keySerializers","serializer","error","OptionalSerializer","AuthoritySerializer","BeneficiarySerializer","PriceSerializer","ChainPropertiesSerializer","OperationDataSerializer","operationId","definitions","objectSerializer","OperationSerializers","ProposalUpdateSerializer","OperationSerializer","operation","TransactionSerializer","EncryptedMemoSerializer","Serializer","sleep","ms","resolve","isNodeRuntime","serverIdentityHeaders","RPCError","rpcError","NodeError","node","parseRetryAfterMs","header","secs","dateMs","delta","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","RATE_LIMIT_BASE_MS","RATE_LIMIT_MAX_MS","RATE_LIMIT_STREAK_RESET_MS","MAX_API_FAILURES_BEFORE_COOLDOWN","API_COOLDOWN_MS","HEAD_BLOCK_MAX_AGE_MS","STALE_BLOCK_THRESHOLD","LATENCY_EWMA_ALPHA","LATENCY_MIN_SAMPLES","LATENCY_MAX_AGE_MS","LATENCY_REPROBE_MS","LATENCY_UNPROVEN_PRIOR_MS","LATENCY_SLOW_FAILURE_MS","NodeHealthTracker","h","durationMs","profileKey","apiFail","now","p","elapsedMs","existing","retryAfterMs","hasHeader","cooldown","blockNum","recent","best","healthy","unhealthy","ordered","d","probe","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","HedgeBudget","tokens","rpcHedgeBudget","adaptiveAttemptTimeout","tracker","callerTimeout","explicit","ewma","recordError","e","tryRecordHeadBlock","block","createTimeoutReason","err","createTimeoutSignal","controller","timer","mergeSignals","primary","secondary","onPrimaryAbort","onSecondaryAbort","cleanup","jsonRPCCall","url","params","timeout","shouldRetry","externalSignal","body","tSignal","cleanupTimeout","signal","cleanupMerge","res","jitterDelay","hedgedRpcAttempt","hedgePool","explicitTimeout","deadlineAt","onHedgeFired","validate","reject","done","pendingLegs","hedgeFired","primarySettled","lastError","hedgeTimer","primaryStart","controllers","finish","settle","startLeg","isHedge","merged","legTimeout","primaryWindow","delay","live","callRPC","retry","ceiling","deadline","triedInRound","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","restProfileKey","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","restSignal","restCleanup","restCallStart","response","callWithQuorum","quorum","allNodes","arr","j","currentBatchSize","allResults","batchNodes","promises","batchResults","consensusResult","findConsensus","results","resultGroups","consensusGroup","group","chainId","Transaction","_Transaction","options","operationName","operationBody","keys","digest","txId","checkStatus","maxPollAttempts","status","transactionData","sha256","expiration","props","refBlockPrefix","expirationIso","NETWORK_ID","PrivateKey","_PrivateKey","decodePrivate","seed","username","password","role","rv","encodePrivate","publicKey","sha512","doubleSha256","input","encodedKey","checksumVerify","encrypt","privateKey","nonce","uniqueNonce","crypt","decrypt","nonceL","S","ebuf","encryptionKey","iv","tag","check","cbuf","check32","cryptoJsDecrypt","cryptoJsEncrypt","messageBuffer","AESCBC","uniqueNonceEntropy","randomPrivateKey","long","entropy","PublicKeyDeserializer","fixedBuf","UInt64Deserializer","UInt32Deserializer","BinaryDeserializer","bCopy","BufferDeserializer","keyDeserializers","obj","deserializer","EncryptedMemoDeserializer","Deserializer","encode","memo","testNonce","checkEncryption","toPrivateObj","toPublicObj","mbuf","memoBuffer","mbuf2","decode","from","to","encrypted","otherpub","encodeTest","plaintext","cyphertext","o","Memo","utils_exports","__export","buildWitnessSetProperties","makeBitMaskFilter","operations","validateUsername","suffix","ref","label","allowedOperations","reduceFunction","low","high","allowedOperation","owner","type","serialize","nobleSha256","isWif","broadcastOperations","ops","tx","op","broadcastOperationsAsync","MANA_REGENERATION_SECONDS","calculateManabar","maxMana","manabar","currentMana","percentage","getVests","account","vests","delegated","received","withdrawRate","alreadyWithdrawn","withdrawVests","calculateVPMana","calculateRCMana","rcAccount","ErrorType","parseChainError","errorDescription","errorMessage","errorCode","errorString","testPattern","pattern","formatError","parsed","shouldTriggerAuthFallback","isResourceCreditsError","isInfoError","isNetworkError","broadcastWithMethod","auth","authority","fetchedKey","fetchedToken","broadcastMode","adapter","token","hs","tokenError","broadcastWithFallback","loginType","hasPostingAuth","selectedMethod","hsError","chain","errors","shouldSkip","skipReason","prefetchedKey","prefetchedToken","skipReasons","errorMessages","useBroadcastMutation","mutationKey","onSuccess","useMutation","payload","postingKey","accessToken","broadcastJson","jjson","BROADCAST_INCLUSION_DELAY_MS","invalidateAfterBroadcast","withTimeoutSignal","timeoutMs","timeoutSignal","ac","onAbort","reason","isDevelopment","getHeliusApiKey","INTERNAL_API_TIMEOUT_MS","SERVER_GC_TIME_MS","queryClientResolver","fallbackQueryClient","resolveQueryClient","QueryClient","CONFIG","client","ConfigManager","setQueryClient","setQueryClientResolver","setPrivateApiHost","host","setClientId","clientId","setDefaultObserver","observer","getValidatedBaseUrl","setPollsApiHost","setImageHost","setHiveNodes","userAgent","analyzeRedosRisk","unboundedRange","match","min","max","testRegexPerformance","regex","adversarialInputs","maxExecutionTime","duration","safeCompileRegex","maxLength","staticAnalysis","compileErr","runtimeTest","setDmcaLists","lists","coerceList","resolved","rejectedTagCount","makeQueryClient","getQueryClient","EcencyQueriesManager","getQueryData","queryKey","getInfiniteQueryData","prefetchQuery","prefetchInfiniteQuery","generateClientServerQuery","useQuery","generateClientServerInfiniteQuery","useInfiniteQuery","encodeObj","decodeObj","dataToParse","Symbol","NaiMap","parseAsset","sval","sp","cachedFetch","getBoundFetch","isCommunity","isWrappedResponse","normalizeToWrappedResponse","vestsToHp","hivePerMVests","isEmptyDate","DYNAMIC_PROPS_REFRESH_MS","getDynamicPropsQueryOptions","queryOptions","QueryKeys","rawGlobalDynamic","rawFeedHistory","rawChainProps","rawRewardFund","rawHardforkProps","totalVestingSharesAmount","totalVestingFundAmount","base","quote","fundRecentClaims","fundRewardBalance","votePowerReserveRate","authorRewardCurve","contentConstant","currentHardforkVersion","lastHardfork","hbdPrintRate","hbdInterestRate","headBlock","totalVestingFund","totalVestingShares","virtualSupply","vestingRewardPercent","accountCreationFee","getRewardFundQueryOptions","fundName","entryPath","author","permlink","filter","startAuthor","startPermlink","activeUsername","sort","order","onlyMeta","hours","usernames","following","mode","followType","query","follower","startFollowing","startFollower","excludeList","accounts","targetUsername","reference","name","communityName","proposalId","voter","q","hideLow","since","scrollId","votes","what","content","includeNsfw","witness","page","pageSize","direction","user","coinType","granularity","onlyEnabled","currency","filterKey","bucketSeconds","seconds","startDate","endDate","coin","vsCurrency","fromTs","toTs","dimensions","metrics","dateRange","gameType","getAiGeneratePriceQueryOptions","getAiAssistPriceQueryOptions","getAiTranscribePriceQueryOptions","makeIdempotencyKey","useGenerateImage","pendingData","useAiAssist","useAiTranscribe","form","isMetadataStripped","hasProfileValues","profile","getAccountFullQueryOptions","bridgeProfile","rows","chainAccount","reread","parseProfileMetadata","stats","follow_stats","reputationValue","DENIED_KEYS","isPlainObject","proto","deepMerge","srcVal","tgtVal","sanitizeTokens","meta","rest","safeMeta","postingJsonMetadata","extractAccountProfile","pickRicherMetadataSnapshot","preferred","fallback","preferredKeys","parsePostingMetadataRoot","buildPostingJsonMetadata","existingPostingJsonMetadata","root","existingProfile","mergedProfile","buildProfileMetadata","profileTokens","_ignoredVersion","profileRest","metadata","parseAccounts","rawAccounts","x","jsonMetadata","getAccountsQueryOptions","getFollowCountQueryOptions","getFollowersQueryOptions","getFollowingQueryOptions","MUTED_USERS_PAGE_SIZE","MUTED_USERS_MAX_PAGES","getMutedUsersQueryOptions","muted","names","lookupAccountsQueryOptions","getSearchAccountsByUsernameQueryOptions","RESERVED_META_KEYS","checkUsernameWalletsPendingQueryOptions","wallets","walletItem","sanitizedMeta","address","showFlag","baseCandidate","metaTokenCandidates","metaSymbol","metaValue","getRelationshipBetweenAccountsQueryOptions","getAccountSubscriptionsQueryOptions","getBookmarksQueryOptions","getBookmarksInfiniteQueryOptions","infiniteQueryOptions","pageParam","json","lastPage","getFavoritesQueryOptions","getFavoritesInfiniteQueryOptions","checkFavoriteQueryOptions","getAccountRecoveriesQueryOptions","getAccountPendingRecoveryQueryOptions","getAccountReputationsQueryOptions","ACCOUNT_OPERATION_GROUPS","ALL_ACCOUNT_OPERATIONS","acc","val","deriveNum","entry","normalizeOpType","restType","isNaiAsset","naiToString","normalizeOpValue","k","getTransactionsInfiniteQueryOptions","operationTypes","nextPage","getBotsQueryOptions","getReferralsInfiniteQueryOptions","maxId","nextMaxId","getReferralsStatsQueryOptions","getFriendsInfiniteQueryOptions","enabled","accountNames","SEARCH_LIMIT","getSearchFriendsQueryOptions","getTrendingTagsQueryOptions","afterTag","tags","getTrendingTagsWithStatsQueryOptions","getFragmentsQueryOptions","getFragmentsInfiniteQueryOptions","getPromotedPostsQuery","getEntryActiveVotesQueryOptions","getUserPostVoteQueryOptions","getContentQueryOptions","getContentRepliesQueryOptions","getPostHeaderQueryOptions","filterDmcaEntry","entryOrEntries","applyFilter","verifyPostOnAlternateNode","getPostQueryOptions","num","cleanPermlink","verified","verifiedEntry","bridgeApiCall","resolvePost","post","resp","getPost","resolvePosts","posts","validatedPosts","validateEntry","getPostsRanked","start_author","start_permlink","getAccountPosts","newEntry","requiredStringProps","prop","validatedEntry","getPostHeader","getDiscussion","validatedResp","getCommunity","getCommunities","last","normalizePost","getSubscriptions","getSubscribers","community","getRelationshipBetweenAccounts","getProfiles","SortOrder","sortDiscussions","discussion","allPayout","absNegative","isPinned","sortOrders","_a","_b","keyA","keyB","sorted","pinnedIndex","pinned","getDiscussionsQueryOptions","resolvedObserver","oldData","newData","optimisticEntries","fetchedPermlinks","missingOptimistic","opt","getDiscussionQueryOptions","getAccountPostsInfiniteQueryOptions","hasNextPage","getAccountPostsQueryOptions","displaySelects","displaySelect","select","orderForDisplay","byCreated","getPostsRankedInfiniteQueryOptions","_options","sanitizedTag","getPostsRankedQueryOptions","getReblogsQueryOptions","getRebloggedByQueryOptions","getSchedulesQueryOptions","getSchedulesInfiniteQueryOptions","getDraftsQueryOptions","getDraftsInfiniteQueryOptions","fetchUserImages","getImagesQueryOptions","getGalleryImagesQueryOptions","getImagesInfiniteQueryOptions","getCommentHistoryQueryOptions","makeEntryPath","cleanAuthor","normalizedAuthor","normalizedPermlink","getDeletedEntryQueryOptions","isValid","history","title","getPostTipsQueryOptions","isEnabled","normalizeContainer","normalizeParent","normalizeWaveEntryFromApi","containerSource","container","parent","toEntryArray","getVisibleFirstLevelThreadItems","discussionItemsRaw","discussionItems","firstLevelItems","parent_author","parent_permlink","mapThreadItemsToWaveEntries","items","DEFAULT_FEED_LIMIT","normalizeParams","fetchWavesFeedPage","containers","cursor","row","getWavesFeedQueryOptions","normalized","getWavesLatestFeedQueryOptions","fetchShortsFeedPage","getShortsFeedQueryOptions","THREAD_CONTAINER_BATCH_SIZE","MAX_CONTAINERS_TO_SCAN","getThreads","scannedContainers","skipContainerId","rpcParams","normalizedContainers","visibleItems","lastContainer","getWavesByHostQueryOptions","DEFAULT_TAG_FEED_LIMIT","getWavesByTagQueryOptions","getWavesFollowingQueryOptions","normalizedUsername","flattened","getWavesTrendingTagsQueryOptions","getWavesByAccountQueryOptions","getWavesTrendingAuthorsQueryOptions","getNormalizePostQueryOptions","isEntry","getDays","createdDate","past","getAccountVoteHistoryInfiniteQueryOptions","filters","dayLimit","historyObj","filtered","entries","firstHistory","getProfilesQueryOptions","getBalanceHistoryInfiniteQueryOptions","getAggregatedBalanceQueryOptions","getProMembersQueryOptions","proMembersSet","members","m","useAccountUpdate","queryClient","useQueryClient","_data","variables","useAccountRelationsUpdate","onError","kind","relationsQuery","actualRelation","buildVoteOp","weight","buildCommentOp","parentAuthor","parentPermlink","buildCommentOptionsOp","maxAcceptedPayout","percentHbd","allowVotes","allowCurationRewards","extensions","buildDeleteCommentOp","buildReblogOp","deleteReblog","buildTransferOp","buildMultiTransferOps","destinations","dest","buildRecurrentTransferOp","recurrence","executions","buildTransferToSavingsOp","buildTransferFromSavingsOp","requestId","buildCancelTransferFromSavingsOp","buildClaimInterestOps","buildTransferToVestingOp","buildWithdrawVestingOp","vestingShares","buildDelegateVestingSharesOp","delegator","delegatee","buildSetWithdrawVestingRouteOp","fromAccount","toAccount","percent","autoVest","buildConvertOp","buildCollateralizedConvertOp","buildEngineOp","contractAction","contractPayload","contractName","buildEngineClaimOp","buildDelegateRcOp","delegatees","maxRc","delegateeArray","buildFollowOp","buildUnfollowOp","buildIgnoreOp","buildUnignoreOp","buildSetLastReadOps","date","lastReadDate","notifyOp","ecencyNotifyOp","buildWitnessVoteOp","approve","buildWitnessProxyOp","proxy","buildProposalCreateOp","creator","buildProposalVoteOp","proposalIds","buildRemoveProposalOp","proposalOwner","buildUpdateProposalOp","dailyPay","subject","buildSubscribeOp","buildUnsubscribeOp","buildSetRoleOp","buildUpdateCommunityOp","buildPinPostOp","pin","buildMutePostOp","notes","mute","buildMuteUserOp","buildFlagPostOp","BuySellTransactionType","OrderIdPrefix","buildLimitOrderCreateOp","amountToSell","minToReceive","fillOrKill","orderId","formatNumber","decimals","buildLimitOrderCreateOpWithType","orderType","idPrefix","expirationStr","formattedAmountToSell","formattedMinToReceive","buildLimitOrderCancelOp","buildClaimRewardBalanceOp","rewardHive","rewardHbd","rewardVests","buildAccountUpdateOp","active","posting","memoKey","buildAccountUpdate2Op","buildAccountCreateOp","newAccountName","fee","buildCreateClaimedAccountOp","buildClaimAccountOp","buildGrantPostingPermissionOp","currentPosting","grantedAccount","weightThreshold","existingIndex","newAccountAuths","newPosting","buildRevokePostingPermissionOp","revokedAccount","buildChangeRecoveryAccountOp","accountToRecover","newRecoveryAccount","buildRequestAccountRecoveryOp","recoveryAccount","newOwnerAuthority","buildRecoverAccountOp","recentOwnerAuthority","buildBoostPlusOp","buildRcDelegationOp","buildPromoteOp","buildPointTransferOp","sender","receiver","normalizedAmount","buildMultiPointTransferOps","destArray","buildCommunityRegistrationOp","buildActiveCustomJsonOp","buildPostingCustomJsonOp","useFollow","_result","useUnfollow","useBookmarkAdd","useBookmarkDelete","bookmarkId","useAccountFavoriteAdd","qc","useAccountFavoriteDelete","listKey","infinitePrefix","checkKey","previousList","f","previousCheck","infiniteQueries","previousInfinite","context","dedupeAndSortKeyAuths","additions","useAccountUpdateKeyAuths","accountData","keepCurrent","currentKey","keysToRevoke","keysToRevokeByAuthority","prepareAuth","keyName","allKeysToRevoke","existingKeys","values","useAccountUpdatePassword","updateKeys","newPassword","currentPassword","useAccountRevokePosting","accountName","ctx","useAccountUpdateRecovery","email","canRevokeFromAuthority","revokingKeyStrs","remainingWeight","sum","accountWeight","buildRevokeKeysOp","revokingKeys","hasAnyKeyInAuth","clone","needsOwnerUpdate","useAccountRevokeKey","revokingKey","useClaimAccount","useGrantPostingPermission","useCreateAccount","HIVE_VOTING_MANA_REGENERATION_SECONDS","HIVE_100_PERCENT","HIVE_VOTE_DUST_THRESHOLD","getEffectiveVests","vesting","vestsToRshares","votingPowerValue","votePerc","hasStableVoteHardfork","dynamicProps","major","minor","stableVoteRshares","reserveRate","effectiveVests","usedMana","mana","votingRshares","totalVests","votingPower","powerRechargeTime","power","downVotingPower","totalShares","elapsed","currentManaPerc","rcPower","votingValue","rShares","OPERATION_AUTHORITY_MAP","getCustomJsonAuthority","customJsonOp","opType","customJson","getProposalAuthority","proposalOp","getOperationAuthority","getRequiredAuthority","highestAuthority","useSignOperationByKey","keyOrSeed","useSignOperationByKeychain","keyType","useSignOperationByHivesigner","callbackUri","getChainPropertiesQueryOptions","applyFragmentUpdate","vars","buildAddedFragment","useAddFragment","newFragment","index","useEditFragment","fragmentId","applyUpdate","fragment","useRemoveFragment","parseJsonResponse","errorData","signUp","referral","captchaToken","subscribeEmail","usrActivity","ty","bl","getNotifications","saveNotificationSetting","system","allows_notify","notify_types","getNotificationSetting","markNotifications","addImage","UPLOAD_HOST","uploadImage","file","fetchApi","formData","uploadImageWithSignature","deleteImage","imageId","addDraft","updateDraft","draftId","deleteDraft","addSchedule","schedule","reblog","deleteSchedule","moveSchedule","getPromotedPost","onboardEmail","friend","dataBody","useAddDraft","useUpdateDraft","useDeleteDraft","_variables","useAddSchedule","useDeleteSchedule","useMoveSchedule","useAddImage","nextCode","effectiveCode","useDeleteImage","prev","img","useUploadImage","getEntryFromCache","setEntryInCache","mutateEntry","updater","updated","EntriesCacheManagement","updateVotes","payout","updateReblogsCount","count","updateRepliesCount","addReply","reply","updateEntries","invalidateEntry","getEntry","isVoteAlreadyReflected","activeVotes","hasVoterRecord","applyVoteCacheUpdate","newVotes","newPayout","useVote","doInvalidate","useReblog","newCount","invalidate","useComment","beneficiaries","sortedBeneficiaries","isPost","activityType","queriesToInvalidate","discussionsAuthor","discussionsPermlink","addOptimisticDiscussionEntry","rootAuthor","rootPermlink","queries","removeOptimisticDiscussionEntry","snapshots","restoreDiscussionSnapshots","updateEntryInCache","updates","previous","restoreEntryInCache","useDeleteComment","_error","useCrossPost","useUpdateReply","usePromote","DEFAULT_VALIDATE_POST_DELAYS","getContent","validatePostCreating","attempts","delays","waitMs","mutations_exports","useRecordActivity","getLocationInfo","locationInfo","domain","getDiscoverLeaderboardQueryOptions","getDiscoverCurationQueryOptions","accountsResponse","element","curator","receivedVestingShares","delegatedVestingShares","vestingWithdrawRate","effectiveVest","getPageStatsQueryOptions","sortedDimensions","sortedMetrics","THREESPEAK_BENEFICIARY_ACCOUNT","THREESPEAK_BENEFICIARY_WEIGHT","hasThreeSpeakEmbed","enforceThreeSpeakBeneficiary","isThreeSpeakBeneficiary","queries_exports","getAccountTokenQueryOptions","getAccountVideosQueryOptions","getDecodeMemoQueryOptions","HiveSignerIntegration","memoQueryOptions","memoDecoded","tokenQueryOptions","ThreeSpeakIntegration","getHivePoshLinksQueryOptions","getStatsQueryOptions","filterBy","getRcStatsQueryOptions","getAccountRcQueryOptions","EMPTY","estimateRcPrecheck","rcStats","avgCost","safeBuffer","estimatedCost","willLikelyFail","getGameStatusCheckQueryOptions","useGameClaim","recordActivity","getQuestsQueryOptions","QUEST_CATALOG","getQuestCatalogEntry","tier","STREAK_FREEZE_PRICE","STREAK_FREEZE_MAX_OWNED","genIdempotencyKey","buyStreakFreezeRequest","useBuyStreakFreeze","useSubscribeCommunity","useUnsubscribeCommunity","useMutePost","useSetCommunityRole","team","idx","useUpdateCommunity","useRegisterCommunityRewards","usePinPost","getCommunitiesQueryOptions","getCommunityContextQueryOptions","getCommunityQueryOptions","SUBSCRIBERS_PAGE_SIZE","fetchSubscribersPage","getCommunitySubscribersQueryOptions","getCommunitySubscribersInfiniteQueryOptions","getAccountNotificationsInfiniteQueryOptions","getRewardedCommunitiesQueryOptions","ROLES","roleMap","getCommunityType","type_id","getCommunityPermissions","communityType","userRole","subscribed","canPost","canComment","isModerator","getNotificationsUnreadCountQueryOptions","getNotificationsInfiniteQueryOptions","NotificationFilter","NotifyTypes","ALL_NOTIFY_TYPES","NotificationViewType","getNotificationsSettingsQueryOptions","initialMuted","getAnnouncementsQueryOptions","getSpotlightsQueryOptions","_accessToken","markNotificationRead","isInfiniteData","useMarkNotificationsRead","previousData","updatedData","unreadKey","currentUnread","unreadCount","useSetLastRead","getProposalQueryOptions","proposal","getProposalsQueryOptions","proposals","expired","getProposalVotesInfiniteQueryOptions","getUserProposalVotesQueryOptions","vote","useProposalVote","useProposalCreate","getVestingDelegationsQueryOptions","fetchLimit","getAccountDelegationsQueryOptions","getVestingDelegationExpirationsQueryOptions","getConversionRequestsQueryOptions","getCollateralizedConversionRequestsQueryOptions","getSavingsWithdrawFromQueryOptions","getWithdrawRoutesQueryOptions","getOpenOrdersQueryOptions","getOutgoingRcDelegationsInfiniteQueryOptions","delegations","delegation","getIncomingRcQueryOptions","getReceivedVestingSharesQueryOptions","getRecurrentTransfersQueryOptions","normalizeString","trimmed","normalizeNumber","direct","parseToken","rawToken","extractTokens","record","resolveUsername","getPortfolioQueryOptions","getHiveAssetGeneralInfoQueryOptions","marketTicker","marketPrice","liquidBalance","savingsBalance","getHbdAssetGeneralInfoQueryOptions","price","getAPR","currentInflationRate","totalVestingFunds","getHivePowerAssetGeneralInfoQueryOptions","delegatedVests","receivedVests","withdrawRateVests","remainingToWithdrawVests","nextWithdrawalVests","hpBalance","outgoingDelegationsHp","incomingDelegationsHp","pendingPowerDownHp","nextPowerDownHp","totalBalance","availableHp","HIVE_ACCOUNT_OPERATION_GROUPS","HIVE_OPERATION_LIST","operationOrders","HIVE_OPERATION_ORDERS","HIVE_OPERATION_NAME_BY_ID","isHiveOperationName","resolveHiveOperationFilters","rawValues","hasAll","uniqueValues","operationIds","filterArgs","getHiveAssetTransactionsQueryOptions","__","pages","pageParams","getHbdAssetTransactionsQueryOptions","getHivePowerAssetTransactionsQueryOptions","userSelectedOperations","hasAllFilter","formatDate","pad","subtractSeconds","getHiveAssetMetricQueryOptions","hive","non_hive","open","_","prevStartDate","getHiveAssetWithdrawalRoutesQueryOptions","getHivePowerDelegatesInfiniteQueryOptions","getHivePowerDelegatingsQueryOptions","getOrderBookQueryOptions","getMarketStatisticsQueryOptions","getMarketHistoryQueryOptions","getHiveHbdStatsQueryOptions","oneDayAgo","dayChange","getMarketDataQueryOptions","getTradeHistoryQueryOptions","getFeedHistoryQueryOptions","getCurrentMedianHistoryPriceQueryOptions","useLimitOrderCreate","useLimitOrderCancel","getMarketData","getCurrencyRate","cur","getCurrencyTokenRate","getCurrencyRates","getHivePrice","ENGINE_RPC_HEADERS","engineRpc","engineRpcSafe","getHiveEngineOrderBook","baseParams","buy","sell","sortByPriceDesc","left","sortByPriceAsc","right","getHiveEngineTradeHistory","getHiveEngineOpenOrders","buyRaw","sellRaw","formatTotal","quantity","getHiveEngineMetrics","symbolQuery","getHiveEngineTokensMarket","getHiveEngineTokensBalances","getHiveEngineTokensMetadata","getHiveEngineTokenTransactions","getHiveEngineTokenMetrics","interval","getHiveEngineUnclaimedRewards","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMarketQueryOptions","getHiveEngineTokensMetadataQueryOptions","getHiveEngineTokenTransactionsQueryOptions","_allPages","lastPageParam","_firstPage","firstPageParam","getHiveEngineTokensMetricsQueryOptions","getHiveEngineUnclaimedRewardsQueryOptions","pending_token","getAllHiveEngineTokensQueryOptions","formattedNumber","fractionDigits","out","av","HiveEngineToken","getHiveEngineBalancesWithUsdQueryOptions","allTokens","balances","t","pricePerHive","providedMetrics","unpricedSymbols","balance","metric","tokenMetadata","lastPrice","balanceAmount","usdValue","getHiveEngineTokenGeneralInfoQueryOptions","hiveQuery","hiveData","metadataList","balanceList","marketList","stakedBalance","unstakingBalance","getPointsQueryOptions","pointsResponse","points","transactionsResponse","transactions","getPointsAssetGeneralInfoQueryOptions","getPointsAssetTransactionsQueryOptions","created","getAccountWalletAssetInfoQueryOptions","fetchQuery","qo","convertPriceToUserCurrency","assetInfo","conversionRate","portfolioQuery","getPortfolioAssetInfo","assetItem","extraItem","dataKey","numValue","portfolioAssetInfo","converted","AssetOperation","useTransfer","useTransferPoint","useDelegateVestingShares","useSetWithdrawVestingRoute","useTransferEngineToken","useTransferToSavings","useTransferFromSavings","useTransferToVesting","useWithdrawVesting","useConvert","useClaimInterest","CLAIM_REWARDS_INVALIDATION_DELAY_MS","pendingInvalidationTimers","useClaimRewards","timerKey","keysToInvalidate","existingTimer","rejected","useDelegateEngineToken","useUndelegateEngineToken","useStakeEngineToken","useUnstakeEngineToken","useClaimEngineRewards","useEngineMarketOrder","buildHiveOperations","buildEngineOperations","getWalletOperationAuthority","useWalletOperation","hiveOps","engineOps","useDelegateRc","useWitnessVote","useWitnessProxy","mapRestWitness","w","getWitnessesInfiniteQueryOptions","getWitnessVotersPageQueryOptions","getWitnessVoterCountQueryOptions","PointTransactionType","claimPointsRequest","contentType","detail","useClaimPoints","author_re","type_re","category_re","tag_re","SearchType","MAX_SEARCH_TAGS","MAX_SEARCH_QUERY_LENGTH","firstToken","normalizeSearchAuthor","normalizeSearchCategory","normalizeSearchTags","seen","buildSearchQuery","search","category","normalizedSearch","normalizedCategory","normalizedTags","part","SearchQuery","_query","re","matches","raw","isSearchResponse","MAX_RETRIES","isServer","searchRetryPolicy","failureCount","isTransient","searchQueryOptions","scroll_id","getControversialRisingInfiniteQueryOptions","sinceDate","similar","searchPath","SIMILAR_ENTRIES_SINCE_MS","SIMILAR_ENTRIES_TARGET","SIMILAR_ENTRIES_BODY_LIMIT","SIMILAR_ENTRIES_SSR_TIMEOUT_MS","SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS","SIMILAR_ENTRIES_MIN_RENDER","toMltExcerpt","fingerprint","getSimilarEntriesQueryOptions","rawTags","contentKey","collected","seenAuthors","getSearchAccountQueryOptions","getSearchTopicsQueryOptions","getSearchApiInfiniteQueryOptions","getSearchPathQueryOptions","getSupportSettingsRequest","getSupportSettingsQueryOptions","updateSupportSettingsRequest","applySupportSettingsUpdate","useUpdateSupportSettings","getBoostPlusPricesQueryOptions","getRcDelegationPricesQueryOptions","getRcDelegationActiveQueryOptions","responseData","getPromotePriceQueryOptions","getBoostPlusAccountPricesQueryOptions","useBoostPlus","useRcDelegation","hsTokenRenew","BAD_ACTORS_URL","getBadActorsQueryOptions","POLLS_PROTOCOL_VERSION","PollPreferredInterpretation","mapMetaChoicesToPollChoices","metaChoices","choice","normalizePoll","pollChoices","pollVoters","rawStats","choices","voters","getPollQueryOptions","usePollVote","pollTrxId"],"mappings":"whBASA,IAAMA,EAAAA,CAAe,IAAI,YAAY,CAAC,CAAA,CAIlCC,EAAAA,CAAqD,IAAA,CACrDC,EAAAA,CAAuD,IAAA,CAE3D,SAASC,EAAAA,EAAgD,CACvD,OAAKF,EAAAA,GACC,OAAO,YAAgB,GAAA,CACzBA,EAAAA,CAAW,IAAI,WAAA,CAEfA,EAAAA,CAAW,CACT,MAAA,CAAOG,CAAAA,CAAuB,CAE5B,IAAMC,CAAAA,CAAiB,EAAC,CACxB,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAE,OAAQE,CAAAA,EAAAA,CAAK,CACjC,IAAIC,CAAAA,CAAIH,CAAAA,CAAE,WAAWE,CAAC,CAAA,CACtB,GAAIC,CAAAA,CAAI,GAAA,CACNF,EAAK,IAAA,CAAKE,CAAC,UACFA,CAAAA,CAAI,IAAA,CACbF,EAAK,IAAA,CAAK,GAAA,CAAQE,CAAAA,EAAK,CAAA,CAAI,GAAA,CAAQA,CAAAA,CAAI,EAAK,CAAA,CAAA,KAAA,GACnCA,CAAAA,EAAK,OAAUA,CAAAA,EAAK,KAAA,EAAUD,EAAI,CAAA,CAAIF,CAAAA,CAAE,MAAA,CAAQ,CACzD,IAAMI,CAAAA,CAAOJ,EAAE,UAAA,CAAW,EAAEE,CAAC,CAAA,CAC7BC,CAAAA,CAAI,QAAYA,CAAAA,CAAI,IAAA,GAAU,EAAA,CAAA,EAAOC,CAAAA,CAAO,IAAA,CAAA,CAC5CH,CAAAA,CAAK,KAAK,GAAA,CAAQE,CAAAA,EAAK,GAAK,GAAA,CAASA,CAAAA,EAAK,GAAM,EAAA,CAAO,GAAA,CAASA,GAAK,CAAA,CAAK,EAAA,CAAO,IAAQA,CAAAA,CAAI,EAAK,EACpG,CAAA,KACEF,CAAAA,CAAK,KAAK,GAAA,CAAQE,CAAAA,EAAK,EAAA,CAAK,GAAA,CAASA,CAAAA,EAAK,CAAA,CAAK,GAAO,GAAA,CAAQA,CAAAA,CAAI,EAAK,EAE3E,CACA,OAAO,IAAI,UAAA,CAAWF,CAAI,CAC5B,CACF,CAAA,CAAA,CAGGJ,EACT,CAEA,SAASQ,IAAkD,CACzD,OAAKP,KACC,OAAO,WAAA,CAAgB,GAAA,CACzBA,EAAAA,CAAW,IAAI,WAAA,CAEfA,GAAW,CACT,MAAA,CAAOQ,EAAyB,CAC9B,IAAMC,EAAQD,CAAAA,YAAa,WAAA,CAAc,IAAI,UAAA,CAAWA,CAAC,EAAI,IAAI,UAAA,CAAYA,EAAsB,MAAA,CAASA,CAAAA,CAAsB,WAAaA,CAAAA,CAAsB,UAAU,CAAA,CAC3KE,CAAAA,CAAS,EAAA,CACb,IAAA,IAASN,EAAI,CAAA,CAAGA,CAAAA,CAAIK,EAAM,MAAA,EAAU,CAClC,IAAME,CAAAA,CAAOF,CAAAA,CAAML,CAAC,CAAA,CAChBQ,CAAAA,CACAD,CAAAA,CAAO,KAAQC,CAAAA,CAAYD,CAAAA,CAAMP,GAAK,CAAA,EAAA,CAChCO,CAAAA,CAAO,OAAU,GAAA,EAAQC,CAAAA,CAAAA,CAAcD,CAAAA,CAAO,EAAA,GAAS,CAAA,CAAMF,CAAAA,CAAML,EAAI,CAAC,CAAA,CAAI,GAAOA,CAAAA,EAAK,CAAA,EAAA,CACxFO,EAAO,GAAA,IAAU,GAAA,EAAQC,GAAcD,CAAAA,CAAO,EAAA,GAAS,IAAQF,CAAAA,CAAML,CAAAA,CAAI,CAAC,CAAA,CAAI,EAAA,GAAS,EAAMK,CAAAA,CAAML,CAAAA,CAAI,CAAC,CAAA,CAAI,EAAA,CAAOA,CAAAA,EAAK,IAC3HQ,CAAAA,CAAAA,CAAcD,CAAAA,CAAO,IAAS,EAAA,CAAA,CAAQF,CAAAA,CAAML,EAAI,CAAC,CAAA,CAAI,EAAA,GAAS,EAAA,CAAA,CAAQK,CAAAA,CAAML,CAAAA,CAAI,CAAC,CAAA,CAAI,EAAA,GAAS,EAAMK,CAAAA,CAAML,CAAAA,CAAI,CAAC,CAAA,CAAI,EAAA,CAAOA,CAAAA,EAAK,CAAA,CAAA,CAClIQ,CAAAA,EAAa,KAAA,CAAUF,GAAU,MAAA,CAAO,YAAA,CAAaE,CAAS,CAAA,EAC3DA,CAAAA,EAAa,MAASF,CAAAA,EAAU,MAAA,CAAO,aAAa,KAAA,EAAUE,CAAAA,EAAa,IAAK,KAAA,EAAUA,CAAAA,CAAY,KAAM,CAAA,EACrH,CACA,OAAOF,CACT,CACF,CAAA,CAAA,CAGGV,EACT,CAEO,IAAMa,EAAN,MAAMC,CAAW,CACtB,OAAO,aAAA,CAAgB,KACvB,OAAO,UAAA,CAAa,KAAA,CACpB,OAAO,gBAAA,CAAmB,EAAA,CAC1B,OAAO,cAAA,CAAiBA,CAAAA,CAAW,WAEnC,MAAA,CACA,IAAA,CACA,OACA,YAAA,CACA,KAAA,CACA,YAAA,CAEA,WAAA,CACEC,CAAAA,CAAmBD,CAAAA,CAAW,iBAC9BE,CAAAA,CAAwBF,CAAAA,CAAW,eACnC,CACA,IAAA,CAAK,OAASC,CAAAA,GAAa,CAAA,CAAIjB,GAAe,IAAI,WAAA,CAAYiB,CAAQ,CAAA,CACtE,IAAA,CAAK,KAAOA,CAAAA,GAAa,CAAA,CAAI,IAAI,QAAA,CAASjB,EAAY,CAAA,CAAI,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,CAClF,IAAA,CAAK,OAAS,CAAA,CACd,IAAA,CAAK,aAAe,EAAA,CACpB,IAAA,CAAK,KAAA,CAAQiB,CAAAA,CACb,IAAA,CAAK,YAAA,CAAeC,EACtB,CAEA,OAAO,SAASD,CAAAA,CAAmBC,CAAAA,CAAoC,CACrE,OAAO,IAAIF,CAAAA,CAAWC,CAAAA,CAAUC,CAAY,CAC9C,CAEA,OAAO,MAAA,CACLC,EACAD,CAAAA,CACY,CACZ,IAAID,CAAAA,CAAW,CAAA,CACf,QAASX,CAAAA,CAAI,CAAA,CAAGA,EAAIa,CAAAA,CAAQ,MAAA,CAAQ,EAAEb,CAAAA,CAAG,CACvC,IAAMc,CAAAA,CAAMD,CAAAA,CAAQb,CAAC,CAAA,CACrB,GAAIc,CAAAA,YAAeJ,EACjBC,CAAAA,EAAYG,CAAAA,CAAI,MAAQA,CAAAA,CAAI,MAAA,CAAA,KAAA,GACnBA,aAAe,UAAA,CACxBH,CAAAA,EAAYG,CAAAA,CAAI,MAAA,CAAA,KAAA,GACPA,CAAAA,YAAe,WAAA,CACxBH,GAAYG,CAAAA,CAAI,UAAA,CAAA,KAAA,GACP,MAAM,OAAA,CAAQA,CAAG,EAC1BH,CAAAA,EAAYG,CAAAA,CAAI,MAAA,CAAA,KAEhB,MAAM,SAAA,CAAU,gBAAgB,CAEpC,CAEA,GAAIH,IAAa,CAAA,CACf,OAAO,IAAID,CAAAA,CAAW,CAAA,CAAGE,CAAY,CAAA,CAGvC,IAAMG,EAAK,IAAIL,CAAAA,CAAWC,EAAUC,CAAY,CAAA,CAC1CI,EAAO,IAAI,UAAA,CAAWD,CAAAA,CAAG,MAAM,CAAA,CACjCE,CAAAA,CAAS,EAEb,IAAA,IAASjB,CAAAA,CAAI,EAAGA,CAAAA,CAAIa,CAAAA,CAAQ,OAAQ,EAAEb,CAAAA,CAAG,CACvC,IAAIc,CAAAA,CAAMD,CAAAA,CAAQb,CAAC,CAAA,CACfc,CAAAA,YAAeJ,GACjBM,CAAAA,CAAK,GAAA,CAAI,IAAI,UAAA,CAAWF,CAAAA,CAAI,MAAA,CAAQA,CAAAA,CAAI,MAAA,CAAQA,CAAAA,CAAI,MAAQA,CAAAA,CAAI,MAAM,EAAGG,CAAM,CAAA,CAC/EA,GAAUH,CAAAA,CAAI,KAAA,CAAQA,EAAI,MAAA,EACjBA,CAAAA,YAAe,YACxBE,CAAAA,CAAK,GAAA,CAAIF,EAAKG,CAAM,CAAA,CACpBA,GAAUH,CAAAA,CAAI,MAAA,EACLA,CAAAA,YAAe,WAAA,EACxBE,CAAAA,CAAK,GAAA,CAAI,IAAI,UAAA,CAAWF,CAAG,EAAGG,CAAM,CAAA,CACpCA,GAAUH,CAAAA,CAAI,UAAA,GAGdE,CAAAA,CAAK,GAAA,CAAIF,CAAAA,CAAiBG,CAAM,EAChCA,CAAAA,EAAWH,CAAAA,CAAiB,QAEhC,CAEA,OAAAC,EAAG,KAAA,CAAQA,CAAAA,CAAG,MAAA,CAASE,CAAAA,CACvBF,CAAAA,CAAG,MAAA,CAAS,EACLA,CACT,CAEA,OAAO,IAAA,CACLG,CAAAA,CACAN,EACY,CACZ,GAAIM,aAAkBR,CAAAA,CAAY,CAChC,IAAMK,CAAAA,CAAKG,CAAAA,CAAO,OAAM,CACxB,OAAAH,EAAG,YAAA,CAAe,EAAA,CACXA,CACT,CAEA,IAAIA,CAAAA,CACJ,GAAIG,CAAAA,YAAkB,UAAA,CACpBH,EAAK,IAAIL,CAAAA,CAAW,EAAGE,CAAY,CAAA,CAC/BM,CAAAA,CAAO,MAAA,CAAS,CAAA,GAClBH,CAAAA,CAAG,OAASG,CAAAA,CAAO,MAAA,CACnBH,EAAG,MAAA,CAASG,CAAAA,CAAO,WACnBH,CAAAA,CAAG,KAAA,CAAQG,CAAAA,CAAO,UAAA,CAAaA,CAAAA,CAAO,UAAA,CACtCH,EAAG,IAAA,CAAO,IAAI,SAASG,CAAAA,CAAO,MAAM,WAE7BA,CAAAA,YAAkB,WAAA,CAC3BH,EAAK,IAAIL,CAAAA,CAAW,EAAGE,CAAY,CAAA,CAC/BM,EAAO,UAAA,CAAa,CAAA,GACtBH,EAAG,MAAA,CAASG,CAAAA,CACZH,CAAAA,CAAG,MAAA,CAAS,CAAA,CACZA,CAAAA,CAAG,MAAQG,CAAAA,CAAO,UAAA,CAClBH,EAAG,IAAA,CAAOG,CAAAA,CAAO,WAAa,CAAA,CAAI,IAAI,QAAA,CAASA,CAAM,CAAA,CAAI,IAAI,SAASxB,EAAY,CAAA,CAAA,CAAA,KAAA,GAE3E,MAAM,OAAA,CAAQwB,CAAM,EAC7BH,CAAAA,CAAK,IAAIL,CAAAA,CAAWQ,CAAAA,CAAO,MAAA,CAAQN,CAAY,EAC/CG,CAAAA,CAAG,KAAA,CAAQG,EAAO,MAAA,CAClB,IAAI,WAAWH,CAAAA,CAAG,MAAM,EAAE,GAAA,CAAIG,CAAM,OAEpC,MAAM,SAAA,CAAU,gBAAgB,CAAA,CAGlC,OAAOH,CACT,CAEA,UAAA,CACEI,CAAAA,CACAF,CAAAA,CACY,CACZ,OAAO,KAAK,MAAA,CAAOE,CAAAA,CAAQF,CAAM,CACnC,CAEA,UAAUG,CAAAA,CAAeH,CAAAA,CAA6B,CACpD,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CACnC,OAAII,EAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEVA,CAAAA,CAAS,CAAA,CAAI,IAAA,CAAK,MAAA,CAAO,YAC3B,IAAA,CAAK,MAAA,CAAOA,EAAS,CAAC,CAAA,CAGxB,KAAK,IAAA,CAAK,OAAA,CAAQA,EAAQG,CAAK,CAAA,CAE3BC,IAAU,IAAA,CAAK,MAAA,EAAU,GACtB,IACT,CAEA,UAAUD,CAAAA,CAAeH,CAAAA,CAA6B,CACpD,OAAO,IAAA,CAAK,SAAA,CAAUG,EAAOH,CAAM,CACrC,CAEA,UAAA,CAAWG,CAAAA,CAAeH,EAA6B,CACrD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAEVA,CAAAA,CAAS,CAAA,CAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAC3B,IAAA,CAAK,OAAOA,CAAAA,CAAS,CAAC,EAGxB,IAAA,CAAK,IAAA,CAAK,SAASA,CAAAA,CAAQG,CAAK,EAE5BC,CAAAA,GAAU,IAAA,CAAK,QAAU,CAAA,CAAA,CACtB,IACT,CAEA,UAAA,CAAWD,CAAAA,CAAeH,EAA6B,CACrD,OAAO,IAAA,CAAK,UAAA,CAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,SAAA,CAAUA,EAAyB,CACjC,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAMG,CAAAA,CAAQ,IAAA,CAAK,KAAK,QAAA,CAASH,CAAM,CAAA,CACvC,OAAII,CAAAA,GAAU,IAAA,CAAK,QAAU,CAAA,CAAA,CACtBD,CACT,CAEA,SAAA,CAAUH,CAAAA,CAAyB,CACjC,OAAO,IAAA,CAAK,UAAUA,CAAM,CAC9B,CAEA,UAAA,CAAWG,CAAAA,CAAeH,EAA6B,CACrD,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAEVA,CAAAA,CAAS,CAAA,CAAI,KAAK,MAAA,CAAO,UAAA,EAC3B,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,EAGxB,IAAA,CAAK,IAAA,CAAK,SAASA,CAAAA,CAAQG,CAAAA,CAAO,KAAK,YAAY,CAAA,CAE/CC,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,UAAA,CAAWD,EAAeH,CAAAA,CAA6B,CACrD,OAAO,IAAA,CAAK,UAAA,CAAWG,EAAOH,CAAM,CACtC,CAEA,WAAA,CAAYG,CAAAA,CAAeH,EAA6B,CACtD,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAEVA,CAAAA,CAAS,CAAA,CAAI,KAAK,MAAA,CAAO,UAAA,EAC3B,KAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,KAAK,SAAA,CAAUA,CAAAA,CAAQG,EAAO,IAAA,CAAK,YAAY,CAAA,CAEhDC,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,GACtB,IACT,CAEA,YAAYD,CAAAA,CAAeH,CAAAA,CAA6B,CACtD,OAAO,IAAA,CAAK,YAAYG,CAAAA,CAAOH,CAAM,CACvC,CAEA,UAAA,CAAWG,EAAeH,CAAAA,CAA6B,CACrD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEVA,CAAAA,CAAS,EAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAC3B,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,KAAK,QAAA,CAASA,CAAAA,CAAQG,EAAO,IAAA,CAAK,YAAY,CAAA,CAE/CC,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,GACtB,IACT,CAEA,SAASD,CAAAA,CAAeH,CAAAA,CAA6B,CACnD,OAAO,IAAA,CAAK,WAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,WAAA,CAAYG,EAAeH,CAAAA,CAA6B,CACtD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEVA,CAAAA,CAAS,EAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAC3B,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,KAAK,SAAA,CAAUA,CAAAA,CAAQG,EAAO,IAAA,CAAK,YAAY,CAAA,CAEhDC,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,GACtB,IACT,CAEA,YAAYD,CAAAA,CAAeH,CAAAA,CAA6B,CACtD,OAAO,IAAA,CAAK,YAAYG,CAAAA,CAAOH,CAAM,CACvC,CAEA,UAAA,CAAWA,EAAyB,CAClC,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAMG,CAAAA,CAAQ,IAAA,CAAK,KAAK,SAAA,CAAUH,CAAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,CAC3D,OAAII,IACF,IAAA,CAAK,MAAA,EAAU,GAEVD,CACT,CAEA,WAAa,IAAA,CAAK,UAAA,CAElB,MAAA,CAAOD,CAAAA,CAA0DF,CAAAA,CAA6B,CAC5F,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BI,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEd,IAAIK,EAYJ,OAXIH,CAAAA,YAAkBT,GACpBY,CAAAA,CAAM,IAAI,WAAWH,CAAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,KAAA,CAAQA,EAAO,MAAM,CAAA,CAC/EA,EAAO,MAAA,EAAUG,CAAAA,CAAI,QACZH,CAAAA,YAAkB,UAAA,CAC3BG,CAAAA,CAAMH,CAAAA,CACGA,CAAAA,YAAkB,WAAA,CAC3BG,EAAM,IAAI,UAAA,CAAWH,CAAM,CAAA,CAE3BG,CAAAA,CAAM,IAAI,UAAA,CAAWH,CAAM,CAAA,CAGzBG,CAAAA,CAAI,MAAA,EAAU,CAAA,CAAU,MAExBL,CAAAA,CAASK,CAAAA,CAAI,OAAS,IAAA,CAAK,MAAA,CAAO,YACpC,IAAA,CAAK,MAAA,CAAOL,EAASK,CAAAA,CAAI,MAAM,EAGjC,IAAI,UAAA,CAAW,KAAK,MAAM,CAAA,CAAE,IAAIA,CAAAA,CAAKL,CAAM,CAAA,CAEvCI,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAUC,EAAI,MAAA,CAAA,CAC1B,IAAA,CACT,CAEA,KAAA,CAAMC,CAAAA,CAA4B,CAChC,IAAMR,CAAAA,CAAK,IAAIL,CAAAA,CAAW,CAAA,CAAG,IAAA,CAAK,YAAY,CAAA,CAC9C,OAAIa,GACFR,CAAAA,CAAG,MAAA,CAAS,IAAI,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,CAClD,IAAI,WAAWA,CAAAA,CAAG,MAAM,EAAE,GAAA,CAAI,IAAI,WAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CACzDA,CAAAA,CAAG,KAAO,IAAI,QAAA,CAASA,EAAG,MAAM,CAAA,GAEhCA,EAAG,MAAA,CAAS,IAAA,CAAK,MAAA,CACjBA,CAAAA,CAAG,IAAA,CAAO,IAAA,CAAK,MAEjBA,CAAAA,CAAG,MAAA,CAAS,KAAK,MAAA,CACjBA,CAAAA,CAAG,aAAe,IAAA,CAAK,YAAA,CACvBA,CAAAA,CAAG,KAAA,CAAQ,IAAA,CAAK,KAAA,CACTA,CACT,CAEA,IAAA,CAAKS,EAAgBC,CAAAA,CAA0B,CAI7C,GAHID,CAAAA,GAAU,MAAA,GAAWA,CAAAA,CAAQ,IAAA,CAAK,MAAA,CAAA,CAClCC,CAAAA,GAAQ,SAAWA,CAAAA,CAAM,IAAA,CAAK,OAE9BD,CAAAA,GAAUC,CAAAA,CACZ,OAAO,IAAIf,CAAAA,CAAW,EAAG,IAAA,CAAK,YAAY,EAG5C,IAAMC,CAAAA,CAAWc,EAAMD,CAAAA,CACjBT,CAAAA,CAAK,IAAIL,CAAAA,CAAWC,CAAAA,CAAU,IAAA,CAAK,YAAY,CAAA,CACrD,OAAAI,EAAG,MAAA,CAAS,CAAA,CACZA,EAAG,KAAA,CAAQJ,CAAAA,CAEX,IAAI,UAAA,CAAWI,CAAAA,CAAG,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,WAAW,IAAA,CAAK,MAAM,EAAE,QAAA,CAASS,CAAAA,CAAOC,CAAG,CAAA,CAAG,CAAC,CAAA,CAC1EV,CACT,CAEA,MAAA,CACEW,EACAC,CAAAA,CACAC,CAAAA,CACAC,EACY,CACZ,IAAMC,EAAiB,OAAOH,CAAAA,CAAiB,IACzCN,CAAAA,CAAW,OAAOO,EAAiB,GAAA,CACzCD,CAAAA,CAAeG,EAAiBJ,CAAAA,CAAO,MAAA,CAASC,EAChDC,CAAAA,CAAeP,CAAAA,CAAW,IAAA,CAAK,MAAA,CAASO,CAAAA,CACxCC,CAAAA,CAAcA,IAAgB,MAAA,CAAY,IAAA,CAAK,MAAQA,CAAAA,CAEvD,IAAME,EAAMF,CAAAA,CAAcD,CAAAA,CAC1B,OAAIG,CAAAA,GAAQ,CAAA,CAAUL,CAAAA,EAEtBA,EAAO,cAAA,CAAeC,CAAAA,CAAeI,CAAG,CAAA,CACxC,IAAI,WAAWL,CAAAA,CAAO,MAAM,CAAA,CAAE,GAAA,CAC5B,IAAI,UAAA,CAAW,KAAK,MAAM,CAAA,CAAE,SAASE,CAAAA,CAAcC,CAAW,EAC9DF,CACF,CAAA,CAEIN,IAAU,IAAA,CAAK,MAAA,EAAUU,GACzBD,CAAAA,GAAgBJ,CAAAA,CAAO,QAAUK,CAAAA,CAAAA,CAC9B,IAAA,CACT,CAEA,cAAA,CAAepB,CAAAA,CAA8B,CAC3C,IAAIqB,CAAAA,CAAU,IAAA,CAAK,OAAO,UAAA,CAC1B,OAAIA,EAAUrB,CAAAA,CACL,IAAA,CAAK,QAAQqB,CAAAA,EAAW,CAAA,EAAKrB,CAAAA,CAAWqB,CAAAA,CAAUrB,CAAQ,CAAA,CAE5D,IACT,CAEA,IAAA,EAAmB,CACjB,OAAA,IAAA,CAAK,KAAA,CAAQ,KAAK,MAAA,CAClB,IAAA,CAAK,MAAA,CAAS,CAAA,CACP,IACT,CAEA,OAAOA,CAAAA,CAA8B,CACnC,GAAI,IAAA,CAAK,MAAA,CAAO,WAAaA,CAAAA,CAAU,CACrC,IAAMO,CAAAA,CAAS,IAAI,YAAYP,CAAQ,CAAA,CACvC,IAAI,UAAA,CAAWO,CAAM,EAAE,GAAA,CAAI,IAAI,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,EACtD,IAAA,CAAK,MAAA,CAASA,EACd,IAAA,CAAK,IAAA,CAAO,IAAI,QAAA,CAASA,CAAM,EACjC,CACA,OAAO,IACT,CAEA,IAAA,CAAKe,CAAAA,CAA4B,CAC/B,OAAA,IAAA,CAAK,MAAA,EAAUA,EACR,IACT,CAEA,UAAA,CAAWb,CAAAA,CAAwBH,CAAAA,CAA6B,CAC9D,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CACnC,OAAII,EAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEV,OAAOG,CAAAA,EAAU,QAAA,GAAUA,EAAQ,MAAA,CAAOA,CAAK,GAE/CH,CAAAA,CAAS,CAAA,CAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAC3B,IAAA,CAAK,OAAOA,CAAAA,CAAS,CAAC,EAGxB,IAAA,CAAK,IAAA,CAAK,YAAYA,CAAAA,CAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAElDC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,SAAA,CAAUD,EAAwBH,CAAAA,CAA6B,CAC7D,OAAO,IAAA,CAAK,UAAA,CAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,UAAUA,CAAAA,CAAyB,CACjC,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BI,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEd,IAAMG,EAAQ,IAAA,CAAK,IAAA,CAAK,WAAA,CAAYH,CAAAA,CAAQ,IAAA,CAAK,YAAY,EAC7D,OAAII,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtBD,CACT,CAEA,QAAA,CAASH,CAAAA,CAAyB,CAChC,OAAO,IAAA,CAAK,UAAUA,CAAM,CAC9B,CAEA,WAAA,CAAYG,CAAAA,CAAwBH,EAA6B,CAC/D,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAEV,OAAOG,CAAAA,EAAU,WAAUA,CAAAA,CAAQ,MAAA,CAAOA,CAAK,CAAA,CAAA,CAE/CH,CAAAA,CAAS,EAAI,IAAA,CAAK,MAAA,CAAO,YAC3B,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,KAAK,YAAA,CAAaA,CAAAA,CAAQG,EAAO,IAAA,CAAK,YAAY,EAEnDC,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,YAAYD,CAAAA,CAAwBH,CAAAA,CAA6B,CAC/D,OAAO,IAAA,CAAK,YAAYG,CAAAA,CAAOH,CAAM,CACvC,CAEA,UAAA,CAAWA,CAAAA,CAAyB,CAClC,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,EAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAMG,CAAAA,CAAQ,IAAA,CAAK,KAAK,YAAA,CAAaH,CAAAA,CAAQ,KAAK,YAAY,CAAA,CAC9D,OAAII,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,GACtBD,CACT,CAEA,WAAWH,CAAAA,CAAyB,CAClC,OAAO,IAAA,CAAK,UAAA,CAAWA,CAAM,CAC/B,CAEA,QAAA,CAASiB,EAAsC,CAC7C,IAAMjB,EAAS,IAAA,CAAK,MAAA,CACdkB,EAAQ,IAAA,CAAK,KAAA,CACnB,OAAI,CAACD,CAAAA,EAAajB,CAAAA,GAAW,GAAKkB,CAAAA,GAAU,IAAA,CAAK,OAAO,UAAA,CAC/C,IAAA,CAAK,OAEVlB,CAAAA,GAAWkB,CAAAA,CAAczC,GACtB,IAAA,CAAK,MAAA,CAAO,MAAMuB,CAAAA,CAAQkB,CAAK,CACxC,CAEA,aAAA,CAAcD,EAAsC,CAClD,OAAO,IAAA,CAAK,QAAA,CAASA,CAAS,CAChC,CAEA,aAAA,CAAcd,CAAAA,CAAeH,EAAsC,CACjE,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAMmB,CAAAA,CAAO,IAAA,CAAK,kBAAkBhB,CAAK,CAAA,CAMzC,IALIH,CAAAA,CAASmB,CAAAA,CAAO,IAAA,CAAK,OAAO,UAAA,EAC9B,IAAA,CAAK,OAAOnB,CAAAA,CAASmB,CAAI,EAG3BhB,CAAAA,IAAW,CAAA,CACJA,GAAS,GAAA,EACd,IAAA,CAAK,KAAK,QAAA,CAASH,CAAAA,EAAAA,CAAWG,EAAQ,GAAA,CAAQ,GAAI,EAClDA,CAAAA,IAAW,CAAA,CAIb,OAFA,IAAA,CAAK,IAAA,CAAK,QAAA,CAASH,IAAUG,CAAK,CAAA,CAE9BC,GACF,IAAA,CAAK,MAAA,CAASJ,EACP,IAAA,EAEFmB,CACT,CAEA,YAAA,CAAanB,CAAAA,CAA6D,CACxE,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/B,OAAOA,CAAAA,CAAW,GAAA,GACpBA,CAAAA,CAAS,IAAA,CAAK,MAAA,CAAA,CAEhB,IAAIhB,EAAI,CAAA,CACJmB,CAAAA,CAAQ,EACRhB,CAAAA,CACJ,GACEA,EAAI,IAAA,CAAK,IAAA,CAAK,SAASa,CAAAA,EAAQ,CAAA,CAC3BhB,EAAI,CAAA,GACNmB,CAAAA,EAAAA,CAAUhB,EAAI,GAAA,GAAU,CAAA,CAAIH,GAE9B,EAAEA,CAAAA,CAAAA,MAAAA,CACMG,CAAAA,CAAI,GAAA,IAAU,CAAA,EAGxB,OAFAgB,GAAS,CAAA,CAELC,CAAAA,EACF,KAAK,MAAA,CAASJ,CAAAA,CACPG,GAEF,CAAE,KAAA,CAAAA,CAAAA,CAAO,MAAA,CAAQnB,CAAE,CAC5B,CAEA,iBAAA,CAAkBmB,CAAAA,CAAuB,CAEvC,OADAA,CAAAA,CAAQA,IAAU,CAAA,CACdA,CAAAA,CAAQ,GAAA,CAAe,CAAA,CAClBA,CAAAA,CAAQ,KAAA,CAAgB,EACxBA,CAAAA,CAAQ,CAAA,EAAK,GAAW,CAAA,CACxBA,CAAAA,CAAQ,GAAK,EAAA,CAAW,CAAA,CACrB,CACd,CAEA,YAAA,CAAaiB,EAAapB,CAAAA,CAAsC,CAC9D,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BqB,CAAAA,CAAgBjB,CAAAA,CAAW,IAAA,CAAK,MAAA,CAASJ,CAAAA,CAEvCsB,EAAU1C,EAAAA,EAAW,CAAE,OAAOwC,CAAG,CAAA,CACjCN,EAAMQ,CAAAA,CAAQ,MAAA,CACdC,CAAAA,CAAgB,IAAA,CAAK,iBAAA,CAAkBT,CAAG,EAYhD,OAVIO,CAAAA,CAAgBE,EAAgBT,CAAAA,CAAM,IAAA,CAAK,OAAO,UAAA,EACpD,IAAA,CAAK,MAAA,CAAOO,CAAAA,CAAgBE,CAAAA,CAAgBT,CAAG,EAGjD,IAAA,CAAK,aAAA,CAAcA,EAAKO,CAAa,CAAA,CACrCA,GAAiBE,CAAAA,CAEjB,IAAI,WAAW,IAAA,CAAK,MAAM,EAAE,GAAA,CAAID,CAAAA,CAASD,CAAa,CAAA,CACtDA,CAAAA,EAAiBP,EAEbV,CAAAA,EACF,IAAA,CAAK,MAAA,CAASiB,CAAAA,CACP,IAAA,EAEFA,CAAAA,EAAiBrB,GAAU,CAAA,CACpC,CAEA,YAAYA,CAAAA,CAA8D,CACxE,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,MAAA,CACvBA,CAAAA,CAASA,EAEd,IAAMwB,CAAAA,CAAQxB,EACRyB,CAAAA,CAAY,IAAA,CAAK,YAAA,CAAazB,CAAM,CAAA,CACpC0B,CAAAA,CAAWD,EAAU,KAAA,CACrBE,CAAAA,CAAYF,EAAU,MAAA,CAE5BzB,CAAAA,EAAU2B,EAGV,IAAMP,CAAAA,CAAMlC,IAAW,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW,IAAA,CAAK,OAAuBc,CAAAA,CAAQ0B,CAAQ,CAAC,CAAA,CAG5F,OAFA1B,CAAAA,EAAU0B,CAAAA,CAENtB,CAAAA,EACF,IAAA,CAAK,OAASJ,CAAAA,CACPoB,CAAAA,EAEA,CACL,MAAA,CAAQA,CAAAA,CACR,OAAQpB,CAAAA,CAASwB,CACnB,CAEJ,CAEA,cAAA,CAAeR,CAAAA,CAAgBhB,EAA8D,CAC3F,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,IAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,CAAAA,CAMd,IAAMoB,CAAAA,CAAMlC,EAAAA,GAAa,MAAA,CAAO,IAAI,WAAW,IAAA,CAAK,MAAA,CAAuBc,EAAQgB,CAAM,CAAC,EAE1F,OAAIZ,CAAAA,EACF,KAAK,MAAA,EAAUY,CAAAA,CACRI,GAEA,CACL,MAAA,CAAQA,CAAAA,CACR,MAAA,CAAAJ,CACF,CAEJ,CACF,CAAA,CCzpBO,IAAMY,CAAAA,CAAS,CAIpB,KAAA,CAAO,CACL,uBAAA,CACA,0BAAA,CACA,+BACA,wBAAA,CACA,wBAAA,CACA,4BACF,CAAA,CAMA,SAAA,CAAW,CACT,uBAAA,CACA,4BAAA,CACA,wBAAA,CACA,6BACA,wBACF,CAAA,CAcA,eAAgB,CACd,SAAA,CAAW,CAAC,uBAAA,CAAyB,wBAAwB,CAC/D,CAAA,CAaA,SAAA,CAAW,aAKX,QAAA,CAAU,kEAAA,CAKV,eAAgB,KAAA,CAMhB,OAAA,CAAS,IAQT,gBAAA,CAAkB,IAAA,CASlB,KAAA,CAAO,CAAA,CAyBP,UAAA,CAAY,CACV,gBAAiB,IAAA,CACjB,sBAAA,CAAwB,IACxB,qBAAA,CAAuB,CAAA,CACvB,MAAO,KAAA,CACP,iBAAA,CAAmB,GAAA,CACnB,gBAAA,CAAkB,CAAA,CAClB,mBAAA,CAAqB,GACrB,qBAAA,CAAuB,EAAA,CAWvB,kBAAmB,CACrB,CACF,EAuBMC,EAAAA,CAAoBC,CAAAA,EACxB,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACf,CACE,GAAG,IAAI,IACLA,CAAAA,CACG,MAAA,CAAQC,GAAmB,OAAOA,CAAAA,EAAM,QAAQ,CAAA,CAKhD,GAAA,CAAKA,GAAMA,CAAAA,CAAE,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAAC,CAAA,CACvC,MAAA,CAAQA,CAAAA,EAAMA,CAAAA,CAAE,MAAA,CAAS,GAAK,gBAAA,CAAiB,IAAA,CAAKA,CAAC,CAAC,CAC3D,CACF,CAAA,CACA,EAAC,CAEMC,EAAAA,CAAYF,CAAAA,EAA0B,CACjD,IAAMG,CAAAA,CAAaJ,EAAAA,CAAiBC,CAAK,CAAA,CACpCG,CAAAA,CAAW,SAChBL,CAAAA,CAAO,KAAA,CAAQK,CAAAA,EACjB,CAAA,CAYaC,EAAAA,CAAgBJ,CAAAA,EAA0B,CACrD,IAAMK,CAAAA,CAAQN,GAAiBC,CAAK,CAAA,CAC/BK,EAAM,MAAA,GACXP,CAAAA,CAAO,UAAYO,CAAAA,EACrB,CAAA,CAUaC,GACXC,CAAAA,EACS,CACT,GAAI,CAACA,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,CAAU,OACrC,IAAMpD,CAAAA,CAA8C,CAAE,GAAG2C,CAAAA,CAAO,cAAe,EAC/E,IAAA,GAAW,CAACU,EAAKC,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQF,CAAG,CAAA,CAAG,CAC7C,IAAMF,CAAAA,CAAQN,GAAiBU,CAAI,CAAA,CAC/BJ,EAAM,MAAA,CACRlD,CAAAA,CAAKqD,CAAiB,CAAA,CAAIH,CAAAA,CAE1B,OAAOlD,EAAKqD,CAAiB,EAEjC,CACAV,CAAAA,CAAO,cAAA,CAAiB3C,EAC1B,CAAA,CASauD,EAAAA,CAAgBC,GAAqB,CAGhD,GAAI,OAAOA,CAAAA,EAAO,QAAA,CAAU,OAC5B,IAAMtC,CAAAA,CAAQsC,EAAG,IAAA,EAAK,CAKlB,CAACtC,CAAAA,EAAS,uBAAA,CAAwB,IAAA,CAAKA,CAAK,CAAA,GAChDyB,CAAAA,CAAO,UAAYzB,CAAAA,EACrB,CAAA,CAaauC,GAAiBC,CAAAA,EAA2C,CACvE,GAAI,CAACA,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAAU,OACvC,IAAMC,CAAAA,CAAIhB,CAAAA,CAAO,WACXiB,CAAAA,CAAQC,CAAAA,EAA6B,OAAOA,CAAAA,EAAM,SAAA,CAClDC,CAAAA,CAAOD,GACX,OAAOA,CAAAA,EAAM,UAAY,MAAA,CAAO,QAAA,CAASA,CAAC,CAAA,EAAKA,CAAAA,CAAI,EACjDD,CAAAA,CAAKF,CAAAA,CAAK,eAAe,CAAA,GAAGC,CAAAA,CAAE,gBAAkBD,CAAAA,CAAK,eAAA,CAAA,CAMrDI,EAAIJ,CAAAA,CAAK,sBAAsB,CAAA,GACjCC,CAAAA,CAAE,sBAAA,CAAyB,IAAA,CAAK,IAAID,CAAAA,CAAK,sBAAA,CAAwB,GAAK,CAAA,CAAA,CAEpEI,CAAAA,CAAIJ,EAAK,qBAAqB,CAAA,GAAGC,CAAAA,CAAE,qBAAA,CAAwBD,CAAAA,CAAK,qBAAA,CAAA,CAChEE,EAAKF,CAAAA,CAAK,KAAK,IAAGC,CAAAA,CAAE,KAAA,CAAQD,EAAK,KAAA,CAAA,CACjCI,CAAAA,CAAIJ,CAAAA,CAAK,iBAAiB,CAAA,GAAGC,CAAAA,CAAE,kBAAoBD,CAAAA,CAAK,iBAAA,CAAA,CACxDI,EAAIJ,CAAAA,CAAK,gBAAgB,IAAGC,CAAAA,CAAE,gBAAA,CAAmBD,EAAK,gBAAA,CAAA,CACtDI,CAAAA,CAAIJ,EAAK,mBAAmB,CAAA,GAAGC,EAAE,mBAAA,CAAsBD,CAAAA,CAAK,qBAI5DI,CAAAA,CAAIJ,CAAAA,CAAK,qBAAqB,CAAA,GAChCC,CAAAA,CAAE,qBAAA,CAAwB,KAAK,GAAA,CAAID,CAAAA,CAAK,sBAAuB,CAAC,CAAA,CAAA,CAG9DI,EAAIJ,CAAAA,CAAK,iBAAiB,CAAA,GAC5BC,CAAAA,CAAE,iBAAA,CAAoB,IAAA,CAAK,IAAID,CAAAA,CAAK,iBAAA,CAAmB,CAAC,CAAA,EAE5D,ECxRO,IAAMK,EAAAA,CAAN,MAAMC,CAAU,CACrB,KACA,QAAA,CACQ,UAAA,CAQR,YAAYC,CAAAA,CAAkBC,CAAAA,CAAkBC,EAAsB,CACpE,IAAA,CAAK,IAAA,CAAOF,CAAAA,CACZ,IAAA,CAAK,QAAA,CAAWC,EAChB,IAAA,CAAK,UAAA,CAAaC,GAAc,KAClC,CAQA,OAAO,IAAA,CAAKC,CAAAA,CAAgB,CAC1B,GAAI,OAAOA,CAAAA,EAAW,SAAU,CAC9B,IAAMC,EAAOC,UAAAA,CAAWF,CAAM,EAC1BF,CAAAA,CAAW,QAAA,CAASK,UAAAA,CAAWF,CAAAA,CAAK,QAAA,CAAS,CAAA,CAAG,CAAC,CAAC,CAAA,CAAG,EAAE,CAAA,CAAI,EAAA,CAC3DF,EAAa,IAAA,CAGbD,CAAAA,CAAW,IACbC,CAAAA,CAAa,KAAA,CACbD,EAAWA,CAAAA,CAAW,CAAA,CAAA,CAExB,IAAMD,CAAAA,CAAOI,CAAAA,CAAK,SAAS,CAAC,CAAA,CAC5B,OAAO,IAAIL,CAAAA,CAAUC,CAAAA,CAAMC,EAAUC,CAAU,CACjD,MACE,MAAM,IAAI,MAAM,0BAA0B,CAE9C,CAMA,QAAA,EAAW,CACT,IAAMnD,EAAS,IAAI,UAAA,CAAW,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CACxC,OAAI,IAAA,CAAK,UAAA,CACPA,CAAAA,CAAO,CAAC,EAAK,IAAA,CAAK,QAAA,CAAW,GAAM,GAAA,CAEnCA,CAAAA,CAAO,CAAC,CAAA,CAAK,IAAA,CAAK,SAAW,EAAA,CAAM,GAAA,CAErCA,EAAO,GAAA,CAAI,IAAA,CAAK,KAAM,CAAC,CAAA,CAChBA,CACT,CAMA,cAAA,EAAiB,CACf,OAAOuD,UAAAA,CAAW,IAAA,CAAK,UAAU,CACnC,CAQA,QAAA,EAAW,CACT,OAAO,IAAA,CAAK,cAAA,EACd,CAQA,YAAA,CAAaC,CAAAA,CAAyC,CACpD,GACGA,CAAAA,YAAmB,YAAcA,CAAAA,CAAQ,MAAA,GAAW,IACpD,OAAOA,CAAAA,EAAY,QAAA,EAAYA,CAAAA,CAAQ,MAAA,GAAW,EAAA,CAEnD,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA,CAEvD,OAAOA,GAAY,QAAA,GACrBA,CAAAA,CAAUF,WAAWE,CAAO,CAAA,CAAA,CAE9B,IAAMC,CAAAA,CAAMC,SAAAA,CAAU,UAAU,SAAA,CAAU,IAAA,CAAK,KAAM,SAAS,CAAA,CACxDL,CAAAA,CAAO,IAAIK,SAAAA,CAAU,SAAA,CAAUD,EAAI,CAAA,CAAGA,CAAAA,CAAI,EAAG,IAAA,CAAK,QAAQ,EAChE,OAAO,IAAIE,CAAAA,CAAUN,CAAAA,CAAK,gBAAA,CAAiBG,CAAO,EAAE,OAAA,EAAS,CAC/D,CACF,MC5FaG,CAAAA,CAAN,MAAMC,CAAU,CACrB,GAAA,CACA,MAAA,CAOA,YAAYC,CAAAA,CAAiBC,CAAAA,CAAiB,CAC5C,IAAA,CAAK,GAAA,CAAMD,EAGX,IAAA,CAAK,MAAA,CAASC,GAAUnC,CAAAA,CAAO,eACjC,CAUA,OAAO,UAAA,CAAWoC,EAAwB,CACxC,IAAMC,EAAiBrC,CAAAA,CAAO,cAAA,CAC9B,GAAI,OAAOoC,CAAAA,EAAQ,QAAA,EAAYA,EAAI,MAAA,EAAUC,CAAAA,CAAe,OAC1D,MAAM,IAAI,MAAM,oBAAoB,CAAA,CAEtC,IAAMF,CAAAA,CAASC,CAAAA,CAAI,KAAA,CAAM,EAAGC,CAAAA,CAAe,MAAM,EACjD,GAAIF,CAAAA,GAAWE,EACb,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAc,CAAA,CAAE,EAEhE,IAAIhE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAASiE,GAAK,MAAA,CAAOF,CAAAA,CAAI,MAAMC,CAAAA,CAAe,MAAM,CAAC,EACvD,CAAA,KAAQ,CACN,MAAM,IAAI,MAAM,6BAA6B,CAC/C,CAEA,GAAIhE,CAAAA,CAAO,MAAA,GAAW,GACpB,MAAM,IAAI,MAAM,2BAA2B,CAAA,CAE7C,IAAM6D,CAAAA,CAAM7D,CAAAA,CAAO,QAAA,CAAS,CAAA,CAAG,EAAE,CAAA,CAC3BkE,EAAWlE,CAAAA,CAAO,QAAA,CAAS,GAAI,EAAE,CAAA,CACjCmE,EAAmBC,SAAAA,CAAUP,CAAG,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,CAAC,EACrD,GAAI,CAACQ,GAAkBH,CAAAA,CAAUC,CAAgB,EAC/C,MAAM,IAAI,MAAM,8BAA8B,CAAA,CAEhD,GAAI,CACFT,SAAAA,CAAU,MAAM,SAAA,CAAUG,CAAG,EAC/B,CAAA,KAAQ,CACN,MAAM,IAAI,KAAA,CAAM,oBAAoB,CACtC,CACA,OAAO,IAAID,CAAAA,CAAUC,CAAAA,CAAKC,CAAM,CAClC,CAOA,OAAO,IAAA,CAAK5D,CAAAA,CAAsC,CAChD,OAAIA,CAAAA,YAAiB0D,CAAAA,CACZ1D,EAEA0D,CAAAA,CAAU,UAAA,CAAW1D,CAAe,CAE/C,CAQA,MAAA,CAAOsD,CAAAA,CAAqBc,CAAAA,CAAwC,CAClE,OAAI,OAAOA,CAAAA,EAAc,WACvBA,CAAAA,CAAYvB,EAAAA,CAAU,KAAKuB,CAAS,CAAA,CAAA,CAE/BZ,UAAU,MAAA,CAAOY,CAAAA,CAAU,KAAMd,CAAAA,CAAS,IAAA,CAAK,IAAK,CACzD,OAAA,CAAS,MACT,MAAA,CAAQ,SACV,CAAC,CACH,CAMA,QAAA,EAAmB,CACjB,OAAOe,EAAAA,CAAa,KAAK,GAAA,CAAK,IAAA,CAAK,MAAM,CAC3C,CAMA,MAAA,EAAiB,CACf,OAAO,IAAA,CAAK,UACd,CAMA,SAAkB,CAChB,OAAO,cAAc,IAAA,CAAK,QAAA,EAAU,CAAA,CACtC,CACF,CAAA,CAEMA,GAAe,CAACV,CAAAA,CAAiBC,IAA2B,CAChE,IAAMI,EAAWE,SAAAA,CAAUP,CAAG,EAC9B,OAAOC,CAAAA,CAASG,GAAK,MAAA,CAAO,IAAI,WAAW,CAAC,GAAGJ,EAAK,GAAGK,CAAAA,CAAS,QAAA,CAAS,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAClF,EAEMG,EAAAA,CAAoB,CAACG,EAAetF,CAAAA,GAA2B,CACnE,GAAIsF,CAAAA,CAAE,UAAA,GAAetF,CAAAA,CAAE,WAAY,OAAO,MAAA,CAC1C,QAASJ,CAAAA,CAAI,CAAA,CAAGA,EAAI0F,CAAAA,CAAE,UAAA,CAAY1F,CAAAA,EAAAA,CAChC,GAAI0F,CAAAA,CAAE1F,CAAC,IAAMI,CAAAA,CAAEJ,CAAC,EAAG,OAAO,MAAA,CAE5B,OAAO,KACT,EC9HO,IAAM2F,EAAAA,CAAN,MAAMC,CAAM,CACjB,MAAA,CACA,OAEA,WAAA,CAAYC,CAAAA,CAAgBC,EAAgB,CAC1C,IAAA,CAAK,MAAA,CAASD,CAAAA,CACd,IAAA,CAAK,MAAA,CAASC,IAAW,MAAA,CAAS,OAAA,CAAUA,IAAW,KAAA,CAAQ,KAAA,CAAQA,EACzE,CAGA,OAAO,UAAA,CAAWxB,CAAAA,CAAgByB,CAAAA,CAAgC,IAAA,CAAa,CAC7E,GAAM,CAACC,EAAcF,CAAM,CAAA,CAAIxB,EAAO,KAAA,CAAM,GAAG,CAAA,CAC/C,GAAI,CAAC,OAAA,CAAS,QAAS,KAAA,CAAO,OAAA,CAAS,MAAO,MAAA,CAAQ,KAAK,EAAE,OAAA,CAAQwB,CAAM,IAAM,EAAA,CAC/E,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyBA,CAAM,CAAA,CAAE,CAAA,CAEnD,GAAIC,CAAAA,EAAkBD,CAAAA,GAAWC,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,mCAAmCA,CAAc,CAAA,MAAA,EAASD,CAAM,CAAA,CAAE,CAAA,CAEpF,IAAMD,CAAAA,CAAS,MAAA,CAAO,UAAA,CAAWG,CAAY,CAAA,CAC7C,GAAI,CAAC,MAAA,CAAO,QAAA,CAASH,CAAM,CAAA,CACzB,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyBG,CAAY,CAAA,CAAE,CAAA,CAEzD,OAAO,IAAIJ,CAAAA,CAAMC,CAAAA,CAAQC,CAAM,CACjC,CAOA,OAAO,IAAA,CAAK1E,CAAAA,CAAgC0E,EAA+B,CACzE,GAAI1E,aAAiBwE,CAAAA,CAAO,CAC1B,GAAIE,CAAAA,EAAU1E,CAAAA,CAAM,SAAW0E,CAAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCA,CAAM,SAAS1E,CAAAA,CAAM,MAAM,EAAE,CAAA,CAElF,OAAOA,CACT,CAAA,KAAO,CAAA,GAAI,OAAOA,CAAAA,EAAU,QAAA,EAAY,MAAA,CAAO,SAASA,CAAK,CAAA,CAC3D,OAAO,IAAIwE,CAAAA,CAAMxE,EAAO0E,CAAAA,EAAU,OAAO,CAAA,CACpC,GAAI,OAAO1E,CAAAA,EAAU,SAC1B,OAAOwE,CAAAA,CAAM,WAAWxE,CAAAA,CAAO0E,CAAM,EAErC,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkB,MAAA,CAAO1E,CAAK,CAAC,CAAA,CAAA,CAAG,EAEtD,CAKA,YAAA,EAAe,CACb,OAAQ,IAAA,CAAK,MAAA,EACX,KAAK,OAAA,CACL,KAAK,KAAA,CACL,KAAK,QACL,KAAK,KAAA,CACL,KAAK,KAAA,CACL,KAAK,MAAA,CACH,OAAO,CAAA,CACT,KAAK,QACH,OAAO,CAAA,CACT,QACE,OAAO,CACX,CACF,CAGA,QAAA,EAAW,CACT,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAC,IAAI,IAAA,CAAK,MAAM,EACnE,CAEA,MAAA,EAAS,CACP,OAAO,IAAA,CAAK,UACd,CACF,ECvEO,IAAM6E,EAAAA,CAAN,MAAMC,CAAU,CACrB,MAAA,CAEA,OAAO,IAAA,CAAK9E,CAAAA,CAAwC,CAClD,OAAIA,CAAAA,YAAiB8E,CAAAA,CACZ9E,EACEA,CAAAA,YAAiB,UAAA,CACnB,IAAI8E,CAAAA,CAAU9E,CAAK,EACjB,OAAOA,CAAAA,EAAU,QAAA,CACnB,IAAI8E,CAAAA,CAAU1B,UAAAA,CAAWpD,CAAK,CAAC,CAAA,CAE/B,IAAI8E,CAAAA,CAAU,IAAI,WAAW9E,CAAK,CAAC,CAE9C,CAEA,WAAA,CAAYF,EAAoB,CAC9B,IAAA,CAAK,OAASA,EAChB,CAEA,UAAW,CACT,OAAOuD,UAAAA,CAAW,IAAA,CAAK,MAAM,CAC/B,CAEA,MAAA,EAAS,CACP,OAAO,IAAA,CAAK,QAAA,EACd,CACF,CAAA,CCtBA,IAAM0B,CAAAA,CAAgB,CACpB,IAAA,CAAM,EACN,OAAA,CAAS,CAAA,CACT,SAAU,CAAA,CACV,mBAAA,CAAqB,EACrB,gBAAA,CAAkB,CAAA,CAClB,kBAAA,CAAoB,CAAA,CACpB,kBAAA,CAAoB,CAAA,CACpB,aAAc,CAAA,CACd,OAAA,CAAS,EACT,cAAA,CAAgB,CAAA,CAChB,eAAgB,EAAA,CAChB,cAAA,CAAgB,GAChB,oBAAA,CAAsB,EAAA,CACtB,sBAAuB,EAAA,CAEvB,MAAA,CAAQ,GAER,cAAA,CAAgB,EAAA,CAChB,YAAa,EAAA,CACb,eAAA,CAAiB,EAAA,CACjB,0BAAA,CAA4B,EAAA,CAC5B,mBAAA,CAAqB,GACrB,aAAA,CAAe,EAAA,CACf,uBAAwB,EAAA,CACxB,wBAAA,CAA0B,GAC1B,eAAA,CAAiB,EAAA,CACjB,uBAAA,CAAyB,EAAA,CACzB,eAAA,CAAiB,EAAA,CACjB,eAAgB,EAAA,CAChB,cAAA,CAAgB,GAEhB,cAAA,CAAgB,EAAA,CAChB,oBAAqB,EAAA,CACrB,qBAAA,CAAuB,EAAA,CACvB,4BAAA,CAA8B,EAAA,CAE9B,qBAAA,CAAuB,GACvB,aAAA,CAAe,EAAA,CACf,kBAAmB,EAAA,CACnB,oBAAA,CAAsB,GACtB,uBAAA,CAAyB,EAAA,CACzB,+BAAgC,EAAA,CAChC,sBAAA,CAAwB,GACxB,eAAA,CAAiB,EAAA,CACjB,gBAAiB,EAAA,CACjB,qBAAA,CAAuB,GACvB,eAAA,CAAiB,EAAA,CACjB,eAAA,CAAiB,EAAA,CACjB,sBAAA,CAAwB,EAAA,CACxB,mBAAoB,EACtB,CAAA,CAIMC,GAAiB,IAAM,CAC3B,MAAM,IAAI,KAAA,CAAM,4BAA4B,CAC9C,CAAA,CACMC,CAAAA,CAAmB,CAACnF,CAAAA,CAAoBiD,CAAAA,GAAiB,CAC7DjD,CAAAA,CAAO,YAAA,CAAaiD,CAAI,EAC1B,CAAA,CAEMmC,EAAAA,CAAkB,CAACpF,CAAAA,CAAoBiD,CAAAA,GAAiB,CAC5DjD,CAAAA,CAAO,UAAA,CAAWiD,CAAI,EACxB,CAAA,CAEMoC,GAAkB,CAACrF,CAAAA,CAAoBiD,IAA0B,CACrEjD,CAAAA,CAAO,WAAWiD,CAAI,EACxB,EAEMqC,EAAAA,CAAkB,CAACtF,EAAoBiD,CAAAA,GAAiB,CAC5DjD,CAAAA,CAAO,UAAA,CAAWiD,CAAI,EACxB,EAEMsC,EAAAA,CAAmB,CAACvF,EAAoBiD,CAAAA,GAAiB,CAC7DjD,EAAO,WAAA,CAAYiD,CAAI,EACzB,CAAA,CAEMuC,CAAAA,CAAmB,CAACxF,EAAoBiD,CAAAA,GAAiB,CAC7DjD,EAAO,WAAA,CAAYiD,CAAI,EACzB,CAAA,CAEMwC,EAAAA,CAAmB,CAACzF,CAAAA,CAAoBiD,CAAAA,GAA0B,CACtEjD,EAAO,WAAA,CAAYiD,CAAI,EACzB,CAAA,CAEMyC,EAAAA,CAAoB,CAAC1F,CAAAA,CAAoBiD,CAAAA,GAA2B,CACxEjD,CAAAA,CAAO,SAAA,CAAUiD,EAAO,CAAA,CAAI,CAAC,EAC/B,CAAA,CAEM0C,EAAAA,CAA2BC,GAgCxB,CAAC5F,CAAAA,CAAoBiD,CAAAA,GAAc,CACxC,GAAM,CAAC4C,EAAIC,CAAI,CAAA,CAAI7C,EACnBjD,CAAAA,CAAO,aAAA,CAAc6F,CAAE,CAAA,CACvBD,CAAAA,CAAgBC,CAAE,CAAA,CAAE7F,CAAAA,CAAQ8F,CAAI,EAClC,CAAA,CAQIC,CAAAA,CAAkB,CAAC/F,CAAAA,CAAoBiD,CAAAA,GAAyB,CACpE,IAAM+C,CAAAA,CAAQvB,EAAAA,CAAM,IAAA,CAAKxB,CAAI,CAAA,CACvBgD,EAAYD,CAAAA,CAAM,YAAA,GACxBhG,CAAAA,CAAO,UAAA,CAAW,KAAK,KAAA,CAAMgG,CAAAA,CAAM,OAAS,IAAA,CAAK,GAAA,CAAI,GAAIC,CAAS,CAAC,CAAC,CAAA,CACpEjG,CAAAA,CAAO,WAAWiG,CAAS,CAAA,CAC3B,IAAA,IAAS,CAAA,CAAI,CAAA,CAAG,CAAA,CAAI,EAAG,CAAA,EAAA,CACrBjG,CAAAA,CAAO,WAAWgG,CAAAA,CAAM,MAAA,CAAO,WAAW,CAAC,CAAA,EAAK,CAAC,EAErD,CAAA,CAEME,EAAAA,CAAiB,CAAClG,CAAAA,CAAoBiD,CAAAA,GAAiB,CAC3DjD,CAAAA,CAAO,WAAA,CAAY,KAAK,KAAA,CAAM,IAAI,IAAA,CAAKiD,CAAAA,CAAO,GAAG,CAAA,CAAE,SAAQ,CAAI,GAAI,CAAC,EACtE,CAAA,CAEMkD,GAAsB,CAACnG,CAAAA,CAAoBiD,IAA6B,CAE1EA,CAAAA,GAAS,MACR,OAAOA,CAAAA,EAAS,UAAYA,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAM,yCAAA,CAEjDjD,CAAAA,CAAO,MAAA,CAAO,IAAI,UAAA,CAAW,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA,CAExCA,EAAO,MAAA,CAAO2D,CAAAA,CAAU,KAAKV,CAAI,CAAA,CAAE,GAAG,EAE1C,CAAA,CAEMmD,GAAmB,CAAClF,CAAAA,CAAsB,OACvC,CAAClB,CAAAA,CAAoBiD,CAAAA,GAA0C,CACpEA,CAAAA,CAAO8B,EAAAA,CAAU,KAAK9B,CAAI,CAAA,CAC1B,IAAMpC,CAAAA,CAAMoC,CAAAA,CAAK,OAAO,MAAA,CACxB,GAAI/B,GACF,GAAIL,CAAAA,GAAQK,EACV,MAAM,IAAI,MAAM,CAAA,qCAAA,EAAwCA,CAAI,eAAeL,CAAG,CAAA,CAAE,CAAA,CAAA,KAGlFb,CAAAA,CAAO,aAAA,CAAca,CAAG,EAE1Bb,CAAAA,CAAO,MAAA,CAAOiD,EAAK,MAAM,EAC3B,EAGIoD,EAAAA,CAA2BD,EAAAA,EAAiB,CAE5CE,EAAAA,CAAoB,CAACC,CAAAA,CAAoBC,IACtC,CAACxG,CAAAA,CAAoBiD,IAAc,CACxCjD,CAAAA,CAAO,cAAciD,CAAAA,CAAK,MAAM,CAAA,CAChC,IAAA,GAAW,CAACY,CAAAA,CAAK3D,CAAK,CAAA,GAAK+C,CAAAA,CACzBsD,EAAcvG,CAAAA,CAAQ6D,CAAG,EACzB2C,CAAAA,CAAgBxG,CAAAA,CAAQE,CAAK,EAEjC,CAAA,CAGIuG,EAAmBC,CAAAA,EAChB,CAAC1G,EAAoBiD,CAAAA,GAAgB,CAC1CjD,EAAO,aAAA,CAAciD,CAAAA,CAAK,MAAM,CAAA,CAChC,IAAA,IAAW6C,CAAAA,IAAQ7C,EACjByD,CAAAA,CAAe1G,CAAAA,CAAQ8F,CAAI,EAE/B,CAAA,CAGIa,GAAoBC,CAAAA,EACjB,CAAC5G,CAAAA,CAAoBiD,CAAAA,GAAc,CACxC,IAAA,GAAW,CAACY,CAAAA,CAAKgD,CAAU,IAAKD,CAAAA,CAC9B,GAAI,CACFC,CAAAA,CAAW7G,CAAAA,CAAQiD,CAAAA,CAAKY,CAAG,CAAC,EAC9B,OAASiD,CAAAA,CAAY,CACnB,MAAAA,CAAAA,CAAM,OAAA,CAAU,GAAGjD,CAAG,CAAA,EAAA,EAAKiD,EAAM,OAAO,CAAA,CAAA,CAClCA,CACR,CAEJ,CAAA,CAGIC,GAAsBP,CAAAA,EACnB,CAACxG,EAAoBiD,CAAAA,GAA0B,CAChDA,CAAAA,GAAS,MAAA,EACXjD,CAAAA,CAAO,SAAA,CAAU,CAAC,CAAA,CAClBwG,CAAAA,CAAgBxG,EAAQiD,CAAI,CAAA,EAE5BjD,EAAO,SAAA,CAAU,CAAC,EAEtB,CAAA,CAGIgH,CAAAA,CAAsBL,EAAAA,CAAiB,CAC3C,CAAC,kBAAA,CAAoBnB,CAAgB,CAAA,CACrC,CAAC,gBAAiBc,EAAAA,CAAkBnB,CAAAA,CAAkBI,EAAgB,CAAC,CAAA,CACvE,CAAC,YAAae,EAAAA,CAAkBH,EAAAA,CAAqBZ,EAAgB,CAAC,CACxE,CAAC,CAAA,CAEK0B,EAAAA,CAAwBN,GAAiB,CAC7C,CAAC,UAAWxB,CAAgB,CAAA,CAC5B,CAAC,QAAA,CAAUI,EAAgB,CAC7B,CAAC,CAAA,CAEK2B,EAAAA,CAAkBP,EAAAA,CAAiB,CACvC,CAAC,OAAQZ,CAAe,CAAA,CACxB,CAAC,OAAA,CAASA,CAAe,CAC3B,CAAC,CAAA,CAWKoB,EAAAA,CAA4BR,EAAAA,CAAiB,CACjD,CAAC,uBAAwBZ,CAAe,CAAA,CACxC,CAAC,oBAAA,CAAsBP,CAAgB,EACvC,CAAC,mBAAA,CAAqBD,EAAgB,CACxC,CAAC,CAAA,CAEK6B,EAA0B,CAACC,CAAAA,CAA0BC,IAAqB,CAC9E,IAAMC,EAAmBZ,EAAAA,CAAiBW,CAAW,EACrD,OAAO,CAACtH,EAAoBiD,CAAAA,GAAc,CACxCjD,EAAO,aAAA,CAAcqH,CAAW,EAChCE,CAAAA,CAAiBvH,CAAAA,CAAQiD,CAAI,EAC/B,CACF,CAAA,CAEMuE,EAAmF,EAAC,CAE1FA,EAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,EAAc,cAAA,CAAgB,CAC1F,CAAC,KAAA,CAAOc,CAAe,CAAA,CACvB,CAAC,SAAA,CAAWZ,CAAgB,EAC5B,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,CAAC,OAAA,CAAS6B,CAAmB,CAAA,CAC7B,CAAC,SAAUA,CAAmB,CAAA,CAC9B,CAAC,SAAA,CAAWA,CAAmB,EAC/B,CAAC,UAAA,CAAYb,EAAmB,CAAA,CAChC,CAAC,gBAAiBhB,CAAgB,CACpC,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,+BAAiCJ,CAAAA,CACpDnC,CAAAA,CAAc,8BAAA,CACd,CACE,CAAC,KAAA,CAAOc,CAAe,CAAA,CACvB,CAAC,aAAcA,CAAe,CAAA,CAC9B,CAAC,SAAA,CAAWZ,CAAgB,CAAA,CAC5B,CAAC,kBAAA,CAAoBA,CAAgB,EACrC,CAAC,OAAA,CAAS6B,CAAmB,CAAA,CAC7B,CAAC,SAAUA,CAAmB,CAAA,CAC9B,CAAC,SAAA,CAAWA,CAAmB,CAAA,CAC/B,CAAC,UAAA,CAAYb,EAAmB,EAChC,CAAC,eAAA,CAAiBhB,CAAgB,CAAA,CAClC,CAAC,aAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,EAEAsC,CAAAA,CAAqB,cAAA,CAAiBJ,EAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,OAAA,CAAS4B,GAAmBC,CAAmB,CAAC,EACjD,CAAC,QAAA,CAAUD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CAClD,CAAC,SAAA,CAAWD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CACnD,CAAC,UAAA,CAAYb,EAAmB,CAAA,CAChC,CAAC,eAAA,CAAiBhB,CAAgB,CACpC,CAAC,CAAA,CAEDqC,EAAqB,qBAAA,CAAwBJ,CAAAA,CAC3CnC,EAAc,qBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,OAAA,CAASA,CAAgB,CAC5B,CACF,EAEAqC,CAAAA,CAAqB,oBAAA,CAAuBJ,CAAAA,CAC1CnC,CAAAA,CAAc,oBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,SAAA,CAAWA,CAAgB,CAAA,CAC5B,CAAC,SAAA,CAAWO,EAAiB,CAC/B,CACF,EAEA8B,CAAAA,CAAqB,4BAAA,CAA+BJ,EAClDnC,CAAAA,CAAc,4BAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,YAAA,CAAcK,CAAgB,CACjC,CACF,EAEAgC,CAAAA,CAAqB,uBAAA,CAA0BJ,EAC7CnC,CAAAA,CAAc,uBAAA,CACd,CACE,CAAC,oBAAA,CAAsBE,CAAgB,CAAA,CACvC,CAAC,uBAAwBA,CAAgB,CAAA,CACzC,CAAC,YAAA,CAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,EAEAsC,CAAAA,CAAqB,aAAA,CAAgBJ,EAAwBnC,CAAAA,CAAc,aAAA,CAAe,CACxF,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,KAAA,CAAOY,CAAe,CAAA,CACvB,CAAC,aAAcU,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAEDsC,CAAAA,CAAqB,oBAAA,CAAuBJ,CAAAA,CAC1CnC,EAAc,oBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,aAAA,CAAeY,CAAe,CAAA,CAC/B,CAAC,aAAcA,CAAe,CAAA,CAC9B,CAAC,cAAA,CAAgBA,CAAe,CAClC,CACF,CAAA,CAEAyB,CAAAA,CAAqB,OAAA,CAAUJ,CAAAA,CAAwBnC,CAAAA,CAAc,QAAS,CAC5E,CAAC,gBAAiBE,CAAgB,CAAA,CAClC,CAAC,iBAAA,CAAmBA,CAAgB,CAAA,CACpC,CAAC,QAAA,CAAUA,CAAgB,EAC3B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,QAASA,CAAgB,CAAA,CAC1B,CAAC,MAAA,CAAQA,CAAgB,CAAA,CACzB,CAAC,eAAA,CAAiBA,CAAgB,CACpC,CAAC,CAAA,CAEDqC,EAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,EAAc,eAAA,CAAiB,CAC5F,CAAC,QAAA,CAAUE,CAAgB,EAC3B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,qBAAA,CAAuBY,CAAe,CAAA,CACvC,CAAC,cAAeR,EAAgB,CAAA,CAChC,CAAC,aAAA,CAAeG,EAAiB,EACjC,CAAC,wBAAA,CAA0BA,EAAiB,CAAA,CAC5C,CACE,YAAA,CACAe,EACEd,EAAAA,CAAwB,CACtBgB,GAAiB,CAAC,CAAC,gBAAiBF,CAAAA,CAAgBQ,EAAqB,CAAC,CAAC,CAAC,CAC9E,CAAC,CACH,CACF,CACF,CAAC,CAAA,CAEDO,EAAqB,OAAA,CAAUJ,CAAAA,CAAwBnC,EAAc,OAAA,CAAS,CAC5E,CAAC,OAAA,CAASE,CAAgB,EAC1B,CAAC,WAAA,CAAaK,CAAgB,CAAA,CAC9B,CAAC,QAAA,CAAUO,CAAe,CAC5B,CAAC,EAEDyB,CAAAA,CAAqB,sBAAA,CAAyBJ,EAC5CnC,CAAAA,CAAc,sBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,CAAC,QAAS6B,CAAmB,CAAA,CAC7B,CAAC,QAAA,CAAUA,CAAmB,CAAA,CAC9B,CAAC,SAAA,CAAWA,CAAmB,EAC/B,CAAC,UAAA,CAAYb,EAAmB,CAAA,CAChC,CAAC,gBAAiBhB,CAAgB,CAAA,CAClC,CAAC,YAAA,CAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,CAAAA,CAAqB,OAASJ,CAAAA,CAAwBnC,CAAAA,CAAc,MAAA,CAAQ,CAC1E,CAAC,gBAAA,CAAkBwB,EAAgBtB,CAAgB,CAAC,EACpD,CAAC,IAAA,CAAMI,EAAgB,CAAA,CACvB,CAAC,MAAA,CAAQc,EAAwB,CACnC,CAAC,EAYDmB,CAAAA,CAAqB,WAAA,CAAcJ,EAAwBnC,CAAAA,CAAc,WAAA,CAAa,CACpF,CAAC,gBAAA,CAAkBwB,CAAAA,CAAgBtB,CAAgB,CAAC,CAAA,CACpD,CAAC,wBAAA,CAA0BsB,CAAAA,CAAgBtB,CAAgB,CAAC,CAAA,CAC5D,CAAC,IAAA,CAAMA,CAAgB,EACvB,CAAC,MAAA,CAAQA,CAAgB,CAC3B,CAAC,EAEDqC,CAAAA,CAAqB,qBAAA,CAAwBJ,EAC3CnC,CAAAA,CAAc,qBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,SAAA,CAAWO,EAAiB,CAC/B,CACF,EAEA8B,CAAAA,CAAqB,uBAAA,CAA0BJ,CAAAA,CAC7CnC,CAAAA,CAAc,uBAAA,CACd,CACE,CAAC,WAAA,CAAaE,CAAgB,EAC9B,CAAC,WAAA,CAAaA,CAAgB,CAAA,CAC9B,CAAC,gBAAA,CAAkBY,CAAe,CACpC,CACF,EAEAyB,CAAAA,CAAqB,cAAA,CAAiBJ,EAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,QAAA,CAAUE,CAAgB,CAAA,CAC3B,CAAC,WAAYA,CAAgB,CAC/B,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,eAAiBJ,CAAAA,CAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,OAAA,CAASA,CAAgB,CAAA,CAC1B,CAAC,KAAA,CAAOA,CAAgB,EACxB,CAAC,WAAA,CAAaK,CAAgB,CAAA,CAC9B,CAAC,UAAWE,EAAiB,CAC/B,CAAC,CAAA,CAED8B,CAAAA,CAAqB,cAAA,CAAiBJ,EAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,OAAA,CAASA,CAAgB,EAC1B,CAAC,KAAA,CAAOA,CAAgB,CAAA,CACxB,CAAC,WAAA,CAAaK,CAAgB,CAChC,CAAC,EAEDgC,CAAAA,CAAqB,cAAA,CAAiBJ,EAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,OAAA,CAASA,CAAgB,EAC1B,CAAC,KAAA,CAAOA,CAAgB,CAAA,CACxB,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,YAAaK,CAAgB,CAAA,CAC9B,CAAC,YAAA,CAAcO,CAAe,EAC9B,CAAC,aAAA,CAAeA,CAAe,CACjC,CAAC,EAEDyB,CAAAA,CAAqB,eAAA,CAAkBJ,EAAwBnC,CAAAA,CAAc,eAAA,CAAiB,CAC5F,CAAC,MAAA,CAAQE,CAAgB,EACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,aAAcY,CAAe,CAAA,CAC9B,CAAC,aAAA,CAAeA,CAAe,CAAA,CAC/B,CAAC,WAAA,CAAaP,CAAgB,EAC9B,CAAC,OAAA,CAASL,CAAgB,CAAA,CAC1B,CAAC,KAAA,CAAOY,CAAe,CAAA,CACvB,CAAC,YAAaZ,CAAgB,CAAA,CAC9B,CAAC,uBAAA,CAAyBe,EAAc,EACxC,CAAC,mBAAA,CAAqBA,EAAc,CACtC,CAAC,EAEDsB,CAAAA,CAAqB,YAAA,CAAeJ,EAAwBnC,CAAAA,CAAc,YAAA,CAAc,CACtF,CAAC,WAAA,CAAaE,CAAgB,CAAA,CAC9B,CAAC,eAAA,CAAiB+B,EAAe,CACnC,CAAC,EAEDM,CAAAA,CAAqB,kBAAA,CAAqBJ,EACxCnC,CAAAA,CAAc,kBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,EAC1B,CAAC,SAAA,CAAWK,CAAgB,CAC9B,CACF,EAEAgC,CAAAA,CAAqB,kBAAA,CAAqBJ,CAAAA,CACxCnC,CAAAA,CAAc,kBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,EAC1B,CAAC,SAAA,CAAWK,CAAgB,CAAA,CAC5B,CAAC,iBAAkBO,CAAe,CAAA,CAClC,CAAC,gBAAA,CAAkBA,CAAe,EAClC,CAAC,cAAA,CAAgBL,EAAiB,CAAA,CAClC,CAAC,YAAA,CAAcQ,EAAc,CAC/B,CACF,EAEAsB,CAAAA,CAAqB,mBAAA,CAAsBJ,EACzCnC,CAAAA,CAAc,mBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,SAAA,CAAWK,CAAgB,CAAA,CAC5B,CAAC,iBAAkBO,CAAe,CAAA,CAClC,CAAC,eAAA,CAAiBmB,EAAe,CAAA,CACjC,CAAC,cAAA,CAAgBxB,EAAiB,EAClC,CAAC,YAAA,CAAcQ,EAAc,CAC/B,CACF,EAEAsB,CAAAA,CAAqB,eAAA,CAAkBJ,EAAwBnC,CAAAA,CAAc,eAAA,CAAiB,CAC5F,CAAC,oBAAA,CAAsBE,CAAgB,CAAA,CACvC,CAAC,sBAAuB6B,CAAmB,CAAA,CAC3C,CAAC,wBAAA,CAA0BA,CAAmB,CAAA,CAC9C,CAAC,YAAA,CAAcP,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAYDsC,CAAAA,CAAqB,wBAAA,CAA2BJ,CAAAA,CAC9CnC,CAAAA,CAAc,wBAAA,CACd,CACE,CAAC,kBAAA,CAAoBE,CAAgB,CAAA,CACrC,CAAC,qBAAsBA,CAAgB,CAAA,CACvC,CAAC,qBAAA,CAAuB6B,CAAmB,CAAA,CAC3C,CAAC,YAAA,CAAcP,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,CAAAA,CAAqB,cAAgBJ,CAAAA,CAAwBnC,CAAAA,CAAc,cAAe,CACxF,CAAC,gBAAiBE,CAAgB,CAAA,CAClC,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,CAAC,qBAAA,CAAuB6B,CAAmB,CAC7C,CAAC,CAAA,CAEDQ,EAAqB,iBAAA,CAAoBJ,CAAAA,CAAwBnC,EAAc,iBAAA,CAAmB,CAChG,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,uBAAA,CAAyBA,CAAgB,EAC1C,CAAC,eAAA,CAAiBA,CAAgB,CACpC,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,0BAAA,CAA6BJ,CAAAA,CAChDnC,EAAc,0BAAA,CACd,CACE,CAAC,cAAA,CAAgBE,CAAgB,EACjC,CAAC,YAAA,CAAcA,CAAgB,CAAA,CAC/B,CAAC,UAAWI,EAAgB,CAAA,CAC5B,CAAC,WAAA,CAAaG,EAAiB,CACjC,CACF,CAAA,CAEA8B,CAAAA,CAAqB,QAAA,CAAWJ,CAAAA,CAAwBnC,CAAAA,CAAc,SAAU,CAC9E,CAAC,OAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,QAAA,CAAUY,CAAe,EAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAC3B,CAAC,EAEDqC,CAAAA,CAAqB,qBAAA,CAAwBJ,CAAAA,CAC3CnC,CAAAA,CAAc,qBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,EACzB,CAAC,YAAA,CAAcK,CAAgB,CAAA,CAC/B,CAAC,KAAML,CAAgB,CAAA,CACvB,CAAC,QAAA,CAAUY,CAAe,EAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAC3B,CACF,CAAA,CAEAqC,CAAAA,CAAqB,mBAAA,CAAsBJ,CAAAA,CACzCnC,EAAc,mBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,EACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,QAAA,CAAUY,CAAe,CAAA,CAC1B,CAAC,OAAQZ,CAAgB,CAC3B,CACF,CAAA,CAEAqC,CAAAA,CAAqB,mBAAA,CAAsBJ,CAAAA,CACzCnC,CAAAA,CAAc,mBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,QAAA,CAAUY,CAAe,CAC5B,CACF,CAAA,CAEAyB,EAAqB,IAAA,CAAOJ,CAAAA,CAAwBnC,EAAc,IAAA,CAAM,CACtE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,QAAA,CAAUA,CAAgB,EAC3B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,QAAA,CAAUC,EAAe,CAC5B,CAAC,EAEDoC,CAAAA,CAAqB,gBAAA,CAAmBJ,EAAwBnC,CAAAA,CAAc,gBAAA,CAAkB,CAC9F,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,gBAAA,CAAkBY,CAAe,CACpC,CAAC,EAEDyB,CAAAA,CAAqB,cAAA,CAAiBJ,EAAwBnC,CAAAA,CAAc,cAAA,CAAgB,CAC1F,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,MAAOA,CAAgB,CAAA,CACxB,CAAC,mBAAA,CAAqBgB,EAAmB,CAAA,CACzC,CAAC,OAAA,CAASgB,EAAyB,EACnC,CAAC,KAAA,CAAOpB,CAAe,CACzB,CAAC,EAEDyB,CAAAA,CAAqB,sBAAA,CAAyBJ,CAAAA,CAC5CnC,CAAAA,CAAc,sBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,EAC1B,CAAC,OAAA,CAASmB,GAAkBnB,CAAAA,CAAkBkB,EAAwB,CAAC,CAAA,CACvE,CAAC,YAAA,CAAcI,EAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,EAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,EAAc,eAAA,CAAiB,CAC5F,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,OAAA,CAAS4B,GAAmBC,CAAmB,CAAC,CAAA,CACjD,CAAC,QAAA,CAAUD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CAClD,CAAC,SAAA,CAAWD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CACnD,CAAC,UAAA,CAAYD,EAAAA,CAAmBZ,EAAmB,CAAC,CAAA,CACpD,CAAC,gBAAiBhB,CAAgB,CAAA,CAClC,CAAC,uBAAA,CAAyBA,CAAgB,CAAA,CAC1C,CAAC,YAAA,CAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAEDsC,CAAAA,CAAqB,gBAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,gBAAiB,CAC5F,CAAC,UAAWE,CAAgB,CAAA,CAC5B,CAAC,UAAA,CAAYA,CAAgB,EAC7B,CAAC,YAAA,CAAce,EAAc,CAAA,CAC7B,CAAC,UAAA,CAAYA,EAAc,CAAA,CAC3B,CAAC,YAAaH,CAAe,CAAA,CAC7B,CAAC,SAAA,CAAWZ,CAAgB,CAAA,CAC5B,CAAC,UAAA,CAAYA,CAAgB,EAC7B,CAAC,YAAA,CAAcsB,EAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAEDsC,CAAAA,CAAqB,qBAAA,CAAwBJ,CAAAA,CAC3CnC,CAAAA,CAAc,sBACd,CACE,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,cAAA,CAAgBsB,CAAAA,CAAgBpB,EAAe,CAAC,CAAA,CACjD,CAAC,SAAA,CAAWK,EAAiB,EAC7B,CAAC,YAAA,CAAce,EAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,CAAAA,CAAqB,gBAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,gBAAiB,CAC5F,CAAC,iBAAkBE,CAAgB,CAAA,CACnC,CAAC,cAAA,CAAgBsB,CAAAA,CAAgBpB,EAAe,CAAC,CAAA,CACjD,CAAC,aAAcoB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAED,IAAMuC,EAAAA,CAA2Bd,EAAAA,CAAiB,CAAC,CAAC,UAAA,CAAYT,EAAc,CAAC,CAAC,EAEhFsB,CAAAA,CAAqB,eAAA,CAAkBJ,EAAwBnC,CAAAA,CAAc,eAAA,CAAiB,CAC5F,CAAC,aAAA,CAAeQ,EAAgB,CAAA,CAChC,CAAC,UAAWN,CAAgB,CAAA,CAC5B,CAAC,WAAA,CAAaY,CAAe,CAAA,CAC7B,CAAC,SAAA,CAAWZ,CAAgB,EAC5B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CACE,YAAA,CACAsB,CAAAA,CAAgBd,EAAAA,CAAwB,CAACT,GAAgBuC,EAAwB,CAAC,CAAC,CACrF,CACF,CAAC,CAAA,CAEDD,CAAAA,CAAqB,sBAAA,CAAyBJ,CAAAA,CAC5CnC,CAAAA,CAAc,sBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,YAAaK,CAAgB,CAAA,CAC9B,CAAC,QAAA,CAAUO,CAAe,CAC5B,CACF,CAAA,CAEAyB,EAAqB,kBAAA,CAAqBJ,CAAAA,CACxCnC,EAAc,kBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,EACvB,CAAC,QAAA,CAAUY,CAAe,CAAA,CAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAAA,CACzB,CAAC,aAAcI,EAAgB,CAAA,CAC/B,CAAC,YAAA,CAAcA,EAAgB,EAC/B,CACE,YAAA,CACAkB,CAAAA,CACEE,EAAAA,CAAiB,CACf,CAAC,OAAQrB,EAAe,CAAA,CACxB,CAAC,OAAA,CAASqB,EAAAA,CAAiB,CAAC,CAAC,SAAA,CAAWrB,EAAe,CAAC,CAAC,CAAC,CAC5D,CAAC,CACH,CACF,CACF,CACF,CAAA,CAEA,IAAMoC,EAAAA,CAAsB,CAAC1H,CAAAA,CAAoB2H,CAAAA,GAAyB,CACxE,IAAMd,CAAAA,CAAaW,EAAqBG,CAAAA,CAAU,CAAC,CAAC,CAAA,CACpD,GAAI,CAACd,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,6BAAA,EAAgCc,CAAAA,CAAU,CAAC,CAAC,CAAA,CAAE,EAEhE,GAAI,CACFd,CAAAA,CAAW7G,CAAAA,CAAQ2H,CAAAA,CAAU,CAAC,CAAC,EACjC,CAAA,MAASb,EAAY,CACnB,MAAAA,EAAM,OAAA,CAAU,CAAA,EAAGa,EAAU,CAAC,CAAC,KAAKb,CAAAA,CAAM,OAAO,GAC3CA,CACR,CACF,EAEMc,EAAAA,CAAwBjB,EAAAA,CAAiB,CAC7C,CAAC,eAAA,CAAiBpB,EAAgB,EAClC,CAAC,kBAAA,CAAoBC,CAAgB,CAAA,CACrC,CAAC,aAAcU,EAAc,CAAA,CAC7B,CAAC,YAAA,CAAcO,CAAAA,CAAgBiB,EAAmB,CAAC,CAAA,CACnD,CAAC,YAAA,CAAcjB,CAAAA,CAAgBtB,CAAgB,CAAC,CAClD,CAAC,CAAA,CAEK0C,EAAAA,CAA0BlB,EAAAA,CAAiB,CAC/C,CAAC,MAAA,CAAQR,EAAmB,CAAA,CAC5B,CAAC,KAAMA,EAAmB,CAAA,CAC1B,CAAC,OAAA,CAASV,EAAgB,EAC1B,CAAC,OAAA,CAASD,CAAgB,CAAA,CAC1B,CAAC,YAAaY,EAAAA,EAAkB,CAClC,CAAC,CAAA,CAEY0B,EAAAA,CAAa,CAExB,KAAA,CAAO/B,CAAAA,CAUP,KAAM8B,EAAAA,CAIN,KAAA,CAAOX,GACP,SAAA,CAAWf,EAAAA,CAEX,MAAA,CAAQhB,CAAAA,CACR,WAAA,CAAayC,EAAAA,CACb,OAAQrC,EAAAA,CACR,MAAA,CAAQC,CAIV,CAAA,CCvwBO,IAAMuC,EAAAA,CAASC,CAAAA,EACb,IAAI,QAASC,CAAAA,EAAY,UAAA,CAAWA,EAASD,CAAE,CAAC,ECmBzD,IAAME,EAAAA,CAAAA,CAA0B,IAAM,CACpC,GAAI,CAGF,OACE,EAFA,OAAO,SAAA,CAAc,GAAA,EAAgB,UAAkB,OAAA,GAAY,aAAA,CAAA,EAGnE,OAAO,OAAA,CAAY,GAAA,EACnB,OAAA,CAAQ,UAAY,IAAA,EACpB,OAAA,CAAQ,SAAS,IAAA,EAAQ,IAE7B,MAAQ,CACN,OAAO,MACT,CACF,CAAA,GAAG,CAOH,SAASC,EAAAA,EAAgD,CACvD,OAAOD,EAAAA,CAAgB,CAAE,aAAcvG,CAAAA,CAAO,SAAU,CAAA,CAAI,EAC9D,CAIO,IAAMyG,CAAAA,CAAN,cAAuB,KAAM,CAClC,IAAA,CAAO,WACP,IAAA,CACA,IAAA,CACA,MAAmB,MAAA,CACnB,WAAA,CAAYC,EAAyD,CACnE,KAAA,CAAMA,EAAS,OAAO,CAAA,CACtB,KAAK,IAAA,CAAOA,CAAAA,CAAS,IAAA,CACjB,MAAA,GAAUA,CAAAA,GACZ,IAAA,CAAK,KAAOA,CAAAA,CAAS,IAAA,EAEzB,CACF,CAAA,CAOMC,EAAAA,CAAN,cAAwB,KAAM,CAC5B,IAAA,CAEA,WAAA,CAIA,WAAA,CACA,WAAA,CACEC,EACA/E,CAAAA,CACAd,CAAAA,CAAwD,EAAC,CACzD,CACA,MAAMc,CAAO,CAAA,CACb,IAAA,CAAK,IAAA,CAAO+E,CAAAA,CACZ,IAAA,CAAK,YAAc7F,CAAAA,CAAK,WAAA,EAAe,EACvC,IAAA,CAAK,WAAA,CAAcA,EAAK,WAAA,EAAe,MACzC,CACF,CAAA,CAQA,SAAS8F,GAAkBC,CAAAA,CAA+B,CACxD,GAAI,CAACA,CAAAA,CAAQ,OAAO,CAAA,CACpB,IAAMC,CAAAA,CAAO,MAAA,CAAOD,CAAM,CAAA,CAC1B,GAAI,MAAA,CAAO,QAAA,CAASC,CAAI,CAAA,CAAG,OAAOA,EAAO,CAAA,CAAIA,CAAAA,CAAO,GAAA,CAAO,CAAA,CAC3D,IAAMC,CAAAA,CAAS,KAAK,KAAA,CAAMF,CAAM,EAChC,GAAI,MAAA,CAAO,SAASE,CAAM,CAAA,CAAG,CAC3B,IAAMC,CAAAA,CAAQD,CAAAA,CAAS,KAAK,GAAA,EAAI,CAChC,OAAOC,CAAAA,CAAQ,CAAA,CAAIA,EAAQ,CAC7B,CACA,OAAO,CACT,CAGA,IAAMC,EAAAA,CAAwB,CAAC,eAAgB,WAAA,CAAa,cAAA,CAAgB,WAAW,CAAA,CAOjFC,EAAAA,CAAyB,CAC7B,iBAAA,CACA,uCAAA,CACA,aAAA,CACA,cACF,CAAA,CASA,SAASC,GAAiB,CAAA,CAAgB,CACxC,GAAI,CAAC,CAAA,CAAG,OAAO,EAAA,CACf,IAAMC,CAAAA,CAAkB,CAAC,MAAA,CAAO,CAAA,CAAE,MAAQ,EAAE,CAAA,CAAG,OAAO,CAAA,CAAE,OAAA,EAAW,EAAE,CAAA,CAAG,MAAA,CAAO,CAAA,CAAE,MAAQ,EAAE,CAAC,EACxFC,CAAAA,CAAQ,CAAA,CAAE,MACd,IAAA,IAASC,CAAAA,CAAQ,EAAGD,CAAAA,EAASC,CAAAA,CAAQ,EAAGA,CAAAA,EAAAA,CACtCF,CAAAA,CAAM,KAAK,MAAA,CAAOC,CAAAA,CAAM,MAAQ,EAAE,CAAA,CAAG,MAAA,CAAOA,CAAAA,CAAM,OAAA,EAAW,EAAE,CAAC,CAAA,CAChEA,CAAAA,CAAQA,EAAM,KAAA,CAEhB,OAAOD,EAAM,IAAA,CAAK,GAAG,CACvB,CAmBA,SAASG,EAAAA,CAAuB,EAAiB,CAC/C,GAAI,CAAC,CAAA,CAAG,OAAO,OACf,GAAI,CAAA,YAAab,EAAAA,CAAW,OAAO,KAAA,CACnC,GAAI,aAAaF,CAAAA,CAAU,OAAO,OAElC,IAAMgB,CAAAA,CAAOL,GAAiB,CAAC,CAAA,CAQ/B,OAPI,CAAA,EAAAF,EAAAA,CAAsB,KAAMQ,CAAAA,EAASD,CAAAA,CAAK,SAASC,CAAI,CAAC,GACxDP,EAAAA,CAAuB,IAAA,CAAMQ,CAAAA,EAAQF,CAAAA,CAAK,QAAA,CAASE,CAAG,CAAC,CAAA,EAIvD,CAAA,YAAa,aAEb,sDAAA,CAAuD,IAAA,CAAKF,CAAI,CAAA,CAGtE,CAwEA,SAASG,EAAAA,CAAoBF,CAAAA,CAAc7F,CAAAA,CAA0B,CASnE,OAPI,CAAA,EAAA6F,IAAS,MAAA,EAETA,CAAAA,EAAQ,OAAUA,CAAAA,EAAQ,MAAA,EAE1BA,CAAAA,GAAS,MAAA,EAGTA,CAAAA,GAAS,MAAA,EAAU,0CAA0C,IAAA,CAAK7F,CAAO,EAE/E,CAGA,SAASgG,GAAMC,CAAAA,CAAwB,CACrC,IAAMC,CAAAA,CAAMD,CAAAA,CAAO,QAAQ,GAAG,CAAA,CAC9B,OAAOC,CAAAA,CAAM,CAAA,CAAID,EAAO,KAAA,CAAM,CAAA,CAAGC,CAAG,CAAA,CAAID,CAC1C,KAKME,EAAAA,CAAqB,GAAA,CAGrBC,GAAoB,GAAA,CAGpBC,EAAAA,CAA6B,KAG7BC,EAAAA,CAAmC,CAAA,CAEnCC,EAAAA,CAAkB,GAAA,CAElBC,EAAAA,CAAwB,IAAA,CAExBC,GAAwB,EAAA,CAKxBC,EAAAA,CAAqB,GAIrBC,EAAAA,CAAsB,CAAA,CAGtBC,GAAqB,CAAA,CAAI,GAAA,CAKzBC,EAAAA,CAAqB,GAAA,CAKrBC,EAAAA,CAA4B,GAAA,CAK5BC,GAA0B,GAAA,CAiBnBC,EAAAA,CAAN,KAAwB,CACrB,MAAA,CAAS,IAAI,IAEb,WAAA,CAAYjC,CAAAA,CAA0B,CAC5C,IAAIkC,CAAAA,CAAI,KAAK,MAAA,CAAO,GAAA,CAAIlC,CAAI,CAAA,CAC5B,OAAKkC,CAAAA,GACHA,EAAI,CACF,mBAAA,CAAqB,EACrB,eAAA,CAAiB,CAAA,CACjB,iBAAkB,CAAA,CAClB,eAAA,CAAiB,CAAA,CACjB,eAAA,CAAiB,CAAA,CACjB,WAAA,CAAa,IAAI,GAAA,CACjB,SAAA,CAAW,EACX,kBAAA,CAAoB,CAAA,CACpB,cAAe,MAAA,CACf,kBAAA,CAAoB,EACpB,gBAAA,CAAkB,CAAA,CASlB,YAAa,IAAA,CAAK,GAAA,GAClB,UAAA,CAAY,IAAI,GAClB,CAAA,CACA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAIlC,CAAAA,CAAMkC,CAAC,GAElBA,CACT,CAEA,cAAclC,CAAAA,CAAclG,CAAAA,CAAcqI,EAAqBC,CAAAA,CAA2B,CACxF,IAAMF,CAAAA,CAAI,IAAA,CAAK,WAAA,CAAYlC,CAAI,CAAA,CAU/B,GATAkC,EAAE,mBAAA,CAAsB,CAAA,CAQxBA,EAAE,eAAA,CAAkB,CAAA,CAChBpI,CAAAA,CAAK,CAMP,IAAMuI,CAAAA,CAAUH,EAAE,WAAA,CAAY,GAAA,CAAIpI,CAAG,CAAA,CAAA,CACjC,CAACuI,GAAW,EAAEA,CAAAA,CAAQ,WAAaA,CAAAA,CAAQ,aAAA,CAAgB,KAAK,GAAA,EAAI,CAAA,GACtEH,EAAE,WAAA,CAAY,MAAA,CAAOpI,CAAG,EAE5B,CACI,OAAOqI,CAAAA,EAAe,QAAA,EAAY,MAAA,CAAO,SAASA,CAAU,CAAA,EAAKA,GAAc,CAAA,EAIjF,IAAA,CAAK,cAAcD,CAAAA,CAAGC,CAAAA,CAAYC,CAAAA,EAActI,CAAG,EAEvD,CAUA,kBAAkBkG,CAAAA,CAAcmC,CAAAA,CAAoBC,EAA2B,CACzE,CAAC,OAAO,QAAA,CAASD,CAAU,CAAA,EAAKA,CAAAA,CAAaH,EAAAA,EACjD,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA,CAAYhC,CAAI,CAAA,CAAGmC,CAAAA,CAAYC,CAAU,EACnE,CAaA,mBAAmBpC,CAAAA,CAAcoC,CAAAA,CAAyC,CACxE,IAAMF,CAAAA,CAAI,KAAK,MAAA,CAAO,GAAA,CAAIlC,CAAI,CAAA,CAC9B,GAAI,CAACkC,CAAAA,CAAG,OACR,IAAMI,EAAM,IAAA,CAAK,GAAA,GACjB,GAAIF,CAAAA,GAAe,OAAW,CAC5B,IAAMG,CAAAA,CAAIL,CAAAA,CAAE,UAAA,CAAW,GAAA,CAAIE,CAAU,CAAA,CACrC,OAAOG,GACLA,CAAAA,CAAE,WAAA,EAAeX,IACjBU,CAAAA,CAAMC,CAAAA,CAAE,SAAA,EAAaV,EAAAA,CACnBU,CAAAA,CAAE,MAAA,CACF,MACN,CACA,OAAO,KAAK,eAAA,CAAgBL,CAAAA,CAAGI,CAAG,CAAA,CAAIJ,CAAAA,CAAE,cAAgB,MAC1D,CAkBA,sBAAsBlC,CAAAA,CAAcwC,CAAAA,CAAmBJ,EAA2B,CAC5E,CAAC,OAAO,QAAA,CAASI,CAAS,CAAA,EAAKA,CAAAA,CAAY,EAAA,EAC/C,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA,CAAYxC,CAAI,CAAA,CAAGwC,CAAAA,CAAWJ,CAAU,EAClE,CAOQ,aAAA,CAAcF,CAAAA,CAAeC,CAAAA,CAAoBC,CAAAA,CAA2B,CAClF,IAAME,CAAAA,CAAM,KAAK,GAAA,EAAI,CAkBrB,GAZIJ,CAAAA,CAAE,gBAAA,CAAmB,CAAA,EAAKI,CAAAA,CAAMJ,CAAAA,CAAE,gBAAA,CAAmBL,KACvDK,CAAAA,CAAE,aAAA,CAAgB,OAClBA,CAAAA,CAAE,kBAAA,CAAqB,EACvBA,CAAAA,CAAE,UAAA,CAAW,OAAM,CAAA,CAErBA,CAAAA,CAAE,cACAA,CAAAA,CAAE,aAAA,GAAkB,OAChBC,CAAAA,CACAR,EAAAA,CAAqBQ,GAAc,CAAA,CAAIR,EAAAA,EAAsBO,CAAAA,CAAE,aAAA,CACrEA,CAAAA,CAAE,kBAAA,EAAA,CACFA,EAAE,gBAAA,CAAmBI,CAAAA,CAEjBF,IAAe,MAAA,CAAW,CAC5B,IAAMG,CAAAA,CAAIL,CAAAA,CAAE,UAAA,CAAW,GAAA,CAAIE,CAAU,CAAA,CACjC,CAACG,CAAAA,EAAKD,CAAAA,CAAMC,EAAE,SAAA,CAAYV,EAAAA,CAC5BK,EAAE,UAAA,CAAW,GAAA,CAAIE,CAAAA,CAAY,CAAE,MAAA,CAAQD,CAAAA,CAAY,YAAa,CAAA,CAAG,SAAA,CAAWG,CAAI,CAAC,CAAA,EAEnFC,EAAE,MAAA,CAASZ,EAAAA,CAAqBQ,GAAc,CAAA,CAAIR,EAAAA,EAAsBY,EAAE,MAAA,CAC1EA,CAAAA,CAAE,cACFA,CAAAA,CAAE,SAAA,CAAYD,GAElB,CACF,CAEA,aAAA,CAActC,CAAAA,CAAclG,CAAAA,CAAoB,CAC9C,IAAMoI,CAAAA,CAAI,IAAA,CAAK,YAAYlC,CAAI,CAAA,CAC/B,GAAIlG,CAAAA,CAAK,CAIP,IAAMwI,CAAAA,CAAM,IAAA,CAAK,GAAA,GACXG,CAAAA,CAKFP,CAAAA,CAAE,YAAY,GAAA,CAAIpI,CAAG,GAAK,CAAE,KAAA,CAAO,CAAA,CAAG,aAAA,CAAe,CAAA,CAAG,eAAA,CAAiB,CAAE,CAAA,CAAA,CAI5E2I,CAAAA,CAAS,cAAgB,CAAA,EAAKA,CAAAA,CAAS,eAAiBH,CAAAA,EACxDG,CAAAA,CAAS,gBAAkB,CAAA,EAAKH,CAAAA,CAAMG,EAAS,eAAA,CAAkB,GAAA,IAElEA,EAAS,KAAA,CAAQ,CAAA,CACjBA,EAAS,aAAA,CAAgB,CAAA,CAAA,CAE3BA,CAAAA,CAAS,KAAA,EAAA,CACTA,CAAAA,CAAS,eAAA,CAAkBH,EACvBG,CAAAA,CAAS,KAAA,EAASlB,KACpBkB,CAAAA,CAAS,aAAA,CAAgBH,EAAMd,EAAAA,CAAAA,CAEjCU,CAAAA,CAAE,WAAA,CAAY,GAAA,CAAIpI,CAAAA,CAAK2I,CAAQ,EACjC,CAAA,KAEEP,CAAAA,CAAE,sBACFA,CAAAA,CAAE,eAAA,CAAkB,KAAK,GAAA,GAE7B,CAaA,uBAAA,CAAwBlC,CAAAA,CAAclG,CAAAA,CAAmB,CACvD,IAAMoI,CAAAA,CAAI,KAAK,WAAA,CAAYlC,CAAI,EACzBsC,CAAAA,CAAM,IAAA,CAAK,KAAI,CACfG,CAAAA,CAKFP,EAAE,WAAA,CAAY,GAAA,CAAIpI,CAAG,CAAA,EAAK,CAAE,MAAO,CAAA,CAAG,aAAA,CAAe,CAAA,CAAG,eAAA,CAAiB,CAAE,CAAA,CAC/E2I,EAAS,KAAA,CAAQ,IAAA,CAAK,IAAIA,CAAAA,CAAS,KAAA,CAAQ,EAAGlB,EAAgC,CAAA,CAC9EkB,CAAAA,CAAS,eAAA,CAAkBH,CAAAA,CAC3BG,CAAAA,CAAS,cAAgBH,CAAAA,CAAMd,EAAAA,CAC/BiB,EAAS,SAAA,CAAY,IAAA,CACrBP,EAAE,WAAA,CAAY,GAAA,CAAIpI,CAAAA,CAAK2I,CAAQ,EACjC,CAWA,gBAAgBzC,CAAAA,CAAc0C,CAAAA,CAA6B,CACzD,IAAMR,CAAAA,CAAI,KAAK,WAAA,CAAYlC,CAAI,EACzBsC,CAAAA,CAAM,IAAA,CAAK,KAAI,CAEjBJ,CAAAA,CAAE,gBAAkB,CAAA,EAAKI,CAAAA,CAAMJ,EAAE,eAAA,CAAkBZ,EAAAA,GACrDY,CAAAA,CAAE,eAAA,CAAkB,CAAA,CAAA,CAEtB,IAAMS,EAAY,OAAOD,CAAAA,EAAiB,UAAY,MAAA,CAAO,QAAA,CAASA,CAAY,CAAA,EAAKA,CAAAA,CAAe,CAAA,CAChGE,CAAAA,CAAWD,CAAAA,CACbD,CAAAA,CACA,KAAK,GAAA,CAAItB,EAAAA,CAAqB,GAAKc,CAAAA,CAAE,eAAA,CAAiBb,EAAiB,CAAA,CAItEsB,CAAAA,EAAWT,CAAAA,CAAE,eAAA,EAAA,CAClBA,CAAAA,CAAE,eAAA,CAAkBI,EAMpBJ,CAAAA,CAAE,gBAAA,CAAmBS,EACjBL,CAAAA,CAAMM,CAAAA,CACN,KAAK,GAAA,CAAIV,CAAAA,CAAE,iBAAkBI,CAAAA,CAAMM,CAAQ,EAC/CV,CAAAA,CAAE,mBAAA,EAAA,CACFA,EAAE,eAAA,CAAkBI,EACtB,CAGA,eAAA,CAAgBtC,CAAAA,CAAc6C,CAAAA,CAAwB,CACpD,GAAI,CAACA,GAAY,CAAC,MAAA,CAAO,SAASA,CAAQ,CAAA,CAAG,OAC7C,IAAMX,CAAAA,CAAI,IAAA,CAAK,WAAA,CAAYlC,CAAI,CAAA,CAC/BkC,EAAE,SAAA,CAAYW,CAAAA,CACdX,EAAE,kBAAA,CAAqB,IAAA,CAAK,MAC9B,CAQQ,kBAAA,EAA6B,CACnC,IAAMI,CAAAA,CAAM,KAAK,GAAA,EAAI,CACfQ,EAAmB,EAAC,CAC1B,QAAWZ,CAAAA,IAAK,IAAA,CAAK,OAAO,MAAA,EAAO,CAC7BA,EAAE,SAAA,CAAY,CAAA,EAAKI,EAAMJ,CAAAA,CAAE,kBAAA,EAAsBT,IACnDqB,CAAAA,CAAO,IAAA,CAAKZ,CAAAA,CAAE,SAAS,CAAA,CAG3B,OAAIY,EAAO,MAAA,CAAS,CAAA,CAAU,GAC9BA,CAAAA,CAAO,IAAA,CAAK,CAAC7G,CAAAA,CAAGtF,CAAAA,GAAMsF,CAAAA,CAAItF,CAAC,CAAA,CAEpBmM,CAAAA,CAAO,KAAK,KAAA,CAAA,CAAOA,CAAAA,CAAO,OAAS,CAAA,EAAK,CAAC,CAAC,CAAA,CACnD,CAGA,aAAA,CAAc9C,CAAAA,CAAclG,CAAAA,CAAuB,CACjD,IAAMoI,CAAAA,CAAI,IAAA,CAAK,OAAO,GAAA,CAAIlC,CAAI,EAC9B,GAAI,CAACkC,EAAG,OAAO,KAAA,CACf,IAAMI,CAAAA,CAAM,IAAA,CAAK,KAAI,CAMrB,GAHIJ,EAAE,gBAAA,CAAmBI,CAAAA,EAGrBJ,CAAAA,CAAE,mBAAA,EAAuB,CAAA,EAAKI,CAAAA,CAAMJ,EAAE,eAAA,CAAkB,GAAA,CAAQ,OAAO,MAAA,CAG3E,GAAIpI,EAAK,CACP,IAAMuI,CAAAA,CAAUH,CAAAA,CAAE,WAAA,CAAY,GAAA,CAAIpI,CAAG,CAAA,CACrC,GAAIuI,GAAWA,CAAAA,CAAQ,aAAA,CAAgBC,EAAK,OAAO,MACrD,CAGA,IAAMS,CAAAA,CAAO,IAAA,CAAK,oBAAmB,CACrC,OACE,EAAAA,CAAAA,CAAO,CAAA,EACPb,EAAE,SAAA,CAAY,CAAA,EACdI,EAAMJ,CAAAA,CAAE,kBAAA,EAAsBT,IAC9BsB,CAAAA,CAAOb,CAAAA,CAAE,UAAYR,EAAAA,CAMzB,CAeA,gBAAgBpI,CAAAA,CAAiBQ,CAAAA,CAAwB,CACvD,IAAMkJ,CAAAA,CAAoB,GACpBC,CAAAA,CAAsB,GAC5B,IAAA,IAAWjD,CAAAA,IAAQ1G,EACb,IAAA,CAAK,aAAA,CAAc0G,CAAAA,CAAMlG,CAAG,CAAA,CAC9BkJ,CAAAA,CAAQ,KAAKhD,CAAI,CAAA,CAEjBiD,EAAU,IAAA,CAAKjD,CAAI,EAGvB,GAAIgD,CAAAA,CAAQ,MAAA,EAAU,CAAA,CACpB,OAAO,CAAC,GAAGA,CAAAA,CAAS,GAAGC,CAAS,CAAA,CAElC,IAAMX,EAAM,IAAA,CAAK,GAAA,GAGXY,CAAAA,CAAUF,CAAAA,CACb,IAAI,CAAChD,CAAAA,CAAMzJ,KAAO,CAAE,IAAA,CAAAyJ,EAAM,CAAA,CAAAzJ,CAAAA,CAAG,KAAA,CAAO,IAAA,CAAK,SAAA,CAAUyJ,CAAAA,CAAMsC,CAAG,CAAE,CAAA,CAAE,EAChE,IAAA,CAAK,CAACrG,EAAGtF,CAAAA,GAAMsF,CAAAA,CAAE,KAAA,CAAQtF,CAAAA,CAAE,KAAA,EAASsF,CAAAA,CAAE,EAAItF,CAAAA,CAAE,CAAC,EAC7C,GAAA,CAAKwM,CAAAA,EAAMA,EAAE,IAAI,CAAA,CACdC,CAAAA,CAAQ,IAAA,CAAK,oBAAA,CAAqBJ,CAAAA,CAASV,CAAG,CAAA,CACpD,OAAIc,GAASF,CAAAA,CAAQ,CAAC,IAAME,CAAAA,CACnB,CAACA,EAAO,GAAGF,CAAAA,CAAQ,OAAQ3J,CAAAA,EAAMA,CAAAA,GAAM6J,CAAK,CAAA,CAAG,GAAGH,CAAS,CAAA,CAE7D,CAAC,GAAGC,CAAAA,CAAS,GAAGD,CAAS,CAClC,CAGQ,eAAA,CAAgBf,EAA2BI,CAAAA,CAAsB,CACvE,OACE,CAAC,CAACJ,CAAAA,EACFA,CAAAA,CAAE,aAAA,GAAkB,MAAA,EACpBA,EAAE,kBAAA,EAAsBN,EAAAA,EACxBU,EAAMJ,CAAAA,CAAE,gBAAA,EAAoBL,EAEhC,CAOQ,SAAA,CAAU7B,CAAAA,CAAcsC,CAAAA,CAAqB,CACnD,IAAMJ,EAAI,IAAA,CAAK,MAAA,CAAO,IAAIlC,CAAI,CAAA,CAC9B,OAAK,IAAA,CAAK,eAAA,CAAgBkC,EAAGI,CAAG,CAAA,CACzBJ,EAAG,aAAA,CADgCH,EAE5C,CAaQ,oBAAA,CAAqBiB,CAAAA,CAAmBV,EAAiC,CAC/E,IAAMe,CAAAA,CAAYf,CAAAA,CAAMR,EAAAA,CACpBwB,CAAAA,CACAC,EAAY,CAAA,CAAA,CAAA,CAChB,IAAA,IAAWhK,KAAKyJ,CAAAA,CAAS,CACvB,IAAMd,CAAAA,CAAI,IAAA,CAAK,WAAA,CAAY3I,CAAC,CAAA,CACtBiK,CAAAA,CAAQ,KAAK,GAAA,CAAItB,CAAAA,CAAE,iBAAkBA,CAAAA,CAAE,WAAW,EACpDsB,CAAAA,EAASH,CAAAA,EAAaG,CAAAA,CAAQD,CAAAA,GAChCD,CAAAA,CAAO/J,CAAAA,CACPgK,EAAYC,CAAAA,EAEhB,CACA,OAAIF,CAAAA,GAAM,IAAA,CAAK,YAAYA,CAAI,CAAA,CAAE,YAAchB,CAAAA,CAAAA,CACxCgB,CACT,CACF,CAAA,CAKaG,CAAAA,CAAmB,IAAIxB,EAAAA,CAEvByB,EAAAA,CAAoB,IAAIzB,EAAAA,CAkBxB0B,EAAAA,CAAN,KAAkB,CACf,MAAA,CAASvK,CAAAA,CAAO,WAAW,mBAAA,CAEnC,QAAA,EAAoB,CAGlB,OAFA,IAAA,CAAK,OAAM,CAEP,IAAA,CAAK,MAAA,EAAU,CAAA,CAAI,IAAA,EACrB,IAAA,CAAK,QAAU,CAAA,CACR,IAAA,EAEF,KACT,CAEA,MAAA,EAAe,CACb,IAAA,CAAK,KAAA,EAAM,CACX,IAAA,CAAK,MAAA,CAAS,IAAA,CAAK,IACjBA,CAAAA,CAAO,UAAA,CAAW,oBAClB,IAAA,CAAK,MAAA,CAASA,EAAO,UAAA,CAAW,qBAClC,EACF,CAGQ,KAAA,EAAc,CAChB,IAAA,CAAK,MAAA,CAASA,EAAO,UAAA,CAAW,mBAAA,GAClC,KAAK,MAAA,CAASA,CAAAA,CAAO,UAAA,CAAW,mBAAA,EAEpC,CAGA,IAAI,WAAoB,CACtB,OAAO,KAAK,MACd,CAGA,MAAMwK,CAAAA,CAASxK,CAAAA,CAAO,UAAA,CAAW,mBAAA,CAA2B,CAC1D,IAAA,CAAK,OAASwK,EAChB,CACF,EAGaC,EAAAA,CAAiB,IAAIF,GAqBlC,SAASG,EAAAA,CACPC,CAAAA,CACA/D,CAAAA,CACAoC,CAAAA,CACA4B,CAAAA,CACAC,EACQ,CACR,IAAM7J,EAAIhB,CAAAA,CAAO,UAAA,CACjB,GAAI,CAACgB,CAAAA,CAAE,iBAAmB6J,CAAAA,CAAU,OAAOD,EAC3C,IAAME,CAAAA,CAAOH,EAAQ,kBAAA,CAAmB/D,CAAAA,CAAMoC,CAAU,CAAA,CACxD,OAAI8B,CAAAA,GAAS,MAAA,CAAkBF,CAAAA,CAGxB,IAAA,CAAK,KACV,IAAA,CAAK,GAAA,CAAIA,EAAe,IAAA,CAAK,GAAA,CAAI5J,EAAE,sBAAA,CAAwBA,CAAAA,CAAE,qBAAA,CAAwB8J,CAAI,CAAC,CAC5F,CACF,CAKA,SAASC,GAAYJ,CAAAA,CAA4B/D,CAAAA,CAAcoE,EAAQtK,CAAAA,CAAoB,CACrFsK,CAAAA,YAAarE,EAAAA,CACXqE,CAAAA,CAAE,WAAA,CAEJL,EAAQ,eAAA,CAAgB/D,CAAAA,CAAMoE,EAAE,WAAA,EAAe,MAAS,EAExDL,CAAAA,CAAQ,aAAA,CAAc/D,EAAMlG,CAAG,CAAA,CAExBsK,aAAavE,CAAAA,CAEtBkE,CAAAA,CAAQ,cAAc/D,CAAAA,CAAMlG,CAAG,EAG/BiK,CAAAA,CAAQ,aAAA,CAAc/D,CAAI,EAE9B,CAOA,SAASqE,GACPN,CAAAA,CACA/D,CAAAA,CACAkB,EACArK,CAAAA,CACM,CAEN,GADI,CAACA,CAAAA,EAAU,OAAOA,CAAAA,EAAW,QAAA,EAC7B,CAACqK,EAAO,QAAA,CAAS,+BAA+B,EAAG,OACvD,IAAMoD,EAASzN,CAAAA,CAAe,iBAAA,CAC1B,OAAOyN,CAAAA,EAAU,QAAA,EACnBP,CAAAA,CAAQ,gBAAgB/D,CAAAA,CAAMsE,CAAK,EAEvC,CAWA,SAASC,IAA6B,CACpC,GAAI,OAAO,YAAA,CAAiB,GAAA,CAC1B,OAAO,IAAI,YAAA,CAAa,2CAA4C,cAAc,CAAA,CAEpF,IAAMC,CAAAA,CAAM,IAAI,KAAA,CAAM,0CAA0C,CAAA,CAChE,OAAAA,EAAI,IAAA,CAAO,cAAA,CACJA,CACT,CAKA,SAASC,GAAoBhF,CAAAA,CAA0D,CAIrF,GADAA,CAAAA,CAAK,IAAA,CAAK,IAAA,CAAKA,CAAE,CAAA,CACb,OAAO,YAAY,OAAA,EAAY,UAAA,CACjC,OAAO,CAAE,MAAA,CAAQ,WAAA,CAAY,OAAA,CAAQA,CAAE,CAAA,CAAG,QAAS,IAAM,CAAC,CAAE,CAAA,CAE9D,IAAMiF,EAAa,IAAI,eAAA,CACjBC,EAAQ,UAAA,CAAW,IAAMD,EAAW,KAAA,CAAMH,EAAAA,EAAqB,CAAA,CAAG9E,CAAE,EAC1E,OAAO,CAAE,MAAA,CAAQiF,CAAAA,CAAW,MAAA,CAAQ,OAAA,CAAS,IAAM,YAAA,CAAaC,CAAK,CAAE,CACzE,CAMA,SAASC,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CAC8C,CAC9C,GAAI,CAACA,EAAW,OAAO,CAAE,OAAQD,CAAAA,CAAS,OAAA,CAAS,IAAM,CAAC,CAAE,CAAA,CAC5D,GAAI,OAAO,WAAA,CAAY,KAAQ,UAAA,CAC7B,OAAO,CAAE,MAAA,CAAQ,WAAA,CAAY,IAAI,CAACA,CAAAA,CAASC,CAAS,CAAC,CAAA,CAAG,QAAS,IAAM,CAAC,CAAE,CAAA,CAG5E,IAAMJ,EAAa,IAAI,eAAA,CACvB,GAAIG,CAAAA,CAAQ,OAAA,CACV,OAAAH,EAAW,KAAA,CAAMG,CAAAA,CAAQ,MAAM,CAAA,CACxB,CAAE,OAAQH,CAAAA,CAAW,MAAA,CAAQ,QAAS,IAAM,CAAC,CAAE,CAAA,CAExD,GAAII,EAAU,OAAA,CACZ,OAAAJ,EAAW,KAAA,CAAMI,CAAAA,CAAU,MAAM,CAAA,CAC1B,CAAE,MAAA,CAAQJ,EAAW,MAAA,CAAQ,OAAA,CAAS,IAAM,CAAC,CAAE,EAGxD,IAAMK,CAAAA,CAAiB,IAAML,CAAAA,CAAW,KAAA,CAAMG,EAAQ,MAAM,CAAA,CACtDG,EAAmB,IAAMN,CAAAA,CAAW,MAAMI,CAAAA,CAAU,MAAM,CAAA,CAChED,CAAAA,CAAQ,gBAAA,CAAiB,OAAA,CAASE,EAAgB,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAChED,EAAU,gBAAA,CAAiB,OAAA,CAASE,CAAAA,CAAkB,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAEpE,IAAMC,EAAU,IAAM,CACpBJ,EAAQ,mBAAA,CAAoB,OAAA,CAASE,CAAc,CAAA,CACnDD,CAAAA,CAAU,mBAAA,CAAoB,QAASE,CAAgB,EACzD,EACA,OAAO,CAAE,OAAQN,CAAAA,CAAW,MAAA,CAAQ,QAAAO,CAAQ,CAC9C,CAQA,IAAMC,EAAAA,CAAc,MAClBC,CAAAA,CACAjE,CAAAA,CACAkE,EACAC,CAAAA,CAAUjM,CAAAA,CAAO,OAAA,CACjBkM,CAAAA,CAAc,KAAA,CACdC,CAAAA,GACG,CACH,IAAMjI,CAAAA,CAAK,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,CAAI,GAAW,CAAA,CAC3CkI,CAAAA,CAAO,CACX,OAAA,CAAS,MACT,MAAA,CAAAtE,CAAAA,CACA,OAAAkE,CAAAA,CACA,EAAA,CAAA9H,CACF,CAAA,CAKM,CAAE,MAAA,CAAQmI,CAAAA,CAAS,OAAA,CAASC,CAAe,EAAIjB,EAAAA,CAAoBY,CAAO,EAC1E,CAAE,MAAA,CAAAM,EAAQ,OAAA,CAASC,CAAa,EAAIhB,EAAAA,CAAaa,CAAAA,CAASF,CAAc,CAAA,CACxEN,CAAAA,CAAU,IAAM,CACpBS,CAAAA,GACAE,CAAAA,GACF,CAAA,CAEA,GAAI,CACF,IAAMC,EAAM,MAAM,KAAA,CAAMV,EAAK,CAC3B,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUK,CAAI,CAAA,CACzB,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAA,CAAoB,GAAG5F,EAAAA,EAAwB,EAC1E,MAAA,CAAA+F,CACF,CAAC,CAAA,CAID,GAAIE,CAAAA,CAAI,SAAW,GAAA,CACjB,MAAM,IAAI9F,EAAAA,CAAUoF,CAAAA,CAAK,wBAAyB,CAChD,WAAA,CAAalF,GAAkB4F,CAAAA,CAAI,OAAA,CAAQ,IAAI,aAAa,CAAC,EAC7D,WAAA,CAAa,CAAA,CACf,CAAC,CAAA,CAUH,GAAIA,CAAAA,CAAI,MAAA,EAAU,GAAA,EAAOA,CAAAA,CAAI,OAAS,GAAA,CACpC,MAAM,IAAI9F,EAAAA,CAAUoF,CAAAA,CAAK,QAAQU,CAAAA,CAAI,MAAM,CAAA,MAAA,EAASV,CAAG,CAAA,CAAE,CAAA,CAG3D,IAAMtO,CAAAA,CAAU,MAAMgP,EAAI,IAAA,EAAK,CAC/B,GACE,CAAChP,CAAAA,EACD,OAAOA,CAAAA,CAAO,EAAA,CAAO,GAAA,EACrBA,EAAO,EAAA,GAAOyG,CAAAA,EACdzG,EAAO,OAAA,GAAY,KAAA,CAEnB,MAAM,IAAI,KAAA,CAAM,qBAAqB,CAAA,CAEvC,GAAI,WAAYA,CAAAA,CACd,OAAOA,EAAO,MAAA,CAEhB,GAAI,UAAWA,CAAAA,CAAQ,CACrB,IAAMuN,CAAAA,CAAIvN,CAAAA,CAAO,KAAA,CACjB,MAAI,SAAA,GAAauN,CAAAA,EAAK,SAAUA,CAAAA,CACxB,IAAIvE,EAASuE,CAAC,CAAA,CAEhBvN,CAAAA,CAAO,KACf,CAEA,MAAMA,CACR,CAAA,MAASuN,CAAAA,CAAG,CAQV,GAPIA,CAAAA,YAAavE,GAIbuE,CAAAA,YAAarE,EAAAA,EAGbwF,CAAAA,EAAgB,OAAA,CAClB,MAAMnB,CAAAA,CAER,GAAIkB,CAAAA,CACF,OAAOJ,GAAYC,CAAAA,CAAKjE,CAAAA,CAAQkE,EAAQC,CAAAA,CAAS,KAAA,CAAOE,CAAc,CAAA,CAExE,MAAMnB,CACR,CAAA,OAAE,CACAa,IACF,CACF,EAGA,SAASa,EAAAA,EAA6B,CACpC,OAAOtG,EAAAA,CAAM,EAAA,CAAK,KAAK,MAAA,EAAO,CAAI,EAAE,CACtC,CA4BA,SAASuG,EAAAA,CAAoB5L,CAAAA,CA0Bd,CACb,GAAM,CACJ,MAAA,CAAA+G,EACA,MAAA,CAAAkE,CAAAA,CACA,IAAAtL,CAAAA,CACA,OAAA,CAAA+K,EACA,SAAA,CAAAmB,CAAAA,CACA,aAAA,CAAAhC,CAAAA,CACA,eAAA,CAAAiC,CAAAA,CACA,WAAAC,CAAAA,CACA,cAAA,CAAAX,EACA,YAAA,CAAAY,CAAAA,CACA,SAAAC,CACF,CAAA,CAAIjM,EACJ,OAAO,IAAI,QAAW,CAACuF,CAAAA,CAAS2G,IAAW,CACzC,IAAIC,EAAO,KAAA,CACPC,CAAAA,CAAc,CAAA,CACdC,CAAAA,CAAa,KAAA,CAKbC,CAAAA,CAAiB,MACjBC,CAAAA,CACAC,CAAAA,CACAC,EAAe,CAAA,CACbC,CAAAA,CAAiC,EAAC,CAIlCC,CAAAA,CAAUC,CAAAA,EAAuB,CACrC,GAAI,CAAAT,EACJ,CAAAA,CAAAA,CAAO,KACHK,CAAAA,GAAe,MAAA,GACjB,aAAaA,CAAU,CAAA,CACvBA,CAAAA,CAAa,MAAA,CAAA,CAEf,IAAA,IAAWnQ,CAAAA,IAAKqQ,EACTrQ,CAAAA,CAAE,MAAA,CAAO,SAASA,CAAAA,CAAE,KAAA,GAE3BuQ,CAAAA,GAAO,CACT,EAEMC,CAAAA,CAAW,CAAChH,EAAciH,CAAAA,GAAqB,CACnDV,IACA,IAAM7B,EAAAA,CAAa,IAAI,eAAA,CACvBmC,CAAAA,CAAY,IAAA,CAAKnC,EAAU,CAAA,CAG3B,IAAMwC,GAAStC,EAAAA,CAAaF,EAAAA,CAAW,OAAQa,CAAc,CAAA,CACvD4B,GAAarD,EAAAA,CACjBL,CAAAA,CACAzD,CAAAA,CACAkB,CAAAA,CACA8C,CAAAA,CACAiC,CACF,EACMjN,EAAAA,CAAQ,IAAA,CAAK,KAAI,CAClBiO,CAAAA,GAASL,EAAe5N,EAAAA,CAAAA,CAC7BkM,EAAAA,CAAYlF,CAAAA,CAAMkB,CAAAA,CAAQkE,CAAAA,CAAQ+B,EAAAA,CAAY,MAAOD,EAAAA,CAAO,MAAM,EAC/D,IAAA,CAAMrB,EAAAA,EAAQ,CAIb,GAHAqB,EAAAA,CAAO,SAAQ,CACfX,CAAAA,EAAAA,CACKU,IAASR,CAAAA,CAAiB,IAAA,CAAA,CAC3B,CAAAH,CAAAA,CACJ,CAAA,GAAIF,GAAY,CAACA,CAAAA,CAASP,EAAG,CAAA,CAAG,CAS9B,GAJApC,EAAiB,uBAAA,CAAwBzD,CAAAA,CAAMlG,CAAG,CAAA,CAClD4M,CAAAA,CAAY,IAAI,KAAA,CACd,CAAA,yCAAA,EAA4CxF,CAAM,CAAA,MAAA,EAASlB,CAAI,CAAA,CACjE,EACI,CAACiH,CAAAA,EAAW,CAACT,CAAAA,CAAY,CAC3BM,EAAO,IAAMT,CAAAA,CAAOK,CAAS,CAAC,CAAA,CAC9B,MACF,CACIH,CAAAA,GAAgB,CAAA,EAClBO,EAAO,IAAMT,CAAAA,CAAOK,CAAS,CAAC,CAAA,CAEhC,MACF,CACAjD,CAAAA,CAAiB,cAAczD,CAAAA,CAAMlG,CAAAA,CAAK,KAAK,GAAA,EAAI,CAAId,GAAOkI,CAAM,CAAA,CACpEmD,EAAAA,CAAmBZ,CAAAA,CAAkBzD,CAAAA,CAAMkB,CAAAA,CAAQ2E,EAAG,CAAA,CAClDoB,CAAAA,CACGR,GAKHhD,CAAAA,CAAiB,qBAAA,CAAsBoB,EAAS,IAAA,CAAK,GAAA,EAAI,CAAI+B,CAAAA,CAAc1F,CAAM,CAAA,CAEzEsF,GACV3C,EAAAA,CAAe,MAAA,GAEjBiD,CAAAA,CAAO,IAAMpH,EAAQmG,EAAQ,CAAC,EAAA,CAChC,CAAC,CAAA,CACA,KAAA,CAAOzB,IAAM,CAIZ,GAHA8C,GAAO,OAAA,EAAQ,CACfX,IACKU,CAAAA,GAASR,CAAAA,CAAiB,MAC3B,CAAAH,CAAAA,CACJ,IAAIf,CAAAA,EAAgB,OAAA,CAAS,CAE3BuB,CAAAA,CAAO,IAAMT,EAAOjC,EAAC,CAAC,CAAA,CACtB,MACF,CACA,GAAIA,cAAavE,CAAAA,EAAY,CAACmB,GAAoBoD,EAAAA,CAAE,IAAA,CAAMA,GAAE,OAAO,CAAA,CAAG,CAEpE0C,CAAAA,CAAO,IAAMT,CAAAA,CAAOjC,EAAC,CAAC,CAAA,CACtB,MACF,CAKA,GAHAD,GAAYV,CAAAA,CAAkBzD,CAAAA,CAAMoE,EAAAA,CAAGtK,CAAG,CAAA,CAC1C2J,CAAAA,CAAiB,kBAAkBzD,CAAAA,CAAM,IAAA,CAAK,KAAI,CAAIhH,EAAAA,CAAOkI,CAAM,CAAA,CACnEwF,CAAAA,CAAYtC,GACR,CAAC6C,CAAAA,EAAW,CAACT,CAAAA,CAAY,CAE3BM,EAAO,IAAMT,CAAAA,CAAOjC,EAAC,CAAC,CAAA,CACtB,MACF,CACImC,CAAAA,GAAgB,CAAA,EAClBO,EAAO,IAAMT,CAAAA,CAAOK,CAAS,CAAC,EAAA,CAGlC,CAAC,EACL,CAAA,CAEAM,CAAAA,CAASnC,CAAAA,CAAS,KAAK,CAAA,CAUvB,IAAMX,EAAAA,CAAOT,CAAAA,CAAiB,mBAAmBoB,CAAAA,CAAS3D,CAAM,GAAK,CAAA,CAC/DkG,EAAAA,CAAgBtD,EAAAA,CACpBL,CAAAA,CACAoB,CAAAA,CACA3D,CAAAA,CACA8C,EACAiC,CACF,CAAA,CACMoB,GAAQ,IAAA,CAAK,GAAA,CACjB,KAAK,GAAA,CAAIjO,CAAAA,CAAO,WAAW,iBAAA,CAAmBA,CAAAA,CAAO,WAAW,gBAAA,CAAmB8K,EAAI,EACvF,EAAA,CAAMkD,EACR,EACAT,CAAAA,CAAa,UAAA,CAAW,IAAM,CAK5B,GAJAA,CAAAA,CAAa,OACTL,CAAAA,EAAQf,CAAAA,EAAgB,SAGxB,IAAA,CAAK,GAAA,IAASW,CAAAA,CAAY,OAK9B,IAAMoB,CAAAA,CAAOtB,CAAAA,CAAU,MAAA,CAAQzM,IAAMkK,CAAAA,CAAiB,aAAA,CAAclK,GAAGO,CAAG,CAAC,EAC3E,GAAIwN,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAG,OACvB,IAAMrP,EAASqP,CAAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAWA,CAAAA,CAAK,MAAM,CAAC,CAAA,CAEtDzD,EAAAA,CAAe,UAAS,GAC7B2C,CAAAA,CAAa,KACbL,CAAAA,CAAalO,CAAM,EACnB+O,CAAAA,CAAS/O,CAAAA,CAAQ,IAAI,CAAA,EACvB,CAAA,CAAGoP,EAAK,EACV,CAAC,CACH,CA4CO,IAAME,CAAAA,CAAU,MACrBrG,CAAAA,CACAkE,CAAAA,CAAyB,EAAC,CAC1BC,CAAAA,CACAmC,CAAAA,CAAQpO,EAAO,KAAA,CACfuM,CAAAA,CACAS,IACe,CACf,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQhN,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,EAEhD,GAAIA,CAAAA,CAAO,MAAM,MAAA,GAAW,CAAA,CAC1B,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAAA,CAKzC,IAAM6M,EAAkBZ,CAAAA,GAAY,MAAA,CAC9BoC,EAAUpC,CAAAA,EAAWjM,CAAAA,CAAO,OAAA,CAC5BU,CAAAA,CAAMmH,EAAAA,CAAMC,CAAM,EAWlBwG,CAAAA,CAAW,IAAA,CAAK,KAAI,CAAItO,CAAAA,CAAO,WAAW,iBAAA,CAAoBqO,CAAAA,CAG9DE,CAAAA,CAAe,IAAI,GAAA,CACrBjB,CAAAA,CAEJ,QAASkB,CAAAA,CAAU,CAAA,CAAGA,GAAWJ,CAAAA,EAC3B,EAAAI,EAAU,CAAA,EAAK,IAAA,CAAK,GAAA,EAAI,EAAKF,CAAAA,CAAAA,CADKE,CAAAA,EAAAA,CAAW,CAMjD,IAAMC,CAAAA,CAAepE,EAAiB,eAAA,CAAgBrK,CAAAA,CAAO,MAAOU,CAAG,CAAA,CAEnEkG,EAAO6H,CAAAA,CAAa,IAAA,CAAMtO,GAAM,CAACoO,CAAAA,CAAa,IAAIpO,CAAC,CAAC,EACnDyG,CAAAA,GACH2H,CAAAA,CAAa,KAAA,EAAM,CACnB3H,CAAAA,CAAO6H,CAAAA,CAAa,CAAC,CAAA,CAAA,CAEvBF,CAAAA,CAAa,IAAI3H,CAAI,CAAA,CAKrB,IAAIgG,CAAAA,CAAsB,GAU1B,GARE5M,CAAAA,CAAO,WAAW,KAAA,EAClBqK,CAAAA,CAAiB,mBAAmBzD,CAAAA,CAAMkB,CAAM,IAAM,MAAA,GAEtD8E,CAAAA,CAAY6B,CAAAA,CACT,MAAA,CAAQtO,CAAAA,EAAM,CAACoO,EAAa,GAAA,CAAIpO,CAAC,GAAKkK,CAAAA,CAAiB,aAAA,CAAclK,EAAGO,CAAG,CAAC,EAC5E,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAAA,CAGXkM,CAAAA,CAAU,OAAS,CAAA,CACrB,GAAI,CAGF,OAAO,MAAMD,EAAAA,CAAoB,CAC/B,MAAA,CAAA7E,CAAAA,CACA,OAAAkE,CAAAA,CACA,GAAA,CAAAtL,EACA,OAAA,CAASkG,CAAAA,CACT,UAAAgG,CAAAA,CACA,aAAA,CAAeyB,CAAAA,CACf,eAAA,CAAAxB,CAAAA,CACA,UAAA,CAAYyB,EACZ,cAAA,CAAgB/B,CAAAA,CAChB,aAAepM,CAAAA,EAAMoO,CAAAA,CAAa,IAAIpO,CAAC,CAAA,CACvC,QAAA,CAAA6M,CACF,CAAC,CACH,OAAShC,CAAAA,CAAQ,CAIf,GAHIA,CAAAA,YAAavE,CAAAA,EAAY,CAACmB,EAAAA,CAAoBoD,CAAAA,CAAE,KAAMA,CAAAA,CAAE,OAAO,GAG/DuB,CAAAA,EAAQ,OAAA,CACV,MAAMvB,CAAAA,CAERsC,CAAAA,CAAYtC,EACRwD,CAAAA,CAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,EAAY,CAEpB,QACF,CAGF,IAAMgC,CAAAA,CAAY,KAAK,GAAA,EAAI,CAC3B,GAAI,CACF,IAAMjC,CAAAA,CAAM,MAAMX,EAAAA,CAChBlF,CAAAA,CACAkB,EACAkE,CAAAA,CACAtB,EAAAA,CAAuBL,EAAkBzD,CAAAA,CAAMkB,CAAAA,CAAQuG,EAASxB,CAAe,CAAA,CAC/E,CAAA,CAAA,CACAN,CACF,CAAA,CACA,GAAIS,GAAY,CAACA,CAAAA,CAASP,CAAG,CAAA,CAAG,CAK9BpC,EAAiB,uBAAA,CAAwBzD,CAAAA,CAAMlG,CAAG,CAAA,CAClD4M,CAAAA,CAAY,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4CxF,CAAM,CAAA,MAAA,EAASlB,CAAI,EAAE,CAAA,CACnF4H,CAAAA,CAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,EAAY,CAEpB,QACF,CACA,OAAArC,EAAiB,aAAA,CAAczD,CAAAA,CAAMlG,EAAK,IAAA,CAAK,GAAA,EAAI,CAAIgO,CAAAA,CAAW5G,CAAM,CAAA,CAExE2C,GAAe,MAAA,EAAO,CACtBQ,GAAmBZ,CAAAA,CAAkBzD,CAAAA,CAAMkB,EAAQ2E,CAAG,CAAA,CAC/CA,CACT,CAAA,MAASzB,CAAAA,CAAQ,CAYf,GAPIA,CAAAA,YAAavE,CAAAA,EACX,CAACmB,EAAAA,CAAoBoD,CAAAA,CAAE,KAAMA,CAAAA,CAAE,OAAO,GAMxCuB,CAAAA,EAAQ,OAAA,CACV,MAAMvB,CAAAA,CAERD,EAAAA,CAAYV,EAAkBzD,CAAAA,CAAMoE,CAAAA,CAAGtK,CAAG,CAAA,CAK1C2J,CAAAA,CAAiB,iBAAA,CAAkBzD,CAAAA,CAAM,IAAA,CAAK,GAAA,GAAQ8H,CAAAA,CAAW5G,CAAM,EACvEwF,CAAAA,CAAYtC,CAAAA,CAGRwD,EAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,GAEV,CACF,CAEA,MAAMY,CACR,CAAA,CAcaqB,GAAmB,MAC9B7G,CAAAA,CACAkE,EAAyB,EAAC,CAC1BC,CAAAA,CAAUjM,CAAAA,CAAO,gBAAA,CACjBuM,CAAAA,GACe,CACf,GAAI,CAAC,MAAM,OAAA,CAAQvM,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,EAEhD,GAAIA,CAAAA,CAAO,MAAM,MAAA,GAAW,CAAA,CAC1B,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAAA,CAEzC,IAAMU,CAAAA,CAAMmH,GAAMC,CAAM,CAAA,CAElB8G,EAAa,IAAI,GAAA,CACnBtB,EAEJ,IAAA,IAASkB,CAAAA,CAAU,CAAA,CAAGA,CAAAA,CAAUxO,CAAAA,CAAO,KAAA,CAAM,OAAQwO,CAAAA,EAAAA,CAAW,CAG9D,IAAM5H,CAAAA,CADeyD,CAAAA,CAAiB,gBAAgBrK,CAAAA,CAAO,KAAA,CAAOU,CAAG,CAAA,CAC7C,IAAA,CAAMP,CAAAA,EAAM,CAACyO,CAAAA,CAAW,GAAA,CAAIzO,CAAC,CAAC,CAAA,CACxD,GAAI,CAACyG,CAAAA,CAAM,MAEX,GADAgI,CAAAA,CAAW,IAAIhI,CAAI,CAAA,CACf2F,GAAQ,OAAA,CACV,MAAM,IAAI,KAAA,CAAM,SAAS,CAAA,CAE3B,GAAI,CACF,IAAME,EAAM,MAAMX,EAAAA,CAAYlF,EAAMkB,CAAAA,CAAQkE,CAAAA,CAAQC,EAAS,CAAA,CAAA,CAAOM,CAAM,CAAA,CAM1E,OAAAlC,CAAAA,CAAiB,aAAA,CAAczD,EAAMlG,CAAG,CAAA,CACjC+L,CACT,CAAA,MAASzB,CAAAA,CAAQ,CAgBf,GAdIA,CAAAA,YAAavE,CAAAA,EAGb8F,CAAAA,EAAQ,OAAA,GAGZxB,EAAAA,CAAYV,EAAkBzD,CAAAA,CAAMoE,CAAAA,CAAGtK,CAAG,CAAA,CAC1C4M,CAAAA,CAAYtC,EAOR,CAACxD,EAAAA,CAAuBwD,CAAC,CAAA,CAAA,CAC3B,MAAMA,CAEV,CACF,CAEA,MAAMsC,CACR,CAAA,CAIMuB,GAAyC,CAC7C,OAAA,CAAS,cAAA,CACT,KAAA,CAAO,YAAA,CACP,KAAA,CAAO,aACP,QAAA,CAAU,eAAA,CACV,UAAW,gBAAA,CACX,UAAA,CAAY,kBACZ,aAAA,CAAe,kBAAA,CACf,MAAA,CAAQ,SAAA,CACR,MAAA,CAAQ,aACV,EAgCA,eAAsBC,EAAAA,CACpBpO,EACAqO,CAAAA,CACA/C,CAAAA,CACAC,EACAmC,CAAAA,CAAQpO,CAAAA,CAAO,KAAA,CACfuM,CAAAA,CACc,CACd,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQvM,EAAO,SAAS,CAAA,CACjC,MAAM,IAAI,KAAA,CAAM,kCAAkC,CAAA,CAEpD,GAAIA,EAAO,SAAA,CAAU,MAAA,GAAW,EAC9B,MAAM,IAAI,MAAM,2BAA2B,CAAA,CAK7C,IAAM6M,CAAAA,CAAkBZ,CAAAA,GAAY,MAAA,CAC9BoC,EAAUpC,CAAAA,EAAWjM,CAAAA,CAAO,QAC5BsO,CAAAA,CAAW,IAAA,CAAK,KAAI,CAAItO,CAAAA,CAAO,UAAA,CAAW,iBAAA,CAAoBqO,CAAAA,CAI9DW,CAAAA,CAAiB,GAAGtO,CAAG,CAAA,CAAA,EAAIqO,CAAQ,CAAA,CAAA,CAKnCE,CAAAA,CACJjP,EAAO,cAAA,GAAiBU,CAAG,CAAA,EAAG,MAAA,CAC1BV,CAAAA,CAAO,cAAA,CAAeU,CAAG,CAAA,CACzBV,CAAAA,CAAO,UACPuO,CAAAA,CAAe,IAAI,IACrBjB,CAAAA,CAEA4B,CAAAA,CAAkB,MAEtB,IAAA,IAASV,CAAAA,CAAU,EAAGA,CAAAA,EAAWJ,CAAAA,EAC3B,EAAAI,CAAAA,CAAU,CAAA,EAAK,KAAK,GAAA,EAAI,EAAKF,CAAAA,CAAAA,CADKE,CAAAA,EAAAA,CAAW,CAMjD,IAAMC,EAAenE,EAAAA,CAAkB,eAAA,CAAgB2E,EAAUvO,CAAG,CAAA,CAChEkG,EAAO6H,CAAAA,CAAa,IAAA,CAAMtO,CAAAA,EAAM,CAACoO,CAAAA,CAAa,GAAA,CAAIpO,CAAC,CAAC,CAAA,CACnDyG,IACH2H,CAAAA,CAAa,KAAA,GACb3H,CAAAA,CAAO6H,CAAAA,CAAa,CAAC,CAAA,CAAA,CAEvBF,CAAAA,CAAa,GAAA,CAAI3H,CAAI,CAAA,CACrB,IAAMuI,EAAUvI,CAAAA,CAAOiI,EAAAA,CAAWnO,CAAG,CAAA,CACjC0O,CAAAA,CAAOL,EACLM,CAAAA,CAAWrD,CAAAA,EAAW,EAAC,CACvBsD,CAAAA,CAAsB,IAAI,GAAA,CAGhC,MAAA,CAAO,QAAQD,CAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACnN,CAAAA,CAAK3D,EAAK,CAAA,GAAM,CAC7C6Q,EAAK,QAAA,CAAS,CAAA,CAAA,EAAIlN,CAAG,CAAA,CAAA,CAAG,CAAA,GAC1BkN,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,EAAIlN,CAAG,CAAA,CAAA,CAAA,CAAK,kBAAA,CAAmB,OAAO3D,EAAK,CAAC,CAAC,CAAA,CACjE+Q,CAAAA,CAAoB,GAAA,CAAIpN,CAAG,CAAA,EAE/B,CAAC,EACD,IAAM6J,CAAAA,CAAM,IAAI,GAAA,CAAIoD,CAAAA,CAAUC,CAAI,CAAA,CAYlC,GAVA,OAAO,OAAA,CAAQC,CAAQ,EAAE,OAAA,CAAQ,CAAC,CAACnN,CAAAA,CAAK3D,EAAK,IAAM,CAC5C+Q,CAAAA,CAAoB,GAAA,CAAIpN,CAAG,CAAA,GAC1B,KAAA,CAAM,QAAQ3D,EAAK,CAAA,CACrBA,GAAM,OAAA,CAAS2C,EAAAA,EAAM6K,EAAI,YAAA,CAAa,MAAA,CAAO7J,CAAAA,CAAK,MAAA,CAAOhB,EAAC,CAAC,CAAC,CAAA,CAE5D6K,CAAAA,CAAI,aAAa,GAAA,CAAI7J,CAAAA,CAAK,OAAO3D,EAAK,CAAC,CAAA,EAG7C,CAAC,CAAA,CAEGgO,CAAAA,EAAQ,QACV,MAAM,IAAI,MAAM,SAAS,CAAA,CAE3B2C,EAAkB,KAAA,CAGlB,GAAM,CAAE,MAAA,CAAQ7C,CAAAA,CAAS,QAASC,CAAe,CAAA,CAAIjB,GACnDX,EAAAA,CAAuBJ,EAAAA,CAAmB1D,EAAMoI,CAAAA,CAAgBX,CAAAA,CAASxB,CAAe,CAC1F,CAAA,CACM,CAAE,OAAQ0C,EAAAA,CAAY,OAAA,CAAS/C,EAAa,CAAA,CAAIhB,EAAAA,CAAaa,EAASE,CAAM,CAAA,CAC5EiD,EAAAA,CAAc,IAAM,CAAElD,CAAAA,GAAkBE,EAAAA,GAAe,EACvDiD,CAAAA,CAAgB,IAAA,CAAK,KAAI,CAC/B,GAAI,CACF,IAAMC,CAAAA,CAAW,MAAM,MAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQwD,GACR,OAAA,CAAS/I,EAAAA,EACX,CAAC,CAAA,CACD,GAAIkJ,CAAAA,CAAS,MAAA,GAAW,IACtB,MAAM,IAAI,MAAM,6CAA6C,CAAA,CAE/D,GAAIA,CAAAA,CAAS,MAAA,GAAW,GAAA,CAEtB,MAAApF,EAAAA,CAAkB,eAAA,CAChB1D,EACAC,EAAAA,CAAkB6I,CAAAA,CAAS,QAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,EAAK,KAAA,CAC5D,CAAA,CACAR,EAAkB,CAAA,CAAA,CACZ,IAAI,MAAM,CAAA,yBAAA,EAA4BtI,CAAI,EAAE,CAAA,CAEpD,GAAI8I,CAAAA,CAAS,MAAA,GAAW,GAAA,CACtB,MAAApF,GAAkB,aAAA,CAAc1D,CAAAA,CAAMlG,CAAG,CAAA,CACzCwO,CAAAA,CAAkB,GACZ,IAAI,KAAA,CAAM,qCAAqCtI,CAAI,CAAA,CAAE,EAE7D,GAAI,CAAC8I,EAAS,EAAA,CACZ,MAAApF,GAAkB,aAAA,CAAc1D,CAAAA,CAAMlG,CAAG,CAAA,CACzCwO,CAAAA,CAAkB,CAAA,CAAA,CACZ,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQQ,EAAS,MAAM,CAAA,MAAA,EAAS9I,CAAI,CAAA,CAAE,CAAA,CAExD,OAAA0D,EAAAA,CAAkB,aAAA,CAAc1D,CAAAA,CAAMlG,EAAK,IAAA,CAAK,GAAA,GAAQ+O,CAAAA,CAAeT,CAAc,EAC9EU,CAAAA,CAAS,IAAA,EAClB,CAAA,MAAS1E,CAAAA,CAAQ,CASf,GAPIA,CAAAA,EAAG,OAAA,EAAS,SAAS,UAAU,CAAA,EAO/BuB,GAAQ,OAAA,CACV,MAAMvB,EAGHkE,CAAAA,EACH5E,EAAAA,CAAkB,cAAc1D,CAAAA,CAAMlG,CAAG,EAM3C4J,EAAAA,CAAkB,iBAAA,CAAkB1D,EAAM,IAAA,CAAK,GAAA,EAAI,CAAI6I,CAAAA,CAAeT,CAAc,CAAA,CACpF1B,EAAYtC,CAAAA,CAERwD,CAAAA,CAAUJ,GACZ,MAAM1B,EAAAA,GAEV,CAAA,OAAE,CACA8C,EAAAA,GACF,CACF,CAEA,MAAMlC,CACR,KAWaqC,EAAAA,CAAiB,MAC5B7H,EACAkE,CAAAA,CAAyB,EAAC,CAC1B4D,CAAAA,CAAS,CAAA,CACTrD,CAAAA,GACe,CACf,GAAI,CAAC,MAAM,OAAA,CAAQvM,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,EAEhD,GAAI4P,CAAAA,CAAS5P,EAAO,KAAA,CAAM,MAAA,CACxB,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA,CAWhD,IAAI6P,CAAAA,CAAAA,CARkBC,GAAkB,CACtC,IAAMjN,EAAI,CAAC,GAAGiN,CAAG,CAAA,CACjB,IAAA,IAAS3S,EAAI0F,CAAAA,CAAE,MAAA,CAAS,EAAG1F,CAAAA,CAAI,CAAA,CAAGA,IAAK,CACrC,IAAM4S,EAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,EAAK5S,CAAAA,CAAI,EAAE,CAAA,CAC5C,CAAC0F,EAAE1F,CAAC,CAAA,CAAG0F,EAAEkN,CAAC,CAAC,EAAI,CAAClN,CAAAA,CAAEkN,CAAC,CAAA,CAAGlN,CAAAA,CAAE1F,CAAC,CAAC,EAC5B,CACA,OAAO0F,CACT,CAAA,EAC4B7C,CAAAA,CAAO,KAAK,CAAA,CACpCgQ,EAAmB,IAAA,CAAK,GAAA,CAAIJ,EAAQC,CAAAA,CAAS,MAAM,EACnDI,CAAAA,CAAoB,EAAC,CACzB,KAAOD,CAAAA,CAAmB,CAAA,EAAKH,EAAS,MAAA,CAAS,CAAA,EAAG,CAElD,IAAMK,CAAAA,CAAaL,EAAS,MAAA,CAAO,CAAA,CAAGG,CAAgB,CAAA,CAChDG,CAAAA,CAA2B,GAC3BC,CAAAA,CAAsB,GAE5B,IAAA,IAASjT,CAAAA,CAAI,EAAGA,CAAAA,CAAI+S,CAAAA,CAAW,OAAQ/S,CAAAA,EAAAA,CACrCgT,CAAAA,CAAS,KACPrE,EAAAA,CAAYoE,CAAAA,CAAW/S,CAAC,CAAA,CAAG2K,CAAAA,CAAQkE,EAAQ,MAAA,CAAW,IAAA,CAAMO,CAAM,CAAA,CAC/D,IAAA,CAAMjL,CAAAA,EAAS8O,EAAa,IAAA,CAAK9O,CAAI,CAAC,CAAA,CACtC,KAAA,CAAM,IAAM,CAAC,CAAC,CACnB,CAAA,CAEF,MAAM,OAAA,CAAQ,IAAI6O,CAAQ,CAAA,CAC1BF,EAAW,IAAA,CAAK,GAAGG,CAAY,CAAA,CAE/B,IAAMC,CAAAA,CAAkBC,EAAAA,CAAcL,CAAAA,CAAYL,CAAM,EACxD,GAAIS,CAAAA,CACF,OAAOA,CAAAA,CAIT,GADAL,EAAmB,IAAA,CAAK,GAAA,CAAIJ,EAAQC,CAAAA,CAAS,MAAM,EAC/CG,CAAAA,GAAqB,CAAA,CACvB,MAAM,IAAI,KAAA,CAAM,0BAA0B,CAE9C,CACA,MAAM,IAAI,KAAA,CAAM,wBAAwB,CAC1C,EAEA,SAASM,GAAcC,CAAAA,CAAgBX,CAAAA,CAAgB,CACrD,IAAMY,CAAAA,CAAe,IAAI,GAAA,CACzB,IAAA,IAAW/S,CAAAA,IAAU8S,EAAS,CAC5B,IAAMrO,EAAM,IAAA,CAAK,SAAA,CAAUzE,CAAM,CAAA,CAC5B+S,CAAAA,CAAa,GAAA,CAAItO,CAAG,CAAA,EACvBsO,CAAAA,CAAa,IAAItO,CAAAA,CAAK,EAAE,CAAA,CAE1BsO,CAAAA,CAAa,IAAItO,CAAG,CAAA,CAAG,KAAKzE,CAAM,EACpC,CACA,IAAMgT,CAAAA,CAAiB,MAAM,IAAA,CAAKD,CAAAA,CAAa,QAAQ,CAAA,CAAE,IAAA,CAAME,CAAAA,EAAUA,CAAAA,CAAM,MAAA,EAAUd,CAAM,CAAA,CAC/F,OAAOa,EAAiBA,CAAAA,CAAe,CAAC,EAAI,IAC9C,CC7vDA,IAAME,EAAAA,CAAUhP,UAAAA,CAAW3B,CAAAA,CAAO,QAAQ,CAAA,CAW7B4Q,EAAAA,CAAN,MAAMC,CAAY,CACvB,YAEA,UAAA,CAAqB,GAAA,CAEb,IAAA,CAER,WAAA,CAAYC,CAAAA,CAA8B,CACpCA,GAAS,WAAA,GACPA,CAAAA,CAAQ,uBAAuBD,CAAAA,EACjC,IAAA,CAAK,YAAcC,CAAAA,CAAQ,WAAA,CAAY,YACvC,IAAA,CAAK,UAAA,CAAaA,EAAQ,WAAA,CAAY,UAAA,EAEtC,KAAK,WAAA,CAAcA,CAAAA,CAAQ,YAMzB,IAAA,CAAK,WAAA,EAAe,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,YAAY,UAAU,CAAA,GAChE,KAAK,WAAA,CAAY,UAAA,CAAa,EAAC,CAAA,CAEjC,IAAA,CAAK,IAAA,CAAO,IAAA,CAAK,MAAA,EAAO,CAAE,MAExBA,CAAAA,EAAS,UAAA,GACX,KAAK,UAAA,CAAaA,CAAAA,CAAQ,YAE9B,CAUA,MAAM,YAAA,CACJC,CAAAA,CACAC,CAAAA,CACe,CACV,KAAK,WAAA,EACR,MAAM,KAAK,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA,CAE9C,IAAA,CAAK,YAAa,UAAA,CAAW,IAAA,CAAK,CAACD,CAAAA,CAAeC,CAAa,CAAC,EAClE,CASA,KAAKC,CAAAA,CAAkD,CACrD,GAAI,CAAC,IAAA,CAAK,WAAA,CACR,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAEjE,GAAI,KAAK,WAAA,CAAa,CACpB,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,KAAAC,CAAK,CAAA,CAAI,KAAK,MAAA,EAAO,CAChC,MAAM,OAAA,CAAQF,CAAI,CAAA,GACrBA,CAAAA,CAAO,CAACA,CAAI,GAEd,IAAA,IAAW/O,CAAAA,IAAO+O,EAAM,CACtB,IAAMtO,EAAYT,CAAAA,CAAI,IAAA,CAAKgP,CAAM,CAAA,CACjC,IAAA,CAAK,YAAY,UAAA,CAAW,IAAA,CAAKvO,EAAU,cAAA,EAAgB,EAC7D,CACA,OAAA,IAAA,CAAK,IAAA,CAAOwO,CAAAA,CACL,IAAA,CAAK,WACd,MACE,MAAM,IAAI,MAAM,wBAAwB,CAE5C,CAYA,MAAM,SAAA,CAAUC,CAAAA,CAAc,KAAA,CAAiC,CAC7D,GAAI,CAAC,IAAA,CAAK,WAAA,CACR,MAAM,IAAI,KAAA,CACR,gFACF,CAAA,CAEF,GAAI,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,MAAA,GAAW,EACzC,MAAM,IAAI,MACR,iFACF,CAAA,CAEF,GAAI,CACF,MAAMzC,GAAiB,qCAAA,CAAuC,CAAC,KAAK,WAAW,CAAC,EAClF,CAAA,MAAS3D,CAAAA,CAAG,CACV,GAAI,EAAAA,CAAAA,YAAavE,CAAAA,EAAYuE,CAAAA,CAAE,OAAA,CAAQ,SAAS,oCAAoC,CAAA,CAAA,CAGlF,MAAMA,CAEV,CAIA,GAHK,IAAA,CAAK,IAAA,GACR,IAAA,CAAK,IAAA,CAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAA,CAExB,CAACoG,EACH,OAAO,CAAE,MAAO,IAAA,CAAK,IAAA,CAAM,MAAA,CAAQ,SAAU,CAAA,CAI/C,IAAMC,EAAkB,EAAA,CACxB,MAAMjL,GAAM,GAAI,CAAA,CAChB,IAAIkL,CAAAA,CAAS,MAAM,KAAK,WAAA,EAAY,CAChC,EAAI,CAAA,CACR,KACEA,GAAQ,MAAA,GAAW,2BAAA,EACnBA,GAAQ,MAAA,GAAW,sBAAA,EACnBA,CAAAA,EAAQ,MAAA,GAAW,SAAA,EACnB,CAAA,CAAID,GAEJ,MAAMjL,EAAAA,CAAM,IAAO,CAAA,CAAI,GAAG,EAC1BkL,CAAAA,CAAS,MAAM,IAAA,CAAK,WAAA,EAAY,CAChC,CAAA,EAAA,CAEF,OAAO,CACL,KAAA,CAAO,KAAK,IAAA,CACZ,MAAA,CAASA,GAAQ,MAAA,EAAU,SAC7B,CACF,CAQA,MAAA,EAAqB,CACnB,GAAI,CAAC,IAAA,CAAK,YACR,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAEjE,IAAMjT,CAAAA,CAAS,IAAIT,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CAC7E8D,EAAO,CAAE,GAAG,IAAA,CAAK,WAAY,CAAA,CACnC,GAAI,CACFyE,EAAAA,CAAW,WAAA,CAAY9H,EAAQqD,CAAI,EACrC,OAAS4F,CAAAA,CAAO,CACd,MAAM,IAAI,KAAA,CAAM,mCAAA,CAAsCA,CAAK,CAC7D,CACAjJ,EAAO,IAAA,EAAK,CACZ,IAAMkT,CAAAA,CAAkB,IAAI,UAAA,CAAWlT,CAAAA,CAAO,QAAA,EAAU,EAClD8S,CAAAA,CAAOvP,UAAAA,CAAW4P,OAAOD,CAAe,CAAC,EAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAE5D,OAAO,CAAE,MAAA,CADMC,MAAAA,CAAO,IAAI,UAAA,CAAW,CAAC,GAAGb,EAAAA,CAAS,GAAGY,CAAe,CAAC,CAAC,CAAA,CACrD,KAAAJ,CAAK,CACxB,CASA,YAAA,CAAaxO,CAAAA,CAAoC,CAC/C,GAAI,CAAC,IAAA,CAAK,WAAA,CACR,MAAM,IAAI,MAAM,mDAAmD,CAAA,CAErE,GAAI,OAAOA,CAAAA,EAAc,SACvB,MAAM,IAAI,KAAA,CAAM,0BAA0B,CAAA,CAE5C,GAAIA,EAAU,MAAA,GAAW,GAAA,CACvB,MAAM,IAAI,KAAA,CAAM,uCAAuC,CAAA,CAEzD,OAAA,IAAA,CAAK,YAAY,UAAA,CAAW,IAAA,CAAKA,CAAS,CAAA,CACnC,IAAA,CAAK,WACd,CAGA,MAAM,aAA0C,CAC9C,OAAK,IAAA,CAAK,IAAA,GACR,IAAA,CAAK,IAAA,CAAO,KAAK,MAAA,EAAO,CAAE,MAErBwL,CAAAA,CAAQ,yCAAA,CAA2C,CACxD,cAAA,CAAgB,IAAA,CAAK,IAAA,CACrB,UAAA,CAAY,IAAA,CAAK,WAAA,EAAa,UAChC,CAAC,CACH,CAQQ,iBAAA,CAAoB,MAAOsD,GAAuB,CACxD,IAAMC,CAAAA,CAAQ,MAAMvD,CAAAA,CAAQ,6CAAA,CAA+C,EAAE,CAAA,CACvE3Q,EAAQmE,UAAAA,CAAW+P,CAAAA,CAAM,aAAa,CAAA,CACtCC,CAAAA,CAAiB,OAAO,IAAI,WAAA,CAAYnU,EAAM,MAAA,CAAQA,CAAAA,CAAM,WAAa,CAAA,CAAG,CAAC,EAAE,CAAC,CAAC,CAAA,CACjFoU,CAAAA,CAAgB,IAAI,IAAA,CAAK,KAAK,GAAA,EAAI,CAAIH,CAAU,CAAA,CAAE,WAAA,GAAc,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACjF,IAAA,CAAK,WAAA,CAAc,CACjB,UAAA,CAAYG,CAAAA,CACZ,WAAY,EAAC,CACb,WAAY,EAAC,CACb,aAAA,CAAeF,CAAAA,CAAM,iBAAA,CAAoB,KAAA,CACzC,iBAAkBC,CAAAA,CAClB,UAAA,CAAY,EACd,EACF,CACF,ECnOA,IAAME,GAAa,IAAI,UAAA,CAAW,CAAC,GAAI,CAAC,CAAA,CA2B3BC,CAAAA,CAAN,MAAMC,CAAW,CACtB,GAAA,CAEA,WAAA,CAAY7P,EAAiB,CAC3B,IAAA,CAAK,IAAMA,CAAAA,CACX,GAAI,CACFH,SAAAA,CAAU,YAAA,CAAaG,CAAG,EAC5B,CAAA,KAAY,CACV,MAAM,IAAI,KAAA,CAAM,qBAAqB,CACvC,CACF,CAUA,OAAO,IAAA,CAAK3D,EAAwC,CAClD,OAAI,OAAOA,CAAAA,EAAU,QAAA,CACZwT,EAAW,UAAA,CAAWxT,CAAK,CAAA,CAE3B,IAAIwT,CAAAA,CAAWxT,CAAK,CAE/B,CASA,OAAO,WAAW6D,CAAAA,CAAyB,CACzC,OAAO,IAAI2P,CAAAA,CAAWC,EAAAA,CAAc5P,CAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CACtD,CASA,OAAO,QAAA,CAAS6P,EAAuC,CACrD,GAAI,OAAOA,CAAAA,EAAS,QAAA,CAElB,GADc,iBAAiB,IAAA,CAAKA,CAAI,EAEtCA,CAAAA,CAAOtQ,UAAAA,CAAWsQ,CAAI,CAAA,CAAA,KACjB,CAGL,IAAMzU,CAAAA,CAAkB,GACxB,IAAA,IAAS,CAAA,CAAI,EAAG,CAAA,CAAIyU,CAAAA,CAAK,OAAQ,CAAA,EAAA,CAAK,CACpC,IAAI7U,CAAAA,CAAI6U,CAAAA,CAAK,UAAA,CAAW,CAAC,CAAA,CACzB,GAAI7U,EAAI,GAAA,CACNI,CAAAA,CAAM,KAAKJ,CAAC,CAAA,CAAA,KAAA,GACHA,CAAAA,CAAI,IAAA,CACbI,CAAAA,CAAM,IAAA,CAAK,IAAQJ,CAAAA,EAAK,CAAA,CAAI,IAAQA,CAAAA,CAAI,EAAK,UACpCA,CAAAA,EAAK,KAAA,EAAUA,CAAAA,EAAK,KAAA,EAAU,CAAA,CAAI,CAAA,CAAI6U,EAAK,MAAA,CAAQ,CAC5D,IAAM5U,CAAAA,CAAO4U,CAAAA,CAAK,WAAW,EAAE,CAAC,EAChC7U,CAAAA,CAAI,KAAA,EAAA,CAAYA,EAAI,IAAA,GAAU,EAAA,CAAA,EAAOC,EAAO,IAAA,CAAA,CAC5CG,CAAAA,CAAM,KAAK,GAAA,CAAQJ,CAAAA,EAAK,EAAA,CAAK,GAAA,CAASA,CAAAA,EAAK,EAAA,CAAM,GAAO,GAAA,CAASA,CAAAA,EAAK,EAAK,EAAA,CAAO,GAAA,CAAQA,EAAI,EAAK,EACrG,CAAA,KACEI,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAQJ,GAAK,EAAA,CAAK,GAAA,CAASA,GAAK,CAAA,CAAK,EAAA,CAAO,IAAQA,CAAAA,CAAI,EAAK,EAE5E,CACA6U,CAAAA,CAAO,IAAI,WAAWzU,CAAK,EAC7B,CAEF,OAAO,IAAIuU,EAAWP,MAAAA,CAAOS,CAAI,CAAC,CACpC,CAWA,OAAO,SAAA,CAAUC,CAAAA,CAAkBC,EAAkBC,CAAAA,CAAgB,QAAA,CAAsB,CACzF,IAAMH,CAAAA,CAAOC,CAAAA,CAAWE,CAAAA,CAAOD,CAAAA,CAC/B,OAAOJ,EAAW,QAAA,CAASE,CAAI,CACjC,CASA,IAAA,CAAKpQ,EAAgC,CACnC,IAAMwQ,CAAAA,CAAKtQ,SAAAA,CAAU,IAAA,CAAKF,CAAAA,CAAS,KAAK,GAAA,CAAK,CAC3C,aAAc,IAAA,CACd,MAAA,CAAQ,YACR,OAAA,CAAS,KACX,CAAC,CAAA,CACKN,CAAAA,CAAW,QAAA,CAASK,WAAWyQ,CAAAA,CAAG,QAAA,CAAS,EAAG,CAAC,CAAC,EAAG,EAAE,CAAA,CAC3D,OAAOjR,EAAAA,CAAU,IAAA,CAAA,CAAMG,EAAW,EAAA,EAAI,QAAA,CAAS,EAAE,CAAA,CAAIK,UAAAA,CAAWyQ,EAAG,QAAA,CAAS,CAAC,CAAC,CAAC,CACjF,CAQA,aAAalQ,CAAAA,CAA4B,CACvC,OAAO,IAAIH,CAAAA,CAAUD,UAAU,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,CAAGI,CAAM,CAC/D,CAQA,QAAA,EAAmB,CACjB,OAAOmQ,EAAAA,CAAc,IAAI,WAAW,CAAC,GAAGT,EAAAA,CAAY,GAAG,IAAA,CAAK,GAAG,CAAC,CAAC,CACnE,CASA,OAAA,EAAkB,CAChB,IAAM3P,CAAAA,CAAM,IAAA,CAAK,UAAS,CAC1B,OAAO,eAAeA,CAAAA,CAAI,KAAA,CAAM,EAAG,CAAC,CAAC,MAAMA,CAAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAC1D,CASA,gBAAgBqQ,CAAAA,CAAkC,CAChD,IAAMtV,CAAAA,CAAI8E,SAAAA,CAAU,gBAAgB,IAAA,CAAK,GAAA,CAAKwQ,CAAAA,CAAU,GAAG,CAAA,CAE3D,OAAOC,OAAOvV,CAAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAC7B,CASA,OAAO,SAAA,EAAwB,CAC7B,OAAO,IAAI8U,CAAAA,CAAWhQ,UAAU,MAAA,EAAO,CAAE,SAAS,CACpD,CACF,EAEM0Q,EAAAA,CAAgBC,CAAAA,EACRlB,OAAOA,MAAAA,CAAOkB,CAAK,CAAC,CAAA,CAK5BJ,EAAAA,CAAiBpQ,GAAoB,CAEzC,IAAMK,EAAWkQ,EAAAA,CAAavQ,CAAG,CAAA,CACjC,OAAOI,EAAAA,CAAK,MAAA,CAAO,IAAI,UAAA,CAAW,CAAC,GAAGJ,CAAAA,CAAK,GAAGK,EAAS,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CACtE,CAAA,CAGMyP,EAAAA,CAAiBW,GAAuB,CAC5C,IAAMtU,EAASiE,EAAAA,CAAK,MAAA,CAAOqQ,CAAU,CAAA,CACrC,GAAI,CAACjQ,GAAkBrE,CAAAA,CAAO,KAAA,CAAM,EAAG,CAAC,CAAA,CAAGwT,EAAU,CAAA,CACnD,MAAM,IAAI,KAAA,CAAM,iCAAiC,EAEnD,IAAMtP,CAAAA,CAAWlE,EAAO,KAAA,CAAM,EAAE,EAC1B6D,CAAAA,CAAM7D,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACxBuU,EAAiBH,EAAAA,CAAavQ,CAAG,EAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CACnD,GAAI,CAACQ,EAAAA,CAAkBH,CAAAA,CAAUqQ,CAAc,EAC7C,MAAM,IAAI,MAAM,+BAA+B,CAAA,CAEjD,OAAO1Q,CACT,CAAA,CAEMQ,EAAAA,CAAoB,CAACG,CAAAA,CAAetF,CAAAA,GAAkB,CAC1D,GAAIsF,CAAAA,GAAMtF,EAAG,OAAO,KAAA,CACpB,GAAIsF,CAAAA,CAAE,UAAA,GAAetF,EAAE,UAAA,CAAY,OAAO,OAC1C,IAAM2B,CAAAA,CAAM2D,EAAE,UAAA,CACV1F,CAAAA,CAAI,EACR,KAAOA,CAAAA,CAAI+B,CAAAA,EAAO2D,CAAAA,CAAE1F,CAAC,CAAA,GAAMI,EAAEJ,CAAC,CAAA,EAAGA,IACjC,OAAOA,CAAAA,GAAM+B,CACf,EClOO,IAAM2T,GAAU,CACrBC,CAAAA,CACAP,EACA1Q,CAAAA,CACAkR,CAAAA,CAAgBC,IAAY,GACzBC,EAAAA,CAAMH,EAAYP,CAAAA,CAAWQ,CAAAA,CAAOlR,CAAO,CAAA,CAEnCqR,EAAAA,CAAU,CACrBJ,CAAAA,CACAP,CAAAA,CACAQ,EACAlR,CAAAA,CACAU,CAAAA,GAEU0Q,EAAAA,CAAMH,CAAAA,CAAYP,CAAAA,CAAWQ,CAAAA,CAAOlR,EAASU,CAAQ,CAAA,CACtD,QAOL0Q,EAAAA,CAAQ,CACZH,EACAP,CAAAA,CACAQ,CAAAA,CACAlR,CAAAA,CACAU,CAAAA,GAC6D,CAC7D,IAAM4Q,EAASJ,CAAAA,CACTK,CAAAA,CAAIN,EAAW,eAAA,CAAgBP,CAAS,EAC1Cc,CAAAA,CAAO,IAAIzV,CAAAA,CAAWA,CAAAA,CAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CAC/EyV,CAAAA,CAAK,YAAYF,CAAM,CAAA,CACvBE,EAAK,MAAA,CAAOD,CAAC,EACbC,CAAAA,CAAK,IAAA,GAEL,IAAMC,CAAAA,CAAgBd,OAAO,IAAI,UAAA,CAAWa,EAAK,QAAA,EAAU,CAAC,CAAA,CACtDE,CAAAA,CAAKD,CAAAA,CAAc,SAAS,EAAA,CAAI,EAAE,EAClCE,CAAAA,CAAMF,CAAAA,CAAc,SAAS,CAAA,CAAG,EAAE,CAAA,CAGlCG,CAAAA,CAAQjC,MAAAA,CAAO8B,CAAa,EAAE,QAAA,CAAS,CAAA,CAAG,CAAC,CAAA,CAC3CI,CAAAA,CAAO,IAAI9V,CAAAA,CAAWA,CAAAA,CAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACjF8V,EAAK,MAAA,CAAOD,CAAK,EACjBC,CAAAA,CAAK,IAAA,GACL,IAAMC,CAAAA,CAAUD,EAAK,UAAA,EAAW,CAChC,GAAInR,CAAAA,GAAa,MAAA,CAAW,CAC1B,GAAIoR,CAAAA,GAAYpR,EACd,MAAM,IAAI,KAAA,CAAM,aAAa,CAAA,CAE/BV,CAAAA,CAAU+R,GAAgB/R,CAAAA,CAAS2R,CAAAA,CAAKD,CAAE,EAC5C,CAAA,KACE1R,EAAUgS,EAAAA,CAAgBhS,CAAAA,CAAS2R,CAAAA,CAAKD,CAAE,CAAA,CAE5C,OAAO,CAAE,KAAA,CAAOJ,CAAAA,CAAQ,QAAAtR,CAAAA,CAAS,QAAA,CAAU8R,CAAQ,CACrD,CAAA,CAOMC,EAAAA,CAAkB,CAAC/R,CAAAA,CAAqB2R,CAAAA,CAAiBD,IAA+B,CAC5F,IAAIO,EAAgBjS,CAAAA,CAEpB,OAAAiS,EADiBC,GAAAA,CAAOP,CAAAA,CAAKD,CAAE,CAAA,CACN,OAAA,CAAQO,CAAa,CAAA,CACvCA,CACT,EAOaD,EAAAA,CAAkB,CAC7BhS,EACA2R,CAAAA,CACAD,CAAAA,GACe,CACf,IAAIO,CAAAA,CAAgBjS,CAAAA,CAEpB,OAAAiS,CAAAA,CADeC,GAAAA,CAAOP,EAAKD,CAAE,CAAA,CACN,QAAQO,CAAa,CAAA,CACrCA,CACT,CAAA,CAEIE,EAAAA,CAAoC,IAAA,CAElChB,GAAc,IAAc,CAChC,GAAIgB,EAAAA,GAAuB,IAAA,CAAM,CAC/B,IAAMC,CAAAA,CAAmBlS,SAAAA,CAAU,KAAA,CAAM,eAAA,EAAgB,CACzDiS,GAAsBC,CAAAA,CAAiB,CAAC,GAAK,CAAA,CAAKA,CAAAA,CAAiB,CAAC,EACtE,CACA,IAAIC,CAAAA,CAAO,MAAA,CAAO,KAAK,GAAA,EAAK,EACtBC,CAAAA,CAAU,EAAEH,GAAqB,KAAA,CACvC,OAAAE,CAAAA,CAAQA,CAAAA,EAAQ,MAAA,CAAO,EAAE,EAAK,MAAA,CAAOC,CAAO,EACrCD,CACT,CAAA,CCpGA,IAAME,EAAAA,CAAyBnW,CAAAA,EAAoB,CACjD,IAAMb,CAAAA,CAAIiX,EAAAA,CAASpW,EAAK,EAAE,CAAA,CAC1B,OAAO,IAAI+D,CAAAA,CAAU5E,CAAC,CACxB,CAAA,CAEMkX,EAAAA,CAAsB/W,CAAAA,EACnBA,CAAAA,CAAE,UAAA,GAGLgX,EAAAA,CAAsBhX,CAAAA,EACnBA,EAAE,UAAA,EAAW,CAGhBiX,GAAsBjX,CAAAA,EAAkB,CAC5C,IAAM2B,CAAAA,CAAc3B,CAAAA,CAAE,cAAa,CAC7BkX,CAAAA,CAAQlX,EAAE,IAAA,CAAKA,CAAAA,CAAE,OAAQA,CAAAA,CAAE,MAAA,CAAS2B,CAAG,CAAA,CAC7C,OAAA3B,CAAAA,CAAE,KAAK2B,CAAG,CAAA,CACH,IAAI,UAAA,CAAWuV,CAAAA,CAAM,UAAU,CACxC,CAAA,CAEMC,EAAAA,CAAsBC,CAAAA,EAA2B1W,CAAAA,EAAoB,CACzE,IAAM2W,CAAAA,CAAW,EAAC,CACZvW,CAAAA,CAAS,IAAIT,CAAAA,CAAWA,CAAAA,CAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACnFS,EAAO,MAAA,CAAOJ,CAAG,EACjBI,CAAAA,CAAO,IAAA,GACP,IAAA,GAAW,CAAC6D,EAAK2S,CAAY,CAAA,GAAKF,EAChC,GAAI,CACFC,EAAI1S,CAAG,CAAA,CAAI2S,EAAaxW,CAAM,EAChC,CAAA,MAAS8G,CAAAA,CAAY,CACnB,MAAAA,EAAM,OAAA,CAAU,CAAA,EAAGjD,CAAG,CAAA,EAAA,EAAKiD,CAAAA,CAAM,OAAO,CAAA,CAAA,CAClCA,CACR,CAEF,OAAOyP,CACT,CAAA,CAEA,SAASP,EAAAA,CAAS9W,CAAAA,CAAe2B,EAAa,CAC5C,GAAK3B,EAEE,CACL,IAAMkX,CAAAA,CAAQlX,CAAAA,CAAE,IAAA,CAAKA,CAAAA,CAAE,OAAQA,CAAAA,CAAE,MAAA,CAAS2B,CAAG,CAAA,CAC7C,OAAA3B,EAAE,IAAA,CAAK2B,CAAG,EACH,IAAI,UAAA,CAAWuV,EAAM,QAAA,EAAU,CACxC,CAAA,KALE,MAAM,MAAM,oCAAoC,CAMpD,CAEA,IAAMK,EAAAA,CAA4BJ,EAAAA,CAAmB,CACnD,CAAC,MAAA,CAAQN,EAAqB,CAAA,CAC9B,CAAC,KAAMA,EAAqB,CAAA,CAC5B,CAAC,OAAA,CAASE,EAAkB,CAAA,CAC5B,CAAC,OAAA,CAASC,EAAkB,EAC5B,CAAC,WAAA,CAAaC,EAAkB,CAClC,CAAC,CAAA,CAEYO,EAAAA,CAAe,CAC1B,IAAA,CAAMD,EACR,CAAA,CCvBA,IAAME,GAAS,CACblC,CAAAA,CACAP,EACA0C,CAAAA,CACAC,CAAAA,GACW,CACX,GAAI,CAACD,EAAK,UAAA,CAAW,GAAG,EACtB,OAAOA,CAAAA,CAETA,EAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CACvBE,EAAAA,EAAgB,CAChBrC,EAAasC,EAAAA,CAAatC,CAAU,EACpCP,CAAAA,CAAY8C,EAAAA,CAAY9C,CAAS,CAAA,CACjC,IAAM+C,EAAO,IAAI1X,CAAAA,CAAWA,EAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACjF0X,CAAAA,CAAK,aAAaL,CAAI,CAAA,CACtB,IAAMM,CAAAA,CAAa,IAAI,UAAA,CAAWD,EAAK,IAAA,CAAK,CAAA,CAAGA,EAAK,MAAM,CAAA,CAAE,UAAU,CAAA,CAChE,CAAE,KAAA,CAAAvC,CAAAA,CAAO,QAAAlR,CAAAA,CAAS,QAAA,CAAAU,CAAS,CAAA,CAAQsQ,EAAAA,CAAQC,EAAYP,CAAAA,CAAWgD,CAAAA,CAAYL,CAAS,CAAA,CACvFM,CAAAA,CAAQ,IAAI5X,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CAClFuI,GAAW,IAAA,CAAKqP,CAAAA,CAAO,CACrB,KAAA,CAAOjT,CAAAA,CACP,SAAA,CAAWV,EACX,IAAA,CAAMiR,CAAAA,CAAW,cAAa,CAC9B,KAAA,CAAAC,EACA,EAAA,CAAIR,CACN,CAAC,CAAA,CACDiD,CAAAA,CAAM,IAAA,GACN,IAAMlU,CAAAA,CAAO,IAAI,UAAA,CAAWkU,CAAAA,CAAM,UAAU,CAAA,CAC5C,OAAO,GAAA,CAAMlT,EAAAA,CAAK,OAAOhB,CAAI,CAC/B,EAWMmU,EAAAA,CAAS,CAAC3C,EAAiCmC,CAAAA,GAAyB,CACxE,GAAI,CAACA,CAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,CACtB,OAAOA,EAETA,CAAAA,CAAOA,CAAAA,CAAK,UAAU,CAAC,CAAA,CACvBE,EAAAA,EAAgB,CAChBrC,CAAAA,CAAasC,EAAAA,CAAatC,CAAU,CAAA,CAEpC,IAAIyC,EAAaR,EAAAA,CAAa,IAAA,CAAKzS,GAAK,MAAA,CAAO2S,CAAI,CAAC,CAAA,CAC9C,CAAE,IAAA,CAAAS,EAAM,EAAA,CAAAC,CAAAA,CAAI,MAAA5C,CAAAA,CAAO,KAAA,CAAAU,EAAO,SAAA,CAAAmC,CAAU,EAAIL,CAAAA,CAExCM,CAAAA,CADS/C,EAAW,YAAA,EAAa,CAAE,UAAS,GAErC,IAAI9Q,EAAU0T,CAAAA,CAAK,GAAG,CAAA,CAAE,QAAA,EAAS,CAAI,IAAI1T,EAAU2T,CAAAA,CAAG,GAAG,EAAI,IAAI3T,CAAAA,CAAU0T,EAAK,GAAG,CAAA,CAChGH,CAAAA,CAAiBrC,EAAAA,CAAQJ,CAAAA,CAAY+C,CAAAA,CAAU9C,EAAO6C,CAAAA,CAAWnC,CAAK,EACtE,IAAM6B,CAAAA,CAAO,IAAI1X,CAAAA,CAAWA,CAAAA,CAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACjF,OAAA0X,CAAAA,CAAK,MAAA,CAAOC,CAAU,CAAA,CACtBD,CAAAA,CAAK,MAAK,CACH,GAAA,CAAMA,EAAK,WAAA,EACpB,EAEIQ,EAAAA,CACEX,EAAAA,CAAkB,IAAM,CAC5B,GAAIW,KAAe,MAAA,CAAW,CAC5B,IAAIC,CAAAA,CACJD,EAAAA,CAAa,IAAA,CACb,GAAI,CACF,IAAM1T,EAAM,qDAAA,CAEN4T,CAAAA,CAAahB,GAAO5S,CAAAA,CADX,uDAAA,CACwB,aAAQ,CAAA,CAC/C2T,CAAAA,CAAYN,EAAAA,CAAOrT,EAAK4T,CAAU,EACpC,QAAE,CACAF,EAAAA,CAAaC,IAAc,cAC7B,CACF,CACA,GAAID,EAAAA,GAAe,KAAA,CACjB,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAEnE,CAAA,CAEMV,GAAgBa,CAAAA,EAChB,OAAOA,GAAM,QAAA,CACRnE,CAAAA,CAAW,WAAWmE,CAAC,CAAA,CAEvBA,EAGLZ,EAAAA,CAAeY,CAAAA,EACf,OAAOA,CAAAA,EAAM,QAAA,CACRjU,CAAAA,CAAU,UAAA,CAAWiU,CAAC,CAAA,CAEtBA,EAuBEC,EAAAA,CAAO,CAClB,OAAAT,EAAAA,CACA,MAAA,CAAAT,EACF,ECvJA,IAAAmB,EAAAA,CAAA,GAAAC,EAAAA,CAAAD,EAAAA,CAAA,+BAAAE,EAAAA,CAAA,iBAAA,CAAA,IAAAC,GAAA,UAAA,CAAA,IAAAC,EAAAA,CAAA,qBAAAC,EAAAA,CAAAA,CAAAA,CAkBO,IAAMA,GAAoBtE,CAAAA,EAAoC,CACnE,IAAIuE,CAAAA,CAAS,sBAAA,CACb,GAAI,CAACvE,CAAAA,CACH,OAAOuE,CAAAA,CAAS,eAAA,CAElB,IAAMrX,CAAAA,CAAS8S,CAAAA,CAAS,OACxB,GAAI9S,CAAAA,CAAS,EACX,OAAOqX,CAAAA,CAAS,YAAA,CAElB,GAAIrX,CAAAA,CAAS,EAAA,CACX,OAAOqX,CAAAA,CAAS,aAAA,CAEd,KAAK,IAAA,CAAKvE,CAAQ,IACpBuE,CAAAA,CAAS,8BAAA,CAAA,CAEX,IAAMC,CAAAA,CAAMxE,CAAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CACxBhT,CAAAA,CAAMwX,EAAI,MAAA,CAChB,IAAA,IAASvZ,EAAI,CAAA,CAAGA,CAAAA,CAAI+B,CAAAA,CAAK/B,CAAAA,EAAAA,CAAK,CAC5B,IAAMwZ,EAAQD,CAAAA,CAAIvZ,CAAC,EACnB,GAAI,CAAC,SAAS,IAAA,CAAKwZ,CAAK,EACtB,OAAOF,CAAAA,CAAS,iCAElB,GAAI,CAAC,eAAe,IAAA,CAAKE,CAAK,EAC5B,OAAOF,CAAAA,CAAS,iDAAA,CAElB,GAAI,CAAC,WAAA,CAAY,KAAKE,CAAK,CAAA,CACzB,OAAOF,CAAAA,CAAS,uCAAA,CAElB,GAAIE,CAAAA,CAAM,MAAA,CAAS,CAAA,CACjB,OAAOF,CAAAA,CAAS,YAEpB,CACA,OAAO,IACT,EAEaF,EAAAA,CAAa,CACxB,KAAM,CAAA,CACN,OAAA,CAAS,CAAA,CACT,QAAA,CAAU,CAAA,CACV,mBAAA,CAAqB,EACrB,gBAAA,CAAkB,CAAA,CAClB,mBAAoB,CAAA,CACpB,kBAAA,CAAoB,EACpB,YAAA,CAAc,CAAA,CACd,QAAS,CAAA,CACT,cAAA,CAAgB,EAChB,cAAA,CAAgB,EAAA,CAChB,eAAgB,EAAA,CAChB,oBAAA,CAAsB,GACtB,qBAAA,CAAuB,EAAA,CACvB,GAAA,CAAK,EAAA,CACL,MAAA,CAAQ,EAAA,CACR,uBAAwB,EAAA,CACxB,cAAA,CAAgB,GAChB,WAAA,CAAa,EAAA,CACb,gBAAiB,EAAA,CACjB,0BAAA,CAA4B,EAAA,CAC5B,mBAAA,CAAqB,EAAA,CACrB,aAAA,CAAe,GACf,sBAAA,CAAwB,EAAA,CACxB,yBAA0B,EAAA,CAC1B,eAAA,CAAiB,GACjB,uBAAA,CAAyB,EAAA,CACzB,eAAA,CAAiB,EAAA,CACjB,cAAA,CAAgB,EAAA,CAChB,eAAgB,EAAA,CAChB,IAAA,CAAM,GACN,cAAA,CAAgB,EAAA,CAChB,oBAAqB,EAAA,CACrB,qBAAA,CAAuB,GACvB,4BAAA,CAA8B,EAAA,CAC9B,cAAe,EAAA,CACf,qBAAA,CAAuB,GACvB,aAAA,CAAe,EAAA,CACf,kBAAmB,EAAA,CACnB,oBAAA,CAAsB,EAAA,CACtB,uBAAA,CAAyB,EAAA,CACzB,8BAAA,CAAgC,GAChC,sBAAA,CAAwB,EAAA,CACxB,gBAAiB,EAAA,CACjB,eAAA,CAAiB,GACjB,qBAAA,CAAuB,EAAA,CACvB,eAAA,CAAiB,EAAA,CACjB,eAAA,CAAiB,EAAA,CACjB,uBAAwB,EAAA,CACxB,kBAAA,CAAoB,GAEpB,oBAAA,CAAsB,EAAA,CACtB,cAAe,EAAA,CACf,eAAA,CAAiB,EAAA,CACjB,cAAA,CAAgB,EAAA,CAChB,gBAAA,CAAkB,GAClB,QAAA,CAAU,EAAA,CACV,sBAAuB,EAAA,CACvB,UAAA,CAAY,GACZ,gBAAA,CAAkB,EAAA,CAClB,2BAA4B,EAAA,CAC5B,QAAA,CAAU,GACV,qBAAA,CAAuB,EAAA,CACvB,0BAA2B,EAAA,CAC3B,yBAAA,CAA2B,GAC3B,eAAA,CAAiB,EAAA,CACjB,0BAAA,CAA4B,EAAA,CAC5B,YAAA,CAAc,EAAA,CACd,SAAU,EAAA,CACV,aAAA,CAAe,GACf,qBAAA,CAAuB,EAAA,CACvB,eAAgB,EAAA,CAChB,4BAAA,CAA8B,EAAA,CAC9B,sBAAA,CAAwB,EAAA,CACxB,0BAAA,CAA4B,GAC5B,WAAA,CAAa,EAAA,CACb,6BAA8B,EAAA,CAC9B,wBAAA,CAA0B,GAC1B,6BAAA,CAA+B,EAAA,CAC/B,UAAA,CAAY,EAAA,CACZ,oBAAA,CAAsB,EAAA,CACtB,gBAAiB,EAAA,CACjB,mCAAA,CAAqC,GACrC,cAAA,CAAgB,EAAA,CAChB,wBAAyB,EAAA,CACzB,yBAAA,CAA2B,GAC3B,qBAAA,CAAuB,EAAA,CACvB,gBAAiB,EAAA,CACjB,YAAA,CAAc,GACd,2CAAA,CAA6C,EAAA,CAC7C,gBAAiB,EAAA,CACjB,eAAA,CAAiB,EAAA,CACjB,aAAA,CAAe,EAAA,CACf,sBAAA,CAAwB,EAC1B,CAAA,CAKaD,EAAAA,CAAqBM,GACzBA,CAAAA,CACJ,MAAA,CAAOC,GAAgB,CAAC,MAAA,CAAO,CAAC,CAAA,CAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAC7C,IAAKtY,CAAAA,EAAmBA,CAAAA,GAAU,OAAO,CAAC,CAAA,CAAIA,CAAAA,CAAM,QAAA,EAAS,CAAI,IAAK,EAErEsY,EAAAA,CAAiB,CACrB,CAACC,CAAAA,CAAKC,CAAI,EACVC,CAAAA,GAEIA,CAAAA,CAAmB,GACd,CAACF,CAAAA,CAAO,OAAO,CAAC,CAAA,EAAK,OAAOE,CAAgB,CAAA,CAAID,CAAI,CAAA,CAEpD,CAACD,CAAAA,CAAKC,CAAAA,CAAQ,MAAA,CAAO,CAAC,GAAK,MAAA,CAAOC,CAAAA,CAAmB,EAAE,CAAE,CAAA,CAIvDX,GAA4B,CACvCY,CAAAA,CACAvF,CAAAA,GACmF,CACnF,IAAMpQ,CAAAA,CAAO,CACX,UAAA,CAAY,GACZ,KAAA,CAAA2V,CAAAA,CACA,MAAY,EACd,CAAA,CACA,IAAA,IAAW/U,CAAAA,IAAO,MAAA,CAAO,KAAKwP,CAAK,CAAA,CAAG,CACpC,GAAKA,CAAAA,CAAcxP,CAAG,CAAA,GAAM,MAAA,CAAW,SACvC,IAAIgV,CAAAA,CACJ,OAAQhV,CAAAA,EACN,KAAK,KAAA,CACL,KAAK,kBACHgV,CAAAA,CAAO/Q,EAAAA,CAAW,SAAA,CAClB,MACF,KAAK,wBAAA,CACL,KAAK,uBAAA,CACL,KAAK,qBACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,OAClB,MACF,KAAK,mBAAA,CACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,MAAA,CAClB,MACF,KAAK,KAAA,CACH+Q,EAAO/Q,EAAAA,CAAW,MAAA,CAClB,MACF,KAAK,mBAAA,CACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,KAAA,CAClB,MACF,KAAK,sBAAA,CACH+Q,CAAAA,CAAO/Q,GAAW,KAAA,CAClB,MACF,QACE,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyBjE,CAAG,EAAE,CAClD,CACAZ,EAAK,KAAA,CAAM,IAAA,CAAK,CAACY,CAAAA,CAAKiV,EAAAA,CAAUD,CAAAA,CAAMxF,CAAAA,CAAMxP,CAAG,CAAC,CAAC,CAAC,EACpD,CACA,OAAAZ,CAAAA,CAAK,MAAM,IAAA,CAAK,CAACuB,CAAAA,CAAQtF,CAAAA,GAAWsF,CAAAA,CAAE,CAAC,EAAE,aAAA,CAActF,CAAAA,CAAE,CAAC,CAAC,CAAC,EACrD,CAAC,wBAAA,CAA0B+D,CAAI,CACxC,CAAA,CAEM6V,EAAAA,CAAY,CAACjS,CAAAA,CAAiB5D,CAAAA,GAAc,CAChD,IAAMjD,CAAAA,CAAS,IAAIT,CAAAA,CAAWA,CAAAA,CAAW,iBAAkBA,CAAAA,CAAW,aAAa,EACnF,OAAAsH,CAAAA,CAAW7G,EAAQiD,CAAI,CAAA,CACvBjD,EAAO,IAAA,EAAK,CAELuD,UAAAA,CAAW,IAAI,UAAA,CAAWvD,CAAAA,CAAO,UAAU,CAAC,CACrD,CAAA,CCpIO,SAASmT,EAAAA,CAAOkB,CAAAA,CAAwC,CAC7D,IAAIpR,CAAAA,CACJ,GAAI,OAAOoR,CAAAA,EAAU,QAAA,CAAU,CAG7B,IAAMlV,CAAAA,CAAkB,EAAC,CACzB,IAAA,IAASL,CAAAA,CAAI,EAAGA,CAAAA,CAAIuV,CAAAA,CAAM,OAAQvV,CAAAA,EAAAA,CAAK,CACrC,IAAIC,CAAAA,CAAIsV,CAAAA,CAAM,WAAWvV,CAAC,CAAA,CAC1B,GAAIC,CAAAA,CAAI,GAAA,CACNI,EAAM,IAAA,CAAKJ,CAAC,UACHA,CAAAA,CAAI,IAAA,CACbI,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAQJ,CAAAA,EAAK,EAAI,GAAA,CAAQA,CAAAA,CAAI,EAAK,CAAA,CAAA,KAAA,GACpCA,CAAAA,EAAK,OAAUA,CAAAA,EAAK,KAAA,EAAUD,EAAI,CAAA,CAAIuV,CAAAA,CAAM,OAAQ,CAC7D,IAAMrV,EAAOqV,CAAAA,CAAM,UAAA,CAAW,EAAEvV,CAAC,CAAA,CACjCC,CAAAA,CAAI,KAAA,EAAA,CAAYA,CAAAA,CAAI,IAAA,GAAU,KAAOC,CAAAA,CAAO,IAAA,CAAA,CAC5CG,EAAM,IAAA,CAAK,GAAA,CAAQJ,GAAK,EAAA,CAAK,GAAA,CAASA,GAAK,EAAA,CAAM,EAAA,CAAO,IAASA,CAAAA,EAAK,CAAA,CAAK,GAAO,GAAA,CAAQA,CAAAA,CAAI,EAAK,EACrG,CAAA,KACEI,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAQJ,CAAAA,EAAK,GAAK,GAAA,CAASA,CAAAA,EAAK,EAAK,EAAA,CAAO,GAAA,CAAQA,EAAI,EAAK,EAE5E,CACAkE,CAAAA,CAAO,IAAI,UAAA,CAAW9D,CAAK,EAC7B,CAAA,KACE8D,EAAOoR,CAAAA,CAET,OAAO0E,OAAY9V,CAAI,CACzB,CAGO,SAAS+V,EAAAA,CAAMnV,CAAAA,CAAsB,CAC1C,GAAI,CACF,OAAA4P,CAAAA,CAAW,UAAA,CAAW5P,CAAG,CAAA,CAClB,CAAA,CACT,MAAQ,CACN,OAAO,MACT,CACF,CAaA,eAAsBoV,CAAAA,CACpBC,CAAAA,CACArV,EACkC,CAClC,IAAMsV,CAAAA,CAAK,IAAI5G,EAAAA,CACf,IAAA,IAAW6G,KAAMF,CAAAA,CACf,MAAMC,EAAG,YAAA,CACPC,CAAAA,CAAG,CAAC,CAAA,CACJA,CAAAA,CAAG,CAAC,CACN,CAAA,CAEF,OAAAD,EAAG,IAAA,CAAKtV,CAAG,EACJyM,EAAAA,CAAiB,iDAAA,CAAmD,CACzE6I,CAAAA,CAAG,WACL,CAAC,CACH,CAmBA,eAAsBE,GACpBH,CAAAA,CACArV,CAAAA,CAC0B,CAC1B,IAAMsV,CAAAA,CAAK,IAAI5G,EAAAA,CACf,IAAA,IAAW6G,KAAMF,CAAAA,CACf,MAAMC,EAAG,YAAA,CACPC,CAAAA,CAAG,CAAC,CAAA,CACJA,CAAAA,CAAG,CAAC,CACN,CAAA,CAEF,OAAAD,CAAAA,CAAG,IAAA,CAAKtV,CAAG,EACJsV,CAAAA,CAAG,SAAA,CAAU,KAAK,CAC3B,CAeA,IAAMG,EAAAA,CAA4B,KAAA,CAElC,SAASC,EAAAA,CAAiBC,CAAAA,CAAiBC,CAAAA,CAA8B,CACvE,IAAM7Q,CAAAA,CAAQ,KAAK,GAAA,EAAI,CAAI,IAAO6Q,CAAAA,CAAQ,gBAAA,CACtCC,CAAAA,CACF,MAAA,CAAOD,CAAAA,CAAQ,YAAY,EAC1B7Q,CAAAA,CAAQ4Q,CAAAA,CAAWF,GAClBK,CAAAA,CAAa,IAAA,CAAK,MAAOD,CAAAA,CAAcF,CAAAA,CAAW,GAAK,CAAA,CAC3D,OAAI,CAAC,QAAA,CAASG,CAAU,GAAKA,CAAAA,CAAa,CAAA,CACxCA,EAAa,CAAA,CACJA,CAAAA,CAAa,GAAA,GACtBA,CAAAA,CAAa,GAAA,CAAA,CAER,CAAE,aAAcD,CAAAA,CAAa,QAAA,CAAUF,EAAS,UAAA,CAAAG,CAAW,CACpE,CAMA,SAASC,EAAAA,CAASC,CAAAA,CAAsB,CACtC,IAAMC,EAAQ,UAAA,CAAWD,CAAAA,CAAQ,cAAc,CAAA,CACzCE,CAAAA,CAAY,WAAWF,CAAAA,CAAQ,wBAAwB,CAAA,CACvDG,CAAAA,CAAW,UAAA,CAAWH,CAAAA,CAAQ,uBAAuB,CAAA,CACrDI,CAAAA,CAAe,WAAWJ,CAAAA,CAAQ,qBAAqB,EACvDK,CAAAA,CAAAA,CACH,MAAA,CAAOL,EAAQ,WAAW,CAAA,CAAI,OAAOA,CAAAA,CAAQ,SAAS,GAAK,GAAA,CACxDM,CAAAA,CAAgB,KAAK,GAAA,CAAIF,CAAAA,CAAcC,CAAgB,CAAA,CAC7D,OAAOJ,CAAAA,CAAQK,EAAgBJ,CAAAA,CAAYC,CAC7C,CAGO,SAASI,EAAAA,CAAgBP,EAA0B,CACxD,IAAML,CAAAA,CAAUI,EAAAA,CAASC,CAAO,CAAA,CAAI,IACpC,OAAON,EAAAA,CAAiBC,EAASK,CAAAA,CAAQ,cAAc,CACzD,CAGO,SAASQ,EAAAA,CAAgBC,CAAAA,CAAkC,CAChE,OAAOf,GACL,MAAA,CAAOe,CAAAA,CAAU,MAAM,CAAA,CACvBA,CAAAA,CAAU,UACZ,CACF,KC1OYC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,OAAS,QAAA,CACTA,CAAAA,CAAA,KAAO,MAAA,CACPA,CAAAA,CAAA,8BAAgC,+BAAA,CAChCA,CAAAA,CAAA,iBAAA,CAAoB,mBAAA,CACpBA,CAAAA,CAAA,aAAA,CAAgB,gBAChBA,CAAAA,CAAA,OAAA,CAAU,UACVA,CAAAA,CAAA,OAAA,CAAU,UACVA,CAAAA,CAAA,UAAA,CAAa,YAAA,CARHA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EAmCL,SAASC,GAAgB1T,CAAAA,CAA8B,CAG5D,IAAM2T,CAAAA,CAAmB3T,CAAAA,EAAO,kBAAoB,MAAA,CAAOA,CAAAA,CAAM,iBAAiB,CAAA,CAAI,EAAA,CAChF4T,CAAAA,CAAe5T,GAAO,OAAA,CAAU,MAAA,CAAOA,EAAM,OAAO,CAAA,CAAI,GAExD6T,CAAAA,CAAY7T,CAAAA,EAAO,MAAQ,MAAA,CAAOA,CAAAA,CAAM,KAAK,CAAA,CAAI,EAAA,CACjD8T,EAAcH,CAAAA,EAAoBC,CAAAA,EAAgB,OAAO5T,CAAAA,EAAS,EAAE,CAAA,CAGpE+T,CAAAA,CAAeC,CAAAA,EAEf,CAAA,EAAAH,GAAaG,CAAAA,CAAQ,IAAA,CAAKH,CAAS,CAAA,EAEnCF,CAAAA,EAAoBK,EAAQ,IAAA,CAAKL,CAAgB,CAAA,EAEjDC,CAAAA,EAAgBI,CAAAA,CAAQ,IAAA,CAAKJ,CAAY,CAAA,EAEzCE,CAAAA,EAAeE,EAAQ,IAAA,CAAKF,CAAW,GAK7C,GACEC,CAAAA,CAAY,0BAA0B,CAAA,EACtCA,CAAAA,CAAY,kBAAkB,GAC9BA,CAAAA,CAAY,sCAAsC,EAElD,OAAO,CACL,QAAS,yDAAA,CACT,IAAA,CAAM,gCACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,+BAA+B,CAAA,CAC7C,OAAO,CACL,OAAA,CAAS,gFAAA,CACT,IAAA,CAAM,QAAA,CACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,iDAAiD,CAAA,CAC/D,OAAO,CACL,OAAA,CAAS,8CAAA,CACT,IAAA,CAAM,MAAA,CACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,uBAAuB,CAAA,CACrC,OAAO,CACL,OAAA,CAAS,uDAAA,CACT,IAAA,CAAM,MAAA,CACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,+BAA+B,CAAA,CAC7C,OAAO,CACL,OAAA,CAAS,8DAAA,CACT,KAAM,MAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,EAAY,4CAA4C,CAAA,CAC1D,OAAO,CACL,OAAA,CAAS,8CAAA,CACT,IAAA,CAAM,MAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,EAAY,gBAAgB,CAAA,CAC9B,OAAO,CACL,OAAA,CAAS,uCAAA,CACT,IAAA,CAAM,QAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,EAAY,kBAAkB,CAAA,CAChC,OAAO,CACL,OAAA,CAAS,yDAAA,CACT,IAAA,CAAM,QAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,EAAY,6DAA6D,CAAA,CAC3E,OAAO,CACL,OAAA,CAAS,wDACT,IAAA,CAAM,QAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,+CAA+C,EAC7D,OAAO,CACL,OAAA,CAAS,oEAAA,CACT,IAAA,CAAM,mBAAA,CACN,cAAe/T,CACjB,CAAA,CAOF,GAAI+T,CAAAA,CAAY,uCAAuC,EACrD,OAAO,CACL,OAAA,CAAS,oEAAA,CACT,IAAA,CAAM,mBAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,sCAAsC,EACpD,OAAO,CACL,OAAA,CAAS,kEAAA,CACT,IAAA,CAAM,mBAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,wCAAwC,EACtD,OAAO,CACL,QAAS,4DAAA,CACT,IAAA,CAAM,oBACN,aAAA,CAAe/T,CACjB,EAMF,GACE6T,CAAAA,GAAc,iBACdA,CAAAA,GAAc,qBAAA,EACdE,CAAAA,CAAY,gBAAgB,CAAA,EAC5BA,CAAAA,CAAY,gBAAgB,CAAA,EAC5BA,CAAAA,CAAY,mBAAmB,CAAA,EAC/BA,CAAAA,CAAY,gBAAgB,CAAA,CAE5B,OAAO,CACL,OAAA,CAAS,oDAAA,CACT,IAAA,CAAM,gBACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,wBAAwB,CAAA,EAAKA,CAAAA,CAAY,8BAA8B,CAAA,CACrF,OAAO,CACL,QAAS,uCAAA,CACT,IAAA,CAAM,OACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,wBAAwB,CAAA,CACtC,OAAO,CACL,OAAA,CAAS,8CAAA,CACT,KAAM,MAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GACE+T,CAAAA,CAAY,eAAe,CAAA,EAC3BA,CAAAA,CAAY,qBAAqB,CAAA,EACjCA,CAAAA,CAAY,kBAAkB,CAAA,EAC9BA,CAAAA,CAAY,mEAAmE,CAAA,CAE/E,OAAO,CACL,OAAA,CAAS,4DAAA,CACT,IAAA,CAAM,UACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,UAAU,CAAA,EAAKA,CAAAA,CAAY,YAAY,CAAA,CACrD,OAAO,CACL,QAAS,sCAAA,CACT,IAAA,CAAM,UACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,0BAA0B,CAAA,EAAKA,CAAAA,CAAY,oBAAoB,CAAA,CAC7E,OAAO,CACL,OAAA,CAAS,+CAAA,CACT,KAAM,YAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,mBAAmB,CAAA,CACjC,OAAO,CACL,OAAA,CAAS,2CAAA,CACT,KAAM,YAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,sEAAsE,CAAA,CACpF,OAAO,CACL,OAAA,CAAS,0CAAA,CACT,KAAM,YAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,2BAA2B,CAAA,CAGzC,OAAO,CACL,OAAA,CAAA,CAFe/T,CAAAA,EAAO,SAAW8T,CAAAA,EAAa,SAAA,CAAU,EAAG,GAAG,CAAA,EAAK,4BAGnE,IAAA,CAAM,YAAA,CACN,cAAe9T,CACjB,CAAA,CAKF,GAAIA,CAAAA,EAAO,iBAAA,EAAqB,OAAOA,CAAAA,CAAM,iBAAA,EAAsB,QAAA,CACjE,OAAO,CACL,OAAA,CAASA,EAAM,iBAAA,CAAkB,SAAA,CAAU,EAAG,GAAG,CAAA,CACjD,IAAA,CAAM,QAAA,CACN,aAAA,CAAeA,CACjB,EAIF,GAAIA,CAAAA,EAAO,SAAW,OAAOA,CAAAA,CAAM,SAAY,QAAA,CAC7C,OAAO,CACL,OAAA,CAASA,CAAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,CAAG,GAAG,EACvC,IAAA,CAAM,QAAA,CACN,cAAeA,CACjB,CAAA,CAIF,IAAItD,CAAAA,CACJ,OAAI,OAAOsD,CAAAA,EAAU,QAAA,EAAYA,IAAU,IAAA,CAErCA,CAAAA,CAAM,kBACRtD,CAAAA,CAAU,MAAA,CAAOsD,CAAAA,CAAM,iBAAiB,CAAA,CAC/BA,CAAAA,CAAM,KACftD,CAAAA,CAAU,CAAA,YAAA,EAAesD,EAAM,IAAI,CAAA,CAAA,CAC1B8T,GAAeA,CAAAA,GAAgB,iBAAA,CACxCpX,CAAAA,CAAUoX,CAAAA,CAAY,SAAA,CAAU,CAAA,CAAG,GAAG,CAAA,CAEtCpX,CAAAA,CAAU,yBAGZA,CAAAA,CAAUoX,CAAAA,CAAY,UAAU,CAAA,CAAG,GAAG,CAAA,EAAK,wBAAA,CAGtC,CACL,OAAA,CAAApX,EACA,IAAA,CAAM,QAAA,CACN,cAAesD,CACjB,CACF,CAsBO,SAASiU,EAAAA,CAAYjU,EAAiC,CAC3D,IAAMkU,EAASR,EAAAA,CAAgB1T,CAAK,EACpC,OAAO,CAACkU,EAAO,OAAA,CAASA,CAAAA,CAAO,IAAI,CACrC,CAsBO,SAASC,GAA0BnU,CAAAA,CAAqB,CAC7D,GAAM,CAAE,IAAA,CAAA+R,CAAK,CAAA,CAAI2B,EAAAA,CAAgB1T,CAAK,CAAA,CACtC,OAAO+R,IAAS,mBAAA,EAA+BA,CAAAA,GAAS,eAC1D,CAoBO,SAASqC,GAAuBpU,CAAAA,CAAqB,CAC1D,GAAM,CAAE,IAAA,CAAA+R,CAAK,EAAI2B,EAAAA,CAAgB1T,CAAK,EACtC,OAAO+R,CAAAA,GAAS,+BAClB,CASO,SAASsC,GAAYrU,CAAAA,CAAqB,CAC/C,GAAM,CAAE,IAAA,CAAA+R,CAAK,CAAA,CAAI2B,EAAAA,CAAgB1T,CAAK,CAAA,CACtC,OAAO+R,CAAAA,GAAS,MAClB,CAQO,SAASuC,GAAetU,CAAAA,CAAqB,CAClD,GAAM,CAAE,IAAA,CAAA+R,CAAK,CAAA,CAAI2B,EAAAA,CAAgB1T,CAAK,CAAA,CACtC,OAAO+R,CAAAA,GAAS,WAAqBA,CAAAA,GAAS,SAChD,CC3XA,eAAewC,EAAAA,CACb5R,CAAAA,CACAoK,CAAAA,CACAqF,CAAAA,CACAoC,CAAAA,CACAC,EAA4B,SAAA,CAC5BC,CAAAA,CACAC,EACAC,CAAAA,CAA+B,OAAA,CACqB,CACpD,IAAMC,CAAAA,CAAUL,GAAM,OAAA,CAEtB,OAAQ7R,GACN,KAAK,MAAO,CACV,GAAI,CAACkS,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wCAAwC,CAAA,CAI1D,IAAI9X,CAAAA,CAAiC2X,CAAAA,CAErC,GAAI3X,CAAAA,GAAQ,MAAA,CAEV,OAAQ0X,CAAAA,EACN,KAAK,OAAA,CACH,GAAII,CAAAA,CAAQ,YACV9X,CAAAA,CAAM,MAAM8X,EAAQ,WAAA,CAAY9H,CAAQ,OAExC,MAAM,IAAI,KAAA,CACR,iIAEF,CAAA,CAEF,MAEF,KAAK,QAAA,CACC8H,CAAAA,CAAQ,eACV9X,CAAAA,CAAM,MAAM8X,EAAQ,YAAA,CAAa9H,CAAQ,GAE3C,MAEF,KAAK,OACH,GAAI8H,CAAAA,CAAQ,WACV9X,CAAAA,CAAM,MAAM8X,EAAQ,UAAA,CAAW9H,CAAQ,CAAA,CAAA,KAEvC,MAAM,IAAI,KAAA,CACR,yEACF,CAAA,CAEF,MAGF,QACEhQ,CAAAA,CAAM,MAAM8X,EAAQ,aAAA,CAAc9H,CAAQ,CAAA,CAC1C,KACJ,CAGF,GAAI,CAAChQ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,GAAA,EAAM0X,CAAS,CAAA,mBAAA,EAAsB1H,CAAQ,CAAA,CAAE,CAAA,CAIjE,IAAMY,CAAAA,CAAahB,EAAW,UAAA,CAAW5P,CAAG,EAC5C,OAAI6X,CAAAA,GAAkB,QACb,MAAMrC,EAAAA,CAAyBH,EAAKzE,CAAU,CAAA,CAEhD,MAAMwE,CAAAA,CAAoBC,CAAAA,CAAKzE,CAAU,CAClD,CAEA,KAAK,UAAA,CAAY,CACf,GAAI,CAACkH,CAAAA,EAAS,qBAAA,CACZ,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAErD,OAAO,MAAMA,CAAAA,CAAQ,qBAAA,CAAsB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CACrE,CAEA,KAAK,YAAA,CAAc,CACjB,GAAI,CAACI,EACH,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA,CAK3D,GAAIJ,IAAc,SAAA,CAAW,CAC3B,GAAII,CAAAA,CAAQ,uBAAA,CACV,OAAO,MAAMA,CAAAA,CAAQ,wBAAwB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CAAA,CAEvE,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuCA,CAAS,CAAA,6CAAA,CAA+C,CACjH,CAGA,IAAMK,CAAAA,CAAQH,CAAAA,GAAiB,OAC3BA,CAAAA,CACA,MAAME,EAAQ,cAAA,CAAe9H,CAAQ,EAEzC,GAAI+H,CAAAA,CACF,GAAI,CAGF,OAAA,CADiB,MADF,IAAIC,EAAAA,CAAG,MAAA,CAAO,CAAE,WAAA,CAAaD,CAAM,CAAC,CAAA,CACrB,SAAA,CAAU1C,CAAG,CAAA,EAC3B,MAClB,CAAA,MAAS4C,EAAY,CAEnB,GAAIH,EAAQ,uBAAA,EAA2BV,EAAAA,CAA0Ba,CAAU,CAAA,CACzE,OAAO,MAAMH,CAAAA,CAAQ,uBAAA,CAAwB9H,EAAUqF,CAAAA,CAAKqC,CAAS,EAEvE,MAAMO,CACR,CAIF,GAAIH,CAAAA,CAAQ,uBAAA,CACV,OAAO,MAAMA,CAAAA,CAAQ,wBAAwB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CAAA,CAGvE,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC1H,CAAQ,CAAA,CAAE,CAC7D,CAEA,KAAK,UAAA,CAAY,CACf,GAAI,CAAC8H,CAAAA,EAAS,sBACZ,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAErD,OAAO,MAAMA,CAAAA,CAAQ,qBAAA,CAAsB9H,EAAUqF,CAAAA,CAAKqC,CAAS,CACrE,CAEA,KAAK,SAAU,CACb,GAAI,CAACD,CAAAA,EAAM,SAAA,CACT,MAAM,IAAI,KAAA,CAAM,uCAAuC,CAAA,CAEzD,OAAQ,MAAMA,CAAAA,CAAK,SAAA,CAAUpC,CAAAA,CAAKqC,CAAS,CAC7C,CAEA,QACE,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB9R,CAAM,CAAA,CAAE,CACpD,CACF,CAuCA,eAAesS,EAAAA,CACblI,CAAAA,CACAqF,EACAoC,CAAAA,CACAC,CAAAA,CAA4B,UAC5BG,CAAAA,CAA+B,OAAA,CACqB,CACpD,IAAMC,CAAAA,CAAUL,CAAAA,EAAM,QAItB,GAAIK,CAAAA,EAAS,aAAc,CACzB,IAAMK,EAAY,MAAML,CAAAA,CAAQ,aAAa9H,CAAAA,CAAU0H,CAAS,EAEhE,GAAIS,CAAAA,CAAW,CAIb,IAAMC,CAAAA,CAAiBN,EAAQ,uBAAA,CAC3B,MAAMA,CAAAA,CAAQ,uBAAA,CAAwB9H,CAAQ,CAAA,CAC9C,MAIJ,GACE0H,CAAAA,GAAc,WACdU,CAAAA,EACAD,CAAAA,GAAc,MAEd,GAAI,CAEF,OAAO,MAAMX,EAAAA,CAAoB,YAAA,CAAcxH,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,CAAA,MAAS5U,CAAAA,CAAO,CAGd,GAAI,CAACmU,GAA0BnU,CAAK,CAAA,CAClC,MAAMA,CAAAA,CAGR,OAAA,CAAQ,KAAK,0DAAA,CAA4DA,CAAK,EAChF,CAIF,GACEyU,IAAc,SAAA,EACdU,CAAAA,EACAD,IAAc,UAAA,CAEd,GAAI,CACF,OAAO,MAAMX,EAAAA,CAAoB,YAAA,CAAcxH,CAAAA,CAAUqF,CAAAA,CAAKoC,EAAMC,CAAAA,CAAW,KAAA,CAAA,CAAW,OAAWG,CAAa,CACpH,OAAS5U,CAAAA,CAAO,CACd,GAAI,CAACmU,EAAAA,CAA0BnU,CAAK,EAClC,MAAMA,CAAAA,CAER,QAAQ,IAAA,CAAK,oEAAA,CAAsEA,CAAK,EAC1F,CAIF,GACEyU,CAAAA,GAAc,SAAA,EACdU,CAAAA,EACAD,IAAc,UAAA,CAEd,GAAI,CAEF,OAAO,MAAMX,GAAoB,YAAA,CAAcxH,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAW,OAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,CAAA,MAAS5U,CAAAA,CAAO,CAGd,GAAI,CAACmU,EAAAA,CAA0BnU,CAAK,CAAA,CAClC,MAAMA,EAGR,OAAA,CAAQ,IAAA,CAAK,gEAAiEA,CAAK,EACrF,CAIF,GAAI,CACF,OAAO,MAAMuU,EAAAA,CAAoBW,CAAAA,CAAWnI,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACjH,CAAA,MAAS5U,CAAAA,CAAO,CAEd,GAAImU,EAAAA,CAA0BnU,CAAK,CAAA,EAG/B6U,CAAAA,CAAQ,oBACPJ,CAAAA,GAAc,SAAA,EAAaA,IAAc,QAAA,CAAA,CAC1C,CAEA,IAAM7I,CAAAA,CAAgBwG,CAAAA,CAAI,OAAS,CAAA,CAAIA,CAAAA,CAAI,CAAC,CAAA,CAAE,CAAC,EAAI,SAAA,CAC7CgD,CAAAA,CAAiB,MAAMP,CAAAA,CAAQ,iBAAA,CAAkBJ,CAAAA,CAAW7I,CAAa,CAAA,CAC/E,GAAI,CAACwJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsBX,CAAS,CAAA,yCAAA,CAA2C,CAAA,CAM5F,OAAO,MAAMF,EAAAA,CAAoBa,CAAAA,CAAgBrI,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,MAAA,CAAW,MAAA,CAAWG,CAAa,CACtH,CAIF,MAAM5U,CACR,CACF,CAGA,GAAIyU,CAAAA,GAAc,SAAA,CAEhB,GAAI,CACF,OAAO,MAAMF,EAAAA,CAAoB,YAAA,CAAcxH,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,CAAA,MAASS,CAAAA,CAAS,CAChB,GAAIlB,EAAAA,CAA0BkB,CAAO,CAAA,EAAKR,CAAAA,CAAQ,kBAAmB,CACnE,IAAMjJ,EAAgBwG,CAAAA,CAAI,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAI,SAAA,CAC7CgD,EAAiB,MAAMP,CAAAA,CAAQ,kBAAkBJ,CAAAA,CAAW7I,CAAa,CAAA,CAC/E,GAAI,CAACwJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,+BAA+BrI,CAAQ,CAAA,sBAAA,CAAwB,EAEjF,OAAO,MAAMwH,GAAoBa,CAAAA,CAAgBrI,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAW,OAAW,MAAA,CAAWG,CAAa,CACtH,CACA,MAAMS,CACR,CAAA,KAAA,GACSZ,CAAAA,GAAc,QAAA,EAAYI,EAAQ,iBAAA,CAAmB,CAE9D,IAAMjJ,CAAAA,CAAgBwG,CAAAA,CAAI,OAAS,CAAA,CAAIA,CAAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAI,UAC7CgD,CAAAA,CAAiB,MAAMP,EAAQ,iBAAA,CAAkBJ,CAAAA,CAAW7I,CAAa,CAAA,CAC/E,GAAI,CAACwJ,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsBX,CAAS,2CAA2C,CAAA,CAE5F,OAAO,MAAMF,EAAAA,CAAoBa,CAAAA,CAAgBrI,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,MAAA,CAAW,MAAA,CAAWG,CAAa,CACtH,CACF,CAIA,IAAMU,CAAAA,CAAQd,CAAAA,EAAM,aAAA,EAAiB,CAAC,KAAA,CAAO,WAAY,YAAA,CAAc,UAAA,CAAY,QAAQ,CAAA,CACrFe,CAAAA,CAA6B,IAAI,GAAA,CAEvC,IAAA,IAAW5S,CAAAA,IAAU2S,CAAAA,CACnB,GAAI,CAEF,IAAIE,CAAAA,CAAa,CAAA,CAAA,CACbC,EAAa,EAAA,CACbC,CAAAA,CACAC,EAEJ,OAAQhT,CAAAA,EACN,KAAK,KAAA,CACH,GAAI,CAACkS,CAAAA,CACHW,CAAAA,CAAa,GACbC,CAAAA,CAAa,qBAAA,CAAA,KACR,CAEL,IAAI1Y,CAAAA,CAEJ,OAAQ0X,CAAAA,EACN,KAAK,OAAA,CACCI,CAAAA,CAAQ,cACV9X,CAAAA,CAAM,MAAM8X,EAAQ,WAAA,CAAY9H,CAAQ,CAAA,CAAA,CAE1C,MACF,KAAK,QAAA,CACC8H,EAAQ,YAAA,GACV9X,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,YAAA,CAAa9H,CAAQ,CAAA,CAAA,CAE3C,MACF,KAAK,MAAA,CACC8H,CAAAA,CAAQ,UAAA,GACV9X,EAAM,MAAM8X,CAAAA,CAAQ,WAAW9H,CAAQ,CAAA,CAAA,CAEzC,MAEF,QACEhQ,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,aAAA,CAAc9H,CAAQ,EAC1C,KACJ,CAEKhQ,EAIH2Y,CAAAA,CAAgB3Y,CAAAA,EAHhByY,EAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,MAAMhB,CAAS,CAAA,cAAA,CAAA,EAIhC,CACA,MACF,KAAK,WACEI,CAAAA,EAAS,qBAAA,GACZW,EAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,mCAAA,CAAA,CAEf,MACF,KAAK,YAAA,CACH,GAAI,CAACZ,CAAAA,CACHW,EAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,2BACR,CAEL,IAAMX,CAAAA,CAAQ,MAAMD,CAAAA,CAAQ,cAAA,CAAe9H,CAAQ,CAAA,CAC/C+H,CAAAA,GACFa,EAAkBb,CAAAA,EAItB,CACA,MACF,KAAK,UAAA,CACED,CAAAA,EAAS,qBAAA,GACZW,CAAAA,CAAa,CAAA,CAAA,CACbC,EAAa,mCAAA,CAAA,CAEf,MACF,KAAK,QAAA,CACEjB,CAAAA,EAAM,YACTgB,CAAAA,CAAa,CAAA,CAAA,CACbC,EAAa,uCAAA,CAAA,CAEf,KACJ,CAEA,GAAID,CAAAA,CAAY,CACdD,CAAAA,CAAO,GAAA,CAAI5S,EAAQ,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY8S,CAAU,CAAA,CAAE,CAAC,EACtD,QACF,CAGA,OAAO,MAAMlB,EAAAA,CAAoB5R,EAAQoK,CAAAA,CAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,CAAAA,CAAWiB,CAAAA,CAAeC,CAAAA,CAAiBf,CAAa,CACxH,CAAA,MAAS5U,EAAO,CAKd,GAHAuV,EAAO,GAAA,CAAI5S,CAAAA,CAAQ3C,CAAc,CAAA,CAG7B,CAACmU,EAAAA,CAA0BnU,CAAK,CAAA,CAElC,MAAMA,CAEV,CAQF,GAAI,CAJoB,KAAA,CAAM,IAAA,CAAKuV,EAAO,MAAA,EAAQ,EAAE,IAAA,CAClDvV,CAAAA,EAAS,CAACA,CAAAA,CAAM,OAAA,CAAQ,WAAW,UAAU,CAC/C,CAAA,CAEsB,CAEpB,IAAM4V,CAAAA,CAAc,MAAM,IAAA,CAAKL,CAAAA,CAAO,SAAS,CAAA,CAC5C,IAAI,CAAC,CAAC5S,CAAAA,CAAQ3C,CAAK,CAAA,GAAM,CAAA,EAAG2C,CAAM,CAAA,EAAA,EAAK3C,CAAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACtD,KAAK,IAAI,CAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,+CAAA,EAAkD+M,CAAQ,CAAA,EAAA,EAAK6I,CAAW,EAC5E,CACF,CAGA,IAAMC,CAAAA,CAAgB,KAAA,CAAM,KAAKN,CAAAA,CAAO,OAAA,EAAS,CAAA,CAC9C,GAAA,CAAI,CAAC,CAAC5S,CAAAA,CAAQ3C,CAAK,CAAA,GAAM,CAAA,EAAG2C,CAAM,CAAA,EAAA,EAAK3C,CAAAA,CAAM,OAAO,EAAE,CAAA,CACtD,IAAA,CAAK,IAAI,CAAA,CAEZ,MAAM,IAAI,KAAA,CACR,CAAA,6CAAA,EAAgD+M,CAAQ,CAAA,UAAA,EAAa8I,CAAa,CAAA,CACpF,CACF,CA6DO,SAASC,EACdC,CAAAA,CAA2B,GAC3BhJ,CAAAA,CACAqE,CAAAA,CACA4E,CAAAA,CAAgE,IAAM,CAAC,CAAA,CACvExB,EACAC,CAAAA,CAA4B,SAAA,CAC5B9I,EAeA,CACA,IAAMiJ,EAAgBjJ,CAAAA,EAAS,aAAA,EAAiB,QAEhD,OAAOsK,WAAAA,CAAY,CACjB,SAAA,CAAAD,CAAAA,CACA,SAAUrK,CAAAA,EAAS,QAAA,CACnB,QAASA,CAAAA,EAAS,OAAA,CAClB,SAAA,CAAWA,CAAAA,EAAS,SAAA,CACpB,WAAA,CAAa,CAAC,GAAGoK,CAAAA,CAAahJ,CAAQ,CAAA,CACtC,UAAA,CAAY,MAAOmJ,CAAAA,EAAe,CAChC,GAAI,CAACnJ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,kEACF,EAGF,IAAMqF,CAAAA,CAAMhB,EAAW8E,CAAO,CAAA,CAE9B,GAAI,CAEF,GAAI1B,CAAAA,EAAM,iBAAmB,CAAA,CAAA,EAASA,CAAAA,EAAM,QAC1C,OAAO,MAAMS,GAAsBlI,CAAAA,CAAUqF,CAAAA,CAAKoC,EAAMC,CAAAA,CAAWG,CAAa,EAIlF,GAAIJ,CAAAA,EAAM,UACR,OAAO,MAAMA,EAAK,SAAA,CAAUpC,CAAAA,CAAKqC,CAAS,CAAA,CAG5C,IAAM0B,CAAAA,CAAa3B,GAAM,UAAA,CACzB,GAAI2B,EAAY,CAEd,GAAI1B,IAAc,SAAA,CAChB,MAAM,IAAI,KAAA,CACR,CAAA,mEAAA,EAAsEA,CAAS,0DACtCA,CAAS,CAAA,YAAA,CACpD,EAGF,IAAM9G,CAAAA,CAAahB,EAAW,UAAA,CAAWwJ,CAAU,CAAA,CAEnD,OAAO,MAAMhE,CAAAA,CACXC,EACAzE,CACF,CACF,CAEA,IAAMyI,CAAAA,CAAc5B,GAAM,WAAA,CAC1B,GAAI4B,EAGF,OAAA,CADiB,MADF,IAAIrB,EAAAA,CAAG,MAAA,CAAO,CAAE,WAAA,CAAAqB,CAAY,CAAC,CAAA,CACd,SAAA,CAAUhE,CAAG,CAAA,EAC3B,MAAA,CAGlB,MAAM,IAAI,KAAA,CACR,mEACF,CACF,CAAA,MAASvM,CAAAA,CAAG,CACV,MAAIA,CAAAA,YAAavE,CAAAA,CAKT,IAAI,KAAA,CAAMuE,CAAAA,CAAE,OAAO,CAAA,CAErBA,CACR,CACF,CACF,CAAC,CACH,CClnBA,eAAsBwQ,EAAAA,CACpBtJ,EACAhO,CAAAA,CACAmX,CAAAA,CACA1B,EACA,CACA,GAAI,CAACzH,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,kEACF,EAEF,IAAMuJ,CAAAA,CAAQ,CACZ,EAAA,CAAAvX,CAAAA,CACA,eAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACgO,CAAQ,CAAA,CACjC,KAAM,IAAA,CAAK,SAAA,CAAUmJ,CAAO,CAC9B,CAAA,CAEA,GAAI1B,CAAAA,EAAM,SAAA,CACR,OAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAC,aAAA,CAAe8B,CAAK,CAAC,CAAA,CAAG,SAAS,EAG3D,IAAMH,CAAAA,CAAa3B,CAAAA,EAAM,UAAA,CACzB,GAAI2B,CAAAA,CAAY,CACd,IAAMxI,CAAAA,CAAahB,EAAW,UAAA,CAAWwJ,CAAU,EAEnD,OAAOhE,CAAAA,CACL,CAAC,CAAC,aAAA,CAAemE,CAAK,CAAC,CAAA,CACvB3I,CACF,CACF,CAGA,IAAMyI,CAAAA,CAAc5B,CAAAA,EAAM,WAAA,CAC1B,GAAI4B,CAAAA,CAIF,OAAA,CAHiB,MAAM,IAAIrB,EAAAA,CAAG,OAAO,CACnC,WAAA,CAAAqB,CACF,CAAC,CAAA,CAAE,UAAA,CAAW,EAAC,CAAG,CAACrJ,CAAQ,CAAA,CAAGhO,CAAAA,CAAI,KAAK,SAAA,CAAUmX,CAAO,CAAC,CAAA,EACzC,MAAA,CAGlB,MAAM,IAAI,KAAA,CACR,mEACF,CACF,CCxCO,IAAMK,GAA+B,IAYrC,SAASC,EACd3B,CAAAA,CACAD,CAAAA,CACA9I,EACsB,CACtB,GAAK+I,GAAS,iBAAA,CACd,CAAA,GAAID,IAAkB,MAAA,CAEpB,OAAOC,EAAQ,iBAAA,CAAkB/I,CAAI,CAAA,CAEvC,UAAA,CAAW,IAAM+I,CAAAA,CAAQ,oBAAoB/I,CAAI,CAAA,CAAG,GAA4B,EAAA,CAClF,CChCO,SAAS2K,EAAAA,CAAkBC,CAAAA,CAAmBtP,CAAAA,CAAmC,CACtF,IAAMuP,CAAAA,CAAgB,YAAY,OAAA,CAAQD,CAAS,EACnD,GAAI,CAACtP,EAAQ,OAAOuP,CAAAA,CAIpB,GAAI,OAAO,WAAA,CAAY,GAAA,EAAQ,WAC7B,OAAO,WAAA,CAAY,IAAI,CAACvP,CAAAA,CAAQuP,CAAa,CAAC,CAAA,CAGhD,IAAMC,CAAAA,CAAK,IAAI,gBACTC,CAAAA,CAAU,IAAM,CACpB,IAAMC,CAAAA,CAAS1P,EAAO,OAAA,CAAUA,CAAAA,CAAO,MAAA,CAASuP,CAAAA,CAAc,MAAA,CAC9DC,CAAAA,CAAG,MAAME,CAAM,CAAA,CACf1P,EAAO,mBAAA,CAAoB,OAAA,CAASyP,CAAO,CAAA,CAC3CF,CAAAA,CAAc,mBAAA,CAAoB,OAAA,CAASE,CAAO,EACpD,EACA,OAAIzP,CAAAA,CAAO,QACTwP,CAAAA,CAAG,KAAA,CAAMxP,EAAO,MAAM,CAAA,CACbuP,CAAAA,CAAc,OAAA,CACvBC,CAAAA,CAAG,KAAA,CAAMD,EAAc,MAAM,CAAA,EAE7BvP,EAAO,gBAAA,CAAiB,OAAA,CAASyP,EAAS,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CACxDF,EAAc,gBAAA,CAAiB,OAAA,CAASE,EAAS,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAAA,CAE1DD,CAAAA,CAAG,MACZ,KCZMG,EAAAA,CAAAA,CAAiB,IAAM,CAC3B,GAAI,CACF,OAAO,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,aACnC,CAAA,KAAQ,CACN,OAAO,MACT,CACF,IAAG,CAEGC,EAAAA,CAAkB,IAAM,CAC5B,GAAI,CACF,OAAO,OAAA,CAAQ,GAAA,EAAK,mBACtB,CAAA,KAAQ,CACN,MACF,CACF,CAAA,CAGaC,GAA0B,GAAA,CAsB1BC,EAAAA,CAAoB,IAAS,GAAA,CAsBtCC,EAAAA,CAGAC,GAEJ,SAASC,EAAAA,EAAkC,CACzC,OAAIF,EAAAA,CACKA,EAAAA,EAAoB,CAErBC,EAAAA,GAAwB,IAAIE,WACtC,CAEO,IAAMC,EAAS,CACpB,cAAA,CAAgB,qBAYhB,eAAA,CAAiB,QAAA,CASjB,QAAA,CAAU,YAAA,CACV,SAAA,CAAW,sBAAA,CAEX,IAAI,SAAA,EAAsB,CACxB,OAAO1c,CAAAA,CAAa,KACtB,EACA,YAAA,CAAcmc,EAAAA,EAAgB,CAQ9B,IAAI,WAAA,EAA2B,CAC7B,OAAOK,EAAAA,EACT,EACA,IAAI,WAAA,CAAYG,EAAqB,CACnCL,EAAAA,CAAsB,IAAMK,EAC9B,CAAA,CACA,aAAc,yBAAA,CACd,aAAA,CAAe,wBAEf,YAAA,CAAc,GACd,QAAA,CAAU,EAAC,CACX,YAAA,CAAc,EAAC,CAEf,eAAgB,EAAC,CACjB,mBAAoB,EAAC,CAErB,iBAAkB,KACpB,CAAA,CAQiBC,EAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CAAeF,EAAqB,CAClDD,CAAAA,CAAO,YAAcC,EACvB,CAFOC,EAAS,cAAA,CAAAC,CAAAA,CAsBT,SAASC,CAAAA,CAAuBxW,CAAAA,CAA4B,CACjEgW,GAAsBhW,EACxB,CAFOsW,EAAS,sBAAA,CAAAE,CAAAA,CAQT,SAASC,CAAAA,CAAkBC,CAAAA,CAAc,CAC9CN,CAAAA,CAAO,cAAA,CAAiBM,EAC1B,CAFOJ,CAAAA,CAAS,kBAAAG,CAAAA,CAWT,SAASE,EAAYC,CAAAA,CAAkB,CAC5CR,CAAAA,CAAO,QAAA,CAAWQ,EACpB,CAFON,EAAS,WAAA,CAAAK,CAAAA,CAiBT,SAASE,CAAAA,CAAmBC,CAAAA,CAAkB,CACnD,GAAI,OAAOA,CAAAA,EAAa,QAAA,EAAYA,CAAAA,CAAS,IAAA,KAAW,EAAA,CACtD,MAAM,IAAI,KAAA,CACR,kLAEF,EAGFV,CAAAA,CAAO,eAAA,CAAkBU,EAC3B,CATOR,CAAAA,CAAS,kBAAA,CAAAO,EAuBT,SAASE,CAAAA,EAA8B,CAC5C,OAAIX,CAAAA,CAAO,eACFA,CAAAA,CAAO,cAAA,CAGZ,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,QAAA,EAAU,MAAA,CAC7C,OAAO,QAAA,CAAS,MAAA,CAIlB,oBACT,CAXOE,CAAAA,CAAS,mBAAA,CAAAS,CAAAA,CAiBT,SAASC,CAAAA,CAAgBN,EAAc,CAC5CN,CAAAA,CAAO,aAAeM,EACxB,CAFOJ,EAAS,eAAA,CAAAU,CAAAA,CAQT,SAASC,CAAAA,CAAaP,CAAAA,CAAc,CACzCN,EAAO,SAAA,CAAYM,EACrB,CAFOJ,CAAAA,CAAS,YAAA,CAAAW,EAWT,SAASC,CAAAA,CAAatd,CAAAA,CAAiB,CAC5CE,EAAAA,CAAeF,CAAK,EACtB,CAFO0c,CAAAA,CAAS,aAAAY,CAAAA,CAWT,SAASld,EAAaJ,CAAAA,CAAiB,CAC5CI,GAAmBJ,CAAK,EAC1B,CAFO0c,CAAAA,CAAS,YAAA,CAAAtc,EAYT,SAASE,CAAAA,CAAkBC,EAA4C,CAC5ED,EAAAA,CAAwBC,CAAG,EAC7B,CAFOmc,CAAAA,CAAS,kBAAApc,CAAAA,CAWT,SAASI,EAAa6c,CAAAA,CAAmB,CAC9C7c,GAAmB6c,CAAS,EAC9B,CAFOb,CAAAA,CAAS,YAAA,CAAAhc,EAaT,SAASE,CAAAA,CAAcC,EAAkC,CAC9DD,EAAAA,CAAoBC,CAAI,EAC1B,CAFO6b,CAAAA,CAAS,aAAA,CAAA9b,CAAAA,CAShB,SAAS4c,EAAiBvE,CAAAA,CAAqD,CAE7E,GAAI,4BAAA,CAA6B,IAAA,CAAKA,CAAO,CAAA,CAC3C,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,OAAQ,6BAA8B,CAAA,CAI9D,GAAI,wBAAA,CAAyB,IAAA,CAAKA,CAAO,CAAA,CACvC,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,MAAA,CAAQ,iDAAkD,CAAA,CAIlF,GAAI,yBAAyB,IAAA,CAAKA,CAAO,EACvC,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,MAAA,CAAQ,uDAAwD,EAIxF,GAAI,UAAA,CAAW,KAAKA,CAAO,CAAA,EAAK,WAAW,IAAA,CAAKA,CAAO,CAAA,CACrD,OAAO,CAAE,IAAA,CAAM,MAAO,MAAA,CAAQ,0CAA2C,EAI3E,IAAMwE,CAAAA,CAAiB,sBACnBC,CAAAA,CACJ,KAAA,CAAQA,EAAQD,CAAAA,CAAe,IAAA,CAAKxE,CAAO,CAAA,IAAO,IAAA,EAAM,CACtD,GAAM,EAAG0E,CAAAA,CAAKC,CAAG,CAAA,CAAIF,CAAAA,CAErB,GADc,QAAA,CAASE,EAAK,EAAE,CAAA,CAAI,SAASD,CAAAA,CAAK,EAAE,EACtC,GAAA,CACV,OAAO,CAAE,IAAA,CAAM,KAAA,CAAO,MAAA,CAAQ,qBAAqBA,CAAG,CAAA,CAAA,EAAIC,CAAG,CAAA,CAAA,CAAI,CAErE,CAEA,OAAO,CAAE,IAAA,CAAM,IAAK,CACtB,CAOA,SAASC,CAAAA,CAAqBC,CAAAA,CAAmD,CAE/E,IAAMC,CAAAA,CAAoB,CAExB,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,CAAI,GAAA,CAEjB,KAAK,MAAA,CAAO,EAAE,EAAI,GAAA,CAElB,GAAA,CAAI,OAAO,GAAG,CAAA,CAEd,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,CAAI,MAAM,MAAA,CAAO,EAAE,EAAI,GACxC,CAAA,CAEMC,EAAmB,CAAA,CAEzB,IAAA,IAAWxL,CAAAA,IAASuL,CAAAA,CAAmB,CACrC,IAAMre,EAAQ,IAAA,CAAK,GAAA,GACnB,GAAI,CACFoe,EAAM,IAAA,CAAKtL,CAAK,CAAA,CAChB,IAAMyL,CAAAA,CAAW,IAAA,CAAK,KAAI,CAAIve,CAAAA,CAE9B,GAAIue,CAAAA,CAAWD,CAAAA,CACb,OAAO,CACL,IAAA,CAAM,GACN,MAAA,CAAQ,CAAA,sBAAA,EAAyBA,CAAgB,CAAA,SAAA,EAAYC,CAAQ,sBAAsBzL,CAAAA,CAAM,MAAM,GACzG,CAEJ,CAAA,MAAStH,CAAAA,CAAK,CACZ,OAAO,CAAE,KAAM,KAAA,CAAO,MAAA,CAAQ,6BAA6BA,CAAG,CAAA,CAAG,CACnE,CACF,CAEA,OAAO,CAAE,IAAA,CAAM,IAAK,CACtB,CAQA,SAASgT,EAAiBjF,CAAAA,CAAiBkF,CAAAA,CAAY,IAAoB,CAGzE,GAAI,CAEF,GAAI,CAAClF,CAAAA,CACH,OAAI+C,EAAAA,EACF,OAAA,CAAQ,KAAK,4CAA4C,CAAA,CAEpD,KAGT,GAAI/C,CAAAA,CAAQ,OAASkF,CAAAA,CACnB,OAAInC,IACF,OAAA,CAAQ,IAAA,CAAK,uCAAuC/C,CAAAA,CAAQ,MAAM,gBAAgBkF,CAAS,CAAA,YAAA,EAAelF,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA,CAElI,KAIT,IAAMmF,CAAAA,CAAiBZ,EAAiBvE,CAAO,CAAA,CAC/C,GAAI,CAACmF,CAAAA,CAAe,IAAA,CAClB,OAAIpC,EAAAA,EACF,OAAA,CAAQ,KAAK,CAAA,qDAAA,EAAwDoC,CAAAA,CAAe,MAAM,CAAA,aAAA,EAAgBnF,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,KAAK,CAAA,CAElI,IAAA,CAIT,IAAI6E,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAQ,IAAI,OAAO7E,CAAO,EAC5B,OAASoF,CAAAA,CAAY,CACnB,OAAIrC,EAAAA,EACF,OAAA,CAAQ,KAAK,CAAA,2DAAA,EAA8D/C,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,MAAOoF,CAAU,CAAA,CAE/G,IACT,CAGA,IAAMC,EAAcT,CAAAA,CAAqBC,CAAK,CAAA,CAC9C,OAAKQ,CAAAA,CAAY,IAAA,CAOVR,GAND9B,EAAAA,EACF,OAAA,CAAQ,KAAK,CAAA,kDAAA,EAAqDsC,CAAAA,CAAY,MAAM,CAAA,aAAA,EAAgBrF,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,KAAK,CAAA,CAE5H,IAAA,CAIX,OAAS/N,CAAAA,CAAK,CACZ,OAAI8Q,EAAAA,EACF,OAAA,CAAQ,KAAK,CAAA,yDAAA,EAA4D/C,CAAAA,CAAQ,UAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAA,CAAO/N,CAAG,EAEtG,IACT,CACF,CAMO,SAASqT,CAAAA,CACdC,CAAAA,CAAwB,EAAC,CACzB,CACA,IAAMC,CAAAA,CAAcpgB,CAAAA,EAClB,MAAM,OAAA,CAAQA,CAAK,CAAA,CAAIA,CAAAA,CAAM,MAAA,CAAQ4F,EAAAA,EAAyB,OAAOA,EAAAA,EAAS,QAAQ,EAAI,EAAC,CAGvFuO,EAAQgM,CAAAA,EAAS,EAAC,CAElBE,CAAAA,CAAW,CACf,QAAA,CAAUD,EAAWjM,CAAAA,CAAM,QAAQ,EACnC,IAAA,CAAMiM,CAAAA,CAAWjM,EAAM,IAAI,CAAA,CAC3B,SAAUiM,CAAAA,CAAWjM,CAAAA,CAAM,KAAK,CAClC,CAAA,CAEAgK,EAAO,YAAA,CAAekC,CAAAA,CAAS,SAC/BlC,CAAAA,CAAO,QAAA,CAAWkC,CAAAA,CAAS,IAAA,CAC3BlC,CAAAA,CAAO,YAAA,CAAekC,EAAS,QAAA,CAG/BlC,CAAAA,CAAO,eAAiBkC,CAAAA,CAAS,IAAA,CAC9B,IAAKzF,CAAAA,EAAYiF,CAAAA,CAAiBjF,CAAO,CAAC,CAAA,CAC1C,MAAA,CAAQnY,GAAmBA,CAAAA,GAAM,IAAI,EAIxC0b,CAAAA,CAAO,kBAAA,CAAqB,EAAC,CAE7B,IAAMmC,CAAAA,CAAmBD,CAAAA,CAAS,IAAA,CAAK,MAAA,CAASlC,EAAO,cAAA,CAAe,MAAA,CAMlE,CAACA,CAAAA,CAAO,gBAAA,EAAoBR,KAC9B,OAAA,CAAQ,GAAA,CAAI,kCAAkC,CAAA,CAC9C,OAAA,CAAQ,IAAI,CAAA,cAAA,EAAiB0C,CAAAA,CAAS,SAAS,MAAM,CAAA,CAAE,EACvD,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqBlC,CAAAA,CAAO,cAAA,CAAe,MAAM,IAAIkC,CAAAA,CAAS,IAAA,CAAK,MAAM,CAAA,WAAA,EAAcC,CAAgB,YAAY,CAAA,CAC/H,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsBD,CAAAA,CAAS,QAAA,CAAS,MAAM,CAAA,8BAAA,CAAgC,CAAA,CAEtFC,EAAmB,CAAA,EACrB,OAAA,CAAQ,KAAK,CAAA,MAAA,EAASA,CAAgB,CAAA,8FAAA,CAAgG,CAAA,CAAA,CAI1InC,CAAAA,CAAO,gBAAA,CAAmB,KAC5B,CA9COE,CAAAA,CAAS,aAAA6B,EAAAA,CAAAA,EA5TD7B,CAAAA,GAAA,ICpIV,SAASkC,EAAAA,EAAkB,CAChC,OAAO,IAAIrC,WAAAA,CAAY,CACrB,cAAA,CAAgB,CACd,OAAA,CAAS,CAIP,oBAAA,CAAsB,KAAA,CACtB,eAAgB,KAClB,CACF,CACF,CAAC,CACH,CACO,IAAMsC,CAAAA,CAAiB,IAAMrC,EAAO,WAAA,CAE1BsC,GAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CAAgBC,EAAoB,CAElD,OADoBH,CAAAA,EAAe,CAChB,YAAA,CAAgBG,CAAQ,CAC7C,CAHOF,CAAAA,CAAS,aAAAC,CAAAA,CAKT,SAASE,EAAwBD,CAAAA,CAAoB,CAE1D,OADoBH,CAAAA,EAAe,CAChB,aAA8BG,CAAQ,CAC3D,CAHOF,CAAAA,CAAS,oBAAA,CAAAG,EAKhB,eAAsBC,CAAAA,CAAiBtO,CAAAA,CAA6B,CAElE,OAAA,MADoBiO,CAAAA,GACF,aAAA,CAAcjO,CAAO,EAChCmO,CAAAA,CAAgBnO,CAAAA,CAAQ,QAAQ,CACzC,CAJAkO,CAAAA,CAAsB,aAAA,CAAAI,CAAAA,CAMtB,eAAsBC,EACpBvO,CAAAA,CAOA,CAEA,aADoBiO,CAAAA,EAAe,CACjB,sBAAsBjO,CAAO,CAAA,CACxCqO,CAAAA,CAAwBrO,CAAAA,CAAQ,QAAQ,CACjD,CAZAkO,CAAAA,CAAsB,qBAAA,CAAAK,EAcf,SAASC,CAAAA,CAA6BxO,EAA6B,CACxE,OAAO,CACL,QAAA,CAAU,IAAMsO,EAActO,CAAO,CAAA,CACrC,QAAS,IAAMmO,CAAAA,CAAgBnO,EAAQ,QAAQ,CAAA,CAC/C,cAAA,CAAgB,IAAMyO,QAAAA,CAASzO,CAAO,EACtC,WAAA,CAAa,IAAMiO,GAAe,CAAE,UAAA,CAAWjO,CAAO,CACxD,CACF,CAPOkO,CAAAA,CAAS,yBAAA,CAAAM,CAAAA,CAST,SAASE,CAAAA,CACd1O,CAAAA,CAOA,CACA,OAAO,CACL,SAAU,IAAMuO,CAAAA,CAAsBvO,CAAO,CAAA,CAC7C,OAAA,CAAS,IAAMqO,EAAwBrO,CAAAA,CAAQ,QAAQ,EACvD,cAAA,CAAgB,IAAM2O,iBAAiB3O,CAAO,CAAA,CAC9C,YAAa,IAAMiO,CAAAA,GAAiB,kBAAA,CAAmBjO,CAAO,CAChE,CACF,CAfOkO,EAAS,iCAAA,CAAAQ,EAAAA,CAAAA,EAxCDR,EAAAA,GAAA,EAAA,CAAA,CC/BV,SAASU,GAAUzJ,CAAAA,CAAgB,CACxC,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,CAAC,CAAC,CAC/B,CAEO,SAAS0J,EAAAA,CAAU1J,EAAa,CACrC,IAAI2J,EAAc,IAAA,CAAK3J,CAAC,CAAA,CACxB,GAAI2J,CAAAA,CAAY,CAAC,IAAM,GAAA,CAGvB,OAAO,KAAK,KAAA,CAAMA,CAAW,CAC/B,CCRO,IAAKC,QACVA,CAAAA,CAAA,IAAA,CAAO,OACPA,CAAAA,CAAA,GAAA,CAAM,MACNA,CAAAA,CAAA,KAAA,CAAQ,QAHEA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,CAAA,CAMAC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,aAAA,CAAA,CAAgB,MAAA,CAChBA,EAAA,aAAA,CAAA,CAAgB,KAAA,CAChBA,EAAA,aAAA,CAAA,CAAgB,OAAA,CAHNA,QAAA,EAAA,EAWL,SAASC,CAAAA,CAAWC,CAAAA,CAAgC,CACzD,GAAI,OAAOA,CAAAA,EAAS,QAAA,CAAU,CAC5B,IAAMC,CAAAA,CAAKD,EAAK,KAAA,CAAM,GAAG,CAAA,CACzB,OAAO,CACL,MAAA,CAAQ,WAAWC,CAAAA,CAAG,CAAC,CAAC,CAAA,CAExB,MAAA,CAAQJ,GAAOI,CAAAA,CAAG,CAAC,CAAC,CACtB,CACF,MACE,OAAO,CACL,OAAQ,UAAA,CAAWD,CAAAA,CAAK,OAAO,QAAA,EAAU,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAA,CAAIA,EAAK,SAAS,CAAA,CAExE,OAAQF,EAAAA,CAAOE,CAAAA,CAAK,GAAG,CACzB,CAEJ,CClCA,IAAIE,EAAAA,CAEG,SAASC,GAAgB,CAC9B,GAAI,CAACD,EAAAA,CAAa,CAChB,GAAI,OAAO,UAAA,CAAW,KAAA,EAAU,UAAA,CAC9B,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAGjEA,GAAc,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,EAChD,CAEA,OAAOA,EACT,CCZO,SAASE,EAAAA,CAAY7hB,EAAgB,CAC1C,OAAO,OAAOA,CAAAA,EAAU,QAAA,CAAW,YAAA,CAAa,IAAA,CAAKA,CAAK,CAAA,CAAI,KAChE,CCGO,SAAS8hB,GAAqB3Q,CAAAA,CAA+C,CAClF,OACEA,CAAAA,EACA,OAAOA,GAAa,QAAA,EACpB,MAAA,GAAUA,GACV,YAAA,GAAgBA,CAAAA,EAChB,MAAM,OAAA,CAAQA,CAAAA,CAAS,IAAI,CAE/B,CAMO,SAAS4Q,EAAAA,CACd5Q,CAAAA,CACApQ,CAAAA,CACoB,CACpB,OAAI+gB,EAAAA,CAAqB3Q,CAAQ,CAAA,CACxBA,CAAAA,CAKF,CACL,IAAA,CAAM,KAAA,CAAM,QAAQA,CAAQ,CAAA,CAAIA,EAAW,EAAC,CAC5C,WAAY,CACV,KAAA,CAAO,MAAM,OAAA,CAAQA,CAAQ,CAAA,CAAIA,CAAAA,CAAS,MAAA,CAAS,CAAA,CACnD,MAAApQ,CAAAA,CACA,MAAA,CAAQ,EACR,QAAA,CAAU,KACZ,CACF,CACF,CCtCO,SAASihB,EAAAA,CAAUpI,CAAAA,CAAeqI,CAAAA,CAA+B,CACtE,OAAQrI,CAAAA,CAAQ,IAAOqI,CACzB,CCFO,SAASC,EAAAA,CAAYxjB,CAAAA,CAAgC,CAC1D,OAAIA,CAAAA,GAAM,MAAA,CACD,KAGF,QAAA,CAASA,CAAAA,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAG,EAAE,EAAI,IACzC,CCEA,IAAMyjB,EAAAA,CAA2B,EAAA,CAAK,IAE/B,SAASC,EAAAA,EAA8B,CAC5C,OAAOC,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,IAAA,CAAK,cAAa,CACtC,eAAA,CAAiBH,GACjB,SAAA,CAAWA,EAAAA,CACX,QAAS,MAAO,CAAE,MAAA,CAAAnU,CAAO,CAAA,GAA6B,CAGpD,GAAM,CAACuU,CAAAA,CAAkBC,EAAgBC,CAAAA,CAAeC,CAAAA,CAAeC,CAAgB,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAC3G/S,CAAAA,CAAQ,8CAA+C,EAAC,CAAG,OAAW,MAAA,CAAW5B,CAAM,EACvF4B,CAAAA,CAAQ,gCAAA,CAAkC,EAAC,CAAG,MAAA,CAAW,OAAW5B,CAAM,CAAA,CAC1E4B,EAAQ,oCAAA,CAAsC,GAAI,MAAA,CAAW,MAAA,CAAW5B,CAAM,CAAA,CAC9E4B,CAAAA,CAAQ,+BAAA,CAAiC,CAAC,MAAM,CAAA,CAAG,OAAW,MAAA,CAAW5B,CAAM,EAC/E4B,CAAAA,CAAQ,sCAAA,CAAwC,EAAC,CAAG,MAAA,CAAW,MAAA,CAAW5B,CAAM,CAAA,CAC7E,KAAA,CAAM,KAAO,CAAE,wBAAA,CAA0B,SAAU,aAAA,CAAe,EAAG,CAAA,CAAE,CAC5E,CAAC,CAAA,CAIK4U,EAA2BpB,CAAAA,CAAWe,CAAAA,CAAiB,oBAAoB,CAAA,CAAE,MAAA,CAC7EM,EAAyBrB,CAAAA,CAAWe,CAAAA,CAAiB,uBAAuB,CAAA,CAAE,MAAA,CAGhFN,EAAgB,CAAA,CAElB,MAAA,CAAO,SAASW,CAAwB,CAAA,EACxCA,IAA6B,CAAA,EAC7B,MAAA,CAAO,QAAA,CAASC,CAAsB,CAAA,GAEtCZ,CAAAA,CAAiBY,EAAyBD,CAAAA,CAA4B,GAAA,CAAA,CAExE,IAAME,CAAAA,CAAOtB,CAAAA,CAAWgB,EAAe,sBAAA,CAAuB,IAAI,CAAA,CAAE,MAAA,CAC9DO,CAAAA,CAAQvB,CAAAA,CAAWgB,EAAe,sBAAA,CAAuB,KAAK,EAAE,MAAA,CAChEQ,CAAAA,CAAmB,WAAWN,CAAAA,CAAc,aAAa,CAAA,CACzDO,CAAAA,CAAoBzB,CAAAA,CAAWkB,CAAAA,CAAc,cAAc,CAAA,CAAE,MAAA,CAC7DQ,EAAuB,MAAA,CAAOX,CAAAA,CAAiB,yBAA2B,CAAC,CAAA,CAC3EY,EAAoBT,CAAAA,CAAc,mBAAA,EAAuB,SACzDU,CAAAA,CAAkB,MAAA,CAAOV,EAAc,gBAAA,EAAoB,CAAC,EAC5DW,CAAAA,CAAyB,MAAA,CAAOV,CAAAA,CAAiB,wBAAA,EAA4B,OAAO,CAAA,CACpFW,EAAe,MAAA,CAAOX,CAAAA,CAAiB,eAAiB,CAAC,CAAA,CACzDY,EAAehB,CAAAA,CAAiB,cAAA,CAChCiB,CAAAA,CAAkBjB,CAAAA,CAAiB,iBAAA,CACnCkB,CAAAA,CAAYlB,EAAiB,iBAAA,CAC7BmB,CAAAA,CAAmBb,EACnBc,CAAAA,CAAqBf,CAAAA,CACrBgB,EAAgBpC,CAAAA,CAAWe,CAAAA,CAAiB,cAAc,CAAA,CAAE,MAAA,CAC5DsB,EAAAA,CAAuBtB,EAAiB,sBAAA,EAA0B,CAAA,CAClEuB,GAAqBrB,CAAAA,CAAc,oBAAA,CAEzC,OAAO,CAEL,aAAA,CAAAR,EACA,IAAA,CAAAa,CAAAA,CACA,MAAAC,CAAAA,CACA,gBAAA,CAAAC,EACA,iBAAA,CAAAC,CAAAA,CACA,qBAAAC,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,sBAAA,CAAAC,EACA,YAAA,CAAAC,CAAAA,CACA,aAAAC,CAAAA,CACA,eAAA,CAAAC,EACA,SAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,cAAAC,CAAAA,CACA,oBAAA,CAAAC,GACA,kBAAA,CAAAC,EAAAA,CAIA,IAAK,CACH,aAAA,CAAevB,CAAAA,CACf,WAAA,CAAaC,CAAAA,CACb,UAAA,CAAYC,EACZ,UAAA,CAAYC,CAAAA,CACZ,cAAeC,CACjB,CACF,CACF,CACF,CAAC,CACH,CCvEO,SAASoB,EAAAA,CAA0BC,CAAAA,CAAW,OAAQ,CAC3D,OAAO3B,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAK,UAAA,CAAW0B,CAAQ,EAC5C,OAAA,CAAS,IACPpU,EAAQ,+BAAA,CAAiC,CACvCoU,CACF,CAAC,CACL,CAAC,CACH,CCVA,SAASrgB,MAAOmF,CAAAA,CAA6B,CAC3C,IAAIzI,CAAAA,CAAMyI,CAAAA,CAAM,MAAA,CAChB,KAAOzI,CAAAA,CAAM,CAAA,EAAKyI,EAAMzI,CAAAA,CAAM,CAAC,IAAM,MAAA,EACnCA,CAAAA,EAAAA,CAEF,OAAOyI,CAAAA,CAAM,KAAA,CAAM,EAAGzI,CAAG,CAC3B,CAEO,IAAMiiB,CAAAA,CAAY,CAIvB,KAAA,CAAO,CACL,MAAQ2B,CAAAA,EAAsB,CAAC,OAAA,CAAS,OAAA,CAASA,CAAS,CAAA,CAC1D,WAAY,CAACC,CAAAA,CAAgBC,IAC3B,CAAC,OAAA,CAAS,cAAeD,CAAAA,CAAQC,CAAQ,CAAA,CAC3C,OAAA,CAAS,CAACD,CAAAA,CAAgBC,IACxB,CAAC,OAAA,CAAS,UAAWD,CAAAA,CAAQC,CAAQ,EACvC,cAAA,CAAgB,CAACD,CAAAA,CAAgBC,CAAAA,GAC/B,CAAC,OAAA,CAAS,kBAAmBD,CAAAA,CAAQC,CAAQ,EAC/C,YAAA,CAAc,CACZxQ,EACAyQ,CAAAA,CACArjB,CAAAA,CACA8d,IACG,CAAC,OAAA,CAAS,gBAAiBlL,CAAAA,CAAUyQ,CAAAA,CAAQrjB,EAAO8d,CAAQ,CAAA,CACjE,iBAAkB,CAChBlL,CAAAA,CACAyQ,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAvjB,CAAAA,CACA8d,IAEA,CACE,OAAA,CACA,qBACAlL,CAAAA,CACAyQ,CAAAA,CACAC,EACAC,CAAAA,CACAvjB,CAAAA,CACA8d,CACF,CAAA,CACF,YAAA,CAAc,CAAClL,EAAkBuQ,CAAAA,CAAgBC,CAAAA,GAC/C,CAAC,OAAA,CAAS,WAAA,CAAaxQ,EAAUuQ,CAAAA,CAAQC,CAAQ,CAAA,CACnD,OAAA,CAAS,CAACxQ,CAAAA,CAAkB5S,IAC1B,CAAC,OAAA,CAAS,UAAW4S,CAAAA,CAAU5S,CAAK,EACtC,gBAAA,CAAkB,CAACmjB,EAAiBC,CAAAA,GAClC,CAAC,QAAS,oBAAA,CAAsBD,CAAAA,CAAQC,CAAQ,CAAA,CAClD,WAAA,CAAa,CAACD,CAAAA,CAAgBC,CAAAA,GAC5B,CAAC,OAAA,CAAS,cAAA,CAAgBD,CAAAA,CAAQC,CAAQ,CAAA,CAC5C,IAAA,CAAM,CAACD,CAAAA,CAAgBC,CAAAA,GACrB,CAAC,OAAA,CAAS,MAAA,CAAQD,CAAAA,CAAQC,CAAQ,CAAA,CACpC,SAAA,CAAW,CAACD,CAAAA,CAAgBC,CAAAA,GAC1B,CAAC,OAAA,CAAS,WAAA,CAAaD,EAAQC,CAAQ,CAAA,CACzC,MAAA,CAASI,CAAAA,EACP,CAAC,OAAA,CAAS,SAAUA,CAAc,CAAA,CACpC,eAAgB,CAACA,CAAAA,CAAyBxjB,IACxC4C,EAAAA,CAAI,OAAA,CAAS,SAAU,UAAA,CAAY4gB,CAAAA,CAAgBxjB,CAAK,CAAA,CAC1D,SAAA,CAAYwjB,GACV,CAAC,OAAA,CAAS,YAAaA,CAAc,CAAA,CACvC,iBAAA,CAAmB,CAACA,CAAAA,CAAyBxjB,CAAAA,GAC3C4C,GAAI,OAAA,CAAS,WAAA,CAAa,WAAY4gB,CAAAA,CAAgBxjB,CAAK,EAC7D,SAAA,CAAY4S,CAAAA,EACV,CAAC,OAAA,CAAS,WAAA,CAAaA,CAAQ,EACjC,iBAAA,CAAmB,CAACA,EAAmB5S,CAAAA,GACrC4C,EAAAA,CAAI,QAAS,WAAA,CAAa,UAAA,CAAYgQ,CAAAA,CAAU5S,CAAK,CAAA,CACvD,MAAA,CAAS4S,GAAsB,CAAC,OAAA,CAAS,SAAUA,CAAQ,CAAA,CAC3D,cAAgB4Q,CAAAA,EACd,CAAC,QAAS,gBAAA,CAAkBA,CAAc,EAC5C,cAAA,CAAgB,CAAC5Q,EAAmB5S,CAAAA,GAClC4C,EAAAA,CAAI,QAAS,QAAA,CAAU,UAAA,CAAYgQ,CAAAA,CAAU5S,CAAK,CAAA,CACpD,QAAA,CAAW4X,GAAiB,CAAC,OAAA,CAAS,WAAYA,CAAI,CAAA,CACtD,gBAAiB,CAAC,OAAA,CAAS,UAAU,CAAA,CACrC,sBAAA,CAAyBhF,CAAAA,EACvB,CAAC,OAAA,CAAS,eAAA,CAAiBA,EAAU,MAAM,CAAA,CAC7C,YAAa,CACX6Q,CAAAA,CACAvP,CAAAA,CACAlU,CAAAA,CACA8d,CAAAA,GACG,CAAC,QAAS,cAAA,CAAgB2F,CAAAA,CAAMvP,EAAKlU,CAAAA,CAAO8d,CAAQ,EACzD,eAAA,CAAiB,CACf2F,EACAH,CAAAA,CACAC,CAAAA,CACAvjB,EACAkU,CAAAA,CACA4J,CAAAA,GAEA,CACE,OAAA,CACA,mBAAA,CACA2F,EACAH,CAAAA,CACAC,CAAAA,CACAvjB,CAAAA,CACAkU,CAAAA,CACA4J,CACF,CAAA,CACF,YAAa,CACXqF,CAAAA,CACAC,EACAM,CAAAA,CACA5F,CAAAA,GACG,CAAC,OAAA,CAAS,aAAA,CAAeqF,CAAAA,CAAQC,CAAAA,CAAUM,CAAAA,CAAO5F,CAAQ,EAC/D,UAAA,CAAY,CAACqF,EAAgBC,CAAAA,CAAkBtF,CAAAA,GAC7C,CAAC,OAAA,CAAS,YAAA,CAAcqF,CAAAA,CAAQC,CAAAA,CAAUtF,CAAQ,CAAA,CACpD,aAAeoF,CAAAA,EACb,CAAC,QAAS,eAAA,CAAiBA,CAAS,EACtC,cAAA,CAAgB,CACdC,EACAC,CAAAA,CACAO,CAAAA,GACG,CAAC,OAAA,CAAS,iBAAA,CAAmBR,EAAQC,CAAAA,CAAUO,CAAQ,EAC5D,YAAA,CAAc,IAAM,CAAC,OAAA,CAAS,eAAe,CAAA,CAC7C,sBAAwB3jB,CAAAA,EACtB,CAAC,QAAS,eAAA,CAAiB,OAAA,CAASA,CAAK,CAAA,CAC3C,SAAA,CAAW,CACT0M,CAAAA,CAOI,EAAC,GACF,CACH,OAAA,CACA,OAAA,CACA,OACAA,CAAAA,CAAO,GAAA,EAAO,GACdA,CAAAA,CAAO,SAAA,EAAa,EAAA,CACpBA,CAAAA,CAAO,MAAA,EAAU,EAAA,CACjBA,EAAO,QAAA,EAAY,EAAA,CACnBA,EAAO,KAAA,EAAS,CAAA,CAChB,CAAC,GAAIA,CAAAA,CAAO,YAAc,EAAG,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAChD,EACA,UAAA,CAAY,CACVA,CAAAA,CAMI,EAAC,GACF,CACH,QACA,OAAA,CACA,QAAA,CACAA,EAAO,GAAA,EAAO,EAAA,CACdA,EAAO,MAAA,EAAU,EAAA,CACjBA,CAAAA,CAAO,QAAA,EAAY,EAAA,CACnBA,CAAAA,CAAO,OAAS,CAAA,CAChB,CAAC,GAAIA,CAAAA,CAAO,UAAA,EAAc,EAAG,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAChD,CAAA,CACA,WAAA,CAAcgR,GACZ,CAAC,OAAA,CAAS,QAAS,SAAA,CAAWA,CAAI,EACpC,UAAA,CAAY,CAACA,EAAcxJ,CAAAA,GACzB,CAAC,QAAS,OAAA,CAAS,QAAA,CAAUwJ,EAAMxJ,CAAG,CAAA,CACxC,cAAA,CAAgB,CAACwJ,CAAAA,CAAc9K,CAAAA,GAC7B,CAAC,OAAA,CAAS,OAAA,CAAS,YAAa8K,CAAAA,CAAM9K,CAAQ,EAChD,iBAAA,CAAmB,CAAC8K,EAAckG,CAAAA,GAChC,CAAC,QAAS,OAAA,CAAS,eAAA,CAAiBlG,EAAMkG,CAAK,CAAA,CACjD,eAAgB,CAAClG,CAAAA,CAAc9K,CAAAA,GAC7B,CAAC,OAAA,CAAS,OAAA,CAAS,aAAc8K,CAAAA,CAAM9K,CAAQ,EACjD,oBAAA,CAAuB8K,CAAAA,EACrB,CAAC,OAAA,CAAS,OAAA,CAAS,mBAAoBA,CAAI,CAAA,CAC7C,QAAS,CAAC,OAAO,CACnB,CAAA,CAKA,QAAA,CAAU,CACR,IAAA,CAAO9K,CAAAA,EAAsB,CAAC,kBAAA,CAAoBA,CAAQ,CAAA,CAC1D,KAAM,CAAA,GAAIiR,CAAAA,GACR,CAAC,UAAA,CAAY,MAAA,CAAQ,GAAGA,CAAS,CAAA,CACnC,OAAA,CAAS,CACPC,CAAAA,CACAC,CAAAA,CACAC,EACAhkB,CAAAA,GACG,CAAC,WAAY,SAAA,CAAW8jB,CAAAA,CAAWC,EAAMC,CAAAA,CAAYhkB,CAAK,CAAA,CAC/D,aAAA,CAAe,CAAC4S,CAAAA,CAAkBmR,EAAcE,CAAAA,GAC9C,CAAC,WAAY,SAAA,CAAW,QAAA,CAAUrR,EAAUmR,CAAAA,CAAME,CAAK,EACzD,aAAA,CAAgBrR,CAAAA,EACd,CAAC,UAAA,CAAY,eAAA,CAAiBA,CAAQ,CAAA,CACxC,WAAA,CAAcA,GACZ,CAAC,UAAA,CAAY,cAAA,CAAgBA,CAAQ,CAAA,CACvC,UAAA,CAAaA,GACX,CAAC,UAAA,CAAY,aAAcA,CAAQ,CAAA,CACrC,gBAAkBA,CAAAA,EAChB,CAAC,UAAA,CAAY,YAAA,CAAcA,CAAAA,CAAU,iBAAiB,EACxD,kBAAA,CAAoB,CAACA,EAAkBxK,CAAAA,GACrC,CAAC,WAAY,sBAAA,CAAwBwK,CAAAA,CAAUxK,CAAI,CAAA,CACrD,UAAA,CAAawK,CAAAA,EACX,CAAC,UAAA,CAAY,aAAA,CAAeA,CAAQ,CAAA,CACtC,SAAA,CAAW,CACTsR,CAAAA,CACAC,CAAAA,CACAH,EACAhkB,CAAAA,GAEA,CACE,WACA,WAAA,CACAkkB,CAAAA,CACAC,EACAH,CAAAA,CACAhkB,CACF,EACF,SAAA,CAAW,CACT8jB,CAAAA,CACAM,CAAAA,CACAJ,CAAAA,CACAhkB,CAAAA,GAEA,CACE,UAAA,CACA,WAAA,CACA8jB,EACAM,CAAAA,CACAJ,CAAAA,CACAhkB,CACF,CAAA,CACF,MAAA,CAAQ,CAACikB,CAAAA,CAAeI,CAAAA,GACtB,CAAC,WAAY,QAAA,CAAUJ,CAAAA,CAAOI,CAAW,CAAA,CAC3C,QAAA,CAAU,CAACC,CAAAA,CAAoBxG,CAAAA,GAC7B,CAAC,UAAA,CAAY,UAAA,CAAYwG,CAAAA,CAAUxG,CAAQ,CAAA,CAC7C,MAAA,CAAQ,CAACmG,CAAAA,CAAejkB,CAAAA,GACtB,CAAC,UAAA,CAAY,QAAA,CAAUikB,EAAOjkB,CAAK,CAAA,CACrC,aAAc,CAAC4S,CAAAA,CAAkBxB,EAAepR,CAAAA,GAC9C,CAAC,WAAY,cAAA,CAAgB4S,CAAAA,CAAUxB,CAAAA,CAAOpR,CAAK,CAAA,CACrD,SAAA,CAAYwjB,GACV,CAAC,UAAA,CAAY,YAAaA,CAAc,CAAA,CAC1C,kBAAmB,CAACA,CAAAA,CAAyBxjB,CAAAA,GAC3C4C,EAAAA,CAAI,UAAA,CAAY,WAAA,CAAa,WAAY4gB,CAAAA,CAAgBxjB,CAAK,EAChE,aAAA,CAAe,CAACwjB,EAAwBe,CAAAA,GACtC,CACE,UAAA,CACA,WAAA,CACA,OAAA,CACAf,CAAAA,CACAe,CACF,CAAA,CACF,SAAA,CAAW,CAACC,CAAAA,CAA+BjlB,CAAAA,GACzC,CAAC,UAAA,CAAY,WAAA,CAAailB,EAAWjlB,CAAM,CAAA,CAC7C,KAAM,IAAM,CAAC,WAAY,MAAM,CAAA,CAC/B,YAAa,CAACqT,CAAAA,CAAkB5S,CAAAA,GAC9B,CAAC,UAAA,CAAY,cAAA,CAAgB4S,EAAU5S,CAAK,CAAA,CAC9C,YAAa,CAACikB,CAAAA,CAAejkB,IAC3B,CAAC,UAAA,CAAY,aAAA,CAAeikB,CAAAA,CAAOjkB,CAAK,CAAA,CAC1C,UAAYwjB,CAAAA,EACV,CAAC,WAAY,WAAA,CAAaA,CAAc,EAC1C,iBAAA,CAAmB,CAACA,CAAAA,CAAyBxjB,CAAAA,GAC3C4C,EAAAA,CAAI,UAAA,CAAY,YAAa,UAAA,CAAY4gB,CAAAA,CAAgBxjB,CAAK,CAAA,CAChE,SAAA,CAAY4S,GACV,CAAC,UAAA,CAAY,YAAaA,CAAQ,CAAA,CACpC,eAAiBA,CAAAA,EACf,CAAC,WAAY,iBAAA,CAAmBA,CAAQ,EAC1C,UAAA,CAAY,IAAM,CAAC,UAAA,CAAY,aAAa,CAAA,CAC5C,QAAS,CAAC,UAAU,CACtB,CAAA,CAKA,aAAA,CAAe,CACb,aAAA,CAAe,IAAM,CAAC,eAAA,CAAiB,eAAe,CAAA,CACtD,WAAY,IAAM,CAAC,gBAAiB,YAAY,CAAA,CAChD,KAAM,CAAC4Q,CAAAA,CAAyBH,CAAAA,GAC9B,CAAC,eAAA,CAAiBG,CAAAA,CAAgBH,CAAM,CAAA,CAC1C,WAAA,CAAcG,GACZ,CAAC,eAAA,CAAiB,SAAUA,CAAc,CAAA,CAC5C,SAAWA,CAAAA,EACT,CAAC,gBAAiB,UAAA,CAAYA,CAAc,EAC9C,OAAA,CAAS,CAAC,eAAe,CAC3B,CAAA,CAKA,IAAA,CAAM,CACJ,UAAA,CAAaP,CAAAA,EACX,CAAC,MAAA,CAAQ,aAAA,CAAeA,CAAQ,CAAA,CAClC,YAAA,CAAc,IAAM,CAAC,MAAA,CAAQ,eAAe,CAAA,CAC5C,eAAA,CAAiB,IAAM,CAAC,MAAA,CAAQ,kBAAkB,EAClD,OAAA,CAAS,CAAC,MAAM,CAClB,CAAA,CAKA,WAAA,CAAa,CACX,MAAA,CAAQ,CAACwB,EAAe3G,CAAAA,GACtB,CAAC,YAAa,QAAA,CAAU2G,CAAAA,CAAM3G,CAAQ,CAAA,CAExC,YAAA,CAAe2G,GACb,CAAC,WAAA,CAAa,SAAUA,CAAI,CAAA,CAC9B,QAAS,CAAC7R,CAAAA,CAAkB8R,IAC1B,CAAC,WAAA,CAAa,SAAA,CAAW9R,CAAAA,CAAU8R,CAAa,CAAA,CAClD,SAAU,IAAM,CAAC,cAAe,UAAU,CAAA,CAC1C,KAAM,CAACjB,CAAAA,CAAcQ,CAAAA,CAAejkB,CAAAA,GAClC,CAAC,aAAA,CAAe,OAAQyjB,CAAAA,CAAMQ,CAAAA,CAAOjkB,CAAK,CAAA,CAC5C,WAAA,CAAc0kB,GACZ,CAAC,aAAA,CAAe,aAAA,CAAeA,CAAa,CAAA,CAC9C,mBAAA,CAAsBA,GACpB,CAAC,aAAA,CAAe,cAAe,UAAA,CAAYA,CAAa,EAC1D,oBAAA,CAAsB,CAAC9L,EAAiB5Y,CAAAA,GACtC,CAAC,cAAe,uBAAA,CAAyB4Y,CAAAA,CAAS5Y,CAAK,CAC3D,CAAA,CAKA,UAAW,CACT,IAAA,CAAM,IAAM,CAAC,WAAA,CAAa,MAAM,EAChC,QAAA,CAAW4E,CAAAA,EAAe,CAAC,WAAA,CAAa,UAAA,CAAYA,CAAE,CAAA,CACtD,KAAA,CAAO,CAAC+f,CAAAA,CAAoBC,CAAAA,CAAe5kB,CAAAA,GACzC,CAAC,WAAA,CAAa,OAAA,CAAS2kB,EAAYC,CAAAA,CAAO5kB,CAAK,EACjD,WAAA,CAAc2kB,CAAAA,EACZ,CAAC,WAAA,CAAa,OAAA,CAASA,CAAU,EACnC,WAAA,CAAcC,CAAAA,EACZ,CAAC,WAAA,CAAa,OAAA,CAAS,UAAWA,CAAK,CAC3C,EAKA,MAAA,CAAQ,CACN,OAAQ,CAACC,CAAAA,CAAW7kB,IAAkB,CAAC,QAAA,CAAU,SAAU6kB,CAAAA,CAAG7kB,CAAK,CAAA,CACnE,IAAA,CAAO6kB,CAAAA,EAAc,CAAC,SAAU,MAAA,CAAQA,CAAC,EACzC,OAAA,CAAS,CAACA,EAAW7kB,CAAAA,GACnB,CAAC,QAAA,CAAU,SAAA,CAAW6kB,CAAAA,CAAG7kB,CAAK,EAChC,OAAA,CAAS,CACP6kB,EACApB,CAAAA,CACAqB,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,GAGO,CAAC,QAAA,CAAUJ,CAAAA,CAAGpB,CAAAA,CADK,OAAOqB,CAAAA,EAAY,QAAA,CAAWA,IAAY,GAAA,EAAOA,CAAAA,GAAY,OAASA,CAAAA,CAClDC,CAAAA,CAAOC,EAAUC,CAAK,CAAA,CAEtE,oBAAqB,CAACC,CAAAA,CAAchR,IAClC,CAAC,QAAA,CAAU,uBAAwBgR,CAAAA,CAAMhR,CAAG,CAAA,CAC9C,cAAA,CAAgB,CAACiP,CAAAA,CAAgBC,EAAkB+B,CAAAA,GACjDA,CAAAA,CACI,CAAC,QAAA,CAAU,iBAAA,CAAmBhC,EAAQC,CAAAA,CAAU+B,CAAO,CAAA,CACvD,CAAC,QAAA,CAAU,iBAAA,CAAmBhC,EAAQC,CAAQ,CAAA,CACpD,IAAK,CACHyB,CAAAA,CACApB,EACAqB,CAAAA,CACAC,CAAAA,CACAE,CAAAA,CACAG,CAAAA,GACGxiB,EAAAA,CAAI,QAAA,CAAU,MAAOiiB,CAAAA,CAAGpB,CAAAA,CAAMqB,EAASC,CAAAA,CAAOE,CAAAA,CAAOG,CAAW,CACvE,CAAA,CAKA,UAAW,CACT,IAAA,CAAOplB,GAAkB,CAAC,WAAA,CAAa,OAAQA,CAAK,CAAA,CACpD,MAAQ4S,CAAAA,EAAiC,CAAC,WAAA,CAAa,OAAA,CAASA,CAAQ,CAAA,CACxE,MAAO,IAAM,CAAC,YAAa,OAAO,CAAA,CAClC,OAAQ,CACNyS,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA9B,CAAAA,CACA+B,CAAAA,GACG,CAAC,WAAA,CAAa,QAAA,CAAUH,EAASC,CAAAA,CAAMC,CAAAA,CAAU9B,EAAM+B,CAAS,CAAA,CACrE,UAAA,CAAaH,CAAAA,EACX,CAAC,WAAA,CAAa,cAAeA,CAAO,CACxC,EAKA,MAAA,CAAQ,CACN,sBAAuB,CAACzS,CAAAA,CAAkB5S,IACxC,CAAC,QAAA,CAAU,0BAA2B4S,CAAAA,CAAU5S,CAAK,EACvD,kBAAA,CAAoB,CAAC4S,EAAkB5S,CAAAA,GACrC,CAAC,QAAA,CAAU,qBAAA,CAAuB4S,CAAAA,CAAU5S,CAAK,EACnD,cAAA,CAAiB4Y,CAAAA,EACf,CAAC,QAAA,CAAU,iBAAA,CAAmBA,CAAO,CAAA,CACvC,UAAA,CAAahG,CAAAA,EACX,CAAC,QAAA,CAAU,aAAA,CAAeA,CAAQ,CAAA,CACpC,kBAAA,CAAqBgG,GACnB,CAAC,QAAA,CAAU,sBAAuBA,CAAO,CAAA,CAC3C,qBAAA,CAAwBhG,CAAAA,EACtB,CAAC,QAAA,CAAU,0BAA2BA,CAAQ,CAAA,CAChD,gBAAkBgG,CAAAA,EAChB,CAAC,SAAU,kBAAA,CAAoBA,CAAO,EACxC,UAAA,CAAa6M,CAAAA,EACX,CAAC,QAAA,CAAU,aAAA,CAAeA,CAAI,CAAA,CAChC,gCAAA,CAAmC7M,GACjC,CAAC,QAAA,CAAU,oCAAA,CAAsCA,CAAO,CAAA,CAC1D,kBAAA,CAAqBhG,GACnB,CAAC,QAAA,CAAU,sBAAuBA,CAAQ,CAAA,CAC5C,eAAgB,CAACA,CAAAA,CAAkB8S,CAAAA,CAAkBH,CAAAA,GACnD,CAAC,QAAA,CAAU,kBAAmB3S,CAAAA,CAAU8S,CAAAA,CAAUH,CAAQ,CAAA,CAC5D,iBAAA,CAAmB,CACjB3S,CAAAA,CACA8S,CAAAA,CACAC,CAAAA,GAEAA,CAAAA,GAAgB,MAAA,CACZ,CAAC,SAAU,oBAAA,CAAsB/S,CAAAA,CAAU8S,CAAQ,CAAA,CACnD,CAAC,SAAU,oBAAA,CAAsB9S,CAAAA,CAAU8S,EAAUC,CAAW,CAAA,CACtE,UAAW,CACT/S,CAAAA,CACAgT,EACAC,CAAAA,GAEA,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMjT,CAAAA,CAAUgT,CAAAA,CAAaC,CAAQ,CACjE,EAKA,MAAA,CAAQ,CACN,gBAAkBjT,CAAAA,EAChB,CAAC,SAAU,MAAA,CAAQ,cAAA,CAAgBA,CAAQ,CAAA,CAC7C,gBAAA,CAAkB,CAACA,EAAkB5S,CAAAA,CAAe8lB,CAAAA,GAClD,CAAC,QAAA,CAAU,MAAA,CAAQ,eAAgBlT,CAAAA,CAAU5S,CAAAA,CAAO8lB,CAAS,CAAA,CAC/D,oBAAA,CAAuBlT,CAAAA,EACrB,CAAC,QAAA,CAAU,MAAA,CAAQ,oBAAqBA,CAAQ,CAAA,CAClD,YAAcmT,CAAAA,EACZ,CAAC,SAAU,MAAA,CAAQ,SAAA,CAAWA,CAAa,CAAA,CAC7C,cAAA,CAAiBnT,GACf,CAAC,QAAA,CAAU,MAAO,cAAA,CAAgBA,CAAQ,CAAA,CAC5C,eAAA,CAAiB,CACfA,CAAAA,CACA5S,EACA8lB,CAAAA,GACG,CAAC,SAAU,KAAA,CAAO,cAAA,CAAgBlT,EAAU5S,CAAAA,CAAO8lB,CAAS,CAAA,CACjE,oBAAA,CAAuBlT,CAAAA,EACrB,CAAC,SAAU,YAAA,CAAc,cAAA,CAAgBA,CAAQ,CAAA,CACnD,kBAAA,CAAqBA,GACnB,CAAC,QAAA,CAAU,YAAA,CAAc,WAAA,CAAaA,CAAQ,CAAA,CAChD,qBAAuBA,CAAAA,EACrB,CAAC,SAAU,YAAA,CAAc,aAAA,CAAeA,CAAQ,CAAA,CAClD,qBAAA,CAAuB,CACrBA,CAAAA,CACA5S,CAAAA,CACA8lB,IAEA,CACE,QAAA,CACA,aACA,cAAA,CACAlT,CAAAA,CACA5S,EACA8lB,CACF,CAAA,CACF,iBAAA,CAAoBlT,CAAAA,EAClB,CAAC,QAAA,CAAU,SAAU,cAAA,CAAgBA,CAAQ,EAC/C,kBAAA,CAAoB,CAACA,EAAkBgF,CAAAA,GACrC,CAAC,QAAA,CAAU,QAAA,CAAU,cAAA,CAAgBhF,CAAAA,CAAUgF,CAAI,CAAA,CACrD,eAAA,CAAiB,CAAChF,CAAAA,CAAkB7N,CAAAA,CAAe8gB,IACjD,CAAC,gBAAA,CAAkB,YAAA,CAAcjT,CAAAA,CAAU7N,CAAAA,CAAO8gB,CAAQ,CAC9D,CAAA,CAKA,MAAA,CAAQ,CACN,UAAA,CAAY,IAAM,CAAC,QAAA,CAAU,YAAY,EACzC,SAAA,CAAY7lB,CAAAA,EAAkB,CAAC,QAAA,CAAU,YAAA,CAAcA,CAAK,CAAA,CAC5D,OAAA,CAAS,CAACgmB,CAAAA,CAAiBC,CAAAA,CAAmBC,CAAAA,GAC5C,CAAC,QAAA,CAAU,SAAA,CAAWF,EAASC,CAAAA,CAAWC,CAAO,EACnD,WAAA,CAAa,IAAM,CAAC,QAAA,CAAU,cAAc,CAAA,CAC5C,YAAA,CAAc,IAAM,CAAC,SAAU,gBAAgB,CAAA,CAC/C,KAAM,CACJC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,GACG,CAAC,QAAA,CAAU,MAAA,CAAQH,CAAAA,CAAMC,EAAYC,CAAAA,CAAQC,CAAI,EACtD,YAAA,CAAc,CAACtmB,EAAeM,CAAAA,CAAehB,CAAAA,GAC3C,CAAC,QAAA,CAAU,eAAA,CAAiBU,EAAOM,CAAAA,CAAOhB,CAAG,EAC/C,yBAAA,CAA2B,IACzB,CAAC,QAAA,CAAU,8BAA8B,CAC7C,CAAA,CAKA,SAAA,CAAW,CACT,iBAAmBuf,CAAAA,EACjB,CAAC,YAAa,mBAAA,CAAqBA,CAAQ,EAC7C,SAAA,CAAW,CACTpS,CAAAA,CACA8Z,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GAEA,CAAC,WAAA,CAAa,YAAA,CAAcha,EAAK8Z,CAAAA,CAAYC,CAAAA,CAASC,CAAS,CAAA,CACjE,mBAAA,CAAsB5H,CAAAA,EACpB,CAAC,WAAA,CAAa,sBAAA,CAAwBA,CAAQ,CAClD,CAAA,CAKA,WAAY,CACV,YAAA,CAAc,IAAM,CAAC,YAAA,CAAc,eAAe,CAAA,CAClD,eAAA,CAAiB,IAAM,CAAC,YAAA,CAAc,mBAAmB,CAAA,CACzD,iBAAA,CAAoBjG,GAClB,CAAC,YAAA,CAAc,qBAAA,CAAuBA,CAAO,CACjD,CAAA,CAKA,gBAAiB,CACf,OAAA,CAAUhG,GACR,CAAC,kBAAA,CAAoB,UAAWA,CAAQ,CAAA,CAC1C,KAAA,CAAO,IAAM,CAAC,kBAAA,CAAoB,OAAO,CAC3C,CAAA,CAKA,OAAQ,CACN,MAAA,CAAQ,CAACA,CAAAA,CAAkByQ,CAAAA,GACzB,CAAC,QAAA,CAAUzQ,CAAAA,CAAUyQ,CAAM,EAC7B,OAAA,CAAUzQ,CAAAA,EAAqB,CAAC,QAAA,CAAUA,CAAQ,CACpD,CAAA,CAKA,KAAA,CAAO,CACL,OAAA,CAAS,CAACuQ,EAAgBC,CAAAA,GACxB,CAAC,QAAS,SAAA,CAAWD,CAAAA,CAAQC,CAAQ,CAAA,CACvC,IAAA,CAAM,CAACD,CAAAA,CAAiBC,CAAAA,GACtBD,CAAAA,EAAUC,EACN,CAAC,OAAA,CAAS,OAAQD,CAAAA,CAAQC,CAAQ,EAClC,CAAC,OAAA,CAAS,MAAM,CAAA,CACtB,OAAA,CAAS,CAAC,OAAO,CACnB,CAAA,CAKA,WAAY,CACV,eAAA,CAAiB,IAAM,CAAC,YAAA,CAAc,kBAAkB,CAC1D,CAAA,CAKA,KAAA,CAAO,CACL,WAAA,CAAa,CAACsD,EAAkB9T,CAAAA,GAC9B,CAAC,QAAS,cAAA,CAAgB8T,CAAAA,CAAU9T,CAAQ,CAChD,CAAA,CAEA,OAAQ,CACN,MAAA,CAASA,GAAiC,CAAC,QAAA,CAAU,SAAUA,CAAQ,CACzE,CAAA,CAKA,OAAA,CAAS,CACP,QAAA,CAAWA,GAAiC,CAAC,SAAA,CAAW,WAAYA,CAAQ,CAAA,CAC5E,QAAS,CAAC,SAAS,CACrB,CAAA,CAKA,SAAA,CAAW,CACT,KAAM,IAAM,CAAC,aAAc,MAAM,CAAA,CACjC,QAAS,CAAC,YAAY,CACxB,CAAA,CAKA,EAAA,CAAI,CACF,OAAQ,IAAM,CAAC,KAAM,QAAQ,CAAA,CAC7B,aAAeA,CAAAA,EAAsB,CAAC,KAAM,eAAA,CAAiBA,CAAQ,EACrE,eAAA,CAAkBA,CAAAA,EAAsB,CAAC,IAAA,CAAM,kBAAA,CAAoBA,CAAQ,CAAA,CAC3E,OAAA,CAAS,CAAC,IAAI,CAChB,CACF,EChmBO,SAAS+T,EAAAA,CAA+B1K,EAAqB,CAClE,OAAOqF,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,EAAA,CAAG,MAAA,EAAO,CAC9B,QAAS,SAAY,CAEnB,IAAMnR,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,gCAAA,CAAkC,CACxF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,EAED,GAAI,CAAC7L,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG5E,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAAA,CACA,SAAA,CAAW,GAAA,CACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCtBO,SAAS2K,EAAAA,CAA6BhU,CAAAA,CAA8BqJ,CAAAA,CAAqB,CAC9F,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,GAAG,YAAA,CAAa3O,CAAQ,EAC5C,OAAA,CAAS,SAAY,CAEnB,IAAMxC,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,8BAAA,CAAgC,CACtF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,EAED,GAAI,CAAC7L,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGxE,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAAA,CACA,UAAW,GAAA,CACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCbO,SAAS4K,EAAAA,CACdjU,CAAAA,CACAqJ,CAAAA,CACA,CACA,OAAOqF,aAAa,CAClB,QAAA,CAAUC,EAAU,EAAA,CAAG,eAAA,CAAgB3O,CAAQ,CAAA,CAC/C,OAAA,CAAS,SAAY,CAEnB,IAAMxC,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,kCAAA,CAAoC,CAC1F,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,wCAAwCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG3E,OAAQ,MAAMA,EAAS,IAAA,EACzB,EACA,SAAA,CAAW,GAAA,CACX,QAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCxBA,SAAS6K,EAAAA,EAA6B,CACpC,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,YAAe,UAAA,CAChE,OAAO,OAAO,UAAA,EAAW,CAE3B,IAAMtW,CAAAA,CAAM,IAAI,WAAW,EAAE,CAAA,CAC7B,GAAI,OAAO,MAAA,CAAW,KAAe,OAAO,MAAA,CAAO,iBAAoB,UAAA,CACrE,MAAA,CAAO,eAAA,CAAgBA,CAAG,CAAA,CAAA,KAE1B,IAAA,IAAS3S,EAAI,CAAA,CAAGA,CAAAA,CAAI2S,EAAI,MAAA,CAAQ3S,CAAAA,EAAAA,CAAK2S,EAAI3S,CAAC,CAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAW,GAAG,CAAA,CAE9E,OAAO,KAAA,CAAM,IAAA,CAAK2S,CAAG,CAAA,CAClB,GAAA,CAAKvS,CAAAA,EAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CACZ,CAEO,SAAS8oB,EAAAA,CACdnU,EACAqJ,CAAAA,CACA,CACA,OAAOH,WAAAA,CAAY,CACjB,YAAa,CAAC,IAAA,CAAM,gBAAgB,CAAA,CACpC,UAAA,CAAY,MAAOpP,GAA+D,CAChF,GAAI,CAACkG,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,0DACF,CAAA,CAGF,GAAI,CAACqJ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,2DACF,CAAA,CAIF,IAAM7L,EAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,gCAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAMnB,CAAAA,CACN,EAAA,CAAIrJ,EACJ,MAAA,CAAQlG,CAAAA,CAAO,OACf,YAAA,CAAcA,CAAAA,CAAO,YAAA,EAAgB,KAAA,CACrC,KAAA,CAAOA,CAAAA,CAAO,OAAS,CAAA,CACvB,eAAA,CAAiBA,EAAO,eAAA,EAAmBoa,EAAAA,EAC7C,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAAC1W,EAAS,EAAA,CAAI,CAChB,IAAMtD,CAAAA,CAAO,MAAMsD,EAAS,IAAA,EAAK,CAC7B2J,CAAAA,CAAkC,EAAC,CACvC,GAAI,CACFA,CAAAA,CAAS,IAAA,CAAK,MAAMjN,CAAI,EAC1B,MAAQ,CAER,CAEA,IAAMhB,CAAAA,CAAM,IAAI,MACd,CAAA,mDAAA,EAAiDsE,CAAAA,CAAS,MAAM,CAAA,EAAGtD,CAAAA,CAAO,KAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,CAAA,CAC5F,CAAA,CACA,MAAChB,EAAY,MAAA,CAASsE,CAAAA,CAAS,OAC9BtE,CAAAA,CAAY,IAAA,CAAOiO,EACdjO,CACR,CAMA,GAAIsE,CAAAA,CAAS,MAAA,GAAW,GAAA,CAAK,CAC3B,IAAI4W,CAAAA,CAAuC,EAAC,CAC5C,GAAI,CACFA,CAAAA,CAAc,MAAM5W,CAAAA,CAAS,IAAA,GAC/B,CAAA,KAAQ,CAER,CACA,IAAMtE,EAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CACnE,MAACA,EAAY,MAAA,CAAS,GAAA,CACrBA,EAAY,IAAA,CAAOkb,CAAAA,CACdlb,CACR,CAIA,OAFc,MAAMsE,CAAAA,CAAS,IAAA,EAG/B,CAAA,CACA,SAAA,CAAW,IAAM,CAEXwC,CAAAA,EACF6M,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,SAAU8B,CAAAA,CAAU,MAAA,CAAO,QAAQ3O,CAAQ,CAC7C,CAAC,EAEL,CACF,CAAC,CACH,CCrGA,SAASkU,EAAAA,EAA6B,CACpC,GAAI,OAAO,MAAA,CAAW,KAAe,OAAO,MAAA,CAAO,YAAe,UAAA,CAChE,OAAO,OAAO,UAAA,EAAW,CAE3B,IAAMtW,CAAAA,CAAM,IAAI,WAAW,EAAE,CAAA,CAC7B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,eAAA,EAAoB,WACrE,MAAA,CAAO,eAAA,CAAgBA,CAAG,CAAA,CAAA,KAE1B,IAAA,IAAS3S,EAAI,CAAA,CAAGA,CAAAA,CAAI2S,CAAAA,CAAI,MAAA,CAAQ3S,CAAAA,EAAAA,CAAK2S,CAAAA,CAAI3S,CAAC,CAAA,CAAI,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAW,GAAG,CAAA,CAE9E,OAAO,KAAA,CAAM,IAAA,CAAK2S,CAAG,EAClB,GAAA,CAAKvS,CAAAA,EAAMA,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CACZ,CAEO,SAASgpB,EAAAA,CACdrU,EACAqJ,CAAAA,CACA,CACA,OAAOH,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,IAAA,CAAM,QAAQ,EAC5B,UAAA,CAAY,MAAOpP,GAAsD,CACvE,GAAI,CAACkG,CAAAA,CACH,MAAM,IAAI,MACR,mDACF,CAAA,CAGF,GAAI,CAACqJ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,oDACF,CAAA,CAIF,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,wBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAM1Q,CAAAA,CAAO,IAAA,EAAQuP,CAAAA,CACrB,EAAA,CAAIrJ,CAAAA,CACJ,MAAA,CAAQlG,EAAO,MAAA,CACf,IAAA,CAAMA,EAAO,IAAA,CACb,eAAA,CAAiBoa,IACnB,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAAC1W,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMtD,CAAAA,CAAO,MAAMsD,CAAAA,CAAS,IAAA,EAAK,CAC7B2J,CAAAA,CAAkC,EAAC,CACvC,GAAI,CACFA,CAAAA,CAAS,KAAK,KAAA,CAAMjN,CAAI,EAC1B,CAAA,KAAQ,CAER,CAEA,IAAMhB,CAAAA,CAAM,IAAI,KAAA,CACd,CAAA,4CAAA,EAA0CsE,EAAS,MAAM,CAAA,EAAGtD,EAAO,CAAA,EAAA,EAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,CAAA,CACrF,CAAA,CACA,MAAChB,CAAAA,CAAY,MAAA,CAASsE,EAAS,MAAA,CAC9BtE,CAAAA,CAAY,KAAOiO,CAAAA,CACdjO,CACR,CAEA,OAAQ,MAAMsE,CAAAA,CAAS,MACzB,CAAA,CACA,UAAYpO,CAAAA,EAAS,CACf4Q,IAEE5Q,CAAAA,CAAK,IAAA,CAAO,CAAA,EACdyd,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,OAAO,OAAA,CAAQ3O,CAAQ,CAC7C,CAAC,CAAA,CAGH6M,GAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,GAAG,YAAA,CAAa3O,CAAQ,CAC9C,CAAC,CAAA,EAEL,CACF,CAAC,CACH,CC5FA,SAASkU,EAAAA,EAA6B,CACpC,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,YAAe,UAAA,CAChE,OAAO,OAAO,UAAA,EAAW,CAE3B,IAAMtW,CAAAA,CAAM,IAAI,UAAA,CAAW,EAAE,CAAA,CAC7B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,eAAA,EAAoB,WACrE,MAAA,CAAO,eAAA,CAAgBA,CAAG,CAAA,CAAA,KAE1B,IAAA,IAAS3S,EAAI,CAAA,CAAGA,CAAAA,CAAI2S,EAAI,MAAA,CAAQ3S,CAAAA,EAAAA,CAAK2S,EAAI3S,CAAC,CAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAW,GAAG,CAAA,CAE9E,OAAO,KAAA,CAAM,IAAA,CAAK2S,CAAG,CAAA,CAClB,GAAA,CAAKvS,CAAAA,EAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CACZ,CASO,SAASipB,EAAAA,CAAgBtU,CAAAA,CAA8BqJ,EAAiC,CAC7F,OAAOH,YAAY,CACjB,WAAA,CAAa,CAAC,IAAA,CAAM,YAAY,EAChC,UAAA,CAAY,MAAOpP,GAA8D,CAC/E,GAAI,CAACkG,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,uDAAkD,CAAA,CAMpE,IAAMxK,CAAAA,CAAOsE,CAAAA,CAAO,MAAQuP,CAAAA,CAC5B,GAAI,CAAC7T,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wDAAmD,CAAA,CAGrE,IAAM+e,CAAAA,CAAO,IAAI,SACjBA,CAAAA,CAAK,MAAA,CAAO,OAAQ/e,CAAI,CAAA,CAGxB+e,EAAK,MAAA,CAAO,aAAA,CAAe,MAAA,CAAO,IAAA,CAAK,KAAA,CAAMza,CAAAA,CAAO,UAAU,CAAC,CAAC,EAKhEya,CAAAA,CAAK,MAAA,CAAO,kBAAmBza,CAAAA,CAAO,eAAA,EAAmBoa,IAAoB,CAAA,CAC7EK,EAAK,MAAA,CAAO,OAAA,CAASza,EAAO,KAAA,CAAOA,CAAAA,CAAO,UAAY,WAAW,CAAA,CAKjE,IAAM0D,CAAAA,CAAW,MAHAyQ,CAAAA,GAGezD,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACpF,MAAA,CAAQ,OACR,IAAA,CAAM+J,CACR,CAAC,CAAA,CAED,GAAI,CAAC/W,EAAS,EAAA,CAAI,CAChB,IAAMtD,CAAAA,CAAO,MAAMsD,EAAS,IAAA,EAAK,CAC7B2J,CAAAA,CAAkC,EAAC,CACvC,GAAI,CACFA,CAAAA,CAAS,IAAA,CAAK,MAAMjN,CAAI,EAC1B,MAAQ,CAER,CAKA,MAAM,MAAA,CAAO,MAAA,CACX,IAAI,KAAA,CACF,CAAA,gDAAA,EAA8CsD,EAAS,MAAM,CAAA,EAAGtD,EAAO,CAAA,EAAA,EAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,CAAA,CACzF,CAAA,CACA,CAAE,MAAA,CAAQsD,CAAAA,CAAS,OAAQ,IAAA,CAAM2J,CAAO,CAC1C,CACF,CAEA,OAAQ,MAAM3J,CAAAA,CAAS,IAAA,EACzB,CAAA,CACA,SAAA,CAAYpO,GAAS,CACf4Q,CAAAA,GACE5Q,EAAK,IAAA,CAAO,CAAA,EACdyd,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,SAAU8B,CAAAA,CAAU,MAAA,CAAO,QAAQ3O,CAAQ,CAC7C,CAAC,CAAA,CAGH6M,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,SAAU8B,CAAAA,CAAU,EAAA,CAAG,gBAAgB3O,CAAQ,CACjD,CAAC,CAAA,EAEL,CACF,CAAC,CACH,CC5EA,SAASwU,EAAAA,CAAmBxO,CAAAA,CAA8B,CACxD,OAAO,CAACA,CAAAA,CAAQ,uBAAyB,CAACA,CAAAA,CAAQ,aACpD,CAKA,SAASyO,EAAAA,CAAiBC,CAAAA,CAAmD,CAC3E,OAAKA,EACE,MAAA,CAAO,MAAA,CAAOA,CAAO,CAAA,CAAE,IAAA,CAAMroB,GAClC,OAAOA,CAAAA,EAAU,SAAWA,CAAAA,CAAM,MAAA,CAAS,EAAIA,CAAAA,EAAS,IAC1D,EAHqB,KAIvB,CAEO,SAASsoB,CAAAA,CAA2B3U,CAAAA,CAA8B,CACvE,OAAO0O,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAC1C,QAAS,MAAO,CAAE,MAAA,CAAA3F,CAAO,CAAA,GAAM,CAC7B,GAAI,CAAC2F,CAAAA,CACH,OAAO,IAAA,CAUT,GAAM,CAACxC,CAAAA,CAAUoX,CAAa,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAClD3Y,CAAAA,CACE,4BAAA,CACA,CAAC,CAAC+D,CAAQ,CAAC,CAAA,CACX,MAAA,CACA,OACA3F,CAAAA,CAKCwa,CAAAA,EAAS,MAAM,OAAA,CAAQA,CAAI,CAC9B,CAAA,CACA5Y,CAAAA,CACE,qBACA,CAAE,OAAA,CAAS+D,CAAS,CAAA,CACpB,MAAA,CACA,MAAA,CACA3F,CACF,CAAA,CAAE,KAAA,CAAOvB,GAA4B,CAGnC,GAAIuB,GAAQ,OAAA,CAAS,MAAMvB,CAAAA,CAC3B,OAAO,IACT,CAAC,CACH,CAAC,CAAA,CACD,GAAI,CAAC0E,CAAAA,GAAW,CAAC,CAAA,CAKf,OAAO,IAAA,CAGT,IAAIsX,CAAAA,CAAetX,CAAAA,CAAS,CAAC,CAAA,CAW7B,GACEgX,GAAmBM,CAAY,CAAA,EAC/BL,GAAiBG,CAAAA,EAAe,QAAA,EAAU,OAAO,CAAA,CACjD,CAKA,IAAMG,CAAAA,CAAS,MAAM9Y,EACnB,4BAAA,CACA,CAAC,CAAC+D,CAAQ,CAAC,CAAA,CACX,MAAA,CACA,MAAA,CACA3F,CAAAA,CACCwa,GACC,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,GACjB,CAACA,EAAK,CAAC,CAAA,EAAK,CAACL,EAAAA,CAAmBK,CAAAA,CAAK,CAAC,CAAe,CAAA,CAC1D,CAAA,CACA,GAAIE,CAAAA,CAAO,CAAC,GAAK,CAACP,EAAAA,CAAmBO,CAAAA,CAAO,CAAC,CAAC,CAAA,CAC5CD,EAAeC,CAAAA,CAAO,CAAC,OAEvB,MAAM,IAAI,MACR,CAAA,oDAAA,EAAkD/U,CAAQ,2DAC5D,CAEJ,CAEA,IAAM0U,CAAAA,CAAUM,EAAAA,CAAqBF,EAAa,qBAAqB,CAAA,CAMjEG,EAAQL,CAAAA,EAAe,KAAA,CACvBM,CAAAA,CAA+CD,CAAAA,CACjD,CACE,OAAA,CAASH,EAAa,IAAA,CACtB,cAAA,CAAgBG,EAAM,SAAA,EAAa,CAAA,CACnC,gBAAiBA,CAAAA,CAAM,SAAA,EAAa,CACtC,CAAA,CACA,MAAA,CACEE,CAAAA,CAA0BP,GAAe,UAAA,EAAc,CAAA,CAE7D,OAAO,CACL,IAAA,CAAME,EAAa,IAAA,CACnB,KAAA,CAAOA,CAAAA,CAAa,KAAA,CACpB,MAAA,CAAQA,CAAAA,CAAa,OACrB,OAAA,CAASA,CAAAA,CAAa,QACtB,QAAA,CAAUA,CAAAA,CAAa,SACvB,UAAA,CAAYA,CAAAA,CAAa,WACzB,OAAA,CAASA,CAAAA,CAAa,QACtB,qBAAA,CAAuBA,CAAAA,CAAa,sBACpC,cAAA,CAAgBA,CAAAA,CAAa,eAC7B,SAAA,CAAWA,CAAAA,CAAa,SAAA,CACxB,aAAA,CAAeA,CAAAA,CAAa,aAAA,CAC5B,oBAAqBA,CAAAA,CAAa,mBAAA,CAClC,mBAAoBA,CAAAA,CAAa,kBAAA,CACjC,oBAAqBA,CAAAA,CAAa,mBAAA,CAClC,sBAAA,CAAwBA,CAAAA,CAAa,sBAAA,CACrC,OAAA,CAASA,EAAa,OAAA,CACtB,WAAA,CAAaA,EAAa,WAAA,CAC1B,eAAA,CAAiBA,EAAa,eAAA,CAC9B,mBAAA,CAAqBA,CAAAA,CAAa,mBAAA,CAClC,iCAAA,CACEA,CAAAA,CAAa,kCACf,+BAAA,CACEA,CAAAA,CAAa,gCACf,mBAAA,CAAqBA,CAAAA,CAAa,oBAClC,uBAAA,CAAyBA,CAAAA,CAAa,wBACtC,wBAAA,CAA0BA,CAAAA,CAAa,yBACvC,cAAA,CAAgBA,CAAAA,CAAa,eAC7B,wBAAA,CAA0BA,CAAAA,CAAa,yBACvC,uBAAA,CAAyBA,CAAAA,CAAa,uBAAA,CACtC,qBAAA,CAAuBA,CAAAA,CAAa,qBAAA,CACpC,YAAaA,CAAAA,CAAa,WAAA,CAC1B,UAAWA,CAAAA,CAAa,SAAA,CACxB,cAAeA,CAAAA,CAAa,aAAA,CAC5B,MAAOA,CAAAA,CAAa,KAAA,CACpB,iBAAkBA,CAAAA,CAAa,gBAAA,CAC/B,kBAAmBA,CAAAA,CAAa,iBAAA,CAChC,eAAgBA,CAAAA,CAAa,cAAA,CAC7B,YAAA,CAAcA,CAAAA,CAAa,YAAA,CAC3B,gBAAA,CAAkBA,EAAa,gBAAA,CAC/B,YAAA,CAAAI,EACA,UAAA,CAAYC,CAAAA,CACZ,QAAAT,CACF,CACF,EACA,OAAA,CAAS,CAAC,CAAC1U,CAAAA,CACX,SAAA,CAAW,GACb,CAAC,CACH,CC1LA,IAAMoV,EAAAA,CAAc,IAAI,GAAA,CAAI,CAAC,YAAa,aAAA,CAAe,WAAW,CAAC,CAAA,CAErE,SAASC,EAAAA,CAAchpB,CAAAA,CAAkD,CACvE,GAAI,CAACA,CAAAA,EAAS,OAAOA,GAAU,QAAA,EAAY,KAAA,CAAM,QAAQA,CAAK,CAAA,CAC5D,OAAO,MAAA,CAET,IAAMipB,CAAAA,CAAQ,OAAO,cAAA,CAAejpB,CAAK,EACzC,OAAOipB,CAAAA,GAAU,MAAQA,CAAAA,GAAU,MAAA,CAAO,SAC5C,CAEA,SAASC,GAA6C5oB,CAAAA,CAAWP,CAAAA,CAAoC,CACnG,IAAMb,CAAAA,CAAS,CAAE,GAAGoB,CAAO,CAAA,CAC3B,IAAA,IAAWqD,CAAAA,IAAO,MAAA,CAAO,KAAK5D,CAAM,CAAA,CAAG,CACrC,GAAIgpB,EAAAA,CAAY,IAAIplB,CAAG,CAAA,CACrB,SAEF,IAAMwlB,CAAAA,CAASppB,CAAAA,CAAO4D,CAAG,CAAA,CACnBylB,CAAAA,CAASlqB,EAAOyE,CAAG,CAAA,CACrBqlB,GAAcG,CAAM,CAAA,EAAKH,EAAAA,CAAcI,CAAM,CAAA,CAC/ClqB,CAAAA,CAAOyE,CAAG,CAAA,CAAIulB,EAAAA,CAAUE,EAAQD,CAAM,CAAA,CAEtCjqB,EAAOyE,CAAG,CAAA,CAAIwlB,EAElB,CACA,OAAOjqB,CACT,CAQA,SAASmqB,GACPpd,CAAAA,CAC2B,CAE3B,GAAI,EAAA,CAACA,CAAAA,EAAU,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAM,GAIpC,OAAOA,CAAAA,CAAO,IAAI,CAAC,CAAE,KAAAqd,CAAAA,CAAM,GAAGC,CAAK,CAAA,GAAM,CACvC,GAAI,CAACD,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC3B,OAAO,CAAE,GAAGC,CAAAA,CAAM,IAAA,CAAAD,CAAK,CAAA,CAGzB,GAAM,CAAE,UAAA,CAAA/U,CAAAA,CAAY,SAAAZ,CAAAA,CAAU,GAAG6V,CAAS,CAAA,CAAIF,CAAAA,CAC9C,OAAO,CAAE,GAAGC,EAAM,IAAA,CAAMC,CAAS,CACnC,CAAC,CACH,CAEO,SAASb,EAAAA,CACdc,CAAAA,CACgB,CAChB,GAAI,CAACA,EACH,OAAO,GAGT,GAAI,CACF,IAAM3O,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAM2O,CAAmB,CAAA,CAC7C,GACE3O,GACA,OAAOA,CAAAA,EAAW,UAClBA,CAAAA,CAAO,OAAA,EACP,OAAOA,CAAAA,CAAO,OAAA,EAAY,QAAA,CAE1B,OAAOA,CAAAA,CAAO,OAElB,OAASjO,CAAAA,CAAK,CACZ,QAAQ,IAAA,CAAK,8CAAA,CAAgDA,EAAK,CAAE,MAAA,CAAQ4c,GAAqB,MAAA,EAAU,CAAE,CAAC,EAChH,CAEA,OAAO,EACT,CAEO,SAASC,EAAAA,CACd3mB,CAAAA,CACgB,CAChB,OAAO4lB,EAAAA,CAAqB5lB,GAAM,qBAAqB,CACzD,CAUO,SAAS4mB,EAAAA,CAGdC,EACAC,CAAAA,CACsB,CACtB,GAAI,CAACD,CAAAA,CAAW,OAAOC,EACvB,GAAI,CAACA,EAAU,OAAOD,CAAAA,CACtB,IAAME,CAAAA,CAAgB,MAAA,CAAO,IAAA,CAC3BnB,EAAAA,CAAqBiB,CAAAA,CAAU,qBAAqB,CACtD,CAAA,CAAE,MAAA,CAIF,OAHqB,MAAA,CAAO,IAAA,CAC1BjB,GAAqBkB,CAAAA,CAAS,qBAAqB,CACrD,CAAA,CAAE,MAAA,CACoBC,EAAgBD,CAAAA,CAAWD,CACnD,CAWO,SAASG,EAAAA,CACdN,EACyB,CACzB,GAAI,CAACA,CAAAA,CACH,OAAO,GAGT,GAAI,CACF,IAAM3O,CAAAA,CAAS,IAAA,CAAK,MAAM2O,CAAmB,CAAA,CAC7C,GAAIT,EAAAA,CAAclO,CAAM,CAAA,CACtB,OAAOA,CAEX,CAAA,MAASjO,EAAK,CACZ,OAAA,CAAQ,KAAK,mDAAA,CAAqDA,CAAAA,CAAK,CACrE,MAAA,CAAQ4c,CAAAA,EAAqB,MAAA,EAAU,CACzC,CAAC,EACH,CAEA,OAAO,EACT,CASO,SAASO,GAAyB,CACvC,2BAAA,CAAAC,EACA,OAAA,CAAA5B,CAAAA,CACA,OAAApc,CACF,CAAA,CAIW,CACT,IAAMie,CAAAA,CAAOH,EAAAA,CAAyBE,CAA2B,CAAA,CAC3DE,CAAAA,CAAkBnB,GAAckB,CAAAA,CAAK,OAAO,EAC7CA,CAAAA,CAAK,OAAA,CACL,EAAC,CAEAE,CAAAA,CAAgBC,EAAAA,CAAqB,CACzC,eAAA,CAAAF,CAAAA,CACA,QAAA9B,CAAAA,CACA,MAAA,CAAApc,CACF,CAAC,CAAA,CAED,OAAO,IAAA,CAAK,SAAA,CAAU,CAAE,GAAGie,CAAAA,CAAM,OAAA,CAASE,CAAc,CAAC,CAC3D,CAEO,SAASC,EAAAA,CAAqB,CACnC,eAAA,CAAAF,CAAAA,CACA,QAAA9B,CAAAA,CACA,MAAA,CAAApc,CACF,CAAA,CAA6C,CAC3C,GAAM,CAAE,MAAA,CAAQqe,EAAe,OAAA,CAASC,CAAAA,CAAiB,GAAGC,CAAY,CAAA,CACtEnC,CAAAA,EAAW,EAAC,CAERoC,CAAAA,CAAWvB,GACdiB,CAAAA,EAAmB,GACpBK,CACF,CAAA,CAGA,OAAIC,CAAAA,CAAS,MAAA,EAAU,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAS,MAAM,CAAA,GACnDA,CAAAA,CAAS,OAAS,MAAA,CAAA,CAOhBxe,CAAAA,GAAW,MAAA,CAEbwe,CAAAA,CAAS,MAAA,CAASxe,CAAAA,EAAUA,EAAO,MAAA,CAAS,CAAA,CAAIA,EAAS,EAAC,CACjDqe,IAAkB,MAAA,GAE3BG,CAAAA,CAAS,OAASH,CAAAA,CAAAA,CAGpBG,CAAAA,CAAS,OAASpB,EAAAA,CAAeoB,CAAAA,CAAS,MAAM,CAAA,CAChDA,CAAAA,CAAS,QAAU,CAAA,CAEZA,CACT,CCrMO,SAASC,EAAAA,CAAcC,CAAAA,CAAmC,CAC/D,OAAOA,CAAAA,CAAY,IAAKC,CAAAA,EAAM,CAC5B,IAAMjR,CAAAA,CAAuB,CAC3B,IAAA,CAAMiR,CAAAA,CAAE,IAAA,CACR,KAAA,CAAOA,EAAE,KAAA,CACT,MAAA,CAAQA,EAAE,MAAA,CACV,OAAA,CAASA,EAAE,OAAA,CACX,QAAA,CAAUA,CAAAA,CAAE,QAAA,CACZ,UAAA,CAAYA,CAAAA,CAAE,WACd,OAAA,CAASA,CAAAA,CAAE,QACX,UAAA,CAAYA,CAAAA,CAAE,WACd,qBAAA,CAAuBA,CAAAA,CAAE,sBACzB,cAAA,CAAgBA,CAAAA,CAAE,eAClB,SAAA,CAAWA,CAAAA,CAAE,UACb,aAAA,CAAeA,CAAAA,CAAE,cACjB,mBAAA,CAAqBA,CAAAA,CAAE,mBAAA,CACvB,kBAAA,CAAoBA,CAAAA,CAAE,kBAAA,CACtB,oBAAqBA,CAAAA,CAAE,mBAAA,CACvB,uBAAwBA,CAAAA,CAAE,sBAAA,CAC1B,QAASA,CAAAA,CAAE,OAAA,CACX,WAAA,CAAaA,CAAAA,CAAE,WAAA,CACf,eAAA,CAAiBA,EAAE,eAAA,CACnB,mBAAA,CAAqBA,EAAE,mBAAA,CACvB,iCAAA,CAAmCA,EAAE,iCAAA,CACrC,+BAAA,CAAiCA,CAAAA,CAAE,+BAAA,CACnC,mBAAA,CAAqBA,CAAAA,CAAE,oBACvB,uBAAA,CAAyBA,CAAAA,CAAE,wBAC3B,wBAAA,CAA0BA,CAAAA,CAAE,yBAC5B,cAAA,CAAgBA,CAAAA,CAAE,eAClB,wBAAA,CAA0BA,CAAAA,CAAE,yBAC5B,uBAAA,CAAyBA,CAAAA,CAAE,wBAC3B,qBAAA,CAAuBA,CAAAA,CAAE,sBACzB,WAAA,CAAaA,CAAAA,CAAE,WAAA,CACf,SAAA,CAAWA,CAAAA,CAAE,SAAA,CACb,cAAeA,CAAAA,CAAE,aAAA,CACjB,MAAOA,CAAAA,CAAE,KAAA,CACT,iBAAkBA,CAAAA,CAAE,gBAAA,CACpB,iBAAA,CAAmBA,CAAAA,CAAE,iBAAA,CACrB,cAAA,CAAgBA,EAAE,cAAA,CAClB,YAAA,CAAcA,EAAE,YAAA,CAChB,gBAAA,CAAkBA,EAAE,gBACtB,CAAA,CAGIvC,CAAAA,CAAsCM,EAAAA,CACxCiC,CAAAA,CAAE,qBACJ,EAGA,GAAI,CAACvC,GAAW,MAAA,CAAO,IAAA,CAAKA,CAAO,CAAA,CAAE,MAAA,GAAW,EAC9C,GAAI,CACF,IAAMwC,CAAAA,CAAe,IAAA,CAAK,MAAMD,CAAAA,CAAE,aAAA,EAAiB,IAAI,CAAA,CACnDC,CAAAA,CAAa,OAAA,GACfxC,CAAAA,CAAUwC,CAAAA,CAAa,OAAA,EAE3B,MAAY,CAEZ,CAIF,QAAI,CAACxC,CAAAA,EAAW,OAAO,IAAA,CAAKA,CAAO,CAAA,CAAE,MAAA,GAAW,CAAA,IAC9CA,CAAAA,CAAU,CACR,KAAA,CAAO,EAAA,CACP,YAAa,EAAA,CACb,QAAA,CAAU,GACV,IAAA,CAAM,EAAA,CACN,aAAA,CAAe,EAAA,CACf,OAAA,CAAS,EACX,GAGK,CAAE,GAAG1O,EAAS,OAAA,CAAA0O,CAAQ,CAC/B,CAAC,CACH,CC3EO,SAASyC,EAAAA,CAAwBlG,EAAqB,CAC3D,OAAOvC,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,IAAA,CAAK,GAAGsC,CAAS,CAAA,CAC9C,OAAA,CAASA,EAAU,MAAA,CAAS,CAAA,CAC5B,QAAS,SAAoC,CAK3C,IAAMzT,CAAAA,CAAY,MAAMvB,CAAAA,CACtB,4BAAA,CACA,CAACgV,CAAS,EACV,MAAA,CACA,MAAA,CACA,OACC4D,CAAAA,EAAS,KAAA,CAAM,QAAQA,CAAI,CAC9B,CAAA,CACA,OAAOkC,EAAAA,CAAcvZ,CAAAA,EAAY,EAAE,CACrC,CACF,CAAC,CACH,CClBO,SAAS4Z,GAA2BpX,CAAAA,CAAkB,CAC3D,OAAO0O,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,WAAA,CAAY3O,CAAQ,CAAA,CACjD,OAAA,CAAS,IACP/D,CAAAA,CAAQ,gCAAA,CAAkC,CACxC+D,CACF,CAAC,CACL,CAAC,CACH,CCHO,SAASqX,EAAAA,CACdnG,EACAM,CAAAA,CACAJ,CAAAA,CAAa,OACbhkB,CAAAA,CAAQ,GAAA,CACR,CACA,OAAOshB,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,UAAUuC,CAAAA,CAAYM,CAAAA,CAAeJ,EAAYhkB,CAAK,CAAA,CACnF,QAAS,IACP6O,CAAAA,CAAQ,8BAA+B,CACrCiV,CAAAA,CACAM,EACAJ,CAAAA,CACAhkB,CACF,CAAC,CAAA,CACH,OAAA,CAAS,CAAC,CAAC8jB,CACb,CAAC,CACH,CCjBO,SAASoG,EAAAA,CACdhG,CAAAA,CACAC,CAAAA,CACAH,CAAAA,CAAa,MAAA,CACbhkB,CAAAA,CAAQ,IACR,CACA,OAAOshB,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,SAAA,CAAU2C,CAAAA,CAAUC,CAAAA,CAAgBH,CAAAA,CAAYhkB,CAAK,EAClF,OAAA,CAAS,IACP6O,EAAQ,6BAAA,CAA+B,CACrCqV,EACAC,CAAAA,CACAH,CAAAA,CACAhkB,CACF,CAAC,CAAA,CACH,QAAS,CAAC,CAACkkB,CACb,CAAC,CACH,CCxBA,IAAMiG,EAAAA,CAAwB,IAQxBC,EAAAA,CAAwB,EAAA,CAiBvB,SAASC,EAAAA,CAA0BzX,CAAAA,CAA8B,CACtE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,UAAA,CAAW3O,CAAS,EACjD,OAAA,CAAS,SAAY,CACnB,IAAM0X,CAAAA,CAAkB,EAAC,CACrBhqB,CAAAA,CAAQ,EAAA,CAEZ,QAASglB,CAAAA,CAAO,CAAA,CAAGA,EAAO8E,EAAAA,CAAuB9E,CAAAA,EAAAA,CAAQ,CACvD,IAAMlV,CAAAA,CAAY,MAAMvB,CAAAA,CAAQ,6BAAA,CAA+B,CAC7D+D,CAAAA,CACAtS,CAAAA,CACA,SACA6pB,EACF,CAAC,EAED,GAAI,CAAC/Z,CAAAA,EAAU,MAAA,CACb,MAGF,IAAIma,EAAQna,CAAAA,CAAS,GAAA,CAAKqV,GAASA,CAAAA,CAAK,SAAS,EAgBjD,GAVI8E,CAAAA,CAAM,CAAC,CAAA,GAAMjqB,CAAAA,GACfiqB,CAAAA,CAAQA,EAAM,KAAA,CAAM,CAAC,GAGnB,CAACA,CAAAA,CAAM,SAIXD,CAAAA,CAAM,IAAA,CAAK,GAAGC,CAAK,CAAA,CAEfna,CAAAA,CAAS,OAAS+Z,EAAAA,CAAAA,CACpB,MAGF7pB,EAAQiqB,CAAAA,CAAMA,CAAAA,CAAM,OAAS,CAAC,EAChC,CAEA,OAAOD,CACT,EACA,OAAA,CAAS,CAAC,CAAC1X,CACb,CAAC,CACH,CCnEO,SAAS4X,GAA2BvG,CAAAA,CAAejkB,CAAAA,CAAQ,GAAI,CACpE,OAAOshB,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,MAAA,CAAO0C,CAAAA,CAAOjkB,CAAK,CAAA,CAChD,OAAA,CAAS,IACP6O,CAAAA,CAAQ,+BAAA,CAAiC,CACvCoV,CAAAA,CACAjkB,CACF,CAAC,CAAA,CACH,OAAA,CAAS,CAAC,CAACikB,CAAAA,CACX,SAAA,CAAW,GACb,CAAC,CACH,CCjBO,SAASwG,GACdxG,CAAAA,CACAjkB,CAAAA,CAAQ,EACRqkB,CAAAA,CAAwB,GACxB,CACA,OAAO/C,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,MAAA,CAAO0C,CAAAA,CAAOI,CAAW,CAAA,CACtD,OAAA,CAAS,CAAC,CAACJ,CAAAA,CACX,OAAA,CAAS,SAAA,CACW,MAAMpV,CAAAA,CAAQ,gCAAiC,CAACoV,CAAAA,CAAOjkB,CAAK,CAAC,CAAA,EAC/D,OAAQ6E,CAAAA,EACtBwf,CAAAA,CAAY,MAAA,CAAS,CAAA,CAAI,CAACA,CAAAA,CAAY,SAASxf,CAAI,CAAA,CAAI,IACzD,CAEJ,CAAC,CACH,CCEA,IAAM6lB,EAAAA,CAAqB,IAAI,IAAI,CACjC,gBAAA,CACA,kBACA,kBAAA,CACA,eACF,CAAC,CAAA,CAUM,SAASC,EAAAA,CACd/X,EACAxK,CAAAA,CACA,CACA,OAAOkZ,YAAAA,CAAkD,CACvD,SAAUC,CAAAA,CAAU,QAAA,CAAS,kBAAA,CAAmB3O,CAAAA,CAAUxK,CAAAA,EAAQ,IAAI,EACtE,OAAA,CAAS,SAAY,CACnB,GAAI,CAACwK,GAAY,CAACxK,CAAAA,CAChB,OAAO,CAAE,KAAA,CAAO,KAAM,EAIxB,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,sBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,QAAA,CAAAxK,CAAAA,CACA,IAAA,CAAAxK,CACF,CAAC,CACH,CACF,EAEA,GAAI,CAACgI,EAAS,EAAA,CACZ,OAAO,CAAE,KAAA,CAAO,KAAM,CAAA,CAGxB,IAAM2L,CAAAA,CAAW,MAAM3L,EAAS,IAAA,EAAK,CAE/Bwa,EAAqC,KAAA,CAAM,OAAA,CAAQ7O,CAAO,CAAA,CAC5DA,CAAAA,CAAQ,OAAA,CAASlX,GAAS,CACxB,GAAI,CAACA,CAAAA,EAAQ,OAAOA,GAAS,QAAA,CAC3B,OAAO,EAAC,CAGV,IAAMgmB,EAAahmB,CAAAA,CAEblB,CAAAA,CACJ,OAAOknB,CAAAA,CAAW,KAAA,EAAU,SACxBA,CAAAA,CAAW,KAAA,CACX,MAAA,CAEN,GAAI,CAAClnB,CAAAA,CACH,OAAO,EAAC,CAGV,IAAM4kB,CAAAA,CACJsC,CAAAA,CAAW,MAAQ,OAAOA,CAAAA,CAAW,IAAA,EAAS,QAAA,CAC1C,CAAE,GAAIA,EAAW,IAAiC,CAAA,CAClD,EAAC,CAEDC,CAAAA,CAAyC,EAAC,CAE1CC,CAAAA,CACJ,OAAOF,CAAAA,CAAW,OAAA,EAAY,QAAA,EAAYA,EAAW,OAAA,CACjDA,CAAAA,CAAW,QACX,MAAA,CAOAG,CAAAA,CAAAA,CAJJ,OAAOH,CAAAA,CAAW,MAAA,EAAW,SACzBA,CAAAA,CAAW,MAAA,GAAW,EACtB,MAAA,GAEyB,KAAA,CAE3BE,IACFD,CAAAA,CAAc,OAAA,CAAUC,GAG1BD,CAAAA,CAAc,IAAA,CAAOE,CAAAA,CAErB,IAAMC,CAAAA,CAAgB,CACpB,OAAAtnB,CAAAA,CACA,QAAA,CAAUA,EACV,OAAA,CAAAonB,CAAAA,CACA,KAAMC,CAAAA,CACN,IAAA,CAAM,OAAA,CACN,IAAA,CAAMF,CACR,CAAA,CAEMI,EAAiD,EAAC,CAExD,OAAW,CAACC,CAAAA,CAAYC,CAAS,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ7C,CAAI,CAAA,CACnD,OAAO4C,GAAe,QAAA,GAItBT,EAAAA,CAAmB,IAAIS,CAAU,CAAA,EAIjC,OAAOC,CAAAA,EAAc,QAAA,EAAY,CAACA,CAAAA,EAIjC,kBAAA,CAAmB,KAAKD,CAAU,CAAA,EAIvCD,EAAoB,IAAA,CAAK,CACvB,OAAQC,CAAAA,CACR,QAAA,CAAUA,CAAAA,CACV,OAAA,CAASC,CAAAA,CACT,IAAA,CAAMJ,EACN,IAAA,CAAM,OAAA,CACN,KAAM,CAAE,OAAA,CAASI,EAAW,IAAA,CAAMJ,CAAS,CAC7C,CAAC,CAAA,CAAA,CAGH,OAAO,CAACC,CAAAA,CAAe,GAAGC,CAAmB,CAC/C,CAAC,EACD,EAAC,CAEL,OAAO,CACL,KAAA,CAAON,CAAAA,CAAQ,OAAS,CAAA,CACxB,MAAA,CAAQA,EAAQ,MAAA,CAASA,CAAAA,CAAU,OACnC,OAAA,CAASA,CAAAA,CAAQ,OAASA,CAAAA,CAAU,MACtC,CACF,CAAA,CACA,cAAA,CAAgB,IAClB,CAAC,CACH,CC3JO,SAASS,EAAAA,CACd7G,EACAjlB,CAAAA,CACA,CACA,OAAO+hB,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,SAAA,CAAUiD,CAAAA,CAAWjlB,CAAM,CAAA,CACxD,QAAS,CAAC,CAACilB,GAAa,CAAC,CAACjlB,EAC1B,cAAA,CAAgB,KAAA,CAChB,eAAA,CAAiB,IAAA,CACjB,OAAA,CAAS,SAAY,CACnB,IAAMupB,CAAAA,CAAgC,CACpC,OAAA,CAAS,KAAA,CACT,QAAS,KAAA,CACT,UAAA,CAAY,MACZ,aAAA,CAAe,KAAA,CACf,mBAAoB,KACtB,CAAA,CAKA,OAAI,CAACtE,CAAAA,EAAa,CAACjlB,CAAAA,CACVupB,CAAAA,CAGM,MAAMja,CAAAA,CAAQ,0CAAA,CAA4C,CAAC2V,EAAWjlB,CAAM,CAAC,GAC1EupB,CACpB,CACF,CAAC,CACH,CC5BO,SAASwC,EAAAA,CACd1Y,CAAAA,CACA,CACA,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc3O,CAAS,CAAA,CACpD,QAAS,CAAC,CAACA,EACX,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA3F,CAAO,IACN,MAAM4B,CAAAA,CAAQ,gCAAiC,CAC5D,OAAA,CAAS+D,CACX,CAAA,CAAG,MAAA,CAAW,OAAW3F,CAAM,CAAA,EACb,EAExB,CAAC,CACH,CCfO,SAASse,EAAAA,CACd/H,CAAAA,CACApb,CAAAA,CACA,CACA,OAAOkZ,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,SAAA,CAAUiC,CAAc,CAAA,CACrD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,OAAA,CAAS,SAAY,CACnB,GAAI,CAACob,CAAAA,EAAkB,CAACpb,EACtB,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAa7D,OAAQ,KAAA,CAVS,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,wBAAA,CACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAC/B,CACF,CAAA,EACuB,MACzB,CACF,CAAC,CACH,CAEO,SAASojB,EAAAA,CACdhI,CAAAA,CACApb,CAAAA,CACApI,EAAgB,EAAA,CAChB,CACA,OAAOyrB,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,QAAA,CAAS,kBAAkBiC,CAAAA,CAAgBxjB,CAAK,EACpE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,EACtB,OAAO,CACL,KAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,CAAA,CACP,KAAA,CAAApI,CAAAA,CACA,MAAA,CAAQ,EACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,EAAW,MADAyQ,CAAAA,EAAc,CAE7B,CAAA,EAAGzD,CAAAA,CAAO,cAAc,gDAAgDsO,CAAS,CAAA,OAAA,EAAU1rB,CAAK,CAAA,CAAA,CAChG,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAAoI,CAAK,CAAC,CAC/B,CACF,CAAA,CAEA,GAAI,CAACgI,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,IAAMub,CAAAA,CAAO,MAAMvb,EAAS,IAAA,EAAK,CACjC,OAAO4Q,EAAAA,CAA4C2K,CAAAA,CAAM3rB,CAAK,CAChE,CAAA,CACA,gBAAA,CAAkB,CAAA,CAClB,gBAAA,CAAmB4rB,CAAAA,EAAa,CAC9B,GAAIA,CAAAA,CAAS,WAAW,QAAA,CACtB,OAAOA,EAAS,UAAA,CAAW,MAAA,CAASA,EAAS,UAAA,CAAW,KAG5D,EACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CC3EO,SAASyjB,EAAAA,CACdrI,EACApb,CAAAA,CACA,CACA,OAAOkZ,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,SAAA,CAAUiC,CAAc,CAAA,CACrD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,OAAA,CAAS,SAAY,CACnB,GAAI,CAACob,CAAAA,EAAkB,CAACpb,EACtB,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAa7D,OAAQ,KAAA,CAVS,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,wBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAC/B,CACF,CAAA,EACuB,MACzB,CACF,CAAC,CACH,CAEO,SAAS0jB,EAAAA,CACdtI,CAAAA,CACApb,CAAAA,CACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,QAAA,CAAS,kBAAkBiC,CAAAA,CAAgBxjB,CAAK,EACpE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,CACL,KAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,EACP,KAAA,CAAApI,CAAAA,CACA,MAAA,CAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,EAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,CAAA,OAAA,EAAU1rB,CAAK,CAAA,CAAA,CAChG,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAAoI,CAAK,CAAC,CAC/B,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,EAAS,MAAM,CAAA,CAAE,EAGjE,IAAMub,CAAAA,CAAO,MAAMvb,CAAAA,CAAS,IAAA,EAAK,CACjC,OAAO4Q,EAAAA,CAA4C2K,CAAAA,CAAM3rB,CAAK,CAChE,CAAA,CACA,iBAAkB,CAAA,CAClB,gBAAA,CAAmB4rB,CAAAA,EAAa,CAC9B,GAAIA,CAAAA,CAAS,WAAW,QAAA,CACtB,OAAOA,EAAS,UAAA,CAAW,MAAA,CAASA,EAAS,UAAA,CAAW,KAG5D,EACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CCrEO,SAAS2jB,GACdvI,CAAAA,CACApb,CAAAA,CACAmc,EACA,CACA,OAAOjD,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAciC,CAAAA,CAAiBe,CAAe,CAAA,CAC3E,OAAA,CAAS,CAAC,CAACf,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,EAAQ,CAAC,CAACmc,CAAAA,CACzC,OAAA,CAAS,SAAY,CACnB,GAAI,CAACf,CAAAA,EAAkB,CAACpb,EACtB,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAE7D,GAAI,CAACmc,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAiD,CAAA,CAGnE,IAAMnU,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,8BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,EACA,OAAA,CAASmc,CACX,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACnU,CAAAA,CAAS,GACZ,MAAM,IAAI,MACR,CAAA,qEAAA,EAAmEA,CAAAA,CAAS,MAAM,CAAA,EAAA,EAAKA,CAAAA,CAAS,UAAU,CAAA,CAC5G,CAAA,CAGF,IAAMjS,CAAAA,CAAS,MAAMiS,EAAS,IAAA,EAAK,CACnC,GAAI,OAAOjS,CAAAA,EAAW,SAAA,CACpB,MAAM,IAAI,KAAA,CACR,kGAA6F,OAAOA,CAAM,EAC5G,CAAA,CAGF,OAAOA,CACT,CACF,CAAC,CACH,CCpDO,SAAS6tB,GACdpZ,CAAAA,CACAxK,CAAAA,CACA,CACA,OAAOkZ,YAAAA,CAAa,CAClB,OAAA,CAAS,CAAC,CAAC1O,GAAY,CAAC,CAACxK,EACzB,QAAA,CAAUmZ,CAAAA,CAAU,SAAS,UAAA,CAAW3O,CAAS,EACjD,OAAA,CAAS,SAAY,CACnB,GAAI,CAACA,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAcpE,OAAA,CAXiB,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,yBAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAC/B,CACF,CAAA,EAEgB,IAAA,EAClB,CACF,CAAC,CACH,CC1BO,SAAS6jB,EAAAA,CACdrZ,EACA,CACA,OAAO0O,aAAa,CAClB,OAAA,CAAS,CAAC,CAAC1O,CAAAA,CACX,SAAU2O,CAAAA,CAAU,QAAA,CAAS,eAAA,CAAgB3O,CAAS,CAAA,CACtD,OAAA,CAAS,IACP/D,CAAAA,CAAQ,oDAAA,CAAsD,CAAE,QAAA,CAAU,CAAC+D,CAAQ,CAAE,CAAC,CAC1F,CAAC,CACH,CCRO,SAASsZ,EAAAA,CAAkCjI,EAAejkB,CAAAA,CAAQ,EAAA,CAAI,CAC3E,OAAOshB,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,YAAY0C,CAAAA,CAAOjkB,CAAK,EACrD,OAAA,CAAS,CAAC,CAACikB,CAAAA,CACX,OAAA,CAAS,SACFA,CAAAA,CAIEpV,CAAAA,CAAQ,wCAAyC,CAACoV,CAAAA,CAAOjkB,CAAK,CAAC,CAAA,CAH7D,EAKb,CAAC,CACH,CCVA,IAAMiY,EAAMpB,EAAAA,CAAM,UAAA,CAELsV,EAAAA,CAA6D,CACxE,SAAA,CAAW,CACTlU,EAAI,QAAA,CACJA,CAAAA,CAAI,oBACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,4BAAA,CACJA,CAAAA,CAAI,kBAAA,CACJA,CAAAA,CAAI,uBAAA,CACJA,CAAAA,CAAI,gBACJA,CAAAA,CAAI,uBACN,EACA,eAAA,CAAiB,CACfA,EAAI,oBAAA,CACJA,CAAAA,CAAI,WACJA,CAAAA,CAAI,mCAAA,CACJA,EAAI,mBAAA,CACJA,CAAAA,CAAI,mBACJA,CAAAA,CAAI,kBACN,EACA,SAAA,CAAW,CAACA,CAAAA,CAAI,QAAQ,CAAA,CACxB,kBAAA,CAAoB,CAClBA,CAAAA,CAAI,yBAAA,CACJA,EAAI,gBAAA,CACJA,CAAAA,CAAI,oBACJA,CAAAA,CAAI,0BAAA,CACJA,CAAAA,CAAI,qBAAA,CACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,qBAAA,CACJA,CAAAA,CAAI,uBACN,CAAA,CACA,OAAA,CAAS,CACPA,CAAAA,CAAI,aAAA,CACJA,CAAAA,CAAI,eAAA,CACJA,CAAAA,CAAI,eAAA,CACJA,EAAI,oBAAA,CACJA,CAAAA,CAAI,0BACJA,CAAAA,CAAI,gBAAA,CACJA,EAAI,YACN,CACF,EAEamU,EAAAA,CAAyB,CAAC,GAAG,MAAA,CAAO,MAAA,CAAOD,EAAwB,CAAC,CAAA,CAAE,OACjF,CAACE,CAAAA,CAAKC,CAAAA,GAAQD,CAAAA,CAAI,MAAA,CAAOC,CAAG,EAC5B,EACF,EA2CA,SAASC,EAAAA,CAAUC,EAA+B,CAChD,OAAOA,CAAAA,CAAM,KAAA,CAAQ,GAAA,CAAaA,CAAAA,CAAM,aAAe,GAAA,CAAMA,CAAAA,CAAM,MACrE,CAMA,SAASC,GAAgBC,CAAAA,CAA0B,CACjD,OAAOA,CAAAA,CAAS,OAAA,CAAQ,aAAA,CAAe,EAAE,CAC3C,CAKA,SAASC,EAAAA,CAAW/qB,CAAAA,CAAqE,CACvF,OAAO,OAAOA,GAAM,QAAA,EAAYA,CAAAA,GAAM,MAAQ,KAAA,GAASA,CAAAA,EAAK,WAAYA,CAAAA,EAAK,WAAA,GAAeA,CAC9F,CAMA,SAASgrB,EAAAA,CAAYhrB,CAAAA,CAAqB,CACxC,GAAI,CAAC+qB,EAAAA,CAAW/qB,CAAC,EAAG,OAAOA,CAAAA,CAC3B,IAAMmY,CAAAA,CAAS0G,CAAAA,CAAW7e,CAAC,CAAA,CACrB+B,CAAAA,CAAS6c,EAAAA,CAAO5e,EAAE,GAA0B,CAAA,EAAK,UACvD,OAAO,CAAA,EAAGmY,EAAO,MAAA,CAAO,OAAA,CAAQnY,CAAAA,CAAE,SAAS,CAAC,CAAA,CAAA,EAAI+B,CAAM,CAAA,CACxD,CAMA,SAASkpB,EAAAA,CAAiB5tB,CAAAA,CAAyD,CACjF,IAAMd,CAAAA,CAAkC,EAAC,CACzC,IAAA,GAAW,CAAC2uB,CAAAA,CAAGlrB,CAAC,IAAK,MAAA,CAAO,OAAA,CAAQ3C,CAAK,CAAA,CACvCd,CAAAA,CAAO2uB,CAAC,CAAA,CAAIF,EAAAA,CAAYhrB,CAAC,EAE3B,OAAOzD,CACT,CAWO,SAAS4uB,EAAAA,CACdna,EACA5S,CAAAA,CAAQ,EAAA,CACRoR,CAAAA,CAA6B,EAAA,CAC7B,CACA,IAAM4b,EAAiB5b,CAAAA,CACnB+a,EAAAA,CAAyB/a,CAAK,CAAA,CAC9Bgb,EAAAA,CAEJ,OAAOX,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,QAAA,CAAS,YAAA,CAAa3O,GAAY,EAAA,CAAIxB,CAAAA,CAAOpR,CAAK,CAAA,CACtE,gBAAA,CAAkB,KAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAW,OAAAze,CAAO,CAAA,GAAqD,CACvF,GAAI,CAAC2F,EACH,OAAO,CAAE,OAAA,CAAS,EAAC,CAAG,WAAA,CAAa,CAAE,CAAA,CAGvC,IAAMlG,EAA0C,CAC9C,cAAA,CAAgBkG,EAChB,iBAAA,CAAmBoa,CAAAA,CAAe,IAAA,CAAK,GAAG,CAAA,CAC1C,WAAA,CAAahtB,CACf,CAAA,CAII0rB,CAAAA,GAAc,OAChBhf,CAAAA,CAAO,IAAA,CAAOgf,GAGhB,IAAMtb,CAAAA,CAAY,MAAMZ,EAAAA,CACtB,OAAA,CACA,qCAAA,CACA9C,EACA,MAAA,CACA,MAAA,CACAO,CACF,CAAA,CAcA,OAAO,CACL,OAAA,CAbcmD,CAAAA,CAAS,kBAAkB,GAAA,CAAKoc,CAAAA,EAAU,CACxD,IAAM5U,CAAAA,CAAO6U,GAAgBD,CAAAA,CAAM,EAAA,CAAG,IAAI,CAAA,CAE1C,OAAO,CACL,GAFYK,EAAAA,CAAiBL,CAAAA,CAAM,GAAG,KAAK,CAAA,CAG3C,IAAKD,EAAAA,CAAUC,CAAK,EACpB,IAAA,CAAA5U,CAAAA,CACA,SAAA,CAAW4U,CAAAA,CAAM,SAAA,CACjB,MAAA,CAAQA,EAAM,MAChB,CACF,CAAC,CAAA,CAIC,WAAA,CAAad,GAAatb,CAAAA,CAAS,WACrC,CACF,CAAA,CAEA,gBAAA,CAAmBwb,CAAAA,EAAa,CAC9B,IAAMqB,CAAAA,CAAWrB,EAAS,WAAA,CAAc,CAAA,CACxC,OAAOqB,CAAAA,EAAY,CAAA,CAAIA,EAAW,MACpC,CACF,CAAC,CACH,CCpNO,SAASC,EAAAA,EAAsB,CACpC,OAAO5L,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,MAAK,CAClC,OAAA,CAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,0BAAA,CAA4B,CAC/E,OAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,yBAAyBA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG5D,OAAOA,EAAS,IAAA,EAClB,EACA,cAAA,CAAgB,IAAA,CAChB,UAAW,CAAA,CAAA,CACb,CAAC,CACH,CCjBO,SAAS+c,GAAiCva,CAAAA,CAAkB,CACjE,OAAO6Y,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,QAAA,CAAS,UAAU3O,CAAQ,CAAA,CAC/C,iBAAkB,CAAE,KAAA,CAAO,MAAU,CAAA,CACrC,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA8Y,CAAU,IAAgC,CAC1D,GAAM,CAAE,KAAA,CAAA0B,CAAM,EAAI1B,CAAAA,EAAa,GACzB7b,CAAAA,CAAUyN,CAAAA,CAAc,qBAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,CAAA,uBAAA,EAA0BmG,CAAQ,CAAA,CAAA,CAAI/C,CAAO,CAAA,CAE7Dud,CAAAA,GAAU,MAAA,EACZ3gB,CAAAA,CAAI,aAAa,GAAA,CAAI,QAAA,CAAU2gB,EAAM,QAAA,EAAU,EAGjD,IAAMhd,CAAAA,CAAW,MAAM,KAAA,CAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQ,MACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAC2D,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,EAAS,MAAM,CAAA,CAAE,EAGjE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,iBAAmBwb,CAAAA,EAA6B,CAC9C,IAAMyB,CAAAA,CAAYzB,CAAAA,GAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,GACnD,OAAO,OAAOyB,GAAc,QAAA,CAAY,CAAE,MAAOA,CAAU,CAAA,CAAkB,MAC/E,CACF,CAAC,CACH,CC5BO,SAASC,GAA8B1a,CAAAA,CAAkB,CAC9D,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,cAAA,CAAe3O,CAAQ,CAAA,CACpD,OAAA,CAAS,SAAY,CACnB,IAAMxC,EAAW,MAAM,KAAA,CACrBgN,EAAO,cAAA,CAAiB,CAAA,uBAAA,EAA0BxK,CAAQ,CAAA,MAAA,CAAA,CAC1D,CACE,OAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAEA,GAAI,CAACxC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGtE,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,GAE5B,GAAI,CAACpO,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAAA,CAG/C,OAAO,CACL,KAAA,CAAOA,CAAAA,CAAK,OAAS,CAAA,CACrB,QAAA,CAAUA,EAAK,QAAA,EAAY,CAC7B,CACF,CACF,CAAC,CACH,CCnBO,SAASurB,EAAAA,CACdzJ,CAAAA,CACAC,CAAAA,CACAvS,EAKA,CACA,GAAM,CAAE,UAAA,CAAAwS,CAAAA,CAAa,OAAQ,KAAA,CAAAhkB,CAAAA,CAAQ,GAAA,CAAK,OAAA,CAAAwtB,CAAAA,CAAU,IAAK,EAAIhc,CAAAA,EAAW,GAExE,OAAOia,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,QAAA,CAAS,OAAA,CAAQuC,CAAAA,CAAWC,CAAAA,CAAMC,EAAYhkB,CAAK,CAAA,CACvE,iBAAkB,CAAE,cAAA,CAAgB,EAAG,CAAA,CACvC,OAAA,CAAAwtB,EACA,cAAA,CAAgB,IAAA,CAEhB,QAAS,MAAO,CAAE,UAAA9B,CAAU,CAAA,GAAuC,CACjE,GAAM,CAAE,cAAA,CAAAvH,CAAe,CAAA,CAAIuH,CAAAA,CAKrB+B,GAFY,MAAM5e,CAAAA,CAAQ,iBADjBkV,CAAAA,GAAS,WAAA,CAAc,gBAAkB,eACD,CAAA,CAAA,CAAI,CAACD,CAAAA,CAAWK,CAAAA,GAAmB,EAAA,CAAK,KAAOA,CAAAA,CAAgBH,CAAAA,CAAYhkB,CAAK,CAAC,CAAA,EAE1G,IAAK0L,CAAAA,EACjCqY,CAAAA,GAAS,WAAA,CAAcrY,CAAAA,CAAE,SAAA,CAAYA,CAAAA,CAAE,QACzC,CAAA,CAcA,OAAA,CAXkB,MAAMmD,CAAAA,CAAQ,qBAAA,CAAuB,CACrD,QAAA,CAAU4e,CAAAA,CACV,SAAU,MACZ,CAAC,GAEsC,EAAC,EAAG,IAAKlqB,CAAAA,GAAO,CACrD,KAAMA,CAAAA,CAAE,IAAA,CACR,UAAA,CAAYA,CAAAA,CAAE,UAAA,CACd,MAAA,CAAQA,EAAE,MACZ,CAAA,CAAE,CAGJ,CAAA,CAEA,gBAAA,CAAmBqoB,GACjBA,CAAAA,EAAYA,CAAAA,CAAS,MAAA,GAAW5rB,CAAAA,CAC5B,CAAE,cAAA,CAAgB4rB,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAAE,IAAK,EACrD,MACR,CAAC,CACH,CCpEA,IAAM8B,GAAe,EAAA,CASd,SAASC,GACd/a,CAAAA,CACAmR,CAAAA,CACAE,EACA,CACA,OAAO3C,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,aAAA,CAAc3O,EAAUmR,CAAAA,CAAME,CAAK,CAAA,CAChE,cAAA,CAAgB,KAAA,CAChB,OAAA,CAAS,MACT,OAAA,CAAS,SAA2C,CAClD,GAAI,CAACA,EAAO,OAAO,EAAC,CAEpB,IAAM3jB,CAAAA,CAAQ2jB,CAAAA,CAAM,MAAM,CAAA,CAAG,EAAE,EAIzBwJ,CAAAA,CAAAA,CAFY,MAAM5e,EAAQ,CAAA,cAAA,EADjBkV,CAAAA,GAAS,WAAA,CAAc,eAAA,CAAkB,eACD,CAAA,CAAA,CAAI,CAACnR,CAAAA,CAAUtS,CAAAA,CAAO,OAAQ,GAAI,CAAC,GAGvF,GAAA,CAAKoL,CAAAA,EAAOqY,IAAS,WAAA,CAAcrY,CAAAA,CAAE,UAAYA,CAAAA,CAAE,QAAS,EAC5D,MAAA,CAAQ+Y,CAAAA,EAASA,EAAK,WAAA,EAAY,CAAE,QAAA,CAASR,CAAAA,CAAM,WAAA,EAAa,CAAC,CAAA,CACjE,KAAA,CAAM,EAAGyJ,EAAY,CAAA,CAQxB,QALkB,MAAM7e,CAAAA,CAAQ,qBAAA,CAAuB,CACrD,QAAA,CAAU4e,CAAAA,CACV,SAAU,MACZ,CAAC,IAGW,GAAA,CAAKlqB,CAAAA,GAAO,CACpB,IAAA,CAAMA,CAAAA,CAAE,IAAA,CACR,SAAA,CAAWA,CAAAA,CAAE,QAAA,CAAS,SAAS,IAAA,EAAQ,EAAA,CACvC,WAAYA,CAAAA,CAAE,UAAA,CACd,OAAQA,CAAAA,CAAE,MACZ,EAAE,CAAA,EAAK,EAEX,CACF,CAAC,CACH,CC9CO,SAASqqB,EAAAA,CAA4B5tB,CAAAA,CAAQ,GAAI,CACtD,OAAOyrB,qBAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,YAAA,EAAa,CACvC,QAAS,MAAO,CAAE,UAAW,CAAE,QAAA,CAAAsM,CAAS,CAAE,CAAA,GACxChf,CAAAA,CAAQ,iCAAA,CAAmC,CAACgf,CAAAA,CAAU7tB,CAAK,CAAC,CAAA,CACzD,KAAM8tB,CAAAA,EACLA,CAAAA,CACG,OAAQjE,CAAAA,EAAMA,CAAAA,CAAE,OAAS,EAAE,CAAA,CAC3B,OAAQA,CAAAA,EAAM,CAACA,EAAE,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA,CACzC,GAAA,CAAKA,CAAAA,EAAMA,CAAAA,CAAE,IAAI,CACtB,CAAA,CACJ,gBAAA,CAAkB,CAAE,QAAA,CAAU,EAAG,EACjC,gBAAA,CAAmB+B,CAAAA,EACjBA,CAAAA,EAAU,MAAA,CAAS,CAAA,CACf,CAAE,SAAUA,CAAAA,CAASA,CAAAA,CAAS,OAAS,CAAC,CAAE,EAC1C,MAAA,CACN,SAAA,CAAW,IAAA,CAAU,GACvB,CAAC,CACH,CCjBO,SAASmC,GAAqC/tB,CAAAA,CAAQ,GAAA,CAAK,CAChE,OAAOyrB,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,qBAAA,CAAsBvhB,CAAK,EACrD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAW,CAAE,QAAA,CAAA6tB,CAAS,CAAE,CAAA,GACxChf,EAAQ,iCAAA,CAAmC,CAACgf,EAAU7tB,CAAK,CAAC,CAAA,CACzD,IAAA,CAAM8tB,CAAAA,EACLA,CAAAA,CAAK,OAAQ5Z,CAAAA,EAAQA,CAAAA,CAAI,OAAS,EAAE,CAAA,CAAE,OAAQA,CAAAA,EAAQ,CAAC4M,EAAAA,CAAY5M,CAAAA,CAAI,IAAI,CAAC,CAC9E,CAAA,CACJ,gBAAA,CAAkB,CAAE,QAAA,CAAU,EAAG,EACjC,gBAAA,CAAmB0X,CAAAA,EACjBA,GAAU,MAAA,CAAS,CAAE,SAAUA,CAAAA,CAASA,CAAAA,CAAS,OAAS,CAAC,CAAA,CAAE,IAAK,CAAA,CAAI,MAAA,CACxE,SAAA,CAAW,CAAA,CAAA,CACb,CAAC,CACH,CCfO,SAASoC,EAAAA,CAAyBpb,CAAAA,CAAkBxK,CAAAA,CAAe,CACxE,OAAOkZ,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAAA,CAC5C,OAAA,CAAS,SACFxK,CAAAA,CAAAA,CAIY,MADAyY,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,yBACxB,CACE,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,CACF,CAAC,CAAA,CACD,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EAEgB,IAAA,EAAK,CAhBZ,GAkBX,OAAA,CAAS,CAAC,CAACwK,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CAEO,SAAS6lB,EAAAA,CACdrb,EACAxK,CAAAA,CACApI,CAAAA,CAAgB,GAChB,CACA,OAAOyrB,qBAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,iBAAA,CAAkB3O,CAAAA,CAAU5S,CAAK,CAAA,CAC3D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,EAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAC9Y,GAAY,CAACxK,CAAAA,CAChB,OAAO,CACL,IAAA,CAAM,EAAC,CACP,UAAA,CAAY,CACV,KAAA,CAAO,CAAA,CACP,KAAA,CAAApI,EACA,MAAA,CAAQ,CAAA,CACR,SAAU,KACZ,CACF,EAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7B,CAAA,EAAGzD,EAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,CAAA,OAAA,EAAU1rB,CAAK,GAChG,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAoI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,IAAMub,EAAO,MAAMvb,CAAAA,CAAS,MAAK,CACjC,OAAO4Q,GAAqC2K,CAAAA,CAAM3rB,CAAK,CACzD,CAAA,CACA,gBAAA,CAAkB,CAAA,CAClB,iBAAmB4rB,CAAAA,EAAa,CAC9B,GAAIA,CAAAA,CAAS,UAAA,CAAW,SACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,MAAA,CAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,CAAA,CACA,OAAA,CAAS,CAAC,CAAChZ,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CC7EO,SAAS8lB,EAAAA,CACdtW,EAAyB,MAAA,CACzB,CACA,OAAO0J,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,QAAA,CAAS3J,CAAI,CAAA,CACvC,OAAA,CAAS,SAAY,CACnB,IAAM/H,EAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,+BAAA,CAAiCoD,CAAO,EAC5D,OAAI+H,CAAAA,GAAS,OAAA,EACXnL,CAAAA,CAAI,YAAA,CAAa,MAAA,CAAO,gBAAiB,GAAG,CAAA,CAUjC,MANI,MADAoU,CAAAA,GACepU,CAAAA,CAAI,QAAA,GAAY,CAC9C,MAAA,CAAQ,MACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CAAC,CAAA,EAC2B,IAAA,EAE9B,CACF,CAAC,CACH,CCtBO,SAAS0hB,GAAgC3B,CAAAA,CAAe,CAC7D,OAAOlL,YAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,gBAAA,CAAiBiL,GAAO,MAAA,CAAQA,CAAAA,EAAO,QAAQ,CAAA,CACzE,OAAA,CAAS,SACA3d,CAAAA,CAAQ,gCAAA,CAAkC,CAC/C2d,GAAO,MAAA,CACPA,CAAAA,EAAO,QACT,CAAC,CAAA,CAEH,QAAS,CAAC,CAACA,CACb,CAAC,CACH,CCHO,SAAS4B,GACdxb,CAAAA,CACAuQ,CAAAA,CACAC,CAAAA,CACA,CACA,OAAO9B,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,YAAA,CAAa3O,CAAAA,CAAWuQ,EAASC,CAAS,CAAA,CACpE,OAAA,CAAS,SAAA,CACQ,MAAMvU,CAAAA,CAAQ,0BAA2B,CACtD,KAAA,CAAO,CAAC+D,CAAAA,CAAUuQ,CAAAA,CAAQC,CAAQ,CAAA,CAClC,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,kBACT,CAAC,IAGe,KAAA,GAAQ,CAAC,GAAK,IAAA,CAEhC,OAAA,CAAS,CAAC,CAACxQ,CAAAA,EAAY,CAAC,CAACuQ,CAAAA,EAAU,CAAC,CAACC,CACvC,CAAC,CACH,CC3BO,SAASiL,EAAAA,CAAuBlL,CAAAA,CAAgBC,EAAkB,CACvE,OAAO9B,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,OAAA,CAAQ4B,CAAAA,CAAQC,CAAQ,CAAA,CAClD,OAAA,CAAS,CAAC,CAACD,CAAAA,EAAU,CAAC,CAACC,CAAAA,CACvB,QAAS,SACPvU,CAAAA,CAAQ,2BAAA,CAA6B,CACnCsU,CAAAA,CACAC,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAASkL,EAAAA,CAA8BnL,CAAAA,CAAgBC,EAAkB,CAC9E,OAAO9B,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,cAAA,CAAe4B,CAAAA,CAAQC,CAAQ,CAAA,CACzD,OAAA,CAAS,CAAC,CAACD,CAAAA,EAAU,CAAC,CAACC,CAAAA,CACvB,QAAS,SACPvU,CAAAA,CAAQ,mCAAA,CAAqC,CAC3C,MAAA,CAAAsU,CAAAA,CACA,SAAAC,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAASmL,EAAAA,CAA0BpL,EAAgBC,CAAAA,CAAkB,CAC1E,OAAO9B,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,WAAW4B,CAAAA,CAAQC,CAAQ,EACrD,OAAA,CAAS,SACAvU,EAAQ,wBAAA,CAA0B,CACvC,OAAAsU,CAAAA,CACA,QAAA,CAAAC,CACF,CAAC,CAAA,CAEH,WAAA,CAAa,IACf,CAAC,CACH,CCLO,SAASoL,EAAAA,CAAgBC,CAAAA,CAAwF,CACtH,OAAI,MAAM,OAAA,CAAQA,CAAc,EAEvBA,CAAAA,CAAe,GAAA,CAAKjC,GAAUkC,EAAAA,CAAYlC,CAAK,CAAC,CAAA,CAElDkC,EAAAA,CAAYD,CAAc,CACnC,CAEA,SAASC,GAAYlC,CAAAA,CAA2D,CAC9E,GAAI,CAACA,CAAAA,CAAO,OAAOA,CAAAA,CAEnB,IAAMtJ,EAAY,CAAA,CAAA,EAAIsJ,CAAAA,CAAM,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAM,QAAQ,CAAA,CAAA,CAKpD,OAHEpP,CAAAA,CAAO,YAAA,CAAa,QAAA,CAAS8F,CAAS,GACtC9F,CAAAA,CAAO,kBAAA,CAAmB,KAAMsB,CAAAA,EAAUA,CAAAA,CAAM,KAAKwE,CAAS,CAAC,CAAA,CAGxD,CACL,GAAGsJ,CAAAA,CACH,KAAM,iEAAA,CACN,KAAA,CAAO,EACT,CAAA,CAGKA,CACT,CCxBA,eAAsBmC,EAAAA,CACpBxL,CAAAA,CACAC,CAAAA,CACAtF,CAAAA,CACuB,CACvB,GAAI,CACF,IAAM1N,EAAW,MAAMC,EAAAA,CAAe,kBAAmB,CACvD,MAAA,CAAA8S,EACA,QAAA,CAAAC,CAAAA,CACA,SAAAtF,CACF,CAAA,CAAG,CAAC,CAAA,CAEJ,GACE1N,GACA,OAAOA,CAAAA,EAAa,QAAA,EACnBA,CAAAA,CAAmB,MAAA,GAAW+S,CAAAA,EAC9B/S,EAAmB,QAAA,GAAagT,CAAAA,CAEjC,OAAOhT,CAEX,CAAA,KAAQ,CAER,CAEA,OAAO,IACT,CC9BO,SAASwe,EAAAA,CACdzL,EACAC,CAAAA,CACAtF,CAAAA,CAAW,GACX+Q,CAAAA,CACA,CACA,IAAMC,CAAAA,CAAgB1L,CAAAA,EAAU,IAAA,EAAK,CAC/BF,CAAAA,CAAY,CAAA,EAAA,EAAKC,CAAM,CAAA,CAAA,EAAI2L,CAAAA,EAAiB,EAAE,CAAA,CAAA,CAEpD,OAAOxN,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,KAAA,CAAM2B,CAAS,CAAA,CACzC,OAAA,CAAS,SAAY,CACnB,GAAI,CAAC4L,CAAAA,EAAiBA,CAAAA,GAAkB,WAAA,CACtC,OAAO,IAAA,CAKT,IAAM1e,EAAW,MAAMvB,CAAAA,CAAQ,kBAAmB,CAChD,MAAA,CAAAsU,EACA,QAAA,CAAU2L,CAAAA,CACV,QAAA,CAAAhR,CACF,CAAC,CAAA,CAED,GAAI,CAAC1N,CAAAA,CAAU,CAGb,IAAM2e,CAAAA,CAAW,MAAMJ,EAAAA,CAA0BxL,CAAAA,CAAQ2L,CAAAA,CAAehR,CAAQ,CAAA,CAChF,GAAI,CAACiR,CAAAA,CACH,OAAO,KAET,IAAMC,CAAAA,CAAgBH,IAAQ,MAAA,CAAY,CAAE,GAAGE,CAAAA,CAAU,GAAA,CAAAF,CAAI,CAAA,CAAaE,CAAAA,CAC1E,OAAOP,EAAAA,CAAgBQ,CAAa,CACtC,CAEA,IAAMxC,CAAAA,CAAQqC,CAAAA,GAAQ,MAAA,CAAY,CAAE,GAAGze,CAAAA,CAAU,GAAA,CAAAye,CAAI,CAAA,CAAaze,CAAAA,CAClE,OAAOoe,EAAAA,CAAgBhC,CAAK,CAC9B,CAAA,CACA,OAAA,CACE,CAAC,CAACrJ,CAAAA,EACF,CAAC,CAACC,CAAAA,EACFA,CAAAA,CAAS,MAAK,GAAM,EAAA,EACpBA,CAAAA,CAAS,IAAA,EAAK,GAAM,WACxB,CAAC,CACH,CCzCO,SAAS6L,EAAAA,CAAiBxf,EAAkB/C,CAAAA,CAAsBO,CAAAA,CAAkC,CACzG,OAAO4B,CAAAA,CAAQ,UAAUY,CAAQ,CAAA,CAAA,CAAI/C,EAAQ,MAAA,CAAW,MAAA,CAAWO,CAAM,CAC3E,CAEA,eAAsBiiB,GACpBC,CAAAA,CACArR,CAAAA,CACA+Q,EACA5hB,CAAAA,CACgB,CAChB,GAAM,CAAE,aAAA,CAAe0e,CAAK,CAAA,CAAIwD,CAAAA,CAEhC,GAAIxD,GAAM,eAAA,EAAmBA,CAAAA,EAAM,mBAAqBA,CAAAA,CAAK,IAAA,GAAO,CAAC,CAAA,GAAM,YAAA,CACzE,GAAI,CACF,IAAMyD,CAAAA,CAAO,MAAMC,EAAAA,CACjB1D,CAAAA,CAAK,gBACLA,CAAAA,CAAK,iBAAA,CACL7N,EACA+Q,CAAAA,CACA5hB,CACF,EACA,OAAImiB,CAAAA,CACK,CACL,GAAGD,CAAAA,CACH,eAAgBC,CAAAA,CAChB,GAAA,CAAAP,CACF,CAAA,CAEKM,CACT,CAAA,KAAQ,CACN,OAAOA,CACT,CAGF,OAAO,CAAE,GAAGA,CAAAA,CAAM,GAAA,CAAAN,CAAI,CACxB,CAEA,eAAeS,EAAAA,CAAaC,CAAAA,CAAgBzR,CAAAA,CAAkB7Q,EAAwC,CACpG,IAAMuiB,EAAiBD,CAAAA,CAAM,GAAA,CAAIE,EAAa,CAAA,CACxCnQ,CAAAA,CAAW,MAAM,OAAA,CAAQ,GAAA,CAAIkQ,CAAAA,CAAe,IAAK3lB,CAAAA,EAAMqlB,EAAAA,CAAYrlB,EAAGiU,CAAAA,CAAU,MAAA,CAAW7Q,CAAM,CAAC,CAAC,EACzG,OAAOuhB,EAAAA,CAAgBlP,CAAQ,CACjC,CAEA,eAAsBoQ,EAAAA,CACpBjM,CAAAA,CACAkM,EAAuB,EAAA,CACvBC,CAAAA,CAAyB,EAAA,CACzB5vB,CAAAA,CAAgB,EAAA,CAChBkU,CAAAA,CAAc,GACd4J,CAAAA,CAAmB,EAAA,CACnB7Q,EACyB,CACzB,IAAMmiB,EAAO,MAAMH,EAAAA,CAA8B,kBAAA,CAAoB,CACnE,IAAA,CAAAxL,CAAAA,CACA,aAAAkM,CAAAA,CACA,cAAA,CAAAC,EACA,KAAA,CAAA5vB,CAAAA,CACA,IAAAkU,CAAAA,CACA,QAAA,CAAA4J,CACF,CAAA,CAAG7Q,CAAM,CAAA,CAET,OAAI,KAAA,CAAM,OAAA,CAAQmiB,CAAI,CAAA,CACbE,EAAAA,CAAaF,EAAMtR,CAAAA,CAAU7Q,CAAM,GAGxCmiB,CAAAA,EAAQ,IAAA,EACV,QAAQ,IAAA,CACN,CAAA,gCAAA,EAAmC,OAAOA,CAAI,CAAA,8BAAA,EAAiC3L,CAAI,CAAA,yBAAA,CACrF,CAAA,CAGK,IAAA,CACT,CAEA,eAAsBoM,EAAAA,CACpBpM,EACA7K,CAAAA,CACA+W,CAAAA,CAAuB,GACvBC,CAAAA,CAAyB,EAAA,CACzB5vB,EAAgB,EAAA,CAChB8d,CAAAA,CAAmB,EAAA,CACnB7Q,CAAAA,CACyB,CACzB,GAAImQ,EAAO,YAAA,CAAa,QAAA,CAASxE,CAAO,CAAA,CACtC,OAAO,EAAC,CAGV,IAAMwW,CAAAA,CAAO,MAAMH,EAAAA,CAA8B,mBAAA,CAAqB,CACpE,IAAA,CAAAxL,CAAAA,CACA,QAAA7K,CAAAA,CACA,YAAA,CAAA+W,EACA,cAAA,CAAAC,CAAAA,CACA,MAAA5vB,CAAAA,CACA,QAAA,CAAA8d,CACF,CAAA,CAAG7Q,CAAM,EAET,OAAI,KAAA,CAAM,QAAQmiB,CAAI,CAAA,CACbE,EAAAA,CAAaF,CAAAA,CAAMtR,CAAAA,CAAU7Q,CAAM,GAGxCmiB,CAAAA,EAAQ,IAAA,EACV,QAAQ,IAAA,CACN,CAAA,iCAAA,EAAoC,OAAOA,CAAI,CAAA,iCAAA,EAAoCxW,CAAO,CAAA,OAAA,EAAU6K,CAAI,CAAA,yBAAA,CAC1G,EAGK,IAAA,CACT,CAKA,SAASgM,EAAAA,CAAcjD,CAAAA,CAAqB,CAC1C,IAAMsD,CAAAA,CAAkB,CACtB,GAAGtD,CAAAA,CACH,YAAA,CAAc,MAAM,OAAA,CAAQA,CAAAA,CAAM,YAAY,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,YAAY,EAAI,EAAC,CAC7E,cAAe,KAAA,CAAM,OAAA,CAAQA,EAAM,aAAa,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,aAAa,CAAA,CAAI,EAAC,CAChF,WAAY,KAAA,CAAM,OAAA,CAAQA,EAAM,UAAU,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,UAAU,CAAA,CAAI,EAAC,CACvE,QAAS,KAAA,CAAM,OAAA,CAAQA,EAAM,OAAO,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,OAAO,CAAA,CAAI,EAAC,CAC9D,MAAOA,CAAAA,CAAM,KAAA,CAAQ,CAAE,GAAGA,CAAAA,CAAM,KAAM,CAAA,CAAI,IAC5C,EAEMuD,CAAAA,CAAuC,CAC3C,SACA,OAAA,CACA,MAAA,CACA,UACA,UAAA,CACA,UAAA,CACA,MACA,SACF,CAAA,CAEA,IAAA,IAAWC,CAAAA,IAAQD,CAAAA,CACbD,CAAAA,CAASE,CAAI,CAAA,EAAK,IAAA,GACnBF,EAAiBE,CAAI,CAAA,CAAI,IAI9B,OAAIF,CAAAA,CAAS,mBAAqB,IAAA,GAChCA,CAAAA,CAAS,kBAAoB,CAAA,CAAA,CAE3BA,CAAAA,CAAS,UAAY,IAAA,GACvBA,CAAAA,CAAS,SAAW,CAAA,CAAA,CAElBA,CAAAA,CAAS,KAAA,EAAS,IAAA,GACpBA,CAAAA,CAAS,KAAA,CAAQ,GAEfA,CAAAA,CAAS,WAAA,EAAe,OAC1BA,CAAAA,CAAS,WAAA,CAAc,GAErBA,CAAAA,CAAS,MAAA,EAAU,OACrBA,CAAAA,CAAS,MAAA,CAAS,GAEhBA,CAAAA,CAAS,WAAA,EAAe,OAC1BA,CAAAA,CAAS,WAAA,CAAc,GAGpBA,CAAAA,CAAS,KAAA,GACZA,CAAAA,CAAS,KAAA,CAAQ,CACf,WAAA,CAAa,EACb,IAAA,CAAM,KAAA,CACN,KAAM,KAAA,CACN,WAAA,CAAa,CACf,CAAA,CAAA,CAGEA,CAAAA,CAAS,mBAAA,EAAuB,IAAA,GAClCA,CAAAA,CAAS,mBAAA,CAAsB,aAE7BA,CAAAA,CAAS,oBAAA,EAAwB,OACnCA,CAAAA,CAAS,oBAAA,CAAuB,aAE9BA,CAAAA,CAAS,mBAAA,EAAuB,IAAA,GAClCA,CAAAA,CAAS,mBAAA,CAAsB,iBAAA,CAAA,CAE7BA,EAAS,SAAA,EAAa,IAAA,GACxBA,EAAS,SAAA,CAAY,EAAA,CAAA,CAEnBA,EAAS,oBAAA,EAAwB,IAAA,GACnCA,EAAS,oBAAA,CAAuB,WAAA,CAAA,CAE9BA,EAAS,QAAA,EAAY,IAAA,GACvBA,EAAS,QAAA,CAAW,WAAA,CAAA,CAGlBA,EAAS,UAAA,EAAc,IAAA,GACzBA,CAAAA,CAAS,UAAA,CAAa,KAAA,CAAA,CAGjBA,CACT,CAEA,eAAsBT,EAAAA,CACpBlM,EAAiB,EAAA,CACjBC,CAAAA,CAAmB,GACnBtF,CAAAA,CAAmB,EAAA,CACnB+Q,CAAAA,CACA5hB,CAAAA,CAC4B,CAC5B,IAAMmiB,EAAO,MAAMH,EAAAA,CAA4B,WAAY,CACzD,MAAA,CAAA9L,EACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAtF,CACF,CAAA,CAAG7Q,CAAM,EAET,GAAImiB,CAAAA,CAAM,CACR,IAAMa,CAAAA,CAAiBR,GAAcL,CAAI,CAAA,CACnCD,EAAO,MAAMD,EAAAA,CAAYe,EAAgBnS,CAAAA,CAAU+Q,CAAAA,CAAK5hB,CAAM,CAAA,CACpE,OAAOuhB,GAAgBW,CAAI,CAC7B,CAGF,CAEA,eAAsBe,EAAAA,CACpB/M,EAAiB,EAAA,CACjBC,CAAAA,CAAmB,GACI,CACvB,IAAMgM,EAAO,MAAMH,EAAAA,CAA4B,iBAAA,CAAmB,CAChE,MAAA,CAAA9L,CAAAA,CACA,SAAAC,CACF,CAAC,EACD,OAAOgM,CAAAA,EAAOK,GAAcL,CAAI,CAClC,CAEA,eAAsBe,EAAAA,CACpBhN,CAAAA,CACAC,EACAtF,CAAAA,CACuC,CACvC,IAAMsR,CAAAA,CAAO,MAAMH,GAA4C,gBAAA,CAAkB,CAC/E,OAAA9L,CAAAA,CACA,QAAA,CAAAC,EACA,QAAA,CAAUtF,CAAAA,EAAYqF,CACxB,CAAC,CAAA,CAED,GAAIiM,CAAAA,CAAM,CACR,IAAMgB,CAAAA,CAAuC,EAAC,CAC9C,OAAW,CAACxtB,CAAAA,CAAK4pB,CAAK,CAAA,GAAK,MAAA,CAAO,QAAQ4C,CAAI,CAAA,CAC5CgB,CAAAA,CAAcxtB,CAAG,CAAA,CAAI6sB,EAAAA,CAAcjD,CAAK,CAAA,CAE1C,OAAO4D,CACT,CACA,OAAOhB,CACT,CAEA,eAAsBiB,EAAAA,CACpB5L,CAAAA,CACA3G,CAAAA,CAA+B,EAAA,CACJ,CAC3B,OAAOmR,EAAAA,CAAgC,gBAAiB,CAAE,IAAA,CAAAxK,EAAM,QAAA,CAAA3G,CAAS,CAAC,CAC5E,CAEA,eAAsBwS,EAAAA,CACpBC,CAAAA,CAAe,GACfvwB,CAAAA,CAAgB,GAAA,CAChBikB,EACAR,CAAAA,CAAe,MAAA,CACf3F,CAAAA,CAAmB,EAAA,CACU,CAC7B,OAAOmR,GAAkC,kBAAA,CAAoB,CAC3D,KAAAsB,CAAAA,CACA,KAAA,CAAAvwB,EACA,KAAA,CAAAikB,CAAAA,CACA,IAAA,CAAAR,CAAAA,CACA,QAAA,CAAA3F,CACF,CAAC,CACH,CAEA,eAAsB0S,EAAAA,CAAcrB,CAAAA,CAAsC,CACxE,IAAMC,CAAAA,CAAO,MAAMH,EAAAA,CAA4B,gBAAA,CAAkB,CAAE,KAAAE,CAAK,CAAC,EACzE,OAAOC,CAAAA,EAAOK,GAAcL,CAAI,CAClC,CAEA,eAAsBqB,EAAAA,CAAiB7X,EAAiD,CACtF,OAAOqW,GAAqC,wBAAA,CAA0B,CAAE,QAAArW,CAAQ,CAAC,CACnF,CAEA,eAAsB8X,EAAAA,CAAeC,EAAmD,CACtF,OAAO1B,GAAqC,kBAAA,CAAoB,CAAE,UAAA0B,CAAU,CAAC,CAC/E,CAEA,eAAsBC,EAAAA,CACpB1M,EACAJ,CAAAA,CACqC,CACrC,OAAOmL,EAAAA,CAA0C,mCAAA,CAAqC,CACpF/K,CAAAA,CACAJ,CACF,CAAC,CACH,CAEA,eAAsB+M,GACpBvM,CAAAA,CACAxG,CAAAA,CACoB,CACpB,OAAOmR,EAAAA,CAAyB,eAAgB,CAAE,QAAA,CAAA3K,EAAU,QAAA,CAAAxG,CAAS,CAAC,CACxE,KC7SYgT,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,SAAW,UAAA,CACXA,CAAAA,CAAA,iBAAA,CAAoB,mBAAA,CACpBA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,OAAA,CAAU,UAJAA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EAOZ,SAASrQ,EAAAA,CAAWxhB,CAAAA,CAAmD,CACrE,IAAMqf,CAAAA,CAAQrf,CAAAA,CAAM,MAAM,0BAA0B,CAAA,CACpD,OAAKqf,CAAAA,CACE,CACL,OAAQ,UAAA,CAAWA,CAAAA,CAAM,CAAC,CAAC,CAAA,CAC3B,MAAA,CAAQA,EAAM,CAAC,CACjB,EAJmB,CAAE,MAAA,CAAQ,EAAG,MAAA,CAAQ,EAAG,CAK7C,CAEO,SAASyS,GACdvE,CAAAA,CACAwE,CAAAA,CACAtN,EACA,CACA,IAAMuN,EAAanzB,CAAAA,EACjB2iB,EAAAA,CAAW3iB,CAAAA,CAAE,oBAAoB,CAAA,CAAE,MAAA,CACnC2iB,GAAW3iB,CAAAA,CAAE,mBAAmB,EAAE,MAAA,CAClC2iB,EAAAA,CAAW3iB,EAAE,oBAAoB,CAAA,CAAE,MAAA,CAE/BozB,CAAAA,CAAe3tB,CAAAA,EAAaA,CAAAA,CAAE,YAAc,CAAA,CAC5C4tB,CAAAA,CAAY5tB,GAChBipB,CAAAA,CAAM,aAAA,EAAe,eAAiB,CAAA,EAAGjpB,CAAAA,CAAE,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,QAAQ,GAE3D6tB,CAAAA,CAAa,CACjB,SAAU,CAAC7tB,CAAAA,CAAUtF,IAAa,CAChC,GAAIizB,EAAY3tB,CAAC,CAAA,CACf,OAAO,CAAA,CAGT,GAAI2tB,EAAYjzB,CAAC,CAAA,CACf,OAAO,GAAA,CAGT,IAAMozB,CAAAA,CAAKJ,CAAAA,CAAU1tB,CAAC,CAAA,CAChB+tB,EAAKL,CAAAA,CAAUhzB,CAAC,EACtB,OAAIozB,CAAAA,GAAOC,EACFA,CAAAA,CAAKD,CAAAA,CAGP,CACT,CAAA,CACA,iBAAA,CAAmB,CAAC9tB,EAAUtF,CAAAA,GAAa,CACzC,IAAMszB,CAAAA,CAAOhuB,CAAAA,CAAE,kBACTiuB,CAAAA,CAAOvzB,CAAAA,CAAE,iBAAA,CAEf,OAAIszB,CAAAA,CAAOC,CAAAA,CAAa,GACpBD,CAAAA,CAAOC,CAAAA,CAAa,EAEjB,CACT,CAAA,CACA,MAAO,CAACjuB,CAAAA,CAAUtF,IAAa,CAC7B,IAAMszB,EAAOhuB,CAAAA,CAAE,QAAA,CACTiuB,EAAOvzB,CAAAA,CAAE,QAAA,CAEf,OAAIszB,CAAAA,CAAOC,CAAAA,CAAa,EAAA,CACpBD,CAAAA,CAAOC,CAAAA,CAAa,CAAA,CAEjB,CACT,CAAA,CACA,OAAA,CAAS,CAACjuB,CAAAA,CAAUtF,CAAAA,GAAa,CAC/B,GAAIizB,CAAAA,CAAY3tB,CAAC,CAAA,CACf,OAAO,CAAA,CAGT,GAAI2tB,CAAAA,CAAYjzB,CAAC,EACf,OAAO,GAAA,CAGT,IAAMszB,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMhuB,CAAAA,CAAE,OAAO,CAAA,CAC3BiuB,EAAO,IAAA,CAAK,KAAA,CAAMvzB,EAAE,OAAO,CAAA,CAEjC,OAAIszB,CAAAA,CAAOC,CAAAA,CAAa,GACpBD,CAAAA,CAAOC,CAAAA,CAAa,EAEjB,CACT,CACF,EAEMC,CAAAA,CAAST,CAAAA,CAAW,KAAKI,CAAAA,CAAW1N,CAAK,CAAC,CAAA,CAC1CgO,CAAAA,CAAcD,CAAAA,CAAO,UAAW5zB,CAAAA,EAAMszB,CAAAA,CAAStzB,CAAC,CAAC,CAAA,CACjD8zB,EAASF,CAAAA,CAAOC,CAAW,CAAA,CACjC,OAAIA,CAAAA,EAAe,CAAA,GACjBD,EAAO,MAAA,CAAOC,CAAAA,CAAa,CAAC,CAAA,CAC5BD,CAAAA,CAAO,QAAQE,CAAM,CAAA,CAAA,CAEhBF,CACT,CAEO,SAASG,EAAAA,CACdpF,EACA9I,CAAAA,CAAmB,SAAA,CACnB8J,EAAmB,IAAA,CACnB1P,CAAAA,CACA,CAKA,IAAM+T,CAAAA,CAAmB/T,GAAYV,CAAAA,CAAO,eAAA,CAE5C,OAAOkE,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,YAAYiL,CAAAA,EAAO,MAAA,CAAQA,CAAAA,EAAO,QAAA,CAAU9I,CAAAA,CAAOmO,CAAgB,EAC7F,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrF,EACH,OAAO,EAAC,CAGV,IAAMpc,CAAAA,CAAW,MAAMvB,EAAQ,uBAAA,CAAyB,CACtD,OAAQ2d,CAAAA,CAAM,MAAA,CACd,SAAUA,CAAAA,CAAM,QAAA,CAChB,QAAA,CAAUqF,CACZ,CAAC,CAAA,CAEK5gB,EAAUb,CAAAA,CACZ,KAAA,CAAM,KAAK,MAAA,CAAO,MAAA,CAAOA,CAAiC,CAAC,CAAA,CAC3D,EAAC,CACL,OAAOoe,GAAgBvd,CAAO,CAChC,EACA,OAAA,CAASuc,CAAAA,EAAW,CAAC,CAAChB,CAAAA,CACtB,MAAA,CAASxqB,CAAAA,EAAkB+uB,EAAAA,CAAgBvE,CAAAA,CAAOxqB,EAAM0hB,CAAK,CAAA,CAI7D,kBAAmB,CAACoO,CAAAA,CAASC,IAAY,CACvC,GAAI,CAACD,CAAAA,EAAW,CAACC,CAAAA,CAAS,OAAOA,CAAAA,CAGjC,IAAMC,EAAqBF,CAAAA,CAAoB,MAAA,CAC5CtF,GAAiBA,CAAAA,CAAM,aAAA,GAAkB,IAC5C,CAAA,CAEMyF,CAAAA,CAAmB,IAAI,IAC1BF,CAAAA,CAAoB,GAAA,CAAKrmB,GAAa,CAAA,EAAGA,CAAAA,CAAE,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,QAAQ,CAAA,CAAE,CACpE,EAEMwmB,CAAAA,CAAoBF,CAAAA,CAAkB,OACzCG,CAAAA,EAAe,CAACF,EAAiB,GAAA,CAAI,CAAA,EAAGE,CAAAA,CAAI,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAI,QAAQ,CAAA,CAAE,CACvE,EAGA,OAAID,CAAAA,CAAkB,OAAS,CAAA,CACtB,CAAC,GAAIH,CAAAA,CAAqB,GAAGG,CAAiB,EAGhDH,CACT,CACF,CAAC,CACH,CAEO,SAASK,EAAAA,CACdjP,CAAAA,CACAC,CAAAA,CACAtF,CAAAA,CACA0P,CAAAA,CAAU,IAAA,CACV,CACA,IAAMqE,CAAAA,CAAmB/T,GAAYV,CAAAA,CAAO,eAAA,CAE5C,OAAOkE,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,WAAW4B,CAAAA,CAAQC,CAAAA,CAAUyO,CAAgB,CAAA,CACvE,OAAA,CAASrE,GAAW,CAAC,CAACrK,CAAAA,EAAU,CAAC,CAACC,CAAAA,CAClC,QAAS,SACP+M,EAAAA,CAAchN,EAAQC,CAAAA,CAAUyO,CAAgB,CAIpD,CAAC,CACH,CCvKO,SAASQ,EAAAA,CACdzf,CAAAA,CACAyQ,EAAS,OAAA,CACTrjB,CAAAA,CAAQ,EAAA,CACR8d,CAAAA,CAAW,EAAA,CACX0P,CAAAA,CAAU,KACV,CACA,OAAO/B,qBAML,CACA,QAAA,CAAUlK,EAAU,KAAA,CAAM,YAAA,CAAa3O,GAAY,EAAA,CAAIyQ,CAAAA,CAAQrjB,EAAO8d,CAAQ,CAAA,CAC9E,QAAS,CAAC,CAAClL,GAAY4a,CAAAA,CACvB,gBAAA,CAAkB,CAChB,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,OACV,WAAA,CAAa,IACf,EAEA,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA9B,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAM,CACxC,GAAI,CAACye,CAAAA,EAAW,aAAe,CAAC9Y,CAAAA,CAAU,OAAO,EAAC,CAElD,IAAMxC,CAAAA,CAAW,MAAMyf,EAAAA,CACrBxM,EACAzQ,CAAAA,CACA8Y,CAAAA,CAAU,QAAU,EAAA,CACpBA,CAAAA,CAAU,UAAY,EAAA,CACtB1rB,CAAAA,CACA8d,EACA7Q,CACF,CAAA,CAEA,OAAOuhB,EAAAA,CAAgBpe,CAAAA,EAAY,EAAE,CACvC,EAEA,gBAAA,CAAmBwb,CAAAA,EAA0C,CAC3D,IAAM2E,CAAAA,CAAO3E,CAAAA,GAAWA,EAAS,MAAA,CAAS,CAAC,EAGrC0G,CAAAA,CAAAA,CAAe1G,CAAAA,EAAU,QAAU,CAAA,IAAO5rB,CAAAA,CAEhD,GAAKsyB,CAAAA,CAIL,OAAO,CACL,OAAQ/B,CAAAA,EAAM,MAAA,CACd,SAAUA,CAAAA,EAAM,QAAA,CAChB,YAAA+B,CACF,CACF,CACF,CAAC,CACH,CAEO,SAASC,EAAAA,CACd3f,CAAAA,CACAyQ,EAAS,OAAA,CACTsM,CAAAA,CAAuB,GACvBC,CAAAA,CAAyB,EAAA,CACzB5vB,EAAQ,EAAA,CACR8d,CAAAA,CAAW,GACX0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,gBAAA,CAAiB3O,CAAAA,EAAY,EAAA,CAAIyQ,EAAQsM,CAAAA,CAAcC,CAAAA,CAAgB5vB,EAAO8d,CAAQ,CAAA,CAChH,QAAS,CAAC,CAAClL,CAAAA,EAAY4a,CAAAA,CACvB,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAvgB,CAAO,EAAI,EAAC,GAAa,CACzC,GAAI,CAAC2F,CAAAA,CACH,OAAO,EAAC,CAGV,IAAMxC,CAAAA,CAAW,MAAMyf,GACrBxM,CAAAA,CACAzQ,CAAAA,CACA+c,EACAC,CAAAA,CACA5vB,CAAAA,CACA8d,EACA7Q,CACF,CAAA,CAEA,OAAOuhB,EAAAA,CAAgBpe,CAAAA,EAAY,EAAE,CACvC,CACF,CAAC,CACH,CC7EA,IAAMoiB,EAAAA,CAAiB,IAAI,IAK3B,SAASC,EAAAA,CAAchP,CAAAA,CAAc,CACnC,IAAIiP,CAAAA,CAASF,GAAe,GAAA,CAAI/O,CAAI,EACpC,OAAKiP,CAAAA,GACHA,EAAU1wB,CAAAA,GAAU,CAClB,GAAGA,CAAAA,CACH,KAAA,CAAOA,CAAAA,CAAK,MAAM,GAAA,CAAKsjB,CAAAA,EAASqN,GAAgBrN,CAAAA,CAAM7B,CAAI,CAAC,CAC7D,CAAA,CAAA,CACA+O,GAAe,GAAA,CAAI/O,CAAAA,CAAMiP,CAAM,CAAA,CAAA,CAE1BA,CACT,CAeA,SAASC,EAAAA,CAAgBrN,EAAe7B,CAAAA,CAAuB,CAC7D,IAAMkO,CAAAA,CAASrM,CAAAA,CAAK,MAAA,CAAQkH,GAAUA,CAAAA,CAAM,KAAA,EAAO,SAAS,CAAA,CACtDhE,CAAAA,CAAOlD,EAAK,MAAA,CAAQkH,CAAAA,EAAU,CAACA,CAAAA,CAAM,KAAA,EAAO,SAAS,EAE3D,GAAI/I,CAAAA,GAAS,MACX,OAAO,CAAC,GAAGkO,CAAAA,CAAQ,GAAGnJ,CAAI,CAAA,CAG5B,IAAMoK,CAAAA,CAAY,CAAC,GAAGpK,CAAI,EAAE,IAAA,CAC1B,CAACjlB,EAAGtF,CAAAA,GAAM,IAAI,KAAKA,CAAAA,CAAE,OAAO,EAAE,OAAA,EAAQ,CAAI,IAAI,IAAA,CAAKsF,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAChE,CAAA,CACA,OAAO,CAAC,GAAGouB,CAAAA,CAAQ,GAAGiB,CAAS,CACjC,CAEO,SAASC,EAAAA,CACdpP,CAAAA,CACAvP,CAAAA,CACAlU,CAAAA,CAAQ,EAAA,CACR8d,CAAAA,CAAW,GACX0P,CAAAA,CAAU,IAAA,CACVsF,EAAkC,EAAC,CACnC,CACA,OAAOrH,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,YAAYkC,CAAAA,CAAMvP,CAAAA,CAAKlU,EAAO8d,CAAQ,CAAA,CAChE,QAAS,MAAO,CAAE,UAAA4N,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAqD,CACvF,IAAI8lB,CAAAA,CAAe7e,CAAAA,CACfkJ,EAAO,cAAA,CAAe,IAAA,CAAMsB,CAAAA,EAAUA,CAAAA,CAAM,IAAA,CAAKxK,CAAG,CAAC,CAAA,GACvD6e,CAAAA,CAAe,IAGjB,IAAM3iB,CAAAA,CAAW,MAAMvB,CAAAA,CAAQ,yBAAA,CAA2B,CACxD,IAAA,CAAA4U,CAAAA,CACA,YAAA,CAAciI,EAAU,MAAA,CACxB,cAAA,CAAgBA,EAAU,QAAA,CAC1B,KAAA,CAAA1rB,EACA,GAAA,CAAK+yB,CAAAA,CACL,QAAA,CAAAjV,CACF,CAAA,CAAG,MAAA,CAAW,OAAW7Q,CAAM,CAAA,CAE/B,GAAImD,CAAAA,EAAa,IAAA,CACf,OAAO,EAAC,CAGV,GAAI,CAAC,KAAA,CAAM,QAAQA,CAAQ,CAAA,CACzB,MAAM,IAAI,KAAA,CACR,mCAAmC,OAAOA,CAAQ,CAAA,UAAA,EAAaqT,CAAI,CAAA,CACrE,CAAA,CAUF,OAAO+K,EAAAA,CAAgBpe,CAAmB,CAC5C,CAAA,CACA,MAAA,CAAQqiB,GAAchP,CAAI,CAAA,CAC1B,OAAA,CAAA+J,CAAAA,CACA,gBAAA,CAAkB,CAChB,OAAQ,MAAA,CACR,QAAA,CAAU,MACZ,CAAA,CACA,gBAAA,CAAmB5B,GAAsB,CAMvC,IAAM2E,CAAAA,CAAO3E,CAAAA,GAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAC3C,GAAK2E,EAIL,OAAO,CAAE,OAAQA,CAAAA,CAAK,MAAA,CAAQ,SAAUA,CAAAA,CAAK,QAAS,CACxD,CACF,CAAC,CACH,CAEO,SAASyC,GACdvP,CAAAA,CACAkM,CAAAA,CAAuB,EAAA,CACvBC,CAAAA,CAAyB,EAAA,CACzB5vB,CAAAA,CAAgB,GAChBkU,CAAAA,CAAc,EAAA,CACd4J,EAAmB,EAAA,CACnB0P,CAAAA,CAAU,KACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,eAAA,CAAgBkC,CAAAA,CAAMkM,EAAcC,CAAAA,CAAgB5vB,CAAAA,CAAOkU,EAAK4J,CAAQ,CAAA,CAClG,OAAA,CAAA0P,CAAAA,CACA,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAvgB,CAAO,EAAI,EAAC,GAAa,CACzC,IAAI8lB,CAAAA,CAAe7e,EACfkJ,CAAAA,CAAO,cAAA,CAAe,KAAMsB,CAAAA,EAAUA,CAAAA,CAAM,KAAKxK,CAAG,CAAC,IACvD6e,CAAAA,CAAe,EAAA,CAAA,CAGjB,IAAM3iB,CAAAA,CAAW,MAAMsf,EAAAA,CACrBjM,EACAkM,CAAAA,CACAC,CAAAA,CACA5vB,EACA+yB,CAAAA,CACAjV,CAAAA,CACA7Q,CACF,CAAA,CAEA,OAAOuhB,EAAAA,CAAgBpe,CAAAA,EAAY,EAAE,CACvC,CACF,CAAC,CACH,CCxJO,SAAS6iB,EAAAA,CACdrgB,CAAAA,CACA4Q,CAAAA,CACAxjB,EAAQ,GAAA,CACR,CACA,OAAOshB,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,QAAQ3O,CAAAA,EAAY,EAAA,CAAI5S,CAAK,CAAA,CACvD,OAAA,CAAS,UACW,MAAM6O,CAAAA,CAAQ,iCAAkC,CAChE+D,CAAAA,EAAY4Q,CAAAA,CACZ,CAAA,CACAxjB,CACF,CAAC,GAGE,MAAA,CACE,CAAA,EACC,EAAE,MAAA,GAAWwjB,CAAAA,EACb,CAAC,CAAA,CAAE,YAAA,CAAa,UAAA,CAAW,OAAO,CACtC,CAAA,CACC,IAAK,CAAA,GAAO,CAAE,OAAQ,CAAA,CAAE,MAAA,CAAQ,SAAU,CAAA,CAAE,QAAS,CAAA,CAAE,CAAA,CAE5D,OAAA,CAAS,CAAC,CAAC5Q,CACb,CAAC,CACH,CCnCO,SAASsgB,EAAAA,CAA2B/P,CAAAA,CAAiBC,EAAmB,CAC7E,OAAO9B,aAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,WAAA,CAAY4B,CAAAA,EAAU,EAAA,CAAIC,CAAAA,EAAY,EAAE,EAClE,OAAA,CAAS,SAAY,CACnB,GAAI,CAACD,GAAU,CAACC,CAAAA,CACd,OAAO,EAAC,CAGV,IAAMhT,EAAY,MAAMvB,CAAAA,CAAQ,iCAAkC,CAACsU,CAAAA,CAAQC,CAAQ,CAAC,CAAA,CAEpF,OAAO,KAAA,CAAM,OAAA,CAAQhT,CAAQ,EAAIA,CAAAA,CAAW,EAC9C,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CACzB,CAAC,CACH,CCjBO,SAAS+P,EAAAA,CAAyB3P,CAAAA,CAAoCpb,CAAAA,CAAe,CAC1F,OAAOkZ,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,SAAA,CAAUiC,CAAc,CAAA,CAClD,OAAA,CAAS,SAAY,CACnB,GAAI,CAACA,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,EAAC,CAIV,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,wBAAA,CAA0B,CAChF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAhV,CACF,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,8BAA8BA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGjE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,QAAS,CAAC,CAACoT,GAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CAEO,SAASgrB,EAAAA,CACd5P,CAAAA,CACApb,EACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,iBAAA,CAAkBiC,CAAAA,CAAgBxjB,CAAK,CAAA,CACjE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,EAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,CACL,IAAA,CAAM,GACN,UAAA,CAAY,CACV,KAAA,CAAO,CAAA,CACP,KAAA,CAAApI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7B,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,UAAU1rB,CAAK,CAAA,CAAA,CAChG,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAoI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,8BAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,IAAMub,CAAAA,CAAO,MAAMvb,CAAAA,CAAS,IAAA,GAC5B,OAAO4Q,EAAAA,CAAqC2K,EAAM3rB,CAAK,CACzD,CAAA,CACA,gBAAA,CAAkB,CAAA,CAClB,gBAAA,CAAmB4rB,GAAa,CAC9B,GAAIA,EAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,OAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,CAAA,CACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CC/EO,SAASirB,GAAsB7P,CAAAA,CAAoCpb,CAAAA,CAAe,CACvF,OAAOkZ,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,MAAA,CAAOiC,CAAc,EAC/C,OAAA,CAAS,SAAY,CACnB,GAAI,CAACA,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,EAAC,CAIV,IAAMgI,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,sBAAuB,CAC7E,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,KAAAhV,CACF,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,2BAA2BA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG9D,OAAOA,EAAS,IAAA,EAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAACoT,GAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CAEO,SAASkrB,EAAAA,CACd9P,EACApb,CAAAA,CACApI,CAAAA,CAAgB,GAChB,CACA,OAAOyrB,qBAAqB,CAC1B,QAAA,CAAUlK,EAAU,KAAA,CAAM,cAAA,CAAeiC,CAAAA,CAAgBxjB,CAAK,CAAA,CAC9D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,EAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,CACL,IAAA,CAAM,GACN,UAAA,CAAY,CACV,MAAO,CAAA,CACP,KAAA,CAAApI,CAAAA,CACA,MAAA,CAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,EAAGzD,EAAO,cAAc,CAAA,0CAAA,EAA6CsO,CAAS,CAAA,OAAA,EAAU1rB,CAAK,GAC7F,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAoI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,2BAA2BA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG9D,IAAMub,CAAAA,CAAO,MAAMvb,CAAAA,CAAS,IAAA,GAG5B,OAAO4Q,EAAAA,CAAkC2K,EAAM3rB,CAAK,CACtD,EACA,gBAAA,CAAkB,CAAA,CAClB,iBAAmB4rB,CAAAA,EAAa,CAC9B,GAAIA,CAAAA,CAAS,UAAA,CAAW,SACtB,OAAOA,CAAAA,CAAS,WAAW,MAAA,CAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,CAAA,CACA,OAAA,CAAS,CAAC,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CCjFA,eAAemrB,GAAgBnrB,CAAAA,CAAgD,CAE7E,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,sBAAuB,CAC7E,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CACF,CAAC,CACH,CAAC,EAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,wBAAA,EAA2BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG9D,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAEO,SAASojB,EAAAA,CAAsB5gB,EAAmBxK,CAAAA,CAAe,CACtE,OAAOkZ,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAA,CACzC,OAAA,CAAS,SACH,CAACA,CAAAA,EAAY,CAACxK,CAAAA,CACT,GAEFmrB,EAAAA,CAAgBnrB,CAAI,EAE7B,OAAA,CAAS,CAAC,CAACwK,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CAEO,SAASqrB,EAAAA,CAA6BjQ,CAAAA,CAAoCpb,CAAAA,CAAe,CAC9F,OAAOkZ,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,cAAciC,CAAc,CAAA,CACtD,OAAA,CAAS,SACH,CAACA,CAAAA,EAAkB,CAACpb,CAAAA,CACf,GAEFmrB,EAAAA,CAAgBnrB,CAAI,EAE7B,OAAA,CAAS,CAAC,CAACob,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CAEO,SAASsrB,EAAAA,CACd9gB,EACAxK,CAAAA,CACApI,CAAAA,CAAgB,GAChB,CACA,OAAOyrB,qBAAqB,CAC1B,QAAA,CAAUlK,EAAU,KAAA,CAAM,cAAA,CAAe3O,EAAU5S,CAAK,CAAA,CACxD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,EAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAC9Y,GAAY,CAACxK,CAAAA,CAChB,OAAO,CACL,IAAA,CAAM,GACN,UAAA,CAAY,CACV,MAAO,CAAA,CACP,KAAA,CAAApI,EACA,MAAA,CAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,EAAGzD,EAAO,cAAc,CAAA,0CAAA,EAA6CsO,CAAS,CAAA,OAAA,EAAU1rB,CAAK,GAC7F,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,KAAAoI,CACF,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,2BAA2BA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG9D,IAAMub,EAAO,MAAMvb,CAAAA,CAAS,IAAA,EAAK,CACjC,OAAO4Q,EAAAA,CAAsC2K,EAAM3rB,CAAK,CAC1D,EACA,gBAAA,CAAkB,CAAA,CAClB,iBAAmB4rB,CAAAA,EAAa,CAC9B,GAAIA,CAAAA,CAAS,UAAA,CAAW,SACtB,OAAOA,CAAAA,CAAS,WAAW,MAAA,CAASA,CAAAA,CAAS,WAAW,KAG5D,CAAA,CACA,OAAA,CAAS,CAAC,CAAChZ,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CC/FO,SAASurB,EAAAA,CAA8BxQ,CAAAA,CAAgBC,EAAkBO,CAAAA,CAAW,KAAA,CAAO,CAChG,OAAOrC,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe4B,CAAAA,CAAQC,CAAAA,CAAUO,CAAQ,CAAA,CACnE,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA1W,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,+BAAgC,CACnF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,OAAA+F,CAAAA,CACA,QAAA,CAAAC,EACA,QAAA,CAAUO,CAAAA,CAAW,GAAA,CAAM,EAC7B,CAAC,CAAA,CACD,OAAA1W,CACF,CAAC,EAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGvE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CACzB,CAAC,CACH,CCzBA,SAASwQ,EAAAA,CAAczQ,CAAAA,CAAgBC,EAA0B,CAC/D,IAAMyQ,EAAc1Q,CAAAA,EAAQ,IAAA,GACtB2L,CAAAA,CAAgB1L,CAAAA,EAAU,IAAA,EAAK,CAErC,GAAI,CAACyQ,GAAe,CAAC/E,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA,CAIxE,IAAMgF,CAAAA,CAAmBD,CAAAA,CAAY,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAChDE,CAAAA,CAAqBjF,EAAc,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAAA,CAE3D,GAAI,CAACgF,CAAAA,EAAoB,CAACC,EACxB,MAAM,IAAI,MAAM,6EAA6E,CAAA,CAG/F,OAAO,CAAA,CAAA,EAAID,CAAgB,CAAA,CAAA,EAAIC,CAAkB,CAAA,CACnD,CAQO,SAASC,EAAAA,CAA4B7Q,CAAAA,CAAgBC,EAAkB,CAC5E,IAAM0L,EAAgB1L,CAAAA,EAAU,IAAA,EAAK,CAC/ByQ,CAAAA,CAAc1Q,CAAAA,EAAQ,IAAA,GACtB8Q,CAAAA,CACJ,CAAC,CAACJ,CAAAA,EAAe,CAAC,CAAC/E,CAAAA,EAAiBA,CAAAA,GAAkB,WAAA,CAElD5L,CAAAA,CAAY+Q,CAAAA,CAAUL,EAAAA,CAAcC,EAAa/E,CAAa,CAAA,CAAI,GAExE,OAAOxN,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,YAAA,CAAa2B,CAAS,EAChD,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAjW,CAAO,IAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,8BAAA,CAAgC,CACnF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,MAAA,CAAA+F,CAAAA,CACA,SAAU2L,CAAAA,EAAiB,EAC7B,CAAC,CAAA,CACD,MAAA,CAAA7hB,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,oCAAoCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGvE,OAAOA,EAAS,IAAA,EAClB,EACA,MAAA,CAAS8jB,CAAAA,EAAiC,CACxC,GAAI,CAACA,CAAAA,EAAS,IAAA,GAAO,CAAC,CAAA,CACpB,OAAO,IAAA,CAET,GAAM,CAAE,IAAA,CAAApnB,CAAAA,CAAM,MAAAqnB,CAAAA,CAAO,IAAA,CAAArG,CAAK,CAAA,CAAIoG,CAAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAC5C,OAAO,CACL,IAAA,CAAApnB,CAAAA,CACA,MAAAqnB,CAAAA,CACA,IAAA,CAAArG,CACF,CACF,CAAA,CACA,OAAA,CAASmG,CACX,CAAC,CACH,CCpDO,SAASG,GAAwBjR,CAAAA,CAAgBC,CAAAA,CAAkBiR,EAAY,IAAA,CAAM,CAC1F,OAAO/S,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,IAAA,CAAK4B,CAAAA,CAAQC,CAAQ,CAAA,CAC/C,QAAS,SAAY,CACnB,IAAMtT,CAAAA,CAAO,CAAA,uBAAA,EAA0B,mBAAmBqT,CAAM,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmBC,CAAQ,CAAC,GAC3FhT,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiBtN,EAAM,CACzD,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,EAED,GAAI,CAACM,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,EAAS,MAAM,CAAA,CAAE,EAGjE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CAAAA,EAAYiR,EACnC,SAAA,CAAW,EAAA,CAAK,GAClB,CAAC,CACH,CClCA,SAASC,EAAAA,CAAmB9H,EAAwB9O,CAAAA,CAAyB,CAC3E,OAAO,CACL,GAAG8O,CAAAA,CACH,GAAIA,CAAAA,CAAM,EAAA,EAAMA,EAAM,OAAA,CAEtB,OAAA,CAASA,EAAM,OAAA,EAAYA,CAAAA,CAA4C,UACvE,IAAA,CAAA9O,CACF,CACF,CAEA,SAAS6W,GAAgB/H,CAAAA,CAA+B,CACtD,OAAO,CACL,GAAGA,CAAAA,CACH,EAAA,CAAIA,CAAAA,CAAM,EAAA,EAAMA,EAAM,OACxB,CACF,CAEO,SAASgI,EAAAA,CACdhI,EAIA9O,CAAAA,CACkB,CAClB,GAAI,CAAC8O,CAAAA,CACH,OAAO,KAGT,IAAMiI,CAAAA,CAAkBjI,EAAM,SAAA,EAAaA,CAAAA,CACrCkI,EAAYJ,EAAAA,CAAmBG,CAAAA,CAAiB/W,CAAI,CAAA,CAEpDiX,CAAAA,CAASnI,CAAAA,CAAM,OAAS+H,EAAAA,CAAgB/H,CAAAA,CAAM,MAAM,CAAA,CAAI,MAAA,CAE9D,OAAO,CACL,GAAGA,EACH,EAAA,CAAIA,CAAAA,CAAM,IAAMA,CAAAA,CAAM,OAAA,CAItB,QAASA,CAAAA,CAAM,OAAA,EAAYA,EAA4C,SAAA,CAIvE,mBAAA,CAAqBA,CAAAA,CAAM,mBAAA,EAAuB,iBAAA,CAClD,oBAAA,CAAsBA,EAAM,oBAAA,EAAwB,WAAA,CACpD,oBAAqBA,CAAAA,CAAM,mBAAA,EAAuB,YAClD,oBAAA,CAAsBA,CAAAA,CAAM,oBAAA,EAAwB,WAAA,CACpD,IAAA,CAAA9O,CAAAA,CACA,UAAAgX,CAAAA,CACA,MAAA,CAAAC,CACF,CACF,CAEO,SAASC,EAAAA,CAAa/K,CAAAA,CAAqB,CAChD,OAAO,KAAA,CAAM,OAAA,CAAQA,CAAC,CAAA,CAAKA,CAAAA,CAAgB,EAC7C,CAEA,eAAsBgL,EAAAA,CACpBH,CAAAA,CACkB,CAClB,IAAMpT,CAAAA,CAAesQ,GAA2B8C,CAAAA,CAAAA,SAAAA,CAA8B,IAAI,EAC5EI,CAAAA,CAAqB,MAAM1X,EAAO,WAAA,CAAY,UAAA,CAAWkE,CAAY,CAAA,CACrEyT,CAAAA,CAAkBH,EAAAA,CAAaE,CAAkB,CAAA,CAEvD,GAAIC,EAAgB,MAAA,EAAU,CAAA,CAC5B,OAAO,EAAC,CAGV,IAAMC,CAAAA,CAAkBD,CAAAA,CAAgB,MAAA,CACtC,CAAC,CAAE,aAAA,CAAAE,EAAe,eAAA,CAAAC,CAAgB,IAChCD,CAAAA,GAAkBP,CAAAA,CAAU,MAAA,EAAUQ,CAAAA,GAAoBR,CAAAA,CAAU,QACxE,EAEA,OAAIM,CAAAA,CAAgB,SAAW,CAAA,CACtB,GAGYA,CAAAA,CAAgB,MAAA,CAAQnwB,GAAS,CAACA,CAAAA,CAAK,OAAO,IAAI,CAGzE,CAEO,SAASswB,EAAAA,CACdC,EACAV,CAAAA,CACAhX,CAAAA,CACa,CACb,OAAI0X,CAAAA,CAAM,MAAA,GAAW,EACZ,EAAC,CAGHA,EACJ,GAAA,CAAKvwB,CAAAA,EAAS,CACb,IAAM8vB,CAAAA,CAASS,CAAAA,CAAM,IAAA,CAClBv3B,CAAAA,EACCA,CAAAA,CAAE,SAAWgH,CAAAA,CAAK,aAAA,EAClBhH,EAAE,QAAA,GAAagH,CAAAA,CAAK,iBACpBhH,CAAAA,CAAE,MAAA,GAAW6f,CACjB,CAAA,CAEA,OAAO,CACL,GAAG7Y,CAAAA,CACH,EAAA,CAAIA,EAAK,OAAA,CACT,IAAA,CAAA6Y,EACA,SAAA,CAAAgX,CAAAA,CACA,OAAAC,CACF,CACF,CAAC,CAAA,CACA,MAAA,CAAQnI,GAAUA,CAAAA,CAAM,SAAA,CAAU,UAAYA,CAAAA,CAAM,OAAO,CAAA,CAC3D,IAAA,CACC,CAACjpB,CAAAA,CAAGtF,IAAM,IAAI,IAAA,CAAKA,EAAE,OAAO,CAAA,CAAE,SAAQ,CAAI,IAAI,IAAA,CAAKsF,CAAAA,CAAE,OAAO,CAAA,CAAE,SAChE,CACJ,CCjHA,IAAM8xB,EAAAA,CAAqB,GAuC3B,SAASC,EAAAA,CAAgB5oB,CAAAA,CAA+C,CACtE,OAAO,CACL,WAAYA,CAAAA,CAAO,UAAA,EAAc,EAAC,CAClC,GAAA,CAAKA,EAAO,GAAA,EAAK,IAAA,IAAU,MAAA,CAC3B,SAAA,CAAWA,EAAO,SAAA,EAAW,IAAA,GAAO,WAAA,EAAY,EAAK,OACrD,MAAA,CAAQA,CAAAA,CAAO,MAAA,EAAQ,IAAA,EAAK,CAAE,WAAA,IAAiB,MAAA,CAC/C,QAAA,CAAUA,EAAO,QAAA,EAAU,IAAA,GAAO,WAAA,EAAY,EAAK,MAAA,CACnD,KAAA,CAAOA,CAAAA,CAAO,KAAA,EAAS2oB,EACzB,CACF,CAEA,eAAeE,EAAAA,CACb,CAAE,WAAAC,CAAAA,CAAY,GAAA,CAAAthB,CAAAA,CAAK,SAAA,CAAA4P,CAAAA,CAAW,MAAA,CAAAX,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA9d,CAAM,CAAA,CACtDy1B,EACAxoB,CAAAA,CAC2B,CAC3B,IAAM4C,CAAAA,CAAUyN,CAAAA,CAAc,qBAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,yBAAA,CAA2BoD,CAAO,CAAA,CACtDpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,CAAS,MAAA,CAAOzM,CAAK,CAAC,CAAA,CACvCy1B,GACFhpB,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAUgpB,CAAM,CAAA,CAEvCD,CAAAA,CAAW,OAAA,CAASd,CAAAA,EAAcjoB,EAAI,YAAA,CAAa,MAAA,CAAO,YAAaioB,CAAS,CAAC,EAC7ExgB,CAAAA,EACFzH,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAA,CAAOyH,CAAG,EAE7B4P,CAAAA,EACFrX,CAAAA,CAAI,aAAa,GAAA,CAAI,WAAA,CAAaqX,CAAS,CAAA,CAEzCX,CAAAA,EACF1W,EAAI,YAAA,CAAa,GAAA,CAAI,SAAU0W,CAAM,CAAA,CAEnCrF,GACFrR,CAAAA,CAAI,YAAA,CAAa,IAAI,UAAA,CAAYqR,CAAQ,CAAA,CAG3C,IAAM1N,CAAAA,CAAW,MAAM,MAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQ,MACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+BA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGlE,IAAMpO,CAAAA,CAAQ,MAAMoO,EAAS,IAAA,EAAK,CAElC,OAAI,CAAC,KAAA,CAAM,QAAQpO,CAAI,CAAA,EAAKA,EAAK,MAAA,GAAW,CAAA,CACnC,EAAC,CAGHA,CAAAA,CACJ,IAAK0zB,CAAAA,EAAQ,CACZ,IAAMlJ,CAAAA,CAAQgI,EAAAA,CAA0BkB,CAAAA,CAAKA,CAAAA,CAAI,IAAA,EAAQ,EAAE,EAC3D,OAAKlJ,CAAAA,CAGE,CAAE,GAAGA,CAAAA,CAAO,QAASkJ,CAAAA,CAAI,OAAQ,CAAA,CAF/B,IAGX,CAAC,CAAA,CACA,OAAQlJ,CAAAA,EAAmC,CAAA,CAAQA,CAAM,CAC9D,CAWO,SAASmJ,EAAAA,CAAyBjpB,CAAAA,CAA0B,EAAC,CAAG,CACrE,IAAMkpB,EAAaN,EAAAA,CAAgB5oB,CAAM,EACnC,CAAE,UAAA,CAAA8oB,EAAY,GAAA,CAAAthB,CAAAA,CAAK,UAAA4P,CAAAA,CAAW,MAAA,CAAAX,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA9d,CAAM,CAAA,CAAI41B,EAEhE,OAAOnK,oBAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,UAAU,CAAE,UAAA,CAAAiU,EAAY,GAAA,CAAAthB,CAAAA,CAAK,UAAA4P,CAAAA,CAAW,MAAA,CAAAX,CAAAA,CAAQ,QAAA,CAAArF,CAAAA,CAAU,KAAA,CAAA9d,CAAM,CAAC,CAAA,CAC3F,iBAAkB,MAAA,CAElB,OAAA,CAAS,CAAC,CAAE,SAAA,CAAA0rB,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAMsoB,GAAmBK,CAAAA,CAAYlK,CAAAA,CAAWze,CAAM,CAAA,CAMpF,gBAAA,CAAmB2e,GAA+B,CAChD,GAAI,EAAAA,CAAAA,CAAS,MAAA,CAAS5rB,GAGtB,OAAO4rB,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,GAAG,OACxC,CACF,CAAC,CACH,CAOO,SAASiK,GAA+BnpB,CAAAA,CAA0B,GAAI,CAC3E,IAAMkpB,EAAaN,EAAAA,CAAgB5oB,CAAM,CAAA,CACnC,CAAE,UAAA,CAAA8oB,CAAAA,CAAY,IAAAthB,CAAAA,CAAK,SAAA,CAAA4P,EAAW,MAAA,CAAAX,CAAAA,CAAQ,SAAArF,CAAAA,CAAU,KAAA,CAAA9d,CAAM,CAAA,CAAI41B,CAAAA,CAEhE,OAAOtU,aAAa,CAClB,QAAA,CAAU,CACR,GAAGC,CAAAA,CAAU,MAAM,SAAA,CAAU,CAAE,WAAAiU,CAAAA,CAAY,GAAA,CAAAthB,EAAK,SAAA,CAAA4P,CAAAA,CAAW,OAAAX,CAAAA,CAAQ,QAAA,CAAArF,EAAU,KAAA,CAAA9d,CAAM,CAAC,CAAA,CACpF,QACF,CAAA,CACA,UAAW,CAAA,CACX,OAAA,CAAS,CAAC,CAAE,MAAA,CAAAiN,CAAO,CAAA,GAAMsoB,EAAAA,CAAmBK,CAAAA,CAAY,MAAA,CAAW3oB,CAAM,CAC3E,CAAC,CACH,CCtJA,IAAMooB,EAAAA,CAAqB,EAAA,CAgD3B,SAASC,EAAAA,CAAgB5oB,CAAAA,CAAkD,CACzE,OAAO,CACL,WAAYA,CAAAA,CAAO,UAAA,EAAc,EAAC,CAClC,GAAA,CAAKA,EAAO,GAAA,EAAK,IAAA,IAAU,MAAA,CAC3B,MAAA,CAAQA,EAAO,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY,EAAK,MAAA,CAC/C,QAAA,CAAUA,CAAAA,CAAO,QAAA,EAAU,MAAK,CAAE,WAAA,IAAiB,MAAA,CACnD,KAAA,CAAOA,EAAO,KAAA,EAAS2oB,EACzB,CACF,CAEA,eAAeS,EAAAA,CACb,CAAE,UAAA,CAAAN,CAAAA,CAAY,IAAAthB,CAAAA,CAAK,MAAA,CAAAiP,EAAQ,QAAA,CAAArF,CAAAA,CAAU,KAAA,CAAA9d,CAAM,CAAA,CAC3Cy1B,CAAAA,CACAxoB,EAC4B,CAC5B,IAAM4C,EAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,2BAAA,CAA6BoD,CAAO,EACxDpD,CAAAA,CAAI,YAAA,CAAa,IAAI,OAAA,CAAS,MAAA,CAAOzM,CAAK,CAAC,CAAA,CACvCy1B,CAAAA,EACFhpB,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAUgpB,CAAM,CAAA,CAEvCD,EAAW,OAAA,CAASd,CAAAA,EAAcjoB,EAAI,YAAA,CAAa,MAAA,CAAO,WAAA,CAAaioB,CAAS,CAAC,CAAA,CAC7ExgB,GACFzH,CAAAA,CAAI,YAAA,CAAa,IAAI,KAAA,CAAOyH,CAAG,EAE7BiP,CAAAA,EACF1W,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,CAAU0W,CAAM,EAEnCrF,CAAAA,EACFrR,CAAAA,CAAI,aAAa,GAAA,CAAI,UAAA,CAAYqR,CAAQ,CAAA,CAG3C,IAAM1N,EAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,OAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,6BAAA,EAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,IAAMpO,CAAAA,CAAQ,MAAMoO,CAAAA,CAAS,MAAK,CAElC,OAAI,CAAC,KAAA,CAAM,OAAA,CAAQpO,CAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,CACnC,EAAC,CAGHA,EACJ,GAAA,CAAK0zB,CAAAA,EAAQ,CACZ,IAAMlJ,CAAAA,CAAQgI,GAA0BkB,CAAAA,CAAKA,CAAAA,CAAI,MAAQ,EAAE,CAAA,CAC3D,OAAKlJ,CAAAA,CAGE,CACL,GAAGA,CAAAA,CAIH,YAAA,CAAcA,EAAM,YAAA,EAAgB,EAAC,CACrC,KAAA,CAAOkJ,CAAAA,CAAI,KAAA,CACX,QAASA,CAAAA,CAAI,OACf,EAVS,IAWX,CAAC,EACA,MAAA,CAAQlJ,CAAAA,EAAoC,EAAQA,CAAM,CAC/D,CAUO,SAASuJ,EAAAA,CAA0BrpB,EAA2B,EAAC,CAAG,CACvE,IAAMkpB,CAAAA,CAAaN,EAAAA,CAAgB5oB,CAAM,CAAA,CACnC,CAAE,WAAA8oB,CAAAA,CAAY,GAAA,CAAAthB,EAAK,MAAA,CAAAiP,CAAAA,CAAQ,SAAArF,CAAAA,CAAU,KAAA,CAAA9d,CAAM,CAAA,CAAI41B,CAAAA,CAErD,OAAOnK,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,WAAW,CAAE,UAAA,CAAAiU,CAAAA,CAAY,GAAA,CAAAthB,CAAAA,CAAK,MAAA,CAAAiP,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA9d,CAAM,CAAC,EACjF,gBAAA,CAAkB,MAAA,CAElB,OAAA,CAAS,CAAC,CAAE,SAAA,CAAA0rB,EAAW,MAAA,CAAAze,CAAO,IAAM6oB,EAAAA,CAAoBF,CAAAA,CAAYlK,EAAWze,CAAM,CAAA,CAIrF,gBAAA,CAAmB2e,CAAAA,EAAgC,CACjD,GAAI,EAAAA,CAAAA,CAAS,MAAA,CAAS5rB,GAGtB,OAAO4rB,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,GAAG,OACxC,CACF,CAAC,CACH,CCzIA,IAAMoK,EAAAA,CAA8B,CAAA,CAC9BC,EAAAA,CAAyB,EAAA,CAM/B,eAAeC,GACbxY,CAAAA,CACAgO,CAAAA,CAC+B,CAC/B,IAAIpI,CAAAA,CAAcoI,GAAW,MAAA,CACzBnI,CAAAA,CAAgBmI,CAAAA,EAAW,QAAA,CAC3ByK,CAAAA,CAAoB,CAAA,CACpBC,EAAkB1K,CAAAA,EAAW,OAAA,CAEjC,KAAOyK,CAAAA,CAAoBF,EAAAA,EAAwB,CASjD,IAAMI,CAAAA,CAAgC,CACpC,IAAA,CAAM,OAAA,CACN,OAAA,CAAS3Y,EACT,KAAA,CAAOsY,EAAAA,CACP,GAAI1S,CAAAA,CAAc,CAAE,aAAcA,CAAY,CAAA,CAAI,EAAC,CACnD,GAAIC,EAAgB,CAAE,cAAA,CAAgBA,CAAc,CAAA,CAAI,EAC1D,CAAA,CAEIiS,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAc,MAAM3mB,EAAQ,0BAAA,CAA4BwnB,CAAS,EACnE,CAAA,MAASvqB,CAAAA,CAAK,CACZ,OAAA,OAAA,CAAQ,KAAA,CAAM,2CAAA,CAA6CA,CAAG,CAAA,CACvD,IACT,CAEA,GAAI,CAAC0pB,GAAcA,CAAAA,CAAW,MAAA,GAAW,EACvC,OAAO,IAAA,CAGT,IAAMc,CAAAA,CAAuBd,CAAAA,CAAW,GAAA,CAAKd,IAC3CA,CAAAA,CAAU,EAAA,CAAKA,EAAU,OAAA,CACzBA,CAAAA,CAAU,KAAOhX,CAAAA,CACVgX,CAAAA,CACR,EAED,IAAA,IAAWA,CAAAA,IAAa4B,EAAsB,CAC5C,GAAIF,GAAmB1B,CAAAA,CAAU,OAAA,GAAY0B,EAAiB,CAC5DA,CAAAA,CAAkB,MAAA,CAClB,QACF,CAIA,GAFAD,GAAqB,CAAA,CAEjBzB,CAAAA,CAAU,OAAO,IAAA,CAAM,CACzBpR,EAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,CAAAA,CAAU,QAAA,CAC1B,QACF,CAEA,IAAI6B,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAe,MAAM1B,EAAAA,CAAgCH,CAAS,EAChE,CAAA,MAAS5oB,CAAAA,CAAK,CAMZ,QAAQ,KAAA,CAAM,wCAAA,CAA0CA,CAAG,CAAA,CAC3DwX,CAAAA,CAAcoR,EAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,EAAU,QAAA,CAC1B,QACF,CAEA,GAAI6B,CAAAA,CAAa,SAAW,CAAA,CAAG,CAC7BjT,EAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,CAAAA,CAAU,QAAA,CAC1B,QACF,CAEA,OAAO,CACL,QAASS,EAAAA,CAA4BoB,CAAAA,CAAc7B,EAAWhX,CAAI,CACpE,CACF,CAEA,IAAM8Y,CAAAA,CAAgBF,EAAqBA,CAAAA,CAAqB,MAAA,CAAS,CAAC,CAAA,CAE1E,GAAI,CAACE,CAAAA,CACH,OAAO,IAAA,CAGTlT,CAAAA,CAAckT,CAAAA,CAAc,MAAA,CAC5BjT,EAAgBiT,CAAAA,CAAc,SAChC,CAEA,OAAO,IACT,CAMO,SAASC,EAAAA,CAA2B/Y,EAAc,CACvD,OAAO+N,qBAML,CACA,QAAA,CAAUlK,EAAU,KAAA,CAAM,WAAA,CAAY7D,CAAI,CAAA,CAC1C,gBAAA,CAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,UAAAgO,CAAU,CAAA,GAAkC,CAC5D,IAAMvtB,CAAAA,CAAS,MAAM+3B,EAAAA,CAAWxY,CAAAA,CAAMgO,CAAS,CAAA,CAC/C,OAAKvtB,CAAAA,CAEEA,EAAO,OAAA,CAFM,EAGtB,CAAA,CAEA,gBAAA,CAAmBytB,GAAqCA,CAAAA,GAAW,CAAC,CAAA,EAAG,SACzE,CAAC,CACH,CC9HA,IAAM8K,GAAyB,EAAA,CAExB,SAASC,GAA0BjZ,CAAAA,CAAcxJ,CAAAA,CAAalU,EAAQ02B,EAAAA,CAAwB,CACnG,OAAOjL,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,UAAA,CAAW7D,CAAAA,CAAMxJ,CAAG,CAAA,CAC9C,iBAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAjH,CAAO,CAAA,GAAM,CAC7B,GAAI,CACF,IAAM4C,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5C7Q,EAAM,IAAI,GAAA,CAAI,0BAA2BoD,CAAO,CAAA,CACtDpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,CAAaiR,CAAI,CAAA,CACtCjR,CAAAA,CAAI,aAAa,GAAA,CAAI,KAAA,CAAOyH,CAAG,CAAA,CAE/B,IAAM9D,EAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAUpE,OAAA,CAPa,MAAMA,EAAS,IAAA,EAAK,EAG9B,MAAM,CAAA,CAAGpQ,CAAK,CAAA,CACd,GAAA,CAAKwsB,CAAAA,EAAUgI,EAAAA,CAA0BhI,EAAO9O,CAAI,CAAC,EACrD,MAAA,CAAQ8O,CAAAA,EAA8B,EAAQA,CAAM,CAAA,CAEzC,KACZ,CAACjpB,CAAAA,CAAGtF,IAAM,IAAI,IAAA,CAAKA,EAAE,OAAO,CAAA,CAAE,SAAQ,CAAI,IAAI,IAAA,CAAKsF,CAAAA,CAAE,OAAO,CAAA,CAAE,SAChE,CACF,OAASsC,CAAAA,CAAO,CACd,eAAQ,KAAA,CAAM,oCAAA,CAAsCA,CAAK,CAAA,CAClD,EACT,CACF,CAAA,CAEA,gBAAA,CAAkB,IAAG,CAAA,CACvB,CAAC,CACH,CC5CO,SAAS+wB,GAA8BlZ,CAAAA,CAAc9K,CAAAA,CAAmB,CAC7E,IAAMikB,CAAAA,CAAqBjkB,GAAU,IAAA,EAAK,CAAE,aAAY,CAExD,OAAO6Y,qBAAqB,CAC1B,QAAA,CAAUlK,EAAU,KAAA,CAAM,cAAA,CAAe7D,EAAMmZ,CAAAA,EAAsB,EAAE,CAAA,CACvE,OAAA,CAAS,CAAA,CAAQA,CAAAA,CACjB,iBAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA5pB,CAAO,CAAA,GAAM,CAC7B,GAAI,CAAC4pB,CAAAA,CACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAMhnB,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,8BAAA,CAAgCoD,CAAO,CAAA,CAC3DpD,CAAAA,CAAI,aAAa,GAAA,CAAI,WAAA,CAAaiR,CAAI,CAAA,CACtCjR,CAAAA,CAAI,aAAa,GAAA,CAAI,UAAA,CAAYoqB,CAAkB,CAAA,CAEnD,IAAMzmB,EAAW,MAAM,KAAA,CAAM3D,EAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyCA,EAAS,MAAM,CAAA,CAAE,EAG5E,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,EAAK,CAEjC,GAAI,CAAC,KAAA,CAAM,QAAQpO,CAAI,CAAA,EAAKA,EAAK,MAAA,GAAW,CAAA,CAC1C,OAAO,EAAC,CAGV,IAAM80B,CAAAA,CAAY90B,CAAAA,CACf,IAAKwqB,CAAAA,EAAUgI,EAAAA,CAA0BhI,EAAO9O,CAAI,CAAC,CAAA,CACrD,MAAA,CAAQ8O,CAAAA,EAA8B,CAAA,CAAQA,CAAM,CAAA,CAEvD,OAAIsK,EAAU,MAAA,GAAW,CAAA,CAChB,EAAC,CAGHA,CAAAA,CAAU,IAAA,CACf,CAACvzB,CAAAA,CAAGtF,CAAAA,GAAM,IAAI,IAAA,CAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,GAAY,IAAI,IAAA,CAAKsF,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAChE,CACF,CAAA,MAASsC,EAAO,CACd,OAAA,OAAA,CAAQ,MAAM,4CAAA,CAA8CA,CAAK,EAC1D,EACT,CACF,CAAA,CAEA,gBAAA,CAAkB,IAAG,CAAA,CACvB,CAAC,CACH,CC1DO,SAASkxB,GAAiCrZ,CAAAA,CAAekG,CAAAA,CAAQ,GAAI,CAE1E,IAAM8Q,EAAYhX,CAAAA,EAAM,IAAA,EAAK,EAAK,MAAA,CAElC,OAAO4D,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,iBAAA,CAAkBmT,CAAAA,EAAa,GAAI9Q,CAAK,CAAA,CAClE,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA3W,CAAO,CAAA,GAAkC,CACzD,GAAI,CACF,IAAM4C,EAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,kCAAA,CAAoCoD,CAAO,EAC3D6kB,CAAAA,EACFjoB,CAAAA,CAAI,aAAa,GAAA,CAAI,WAAA,CAAaioB,CAAS,CAAA,CAE7CjoB,CAAAA,CAAI,YAAA,CAAa,IAAI,OAAA,CAASmX,CAAAA,CAAM,UAAU,CAAA,CAE9C,IAAMxT,CAAAA,CAAW,MAAM,KAAA,CAAM3D,CAAAA,CAAI,QAAA,EAAS,CAAG,CAC3C,MAAA,CAAQ,KAAA,CACR,OAAAQ,CACF,CAAC,EAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,qCAAA,EAAwCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAK3E,QAFa,MAAMA,CAAAA,CAAS,MAAK,EAErB,GAAA,CAAI,CAAC,CAAE,GAAA,CAAA8D,EAAK,KAAA,CAAAqb,CAAM,KAAO,CAAE,GAAA,CAAArb,CAAAA,CAAK,KAAA,CAAAqb,CAAM,CAAA,CAAE,CACtD,CAAA,MAAS1pB,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,4CAA6CA,CAAK,CAAA,CACzD,EACT,CACF,CACF,CAAC,CACH,CC/BO,SAASmxB,EAAAA,CAA8BtZ,CAAAA,CAAc9K,CAAAA,CAAmB,CAC7E,IAAMikB,EAAqBjkB,CAAAA,EAAU,IAAA,GAAO,WAAA,EAAY,CAExD,OAAO6Y,oBAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,eAAe7D,CAAAA,CAAMmZ,CAAAA,EAAsB,EAAE,CAAA,CACvE,OAAA,CAAS,EAAQA,CAAAA,CACjB,gBAAA,CAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,OAAA5pB,CAAO,CAAA,GAAM,CAC7B,GAAI,CAAC4pB,EACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAMhnB,EAAUyN,CAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,4BAAA,CAA8BoD,CAAO,CAAA,CACzDpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,YAAaiR,CAAI,CAAA,CACtCjR,EAAI,YAAA,CAAa,GAAA,CAAI,WAAYoqB,CAAkB,CAAA,CAEnD,IAAMzmB,CAAAA,CAAW,MAAM,MAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQ,MACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsCA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGzE,IAAMpO,CAAAA,CAAO,MAAMoO,EAAS,IAAA,EAAK,CAEjC,GAAI,CAAC,KAAA,CAAM,QAAQpO,CAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAC1C,OAAO,EAAC,CAGV,IAAM80B,EAAY90B,CAAAA,CACf,GAAA,CAAKwqB,GAAUgI,EAAAA,CAA0BhI,CAAAA,CAAO9O,CAAI,CAAC,CAAA,CACrD,OAAQ8O,CAAAA,EAA8B,CAAA,CAAQA,CAAM,CAAA,CAEvD,OAAIsK,EAAU,MAAA,GAAW,CAAA,CAChB,EAAC,CAGHA,CAAAA,CAAU,IAAA,CACf,CAACvzB,CAAAA,CAAGtF,CAAAA,GAAM,IAAI,IAAA,CAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAAQ,CAAI,IAAI,IAAA,CAAKsF,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAChE,CACF,CAAA,MAASsC,EAAO,CACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAA,CAA2CA,CAAK,CAAA,CACxDA,CACR,CACF,CAAA,CAEA,iBAAkB,IAAG,CAAA,CACvB,CAAC,CACH,CC5DO,SAASoxB,EAAAA,CAAoCvZ,EAAc,CAChE,OAAO4D,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,oBAAA,CAAqB7D,CAAI,EACnD,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAzQ,CAAO,IAAqC,CAC5D,GAAI,CACF,IAAM4C,CAAAA,CAAUyN,CAAAA,CAAc,qBAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,qCAAA,CAAuCoD,CAAO,CAAA,CAClEpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,CAAaiR,CAAI,EAEtC,IAAMtN,CAAAA,CAAW,MAAM,KAAA,CAAM3D,CAAAA,CAAI,UAAS,CAAG,CAC3C,OAAQ,KAAA,CACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,GACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2CA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAK9E,OAAA,CAFa,MAAMA,CAAAA,CAAS,IAAA,IAEhB,GAAA,CAAI,CAAC,CAAE,MAAA,CAAA+S,CAAAA,CAAQ,KAAA,CAAAoM,CAAM,CAAA,IAAO,CAAE,OAAApM,CAAAA,CAAQ,KAAA,CAAAoM,CAAM,CAAA,CAAE,CAC5D,CAAA,MAAS1pB,CAAAA,CAAO,CACd,MAAA,OAAA,CAAQ,MAAM,8CAAA,CAAgDA,CAAK,EAC7DA,CACR,CACF,CACF,CAAC,CACH,CC1BO,SAASqxB,GACd/H,CAAAA,CACA3B,CAAAA,CAAU,KACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,SAAA,CAAU4N,CAAAA,EAAM,QAAU,EAAA,CAAIA,CAAAA,EAAM,UAAY,EAAE,CAAA,CAC5E,OAAA,CAAS3B,CAAAA,EAAW,CAAC,CAAC2B,EACtB,OAAA,CAAS,SAAYqB,GAAcrB,CAAI,CACzC,CAAC,CACH,CCsBA,SAASgI,EAAAA,CAAQtN,CAAAA,CAAwB,CACvC,OACE,CAAC,CAACA,GACF,OAAOA,CAAAA,EAAM,UACb,QAAA,GAAYA,CAAAA,EACZ,aAAcA,CAAAA,EACd,cAAA,GAAkBA,CAEtB,CAKA,SAASuN,GAAQC,CAAAA,CAA6B,CAC5C,IAAMC,CAAAA,CAAO,IAAI,IAAA,CAAKD,CAAW,CAAA,CAGjC,OAAA,CAFY,IAAI,IAAA,EAAK,CACF,SAAQ,CAAIC,CAAAA,CAAK,SAAQ,GAC3B,GAAA,CAAO,EAAA,CAAK,EAAA,CAAK,EAAA,CACpC,CAUO,SAASC,EAAAA,CACd3kB,CAAAA,CACApB,EAKA,CACA,GAAM,CAAE,KAAA,CAAAxR,CAAAA,CAAQ,EAAA,CAAI,OAAA,CAAAw3B,CAAAA,CAAU,GAAI,QAAA,CAAAC,CAAAA,CAAW,CAAI,CAAA,CAAIjmB,CAAAA,EAAW,EAAC,CAEjE,OAAOia,qBAML,CACA,QAAA,CAAUlK,EAAU,QAAA,CAAS,WAAA,CAAY3O,EAAU5S,CAAK,CAAA,CACxD,iBAAkB,CAAE,KAAA,CAAO,EAAG,CAAA,CAE9B,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,IAA2C,CACrE,GAAM,CAAE,KAAA,CAAAprB,CAAM,CAAA,CAAIorB,CAAAA,CAEZtb,CAAAA,CAAY,MAAMvB,EAAQ,mCAAA,CAAqC,CAAC+D,EAAUtS,CAAAA,CAAON,CAAAA,CAAO,GAAGw3B,CAAO,CAAC,CAAA,CAQnGr5B,CAAAA,CANqCiS,CAAAA,CAAS,GAAA,CAAI,CAAC,CAACye,CAAAA,CAAK6I,CAAU,CAAA,IAAO,CAC9E,GAAGA,CAAAA,CAAW,EAAA,CAAG,CAAC,CAAA,CAClB,GAAA,CAAA7I,EACA,SAAA,CAAW6I,CAAAA,CAAW,SACxB,CAAA,CAAE,CAAA,CAE2B,OAC1BC,CAAAA,EACCA,CAAAA,CAAS,KAAA,GAAU/kB,CAAAA,EACnB+kB,CAAAA,CAAS,MAAA,GAAW,GACpBP,EAAAA,CAAQO,CAAAA,CAAS,SAAS,CAAA,EAAKF,CACnC,EAEMG,CAAAA,CAAmB,EAAC,CAC1B,IAAA,IAAWtiB,CAAAA,IAAOnX,CAAAA,CAAQ,CACxB,IAAMgxB,CAAAA,CAAO,MAAM/R,CAAAA,CAAO,WAAA,CAAY,WACpCwR,EAAAA,CAAoBtZ,CAAAA,CAAI,MAAA,CAAQA,CAAAA,CAAI,QAAQ,CAC9C,EACI6hB,EAAAA,CAAQhI,CAAI,GAAGyI,CAAAA,CAAQ,IAAA,CAAKzI,CAAI,EACtC,CAEA,GAAM,CAAC0I,CAAY,EAAIznB,CAAAA,CAEvB,OAAO,CACL,QAAA,CAAUynB,CAAAA,CAAeT,GAAQS,CAAAA,CAAa,CAAC,CAAA,CAAE,SAAS,CAAA,CAAI,CAAA,CAC9D,gBAAiBA,CAAAA,CAAeA,CAAAA,CAAa,CAAC,CAAA,CAAIv3B,CAAAA,CAClD,QAAAs3B,CACF,CACF,CAAA,CAEA,gBAAA,CAAmBhM,CAAAA,GAAqD,CACtE,MAAOA,CAAAA,CAAS,eAClB,EACF,CAAC,CACH,CCtHO,SAASkM,EAAAA,CACdxT,EACAxG,CAAAA,CACA0P,CAAAA,CAAU,KACV,CACA,OAAOlM,aAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,QAAA,CAAS+C,EAAUxG,CAAAA,EAAY,EAAE,EAC9D,OAAA,CAAS0P,CAAAA,EAAWlJ,EAAS,MAAA,CAAS,CAAA,CACtC,OAAA,CAAS,SAAYuM,EAAAA,CAAYvM,CAAAA,CAAUxG,CAAQ,CACrD,CAAC,CACH,CCkBO,SAASia,EAAAA,CACdnlB,CAAAA,CACA8S,CAAAA,CAA4B,OAC5BH,CAAAA,CAAW,GAAA,CACX,CACA,OAAOkG,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,MAAA,CAAO,cAAA,CACzB3O,CAAAA,EAAY,EAAA,CACZ8S,EACAH,CACF,CAAA,CACA,iBAAkB,IAAA,CAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAmG,EAAW,MAAA,CAAAze,CAAO,IAAM,CACxC,GAAI,CAAC2F,CAAAA,CACH,OAAO,CAAE,OAAA,CAAS,EAAC,CAAG,WAAA,CAAa,CAAE,CAAA,CAGvC,IAAMlG,CAAAA,CAA0C,CAC9C,eAAgBkG,CAAAA,CAChB,WAAA,CAAa8S,EACb,WAAA,CAAaH,CAAAA,CACb,SAAA,CAAW,MACb,CAAA,CAIImG,CAAAA,GAAc,OAChBhf,CAAAA,CAAO,IAAA,CAAOgf,GAGhB,IAAMtb,CAAAA,CAAY,MAAMZ,EAAAA,CACtB,SAAA,CACA,0CAAA,CACA9C,CAAAA,CACA,MAAA,CACA,MAAA,CACAO,CACF,CAAA,CAEA,OAAO,CACL,OAAA,CAASmD,CAAAA,CAAS,kBAClB,WAAA,CAAasb,CAAAA,EAAatb,EAAS,WACrC,CACF,EAEA,gBAAA,CAAmBwb,CAAAA,EAAa,CAE9B,IAAMqB,CAAAA,CAAWrB,EAAS,WAAA,CAAc,CAAA,CACxC,OAAOqB,CAAAA,EAAY,CAAA,CAAIA,CAAAA,CAAW,MACpC,CAAA,CAEA,OAAA,CAAS,CAAC,CAACra,CACb,CAAC,CACH,CC7EO,SAASolB,EAAAA,CACdplB,CAAAA,CACA8S,EAA4B,MAAA,CAC5BC,CAAAA,CAA6C,SAC7C,CACA,OAAOrE,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,OAAO,iBAAA,CACzB3O,CAAAA,EAAY,GACZ8S,CAAAA,CACAC,CACF,EAEA,OAAA,CAAS,SACF/S,EAIG,MAAMpD,EAAAA,CACZ,UACA,6CAAA,CACA,CACE,eAAgBoD,CAAAA,CAChB,WAAA,CAAa8S,EACb,WAAA,CAAAC,CACF,CACF,CAAA,CAXS,EAAC,CAcZ,QAAS,CAAC,CAAC/S,EACX,SAAA,CAAW,GACb,CAAC,CACH,CC1BO,SAASqlB,EAAAA,EAA4B,CAC1C,OAAO3W,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,UAAA,EAAW,CACxC,OAAA,CAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,0BAAA,CAA4B,CAC/E,OAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,gCAAgCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGnE,OAAOA,EAAS,IAAA,EAClB,CAAA,CACA,SAAA,CAAW,GAAA,CAAS,GACtB,CAAC,CACH,CAGO,SAAS8nB,EAAAA,CAAcC,CAAAA,CAAiC,CAC7D,OAAO,IAAI,GAAA,CAAA,CAAKA,CAAAA,EAAW,EAAC,EAAG,IAAKC,CAAAA,EAAMA,CAAAA,CAAE,aAAa,CAAC,CAC5D,CCmBO,SAASC,GACdzlB,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,IAAM6d,EAAcC,cAAAA,EAAe,CAE7B,CAAE,IAAA,CAAAv2B,CAAK,CAAA,CAAIie,QAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE9D,OAAO+I,EACL,CAAC,UAAA,CAAY,QAAQ,CAAA,CACrB/I,CAAAA,CACCmJ,CAAAA,EAA8B,CAQ7B,IAAMnD,CAAAA,CAAUgQ,GACd0P,CAAAA,CAAY,YAAA,CACV/Q,EAA2B3U,CAAQ,CAAA,CAAE,QACvC,CAAA,CACA5Q,CACF,CAAA,CAEA,GAAI,CAAC4W,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,2DAAsD,CAAA,CAGxE,OAAO,CACL,CACE,iBAAA,CACA,CACE,OAAA,CAAShG,CAAAA,CACT,cAAe,EAAA,CACf,UAAA,CAAY,EAAC,CAIb,qBAAA,CAAuBqW,GAAyB,CAC9C,2BAAA,CAA6BrQ,CAAAA,CAAQ,qBAAA,CACrC,OAAA,CAASmD,CAAAA,CAAQ,QACjB,MAAA,CAAQA,CAAAA,CAAQ,MAClB,CAAC,CACH,CACF,CACF,CACF,EACA,MAAOyc,CAAAA,CAAgBC,IAAgC,CAErDH,CAAAA,CAAY,aACV/Q,CAAAA,CAA2B3U,CAAQ,EAAE,QAAA,CACpC5Q,CAAAA,EAAS,CACR,GAAI,CAACA,CAAAA,CACH,OAAOA,CAAAA,CAGT,IAAMsT,EAAM,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAUtT,CAAI,CAAC,CAAA,CAC3C,OAAAsT,EAAI,OAAA,CAAUgU,EAAAA,CAAqB,CACjC,eAAA,CAAiBX,EAAAA,CAAsB3mB,CAAI,CAAA,CAC3C,OAAA,CAASy2B,CAAAA,CAAU,OAAA,CACnB,MAAA,CAAQA,CAAAA,CAAU,MACpB,CAAC,CAAA,CAEMnjB,CACT,CACF,CAAA,CAGA,MAAM+G,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAC,EACH,EACAyH,CAAAA,CACA,MAAA,CACA,CACE,aAAA,CAAAI,CAAAA,CAMA,QAAA,CAAU,SAAY,CACpB,GAAK7H,EAGL,GAAI,CACF,MAAM0lB,CAAAA,CAAY,UAAA,CAAW,CAC3B,GAAG/Q,CAAAA,CAA2B3U,CAAQ,CAAA,CACtC,SAAA,CAAW,CACb,CAAC,EACH,MAAQ,CAER,CACF,CACF,CACF,CACF,CC3JO,SAAS8lB,EAAAA,CACdlU,EACAjlB,CAAAA,CACA8a,CAAAA,CACAwB,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,YAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,UAAA,CAAY,SAAU0I,CAAAA,CAAWjlB,CAAM,CAAA,CACjE,UAAA,CAAY,MAAOq5B,CAAAA,EAAe,CAChC,IAAMC,CAAAA,CAAiBxN,GACrB7G,CAAAA,CACAjlB,CACF,EACA,MAAMkgB,CAAAA,GAAiB,aAAA,CAAcoZ,CAAc,EACnD,IAAMC,CAAAA,CAAiBrZ,GAAe,CAAE,YAAA,CACtCoZ,EAAe,QACjB,CAAA,CAEA,OAAA,MAAM3c,EAAAA,CACJsI,CAAAA,CACA,QAAA,CACA,CACA,QAAA,CACA,CACE,SAAUA,CAAAA,CACV,SAAA,CAAWjlB,EACX,IAAA,CAAM,CACJ,GAAIq5B,CAAAA,GAAS,eAAA,EAAmB,CAACE,GAAgB,OAAA,CAC7C,CAAC,QAAQ,CAAA,CACT,GACJ,GAAIF,CAAAA,GAAS,eAAA,EAAmB,CAACE,CAAAA,EAAgB,OAAA,CAC7C,CAAC,MAAM,CAAA,CACP,EACN,CACF,CACA,CAAA,CACAze,CACF,EAEO,CACL,GAAGye,EACH,OAAA,CACEF,CAAAA,GAAS,gBACL,CAACE,CAAAA,EAAgB,QACjBA,CAAAA,EAAgB,OAAA,CACtB,OAAA,CACEF,CAAAA,GAAS,eAAA,CACL,CAACE,GAAgB,OAAA,CACjBA,CAAAA,EAAgB,OACxB,CACF,CAAA,CACA,QAAAH,CAAAA,CACA,SAAA,CAAU32B,CAAAA,CAAM,CACd6Z,CAAAA,CAAU7Z,CAAI,EAEdyd,CAAAA,EAAe,CAAE,aACf8B,CAAAA,CAAU,QAAA,CAAS,UAAUiD,CAAAA,CAAYjlB,CAAO,CAAA,CAChDyC,CACF,CAAA,CAIIzC,CAAAA,EACFkgB,GAAe,CAAE,iBAAA,CACf8H,EAA2BhoB,CAAM,CACnC,EAEJ,CACF,CAAC,CACH,CC/DO,SAASw5B,GACdnU,CAAAA,CACAzB,CAAAA,CACAC,EACA4V,CAAAA,CACW,CACX,GAAI,CAACpU,CAAAA,EAAS,CAACzB,CAAAA,EAAU,CAACC,CAAAA,CACxB,MAAM,IAAI,KAAA,CAAM,gDAAgD,CAAA,CAElE,GAAI4V,EAAS,IAAA,EAAUA,CAAAA,CAAS,GAAA,CAC9B,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,MAAA,CACA,CACE,MAAApU,CAAAA,CACA,MAAA,CAAAzB,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,MAAA,CAAA4V,CACF,CACF,CACF,CAaO,SAASC,EAAAA,CACd9V,EACAC,CAAAA,CACA8V,CAAAA,CACAC,EACAhF,CAAAA,CACArnB,CAAAA,CACAgd,EACW,CAEX,GAAI,CAAC3G,CAAAA,EAAU,CAACC,GAAY+V,CAAAA,GAAmB,MAAA,EAAa,CAACrsB,CAAAA,CAC3D,MAAM,IAAI,MAAM,mDAAmD,CAAA,CAGrE,OAAO,CACL,SAAA,CACA,CACE,aAAA,CAAeosB,CAAAA,CACf,eAAA,CAAiBC,CAAAA,CACjB,MAAA,CAAAhW,CAAAA,CACA,SAAAC,CAAAA,CACA,KAAA,CAAA+Q,EACA,IAAA,CAAArnB,CAAAA,CACA,cAAe,IAAA,CAAK,SAAA,CAAUgd,CAAY,CAC5C,CACF,CACF,CAaO,SAASsP,EAAAA,CACdjW,EACAC,CAAAA,CACAiW,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACAC,EACW,CACX,GAAI,CAACtW,CAAAA,EAAU,CAACC,EACd,MAAM,IAAI,MAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,OAAAD,CAAAA,CACA,QAAA,CAAAC,EACA,mBAAA,CAAqBiW,CAAAA,CACrB,YAAaC,CAAAA,CACb,WAAA,CAAaC,CAAAA,CACb,sBAAA,CAAwBC,CAAAA,CACxB,UAAA,CAAAC,CACF,CACF,CACF,CAQO,SAASC,EAAAA,CAAqBvW,EAAgBC,CAAAA,CAA6B,CAChF,GAAI,CAACD,CAAAA,EAAU,CAACC,EACd,MAAM,IAAI,MAAM,yDAAyD,CAAA,CAG3E,OAAO,CACL,gBAAA,CACA,CACE,MAAA,CAAAD,CAAAA,CACA,SAAAC,CACF,CACF,CACF,CAUO,SAASuW,GACd/gB,CAAAA,CACAuK,CAAAA,CACAC,CAAAA,CACAwW,CAAAA,CAAwB,KAAA,CACb,CACX,GAAI,CAAChhB,CAAAA,EAAW,CAACuK,CAAAA,EAAU,CAACC,EAC1B,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAGpE,IAAMuI,EAAY,CAChB,OAAA,CAAA/S,EACA,MAAA,CAAAuK,CAAAA,CACA,SAAAC,CACF,CAAA,CAEA,OAAIwW,CAAAA,GACFjO,CAAAA,CAAK,MAAA,CAAS,UAGT,CACL,aAAA,CACA,CACE,EAAA,CAAI,QAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,QAAA,CAAUA,CAAI,CAAC,CAAA,CACrC,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAC/S,CAAO,CAClC,CACF,CACF,CC9JO,SAASihB,GACdzjB,CAAAA,CACAC,CAAAA,CACA3S,EACAiS,CAAAA,CACW,CACX,GAAI,CAACS,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAGtE,OAAO,CACL,UAAA,CACA,CACE,IAAA,CAAA0S,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,OAAA3S,CAAAA,CACA,IAAA,CAAMiS,GAAQ,EAChB,CACF,CACF,CAUO,SAASmkB,GACd1jB,CAAAA,CACA2jB,CAAAA,CACAr2B,EACAiS,CAAAA,CACa,CACb,GAAI,CAACS,CAAAA,EAAQ,CAAC2jB,CAAAA,EAAgB,CAACr2B,CAAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAU5E,OANkBq2B,EACf,IAAA,EAAK,CACL,MAAM,QAAQ,CAAA,CACd,MAAA,CAAO,OAAO,CAAA,CAGA,GAAA,CAAKC,GACpBH,EAAAA,CAAgBzjB,CAAAA,CAAM4jB,EAAK,IAAA,EAAK,CAAGt2B,EAAQiS,CAAI,CACjD,CACF,CAYO,SAASskB,EAAAA,CACd7jB,EACAC,CAAAA,CACA3S,CAAAA,CACAiS,EACAukB,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAAC/jB,GAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,6DAA6D,EAE/E,GAAIw2B,CAAAA,CAAa,EAAA,CACf,MAAM,IAAI,KAAA,CAAM,sEAAsE,CAAA,CAGxF,OAAO,CACL,oBAAA,CACA,CACE,KAAA9jB,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,MAAA,CAAA3S,CAAAA,CACA,IAAA,CAAMiS,GAAQ,EAAA,CACd,UAAA,CAAAukB,EACA,UAAA,CAAAC,CAAAA,CACA,WAAY,EACd,CACF,CACF,CAUO,SAASC,GACdhkB,CAAAA,CACAC,CAAAA,CACA3S,EACAiS,CAAAA,CACW,CACX,GAAI,CAACS,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,EACnB,MAAM,IAAI,MAAM,6DAA6D,CAAA,CAG/E,OAAO,CACL,qBAAA,CACA,CACE,IAAA,CAAA0S,CAAAA,CACA,EAAA,CAAAC,EACA,MAAA,CAAA3S,CAAAA,CACA,KAAMiS,CAAAA,EAAQ,EAChB,CACF,CACF,CAWO,SAAS0kB,EAAAA,CACdjkB,CAAAA,CACAC,CAAAA,CACA3S,EACAiS,CAAAA,CACA2kB,CAAAA,CACW,CACX,GAAI,CAAClkB,GAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,EAAU42B,CAAAA,GAAc,MAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,+DAA+D,CAAA,CAGjF,OAAO,CACL,uBAAA,CACA,CACE,KAAAlkB,CAAAA,CACA,EAAA,CAAAC,EACA,MAAA,CAAA3S,CAAAA,CACA,KAAMiS,CAAAA,EAAQ,EAAA,CACd,WAAY2kB,CACd,CACF,CACF,CAQO,SAASC,EAAAA,CACdnkB,EACAkkB,CAAAA,CACW,CACX,GAAI,CAAClkB,CAAAA,EAAQkkB,IAAc,MAAA,CACzB,MAAM,IAAI,KAAA,CAAM,qEAAqE,CAAA,CAGvF,OAAO,CACL,8BAAA,CACA,CACE,IAAA,CAAAlkB,CAAAA,CACA,WAAYkkB,CACd,CACF,CACF,CAYO,SAASE,EAAAA,CACdpkB,EACAC,CAAAA,CACA3S,CAAAA,CACAiS,EACA2kB,CAAAA,CACa,CACb,GAAI,CAAClkB,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,GAAU42B,CAAAA,GAAc,MAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACLD,EAAAA,CAA2BjkB,CAAAA,CAAMC,CAAAA,CAAI3S,EAAQiS,CAAAA,CAAM2kB,CAAS,EAC5DC,EAAAA,CAAiCnkB,CAAAA,CAAMkkB,CAAS,CAClD,CACF,CASO,SAASG,EAAAA,CACdrkB,CAAAA,CACAC,EACA3S,CAAAA,CACW,CACX,GAAI,CAAC0S,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA,CAG/E,OAAO,CACL,qBAAA,CACA,CACE,KAAA0S,CAAAA,CACA,EAAA,CAAAC,EACA,MAAA,CAAA3S,CACF,CACF,CACF,CAQO,SAASg3B,EAAAA,CACd9hB,CAAAA,CACA+hB,EACW,CACX,GAAI,CAAC/hB,CAAAA,EAAW,CAAC+hB,CAAAA,CACf,MAAM,IAAI,KAAA,CAAM,2DAA2D,CAAA,CAG7E,OAAO,CACL,kBAAA,CACA,CACE,OAAA,CAAA/hB,CAAAA,CACA,cAAA,CAAgB+hB,CAClB,CACF,CACF,CASO,SAASC,EAAAA,CACdC,CAAAA,CACAC,EACAH,CAAAA,CACW,CACX,GAAI,CAACE,CAAAA,EAAa,CAACC,GAAa,CAACH,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,yBAAA,CACA,CACE,UAAAE,CAAAA,CACA,SAAA,CAAAC,EACA,cAAA,CAAgBH,CAClB,CACF,CACF,CAUO,SAASI,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,EACAC,CAAAA,CACW,CACX,GAAI,CAACH,CAAAA,EAAe,CAACC,CAAAA,EAAaC,CAAAA,GAAY,OAC5C,MAAM,IAAI,MAAM,mEAAmE,CAAA,CAErF,GAAIA,CAAAA,CAAU,CAAA,EAAKA,EAAU,GAAA,CAC3B,MAAM,IAAI,KAAA,CAAM,2EAA2E,CAAA,CAG7F,OAAO,CACL,4BAAA,CACA,CACE,YAAA,CAAcF,CAAAA,CACd,WAAYC,CAAAA,CACZ,OAAA,CAAAC,EACA,SAAA,CAAWC,CACb,CACF,CACF,CASO,SAASC,EAAAA,CACdzjB,CAAAA,CACAjU,EACA42B,CAAAA,CACW,CACX,GAAI,CAAC3iB,CAAAA,EAAS,CAACjU,GAAU42B,CAAAA,GAAc,MAAA,CACrC,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAGrE,OAAO,CACL,SAAA,CACA,CACE,KAAA,CAAA3iB,EACA,MAAA,CAAAjU,CAAAA,CACA,UAAW42B,CACb,CACF,CACF,CASO,SAASe,EAAAA,CACd1jB,CAAAA,CACAjU,CAAAA,CACA42B,CAAAA,CACW,CACX,GAAI,CAAC3iB,GAAS,CAACjU,CAAAA,EAAU42B,IAAc,MAAA,CACrC,MAAM,IAAI,KAAA,CAAM,iEAAiE,EAGnF,OAAO,CACL,yBACA,CACE,KAAA,CAAA3iB,EACA,MAAA,CAAAjU,CAAAA,CACA,SAAA,CAAW42B,CACb,CACF,CACF,CAUO,SAASgB,EAAAA,CACdllB,EACAmlB,CAAAA,CACAC,CAAAA,CACAC,EAAe,QAAA,CACJ,CACX,OAAO,CAAC,aAAA,CAAe,CACrB,GAAI,kBAAA,CACJ,cAAA,CAAgB,CAACrlB,CAAI,CAAA,CACrB,uBAAwB,EAAC,CACzB,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,aAAAqlB,CAAAA,CAAc,cAAA,CAAAF,EAAgB,eAAA,CAAAC,CAAgB,CAAC,CACxE,CAAC,CACH,CAQO,SAASE,GACd9iB,CAAAA,CACA1N,CAAAA,CACW,CACX,OAAO,CAAC,cAAe,CACrB,EAAA,CAAI,kBAAA,CACJ,cAAA,CAAgB,EAAC,CACjB,uBAAwB,CAAC0N,CAAO,EAChC,IAAA,CAAM,IAAA,CAAK,UAAU1N,CAAAA,CAAO,GAAA,CAAKvH,CAAAA,GAAY,CAAE,MAAA,CAAAA,CAAO,EAAE,CAAC,CAC3D,CAAC,CACH,CASO,SAASg4B,EAAAA,CACdvlB,CAAAA,CACAwlB,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACzlB,CAAAA,EAAQ,CAACwlB,GAAcC,CAAAA,GAAU,MAAA,CACpC,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA,CAGxE,IAAMC,EAAiBF,CAAAA,CAAW,QAAA,CAAS,GAAG,CAAA,CAC1CA,CAAAA,CAAW,MAAM,GAAG,CAAA,CAAE,GAAA,CAAKnxB,CAAAA,EAAMA,CAAAA,CAAE,IAAA,EAAM,CAAA,CACzC,CAACmxB,CAAU,CAAA,CAEf,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,IAAA,CACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,aAAA,CACA,CACE,IAAA,CAAAxlB,CAAAA,CACA,WAAY0lB,CAAAA,CACZ,MAAA,CAAQD,CACV,CACF,CAAC,CAAA,CACD,eAAgB,EAAC,CACjB,uBAAwB,CAACzlB,CAAI,CAC/B,CACF,CACF,CCtbO,SAAS2lB,EAAAA,CAAc7X,EAAkBJ,CAAAA,CAA8B,CAC5E,GAAI,CAACI,CAAAA,EAAY,CAACJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAGpE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,QAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,QAAA,CACA,CACE,QAAA,CAAAI,EACA,SAAA,CAAAJ,CAAAA,CACA,KAAM,CAAC,MAAM,CACf,CACF,CAAC,CAAA,CACD,cAAA,CAAgB,EAAC,CACjB,uBAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAAS8X,EAAAA,CAAgB9X,EAAkBJ,CAAAA,CAA8B,CAC9E,GAAI,CAACI,CAAAA,EAAY,CAACJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAGtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,QAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,QAAA,CACA,CACE,QAAA,CAAAI,CAAAA,CACA,SAAA,CAAAJ,CAAAA,CACA,KAAM,EACR,CACF,CAAC,CAAA,CACD,eAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAAS+X,EAAAA,CAAc/X,CAAAA,CAAkBJ,EAA8B,CAC5E,GAAI,CAACI,CAAAA,EAAY,CAACJ,EAChB,MAAM,IAAI,MAAM,kDAAkD,CAAA,CAGpE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,QAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,SACA,CACE,QAAA,CAAAI,EACA,SAAA,CAAAJ,CAAAA,CACA,IAAA,CAAM,CAAC,QAAQ,CACjB,CACF,CAAC,CAAA,CACD,eAAgB,EAAC,CACjB,uBAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAASgY,EAAAA,CAAgBhY,CAAAA,CAAkBJ,EAA8B,CAC9E,GAAI,CAACI,CAAAA,EAAY,CAACJ,EAChB,MAAM,IAAI,MAAM,oDAAoD,CAAA,CAGtE,OAAOkY,EAAAA,CAAgB9X,CAAAA,CAAUJ,CAAS,CAC5C,CAQO,SAASqY,EAAAA,CAAoBvpB,CAAAA,CAAkBwpB,CAAAA,CAA4B,CAChF,GAAI,CAACxpB,EACH,MAAM,IAAI,MAAM,wDAAwD,CAAA,CAG1E,IAAMypB,CAAAA,CAAeD,CAAAA,EAAQ,IAAI,MAAK,CAAE,WAAA,GAAc,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAE5DE,CAAAA,CAAsB,CAC1B,aAAA,CACA,CACE,GAAI,QAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CAAC,cAAe,CAAE,IAAA,CAAMD,CAAa,CAAC,CAAC,EAC5D,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACzpB,CAAQ,CACnC,CACF,CAAA,CAEM2pB,CAAAA,CAA4B,CAChC,aAAA,CACA,CACE,EAAA,CAAI,eAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,aAAA,CAAe,CAAE,IAAA,CAAMF,CAAa,CAAC,CAAC,EAC5D,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACzpB,CAAQ,CACnC,CACF,CAAA,CAEA,OAAO,CAAC0pB,CAAAA,CAAUC,CAAc,CAClC,CChIO,SAASC,EAAAA,CACd5jB,CAAAA,CACAyM,EACAoX,CAAAA,CACW,CACX,GAAI,CAAC7jB,CAAAA,EAAW,CAACyM,CAAAA,EAAWoX,CAAAA,GAAY,OACtC,MAAM,IAAI,MAAM,uDAAuD,CAAA,CAGzE,OAAO,CACL,sBAAA,CACA,CACE,QAAA7jB,CAAAA,CACA,OAAA,CAAAyM,EACA,OAAA,CAAAoX,CACF,CACF,CACF,CAQO,SAASC,EAAAA,CAAoB9jB,CAAAA,CAAiB+jB,CAAAA,CAA0B,CAC7E,GAAI,CAAC/jB,GAAW+jB,CAAAA,GAAU,MAAA,CACxB,MAAM,IAAI,KAAA,CAAM,wDAAwD,CAAA,CAG1E,OAAO,CACL,wBACA,CACE,OAAA,CAAA/jB,EACA,KAAA,CAAA+jB,CACF,CACF,CACF,CAoBO,SAASC,EAAAA,CACdC,CAAAA,CACA9gB,EACW,CAEX,GACE,CAAC8gB,CAAAA,EACD,CAAC9gB,EAAQ,QAAA,EACT,CAACA,CAAAA,CAAQ,OAAA,EACT,CAACA,CAAAA,CAAQ,UACT,CAACA,CAAAA,CAAQ,OACT,CAACA,CAAAA,CAAQ,KACT,CAACA,CAAAA,CAAQ,QAAA,CAET,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAI5E,IAAMkK,EAAY,IAAI,IAAA,CAAKlK,EAAQ,KAAK,CAAA,CAClCmK,CAAAA,CAAU,IAAI,IAAA,CAAKnK,CAAAA,CAAQ,GAAG,CAAA,CACpC,GAAIkK,EAAU,QAAA,EAAS,GAAM,gBAAkBC,CAAAA,CAAQ,QAAA,KAAe,cAAA,CACpE,MAAM,IAAI,KAAA,CACR,gGACF,EAGF,OAAO,CACL,kBACA,CACE,OAAA,CAAA2W,CAAAA,CACA,QAAA,CAAU9gB,CAAAA,CAAQ,QAAA,CAClB,WAAYA,CAAAA,CAAQ,KAAA,CACpB,SAAUA,CAAAA,CAAQ,GAAA,CAClB,UAAWA,CAAAA,CAAQ,QAAA,CACnB,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,QAAA,CAAUA,EAAQ,QAAA,CAClB,UAAA,CAAY,EACd,CACF,CACF,CASO,SAAS+gB,EAAAA,CACdlY,CAAAA,CACAmY,CAAAA,CACAN,CAAAA,CACW,CACX,GAAI,CAAC7X,GAAS,CAACmY,CAAAA,EAAeA,EAAY,MAAA,GAAW,CAAA,EAAKN,IAAY,MAAA,CACpE,MAAM,IAAI,KAAA,CAAM,wDAAwD,EAG1E,OAAO,CACL,wBACA,CACE,KAAA,CAAA7X,CAAAA,CACA,YAAA,CAAcmY,CAAAA,CACd,OAAA,CAAAN,EACA,UAAA,CAAY,EACd,CACF,CACF,CAQO,SAASO,EAAAA,CACdC,CAAAA,CACAF,CAAAA,CACW,CACX,GAAI,CAACE,CAAAA,EAAiB,CAACF,GAAeA,CAAAA,CAAY,MAAA,GAAW,EAC3D,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,eAAgBE,CAAAA,CAChB,YAAA,CAAcF,EACd,UAAA,CAAY,EACd,CACF,CACF,CAWO,SAASG,EAAAA,CACdvY,EACAkY,CAAAA,CACAM,CAAAA,CACAC,EACAha,CAAAA,CACW,CAGX,GAEEuB,CAAAA,EAAe,IAAA,EACf,OAAOA,GAAe,QAAA,EACtB,CAACkY,GACD,CAACM,CAAAA,EACD,CAACC,CAAAA,EACD,CAACha,CAAAA,CAED,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,YAAauB,CAAAA,CACb,OAAA,CAAAkY,CAAAA,CACA,SAAA,CAAWM,CAAAA,CACX,OAAA,CAAAC,EACA,QAAA,CAAAha,CAAAA,CACA,WAAY,EACd,CACF,CACF,CC/LO,SAASia,EAAAA,CAAiBzqB,CAAAA,CAAkB+d,EAA8B,CAC/E,GAAI,CAAC/d,CAAAA,EAAY,CAAC+d,EAChB,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAGvE,OAAO,CACL,aAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CAAC,WAAA,CAAa,CAAE,SAAA,CAAAA,CAAU,CAAC,CAAC,CAAA,CACjD,eAAgB,EAAC,CACjB,uBAAwB,CAAC/d,CAAQ,CACnC,CACF,CACF,CAQO,SAAS0qB,EAAAA,CAAmB1qB,CAAAA,CAAkB+d,EAA8B,CACjF,GAAI,CAAC/d,CAAAA,EAAY,CAAC+d,EAChB,MAAM,IAAI,MAAM,uDAAuD,CAAA,CAGzE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,cAAe,CAAE,SAAA,CAAAA,CAAU,CAAC,CAAC,EACnD,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAAC/d,CAAQ,CACnC,CACF,CACF,CAUO,SAAS2qB,GACd3qB,CAAAA,CACA+d,CAAAA,CACA/X,CAAAA,CACA9F,CAAAA,CACW,CACX,GAAI,CAACF,CAAAA,EAAY,CAAC+d,GAAa,CAAC/X,CAAAA,EAAW,CAAC9F,CAAAA,CAC1C,MAAM,IAAI,KAAA,CACR,CAAA,4DAAA,EAA+DF,CAAQ,CAAA,YAAA,EAAe+d,CAAS,aAAa/X,CAAO,CAAA,OAAA,EAAU9F,CAAI,CAAA,CACnI,CAAA,CAGF,OAAO,CACL,aAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CAAC,UAAW,CAAE,SAAA,CAAA6d,CAAAA,CAAW,OAAA,CAAA/X,CAAAA,CAAS,IAAA,CAAA9F,CAAK,CAAC,CAAC,EAC9D,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACF,CAAQ,CACnC,CACF,CACF,CAqBO,SAAS4qB,EAAAA,CACd5qB,EACA+d,CAAAA,CACAve,CAAAA,CACW,CACX,GAAI,CAACQ,GAAY,CAAC+d,CAAAA,EAAa,CAACve,CAAAA,CAC9B,MAAM,IAAI,KAAA,CAAM,2DAA2D,EAG7E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,aAAA,CAAe,CAAE,UAAAue,CAAAA,CAAW,KAAA,CAAAve,CAAM,CAAC,CAAC,CAAA,CAC1D,eAAgB,EAAC,CACjB,uBAAwB,CAACQ,CAAQ,CACnC,CACF,CACF,CAWO,SAAS6qB,EAAAA,CACd7qB,CAAAA,CACA+d,EACA/X,CAAAA,CACAwK,CAAAA,CACAsa,EACW,CACX,GAAI,CAAC9qB,CAAAA,EAAY,CAAC+d,GAAa,CAAC/X,CAAAA,EAAW,CAACwK,CAAAA,EAAYsa,CAAAA,GAAQ,OAC9D,MAAM,IAAI,MAAM,mDAAmD,CAAA,CAKrE,OAAO,CACL,aAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CANVA,EAAM,SAAA,CAAY,WAAA,CAMC,CAAE,SAAA,CAAA/M,CAAAA,CAAW,OAAA,CAAA/X,EAAS,QAAA,CAAAwK,CAAS,CAAC,CAAC,CAAA,CAC/D,eAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACxQ,CAAQ,CACnC,CACF,CACF,CAYO,SAAS+qB,EAAAA,CACd/qB,CAAAA,CACA+d,EACA/X,CAAAA,CACAwK,CAAAA,CACAwa,EACAC,CAAAA,CACW,CACX,GACE,CAACjrB,CAAAA,EACD,CAAC+d,CAAAA,EACD,CAAC/X,GACD,CAACwK,CAAAA,EACDya,CAAAA,GAAS,MAAA,CAET,MAAM,IAAI,MAAM,oDAAoD,CAAA,CAKtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CANVA,EAAO,UAAA,CAAa,YAAA,CAMD,CAAE,SAAA,CAAAlN,CAAAA,CAAW,QAAA/X,CAAAA,CAAS,QAAA,CAAAwK,CAAAA,CAAU,KAAA,CAAAwa,CAAM,CAAC,CAAC,CAAA,CACtE,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CAWO,SAASkrB,EAAAA,CACdlrB,CAAAA,CACA+d,EACA/X,CAAAA,CACAglB,CAAAA,CACAC,EACW,CACX,GAAI,CAACjrB,CAAAA,EAAY,CAAC+d,CAAAA,EAAa,CAAC/X,CAAAA,EAAWilB,CAAAA,GAAS,OAClD,MAAM,IAAI,MAAM,oDAAoD,CAAA,CAKtE,OAAO,CACL,aAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CANVA,EAAO,UAAA,CAAa,YAAA,CAMD,CAAE,SAAA,CAAAlN,CAAAA,CAAW,OAAA,CAAA/X,EAAS,KAAA,CAAAglB,CAAM,CAAC,CAAC,CAAA,CAC5D,eAAgB,EAAC,CACjB,uBAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CAWO,SAASmrB,EAAAA,CACdnrB,EACA+d,CAAAA,CACA/X,CAAAA,CACAwK,CAAAA,CACAwa,CAAAA,CACW,CACX,GAAI,CAAChrB,CAAAA,EAAY,CAAC+d,GAAa,CAAC/X,CAAAA,EAAW,CAACwK,CAAAA,CAC1C,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAGtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,UAAA,CAAY,CAAE,SAAA,CAAAuN,EAAW,OAAA,CAAA/X,CAAAA,CAAS,SAAAwK,CAAAA,CAAU,KAAA,CAAAwa,CAAM,CAAC,CAAC,EAC1E,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CCvPO,IAAKorB,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,GAAA,CAAM,KAAA,CACNA,EAAA,IAAA,CAAO,MAAA,CAFGA,QAAA,EAAA,CAAA,CAQAC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,KAAA,CAAQ,EAAA,CACRA,CAAAA,CAAA,IAAA,CAAO,GAAA,CAFGA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IAeL,SAASC,EAAAA,CACdvmB,EACAwmB,CAAAA,CACAC,CAAAA,CACAC,EACAlsB,CAAAA,CACAmsB,CAAAA,CACW,CACX,GAAI,CAAC3mB,CAAAA,EAAS,CAACwmB,CAAAA,EAAgB,CAACC,GAAgB,CAACjsB,CAAAA,EAAcmsB,IAAY,MAAA,CACzE,MAAM,IAAI,KAAA,CAAM,4DAA4D,EAG9E,OAAO,CACL,qBACA,CACE,KAAA,CAAA3mB,EACA,OAAA,CAAS2mB,CAAAA,CACT,cAAA,CAAgBH,CAAAA,CAChB,cAAA,CAAgBC,CAAAA,CAChB,aAAcC,CAAAA,CACd,UAAA,CAAAlsB,CACF,CACF,CACF,CAKA,SAASosB,EAAAA,CAAat/B,CAAAA,CAAeu/B,CAAAA,CAAmB,CAAA,CAAW,CACjE,OAAOv/B,CAAAA,CAAM,OAAA,CAAQu/B,CAAQ,CAC/B,CAqBO,SAASC,EAAAA,CACd9mB,CAAAA,CACAwmB,CAAAA,CACAC,CAAAA,CACAM,CAAAA,CACAC,CAAAA,CAA0B,GACf,CAEX,GACE,CAAChnB,CAAAA,EACD+mB,CAAAA,GAAc,QACd,CAAC,MAAA,CAAO,SAASP,CAAY,CAAA,EAC7BA,GAAgB,CAAA,EAChB,CAAC,OAAO,QAAA,CAASC,CAAY,GAC7BA,CAAAA,EAAgB,CAAA,CAEhB,MAAM,IAAI,KAAA,CAAM,sEAAsE,EAIxF,IAAMjsB,CAAAA,CAAa,IAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CACtCA,CAAAA,CAAW,OAAA,CAAQA,CAAAA,CAAW,OAAA,GAAY,EAAE,CAAA,CAC5C,IAAMysB,CAAAA,CAAgBzsB,CAAAA,CAAW,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAGrDmsB,EAAU,CACd,CAAA,EAAGK,CAAQ,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,GAAQ,GAAI,CAAA,CACvC,UAAS,CACT,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAMPE,EACJH,CAAAA,GAAc,KAAA,CACV,CAAA,EAAGH,EAAAA,CAAaJ,CAAAA,CAAc,CAAC,CAAC,CAAA,IAAA,CAAA,CAChC,CAAA,EAAGI,GAAaJ,CAAAA,CAAc,CAAC,CAAC,CAAA,KAAA,CAAA,CAEhCW,CAAAA,CACJJ,CAAAA,GAAc,KAAA,CACV,CAAA,EAAGH,EAAAA,CAAaH,EAAc,CAAC,CAAC,QAChC,CAAA,EAAGG,EAAAA,CAAaH,EAAc,CAAC,CAAC,CAAA,IAAA,CAAA,CAEtC,OAAOF,EAAAA,CACLvmB,CAAAA,CACAknB,EACAC,CAAAA,CACA,KAAA,CACAF,EACAN,CACF,CACF,CAQO,SAASS,EAAAA,CAAwBpnB,EAAe2mB,CAAAA,CAA4B,CACjF,GAAI,CAAC3mB,CAAAA,EAAS2mB,IAAY,MAAA,CACxB,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,oBAAA,CACA,CACE,KAAA,CAAA3mB,CAAAA,CACA,QAAS2mB,CACX,CACF,CACF,CAUO,SAASU,EAAAA,CACdpmB,CAAAA,CACAqmB,CAAAA,CACAC,CAAAA,CACAC,EACW,CACX,GAAI,CAACvmB,CAAAA,EAAW,CAACqmB,GAAc,CAACC,CAAAA,EAAa,CAACC,CAAAA,CAC5C,MAAM,IAAI,MAAM,8DAA8D,CAAA,CAGhF,OAAO,CACL,sBAAA,CACA,CACE,OAAA,CAAAvmB,CAAAA,CACA,YAAaqmB,CAAAA,CACb,UAAA,CAAYC,EACZ,YAAA,CAAcC,CAChB,CACF,CACF,CCtKO,SAASC,EAAAA,CACdxmB,CAAAA,CACAjB,CAAAA,CACA0nB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAzV,EACW,CACX,GAAI,CAAClR,CAAAA,EAAW,CAAC2mB,EACf,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAG3E,OAAO,CACL,gBAAA,CACA,CACE,QAAA3mB,CAAAA,CACA,KAAA,CAAAjB,EACA,MAAA,CAAA0nB,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAUC,CAAAA,CACV,cAAezV,CACjB,CACF,CACF,CAUO,SAAS0V,GACd5mB,CAAAA,CACAkR,CAAAA,CACApB,EACA+Q,CAAAA,CACW,CACX,GAAI,CAAC7gB,CAAAA,EAAW8P,IAAwB,MAAA,CACtC,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,OAAA,CAAA9P,CAAAA,CACA,cAAekR,CAAAA,EAAgB,EAAA,CAC/B,sBAAuBpB,CAAAA,CACvB,UAAA,CAAa+Q,CAAAA,EAAc,EAC7B,CACF,CACF,CAoBO,SAASgG,GACd5C,CAAAA,CACA6C,CAAAA,CACA/tB,EACAguB,CAAAA,CACW,CACX,GAAI,CAAC9C,CAAAA,EAAW,CAAC6C,GAAkB,CAAC/tB,CAAAA,EAAQ,CAACguB,CAAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,yDAAyD,EAG3E,IAAMhoB,CAAAA,CAAmB,CACvB,gBAAA,CAAkB,CAAA,CAClB,cAAe,EAAC,CAChB,UAAW,CAAC,CAAChG,CAAAA,CAAK,cAAA,CAAgB,CAAC,CAAC,CACtC,CAAA,CAEM0tB,CAAAA,CAAoB,CACxB,gBAAA,CAAkB,CAAA,CAClB,cAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAAC1tB,CAAAA,CAAK,gBAAiB,CAAC,CAAC,CACvC,CAAA,CAEM2tB,CAAAA,CAAqB,CACzB,gBAAA,CAAkB,CAAA,CAClB,aAAA,CAAe,CAAC,CAAC,YAAA,CAAc,CAAC,CAAC,CAAA,CACjC,UAAW,CAAC,CAAC3tB,EAAK,gBAAA,CAAkB,CAAC,CAAC,CACxC,CAAA,CAEA,OAAO,CACL,gBAAA,CACA,CACE,OAAA,CAAAkrB,CAAAA,CACA,iBAAkB6C,CAAAA,CAClB,KAAA,CAAA/nB,CAAAA,CACA,MAAA,CAAA0nB,CAAAA,CACA,OAAA,CAAAC,EACA,QAAA,CAAU3tB,CAAAA,CAAK,cACf,aAAA,CAAe,EAAA,CACf,IAAAguB,CACF,CACF,CACF,CASO,SAASC,EAAAA,CACd/C,EACA6C,CAAAA,CACA/tB,CAAAA,CACW,CACX,GAAI,CAACkrB,GAAW,CAAC6C,CAAAA,EAAkB,CAAC/tB,CAAAA,CAClC,MAAM,IAAI,MAAM,gEAAgE,CAAA,CAGlF,IAAMgG,CAAAA,CAAmB,CACvB,iBAAkB,CAAA,CAClB,aAAA,CAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAAChG,CAAAA,CAAK,eAAgB,CAAC,CAAC,CACtC,CAAA,CAEM0tB,CAAAA,CAAoB,CACxB,gBAAA,CAAkB,CAAA,CAClB,aAAA,CAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAAC1tB,CAAAA,CAAK,gBAAiB,CAAC,CAAC,CACvC,CAAA,CAEM2tB,CAAAA,CAAqB,CACzB,iBAAkB,CAAA,CAClB,aAAA,CAAe,CAAC,CAAC,YAAA,CAAc,CAAC,CAAC,CAAA,CACjC,SAAA,CAAW,CAAC,CAAC3tB,CAAAA,CAAK,iBAAkB,CAAC,CAAC,CACxC,CAAA,CAEA,OAAO,CACL,wBAAA,CACA,CACE,QAAAkrB,CAAAA,CACA,gBAAA,CAAkB6C,EAClB,KAAA,CAAA/nB,CAAAA,CACA,OAAA0nB,CAAAA,CACA,OAAA,CAAAC,EACA,QAAA,CAAU3tB,CAAAA,CAAK,aAAA,CACf,aAAA,CAAe,EAAA,CACf,UAAA,CAAY,EACd,CACF,CACF,CAQO,SAASkuB,GAAoBhD,CAAAA,CAAiB8C,CAAAA,CAAwB,CAC3E,GAAI,CAAC9C,CAAAA,EAAW,CAAC8C,CAAAA,CACf,MAAM,IAAI,KAAA,CAAM,wDAAwD,EAG1E,OAAO,CACL,eAAA,CACA,CACE,OAAA,CAAA9C,CAAAA,CACA,IAAA8C,CAAAA,CACA,UAAA,CAAY,EACd,CACF,CACF,CAaO,SAASG,GACdlnB,CAAAA,CACAmnB,CAAAA,CACAC,EACAC,CAAAA,CACAV,CAAAA,CACAzV,EACW,CACX,GAAI,CAAClR,CAAAA,EAAW,CAACmnB,CAAAA,EAAkB,CAACC,CAAAA,EAAkB,CAACT,EACrD,MAAM,IAAI,MAAM,kEAAkE,CAAA,CAIpF,IAAMW,CAAAA,CAAgBH,CAAAA,CAAe,aAAA,CAAc,SAAA,CACjD,CAAC,CAAC1T,CAAG,CAAA,GAAMA,CAAAA,GAAQ2T,CACrB,CAAA,CAEMG,CAAAA,CAAkB,CAAC,GAAGJ,CAAAA,CAAe,aAAa,CAAA,CACpDG,CAAAA,EAAiB,CAAA,CAEnBC,EAAgBD,CAAa,CAAA,CAAI,CAACF,CAAAA,CAAgBC,CAAe,EAGjEE,CAAAA,CAAgB,IAAA,CAAK,CAACH,CAAAA,CAAgBC,CAAe,CAAC,CAAA,CAGxD,IAAMG,EAAwB,CAC5B,GAAGL,EACH,aAAA,CAAeI,CACjB,CAAA,CAGA,OAAAC,CAAAA,CAAW,aAAA,CAAc,KAAK,CAAC78B,CAAAA,CAAGtF,IAAOsF,CAAAA,CAAE,CAAC,EAAItF,CAAAA,CAAE,CAAC,CAAA,CAAI,CAAA,CAAI,EAAG,CAAA,CAEvD,CACL,gBAAA,CACA,CACE,QAAA2a,CAAAA,CACA,OAAA,CAASwnB,EACT,QAAA,CAAUb,CAAAA,CACV,aAAA,CAAezV,CACjB,CACF,CACF,CAYO,SAASuW,EAAAA,CACdznB,EACAmnB,CAAAA,CACAO,CAAAA,CACAf,EACAzV,CAAAA,CACW,CACX,GAAI,CAAClR,CAAAA,EAAW,CAACmnB,CAAAA,EAAkB,CAACO,GAAkB,CAACf,CAAAA,CACrD,MAAM,IAAI,KAAA,CAAM,mEAAmE,CAAA,CAGrF,IAAMa,CAAAA,CAAwB,CAC5B,GAAGL,CAAAA,CACH,cAAeA,CAAAA,CAAe,aAAA,CAAc,OAC1C,CAAC,CAAC1T,CAAG,CAAA,GAAMA,CAAAA,GAAQiU,CACrB,CACF,CAAA,CAEA,OAAO,CACL,gBAAA,CACA,CACE,QAAA1nB,CAAAA,CACA,OAAA,CAASwnB,CAAAA,CACT,QAAA,CAAUb,CAAAA,CACV,aAAA,CAAezV,CACjB,CACF,CACF,CASO,SAASyW,EAAAA,CACdC,EACAC,CAAAA,CACAhH,CAAAA,CAAoB,EAAC,CACV,CACX,GAAI,CAAC+G,CAAAA,EAAoB,CAACC,CAAAA,CACxB,MAAM,IAAI,KAAA,CAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,yBAAA,CACA,CACE,kBAAA,CAAoBD,CAAAA,CACpB,qBAAsBC,CAAAA,CACtB,UAAA,CAAYhH,CACd,CACF,CACF,CAUO,SAASiH,EAAAA,CACdC,CAAAA,CACAH,EACAI,CAAAA,CACAnH,CAAAA,CAAoB,EAAC,CACV,CACX,GAAI,CAACkH,CAAAA,EAAmB,CAACH,CAAAA,EAAoB,CAACI,CAAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,kEAAkE,CAAA,CAGpF,OAAO,CACL,0BAAA,CACA,CACE,iBAAkBD,CAAAA,CAClB,kBAAA,CAAoBH,EACpB,mBAAA,CAAqBI,CAAAA,CACrB,WAAYnH,CACd,CACF,CACF,CAUO,SAASoH,EAAAA,CACdL,CAAAA,CACAI,CAAAA,CACAE,CAAAA,CACArH,EAAoB,EAAC,CACV,CACX,GAAI,CAAC+G,GAAoB,CAACI,CAAAA,EAAqB,CAACE,CAAAA,CAC9C,MAAM,IAAI,MAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,kBAAA,CAAoBN,CAAAA,CACpB,mBAAA,CAAqBI,CAAAA,CACrB,sBAAA,CAAwBE,CAAAA,CACxB,WAAYrH,CACd,CACF,CACF,CC/WO,SAASsH,GACdtb,CAAAA,CACA7M,CAAAA,CACAiG,EACW,CAEX,GAAI,CAAC4G,CAAAA,EAAQ,CAAC7M,GAAW,CAAC,MAAA,CAAO,SAASiG,CAAQ,CAAA,CAChD,MAAM,IAAI,KAAA,CAAM,qDAAqD,EAGvE,OAAO,CACL,cACA,CACE,EAAA,CAAI,oBACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAA4G,CAAAA,CACA,QAAA7M,CAAAA,CACA,QAAA,CAAAiG,CACF,CAAC,CAAA,CACD,eAAgB,CAAC4G,CAAI,CAAA,CACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAaO,SAASub,EAAAA,CAAoBvb,CAAAA,CAAc5G,EAA6B,CAC7E,GAAI,CAAC4G,CAAAA,EAAQ,CAAC,OAAO,SAAA,CAAU5G,CAAQ,GAAKA,CAAAA,EAAY,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,cACA,CACE,EAAA,CAAI,uBACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAA4G,CAAAA,CACA,QAAA,CAAA5G,CACF,CAAC,EACD,cAAA,CAAgB,CAAC4G,CAAI,CAAA,CACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASwb,EAAAA,CACdxb,EACAtC,CAAAA,CACAC,CAAAA,CACAvE,EACW,CAEX,GAAI,CAAC4G,CAAAA,EAAQ,CAACtC,GAAU,CAACC,CAAAA,EAAY,CAAC,MAAA,CAAO,QAAA,CAASvE,CAAQ,CAAA,CAC5D,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAGrE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,gBAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAA4G,CAAAA,CACA,MAAA,CAAAtC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,SAAAvE,CACF,CAAC,EACD,cAAA,CAAgB,CAAC4G,CAAI,CAAA,CACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASyb,EAAAA,CACdC,EACAC,CAAAA,CACA19B,CAAAA,CACAiS,EACW,CACX,GAAI,CAACwrB,CAAAA,EAAU,CAACC,GAAY,CAAC19B,CAAAA,CAC3B,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAI3E,IAAM29B,CAAAA,CAAmB39B,CAAAA,CAAO,OAAA,CAAQ,UAAA,CAAY,OAAO,CAAA,CAE3D,OAAO,CACL,aAAA,CACA,CACE,GAAI,uBAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,MAAA,CAAAy9B,EACA,QAAA,CAAAC,CAAAA,CACA,OAAQC,CAAAA,CACR,IAAA,CAAM1rB,GAAQ,EAChB,CAAC,CAAA,CACD,cAAA,CAAgB,CAACwrB,CAAM,EACvB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASG,EAAAA,CACdH,EACApH,CAAAA,CACAr2B,CAAAA,CACAiS,EACa,CACb,GAAI,CAACwrB,CAAAA,EAAU,CAACpH,GAAgB,CAACr2B,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,+DAA+D,EAIjF,IAAM69B,CAAAA,CAAYxH,EACf,IAAA,EAAK,CACL,MAAM,QAAQ,CAAA,CACd,MAAA,CAAO,OAAO,CAAA,CAGjB,GAAIwH,EAAU,MAAA,GAAW,CAAA,CACvB,MAAM,IAAI,KAAA,CAAM,8DAA8D,CAAA,CAIhF,OAAOA,CAAAA,CAAU,GAAA,CAAKvH,CAAAA,EACpBkH,EAAAA,CAAqBC,EAAQnH,CAAAA,CAAK,IAAA,GAAQt2B,CAAAA,CAAQiS,CAAI,CACxD,CACF,CAOO,SAAS6rB,EAAAA,CAA6B/c,CAAAA,CAAyB,CACpE,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,aAAA,CACA,CACE,GAAI,qBAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAA,CACF,CAAC,CAAA,CACD,cAAA,CAAgB,CAACA,CAAI,EACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASgd,EAAAA,CACd7uB,CAAAA,CACAxM,CAAAA,CACAulB,CAAAA,CACW,CACX,GAAI,CAAC/Y,CAAAA,EAAY,CAACxM,CAAAA,EAAe,CAACulB,EAChC,MAAM,IAAI,MAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAIvlB,CAAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAUulB,CAAI,CAAA,CACzB,cAAA,CAAgB,CAAC/Y,CAAQ,CAAA,CACzB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAAS8uB,EAAAA,CACd9uB,CAAAA,CACAxM,CAAAA,CACAulB,CAAAA,CACW,CACX,GAAI,CAAC/Y,GAAY,CAACxM,CAAAA,EAAe,CAACulB,CAAAA,CAChC,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA,CAG/E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAIvlB,CAAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAUulB,CAAI,CAAA,CACzB,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAC/Y,CAAQ,CACnC,CACF,CACF,CClNO,SAAS+uB,EAAAA,CACd/uB,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,UAAA,CAAY,QAAQ,CAAA,CACrB/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAAkR,CAAU,IAAM,CACjBiY,EAAAA,CAAcnpB,EAAWkR,CAAS,CACpC,EACA,MAAO8d,CAAAA,CAAcnJ,CAAAA,GAAc,CAEjC,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,UAAU3O,CAAAA,CAAW6lB,CAAAA,CAAU,SAAS,CAAA,CAC3DlX,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,SAAS,CAAA,CAC3ClX,CAAAA,CAAU,SAAS,WAAA,CAAYkX,CAAAA,CAAU,SAAS,CAAA,CAClDlX,CAAAA,CAAU,QAAA,CAAS,YAAY3O,CAAS,CAC1C,CAAC,EACH,CAAA,CACAyH,EACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCxBO,SAASonB,GACdjvB,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,CAAAA,CACL,CAAC,UAAA,CAAY,UAAU,EACvB/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAAkR,CAAU,IAAM,CACjBkY,EAAAA,CAAgBppB,EAAWkR,CAAS,CACtC,EACA,MAAO8d,CAAAA,CAAcnJ,IAAc,CAEjC,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,UAAU3O,CAAAA,CAAW6lB,CAAAA,CAAU,SAAS,CAAA,CAC3DlX,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,SAAS,CAAA,CAC3ClX,CAAAA,CAAU,SAAS,WAAA,CAAYkX,CAAAA,CAAU,SAAS,CAAA,CAClDlX,CAAAA,CAAU,SAAS,WAAA,CAAY3O,CAAS,CAC1C,CAAC,EACH,CAAA,CACAyH,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC3DO,SAASqnB,EAAAA,CACdlvB,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,EACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAY,WAAA,CAAa,KAAA,CAAOlJ,CAAQ,CAAA,CACtD,UAAA,CAAY,MAAO,CAAE,MAAA,CAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,CAAS,CAAA,GAAe,CACnD,GAAI,CAACxQ,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAkB5D,OAAA,CAdiB,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,4BAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,MAAA,CAAA+F,EACA,QAAA,CAAAC,CAAAA,CACA,IAAA,CAAAhb,CACF,CAAC,CACH,CACF,CAAA,EACgB,IAAA,EAClB,CAAA,CACA,SAAA,CAAW,IAAM,CACfyT,CAAAA,EAAU,CACV4D,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU,CAAC,WAAY,WAAA,CAAa7M,CAAQ,CAC9C,CAAC,EACH,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CC3CO,SAASoJ,EAAAA,CACdnvB,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAY,WAAA,CAAa,QAAA,CAAUlJ,CAAQ,CAAA,CACzD,UAAA,CAAY,MAAOovB,GAAuB,CACxC,GAAI,CAACpvB,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAiB5D,OAAA,CAbiB,MADAyY,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,+BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,EAAA,CAAI4kB,EACJ,IAAA,CAAA55B,CACF,CAAC,CACH,CACF,GACgB,IAAA,EAClB,EACA,SAAA,CAAW,IAAM,CACfyT,CAAAA,EAAU,CACV4D,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,SAAU,CAAC,UAAA,CAAY,YAAa7M,CAAQ,CAC9C,CAAC,EACH,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCrCO,SAASsJ,GACdrvB,CAAAA,CACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,YAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,WAAA,CAAa,MAAOlJ,CAAQ,CAAA,CACtD,WAAY,MAAOgG,CAAAA,EAAoB,CACrC,GAAI,CAAChG,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAiB5D,OAAA,CAbiB,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,4BAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,OAAA,CAAAxE,CAAAA,CACA,KAAAxQ,CACF,CAAC,CACH,CACF,CAAA,EACgB,IAAA,EAClB,CAAA,CACA,SAAA,CAAW,CAACowB,CAAAA,CAAO5f,CAAAA,GAAY,CAC7BiD,CAAAA,EAAU,CACV,IAAMqmB,CAAAA,CAAKziB,CAAAA,GACXyiB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,SAAS,SAAA,CAAU3O,CAAQ,CAAE,CAAC,CAAA,CACzEsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,QAAA,CAAS,iBAAA,CAAkB3O,CAAQ,CAAE,CAAC,CAAA,CACjFsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,QAAA,CAAS,cAAc3O,CAAAA,CAAWgG,CAAO,CAAE,CAAC,EACzF,CAAA,CACA,OAAA,CAAA+f,CACF,CAAC,CACH,CCpCO,SAASwJ,EAAAA,CACdvvB,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAY,WAAA,CAAa,QAAA,CAAUlJ,CAAQ,CAAA,CACzD,UAAA,CAAY,MAAOgG,GAAoB,CACrC,GAAI,CAAChG,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAI5D,IAAMgI,EAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,gCACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,QAAAxE,CAAAA,CACA,IAAA,CAAAxQ,CACF,CAAC,CACH,CACF,CAAA,CACA,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAEjE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,SAAU,MAAOwI,CAAAA,EAAoB,CACnC,GAAI,CAAChG,CAAAA,CACH,OAGF,IAAMsvB,CAAAA,CAAKziB,GAAe,CACpB2iB,CAAAA,CAAU7gB,EAAU,QAAA,CAAS,SAAA,CAAU3O,CAAQ,CAAA,CAC/CyvB,CAAAA,CAAiB9gB,CAAAA,CAAU,SAAS,iBAAA,CAAkB3O,CAAQ,EAC9D0vB,CAAAA,CAAW/gB,CAAAA,CAAU,SAAS,aAAA,CAAc3O,CAAAA,CAAUgG,CAAO,CAAA,CAEnE,MAAM,QAAQ,GAAA,CAAI,CAChBspB,EAAG,aAAA,CAAc,CAAE,SAAUE,CAAQ,CAAC,CAAA,CACtCF,CAAAA,CAAG,aAAA,CAAc,CAAE,SAAUG,CAAe,CAAC,EAC7CH,CAAAA,CAAG,aAAA,CAAc,CAAE,QAAA,CAAUI,CAAS,CAAC,CACzC,CAAC,CAAA,CAED,IAAMC,CAAAA,CAAeL,CAAAA,CAAG,aAAgCE,CAAO,CAAA,CAC3DG,GACFL,CAAAA,CAAG,YAAA,CACDE,CAAAA,CACAG,CAAAA,CAAa,MAAA,CAAQC,CAAAA,EAAMA,EAAE,OAAA,GAAY5pB,CAAO,CAClD,CAAA,CAGF,IAAM6pB,EAAgBP,CAAAA,CAAG,YAAA,CAAsBI,CAAQ,CAAA,CACvDJ,CAAAA,CAAG,aAAsBI,CAAAA,CAAU,KAAK,EAExC,IAAMI,CAAAA,CAAkBR,EAAG,cAAA,CAA+D,CACxF,QAAA,CAAUG,CACZ,CAAC,CAAA,CACKM,EAAmB,IAAI,GAAA,CAAID,CAAe,CAAA,CAChD,IAAA,GAAW,CAAC9/B,CAAAA,CAAKZ,CAAI,CAAA,GAAK0gC,CAAAA,CACpB1gC,CAAAA,EACFkgC,CAAAA,CAAG,aAAat/B,CAAAA,CAAK,CACnB,GAAGZ,CAAAA,CACH,KAAA,CAAOA,EAAK,KAAA,CAAM,GAAA,CAAKsjB,CAAAA,GAAU,CAC/B,GAAGA,CAAAA,CACH,KAAMA,CAAAA,CAAK,IAAA,CAAK,OAAQkd,CAAAA,EAAMA,CAAAA,CAAE,UAAY5pB,CAAO,CACrD,EAAE,CACJ,CAAC,EAIL,OAAO,CAAE,aAAA2pB,CAAAA,CAAc,gBAAA,CAAAI,EAAkB,aAAA,CAAAF,CAAc,CACzD,CAAA,CACA,SAAA,CAAW,CAACjK,EAAO5f,CAAAA,GAAY,CAC7BiD,GAAU,CACV,IAAMqmB,EAAKziB,CAAAA,EAAe,CAC1ByiB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,EAAU,QAAA,CAAS,SAAA,CAAU3O,CAAQ,CAAE,CAAC,EACzEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,QAAA,CAAS,kBAAkB3O,CAAQ,CAAE,CAAC,CAAA,CACjFsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,QAAA,CAAS,aAAA,CAAc3O,EAAWgG,CAAO,CAAE,CAAC,EACzF,CAAA,CACA,QAAS,CAAC9M,CAAAA,CAAK8M,CAAAA,CAASgqB,CAAAA,GAAY,CAClC,IAAMV,EAAKziB,CAAAA,EAAe,CAI1B,GAHImjB,CAAAA,EAAS,YAAA,EACXV,EAAG,YAAA,CAAa3gB,CAAAA,CAAU,QAAA,CAAS,SAAA,CAAU3O,CAAQ,CAAA,CAAGgwB,EAAQ,YAAY,CAAA,CAE1EA,GAAS,gBAAA,CACX,IAAA,GAAW,CAAChgC,CAAAA,CAAKZ,CAAI,CAAA,GAAK4gC,CAAAA,CAAQ,gBAAA,CAChCV,CAAAA,CAAG,aAAat/B,CAAAA,CAAKZ,CAAI,EAGzB4gC,CAAAA,EAAS,aAAA,GAAkB,QAC7BV,CAAAA,CAAG,YAAA,CACD3gB,EAAU,QAAA,CAAS,aAAA,CAAc3O,EAAWgG,CAAO,CAAA,CACnDgqB,EAAQ,aACV,CAAA,CAEFjK,EAAQ7sB,CAAG,EACb,CACF,CAAC,CACH,CCnFO,SAAS+2B,EAAAA,CACd94B,CAAAA,CACA+4B,CAAAA,CACwB,CACxB,IAAMt0B,CAAAA,CAAS,IAAI,GAAA,CAEnB,OAAAzE,EAAS,OAAA,CAAQ,CAAC,CAACnH,CAAAA,CAAKo2B,CAAM,CAAA,GAAM,CAClCxqB,CAAAA,CAAO,GAAA,CAAI5L,EAAI,QAAA,EAAS,CAAGo2B,CAAM,EACnC,CAAC,EAED8J,CAAAA,CAAU,OAAA,CAAQ,CAAC,CAAClgC,CAAAA,CAAKo2B,CAAM,CAAA,GAAM,CACnCxqB,EAAO,GAAA,CAAI5L,CAAAA,CAAI,UAAS,CAAGo2B,CAAM,EACnC,CAAC,CAAA,CAEM,KAAA,CAAM,KAAKxqB,CAAAA,CAAO,OAAA,EAAS,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAC+iB,CAAI,CAAA,CAAG,CAACC,CAAI,CAAA,GAAMD,EAAK,aAAA,CAAcC,CAAI,CAAC,CAAA,CACjD,GAAA,CAAI,CAAC,CAAC5uB,CAAAA,CAAKo2B,CAAM,CAAA,GAAM,CAACp2B,CAAAA,CAAKo2B,CAAM,CAAqB,CAC7D,CAOO,SAAS+J,EAAAA,CACdnwB,EACApB,CAAAA,CACA,CACA,GAAM,CAAE,IAAA,CAAMwxB,CAAY,CAAA,CAAI/iB,QAAAA,CAASsH,EAA2B3U,CAAQ,CAAC,EAE3E,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,cAAelJ,CAAQ,CAAA,CACjD,WAAY,MAAO,CACjB,KAAAjB,CAAAA,CACA,WAAA,CAAAsxB,CAAAA,CAAc,KAAA,CACd,UAAA,CAAAC,CAAAA,CACA,aAAAC,CAAAA,CAAe,GACf,uBAAA,CAAAC,CAAAA,CAA0B,EAC5B,CAAA,GAAe,CACb,GAAIzxB,CAAAA,CAAK,MAAA,GAAW,EAClB,MAAM,IAAI,MACR,oDACF,CAAA,CAGF,GAAI,CAACqxB,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,gEACF,CAAA,CAGF,IAAMK,EAAeC,CAAAA,EAAwB,CAC3C,IAAMjpB,CAAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU2oB,CAAAA,CAAYM,CAAO,CAAC,CAAC,EAKjEC,CAAAA,CAAkB,CACtB,GAH+BH,CAAAA,CAAwBE,CAAO,GAAK,EAAC,CAIpE,GAAIF,CAAAA,CAAwBE,CAAO,IAAM,MAAA,CAAYH,CAAAA,CAAe,EACtE,CAAA,CAGMK,CAAAA,CAAeP,CAAAA,CACjB5oB,CAAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAACzX,CAAG,CAAA,GAAM,CAAC2gC,EAAgB,QAAA,CAAS3gC,CAAAA,CAAI,UAAU,CAAC,EAC1E,EAAC,CAEL,OAAAyX,CAAAA,CAAK,SAAA,CAAYwoB,GACfW,CAAAA,CACA7xB,CAAAA,CAAK,GAAA,CACH,CAAC8xB,CAAAA,CAAQ5lC,CAAAA,GACP,CAAC4lC,CAAAA,CAAOH,CAAO,EAAE,YAAA,EAAa,CAAE,UAAS,CAAGzlC,CAAAA,CAAI,CAAC,CAIrD,CACF,CAAA,CAEOwc,CACT,CAAA,CAEA,OAAOrC,EACL,CAAC,CAAC,iBAAkB,CAClB,OAAA,CAASpF,CAAAA,CACT,aAAA,CAAeowB,CAAAA,CAAY,aAAA,CAC3B,MAAOK,CAAAA,CAAY,OAAO,EAC1B,MAAA,CAAQA,CAAAA,CAAY,QAAQ,CAAA,CAC5B,OAAA,CAASA,EAAY,SAAS,CAAA,CAE9B,SAAU1xB,CAAAA,CAAK,CAAC,EAAE,QAAA,CAAS,YAAA,GAAe,QAAA,EAC5C,CAAC,CAAC,CAAA,CACFuxB,CACF,CACF,CAAA,CACA,GAAG1xB,CACL,CAAC,CACH,CCjGO,SAASkyB,EAAAA,CACd9wB,CAAAA,CACApB,EACA,CACA,GAAM,CAAE,IAAA,CAAMwxB,CAAY,CAAA,CAAI/iB,QAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAErE,CAAE,YAAa+wB,CAAW,CAAA,CAAIZ,GAAyBnwB,CAAQ,CAAA,CAErE,OAAOkJ,WAAAA,CAAY,CACjB,YAAa,CAAC,UAAA,CAAY,kBAAmBlJ,CAAQ,CAAA,CACrD,WAAY,MAAO,CACjB,WAAA,CAAAgxB,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,YAAAZ,CACF,CAAA,GAAe,CACb,GAAI,CAACD,EACH,MAAM,IAAI,KAAA,CACR,oEACF,CAAA,CAEF,IAAME,EAAa1wB,CAAAA,CAAW,SAAA,CAC5BI,EACAixB,CAAAA,CACA,OACF,EAEA,OAAOF,CAAAA,CAAW,CAChB,UAAA,CAAAT,CAAAA,CACA,WAAA,CAAAD,EACA,IAAA,CAAM,CACJ,CACE,KAAA,CAAOzwB,CAAAA,CAAW,UAAUI,CAAAA,CAAUgxB,CAAAA,CAAa,OAAO,CAAA,CAC1D,MAAA,CAAQpxB,EAAW,SAAA,CAAUI,CAAAA,CAAUgxB,EAAa,QAAQ,CAAA,CAC5D,QAASpxB,CAAAA,CAAW,SAAA,CAAUI,CAAAA,CAAUgxB,CAAAA,CAAa,SAAS,CAAA,CAC9D,SAAUpxB,CAAAA,CAAW,SAAA,CAAUI,EAAUgxB,CAAAA,CAAa,MAAM,CAC9D,CACF,CACF,CAAC,CACH,CAAA,CACA,GAAGpyB,CACL,CAAC,CACH,CCrCO,SAASsyB,GACdlxB,CAAAA,CACApB,CAAAA,CACA6I,EACA,CACA,IAAMie,EAAcC,cAAAA,EAAe,CAE7B,CAAE,IAAA,CAAAv2B,CAAK,EAAIie,QAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE9D,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,gBAAA,CAAkB9Z,GAAM,IAAI,CAAA,CACtD,WAAY,MAAO,CAAE,WAAA,CAAA+hC,CAAAA,CAAa,IAAA,CAAAnsB,CAAAA,CAAM,IAAAhV,CAAI,CAAA,GAAqB,CAC/D,GAAI,CAACZ,EACH,MAAM,IAAI,KAAA,CACR,oEACF,CAAA,CAGF,IAAMs9B,EAAU,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAUt9B,CAAAA,CAAK,OAAO,CAAC,CAAA,CAEvDs9B,EAAQ,aAAA,CAAgBA,CAAAA,CAAQ,cAAc,MAAA,CAC5C,CAAC,CAAC1mB,CAAO,CAAA,GAAMA,IAAYmrB,CAC7B,CAAA,CAEA,IAAMryB,CAAAA,CAAgB,CACpB,OAAA,CAAS1P,EAAK,IAAA,CACd,OAAA,CAAAs9B,EACA,QAAA,CAAUt9B,CAAAA,CAAK,SACf,aAAA,CAAeA,CAAAA,CAAK,aACtB,CAAA,CAEA,GAAI4V,CAAAA,GAAS,OAAShV,CAAAA,CACpB,OAAOoV,EAAoB,CAAC,CAAC,iBAAkBtG,CAAa,CAAC,CAAA,CAAG9O,CAAG,CAAA,CAC9D,GAAIgV,IAAS,UAAA,CAAY,CAC9B,GAAI,CAACyC,CAAAA,EAAM,UACT,MAAM,IAAI,MAAM,qDAAgD,CAAA,CAElE,OAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAC,gBAAA,CAAkB3I,CAAa,CAAC,CAAA,CAAG,QAAQ,CACrE,CAAA,KACE,OAAI,CAACF,CAAAA,CAAQ,aAAA,EAAiB,QAAQ,GAAA,CAAI,QAAA,GAAa,eACrD,OAAA,CAAQ,IAAA,CAAK,sHAAsH,CAAA,CAE9HoJ,EAAAA,CAAG,aAAA,CACR,CAAC,gBAAA,CAAkBlJ,CAAa,EAChCF,CAAAA,CAAQ,aAAA,CAAgB,CAAE,QAAA,CAAUA,CAAAA,CAAQ,aAAc,CAAA,CAAI,EAAC,CAC/D,IAAM,CAAC,CACT,CAEJ,CAAA,CACA,OAAA,CAASA,EAAQ,OAAA,CACjB,SAAA,CAAW,CAAC4d,CAAAA,CAAMrT,CAAAA,CAASioB,IAAQ,CAChCxyB,CAAAA,CAAQ,YAEQ4d,CAAAA,CAAMrT,CAAAA,CAASioB,CAAG,CAAA,CACnC1L,CAAAA,CAAY,YAAA,CACV/Q,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,SACpC5Q,CAAAA,GACE,CACC,GAAGA,CAAAA,CACH,OAAA,CAAS,CACP,GAAGA,CAAAA,EAAM,OAAA,CACT,aAAA,CACEA,CAAAA,EAAM,OAAA,EAAS,eAAe,MAAA,CAC5B,CAAC,CAAC4W,CAAO,CAAA,GAAMA,IAAYmD,CAAAA,CAAQ,WACrC,CAAA,EAAK,EACT,CACF,EACJ,EACF,CACF,CAAC,CACH,CCtEO,SAASkoB,EAAAA,CACdrxB,CAAAA,CACAxK,EACAoJ,CAAAA,CACA6I,CAAAA,CACA,CACA,GAAM,CAAE,IAAA,CAAArY,CAAK,CAAA,CAAIie,QAAAA,CAASsH,EAA2B3U,CAAQ,CAAC,EAE9D,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,WAAY9Z,CAAAA,EAAM,IAAI,EAChD,UAAA,CAAY,MAAO,CAAE,WAAA,CAAA+hC,CAAAA,CAAa,IAAA,CAAAnsB,CAAAA,CAAM,GAAA,CAAAhV,CAAAA,CAAK,MAAAshC,CAAM,CAAA,GAAqB,CACtE,GAAI,CAACliC,EACH,MAAM,IAAI,MACR,qEACF,CAAA,CAGF,IAAM0P,CAAAA,CAAgB,CACpB,mBAAoB1P,CAAAA,CAAK,IAAA,CACzB,qBAAsB+hC,CAAAA,CACtB,UAAA,CAAY,EACd,CAAA,CAEA,GAAInsB,IAAS,QAAA,CAAU,CACrB,GAAI,CAACxP,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,6CAAwC,CAAA,CAI1D,IAAMgI,CAAAA,CAAW,MAFAyQ,CAAAA,EAAc,CAECzD,EAAO,cAAA,CAAiB,6BAAA,CAA+B,CACrF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,EACA,KAAA,CAAA87B,CAAAA,CACA,WAAY,CACV,GAAGliC,EAAK,KAAA,CAAM,SAAA,CACd,GAAGA,CAAAA,CAAK,MAAA,CAAO,UACf,GAAGA,CAAAA,CAAK,OAAA,CAAQ,SAAA,CAChBA,CAAAA,CAAK,QACP,CACF,CAAC,CACH,CAAC,CAAA,CAKD,GAAI,CAACoO,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2CA,EAAS,MAAM,CAAA,CAAE,EAG9E,OAAOA,CACT,MAAO,CAAA,GAAIwH,CAAAA,GAAS,KAAA,EAAShV,CAAAA,CAC3B,OAAOoV,CAAAA,CACL,CAAC,CAAC,yBAAA,CAA2BtG,CAAa,CAAC,CAAA,CAC3C9O,CACF,CAAA,CACK,GAAIgV,IAAS,UAAA,CAAY,CAC9B,GAAI,CAACyC,CAAAA,EAAM,UACT,MAAM,IAAI,MAAM,qDAAgD,CAAA,CAElE,OAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAC,yBAAA,CAA2B3I,CAAa,CAAC,CAAA,CAAG,OAAO,CAC7E,CAAA,KACE,OAAI,CAACF,CAAAA,CAAQ,aAAA,EAAiB,OAAA,CAAQ,IAAI,QAAA,GAAa,aAAA,EACrD,QAAQ,IAAA,CAAK,uHAAuH,EAE/HoJ,EAAAA,CAAG,aAAA,CACR,CAAC,yBAAA,CAA2BlJ,CAAa,CAAA,CACzCF,EAAQ,aAAA,CAAgB,CAAE,SAAUA,CAAAA,CAAQ,aAAc,EAAI,EAAC,CAC/D,IAAM,CAAC,CACT,EAEJ,CAAA,CACA,OAAA,CAASA,EAAQ,OAAA,CACjB,SAAA,CAAWA,EAAQ,SACrB,CAAC,CACH,CCjGO,SAAS2yB,EAAAA,CACd9pB,EACA+pB,CAAAA,CACS,CACT,IAAMC,CAAAA,CAAkBhqB,CAAAA,CAAK,SAAA,CAC1B,OAAO,CAAC,CAACzX,CAAG,CAAA,GAAM,CAACwhC,EAAgB,GAAA,CAAI,MAAA,CAAOxhC,CAAG,CAAC,CAAC,CAAA,CACnD,OAAO,CAAC0hC,CAAAA,CAAK,EAAGtL,CAAM,IAAMsL,CAAAA,CAAMtL,CAAAA,CAAQ,CAAC,CAAA,CAGxCuL,CAAAA,CAAAA,CAAiBlqB,EAAK,aAAA,EAAiB,IAAI,MAAA,CAC/C,CAACiqB,EAAa,EAAGtL,CAAM,CAAA,GAAwBsL,CAAAA,CAAMtL,CAAAA,CACrD,CACF,CAAA,CAEA,OAAQqL,EAAkBE,CAAAA,EAAkBlqB,CAAAA,CAAK,gBACnD,CAYO,SAASmqB,EAAAA,CACdxB,CAAAA,CACAyB,CAAAA,CACA,CACA,IAAML,CAAAA,CAAkB,IAAI,IAAIK,CAAAA,CAAa,GAAA,CAAK3X,GAAMA,CAAAA,CAAE,QAAA,EAAU,CAAC,CAAA,CAE/D4X,CAAAA,CAAmBrqB,GACvBA,CAAAA,CAAK,SAAA,CAAU,KACb,CAAC,CAACzX,CAAG,CAAA,GAAoCwhC,CAAAA,CAAgB,IAAI,MAAA,CAAOxhC,CAAG,CAAC,CAC1E,CAAA,CAEIygC,EAAehpB,CAAAA,EAA+B,CAClD,IAAMsqB,CAAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAUtqB,CAAI,CAAC,CAAA,CACxD,OAAAsqB,EAAM,SAAA,CAAYA,CAAAA,CAAM,UAAU,MAAA,CAChC,CAAC,CAAC/hC,CAAG,CAAA,GAAM,CAACwhC,EAAgB,GAAA,CAAIxhC,CAAAA,CAAI,UAAU,CAChD,EACO+hC,CACT,CAAA,CAEMC,CAAAA,CAAmBF,CAAAA,CAAgB1B,CAAAA,CAAY,KAAK,EAE1D,OAAO,CACL,QAASA,CAAAA,CAAY,IAAA,CACrB,cAAeA,CAAAA,CAAY,aAAA,CAC3B,MAAO4B,CAAAA,CAAmBvB,CAAAA,CAAYL,EAAY,KAAK,CAAA,CAAI,OAC3D,MAAA,CAAQK,CAAAA,CAAYL,EAAY,MAAM,CAAA,CACtC,OAAA,CAASK,CAAAA,CAAYL,CAAAA,CAAY,OAAO,EACxC,QAAA,CAAUA,CAAAA,CAAY,QACxB,CACF,CCrCO,SAAS6B,EAAAA,CACdjyB,CAAAA,CACApB,EACA,CACA,GAAM,CAAE,IAAA,CAAMwxB,CAAY,EAAI/iB,QAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE3E,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,YAAA,CAAcknB,GAAa,IAAI,CAAA,CACzD,WAAY,MAAO,CAAE,WAAAE,CAAAA,CAAY,WAAA,CAAA4B,CAAY,CAAA,GAAe,CAC1D,GAAI,CAAC9B,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,2DACF,CAAA,CAGF,IAAMyB,CAAAA,CAAe,MAAM,OAAA,CAAQK,CAAW,EAAIA,CAAAA,CAAc,CAACA,CAAW,CAAA,CACtE3sB,CAAAA,CAAKqsB,EAAAA,CAAkBxB,CAAAA,CAAayB,CAAY,CAAA,CAEtD,OAAOzsB,CAAAA,CAAoB,CAAC,CAAC,gBAAA,CAAkBG,CAAE,CAAC,CAAA,CAAG+qB,CAAU,CACjE,CAAA,CACA,GAAG1xB,CACL,CAAC,CACH,CCaO,SAASuzB,EAAAA,CACdnyB,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,WAAY,cAAc,CAAA,CAC3B/I,EACA,CAAC,CAAE,QAAAiqB,CAAAA,CAAS,GAAA,CAAA8C,CAAAA,CAAM,YAAa,CAAA,GAAM,CACnCE,GAAoBhD,CAAAA,CAAS8C,CAAG,CAClC,CAAA,CACA,MAAOiC,EAAcnJ,CAAAA,GAAc,CACjC,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,OAAO,CAC3C,CAAC,EACH,CAAA,CACApe,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCtEO,SAASuqB,EAAAA,CACdpyB,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,WAAY,0BAA0B,CAAA,CACvC/I,EACCmJ,CAAAA,EAAY,CACX+jB,EAAAA,CACEltB,CAAAA,CACAmJ,CAAAA,CAAQ,cAAA,CACRA,EAAQ,cAAA,CACRA,CAAAA,CAAQ,gBACRA,CAAAA,CAAQ,OAAA,CACRA,EAAQ,YACV,CACF,CAAA,CACA,SAAY,CACV,MAAMM,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CC3BO,SAASwqB,GACdryB,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,UAAA,CAAY,QAAQ,CAAA,CACrB/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXA,CAAAA,CAAQ,UAAA,CACJ6jB,GAA4BhtB,CAAAA,CAAWmJ,CAAAA,CAAQ,eAAgBA,CAAAA,CAAQ,IAAI,EAC3E0jB,EAAAA,CAAqB7sB,CAAAA,CAAWmJ,CAAAA,CAAQ,cAAA,CAAgBA,CAAAA,CAAQ,IAAA,CAAMA,EAAQ,GAAG,CACvF,EACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAC,EACH,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC7BA,IAAMyqB,EAAAA,CAAwC,GAAA,CAAS,GAAK,EAAA,CACtDC,EAAAA,CAAmB,GAAA,CACnBC,EAAAA,CAA2B,GAAA,CAEjC,SAASC,GAAkBzsB,CAAAA,CAA8B,CACvD,IAAM0sB,CAAAA,CAAU7kB,CAAAA,CAAW7H,EAAQ,cAAc,CAAA,CAAE,MAAA,CAC7CG,CAAAA,CAAW0H,CAAAA,CAAW7H,CAAAA,CAAQ,uBAAuB,CAAA,CAAE,MAAA,CACvDE,EAAY2H,CAAAA,CAAW7H,CAAAA,CAAQ,wBAAwB,CAAA,CAAE,MAAA,CACzDI,CAAAA,CAAeyH,CAAAA,CAAW7H,CAAAA,CAAQ,qBAAqB,EAAE,MAAA,CACzDK,CAAAA,CAAAA,CACH,OAAOL,CAAAA,CAAQ,WAAW,EAAI,MAAA,CAAOA,CAAAA,CAAQ,SAAS,CAAA,EAAK,GAAA,CACxDM,EAAgB,IAAA,CAAK,GAAA,CAAIF,EAAcC,CAAgB,CAAA,CAE7D,OAAOqsB,CAAAA,CAAUvsB,CAAAA,CAAWD,CAAAA,CAAYI,CAC1C,CAEA,SAASqsB,GAAe1sB,CAAAA,CAAe2sB,CAAAA,CAA0BC,EAA0B,CACzF,IAAM9K,EAAgB9hB,CAAAA,CAAQ,GAAA,CAE9B,OAAA,CADe2sB,CAAAA,CAAmBC,CAAAA,CAAY,GAAA,CAAM,GAAK,CAAA,EACzC9K,CAAAA,CAAiB,GACnC,CAEA,SAAS+K,GAAsBC,CAAAA,CAAqC,CAClE,GAAI,MAAA,CAAO,QAAA,CAASA,CAAAA,CAAa,YAAY,CAAA,CAC3C,OAAOA,EAAa,YAAA,EAAgB,EAAA,CAGtC,GAAM,CAACC,CAAAA,CAAQ,IAAKC,CAAAA,CAAQ,GAAG,GAAKF,CAAAA,CAAa,sBAAA,EAA0B,SAAS,KAAA,CAAM,GAAG,EAC7F,OAAO,MAAA,CAAOC,CAAK,CAAA,CAAI,CAAA,EAAM,MAAA,CAAOA,CAAK,CAAA,GAAM,CAAA,EAAK,OAAOC,CAAK,CAAA,EAAK,EACvE,CAEA,SAASC,EAAAA,CACPltB,CAAAA,CACA+sB,CAAAA,CACA3M,CAAAA,CACQ,CACR,IAAM+M,CAAAA,CACJJ,EAAa,oBAAA,EACb,MAAA,CAAOA,EAAa,GAAA,EAAK,aAAA,EAAe,uBAAA,EAA2B,CAAC,CAAA,CAEtE,GAAI,CAAC,MAAA,CAAO,QAAA,CAASI,CAAW,CAAA,EAAKA,CAAAA,EAAe,EAClD,OAAO,CAAA,CAGT,IAAMC,CAAAA,CAAiBX,EAAAA,CAAkBzsB,CAAO,CAAA,CAChD,GAAI,CAAC,MAAA,CAAO,QAAA,CAASotB,CAAc,CAAA,EAAKA,CAAAA,EAAkB,CAAA,CACxD,OAAO,CAAA,CAGT,IAAMrL,EAAgBqL,CAAAA,CAAiB,GAAA,CACjCC,EACJ,IAAA,CAAK,IAAA,CACFtL,EAAgB3B,CAAAA,CAAS,EAAA,CAAK,EAAA,CAAK,EAAA,CACpCmM,EAAAA,EACCY,CAAAA,CAAcb,GACjB,CAAA,CAEIgB,CAAAA,CAAO/sB,GAAgBP,CAAO,CAAA,CAC9BH,EAAc,IAAA,CAAK,GAAA,CAAIytB,CAAAA,CAAK,YAAA,CAAcA,CAAAA,CAAK,QAAQ,EAE7D,OAAI,CAAC,OAAO,QAAA,CAASztB,CAAW,GAAKwtB,CAAAA,CAAWxtB,CAAAA,CACvC,EAGF,IAAA,CAAK,GAAA,CAAIwtB,EAAWb,EAAAA,CAA0B,CAAC,CACxD,CAEO,SAASe,GACdvtB,CAAAA,CACA+sB,CAAAA,CACAH,CAAAA,CACAxM,CAAAA,CAAiB,GAAA,CACT,CACR,GAAI,CAAC,MAAA,CAAO,SAASwM,CAAgB,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASxM,CAAM,CAAA,CAC/D,OAAO,CAAA,CAGT,GAAI0M,EAAAA,CAAsBC,CAAY,EACpC,OAAOG,EAAAA,CAAkBltB,EAAS+sB,CAAAA,CAAc3M,CAAM,CAAA,CAGxD,IAAIoN,CAAAA,CAAa,CAAA,CACjB,GAAI,CAEF,GADAA,EAAaf,EAAAA,CAAkBzsB,CAAO,EAClC,CAAC,MAAA,CAAO,SAASwtB,CAAU,CAAA,CAC7B,OAAO,CAEX,CAAA,KAAQ,CACN,OAAO,CACT,CAEA,OAAOb,EAAAA,CAAea,CAAAA,CAAYZ,CAAAA,CAAkBxM,CAAM,CAC5D,CAEO,SAASqN,EAAAA,CAAYztB,EAA8B,CAExD,OADaO,GAAgBP,CAAO,CAAA,CACxB,UAAA,CAAa,GAC3B,CAEO,SAAS0tB,GAAkBC,CAAAA,CAAe,CAC/C,GAAI,CAAC,MAAA,CAAO,SAASA,CAAK,CAAA,CACxB,MAAM,IAAI,SAAA,CAAU,sCAAsC,EAE5D,GAAIA,CAAAA,CAAQ,GAAKA,CAAAA,CAAQ,GAAA,CACvB,MAAM,IAAI,UAAA,CAAW,wCAAwC,CAAA,CAG/D,OAAA,CADqB,IAAMA,CAAAA,EAET,GAAA,CAAMrB,GAAyC,GAEnE,CAEO,SAASsB,EAAAA,CAAgB5tB,CAAAA,CAA8B,CAC5D,IAAM6tB,CAAAA,CACJ,UAAA,CAAW7tB,EAAQ,cAAc,CAAA,CACjC,WAAWA,CAAAA,CAAQ,uBAAuB,EAC1C,UAAA,CAAWA,CAAAA,CAAQ,wBAAwB,CAAA,CACvC8tB,CAAAA,CAAU,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,GAAQ,GAAI,CAAA,CAAI9tB,EAAQ,gBAAA,CAAiB,gBAAA,CACnEL,CAAAA,CAAWkuB,CAAAA,CAAc,GAAA,CAAW,CAAA,CAE1C,GAAIluB,CAAAA,EAAW,CAAA,CACb,OAAO,CAAA,CAGT,IAAIE,EACF,UAAA,CAAWG,CAAAA,CAAQ,iBAAiB,YAAA,CAAa,QAAA,EAAU,CAAA,CAC1D8tB,CAAAA,CAAUnuB,EAAW2sB,EAAAA,CAEpBzsB,CAAAA,CAAcF,IAChBE,CAAAA,CAAcF,CAAAA,CAAAA,CAEhB,IAAMouB,CAAAA,CAAmBluB,CAAAA,CAAc,GAAA,CAAOF,EAE9C,OAAI,KAAA,CAAMouB,CAAe,CAAA,CAChB,CAAA,CAGLA,EAAkB,GAAA,CACb,GAAA,CAEFA,CACT,CAEO,SAASC,EAAAA,CAAQhuB,EAA4B,CAElD,OADaQ,GAAgBR,CAAO,CAAA,CACxB,WAAa,GAC3B,CAEO,SAASiuB,EAAAA,CACdjuB,CAAAA,CACA+sB,CAAAA,CACAH,EACAxM,CAAAA,CAAiB,GAAA,CACT,CACR,GAAI,CAAC,OAAO,QAAA,CAASwM,CAAgB,GAAK,CAAC,MAAA,CAAO,SAASxM,CAAM,CAAA,CAC/D,OAAO,CAAA,CAET,GAAM,CAAE,gBAAA,CAAA/W,CAAAA,CAAkB,iBAAA,CAAAC,CAAAA,CAAmB,IAAA,CAAAH,CAAAA,CAAM,MAAAC,CAAM,CAAA,CAAI2jB,EAW7D,GARE,CAAC,OAAO,QAAA,CAAS1jB,CAAgB,CAAA,EACjC,CAAC,MAAA,CAAO,QAAA,CAASC,CAAiB,CAAA,EAClC,CAAC,OAAO,QAAA,CAASH,CAAI,GACrB,CAAC,MAAA,CAAO,QAAA,CAASC,CAAK,CAAA,EAKpBC,CAAAA,GAAqB,GAAKD,CAAAA,GAAU,CAAA,CACtC,OAAO,CAAA,CAGT,IAAM8kB,EAAUX,EAAAA,CAAcvtB,CAAAA,CAAS+sB,EAAcH,CAAAA,CAAkBxM,CAAM,EAE7E,OAAK,MAAA,CAAO,SAAS8N,CAAO,CAAA,CAIpBA,EAAU7kB,CAAAA,CAAoBC,CAAAA,EAAqBH,CAAAA,CAAOC,CAAAA,CAAAA,CAHzD,CAIX,KCjKa+kB,EAAAA,CAA0D,CAErE,KAAM,SAAA,CACN,OAAA,CAAS,UACT,cAAA,CAAgB,SAAA,CAChB,eAAA,CAAiB,SAAA,CACjB,oBAAA,CAAsB,SAAA,CAGtB,6BAA8B,QAAA,CAC9B,sBAAA,CAAwB,SACxB,OAAA,CAAS,QAAA,CACT,wBAAyB,QAAA,CACzB,kBAAA,CAAoB,QAAA,CACpB,0BAAA,CAA4B,QAAA,CAC5B,QAAA,CAAU,SACV,qBAAA,CAAuB,QAAA,CACvB,oBAAqB,QAAA,CACrB,mBAAA,CAAqB,SACrB,gBAAA,CAAkB,QAAA,CAGlB,mBAAoB,QAAA,CACpB,kBAAA,CAAoB,SAGpB,cAAA,CAAgB,QAAA,CAChB,gBAAiB,QAAA,CACjB,aAAA,CAAe,SACf,sBAAA,CAAwB,QAAA,CAGxB,qBAAA,CAAuB,QAAA,CACvB,oBAAA,CAAsB,QAAA,CACtB,gBAAiB,QAAA,CACjB,qBAAA,CAAuB,SAGvB,uBAAA,CAAyB,OAAA,CACzB,yBAA0B,OAAA,CAC1B,eAAA,CAAiB,OAAA,CACjB,aAAA,CAAe,OAAA,CACf,iBAAA,CAAmB,OAKrB,EAkCO,SAASC,GAAuBC,CAAAA,CAAyC,CAC9E,IAAMC,CAAAA,CAASD,CAAAA,CAAa,CAAC,CAAA,CACvBlrB,CAAAA,CAAUkrB,CAAAA,CAAa,CAAC,CAAA,CAE9B,GAAIC,IAAW,aAAA,CACb,MAAM,IAAI,KAAA,CAAM,0CAA0C,EAI5D,IAAMC,CAAAA,CAAaprB,EAQnB,OAAIorB,CAAAA,CAAW,gBAAkBA,CAAAA,CAAW,cAAA,CAAe,OAAS,CAAA,CAC3D,QAAA,EAILA,CAAAA,CAAW,sBAAA,EAA0BA,CAAAA,CAAW,sBAAA,CAAuB,OAAS,CAAA,CAC3E,SAAA,CAKX,CA+BO,SAASC,EAAAA,CAAqBC,EAAuC,CAC1E,IAAMH,CAAAA,CAASG,CAAAA,CAAW,CAAC,CAAA,CAE3B,GAAIH,CAAAA,GAAW,iBAAA,EAAqBA,IAAW,iBAAA,CAC7C,MAAM,IAAI,KAAA,CAAM,uCAAuC,CAAA,CAIzD,OAAO,QACT,CAoBO,SAASI,EAAAA,CAAsBnvB,CAAAA,CAA+B,CACnE,IAAM+uB,CAAAA,CAAS/uB,EAAG,CAAC,CAAA,CAGnB,OAAI+uB,CAAAA,GAAW,aAAA,CACNF,GAAuB7uB,CAAE,CAAA,CAI9B+uB,IAAW,iBAAA,EAAqBA,CAAAA,GAAW,kBACtCE,EAAAA,CAAqBjvB,CAAE,CAAA,CAIzB4uB,EAAAA,CAAwBG,CAAM,CAAA,EAAK,SAC5C,CAkCO,SAASK,GAAqBtvB,CAAAA,CAAkC,CACrE,IAAIuvB,CAAAA,CAAmC,SAAA,CAEvC,IAAA,IAAWrvB,CAAAA,IAAMF,CAAAA,CAAK,CACpB,IAAMqC,CAAAA,CAAYgtB,EAAAA,CAAsBnvB,CAAE,CAAA,CAG1C,GAAImC,IAAc,OAAA,CAChB,OAAO,OAAA,CAILA,CAAAA,GAAc,QAAA,EAAYktB,CAAAA,GAAqB,YACjDA,CAAAA,CAAmB,QAAA,EAKvB,CAEA,OAAOA,CACT,CClQO,SAASC,GAAsB70B,CAAAA,CAA8B,CAClE,OAAOkJ,WAAAA,CAAY,CACjB,YAAa,CAAC,YAAA,CAAc,MAAA,CAAQlJ,CAAQ,CAAA,CAC5C,UAAA,CAAY,CAAC,CACX,SAAA,CAAAlM,EACA,SAAA,CAAAghC,CACF,IAGM,CACJ,GAAI,CAAC90B,CAAAA,CACH,MAAM,IAAI,MAAM,yDAAoD,CAAA,CAGtE,IAAIY,CAAAA,CACJ,OAAIk0B,EAAU,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAW,EAAA,CAClCl0B,CAAAA,CAAahB,EAAW,SAAA,CAAUI,CAAAA,CAAU80B,EAAW,QAAQ,CAAA,CACtD3vB,GAAM2vB,CAAS,CAAA,CACxBl0B,EAAahB,CAAAA,CAAW,UAAA,CAAWk1B,CAAS,CAAA,CAE5Cl0B,CAAAA,CAAahB,EAAW,IAAA,CAAKk1B,CAAS,EAGjC1vB,CAAAA,CACL,CAACtR,CAAS,CAAA,CACV8M,CACF,CACF,CACF,CAAC,CACH,CC9BO,SAASm0B,EAAAA,CACd/0B,CAAAA,CACAyH,CAAAA,CACAutB,CAAAA,CAAmD,SACnD,CACA,OAAO9rB,YAAY,CACjB,WAAA,CAAa,CAAC,YAAA,CAAc,eAAA,CAAiBlJ,CAAQ,CAAA,CACrD,UAAA,CAAY,CAAC,CAAE,SAAA,CAAAlM,CAAU,IAAgC,CACvD,GAAI,CAACkM,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,gEACF,EAEF,GAAI,CAACyH,GAAM,SAAA,CACT,MAAM,IAAI,KAAA,CAAM,qDAAgD,CAAA,CAGlE,OAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC3T,CAAS,CAAA,CAAGkhC,CAAO,CAC5C,CACF,CAAC,CACH,CCpBO,SAASC,EAAAA,CAA6BC,CAAAA,CAAc,IAAK,CAC9D,OAAOhsB,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,aAAc,iBAAA,CAAmBgsB,CAAW,EAC1D,UAAA,CAAY,MAAO,CAAE,SAAA,CAAAphC,CAAU,IACtBkU,EAAAA,CAAG,aAAA,CAAclU,EAAW,CAAE,QAAA,CAAUohC,CAAY,CAAA,CAAG,IAAM,CAAC,CAAC,CAE1E,CAAC,CACH,CCRO,SAASC,EAAAA,EAAiC,CAC/C,OAAOzmB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,kBAAkB,EAC3C,OAAA,CAAS,SACA,MAAMzS,CAAAA,CAAQ,oCAAA,CAAsC,EAAE,CAEjE,CAAC,CACH,CCEO,SAASm5B,EAAAA,CACdj+B,CAAAA,CACAqG,EACA63B,CAAAA,CACU,CACV,OAAO,CACL,GAAGl+B,EACH,GAAIqG,CAAAA,EAAY,EAAC,CACjB,KAAA,CAAO63B,EAAK,KAAA,CACZ,IAAA,CAAMA,CAAAA,CAAK,IACb,CACF,CAQO,SAASC,EAAAA,CACd93B,CAAAA,CACA63B,EACU,CACV,OAAO,CACL,GAAI73B,CAAAA,EAAY,EAAC,CACjB,KAAA,CAAO63B,CAAAA,CAAK,MACZ,IAAA,CAAMA,CAAAA,CAAK,IACb,CACF,CCjCO,SAASE,EAAAA,CAAev1B,CAAAA,CAAkBxK,CAAAA,CAA0B,CACzE,OAAO0T,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,cAAA,CAAgBlJ,CAAQ,EAC/C,UAAA,CAAY,MAAO,CAAE,KAAA,CAAAuhB,CAAAA,CAAO,KAAArnB,CAAK,CAAA,GAAuC,CACtE,GAAI,CAAC1E,EACH,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAGrD,IAAMgI,EAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,6BACxB,CACE,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,MAAA+rB,CAAAA,CACA,IAAA,CAAArnB,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAGA,GAAI,CAACsD,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,qCAAA,EAAwCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAE3E,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,SAAA,CAAUA,CAAAA,CAAUqoB,CAAAA,CAAW,CAC7B,IAAMH,EAAc7Y,CAAAA,EAAe,CAK7B2oB,EAAcF,EAAAA,CAAmB93B,CAAAA,CAAUqoB,CAAS,CAAA,CAG1DH,CAAAA,CAAY,YAAA,CACVtK,EAAAA,CAAyBpb,CAAAA,CAAUxK,CAAI,EAAE,QAAA,CACxCpG,CAAAA,EAAS,CAAComC,CAAAA,CAAa,GAAIpmC,GAAQ,EAAG,CACzC,CAAA,CAGAs2B,CAAAA,CAAY,cAAA,CACV,CAAE,QAAA,CAAU,CAAC,QAAS,WAAA,CAAa,UAAA,CAAY1lB,CAAQ,CAAE,CAAA,CACxDkf,GACMA,CAAAA,EAEE,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAACxM,CAAAA,CAAM+iB,CAAAA,GAC9BA,CAAAA,GAAU,CAAA,CACN,CAAE,GAAG/iB,EAAM,IAAA,CAAM,CAAC8iB,EAAa,GAAG9iB,CAAAA,CAAK,IAAI,CAAE,CAAA,CAC7CA,CACN,CACF,CAEJ,EACF,CACF,CAAC,CACH,CC7DO,SAASgjB,EAAAA,CACd11B,CAAAA,CACAxK,CAAAA,CACA,CACA,OAAO0T,WAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,gBAAiBlJ,CAAQ,CAAA,CAChD,WAAY,MAAO,CACjB,WAAA21B,CAAAA,CACA,KAAA,CAAApU,EACA,IAAA,CAAArnB,CACF,IAIM,CACJ,GAAI,CAAC1E,CAAAA,CACH,MAAM,IAAI,MAAM,mCAAmC,CAAA,CAGrD,IAAMgI,CAAAA,CAAW,MADAyQ,GAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,+BAAA,CACxB,CACE,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,EACA,EAAA,CAAImgC,CAAAA,CACJ,KAAA,CAAApU,CAAAA,CACA,IAAA,CAAArnB,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAGA,GAAI,CAACsD,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,wCAAA,EAA2CA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAE9E,OAAOA,CAAAA,CAAS,IAAA,EAClB,EACA,SAAA,CAAUA,CAAAA,CAAUqoB,EAAW,CAC7B,IAAMH,EAAc7Y,CAAAA,EAAe,CAK7B+oB,CAAAA,CAAeC,CAAAA,EACnBT,EAAAA,CAAoBS,CAAAA,CAAUr4B,EAAUqoB,CAAS,CAAA,CAGnDH,EAAY,YAAA,CACVtK,EAAAA,CAAyBpb,EAAUxK,CAAI,CAAA,CAAE,QAAA,CACxCpG,CAAAA,EACCA,CAAAA,EAAM,GAAA,CAAKymC,GACTA,CAAAA,CAAS,EAAA,GAAOhQ,EAAU,UAAA,CAAa+P,CAAAA,CAAYC,CAAQ,CAAA,CAAIA,CACjE,GAAK,EACT,EAGAnQ,CAAAA,CAAY,cAAA,CACV,CAAE,QAAA,CAAU,CAAC,QAAS,WAAA,CAAa,UAAA,CAAY1lB,CAAQ,CAAE,CAAA,CACxDkf,CAAAA,EACMA,GAEE,CACL,GAAGA,EACH,KAAA,CAAOA,CAAAA,CAAQ,MAAM,GAAA,CAAKxM,CAAAA,GAAU,CAClC,GAAGA,CAAAA,CACH,IAAA,CAAMA,EAAK,IAAA,CAAK,GAAA,CAAKmjB,GACnBA,CAAAA,CAAS,EAAA,GAAOhQ,EAAU,UAAA,CAAa+P,CAAAA,CAAYC,CAAQ,CAAA,CAAIA,CACjE,CACF,EAAE,CACJ,CAEJ,EACF,CACF,CAAC,CACH,CC/EO,SAASC,EAAAA,CACd91B,CAAAA,CACAxK,EACA,CACA,OAAO0T,YAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,iBAAA,CAAmBlJ,CAAQ,EAClD,UAAA,CAAY,MAAO,CAAE,UAAA,CAAA21B,CAAW,IAA8B,CAC5D,GAAI,CAACngC,CAAAA,CACH,MAAM,IAAI,MAAM,mCAAmC,CAAA,CAIrD,IAAMgI,CAAAA,CAAW,MAFAyQ,GAAc,CAECzD,CAAAA,CAAO,cAAA,CAAiB,+BAAA,CAAiC,CACvF,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,EACA,EAAA,CAAImgC,CACN,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAKD,GAAI,CAACn4B,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,2CAA2CA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG9E,OAAOA,CACT,CAAA,CACA,SAAA,CAAUooB,CAAAA,CAAOC,CAAAA,CAAW,CAC1B,IAAMH,EAAc7Y,CAAAA,EAAe,CAGnC6Y,EAAY,YAAA,CACVtK,EAAAA,CAAyBpb,EAAUxK,CAAI,CAAA,CAAE,QAAA,CACxCpG,CAAAA,EAAS,CAAC,GAAIA,GAAQ,EAAG,EAAE,MAAA,CAAO,CAAC,CAAE,EAAA,CAAA4C,CAAG,IAAMA,CAAAA,GAAO6zB,CAAAA,CAAU,UAAU,CAC5E,CAAA,CAGAH,EAAY,cAAA,CACV,CAAE,SAAU,CAAC,OAAA,CAAS,WAAA,CAAa,UAAA,CAAY1lB,CAAQ,CAAE,EACxDkf,CAAAA,EACMA,CAAAA,EAEE,CACL,GAAGA,CAAAA,CACH,MAAOA,CAAAA,CAAQ,KAAA,CAAM,GAAA,CAAKxM,CAAAA,GAAU,CAClC,GAAGA,EACH,IAAA,CAAMA,CAAAA,CAAK,KAAK,MAAA,CAAQmjB,CAAAA,EAAaA,EAAS,EAAA,GAAOhQ,CAAAA,CAAU,UAAU,CAC3E,CAAA,CAAE,CACJ,CAEJ,EACF,CACF,CAAC,CACH,CCxDA,eAAekQ,CAAAA,CAAqBv4B,EAAgC,CAClE,GAAI,CAACA,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAIw4B,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAY,MAAMx4B,EAAS,IAAA,GAC7B,MAAQ,CACNw4B,CAAAA,CAAY,OACd,CACA,IAAM/iC,EAAQ,IAAI,KAAA,CAAM,8BAA8BuK,CAAAA,CAAS,MAAM,EAAE,CAAA,CACvE,MAAAvK,EAAM,MAAA,CAASuK,CAAAA,CAAS,MAAA,CACxBvK,CAAAA,CAAM,IAAA,CAAO+iC,CAAAA,CACP/iC,CACR,CAGA,IAAMsC,EAAO,MAAMiI,CAAAA,CAAS,MAAK,CACjC,GAAI,CAACjI,CAAAA,EAAQA,CAAAA,CAAK,MAAK,GAAM,EAAA,CAC3B,OAAO,EAAA,CAGT,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAI,CACxB,CAAA,MAASuD,EAAG,CAEV,OAAA,OAAA,CAAQ,KAAK,sCAAA,CAAwCA,CAAAA,CAAG,YAAavD,CAAI,CAAA,CAClE,EACT,CACF,CAEA,eAAsB0gC,GACpBj2B,CAAAA,CACAsxB,CAAAA,CACA4E,EACAC,CAAAA,CAC+C,CAE/C,IAAM34B,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,8BAA+B,CACrF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,QAAA,CAAAxK,CAAAA,CAAU,MAAAsxB,CAAAA,CAAO,QAAA,CAAA4E,EAAU,aAAA,CAAeC,CAAa,CAAC,CACjF,CAAC,CAAA,CAEK/mC,EAAO,MAAM2mC,CAAAA,CAA2Cv4B,CAAQ,CAAA,CACtE,OAAO,CAAE,MAAA,CAAQA,CAAAA,CAAS,MAAA,CAAQ,IAAA,CAAApO,CAAK,CACzC,CAEA,eAAsBgnC,EAAAA,CACpB9E,EAC+C,CAE/C,IAAM9zB,EAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,wBAAA,CAA0B,CAChF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,MAAA8mB,CAAM,CAAC,CAChC,CAAC,CAAA,CAEKliC,EAAO,MAAM2mC,CAAAA,CAA2Cv4B,CAAQ,CAAA,CACtE,OAAO,CAAE,OAAQA,CAAAA,CAAS,MAAA,CAAQ,KAAApO,CAAK,CACzC,CAEA,eAAsBinC,EAAAA,CACpB7gC,CAAAA,CACA8gC,CAAAA,CACAC,CAAAA,CAAsB,EAAA,CACtBjxB,EAAsB,EAAA,CACP,CACf,IAAMxL,CAAAA,CAKF,CAAE,KAAAtE,CAAAA,CAAM,EAAA,CAAA8gC,CAAG,CAAA,CAEXC,CAAAA,GACFz8B,CAAAA,CAAO,GAAKy8B,CAAAA,CAAAA,CAEVjxB,CAAAA,GACFxL,EAAO,EAAA,CAAKwL,CAAAA,CAAAA,CAId,IAAM9H,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,2BAAA,CAA6B,CACnF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU1Q,CAAM,CAC7B,CAAC,EAED,MAAMi8B,CAAAA,CAAkBv4B,CAAQ,EAClC,CAEA,eAAsBg5B,EAAAA,CACpBhhC,CAAAA,CACAib,CAAAA,CACA0B,EAAuB,IAAA,CACvBU,CAAAA,CAAsB,KACM,CAC5B,IAAMzjB,EAAqF,CACzF,IAAA,CAAAoG,CACF,CAAA,CAEIib,CAAAA,GACFrhB,CAAAA,CAAK,OAASqhB,CAAAA,CAAAA,CAGZ0B,CAAAA,GACF/iB,EAAK,KAAA,CAAQ+iB,CAAAA,CAAAA,CAGXU,IACFzjB,CAAAA,CAAK,IAAA,CAAOyjB,GAId,IAAMrV,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAAqCv4B,CAAQ,CACtD,CAEA,eAAsBi5B,EAAAA,CACpBjhC,CAAAA,CACAwK,EACA02B,CAAAA,CACAC,CAAAA,CACAC,EACA7uB,CAAAA,CACiC,CACjC,IAAM3Y,CAAAA,CAAO,CACX,IAAA,CAAAoG,EACA,QAAA,CAAAwK,CAAAA,CACA,MAAA+H,CAAAA,CACA,MAAA,CAAA2uB,EACA,aAAA,CAAAC,CAAAA,CACA,aAAAC,CACF,CAAA,CAGMp5B,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,+BAAgC,CACtF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA0Cv4B,CAAQ,CAC3D,CAEA,eAAsBq5B,EAAAA,CACpBrhC,EACAwK,CAAAA,CACA+H,CAAAA,CACiC,CACjC,IAAM3Y,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,QAAA,CAAAwK,EAAU,KAAA,CAAA+H,CAAM,EAE/BvK,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,4BAAA,CAA8B,CACpF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAA0Cv4B,CAAQ,CAC3D,CAEA,eAAsBs5B,EAAAA,CACpBthC,CAAAA,CACAxD,CAAAA,CACkC,CAClC,IAAM5C,CAAAA,CAAkD,CACtD,IAAA,CAAAoG,CACF,EACIxD,CAAAA,GACF5C,CAAAA,CAAK,GAAK4C,CAAAA,CAAAA,CAIZ,IAAMwL,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,iCAAA,CAAmC,CACzF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBu5B,EAAAA,CAASvhC,EAA0BqE,CAAAA,CAA+C,CACtG,IAAMzK,CAAAA,CAAO,CAAE,KAAAoG,CAAAA,CAAM,GAAA,CAAAqE,CAAI,CAAA,CAEnB2D,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,yBAAA,CAA2B,CACjF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAOA,IAAMw5B,EAAAA,CAAc,sBAAA,CAEpB,eAAsBC,EAAAA,CACpBC,CAAAA,CACAnvB,EACA1N,CAAAA,CAC0B,CAC1B,IAAM88B,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBmpB,EAAW,IAAI,QAAA,CACrBA,EAAS,MAAA,CAAO,MAAA,CAAQF,CAAI,CAAA,CAE5B,IAAM15B,CAAAA,CAAW,MAAM25B,CAAAA,CAAS,CAAA,EAAGH,EAAW,CAAA,IAAA,EAAOjvB,CAAK,GAAI,CAC5D,MAAA,CAAQ,OACR,IAAA,CAAMqvB,CAAAA,CACN,MAAA,CAAA/8B,CACF,CAAC,CAAA,CAED,OAAO07B,CAAAA,CAAmCv4B,CAAQ,CACpD,CAOA,eAAsB65B,GACpBH,CAAAA,CACAl3B,CAAAA,CACAvP,EACA4J,CAAAA,CAC0B,CAC1B,IAAM88B,CAAAA,CAAWlpB,CAAAA,GACXmpB,CAAAA,CAAW,IAAI,SACrBA,CAAAA,CAAS,MAAA,CAAO,MAAA,CAAQF,CAAI,CAAA,CAE5B,IAAM15B,EAAW,MAAM25B,CAAAA,CAAS,GAAG3sB,CAAAA,CAAO,SAAS,IAAIxK,CAAQ,CAAA,CAAA,EAAIvP,CAAS,CAAA,CAAA,CAAI,CAC9E,MAAA,CAAQ,OACR,IAAA,CAAM2mC,CAAAA,CACN,OAAA/8B,CACF,CAAC,EAED,OAAO07B,CAAAA,CAAmCv4B,CAAQ,CACpD,CAEA,eAAsB85B,GACpB9hC,CAAAA,CACA+hC,CAAAA,CACkC,CAClC,IAAMnoC,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,GAAI+hC,CAAQ,CAAA,CAE3B/5B,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBg6B,EAAAA,CACpBhiC,EACA+rB,CAAAA,CACArnB,CAAAA,CACAghB,EACAvF,CAAAA,CAC8B,CAC9B,IAAMvmB,CAAAA,CAAO,CAAE,IAAA,CAAAoG,EAAM,KAAA,CAAA+rB,CAAAA,CAAO,KAAArnB,CAAAA,CAAM,IAAA,CAAAghB,EAAM,IAAA,CAAAvF,CAAK,EAEvCnY,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,yBAAA,CAA2B,CACjF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAAuCv4B,CAAQ,CACxD,CAEA,eAAsBi6B,GACpBjiC,CAAAA,CACAkiC,CAAAA,CACAnW,EACArnB,CAAAA,CACAghB,CAAAA,CACAvF,EAC8B,CAC9B,IAAMvmB,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,GAAIkiC,CAAAA,CAAS,KAAA,CAAAnW,EAAO,IAAA,CAAArnB,CAAAA,CAAM,KAAAghB,CAAAA,CAAM,IAAA,CAAAvF,CAAK,CAAA,CAEpDnY,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAAuCv4B,CAAQ,CACxD,CAEA,eAAsBm6B,EAAAA,CACpBniC,CAAAA,CACAkiC,EACkC,CAClC,IAAMtoC,EAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,EAAA,CAAIkiC,CAAQ,CAAA,CAE3Bl6B,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACpF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBo6B,GACpBpiC,CAAAA,CACAgb,CAAAA,CACA+Q,EACArnB,CAAAA,CACAyb,CAAAA,CACA/W,CAAAA,CACAi5B,CAAAA,CACAC,CAAAA,CACkC,CAClC,IAAM1oC,CAAAA,CAAgC,CACpC,KAAAoG,CAAAA,CACA,QAAA,CAAAgb,EACA,KAAA,CAAA+Q,CAAAA,CACA,IAAA,CAAArnB,CAAAA,CACA,IAAA,CAAAyb,CAAAA,CACA,SAAAkiB,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,CAEIl5B,CAAAA,GACFxP,EAAK,OAAA,CAAUwP,CAAAA,CAAAA,CAIjB,IAAMpB,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,4BAAA,CAA8B,CACpF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBu6B,GACpBviC,CAAAA,CACAxD,CAAAA,CACkC,CAClC,IAAM5C,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,EAAA,CAAAxD,CAAG,CAAA,CAElBwL,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,+BAAA,CAAiC,CACvF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBw6B,EAAAA,CAAaxiC,EAA0BxD,CAAAA,CAAiC,CAC5F,IAAM5C,CAAAA,CAAO,CAAE,KAAAoG,CAAAA,CAAM,EAAA,CAAAxD,CAAG,CAAA,CAElBwL,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,6BAAA,CAA+B,CACrF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,EAA8Bv4B,CAAQ,CAC/C,CAEA,eAAsBy6B,EAAAA,CACpBziC,EACA+a,CAAAA,CACAC,CAAAA,CACoD,CACpD,IAAMphB,CAAAA,CAAO,CAAE,KAAAoG,CAAAA,CAAM,MAAA,CAAA+a,EAAQ,QAAA,CAAAC,CAAS,EAEhChT,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACpF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAA6Dv4B,CAAQ,CAC9E,CAEA,eAAsB06B,GACpBl4B,CAAAA,CACAsxB,CAAAA,CACA6G,EACkC,CAClC,IAAMC,EAAW,CACf,QAAA,CAAAp4B,EACA,KAAA,CAAAsxB,CAAAA,CACA,MAAA,CAAA6G,CACF,CAAA,CAEM36B,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,oCAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU4tB,CAAQ,CAC/B,CACF,CAAA,CAEA,OAAOrC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CCjcO,SAAS66B,EAAAA,CACdr4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,QAAA,CAAU,KAAA,CAAOlJ,CAAQ,CAAA,CAChD,UAAA,CAAY,MAAO,CACjB,KAAA,CAAAuhB,CAAAA,CACA,IAAA,CAAArnB,CAAAA,CACA,IAAA,CAAAghB,EACA,IAAA,CAAAvF,CACF,IAKM,CACJ,GAAI,CAAC3V,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAE5D,OAAOgiC,GAAShiC,CAAAA,CAAM+rB,CAAAA,CAAOrnB,EAAMghB,CAAAA,CAAMvF,CAAI,CAC/C,CAAA,CACA,SAAA,CAAYvmB,CAAAA,EAAS,CACnB6Z,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,GAEPzd,CAAAA,EAAM,MAAA,CACRkgC,EAAG,YAAA,CAAa3gB,CAAAA,CAAU,MAAM,MAAA,CAAO3O,CAAQ,EAAG5Q,CAAAA,CAAK,MAAM,EAE7DkgC,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,KAAA,CAAM,OAAO3O,CAAQ,CAAE,CAAC,CAAA,CAGrEsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe3O,CAAQ,CAAE,CAAC,EAC7E,EACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCtCO,SAASuS,EAAAA,CACdt4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,QAAA,CAAU,QAAA,CAAUlJ,CAAQ,CAAA,CACnD,UAAA,CAAY,MAAO,CACjB,OAAA,CAAA03B,CAAAA,CACA,KAAA,CAAAnW,CAAAA,CACA,IAAA,CAAArnB,EACA,IAAA,CAAAghB,CAAAA,CACA,KAAAvF,CACF,CAAA,GAMM,CACJ,GAAI,CAAC3V,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,EAE/D,OAAOiiC,EAAAA,CAAYjiC,EAAMkiC,CAAAA,CAASnW,CAAAA,CAAOrnB,CAAAA,CAAMghB,CAAAA,CAAMvF,CAAI,CAC3D,EACA,SAAA,CAAW,IAAM,CACf1M,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,GACXyiB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,MAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,CAAA,CACnEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,EAAU,KAAA,CAAM,cAAA,CAAe3O,CAAQ,CAAE,CAAC,EAC7E,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCjCO,SAASwS,EAAAA,CACdv4B,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,QAAA,CAAU,QAAA,CAAUlJ,CAAQ,CAAA,CACnD,UAAA,CAAY,MAAO,CAAE,OAAA,CAAA03B,CAAQ,CAAA,GAA2B,CACtD,GAAI,CAAC13B,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CAE/D,OAAOmiC,EAAAA,CAAYniC,CAAAA,CAAMkiC,CAAO,CAClC,CAAA,CACA,SAAU,MAAO,CAAE,OAAA,CAAAA,CAAQ,CAAA,GAAM,CAC/B,GAAI,CAAC13B,CAAAA,CACH,OAGF,IAAMsvB,CAAAA,CAAKziB,GAAe,CACpB2iB,CAAAA,CAAU7gB,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,EACzCyvB,CAAAA,CAAiB9gB,CAAAA,CAAU,MAAM,cAAA,CAAe3O,CAAQ,EAE9D,MAAM,OAAA,CAAQ,IAAI,CAChBsvB,CAAAA,CAAG,cAAc,CAAE,QAAA,CAAUE,CAAQ,CAAC,CAAA,CACtCF,EAAG,aAAA,CAAc,CAAE,QAAA,CAAUG,CAAe,CAAC,CAC/C,CAAC,CAAA,CAED,IAAME,EAAeL,CAAAA,CAAG,YAAA,CAAsBE,CAAO,CAAA,CACjDG,CAAAA,EACFL,CAAAA,CAAG,YAAA,CACDE,CAAAA,CACAG,CAAAA,CAAa,OAAQ93B,CAAAA,EAAMA,CAAAA,CAAE,MAAQ6/B,CAAO,CAC9C,EAGF,IAAM5H,CAAAA,CAAkBR,CAAAA,CAAG,cAAA,CAAqD,CAC9E,QAAA,CAAUG,CACZ,CAAC,CAAA,CACKM,EAAmB,IAAI,GAAA,CAAID,CAAe,CAAA,CAChD,IAAA,GAAW,CAAC9/B,CAAAA,CAAKZ,CAAI,IAAK0gC,CAAAA,CACpB1gC,CAAAA,EACFkgC,EAAG,YAAA,CAAat/B,CAAAA,CAAK,CACnB,GAAGZ,CAAAA,CACH,KAAA,CAAOA,CAAAA,CAAK,KAAA,CAAM,GAAA,CAAKsjB,IAAU,CAC/B,GAAGA,EACH,IAAA,CAAMA,CAAAA,CAAK,KAAK,MAAA,CAAQ7a,CAAAA,EAAMA,CAAAA,CAAE,GAAA,GAAQ6/B,CAAO,CACjD,EAAE,CACJ,CAAC,EAIL,OAAO,CAAE,aAAA/H,CAAAA,CAAc,gBAAA,CAAAI,CAAiB,CAC1C,CAAA,CACA,SAAA,CAAW,IAAM,CACf9mB,CAAAA,KACA,IAAMqmB,CAAAA,CAAKziB,GAAe,CAC1ByiB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,EACnEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,KAAA,CAAM,eAAe3O,CAAQ,CAAE,CAAC,EAC7E,CAAA,CACA,QAAS,CAAC9G,CAAAA,CAAKs/B,CAAAA,CAAYxI,CAAAA,GAAY,CACrC,IAAMV,EAAKziB,CAAAA,EAAe,CAI1B,GAHImjB,CAAAA,EAAS,YAAA,EACXV,EAAG,YAAA,CAAa3gB,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAA,CAAGgwB,EAAQ,YAAY,CAAA,CAEpEA,GAAS,gBAAA,CACX,IAAA,GAAW,CAAChgC,CAAAA,CAAKZ,CAAI,IAAK4gC,CAAAA,CAAQ,gBAAA,CAChCV,EAAG,YAAA,CAAat/B,CAAAA,CAAKZ,CAAI,CAAA,CAG7B22B,CAAAA,GAAU7sB,CAAG,EACf,CACF,CAAC,CACH,CC3EO,SAASu/B,EAAAA,CACdz4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,YAAa,KAAA,CAAOlJ,CAAQ,EACnD,UAAA,CAAY,MAAO,CACjB,QAAA,CAAAwQ,CAAAA,CACA,KAAA,CAAA+Q,EACA,IAAA,CAAArnB,CAAAA,CACA,KAAAyb,CAAAA,CACA,OAAA,CAAA/W,EACA,QAAA,CAAAi5B,CAAAA,CACA,OAAAC,CACF,CAAA,GAQM,CACJ,GAAI,CAAC93B,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CAE/D,OAAOoiC,EAAAA,CAAYpiC,EAAMgb,CAAAA,CAAU+Q,CAAAA,CAAOrnB,EAAMyb,CAAAA,CAAM/W,CAAAA,CAASi5B,EAAUC,CAAM,CACjF,CAAA,CACA,SAAA,CAAW,IAAM,CACf7uB,KAAY,CACZ4D,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,SAAU8B,CAAAA,CAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAC9C,CAAC,EACH,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCtCO,SAAS2S,GACd14B,CAAAA,CACAxK,CAAAA,CACAyT,EACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,WAAA,CAAa,SAAUlJ,CAAQ,CAAA,CACtD,WAAY,MAAO,CAAE,GAAAhO,CAAG,CAAA,GAAsB,CAC5C,GAAI,CAACgO,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,qDAAgD,EAElE,OAAOuiC,EAAAA,CAAeviC,CAAAA,CAAMxD,CAAE,CAChC,CAAA,CACA,UAAY5C,CAAAA,EAAS,CACnB6Z,KAAY,CACZ,IAAMqmB,EAAKziB,CAAAA,EAAe,CAEtBzd,EACFkgC,CAAAA,CAAG,YAAA,CAAa3gB,EAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAAA,CAAG5Q,CAAI,EAEzDkgC,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,KAAA,CAAM,UAAU3O,CAAQ,CAAE,CAAC,EAE1E,CAAA,CACA,QAAA+lB,CACF,CAAC,CACH,CC1BO,SAAS4S,GACd34B,CAAAA,CACAxK,CAAAA,CACAyT,EACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,WAAA,CAAa,OAAQlJ,CAAQ,CAAA,CACpD,WAAY,MAAO,CAAE,GAAAhO,CAAG,CAAA,GAAsB,CAC5C,GAAI,CAACgO,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,mDAA8C,CAAA,CAEhE,OAAOwiC,EAAAA,CAAaxiC,EAAMxD,CAAE,CAC9B,EACA,SAAA,CAAY5C,CAAAA,EAAS,CACnB6Z,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,EAAe,CAEtBzd,EACFkgC,CAAAA,CAAG,YAAA,CAAa3gB,EAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAAA,CAAG5Q,CAAI,CAAA,CAEzDkgC,CAAAA,CAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,UAAU3O,CAAQ,CAAE,CAAC,CAAA,CAGxEsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,EACrE,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CChBO,SAAS6S,EAAAA,CACd54B,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,EACA,CACA,OAAO7c,YAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,QAAA,CAAU,MAAOlJ,CAAQ,CAAA,CAChD,UAAA,CAAY,MAAO,CAAE,GAAA,CAAAnG,EAAK,IAAA,CAAMg/B,CAAS,IAAsC,CAC7E,IAAMC,EAAgBD,CAAAA,EAAYrjC,CAAAA,CAElC,GAAI,CAACwK,CAAAA,EAAY,CAAC84B,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,EAE5D,OAAO/B,EAAAA,CAAS+B,CAAAA,CAAej/B,CAAG,CACpC,CAAA,CACA,UAAW,IAAM,CACfoP,KAAY,CACZ4D,CAAAA,GAAiB,iBAAA,CAAkB,CACjC,QAAA,CAAU8B,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAC3C,CAAC,EACH,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCtBO,SAASgT,EAAAA,CACd/4B,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,EACA,CACA,OAAO7c,YAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,QAAA,CAAU,SAAUlJ,CAAQ,CAAA,CACnD,WAAY,MAAO,CAAE,OAAA,CAAAu3B,CAAQ,CAAA,GAA2B,CACtD,GAAI,CAACv3B,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CAE/D,OAAO8hC,EAAAA,CAAY9hC,CAAAA,CAAM+hC,CAAO,CAClC,CAAA,CACA,UAAW,CAAC3R,CAAAA,CAAOC,IAAc,CAC/B5c,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,GACL,CAAE,OAAA,CAAA0qB,CAAQ,CAAA,CAAI1R,CAAAA,CAGpByJ,EAAG,YAAA,CACD,CAAC,QAAS,QAAA,CAAUtvB,CAAQ,EAC3Bg5B,CAAAA,EAASA,CAAAA,EAAM,OAAQC,CAAAA,EAAQA,CAAAA,CAAI,MAAQ1B,CAAO,CACrD,CAAA,CAGAjI,CAAAA,CAAG,cAAA,CACD,CAAE,SAAU,CAAC,OAAA,CAAS,SAAU,UAAA,CAAYtvB,CAAQ,CAAE,CAAA,CACrDkf,CAAAA,EACMA,CAAAA,EACE,CACL,GAAGA,CAAAA,CACH,MAAOA,CAAAA,CAAQ,KAAA,CAAM,IAAKxM,CAAAA,GAAU,CAClC,GAAGA,CAAAA,CACH,IAAA,CAAMA,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQumB,CAAAA,EAAQA,EAAI,GAAA,GAAQ1B,CAAO,CACrD,CAAA,CAAE,CACJ,CAEJ,EACF,CAAA,CACA,QAAAxR,CACF,CAAC,CACH,CC1CO,SAASmT,EAAAA,CACdjwB,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,QAAA,CAAU,QAAQ,EACzC,UAAA,CAAY,MAAO,CACjB,IAAA,CAAAguB,CAAAA,CACA,KAAA,CAAAnvB,EACA,MAAA,CAAA1N,CACF,IAKS48B,EAAAA,CAAYC,CAAAA,CAAMnvB,EAAO1N,CAAM,CAAA,CAExC,SAAA,CAAA4O,CAAAA,CACA,OAAA,CAAA8c,CACF,CAAC,CACH,CClCA,SAAS/E,EAAAA,CAAczQ,CAAAA,CAAgBC,EAAkB,CACvD,OAAO,KAAKD,CAAM,CAAA,CAAA,EAAIC,CAAQ,CAAA,CAChC,CAEA,SAAS2oB,EAAAA,CACP5oB,CAAAA,CACAC,EACA8e,CAAAA,CACmB,CAEnB,OAAA,CADoBA,CAAAA,EAAMziB,CAAAA,EAAe,EACtB,aACjB8B,CAAAA,CAAU,KAAA,CAAM,MAAMqS,EAAAA,CAAczQ,CAAAA,CAAQC,CAAQ,CAAC,CACvD,CACF,CAEA,SAAS4oB,EAAAA,CAAgBxf,EAAc0V,CAAAA,CAAkB,CAAA,CACnCA,GAAMziB,CAAAA,EAAe,EAC7B,aACV8B,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAMqS,EAAAA,CAAcpH,CAAAA,CAAM,MAAA,CAAQA,EAAM,QAAQ,CAAC,EACjEA,CACF,EACF,CAEA,SAASyf,EAAAA,CACP9oB,EACAC,CAAAA,CACA8oB,CAAAA,CACAhK,EACmB,CACnB,IAAM5J,EAAc4J,CAAAA,EAAMziB,CAAAA,GACpB3P,CAAAA,CAAO8jB,EAAAA,CAAczQ,CAAAA,CAAQC,CAAQ,CAAA,CACrCrZ,CAAAA,CAAWuuB,EAAY,YAAA,CAAoB/W,CAAAA,CAAU,MAAM,KAAA,CAAMzR,CAAI,CAAC,CAAA,CAC5E,GAAI,CAAC/F,CAAAA,CAAU,OAEf,IAAMoiC,EAAUD,CAAAA,CAAQniC,CAAQ,EAChC,OAAAuuB,CAAAA,CAAY,aAAoB/W,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAA,CAAGq8B,CAAO,EAC7DpiC,CACT,KASiBqiC,GAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CACdlpB,CAAAA,CACAC,EACA6B,CAAAA,CACAqnB,CAAAA,CACApK,EACA,CACA+J,EAAAA,CACE9oB,EACAC,CAAAA,CACCoJ,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,YAAA,CAAcvH,CAAAA,CACd,KAAA,CAAO,CACL,GAAIuH,CAAAA,CAAM,KAAA,EAAS,CACjB,IAAA,CAAM,KAAA,CACN,KAAM,KAAA,CACN,WAAA,CAAa,CAAA,CACb,WAAA,CAAa,CACf,CAAA,CACA,YAAavH,CAAAA,CAAM,MAAA,CACnB,YAAauH,CAAAA,CAAM,KAAA,EAAO,aAAe,CAC3C,CAAA,CACA,WAAA,CAAavH,CAAAA,CAAM,MAAA,CACnB,MAAA,CAAAqnB,EACA,oBAAA,CAAsB,MAAA,CAAOA,CAAM,CACrC,CAAA,CAAA,CACApK,CACF,EACF,CA7BOkK,EAAS,WAAA,CAAAC,CAAAA,CA+BT,SAASE,CAAAA,CACdppB,CAAAA,CACAC,EACAopB,CAAAA,CACAtK,CAAAA,CACA,CACA+J,EAAAA,CACE9oB,CAAAA,CACAC,CAAAA,CACCoJ,CAAAA,GAAW,CACV,GAAGA,EACH,OAAA,CAASggB,CACX,GACAtK,CACF,EACF,CAfOkK,CAAAA,CAAS,kBAAA,CAAAG,CAAAA,CAiBT,SAASE,CAAAA,CACdtpB,CAAAA,CACAC,EACAopB,CAAAA,CACAtK,CAAAA,CACA,CACA+J,EAAAA,CACE9oB,CAAAA,CACAC,EACCoJ,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,QAAA,CAAUggB,CACZ,GACAtK,CACF,EACF,CAfOkK,CAAAA,CAAS,kBAAA,CAAAK,EAiBT,SAASC,CAAAA,CACdC,EACAzT,CAAAA,CACAC,CAAAA,CACA+I,EACA,CACA+J,EAAAA,CACE/S,EACAC,CAAAA,CACC3M,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAAW,CAAA,CAC3B,QAAS,CAACmgB,CAAAA,CAAO,GAAGngB,CAAAA,CAAM,OAAO,CACnC,CAAA,CAAA,CACA0V,CACF,EACF,CAhBOkK,CAAAA,CAAS,QAAA,CAAAM,EAkBT,SAASE,CAAAA,CAAchV,EAAkBsK,CAAAA,CAAkB,CAChEtK,EAAQ,OAAA,CAASpL,CAAAA,EAAUwf,EAAAA,CAAgBxf,CAAAA,CAAO0V,CAAE,CAAC,EACvD,CAFOkK,CAAAA,CAAS,cAAAQ,CAAAA,CAIT,SAASC,EACd1pB,CAAAA,CACAC,CAAAA,CACA8e,EACA,CAAA,CACoBA,CAAAA,EAAMziB,GAAe,EAC7B,iBAAA,CAAkB,CAC5B,QAAA,CAAU8B,CAAAA,CAAU,MAAM,KAAA,CAAMqS,EAAAA,CAAczQ,CAAAA,CAAQC,CAAQ,CAAC,CACjE,CAAC,EACH,CATOgpB,EAAS,eAAA,CAAAS,CAAAA,CAWT,SAASC,CAAAA,CACd3pB,CAAAA,CACAC,CAAAA,CACA8e,CAAAA,CACmB,CACnB,OAAO6J,GAAkB5oB,CAAAA,CAAQC,CAAAA,CAAU8e,CAAE,CAC/C,CANOkK,EAAS,QAAA,CAAAU,EAAAA,CAAAA,EAnGDV,EAAAA,GAAA,EAAA,CAAA,CCrCV,SAASW,EAAAA,CACdC,EACApoB,CAAAA,CACAoU,CAAAA,CACS,CACT,IAAMiU,CAAAA,CAAiBD,EAAY,IAAA,CAAMprC,CAAAA,EAAMA,EAAE,KAAA,GAAUgjB,CAAK,EAChE,OAAOoU,CAAAA,GAAW,EAAIiU,CAAAA,CAAiB,CAACA,CAC1C,CAyBO,SAASC,EAAAA,CACdt6B,CAAAA,CACA6lB,CAAAA,CACAyJ,CAAAA,CACM,CACN,IAAM1V,CAAAA,CAAQ4f,GAAuB,QAAA,CAAS3T,CAAAA,CAAU,OAAQA,CAAAA,CAAU,QAAA,CAAUyJ,CAAE,CAAA,CACtF,GACE,CAAC1V,GAAO,YAAA,EACRugB,EAAAA,CAAuBvgB,EAAM,YAAA,CAAc5Z,CAAAA,CAAU6lB,EAAU,MAAM,CAAA,CAErE,OAEF,IAAM0U,CAAAA,CAAW,CACf,GAAG3gB,CAAAA,CAAM,YAAA,CAAa,OAAQ5qB,CAAAA,EAAMA,CAAAA,CAAE,QAAUgR,CAAQ,CAAA,CACxD,GAAI6lB,CAAAA,CAAU,MAAA,GAAW,EAAI,CAAC,CAAE,QAASA,CAAAA,CAAU,MAAA,CAAQ,MAAO7lB,CAAU,CAAC,CAAA,CAAI,EACnF,CAAA,CACMw6B,EAAY5gB,CAAAA,CAAM,MAAA,EAAUiM,EAAU,SAAA,EAAa,CAAA,CAAA,CACzD2T,GAAuB,WAAA,CACrB3T,CAAAA,CAAU,MAAA,CACVA,CAAAA,CAAU,QAAA,CACV0U,CAAAA,CACAC,EACAlL,CACF,EACF,CA0DO,SAASmL,EAAAA,CACdz6B,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAS,MAAM,CAAA,CAChB/I,EACA,CAAC,CAAE,OAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,EAAU,MAAA,CAAA4V,CAAO,IAAM,CAChCD,EAAAA,CAAYnmB,EAAWuQ,CAAAA,CAAQC,CAAAA,CAAU4V,CAAM,CACjD,CAAA,CACA,MAAO76B,CAAAA,CAAas6B,CAAAA,GAAc,CAGhCyU,GAAqBt6B,CAAAA,CAAU6lB,CAAS,EAKxC,IAAM5mB,CAAAA,CAAO1T,GAAQ,EAAA,EAAMA,CAAAA,EAAQ,KAAA,CAOnC,GANIkc,CAAAA,EAAM,OAAA,EAAS,gBAAkBxI,CAAAA,EACnCwI,CAAAA,CAAK,QAAQ,cAAA,CAAe,GAAA,CAAKxI,EAAM1T,CAAAA,EAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,CAAA,CAKtEkc,CAAAA,EAAM,SAAS,iBAAA,CAAmB,CACpC,IAAMizB,CAAAA,CAAe,IAAM,CACzBjzB,CAAAA,CAAK,OAAA,CAAS,kBAAmB,CAC/BkH,CAAAA,CAAU,MAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,EAAU,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,CAAA,CACnElX,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CAAA,CACa6H,CAAAA,EAAiB,OAAA,IACjB,OAAA,CACX,UAAA,CAAW6yB,CAAAA,CAAc,GAAI,CAAA,CAE7BA,CAAAA,GAEJ,CACF,CAAA,CACAjzB,EACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC/GO,SAAS8yB,GACd36B,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,OAAA,CAAS,QAAQ,CAAA,CAClB/I,CAAAA,CACA,CAAC,CAAE,MAAA,CAAAuQ,EAAQ,QAAA,CAAAC,CAAAA,CAAU,YAAA,CAAAwW,CAAa,CAAA,GAAM,CACtCD,GAAc/mB,CAAAA,CAAWuQ,CAAAA,CAAQC,EAAUwW,CAAAA,EAAgB,KAAK,CAClE,CAAA,CACA,MAAOz7B,CAAAA,CAAas6B,CAAAA,GAAc,CAEhC,IAAMjM,EAAQ4f,EAAAA,CAAuB,QAAA,CAAS3T,EAAU,MAAA,CAAQA,CAAAA,CAAU,QAAQ,CAAA,CAClF,GAAIjM,CAAAA,CAAO,CACT,IAAMghB,CAAAA,CAAW,KAAK,GAAA,CAAI,CAAA,CAAA,CAAIhhB,EAAM,OAAA,EAAW,CAAA,GAAMiM,EAAU,YAAA,CAAe,EAAA,CAAK,EAAE,CAAA,CACrF2T,EAAAA,CAAuB,mBAAmB3T,CAAAA,CAAU,MAAA,CAAQA,EAAU,QAAA,CAAU+U,CAAQ,EAC1F,CAKA,IAAM37B,CAAAA,CAAO1T,CAAAA,EAAQ,EAAA,EAAMA,CAAAA,EAAQ,MAC/Bkc,CAAAA,EAAM,OAAA,EAAS,gBAAkBxI,CAAAA,EACnCwI,CAAAA,CAAK,QAAQ,cAAA,CAAe,GAAA,CAAKxI,CAAAA,CAAM1T,CAAAA,EAAQ,SAAS,CAAA,CAAE,MAAM,IAAM,CAAC,CAAC,CAAA,CAK1E,IAAMsvC,EAAa,IAAM,CACZhuB,CAAAA,EAAe,CACvB,iBAAA,CAAkB,CACnB,SAAU8B,CAAAA,CAAU,KAAA,CAAM,uBAAuB3O,CAAS,CAC5D,CAAC,CAAA,CACGyH,CAAAA,EAAM,SAAS,iBAAA,EACjBA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CAC7BkH,EAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,EACnElX,CAAAA,CAAU,KAAA,CAAM,YAAYkX,CAAAA,CAAU,MAAA,CAAQA,EAAU,QAAQ,CAClE,CAAC,EAEL,CAAA,CAAA,CACahe,CAAAA,EAAiB,WACjB,OAAA,CACX,UAAA,CAAWgzB,EAAY,GAAI,CAAA,CAE3BA,IAEJ,CAAA,CACApzB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CCIO,SAASizB,GACd96B,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,OAAA,CAAS,SAAS,CAAA,CACnB/I,CAAAA,CACCmJ,GAAY,CACX,IAAM9E,CAAAA,CAA0B,EAAC,CAgBjC,GAbAA,EAAW,IAAA,CACTgiB,EAAAA,CACEld,EAAQ,MAAA,CACRA,CAAAA,CAAQ,SACRA,CAAAA,CAAQ,YAAA,CACRA,CAAAA,CAAQ,cAAA,CACRA,CAAAA,CAAQ,KAAA,CACRA,EAAQ,IAAA,CACRA,CAAAA,CAAQ,YACV,CACF,CAAA,CAGIA,EAAQ,OAAA,CAAS,CACnB,GAAM,CACJ,iBAAA,CAAAsd,CAAAA,CAAoB,kBACpB,UAAA,CAAAC,CAAAA,CAAa,IACb,UAAA,CAAAC,CAAAA,CAAa,KACb,oBAAA,CAAAC,CAAAA,CAAuB,KACvB,aAAA,CAAAmU,CAAAA,CAAgB,EAClB,CAAA,CAAI5xB,EAAQ,OAAA,CAEN0d,CAAAA,CAAoB,EAAC,CAG3B,GAAIkU,CAAAA,CAAc,MAAA,CAAS,CAAA,CAAG,CAE5B,IAAMC,CAAAA,CAAsB,CAAC,GAAGD,CAAa,CAAA,CAAE,KAAK,CAACpqC,CAAAA,CAAGtF,CAAAA,GACtDsF,CAAAA,CAAE,OAAA,CAAQ,aAAA,CAActF,EAAE,OAAO,CACnC,EAEAw7B,CAAAA,CAAW,IAAA,CAAK,CACd,CAAA,CACA,CACE,aAAA,CAAemU,CAAAA,CAAoB,GAAA,CAAI3vC,CAAAA,GAAM,CAC3C,OAAA,CAASA,CAAAA,CAAE,QACX,MAAA,CAAQA,CAAAA,CAAE,MACZ,CAAA,CAAE,CACJ,CACF,CAAC,EACH,CAEAgZ,CAAAA,CAAW,IAAA,CACTmiB,GACErd,CAAAA,CAAQ,MAAA,CACRA,EAAQ,QAAA,CACRsd,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CACF,CACF,EACF,CAEA,OAAOxiB,CACT,CAAA,CACA,MAAO9Y,CAAAA,CAAas6B,CAAAA,GAAc,CAEhC,IAAMoV,CAAAA,CAAS,CAACpV,EAAU,YAAA,CACpBqV,CAAAA,CAAeD,EAAS,GAAA,CAAM,GAAA,CAK9Bh8B,EAAO1T,CAAAA,EAAQ,EAAA,EAAMA,CAAAA,EAAQ,KAAA,CAMnC,GALIkc,CAAAA,EAAM,SAAS,cAAA,EAAkBxI,CAAAA,EACnCwI,EAAK,OAAA,CAAQ,cAAA,CAAeyzB,EAAcj8B,CAAAA,CAAM1T,CAAAA,EAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,EAI/Ekc,CAAAA,EAAM,OAAA,EAAS,kBAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,EAAU,eAAA,CAAgB,OAAA,CAAQ3O,CAAS,CAC7C,CAAA,CAGA,GAAI,CAACi7B,CAAAA,CAAQ,CAEXE,EAAoB,IAAA,CAClBxsB,CAAAA,CAAU,MAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,EAAU,YAAY,CAAA,CAAA,EAAIA,CAAAA,CAAU,cAAc,CAAA,CAAE,CACjF,EAMA,IAAMuV,CAAAA,CAAoBvV,EAAU,UAAA,EAAcA,CAAAA,CAAU,aACtDwV,CAAAA,CAAsBxV,CAAAA,CAAU,cAAgBA,CAAAA,CAAU,cAAA,CAEhEsV,EAAoB,IAAA,CAAK,CACvB,UAAY9pB,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,OAAA,EACXA,EAAI,CAAC,CAAA,GAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAMorC,GACXprC,CAAAA,CAAI,CAAC,IAAMqrC,CAEf,CACF,CAAC,EACH,CAEA,MAAM5zB,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,EACA1zB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCzOO,SAASyzB,EAAAA,CACd1hB,CAAAA,CACA2hB,EACAC,CAAAA,CACAlM,CAAAA,CACA,CACA,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACnC4uB,CAAAA,CAAU/V,EAAY,cAAA,CAAwB,CAClD,UAAYrU,CAAAA,EAAU,CACpB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,OAAA,EACXA,EAAI,CAAC,CAAA,GAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAMurC,GACXvrC,CAAAA,CAAI,CAAC,IAAMwrC,CAEf,CACF,CAAC,CAAA,CAED,IAAA,GAAW,CAACxuB,CAAAA,CAAU5d,CAAI,IAAKqsC,CAAAA,CACzBrsC,CAAAA,EACFs2B,EAAY,YAAA,CAAsB1Y,CAAAA,CAAU,CAAC4M,CAAAA,CAAO,GAAGxqB,CAAI,CAAC,EAGlE,CAMO,SAASssC,EAAAA,CACdnrB,CAAAA,CACAC,EACA+qB,CAAAA,CACAC,CAAAA,CACAlM,EACkC,CAClC,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACnC8uB,EAAY,IAAI,GAAA,CAEhBF,EAAU/V,CAAAA,CAAY,cAAA,CAAwB,CAClD,SAAA,CAAYrU,CAAAA,EAAU,CACpB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,SAClB,OACE,KAAA,CAAM,QAAQrhB,CAAG,CAAA,EACjBA,EAAI,CAAC,CAAA,GAAM,SACXA,CAAAA,CAAI,CAAC,IAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAMurC,CAAAA,EACXvrC,EAAI,CAAC,CAAA,GAAMwrC,CAEf,CACF,CAAC,CAAA,CAED,OAAW,CAACxuB,CAAAA,CAAU5d,CAAI,CAAA,GAAKqsC,CAAAA,CACzBrsC,IACFusC,CAAAA,CAAU,GAAA,CAAI3uB,CAAAA,CAAU5d,CAAI,CAAA,CAC5Bs2B,CAAAA,CAAY,aACV1Y,CAAAA,CACA5d,CAAAA,CAAK,OACF0J,CAAAA,EAAMA,CAAAA,CAAE,SAAWyX,CAAAA,EAAUzX,CAAAA,CAAE,QAAA,GAAa0X,CAC/C,CACF,CAAA,CAAA,CAIJ,OAAOmrB,CACT,CAKO,SAASC,EAAAA,CACdD,CAAAA,CACArM,EACA,CACA,IAAM5J,EAAc4J,CAAAA,EAAMziB,CAAAA,GAC1B,IAAA,GAAW,CAACG,EAAU5d,CAAI,CAAA,GAAKusC,EAC7BjW,CAAAA,CAAY,YAAA,CAAsB1Y,CAAAA,CAAU5d,CAAI,EAEpD,CAMO,SAASysC,EAAAA,CACdtrB,CAAAA,CACAC,EACAsrB,CAAAA,CACAxM,CAAAA,CACmB,CACnB,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACnC3P,CAAAA,CAAO,KAAKqT,CAAM,CAAA,CAAA,EAAIC,CAAQ,CAAA,CAAA,CAC9BurB,CAAAA,CAAWrW,EAAY,YAAA,CAAoB/W,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAC,EAE5E,OAAI6+B,CAAAA,EACFrW,EAAY,YAAA,CAAoB/W,CAAAA,CAAU,MAAM,KAAA,CAAMzR,CAAI,EAAG,CAC3D,GAAG6+B,EACH,GAAGD,CACL,CAAC,CAAA,CAGIC,CACT,CAKO,SAASC,EAAAA,CACdzrB,CAAAA,CACAC,CAAAA,CACAoJ,CAAAA,CACA0V,CAAAA,CACA,CACA,IAAM5J,CAAAA,CAAc4J,GAAMziB,CAAAA,EAAe,CACnC3P,EAAO,CAAA,EAAA,EAAKqT,CAAM,CAAA,CAAA,EAAIC,CAAQ,CAAA,CAAA,CACpCkV,CAAAA,CAAY,aAAoB/W,CAAAA,CAAU,KAAA,CAAM,MAAMzR,CAAI,CAAA,CAAG0c,CAAK,EACpE,CCvFO,SAASqiB,EAAAA,CACdj8B,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,OAAA,CAAS,eAAe,CAAA,CACzB/I,CAAAA,CACA,CAAC,CAAE,MAAA,CAAAuQ,EAAQ,QAAA,CAAAC,CAAS,IAAM,CACxBsW,EAAAA,CAAqBvW,EAAQC,CAAQ,CACvC,CAAA,CACA,MAAOwe,CAAAA,CAAcnJ,CAAAA,GAAc,CAEjC,GAAIpe,CAAAA,EAAM,SAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAA,CAGA,GAAI6lB,EAAU,YAAA,EAAgBA,CAAAA,CAAU,eAAgB,CACtDsV,CAAAA,CAAoB,IAAA,CAClBxsB,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,YAAY,IAAIA,CAAAA,CAAU,cAAc,EAAE,CACjF,CAAA,CAEA,IAAMuV,CAAAA,CAAoBvV,CAAAA,CAAU,YAAcA,CAAAA,CAAU,YAAA,CACtDwV,EAAsBxV,CAAAA,CAAU,YAAA,EAAgBA,EAAU,cAAA,CAEhEsV,CAAAA,CAAoB,IAAA,CAAK,CACvB,SAAA,CAAY9pB,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,EAAM,QAAA,CAClB,OACE,MAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,SACXA,CAAAA,CAAI,CAAC,IAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAMorC,CAAAA,EACXprC,CAAAA,CAAI,CAAC,CAAA,GAAMqrC,CAEf,CACF,CAAC,EACH,CAEA,MAAM5zB,CAAAA,CAAK,QAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,EACA,SAAA,CACA,CACE,cAAAI,CAAAA,CAEA,QAAA,CAAU,MAAOge,CAAAA,EAAc,CAC7B,IAAM0V,CAAAA,CAAa1V,CAAAA,CAAU,UAAA,EAAcA,EAAU,YAAA,CAC/C2V,CAAAA,CAAe3V,EAAU,YAAA,EAAgBA,CAAAA,CAAU,eAEzD,OAAI0V,CAAAA,EAAcC,CAAAA,CAOT,CAAE,SAAA,CANSE,EAAAA,CAChB7V,EAAU,MAAA,CACVA,CAAAA,CAAU,SACV0V,CAAAA,CACAC,CACF,CACmB,CAAA,CAEd,EACT,CAAA,CAEA,OAAA,CAAS,CAACU,EAAQ1D,CAAAA,CAAYxI,CAAAA,GAAY,CACxC,GAAM,CAAE,UAAA2L,CAAU,CAAA,CAAK3L,GAAgE,EAAC,CACpF2L,GACFC,EAAAA,CAA2BD,CAAS,EAExC,CACF,CACF,CACF,CCvBO,SAASQ,EAAAA,CACdn8B,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,OAAA,CAAS,YAAY,EACtB/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM9E,CAAAA,CAA0B,GAgBhC,GAbAA,CAAAA,CAAW,KACTgiB,EAAAA,CACEld,CAAAA,CAAQ,OACRA,CAAAA,CAAQ,QAAA,CACR,EAAA,CACAA,CAAAA,CAAQ,cAAA,CACRA,CAAAA,CAAQ,MACRA,CAAAA,CAAQ,IAAA,CACRA,EAAQ,YACV,CACF,EAGIA,CAAAA,CAAQ,OAAA,CAAS,CACnB,GAAM,CACJ,kBAAAsd,CAAAA,CAAoB,iBAAA,CACpB,WAAAC,CAAAA,CAAa,GAAA,CACb,WAAAC,CAAAA,CAAa,IAAA,CACb,oBAAA,CAAAC,CAAAA,CAAuB,IACzB,CAAA,CAAIzd,EAAQ,OAAA,CAEZ9E,CAAAA,CAAW,KACTmiB,EAAAA,CACErd,CAAAA,CAAQ,OACRA,CAAAA,CAAQ,QAAA,CACRsd,EACAC,CAAAA,CACAC,CAAAA,CACAC,EACA,EACF,CACF,EACF,CAEA,OAAOviB,CACT,CAAA,CACA,MAAO2qB,CAAAA,CAAcnJ,CAAAA,GAAc,CAEjC,GAAIpe,CAAAA,EAAM,OAAA,EAAS,kBAAmB,CACpC,IAAM0zB,EAA6B,CACjCxsB,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAEhC,CACE,SAAA,CAAYqR,GAAe,CACzB,IAAMrhB,EAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,GACjBA,CAAAA,CAAI,CAAC,IAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,cAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM61B,CAAAA,CAAU,cAEzB,CACF,CACF,EACA,MAAMpe,CAAAA,CAAK,QAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CClEO,SAASu0B,GACdp8B,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,OAAA,CAAS,cAAc,CAAA,CACxB/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM9E,CAAAA,CAA0B,EAAC,CAgBjC,GAbAA,EAAW,IAAA,CACTgiB,EAAAA,CACEld,EAAQ,MAAA,CACRA,CAAAA,CAAQ,QAAA,CACRA,CAAAA,CAAQ,YAAA,CACRA,CAAAA,CAAQ,eACRA,CAAAA,CAAQ,KAAA,CACRA,EAAQ,IAAA,CACRA,CAAAA,CAAQ,YACV,CACF,CAAA,CAGIA,CAAAA,CAAQ,OAAA,CAAS,CACnB,GAAM,CACJ,iBAAA,CAAAsd,CAAAA,CAAoB,kBACpB,UAAA,CAAAC,CAAAA,CAAa,IACb,UAAA,CAAAC,CAAAA,CAAa,KACb,oBAAA,CAAAC,CAAAA,CAAuB,KACvB,aAAA,CAAAmU,CAAAA,CAAgB,EAClB,CAAA,CAAI5xB,EAAQ,OAAA,CAEN0d,CAAAA,CAAoB,EAAC,CAG3B,GAAIkU,CAAAA,CAAc,OAAS,CAAA,CAAG,CAE5B,IAAMC,CAAAA,CAAsB,CAAC,GAAGD,CAAa,CAAA,CAAE,IAAA,CAAK,CAACpqC,CAAAA,CAAGtF,CAAAA,GACtDsF,EAAE,OAAA,CAAQ,aAAA,CAActF,EAAE,OAAO,CACnC,EAEAw7B,CAAAA,CAAW,IAAA,CAAK,CACd,CAAA,CACA,CACE,aAAA,CAAemU,EAAoB,GAAA,CAAI3vC,CAAAA,GAAM,CAC3C,OAAA,CAASA,CAAAA,CAAE,QACX,MAAA,CAAQA,CAAAA,CAAE,MACZ,CAAA,CAAE,CACJ,CACF,CAAC,EACH,CAEAgZ,CAAAA,CAAW,IAAA,CACTmiB,GACErd,CAAAA,CAAQ,MAAA,CACRA,CAAAA,CAAQ,QAAA,CACRsd,CAAAA,CACAC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CACF,CACF,EACF,CAEA,OAAOxiB,CACT,CAAA,CACA,MAAO2qB,CAAAA,CAAcnJ,CAAAA,GAAc,CAIjC,IAAM5mB,CAAAA,CAAO+vB,CAAAA,EAAS,IAAMA,CAAAA,EAAS,KAAA,CAarC,GAZIvnB,CAAAA,EAAM,OAAA,EAAS,cAAA,EAAkBxI,CAAAA,EACnCwI,CAAAA,CAAK,OAAA,CAAQ,eAAe,GAAA,CAAKxI,CAAAA,CAAM+vB,GAAS,SAAS,CAAA,CAAE,MAAO/7B,CAAAA,EAAU,CAC1E,QAAQ,KAAA,CAAM,oDAAA,CAAsD,CAClE,YAAA,CAAc,GAAA,CACd,SAAU+7B,CAAAA,EAAS,SAAA,CACnB,cAAe/vB,CAAAA,CACf,KAAA,CAAAhM,CACF,CAAC,EACH,CAAC,EAICwU,CAAAA,EAAM,OAAA,EAAS,kBAAmB,CACpC,IAAM0zB,EAA6B,CACjCxsB,CAAAA,CAAU,eAAA,CAAgB,OAAA,CAAQ3O,CAAS,CAC7C,EAGAm7B,CAAAA,CAAoB,IAAA,CAClBxsB,EAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,YAAY,CAAA,CAAA,EAAIA,CAAAA,CAAU,cAAc,CAAA,CAAE,CACjF,CAAA,CAMA,IAAMuV,EAAoBvV,CAAAA,CAAU,UAAA,EAAcA,EAAU,YAAA,CACtDwV,CAAAA,CAAsBxV,EAAU,YAAA,EAAgBA,CAAAA,CAAU,eAEhEsV,CAAAA,CAAoB,IAAA,CAAK,CACvB,SAAA,CAAY9pB,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,QAAQrhB,CAAG,CAAA,EACjBA,EAAI,CAAC,CAAA,GAAM,SACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,aAAA,EACXA,CAAAA,CAAI,CAAC,IAAMorC,CAAAA,EACXprC,CAAAA,CAAI,CAAC,CAAA,GAAMqrC,CAEf,CACF,CAAC,CAAA,CAED,MAAM5zB,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,EACA1zB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC/JO,SAASw0B,EAAAA,CACdr8B,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,SAAS,CAAA,CACpB/I,CAAAA,CACA,CAAC,CAAE,MAAA,CAAAuQ,EAAQ,QAAA,CAAAC,CAAAA,CAAU,SAAAvE,CAAS,CAAA,GAAM,CAClCoiB,EAAAA,CAAeruB,CAAAA,CAAWuQ,CAAAA,CAAQC,EAAUvE,CAAQ,CACtD,EACA,MAAO+iB,CAAAA,CAAcnJ,IAAc,CAE7Bpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CAEnC,CAAC,GAAGkH,CAAAA,CAAU,MAAM,eAAe,CAAA,CAEnC,CAAC,GAAGA,CAAAA,CAAU,OAAO,OAAA,CAAQ3O,CAAS,CAAC,CAAA,CAEvC2O,CAAAA,CAAU,MAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,CACrE,CAAC,EAEL,CAAA,CACApe,EACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCjFA,IAAMy0B,EAAAA,CAA+B,CAAC,GAAA,CAAM,GAAA,CAAM,GAAI,CAAA,CAEhDvgC,EAAAA,CAAS5H,CAAAA,EAAe,IAAI,OAAA,CAASC,CAAAA,EAAY,WAAWA,CAAAA,CAASD,CAAE,CAAC,CAAA,CAE9E,eAAeooC,GAAWhsB,CAAAA,CAAgBC,CAAAA,CAAkC,CAC1E,OAAOvU,CAAAA,CAAQ,4BAA6B,CAC1CsU,CAAAA,CACAC,CACF,CAAC,CACH,CAEA,eAAsBgsB,EAAAA,CACpBjsB,CAAAA,CACAC,CAAAA,CACAisB,CAAAA,CAAW,CAAA,CACX79B,EACA,CACA,IAAM89B,EAAS99B,CAAAA,EAAS,MAAA,EAAU09B,GAE9B9+B,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAW,MAAM++B,EAAAA,CAAWhsB,EAAQC,CAAQ,EAC9C,MAAY,CACVhT,CAAAA,CAAW,OACb,CAEA,GAAIA,CAAAA,EAAYi/B,CAAAA,EAAYC,CAAAA,CAAO,MAAA,CACjC,OAGF,IAAMC,CAAAA,CAASD,EAAOD,CAAQ,CAAA,CAC9B,OAAIE,CAAAA,CAAS,CAAA,EACX,MAAM5gC,EAAAA,CAAM4gC,CAAM,EAGbH,EAAAA,CAAqBjsB,CAAAA,CAAQC,EAAUisB,CAAAA,CAAW,CAAA,CAAG79B,CAAO,CACrE,CC3CA,IAAAg+B,EAAAA,CAAA,GAAA14B,EAAAA,CAAA04B,GAAA,CAAA,iBAAA,CAAA,IAAAC,EAAAA,CAAAA,CAAAA,CCuCA,SAASC,EAAAA,EAAmD,CAC1D,OAAI,OAAO,MAAA,CAAW,KAAe,MAAA,CAAO,QAAA,CACnC,CACL,GAAA,CAAK,MAAA,CAAO,SAAS,IAAA,CACrB,MAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,IAC1B,CAAA,CAEK,CAAE,GAAA,CAAK,EAAA,CAAI,OAAQ,EAAG,CAC/B,CAEO,SAASD,EAAAA,CACd78B,EACAk7B,CAAAA,CACAt8B,CAAAA,CACA,CACA,OAAOsK,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,YAAagyB,CAAY,CAAA,CACvC,UAAA,CAAY,SAAY,CACtB,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mDAA8C,EAEhE,IAAM/D,CAAAA,CAAWlpB,CAAAA,EAAc,CAIzB8uB,CAAAA,CAAeD,EAAAA,GACfjjC,CAAAA,CAAM+E,CAAAA,EAAS,KAAOm+B,CAAAA,CAAa,GAAA,CACnCC,EAASp+B,CAAAA,EAAS,MAAA,EAAUm+B,CAAAA,CAAa,MAAA,CAE/C,GAAI,CACF,MAAM5F,CAAAA,CAAS3sB,CAAAA,CAAO,cAAgB,YAAA,CAAc,CAClD,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAM0wB,EACN,GAAA,CAAArhC,CAAAA,CACA,MAAA,CAAAmjC,CAAAA,CACA,KAAA,CAAO,CACL,SAAAh9B,CACF,CACF,CAAC,CACH,CAAC,EACH,CAAA,KAAQ,CAGR,CACF,CACF,CAAC,CACH,CCrFO,SAASi9B,GAAmChxB,CAAAA,CAA+B,CAChF,OAAOyC,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,sBAAA,CAAwBzC,CAAQ,CAAA,CACxD,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA5R,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,4BAA4ByB,CAAQ,CAAA,CAAA,CAC5D,CAAE,MAAA,CAAA5R,CAAO,CACX,EAEA,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CACF,CAAC,CACH,CCfO,SAAS0/B,GAAgCjxB,CAAAA,CAA4B,CAC1E,OAAOyC,YAAAA,CAAa,CAClB,SAAU,CAAC,WAAA,CAAa,oBAAqBzC,CAAQ,CAAA,CACrD,QAAS,MAAO,CAAE,OAAA5R,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,KAAA,CACrBgN,CAAAA,CAAO,cAAA,CAAiB,yBAAyByB,CAAQ,CAAA,CAAA,CACzD,CAAE,MAAA,CAAA5R,CAAO,CACX,CAAA,CAEA,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkCA,EAAS,MAAM,CAAA,CAAE,EAGrE,IAAMpO,CAAAA,CAAQ,MAAMoO,CAAAA,CAAS,IAAA,EAAK,CAG5BkU,EAAWtiB,CAAAA,CAAK,GAAA,CAAK6C,GAASA,CAAAA,CAAK,OAAO,EAC1CkrC,CAAAA,CAAmB,MAAMlhC,EAAQ,4BAAA,CAA8B,CAACyV,CAAQ,CAAC,CAAA,CAG/E,QAAS+jB,CAAAA,CAAQ,CAAA,CAAGA,EAAQ0H,CAAAA,CAAiB,MAAA,CAAQ1H,CAAAA,EAAAA,CAAS,CAC5D,IAAM2H,CAAAA,CAAUD,EAAiB1H,CAAK,CAAA,CAChC4H,EAAUjuC,CAAAA,CAAKqmC,CAAK,EAGpB1N,CAAAA,CAAgB,OAAOqV,CAAAA,CAAQ,cAAA,EAAmB,QAAA,CACpDA,CAAAA,CAAQ,eACRA,CAAAA,CAAQ,cAAA,CAAe,UAAS,CAC9BE,CAAAA,CAAwB,OAAOF,CAAAA,CAAQ,uBAAA,EAA4B,QAAA,CACrEA,CAAAA,CAAQ,uBAAA,CACRA,CAAAA,CAAQ,wBAAwB,QAAA,EAAS,CACvCG,EAAyB,OAAOH,CAAAA,CAAQ,0BAA6B,QAAA,CACvEA,CAAAA,CAAQ,yBACRA,CAAAA,CAAQ,wBAAA,CAAyB,UAAS,CACxCI,CAAAA,CAAsB,OAAOJ,CAAAA,CAAQ,qBAAA,EAA0B,SACjEA,CAAAA,CAAQ,qBAAA,CACRA,CAAAA,CAAQ,qBAAA,CAAsB,QAAA,EAAS,CAErCK,EACJ,UAAA,CAAW1V,CAAa,EACxB,UAAA,CAAWuV,CAAqB,EAChC,UAAA,CAAWC,CAAsB,EACjC,UAAA,CAAWC,CAAmB,EAIhCH,CAAAA,CAAQ,UAAA,CAAaA,EAAQ,EAAA,CAAKI,EACpC,CAGA,OAAAruC,CAAAA,CAAK,IAAA,CAAK,CAACuB,CAAAA,CAAiBtF,CAAAA,GAAoBA,EAAE,UAAA,CAAasF,CAAAA,CAAE,UAAU,CAAA,CAEpEvB,CACT,CACF,CAAC,CACH,CChDO,SAASsuC,GACd7jC,CAAAA,CACA8Z,CAAAA,CAAuB,EAAC,CACxBC,CAAAA,CAAoB,CAAC,UAAA,CAAY,WAAA,CAAa,gBAAgB,EAC9DC,CAAAA,CACA,CAEA,IAAM8pB,CAAAA,CAAmB,CAAC,GAAGhqB,CAAU,CAAA,CAAE,IAAA,EAAK,CACxCiqB,CAAAA,CAAgB,CAAC,GAAGhqB,CAAO,CAAA,CAAE,MAAK,CAExC,OAAOlF,aAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,YAAA,CAAc7U,CAAAA,CAAK8jC,EAAkBC,CAAAA,CAAe/pB,CAAS,EACrF,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAxZ,CAAO,IAAM,CAC7B,IAAMmD,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,YAAA,CAAc,CACjE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAAoJ,EACA,GAAA,CAAK,kBAAA,CAAmB/Z,CAAG,CAAA,CAC3B,UAAA,CAAA8Z,CAAAA,CACA,WAAYE,CACd,CAAC,EACD,MAAA,CAAAxZ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+BA,EAAS,MAAM,CAAA,CAAE,EAGlE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,QAAS,CAAC,CAAC3D,EAEX,SAAA,CAAW,CACb,CAAC,CACH,CCjCO,IAAMgkC,EAAAA,CAAiC,gBAAA,CAGjCC,EAAAA,CAAgC,KAmBtC,SAASC,EAAAA,CAAmB7jC,EAAuB,CACxD,OAAO,mDAAmD,IAAA,CAAKA,CAAI,CACrE,CAQO,SAAS8jC,EAAAA,CACdjD,EACA7gC,CAAAA,CACoC,CACpC,GAAI,CAAC6jC,EAAAA,CAAmB7jC,CAAI,CAAA,CAC1B,OAAO6gC,CAAAA,CAGT,IAAM5jC,CAAAA,CAAW4jC,CAAAA,CAAc,KAAM1vC,CAAAA,EAAMA,CAAAA,CAAE,UAAYwyC,EAA8B,CAAA,CAEvF,OAAI1mC,CAAAA,EAAYA,CAAAA,CAAS,SAAW,IAAA,CAC3B4jC,CAAAA,CAGL5jC,EACK4jC,CAAAA,CAAc,GAAA,CAAK1vC,GACxBA,CAAAA,CAAE,OAAA,GAAYwyC,GACV,CAAE,GAAGxyC,CAAAA,CAAG,MAAA,CAAQ,IAA8B,CAAA,CAC9CA,CACN,CAAA,CAGK,CACL,GAAG0vC,CAAAA,CACH,CAAE,QAAS8C,EAAAA,CAAgC,MAAA,CAAQ,IAA8B,CACnF,CACF,CAGO,SAASI,EAAAA,CAAwBj4B,CAAAA,CAA0B,CAChE,OAAOA,CAAAA,GAAY63B,EACrB,CC/EA,IAAAK,EAAAA,CAAA,EAAA,CAAAh6B,EAAAA,CAAAg6B,EAAAA,CAAA,iCAAAC,EAAAA,CAAA,4BAAA,CAAA,IAAAC,KCAA,IAAAF,GAAA,EAAA,CAAAh6B,EAAAA,CAAAg6B,GAAA,CAAA,yBAAA,CAAA,IAAAG,EAAAA,CAAAA,CAAAA,CCGO,SAASA,EAAAA,CACdr+B,CAAAA,CACA+C,EACAsG,CAAAA,CACA,CACA,OAAOqF,YAAAA,CAAa,CAClB,SAAU,CAAC,cAAA,CAAgB,YAAA,CAAc,aAAA,CAAe1O,CAAQ,CAAA,CAChE,QAAS,SAAY,CACnB,GAAIqJ,CAAAA,CAIF,OAHiB,IAAIrB,EAAAA,CAAG,MAAA,CAAO,CAC7B,WAAA,CAAAqB,CACF,CAAC,EACe,MAAA,CAAOtG,CAAI,CAE/B,CACF,CAAC,CACH,CCjBA,IAAMu7B,GAAwB,CAC5B,OAAA,CAAAJ,EACF,ECAO,SAASC,GACdn+B,CAAAA,CACAqJ,CAAAA,CACA,CACA,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,cAAA,CAAgB,SAAU,cAAA,CAAgB1O,CAAQ,EAC7D,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACqJ,CAAAA,CACzB,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrJ,GAAY,CAACqJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,iDAAyC,CAAA,CAI3D,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7B,kDAAkDjO,CAAQ,CAAA,gBAAA,CAAA,CAC1D,CACE,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CACF,CAAA,CAEMu+B,CAAAA,CACJD,GAAsB,OAAA,CAAQ,yBAAA,CAC5Bt+B,GACC,MAAMxC,CAAAA,CAAS,IAAA,EAAK,EAAG,IAAA,CACxB6L,CACF,EACF,MAAMwD,CAAAA,GAAiB,aAAA,CAAc0xB,CAAgB,EACrD,GAAM,CAAE,WAAA,CAAAC,CAAY,CAAA,CAAI3xB,CAAAA,GAAiB,YAAA,CACvC0xB,CAAAA,CAAiB,QACnB,CAAA,CAEA,OAAOC,EAAY,OAAA,CAAQ,GAAA,CAAK,EAAE,CACpC,CACF,CAAC,CACH,CCnCO,SAASJ,EAAAA,CACdp+B,CAAAA,CACAqJ,EACA,CACA,OAAOqF,aAAa,CAClB,QAAA,CAAU,CAAC,cAAA,CAAgB,QAAA,CAAU,SAAU1O,CAAQ,CAAA,CACvD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACqJ,CAAAA,CACzB,QAAS,SAAY,CACnB,GAAI,CAACrJ,CAAAA,EAAY,CAACqJ,CAAAA,CAChB,MAAM,IAAI,MAAM,iDAAyC,CAAA,CAG3D,IAAMo1B,CAAAA,CAAoBN,EAAAA,CACxBn+B,EACAqJ,CACF,CAAA,CAEA,MAAMwD,CAAAA,EAAe,CAAE,aAAA,CAAc4xB,CAAiB,CAAA,CACtD,IAAM12B,EAAQ8E,CAAAA,EAAe,CAAE,aAAa4xB,CAAAA,CAAkB,QAAQ,EACtE,GAAI,CAAC12B,EACH,MAAM,IAAI,MAAM,0DAAqD,CAAA,CAavE,OAAQ,KAAA,CATS,MADAkG,CAAAA,EAAc,CAE7B,+CAAA,CACA,CACE,QAAS,CACP,cAAA,CAAgB,mBAChB,aAAA,CAAe,CAAA,OAAA,EAAUlG,CAAK,CAAA,CAChC,CACF,CACF,CAAA,EACuB,IAAA,EACzB,CACF,CAAC,CACH,CCrCA,IAAM22B,EAAAA,CAAwB,CAC5B,OAAA,CAAAR,EACF,ECHO,SAASS,EAAAA,CAA6B3+B,EAA8B,CACzE,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,cAAA,CAAgB,UAAA,CAAY,QAAS1O,CAAQ,CAAA,CACxD,MAAO,KAAA,CACP,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,IAAMxC,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,4CAAA,EAA+CjO,CAAQ,CAAA,CAAA,CACvD,CACE,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAWA,GARIxC,CAAAA,CAAS,MAAA,GAAW,MACJ,MAAMA,CAAAA,CAAS,MAAK,CAAE,KAAA,CAAM,KAAO,EAAC,CAAE,CAAA,GAEzC,UAAY,oBAAA,EAKzB,CAACA,EAAS,EAAA,CACZ,OAAO,KAGT,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,GAE5B,OAAO,CACL,QAAS,CACP,QAAA,CAAUpO,EAAK,gBAAA,CACf,OAAA,CAASA,CAAAA,CAAK,eAChB,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAUA,CAAAA,CAAK,gBACf,OAAA,CAASA,CAAAA,CAAK,cAChB,CACF,CAIF,CAAA,KAAc,CAEZ,OAAO,IACT,CACF,CACF,CAAC,CACH,CCbO,SAASwvC,EAAAA,CAAqB,CACnC,GAAA,CAAA/kC,EACA,UAAA,CAAA8Z,CAAAA,CAAa,EAAC,CACd,OAAA,CAAAC,EAAU,CAAC,UAAA,CAAY,YAAa,gBAAgB,CAAA,CACpD,SAAAirB,CAAAA,CAAW,YAAA,CACX,UAAAhrB,CAAAA,CACA,OAAA,CAAA+G,EAAU,IACZ,CAAA,CAAyB,CACvB,OAAOlM,YAAAA,CAAa,CAClB,SAAU,CAAC,cAAA,CAAgB,YAAa7U,CAAAA,CAAK8Z,CAAAA,CAAYC,EAASirB,CAAAA,CAAUhrB,CAAS,CAAA,CACrF,OAAA,CAAS,SAAY,CAEnB,IAAMrW,CAAAA,CAAW,MADAyQ,GAAc,CACC,CAAA,EAAGzD,EAAO,cAAc,CAAA,UAAA,CAAA,CAAc,CACpE,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,QAAAoJ,CAAAA,CACA,GAAA,CAAK,mBAAmB/Z,CAAG,CAAA,CAC3B,WAAA8Z,CAAAA,CACA,QAAA,CAAAkrB,EAEA,GAAIhrB,CAAAA,CAAY,CAAE,UAAA,CAAYA,CAAU,EAAI,EAC9C,CAAC,CAAA,CACD,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CAAC,CAAA,CAOD,GAAI,CAACrW,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoCA,EAAS,MAAM,CAAA,CAAE,EAGvE,OAAQ,MAAMA,EAAS,IAAA,EACzB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC3D,GAAO+gB,CAAAA,CAGlB,KAAA,CAAO,CACT,CAAC,CACH,CChFO,SAASkkB,IAAyB,CACvC,OAAOpwB,aAAa,CAClB,QAAA,CAAU,CAAC,kBAAA,CAAoB,OAAO,CAAA,CACtC,OAAA,CAAS,SAAA,CACU,MAAMzS,EAAQ,qBAAA,CAAuB,EAAE,CAAA,EACxC,QAEpB,CAAC,CACH,CCPO,SAAS8iC,EAAAA,CAAyB/+B,CAAAA,CAAkB,CACzD,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,kBAAA,CAAoB,SAAA,CAAW1O,CAAQ,CAAA,CAClD,QAAS,SAAA,CACQ,MAAM/D,EAAQ,yBAAA,CAA2B,CACtD,SAAU,CAAC+D,CAAQ,CACrB,CAAC,CAAA,EACa,YAEhB,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CC6BA,IAAMg/B,EAAAA,CAA0B,CAC9B,KAAA,CAAO,KAAA,CACP,YAAa,CAAA,CACb,OAAA,CAAS,EACT,OAAA,CAAS,CAAA,CACT,cAAe,CAAA,CACf,cAAA,CAAgB,KAAA,CAChB,OAAA,CAAS,CAAA,CACT,SAAA,CAAW,CACb,CAAA,CAWO,SAASC,GAAmB,CACjC,SAAA,CAAAx4B,EACA,OAAA,CAAAy4B,CAAAA,CACA,SAAA,CAAAprC,CAAAA,CACA,MAAA,CAAA3H,CAAAA,CAAS,GACX,CAAA,CAAsC,CACpC,GAAI,CAACsa,CAAAA,EAAa,CAACy4B,CAAAA,EAAS,GAAA,CAC1B,OAAOF,EAAAA,CAGT,GAAM,CAAE,YAAA,CAAcn5B,CAAAA,CAAa,SAAUF,CAAQ,CAAA,CAAIa,GAAgBC,CAAS,CAAA,CAC5E04B,CAAAA,CAAU,MAAA,CAAOD,CAAAA,CAAQ,GAAA,CAAIprC,CAAS,CAAA,EAAG,QAAA,EAAY,CAAC,CAAA,CAE5D,GAAI,EAAEqrC,CAAAA,CAAU,CAAA,CAAA,CACd,OAAO,CAAE,GAAGH,GAAO,KAAA,CAAO,IAAA,CAAM,YAAAn5B,CAAAA,CAAa,OAAA,CAAAF,CAAQ,CAAA,CAGvD,IAAMy5B,CAAAA,CAAa,MAAA,CAAO,QAAA,CAASjzC,CAAM,GAAKA,CAAAA,CAAS,CAAA,CAAIA,EAAS,GAAA,CAC9DkzC,CAAAA,CAAgBF,EAAUC,CAAAA,CAC1BE,CAAAA,CAAiBz5B,EAAcw5B,CAAAA,CAErC,OAAO,CACL,KAAA,CAAO,IAAA,CACP,YAAAx5B,CAAAA,CACA,OAAA,CAAAF,EACA,OAAA,CAAAw5B,CAAAA,CACA,aAAA,CAAAE,CAAAA,CACA,cAAA,CAAAC,CAAAA,CACA,QAASA,CAAAA,CAAiB,IAAA,CAAK,KAAKD,CAAAA,CAAgBx5B,CAAW,EAAI,CAAA,CACnE,SAAA,CAAW,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAcs5B,CAAO,CAC7C,CACF,CC3FO,SAASI,EAAAA,CACdv/B,CAAAA,CACAxK,CAAAA,CACAse,CAAAA,CACA,CACA,OAAOpF,YAAAA,CAAa,CAClB,SAAU,CAAC,OAAA,CAAS,eAAgBoF,CAAAA,CAAU9T,CAAQ,EACtD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACxK,CAAAA,CACzB,OAAA,CAAS,SAAY,CACnB,GAAI,CAACwK,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kCAA6B,CAAA,CAgB/C,OAAQ,MAbS,MADAyY,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,uBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,SAAA,CAAWsJ,CAAAA,CACX,IAAA,CAAAte,CACF,CAAC,CAAA,CACD,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,GACuB,IAAA,EACzB,CACF,CAAC,CACH,CC5BO,SAASgqC,GACdx/B,CAAAA,CACAxK,CAAAA,CACAse,CAAAA,CACA9jB,CAAAA,CACA,CACA,GAAM,CAAE,WAAA,CAAayvC,CAAe,EAAI5C,EAAAA,CACtC78B,CAAAA,CACA,aACF,CAAA,CAEA,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,MAAA,CAAQ4K,CAAAA,CAAU9T,CAAQ,CAAA,CACjD,UAAA,CAAY,SAAY,CACtB,GAAI,CAACA,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kCAA6B,CAAA,CAmB/C,OAAQ,MAfS,MADAyY,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,yBACxB,CACE,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,SAAA,CAAWsJ,CAAAA,CACX,IAAA,CAAAte,CAAAA,CACA,GAAA,CAAAxF,CACF,CAAC,CAAA,CACD,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EAEuB,IAAA,EACzB,CAAA,CACA,WAAY,CACVyvC,CAAAA,GACF,CACF,CAAC,CACH,CCrCO,SAASC,GAAsB1/B,CAAAA,CAA8B,CAClE,IAAM6R,CAAAA,CAAO7R,CAAAA,EAAU,QAAQ,GAAA,CAAK,EAAE,EACtC,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,OAAO,MAAA,CAAOkD,CAAI,EACtC,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,SAAY,CACnB,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,+CAA0C,CAAA,CAI5D,IAAMrU,CAAAA,CAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,sBACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,SAAUqH,CAAK,CAAC,CACzC,CACF,CAAA,CAEA,GAAI,CAACrU,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,wBAAA,EAA2BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG9D,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAAA,CACA,SAAA,CAAW,IACX,cAAA,CAAgB,IAClB,CAAC,CACH,CCbO,IAAMmiC,EAAAA,CAAqC,CAEhD,CAAE,GAAI,SAAA,CAAW,IAAA,CAAM,QAAS,IAAA,CAAM,CAAA,CAAG,QAAS,SAAA,CAAW,IAAA,CAAM,cAAe,CAAA,CAClF,CAAE,EAAA,CAAI,OAAQ,IAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAAG,OAAA,CAAS,OAAQ,IAAA,CAAM,QAAS,EACtE,CAAE,EAAA,CAAI,UAAW,IAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAAG,OAAA,CAAS,UAAW,IAAA,CAAM,SAAU,CAAA,CAC7E,CAAE,EAAA,CAAI,MAAA,CAAQ,KAAM,OAAA,CAAS,IAAA,CAAM,GAAI,OAAA,CAAS,MAAA,CAAQ,KAAM,mBAAoB,CAAA,CAClF,CAAE,EAAA,CAAI,QAAA,CAAU,IAAA,CAAM,QAAS,IAAA,CAAM,CAAA,CAAG,QAAS,QAAA,CAAU,IAAA,CAAM,QAAS,CAAA,CAC1E,CAAE,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAAG,OAAA,CAAS,OAAQ,IAAA,CAAM,MAAO,EAEpE,CAAE,EAAA,CAAI,OAAQ,IAAA,CAAM,QAAA,CAAU,KAAM,CAAA,CAAG,OAAA,CAAS,OAAQ,IAAA,CAAM,QAAS,EACvE,CAAE,EAAA,CAAI,SAAA,CAAW,IAAA,CAAM,QAAA,CAAU,IAAA,CAAM,GAAI,OAAA,CAAS,SAAA,CAAW,KAAM,SAAU,CAAA,CAC/E,CAAE,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,QAAA,CAAU,IAAA,CAAM,EAAA,CAAI,QAAS,MAAA,CAAQ,IAAA,CAAM,mBAAoB,CAAA,CACnF,CAAE,GAAI,QAAA,CAAU,IAAA,CAAM,QAAA,CAAU,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS,SAAU,IAAA,CAAM,QAAS,EAE3E,CAAE,EAAA,CAAI,OAAQ,IAAA,CAAM,SAAA,CAAW,KAAM,EAAA,CAAI,OAAA,CAAS,OAAQ,IAAA,CAAM,QAAS,CAC3E,EAEO,SAASC,GAAqBC,CAAAA,CAAiB7tC,CAAAA,CAAY,CAChE,OAAO2tC,EAAAA,CAAc,IAAA,CAAM1tB,GAAMA,CAAAA,CAAE,IAAA,GAAS4tB,GAAQ5tB,CAAAA,CAAE,EAAA,GAAOjgB,CAAE,CACjE,CAMO,IAAM8tC,EAAAA,CAAsB,GAAA,CACtBC,EAAAA,CAA0B,EC7CvC,SAASC,EAAAA,EAA4B,CACnC,OAAI,OAAO,MAAA,CAAW,KAAe,OAAO,MAAA,CAAO,YAAe,UAAA,CACzD,MAAA,CAAO,YAAW,CAEpB,CAAA,EAAG,KAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAC7D,CAOA,eAAsBC,GACpBzqC,CAAAA,CACgC,CAEhC,IAAMgI,CAAAA,CAAW,MADAyQ,GAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,gCAAA,CACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CAAE,eAAgB,kBAAmB,CAAA,CAC9C,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAAA,CAAM,eAAA,CAAiBwqC,IAAoB,CAAC,CACrE,CACF,CAAA,CAEA,GAAI,CAACxiC,CAAAA,CAAS,GAAI,CAChB,IAAIpO,EACJ,GAAI,CACFA,EAAO,MAAMoO,CAAAA,CAAS,OACxB,CAAA,KAAQ,CAER,CACA,IAAM7N,CAAAA,CACHP,GAA+B,OAAA,EAChC,CAAA,6BAAA,EAAgCoO,EAAS,MAAM,CAAA,CAAA,CAC3CtE,EAAM,IAAI,KAAA,CAAMvJ,CAAO,CAAA,CAC7B,MAAAuJ,CAAAA,CAAI,OAASsE,CAAAA,CAAS,MAAA,CACtBtE,EAAI,IAAA,CAAO9J,CAAAA,CACL8J,CACR,CAEA,OAAQ,MAAMsE,CAAAA,CAAS,IAAA,EACzB,CAQO,SAAS0iC,EAAAA,CACdlgC,EACAxK,CAAAA,CACA,CACA,IAAMkwB,CAAAA,CAAcC,cAAAA,GACd9T,CAAAA,CAAO7R,CAAAA,EAAU,QAAQ,GAAA,CAAK,EAAE,EAEtC,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,eAAA,CAAiB,KAAA,CAAO2I,CAAI,CAAA,CAC1C,WAAY,SAAY,CACtB,GAAI,CAACA,CAAAA,EAAQ,CAACrc,CAAAA,CACZ,MAAM,IAAI,KAAA,CAAM,yCAAoC,CAAA,CAEtD,OAAOyqC,EAAAA,CAAuBzqC,CAAI,CACpC,CAAA,CACA,SAAA,EAAY,CAENqc,CAAAA,EACF6T,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAU/W,CAAAA,CAAU,OAAO,OAAA,CAAQkD,CAAI,CAAE,CAAC,EAE9E,EACA,SAAA,EAAY,CAINA,GACF6T,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAU/W,CAAAA,CAAU,OAAO,MAAA,CAAOkD,CAAI,CAAE,CAAC,EAE7E,CACF,CAAC,CACH,CCrCO,SAASsuB,EAAAA,CACdngC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,WAAW,CAAA,CAC3B/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAA+d,CAAU,CAAA,GAAM,CACjB0M,GAAiBzqB,CAAAA,CAAW+d,CAAS,CACvC,CAAA,CACA,MAAOiR,CAAAA,CAAcnJ,IAAc,CAE7Bpe,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,cAAc3O,CAAS,CAAA,CAC1C,CAAC,GAAG2O,CAAAA,CAAU,YAAY,YAAA,CAAakX,CAAAA,CAAU,SAAS,CAAC,CAAA,CAC3DlX,CAAAA,CAAU,YAAY,OAAA,CAAQ3O,CAAAA,CAAW6lB,EAAU,SAAS,CAC9D,CAAC,EAEL,CAAA,CACApe,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CCzBO,SAASu4B,GACdpgC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,aAAa,EAC7B/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAA+d,CAAU,IAAM,CACjB2M,EAAAA,CAAmB1qB,EAAW+d,CAAS,CACzC,EACA,MAAOiR,CAAAA,CAAcnJ,IAAc,CAE7Bpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,EAAU,QAAA,CAAS,aAAA,CAAc3O,CAAS,CAAA,CAC1C,CAAC,GAAG2O,CAAAA,CAAU,WAAA,CAAY,YAAA,CAAakX,EAAU,SAAS,CAAC,EAC3DlX,CAAAA,CAAU,WAAA,CAAY,QAAQ3O,CAAAA,CAAW6lB,CAAAA,CAAU,SAAS,CAC9D,CAAC,EAEL,EACApe,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,MAAO,CAC3C,CACF,CCMO,SAASw4B,EAAAA,CACdrgC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,UAAU,CAAA,CAC1B/I,CAAAA,CACA,CAAC,CAAE,UAAA+d,CAAAA,CAAW,MAAA,CAAAxN,EAAQ,QAAA,CAAAC,CAAAA,CAAU,MAAAwa,CAAAA,CAAO,IAAA,CAAAC,CAAK,CAAA,GAAM,CAChDF,EAAAA,CAAgB/qB,EAAW+d,CAAAA,CAAWxN,CAAAA,CAAQC,EAAUwa,CAAAA,CAAOC,CAAI,CACrE,CAAA,CACA,MAAO+D,CAAAA,CAAcnJ,CAAAA,GAAc,CAEjC,GAAIpe,GAAM,OAAA,EAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CAEjCxsB,CAAAA,CAAU,KAAA,CAAM,MAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,CAAA,CAEnE,CAAC,WAAA,CAAa,QAAA,CAAUA,CAAAA,CAAU,SAAS,CAAA,CAE3C,CACE,UAAYxU,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,SAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,CAAA,GAAM,OAAA,EACXA,EAAI,CAAC,CAAA,GAAM,gBACXA,CAAAA,CAAI,CAAC,CAAA,GAAM61B,CAAAA,CAAU,SAEzB,CACF,CACF,CAAA,CACA,MAAMpe,EAAK,OAAA,CAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,EACA1zB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,MAAO,CAC3C,CACF,CCpDO,SAASy4B,EAAAA,CACdviB,CAAAA,CACA/d,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,UAAA,CAAYgV,CAAS,CAAA,CACrC/d,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAgG,CAAAA,CAAS,KAAA9F,CAAK,CAAA,GAAM,CACrByqB,EAAAA,CAAe3qB,CAAAA,CAAW+d,EAAW/X,CAAAA,CAAS9F,CAAI,CACpD,CAAA,CACA,MAAO8uB,CAAAA,CAAcnJ,IAAc,CAGtBhZ,CAAAA,GACR,cAAA,CACD,CAAE,SAAU8B,CAAAA,CAAU,WAAA,CAAY,aAAaoP,CAAS,CAAE,EACzDib,CAAAA,EAAS,CACR,GAAI,CAACA,CAAAA,CAAM,OAAOA,CAAAA,CAClB,IAAMuH,CAAAA,CAAsB,CAAC,GAAIvH,CAAAA,CAAK,MAAQ,EAAG,EAC3CwH,CAAAA,CAAMD,CAAAA,CAAK,UAAU,CAAC,CAAC1uB,CAAI,CAAA,GAAMA,CAAAA,GAASgU,CAAAA,CAAU,OAAO,CAAA,CACjE,OAAI2a,GAAO,CAAA,CACTD,CAAAA,CAAKC,CAAG,CAAA,CAAI,CAACD,CAAAA,CAAKC,CAAG,CAAA,CAAE,CAAC,EAAG3a,CAAAA,CAAU,IAAA,CAAM0a,EAAKC,CAAG,CAAA,CAAE,CAAC,CAAA,EAAK,EAAE,EAE7DD,CAAAA,CAAK,IAAA,CAAK,CAAC1a,CAAAA,CAAU,OAAA,CAASA,EAAU,IAAA,CAAM,EAAE,CAAC,CAAA,CAE5C,CAAE,GAAGmT,CAAAA,CAAM,IAAA,CAAAuH,CAAK,CACzB,CACF,CAAA,CAGI94B,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnC,CAAC,GAAGkH,EAAU,WAAA,CAAY,YAAA,CAAaoP,CAAS,CAAC,CAAA,CACjDpP,EAAU,WAAA,CAAY,OAAA,CAAQkX,CAAAA,CAAU,OAAA,CAAS9H,CAAS,CAC5D,CAAC,EAEL,CAAA,CACAtW,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CChDO,SAAS44B,EAAAA,CACd1iB,CAAAA,CACA/d,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,QAAA,CAAUgV,CAAS,EACnC/d,CAAAA,CACCR,CAAAA,EAAU,CACTorB,EAAAA,CAAuB5qB,CAAAA,CAAW+d,EAAWve,CAAK,CACpD,CAAA,CACA,MAAOwvB,CAAAA,CAAcnJ,CAAAA,GAAc,CAGtBhZ,CAAAA,EAAe,CACvB,eACD,CAAE,QAAA,CAAU8B,EAAU,WAAA,CAAY,YAAA,CAAaoP,CAAS,CAAE,CAAA,CACzDib,CAAAA,EACMA,GACE,CAAE,GAAGA,EAAM,GAAInT,CAA4C,CAEtE,CAAA,CAGIpe,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnC,CAAC,GAAGkH,EAAU,WAAA,CAAY,YAAA,CAAaoP,CAAS,CAAC,CACnD,CAAC,EAEL,CAAA,CACAtW,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CC3CO,SAAS64B,EAAAA,CACd1gC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,iBAAiB,CAAA,CACjC/I,CAAAA,CACA,CAAC,CAAE,KAAA6R,CAAK,CAAA,GAAM,CACZ+c,EAAAA,CAA6B/c,CAAI,CACnC,CAAA,CACA,MAAOmd,EAAcnJ,CAAAA,GAAc,CAE7Bpe,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CAEnC,CAAC,GAAGkH,CAAAA,CAAU,WAAA,CAAY,YAAA,CAAakX,EAAU,IAAI,CAAC,EAEtD,CAAC,GAAGlX,EAAU,MAAA,CAAO,OAAA,CAAQ3O,CAAS,CAAC,CACzC,CAAC,EAEL,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnEO,SAAS84B,EAAAA,CACd3gC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,cAAe,UAAU,CAAA,CAC1B/I,EACA,CAAC,CAAE,UAAA+d,CAAAA,CAAW,OAAA,CAAA/X,EAAS,QAAA,CAAAwK,CAAAA,CAAU,IAAAsa,CAAI,CAAA,GAAM,CACzCD,EAAAA,CAAe7qB,CAAAA,CAAW+d,CAAAA,CAAW/X,EAASwK,CAAAA,CAAUsa,CAAG,CAC7D,CAAA,CACA,MAAOkE,EAASnJ,CAAAA,GAAc,CACxBpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,KAAA,CAAM,MAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,OAAO,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,EAAE,CAAA,CACpE,CAAC,GAAGlX,CAAAA,CAAU,WAAA,CAAY,aAAakX,CAAAA,CAAU,SAAS,CAAC,CAC7D,CAAC,EAEL,CAAA,CACApe,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CC9BO,SAAS+4B,GACd/vB,CAAAA,CACAQ,CAAAA,CACAjkB,EAAQ,GAAA,CACR8d,CAAAA,CAA+B,MAAA,CAC/B0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,WAAA,CAAY,KAAKkC,CAAAA,CAAMQ,CAAAA,EAAS,EAAA,CAAIjkB,CAAK,CAAA,CAC7D,OAAA,CAAAwtB,EACA,OAAA,CAAS,SAAY,CACnB,IAAMpd,CAAAA,CAAW,MAAMvB,CAAAA,CAAQ,yBAAA,CAA2B,CACtD,IAAA,CAAM,EAAA,CACN,MAAA7O,CAAAA,CACA,IAAA,CAAMyjB,IAAS,KAAA,CAAQ,MAAA,CAASA,EAChC,KAAA,CAAOQ,CAAAA,EAAgB,IAAA,CACvB,QAAA,CAAAnG,CACF,CAAC,EACH,OACE1N,CAAAA,CACIqT,IAAS,KAAA,CACPrT,CAAAA,CAAS,KAAK,IAAM,IAAA,CAAK,MAAA,EAAO,CAAI,EAAG,CAAA,CACvCA,EACF,EAER,CACF,CAAC,CACH,CC3BO,SAASqjC,EAAAA,CACd7gC,EACA8R,CAAAA,CACA,CACA,OAAOpD,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,WAAA,CAAY,QAAQ3O,CAAAA,CAAW8R,CAAc,EACjE,OAAA,CAAS,CAAC,CAAC9R,CAAAA,EAAY,CAAC,CAAC8R,CAAAA,CACzB,OAAA,CAAS,SAAY,CACnB,IAAMtU,CAAAA,CAAW,MAAMvB,CAAAA,CAAQ,8BAAA,CAAgC,CAC3D,OAAA,CAAS+D,CAAAA,CACT,KAAM8R,CACR,CAAC,CAAA,CAEH,OAAO,CACL,IAAA,CAAMtU,GAAU,IAAA,EAAQ,OAAA,CACxB,WAAYA,CAAAA,EAAU,UAAA,EAAc,KACtC,CAIF,CACF,CAAC,CACH,CCtBO,SAASsjC,EAAAA,CACdjvB,CAAAA,CACA3G,EAA+B,EAAA,CAC/B0P,CAAAA,CAAU,KACV,CACA,OAAOlM,aAAa,CAClB,QAAA,CAAUC,EAAU,WAAA,CAAY,MAAA,CAAOkD,EAAM3G,CAAQ,CAAA,CACrD,OAAA,CAAS0P,CAAAA,EAAW,CAAC,CAAC/I,EACtB,OAAA,CAAS,SAAY4L,GAAa5L,CAAAA,EAAQ,EAAA,CAAI3G,CAAQ,CACxD,CAAC,CACH,CCFO,IAAM61B,EAAAA,CAAwB,IAYrC,eAAeC,EAAAA,CACblvB,CAAAA,CACA6L,CAAAA,CAC0B,CAM1B,OALiB,MAAM1hB,CAAAA,CAAQ,yBAAA,CAA2B,CACxD,SAAA,CAAW6V,CAAAA,CACX,MAAOivB,EAAAA,CACP,GAAIpjB,EAAO,CAAE,IAAA,CAAAA,CAAK,CAAA,CAAI,EACxB,CAAC,CAAA,EAC6C,EAChD,CAYO,SAASsjB,EAAAA,CAAoCnvB,CAAAA,CAAuB,CACzE,OAAOpD,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,WAAA,CAAY,YAAYmD,CAAa,CAAA,CACzD,OAAA,CAAS,SAAYkvB,EAAAA,CAAqBlvB,CAAAA,CAAe,IAAI,CAAA,CAC7D,SAAA,CAAW,GACb,CAAC,CACH,CAOO,SAASovB,EAAAA,CACdpvB,CAAAA,CACA,CACA,OAAO+G,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,YAAY,mBAAA,CAAoBmD,CAAa,EACjE,gBAAA,CAAkB,IAAA,CAClB,QAAS,MAAO,CAAE,UAAAgH,CAAU,CAAA,GAC1BkoB,GAAqBlvB,CAAAA,CAAegH,CAAS,EAG/C,gBAAA,CAAmBE,CAAAA,EACjBA,CAAAA,EAAU,MAAA,EAAU+nB,EAAAA,CAChB/nB,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,IAAI,CAAC,CAAA,EAAK,KACtC,IAAA,CACN,SAAA,CAAW,GACb,CAAC,CACH,CCpEO,SAASmoB,EAAAA,CACdn7B,EACA5Y,CAAAA,CACA,CACA,OAAOyrB,oBAAAA,CAML,CACA,QAAA,CAAUlK,EAAU,WAAA,CAAY,oBAAA,CAAqB3I,EAAS5Y,CAAK,CAAA,CACnE,iBAAkB,IAAA,CAOlB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,CAAA,GACT,MAAM7c,EAAQ,8BAAA,CAAgC,CAC7D,QAAA+J,CAAAA,CACA,KAAA,CAAA5Y,CAAAA,CACA,OAAA,CAAS0rB,CAAAA,EAAa,MACxB,CAAC,CAAA,EACoD,GAKvD,gBAAA,CAAmBE,CAAAA,EACjBA,GAAU,MAAA,EAAU5rB,CAAAA,CAAQ4rB,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,EAAE,EAAA,CAAK,IACnE,CAAC,CACH,CC3CO,SAASooB,EAAAA,EAAqC,CACnD,OAAO1yB,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,WAAA,CAAY,UAAS,CACzC,OAAA,CAAS,SAAY,CACnB,IAAMnR,EAAW,MAAM,KAAA,CACrBgN,EAAO,cAAA,CAAiB,mCAAA,CACxB,CACE,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAEA,GAAI,CAAChN,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG5E,OAAOA,CAAAA,CAAS,IAAA,EAClB,CACF,CAAC,CACH,CCzBO,IAAK6jC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,KAAA,CAAQ,OAAA,CACRA,EAAA,KAAA,CAAQ,OAAA,CACRA,EAAA,GAAA,CAAM,KAAA,CACNA,EAAA,MAAA,CAAS,QAAA,CACTA,EAAA,KAAA,CAAQ,OAAA,CACRA,EAAA,KAAA,CAAQ,OAAA,CANEA,QAAA,EAAA,CAAA,CASCC,EAAAA,CAAoC,CAC9C,KAAA,CAAc,CACb,OAAA,CACA,MACA,QAAA,CACA,OAAA,CACA,OACF,CAAA,CACC,KAAA,CAAc,CAAC,KAAA,CAAW,QAAA,CAAc,OAAA,CAAa,OAAW,CAAA,CAChE,GAAA,CAAY,CAAC,QAAA,CAAc,OAAA,CAAa,OAAW,CACtD,ECjBO,SAASC,EAAAA,CAAiB1vB,CAAAA,CAAc2vB,CAAAA,CAAgC,CAC7E,OAAI3vB,CAAAA,CAAK,WAAW,QAAQ,CAAA,EAAK2vB,IAAY,CAAA,CAAU,SAAA,CACnD3vB,EAAK,UAAA,CAAW,QAAQ,GAAK2vB,CAAAA,GAAY,CAAA,CAAU,UAChD,OACT,CAEO,SAASC,EAAAA,CAAwB,CACtC,cAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CACF,CAAA,CAIG,CACD,IAAMC,CAAAA,CACAF,IAAa,OAAA,CAAoB,KAAA,CAEjCD,IAAkB,OAAA,CAAgB,IAAA,CAG/B,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,QAAkD,CAAA,CAAE,QAAA,CACzDC,CACF,EAGIG,CAAAA,CAAAA,CAAc,IAAM,CACxB,GAAIH,CAAAA,GAAa,QAAa,OAAO,MAAA,CAErC,OAAQD,CAAAA,EACN,KAAK,QACH,OAAO,KAAA,CACT,KAAK,SAAA,CACH,OAAOC,IAAa,OAAA,EAAeC,CAAAA,CACrC,KAAK,SAAA,CACH,OAAOC,CACX,CACF,CAAA,IAEME,CAAAA,CAAc,CAAA,OAAA,CAAA,OAAA,CAAA,KAAoC,EAAE,QAAA,CAASJ,CAAQ,CAAA,CAE3E,OAAO,CACL,OAAA,CAAAE,EACA,UAAA,CAAAC,CAAAA,CACA,YAAAC,CACF,CACF,CC7CO,SAASC,EAAAA,CACdpxB,EACApb,CAAAA,CACA,CACA,OAAOkZ,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,aAAA,CAAc,WAAA,CAAYiC,CAAc,CAAA,CAC5D,OAAA,CAAS,SACFpb,CAAAA,CAAAA,CAaS,KAAA,CAVG,MAAM,KAAA,CACrB,CAAA,EAAGgV,EAAO,cAAc,CAAA,iCAAA,CAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAAA,CAC7B,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EAC6B,IAAA,IACjB,KAAA,CAbH,CAAA,CAeX,QAAS,CAAC,CAACob,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,YAAa,CAAA,CACb,eAAA,CAAiB,GACnB,CAAC,CACH,CCzBO,SAASysC,EAAAA,CACdrxB,EACApb,CAAAA,CACAib,CAAAA,CAAyC,OACzC,CACA,OAAOoI,qBAAqB,CAC1B,QAAA,CAAUlK,EAAU,aAAA,CAAc,IAAA,CAAKiC,EAAgBH,CAAM,CAAA,CAC7D,QAAS,MAAO,CAAE,UAAAqI,CAAU,CAAA,GAAM,CAChC,GAAI,CAACtjB,CAAAA,CACH,OAAO,EAAC,CAEV,IAAMpG,CAAAA,CAAO,CACX,KAAAoG,CAAAA,CACA,MAAA,CAAAib,CAAAA,CACA,KAAA,CAAOqI,CAAAA,CACP,IAAA,CAAM,MACR,CAAA,CAEMtb,CAAAA,CAAW,MAAM,KAAA,CACrBgN,CAAAA,CAAO,eAAiB,4BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CACF,EAEA,GAAI,CAACoO,EAAS,EAAA,CACZ,OAAO,EAAC,CAGV,GAAI,CACF,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAAA,KAAQ,CACN,OAAO,EACT,CACF,CAAA,CACA,QAAS,CAAC,CAACoT,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,YAAa,CAAE,KAAA,CAAO,EAAC,CAAG,UAAA,CAAY,EAAG,CAAA,CACzC,gBAAA,CAAkB,EAAA,CAClB,gBAAA,CAAmBwjB,CAAAA,EAAaA,IAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,EAAA,EAAM,GACvE,cAAA,CAAgB,IAClB,CAAC,CACH,CClDO,IAAKkpB,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,KAAA,CAAQ,QAAA,CACRA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,CAAAA,CAAA,UAAY,YAAA,CACZA,CAAAA,CAAA,UAAY,YAAA,CACZA,CAAAA,CAAA,QAAU,SAAA,CACVA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,OAAA,CAAU,UACVA,CAAAA,CAAA,SAAA,CAAY,YACZA,CAAAA,CAAA,WAAA,CAAc,cACdA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,mBAAA,CAAsB,qBAAA,CAGtBA,EAAA,eAAA,CAAkB,iBAAA,CAClBA,EAAA,eAAA,CAAkB,iBAAA,CAfRA,QAAA,EAAA,ECGL,IAAKC,QACVA,CAAAA,CAAAA,CAAAA,CAAA,IAAA,CAAO,GAAP,MAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,QAAU,CAAA,CAAA,CAAV,SAAA,CACAA,IAAA,MAAA,CAAS,CAAA,CAAA,CAAT,QAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,CAAA,CAAA,CAAV,UACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,GAAV,SAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,UAAY,CAAA,CAAA,CAAZ,WAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,WAAA,CAAc,EAAA,CAAA,CAAd,aAAA,CACAA,IAAA,SAAA,CAAY,EAAA,CAAA,CAAZ,YACAA,CAAAA,CAAAA,CAAAA,CAAA,SAAA,CAAY,IAAZ,WAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,EAAA,CAAA,CAAV,SAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,eAAiB,EAAA,CAAA,CAAjB,gBAAA,CACAA,IAAA,eAAA,CAAkB,EAAA,CAAA,CAAlB,kBACAA,CAAAA,CAAAA,CAAAA,CAAA,mBAAA,CAAsB,IAAtB,qBAAA,CACAA,CAAAA,CAAA,aAAe,cAAA,CAdLA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IAiBCC,EAAAA,CAAmB,CAC9B,EACA,CAAA,CACA,CAAA,CACA,CAAA,CACA,CAAA,CACA,CAAA,CACA,EAAA,CACA,GACA,EAAA,CACA,EAAA,CACA,GACA,EAAA,CACA,EACF,EAEYC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,GAAA,CAAM,KAAA,CACNA,CAAAA,CAAA,MAAA,CAAS,SACTA,CAAAA,CAAA,IAAA,CAAO,OAHGA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EC/BL,SAASC,EAAAA,CACd1xB,CAAAA,CACApb,CAAAA,CACA+sC,CAAAA,CACA,CACA,OAAO7zB,aAAa,CAClB,QAAA,CAAUC,EAAU,aAAA,CAAc,QAAA,CAASiC,CAAc,CAAA,CACzD,OAAA,CAAS,SAAY,CACnB,IAAI7I,EAAQ6I,CAAAA,CAAiB,MAAA,CAC7B,GAAI,CAACpb,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sBAAsB,CAAA,CAExC,IAAMgI,CAAAA,CAAW,MAAM,KAAA,CACrBgN,CAAAA,CAAO,eAAiB,4BAAA,CACxB,CACE,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,QAAA,CAAUob,EACV,KAAA,CAAA7I,CACF,CAAC,CAAA,CACD,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,EACA,GAAI,CAACvK,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0CA,EAAS,MAAM,CAAA,CAAE,EAE7E,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,QAAS,CAAC,CAACoT,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,eAAgB,KAAA,CAChB,WAAA,CAAa,KACJ,CACL,MAAA,CAAQ,EACR,MAAA,CAAQ,KAAA,CACR,aAAA,CAAe,CAAA,CACf,YAAA,CAAc+sC,CAAAA,CAAe,EAAC,CAAK,CAAC,GAAGH,EAAgB,CACzD,EAEJ,CAAC,CACH,CC3CO,SAASI,EAAAA,EAA+B,CAC7C,OAAO9zB,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,cAAc,aAAA,EAAc,CAChD,QAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,4BAAA,CAA8B,CACjF,MAAA,CAAQ,KAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,EAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,+BAAA,EAAkCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAIrE,OADa,MAAMA,CAAAA,CAAS,IAAA,EAAK,EAClB,EACjB,EACA,SAAA,CAAW,IACb,CAAC,CACH,CClBO,SAASilC,EAAAA,CAA0BC,EAAuB,CAC/D,OAAOh0B,aAAa,CAClB,QAAA,CAAUC,EAAU,aAAA,CAAc,UAAA,EAAW,CAC7C,OAAA,CAAS,SAAY,CACnB,IAAMnR,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,0BAA2B,CAC9E,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,EAED,GAAI,CAAChN,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAIlE,OADc,MAAMA,CAAAA,CAAS,MAAK,EACnB,EACjB,CAAA,CACA,SAAA,CAAW,IACb,CAAC,CACH,CClBA,SAASmlC,EAAAA,CAAqB1wC,CAAAA,CAAuBD,CAAAA,CAA8B,CACjF,OAAO,CACL,GAAGC,EACH,IAAA,CAAO,CAACD,GAAMA,CAAAA,GAAOC,CAAAA,CAAK,EAAA,CAAK,CAAA,CAAIA,CAAAA,CAAK,IAC1C,CACF,CAEA,SAAS2wC,GAAexzC,CAAAA,CAAiD,CACvE,OACE,OAAOA,CAAAA,EAAS,QAAA,EAChBA,CAAAA,GAAS,IAAA,EACT,OAAA,GAAWA,GACX,YAAA,GAAgBA,CAAAA,EAChB,MAAM,OAAA,CAASA,CAAAA,CAAkC,KAAK,CAE1D,CAuBO,SAASyzC,EAAAA,CACd7iC,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,IAAML,CAAAA,CAAc7Y,GAAe,CAEnC,OAAO3D,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,gBAAiB,WAAA,CAAalJ,CAAQ,EAEpD,UAAA,CAAY,MAAO,CAAE,EAAA,CAAAhO,CAAG,CAAA,GAAuB,CAC7C,GAAI,CAACgO,GAAY,CAACxK,CAAAA,CAAM,CAClB,OAAA,CAAQ,GAAA,CAAI,WAAa,YAAA,EAC3B,OAAA,CAAQ,IAAA,CAAK,gEAA2D,CAAA,CAE1E,MACF,CACA,OAAOshC,EAAAA,CAAkBthC,EAAMxD,CAAE,CACnC,EAGA,QAAA,CAAU,MAAO,CAAE,EAAA,CAAAA,CAAG,IAAuB,CAE3C,GAAI,CAACgO,CAAAA,EAAY,CAACxK,EAChB,OAAO,CAAE,YAAA,CAAc,EAAG,CAAA,CAI5B,MAAMkwB,CAAAA,CAAY,aAAA,CAAc,CAAE,QAAA,CAAU/W,CAAAA,CAAU,cAAc,OAAQ,CAAC,EAG7E,IAAMm0B,CAAAA,CAA2C,EAAC,CAG5ChT,CAAAA,CAAkBpK,EAAY,cAAA,CAAyC,CAC3E,SAAU/W,CAAAA,CAAU,aAAA,CAAc,OAAA,CAClC,SAAA,CAAY0C,CAAAA,EAAU,CACpB,IAAMjiB,CAAAA,CAAOiiB,CAAAA,CAAM,MAAM,IAAA,CACzB,OAAOuxB,GAAexzC,CAAI,CAC5B,CACF,CAAC,CAAA,CAED0gC,EAAgB,OAAA,CAAQ,CAAC,CAAC9iB,CAAAA,CAAU5d,CAAI,IAAM,CAC5C,GAAIA,CAAAA,EAAQwzC,EAAAA,CAAexzC,CAAI,CAAA,CAAG,CAChC0zC,CAAAA,CAAa,IAAA,CAAK,CAAC91B,CAAAA,CAAU5d,CAAI,CAAC,CAAA,CAElC,IAAM2zC,CAAAA,CAAwC,CAC5C,GAAG3zC,CAAAA,CACH,MAAOA,CAAAA,CAAK,KAAA,CAAM,IAAKsjB,CAAAA,EACrBA,CAAAA,CAAK,IAAKzgB,CAAAA,EAAS0wC,EAAAA,CAAqB1wC,CAAAA,CAAMD,CAAE,CAAC,CACnD,CACF,CAAA,CAEA0zB,CAAAA,CAAY,aAAa1Y,CAAAA,CAAU+1B,CAAW,EAChD,CACF,CAAC,EAGD,IAAMC,CAAAA,CAAYr0B,EAAU,aAAA,CAAc,WAAA,CAAY3O,CAAQ,CAAA,CACxDijC,CAAAA,CAAgBvd,EAAY,YAAA,CAAqBsd,CAAS,CAAA,CAChE,OAAI,OAAOC,CAAAA,EAAkB,UAAYA,CAAAA,CAAgB,CAAA,GACvDH,EAAa,IAAA,CAAK,CAACE,EAAWC,CAAa,CAAC,CAAA,CAEvCjxC,CAAAA,CAKc89B,CAAAA,CAAgB,IAAA,CAAK,CAAC,EAAGj4B,CAAC,CAAA,GACzCA,CAAAA,EAAG,MAAM,IAAA,CAAM6a,CAAAA,EACbA,CAAAA,CAAK,IAAA,CAAMzgB,CAAAA,EAASA,CAAAA,CAAK,KAAOD,CAAAA,EAAMC,CAAAA,CAAK,OAAS,CAAC,CACvD,CACF,CAAA,EAEEyzB,CAAAA,CAAY,aAAasd,CAAAA,CAAWC,CAAAA,CAAgB,CAAC,CAAA,CATvDvd,CAAAA,CAAY,aAAasd,CAAAA,CAAW,CAAC,GAelC,CAAE,YAAA,CAAAF,CAAa,CACxB,CAAA,CAEA,SAAA,CAAYtlC,GAAa,CAEvB,IAAM0lC,EAAc,OAAO1lC,CAAAA,EAAa,UAAYA,CAAAA,GAAa,IAAA,CAC5DA,CAAAA,CAAiC,MAAA,CAClC,MAAA,CAGA,OAAO0lC,GAAgB,QAAA,EACzBxd,CAAAA,CAAY,aACV/W,CAAAA,CAAU,aAAA,CAAc,YAAY3O,CAAQ,CAAA,CAC5CkjC,CACF,CAAA,CAGFj6B,CAAAA,GAAYi6B,CAAW,EACzB,CAAA,CAGA,OAAA,CAAS,CAACjwC,CAAAA,CAAOulC,CAAAA,CAAYxI,IAAY,CAEnCA,CAAAA,EAAS,cACXA,CAAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAChjB,EAAU5d,CAAI,CAAA,GAAM,CACjDs2B,CAAAA,CAAY,YAAA,CAAa1Y,CAAAA,CAAU5d,CAAI,EACzC,CAAC,EAGH22B,CAAAA,GAAU9yB,CAAc,EAC1B,CAAA,CAGA,SAAA,CAAW,IAAM,CACfyyB,CAAAA,CAAY,iBAAA,CAAkB,CAC5B,QAAA,CAAU/W,CAAAA,CAAU,cAAc,OACpC,CAAC,EACH,CACF,CAAC,CACH,CC7JO,SAASw0B,EAAAA,CACdnjC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,eAAA,CAAiB,eAAe,EACjC/I,CAAAA,CACA,CAAC,CAAE,IAAA,CAAAwpB,CAAK,IAAMD,EAAAA,CAAoBvpB,CAAAA,CAAWwpB,CAAI,CAAA,CACjD,SAAY,CACN/hB,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnCkH,CAAAA,CAAU,cAAc,WAAA,CAAY3O,CAAQ,CAC9C,CAAC,EAEL,CAAA,CACAyH,CAAAA,CACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCtBO,SAASu7B,EAAAA,CAAwBpxC,CAAAA,CAAY,CAClD,OAAO0c,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAa,UAAA,CAAY1c,CAAE,EACtC,OAAA,CAAS,SAAY,CAEnB,IAAMqxC,CAAAA,CAAAA,CADI,MAAMpnC,CAAAA,CAAQ,8BAAA,CAAgC,CAAC,CAACjK,CAAE,CAAC,CAAC,CAAA,EAC3C,CAAC,EAGpB,OAAI,IAAI,KAAKqxC,CAAAA,CAAS,UAAU,EAAI,IAAI,IAAA,EAAU,IAAI,IAAA,CAAKA,CAAAA,CAAS,QAAQ,GAAK,IAAI,IAAA,CACnFA,EAAS,MAAA,CAAS,QAAA,CACT,IAAI,IAAA,CAAKA,CAAAA,CAAS,QAAQ,CAAA,CAAI,IAAI,IAAA,CAC3CA,EAAS,MAAA,CAAS,SAAA,CAElBA,EAAS,MAAA,CAAS,UAAA,CAGbA,CACT,CACF,CAAC,CACH,CCnBO,SAASC,EAAAA,EAA2B,CACzC,OAAO50B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,MAAM,EAC9B,OAAA,CAAS,SAAY,CASnB,IAAM60B,CAAAA,CAAAA,CARY,MAAMtnC,CAAAA,CAAQ,6BAAA,CAA+B,CAC7D,KAAA,CAAO,CAAC,EAAE,EACV,KAAA,CAAO,GAAA,CACP,MAAO,gBAAA,CACP,eAAA,CAAiB,aACjB,MAAA,CAAQ,KACV,CAAC,CAAA,EAE0B,SAAA,CACrBunC,CAAAA,CAAUD,EAAU,MAAA,CAAQtsB,CAAAA,EAAMA,EAAE,MAAA,GAAW,SAAS,EAG9D,OAAO,CAAC,GAFOssB,CAAAA,CAAU,MAAA,CAAQtsB,GAAMA,CAAAA,CAAE,MAAA,GAAW,SAAS,CAAA,CAE1C,GAAGusB,CAAO,CAC/B,CACF,CAAC,CACH,CCJO,SAASC,EAAAA,CACd1xB,CAAAA,CACAC,EACA5kB,CAAAA,CACA,CACA,OAAOyrB,oBAAAA,CAML,CACA,QAAA,CAAU,CAAC,WAAA,CAAa,OAAA,CAAS9G,EAAYC,CAAAA,CAAO5kB,CAAK,EACzD,gBAAA,CAAkB4kB,CAAAA,CAClB,cAAA,CAAgB,IAAA,CAChB,SAAA,CAAW,CAAA,CAEX,QAAS,MAAO,CAAE,UAAA8G,CAAU,CAAA,GAA6B,CASvD,IAAMrqB,CAAAA,CAAAA,CANY,MAAMwN,CAAAA,CAAQ,mCAAA,CAAqC,CACnE,CAAC8V,CAAAA,CAHgB+G,GAAa9G,CAGP,CAAA,CACvB5kB,EACA,mBACF,CAAC,CAAA,EAGE,MAAA,CAAQ6pB,CAAAA,EAAMA,CAAAA,CAAE,UAAU,WAAA,GAAgBlF,CAAU,EACpD,GAAA,CAAKkF,CAAAA,GAAO,CAAE,EAAA,CAAIA,CAAAA,CAAE,EAAA,CAAI,KAAA,CAAOA,CAAAA,CAAE,KAAM,EAAE,CAAA,CAEtCD,CAAAA,CAAc,MAAM/a,CAAAA,CAAQ,4BAAA,CAA8B,CAACxN,CAAAA,CAAK,GAAA,CAAK,CAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA,CACpFijB,CAAAA,CAAWqF,GAAcC,CAAW,CAAA,CAO1C,OALgCvoB,CAAAA,CAAK,GAAA,CAAKxD,IAAO,CAC/C,GAAGA,EACH,YAAA,CAAcymB,CAAAA,CAAS,KAAM/gB,CAAAA,EAAM1F,CAAAA,CAAE,QAAU0F,CAAAA,CAAE,IAAI,CACvD,CAAA,CAAE,CAGJ,CAAA,CAEA,iBAAmBqoB,CAAAA,EACJA,CAAAA,GAAWA,EAAS,MAAA,CAAS,CAAC,GAC9B,KAAA,EAAS,MAE1B,CAAC,CACH,CC3DO,SAAS0qB,EAAAA,CAAiC1xB,CAAAA,CAAe,CAC9D,OAAOtD,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,QAAS,SAAA,CAAWsD,CAAK,EACjD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAASA,CAAAA,GAAU,GAC9B,SAAA,CAAW,EAAA,CAAK,IAChB,OAAA,CAAS,SACH,CAACA,CAAAA,EAASA,CAAAA,GAAU,GACf,EAAC,CAAA,CAAA,CAGQ,MAAM/V,CAAAA,CAAQ,kCAAA,CAAoC,CAClE,MAAO,CAAC+V,CAAK,EACb,KAAA,CAAO,GAAA,CACP,MAAO,mBAAA,CACP,eAAA,CAAiB,WAAA,CACjB,MAAA,CAAQ,SACV,CAAC,GAG2B,cAAA,EAAkB,IAAI,MAAA,CAAQ2xB,CAAAA,EAASA,EAAK,KAAA,GAAU3xB,CAAK,CAI3F,CAAC,CACH,CCmCO,SAAS4xB,EAAAA,CACd5jC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,YAAa,MAAM,CAAA,CACpB/I,EACA,CAAC,CAAE,YAAAmqB,CAAAA,CAAa,OAAA,CAAAN,CAAQ,CAAA,GAAM,CAC5BK,EAAAA,CAAoBlqB,CAAAA,CAAWmqB,CAAAA,CAAaN,CAAO,CACrD,CAAA,CACA,MAAOt+B,GAAgB,CAErB,GAAI,CAIF,IAAM0T,CAAAA,CAAO1T,CAAAA,EAAQ,EAAA,EAAMA,CAAAA,EAAQ,KAAA,CAC/Bkc,GAAM,OAAA,EAAS,cAAA,EAAkBxI,GACnCwI,CAAAA,CAAK,OAAA,CAAQ,eAAe,GAAA,CAAKxI,CAAAA,CAAM1T,CAAAA,EAAQ,SAAS,CAAA,CAAE,KAAA,CAAO0H,GAAU,CACzE,OAAA,CAAQ,MAAM,yDAAA,CAA2D,CACvE,aAAc,GAAA,CACd,QAAA,CAAU1H,GAAQ,SAAA,CAClB,aAAA,CAAe0T,EACf,KAAA,CAAAhM,CACF,CAAC,EACH,CAAC,EAICwU,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnCkH,CAAAA,CAAU,UAAU,IAAA,EAAK,CACzBA,EAAU,SAAA,CAAU,WAAA,CAAY3O,CAAS,CAC3C,CAAC,EAEL,OAAS/M,CAAAA,CAAO,CAEd,QAAQ,IAAA,CAAK,sDAAA,CAAwDA,CAAK,EAC5E,CACF,CAAA,CACAwU,CAAAA,CACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CC1GO,SAASg8B,GACd7jC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,WAAA,CAAa,QAAQ,CAAA,CACtB/I,CAAAA,CACCmJ,GAAY,CACX6gB,EAAAA,CAAsBhqB,CAAAA,CAAWmJ,CAAO,CAC1C,CAAA,CACA,SAAY,CACN1B,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,UAAU,IAAA,EACtB,CAAC,EAEL,CAAA,CACAlH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCpBO,SAASi8B,GACd9jC,CAAAA,CACA5S,CAAAA,CAAQ,GACR,CACA,OAAOyrB,qBAAqB,CAC1B,QAAA,CAAU,CAAC,QAAA,CAAU,qBAAA,CAAuB7Y,CAAAA,CAAU5S,CAAK,CAAA,CAC3D,gBAAA,CAAkB,GAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,IAA6B,CAEvD,IAAMirB,CAAAA,CAAajrB,CAAAA,CAAY1rB,CAAAA,CAAQ,CAAA,CAAIA,EAErC7B,CAAAA,CAAS,MAAM0Q,EAAQ,uCAAA,CAAyC,CACpE+D,EACA8Y,CAAAA,EAAa,EAAA,CACbirB,CACF,CAAC,CAAA,CAID,OAAIjrB,GAAavtB,CAAAA,CAAO,MAAA,CAAS,GAAKA,CAAAA,CAAO,CAAC,GAAG,SAAA,GAAcutB,CAAAA,CAEtDvtB,EAAO,KAAA,CAAM,CAAA,CAAG6B,EAAQ,CAAC,CAAA,CAG3B7B,CACT,CAAA,CACA,gBAAA,CAAmBytB,GAEb,CAACA,CAAAA,EAAYA,CAAAA,CAAS,MAAA,CAAS5rB,CAAAA,CACjC,MAAA,CAIqB4rB,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAC5B,SAAA,CAEzB,QAAS,CAAC,CAAChZ,CACb,CAAC,CACH,CCnCO,SAASgkC,GAAkChkC,CAAAA,CAA8B,CAC9E,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,qBAAA,CAAuB1O,CAAQ,CAAA,CACpD,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,QAAS,CAAC,CAAE,OAAA3F,CAAO,CAAA,GACjBuC,GACE,SAAA,CACA,sCAAA,CACA,CAAE,cAAA,CAAgBoD,CAAS,CAAA,CAC3B,MAAA,CACA,MAAA,CACA3F,CACF,CACJ,CAAC,CACH,CCXO,SAAS4pC,EAAAA,CAA4CjkC,CAAAA,CAAmB,CAC7E,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,gCAAA,CAAkC1O,CAAQ,CAAA,CAC/D,OAAA,CAAS,SACFA,CAAAA,CAAAA,CACU,MAAM/D,CAAAA,CAAQ,mDAAoD,CAAE,OAAA,CAAS+D,CAAS,CAAC,CAAA,EACxF,YAFQ,EAAC,CAIzB,QAAS,CAAC,CAACA,CACb,CAAC,CACH,CCjBO,SAASkkC,EAAAA,CAAkCl+B,CAAAA,CAAiB,CACjE,OAAO0I,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,qBAAA,CAAuB1I,CAAO,CAAA,CACnD,OAAA,CAAS,IACP/J,CAAAA,CAAQ,uCAAA,CAAyC,CAC/C+J,CACF,CAAC,CAAA,CACH,OAAS5W,CAAAA,EAASA,CAAAA,CAAK,KAAK,CAACuB,CAAAA,CAAGtF,CAAAA,GAAMsF,CAAAA,CAAE,SAAA,CAAYtF,CAAAA,CAAE,SAAS,CACjE,CAAC,CACH,CCTO,SAAS84C,EAAAA,CAAgDn+B,CAAAA,CAAiB,CAC/E,OAAO0I,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,oCAAA,CAAsC1I,CAAO,CAAA,CAClE,OAAA,CAAS,IACP/J,CAAAA,CAAQ,uDAAwD,CAC9D+J,CACF,CAAC,CAAA,CACH,MAAA,CAAS5W,GAASA,CAAAA,CAAK,IAAA,CAAK,CAACuB,CAAAA,CAAGtF,CAAAA,GAAMsF,CAAAA,CAAE,UAAYtF,CAAAA,CAAE,SAAS,CACjE,CAAC,CACH,CCTO,SAAS+4C,EAAAA,CAAmCp+B,EAAiB,CAClE,OAAO0I,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,kBAAA,CAAoB1I,CAAO,CAAA,CAChD,OAAA,CAAS,IACP/J,CAAAA,CAAQ,yCAAA,CAA2C,CACjD+J,CACF,CAAC,EACH,MAAA,CAAS5W,CAAAA,EAASA,CAAAA,CAAK,IAAA,CAAK,CAACuB,CAAAA,CAAGtF,IAAMsF,CAAAA,CAAE,UAAA,CAAatF,EAAE,UAAU,CACnE,CAAC,CACH,CCTO,SAASg5C,EAAAA,CAA8Br+B,CAAAA,CAAiB,CAC7D,OAAO0I,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,iBAAA,CAAmB1I,CAAO,CAAA,CAC/C,QAAS,IACP/J,CAAAA,CAAQ,oCAAqC,CAC3C+J,CAAAA,CACA,UACF,CAAC,CACL,CAAC,CACH,CCTO,SAASs+B,EAAAA,CAA0BzxB,EAAc,CACtD,OAAOnE,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,aAAA,CAAemE,CAAI,EACxC,OAAA,CAAS,IACP5W,EAAQ,+BAAA,CAAiC,CACvC4W,CACF,CAAC,CAAA,CACH,MAAA,CAASzjB,GAASA,CAAAA,CAAK,IAAA,CAAK,CAACuB,CAAAA,CAAGtF,CAAAA,GAAMsF,EAAE,OAAA,CAAUtF,CAAAA,CAAE,OAAO,CAAA,CAC3D,OAAA,CAAS,CAAC,CAACwnB,CACb,CAAC,CACH,CCNO,SAAS0xB,EAAAA,CAA6CvkC,CAAAA,CAAkB5S,EAAQ,GAAA,CAAK,CAC1F,OAAOyrB,oBAAAA,CAML,CACA,SAAU,CAAC,QAAA,CAAU,yBAAA,CAA2B7Y,CAAAA,CAAU5S,CAAK,CAAA,CAC/D,iBAAkB,IAAA,CAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,CAAA,GAA+B,CAOzD,IAAI0rB,CAAAA,CAAAA,CANa,MAAMvoC,CAAAA,CAAQ,oCAAqC,CAChE,KAAA,CAAO,CAAC+D,CAAAA,CAAU8Y,CAAAA,EAAa,EAAE,CAAA,CACjC,KAAA,CAAA1rB,CACF,CAAC,CAAA,CACA,IAAA,CAAM0B,GAAWA,CAAgC,CAAA,EAEH,uBAAyB,EAAC,CAG3E,OAAIgqB,CAAAA,GACF0rB,CAAAA,CAAcA,EAAY,MAAA,CAAQC,CAAAA,EAAeA,EAAW,EAAA,GAAO3rB,CAAS,GAGvE0rB,CACT,CAAA,CAEA,iBAAmBxrB,CAAAA,EACjBA,CAAAA,CAAS,MAAA,GAAW5rB,CAAAA,CAAQ4rB,CAAAA,CAASA,CAAAA,CAAS,OAAS,CAAC,CAAA,CAAE,GAAK,IACnE,CAAC,CACH,CCxCO,SAAS0rB,GAA0B1kC,CAAAA,CAA8B,CACtE,OAAO0O,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,aAAA,CAAe1O,CAAQ,CAAA,CAC5C,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,QAAS,SAAyC,CAChD,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAIpE,IAAMxC,EAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,yBAAA,EAA4BxK,CAAQ,CAAA,CAC9D,EAEA,GAAI,CAACxC,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CACF,CAAC,CACH,CCrBO,SAASmnC,GAAqC3kC,CAAAA,CAAkB,CACrE,OAAO0O,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,0BAA2B1O,CAAQ,CAAA,CACxD,QAAS,SAAY,CACnB,IAAMxC,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,CAAA,8BAAA,EAAiCxK,CAAQ,CAAA,CACnE,CAAA,CAEA,GAAI,CAACxC,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,yCAAA,EAA4CA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAI/E,OAAA,CADc,MAAMA,CAAAA,CAAS,IAAA,IACjB,IACd,CACF,CAAC,CACH,CCXO,SAASonC,EAAAA,CAAkC5kC,CAAAA,CAAkB,CAClE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,qBAAA,CAAuB1O,CAAQ,EACpD,OAAA,CAAS,IACP/D,EAAQ,wCAAA,CAA0C,CAChD+D,CACF,CAAC,CAAA,CACH,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CCsBA,SAAS6kC,EAAAA,CAAgBx4C,CAAAA,CAAoC,CAC3D,GAAI,OAAOA,GAAU,QAAA,CAAU,CAC7B,IAAMy4C,CAAAA,CAAUz4C,CAAAA,CAAM,MAAK,CAC3B,OAAOy4C,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAU,MACxC,CAGF,CAEA,SAASC,EAAAA,CAAgB14C,CAAAA,CAAoC,CAC3D,GAAI,OAAOA,GAAU,QAAA,EAAY,MAAA,CAAO,SAASA,CAAK,CAAA,CACpD,OAAOA,CAAAA,CAGT,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAC7B,IAAMy4C,CAAAA,CAAUz4C,CAAAA,CAAM,MAAK,CAC3B,GAAI,CAACy4C,CAAAA,CACH,OAGF,IAAME,CAAAA,CAAS,MAAA,CAAO,UAAA,CAAWF,CAAO,CAAA,CACxC,GAAI,OAAO,QAAA,CAASE,CAAM,EACxB,OAAOA,CAAAA,CAIT,IAAMt5B,CAAAA,CADYo5B,CAAAA,CAAQ,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAClB,MAAM,oBAAoB,CAAA,CAClD,GAAIp5B,CAAAA,CAAO,CACT,IAAMvE,CAAAA,CAAS,MAAA,CAAO,WAAWuE,CAAAA,CAAM,CAAC,CAAC,CAAA,CACzC,GAAI,OAAO,QAAA,CAASvE,CAAM,EACxB,OAAOA,CAEX,CACF,CAGF,CAEA,SAAS89B,GAAWC,CAAAA,CAAoD,CACtE,GAAI,CAACA,CAAAA,EAAY,OAAOA,CAAAA,EAAa,QAAA,CACnC,OAGF,IAAMn9B,CAAAA,CAAQm9B,CAAAA,CAGd,OAAO,CACL,IAAA,CAAML,GAAgB98B,CAAAA,CAAM,IAAI,GAAK,EAAA,CACrC,MAAA,CAAQ88B,EAAAA,CAAgB98B,CAAAA,CAAM,MAAM,CAAA,EAAK,GACzC,KAAA,CAAQ88B,EAAAA,CAAgB98B,EAAM,KAAK,CAAA,EAAK,OACxC,OAAA,CAASg9B,EAAAA,CAAgBh9B,EAAM,OAAO,CAAA,EAAK,EAC3C,QAAA,CAAUg9B,EAAAA,CAAgBh9B,EAAM,QAAQ,CAAA,EAAK,EAC7C,QAAA,CAAU88B,EAAAA,CAAgB98B,CAAAA,CAAM,QAAQ,CAAA,EAAK,KAAA,CAC7C,UAAWg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,SAAS,CAAA,EAAK,CAAA,CAC/C,QAAS88B,EAAAA,CAAgB98B,CAAAA,CAAM,OAAO,CAAA,CACtC,KAAA,CAAO88B,EAAAA,CAAgB98B,EAAM,KAAK,CAAA,CAClC,eAAgBg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,cAAc,CAAA,CACpD,kBAAA,CAAoBg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,kBAAkB,CAAA,CAC5D,OAAQg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,MAAM,CAAA,CACpC,UAAA,CAAYg9B,GAAgBh9B,CAAAA,CAAM,UAAU,EAC5C,OAAA,CAASg9B,EAAAA,CAAgBh9B,EAAM,OAAO,CAAA,CACtC,YAAag9B,EAAAA,CAAgBh9B,CAAAA,CAAM,WAAW,CAAA,CAC9C,MAAA,CAAQg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,MAAM,CAAA,CACpC,WAAYg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,UAAU,CAAA,CAC5C,OAAA,CAAS88B,GAAgB98B,CAAAA,CAAM,OAAO,CAAA,CACtC,OAAA,CAAUA,CAAAA,CAAM,OAAA,EAAW,EAAC,CAC5B,SAAA,CAAYA,EAAM,SAAA,EAAa,GAC/B,GAAA,CAAKg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,GAAG,CAChC,CACF,CAEA,SAASo9B,EAAAA,CAAch8B,EAA6B,CAClD,GAAI,CAACA,CAAAA,EAAW,OAAOA,GAAY,QAAA,CACjC,OAAO,EAAC,CAGV,IAAMyZ,EAAa,CAACzZ,CAAO,EACrBi8B,CAAAA,CAASj8B,CAAAA,CACXi8B,CAAAA,CAAO,IAAA,EAAQ,OAAOA,CAAAA,CAAO,MAAS,QAAA,EACxCxiB,CAAAA,CAAW,KAAKwiB,CAAAA,CAAO,IAA+B,EAEpDA,CAAAA,CAAO,MAAA,EAAU,OAAOA,CAAAA,CAAO,MAAA,EAAW,QAAA,EAC5CxiB,EAAW,IAAA,CAAKwiB,CAAAA,CAAO,MAAiC,CAAA,CAEtDA,CAAAA,CAAO,WAAa,OAAOA,CAAAA,CAAO,SAAA,EAAc,QAAA,EAClDxiB,CAAAA,CAAW,IAAA,CAAKwiB,EAAO,SAAoC,CAAA,CAG7D,QAAWtjB,CAAAA,IAAac,CAAAA,CAAY,CAClC,GAAI,KAAA,CAAM,QAAQd,CAAS,CAAA,CACzB,OAAOA,CAAAA,CAGT,GAAIA,GAAa,OAAOA,CAAAA,EAAc,SACpC,IAAA,IAAW9xB,CAAAA,IAAO,CAChB,SAAA,CACA,QAAA,CACA,QAAA,CACA,QACA,WAAA,CACA,UACF,EAAG,CACD,IAAM3D,EAASy1B,CAAAA,CAAsC9xB,CAAG,CAAA,CACxD,GAAI,KAAA,CAAM,OAAA,CAAQ3D,CAAK,CAAA,CACrB,OAAOA,CAEX,CAEJ,CAEA,OAAO,EACT,CAEA,SAASg5C,EAAAA,CAAgBl8B,CAAAA,CAAsC,CAC7D,GAAI,CAACA,GAAW,OAAOA,CAAAA,EAAY,SACjC,OAGF,IAAMi8B,EAASj8B,CAAAA,CACf,OACE07B,GAAgBO,CAAAA,CAAO,QAAQ,GAC/BP,EAAAA,CAAgBO,CAAAA,CAAO,IAAI,CAAA,EAC3BP,EAAAA,CAAgBO,CAAAA,CAAO,OAAO,CAElC,CASO,SAASE,EAAAA,CACdtlC,CAAAA,CACAiT,EAAmB,KAAA,CACnBD,CAAAA,CAAuB,KACvB,CACA,OAAOtE,YAAAA,CAAa,CAClB,QAAA,CAAU,CACR,SACA,WAAA,CACA,IAAA,CACA1O,EACAgT,CAAAA,CAAc,cAAA,CAAiB,MAC/BC,CACF,CAAA,CACA,OAAA,CAAS,CAAA,CAAQjT,CAAAA,CACjB,SAAA,CAAW,IACX,eAAA,CAAiB,IAAA,CACjB,QAAS,SAAwC,CAC/C,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,2CAAsC,CAAA,CAGxD,IAAMnD,EAAW,CAAA,EAAG6N,CAAAA,CAAc,qBAAqB,CAAA,wBAAA,CAAA,CACjDlN,CAAAA,CAAW,MAAM,KAAA,CAAMX,CAAAA,CAAU,CACrC,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,MAAA,CAAQ,mBACR,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,QAAA,CAAAmD,CAAAA,CAAU,YAAAgT,CAAAA,CAAa,QAAA,CAAAC,CAAS,CAAC,CAC1D,CAAC,CAAA,CAED,GAAI,CAACzV,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,+CAAA,EAA6CA,EAAS,MAAM,CAAA,CAAA,CAC9D,EAGF,IAAM2L,CAAAA,CAAW,MAAM3L,CAAAA,CAAS,IAAA,GAC1BlF,CAAAA,CAAS6sC,EAAAA,CAAch8B,CAAO,CAAA,CACjC,GAAA,CAAKlX,CAAAA,EAASgzC,EAAAA,CAAWhzC,CAAI,CAAC,EAC9B,MAAA,CAAQA,CAAAA,EAAsC,EAAQA,CAAK,CAAA,CAE3D,OAAQA,CAAAA,EAAUA,CAAAA,CAAK,KAAA,GAAqB,KAAK,CAAA,CAEpD,GAAI,CAACqG,CAAAA,CAAO,MAAA,CACV,MAAM,IAAI,KAAA,CACR,4DACF,CAAA,CAGF,OAAO,CACL,QAAA,CAAU+sC,EAAAA,CAAgBl8B,CAAO,GAAKnJ,CAAAA,CACtC,QAAA,CAAU6kC,GACP17B,CAAAA,EAAiD,YAAA,EACjDA,GAAiD,QACpD,CAAA,EAAG,aAAY,CACf,OAAA,CAAS7Q,CACX,CACF,CACF,CAAC,CACH,CCjOO,SAASitC,EAAAA,CAAoCvlC,CAAAA,CAAkB,CACpE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,MAAA,CAAQ,cAAA,CAAgB1O,CAAQ,CAAA,CACrD,SAAA,CAAW,GAAA,CACX,gBAAiB,GAAA,CACjB,OAAA,CAAS,SAAY,CACnB,MAAM6M,GAAe,CAAE,aAAA,CAAc4B,EAAAA,EAA6B,CAAA,CAClE,MAAM5B,GAAe,CAAE,aAAA,CACrB8H,EAA2B3U,CAAQ,CACrC,EAEA,IAAM+yB,CAAAA,CAAelmB,GAAe,CAAE,YAAA,CACpC4B,IAA4B,CAAE,QAChC,EACM2hB,CAAAA,CAAcvjB,CAAAA,GAAiB,YAAA,CACnC8H,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QACvC,CAAA,CAEMwlC,EAAgB,MAAMvpC,CAAAA,CAAQ,2BAA4B,EAAE,EAC/D,KAAA,CAAM,IAAG,CAAA,CAAY,CAAA,CAElBwpC,CAAAA,CAAc,MAAA,CAAO,WAAWD,CAAAA,EAAc,MAAA,EAAU,EAAE,CAAA,CAEhE,GAAI,CAACpV,CAAAA,CACH,OAAO,CACL,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,OACP,KAAA,CAAO,MAAA,CAAO,SAASqV,CAAW,CAAA,CAC9BA,EACA1S,CAAAA,CACEA,CAAAA,CAAa,KAAOA,CAAAA,CAAa,KAAA,CACjC,EACN,cAAA,CAAgB,CAClB,EAGF,IAAM2S,CAAAA,CAAgB73B,EAAWuiB,CAAAA,CAAY,OAAO,CAAA,CAAE,MAAA,CAChDuV,CAAAA,CAAiB93B,CAAAA,CAAWuiB,EAAY,eAAe,CAAA,CAAE,OAE/D,OAAO,CACL,KAAM,MAAA,CACN,KAAA,CAAO,MAAA,CACP,KAAA,CAAO,MAAA,CAAO,QAAA,CAASqV,CAAW,CAAA,CAC9BA,CAAAA,CACA1S,EACEA,CAAAA,CAAa,IAAA,CAAOA,EAAa,KAAA,CACjC,CAAA,CACN,cAAA,CAAgB2S,CAAAA,CAAgBC,CAAAA,CAChC,KAAA,CAAO,CACL,CACE,IAAA,CAAM,UACN,OAAA,CAASD,CACX,EACA,CACE,IAAA,CAAM,UACN,OAAA,CAASC,CACX,CACF,CACF,CACF,CACF,CAAC,CACH,CC9DO,SAASC,EAAAA,CAAmC5lC,EAAkB,CACnE,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,KAAA,CAAO,cAAA,CAAgB1O,CAAQ,CAAA,CACpD,SAAA,CAAW,IACX,eAAA,CAAiB,GAAA,CACjB,QAAS,SAAY,CACnB,MAAM6M,CAAAA,EAAe,CAAE,aAAA,CAAc4B,EAAAA,EAA6B,CAAA,CAClE,MAAM5B,CAAAA,EAAe,CAAE,cACrB8H,CAAAA,CAA2B3U,CAAQ,CACrC,CAAA,CAEA,IAAMowB,EAAcvjB,CAAAA,EAAe,CAAE,aACnC8H,CAAAA,CAA2B3U,CAAQ,EAAE,QACvC,CAAA,CACM+yB,EAAelmB,CAAAA,EAAe,CAAE,YAAA,CACpC4B,EAAAA,EAA4B,CAAE,QAChC,EAEMo3B,CAAAA,CAAQ,CAAA,CAEd,OAAKzV,CAAAA,CASE,CACL,KAAM,KAAA,CACN,KAAA,CAAO,aAAA,CACP,KAAA,CAAAyV,CAAAA,CACA,cAAA,CACEh4B,EAAWuiB,CAAAA,CAAY,WAAW,EAAE,MAAA,CACpCviB,CAAAA,CAAWuiB,GAAa,mBAAmB,CAAA,CAAE,MAAA,CAC/C,GAAA,CAAA,CAAA,CAAO2C,CAAAA,EAAc,eAAA,EAAmB,GAAK,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAC3D,KAAA,CAAO,CACL,CACE,IAAA,CAAM,UACN,OAAA,CAASllB,CAAAA,CAAWuiB,EAAY,WAAW,CAAA,CAAE,MAC/C,CAAA,CACA,CACE,KAAM,SAAA,CACN,OAAA,CAASviB,CAAAA,CAAWuiB,CAAAA,CAAY,mBAAmB,CAAA,CAAE,MACvD,CACF,CACF,EA1BS,CACL,IAAA,CAAM,MACN,KAAA,CAAO,aAAA,CACP,KAAA,CAAAyV,CAAAA,CACA,cAAA,CAAgB,CAClB,CAsBJ,CACF,CAAC,CACH,CCjDA,SAASC,EAAAA,CAAO/S,CAAAA,CAA4B,CAU1C,IAAIgT,CAAAA,CACF,GAAA,CAAA,CALgBhT,EAAa,SAAA,CACC,GAAA,EACS,KAGK,GAAA,CAE1CgT,CAAAA,CAAuB,MACzBA,CAAAA,CAAuB,GAAA,CAAA,CAGzB,IAAM71B,CAAAA,CAAuB6iB,CAAAA,CAAa,qBAAuB,GAAA,CAC3D9iB,CAAAA,CAAgB8iB,EAAa,aAAA,CAC7BiT,CAAAA,CAAoBjT,CAAAA,CAAa,gBAAA,CAEvC,OAAA,CACG9iB,CAAAA,CAAgB81B,EAAuB71B,CAAAA,CACxC81B,CAAAA,EACA,QAAQ,CAAC,CACb,CAEO,SAASC,EAAAA,CAAyCjmC,CAAAA,CAAkB,CACzE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,YAAA,CAAc,cAAA,CAAgB1O,CAAQ,CAAA,CAC3D,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,OAAA,CAAS,SAAY,CACnB,MAAM6M,GAAe,CAAE,aAAA,CAAc4B,IAA6B,CAAA,CAClE,MAAM5B,CAAAA,EAAe,CAAE,cACrB8H,CAAAA,CAA2B3U,CAAQ,CACrC,CAAA,CAEA,IAAM+yB,EAAelmB,CAAAA,EAAe,CAAE,YAAA,CACpC4B,EAAAA,EAA4B,CAAE,QAChC,EACM2hB,CAAAA,CAAcvjB,CAAAA,GAAiB,YAAA,CACnC8H,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QACvC,CAAA,CAEA,GAAI,CAAC+yB,CAAAA,EAAgB,CAAC3C,CAAAA,CACpB,OAAO,CACL,IAAA,CAAM,IAAA,CACN,MAAO,YAAA,CACP,KAAA,CAAO,CAAA,CACP,cAAA,CAAgB,CAClB,CAAA,CAGF,IAAMoV,CAAAA,CAAgB,MAAMvpC,EAAQ,0BAAA,CAA4B,EAAE,CAAA,CAC/D,KAAA,CAAM,IAAG,CAAA,CAAY,CAAA,CAElBwpC,EAAc,MAAA,CAAO,UAAA,CAAWD,GAAc,MAAA,EAAU,EAAE,EAC1DK,CAAAA,CAAQ,MAAA,CAAO,QAAA,CAASJ,CAAW,CAAA,CACrCA,CAAAA,CACA1S,EAAa,IAAA,CAAOA,CAAAA,CAAa,MAE/BhL,CAAAA,CAAgBla,CAAAA,CAAWuiB,EAAY,cAAc,CAAA,CAAE,MAAA,CACvD8V,CAAAA,CAAiBr4B,CAAAA,CACrBuiB,CAAAA,CAAY,wBACd,CAAA,CAAE,MAAA,CACI+V,EAAgBt4B,CAAAA,CACpBuiB,CAAAA,CAAY,uBACd,CAAA,CAAE,MAAA,CACIgW,CAAAA,CAAoBv4B,CAAAA,CACxBuiB,CAAAA,CAAY,qBACd,EAAE,MAAA,CACIiW,CAAAA,CAA2B,KAAK,GAAA,CAAA,CACnC,MAAA,CAAOjW,EAAY,WAAW,CAAA,CAAI,OAAOA,CAAAA,CAAY,SAAS,GAC7D,GAAA,CACF,CACF,EACMkW,CAAAA,CAAuB/3B,EAAAA,CAC3B6hB,EAAY,uBACd,CAAA,CAEI,CAAA,CADA,IAAA,CAAK,GAAA,CAAIgW,CAAAA,CAAmBC,CAAwB,CAAA,CAGlDE,CAAAA,CAAY,CAACl4B,EAAAA,CACjB0Z,CAAAA,CACAgL,EAAa,aACf,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CACLyT,CAAAA,CAAwB,CAACn4B,EAAAA,CAC7B63B,CAAAA,CACAnT,EAAa,aACf,CAAA,CAAE,QAAQ,CAAC,CAAA,CACL0T,CAAAA,CAAwB,CAACp4B,EAAAA,CAC7B83B,CAAAA,CACApT,EAAa,aACf,CAAA,CAAE,QAAQ,CAAC,CAAA,CACL2T,EAAqB,CAACr4B,EAAAA,CAC1Bg4B,EACAtT,CAAAA,CAAa,aACf,EAAE,OAAA,CAAQ,CAAC,EACL4T,CAAAA,CAAkB,CAACt4B,GACvBi4B,CAAAA,CACAvT,CAAAA,CAAa,aACf,CAAA,CAAE,OAAA,CAAQ,CAAC,EACL6T,CAAAA,CAAe,IAAA,CAAK,IAAIL,CAAAA,CAAYG,CAAAA,CAAoB,CAAC,CAAA,CACzDG,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAIN,CAAAA,CAAYC,CAAAA,CAAuB,CAAC,CAAA,CAEjE,OAAO,CACL,IAAA,CAAM,IAAA,CACN,MAAO,YAAA,CACP,KAAA,CAAAX,CAAAA,CACA,cAAA,CAAgB,CAACe,CAAAA,CAAa,QAAQ,CAAC,CAAA,CACvC,IAAKd,EAAAA,CAAO/S,CAAY,EACxB,KAAA,CAAO,CACL,CACE,IAAA,CAAM,YAAA,CACN,QAASwT,CACX,CAAA,CACA,CACE,IAAA,CAAM,WAAA,CACN,QAAS,CAACM,CAAAA,CAAY,OAAA,CAAQ,CAAC,CACjC,CAAA,CACA,CACE,IAAA,CAAM,sBAAA,CACN,QAASL,CACX,CAAA,CACA,CACE,IAAA,CAAM,sBAAA,CACN,OAAA,CAASC,CACX,CAAA,CACA,GAAIC,EAAqB,CAAA,CACrB,CACE,CACE,IAAA,CAAM,oBAAA,CACN,QAAS,CAACA,CAAAA,CAAmB,OAAA,CAAQ,CAAC,CACxC,CACF,EACA,EAAC,CACL,GAAIC,CAAAA,CAAkB,CAAA,EAAKA,IAAoBD,CAAAA,CAC3C,CACE,CACE,IAAA,CAAM,iBAAA,CACN,QAAS,CAACC,CAAAA,CAAgB,QAAQ,CAAC,CACrC,CACF,CAAA,CACA,EACN,CACF,CACF,CACF,CAAC,CACH,CC5JA,IAAMthC,CAAAA,CAAMpB,GAAM,UAAA,CAEL6iC,EAAAA,CAGT,CACF,SAAA,CAAW,CACTzhC,EAAI,QAAA,CACJA,CAAAA,CAAI,oBACJA,CAAAA,CAAI,qBAAA,CACJA,CAAAA,CAAI,4BAAA,CACJA,CAAAA,CAAI,kBAAA,CACJA,EAAI,uBAAA,CACJA,CAAAA,CAAI,gBACJA,CAAAA,CAAI,uBACN,EACA,eAAA,CAAiB,CACfA,EAAI,oBAAA,CACJA,CAAAA,CAAI,WACJA,CAAAA,CAAI,mCAAA,CACJA,EAAI,mBAAA,CACJA,CAAAA,CAAI,mBACJA,CAAAA,CAAI,kBACN,CAAA,CACA,SAAA,CAAW,CAACA,CAAAA,CAAI,QAAQ,CAAA,CACxB,kBAAA,CAAoB,CAClBA,CAAAA,CAAI,yBAAA,CACJA,EAAI,gBAAA,CACJA,CAAAA,CAAI,mBAAA,CACJA,CAAAA,CAAI,0BAAA,CACJA,CAAAA,CAAI,sBACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,qBAAA,CACJA,CAAAA,CAAI,uBACN,CAAA,CACA,OAAA,CAAS,CACPA,CAAAA,CAAI,aAAA,CACJA,CAAAA,CAAI,gBACJA,CAAAA,CAAI,eAAA,CACJA,EAAI,oBAAA,CACJA,CAAAA,CAAI,0BACJA,CAAAA,CAAI,gBAAA,CACJA,EAAI,YACN,CAAA,CACA,GAAI,EACN,EC5CO,IAAM0hC,EAAAA,CAAsB,OAAO,IAAA,CACxC9iC,EAAAA,CAAM,UACR,ECFA,IAAM+iC,EAAAA,CAAkB/iC,GAAM,UAAA,CAKjBgjC,EAAAA,CAAwBD,GAExBE,EAAAA,CACX,MAAA,CAAO,QAAQF,EAAe,CAAA,CAAE,MAAA,CAAO,CAACvtB,CAAAA,CAAK,CAAC5H,EAAM7f,CAAE,CAAA,IACpDynB,EAAIznB,CAAE,CAAA,CAAI6f,EACH4H,CAAAA,CAAAA,CACN,EAAuC,ECE5C,IAAMutB,EAAAA,CAAkB/iC,GAAM,UAAA,CAE9B,SAASkjC,GAAoB96C,CAAAA,CAA2C,CACtE,OAAO,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK26C,EAAAA,CAAiB36C,CAAK,CACpE,CAEO,SAAS+6C,EAAAA,CAA4BxiB,CAAAA,CAG1C,CACA,IAAMyiB,CAAAA,CAAwC,KAAA,CAAM,OAAA,CAAQziB,CAAO,CAAA,CAC/DA,EACA,CAACA,CAAO,EAEN0iB,CAAAA,CAASD,CAAAA,CAAU,SAAS,EAAwB,CAAA,CAEpDE,CAAAA,CAAe,KAAA,CAAM,IAAA,CACzB,IAAI,IACFF,CAAAA,CAAU,MAAA,CACPh7C,GAECA,CAAAA,EAAU,IAAA,EACVA,IAAW,EACf,CACF,CACF,CAAA,CAEM6mB,CAAAA,CACJo0B,CAAAA,EAAUC,EAAa,MAAA,GAAW,CAAA,CAC9B,MACAA,CAAAA,CACG,GAAA,CAAKl7C,GAAUA,CAAAA,CAAM,QAAA,EAAU,CAAA,CAC/B,IAAA,GACA,IAAA,CAAK,GAAG,EAEXm7C,CAAAA,CAAe,IAAI,IAEpBF,CAAAA,EACHC,CAAAA,CAAa,OAAA,CAASl7C,CAAAA,EAAU,CAC9B,GAAIA,KAASy6C,EAAAA,CAA+B,CAC1CA,GAA8Bz6C,CAA2B,CAAA,CAAE,QACxD2F,CAAAA,EAAOw1C,CAAAA,CAAa,GAAA,CAAIx1C,CAAE,CAC7B,CAAA,CACA,MACF,CAEIm1C,EAAAA,CAAoB96C,CAAK,CAAA,EAC3Bm7C,CAAAA,CAAa,IAAIR,EAAAA,CAAgB36C,CAAK,CAAC,EAE3C,CAAC,CAAA,CAGH,IAAMo7C,CAAAA,CAAarjC,EAAAA,CAAkB,MAAM,IAAA,CAAKojC,CAAY,CAAC,CAAA,CAE7D,OAAO,CACL,SAAA,CAAAt0B,CAAAA,CACA,WAAAu0B,CACF,CACF,CAEA,SAASrjC,EAAAA,CAAkBM,EAA6B,CACtD,IAAIE,CAAAA,CAAM,EAAA,CACNC,CAAAA,CAAO,EAAA,CAEX,OAAAH,CAAAA,CAAkB,OAAA,CAAS5Q,GAAc,CACnCA,CAAAA,CAAY,GACd8Q,CAAAA,EAAO,EAAA,EAAM,MAAA,CAAO9Q,CAAS,CAAA,CAE7B+Q,CAAAA,EAAQ,IAAM,MAAA,CAAO/Q,CAAAA,CAAY,EAAE,EAEvC,CAAC,EAEM,CACL8Q,CAAAA,GAAQ,EAAA,CAAKA,CAAAA,CAAI,QAAA,EAAS,CAAI,KAC9BC,CAAAA,GAAS,EAAA,CAAKA,EAAK,QAAA,EAAS,CAAI,IAClC,CACF,CAEO,SAAS6iC,EAAAA,CACd1nC,CAAAA,CACA5S,EAAQ,EAAA,CACRw3B,CAAAA,CAA+B,EAAC,CAChC,CACA,GAAM,CAAE,UAAA,CAAA6iB,CAAAA,CAAY,SAAA,CAAAv0B,CAAU,CAAA,CAAIk0B,GAA4BxiB,CAAO,CAAA,CAErE,OAAO/L,oBAAAA,CAAwC,CAC7C,SAAU,CAAC,QAAA,CAAU,MAAA,CAAQ,cAAA,CAAgB7Y,CAAAA,CAAU5S,CAAAA,CAAO8lB,CAAS,CAAA,CACvE,WAAA,CAAa,CAAE,KAAA,CAAO,GAAI,UAAA,CAAY,EAAG,CAAA,CACzC,gBAAA,CAAkB,EAAA,CAClB,iBAAkB,CAAC8F,CAAAA,CAAU2uB,IAC3B3uB,CAAAA,CAAW,EAAEA,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,GAAA,EAAO,GAAK,CAAA,CAAI,EAAA,CAE9D,QAAS,MAAO,CAAE,UAAAF,CAAU,CAAA,GAAA,CACT,MAAM7c,CAAAA,CACrB,mCAAA,CACA,CAAC+D,EAAU8Y,CAAAA,CAAW1rB,CAAAA,CAAO,GAAGq6C,CAAU,CAC5C,GAEgB,GAAA,CACbxwB,CAAAA,GACE,CACC,GAAA,CAAKA,CAAAA,CAAE,CAAC,EACR,IAAA,CAAMA,CAAAA,CAAE,CAAC,CAAA,CAAE,EAAA,CAAG,CAAC,CAAA,CACf,SAAA,CAAWA,CAAAA,CAAE,CAAC,CAAA,CAAE,SAAA,CAChB,OAAQA,CAAAA,CAAE,CAAC,EAAE,MAAA,CACb,GAAGA,EAAE,CAAC,CAAA,CAAE,GAAG,CAAC,CACd,EACJ,CAAA,CAEF,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA2wB,EAAO,UAAA,CAAAC,CAAW,CAAA,IAAO,CAClC,UAAA,CAAAA,CAAAA,CACA,MAAOD,CAAAA,CAAM,GAAA,CAAKl1B,GAChBA,CAAAA,CAAK,MAAA,CAAQzgB,GAAS,CACpB,OAAQA,CAAAA,CAAK,IAAA,EACX,KAAK,gBACL,KAAK,2BAAA,CAIH,OAHmB4b,CAAAA,CAChB5b,CAAAA,CAAsB,WACzB,CAAA,CACkB,MAAA,CAAS,CAAA,CAC7B,KAAK,UAAA,CACL,KAAK,sBACL,KAAK,qBAAA,CACL,KAAK,oBAAA,CACH,OAAO4b,EAAW5b,CAAAA,CAAK,MAAM,EAAE,MAAA,GAAW,MAAA,CAE5C,KAAK,uBAAA,CACH,OAAO4b,EAAY5b,CAAAA,CAAa,MAAM,EAAE,MAAA,GAAW,MAAA,CAErD,KAAK,yBAAA,CACH,IAAME,CAAAA,CAAQ0b,EAAW5b,CAAAA,CAAK,MAAM,EACpC,OAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAASE,CAAAA,CAAM,MAAM,CAAA,CAEvC,KAAK,uBAIH,OAHmB0b,CAAAA,CAChB5b,EAA4B,WAC/B,CAAA,CACkB,OAAS,CAAA,CAE7B,KAAK,iBAAA,CACL,KAAK,8BAAA,CACL,KAAK,aACL,KAAK,oBAAA,CACL,KAAK,oBAAA,CACL,KAAK,uBACL,KAAK,qCAAA,CACH,OAAO,KAAA,CAET,KAAK,sBACH,OAAO,KAAA,CACT,QACE,OAAO,MACX,CACF,CAAC,CACH,CACF,CAAA,CACF,CAAC,CACH,CC/JO,SAAS61C,GACd9nC,CAAAA,CACA5S,CAAAA,CAAQ,EAAA,CACRw3B,CAAAA,CAA+B,EAAC,CAChC,CACA,GAAM,CAAE,UAAA1R,CAAU,CAAA,CAAIk0B,GAA4BxiB,CAAO,CAAA,CAEzD,OAAO/L,oBAAAA,CAAwC,CAC7C,GAAG6uB,GAAqC1nC,CAAAA,CAAU5S,CAAAA,CAAOw3B,CAAO,CAAA,CAChE,QAAA,CAAU,CAAC,QAAA,CAAU,KAAA,CAAO,eAAgB5kB,CAAAA,CAAU5S,CAAAA,CAAO8lB,CAAS,CAAA,CACtE,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA00B,EAAO,UAAA,CAAAC,CAAW,CAAA,IAAO,CAClC,UAAA,CAAAA,CAAAA,CACA,MAAOD,CAAAA,CAAM,GAAA,CAAKl1B,GAChBA,CAAAA,CAAK,MAAA,CAAQzgB,GAAS,CACpB,OAAQA,CAAAA,CAAK,IAAA,EACX,KAAK,gBACL,KAAK,2BAAA,CAIH,OAHkB4b,CAAAA,CACf5b,CAAAA,CAAsB,UACzB,CAAA,CACiB,MAAA,CAAS,CAAA,CAE5B,KAAK,sBAAA,CAIH,OAHkB4b,EACf5b,CAAAA,CAA4B,UAC/B,EACiB,MAAA,CAAS,CAAA,CAE5B,KAAK,UAAA,CACL,KAAK,sBACL,KAAK,qBAAA,CACL,KAAK,oBAAA,CACH,OAAO4b,EAAW5b,CAAAA,CAAK,MAAM,EAAE,MAAA,GAAW,KAAA,CAE5C,KAAK,uBAAA,CACH,OAAO4b,CAAAA,CAAY5b,EAAa,MAAM,CAAA,CAAE,SAAW,KAAA,CAErD,KAAK,0BACH,IAAME,CAAAA,CAAQ0b,CAAAA,CAAW5b,CAAAA,CAAK,MAAM,CAAA,CACpC,OAAO,CAAC,KAAK,EAAE,QAAA,CAASE,CAAAA,CAAM,MAAM,CAAA,CAEtC,KAAK,8BAAA,CACL,KAAK,YAAA,CACL,KAAK,qBACL,KAAK,oBAAA,CACL,KAAK,sBAAA,CACL,KAAK,sCACL,KAAK,cAAA,CACL,KAAK,UAAA,CACH,OAAO,MAET,KAAK,qBAAA,CACH,OAAO,KAAA,CACT,QACE,OAAO,MACX,CACF,CAAC,CACH,CACF,CAAA,CACF,CAAC,CACH,CC7DO,SAAS41C,EAAAA,CACd/nC,CAAAA,CACA5S,CAAAA,CAAQ,EAAA,CACRw3B,CAAAA,CAA+B,EAAC,CAChC,CACA,GAAM,CAAE,SAAA,CAAA1R,CAAU,CAAA,CAAIk0B,EAAAA,CAA4BxiB,CAAO,CAAA,CAEnDojB,CAAAA,CAAyB,IAAI,IACjC,KAAA,CAAM,OAAA,CAAQpjB,CAAO,CAAA,CAAIA,CAAAA,CAAU,CAACA,CAAO,CAC7C,EACMqjB,CAAAA,CACJD,CAAAA,CAAuB,IAAI,EAAS,CAAA,EAAKA,EAAuB,IAAA,GAAS,CAAA,CAE3E,OAAOnvB,oBAAAA,CAAwC,CAC7C,GAAG6uB,EAAAA,CAAqC1nC,CAAAA,CAAU5S,CAAAA,CAAOw3B,CAAO,CAAA,CAChE,QAAA,CAAU,CACR,QAAA,CACA,YAAA,CACA,eACA5kB,CAAAA,CACA5S,CAAAA,CACA8lB,CACF,CAAA,CACA,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA00B,CAAAA,CAAO,WAAAC,CAAW,CAAA,IAAO,CAClC,UAAA,CAAAA,CAAAA,CACA,KAAA,CAAOD,CAAAA,CAAM,GAAA,CAAKl1B,CAAAA,EAChBA,EAAK,MAAA,CAAQzgB,CAAAA,EAAS,CACpB,OAAQA,CAAAA,CAAK,MACX,KAAK,gBACL,KAAK,2BAAA,CAIH,OAHsB4b,CAAAA,CACnB5b,CAAAA,CAAsB,cACzB,CAAA,CACqB,MAAA,CAAS,EAEhC,KAAK,sBAAA,CAIH,OAHoB4b,CAAAA,CACjB5b,CAAAA,CAA4B,YAC/B,EACmB,MAAA,CAAS,CAAA,CAE9B,KAAK,qBAAA,CACH,OAAO,MACT,KAAK,UAAA,CACL,KAAK,qBAAA,CACL,KAAK,oBAAA,CACH,OAAO,CAAC,OAAA,CAAS,IAAI,CAAA,CAAE,QAAA,CAAS4b,EAAW5b,CAAAA,CAAK,MAAM,CAAA,CAAE,MAAM,CAAA,CAEhE,KAAK,0BACH,IAAME,CAAAA,CAAQ0b,EAAW5b,CAAAA,CAAK,MAAM,EACpC,OAAO,CAAC,QAAS,IAAI,CAAA,CAAE,SAASE,CAAAA,CAAM,MAAM,EAE9C,KAAK,iBAAA,CACL,KAAK,kBAAA,CACL,KAAK,yBAAA,CACL,KAAK,uBAAA,CACL,KAAK,4BACL,KAAK,iBAAA,CACL,KAAK,4BAAA,CACH,OAAO,MACT,QACE,OAAO81C,GAAgBD,CAAAA,CAAuB,GAAA,CAAI/1C,EAAK,IAAI,CAC/D,CACF,CAAC,CACH,CACF,CAAA,CACF,CAAC,CACH,CC5EA,SAASi2C,GAAW1e,CAAAA,CAAoB,CACtC,IAAM2e,CAAAA,CAAOl6C,CAAAA,EAAcA,EAAE,QAAA,EAAS,CAAE,SAAS,CAAA,CAAG,GAAG,EACvD,OAAO,CAAA,EAAGu7B,EAAK,WAAA,EAAa,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,CAAAA,CAAK,QAAA,GAAa,CAAC,CAAC,IAAI2e,CAAAA,CAAI3e,CAAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,CAAAA,CAAK,QAAA,EAAU,CAAC,CAAA,CAAA,EAAI2e,EAAI3e,CAAAA,CAAK,UAAA,EAAY,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,CAAAA,CAAK,UAAA,EAAY,CAAC,CAAA,CAC7J,CAEA,SAAS4e,EAAAA,CAAgB5e,CAAAA,CAAYpW,EAAuB,CAC1D,OAAO,IAAI,IAAA,CAAKoW,CAAAA,CAAK,SAAQ,CAAIpW,CAAAA,CAAU,GAAI,CACjD,CAEO,SAASi1B,EAAAA,CAA+Bl1B,CAAAA,CAAgB,KAAA,CAAQ,CACrE,OAAO0F,oBAAAA,CAAqB,CAC1B,QAAA,CAAU,CAAC,SAAU,MAAA,CAAQ,SAAA,CAAW1F,CAAa,CAAA,CACrD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAW,CAACE,EAAWC,CAAO,CAAE,KACZ,MAAMrX,CAAAA,CAAQ,mCAAoC,CAACkX,CAAAA,CAAe+0B,EAAAA,CAAW70B,CAAS,CAAA,CAAG60B,EAAAA,CAAW50B,CAAO,CAAC,CAChJ,GAEe,GAAA,CAAI,CAAC,CAAE,IAAA,CAAAg1B,CAAAA,CAAM,SAAAC,CAAAA,CAAU,IAAA,CAAAC,CAAK,CAAA,IAAO,CAChD,MAAOD,CAAAA,CAAS,KAAA,CAAQD,EAAK,KAAA,CAC7B,IAAA,CAAMC,CAAAA,CAAS,IAAA,CAAOD,CAAAA,CAAK,IAAA,CAC3B,IAAKC,CAAAA,CAAS,GAAA,CAAMD,EAAK,GAAA,CACzB,IAAA,CAAMC,EAAS,IAAA,CAAOD,CAAAA,CAAK,IAAA,CAC3B,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,KAAM,IAAI,IAAA,CAAKE,CAAI,CACrB,CAAA,CAAE,EAEJ,gBAAA,CAAkB,CAChBJ,EAAAA,CAAgB,IAAI,IAAA,CAAQ,IAAA,CAAK,IAAI,GAAA,CAAMj1B,CAAAA,CAAe,KAAM,CAAC,CAAA,CACjE,IAAI,IACN,CAAA,CACA,iBAAkB,CAACs1B,CAAAA,CAAGd,EAAI,CAACe,CAAa,IAAM,CAC5CN,EAAAA,CAAgBM,EAAe,IAAA,CAAK,GAAA,CAAI,GAAA,CAAMv1B,CAAAA,CAAe,KAAM,CAAC,EACpEi1B,EAAAA,CAAgBM,CAAAA,CAAev1B,CAAa,CAC9C,CACF,CAAC,CACH,CClCO,SAASw1B,EAAAA,CACd3oC,CAAAA,CACA,CACA,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQ,mBAAA,CAAqB1O,CAAQ,EAC1D,OAAA,CAAS,IACP/D,EAAQ,mCAAA,CAAqC,CAC3C+D,EACA,UACF,CAAC,EACH,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CCZO,SAAS4oC,EAAAA,CACd5oC,CAAAA,CACA5S,CAAAA,CAAQ,GACR,CACA,OAAOshB,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,YAAA,CAAc,WAAA,CAAa1O,CAAQ,CAAA,CACxD,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,QAAS,IACP/D,CAAAA,CAAQ,wCAAyC,CAC/C+D,CAAAA,CACA,EAAA,CACA5S,CACF,CAAC,CACL,CAAC,CACH,CCbO,SAASy7C,EAAAA,CAAoC7oC,EAAkB,CACpE,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,YAAA,CAAc,cAAe1O,CAAQ,CAAA,CAC1D,OAAA,CAAS,SAAA,CASC,KAAA,CARS,MAAM,MACrBwK,CAAAA,CAAO,cAAA,CAAiB,iCAAiCxK,CAAQ,CAAA,CAAA,CACjE,CACE,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,GACuB,IAAA,EAAK,EAAG,KAEjC,MAAA,CAAS5Q,CAAAA,EACPA,EAAK,IAAA,CACH,CAACuB,CAAAA,CAAGtF,CAAAA,GACFwiB,CAAAA,CAAWxiB,CAAAA,CAAE,cAAc,CAAA,CAAE,MAAA,CAC7BwiB,EAAWld,CAAAA,CAAE,cAAc,EAAE,MACjC,CACJ,CAAC,CACH,CCjBO,SAASm4C,EAAAA,CAAyB17C,EAAQ,GAAA,CAAK,CACpD,OAAOshB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,YAAA,CAActhB,CAAK,CAAA,CACxC,OAAA,CAAS,IACP6O,CAAAA,CAAQ,8BAAA,CAAgC,CACtC7O,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAAS27C,EAAAA,EAAkC,CAChD,OAAOr6B,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,YAAY,CAAA,CACjC,OAAA,CAAS,IACPzS,CAAAA,CAAQ,0BAAA,CAA4B,EAAE,CAC1C,CAAC,CACH,CCFO,SAAS+sC,EAAAA,CACd51B,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,CACA,IAAM40B,CAAAA,CAAc1e,CAAAA,EACXA,EAAK,WAAA,EAAY,CAAE,QAAQ,WAAA,CAAa,EAAE,CAAA,CAGnD,OAAO9a,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,UAAW0E,CAAAA,CAASC,CAAAA,CAAU,SAAQ,CAAGC,CAAAA,CAAQ,OAAA,EAAS,CAAA,CAC/E,OAAA,CAAS,IACPrX,CAAAA,CAAQ,kCAAA,CAAoC,CAC1CmX,CAAAA,CACA80B,CAAAA,CAAW70B,CAAS,CAAA,CACpB60B,CAAAA,CAAW50B,CAAO,CACpB,CAAC,CACL,CAAC,CACH,CCtBO,SAAS21B,EAAAA,EAA8B,CAC5C,OAAOv6B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,gBAAgB,CAAA,CACrC,QAAS,SAAY,CAEnB,IAAMuG,CAAAA,CAAS,MAAMhZ,CAAAA,CAAQ,2BAA4B,EAAE,EAGrDjF,CAAAA,CAAM,IAAI,KACVkyC,CAAAA,CAAY,IAAI,IAAA,CAAKlyC,CAAAA,CAAI,OAAA,EAAQ,CAAI,KAAQ,CAAA,CAE7CkxC,CAAAA,CAAc1e,GACXA,CAAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,WAAA,CAAa,EAAE,CAAA,CAG7C2f,CAAAA,CAAa,MAAMltC,CAAAA,CAAQ,kCAAA,CAAoC,CAAC,KAAA,CAAOisC,CAAAA,CAAWgB,CAAS,CAAA,CAAGhB,CAAAA,CAAWlxC,CAAG,CAAC,CACnH,CAAA,CAeA,OAZ6B,CAC3B,KAAA,CAAO,CAACie,CAAAA,CAAM,MAAA,CACd,MAAOk0B,CAAAA,CAAU,CAAC,CAAA,CAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,SAAS,IAAA,CAAOA,CAAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,KAAO,CAAA,CAC5E,IAAA,CAAMA,CAAAA,CAAU,CAAC,CAAA,CAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,QAAA,CAAS,KAAOA,CAAAA,CAAU,CAAC,EAAE,IAAA,CAAK,IAAA,CAAO,EAC3E,GAAA,CAAKA,CAAAA,CAAU,CAAC,CAAA,CAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,QAAA,CAAS,IAAMA,CAAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,GAAA,CAAM,CAAA,CACxE,QAASA,CAAAA,CAAU,CAAC,EAChB,GAAA,CAAQA,CAAAA,CAAU,CAAC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAOA,CAAAA,CAAU,CAAC,CAAA,CAAE,KAAK,IAAA,CAAQ,GAAA,CAAO,CAACl0B,CAAAA,CAAM,MAAA,CAC7E,EACJ,cAAA,CAAgBA,CAAAA,CAAM,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAC9C,YAAA,CAAcA,EAAM,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAC7C,CAGF,CACF,CAAC,CACH,CC7BO,SAASm0B,EAAAA,CACd71B,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA,CACA,OAAOhF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,MAAA,CAAQ6E,CAAAA,CAAMC,CAAAA,CAAYC,CAAAA,CAAQC,CAAI,CAAA,CAC3D,QAAS,MAAO,CAAE,OAAArZ,CAAO,CAAA,GAAM,CAC7B,IAAM88B,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBpU,CAAAA,CAAM,CAAA,uCAAA,EAA0C0Z,CAAI,CAAA,gCAAA,EAAmCC,CAAU,SAASC,CAAM,CAAA,IAAA,EAAOC,CAAI,CAAA,CAAA,CAE3HlW,CAAAA,CAAW,MAAM25B,CAAAA,CAASt9B,CAAAA,CAAK,CAAE,MAAA,CAAAQ,CAAO,CAAC,CAAA,CAE/C,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,EAAS,MAAM,CAAA,CAAE,EAGnE,OAAOA,CAAAA,CAAS,MAClB,CACF,CAAC,CACH,CC7BA,SAAS0qC,EAAAA,CAAW1e,CAAAA,CAAY,CAC9B,OAAOA,CAAAA,CAAK,WAAA,EAAY,CAAE,OAAA,CAAQ,WAAA,CAAa,EAAE,CACnD,CAEO,SAAS6f,EAAAA,CACdj8C,CAAAA,CAAQ,IACRimB,CAAAA,CACAC,CAAAA,CACA,CACA,IAAM5mB,CAAAA,CAAM4mB,GAAW,IAAI,IAAA,CACrB5lB,EACJ2lB,CAAAA,EAAa,IAAI,KAAK3mB,CAAAA,CAAI,OAAA,EAAQ,CAAI,GAAA,CAAU,EAAA,CAAK,GAAI,EAE3D,OAAOgiB,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,eAAA,CAAiBthB,CAAAA,CAAOM,CAAAA,CAAM,OAAA,EAAQ,CAAGhB,CAAAA,CAAI,SAAS,CAAA,CAC3E,QAAS,IACPuP,CAAAA,CAAQ,kCAAmC,CACzCisC,EAAAA,CAAWx6C,CAAK,CAAA,CAChBw6C,EAAAA,CAAWx7C,CAAG,EACdU,CACF,CAAC,CACL,CAAC,CACH,CCKO,SAASk8C,IAA6B,CAC3C,OAAO56B,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,cAAc,CAAA,CACnC,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,OADoB,MAAMzS,CAAAA,CAAQ,gCAAA,CAAkC,EAAE,CAExE,CAAA,MAAShJ,CAAAA,CAAO,CACd,MAAMA,CACR,CACF,CACF,CAAC,CACH,CC/BO,SAASs2C,EAAAA,EAA2C,CACzD,OAAO76B,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,8BAA8B,CAAA,CACnD,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,OADc,MAAMzS,EAAQ,gDAAA,CAAkD,EAAE,CAElF,CAAA,MAAShJ,CAAAA,CAAO,CACd,MAAMA,CACR,CACF,CACF,CAAC,CACH,CCXO,SAASu2C,GACdxpC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,oBAAoB,CAAA,CAC/B/I,CAAAA,CACCmJ,GAAY,CACXmiB,EAAAA,CACEtrB,CAAAA,CACAmJ,CAAAA,CAAQ,YAAA,CACRA,CAAAA,CAAQ,aACRA,CAAAA,CAAQ,UAAA,CACRA,EAAQ,UAAA,CACRA,CAAAA,CAAQ,OACV,CACF,CAAA,CACA,SAAY,CACN1B,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,OAAO,UAAA,CAAW3O,CAAS,EACrC,CAAC,gBAAA,CAAkB,aAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EAEL,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCpCO,SAAS4hC,EAAAA,CACdzpC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,oBAAoB,CAAA,CAC/B/I,EACA,CAAC,CAAE,QAAA0rB,CAAQ,CAAA,GAAM,CACfS,EAAAA,CAAwBnsB,CAAAA,CAAW0rB,CAAO,CAC5C,CAAA,CACA,SAAY,CACNjkB,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,MAAA,CAAO,WAAW3O,CAAS,CAAA,CACrC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EAEL,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC5BA,eAAekuB,EAAAA,CAAqBv4B,CAAAA,CAAgC,CAClE,IAAMpO,CAAAA,CAAQ,MAAMoO,CAAAA,CAAS,IAAA,EAAK,CAClC,GAAI,CAACA,CAAAA,CAAS,GAAI,CAChB,IAAMvK,EAAQ,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BuK,CAAAA,CAAS,MAAM,CAAA,CAAE,EACvE,MAAAvK,CAAAA,CAAM,OAASuK,CAAAA,CAAS,MAAA,CACxBvK,EAAM,IAAA,CAAO7D,CAAAA,CACP6D,CACR,CAEA,OAAO7D,CACT,CAEA,eAAsBs6C,EAAAA,CACpBn2B,EACAC,CAAAA,CACAC,CAAAA,CACAC,EACqB,CACrB,IAAMyjB,EAAWlpB,CAAAA,EAAc,CACzBpU,EAAM,CAAA,uCAAA,EAA0C0Z,CAAI,mCAAmCC,CAAU,CAAA,MAAA,EAASC,CAAM,CAAA,IAAA,EAAOC,CAAI,CAAA,CAAA,CAC3HlW,CAAAA,CAAW,MAAM25B,CAAAA,CAASt9B,CAAG,CAAA,CACnC,OAAOk8B,GAA8Bv4B,CAAQ,CAC/C,CAEA,eAAsBmsC,EAAAA,CAAgBC,CAAAA,CAA8B,CAClE,GAAIA,CAAAA,GAAQ,MACV,OAAO,CAAA,CAGT,IAAMzS,CAAAA,CAAWlpB,CAAAA,GACXpU,CAAAA,CAAM,CAAA,4EAAA,EAA+E+vC,CAAG,CAAA,CAAA,CACxFpsC,CAAAA,CAAW,MAAM25B,EAASt9B,CAAG,CAAA,CAEnC,QADa,MAAMk8B,EAAAA,CAA2Dv4B,CAAQ,CAAA,EAC1E,WAAA,CAAYosC,CAAG,CAC7B,CAEA,eAAsBC,EAAAA,CAAqB52B,CAAAA,CAAkBlL,EAAgC,CAE3F,IAAMvK,EAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CACL,CAAA,yBAAA,EAA4ByI,IAAa,KAAA,CAAQ,KAAA,CAAQA,CAAQ,CAAA,CAAA,EAAIlL,CAAK,EAC9E,CAAA,CAEA,OAAOguB,EAAAA,CAA0Bv4B,CAAQ,CAC3C,CAEA,eAAsBssC,EAAAA,EAA2C,CAE/D,IAAMtsC,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,iCAAiC,CAAA,CACzF,OAAOurB,GAAiCv4B,CAAQ,CAClD,CAEA,eAAsBusC,EAAAA,EAAmD,CAEvE,IAAMvsC,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7B,0EACF,CAAA,CACA,OAAO8nB,GAA6Cv4B,CAAQ,CAC9D,CCnDA,IAAMwsC,EAAAA,CAAqB,CAAE,cAAA,CAAgB,kBAAmB,EAEhE,eAAeC,EAAAA,CAAa9gC,EAA8C,CACxE,IAAMguB,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBhR,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5ClN,EAAW,MAAM25B,CAAAA,CAAS,GAAGl6B,CAAO,CAAA,uBAAA,CAAA,CAA2B,CACnE,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAUkM,CAAO,EAC5B,OAAA,CAAS6gC,EACX,CAAC,CAAA,CAED,GAAI,CAACxsC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,gDAA2CA,CAAAA,CAAS,MAAM,EAC5D,CAAA,CAIF,OAAA,CADc,MAAMA,CAAAA,CAAS,IAAA,EAAK,EACtB,MACd,CAEA,eAAe0sC,GACb/gC,CAAAA,CACA+M,CAAAA,CACY,CACZ,GAAI,CACF,OAAO,MAAM+zB,EAAAA,CAAa9gC,CAAO,CACnC,CAAA,KAAY,CACV,OAAO+M,CACT,CACF,CAEA,eAAsBi0B,EAAAA,CACpBp5C,CAAAA,CACA3D,CAAAA,CAAgB,EAAA,CACkB,CAClC,IAAMg9C,CAAAA,CAAa,CACjB,QAAS,KAAA,CACT,MAAA,CAAQ,OACR,MAAA,CAAQ,CACN,SAAU,QAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAAr5C,CAAO,EAChB,KAAA,CAAA3D,CAAAA,CACA,OAAQ,CACV,CAAA,CACA,EAAA,CAAI,CACN,CAAA,CAEM,CAACi9C,EAAKC,CAAI,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CACpCJ,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,MAAO,SAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,OAAA,CAAS,UAAA,CAAY,IAAK,CAAC,CAChD,CACF,CAAA,CACA,EACF,CAAA,CACAF,GACE,CACE,GAAGE,EACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,MAAO,UAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,OAAA,CAAS,UAAA,CAAY,KAAM,CAAC,CACjD,CACF,CAAA,CACA,EACF,CACF,CAAC,CAAA,CAEKG,CAAAA,CAAmB/nB,CAAAA,EACvBA,CAAAA,CAAM,IAAA,CAAK,CAAC7xB,EAAGtF,CAAAA,GAAM,CACnB,IAAMm/C,CAAAA,CAAO,MAAA,CAAQ75C,EAA2B,KAAA,EAAS,CAAC,CAAA,CAE1D,OADc,MAAA,CAAQtF,CAAAA,CAA2B,OAAS,CAAC,CAAA,CAC5Cm/C,CACjB,CAAC,CAAA,CACGC,EAAkBjoB,CAAAA,EACtBA,CAAAA,CAAM,KAAK,CAAC7xB,CAAAA,CAAGtF,IAAM,CACnB,IAAMm/C,EAAO,MAAA,CAAQ75C,CAAAA,CAA2B,OAAS,CAAC,CAAA,CACpD+5C,CAAAA,CAAQ,MAAA,CAAQr/C,CAAAA,CAA2B,KAAA,EAAS,CAAC,CAAA,CAC3D,OAAOm/C,EAAOE,CAChB,CAAC,EAEH,OAAO,CACL,GAAA,CAAKH,CAAAA,CAAgBF,CAAG,CAAA,CACxB,KAAMI,CAAAA,CAAeH,CAAI,CAC3B,CACF,CAEA,eAAsBK,EAAAA,CACpB55C,CAAAA,CACA3D,CAAAA,CAAgB,EAAA,CACF,CACd,OAAO88C,GACL,CACE,OAAA,CAAS,MACT,MAAA,CAAQ,MAAA,CACR,OAAQ,CACN,QAAA,CAAU,SACV,KAAA,CAAO,eAAA,CACP,MAAO,CAAE,MAAA,CAAAn5C,CAAO,CAAA,CAChB,KAAA,CAAA3D,EACA,MAAA,CAAQ,CAAA,CACR,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,YAAa,UAAA,CAAY,IAAK,CAAC,CACpD,CAAA,CACA,GAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBw9C,EAAAA,CACpB5kC,CAAAA,CACAjV,EACA3D,CAAAA,CAAgB,GAAA,CACF,CACd,IAAMg9C,CAAAA,CAAa,CACjB,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,OACR,MAAA,CAAQ,CACN,SAAU,QAAA,CACV,KAAA,CAAO,CAAE,MAAA,CAAAr5C,CAAAA,CAAQ,QAAAiV,CAAQ,CAAA,CACzB,MAAA5Y,CAAAA,CACA,MAAA,CAAQ,CACV,CAAA,CACA,EAAA,CAAI,CACN,CAAA,CAEM,CAACy9C,CAAAA,CAAQC,CAAO,CAAA,CAAI,MAAM,QAAQ,GAAA,CAAI,CAC1CZ,GACE,CACE,GAAGE,EACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,KAAA,CAAO,UACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,WAAA,CAAa,WAAY,IAAK,CAAC,CACpD,CACF,CAAA,CACA,EACF,CAAA,CACAF,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,OAAQ,CACN,GAAGA,EAAW,MAAA,CACd,KAAA,CAAO,WACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,WAAA,CAAa,WAAY,IAAK,CAAC,CACpD,CACF,CAAA,CACA,EACF,CACF,CAAC,EAEKW,CAAAA,CAAc,CAACC,EAAkBnF,CAAAA,GAAAA,CACpC,MAAA,CAAOmF,CAAAA,EAAY,CAAC,CAAA,CAAI,MAAA,CAAOnF,GAAS,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA,CAElDwE,EAA6BQ,CAAAA,CAAO,GAAA,CAAK/5B,CAAAA,GAAW,CACxD,EAAA,CAAIA,CAAAA,CAAM,KACV,IAAA,CAAM,KAAA,CACN,QAASA,CAAAA,CAAM,OAAA,CACf,OAAQA,CAAAA,CAAM,MAAA,CACd,SAAUA,CAAAA,CAAM,QAAA,CAChB,MAAOA,CAAAA,CAAM,KAAA,CACb,MAAOA,CAAAA,CAAM,YAAA,EAAgBi6B,EAAYj6B,CAAAA,CAAM,QAAA,CAAUA,CAAAA,CAAM,KAAK,CAAA,CACpE,SAAA,CAAW,OAAOA,CAAAA,CAAM,SAAA,EAAa,CAAC,CACxC,CAAA,CAAE,EAEIw5B,CAAAA,CAA8BQ,CAAAA,CAAQ,GAAA,CAAKh6B,CAAAA,GAAW,CAC1D,EAAA,CAAIA,EAAM,IAAA,CACV,IAAA,CAAM,OACN,OAAA,CAASA,CAAAA,CAAM,QACf,MAAA,CAAQA,CAAAA,CAAM,MAAA,CACd,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAChB,MAAOA,CAAAA,CAAM,KAAA,CACb,MAAOi6B,CAAAA,CAAYj6B,CAAAA,CAAM,SAAUA,CAAAA,CAAM,KAAK,EAC9C,SAAA,CAAW,MAAA,CAAOA,EAAM,SAAA,EAAa,CAAC,CACxC,CAAA,CAAE,CAAA,CAEF,OAAO,CAAC,GAAGu5B,CAAAA,CAAK,GAAGC,CAAI,CAAA,CAAE,KAAK,CAAC35C,CAAAA,CAAGtF,IAAMA,CAAAA,CAAE,SAAA,CAAYsF,EAAE,SAAS,CACnE,CAUA,eAAsBs6C,EAAAA,CACpBl6C,CAAAA,CACAiV,EACc,CACd,GAAI,MAAM,OAAA,CAAQjV,CAAM,GAAKA,CAAAA,CAAO,MAAA,GAAW,CAAA,CAC7C,OAAO,EAAC,CAGV,IAAMm6C,CAAAA,CAAc,KAAA,CAAM,QAAQn6C,CAAM,CAAA,CACpC,CAAE,MAAA,CAAQ,CAAE,IAAKA,CAAO,CAAE,EAC1BA,CAAAA,CACE,CAAE,OAAAA,CAAO,CAAA,CACT,EAAC,CAEP,OAAOm5C,EAAAA,CACL,CACE,OAAA,CAAS,KAAA,CACT,OAAQ,MAAA,CACR,MAAA,CAAQ,CACN,QAAA,CAAU,QAAA,CACV,MAAO,SAAA,CACP,KAAA,CAAO,CACL,GAAGgB,CAAAA,CACH,GAAIllC,EAAU,CAAE,OAAA,CAAAA,CAAQ,CAAA,CAAI,EAC9B,CACF,CAAA,CACA,EAAA,CAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBmlC,EAAAA,CACpBnlC,CAAAA,CACAjV,EACc,CACd,OAAOk6C,GAAwBl6C,CAAAA,CAAQiV,CAAO,CAChD,CAEA,eAAsBolC,GACpBprC,CAAAA,CACc,CACd,OAAOkqC,EAAAA,CACL,CACE,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,MAAA,CACR,OAAQ,CACN,QAAA,CAAU,SACV,KAAA,CAAO,UAAA,CACP,MAAO,CACL,OAAA,CAASlqC,CACX,CACF,CAAA,CACA,EAAA,CAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBqrC,EAAAA,CACpB/yC,CAAAA,CACc,CACd,OAAO4xC,EAAAA,CACL,CACE,QAAS,KAAA,CACT,MAAA,CAAQ,OACR,MAAA,CAAQ,CACN,SAAU,QAAA,CACV,KAAA,CAAO,SACP,KAAA,CAAO,CACL,OAAQ,CAAE,GAAA,CAAK5xC,CAAO,CACxB,CACF,EACA,EAAA,CAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBgzC,EAAAA,CACpBtrC,EACAjP,CAAAA,CACA3D,CAAAA,CACAlB,EACc,CACd,IAAMirC,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBhR,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5C7Q,EAAM,IAAI,GAAA,CAAI,sCAAuCoD,CAAO,CAAA,CAClEpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,CAAWmG,CAAQ,CAAA,CACxCnG,CAAAA,CAAI,aAAa,GAAA,CAAI,QAAA,CAAU9I,CAAM,CAAA,CACrC8I,CAAAA,CAAI,aAAa,GAAA,CAAI,OAAA,CAASzM,EAAM,QAAA,EAAU,EAC9CyM,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAU3N,CAAAA,CAAO,QAAA,EAAU,CAAA,CAEhD,IAAMsR,EAAW,MAAM25B,CAAAA,CAASt9B,EAAI,QAAA,EAAS,CAAG,CAC9C,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAChD,CAAC,CAAA,CAED,GAAI,CAAC2D,CAAAA,CAAS,GACZ,MAAM,IAAI,KAAA,CACR,CAAA,qDAAA,EAAmDA,CAAAA,CAAS,MAAM,EACpE,CAAA,CAGF,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAEA,eAAsB+tC,GACpBx6C,CAAAA,CACAy6C,CAAAA,CAAW,QACG,CACd,IAAMrU,EAAWlpB,CAAAA,EAAc,CACzBhR,EAAUyN,CAAAA,CAAc,mBAAA,EAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,gCAAiCoD,CAAO,CAAA,CAC5DpD,EAAI,YAAA,CAAa,GAAA,CAAI,SAAU9I,CAAM,CAAA,CACrC8I,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,CAAY2xC,CAAQ,CAAA,CAEzC,IAAMhuC,EAAW,MAAM25B,CAAAA,CAASt9B,EAAI,QAAA,EAAS,CAAG,CAC9C,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAChD,CAAC,EAED,GAAI,CAAC2D,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,2CAAA,EAAyCA,EAAS,MAAM,CAAA,CAC1D,EAGF,OAAQ,MAAMA,EAAS,IAAA,EACzB,CAEA,eAAsBiuC,EAAAA,CACpBzrC,CAAAA,CAC4B,CAC5B,IAAMm3B,CAAAA,CAAWlpB,GAAc,CACzBhR,CAAAA,CAAUyN,EAAc,mBAAA,EAAoB,CAC5ClN,CAAAA,CAAW,MAAM25B,CAAAA,CACrB,CAAA,EAAGl6B,CAAO,CAAA,+BAAA,EAAkC+C,CAAQ,SACtD,CAAA,CAEA,GAAI,CAACxC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,6CAAA,EAA2CA,EAAS,MAAM,CAAA,CAC5D,EAGF,OAAQ,MAAMA,EAAS,IAAA,EACzB,CC3VO,SAASkuC,GAAwC1rC,CAAAA,CAAkB,CACxE,OAAO0O,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,WAAY1O,CAAQ,CAAA,CACxD,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SACAorC,EAAAA,CAAoDprC,CAAQ,CAEvE,CAAC,CACH,CCTO,SAAS2rC,EAAAA,EAAwC,CACtD,OAAOj9B,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,SAAS,CAAA,CAC7C,SAAA,CAAW,IACX,eAAA,CAAiB,GAAA,CACjB,QAAS,SACAy8B,EAAAA,EAEX,CAAC,CACH,CCTO,SAASS,EAAAA,CAAwCtzC,CAAAA,CAAkB,CACxE,OAAOoW,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,gBAAiBpW,CAAM,CAAA,CAC3D,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,QAAS,SACA+yC,EAAAA,CAA6D/yC,CAAM,CAE9E,CAAC,CACH,CCTO,SAASuzC,GACd7rC,CAAAA,CACAjP,CAAAA,CACA3D,EAAQ,EAAA,CACR,CACA,OAAOyrB,oBAAAA,CAA8C,CACnD,SAAU,CAAC,QAAA,CAAU,cAAe9nB,CAAAA,CAAQ,cAAA,CAAgBiP,CAAQ,CAAA,CACpE,OAAA,CAAS,CAAC,CAACjP,CAAAA,EAAU,CAAC,CAACiP,CAAAA,CACvB,gBAAA,CAAkB,EAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA8Y,CAAU,IAAM,CAChC,GAAI,CAAC/nB,CAAAA,EAAU,CAACiP,CAAAA,CACd,MAAM,IAAI,KAAA,CACR,mDACF,CAAA,CAEF,OAAOsrC,GACLtrC,CAAAA,CACAjP,CAAAA,CACA3D,CAAAA,CACA0rB,CACF,CACF,CAAA,CACA,iBAAkB,CAACE,CAAAA,CAAU8yB,EAAWC,CAAAA,GAAAA,CACrC/yB,CAAAA,EAAU,QAAU,CAAA,IAAO5rB,CAAAA,CAAS2+C,EAA2B3+C,CAAAA,CAAQ,MAAA,CAC1E,qBAAsB,CAAC4+C,CAAAA,CAAYF,EAAWG,CAAAA,GAC3CA,CAAAA,CAA4B,EAAKA,CAAAA,CAA4B7+C,CAAAA,CAAQ,MAC1E,CAAC,CACH,CC3BO,SAAS8+C,EAAAA,CACdn7C,EACAy6C,CAAAA,CAAW,OAAA,CACX,CACA,OAAO98B,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,cAAe3d,CAAM,CAAA,CAC1C,UAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,OAAA,CAAS,SACAw6C,EAAAA,CAA4Cx6C,EAAQy6C,CAAQ,CAEvE,CAAC,CACH,CCZO,SAASW,EAAAA,CACdnsC,EACA,CACA,OAAO0O,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,WAAA,CAAa1O,CAAQ,CAAA,CACzD,SAAA,CAAW,IACX,eAAA,CAAiB,GAAA,CACjB,QAAS,CAAC,CAACA,EACX,OAAA,CAAS,SAAY,CACnB,GAAI,CACF,IAAM5Q,EAAO,MAAMq8C,EAAAA,CACjBzrC,CACF,CAAA,CACA,OAAO,OAAO,MAAA,CAAO5Q,CAAI,CAAA,CAAE,MAAA,CACzB,CAAC,CAAE,cAAAg9C,CAAc,CAAA,GAAMA,EAAgB,CACzC,CACF,MAAY,CACV,OAAO,EACT,CACF,CACF,CAAC,CACH,CCrBO,SAASC,EAAAA,CACdrmC,CAAAA,CACAjV,CAAAA,CACA,CACA,OAAO2d,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,cAAe,YAAA,CAAc1I,CAAAA,CAASjV,CAAM,CAAA,CACjE,OAAA,CAAS,SACAo6C,GAA+CnlC,CAAAA,CAASjV,CAAM,CAEzE,CAAC,CACH,CCRO,SAASu7C,EAAAA,CACdjgD,EACAuS,CAAAA,CAA+B,MAAA,CAC/B,CACA,IAAI/P,CAAAA,CAAgB,CAClB,cAAA,CAAgB,CAAA,CAChB,OAAQ,EAAA,CACR,MAAA,CAAQ,EACV,CAAA,CAEI+P,CAAAA,GACF/P,EAAO,CAAE,GAAGA,EAAM,GAAG+P,CAAQ,CAAA,CAAA,CAG/B,GAAM,CAAE,cAAA,CAAA2tC,EAAgB,MAAA,CAAAt8C,CAAAA,CAAQ,OAAAsU,CAAO,CAAA,CAAI1V,EAEvC29C,CAAAA,CAAM,EAAA,CAENv8C,CAAAA,GAAQu8C,CAAAA,EAAOv8C,CAAAA,CAAS,GAAA,CAAA,CAE5B,IAAMw8C,CAAAA,CAAK,IAAA,CAAK,IAAI,UAAA,CAAWpgD,CAAAA,CAAM,UAAU,CAAC,CAAA,CAAI,IAAA,CAAS,CAAA,CAAIA,CAAAA,CAC3D4vB,EAAM,OAAOwwB,CAAAA,EAAO,SAAW,UAAA,CAAWA,CAAE,EAAIA,CAAAA,CACtD,OAAAD,GAAOvwB,CAAAA,CAAI,cAAA,CAAe,QAAS,CACjC,qBAAA,CAAuBswB,EACvB,qBAAA,CAAuBA,CAAAA,CACvB,YAAa,IACf,CAAC,CAAA,CACGhoC,CAAAA,GAAQioC,CAAAA,EAAO,GAAA,CAAMjoC,GAElBioC,CACT,KCpBaE,EAAAA,CAAN,KAAsB,CAC3B,MAAA,CACA,IAAA,CACA,IAAA,CAEA,SAAA,CACA,cAAA,CACA,iBAAA,CACA,QACA,KAAA,CACA,aAAA,CACA,cACA,cAAA,CACA,QAAA,CAEA,YAAYltC,CAAAA,CAA6B,CACvC,IAAA,CAAK,MAAA,CAASA,CAAAA,CAAM,MAAA,CACpB,KAAK,IAAA,CAAOA,CAAAA,CAAM,MAAQ,EAAA,CAC1B,IAAA,CAAK,KAAOA,CAAAA,CAAM,IAAA,EAAQ,GAE1B,IAAA,CAAK,SAAA,CAAYA,EAAM,SAAA,EAAa,CAAA,CACpC,KAAK,cAAA,CAAiBA,CAAAA,CAAM,gBAAkB,KAAA,CAC9C,IAAA,CAAK,iBAAA,CAAoBA,CAAAA,CAAM,iBAAA,EAAqB,KAAA,CACpD,KAAK,OAAA,CAAU,UAAA,CAAWA,EAAM,OAAO,CAAA,EAAK,EAC5C,IAAA,CAAK,KAAA,CAAQ,UAAA,CAAWA,CAAAA,CAAM,KAAK,CAAA,EAAK,EACxC,IAAA,CAAK,aAAA,CAAgB,WAAWA,CAAAA,CAAM,aAAa,GAAK,CAAA,CACxD,IAAA,CAAK,cAAA,CAAiB,UAAA,CAAWA,CAAAA,CAAM,cAAc,GAAK,CAAA,CAC1D,IAAA,CAAK,cACH,IAAA,CAAK,KAAA,CAAQ,KAAK,aAAA,CAAgB,IAAA,CAAK,eACzC,IAAA,CAAK,QAAA,CAAWA,EAAM,SACxB,CAEA,eAAiB,IACV,IAAA,CAAK,kBAIH,IAAA,CAAK,aAAA,CAAgB,CAAA,EAAK,IAAA,CAAK,cAAA,CAAiB,CAAA,CAH9C,MAMX,WAAA,CAAc,IACP,KAAK,cAAA,EAAe,CAIlB,IAAI8sC,EAAAA,CAAgB,IAAA,CAAK,KAAA,CAAO,CACrC,cAAA,CAAgB,IAAA,CAAK,SACvB,CAAC,CAAC,MAAMA,EAAAA,CAAgB,IAAA,CAAK,cAAe,CAC1C,cAAA,CAAgB,IAAA,CAAK,SACvB,CAAC,CAAC,MAAMA,EAAAA,CAAgB,IAAA,CAAK,eAAgB,CAC3C,cAAA,CAAgB,KAAK,SACvB,CAAC,CAAC,CAAA,CAAA,CAAA,CATO,EAAA,CAYX,OAAS,IACF,IAAA,CAAK,eAIN,IAAA,CAAK,aAAA,CAAgB,KAChB,IAAA,CAAK,aAAA,CAAc,QAAA,EAAS,CAG9BA,EAAAA,CAAgB,IAAA,CAAK,cAAe,CACzC,cAAA,CAAgB,KAAK,SACvB,CAAC,EATQ,GAAA,CAYX,QAAA,CAAW,IACL,IAAA,CAAK,OAAA,CAAU,KACV,IAAA,CAAK,OAAA,CAAQ,UAAS,CAGxBA,EAAAA,CAAgB,KAAK,OAAA,CAAS,CAAE,cAAA,CAAgB,IAAA,CAAK,SAAU,CAAC,CAE3E,ECxEO,SAASK,GACd3mC,CAAAA,CACA+sB,CAAAA,CACA6Z,EACA,CACA,OAAOl+B,aAAa,CAClB,QAAA,CAAU,CACR,QAAA,CACA,aAAA,CACA,oBACA1I,CAAAA,CACA+sB,CAAAA,CACA6Z,CACF,CAAA,CACA,OAAA,CAAS,SAAY,CACnB,GAAI,CAAC5mC,EACH,MAAM,IAAI,MAAM,6CAA6C,CAAA,CAG/D,IAAM6mC,CAAAA,CAAW,MAAMzB,EAAAA,CAAoDplC,CAAO,CAAA,CAE5E1N,CAAAA,CAAS,MAAM+yC,EAAAA,CACnBwB,CAAAA,CAAS,IAAKC,CAAAA,EAAMA,CAAAA,CAAE,MAAM,CAC9B,CAAA,CAEMC,CAAAA,CAAeha,CAAAA,CACjBA,CAAAA,CAAa,IAAA,CAAOA,EAAa,KAAA,CACjC,CAAA,CACEia,EAAsD,KAAA,CAAM,OAAA,CAChEJ,CACF,CAAA,CACIA,CAAAA,CACA,EAAC,CAKCK,CAAAA,CAAkBJ,EACrB,GAAA,CAAKK,CAAAA,EAAYA,EAAQ,MAAM,CAAA,CAC/B,OACEn8C,CAAAA,EACCA,CAAAA,GAAW,WAAA,EACX,CAACi8C,CAAAA,CAAgB,IAAA,CAAMG,GAAWA,CAAAA,CAAO,MAAA,GAAWp8C,CAAM,CAC9D,CAAA,CAEI6iB,EAA8C,CAClD,GAAGo5B,CAAAA,CACH,GAAIC,CAAAA,CAAgB,MAAA,CAChB,MAAM9B,EAAAA,CACJ,MAAA,CACA8B,CACF,CAAA,CACA,EACN,CAAA,CAEA,OAAOJ,CAAAA,CAAS,GAAA,CAAKK,CAAAA,EAAY,CAC/B,IAAMnlC,CAAAA,CAAQzP,CAAAA,CAAO,KAAMw0C,CAAAA,EAAMA,CAAAA,CAAE,SAAWI,CAAAA,CAAQ,MAAM,EACxDE,CAAAA,CAEJ,GAAIrlC,GAAO,QAAA,CACT,GAAI,CACFqlC,CAAAA,CAAgB,IAAA,CAAK,MAAMrlC,CAAAA,CAAM,QAAQ,EAC3C,CAAA,KAAQ,CACNqlC,CAAAA,CAAgB,OAClB,CAGF,IAAMD,EAASv5B,CAAAA,CAAQ,IAAA,CAAM4R,GAAMA,CAAAA,CAAE,MAAA,GAAW0nB,CAAAA,CAAQ,MAAM,CAAA,CACxDG,CAAAA,CAAY,OAAOF,CAAAA,EAAQ,SAAA,EAAa,GAAG,CAAA,CAC3CG,CAAAA,CAAgB,OAAOJ,CAAAA,CAAQ,OAAO,CAAA,CAEtCK,CAAAA,CACJL,CAAAA,CAAQ,MAAA,GAAW,YACfH,CAAAA,CAAeO,CAAAA,CACfD,IAAc,CAAA,CACZ,CAAA,CACA,QACGA,CAAAA,CAAYN,CAAAA,CAAeO,GAAe,OAAA,CAAQ,EAAE,CACvD,CAAA,CAER,OAAO,IAAIZ,EAAAA,CAAgB,CACzB,OAAQQ,CAAAA,CAAQ,MAAA,CAChB,IAAA,CAAMnlC,CAAAA,EAAO,IAAA,EAAQmlC,CAAAA,CAAQ,OAC7B,IAAA,CAAME,CAAAA,EAAe,MAAQ,EAAA,CAC7B,SAAA,CAAWrlC,GAAO,SAAA,EAAa,CAAA,CAC/B,cAAA,CAAgBA,CAAAA,EAAO,cAAA,EAAkB,KAAA,CACzC,kBAAmBA,CAAAA,EAAO,iBAAA,EAAqB,MAC/C,OAAA,CAASmlC,CAAAA,CAAQ,QACjB,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CACf,aAAA,CAAeA,CAAAA,CAAQ,aAAA,CACvB,eAAgBA,CAAAA,CAAQ,cAAA,CACxB,SAAAK,CACF,CAAC,CACH,CAAC,CACH,EACA,OAAA,CAAS,CAAC,CAACvnC,CACb,CAAC,CACH,CC5GO,SAASwnC,EAAAA,CACdxtC,CAAAA,CACAjP,CAAAA,CACA,CACA,OAAO2d,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,aAAA,CAAe3d,CAAAA,CAAQ,cAAA,CAAgBiP,CAAQ,CAAA,CACpE,OAAA,CAAS,CAAC,CAACjP,CAAAA,EAAU,CAAC,CAACiP,CAAAA,CACvB,UAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,OAAA,CAAS,SAAY,CACnB,GAAI,CAACjP,CAAAA,EAAU,CAACiP,CAAAA,CACd,MAAM,IAAI,KAAA,CACR,mDACF,EAEF,IAAM0lB,CAAAA,CAAc7Y,GAAe,CAC7B4gC,CAAAA,CAAYlI,GAAoCvlC,CAAQ,CAAA,CAC9D,MAAM0lB,CAAAA,CAAY,aAAA,CAAc+nB,CAAS,CAAA,CACzC,IAAMC,CAAAA,CAAWhoB,EAAY,YAAA,CAC3B+nB,CAAAA,CAAU,QACZ,CAAA,CAEME,CAAAA,CAAe,MAAMjoB,CAAAA,CAAY,eAAA,CACrCkmB,EAAAA,CAAwC,CAAC76C,CAAM,CAAC,CAClD,CAAA,CAEM68C,CAAAA,CAAc,MAAMloB,CAAAA,CAAY,eAAA,CACpCgmB,GAAwC1rC,CAAQ,CAClD,CAAA,CAIM6tC,CAAAA,CAAa,MAAMnoB,CAAAA,CAAY,gBACnC2mB,EAAAA,CAAmC,MAAA,CAAWt7C,CAAM,CACtD,CAAA,CAEM+lB,EAAW62B,CAAAA,EAAc,IAAA,CAAM1iD,GAAMA,CAAAA,CAAE,MAAA,GAAW8F,CAAM,CAAA,CACxDm8C,CAAAA,CAAUU,GAAa,IAAA,CAAM3iD,CAAAA,EAAMA,EAAE,MAAA,GAAW8F,CAAM,CAAA,CAGtDs8C,CAAAA,CAAY,EAFHQ,CAAAA,EAAY,KAAM5iD,CAAAA,EAAMA,CAAAA,CAAE,SAAW8F,CAAM,CAAA,EAE9B,WAAa,GAAA,CAAA,CAEnC20C,CAAAA,CAAgB,UAAA,CAAWwH,CAAAA,EAAS,OAAA,EAAW,GAAG,EAClDY,CAAAA,CAAgB,UAAA,CAAWZ,GAAS,KAAA,EAAS,GAAG,EAChDa,CAAAA,CAAmB,UAAA,CAAWb,CAAAA,EAAS,cAAA,EAAkB,GAAG,CAAA,CAE5D/3C,EAAmC,CACvC,CAAE,KAAM,QAAA,CAAU,OAAA,CAASuwC,CAAc,CAAA,CACzC,CAAE,KAAM,QAAA,CAAU,OAAA,CAASoI,CAAc,CAC3C,CAAA,CAEA,OAAIC,CAAAA,CAAmB,CAAA,EACrB54C,EAAM,IAAA,CAAK,CAAE,IAAA,CAAM,WAAA,CAAa,OAAA,CAAS44C,CAAiB,CAAC,CAAA,CAGtD,CACL,KAAMh9C,CAAAA,CACN,KAAA,CAAO+lB,GAAU,IAAA,EAAQ,EAAA,CACzB,KAAA,CAAOu2B,CAAAA,GAAc,CAAA,CAAI,CAAA,CAAI,OAAOA,CAAAA,EAAaK,CAAAA,EAAU,OAAS,CAAA,CAAE,CAAA,CACtE,eAAgBhI,CAAAA,CAAgBoI,CAAAA,CAChC,KAAA,CAAO,QAAA,CACP,KAAA,CAAA34C,CACF,CACF,CACF,CAAC,CACH,CChEO,SAAS64C,EAAAA,CAAsBhuC,CAAAA,CAAmByQ,EAAS,CAAA,CAAG,CACnE,OAAO/B,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU1O,CAAAA,CAAUyQ,CAAM,CAAA,CACrC,OAAA,CAAS,SAAY,CACnB,GAAI,CAACzQ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CAG/D,IAAM6R,CAAAA,CAAO7R,CAAAA,CAAS,QAAQ,GAAA,CAAK,EAAE,EAG/BiuC,CAAAA,CAAiB,MAAM,MAAMzjC,CAAAA,CAAO,cAAA,CAAiB,qBAAA,CAAuB,CAChF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,SAAUqH,CAAK,CAAC,CACzC,CAAC,CAAA,CAED,GAAI,CAACo8B,CAAAA,CAAe,GAClB,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,CAAAA,CAAe,MAAM,EAAE,CAAA,CAGpE,IAAMC,EAAU,MAAMD,CAAAA,CAAe,MAAK,CAGpCE,CAAAA,CAAuB,MAAM,KAAA,CACjC3jC,CAAAA,CAAO,cAAA,CAAiB,0BACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,SAAUqH,CAAAA,CAAM,IAAA,CAAMpB,CAAO,CAAC,CACvD,CACF,CAAA,CAEA,GAAI,CAAC09B,CAAAA,CAAqB,EAAA,CACxB,MAAM,IAAI,KAAA,CAAM,uCAAuCA,CAAAA,CAAqB,MAAM,EAAE,CAAA,CAGtF,IAAMC,CAAAA,CAAgB,MAAMD,CAAAA,CAAqB,IAAA,GAEjD,OAAO,CACL,OAAQD,CAAAA,CAAO,MAAA,CACf,QAASA,CAAAA,CAAO,gBAAA,CAChB,YAAA,CAAAE,CACF,CACF,CAAA,CACA,UAAW,GAAA,CACX,cAAA,CAAgB,KAChB,OAAA,CAAS,CAAC,CAACpuC,CACb,CAAC,CACH,CCzDO,SAASquC,GAAsCruC,CAAAA,CAAkB,CACtE,OAAO0O,YAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,SAAU,cAAA,CAAgB1O,CAAQ,EACvD,SAAA,CAAW,GAAA,CACX,gBAAiB,GAAA,CACjB,OAAA,CAAS,UACP,MAAM6M,CAAAA,EAAe,CAAE,cAAcmhC,EAAAA,CAAsBhuC,CAAQ,CAAC,CAAA,CAI7D,CACL,KAAM,QAAA,CACN,KAAA,CAAO,eAAA,CACP,KAAA,CAAO,IAAA,CACP,cAAA,CAAgB,EAPL6M,CAAAA,EAAe,CAAE,aAC5BmhC,EAAAA,CAAsBhuC,CAAQ,EAAE,QAClC,CAAA,EAK0B,MAAA,EAAU,CAAA,CACpC,CAAA,CAEJ,CAAC,CACH,CCjBO,SAASsuC,EAAAA,CACdtuC,CAAAA,CACAgF,EACA,CACA,OAAO0J,aAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,QAAA,CAAU,eAAgB1O,CAAAA,CAAUgF,CAAI,CAAA,CAC7D,OAAA,CAAS,SAAA,CAcO,KAAA,CAbG,MAAM,KAAA,CACrB,CAAA,EAAGwF,EAAO,cAAc,CAAA,uBAAA,CAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,QAAA,CAAAxK,EACA,IAAA,CAAMgF,CAAAA,EAAQ,CAChB,CAAC,CACH,CACF,GAC6B,IAAA,EAAK,EACtB,IAAI,CAAC,CAAE,QAAAupC,CAAAA,CAAS,IAAA,CAAAvpC,EAAM,MAAA,CAAAlU,CAAAA,CAAQ,GAAAkB,CAAAA,CAAI,MAAA,CAAAu8B,EAAQ,QAAA,CAAAC,CAAAA,CAAU,KAAAzrB,CAAK,CAAA,IAAO,CAC1E,OAAA,CAAS,IAAI,IAAA,CAAKwrC,CAAO,CAAA,CACzB,IAAA,CAAAvpC,EACA,OAAA,CAAS,CACP,CACE,MAAA,CAAQ,UAAA,CAAWlU,CAAM,CAAA,CACzB,KAAA,CAAO,QACT,CACF,CAAA,CACA,EAAA,CAAAkB,EACA,IAAA,CAAMu8B,CAAAA,EAAU,OAChB,EAAA,CAAIC,CAAAA,EAAY,MAAA,CAChB,IAAA,CAAMzrB,CAAAA,EAAQ,MAChB,EAAE,CAEN,CAAC,CACH,CCtBO,SAASyrC,GACdxuC,CAAAA,CACA7N,CAAAA,CACAyM,EAAmB,CAAE,OAAA,CAAS,KAAM,CAAA,CACpC,CACA,IAAM8mB,CAAAA,CAAc7Y,CAAAA,GACdoG,CAAAA,CAAWrU,CAAAA,CAAQ,QAAA,EAAY,KAAA,CAE/B6vC,CAAAA,CAAa,MAAOC,IACpB9vC,CAAAA,CAAQ,OAAA,CACV,MAAM8mB,CAAAA,CAAY,UAAA,CAAWgpB,CAAE,CAAA,CAE/B,MAAMhpB,CAAAA,CAAY,aAAA,CAAcgpB,CAAE,CAAA,CAE7BhpB,EAAY,YAAA,CAA+BgpB,CAAAA,CAAG,QAAQ,CAAA,CAAA,CAGzDC,CAAAA,CAA6B,MACjCC,CAAAA,EAC0C,CAC1C,GAAI,CAACA,CAAAA,EAAa37B,CAAAA,GAAa,MAC7B,OAAO27B,CAAAA,CAGT,GAAI,CACF,IAAMC,EAAiB,MAAMlF,EAAAA,CAAgB12B,CAAQ,CAAA,CACrD,OAAO,CACL,GAAG27B,CAAAA,CACH,MAAOA,CAAAA,CAAU,KAAA,CAAQC,CAC3B,CACF,CAAA,MAAS57C,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuCggB,CAAQ,CAAA,CAAA,CAAA,CAAKhgB,CAAK,CAAA,CAC/D27C,CACT,CACF,CAAA,CAEME,CAAAA,CAAiBxJ,GAAyBtlC,CAAAA,CAAUiT,CAAAA,CAAU,IAAI,CAAA,CAElE87B,CAAAA,CAAwB,SAAY,CACxC,GAAI,CAEF,IAAMC,CAAAA,CAAAA,CAD+B,MAAMtpB,CAAAA,CAAY,UAAA,CAAWopB,CAAc,GACpD,OAAA,CAAQ,IAAA,CACjC78C,GACCA,CAAAA,CAAK,MAAA,CAAO,aAAY,GAAME,CAAAA,CAAM,aACxC,CAAA,CAEA,GAAI,CAAC68C,CAAAA,CAAW,OAEhB,IAAM75C,CAAAA,CAAkD,EAAC,CAczD,GAZI65C,CAAAA,CAAU,MAAA,GAAW,KAAA,CAAA,EAAaA,CAAAA,CAAU,SAAW,IAAA,EACzD75C,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAM,SAAU,OAAA,CAAS65C,CAAAA,CAAU,MAAO,CAAC,CAAA,CAGtDA,CAAAA,CAAU,SAAW,KAAA,CAAA,EAAaA,CAAAA,CAAU,SAAW,IAAA,EAAQA,CAAAA,CAAU,OAAS,CAAA,EACpF75C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,QAAA,CAAU,QAAS65C,CAAAA,CAAU,MAAO,CAAC,CAAA,CAGtDA,CAAAA,CAAU,UAAY,KAAA,CAAA,EAAaA,CAAAA,CAAU,UAAY,IAAA,EAAQA,CAAAA,CAAU,QAAU,CAAA,EACvF75C,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAM,UAAW,OAAA,CAAS65C,CAAAA,CAAU,OAAQ,CAAC,CAAA,CAGxDA,CAAAA,CAAU,WAAa,KAAA,CAAM,OAAA,CAAQA,EAAU,SAAS,CAAA,CAC1D,QAAWC,CAAAA,IAAaD,CAAAA,CAAU,SAAA,CAAW,CAC3C,GAAI,CAACC,GAAa,OAAOA,CAAAA,EAAc,SAAU,SAEjD,IAAMC,EAAUD,CAAAA,CAAU,OAAA,CACpB5iD,CAAAA,CAAQ4iD,CAAAA,CAAU,KAAA,CAExB,GAAI,OAAO5iD,CAAAA,EAAU,QAAA,CAAU,CAE7B,IAAMqf,CAAAA,CADarf,EAAM,OAAA,CAAQ,IAAA,CAAM,EAAE,CAAA,CAChB,KAAA,CAAM,yBAAyB,CAAA,CACxD,GAAIqf,EAAO,CACT,IAAMyjC,EAAW,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,UAAA,CAAWzjC,CAAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAEjDwjC,IAAY,sBAAA,CACd/5C,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAM,sBAAA,CAAwB,OAAA,CAASg6C,CAAS,CAAC,EACrDD,CAAAA,GAAY,qBAAA,CACrB/5C,EAAM,IAAA,CAAK,CAAE,KAAM,sBAAA,CAAwB,OAAA,CAASg6C,CAAS,CAAC,CAAA,CACrDD,CAAAA,GAAY,4BACrB/5C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,oBAAA,CAAsB,QAASg6C,CAAS,CAAC,EAEhE,CACF,CACF,CAGF,OAAO,CACL,KAAMH,CAAAA,CAAU,MAAA,CAChB,MAAOA,CAAAA,CAAU,IAAA,CACjB,KAAA,CAAOA,CAAAA,CAAU,QAAA,CACjB,cAAA,CAAgBA,EAAU,OAAA,CAC1B,GAAA,CAAKA,EAAU,GAAA,EAAK,QAAA,GACpB,KAAA,CAAOA,CAAAA,CAAU,KAAA,CACjB,cAAA,CAAgBA,CAAAA,CAAU,cAAA,CAC1B,MAAA75C,CACF,CACF,MAAQ,CACN,MACF,CACF,CAAA,CAEA,OAAOuZ,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,iBAAkB,YAAA,CAAc1O,CAAAA,CAAU7N,EAAO8gB,CAAQ,CAAA,CACpE,QAAS,SAAY,CACnB,IAAMm8B,CAAAA,CAAqB,MAAML,GAAsB,CAEvD,GAAIK,GAAsBA,CAAAA,CAAmB,KAAA,CAAQ,EACnD,OAAOA,CAAAA,CAGT,IAAIR,CAAAA,CAEJ,GAAIz8C,CAAAA,GAAU,OACZy8C,CAAAA,CAAY,MAAMH,EAAWlJ,EAAAA,CAAoCvlC,CAAQ,CAAC,CAAA,CAAA,KAAA,GACjE7N,CAAAA,GAAU,IAAA,CACnBy8C,CAAAA,CAAY,MAAMH,CAAAA,CAAWxI,GAAyCjmC,CAAQ,CAAC,UACtE7N,CAAAA,GAAU,KAAA,CACnBy8C,EAAY,MAAMH,CAAAA,CAAW7I,EAAAA,CAAmC5lC,CAAQ,CAAC,CAAA,CAAA,KAAA,GAChE7N,IAAU,QAAA,CACnBy8C,CAAAA,CAAY,MAAMH,CAAAA,CAAWJ,EAAAA,CAAsCruC,CAAQ,CAAC,CAAA,CAAA,KAAA,GAAA,CAG3D,MAAM0lB,CAAAA,CAAY,eAAA,CACjCgmB,GAAwC1rC,CAAQ,CAClD,GAEa,IAAA,CAAMktC,CAAAA,EAAYA,EAAQ,MAAA,GAAW/6C,CAAK,CAAA,CACrDy8C,CAAAA,CAAY,MAAMH,CAAAA,CAChBjB,GAA0CxtC,CAAAA,CAAU7N,CAAK,CAC3D,CAAA,CAAA,KACK,CAAA,GAAIi9C,EAET,OAAOA,CAAAA,CAEP,MAAM,IAAI,KAAA,CACR,CAAA,yCAAA,EAAuCj9C,CAAK,CAAA,CAAA,CAC9C,CAAA,CAMJ,GAAIi9C,CAAAA,EAAsBR,CAAAA,EAAaA,EAAU,KAAA,CAAQ,CAAA,CAAG,CAC1D,IAAMS,CAAAA,CAAY,MAAMV,EAA2BC,CAAS,CAAA,CAC5D,OAAO,CACL,GAAGQ,EACH,KAAA,CAAOC,CAAAA,CAAW,KACpB,CACF,CAEA,OAAO,MAAMV,CAAAA,CAA2BC,CAAS,CACnD,CACF,CAAC,CACH,CC/KO,IAAKU,EAAAA,CAAAA,CAAAA,CAAAA,GAEVA,CAAAA,CAAA,QAAA,CAAW,WAGXA,CAAAA,CAAA,iBAAA,CAAoB,kBACpBA,CAAAA,CAAA,mBAAA,CAAsB,kBACtBA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,CAAAA,CAAA,OAAA,CAAU,UAAA,CACVA,EAAA,SAAA,CAAY,YAAA,CACZA,EAAA,cAAA,CAAiB,iBAAA,CACjBA,EAAA,aAAA,CAAgB,gBAAA,CAChBA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,QAAU,SAAA,CAGVA,CAAAA,CAAA,KAAO,MAAA,CACPA,CAAAA,CAAA,QAAU,SAAA,CACVA,CAAAA,CAAA,MAAQ,OAAA,CACRA,CAAAA,CAAA,IAAM,KAAA,CAGNA,CAAAA,CAAA,MAAQ,OAAA,CACRA,CAAAA,CAAA,QAAU,SAAA,CACVA,CAAAA,CAAA,UAAA,CAAa,YAAA,CAxBHA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,ECkCL,SAASC,EAAAA,CACdvvC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,UAAU,CAAA,CACrB/I,CAAAA,CACCmJ,GAAY,CACX8d,EAAAA,CAAgBjnB,EAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,EAAQ,MAAA,CAAQA,CAAAA,CAAQ,IAAI,CACrE,CAAA,CACA,MAAO6lB,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCxCO,SAAS2nC,EAAAA,CACdxvC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,gBAAgB,CAAA,CAC3B/I,EACCmJ,CAAAA,EAAY,CACXmlB,GAAqBtuB,CAAAA,CAAWmJ,CAAAA,CAAQ,GAAIA,CAAAA,CAAQ,MAAA,CAAQA,EAAQ,IAAI,CAC1E,EACA,MAAO6lB,CAAAA,CAASnJ,IAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,EAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CC2BO,SAAS4nC,GACdzvC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,yBAAyB,CAAA,CACpC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX6e,EAAAA,CACEhoB,CAAAA,CACAmJ,EAAQ,SAAA,CACRA,CAAAA,CAAQ,aACV,CACF,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAE5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,SAAS,EAC3C,CAAC,gBAAA,CAAkB,aAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCvBO,SAAS6nC,EAAAA,CACd1vC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,4BAA4B,CAAA,CACvC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXgf,GACEnoB,CAAAA,CACAmJ,CAAAA,CAAQ,UACRA,CAAAA,CAAQ,OAAA,CACRA,EAAQ,QACV,CACF,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAE5B,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,MAAA,CAAO,eAAe3O,CAAS,CAAA,CACzC2O,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,SAAS,CAC7C,CAAC,EACH,EACApe,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCvFO,SAAS8nC,EAAAA,CAAuB3vC,CAAAA,CAA8ByH,CAAAA,CACnEI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,uBAAuB,CAAA,CAClC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,KAAK,SAAA,CAAU,CAC1B,aAAc,QAAA,CACd,cAAA,CAAgB,WAChB,eAAA,CAAiB,CACf,OAAQ5P,CAAAA,CAAQ,MAAA,CAChB,GAAIA,CAAAA,CAAQ,EAAA,CACZ,SAAUA,CAAAA,CAAQ,QAAA,CAClB,KAAMA,CAAAA,CAAQ,IAChB,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,sBAAA,CAAwB,EAAC,CACzB,EAAA,CAAI,kBAAA,CACJ,KAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,MAAOiW,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,EACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCrCO,SAAS+nC,EAAAA,CACd5vC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,qBAAqB,CAAA,CAChC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXqe,GAAyBxnB,CAAAA,CAAWmJ,CAAAA,CAAQ,GAAIA,CAAAA,CAAQ,MAAA,CAAQA,EAAQ,IAAI,CAC9E,EACA,MAAO6lB,CAAAA,CAASnJ,IAAc,CAC5B,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,EAAU,QAAA,CAAS,IAAA,CAAKkX,EAAU,EAAE,CAAA,CACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCtBO,SAASgoC,EAAAA,CACd7vC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,uBAAuB,CAAA,CAClC/I,EACCmJ,CAAAA,EAAY,CACXse,GAA2BznB,CAAAA,CAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,CAAAA,CAAQ,MAAA,CAAQA,CAAAA,CAAQ,KAAMA,CAAAA,CAAQ,SAAS,CACnG,CAAA,CACA,MAAO6lB,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCzBO,SAASioC,EAAAA,CACd9vC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,qBAAqB,CAAA,CAChC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX0e,EAAAA,CAAyB7nB,EAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,EAAQ,MAAM,CAChE,EACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,EAAU,QAAA,CAAS,IAAA,CAAKkX,EAAU,EAAE,CAAA,CACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCxBO,SAASkoC,GACd/vC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,QAAA,CAAU,kBAAkB,CAAA,CAC7B/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX2e,EAAAA,CAAuB9nB,CAAAA,CAAWmJ,EAAQ,aAAa,CACzD,EACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCpBO,SAASmoC,EAAAA,CAAWhwC,EAA8ByH,CAAAA,CACvDI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,SAAS,CAAA,CACpB/I,EACCmJ,CAAAA,EAAY,CACXA,EAAQ,cAAA,CACJsf,EAAAA,CAA6BzoB,EAAWmJ,CAAAA,CAAQ,MAAA,CAAQA,EAAQ,SAAS,CAAA,CACzEqf,GAAexoB,CAAAA,CAAWmJ,CAAAA,CAAQ,OAAQA,CAAAA,CAAQ,SAAS,CACjE,CAAA,CACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC,CAAC,gBAAA,CAAkB,aAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCrBO,SAASooC,EAAAA,CAAiBjwC,EAA8ByH,CAAAA,CAC7DI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,gBAAgB,EAC3B/I,CAAAA,CACCmJ,CAAAA,EAAYye,EAAAA,CAAsB5nB,CAAAA,CAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,EAAQ,MAAA,CAAQA,CAAAA,CAAQ,KAAMA,CAAAA,CAAQ,SAAS,EACzG,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnBA,IAAMqoC,EAAAA,CAAsC,IACtCC,EAAAA,CAA4B,IAAI,GAAA,CAE/B,SAASC,EAAAA,CAAgBpwC,CAAAA,CAA8ByH,EAC5DI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,eAAe,CAAA,CAC1B/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXijB,EAAAA,CAA0BpsB,EAAWmJ,CAAAA,CAAQ,UAAA,CAAYA,EAAQ,SAAA,CAAWA,CAAAA,CAAQ,WAAW,CACjG,CAAA,CACA,IAAM,CACJ,IAAMknC,CAAAA,CAAWrwC,GAAY,eAAA,CACvBswC,CAAAA,CAAmB,CACvB3hC,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CAAA,CACtC2O,CAAAA,CAAU,MAAA,CAAO,eAAA,CAAgB3O,CAAS,CAAA,CAC1C2O,EAAU,MAAA,CAAO,cAAA,CAAe3O,CAAS,CAAA,CACzC2O,CAAAA,CAAU,OAAO,oBAAA,CAAqB3O,CAAS,CACjD,CAAA,CAIMuwC,CAAAA,CAAgBJ,EAAAA,CAA0B,IAAIE,CAAQ,CAAA,CACxDE,IACF,YAAA,CAAaA,CAAa,EAC1BJ,EAAAA,CAA0B,MAAA,CAAOE,CAAQ,CAAA,CAAA,CAG3C,IAAMh3C,CAAAA,CAAQ,WAAW,SAAY,CACnC,GAAI,CACF,IAAMi2B,EAAKziB,CAAAA,EAAe,CAIpB2jC,GAHU,MAAM,OAAA,CAAQ,WAC5BF,CAAAA,CAAiB,GAAA,CAAKtgD,GAAQs/B,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAUt/B,CAAI,CAAC,CAAC,CACvE,CAAA,EACyB,OAAQzE,CAAAA,EAAWA,CAAAA,CAAO,SAAW,UAAU,CAAA,CACpEilD,EAAS,MAAA,CAAS,CAAA,EACpB,OAAA,CAAQ,KAAA,CAAM,8DAAA,CAAgE,CAC5E,SAAAxwC,CAAAA,CACA,aAAA,CAAewwC,EAAS,MAAA,CACxB,QAAA,CAAAA,CACF,CAAC,EAEL,CAAA,MAASv9C,CAAAA,CAAO,CACd,OAAA,CAAQ,MAAM,4DAAA,CAA8D,CAC1E,SAAA+M,CAAAA,CACA,KAAA,CAAA/M,CACF,CAAC,EACH,QAAE,CACAk9C,EAAAA,CAA0B,OAAOE,CAAQ,EAC3C,CACF,CAAA,CAAGH,EAAmC,EAEtCC,EAAAA,CAA0B,GAAA,CAAIE,CAAAA,CAAUh3C,CAAK,EAC/C,CAAA,CACAoO,EACA,SAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CC7DO,SAAS4oC,EAAAA,CAAuBzwC,CAAAA,CAA8ByH,CAAAA,CACnEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,uBAAuB,EAClC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,IAAA,CAAK,UAAU,CAC1B,YAAA,CAAc,SACd,cAAA,CAAgB,UAAA,CAChB,gBAAiB,CACf,MAAA,CAAQ5P,EAAQ,MAAA,CAChB,EAAA,CAAIA,EAAQ,EAAA,CACZ,QAAA,CAAUA,EAAQ,QACpB,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,GAAI,kBAAA,CACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,uBAAwB,EAAC,CACzB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,MAAOiW,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,QAAA,CAAS,KAAKkX,CAAAA,CAAU,EAAE,EACpC,CAAC,gBAAA,CAAkB,aAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnCO,SAAS6oC,EAAAA,CAAyB1wC,CAAAA,CAA8ByH,CAAAA,CACrEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,yBAAyB,CAAA,CACpC/I,EACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,eAAgB,YAAA,CAChB,eAAA,CAAiB,CACf,MAAA,CAAQ5P,CAAAA,CAAQ,OAChB,IAAA,CAAMA,CAAAA,CAAQ,KACd,QAAA,CAAUA,CAAAA,CAAQ,QACpB,CACF,CAAC,EACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,EAAA,CAAI,mBACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,sBAAA,CAAwB,EAAC,CACzB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,EACA,SAAY,CACV,MAAMtP,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC,CAAC,gBAAA,CAAkB,aAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CClCO,SAAS8oC,EAAAA,CAAoB3wC,EAA8ByH,CAAAA,CAChEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,oBAAoB,CAAA,CAC/B/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,IAAA,CAAK,UAAU,CAC1B,YAAA,CAAc,SACd,cAAA,CAAgB,OAAA,CAChB,eAAA,CAAiB,CACf,MAAA,CAAQ5P,CAAAA,CAAQ,OAChB,EAAA,CAAIA,CAAAA,CAAQ,GACZ,QAAA,CAAUA,CAAAA,CAAQ,QACpB,CACF,CAAC,EACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,GAAI,kBAAA,CACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,sBAAA,CAAwB,EAAC,CACzB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,MAAOiW,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnCO,SAAS+oC,EAAAA,CAAsB5wC,CAAAA,CAA8ByH,EAClEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,sBAAsB,CAAA,CACjC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,EAAO,IAAA,CAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,eAAgB,SAAA,CAChB,eAAA,CAAiB,CACf,MAAA,CAAQ5P,CAAAA,CAAQ,MAAA,CAChB,GAAIA,CAAAA,CAAQ,EAAA,CACZ,SAAUA,CAAAA,CAAQ,QACpB,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,cAAe,CACtB,EAAA,CAAI,mBACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,sBAAA,CAAwB,EAAC,CACzB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,EACA,SAAY,CACV,MAAMtP,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC,CAAC,gBAAA,CAAkB,aAAcA,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCpCO,SAASgpC,EAAAA,CAAsB7wC,EAA8ByH,CAAAA,CAClEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,sBAAsB,CAAA,CACjC/I,EACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,IAAA,CAAK,UAAU5P,CAAAA,CAAQ,MAAA,CAAO,GAAA,CAAKpY,CAAAA,GAAY,CAAE,MAAA,CAAAA,CAAO,CAAA,CAAE,CAAC,EACxE,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,EAAA,CAAI,kBAAA,CACJ,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACiP,CAAS,CAAA,CAClC,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,SAAY,CACV,MAAMtP,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC,CAAC,iBAAkB,YAAA,CAAcA,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,SAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCrBO,SAASipC,EAAAA,CAAqB9wC,CAAAA,CAA8ByH,CAAAA,CACjEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,qBAAqB,EAChC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAIyf,CAAAA,CACAD,EAEAxf,CAAAA,CAAQ,MAAA,GAAW,UACrBwf,CAAAA,CAAiB,QAAA,CACjBC,EAAkB,CAChB,IAAA,CAAMzf,CAAAA,CAAQ,SAAA,CACd,EAAA,CAAIA,CAAAA,CAAQ,OACd,CAAA,GAEAwf,CAAAA,CAAiBxf,EAAQ,MAAA,CACzByf,CAAAA,CAAkB,CAChB,MAAA,CAAQzf,CAAAA,CAAQ,MAAA,CAChB,QAAA,CAAUA,CAAAA,CAAQ,QAAA,CAClB,MAAOA,CAAAA,CAAQ,KACjB,GAGF,IAAM4P,CAAAA,CAAO,KAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,cAAA,CAAA4P,CAAAA,CACA,gBAAAC,CACF,CAAC,EACD,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,GAAI,kBAAA,CACJ,cAAA,CAAgB,CAAC5oB,CAAS,CAAA,CAC1B,uBAAwB,EAAC,CACzB,KAAA+Y,CACF,CAAC,CAAc,CACjB,CAAA,CACA,SAAY,CACV,MAAMtP,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC,CAAC,iBAAkB,YAAA,CAAcA,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CC1BA,SAASkpC,GACP5+C,CAAAA,CACA2B,CAAAA,CACAqV,EACoB,CACpB,GAAM,CAAE,IAAA,CAAA3F,CAAAA,CAAM,GAAAC,CAAAA,CAAK,EAAA,CAAI,MAAA,CAAA3S,CAAAA,CAAS,EAAA,CAAI,IAAA,CAAAiS,EAAO,EAAG,CAAA,CAAIoG,EAC5Cue,CAAAA,CAAYve,CAAAA,CAAQ,YAAe,IAAA,CAAK,GAAA,EAAI,GAAM,CAAA,CAExD,OAAQhX,CAAAA,EACN,KAAK,MAAA,CACH,OAAQ2B,CAAAA,EACN,gBACE,OAAO,CAACmzB,EAAAA,CAAgBzjB,CAAAA,CAAMC,CAAAA,CAAI3S,CAAAA,CAAQiS,CAAI,CAAC,CAAA,CACjD,uBACE,OAAO,CAACykB,GAAyBhkB,CAAAA,CAAMC,CAAAA,CAAI3S,EAAQiS,CAAI,CAAC,EAC1D,KAAA,iBAAA,CACE,OAAO,CAAC0kB,EAAAA,CAA2BjkB,CAAAA,CAAMC,EAAI3S,CAAAA,CAAQiS,CAAAA,CAAM2kB,CAAS,CAAC,CAAA,CACvE,KAAA,UAAA,CACE,OAAO,CAACG,EAAAA,CAAyBrkB,EAAMC,CAAAA,CAAI3S,CAAM,CAAC,CACtD,CACA,MAEF,KAAK,KAAA,CACH,OAAQgD,GACN,KAAA,UAAA,CACE,OAAO,CAACmzB,EAAAA,CAAgBzjB,EAAMC,CAAAA,CAAI3S,CAAAA,CAAQiS,CAAI,CAAC,CAAA,CACjD,KAAA,iBAAA,CACE,OAAO,CAACykB,EAAAA,CAAyBhkB,EAAMC,CAAAA,CAAI3S,CAAAA,CAAQiS,CAAI,CAAC,CAAA,CAC1D,uBACE,OAAO,CAAC0kB,GAA2BjkB,CAAAA,CAAMC,CAAAA,CAAI3S,EAAQiS,CAAAA,CAAM2kB,CAAS,CAAC,CAAA,CACvE,KAAA,gBAAA,CACE,OAAOE,EAAAA,CAAsBpkB,CAAAA,CAAMC,CAAAA,CAAI3S,EAAQiS,CAAAA,CAAM2kB,CAAS,EAChE,KAAA,SAAA,CACE,OAAO,CAACc,EAAAA,CAAehlB,CAAAA,CAAM1S,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAI,CAAI,GAAI,CAAC,CAAC,CACvE,CACA,MAEF,KAAK,IAAA,CACH,OAAQgD,CAAAA,EACN,kBACE,OAAO,CAACg0B,GAAuBtkB,CAAAA,CAAM1S,CAAM,CAAC,CAAA,CAC9C,KAAA,UAAA,CACE,OAAO,CAACk3B,EAAAA,CAA6BxkB,EAAMC,CAAAA,CAAI3S,CAAM,CAAC,CAAA,CACxD,KAAA,iBAAA,CACE,OAAO,CAACq3B,EAAAA,CACNhf,CAAAA,CAAQ,YAAA,EAAgB3F,CAAAA,CACxB2F,CAAAA,CAAQ,YAAc1F,CAAAA,CACtB0F,CAAAA,CAAQ,SAAW,CAAA,CACnBA,CAAAA,CAAQ,WAAa,KACvB,CAAC,CACL,CACA,MAEF,KAAK,SACH,GAAIrV,CAAAA,GAAc,YAA2BA,CAAAA,GAAc,MAAA,CACzD,OAAO,CAACw6B,EAAAA,CAAqB9qB,CAAAA,CAAMC,CAAAA,CAAI3S,CAAAA,CAAQiS,CAAI,CAAC,CAAA,CAEtD,KACJ,CAEA,OAAO,IACT,CAEA,SAASiuC,EAAAA,CACP7+C,EACA2B,CAAAA,CACAqV,CAAAA,CACoB,CACpB,GAAM,CAAE,KAAA3F,CAAAA,CAAM,EAAA,CAAAC,EAAK,EAAA,CAAI,MAAA,CAAA3S,CAAAA,CAAS,EAAG,CAAA,CAAIqY,CAAAA,CACjC6hC,EAAW,OAAOl6C,CAAAA,EAAW,UAAYA,CAAAA,CAAO,QAAA,CAAS,GAAG,CAAA,CAC9DA,CAAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EACnB,MAAA,CAAOA,CAAM,EAEjB,OAAQgD,CAAAA,EACN,KAAA,UAAA,CACE,OAAO,CAAC40B,EAAAA,CAAcllB,CAAAA,CAAM,UAAA,CAAY,CACtC,MAAA,CAAQrR,CAAAA,CAAO,GAAAsR,CAAAA,CAAI,QAAA,CAAAunC,EAAU,IAAA,CAAM7hC,CAAAA,CAAQ,MAAQ,EACrD,CAAC,CAAC,CAAA,CACJ,KAAA,OAAA,CACE,OAAO,CAACuf,EAAAA,CAAcllB,EAAM,OAAA,CAAS,CAAE,MAAA,CAAQrR,CAAAA,CAAO,EAAA,CAAAsR,CAAAA,CAAI,SAAAunC,CAAS,CAAC,CAAC,CAAA,CACvE,KAAA,SAAA,CACE,OAAO,CAACtiB,EAAAA,CAAcllB,CAAAA,CAAM,SAAA,CAAW,CAAE,MAAA,CAAQrR,EAAO,EAAA,CAAAsR,CAAAA,CAAI,SAAAunC,CAAS,CAAC,CAAC,CAAA,CACzE,KAAA,UAAA,CACE,OAAO,CAACtiB,EAAAA,CAAcllB,CAAAA,CAAM,WAAY,CAAE,MAAA,CAAQrR,EAAO,EAAA,CAAAsR,CAAAA,CAAI,SAAAunC,CAAS,CAAC,CAAC,CAAA,CAC1E,KAAA,YAAA,CACE,OAAO,CAACtiB,EAAAA,CAAcllB,EAAM,YAAA,CAAc,CAAE,OAAQrR,CAAAA,CAAO,IAAA,CAAMsR,CAAAA,CAAI,QAAA,CAAAunC,CAAS,CAAC,CAAC,CAAA,CAClF,KAAA,OAAA,CACE,OAAO,CAACliB,EAAAA,CAAmBtlB,EAAM,CAACrR,CAAK,CAAC,CAAC,CAC7C,CAEA,OAAO,IACT,CAMA,SAAS8+C,EAAAA,CAA4Bn9C,CAAAA,CAA2C,CAC9E,OAAIA,CAAAA,GAAc,OAAA,CACT,SAAA,CAEF,QACT,CAaO,SAASo9C,EAAAA,CACdlxC,CAAAA,CACA7N,EACA2B,CAAAA,CACA2T,CAAAA,CACAI,EACA,CACA,GAAM,CAAE,WAAA,CAAa43B,CAAe,EAAI7C,EAAAA,CAAgB,iBAAA,CACtD58B,EACAlM,CACF,CAAA,CAEA,OAAOiV,CAAAA,CACL,CAAC,gBAAA,CAAkB5W,CAAAA,CAAO2B,CAAS,CAAA,CACnCkM,EACCmJ,CAAAA,EAAY,CAEX,IAAMgoC,CAAAA,CAAUJ,EAAAA,CAAoB5+C,EAAO2B,CAAAA,CAAWqV,CAAO,CAAA,CAC7D,GAAIgoC,CAAAA,CAAS,OAAOA,EAGpB,IAAMC,CAAAA,CAAYJ,GAAsB7+C,CAAAA,CAAO2B,CAAAA,CAAWqV,CAAO,CAAA,CACjE,GAAIioC,CAAAA,CAAW,OAAOA,CAAAA,CAEtB,MAAM,IAAI,KAAA,CAAM,CAAA,qDAAA,EAAmDj/C,CAAK,CAAA,aAAA,EAAgB2B,CAAS,GAAG,CACtG,CAAA,CACA,IAAM,CACJ2rC,CAAAA,GAEA,IAAM6Q,CAAAA,CAA6C,EAAC,CAGpDA,CAAAA,CAAiB,KAAK,CAAC,gBAAA,CAAkB,YAAA,CAActwC,CAAAA,CAAU7N,CAAK,CAAC,EAEnEA,CAAAA,GAAU,MAAA,EACZm+C,EAAiB,IAAA,CAAK,CAAC,iBAAkB,YAAA,CAActwC,CAAAA,CAAU,IAAI,CAAC,CAAA,CAIxEswC,CAAAA,CAAiB,KAAK,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMtwC,CAAQ,CAAC,CAAA,CAG7D,UAAA,CAAW,IAAM,CACfswC,CAAAA,CAAiB,OAAA,CAAStgD,GAAQ,CAChC6c,CAAAA,GAAiB,iBAAA,CAAkB,CAAE,SAAU7c,CAAI,CAAC,EACtD,CAAC,EACH,EAAG,GAAI,EACT,EACAyX,CAAAA,CACAwpC,EAAAA,CAA4Bn9C,CAAS,CAAA,CACrC,CAAE,aAAA,CAAA+T,CAAc,CAClB,CACF,CClMO,SAASwpC,EAAAA,CACdrxC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,aAAa,CAAA,CACxB/I,EACA,CAAC,CAAE,GAAAyD,CAAAA,CAAI,KAAA,CAAAwlB,CAAM,CAAA,GAAM,CACjBF,EAAAA,CAAkB/oB,CAAAA,CAAWyD,CAAAA,CAAIwlB,CAAK,CACxC,CAAA,CACA,MAAO+F,EAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,SAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,CAAA,CACpClX,CAAAA,CAAU,eAAA,CAAgB,QAAQ3O,CAAS,CAAA,CAC3C2O,EAAU,eAAA,CAAgB,OAAA,CAAQkX,EAAU,EAAE,CAChD,CAAC,EACH,CAAA,CACApe,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CC0BO,SAASypC,EAAAA,CACdtxC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,WAAA,CAAa,MAAM,EACpB/I,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAyS,CAAAA,CAAS,QAAAoX,CAAQ,CAAA,GAAM,CACxBD,EAAAA,CAAmB5pB,CAAAA,CAAWyS,EAASoX,CAAO,CAChD,CAAA,CACA,SAAY,CAEV,GAAI,CAEEpiB,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,SAAA,CAAU,MAAM3O,CAAQ,CACpC,CAAC,EAEL,CAAA,MAAS/M,CAAAA,CAAO,CAEd,OAAA,CAAQ,IAAA,CAAK,sDAAuDA,CAAK,EAC3E,CACF,CAAA,CACAwU,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CChFO,SAAS0pC,EAAAA,CACdvxC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,WAAA,CAAa,OAAO,CAAA,CACrB/I,EACA,CAAC,CAAE,MAAA+pB,CAAM,CAAA,GAAM,CACbD,EAAAA,CAAoB9pB,CAAAA,CAAW+pB,CAAK,CACtC,CAAA,CACA,SAAY,CACNtiB,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,SAAA,CAAU,OACtB,CAAC,EAEL,CAAA,CACAlH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCMA,SAAS2pC,EAAAA,CAAeC,CAAAA,CAA0B,CAChD,OAAO,CACL,MAAOA,CAAAA,CAAE,YAAA,CACT,aAAcA,CAAAA,CAAE,aAAA,CAChB,GAAA,CAAKA,CAAAA,CAAE,GAAA,CACP,KAAA,CAAO,CACL,oBAAA,CAAsB,CAAA,EAAA,CAAIA,EAAE,oBAAA,CAAuB,GAAA,EAAM,QAAQ,CAAC,CAAC,CAAA,KAAA,CAAA,CACnE,sBAAA,CAAwB,CAAA,CACxB,kBAAA,CAAoBA,EAAE,UACxB,CAAA,CACA,kBAAmB,CACjB,IAAA,CAAM,GAAGA,CAAAA,CAAE,UAAA,CAAW,QAAQ,CAAC,CAAC,MAClC,CAAA,CACA,mCAAA,CAAqC,EACrC,eAAA,CAAiBA,CAAAA,CAAE,QACnB,WAAA,CAAaA,CAAAA,CAAE,WAAA,CACf,wBAAA,CAA0BA,CAAAA,CAAE,eAAA,CAC5B,KAAMA,CAAAA,CAAE,IAAA,CACR,MAAOA,CAAAA,CAAE,KAAA,CACT,WAAYA,CAAAA,CAAE,UAAA,CACd,uBAAA,CAAyBA,CAAAA,CAAE,uBAAA,CAC3B,UAAA,CAAYA,EAAE,UAAA,CACd,iBAAA,CAAmBA,EAAE,iBAAA,CACrB,wBAAA,CAA0BA,EAAE,wBAC9B,CACF,CAUO,SAASC,EAAAA,CAAiCtkD,CAAAA,CAAe,CAC9D,OAAOyrB,oBAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,UAAU,IAAA,CAAKvhB,CAAK,EACxC,gBAAA,CAAkB,CAAA,CAElB,QAAS,MAAO,CAAE,UAAA0rB,CAAU,CAAA,GAAA,CACR,MAAMlc,EAAAA,CACtB,OAAA,CACA,YAAA,CACA,CACE,WAAA,CAAaxP,CAAAA,CACb,KAAM0rB,CACR,CACF,GAEgB,SAAA,CAAU,GAAA,CAAI04B,EAAc,CAAA,CAG9C,gBAAA,CAAkB,CAACx4B,CAAAA,CAAU8yB,CAAAA,CAAWC,CAAAA,GACtC/yB,EAAS,MAAA,GAAW5rB,CAAAA,CAAQ2+C,EAAgB,CAAA,CAAI,MACpD,CAAC,CACH,CAuBO,SAAS4F,EAAAA,CACdl/B,CAAAA,CACAC,CAAAA,CACAC,EACA9B,CAAAA,CAA8B,OAAA,CAC9B+B,EAAuC,MAAA,CACvC,CACA,OAAOlE,YAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,SAAA,CAAU,OAAO8D,CAAAA,CAASC,CAAAA,CAAMC,EAAU9B,CAAAA,CAAM+B,CAAS,EAC7E,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAvY,CAAO,CAAA,GACf,MAAMuC,EAAAA,CACZ,OAAA,CACA,mCACA,CACE,cAAA,CAAgB6V,EAChB,WAAA,CAAaE,CAAAA,CACb,IAAA,CAAAD,CAAAA,CACA,IAAA,CAAA7B,CAAAA,CACA,UAAA+B,CACF,CAAA,CACA,OACA,MAAA,CACAvY,CACF,EAEF,OAAA,CAAS,CAAC,CAACoY,CAAAA,CACX,SAAA,CAAW,GACb,CAAC,CACH,CAOO,SAASm/B,EAAAA,CAAiCn/B,CAAAA,CAAiB,CAChE,OAAO/D,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,UAAU,UAAA,CAAW8D,CAAO,EAChD,OAAA,CAAS,SACC,MAAM7V,EAAAA,CACZ,OAAA,CACA,wCAAA,CACA,CAAE,cAAA,CAAgB6V,CAAQ,CAC5B,CAAA,CAEF,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,UAAW,GACb,CAAC,CACH,CC3KO,IAAKo/B,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,IAAA,OAAA,CAAU,EAAA,CAAA,CAAV,UACAA,CAAAA,CAAAA,CAAAA,CAAA,KAAA,CAAQ,IAAR,OAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,aAAA,CAAgB,EAAA,CAAA,CAAhB,eAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,KAAO,GAAA,CAAA,CAAP,MAAA,CACAA,IAAA,OAAA,CAAU,GAAA,CAAA,CAAV,UACAA,CAAAA,CAAAA,CAAAA,CAAA,IAAA,CAAO,KAAP,MAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAS,GAAA,CAAA,CAAT,QAAA,CACAA,IAAA,UAAA,CAAa,GAAA,CAAA,CAAb,aACAA,CAAAA,CAAAA,CAAAA,CAAA,QAAA,CAAW,GAAA,CAAA,CAAX,UAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,SAAA,CAAY,KAAZ,WAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,cAAgB,GAAA,CAAA,CAAhB,eAAA,CACAA,IAAA,iBAAA,CAAoB,GAAA,CAAA,CAApB,mBAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,MAAA,CAAS,GAAA,CAAA,CAAT,SAWAA,CAAAA,CAAAA,CAAAA,CAAA,MAAA,CAAS,KAAT,QAAA,CAxBUA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,ICiBZ,eAAsBC,EAAAA,CACpB9xC,EACAqJ,CAAAA,CACA,CACA,GAAI,CAACrJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAiD,CAAA,CAGnE,GAAI,CAACqJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,uDAAkD,EAIpE,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,eAAiB,2BAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CACF,EAGM0oC,CAAAA,CAAAA,CAAev0C,CAAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,EAAK,IAC1D,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CACZ,MAAK,CACL,WAAA,GACGtD,CAAAA,CAAO,MAAMsD,EAAS,IAAA,EAAK,CAEjC,GAAI,CAACA,CAAAA,CAAS,GAAI,CAChB,GAAIA,CAAAA,CAAS,MAAA,GAAW,GAAA,CACtB,GAAI,CACF,OAAO,IAAA,CAAK,MAAMtD,CAAI,CACxB,MAAQ,CACN,OAAO,CAAE,OAAA,CAASA,CAAAA,CAAM,IAAA,CAAMsD,EAAS,MAAO,CAChD,CAKF,IAAMw0C,CAAAA,CACJ93C,GAAQ63C,CAAAA,CAAY,QAAA,CAAS,MAAM,CAAA,CAAI,CAAA,EAAA,EAAK73C,CAAAA,CAAK,MAAM,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAK,EAAA,CACrE,MAAM,IAAI,KAAA,CACR,kDAA6CsD,CAAAA,CAAS,MAAM,GAAGw0C,CAAM,CAAA,CACvE,CACF,CAEA,GAAI,CAACD,CAAAA,CAAY,QAAA,CAAS,MAAM,CAAA,CAC9B,MAAM,IAAI,MACR,CAAA,wDAAA,EAAsDA,CAAAA,EAAe,OAAO,CAAA,mBAAA,EAAsBv0C,CAAAA,CAAS,MAAM,CAAA,CAAA,CACnH,CAAA,CAGF,GAAI,CACF,OAAO,IAAA,CAAK,MAAMtD,CAAI,CACxB,MAAQ,CACN,MAAM,IAAI,KAAA,CACR,CAAA,4DAAA,EAA0DsD,CAAAA,CAAS,MAAM,CAAA,CAAA,CAC3E,CACF,CACF,CAEO,SAASy0C,GACdjyC,CAAAA,CACAqJ,CAAAA,CACAJ,EACA8c,CAAAA,CACA,CACA,GAAM,CAAE,WAAA,CAAa0Z,CAAe,CAAA,CAAI7C,EAAAA,CAAgB,kBACtD58B,CAAAA,CACA,gBACF,EAEA,OAAOkJ,WAAAA,CAAY,CACjB,UAAA,CAAY,IAAM4oC,EAAAA,CAAmB9xC,EAAUqJ,CAAW,CAAA,CAC1D,QAAA0c,CAAAA,CACA,SAAA,CAAW,IAAM,CACf0Z,CAAAA,EAAe,CAEf5yB,CAAAA,EAAe,CAAE,YAAA,CACfmhC,GAAsBhuC,CAAQ,CAAA,CAAE,SAC/B5Q,CAAAA,EACMA,CAAAA,EAIE,CACL,GAAGA,CAAAA,CACH,MAAA,CAAA,CACE,UAAA,CAAWA,CAAAA,CAAK,MAAM,EAAI,UAAA,CAAWA,CAAAA,CAAK,OAAO,CAAA,EACjD,OAAA,CAAQ,CAAC,CAAA,CACX,OAAA,CAAS,GACX,CAEJ,CAAA,CAEA6Z,MACF,CACF,CAAC,CACH,CC/GA,IAAMipC,EAAAA,CAAY,wBAAA,CACZC,EAAAA,CAAU,sBAAA,CACVC,EAAAA,CAAc,0BAAA,CACdC,GAAS,qBAAA,CAKR,IAAKC,QACVA,CAAAA,CAAA,GAAA,CAAM,GACNA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,OAAA,CAAU,SAAA,CAHAA,QAAA,EAAA,CAAA,CAMCC,EAAAA,CAAkB,EAIlBC,EAAAA,CAA0B,IAQvC,SAASC,EAAAA,CAAWpmD,CAAAA,CAAuB,CACzC,OAAOA,CAAAA,CAAM,IAAA,GAAO,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA,EAAK,EACzC,CAMO,SAASqmD,GAAsBrmD,CAAAA,CAAuB,CAC3D,OAAOomD,EAAAA,CAAWpmD,CAAK,EAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,WAAA,EAC9C,CAEO,SAASsmD,EAAAA,CAAwBtmD,EAAuB,CAG7D,OAAOomD,GAAWpmD,CAAK,CAAA,CAAE,QAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,WAAA,EAC9C,CAMO,SAASumD,EAAAA,CAAoBvmD,CAAAA,CAAyB,CAC3D,IAAMwmD,CAAAA,CAAO,IAAI,GAAA,CAEjB,OAAOxmD,CAAAA,CACJ,KAAA,CAAM,QAAQ,CAAA,CACd,IAAKiV,CAAAA,EAAQA,CAAAA,CAAI,QAAQ,KAAA,CAAO,EAAE,EAAE,WAAA,EAAa,EACjD,MAAA,CAAQA,CAAAA,EACHA,IAAQ,EAAA,EAAMuxC,CAAAA,CAAK,IAAIvxC,CAAG,CAAA,CACrB,OAGTuxC,CAAAA,CAAK,GAAA,CAAIvxC,CAAG,CAAA,CACL,IAAA,CACR,CACL,CA0BO,SAASwxC,EAAAA,CAAiB,CAC/B,MAAA,CAAAC,CAAAA,CAAS,GACT,MAAA,CAAAxiC,CAAAA,CAAS,EAAA,CACT,IAAA,CAAAvL,CAAAA,CAAO,EAAA,CACP,SAAAguC,CAAAA,CAAW,EAAA,CACX,KAAA93B,CAAAA,CAAO,EACT,CAAA,CAAuC,CACrC,IAAM+3B,CAAAA,CAAmBF,CAAAA,CAAO,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAQ,GAAG,CAAA,CACpD7xB,CAAAA,CAAmBwxB,GAAsBniC,CAAM,CAAA,CAC/C2iC,EAAqBP,EAAAA,CAAwBK,CAAQ,EACrDG,CAAAA,CAAiBP,EAAAA,CAAoB,MAAM,OAAA,CAAQ13B,CAAI,EAAIA,CAAAA,CAAK,IAAA,CAAK,GAAG,CAAA,CAAIA,CAAI,CAAA,CAEhF/lB,EAAQ,CAAC89C,CAAgB,EAE/B,OAAI/xB,CAAAA,EACF/rB,EAAM,IAAA,CAAK,CAAA,OAAA,EAAU+rB,CAAgB,CAAA,CAAE,CAAA,CAGrClc,CAAAA,EACF7P,EAAM,IAAA,CAAK,CAAA,KAAA,EAAQ6P,CAAI,CAAA,CAAE,CAAA,CAGvBkuC,GACF/9C,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY+9C,CAAkB,CAAA,CAAE,CAAA,CAGzCC,EAAe,MAAA,CAAS,CAAA,EAG1Bh+C,EAAM,IAAA,CAAK,CAAA,IAAA,EAAOg+C,EAAe,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA,CAGvC,CAGL,CAAA,CAAGh+C,CAAAA,CAAM,OAAQi+C,CAAAA,EAASA,CAAAA,GAAS,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAC/C,MAAA,CAAQH,CAAAA,CACR,OAAQ/xB,CAAAA,CACR,IAAA,CAAAlc,EACA,QAAA,CAAUkuC,CAAAA,CACV,KAAMC,CACR,CACF,CAEO,IAAME,EAAAA,CAAN,KAAkB,CAChB,KAAA,CAAgB,EAAA,CAChB,OAAiB,EAAA,CACjB,MAAA,CAAiB,GACjB,IAAA,CAAmB,EAAA,CACnB,QAAA,CAAmB,EAAA,CACnB,IAAA,CAAiB,GAExB,WAAA,CAAYC,CAAAA,CAAgB,CAC1B,IAAA,CAAK,KAAA,CAAQA,EACb,IAAA,CAAK,MAAA,CAASA,EAEd,IAAA,CAAK,UAAA,GACL,IAAA,CAAK,QAAA,GACL,IAAA,CAAK,YAAA,GACL,IAAA,CAAK,QAAA,EAAS,CACd,IAAA,CAAK,UAAA,GACP,CAEQ,IAAA,CAAQC,CAAAA,EAAuB,CAErC,IAAMC,CAAAA,CAAU,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,CAASD,CAAE,CAAC,EAC3C,OAAIC,CAAAA,CAAQ,OAAS,CAAA,CACZA,CAAAA,CAAQ,CAAC,CAAA,CAAE,CAAK,CAAA,CAAE,IAAA,EAAK,CAGzB,EACT,EAEQ,UAAA,CAAa,IAAM,CACzB,IAAA,CAAK,MAAA,CAAS,KAAK,IAAA,CAAKtB,EAAS,EACnC,CAAA,CAEQ,QAAA,CAAW,IAAM,CACvB,IAAMltC,EAAO,IAAA,CAAK,IAAA,CAAKmtC,EAAO,CAAA,CAC1B,MAAA,CAAO,MAAA,CAAOG,EAAU,CAAA,CAAE,QAAA,CAASttC,CAAI,CAAA,GACzC,IAAA,CAAK,KAAOA,CAAAA,EAEhB,CAAA,CAEQ,aAAe,IAAM,CAC3B,IAAA,CAAK,QAAA,CAAW,IAAA,CAAK,IAAA,CAAKotC,EAAW,EACvC,CAAA,CAEQ,SAAW,IAAM,CAOvB,IAAMS,CAAAA,CAAO,IAAI,GAAA,CAEjB,IAAA,CAAK,IAAA,CAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,SAASR,EAAM,CAAC,EACxC,OAAA,CAAS3mC,CAAAA,EAAUA,EAAM,CAAK,CAAA,CAAE,MAAM,GAAG,CAAC,EAC1C,GAAA,CAAKpK,CAAAA,EAAQA,EAAI,IAAA,EAAM,CAAA,CACvB,MAAA,CAAQA,CAAAA,EACHA,CAAAA,GAAQ,IAAMuxC,CAAAA,CAAK,GAAA,CAAIvxC,CAAG,CAAA,CACrB,KAAA,EAGTuxC,EAAK,GAAA,CAAIvxC,CAAG,CAAA,CACL,IAAA,CACR,EACL,CAAA,CAEQ,WAAa,IAAM,CAOzB,IANA,CAAC4wC,EAAAA,CAAWC,GAASC,EAAAA,CAAaC,EAAM,CAAA,CAAE,OAAA,CAASvjD,CAAAA,EAAM,CAGvD,KAAK,MAAA,CAAS,IAAA,CAAK,OAAO,OAAA,CAAQA,CAAAA,CAAG,IAAI,EAC3C,CAAC,EAEM,IAAA,CAAK,MAAA,CAAO,QAAQ,IAAI,CAAA,GAAM,IACnC,IAAA,CAAK,MAAA,CAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAG7C,IAAA,CAAK,OAAS,IAAA,CAAK,MAAA,CAAO,OAC5B,CACF,EC5MA,eAAsBinC,EAAAA,CACpBv4B,CAAAA,CAQA6jB,EACY,CA+BZ,IAAMjyB,EAAO,KAAA,CA9BK,SAA8B,CAK9C,IAAIqkD,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAM,MAAMj2C,EAAS,IAAA,GACvB,MAAQ,CACN,MACF,CAEA,GAAIi2C,CAAAA,GAAQ,GAIZ,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAG,CACvB,CAAA,KAAQ,CAQN,OAAOj2C,CAAAA,CAAS,EAAA,CAAK,OAAYi2C,CACnC,CACF,IAE6B,CAC7B,GAAI,CAACj2C,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMvK,CAAAA,CAAQ,IAAI,MAAM,CAAA,2BAAA,EAA8BuK,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CACvE,MAAAvK,CAAAA,CAAM,MAAA,CAASuK,CAAAA,CAAS,MAAA,CACxBvK,CAAAA,CAAM,IAAA,CAAO7D,EACP6D,CACR,CAEA,GAAI7D,CAAAA,GAAS,MAAA,EAAciyB,IAAY,MAAA,EAAa,CAACA,EAAQjyB,CAAI,CAAA,CAC/D,MAAM,IAAI,KAAA,CAAM,kEAAkE,CAAA,CAGpF,OAAOA,CACT,CAMO,SAASskD,EAAAA,CAAiBtkD,CAAAA,CAAwB,CACvD,OACE,OAAOA,CAAAA,EAAS,QAAA,EAChBA,IAAS,IAAA,EACT,KAAA,CAAM,QAASA,CAAAA,CAA+B,OAAO,CAEzD,CCrEA,IAAMukD,GAAcC,QAAAA,CAAW,CAAA,CAAI,EAe5B,SAASC,EAAAA,CAAkBC,CAAAA,CAAsB7gD,CAAAA,CAAuB,CAC7E,GAAM,CAAE,MAAA,CAAAmM,CAAO,EAAInM,CAAAA,CACb8gD,CAAAA,CAAc30C,IAAW,GAAA,EAAOA,CAAAA,GAAW,IAEjD,OAAIA,CAAAA,GAAW,QAAaA,CAAAA,EAAU,GAAA,EAAOA,EAAS,GAAA,EAAO,CAAC20C,EACrD,KAAA,CAGFD,CAAAA,CAAeH,EACxB,CC7BO,SAASK,EAAAA,CACd/hC,EACApB,CAAAA,CACAqB,CAAAA,CACAC,EACA8hC,CAAAA,CACA5hC,CAAAA,CACA,CACA,OAAO3D,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAA,CAAO,QAAQsD,CAAAA,CAAGpB,CAAAA,CAAMqB,EAASC,CAAAA,CAAO8hC,CAAAA,CAAW5hC,CAAK,CAAA,CAC5E,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAhY,CAAO,IAAM,CAC7B,IAAMjL,EAOF,CAAE,CAAA,CAAA6iB,EAAG,IAAA,CAAApB,CAAAA,CAAM,SAAUqB,CAAQ,CAAA,CAE7BC,IAAO/iB,CAAAA,CAAK,KAAA,CAAQ+iB,GACpB8hC,CAAAA,GAAW7kD,CAAAA,CAAK,UAAY6kD,CAAAA,CAAAA,CAC5B5hC,CAAAA,GAAOjjB,CAAAA,CAAK,KAAA,CAAQijB,CAAAA,CAAAA,CAExB,IAAM7U,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,oBAAA,CAAsB,CACzE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,kBAAmBA,CAAAA,CAAO,QAC5B,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAAA,CACzB,MAAA,CAAQsa,EAAAA,CAAkBQ,EAAAA,CAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAID,OAAO07B,EAAAA,CAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAAA,CACA,MAAOG,EACT,CAAC,CACH,CAOO,SAASK,GACd5hC,CAAAA,CACAhR,CAAAA,CACAsZ,EAAU,IAAA,CACV,CACA,OAAO/B,oBAAAA,CAML,CACA,QAAA,CAAUlK,EAAU,MAAA,CAAO,mBAAA,CAAoB2D,EAAMhR,CAAG,CAAA,CACxD,iBAAkB,CAAE,GAAA,CAAK,MAAA,CAAW,WAAA,CAAa,IAAK,CAAA,CAEtD,QAAS,MAAO,CAAE,UAAAwX,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAqD,CACvF,GAAI,CAACye,CAAAA,CAAU,WAAA,CACb,OAAO,CACL,IAAA,CAAM,EACN,IAAA,CAAM,CAAA,CACN,QAAS,EACX,EAGF,IAAIq7B,CAAAA,CACEn9C,EAAM,IAAI,IAAA,CAEhB,OAAQsK,CAAAA,EACN,KAAK,OAAA,CACH6yC,CAAAA,CAAY,IAAI,IAAA,CAAKn9C,CAAAA,CAAI,OAAA,GAAY,IAAA,CAAU,EAAA,CAAK,GAAI,CAAA,CACxD,MACF,KAAK,MAAA,CACHm9C,CAAAA,CAAY,IAAI,IAAA,CAAKn9C,CAAAA,CAAI,OAAA,GAAY,KAAA,CAAc,EAAA,CAAK,GAAI,CAAA,CAC5D,MACF,KAAK,OAAA,CACHm9C,CAAAA,CAAY,IAAI,IAAA,CAAKn9C,CAAAA,CAAI,OAAA,GAAY,GAAA,CAAU,EAAA,CAAK,GAAK,GAAI,CAAA,CAC7D,MACF,KAAK,MAAA,CACHm9C,EAAY,IAAI,IAAA,CAAKn9C,EAAI,OAAA,EAAQ,CAAI,IAAM,EAAA,CAAK,EAAA,CAAK,GAAK,GAAI,CAAA,CAC9D,MACF,QACEm9C,CAAAA,CAAY,OAChB,CAEA,IAAMliC,CAAAA,CAAI,cACJpB,CAAAA,CAAOyB,CAAAA,GAAS,SAAW,UAAA,CAAaA,CAAAA,CACxCH,CAAAA,CAAQgiC,CAAAA,CAAYA,CAAAA,CAAU,WAAA,GAAc,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAI,OAC5DjiC,CAAAA,CAAU,GAAA,CACVG,CAAAA,CAAQ/Q,CAAAA,GAAQ,OAAA,CAAU,EAAA,CAAK,IAE/BlS,CAAAA,CAOF,CAAE,EAAA6iB,CAAAA,CAAG,IAAA,CAAApB,EAAM,QAAA,CAAUqB,CAAQ,EAE7BC,CAAAA,GAAO/iB,CAAAA,CAAK,MAAQ+iB,CAAAA,CAAAA,CACpB2G,CAAAA,CAAU,MAAK1pB,CAAAA,CAAK,SAAA,CAAY0pB,EAAU,GAAA,CAAA,CAC1CzG,CAAOjjB,CAAAA,CAAK,KAAA,CAAQijB,CAAAA,CAAAA,CAExB,IAAM7U,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,oBAAA,CAAsB,CACzE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,kBAAmBA,CAAAA,CAAO,QAC5B,EACA,IAAA,CAAM,IAAA,CAAK,UAAUpb,CAAI,CAAA,CACzB,MAAA,CAAQsa,EAAAA,CAAkBQ,EAAAA,CAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAID,OAAO07B,EAAAA,CAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAAA,CAEA,iBAAmBl3B,CAAAA,GACV,CACL,IAAKA,CAAAA,EAAM,SAAA,CACX,YAAaA,CAAAA,CAAK,OAAA,CAAQ,OAAS,CACrC,CAAA,CAAA,CAGF,OAAA,CAAA5B,CAAAA,CACA,KAAA,CAAOi5B,EACT,CAAC,CACH,CCzIA,eAAsBd,EAAAA,CACpB9gC,CAAAA,CACApB,CAAAA,CACAqB,CAAAA,CACAC,CAAAA,CACA8hC,EACA5hC,CAAAA,CACAhY,CAAAA,CACyB,CACzB,IAAMjL,CAAAA,CAOF,CAAE,CAAA,CAAA6iB,CAAAA,CAAG,IAAA,CAAApB,CAAAA,CAAM,QAAA,CAAUqB,CAAQ,EAE7BC,CAAAA,GACF/iB,CAAAA,CAAK,MAAQ+iB,CAAAA,CAAAA,CAEX8hC,CAAAA,GACF7kD,EAAK,SAAA,CAAY6kD,CAAAA,CAAAA,CAEf5hC,IACFjjB,CAAAA,CAAK,KAAA,CAAQijB,GAIf,IAAM7U,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,oBAAA,CAAsB,CAC5E,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,kBAAmBA,CAAAA,CAAO,QAC5B,EACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAAA,CACzB,MAAA,CAAQsa,GAAkBQ,EAAAA,CAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAED,OAAO07B,EAAAA,CAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAEA,eAAsBU,GACpBt6C,CAAAA,CAQAO,CAAAA,CACAsP,EAAoBO,EAAAA,CACK,CAEzB,IAAM1M,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,qBAAA,CAAuB,CAC7E,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,iBAAA,CAAmBA,CAAAA,CAAO,QAC5B,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU1Q,CAAM,CAAA,CAC3B,MAAA,CAAQ4P,GAAkBC,CAAAA,CAAWtP,CAAM,CAC7C,CAAC,CAAA,CAED,OAAO07B,EAAAA,CAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAEA,eAAsBW,EAAAA,CAAWpiC,CAAAA,CAAW5X,CAAAA,CAAyC,CAEnF,IAAMmD,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,EAAO,cAAA,CAAiB,yBAAA,CAA2B,CACjF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,mBAChB,iBAAA,CAAmBA,CAAAA,CAAO,QAC5B,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,CAAA,CAAAyH,CAAE,CAAC,CAAA,CAC1B,OAAQvI,EAAAA,CAAkBQ,EAAAA,CAAyB7P,CAAM,CAC3D,CAAC,EAEKjL,CAAAA,CAAO,MAAM2mC,EAAAA,CAA4Bv4B,CAAAA,CAAU,KAAA,CAAM,OAAO,EACtE,OAAOpO,CAAAA,EAAM,OAAS,CAAA,CAAIA,CAAAA,CAAO,CAAC6iB,CAAC,CACrC,CC7EA,IAAMqiC,EAAAA,CAA2B,IAAA,CAAW,GAAK,EAAA,CAAK,GAAA,CAGhDC,GAAyB,CAAA,CAIzBC,EAAAA,CAA6B,IAO7BC,EAAAA,CAAiC,GAAA,CASjCC,GAAoC,GAAA,CAI7BC,EAAAA,CAA6B,EAK1C,SAASC,EAAAA,CAAa16C,EAAc9M,CAAAA,CAAuB,CACzD,OAAO8M,CAAAA,CACJ,OAAA,CAAQ,uBAAA,CAAyB,GAAG,CAAA,CACpC,OAAA,CAAQ,yBAA0B,IAAI,CAAA,CACtC,QAAQ,UAAA,CAAY,GAAG,EACvB,OAAA,CAAQ,iBAAA,CAAmB,GAAG,CAAA,CAC9B,OAAA,CAAQ,MAAA,CAAQ,GAAG,CAAA,CACnB,IAAA,GACA,KAAA,CAAM,CAAA,CAAG9M,CAAK,CACnB,CAMA,SAASynD,EAAAA,CAAY9pD,CAAAA,CAAmB,CACtC,IAAI6L,CAAAA,CAAI,IAAA,CACR,QAAS3L,CAAAA,CAAI,CAAA,CAAGA,EAAIF,CAAAA,CAAE,MAAA,CAAQE,IAC5B2L,CAAAA,CAAAA,CAAMA,CAAAA,EAAK,GAAKA,CAAAA,CAAI7L,CAAAA,CAAE,WAAWE,CAAC,CAAA,CAAK,EAEzC,OAAA,CAAQ2L,CAAAA,GAAM,CAAA,EAAG,QAAA,CAAS,EAAE,CAC9B,CAgBO,SAASk+C,EAAAA,CAA8Bl7B,EAAc,CAC1D,IAAM2H,EAAQ3H,CAAAA,CAAM,KAAA,EAAS,EAAA,CAKvBm7B,CAAAA,CAAUn7B,CAAAA,CAAM,aAAA,EAAe,KAC/BsB,CAAAA,CAAAA,CAAQ,KAAA,CAAM,QAAQ65B,CAAO,CAAA,CAAIA,EAAU,EAAC,EAAG,MAAA,CAClDzzC,CAAAA,EAAuB,OAAOA,CAAAA,EAAQ,UAAYA,CAAAA,GAAQ,EAC7D,EACMpH,CAAAA,CAAO06C,EAAAA,CAAah7B,EAAM,IAAA,EAAQ,EAAA,CAAI46B,EAA0B,CAAA,CAChEQ,CAAAA,CAAaH,GAAY,CAAA,EAAGtzB,CAAK,IAAIrG,CAAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAIhhB,CAAI,CAAA,CAAE,CAAA,CAEnE,OAAOwU,aAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,cAAA,CAAeiL,EAAM,MAAA,CAAQA,CAAAA,CAAM,QAAA,CAAUo7B,CAAU,CAAA,CAClF,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA36C,CAAO,CAAA,GAAM,CAG7B,IAAM8X,CAAAA,CAAQ,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,CAAImiC,EAAwB,CAAA,CAAE,WAAA,GAAc,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAMjF92C,CAAAA,CAAW,MAAM42C,EAAAA,CACrB,CACE,OAAQx6B,CAAAA,CAAM,MAAA,CACd,SAAUA,CAAAA,CAAM,QAAA,CAChB,MAAA2H,CAAAA,CACA,IAAA,CAAArnB,CAAAA,CACA,IAAA,CAAAghB,CAAAA,CACA,KAAA,CAAA/I,CACF,CAAA,CACA9X,CAAAA,CAIA,OAAO,MAAA,CAAW,GAAA,CACdo6C,GACAC,EACN,CAAA,CAIMO,CAAAA,CAA4B,EAAC,CAC7BC,CAAAA,CAAc,IAAI,GAAA,CACxB,IAAA,IAAWpmD,KAAK0O,CAAAA,CAAS,OAAA,CAAS,CAChC,GAAIy3C,CAAAA,CAAU,MAAA,EAAUV,EAAAA,CAAwB,MAC5CzlD,CAAAA,CAAE,WAAa8qB,CAAAA,CAAM,QAAA,EAAA,CACpB9qB,EAAE,IAAA,EAAQ,IAAI,OAAA,CAAQ,MAAM,IAAM,EAAA,GACnComD,CAAAA,CAAY,IAAIpmD,CAAAA,CAAE,MAAM,IAC5BomD,CAAAA,CAAY,GAAA,CAAIpmD,EAAE,MAAM,CAAA,CACxBmmD,CAAAA,CAAU,IAAA,CAAKnmD,CAAC,CAAA,CAAA,EAClB,CAEA,OAAOmmD,CACT,EAWA,SAAA,CAAW,GAAA,CAAS,IAKpB,KAAA,CAAO,KACT,CAAC,CACH,CClJO,SAASE,EAAAA,CAA6BljC,CAAAA,CAAW7kB,EAAQ,CAAA,CAAG,CACjE,IAAM41B,CAAAA,CAAa/Q,CAAAA,CAAE,IAAA,GAErB,OAAOvD,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,OAAO,OAAA,CAAQqU,CAAAA,CAAY51B,CAAK,CAAA,CACpD,OAAA,CAAS,SAAgC,CACvC,IAAM6jB,EAAa,MAAMhV,CAAAA,CAAQ,gCAAiC,CAChE+mB,CAAAA,CACA51B,CACF,CAAC,CAAA,CAED,OAAI6jB,EAAU,MAAA,GAAW,CAAA,CAChB,EAAC,CAGHgN,EAAAA,CAAYhN,CAAS,CAC9B,CAAA,CACA,OAAA,CAAS,CAAC,CAAC+R,CACb,CAAC,CACH,CCpBO,SAASoyB,EAAAA,CAA4BnjC,CAAAA,CAAW7kB,CAAAA,CAAQ,EAAA,CAAI,CACjE,IAAM41B,CAAAA,CAAa/Q,CAAAA,CAAE,MAAK,CAE1B,OAAOvD,aAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,MAAA,CAAOqU,EAAY51B,CAAK,CAAA,CACnD,QAAS,SAAA,CACO,MAAM6O,EAAQ,iCAAA,CAAmC,CAC7D+mB,CAAAA,CACA51B,CAAAA,CAAQ,CACV,CAAC,GAGE,GAAA,CAAK0/C,CAAAA,EAAMA,EAAE,IAAI,CAAA,CACjB,OAAQj7B,CAAAA,EAASA,CAAAA,GAAS,EAAA,EAAM,CAACA,CAAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA,CACzD,MAAM,CAAA,CAAGzkB,CAAK,EAEnB,OAAA,CAAS,CAAC,CAAC41B,CACb,CAAC,CACH,CCjBO,SAASqyB,GACdpjC,CAAAA,CACApB,CAAAA,CACAqB,EACAC,CAAAA,CACAE,CAAAA,CACAG,EACA,CACA,OAAOqG,qBAAqB,CAC1B,QAAA,CAAUlK,EAAU,MAAA,CAAO,GAAA,CAAIsD,CAAAA,CAAGpB,CAAAA,CAAMqB,CAAAA,CAASC,CAAAA,CAAOE,EAAOG,CAAW,CAAA,CAC1E,QAAS,MAAO,CAAE,UAAAsG,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAA8D,CAWhG,IAAM8O,EAA4B,CAAE,CAAA,CAAA8I,EAAG,IAAA,CAAApB,CAAAA,CAAM,SAAUqB,CAAQ,CAAA,CAE3DC,CAAAA,GACFhJ,CAAAA,CAAQ,KAAA,CAAQgJ,CAAAA,CAAAA,CAEd2G,IACF3P,CAAAA,CAAQ,SAAA,CAAY2P,GAElBzG,CAAAA,GAAU,MAAA,GACZlJ,EAAQ,KAAA,CAAQkJ,CAAAA,CAAAA,CAEdG,IACFrJ,CAAAA,CAAQ,YAAA,CAAe,GAGzB,IAAM3L,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,oBAAA,CAAsB,CACzE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAAA,CAChB,iBAAA,CAAmBA,EAAO,QAC5B,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUrB,CAAO,CAAA,CAC5B,MAAA,CAAQO,EAAAA,CAAkBQ,GAAyB7P,CAAM,CAC3D,CAAC,CAAA,CAID,OAAO07B,GAAkCv4B,CAAAA,CAAUk2C,EAAgB,CACrE,CAAA,CACA,gBAAA,CAAkB,MAAA,CAClB,iBAAmB16B,CAAAA,EAA6BA,CAAAA,EAAU,UAC1D,OAAA,CAAS,CAAC,CAAC/G,CAAAA,CACX,KAAA,CAAO4hC,EACT,CAAC,CACH,CC1DO,SAASyB,GAA0BrjC,CAAAA,CAAW,CACnD,OAAOvD,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQuD,CAAC,CAAA,CAC9B,OAAA,CAAS,SAAY,CACnB,IAAMzU,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,yBAAA,CAA2B,CAC9E,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,iBAAA,CAAmBA,CAAAA,CAAO,QAC5B,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,CAAA,CAAAyH,CAAE,CAAC,CAC5B,CAAC,EAED,GAAI,CAACzU,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuBA,EAAS,MAAM,CAAA,CAAE,CAAA,CAG1D,IAAMpO,CAAAA,CAAO,MAAMoO,EAAS,IAAA,EAAK,CAEjC,OAAIpO,CAAAA,EAAM,MAAA,CAAS,EACVA,CAAAA,CAGF,CAAC6iB,CAAC,CACX,CACF,CAAC,CACH,CCnBA,eAAsBsjC,EAAAA,CAA0B//C,CAAAA,CAAwC,CAEtF,IAAMgI,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,+BAAA,CAAiC,CACvF,OAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,EAC9C,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAC/B,CAAC,CAAA,CAED,GAAI,CAACgI,EAAS,EAAA,CAAI,CAChB,IAAIpO,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,GACxB,CAAA,KAAQ,CAER,CACA,IAAM7N,EACHP,CAAAA,EAA+B,OAAA,EAChC,qCAAqCoO,CAAAA,CAAS,MAAM,CAAA,CAAA,CAChDtE,CAAAA,CAAM,IAAI,KAAA,CAAMvJ,CAAO,CAAA,CAC7B,MAAAuJ,EAAI,MAAA,CAASsE,CAAAA,CAAS,OACtBtE,CAAAA,CAAI,IAAA,CAAO9J,EACL8J,CACR,CAEA,OAAQ,MAAMsE,CAAAA,CAAS,MACzB,CAOO,SAASg4C,EAAAA,CACdx1C,CAAAA,CACAxK,CAAAA,CACA,CACA,IAAMqc,CAAAA,CAAO7R,GAAU,OAAA,CAAQ,GAAA,CAAK,EAAE,CAAA,CAEtC,OAAO0O,aAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,OAAA,CAAQ,QAAA,CAASkD,CAAI,EACzC,OAAA,CAAS,IAAM,CACb,GAAI,CAACrc,EACH,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAAA,CAE/C,OAAO+/C,GAA0B//C,CAAI,CACvC,EACA,OAAA,CAAS,CAAC,CAACqc,CAAAA,EAAQ,CAAC,CAACrc,CACvB,CAAC,CACH,CC/CA,eAAsBigD,EAAAA,CACpBjgD,CAAAA,CACA2T,CAAAA,CAC0B,CAE1B,IAAM3L,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,sCAAA,CAAwC,CAC9F,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,eAAgB,kBAAmB,CAAA,CAC9C,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,mBAAA,CAAqB2T,CAAAA,CAAQ,mBAAA,CAC7B,gBAAA,CAAkBA,EAAQ,gBAC5B,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAAC3L,CAAAA,CAAS,GAAI,CAChB,IAAIpO,EACJ,GAAI,CACFA,EAAO,MAAMoO,CAAAA,CAAS,OACxB,CAAA,KAAQ,CAER,CACA,IAAM7N,CAAAA,CACHP,GAA+B,OAAA,EAChC,CAAA,mCAAA,EAAsCoO,EAAS,MAAM,CAAA,CAAA,CACjDtE,EAAM,IAAI,KAAA,CAAMvJ,CAAO,CAAA,CAC7B,MAAAuJ,CAAAA,CAAI,OAASsE,CAAAA,CAAS,MAAA,CACtBtE,EAAI,IAAA,CAAO9J,CAAAA,CACL8J,CACR,CAEA,OAAQ,MAAMsE,CAAAA,CAAS,IAAA,EACzB,CAOO,SAASk4C,EAAAA,CACdhwB,EACA1lB,CAAAA,CACA5Q,CAAAA,CACA,CACA,OAAAs2B,CAAAA,CAAY,aAAa/W,CAAAA,CAAU,OAAA,CAAQ,SAAS3O,CAAQ,CAAA,CAAG5Q,CAAI,CAAA,CAC5Ds2B,CAAAA,CAAY,kBAAkB,CAAE,QAAA,CAAU/W,CAAAA,CAAU,OAAA,CAAQ,QAAA,CAAS3O,CAAQ,CAAE,CAAC,CACzF,CAQO,SAAS21C,EAAAA,CACd31C,EACAxK,CAAAA,CACA,CACA,IAAMkwB,CAAAA,CAAcC,cAAAA,EAAe,CAC7B9T,EAAO7R,CAAAA,EAAU,OAAA,CAAQ,IAAK,EAAE,CAAA,CAEtC,OAAOkJ,WAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,SAAA,CAAW,iBAAA,CAAmB2I,CAAI,CAAA,CAChD,UAAA,CAAY,MAAO1I,CAAAA,EAA0C,CAC3D,GAAI,CAAC0I,CAAAA,EAAQ,CAACrc,CAAAA,CACZ,MAAM,IAAI,KAAA,CAAM,6BAA6B,EAE/C,OAAOigD,EAAAA,CAA6BjgD,EAAM2T,CAAO,CACnD,CAAA,CACA,SAAA,CAAU/Z,CAAAA,CAAM,CACVyiB,GACF6jC,EAAAA,CAA2BhwB,CAAAA,CAAa7T,EAAMziB,CAAI,EAEtD,CACF,CAAC,CACH,CClFO,SAASwmD,EAAAA,CAA+BvsC,EAAqB,CAClE,OAAOqF,aAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,mBAAmB,CAAA,CAC5C,QAAS,SAAY,CACnB,GAAI,CAACrF,CAAAA,CACH,OAAO,EAAC,CAGV,IAAM7L,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,gCAAiC,CACpF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAMnB,CAAY,CAAC,CAC5C,CAAC,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,sCAAsCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAGzE,OAAO,MAAMA,CAAAA,CAAS,IAAA,EACxB,EACA,SAAA,CAAW,CAAA,CAAA,CAAA,CACX,QAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCpBO,SAASwsC,GAAkCxsC,CAAAA,CAAqB,CACrE,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,sBAAsB,EAC/C,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrF,EACH,OAAO,EAAC,CAGV,IAAM7L,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,mCAAoC,CACvF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAMnB,CAAY,CAAC,CAC5C,CAAC,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG5E,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAAA,CACA,SAAA,CAAW,IACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCrBO,SAASysC,GAAkC91C,CAAAA,CAAkBqJ,CAAAA,CAAqB,CACvF,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,uBAAwB1O,CAAQ,CAAA,CACzD,QAAS,SAAgD,CACvD,GAAI,CAACqJ,CAAAA,EAAe,CAACrJ,CAAAA,CACnB,OAAO,KAGT,IAAMxC,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,mCAAA,CAAqC,CACxF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAAA,CAAa,QAAA,CAAArJ,CAAS,CAAC,CACtD,CAAC,CAAA,CAED,GAAI,CAACxC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAG5E,IAAMu4C,CAAAA,CAAgB,MAAMv4C,CAAAA,CAAS,IAAA,GAErC,OAAOu4C,CAAAA,EAAgBA,EAAa,OAAA,EAAWA,CAAAA,CAAa,KACxD,CAAE,IAAA,CAAMA,EAAa,IAAA,CAAM,OAAA,CAAS,IAAI,IAAA,CAAKA,CAAAA,CAAa,OAAO,CAAE,CAAA,CACnE,IACN,EACA,OAAA,CAAS,CAAC,CAAC/1C,CAAAA,EAAY,CAAC,CAACqJ,CAC3B,CAAC,CACH,CCrCO,SAAS2sC,GAA4B3sC,CAAAA,CAAqB,CAC/D,OAAOqF,YAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAA,CAAc,eAAe,EACxC,OAAA,CAAS,SAAY,CACnB,IAAMlR,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,4BAAA,CAA8B,CACjF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,CAAY,CAAC,CAC5C,CAAC,EAED,GAAI,CAAC7L,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGtE,OAAO,MAAMA,CAAAA,CAAS,MACxB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CChBO,SAAS4sC,EAAAA,CAAsCjwC,EAAiBqD,CAAAA,CAAqB,CAC1F,OAAOqF,YAAAA,CAAa,CAClB,SAAU,CAAC,YAAA,CAAc,sBAAuB1I,CAAO,CAAA,CACvD,OAAA,CAAS,SAAmD,CAC1D,GAAI,CAACqD,CAAAA,EAAe,CAACrD,EACnB,OAAO,IAAA,CAGT,IAAMxI,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,cAAA,CAAiB,mCAAA,CAAqC,CACxF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,IAAA,CAAMnB,EAAa,OAAA,CAAArD,CAAQ,CAAC,CACrD,CAAC,EAED,GAAI,CAACxI,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8CA,EAAS,MAAM,CAAA,CAAE,EAGjF,IAAMu4C,CAAAA,CAAe,MAAMv4C,CAAAA,CAAS,IAAA,EAAK,CAKzC,OAAOu4C,CAAAA,CACH,CACE,QAASA,CAAAA,CAAa,OAAA,CACtB,QAAS,IAAI,IAAA,CAAKA,CAAAA,CAAa,OAAO,CACxC,CAAA,CACA,IACN,CAAA,CACA,OAAA,CAAS,CAAC,CAAC/vC,CAAAA,EAAW,CAAC,CAACqD,CAC1B,CAAC,CACH,CChCO,SAAS6sC,GACdl2C,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,YAAA,CAAc,YAAY,CAAA,CAC3B/I,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAgG,EAAS,QAAA,CAAAiG,CAAS,IAAM,CACzBkiB,EAAAA,CAAiBnuB,CAAAA,CAAWgG,CAAAA,CAASiG,CAAQ,CAC/C,EACA,MAAO2Z,CAAAA,CAAO,CAAE,OAAA,CAAA5f,CAAQ,IAAM,CACxByB,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,UAAA,CAAW,iBAAA,CAAkB3I,CAAO,CAChD,CAAC,EAEL,CAAA,CACAyB,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CClBO,SAASsuC,GACdn2C,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,YAAA,CAAc,eAAe,CAAA,CAC9B/I,CAAAA,CACA,CAAC,CAAE,QAAA,CAAAiM,CAAS,IAAM,CAACmiB,EAAAA,CAAoBpuB,EAAWiM,CAAQ,CAAC,CAAA,CAC3D,SAAY,CACNxE,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,gBAAgB,OAAA,CAAQ3O,CAAS,EAC3C,CAAC,YAAA,CAAc,uBAAwBA,CAAQ,CACjD,CAAC,EAEL,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CChCA,eAAsBuuC,EAAAA,CAAa5gD,CAAAA,CAA6C,CAE9E,IAAMgI,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,6BAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAAhV,CAAK,CAAC,CAC/B,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAIpO,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,IAAA,GACxB,CAAA,KAAQ,CACNpO,EAAO,OACT,CACA,IAAM6D,CAAAA,CAAQ,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4BuK,CAAAA,CAAS,MAAM,EAAE,CAAA,CACrE,MAAAvK,EAAM,MAAA,CAASuK,CAAAA,CAAS,OACxBvK,CAAAA,CAAM,IAAA,CAAO7D,CAAAA,CACP6D,CACR,CAGA,OADc,MAAMuK,CAAAA,CAAS,IAAA,EAE/B,CC3BA,IAAM64C,EAAAA,CACJ,4FAAA,CAEK,SAASC,IAA2B,CACzC,OAAO5nC,aAAa,CAClB,QAAA,CAAUC,EAAU,SAAA,CAAU,IAAA,GAC9B,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAtU,CAAO,IAAM,CAC7B,IAAMmD,EAAW,MAAM,KAAA,CAAM64C,EAAAA,CAAgB,CAAE,MAAA,CAAAh8C,CAAO,CAAC,CAAA,CAEvD,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGvE,IAAMjI,CAAAA,CAAO,MAAMiI,CAAAA,CAAS,IAAA,GAC5B,OAAO,IAAI,GAAA,CAAIjI,CAAAA,CAAK,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,OAAO,OAAO,CAAC,CACjD,CAAA,CACA,SAAA,CAAW,IAAA,CAAU,EAAA,CAAK,GAAA,CAY1B,MAAA,CAAQ,GACV,CAAC,CACH,CCjCO,IAAMghD,EAAAA,CAAyB,GAAA,CAE1BC,QACVA,CAAAA,CAAA,eAAA,CAAkB,iBAAA,CAClBA,CAAAA,CAAA,MAAA,CAAS,QAAA,CAFCA,QAAA,EAAA,EA4DL,SAASC,EAAAA,CAA4BC,CAAAA,CAAqC,CAC/E,OAAKA,EAIEA,CAAAA,CAAY,GAAA,CAAI,CAACC,CAAAA,CAAQlhB,CAAAA,IAAW,CACzC,WAAYA,CAAAA,CAAQ,CAAA,CACpB,WAAA,CAAakhB,CAAAA,CACb,KAAA,CAAO,CACL,YAAa,CAAA,CACb,OAAA,CAAS,CAAA,CACT,eAAA,CAAiB,CAAA,CACjB,oBAAA,CAAsB,CACxB,CACF,CAAA,CAAE,EAZO,EAaX,CCxEA,SAASC,EAAAA,CAAcnD,CAAAA,CAAoC,CACzD,IAAMoD,CAAAA,CAAepD,CAAAA,CAAI,cAA0D,EAAC,CAC9EqD,CAAAA,CAAcrD,CAAAA,CAAI,WAAA,EAAyD,GAC3EsD,CAAAA,CAAWtD,CAAAA,CAAI,UAAA,CAEfuD,CAAAA,CAAwBH,CAAAA,CAAY,GAAA,CAAK3rD,GAAM,CACnD,IAAMmnB,CAAAA,CAAQnnB,CAAAA,CAAE,KAAA,CAChB,OAAO,CACL,UAAA,CAAaA,CAAAA,CAAE,UAAA,EAAyB,CAAA,CACxC,WAAA,CAAcA,CAAAA,CAAE,aAA0B,EAAA,CAC1C,KAAA,CAAOmnB,CAAAA,CACH,CACE,WAAA,CAAcA,CAAAA,CAAM,aAA0B,CAAA,CAC9C,OAAA,CAASA,EAAM,OAAA,CACf,eAAA,CAAiBA,EAAM,eAAA,CACvB,oBAAA,CAAuBA,CAAAA,CAAM,oBAAA,EAA0C,IACzE,CAAA,CACA,MACN,CACF,CAAC,CAAA,CAEK4kC,CAAAA,CAAsBH,CAAAA,CAAW,GAAA,CAAK9nD,IAAO,CACjD,IAAA,CAAOA,CAAAA,CAAE,IAAA,EAAmB,EAAA,CAC5B,OAAA,CAAUA,EAAE,OAAA,EAAwB,EAAC,CACrC,OAAA,CAASA,CAAAA,CAAE,OAAA,CACX,gBAAiBA,CAAAA,CAAE,eAAA,CACnB,oBAAA,CAAsBA,CAAAA,CAAE,oBAC1B,CAAA,CAAE,EAEIimB,CAAAA,CAA+B8hC,CAAAA,CACjC,CACE,yBAAA,CAA4BA,CAAAA,CAAS,yBAAA,EAAwC,EAC7E,aAAA,CAAeA,CAAAA,CAAS,aAAA,CACxB,qBAAA,CAAuBA,CAAAA,CAAS,qBAAA,CAChC,2BAA6BA,CAAAA,CAAS,0BAAA,EAAgD,IACxF,CAAA,CACA,MAAA,CAEJ,OAAO,CACL,MAAA,CAAStD,CAAAA,CAAI,MAAA,EAAqB,EAAA,CAClC,QAAA,CAAWA,EAAI,QAAA,EAAuB,EAAA,CACtC,QAAA,CAAWA,CAAAA,CAAI,QAAA,EAAuB,EAAA,CACtC,aAAcuD,CAAAA,CACd,WAAA,CAAaC,CAAAA,CACb,UAAA,CAAYhiC,CAAAA,CACZ,WAAA,CAAcw+B,EAAI,WAAA,EAA0B,EAAA,CAC5C,MAAA,CAASA,CAAAA,CAAI,MAAA,EAAqB,EAAA,CAClC,SAAWA,CAAAA,CAAI,QAAA,EAAuB,EAAA,CACtC,wBAAA,CAA2BA,CAAAA,CAAI,wBAAA,EAAuC,kBACtE,iBAAA,CAAoBA,CAAAA,CAAI,iBAAA,EAAgC,CAAA,CACxD,uBAAA,CAA0BA,CAAAA,CAAI,yBAAsC,CAAA,CACpE,gBAAA,CAAmBA,CAAAA,CAAI,gBAAA,EAA+B,CAAA,CACtD,OAAA,CAAUA,EAAI,OAAA,EAAsB,EAAA,CACpC,WAAaA,CAAAA,CAAI,UAAA,EAAyB,GAC1C,SAAA,CAAYA,CAAAA,CAAI,SAAA,EAAwB,EAAA,CACxC,eAAA,CAAkBA,CAAAA,CAAI,iBAA8B,EAAA,CACpD,IAAA,CAAOA,CAAAA,CAAI,IAAA,EAAqB,EAAC,CACjC,MAAQA,CAAAA,CAAI,KAAA,EAAuB,EAAC,CACpC,KAAA,CAAOA,CAAAA,CAAI,MACX,oBAAA,CAAsBA,CAAAA,CAAI,oBAAA,CAC1B,kBAAA,CAAoBA,CAAAA,CAAI,kBAAA,CACxB,wBAA0BA,CAAAA,CAAI,uBAAA,EAAmD,KAAA,CACjF,QAAA,CAAUA,CAAAA,CAAI,QAChB,CACF,CAEO,SAASyD,EAAAA,CACd3mC,CAAAA,CACAC,CAAAA,CACA,CACA,OAAO9B,YAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,OAAA,CAAQ4B,GAAU,EAAA,CAAIC,CAAAA,EAAY,EAAE,CAAA,CAC9D,OAAA,CAAS,CAAC,CAACD,CAAAA,EAAU,CAAC,CAACC,CAAAA,CAIvB,MAAA,CAAQojC,SAAWzpC,EAAAA,CAAoB,IAAA,CAAU,GAAA,CACjD,OAAA,CAAS,SAA2B,CAClC,GAAI,CAACoG,CAAAA,EAAU,CAACC,CAAAA,CACd,MAAM,IAAI,MAAM,gDAA2C,CAAA,CAG7D,IAAM2mB,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBpU,EAAM,CAAA,EAAG2Q,CAAAA,CAAO,YAAY,CAAA,oBAAA,EAAuB,kBAAA,CAAmB+F,CAAM,CAAC,CAAA,aAAA,EAAgB,kBAAA,CAAmBC,CAAQ,CAAC,CAAA,CAAA,CACzHhT,CAAAA,CAAW,MAAM25B,CAAAA,CAASt9B,CAAG,CAAA,CAEnC,GAAI,CAAC2D,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,kCAAA,EAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,IAAMpO,CAAAA,CAAO,MAAMoO,CAAAA,CAAS,MAAK,CAEjC,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQpO,CAAI,GAAK,CAACA,CAAAA,CAAK,CAAC,CAAA,CACjC,MAAM,IAAI,MAAM,wCAAmC,CAAA,CAGrD,OAAOwnD,EAAAA,CAAcxnD,CAAAA,CAAK,CAAC,CAAC,CAC9B,CACF,CAAC,CACH,CChGO,SAAS+nD,GACdn3C,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL4F,EAAU,KAAA,CAAM,IAAA,EAAK,CACrB3O,CAAAA,EAAY,EAAA,CACZ,CAAC,CAAE,SAAA,CAAAo3C,CAAAA,CAAW,QAAAJ,CAAQ,CAAA,GAAM,CAC1B,GAAI,CAACh3C,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAE9E,OAAO,CACL,CACE,aAAA,CACA,CACE,GAAI,OAAA,CACJ,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACA,CAAQ,CAAA,CACjC,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAMo3C,EACN,MAAA,CAAQ,MAAA,CACR,OAAA,CAAAJ,CACF,CAAC,CACH,CACF,CACF,CACF,CAAA,CACA,MAAA,CACAvvC,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF","file":"index.mjs","sourcesContent":["/**\n * @license bytebuffer.ts (c) 2015 Daniel Wirtz \n * Backing buffer: ArrayBuffer, Accessor: DataView\n * Released under the Apache License, Version 2.0\n * see: https://github.com/dcodeIO/bytebuffer.ts for details\n * modified by @xmcl/bytebuffer\n * And customized for hive-tx\n */\n\nconst EMPTY_BUFFER = new ArrayBuffer(0)\n\n// Lazy-init to avoid crashing on runtimes that lack TextEncoder/TextDecoder\n// (notably React Native with Hermes). Falls back to manual UTF-8 encode/decode.\nlet _encoder: { encode(s: string): Uint8Array } | null = null\nlet _decoder: { decode(b: BufferSource): string } | null = null\n\nfunction getEncoder(): { encode(s: string): Uint8Array } {\n if (!_encoder) {\n if (typeof TextEncoder !== 'undefined') {\n _encoder = new TextEncoder()\n } else {\n _encoder = {\n encode(s: string): Uint8Array {\n // Manual UTF-8 encode fallback\n const utf8: number[] = []\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i)\n if (c < 0x80) {\n utf8.push(c)\n } else if (c < 0x800) {\n utf8.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {\n const next = s.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n utf8.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n utf8.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n return new Uint8Array(utf8)\n },\n }\n }\n }\n return _encoder\n}\n\nfunction getDecoder(): { decode(b: BufferSource): string } {\n if (!_decoder) {\n if (typeof TextDecoder !== 'undefined') {\n _decoder = new TextDecoder()\n } else {\n _decoder = {\n decode(b: BufferSource): string {\n const bytes = b instanceof ArrayBuffer ? new Uint8Array(b) : new Uint8Array((b as ArrayBufferView).buffer, (b as ArrayBufferView).byteOffset, (b as ArrayBufferView).byteLength)\n let result = ''\n for (let i = 0; i < bytes.length; ) {\n const byte = bytes[i]\n let codePoint: number\n if (byte < 0x80) { codePoint = byte; i += 1 }\n else if ((byte & 0xe0) === 0xc0) { codePoint = ((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f); i += 2 }\n else if ((byte & 0xf0) === 0xe0) { codePoint = ((byte & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f); i += 3 }\n else { codePoint = ((byte & 0x07) << 18) | ((bytes[i + 1] & 0x3f) << 12) | ((bytes[i + 2] & 0x3f) << 6) | (bytes[i + 3] & 0x3f); i += 4 }\n if (codePoint <= 0xffff) { result += String.fromCharCode(codePoint) }\n else { codePoint -= 0x10000; result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff)) }\n }\n return result\n },\n }\n }\n }\n return _decoder\n}\n\nexport class ByteBuffer {\n static LITTLE_ENDIAN = true\n static BIG_ENDIAN = false\n static DEFAULT_CAPACITY = 16\n static DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN\n\n buffer: ArrayBufferLike\n view: DataView\n offset: number\n markedOffset: number\n limit: number\n littleEndian: boolean\n\n constructor(\n capacity: number = ByteBuffer.DEFAULT_CAPACITY,\n littleEndian: boolean = ByteBuffer.DEFAULT_ENDIAN\n ) {\n this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity)\n this.view = capacity === 0 ? new DataView(EMPTY_BUFFER) : new DataView(this.buffer)\n this.offset = 0\n this.markedOffset = -1\n this.limit = capacity\n this.littleEndian = littleEndian\n }\n\n static allocate(capacity?: number, littleEndian?: boolean): ByteBuffer {\n return new ByteBuffer(capacity, littleEndian)\n }\n\n static concat(\n buffers: Array,\n littleEndian?: boolean\n ): ByteBuffer {\n let capacity = 0\n for (let i = 0; i < buffers.length; ++i) {\n const buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n capacity += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n capacity += buf.length\n } else if (buf instanceof ArrayBuffer) {\n capacity += buf.byteLength\n } else if (Array.isArray(buf)) {\n capacity += buf.length\n } else {\n throw TypeError('Illegal buffer')\n }\n }\n\n if (capacity === 0) {\n return new ByteBuffer(0, littleEndian)\n }\n\n const bb = new ByteBuffer(capacity, littleEndian)\n const view = new Uint8Array(bb.buffer)\n let offset = 0\n\n for (let i = 0; i < buffers.length; ++i) {\n let buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n view.set(new Uint8Array(buf.buffer, buf.offset, buf.limit - buf.offset), offset)\n offset += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n view.set(buf, offset)\n offset += buf.length\n } else if (buf instanceof ArrayBuffer) {\n view.set(new Uint8Array(buf), offset)\n offset += buf.byteLength\n } else {\n // Array\n view.set(buf as number[], offset)\n offset += (buf as number[]).length\n }\n }\n\n bb.limit = bb.offset = offset\n bb.offset = 0\n return bb\n }\n\n static wrap(\n buffer: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n littleEndian?: boolean\n ): ByteBuffer {\n if (buffer instanceof ByteBuffer) {\n const bb = buffer.clone()\n bb.markedOffset = -1\n return bb\n }\n\n let bb: ByteBuffer\n if (buffer instanceof Uint8Array) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.length > 0) {\n bb.buffer = buffer.buffer\n bb.offset = buffer.byteOffset\n bb.limit = buffer.byteOffset + buffer.byteLength\n bb.view = new DataView(buffer.buffer)\n }\n } else if (buffer instanceof ArrayBuffer) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.byteLength > 0) {\n bb.buffer = buffer\n bb.offset = 0\n bb.limit = buffer.byteLength\n bb.view = buffer.byteLength > 0 ? new DataView(buffer) : new DataView(EMPTY_BUFFER)\n }\n } else if (Array.isArray(buffer)) {\n bb = new ByteBuffer(buffer.length, littleEndian)\n bb.limit = buffer.length\n new Uint8Array(bb.buffer).set(buffer)\n } else {\n throw TypeError('Illegal buffer')\n }\n\n return bb\n }\n\n writeBytes(\n source: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n offset?: number\n ): ByteBuffer {\n return this.append(source, offset)\n }\n\n writeInt8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setInt8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeByte(value: number, offset?: number): ByteBuffer {\n return this.writeInt8(value, offset)\n }\n\n writeUint8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setUint8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeUInt8(value: number, offset?: number): ByteBuffer {\n return this.writeUint8(value, offset)\n }\n\n readUint8(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint8(offset)\n if (relative) this.offset += 1\n return value\n }\n\n readUInt8(offset?: number): number {\n return this.readUint8(offset)\n }\n\n writeInt16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setInt16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeShort(value: number, offset?: number): ByteBuffer {\n return this.writeInt16(value, offset)\n }\n\n writeUint16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setUint16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeUInt16(value: number, offset?: number): ByteBuffer {\n return this.writeUint16(value, offset)\n }\n\n writeInt32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setInt32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeInt(value: number, offset?: number): ByteBuffer {\n return this.writeInt32(value, offset)\n }\n\n writeUint32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setUint32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeUInt32(value: number, offset?: number): ByteBuffer {\n return this.writeUint32(value, offset)\n }\n\n readUint32(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint32(offset, this.littleEndian)\n if (relative) {\n this.offset += 4\n }\n return value\n }\n\n readUInt32 = this.readUint32\n\n append(source: ByteBuffer | ArrayBuffer | Uint8Array | number[], offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n let src: Uint8Array\n if (source instanceof ByteBuffer) {\n src = new Uint8Array(source.buffer, source.offset, source.limit - source.offset)\n source.offset += src.length\n } else if (source instanceof Uint8Array) {\n src = source\n } else if (source instanceof ArrayBuffer) {\n src = new Uint8Array(source)\n } else {\n src = new Uint8Array(source)\n }\n\n if (src.length <= 0) return this\n\n if (offset + src.length > this.buffer.byteLength) {\n this.resize(offset + src.length)\n }\n\n new Uint8Array(this.buffer).set(src, offset)\n\n if (relative) this.offset += src.length\n return this\n }\n\n clone(copy?: boolean): ByteBuffer {\n const bb = new ByteBuffer(0, this.littleEndian)\n if (copy) {\n bb.buffer = new ArrayBuffer(this.buffer.byteLength)\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer))\n bb.view = new DataView(bb.buffer)\n } else {\n bb.buffer = this.buffer\n bb.view = this.view\n }\n bb.offset = this.offset\n bb.markedOffset = this.markedOffset\n bb.limit = this.limit\n return bb\n }\n\n copy(begin?: number, end?: number): ByteBuffer {\n if (begin === undefined) begin = this.offset\n if (end === undefined) end = this.limit\n\n if (begin === end) {\n return new ByteBuffer(0, this.littleEndian)\n }\n\n const capacity = end - begin\n const bb = new ByteBuffer(capacity, this.littleEndian)\n bb.offset = 0\n bb.limit = capacity\n\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer).subarray(begin, end), 0)\n return bb\n }\n\n copyTo(\n target: ByteBuffer,\n targetOffset?: number,\n sourceOffset?: number,\n sourceLimit?: number\n ): ByteBuffer {\n const targetRelative = typeof targetOffset === 'undefined'\n const relative = typeof sourceOffset === 'undefined'\n targetOffset = targetRelative ? target.offset : targetOffset!\n sourceOffset = relative ? this.offset : sourceOffset!\n sourceLimit = sourceLimit === undefined ? this.limit : sourceLimit\n\n const len = sourceLimit - sourceOffset\n if (len === 0) return target\n\n target.ensureCapacity(targetOffset + len)\n new Uint8Array(target.buffer).set(\n new Uint8Array(this.buffer).subarray(sourceOffset, sourceLimit),\n targetOffset\n )\n\n if (relative) this.offset += len\n if (targetRelative) target.offset += len\n return this\n }\n\n ensureCapacity(capacity: number): ByteBuffer {\n let current = this.buffer.byteLength\n if (current < capacity) {\n return this.resize((current *= 2) > capacity ? current : capacity)\n }\n return this\n }\n\n flip(): ByteBuffer {\n this.limit = this.offset\n this.offset = 0\n return this\n }\n\n resize(capacity: number): ByteBuffer {\n if (this.buffer.byteLength < capacity) {\n const buffer = new ArrayBuffer(capacity)\n new Uint8Array(buffer).set(new Uint8Array(this.buffer))\n this.buffer = buffer\n this.view = new DataView(buffer)\n }\n return this\n }\n\n skip(length: number): ByteBuffer {\n this.offset += length\n return this\n }\n\n writeInt64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigInt64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeLong(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeInt64(value, offset)\n }\n\n readInt64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigInt64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readLong(offset?: number): bigint {\n return this.readInt64(offset)\n }\n\n writeUint64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigUint64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeUInt64(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeUint64(value, offset)\n }\n\n readUint64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigUint64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readUInt64(offset?: number): bigint {\n return this.readUint64(offset)\n }\n\n toBuffer(forceCopy?: boolean): ArrayBufferLike {\n const offset = this.offset\n const limit = this.limit\n if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) {\n return this.buffer\n }\n if (offset === limit) return EMPTY_BUFFER\n return this.buffer.slice(offset, limit)\n }\n\n toArrayBuffer(forceCopy?: boolean): ArrayBufferLike {\n return this.toBuffer(forceCopy)\n }\n\n writeVarint32(value: number, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const size = this.calculateVarint32(value)\n if (offset + size > this.buffer.byteLength) {\n this.resize(offset + size)\n }\n\n value >>>= 0\n while (value >= 0x80) {\n this.view.setUint8(offset++, (value & 0x7f) | 0x80)\n value >>>= 7\n }\n this.view.setUint8(offset++, value)\n\n if (relative) {\n this.offset = offset\n return this\n }\n return size\n }\n\n readVarint32(offset?: number): number | { value: number; length: number } {\n const relative = typeof offset === 'undefined'\n if (typeof offset === 'undefined') {\n offset = this.offset\n }\n let c = 0\n let value = 0 >>> 0\n let b: number\n do {\n b = this.view.getUint8(offset++)\n if (c < 5) {\n value |= (b & 0x7f) << (7 * c)\n }\n ++c\n } while ((b & 0x80) !== 0)\n value |= 0\n\n if (relative) {\n this.offset = offset\n return value\n }\n return { value, length: c }\n }\n\n calculateVarint32(value: number): number {\n value = value >>> 0\n if (value < 1 << 7) return 1\n else if (value < 1 << 14) return 2\n else if (value < 1 << 21) return 3\n else if (value < 1 << 28) return 4\n else return 5\n }\n\n writeVString(str: string, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n let currentOffset = relative ? this.offset : offset!\n\n const encoded = getEncoder().encode(str)\n const len = encoded.length\n const lenVarintSize = this.calculateVarint32(len)\n\n if (currentOffset + lenVarintSize + len > this.buffer.byteLength) {\n this.resize(currentOffset + lenVarintSize + len)\n }\n\n this.writeVarint32(len, currentOffset)\n currentOffset += lenVarintSize\n\n new Uint8Array(this.buffer).set(encoded, currentOffset)\n currentOffset += len\n\n if (relative) {\n this.offset = currentOffset\n return this\n }\n return currentOffset - (offset || 0)\n }\n\n readVString(offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const start = offset\n const lenResult = this.readVarint32(offset) as { value: number; length: number }\n const lenValue = lenResult.value\n const lenLength = lenResult.length\n\n offset += lenLength\n\n // TextDecoder can take Uint8Array view directly\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, lenValue))\n offset += lenValue\n\n if (relative) {\n this.offset = offset\n return str\n } else {\n return {\n string: str,\n length: offset - start\n }\n }\n }\n\n readUTF8String(length: number, offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n // const strBuffer = this.buffer.slice(offset, end)\n // Faster to view if Shared? No, Decoder takes buffer or view.\n // Making a view is cheap.\n // But DataView vs Uint8Array. TextDecoder takes BufferSource (ArrayBuffer or ArrayBufferView).\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, length))\n\n if (relative) {\n this.offset += length\n return str\n } else {\n return {\n string: str,\n length\n }\n }\n }\n}\n","import type { APIMethods } from './api-types'\n\n/**\n * Unified configuration for Hive blockchain connectivity.\n * This is the single source of truth for node endpoints, timeouts, and chain settings.\n * Mutate this object directly or use ConfigManager.setHiveNodes() for validated updates.\n */\nexport const config = {\n /**\n * Array of Hive API node endpoints for load balancing and failover.\n */\n nodes: [\n 'https://api.hive.blog',\n 'https://api.deathwing.me',\n 'https://api.openhive.network',\n 'https://techcoderx.com',\n 'https://api.syncad.com',\n 'https://rpc.mahdiyari.info',\n ],\n\n /**\n * Array of Hive API node endpoints that support REST APIs.\n * Note: Without the trailing /\n */\n restNodes: [\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://api.syncad.com',\n 'https://hiveapi.actifit.io',\n 'https://api.c0ff33a.uk'\n ],\n\n /**\n * Per-API REST node override. Some APIs are served by only a subset of\n * nodes; list just those capable hosts here so callREST never burns its\n * (small) retry budget on nodes that 404/503 the API, and a cold start\n * hits a capable node immediately. Any API not listed falls back to\n * `restNodes`. The health tracker still orders *within* this list.\n *\n * hivesense: empirically only ~2 public nodes serve /hivesense-api (the\n * other configured nodes 404/503 it; Ecency's own was decommissioned), so\n * pin them — otherwise the health tracker keeps rediscovering incapable\n * nodes each cooldown and cold starts waste attempts.\n */\n restNodesByApi: {\n hivesense: ['https://api.hive.blog', 'https://api.syncad.com']\n } as Partial>,\n\n /**\n * User-Agent sent on server-side (Node) HTTP requests to Hive nodes.\n *\n * Node's built-in fetch (undici) sends a bare `User-Agent: node` when none is\n * set, which is indistinguishable from any random Node script in node/CDN\n * analytics. A descriptive value lets operators tell their own SSR/server\n * traffic apart from anonymous scrapers. Only applied in Node — browsers\n * forbid overriding User-Agent (it is silently dropped) and React Native sets\n * its own native UA, so client and mobile traffic are untouched. Override via\n * `ConfigManager.setUserAgent()` (or `setUserAgent()` from `@ecency/sdk/hive`).\n */\n userAgent: 'ecency-sdk',\n\n /**\n * The Hive blockchain chain ID for transaction signing and verification.\n */\n chain_id: 'beeab0de00000000000000000000000000000000000000000000000000000000',\n\n /**\n * Address prefix used for public key formatting (STM for mainnet).\n */\n address_prefix: 'STM',\n\n /**\n * Timeout in milliseconds for read API calls (get_content, get_accounts, etc.).\n * Kept short so the health tracker can fail over to another node quickly.\n */\n timeout: 5_000,\n\n /**\n * Timeout in milliseconds for broadcast API calls.\n * Longer than read timeout because broadcast_transaction_synchronous waits\n * for block inclusion, which depends on the 3-second block interval and\n * network conditions.\n */\n broadcastTimeout: 15_000,\n\n /**\n * Number of retry attempts for failed API calls before throwing an error.\n * Total attempts = retry + 1. With ~7 nodes in the list, a budget of 5\n * means callRPC iterates through 6 distinct nodes before giving up, so a\n * single sick node (or two) can't surface as an unhandled error to the\n * caller while the rest of the list is healthy.\n */\n retry: 5,\n\n /**\n * Tail-latency resilience for READ calls. Motivation: on a shared public-node\n * pool a node can slow down or throttle *mid-request*; a fixed `timeout` means\n * the caller only notices after the full window, and under SSR concurrency\n * those stalled renders pile up. Two mechanisms, both scoped to reads only\n * (broadcasts never hedge and keep their fixed `broadcastTimeout`):\n *\n * - Adaptive per-attempt timeout (`adaptiveTimeout`, default ON): when a\n * node has a usable latency profile (EWMA), the per-attempt timeout becomes\n * `min(callerTimeout, max(floorMs, factor × EWMA))` — a node running far\n * above its own baseline is abandoned early and failover starts sooner.\n * Never *raises* the caller's timeout; unprofiled nodes keep it unchanged.\n *\n * - Hedged requests (`hedge`, default OFF — opt in via `setResilience`): if\n * the primary attempt is still pending after `max(hedgeDelayFloorMs,\n * hedgeDelayFactor × EWMA)`, a duplicate request is fired at the next\n * healthy untried node and the first success wins (the loser is aborted).\n * A token bucket (`hedgeBucketCapacity` burst, refilled by\n * `hedgeRefillPerSuccess` per un-hedged success) caps hedges to roughly\n * `hedgeRefillPerSuccess` of traffic, so only the slow tail hedges — and\n * under pool-wide slowness the bucket drains and hedging auto-disables\n * instead of amplifying load into public-node rate limits.\n */\n resilience: {\n adaptiveTimeout: true,\n adaptiveTimeoutFloorMs: 2_000,\n adaptiveTimeoutFactor: 4,\n hedge: false,\n hedgeDelayFloorMs: 750,\n hedgeDelayFactor: 2,\n hedgeBucketCapacity: 10,\n hedgeRefillPerSuccess: 0.1,\n /**\n * Wall-clock budget for one read call across ALL failover attempts, as a\n * multiple of the per-attempt timeout: no NEW attempt starts past\n * `totalBudgetFactor × timeout` (an in-flight attempt still finishes its\n * own window). Bounds the pathological pool-wide-slowness walk — without\n * it a read could hold its caller for (retry+1) × timeout ≈ 30s, which\n * under SSR concurrency is a memory pile-up, the exact incident this\n * feature exists for. Applies to reads only (callRPC / callREST);\n * broadcasts keep their try-each-node-once semantics.\n */\n totalBudgetFactor: 2\n }\n}\n\n/** Shape of the `config.resilience` bag (see its doc comment). */\nexport type ResilienceOptions = typeof config.resilience\n\n/**\n * Validated setter for the Hive RPC node list — replaces `config.nodes`.\n * Trims, drops non-http(s) entries, and de-dupes (order-preserving). A no-op\n * if nothing valid remains, so a bad input can't empty the list.\n *\n * Lives here, in the React-free `hive-tx` core, on purpose: it must be\n * reachable from BOTH the full `@ecency/sdk` entry (via\n * `ConfigManager.setHiveNodes`, which delegates here) and the lean\n * `@ecency/sdk/hive` server/CLI entry — without dragging react-query or the\n * DMCA/ReDoS surface of `ConfigManager` into the lean entry. Within a single\n * bundle this mutates the one `config` instance `callRPC` reads; the\n * cross-bundle single-instance guarantee is a separate (build-level) concern.\n */\n/**\n * Trim, drop non-string / non-http(s), and de-dupe (order-preserving) a node\n * list. Shared by `setNodes` and the REST-node setters below so all three\n * normalize identically.\n */\nconst sanitizeNodeList = (nodes: unknown): string[] =>\n Array.isArray(nodes)\n ? [\n ...new Set(\n nodes\n .filter((n): n is string => typeof n === 'string')\n // Trim, then strip trailing slashes so REST paths concatenate cleanly:\n // `callREST` builds `node + '/status-api'`, and a `https://host/` node would\n // otherwise yield `https://host//status-api`, which several HAF nodes 404.\n // De-dupe AFTER normalizing so `host` and `host/` collapse to one entry.\n .map((n) => n.trim().replace(/\\/+$/, ''))\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n : []\n\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = sanitizeNodeList(nodes)\n if (!validNodes.length) return\n config.nodes = validNodes\n}\n\n/**\n * Validated setter for the REST-API node list — replaces `config.restNodes`.\n * Same shape/guarantees as `setNodes` (trim, drop non-http(s), de-dupe, no-op on\n * empty). Exists because `restNodes` is otherwise baked into the SDK: an app that\n * wants to add/remove a REST host (e.g. drop an own node it is decommissioning, or\n * widen the public pool) previously had to fork + republish the SDK. With this, the\n * REST pool is app-configurable at runtime exactly like the read pool. Lives in the\n * React-free `hive-tx` core so both the full `@ecency/sdk` entry and the lean\n * `@ecency/sdk/hive` entry can reach it.\n */\nexport const setRestNodes = (nodes: string[]): void => {\n const valid = sanitizeNodeList(nodes)\n if (!valid.length) return\n config.restNodes = valid\n}\n\n/**\n * Merge validated per-API REST node overrides into `config.restNodesByApi`.\n * For each entry: a non-empty, valid list pins that API to those hosts; an empty or\n * all-invalid list REMOVES the pin so the API falls back to `restNodes`. Other APIs'\n * existing pins (e.g. the built-in `hivesense`) are preserved. Lets an app pin the\n * APIs it actually uses to known-capable hosts (so `callREST` never burns its small\n * retry budget on a node that 404/503s the API) without an SDK republish.\n */\nexport const setRestNodesByApi = (\n map: Partial>\n): void => {\n if (!map || typeof map !== 'object') return\n const next: Partial> = { ...config.restNodesByApi }\n for (const [api, list] of Object.entries(map)) {\n const valid = sanitizeNodeList(list)\n if (valid.length) {\n next[api as APIMethods] = valid\n } else {\n delete next[api as APIMethods]\n }\n }\n config.restNodesByApi = next\n}\n\n/**\n * Validated setter for the User-Agent sent on server-side (Node) requests.\n * Trims the input and ignores an empty value so a bad input can't blank out the\n * header. Like `setNodes`, it lives in the React-free `hive-tx` core so it is\n * reachable from both the full `@ecency/sdk` entry (via\n * `ConfigManager.setUserAgent`) and the lean `@ecency/sdk/hive` server/CLI entry.\n */\nexport const setUserAgent = (ua: string): void => {\n // Defensive against plain-JS / React Native callers that may pass a non-string\n // despite the `string` type (avoids throwing on `.trim()`).\n if (typeof ua !== 'string') return\n const value = ua.trim()\n // Ignore blank values, and reject control characters (CR, LF, and other\n // C0/DEL controls). An invalid header value would otherwise be stored and make\n // every subsequent fetch throw, and rejecting CR/LF closes a header-injection\n // vector for any caller that builds the UA from untrusted input.\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return\n config.userAgent = value\n}\n\n/**\n * Validated partial setter for `config.resilience` (adaptive read timeouts +\n * hedged requests — see the field's doc comment). Booleans must be booleans;\n * numeric fields must be finite and positive, with the refill rate additionally\n * capped at 1 so a typo can't turn the tail-hedge into a traffic doubler\n * (refill ≤ 1 ⇒ hedges can never exceed un-hedged successes). Invalid values\n * are ignored field-by-field, so one bad entry can't block the rest. Lives in\n * the React-free `hive-tx` core (like the other setters) so both `@ecency/sdk`\n * (via `ConfigManager.setResilience`) and the lean `@ecency/sdk/hive` entry\n * can reach it.\n */\nexport const setResilience = (opts: Partial): void => {\n if (!opts || typeof opts !== 'object') return\n const r = config.resilience\n const bool = (v: unknown): v is boolean => typeof v === 'boolean'\n const pos = (v: unknown): v is number =>\n typeof v === 'number' && Number.isFinite(v) && v > 0\n if (bool(opts.adaptiveTimeout)) r.adaptiveTimeout = opts.adaptiveTimeout\n // Floor must stay ≥ the tracker's slow-failure recording floor (2s): the\n // safety argument for adaptive timeouts is that an abort at the window IS\n // recorded as a slow sample, growing the EWMA so the window self-corrects\n // upward. A floor below 2s would abort without recording — the window could\n // never converge and a too-tight profile would starve that call forever.\n if (pos(opts.adaptiveTimeoutFloorMs)) {\n r.adaptiveTimeoutFloorMs = Math.max(opts.adaptiveTimeoutFloorMs, 2_000)\n }\n if (pos(opts.adaptiveTimeoutFactor)) r.adaptiveTimeoutFactor = opts.adaptiveTimeoutFactor\n if (bool(opts.hedge)) r.hedge = opts.hedge\n if (pos(opts.hedgeDelayFloorMs)) r.hedgeDelayFloorMs = opts.hedgeDelayFloorMs\n if (pos(opts.hedgeDelayFactor)) r.hedgeDelayFactor = opts.hedgeDelayFactor\n if (pos(opts.hedgeBucketCapacity)) r.hedgeBucketCapacity = opts.hedgeBucketCapacity\n // Refill must stay ≤ 1: at 1 token per success the hedge rate could reach\n // 100% of traffic, defeating the \"tail only\" contract. Cap rather than reject\n // so a caller asking for \"more hedging\" gets the safe maximum.\n if (pos(opts.hedgeRefillPerSuccess)) {\n r.hedgeRefillPerSuccess = Math.min(opts.hedgeRefillPerSuccess, 1)\n }\n // Below 1 the budget could not even cover the configured per-attempt window.\n if (pos(opts.totalBudgetFactor)) {\n r.totalBudgetFactor = Math.max(opts.totalBudgetFactor, 1)\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport class Signature {\n data: Uint8Array\n recovery: number\n private compressed: boolean\n\n /**\n * Creates a new Signature instance.\n * @param data Raw signature data (64 bytes)\n * @param recovery Recovery byte (0-3)\n * @param compressed Whether signature is compressed (default: true)\n */\n constructor(data: Uint8Array, recovery: number, compressed?: boolean) {\n this.data = data\n this.recovery = recovery\n this.compressed = compressed ?? true\n }\n\n /**\n * Creates a Signature from a hex string.\n * @param string 130-character hex string containing signature and recovery data\n * @returns New Signature instance\n * @throws Error if input is not a string\n */\n static from(string: string) {\n if (typeof string === 'string') {\n const temp = hexToBytes(string)\n let recovery = parseInt(bytesToHex(temp.subarray(0, 1)), 16) - 31\n let compressed = true\n // non-compressed signatures have -4\n // https://github.com/bitcoin/bitcoin/blob/95ea54ba089610019a74c1176a2c7c0dba144b1c/src/key.cpp#L257\n if (recovery < 0) {\n compressed = false\n recovery = recovery + 4\n }\n const data = temp.subarray(1)\n return new Signature(data, recovery, compressed)\n } else {\n throw new Error('Expected string for data')\n }\n }\n\n /**\n * Converts signature to 65-byte buffer format.\n * @returns 65-byte buffer containing recovery byte + signature data\n */\n toBuffer() {\n const buffer = new Uint8Array(65).fill(0)\n if (this.compressed) {\n buffer[0] = (this.recovery + 31) & 0xff\n } else {\n buffer[0] = (this.recovery + 27) & 0xff\n }\n buffer.set(this.data, 1)\n return buffer\n }\n\n /**\n * Returns signature as 130-character hex string.\n * @returns Hex string representation of signature\n */\n customToString() {\n return bytesToHex(this.toBuffer())\n }\n\n /**\n * Returns signature as 130-character hex string.\n * Overrides Object.prototype.toString() so that String(sig) and\n * template literals produce the hex representation instead of \"[object Object]\".\n * @returns Hex string representation of signature\n */\n toString() {\n return this.customToString()\n }\n\n /**\n * Recovers the public key from this signature and message.\n * @param message 32-byte message hash (Uint8Array) or 64-character hex string\n * @returns PublicKey that created this signature\n * @throws Error if message is not a valid 32-byte SHA256 hash\n */\n getPublicKey(message: Uint8Array | string): PublicKey {\n if (\n (message instanceof Uint8Array && message.length !== 32) ||\n (typeof message === 'string' && message.length !== 64)\n ) {\n throw new Error('Expected a valid sha256 hash as message')\n }\n if (typeof message === 'string') {\n message = hexToBytes(message)\n }\n const sig = secp256k1.Signature.fromBytes(this.data, 'compact')\n const temp = new secp256k1.Signature(sig.r, sig.s, this.recovery)\n return new PublicKey(temp.recoverPublicKey(message).toBytes())\n }\n}\n","import { ripemd160 } from '@noble/hashes/legacy.js'\nimport bs58 from 'bs58'\nimport { config } from '../config'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { Signature } from './Signature'\n\nexport class PublicKey {\n key: Uint8Array\n prefix: string\n\n /**\n * Creates a new PublicKey instance from raw bytes.\n * @param key Raw public key bytes (33 bytes, compressed format)\n * @param prefix Optional address prefix (defaults to the current config.address_prefix)\n */\n constructor(key: Uint8Array, prefix?: string) {\n this.key = key\n // Read config at call time so runtime mutations to config.address_prefix\n // (e.g. switching to a non-mainnet network) take effect for new instances.\n this.prefix = prefix ?? config.address_prefix\n }\n\n /**\n * Creates a PublicKey from a string representation.\n * The expected prefix is read from config.address_prefix at call time, so\n * consumers can switch networks at runtime.\n * @param wif Public key string (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n * @returns New PublicKey instance\n * @throws Error if the prefix, length, checksum, or curve point is invalid\n */\n static fromString(wif: string): PublicKey {\n const expectedPrefix = config.address_prefix\n if (typeof wif !== 'string' || wif.length <= expectedPrefix.length) {\n throw new Error('Invalid public key')\n }\n const prefix = wif.slice(0, expectedPrefix.length)\n if (prefix !== expectedPrefix) {\n throw new Error(`Public key must start with ${expectedPrefix}`)\n }\n let buffer: Uint8Array\n try {\n buffer = bs58.decode(wif.slice(expectedPrefix.length))\n } catch {\n throw new Error('Invalid public key encoding')\n }\n // 33-byte compressed secp256k1 point + 4-byte RIPEMD160 checksum\n if (buffer.length !== 37) {\n throw new Error('Invalid public key length')\n }\n const key = buffer.subarray(0, 33)\n const checksum = buffer.subarray(33, 37)\n const expectedChecksum = ripemd160(key).subarray(0, 4)\n if (!isUint8ArrayEqual(checksum, expectedChecksum)) {\n throw new Error('Public key checksum mismatch')\n }\n try {\n secp256k1.Point.fromBytes(key)\n } catch {\n throw new Error('Invalid public key')\n }\n return new PublicKey(key, prefix)\n }\n\n /**\n * Creates a PublicKey from a string or returns the instance if already a PublicKey.\n * @param value Public key string or PublicKey instance\n * @returns New or existing PublicKey instance\n */\n static from(value: string | PublicKey): PublicKey {\n if (value instanceof PublicKey) {\n return value\n } else {\n return PublicKey.fromString(value as string)\n }\n }\n\n /**\n * Verifies a signature against a message hash.\n * @param message 32-byte message hash to verify\n * @param signature Signature to verify\n * @returns True if signature is valid, false otherwise\n */\n verify(message: Uint8Array, signature: Signature | string): boolean {\n if (typeof signature === 'string') {\n signature = Signature.from(signature)\n }\n return secp256k1.verify(signature.data, message, this.key, {\n prehash: false,\n format: 'compact'\n })\n }\n\n /**\n * Returns the public key as a string for storage or transmission.\n * @returns Public key string with prefix (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n */\n toString(): string {\n return encodePublic(this.key, this.prefix)\n }\n\n /**\n * Returns JSON representation (same as toString()).\n * @returns Public key string\n */\n toJSON(): string {\n return this.toString()\n }\n\n /**\n * Returns a string representation for debugging.\n * @returns Formatted public key string\n */\n inspect(): string {\n return `PublicKey: ${this.toString()}`\n }\n}\n\nconst encodePublic = (key: Uint8Array, prefix: string): string => {\n const checksum = ripemd160(key)\n return prefix + bs58.encode(new Uint8Array([...key, ...checksum.subarray(0, 4)]))\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array): boolean => {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n","/** Class representing a hive asset,\n * e.g. `1.000 HIVE` or `12.112233 VESTS`. */\nexport class Asset {\n amount: number\n symbol: string\n\n constructor(amount: number, symbol: string) {\n this.amount = amount\n this.symbol = symbol === 'HIVE' ? 'STEEM' : symbol === 'HBD' ? 'SBD' : symbol\n }\n\n /** Create a new Asset instance from a string, e.g. `42.000 HIVE`. */\n static fromString(string: string, expectedSymbol: string | null = null): Asset {\n const [amountString, symbol] = string.split(' ')\n if (['STEEM', 'VESTS', 'SBD', 'TESTS', 'TBD', 'HIVE', 'HBD'].indexOf(symbol) === -1) {\n throw new Error(`Invalid asset symbol: ${symbol}`)\n }\n if (expectedSymbol && symbol !== expectedSymbol) {\n throw new Error(`Invalid asset, expected symbol: ${expectedSymbol} got: ${symbol}`)\n }\n const amount = Number.parseFloat(amountString)\n if (!Number.isFinite(amount)) {\n throw new Error(`Invalid asset amount: ${amountString}`)\n }\n return new Asset(amount, symbol)\n }\n\n /**\n * Convenience to create new Asset.\n * @param symbol Symbol to use when created from number. Will also be used to validate\n * the asset, throws if the passed value has a different symbol than this.\n */\n static from(value: number | string | Asset, symbol?: string | null): Asset {\n if (value instanceof Asset) {\n if (symbol && value.symbol !== symbol) {\n throw new Error(`Invalid asset, expected symbol: ${symbol} got: ${value.symbol}`)\n }\n return value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n return new Asset(value, symbol || 'STEEM')\n } else if (typeof value === 'string') {\n return Asset.fromString(value, symbol)\n } else {\n throw new Error(`Invalid asset '${String(value)}'`)\n }\n }\n\n // We convert HIVE & HBD strings to STEEM & SBD because the serialization should be based on STEEM & SBD\n\n /** Return asset precision. */\n getPrecision() {\n switch (this.symbol) {\n case 'TESTS':\n case 'TBD':\n case 'STEEM':\n case 'SBD':\n case 'HBD':\n case 'HIVE':\n return 3\n case 'VESTS':\n return 6\n default:\n return 3\n }\n }\n\n /** Return a string representation of this asset, e.g. `42.000 HIVE`. */\n toString() {\n return `${this.amount.toFixed(this.getPrecision())} ${this.symbol}`\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\n/** Buffer wrapper that serializes to a hex-encoded string. */\nexport class HexBuffer {\n buffer: Uint8Array\n /** Convenience to create a new HexBuffer, does not copy data if value passed is already a buffer. */\n static from(value: string | Uint8Array | HexBuffer) {\n if (value instanceof HexBuffer) {\n return value\n } else if (value instanceof Uint8Array) {\n return new HexBuffer(value)\n } else if (typeof value === 'string') {\n return new HexBuffer(hexToBytes(value))\n } else {\n return new HexBuffer(new Uint8Array(value))\n }\n }\n\n constructor(buffer: Uint8Array) {\n this.buffer = buffer\n }\n\n toString() {\n return bytesToHex(this.buffer)\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { Asset } from './Asset'\nimport { HexBuffer } from './HexBuffer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Operation } from '../types'\n\n// Operation ID constants for better maintainability\nconst OPERATION_IDS = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n // pow: 14,\n custom: 15,\n // report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n // pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n // custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49\n} as const\n\ntype OperationId = (typeof OPERATION_IDS)[keyof typeof OPERATION_IDS]\n\nconst VoidSerializer = () => {\n throw new Error('Void can not be serialized')\n}\nconst StringSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeVString(data)\n}\n\nconst Int16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeInt16(data)\n}\n\nconst Int64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeInt64(data)\n}\n\nconst UInt8Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint8(data)\n}\n\nconst UInt16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint16(data)\n}\n\nconst UInt32Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint32(data)\n}\n\nconst UInt64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeUint64(data)\n}\n\nconst BooleanSerializer = (buffer: ByteBuffer, data: number | boolean) => {\n buffer.writeByte(data ? 1 : 0)\n}\n\nconst StaticVariantSerializer = (itemSerializers: any) => {\n // return (buffer: ByteBuffer, data: any[]) => {\n // let id = data[0]\n // const item = data[1]\n // // id was/is supposed to be 0 or integer here but seems to have been changed in e.g. comment_options\n // // extensions: [\n // // [\n // // \"comment_payout_beneficiaries\",\n // // {\n // // \"beneficiaries\": [\n // // {\n // // \"account\": \"vimm\",\n // // \"weight\": 1000\n // // }\n // // ]\n // // }\n // // ]\n // // ]\n // // Keep it here just in case\n // // https://gitlab.syncad.com/hive/hive/-/issues/722\n // // \"comment_payout_beneficiaries\" was 0 and at some point it got changed\n // // It should still be serialized as a 0 or an integer\n // // Now the question is, always 0? will need an example transaction to prove otherwise\n // if (typeof id === 'string') {\n // if (id === 'update_proposal_end_date') {\n // id = 1\n // } else {\n // id = 0\n // }\n // }\n // buffer.writeVarint32(id)\n // itemSerializers[id](buffer, item)\n return (buffer: ByteBuffer, data: any) => {\n const [id, item] = data\n buffer.writeVarint32(id)\n itemSerializers[id](buffer, item)\n }\n}\n\n/**\n * Serialize asset.\n * @note This looses precision for amounts larger than 2^53-1/10^precision.\n * Should not be a problem in real-word usage.\n */\nconst AssetSerializer = (buffer: ByteBuffer, data: string | Asset) => {\n const asset = Asset.from(data)\n const precision = asset.getPrecision()\n buffer.writeInt64(Math.round(asset.amount * Math.pow(10, precision)))\n buffer.writeUint8(precision)\n for (let i = 0; i < 7; i++) {\n buffer.writeUint8(asset.symbol.charCodeAt(i) || 0)\n }\n}\n\nconst DateSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeUint32(Math.floor(new Date(data + 'Z').getTime() / 1000))\n}\n\nconst PublicKeySerializer = (buffer: ByteBuffer, data: string | PublicKey) => {\n if (\n data === null ||\n (typeof data === 'string' && data.slice(-39) === '1111111111111111111111111111111114T1Anm')\n ) {\n buffer.append(new Uint8Array(33).fill(0))\n } else {\n buffer.append(PublicKey.from(data).key)\n }\n}\n\nconst BinarySerializer = (size: null | number = null) => {\n return (buffer: ByteBuffer, data: string | Uint8Array | HexBuffer) => {\n data = HexBuffer.from(data)\n const len = data.buffer.length\n if (size) {\n if (len !== size) {\n throw new Error(`Unable to serialize binary. Expected ${size} bytes, got ${len}`)\n }\n } else {\n buffer.writeVarint32(len)\n }\n buffer.append(data.buffer)\n }\n}\n\nconst VariableBinarySerializer = BinarySerializer()\n\nconst FlatMapSerializer = (keySerializer: any, valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(data.length)\n for (const [key, value] of data) {\n keySerializer(buffer, key)\n valueSerializer(buffer, value)\n }\n }\n}\n\nconst ArraySerializer = (itemSerializer: any) => {\n return (buffer: ByteBuffer, data: any[]) => {\n buffer.writeVarint32(data.length)\n for (const item of data) {\n itemSerializer(buffer, item)\n }\n }\n}\n\nconst ObjectSerializer = (keySerializers: any) => {\n return (buffer: ByteBuffer, data: any) => {\n for (const [key, serializer] of keySerializers) {\n try {\n serializer(buffer, data[key])\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n }\n}\n\nconst OptionalSerializer = (valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any | undefined) => {\n if (data !== undefined) {\n buffer.writeByte(1)\n valueSerializer(buffer, data)\n } else {\n buffer.writeByte(0)\n }\n }\n}\n\nconst AuthoritySerializer = ObjectSerializer([\n ['weight_threshold', UInt32Serializer],\n ['account_auths', FlatMapSerializer(StringSerializer, UInt16Serializer)],\n ['key_auths', FlatMapSerializer(PublicKeySerializer, UInt16Serializer)]\n])\n\nconst BeneficiarySerializer = ObjectSerializer([\n ['account', StringSerializer],\n ['weight', UInt16Serializer]\n])\n\nconst PriceSerializer = ObjectSerializer([\n ['base', AssetSerializer],\n ['quote', AssetSerializer]\n])\n\n// const SignedBlockHeaderSerializer = ObjectSerializer([\n// ['previous', BinarySerializer(20)],\n// ['timestamp', DateSerializer],\n// ['witness', StringSerializer],\n// ['transaction_merkle_root', BinarySerializer(20)],\n// ['extensions', ArraySerializer(VoidSerializer)],\n// ['witness_signature', BinarySerializer(65)]\n// ])\n\nconst ChainPropertiesSerializer = ObjectSerializer([\n ['account_creation_fee', AssetSerializer],\n ['maximum_block_size', UInt32Serializer],\n ['hbd_interest_rate', UInt16Serializer]\n])\n\nconst OperationDataSerializer = (operationId: OperationId, definitions: any) => {\n const objectSerializer = ObjectSerializer(definitions)\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(operationId)\n objectSerializer(buffer, data)\n }\n}\n\nconst OperationSerializers: Record> = {}\n\nOperationSerializers.account_create = OperationDataSerializer(OPERATION_IDS.account_create, [\n ['fee', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_create_with_delegation = OperationDataSerializer(\n OPERATION_IDS.account_create_with_delegation,\n [\n ['fee', AssetSerializer],\n ['delegation', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update = OperationDataSerializer(OPERATION_IDS.account_update, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_witness_proxy = OperationDataSerializer(\n OPERATION_IDS.account_witness_proxy,\n [\n ['account', StringSerializer],\n ['proxy', StringSerializer]\n ]\n)\n\nOperationSerializers.account_witness_vote = OperationDataSerializer(\n OPERATION_IDS.account_witness_vote,\n [\n ['account', StringSerializer],\n ['witness', StringSerializer],\n ['approve', BooleanSerializer]\n ]\n)\n\nOperationSerializers.cancel_transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.cancel_transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer]\n ]\n)\n\nOperationSerializers.change_recovery_account = OperationDataSerializer(\n OPERATION_IDS.change_recovery_account,\n [\n ['account_to_recover', StringSerializer],\n ['new_recovery_account', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.claim_account = OperationDataSerializer(OPERATION_IDS.claim_account, [\n ['creator', StringSerializer],\n ['fee', AssetSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.claim_reward_balance = OperationDataSerializer(\n OPERATION_IDS.claim_reward_balance,\n [\n ['account', StringSerializer],\n ['reward_hive', AssetSerializer],\n ['reward_hbd', AssetSerializer],\n ['reward_vests', AssetSerializer]\n ]\n)\n\nOperationSerializers.comment = OperationDataSerializer(OPERATION_IDS.comment, [\n ['parent_author', StringSerializer],\n ['parent_permlink', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['title', StringSerializer],\n ['body', StringSerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.comment_options = OperationDataSerializer(OPERATION_IDS.comment_options, [\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['max_accepted_payout', AssetSerializer],\n ['percent_hbd', UInt16Serializer],\n ['allow_votes', BooleanSerializer],\n ['allow_curation_rewards', BooleanSerializer],\n [\n 'extensions',\n ArraySerializer(\n StaticVariantSerializer([\n ObjectSerializer([['beneficiaries', ArraySerializer(BeneficiarySerializer)]])\n ])\n )\n ]\n])\n\nOperationSerializers.convert = OperationDataSerializer(OPERATION_IDS.convert, [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n])\n\nOperationSerializers.create_claimed_account = OperationDataSerializer(\n OPERATION_IDS.create_claimed_account,\n [\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.custom = OperationDataSerializer(OPERATION_IDS.custom, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['id', UInt16Serializer],\n ['data', VariableBinarySerializer]\n])\n\n// Not used on chain\n// OperationSerializers.custom_binary = OperationDataSerializer(OPERATION_IDS.custom_binary, [\n// ['required_owner_auths', ArraySerializer(StringSerializer)],\n// ['required_active_auths', ArraySerializer(StringSerializer)],\n// ['required_posting_auths', ArraySerializer(StringSerializer)],\n// ['required_auths', ArraySerializer(AuthoritySerializer)],\n// ['id', StringSerializer],\n// ['data', VariableBinarySerializer]\n// ])\n\nOperationSerializers.custom_json = OperationDataSerializer(OPERATION_IDS.custom_json, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['required_posting_auths', ArraySerializer(StringSerializer)],\n ['id', StringSerializer],\n ['json', StringSerializer]\n])\n\nOperationSerializers.decline_voting_rights = OperationDataSerializer(\n OPERATION_IDS.decline_voting_rights,\n [\n ['account', StringSerializer],\n ['decline', BooleanSerializer]\n ]\n)\n\nOperationSerializers.delegate_vesting_shares = OperationDataSerializer(\n OPERATION_IDS.delegate_vesting_shares,\n [\n ['delegator', StringSerializer],\n ['delegatee', StringSerializer],\n ['vesting_shares', AssetSerializer]\n ]\n)\n\nOperationSerializers.delete_comment = OperationDataSerializer(OPERATION_IDS.delete_comment, [\n ['author', StringSerializer],\n ['permlink', StringSerializer]\n])\n\nOperationSerializers.escrow_approve = OperationDataSerializer(OPERATION_IDS.escrow_approve, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['approve', BooleanSerializer]\n])\n\nOperationSerializers.escrow_dispute = OperationDataSerializer(OPERATION_IDS.escrow_dispute, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer]\n])\n\nOperationSerializers.escrow_release = OperationDataSerializer(OPERATION_IDS.escrow_release, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['receiver', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer]\n])\n\nOperationSerializers.escrow_transfer = OperationDataSerializer(OPERATION_IDS.escrow_transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer],\n ['escrow_id', UInt32Serializer],\n ['agent', StringSerializer],\n ['fee', AssetSerializer],\n ['json_meta', StringSerializer],\n ['ratification_deadline', DateSerializer],\n ['escrow_expiration', DateSerializer]\n])\n\nOperationSerializers.feed_publish = OperationDataSerializer(OPERATION_IDS.feed_publish, [\n ['publisher', StringSerializer],\n ['exchange_rate', PriceSerializer]\n])\n\nOperationSerializers.limit_order_cancel = OperationDataSerializer(\n OPERATION_IDS.limit_order_cancel,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer]\n ]\n)\n\nOperationSerializers.limit_order_create = OperationDataSerializer(\n OPERATION_IDS.limit_order_create,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['min_to_receive', AssetSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.limit_order_create2 = OperationDataSerializer(\n OPERATION_IDS.limit_order_create2,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['exchange_rate', PriceSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.recover_account = OperationDataSerializer(OPERATION_IDS.recover_account, [\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['recent_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\n// Not used on chain\n// OperationSerializers.report_over_production = OperationDataSerializer(\n// OPERATION_IDS.report_over_production,\n// [\n// ['reporter', StringSerializer],\n// ['first_block', SignedBlockHeaderSerializer],\n// ['second_block', SignedBlockHeaderSerializer]\n// ]\n// )\n\nOperationSerializers.request_account_recovery = OperationDataSerializer(\n OPERATION_IDS.request_account_recovery,\n [\n ['recovery_account', StringSerializer],\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.reset_account = OperationDataSerializer(OPERATION_IDS.reset_account, [\n ['reset_account', StringSerializer],\n ['account_to_reset', StringSerializer],\n ['new_owner_authority', AuthoritySerializer]\n])\n\nOperationSerializers.set_reset_account = OperationDataSerializer(OPERATION_IDS.set_reset_account, [\n ['account', StringSerializer],\n ['current_reset_account', StringSerializer],\n ['reset_account', StringSerializer]\n])\n\nOperationSerializers.set_withdraw_vesting_route = OperationDataSerializer(\n OPERATION_IDS.set_withdraw_vesting_route,\n [\n ['from_account', StringSerializer],\n ['to_account', StringSerializer],\n ['percent', UInt16Serializer],\n ['auto_vest', BooleanSerializer]\n ]\n)\n\nOperationSerializers.transfer = OperationDataSerializer(OPERATION_IDS.transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n])\n\nOperationSerializers.transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_to_savings,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_vesting = OperationDataSerializer(\n OPERATION_IDS.transfer_to_vesting,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.vote = OperationDataSerializer(OPERATION_IDS.vote, [\n ['voter', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['weight', Int16Serializer]\n])\n\nOperationSerializers.withdraw_vesting = OperationDataSerializer(OPERATION_IDS.withdraw_vesting, [\n ['account', StringSerializer],\n ['vesting_shares', AssetSerializer]\n])\n\nOperationSerializers.witness_update = OperationDataSerializer(OPERATION_IDS.witness_update, [\n ['owner', StringSerializer],\n ['url', StringSerializer],\n ['block_signing_key', PublicKeySerializer],\n ['props', ChainPropertiesSerializer],\n ['fee', AssetSerializer]\n])\n\nOperationSerializers.witness_set_properties = OperationDataSerializer(\n OPERATION_IDS.witness_set_properties,\n [\n ['owner', StringSerializer],\n ['props', FlatMapSerializer(StringSerializer, VariableBinarySerializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update2 = OperationDataSerializer(OPERATION_IDS.account_update2, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', OptionalSerializer(PublicKeySerializer)],\n ['json_metadata', StringSerializer],\n ['posting_json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.create_proposal = OperationDataSerializer(OPERATION_IDS.create_proposal, [\n ['creator', StringSerializer],\n ['receiver', StringSerializer],\n ['start_date', DateSerializer],\n ['end_date', DateSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.update_proposal_votes = OperationDataSerializer(\n OPERATION_IDS.update_proposal_votes,\n [\n ['voter', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['approve', BooleanSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.remove_proposal = OperationDataSerializer(OPERATION_IDS.remove_proposal, [\n ['proposal_owner', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nconst ProposalUpdateSerializer = ObjectSerializer([['end_date', DateSerializer]])\n\nOperationSerializers.update_proposal = OperationDataSerializer(OPERATION_IDS.update_proposal, [\n ['proposal_id', UInt64Serializer],\n ['creator', StringSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n [\n 'extensions',\n ArraySerializer(StaticVariantSerializer([VoidSerializer, ProposalUpdateSerializer]))\n ]\n])\n\nOperationSerializers.collateralized_convert = OperationDataSerializer(\n OPERATION_IDS.collateralized_convert,\n [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.recurrent_transfer = OperationDataSerializer(\n OPERATION_IDS.recurrent_transfer,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer],\n ['recurrence', UInt16Serializer],\n ['executions', UInt16Serializer],\n [\n 'extensions',\n ArraySerializer(\n ObjectSerializer([\n ['type', UInt8Serializer],\n ['value', ObjectSerializer([['pair_id', UInt8Serializer]])]\n ])\n )\n ]\n ]\n)\n\nconst OperationSerializer = (buffer: ByteBuffer, operation: Operation) => {\n const serializer = OperationSerializers[operation[0]]\n if (!serializer) {\n throw new Error(`No serializer for operation: ${operation[0]}`)\n }\n try {\n serializer(buffer, operation[1])\n } catch (error: any) {\n error.message = `${operation[0]}: ${error.message}`\n throw error\n }\n}\n\nconst TransactionSerializer = ObjectSerializer([\n ['ref_block_num', UInt16Serializer],\n ['ref_block_prefix', UInt32Serializer],\n ['expiration', DateSerializer],\n ['operations', ArraySerializer(OperationSerializer)],\n ['extensions', ArraySerializer(StringSerializer)]\n])\n\nconst EncryptedMemoSerializer = ObjectSerializer([\n ['from', PublicKeySerializer],\n ['to', PublicKeySerializer],\n ['nonce', UInt64Serializer],\n ['check', UInt32Serializer],\n ['encrypted', BinarySerializer()]\n])\n\nexport const Serializer = {\n // Array: ArraySerializer,\n Asset: AssetSerializer,\n // Authority: AuthoritySerializer,\n // Binary: BinarySerializer,\n // Boolean: BooleanSerializer,\n // Date: DateSerializer,\n // FlatMap: FlatMapSerializer,\n // Int16: Int16Serializer,\n // Int32: Int32Serializer,\n // Int64: Int64Serializer,\n // Int8: Int8Serializer,\n Memo: EncryptedMemoSerializer,\n // Object: ObjectSerializer,\n // Operation: OperationSerializer,\n // Optional: OptionalSerializer,\n Price: PriceSerializer,\n PublicKey: PublicKeySerializer,\n // StaticVariant: StaticVariantSerializer,\n String: StringSerializer,\n Transaction: TransactionSerializer,\n UInt16: UInt16Serializer,\n UInt32: UInt32Serializer\n // UInt64: UInt64Serializer,\n // UInt8: UInt8Serializer,\n // Void: VoidSerializer\n}\n","export const sleep = (ms: number): Promise => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { config } from '../config'\nimport { CallResponse } from '../types'\nimport type { APIMethods } from '../api-types'\nimport { sleep } from './sleep'\n\n// ── Server identity (User-Agent) ────────────────────────────────────────────\n\n/**\n * True only when running under Node.js (SSR / server / CLI). Computed once.\n *\n * We attach a descriptive `User-Agent` exclusively here because that is the only\n * place it (a) takes effect and (b) is wanted:\n * - Node's undici fetch otherwise sends a bare `User-Agent: node`, which is\n * indistinguishable from any anonymous script in node/CDN analytics.\n * - Browsers treat `User-Agent` as a forbidden header and silently drop any\n * override, so setting it there is pointless (and we avoid the churn).\n * - React Native sets its own native UA (e.g. the mobile app's own string);\n * overriding it would relabel real mobile traffic, so we explicitly exclude\n * it via `navigator.product === 'ReactNative'`.\n */\nconst isNodeRuntime: boolean = (() => {\n try {\n const isReactNative =\n typeof navigator !== 'undefined' && (navigator as any).product === 'ReactNative'\n return (\n !isReactNative &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null\n )\n } catch {\n return false\n }\n})()\n\n/**\n * Headers that identify the caller on server-side requests. Returns the\n * configured `User-Agent` only under Node; an empty object everywhere else so\n * browser and React Native requests are left exactly as they were.\n */\nfunction serverIdentityHeaders(): Record {\n return isNodeRuntime ? { 'User-Agent': config.userAgent } : {}\n}\n\n// ── Error Types ─────────────────────────────────────────────────────────────\n\nexport class RPCError extends Error {\n name = 'RPCError'\n data?: any\n code: number\n stack: undefined = undefined\n constructor(rpcError: { message: string; code: number; data?: any }) {\n super(rpcError.message)\n this.code = rpcError.code\n if ('data' in rpcError) {\n this.data = rpcError.data\n }\n }\n}\n\n/**\n * Transport-level error thrown by jsonRPCCall for HTTP status errors (429, 503).\n * Carries node identity and rate-limit info so callers can record health\n * exactly once without double-counting.\n */\nclass NodeError extends Error {\n node: string\n /** Explicit server `Retry-After` in ms, or 0 when the 429 carried no usable header. */\n rateLimitMs: number\n /** True for an HTTP 429 regardless of whether a `Retry-After` header was present, so\n * a header-less rate limit is still cooled down (with escalating backoff) rather than\n * mis-recorded as a plain transport failure. */\n isRateLimit: boolean\n constructor(\n node: string,\n message: string,\n opts: { rateLimitMs?: number; isRateLimit?: boolean } = {}\n ) {\n super(message)\n this.node = node\n this.rateLimitMs = opts.rateLimitMs ?? 0\n this.isRateLimit = opts.isRateLimit ?? false\n }\n}\n\n/**\n * Parse an HTTP `Retry-After` header to milliseconds. Supports both forms in the\n * spec: `` (e.g. \"120\") and ``. Returns 0 when the header\n * is absent or unparseable (including a non-numeric junk value or a past date) so the\n * caller falls back to escalating backoff instead of a NaN/negative cooldown.\n */\nfunction parseRetryAfterMs(header: string | null): number {\n if (!header) return 0\n const secs = Number(header)\n if (Number.isFinite(secs)) return secs > 0 ? secs * 1000 : 0\n const dateMs = Date.parse(header)\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now()\n return delta > 0 ? delta : 0\n }\n return 0\n}\n\n/** Errors that indicate the request definitely never reached the server. */\nconst PRE_CONNECTION_ERRORS = ['ECONNREFUSED', 'ENOTFOUND', 'EHOSTUNREACH', 'EAI_AGAIN']\n\n/** Browser fetch network-failure messages — emitted by Chromium/Firefox/Safari\n * when CORS preflight fails, DNS fails, TLS fails, or the response is blocked.\n * These map to scenarios where retrying the same signed broadcast is safe: the\n * request either never reached the node, or its response was blocked but a\n * re-broadcast of the *same* signed tx will be deduped by Hive (same trx_id). */\nconst BROWSER_NETWORK_ERRORS = [\n 'Failed to fetch', // Chromium\n 'NetworkError when attempting to fetch', // Firefox\n 'Load failed', // Safari\n 'fetch failed' // Node 18+ undici / Bun — also covered via cause chain\n]\n\n/**\n * Concatenate the error's surface text + the messages/codes from up to 5\n * levels of nested `cause`. Node.js fetch wraps connection failures as\n * `TypeError('fetch failed')` with the real `code` (ECONNREFUSED, etc.)\n * nested in the cause chain. Browser fetch failures have no cause but\n * carry their identifier in `message`.\n */\nfunction flattenErrorText(e: any): string {\n if (!e) return ''\n const parts: string[] = [String(e.name || ''), String(e.message || ''), String(e.code || '')]\n let cause = e.cause\n for (let depth = 0; cause && depth < 5; depth++) {\n parts.push(String(cause.code || ''), String(cause.message || ''))\n cause = cause.cause\n }\n return parts.join(' ')\n}\n\n/**\n * Decide whether a broadcast attempt can safely be retried on another node.\n *\n * Safe to retry (same signed tx → Hive dedupes by trx_id at the mempool layer):\n * - Pre-connection failures (ECONNREFUSED, ENOTFOUND, etc.) — request never sent.\n * - Browser fetch network failures (CORS block, TLS error, DNS) — TypeError with\n * a well-known message string.\n * - JSON parse failures — node returned an HTML error page (typical for\n * Cloudflare 1033 tunnel-down / 5xx interstitials), so the request never\n * reached the Hive RPC layer.\n * - NodeError (HTTP 429/5xx surfaced from jsonRPCCall) — already known transient.\n *\n * NOT safe to retry:\n * - RPCError — the node accepted the request and the blockchain rejected it.\n * Retrying on another node would either get the same rejection or accept\n * a different one; surface the original error instead.\n */\nfunction isBroadcastSafeToRetry(e: any): boolean {\n if (!e) return false\n if (e instanceof NodeError) return true\n if (e instanceof RPCError) return false\n\n const text = flattenErrorText(e)\n if (PRE_CONNECTION_ERRORS.some((code) => text.includes(code))) return true\n if (BROWSER_NETWORK_ERRORS.some((msg) => text.includes(msg))) return true\n\n // res.json() against an HTML body (Cloudflare/proxy interstitials) throws\n // SyntaxError. The Hive RPC layer never saw the tx, so failover is safe.\n if (e instanceof SyntaxError) return true\n // Some runtimes surface JSON parse errors as plain Error with this text.\n if (/Unexpected token|JSON\\.parse|Unexpected end of JSON/i.test(text)) return true\n\n return false\n}\n\n// ── Node Health Tracker ─────────────────────────────────────────────────────\n\n/** Node-level health state tracked by NodeHealthTracker. */\ninterface NodeHealth {\n /** Global consecutive-failure counter. Resets on success. */\n consecutiveFailures: number\n /** Timestamp of the most recent failure. Used with the 30s cooldown window. */\n lastFailureTime: number\n /** Epoch ms after which the node is no longer rate-limited. */\n rateLimitedUntil: number\n /** Count of consecutive 429s (no intervening success) with no usable Retry-After.\n * Drives escalating backoff; reset by a success or by RATE_LIMIT_STREAK_RESET_MS. */\n rateLimitStreak: number\n /** Epoch ms of the most recent 429. Used to expire the escalation streak. */\n lastRateLimitAt: number\n /** Per-API failure counters. Some nodes disable specific API plugins; tracking\n * per-API lets us deprioritize a node only for the APIs that fail, not globally.\n * `defective` marks a cooldown set by recordDefectiveResponse (payload\n * validation failure) — unlike ordinary strike cooldowns it survives\n * recordSuccess and only expires on its own. */\n apiFailures: Map<\n string,\n { count: number; cooldownUntil: number; lastFailureTime: number; defective?: boolean }\n >\n /** Most recent head_block_number observed for this node. */\n headBlock: number\n /** Epoch ms when the head_block was recorded. Used to expire stale observations. */\n headBlockUpdatedAt: number\n\n // ── Latency tracking (adaptive ordering) ────────────────────────────────\n /** EWMA of observed round-trip ms. Fed by successful calls AND by slow/timeout\n * failures (so a node that returns 200 in 15s, or aborts at the timeout, is\n * ranked on its real slowness — not treated as merely \"healthy\"). `undefined`\n * until the first sample. */\n ewmaLatencyMs?: number\n /** Number of latency samples folded into the EWMA. Gates \"warmup\": below\n * LATENCY_MIN_SAMPLES the node is unproven and keeps its config-order prior. */\n latencySampleCount: number\n /** Epoch ms of the most recent latency sample. Used for usability expiry and to\n * decide when a node is overdue for an exploratory re-probe. */\n latencyUpdatedAt: number\n /** Epoch ms of the most recent exploratory promotion. Single-flight guard so a\n * burst of concurrent orderings doesn't all re-probe the same stale node. */\n lastProbeAt: number\n\n /**\n * Per-profile-key latency (same EWMA/warmup/expiry rules as the global one).\n * The global EWMA mixes cheap calls (get_accounts ~300ms) with heavy ones\n * (get_account_history, bridge.get_discussion — legitimately seconds), so it\n * ranks nodes fine but is the WRONG baseline for per-attempt deadlines: a\n * profile dominated by cheap calls would abort every legitimately-heavy call.\n * Deadlines/hedge delays therefore key on the FULL method for RPC\n * (\"condenser_api.get_account_history\") and api+endpoint template for REST —\n * an API prefix alone still mixes cheap and heavy methods. Ranking keeps the\n * global profile. Bounded: #nodes × #distinct methods called (code-defined,\n * not user input); fully cleared whenever the node's global profile expires\n * (the global clock advances on every sample, so global-stale ⇒ all stale).\n */\n apiLatency: Map\n}\n\n/**\n * JSON-RPC error codes that indicate the node itself is unhealthy, not that the\n * client sent a bad request. These should trigger failover to another node.\n *\n * Background: Hive nodes fronted by HAF/jussi/drone return HTTP 200 with a\n * JSON-RPC error body when a backing service (hivemind, postgrest, etc.) is down.\n * The HTTP layer looks healthy, so failover never triggers — the caller just gets\n * an error and gives up. This function identifies those node-level errors.\n */\nfunction isNodeLevelRPCError(code: number, message: string): boolean {\n // -32603: Internal error — node is having problems\n if (code === -32603) return true\n // -32000 to -32099: Server error range (implementation-defined server errors)\n if (code <= -32000 && code >= -32099) return true\n // -32601: Method not found — node may be missing this API plugin\n if (code === -32601) return true\n // -32602 with node-sick indicators (vs normal \"invalid params\" from bad client input)\n // e.g. \"Unable to parse endpoint data\" from HAF when a backing service is down\n if (code === -32602 && /unable to parse|endpoint data|internal/i.test(message)) return true\n return false\n}\n\n/** Extract the API prefix from a method name like \"rc_api.find_rc_accounts\" -> \"rc_api\". */\nfunction apiOf(method: string): string {\n const dot = method.indexOf('.')\n return dot > 0 ? method.slice(0, dot) : method\n}\n\n// ── Rate-limit (429) backoff constants ───────────────────────────────────────\n/** Base cooldown applied to a 429 with no usable `Retry-After` header. Matches the\n * previous flat default so first-offence behaviour is unchanged. */\nconst RATE_LIMIT_BASE_MS = 10_000\n/** Ceiling for the escalating header-less cooldown. Prevents a node from being\n * parked far longer than a real public node's throttle window. */\nconst RATE_LIMIT_MAX_MS = 60_000\n/** No 429 from a node for this long ⇒ its escalation streak resets to 0, so an\n * occasional throttle hours apart doesn't compound into a long park. */\nconst RATE_LIMIT_STREAK_RESET_MS = 120_000\n\n/** Per-API failure threshold before the node is deprioritized for that API only. */\nconst MAX_API_FAILURES_BEFORE_COOLDOWN = 2\n/** How long a node stays deprioritized for a specific API after repeated failures. */\nconst API_COOLDOWN_MS = 60_000\n/** How long head_block observations remain valid before being treated as unknown. */\nconst HEAD_BLOCK_MAX_AGE_MS = 120_000\n/** Maximum lag (in blocks) before a node is considered stale relative to the best-known head. */\nconst STALE_BLOCK_THRESHOLD = 30\n\n// ── Adaptive latency-ordering constants ──────────────────────────────────────\n/** EWMA smoothing weight for a new latency sample. 0.3 ⇒ ~5–6 samples to converge;\n * absorbs one-off GC/TLS spikes while still reacting to a real regional shift fast. */\nconst LATENCY_EWMA_ALPHA = 0.3\n/** Samples required before a node's latency is trusted for ranking. Below this the\n * node is \"warming\" and ranks at a neutral prior (config order via tiebreak), so a\n * single fluke never reorders the list and cold start == today's behavior. */\nconst LATENCY_MIN_SAMPLES = 3\n/** How long a latency sample stays usable for ranking. Past this a node reverts to\n * warming. Must be > LATENCY_REPROBE_MS so re-probes keep a busy node's profile fresh. */\nconst LATENCY_MAX_AGE_MS = 5 * 60_000\n/** A healthy node not sampled within this window is overdue for an exploratory\n * re-probe (promoted to front of ONE ordering). This is what lets a demoted node\n * climb back when it recovers — and what profiles a node that organic traffic never\n * reaches. 60s ⇒ ~1 probe/node/min worst case = negligible cost. */\nconst LATENCY_REPROBE_MS = 60_000\n/** Neutral score (ms) for an unproven/warming node: optimistic enough to sit ahead\n * of a proven-slow node (so we explore an unknown before hammering a known-slow one)\n * but behind a proven-fast node. Fixed, so a node makes at most ONE rank transition\n * when it crosses LATENCY_MIN_SAMPLES — no churn. */\nconst LATENCY_UNPROVEN_PRIOR_MS = 1_000\n/** A failed call only feeds a latency penalty if it was actually slow (≥ this). Keeps\n * a genuine timeout / slow-5xx (a far-region node case) visible to the ranker while an\n * instant ECONNREFUSED (a *down* node, handled by consecutiveFailures) is NOT mis-read\n * as \"slow\". The penalty value is the *measured* elapsed, never a static constant. */\nconst LATENCY_SLOW_FAILURE_MS = 2_000\n\n/**\n * Latency-ranking tuning, re-exported as a frozen bag so tests assert behaviour\n * against the real numbers instead of mirroring literals that can silently drift.\n * @internal — not part of the package's public API; for the co-located spec only.\n */\nexport const __LATENCY_TUNING__ = Object.freeze({\n EWMA_ALPHA: LATENCY_EWMA_ALPHA,\n MIN_SAMPLES: LATENCY_MIN_SAMPLES,\n MAX_AGE_MS: LATENCY_MAX_AGE_MS,\n REPROBE_MS: LATENCY_REPROBE_MS,\n UNPROVEN_PRIOR_MS: LATENCY_UNPROVEN_PRIOR_MS,\n SLOW_FAILURE_MS: LATENCY_SLOW_FAILURE_MS\n})\n\n/** @internal Exported for testing only. */\nexport class NodeHealthTracker {\n private health = new Map()\n\n private getOrCreate(node: string): NodeHealth {\n let h = this.health.get(node)\n if (!h) {\n h = {\n consecutiveFailures: 0,\n lastFailureTime: 0,\n rateLimitedUntil: 0,\n rateLimitStreak: 0,\n lastRateLimitAt: 0,\n apiFailures: new Map(),\n headBlock: 0,\n headBlockUpdatedAt: 0,\n ewmaLatencyMs: undefined,\n latencySampleCount: 0,\n latencyUpdatedAt: 0,\n // Stamp the probe clock at creation so a brand-new (never-sampled) node is\n // NOT treated as \"overdue for re-probe\" on its very first ordering pass.\n // With lastProbeAt=0 the re-probe gate (touch <= now - LATENCY_REPROBE_MS)\n // fired immediately, so the 2nd+ ordering on a cold worker promoted unproven\n // nodes ahead of the configured order for no measured reason. Seeding it to\n // \"now\" preserves configured order during warmup; a genuinely slow preferred\n // node is still demoted by its EWMA score (not by epoch-zero exploration),\n // and idle nodes are still re-probed once LATENCY_REPROBE_MS has truly elapsed.\n lastProbeAt: Date.now(),\n apiLatency: new Map()\n }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number, profileKey?: string): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 0\n // A success means the node recovered — clear the escalation streak so the next\n // throttle starts from the base cooldown. We deliberately do NOT clear an active\n // rateLimitedUntil window here: under concurrency a success from a request that was\n // already in flight can resolve *after* another request recorded a fresh 429\n // Retry-After, and erasing the window would put a just-throttled node back into\n // rotation early. The window expires on its own (short for header-less; the server's\n // value for an explicit Retry-After).\n h.rateLimitStreak = 0\n if (api) {\n // A successful API call clears that API's failure counter — but never an\n // ACTIVE defective-response cooldown: the \"success\" may itself be an\n // unvalidated read from the same lying node (validated calls are the\n // minority of traffic), and re-admitting it early defeats the decisive\n // penalty. That window expires on its own, like rateLimitedUntil above.\n const apiFail = h.apiFailures.get(api)\n if (!apiFail || !(apiFail.defective && apiFail.cooldownUntil > Date.now())) {\n h.apiFailures.delete(api)\n }\n }\n if (typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0) {\n // Latency profiles use the finest key available (full method / endpoint\n // template); the API prefix is only a fallback so bare callers still\n // profile SOMETHING. Failure state above stays per-API on purpose.\n this.recordLatency(h, durationMs, profileKey ?? api)\n }\n }\n\n /**\n * Record a *slow* failed call as a latency signal. The failure counters are\n * updated separately (recordFailure/recordError); this only feeds the EWMA so a\n * node that returns 200-but-too-slow, times out, or returns a slow 5xx is ranked\n * on its real slowness. Callers pass the MEASURED elapsed ms and only call this\n * when the call was genuinely slow (≥ LATENCY_SLOW_FAILURE_MS) — an instant\n * connection failure (a *down* node) must NOT look \"slow\".\n */\n recordSlowFailure(node: string, durationMs: number, profileKey?: string): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs, profileKey)\n }\n\n /**\n * Usable latency profile (EWMA ms), or `undefined` while unproven or stale.\n * With a `profileKey` (full RPC method / REST api+endpoint template),\n * returns that (node, key) profile ONLY — deliberately no fallback to the\n * mixed global profile, because an average dominated by cheap calls is the\n * wrong deadline baseline for a heavy method (that fallback is exactly the\n * \"2s window starves get_account_history\" failure mode). Without a key,\n * returns the global ranking profile. Both follow the same \"profiled and\n * fresh\" gate as the ranker.\n * @internal\n */\n getUsableLatencyMs(node: string, profileKey?: string): number | undefined {\n const h = this.health.get(node)\n if (!h) return undefined\n const now = Date.now()\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n return p &&\n p.sampleCount >= LATENCY_MIN_SAMPLES &&\n now - p.updatedAt <= LATENCY_MAX_AGE_MS\n ? p.ewmaMs\n : undefined\n }\n return this.isLatencyUsable(h, now) ? h.ewmaLatencyMs : undefined\n }\n\n /**\n * Censored latency sample for a request that was ABORTED because a hedge\n * completed first while it was still in flight. The elapsed-at-abort is a\n * *lower bound* on the true latency, so folding it in can only move the\n * node's EWMA toward the truth, never below it — which is what lets repeated\n * hedge-wins reorder the pool. Deliberately does NOT touch the failure\n * counters or rate-limit state: the node returned no error, it was merely\n * slow, and treating cancellation as failure would flap `isNodeHealthy`.\n * Callers must NOT record this for a primary that already settled on its own\n * (its outcome was recorded normally; a second sample would be fabricated).\n * Bypasses the `recordSlowFailure` 2s floor (a hedge can win well below it).\n * By construction the elapsed is ≥ the hedge delay, so only a degenerate\n * near-zero epsilon needs rejecting — anything under one LAN round trip is\n * noise, not a latency measurement.\n * @internal\n */\n recordCensoredLatency(node: string, elapsedMs: number, profileKey?: string): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 50) return\n this.recordLatency(this.getOrCreate(node), elapsedMs, profileKey)\n }\n\n /**\n * Fold a latency sample into the node's global EWMA (warmup + usability\n * bookkeeping) and, when a profile key is given, into that (node, key)\n * profile — the global one ranks nodes, the keyed one calibrates deadlines.\n */\n private recordLatency(h: NodeHealth, durationMs: number, profileKey?: string): void {\n const now = Date.now()\n // A profile older than the usable window starts fresh, so an idled process\n // re-learns from scratch rather than ranking on hour-old data. Every keyed\n // profile shares this clock (each sample updates both), so global-stale\n // implies every keyed profile is stale too — clear the map rather than\n // leave never-again-read tombstone entries for the life of the process.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\n h.apiLatency.clear()\n }\n h.ewmaLatencyMs =\n h.ewmaLatencyMs === undefined\n ? durationMs\n : LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * h.ewmaLatencyMs\n h.latencySampleCount++\n h.latencyUpdatedAt = now\n\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n if (!p || now - p.updatedAt > LATENCY_MAX_AGE_MS) {\n h.apiLatency.set(profileKey, { ewmaMs: durationMs, sampleCount: 1, updatedAt: now })\n } else {\n p.ewmaMs = LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * p.ewmaMs\n p.sampleCount++\n p.updatedAt = now\n }\n }\n }\n\n recordFailure(node: string, api?: string): void {\n const h = this.getOrCreate(node)\n if (api) {\n // API-specific failure: only update the per-API tracker.\n // This prevents e.g. 3 rc_api failures from marking the node\n // globally unhealthy for condenser_api too.\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n // Reset counter if previous cooldown expired OR last failure was >30s ago\n // (avoids sticky penalties from sparse failures hours apart)\n if (\n (existing.cooldownUntil > 0 && existing.cooldownUntil <= now) ||\n (existing.lastFailureTime > 0 && now - existing.lastFailureTime > 30_000)\n ) {\n existing.count = 0\n existing.cooldownUntil = 0\n }\n existing.count++\n existing.lastFailureTime = now\n if (existing.count >= MAX_API_FAILURES_BEFORE_COOLDOWN) {\n existing.cooldownUntil = now + API_COOLDOWN_MS\n }\n h.apiFailures.set(api, existing)\n } else {\n // Transport-level failure (no specific API): update global counter\n h.consecutiveFailures++\n h.lastFailureTime = Date.now()\n }\n }\n\n /**\n * A response that failed the caller's payload validation is a decisive,\n * reproducible node fault — the node answered 200 with data the caller KNOWS\n * to be impossible — so it trips the per-API cooldown immediately instead of\n * accruing ordinary strikes. Deliberately its own method rather than\n * recordFailure × N: ordinary strikes are cleared by any success, and a\n * top-ranked lying node keeps recording successes on the unvalidated calls\n * between probes, which would reset its strikes forever and keep it in\n * rotation (observed live). Scope stays per-API: the node may be perfectly\n * healthy for its other API families.\n */\n recordDefectiveResponse(node: string, api: string): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n existing.count = Math.max(existing.count + 1, MAX_API_FAILURES_BEFORE_COOLDOWN)\n existing.lastFailureTime = now\n existing.cooldownUntil = now + API_COOLDOWN_MS\n existing.defective = true\n h.apiFailures.set(api, existing)\n }\n\n /**\n * Cool down a rate-limited node. Honors an explicit server `Retry-After`\n * (`retryAfterMs`) exactly — the server told us when to return. With no usable\n * header, applies escalating backoff: BASE, 2×BASE, 4×BASE … capped at\n * RATE_LIMIT_MAX_MS, indexed by the node's consecutive-429 streak (reset by a\n * success or after RATE_LIMIT_STREAK_RESET_MS of quiet). This stops a throttled\n * public node from being re-admitted every 10s and re-hammered under sustained\n * load, which matters most when the fleet's own unlimited node is removed.\n */\n recordRateLimit(node: string, retryAfterMs?: number): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n // Expire a stale streak so an occasional throttle hours apart doesn't compound.\n if (h.rateLimitStreak > 0 && now - h.lastRateLimitAt > RATE_LIMIT_STREAK_RESET_MS) {\n h.rateLimitStreak = 0\n }\n const hasHeader = typeof retryAfterMs === 'number' && Number.isFinite(retryAfterMs) && retryAfterMs > 0\n const cooldown = hasHeader\n ? retryAfterMs!\n : Math.min(RATE_LIMIT_BASE_MS * 2 ** h.rateLimitStreak, RATE_LIMIT_MAX_MS)\n // Only a header-less 429 advances the escalation streak — an explicit Retry-After is\n // honored exactly and must not compound the header-less backoff (else several\n // Retry-After 429s would push a later header-less 429 straight to the 60s cap).\n if (!hasHeader) h.rateLimitStreak++\n h.lastRateLimitAt = now\n // Explicit Retry-After is honored exactly (the server's current instruction). A\n // header-less cooldown may only move the window FORWARD — it must never truncate a\n // longer window already set, e.g. a node parked for an hour by an explicit\n // Retry-After that is later retried as a last resort and returns a header-less 429\n // must not have its 1h window cut down to the 10s base.\n h.rateLimitedUntil = hasHeader\n ? now + cooldown\n : Math.max(h.rateLimitedUntil, now + cooldown)\n h.consecutiveFailures++\n h.lastFailureTime = now\n }\n\n /** Record an observed head_block_number for this node. */\n recordHeadBlock(node: string, blockNum: number): void {\n if (!blockNum || !Number.isFinite(blockNum)) return\n const h = this.getOrCreate(node)\n h.headBlock = blockNum\n h.headBlockUpdatedAt = Date.now()\n }\n\n /**\n * Consensus head block from recent observations. Uses the median rather than the\n * max to prevent a single bad/misconfigured node from poisoning the reference.\n * A node reporting an inflated head_block won't affect the median unless the\n * majority of nodes agree on that range.\n */\n private consensusHeadBlock(): number {\n const now = Date.now()\n const recent: number[] = []\n for (const h of this.health.values()) {\n if (h.headBlock > 0 && now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS) {\n recent.push(h.headBlock)\n }\n }\n if (recent.length < 2) return 0 // Need at least 2 observations to compare\n recent.sort((a, b) => a - b)\n // Median: for even length, use the lower-middle value (conservative)\n return recent[Math.floor((recent.length - 1) / 2)]\n }\n\n /** True if this node is healthy (globally and for the given API if provided). */\n isNodeHealthy(node: string, api?: string): boolean {\n const h = this.health.get(node)\n if (!h) return true // unknown nodes assumed healthy\n const now = Date.now()\n\n // Rate-limited and cooldown hasn't expired\n if (h.rateLimitedUntil > now) return false\n\n // Too many consecutive failures within the last 30 seconds\n if (h.consecutiveFailures >= 3 && now - h.lastFailureTime < 30_000) return false\n\n // Per-API cooldown: node may be healthy overall but missing this API plugin\n if (api) {\n const apiFail = h.apiFailures.get(api)\n if (apiFail && apiFail.cooldownUntil > now) return false\n }\n\n // Head-block staleness: deprioritize nodes lagging behind the consensus head\n const best = this.consensusHeadBlock()\n if (\n best > 0 &&\n h.headBlock > 0 &&\n now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS &&\n best - h.headBlock > STALE_BLOCK_THRESHOLD\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Order nodes best-first: healthy nodes sorted by adaptive latency score, then\n * unhealthy nodes appended. Capability / staleness / rate-limit filtering stays in\n * `isNodeHealthy` and is unchanged — latency only reorders WITHIN the healthy set,\n * and only WITHIN the array it is handed (so it never leaves the configured list).\n *\n * One ordering per pass MAY promote a healthy node overdue for a re-probe (never\n * sampled, or not sampled within LATENCY_REPROBE_MS) to the front — single-flight\n * via `lastProbeAt`. This is what lets a demoted node climb back when it recovers,\n * and profiles a node that organic traffic (always served by a faster peer) never\n * reaches. Cold start: with no profiles, every node scores the neutral prior and the\n * stable config-index tiebreak yields the original order — i.e. today's behavior.\n */\n getOrderedNodes(nodes: string[], api?: string): string[] {\n const healthy: string[] = []\n const unhealthy: string[] = []\n for (const node of nodes) {\n if (this.isNodeHealthy(node, api)) {\n healthy.push(node)\n } else {\n unhealthy.push(node)\n }\n }\n if (healthy.length <= 1) {\n return [...healthy, ...unhealthy]\n }\n const now = Date.now()\n // Every score in THIS pass falls back to config index on ties → a total,\n // transitive order with no memo (so no stale-denominator inversions).\n const ordered = healthy\n .map((node, i) => ({ node, i, score: this.scoreNode(node, now) }))\n .sort((a, b) => a.score - b.score || a.i - b.i)\n .map((d) => d.node)\n const probe = this.pickReprobeCandidate(healthy, now)\n if (probe && ordered[0] !== probe) {\n return [probe, ...ordered.filter((n) => n !== probe), ...unhealthy]\n }\n return [...ordered, ...unhealthy]\n }\n\n /** A node's latency is usable for ranking only if profiled (≥ MIN_SAMPLES) and fresh. */\n private isLatencyUsable(h: NodeHealth | undefined, now: number): boolean {\n return (\n !!h &&\n h.ewmaLatencyMs !== undefined &&\n h.latencySampleCount >= LATENCY_MIN_SAMPLES &&\n now - h.latencyUpdatedAt <= LATENCY_MAX_AGE_MS\n )\n }\n\n /**\n * Ranking score (lower = better). Unproven/warming nodes get a fixed neutral prior\n * so they sit ahead of a proven-slow node but behind a proven-fast one, and make at\n * most one rank transition when they cross MIN_SAMPLES (no churn).\n */\n private scoreNode(node: string, now: number): number {\n const h = this.health.get(node)\n if (!this.isLatencyUsable(h, now)) return LATENCY_UNPROVEN_PRIOR_MS\n return h!.ewmaLatencyMs!\n }\n\n /**\n * At most one healthy node overdue for an exploratory re-probe: never sampled, or\n * neither sampled nor re-probed within LATENCY_REPROBE_MS. Returns the stalest such\n * node and stamps `lastProbeAt` to single-flight it against concurrent orderings.\n *\n * Note: `getOrCreate` here materializes a health entry per node in the passed list.\n * The node list (`config.nodes`/`restNodes`) is treated as effectively static — set\n * once via `setNodes` — so the map is bounded. If a host is ever removed from the\n * list at runtime its stale entry is simply ignored (never re-surfaced) and is a\n * negligible, bounded amount of memory.\n */\n private pickReprobeCandidate(healthy: string[], now: number): string | undefined {\n const threshold = now - LATENCY_REPROBE_MS\n let cand: string | undefined\n let candTouch = Infinity\n for (const n of healthy) {\n const h = this.getOrCreate(n)\n const touch = Math.max(h.latencyUpdatedAt, h.lastProbeAt)\n if (touch <= threshold && touch < candTouch) {\n cand = n\n candTouch = touch\n }\n }\n if (cand) this.getOrCreate(cand).lastProbeAt = now\n return cand\n }\n}\n\n// Exported for the co-located specs only (asserting the call sites' effect on\n// health). Not re-exported by hive-tx/index.ts, so NOT part of the public API.\n// @internal\nexport const rpcHealthTracker = new NodeHealthTracker()\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\n\n// ── Hedged-request budget ────────────────────────────────────────────────────\n\n/**\n * Token bucket bounding hedged (duplicated) read requests to a fraction of\n * overall traffic. A hedge spends 1 token; every un-hedged success refills\n * `config.resilience.hedgeRefillPerSuccess` (default 0.1 ⇒ steady-state hedge\n * rate ≤ ~9% of successful traffic, with bursts up to `hedgeBucketCapacity`).\n * The self-limiting property this buys: under pool-wide slowness nearly every\n * request wants to hedge while successes (the refills) stagnate, so the bucket\n * drains and hedging auto-disables instead of doubling load into public-node\n * rate limits — the standard hedged-request guard (cf. gRPC's hedging throttle;\n * Dean & Barroso, \"The Tail at Scale\"). One instance per process shared across\n * concurrent calls; plain synchronous mutation is race-free on the JS event\n * loop. Reads config live so runtime tuning via `setResilience` applies.\n * @internal Exported for testing only.\n */\nexport class HedgeBudget {\n private tokens = config.resilience.hedgeBucketCapacity\n\n trySpend(): boolean {\n this.clamp()\n // Epsilon guards fractional-refill float accumulation (10 × 0.1 < 1 in FP64).\n if (this.tokens >= 1 - 1e-9) {\n this.tokens -= 1\n return true\n }\n return false\n }\n\n refill(): void {\n this.clamp()\n this.tokens = Math.min(\n config.resilience.hedgeBucketCapacity,\n this.tokens + config.resilience.hedgeRefillPerSuccess\n )\n }\n\n /** Capacity may be lowered at runtime; never let stored tokens exceed it. */\n private clamp(): void {\n if (this.tokens > config.resilience.hedgeBucketCapacity) {\n this.tokens = config.resilience.hedgeBucketCapacity\n }\n }\n\n /** @internal test hook */\n get available(): number {\n return this.tokens\n }\n\n /** @internal test hook */\n reset(tokens = config.resilience.hedgeBucketCapacity): void {\n this.tokens = tokens\n }\n}\n\n// @internal — exported for the co-located spec only, like the trackers above.\nexport const rpcHedgeBudget = new HedgeBudget()\n\n/**\n * Per-attempt timeout for a read call. A node profiled for THIS profile key\n * (full RPC method / REST api+endpoint template) is given `factor × EWMA` —\n * floored (≥2s) so a moderate spike on a fast call is not cut off, and capped\n * at the caller's ceiling so this can only ever *shorten* the wait. The\n * effect: a node running far above its own baseline for this exact kind of\n * call is abandoned early and failover starts in seconds instead of the full\n * fixed window.\n *\n * Two deliberate exclusions:\n * - `explicit` callers (who passed a timeout argument) keep exactly what they\n * asked for — the documented meaning of the parameter is preserved, and a\n * consumer who knows their call is heavy is never second-guessed.\n * - The profile is per (node, full method) with NO fallback to the node's\n * mixed global EWMA or even the API-prefix average: a baseline dominated by\n * cheap `condenser_api.get_accounts` calls must not set the deadline for a\n * heavy `condenser_api.get_account_history`. An unprofiled (node, method)\n * pair keeps the caller's timeout unchanged (cold start == old behavior).\n */\nfunction adaptiveAttemptTimeout(\n tracker: NodeHealthTracker,\n node: string,\n profileKey: string,\n callerTimeout: number,\n explicit: boolean\n): number {\n const r = config.resilience\n if (!r.adaptiveTimeout || explicit) return callerTimeout\n const ewma = tracker.getUsableLatencyMs(node, profileKey)\n if (ewma === undefined) return callerTimeout\n // EWMAs are fractional, but the result feeds AbortSignal.timeout(), which\n // Node rejects with ERR_OUT_OF_RANGE for non-integer delays (browsers coerce).\n return Math.ceil(\n Math.min(callerTimeout, Math.max(r.adaptiveTimeoutFloorMs, r.adaptiveTimeoutFactor * ewma))\n )\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/** Record a caught error on the health tracker (handles NodeError to avoid double-counting). */\nfunction recordError(tracker: NodeHealthTracker, node: string, e: any, api?: string): void {\n if (e instanceof NodeError) {\n if (e.isRateLimit) {\n // 0 → no usable Retry-After → let recordRateLimit apply escalating backoff.\n tracker.recordRateLimit(node, e.rateLimitMs || undefined)\n } else {\n tracker.recordFailure(node, api)\n }\n } else if (e instanceof RPCError) {\n // RPC-level errors are API-specific (e.g., disabled API)\n tracker.recordFailure(node, api)\n } else {\n // Transport-level failures (DNS, TLS, timeout) affect the whole node\n tracker.recordFailure(node)\n }\n}\n\n/**\n * Passively extract head_block_number from known RPC responses\n * (e.g. `condenser_api.get_dynamic_global_properties`, `database_api.get_dynamic_global_properties`).\n * Silently ignores responses without that shape.\n */\nfunction tryRecordHeadBlock(\n tracker: NodeHealthTracker,\n node: string,\n method: string,\n result: any\n): void {\n if (!result || typeof result !== 'object') return\n if (!method.includes('get_dynamic_global_properties')) return\n const block = (result as any).head_block_number\n if (typeof block === 'number') {\n tracker.recordHeadBlock(node, block)\n }\n}\n\n// ── AbortSignal helpers (browser fallbacks) ─────────────────────────────────\n\n/**\n * Build a TimeoutError \"reason\" for an aborted signal.\n * Prefers the standard `DOMException` when available. Runtimes that ship\n * `AbortController` without `DOMException` (notably React Native / Hermes,\n * old Node < 17) fall back to a plain Error tagged with `name: 'TimeoutError'`\n * — which is what consumers actually check on `signal.reason`.\n */\nfunction createTimeoutReason(): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException('The operation was aborted due to timeout', 'TimeoutError')\n }\n const err = new Error('The operation was aborted due to timeout')\n err.name = 'TimeoutError'\n return err\n}\n\n/** AbortSignal.timeout polyfill for pre-Chrome 103 / pre-Safari 16.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to clear the dangling timer. */\nfunction createTimeoutSignal(ms: number): { signal: AbortSignal; cleanup: () => void } {\n // Node's AbortSignal.timeout throws ERR_OUT_OF_RANGE on fractional delays\n // (browsers coerce them), so guard every caller here.\n ms = Math.ceil(ms)\n if (typeof AbortSignal.timeout === 'function') {\n return { signal: AbortSignal.timeout(ms), cleanup: () => {} }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(createTimeoutReason()), ms)\n return { signal: controller.signal, cleanup: () => clearTimeout(timer) }\n}\n\n/** AbortSignal.any polyfill for pre-Chrome 116 / pre-Safari 17.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to remove listeners from the input signals (prevents leaks when the\n * same long-lived signal is reused across many callRPC invocations). */\nfunction mergeSignals(\n primary: AbortSignal,\n secondary?: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!secondary) return { signal: primary, cleanup: () => {} }\n if (typeof AbortSignal.any === 'function') {\n return { signal: AbortSignal.any([primary, secondary]), cleanup: () => {} }\n }\n // Fallback: controller that aborts with the winning signal's reason\n const controller = new AbortController()\n if (primary.aborted) {\n controller.abort(primary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n if (secondary.aborted) {\n controller.abort(secondary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n\n const onPrimaryAbort = () => controller.abort(primary.reason)\n const onSecondaryAbort = () => controller.abort(secondary.reason)\n primary.addEventListener('abort', onPrimaryAbort, { once: true })\n secondary.addEventListener('abort', onSecondaryAbort, { once: true })\n\n const cleanup = () => {\n primary.removeEventListener('abort', onPrimaryAbort)\n secondary.removeEventListener('abort', onSecondaryAbort)\n }\n return { signal: controller.signal, cleanup }\n}\n\n/**\n * Low-level JSON-RPC call to a single node. No failover.\n * Throws RPCError for blockchain rejections, NodeError for HTTP 429/5xx,\n * and generic Error for other transport failures.\n * @param shouldRetry - If true, retries once on the same node for transient errors.\n */\nconst jsonRPCCall = async (\n url: string,\n method: string,\n params: any,\n timeout = config.timeout,\n shouldRetry = false,\n externalSignal?: AbortSignal\n) => {\n const id = Math.floor(Math.random() * 100_000_000)\n const body = {\n jsonrpc: '2.0',\n method,\n params,\n id\n }\n // Merge the per-call timeout with any external abort signal (e.g., SSR\n // request cancellation). Either one firing cancels the fetch.\n // Fallbacks for browsers without AbortSignal.timeout (pre-Chrome 103)\n // or AbortSignal.any (pre-Chrome 116).\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\n const { signal, cleanup: cleanupMerge } = mergeSignals(tSignal, externalSignal)\n const cleanup = () => {\n cleanupTimeout()\n cleanupMerge()\n }\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...serverIdentityHeaders() },\n signal\n })\n\n // Handle HTTP-level errors before parsing JSON.\n // Throw NodeError so callers can record health exactly once.\n if (res.status === 429) {\n throw new NodeError(url, `HTTP 429 Rate Limited`, {\n rateLimitMs: parseRetryAfterMs(res.headers.get('Retry-After')),\n isRateLimit: true\n })\n }\n // Any other 5xx is a node-level failure. Common cases:\n // 502 Bad Gateway — upstream HAF/jussi down\n // 503 Service Unavail — node draining / maintenance\n // 504 Gateway Timeout — slow upstream\n // 520-530 — Cloudflare interstitials (1033 tunnel error → 530)\n // Without this branch, the HTML error-page body would fall into res.json()\n // and throw a generic SyntaxError downstream, making failover guess at\n // whether the request reached the node.\n if (res.status >= 500 && res.status < 600) {\n throw new NodeError(url, `HTTP ${res.status} from ${url}`)\n }\n\n const result = (await res.json()) as CallResponse\n if (\n !result ||\n typeof result.id === 'undefined' ||\n result.id !== id ||\n result.jsonrpc !== '2.0'\n ) {\n throw new Error('JSONRPC id mismatch')\n }\n if ('result' in result) {\n return result.result\n }\n if ('error' in result) {\n const e = result.error\n if ('message' in e && 'code' in e) {\n throw new RPCError(e)\n }\n throw result.error\n }\n // No result and no error?\n throw result\n } catch (e) {\n if (e instanceof RPCError) {\n throw e\n }\n // NodeError should not be retried on the same node - it's an HTTP status issue\n if (e instanceof NodeError) {\n throw e\n }\n if (externalSignal?.aborted) {\n throw e\n }\n if (shouldRetry) {\n return jsonRPCCall(url, method, params, timeout, false, externalSignal)\n }\n throw e\n } finally {\n cleanup()\n }\n}\n\n/** Small jitter delay between failover attempts to prevent thundering herd. */\nfunction jitterDelay(): Promise {\n return sleep(50 + Math.random() * 50)\n}\n\n// ── Hedged read attempt ─────────────────────────────────────────────────────\n\n/**\n * One hedged READ attempt: start the primary node, and if it is still pending\n * after `max(hedgeDelayFloorMs, hedgeDelayFactor × primary EWMA)`, race a\n * duplicate against the next healthy untried node. First success wins and the\n * loser is aborted. Resolution rules (mirroring the sequential path exactly):\n *\n * - External abort (caller cancelled): reject immediately, record nothing.\n * - Authoritative RPCError (non-node-level blockchain rejection) from either\n * leg: an answer, not a fault — abort the other leg, reject immediately.\n * - Failover-class failure: record health for that leg (recordError +\n * recordSlowFailure — identical to the sequential catch); if the other leg\n * is still running, keep waiting on it; when both have failed, reject with\n * the last error so the outer loop continues its normal failover.\n * - Primary fails BEFORE the hedge fires: reject immediately (plain failover —\n * hedging only ever races slowness, never a node that failed fast).\n *\n * Health/budget bookkeeping on a win: winner records a normal success sample;\n * if the hedge won, the primary gets a censored latency sample (elapsed at\n * abort — a lower bound on its true latency) so repeated hedge-wins reorder\n * the pool; if the primary won without the hedge ever firing, the budget\n * refills. An aborted hedge leg records nothing (it was never given a fair\n * run). Broadcasts NEVER go through this path (double-broadcast risk) — it is\n * wired into `callRPC` only.\n */\nfunction hedgedRpcAttempt(opts: {\n method: string\n params: any[] | object\n api: string\n primary: string\n /**\n * Pre-selected healthy untried peers (up to a few, in rank order). The\n * actual hedge target is drawn uniformly at random at FIRE time: with many\n * concurrent callers behind one origin IP, always duplicating to the single\n * next-ranked node would concentrate the whole hedge stream on it and could\n * trip its per-IP rate limit — spreading over the top candidates keeps the\n * same budget bound without a single-target hotspot. Marked tried only if\n * the hedge actually fires.\n */\n hedgePool: string[]\n callerTimeout: number\n /** Caller passed an explicit timeout — adaptive shortening is disabled. */\n explicitTimeout: boolean\n /** The call's wall-clock deadline: a hedge must not START past it (it would\n * be a brand-new request the outer loop itself would refuse to start). */\n deadlineAt: number\n externalSignal?: AbortSignal\n /** Lets the outer loop add the hedge node to its tried-set at fire time. */\n onHedgeFired: (node: string) => void\n /** Caller-supplied payload validation — see callRPC's `validate` param. */\n validate?: (result: unknown) => boolean\n}): Promise {\n const {\n method,\n params,\n api,\n primary,\n hedgePool,\n callerTimeout,\n explicitTimeout,\n deadlineAt,\n externalSignal,\n onHedgeFired,\n validate\n } = opts\n return new Promise((resolve, reject) => {\n let done = false\n let pendingLegs = 0\n let hedgeFired = false\n /** The primary settled on its own (success OR failure). A censored latency\n * sample is only valid for a primary that was still in flight when the\n * hedge won — recording one after the primary already failed would\n * fabricate a second sample for a request whose outcome was recorded. */\n let primarySettled = false\n let lastError: any\n let hedgeTimer: ReturnType | undefined\n let primaryStart = 0\n const controllers: AbortController[] = []\n\n /** Settle exactly once: clear the timer, abort every other in-flight leg\n * (their rejections land behind the `done` guard and are dropped). */\n const finish = (settle: () => void) => {\n if (done) return\n done = true\n if (hedgeTimer !== undefined) {\n clearTimeout(hedgeTimer)\n hedgeTimer = undefined\n }\n for (const c of controllers) {\n if (!c.signal.aborted) c.abort()\n }\n settle()\n }\n\n const startLeg = (node: string, isHedge: boolean) => {\n pendingLegs++\n const controller = new AbortController()\n controllers.push(controller)\n // Merge our cancellation handle with the caller's signal; jsonRPCCall\n // merges the result with its own per-attempt timeout signal.\n const merged = mergeSignals(controller.signal, externalSignal)\n const legTimeout = adaptiveAttemptTimeout(\n rpcHealthTracker,\n node,\n method,\n callerTimeout,\n explicitTimeout\n )\n const start = Date.now()\n if (!isHedge) primaryStart = start\n jsonRPCCall(node, method, params, legTimeout, false, merged.signal)\n .then((res) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Same handling as the catch\n // path — record the fault against this node's API health, never\n // record a success for a lie, and let the other leg still win.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(\n `[hive-tx] response validation failed for ${method} from ${node}`\n )\n if (!isHedge && !hedgeFired) {\n finish(() => reject(lastError))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n return\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - start, method)\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n if (isHedge) {\n if (!primarySettled) {\n // Primary lost the race while still in flight: censored sample\n // (lower bound of its true latency) so the ranker learns without\n // marking it as failed. A primary that already failed was fully\n // recorded by its own catch — nothing more to record.\n rpcHealthTracker.recordCensoredLatency(primary, Date.now() - primaryStart, method)\n }\n } else if (!hedgeFired) {\n rpcHedgeBudget.refill()\n }\n finish(() => resolve(res as T))\n })\n .catch((e) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return // aborted loser (or late settle) — already resolved\n if (externalSignal?.aborted) {\n // Caller cancelled — bail without recording (mirrors sequential path).\n finish(() => reject(e))\n return\n }\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n // Authoritative rejection: an answer, not a node fault.\n finish(() => reject(e))\n return\n }\n // Failover-class failure — record exactly as the sequential catch does.\n recordError(rpcHealthTracker, node, e, api)\n rpcHealthTracker.recordSlowFailure(node, Date.now() - start, method)\n lastError = e\n if (!isHedge && !hedgeFired) {\n // Primary failed fast, before the hedge delay: plain failover.\n finish(() => reject(e))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n // else: the other leg is still in flight and may still win.\n })\n }\n\n startLeg(primary, false)\n\n // Delay from the primary's per-method profile (the eligibility gate\n // ensured it is usable); a raced expiry just means the floor applies. It is\n // then clamped BELOW the primary's own attempt window: for a heavy API\n // (EWMA > window/hedgeDelayFactor) the un-clamped delay would land past\n // the primary's timeout-abort — which clears this timer — so hedging would\n // silently never fire for exactly the heavy tail it exists to protect.\n // Firing at ~80% of the window keeps the duplicate meaningful (it starts\n // while the primary is still allowed to win) for every profile shape.\n const ewma = rpcHealthTracker.getUsableLatencyMs(primary, method) ?? 0\n const primaryWindow = adaptiveAttemptTimeout(\n rpcHealthTracker,\n primary,\n method,\n callerTimeout,\n explicitTimeout\n )\n const delay = Math.min(\n Math.max(config.resilience.hedgeDelayFloorMs, config.resilience.hedgeDelayFactor * ewma),\n 0.8 * primaryWindow\n )\n hedgeTimer = setTimeout(() => {\n hedgeTimer = undefined\n if (done || externalSignal?.aborted) return\n // Never START a duplicate past the call's wall-clock deadline — it would\n // extend the hold and spend a token on work the outer loop would refuse.\n if (Date.now() >= deadlineAt) return\n // Candidates were selected before the delay elapsed — re-check health at\n // fire time (one may have been rate-limited meanwhile) BEFORE spending a\n // token, so a stale pool costs nothing. Random draw spreads concurrent\n // callers' duplicates across the top candidates (see hedgePool doc).\n const live = hedgePool.filter((n) => rpcHealthTracker.isNodeHealthy(n, api))\n if (live.length === 0) return\n const target = live[Math.floor(Math.random() * live.length)]\n // Budget check at fire time, not arm time: only actual duplicates spend.\n if (!rpcHedgeBudget.trySpend()) return\n hedgeFired = true\n onHedgeFired(target)\n startLeg(target, true)\n }, delay)\n })\n}\n\n// ── Public API: callRPC ─────────────────────────────────────────────────────\n\n/**\n * Makes API calls to Hive blockchain nodes with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, jitter between retries,\n * and HTTP status awareness (429 rate limiting, 503).\n *\n * If the current node fails, it will automatically try the next healthy node.\n * When all nodes have been tried, wraps around to give earlier nodes another chance\n * until the full retry budget (config.retry) is exhausted.\n * RPCErrors (valid blockchain rejections) are never retried.\n *\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Maximum number of retry attempts (default: config.retry). The\n * wall-clock budget (`config.resilience.totalBudgetFactor` × timeout) may end\n * the failover walk before the retry count is exhausted.\n * @param validate - Optional payload validation. Some nodes return a valid\n * JSON-RPC envelope carrying an impossible payload (e.g. account rows with\n * metadata fields stripped to \"\"), which no transport-level check can catch.\n * When the callback returns false the response is treated as a node fault:\n * recorded against that node's per-API health (repeat offenders get an API\n * cooldown and are deprioritized) and the failover walk continues to the\n * next node instead of returning the lie. Keep validators conservative —\n * reject only payloads the caller KNOWS cannot be correct, or a strict\n * validator turns every node's honest answer into a failover storm.\n * @returns Promise resolving to the API response\n * @throws {RPCError} On blockchain-level errors (bad params, missing authority, etc.)\n * @throws {Error} If all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callRPC } from 'hive-tx'\n *\n * // Get account information\n * const accounts = await callRPC('condenser_api.get_accounts', [['alice']])\n *\n * // Custom timeout and retry settings\n * const data = await callRPC('condenser_api.get_content', ['alice', 'test-post'], 10_000, 5)\n * ```\n */\nexport const callRPC = async (\n method: string,\n params: any[] | object = [],\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal,\n validate?: (result: unknown) => boolean\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n // An explicit timeout argument is authoritative: adaptive shortening only\n // applies to callers who left the window to the SDK (timeout === undefined),\n // so `callRPC(m, p, 10_000)` still means \"give each attempt 10s\" exactly.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const api = apiOf(method)\n // Wall-clock budget across ALL failover attempts. Without it the worst case\n // is (retry+1) × timeout ≈ 30s — exactly the render pile-up this feature\n // exists to prevent — whenever the WHOLE pool is slow (adaptive timeouts\n // rise with the EWMAs and hedging self-throttles, both by design). The\n // deadline is checked before each new attempt AND before a hedge fires; an\n // in-flight attempt still finishes its own window, so the true ceiling is\n // deadline + one attempt window (up to ~2× the window if a hedge fired just\n // before the deadline and the attempt then waits out the hedge leg too).\n // Note this budget also bounds callers who passed an explicit `retry`: the\n // wall clock, not the attempt count, is the stronger promise here.\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Track nodes tried in the current round. When all nodes have been tried,\n // clear the set to allow a second round (wrap-around) using the retry budget.\n const triedInRound = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so nodes with an API-specific cooldown are deprioritized.\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n // Pick the healthiest untried node. If all tried, start a new round.\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n\n // Hedge eligibility for THIS attempt: opted in, the primary has a usable\n // latency profile for this exact method (so the hedge delay is grounded in\n // data — cold starts stay sequential), and healthy untried peers exist.\n let hedgePool: string[] = []\n if (\n config.resilience.hedge &&\n rpcHealthTracker.getUsableLatencyMs(node, method) !== undefined\n ) {\n hedgePool = orderedNodes\n .filter((n) => !triedInRound.has(n) && rpcHealthTracker.isNodeHealthy(n, api))\n .slice(0, 3)\n }\n\n if (hedgePool.length > 0) {\n try {\n // All health/budget recording happens inside the hedged attempt —\n // the catch below must NOT record again (unlike the sequential path).\n return await hedgedRpcAttempt({\n method,\n params,\n api,\n primary: node,\n hedgePool,\n callerTimeout: ceiling,\n explicitTimeout,\n deadlineAt: deadline,\n externalSignal: signal,\n onHedgeFired: (n) => triedInRound.add(n),\n validate\n })\n } catch (e: any) {\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n lastError = e\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n }\n\n const callStart = Date.now()\n try {\n const res = await jsonRPCCall(\n node,\n method,\n params,\n adaptiveAttemptTimeout(rpcHealthTracker, node, method, ceiling, explicitTimeout),\n false,\n signal\n )\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Count it against this node's API\n // health (never record a success or refill the hedge budget for a\n // lie) and fail over to the next node.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(`[hive-tx] response validation failed for ${method} from ${node}`)\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart, method)\n // An un-hedged success is what earns hedge budget back (see HedgeBudget).\n rpcHedgeBudget.refill()\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n return res as T\n } catch (e: any) {\n // RPCErrors: distinguish node-level failures from genuine blockchain rejections.\n // Node-level errors (e.g. -32602 \"Unable to parse endpoint data\" from a sick\n // HAF/jussi backend) should failover; real rejections (bad params, missing\n // authority, etc.) propagate immediately.\n if (e instanceof RPCError) {\n if (!isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n // Node-level RPC error — record failure and fall through to failover\n }\n // External abort — stop retrying immediately\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n // A genuinely slow failure (timeout/abort/slow-5xx) is also a latency signal so\n // a node that 200s-but-too-slow or aborts at the timeout is demoted by the\n // ranker, not only by the (transient) failure gate. Measured elapsed, never a\n // constant; recordSlowFailure ignores instant (down-node) failures.\n rpcHealthTracker.recordSlowFailure(node, Date.now() - callStart, method)\n lastError = e\n\n // Add jitter before trying next node\n if (attempt < retry) {\n await jitterDelay()\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callRPC for broadcasts ──────────────────────────────────────\n\n/**\n * Broadcast-safe RPC call. Only retries on pre-connection errors where the\n * request definitively never reached the server (ECONNREFUSED, ENOTFOUND, etc.).\n * On timeouts, HTTP errors, or any ambiguous failure, throws immediately to\n * prevent double-broadcasting transactions.\n *\n * Tries each node once (no wrap-around) since broadcast retries are dangerous.\n *\n * @internal Used by Transaction.broadcast()\n */\nexport const callRPCBroadcast = async (\n method: string,\n params: any[] | object = [],\n timeout = config.broadcastTimeout,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n const api = apiOf(method)\n // Track which nodes we've already tried - broadcasts must never retry the same node\n const triedNodes = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt < config.nodes.length; attempt++) {\n // Re-evaluate order each attempt so health changes are respected\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n const node = orderedNodes.find((n) => !triedNodes.has(n))\n if (!node) break\n triedNodes.add(node)\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n // Deliberately no latency sample for broadcasts: broadcast_transaction_synchronous\n // blocks for block inclusion (~1.5–3s+) regardless of the node's read speed, so\n // feeding it into the shared read EWMA would wrongly demote a fast node for reads.\n // The same nodes are profiled by callRPC read traffic, so a genuinely slow node is\n // still demoted there.\n rpcHealthTracker.recordSuccess(node, api)\n return res as T\n } catch (e: any) {\n // RPCErrors are valid blockchain rejections - never retry\n if (e instanceof RPCError) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n lastError = e\n\n // Broadcast safety: only fail over when the request is safe to re-send.\n // `broadcastOperations` signs the tx exactly once and `callRPCBroadcast`\n // reuses that signed payload across nodes, so any case where the next\n // node would dedupe by trx_id is fine. RPCErrors (real blockchain\n // rejections) propagate immediately — see isBroadcastSafeToRetry.\n if (!isBroadcastSafeToRetry(e)) {\n throw e\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callREST ────────────────────────────────────────────────────\n\nconst apiMethods: Record = {\n balance: '/balance-api',\n hafah: '/hafah-api',\n hafbe: '/hafbe-api',\n hivemind: '/hivemind-api',\n hivesense: '/hivesense-api',\n reputation: '/reputation-api',\n 'nft-tracker': '/nft-tracker-api',\n hafsql: '/hafsql',\n status: '/status-api'\n}\n\n/**\n * Makes REST API calls to Hive blockchain REST endpoints with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, and timeout support.\n * Wraps around the node list to honor the full retry budget.\n *\n * @template Api - The REST API method type (e.g., 'balance', 'hafah', 'hivemind', etc.)\n * @template P - The endpoint path type for the specified API\n *\n * @param api - The REST API method name to call\n * @param endpoint - The specific endpoint path within the API\n * @param params - Optional parameters for path and query string replacement\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Number of retry attempts before throwing an error (default:\n * config.retry). The wall-clock budget (`config.resilience.totalBudgetFactor`\n * × timeout) may end the failover walk before the retry count is exhausted.\n *\n * @returns Promise resolving to the API response data with proper typing\n * @throws Error if all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callREST } from 'hive-tx'\n *\n * // Get account balance\n * const balance = await callREST('balance', '/accounts/{account-name}/balances', { \"account-name\": 'alice' })\n *\n * // Custom timeout and retry settings\n * const data = await callREST('status', '/status', undefined, 10_000, 3)\n * ```\n */\nexport async function callREST(\n api: APIMethods,\n endpoint: string,\n params?: Record,\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal\n): Promise {\n if (!Array.isArray(config.restNodes)) {\n throw new Error('config.restNodes is not an array')\n }\n if (config.restNodes.length === 0) {\n throw new Error('config.restNodes is empty')\n }\n // Same contract as callRPC: an explicit timeout argument is authoritative\n // (no adaptive shortening), and a wall-clock deadline bounds the total\n // failover walk when the whole pool is slow.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Latency-profile key: api + endpoint TEMPLATE (pre-substitution, so the\n // cardinality is code-defined) — a cheap endpoint's baseline must not set\n // the deadline for a heavy one within the same REST api.\n const restProfileKey = `${api}:${endpoint}`\n // Per-API node override: an API served by only a subset of nodes (e.g.\n // hivesense) uses its own capable-host list so the small retry budget and\n // cold starts aren't wasted on nodes that 404/503 it. Any API without an\n // override (or with an empty one) falls back to the generic restNodes.\n const apiNodes =\n config.restNodesByApi?.[api]?.length\n ? config.restNodesByApi[api]!\n : config.restNodes\n const triedInRound = new Set()\n let lastError: any\n // Track whether the error was already recorded by the HTTP status handler\n let alreadyRecorded = false\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so per-API cooldowns are respected.\n const orderedNodes = restHealthTracker.getOrderedNodes(apiNodes, api)\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n const baseUrl = node + apiMethods[api]\n let path = endpoint as string\n const paramObj = params || ({} as Record)\n const processedPathParams = new Set()\n\n // Replace path params ONLY\n Object.entries(paramObj).forEach(([key, value]) => {\n if (path.includes(`{${key}}`)) {\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)))\n processedPathParams.add(key)\n }\n })\n const url = new URL(baseUrl + path)\n // Add ONLY remaining params as query (if any)\n Object.entries(paramObj).forEach(([key, value]) => {\n if (!processedPathParams.has(key)) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n })\n\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n alreadyRecorded = false\n // Adaptive per-attempt timeout (see adaptiveAttemptTimeout): a profiled\n // REST node is abandoned at factor×EWMA instead of the full fixed window.\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(\n adaptiveAttemptTimeout(restHealthTracker, node, restProfileKey, ceiling, explicitTimeout)\n )\n const { signal: restSignal, cleanup: cleanupMerge } = mergeSignals(tSignal, signal)\n const restCleanup = () => { cleanupTimeout(); cleanupMerge() }\n const restCallStart = Date.now()\n try {\n const response = await fetch(url.toString(), {\n signal: restSignal,\n headers: serverIdentityHeaders()\n })\n if (response.status === 404) {\n throw new Error('HTTP 404 - Hint: can happen on wrong params')\n }\n if (response.status === 429) {\n // 0 (no usable Retry-After) → undefined → escalating backoff in recordRateLimit.\n restHealthTracker.recordRateLimit(\n node,\n parseRetryAfterMs(response.headers.get('Retry-After')) || undefined\n )\n alreadyRecorded = true\n throw new Error(`HTTP 429 Rate Limited by ${node}`)\n }\n if (response.status === 503) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP 503 Service Unavailable from ${node}`)\n }\n if (!response.ok) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP ${response.status} from ${node}`)\n }\n restHealthTracker.recordSuccess(node, api, Date.now() - restCallStart, restProfileKey)\n return response.json() as any\n } catch (e: any) {\n // 404 is not a node issue, don't failover\n if (e?.message?.includes('HTTP 404')) {\n throw e\n }\n // External abort (caller unmounted / React Query cancelled the request) is the\n // client's decision, NOT a node fault. Mirror callRPC: bail before recording any\n // failure or slow-latency sample so a healthy REST node (e.g. an own node) is never\n // demoted by routine navigation/cancellation.\n if (signal?.aborted) {\n throw e\n }\n // Only record if not already recorded by 429/503 handler above\n if (!alreadyRecorded) {\n restHealthTracker.recordFailure(node, api)\n }\n // A slow failure (timeout/abort/slow-5xx — e.g. an own node from a far region) is a\n // latency signal too, so it is demoted by the ranker, not only the failure gate.\n // Measured elapsed; recordSlowFailure floors at LATENCY_SLOW_FAILURE_MS so a fast\n // 404/429 or instant down-node failure is NOT mis-read as \"slow\".\n restHealthTracker.recordSlowFailure(node, Date.now() - restCallStart, restProfileKey)\n lastError = e\n\n if (attempt < retry) {\n await jitterDelay()\n }\n } finally {\n restCleanup()\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callWithQuorum ───────────────────────────────────────────────\n\n/**\n * Make a JSONRPC call with quorum. The method will cross-check the result\n * with `quorum` number of nodes before returning the result.\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param quorum - Default: 2 (recommended)\n */\nexport const callWithQuorum = async (\n method: string,\n params: any[] | object = [],\n quorum = 2,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an Array')\n }\n if (quorum > config.nodes.length) {\n throw new Error('quorum > config.nodes.length')\n }\n // We call random nodes for better security (Fisher-Yates shuffle)\n const shuffleNodes = (arr: string[]) => {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n }\n let allNodes = shuffleNodes(config.nodes)\n let currentBatchSize = Math.min(quorum, allNodes.length)\n let allResults: any[] = []\n while (currentBatchSize > 0 && allNodes.length > 0) {\n // Take next batch of nodes\n const batchNodes = allNodes.splice(0, currentBatchSize)\n const promises: Promise[] = []\n const batchResults: any[] = []\n // Launch batch calls in parallel\n for (let i = 0; i < batchNodes.length; i++) {\n promises.push(\n jsonRPCCall(batchNodes[i], method, params, undefined, true, signal)\n .then((data) => batchResults.push(data))\n .catch(() => {})\n )\n }\n await Promise.all(promises)\n allResults.push(...batchResults)\n // Check for consensus in successful results\n const consensusResult = findConsensus(allResults, quorum)\n if (consensusResult) {\n return consensusResult\n }\n // Prepare next batch\n currentBatchSize = Math.min(quorum, allNodes.length)\n if (currentBatchSize === 0) {\n throw new Error('No more nodes available.')\n }\n }\n throw new Error(\"Couldn't reach quorum.\")\n}\n\nfunction findConsensus(results: any[], quorum: number) {\n const resultGroups = new Map()\n for (const result of results) {\n const key = JSON.stringify(result)\n if (!resultGroups.has(key)) {\n resultGroups.set(key, [])\n }\n resultGroups.get(key)!.push(result)\n }\n const consensusGroup = Array.from(resultGroups.values()).find((group) => group.length >= quorum)\n return consensusGroup ? consensusGroup[0] : null\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { PrivateKey } from './helpers/PrivateKey'\nimport {\n OperationName,\n OperationBody,\n TransactionType,\n TransactionStatus,\n BroadcastResult\n} from './types'\nimport { ByteBuffer } from './helpers/ByteBuffer'\nimport { Serializer } from './helpers/serializer'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { config } from './config'\nimport { callRPC, callRPCBroadcast, RPCError } from './helpers/call'\nimport { DigestData } from './types'\nimport { sleep } from './helpers/sleep'\n\nconst chainId = hexToBytes(config.chain_id)\n\ninterface TransactionOptions {\n transaction?: TransactionType | Transaction\n /**\n * Transaction expiration in milliseconds (ms) - max 86400000 (24 hours)\n * @default 60_000\n */\n expiration?: number\n}\n\nexport class Transaction {\n transaction?: TransactionType\n\n expiration: number = 60_000\n\n private txId?: string\n\n constructor(options?: TransactionOptions) {\n if (options?.transaction) {\n if (options.transaction instanceof Transaction) {\n this.transaction = options.transaction.transaction\n this.expiration = options.transaction.expiration\n } else {\n this.transaction = options.transaction\n }\n // A transaction built externally (e.g. from a hive-uri signing request)\n // may omit the `signatures` array. sign(), addSignature() and broadcast()\n // all assume it exists, so normalize it here to avoid\n // \"Cannot read property 'push' of undefined\" on sign.\n if (this.transaction && !Array.isArray(this.transaction.signatures)) {\n this.transaction.signatures = []\n }\n this.txId = this.digest().txId\n }\n if (options?.expiration) {\n this.expiration = options.expiration\n }\n }\n\n /**\n * Adds an operation to the transaction. If no transaction exists, creates one first.\n * @template O Operation name type for type safety\n * @param operationName The name/type of the operation to add (e.g., 'transfer', 'vote', 'comment')\n * @param operationBody The operation data/body for the specified operation type\n * @returns Promise that resolves when the operation is added\n * @throws Error if transaction creation fails or global properties cannot be retrieved\n */\n async addOperation(\n operationName: O,\n operationBody: OperationBody\n ): Promise {\n if (!this.transaction) {\n await this.createTransaction(this.expiration)\n }\n this.transaction!.operations.push([operationName, operationBody])\n }\n\n /**\n * Signs the transaction with the provided key(s), supporting both single and multi-signature transactions.\n * For multi-signature, you can sign with all keys at once or sign individually by calling this method multiple times.\n * @param keys Single PrivateKey or array of PrivateKeys to sign the transaction with\n * @returns The signed transaction\n * @throws Error if no transaction exists to sign\n */\n sign(keys: PrivateKey | PrivateKey[]): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n if (this.transaction) {\n const { digest, txId } = this.digest()\n if (!Array.isArray(keys)) {\n keys = [keys]\n }\n for (const key of keys) {\n const signature = key.sign(digest)\n this.transaction.signatures.push(signature.customToString())\n }\n this.txId = txId\n return this.transaction\n } else {\n throw new Error('No transaction to sign')\n }\n }\n\n /**\n * Broadcasts the signed transaction to the Hive network.\n * Automatically handles retries and duplicate transaction detection.\n * @param checkStatus By default (false) the transaction is not guaranteed to be included in a block.\n * For example the transaction can expire while waiting in mempool.\n * If you pass true here, the function will wait for the transaction to be either included or dropped\n * before returning a result.\n * @returns Promise resolving to broadcast result\n * @throws Error if no transaction exists or transaction is not signed or transaction got rejected\n */\n async broadcast(checkStatus = false): Promise {\n if (!this.transaction) {\n throw new Error(\n 'Attempted to broadcast an empty transaction. Add operations by .addOperation()'\n )\n }\n if (this.transaction.signatures.length === 0) {\n throw new Error(\n 'Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)'\n )\n }\n try {\n await callRPCBroadcast('condenser_api.broadcast_transaction', [this.transaction])\n } catch (e) {\n if (e instanceof RPCError && e.message.includes('Duplicate transaction check failed')) {\n // ignore duplicate transaction error as this can happen when we retry the broadcast\n } else {\n throw e\n }\n }\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n if (!checkStatus) {\n return { tx_id: this.txId, status: 'unknown' }\n }\n // Poll until the transaction reaches a final state or max attempts exceeded.\n // With 60 attempts: delays grow from 1.3s to 19s, total wait ~10 minutes.\n const maxPollAttempts = 60\n await sleep(1000)\n let status = await this.checkStatus()\n let i = 1\n while (\n status?.status !== 'within_irreversible_block' &&\n status?.status !== 'expired_irreversible' &&\n status?.status !== 'too_old' &&\n i < maxPollAttempts\n ) {\n await sleep(1000 + i * 300)\n status = await this.checkStatus()\n i++\n }\n return {\n tx_id: this.txId,\n status: (status?.status ?? 'unknown') as BroadcastResult['status']\n }\n }\n\n /**\n * Returns the transaction digest containing the transaction ID and hash.\n * The digest can be used to verify signatures and for transaction identification.\n * @returns DigestData containing transaction ID and hash\n * @throws Error if no transaction exists\n */\n digest(): DigestData {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n const temp = { ...this.transaction }\n try {\n Serializer.Transaction(buffer, temp)\n } catch (cause) {\n throw new Error('Unable to serialize transaction: ' + cause)\n }\n buffer.flip()\n const transactionData = new Uint8Array(buffer.toBuffer())\n const txId = bytesToHex(sha256(transactionData)).slice(0, 40)\n const digest = sha256(new Uint8Array([...chainId, ...transactionData]))\n return { digest, txId }\n }\n\n /**\n * Adds a signature to an already created transaction. Useful when signing with external tools.\n * Multiple signatures can be added one at a time for multi-signature transactions.\n * @param signature The signature string in hex format (must be exactly 130 characters)\n * @returns The transaction with the added signature\n * @throws Error if no transaction exists or signature format is invalid\n */\n addSignature(signature: string): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .create(operations)')\n }\n if (typeof signature !== 'string') {\n throw new Error('Signature must be string')\n }\n if (signature.length !== 130) {\n throw new Error('Signature must be 130 characters long')\n }\n this.transaction.signatures.push(signature)\n return this.transaction\n }\n\n /** Get status of this transaction. Usually called internally after broadcasting. */\n async checkStatus(): Promise {\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n return callRPC('transaction_status_api.find_transaction', {\n transaction_id: this.txId,\n expiration: this.transaction?.expiration\n })\n }\n\n /**\n * Creates the transaction structure and initializes it with blockchain data.\n * Retrieves current head block information and sets up reference block data.\n * @private\n * @param expiration Transaction expiration in milliseconds\n */\n private createTransaction = async (expiration: number) => {\n const props = await callRPC('condenser_api.get_dynamic_global_properties', [])\n const bytes = hexToBytes(props.head_block_id)\n const refBlockPrefix = Number(new Uint32Array(bytes.buffer, bytes.byteOffset + 4, 1)[0])\n const expirationIso = new Date(Date.now() + expiration).toISOString().slice(0, -5)\n this.transaction = {\n expiration: expirationIso,\n extensions: [],\n operations: [],\n ref_block_num: props.head_block_number & 0xffff,\n ref_block_prefix: refBlockPrefix,\n signatures: []\n }\n }\n}\n","import bs58 from 'bs58'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PublicKey } from './PublicKey'\nimport { Signature } from './Signature'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport type KeyRole = 'owner' | 'active' | 'posting' | 'memo'\n\nconst NETWORK_ID = new Uint8Array([0x80])\n\n/**\n * ECDSA (secp256k1) private key for signing and encryption operations.\n * Handles key generation, derivation from seeds/passwords, and cryptographic operations.\n *\n * All private keys are stored internally as Uint8Array and can be converted to/from\n * Wallet Import Format (WIF) strings for storage and transmission.\n *\n * @example\n * ```typescript\n * // From WIF string\n * const key = PrivateKey.from('5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw')\n *\n * // Generate random key\n * const randomKey = PrivateKey.randomKey()\n *\n * // From username and password\n * const loginKey = PrivateKey.fromLogin('username', 'password')\n *\n * // Sign a message\n * const signature = key.sign(someHash)\n *\n * // Get public key\n * const pubKey = key.createPublic()\n * ```\n */\nexport class PrivateKey {\n key: Uint8Array\n\n constructor(key: Uint8Array) {\n this.key = key\n try {\n secp256k1.getPublicKey(key)\n } catch (e) {\n throw new Error('invalid private key')\n }\n }\n\n /**\n * Creates a PrivateKey instance from a WIF string or raw Uint8Array.\n * Automatically detects the input type and uses the appropriate method.\n *\n * @param value - WIF formatted string or raw 32-byte key as Uint8Array\n * @returns New PrivateKey instance\n * @throws Error if the key format is invalid\n */\n static from(value: string | Uint8Array): PrivateKey {\n if (typeof value === 'string') {\n return PrivateKey.fromString(value)\n } else {\n return new PrivateKey(value)\n }\n }\n\n /**\n * Creates a PrivateKey from a Wallet Import Format (WIF) encoded string.\n *\n * @param wif - WIF encoded private key string\n * @returns New PrivateKey instance\n * @throws Error if WIF format is invalid or checksum fails\n */\n static fromString(wif: string): PrivateKey {\n return new PrivateKey(decodePrivate(wif).subarray(1))\n }\n\n /**\n * Creates a PrivateKey from a seed string or Uint8Array.\n * The seed is hashed with SHA256 to produce the private key.\n *\n * @param seed - Seed string (converted to bytes) or raw byte array\n * @returns New PrivateKey instance derived from seed\n */\n static fromSeed(seed: string | Uint8Array): PrivateKey {\n if (typeof seed === 'string') {\n const isHex = /^[0-9a-fA-F]+$/.test(seed)\n if (isHex) {\n seed = hexToBytes(seed)\n } else {\n // Convert non-hex string to Uint8Array using UTF-8 encoding\n // Avoid top-level TextEncoder — not available on all runtimes (e.g. Hermes)\n const bytes: number[] = []\n for (let i = 0; i < seed.length; i++) {\n let c = seed.charCodeAt(i)\n if (c < 0x80) {\n bytes.push(c)\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < seed.length) {\n const next = seed.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n seed = new Uint8Array(bytes)\n }\n }\n return new PrivateKey(sha256(seed))\n }\n\n /**\n * Derives a PrivateKey from username, password, and role using Hive's key derivation scheme.\n * This generates the same keys that the Hive wallet uses for login-based keys.\n *\n * @param username - Hive username\n * @param password - Master password (or seed phrase)\n * @param role - Key role ('owner', 'active', 'posting', 'memo')\n * @returns New PrivateKey instance for the specified role\n */\n static fromLogin(username: string, password: string, role: KeyRole = 'active'): PrivateKey {\n const seed = username + role + password\n return PrivateKey.fromSeed(seed)\n }\n\n /**\n * Signs a 32-byte message hash using ECDSA and returns a recoverable signature.\n * The signature includes recovery information to allow public key recovery.\n *\n * @param message - 32-byte message hash to sign (Uint8Array)\n * @returns Signature object containing the signature data\n */\n sign(message: Uint8Array): Signature {\n const rv = secp256k1.sign(message, this.key, {\n extraEntropy: true,\n format: 'recovered',\n prehash: false // prehash does sha256 on the message\n })\n const recovery = parseInt(bytesToHex(rv.subarray(0, 1)), 16)\n return Signature.from((recovery + 31).toString(16) + bytesToHex(rv.subarray(1)))\n }\n\n /**\n * Derives the corresponding public key for this private key.\n *\n * @param prefix - Optional address prefix (defaults to config.address_prefix)\n * @returns PublicKey instance derived from this private key\n */\n createPublic(prefix?: string): PublicKey {\n return new PublicKey(secp256k1.getPublicKey(this.key), prefix)\n }\n\n /**\n * Returns the private key as a Wallet Import Format (WIF) encoded string.\n * This includes network ID and checksum for safe storage/transmission.\n *\n * @returns WIF encoded private key string\n */\n toString(): string {\n return encodePrivate(new Uint8Array([...NETWORK_ID, ...this.key]))\n }\n\n /**\n * Returns a masked representation of the private key for debugging/logging.\n * Shows only the first and last 6 characters to avoid accidental exposure.\n * Use toString() to get the full key for export/serialization.\n *\n * @returns Masked key representation for safe logging\n */\n inspect(): string {\n const key = this.toString()\n return `PrivateKey: ${key.slice(0, 6)}...${key.slice(-6)}`\n }\n\n /**\n * Computes a shared secret using ECDH key exchange for memo encryption.\n * The shared secret is used as a key for AES encryption/decryption.\n *\n * @param publicKey - Other party's public key\n * @returns 64-byte shared secret as Uint8Array\n */\n getSharedSecret(publicKey: PublicKey): Uint8Array {\n const s = secp256k1.getSharedSecret(this.key, publicKey.key)\n // strip the parity byte\n return sha512(s.subarray(1))\n }\n\n /**\n * Generates a new cryptographically secure random private key.\n * Uses the secp256k1 key generation algorithm for security.\n * This method may take up to 250ms due to entropy collection.\n *\n * @returns New randomly generated PrivateKey instance\n */\n static randomKey(): PrivateKey {\n return new PrivateKey(secp256k1.keygen().secretKey)\n }\n}\n\nconst doubleSha256 = (input: Uint8Array) => {\n const dbl = sha256(sha256(input))\n return dbl\n}\n\n/** Encode bs58+doubleSha256-checksum private key. */\nconst encodePrivate = (key: Uint8Array) => {\n // assert.equal(key.readUInt8(0), 0x80, 'private key network id mismatch')\n const checksum = doubleSha256(key)\n return bs58.encode(new Uint8Array([...key, ...checksum.slice(0, 4)]))\n}\n\n/** Decode bs58+doubleSha256-checksum encoded private key. */\nconst decodePrivate = (encodedKey: string) => {\n const buffer = bs58.decode(encodedKey)\n if (!isUint8ArrayEqual(buffer.slice(0, 1), NETWORK_ID)) {\n throw new Error('Private key network id mismatch')\n }\n const checksum = buffer.slice(-4)\n const key = buffer.slice(0, -4)\n const checksumVerify = doubleSha256(key).slice(0, 4)\n if (!isUint8ArrayEqual(checksum, checksumVerify)) {\n throw new Error('Private key checksum mismatch')\n }\n return key\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array) => {\n if (a === b) return true\n if (a.byteLength !== b.byteLength) return false\n const len = a.byteLength\n let i = 0\n while (i < len && a[i] === b[i]) i++\n return i === len\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { cbc as AESCBC } from '@noble/ciphers/aes.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PrivateKey } from './PrivateKey'\nimport { PublicKey } from './PublicKey'\n\nexport const encrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n message: Uint8Array,\n nonce: bigint = uniqueNonce()\n) => crypt(privateKey, publicKey, nonce, message)\n\nexport const decrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum: number\n): Uint8Array => {\n const d = crypt(privateKey, publicKey, nonce, message, checksum)\n return d.message\n}\n\n/**\n * @arg message - Encrypted or plain text message (see checksum)\n * @arg checksum - shared secret checksum (null to encrypt, non-null to decrypt)\n */\nconst crypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum?: number\n): { nonce: bigint; message: Uint8Array; checksum: number } => {\n const nonceL = nonce\n const S = privateKey.getSharedSecret(publicKey)\n let ebuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n ebuf.writeUint64(nonceL)\n ebuf.append(S)\n ebuf.flip()\n\n const encryptionKey = sha512(new Uint8Array(ebuf.toBuffer()))\n const iv = encryptionKey.subarray(32, 48)\n const tag = encryptionKey.subarray(0, 32)\n\n // check if first 64 bit of sha256 hash treated as uint64_t truncated to 32 bits.\n const check = sha256(encryptionKey).subarray(0, 4)\n const cbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n cbuf.append(check)\n cbuf.flip()\n const check32 = cbuf.readUint32()\n if (checksum !== undefined) {\n if (check32 !== checksum) {\n throw new Error('Invalid key')\n }\n message = cryptoJsDecrypt(message, tag, iv)\n } else {\n message = cryptoJsEncrypt(message, tag, iv)\n }\n return { nonce: nonceL, message, checksum: check32 }\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} ciphertext - binary format\n * @return {Uint8Array} the decrypted message\n */\nconst cryptoJsDecrypt = (message: Uint8Array, tag: Uint8Array, iv: Uint8Array): Uint8Array => {\n let messageBuffer = message\n const decipher = AESCBC(tag, iv)\n messageBuffer = decipher.decrypt(messageBuffer)\n return messageBuffer\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} plaintext - binary format\n * @return {Uint8Array} binary\n */\nexport const cryptoJsEncrypt = (\n message: Uint8Array,\n tag: Uint8Array,\n iv: Uint8Array\n): Uint8Array => {\n let messageBuffer = message\n const cipher = AESCBC(tag, iv)\n messageBuffer = cipher.encrypt(messageBuffer)\n return messageBuffer\n}\n\nlet uniqueNonceEntropy: number | null = null\n\nconst uniqueNonce = (): bigint => {\n if (uniqueNonceEntropy === null) {\n const randomPrivateKey = secp256k1.utils.randomSecretKey()\n uniqueNonceEntropy = (randomPrivateKey[0] << 8) | randomPrivateKey[1]\n }\n let long = BigInt(Date.now())\n const entropy = ++uniqueNonceEntropy % 0x10000\n long = (long << BigInt(16)) | BigInt(entropy)\n return long\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\n\nconst PublicKeyDeserializer = (buf: ByteBuffer) => {\n const c = fixedBuf(buf, 33)\n return new PublicKey(c)\n}\n\nconst UInt64Deserializer = (b: ByteBuffer) => {\n return b.readUint64()\n}\n\nconst UInt32Deserializer = (b: ByteBuffer) => {\n return b.readUint32()\n}\n\nconst BinaryDeserializer = (b: ByteBuffer) => {\n const len = b.readVarint32()\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n}\n\nconst BufferDeserializer = (keyDeserializers: any) => (buf: Uint8Array) => {\n const obj: any = {}\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n buffer.append(buf)\n buffer.flip()\n for (const [key, deserializer] of keyDeserializers) {\n try {\n obj[key] = deserializer(buffer)\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n return obj\n}\n\nfunction fixedBuf(b: ByteBuffer, len: number) {\n if (!b) {\n throw Error('No buffer found on first parameter')\n } else {\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n }\n}\n\nconst EncryptedMemoDeserializer = BufferDeserializer([\n ['from', PublicKeyDeserializer],\n ['to', PublicKeyDeserializer],\n ['nonce', UInt64Deserializer],\n ['check', UInt32Deserializer],\n ['encrypted', BinaryDeserializer]\n])\n\nexport const Deserializer = {\n Memo: EncryptedMemoDeserializer\n}\n","import bs58 from 'bs58'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Serializer } from './serializer'\nimport { PrivateKey } from './PrivateKey'\nimport * as Aes from './aes'\nimport { PublicKey } from './PublicKey'\nimport { Deserializer } from './deserializer'\n\nexport type Memo = {\n /**\n * Encrypts a memo for secure private messaging\n */\n encode(\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n ): string\n\n /**\n * Decrypts a memo message\n */\n decode(privateKey: string | PrivateKey, memo: string): string\n}\n\n/**\n * Encodes a memo using AES encryption for secure private messaging on Hive.\n * Messages must start with '#' to be encrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Sender's private memo key (string WIF format or PrivateKey instance)\n * @param publicKey - Recipient's public memo key (string or PublicKey instance)\n * @param memo - Message to encrypt (must start with '#' for encryption)\n * @param testNonce - Optional nonce for testing (advanced usage)\n * @returns Encrypted memo string prefixed with '#'\n * @throws Error if encryption is not supported in current environment\n */\nconst encode = (\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n publicKey = toPublicObj(publicKey)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.writeVString(memo)\n const memoBuffer = new Uint8Array(mbuf.copy(0, mbuf.offset).toBuffer())\n const { nonce, message, checksum } = Aes.encrypt(privateKey, publicKey, memoBuffer, testNonce)\n const mbuf2 = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n Serializer.Memo(mbuf2, {\n check: checksum,\n encrypted: message,\n from: privateKey.createPublic(),\n nonce,\n to: publicKey\n })\n mbuf2.flip()\n const data = new Uint8Array(mbuf2.toBuffer())\n return '#' + bs58.encode(data)\n}\n\n/**\n * Decrypts an encrypted memo using AES decryption.\n * Messages must start with '#' to be decrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Recipient's private memo key (string WIF format or PrivateKey instance)\n * @param memo - Encrypted memo string (must start with '#' for decryption)\n * @returns Decrypted memo content with '#' prefix\n * @throws Error if decryption fails or encryption not supported in current environment\n */\nconst decode = (privateKey: string | PrivateKey, memo: string): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n // memo = bs58.decode(memo)\n let memoBuffer = Deserializer.Memo(bs58.decode(memo))\n const { from, to, nonce, check, encrypted } = memoBuffer\n const pubkey = privateKey.createPublic().toString()\n const otherpub =\n pubkey === new PublicKey(from.key).toString() ? new PublicKey(to.key) : new PublicKey(from.key)\n memoBuffer = Aes.decrypt(privateKey, otherpub, nonce, encrypted, check)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.append(memoBuffer)\n mbuf.flip()\n return '#' + mbuf.readVString()\n}\n\nlet encodeTest: boolean | undefined\nconst checkEncryption = () => {\n if (encodeTest === undefined) {\n let plaintext\n encodeTest = true // prevent infinate looping\n try {\n const wif = '5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw'\n const pubkey = 'STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA'\n const cyphertext = encode(wif, pubkey, '#memo爱')\n plaintext = decode(wif, cyphertext)\n } finally {\n encodeTest = plaintext === '#memo爱'\n }\n }\n if (encodeTest === false) {\n throw new Error('This environment does not support encryption.')\n }\n}\n\nconst toPrivateObj = (o: string | PrivateKey): PrivateKey => {\n if (typeof o === 'string') {\n return PrivateKey.fromString(o)\n } else {\n return o\n }\n}\nconst toPublicObj = (o: string | PublicKey): PublicKey => {\n if (typeof o === 'string') {\n return PublicKey.fromString(o)\n } else {\n return o\n }\n}\n\n/**\n * Memo utilities for encrypting and decrypting private messages between Hive users.\n * Uses AES encryption with ECDH key exchange for secure communication.\n *\n * Messages must start with '#' to be encrypted/decrypted.\n * Plain text messages (without '#') are returned unchanged.\n *\n * @example\n * ```typescript\n * import { Memo, PrivateKey, PublicKey } from 'hive-tx'\n *\n * // Encrypt a message\n * const encrypted = Memo.encode(senderPrivateKey, recipientPublicKey, '#Hello World')\n *\n * // Decrypt a message\n * const decrypted = Memo.decode(recipientPrivateKey, encrypted)\n * console.log(decrypted) // '#Hello World'\n * ```\n */\nexport const Memo = {\n decode,\n encode\n}\n","import { Serializer } from './serializer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\nimport { bytesToHex } from '@noble/hashes/utils.js'\n\nexport interface WitnessProps {\n account_creation_fee?: string\n account_subsidy_budget?: number\n account_subsidy_decay?: number\n key: PublicKey | string\n maximum_block_size?: number\n new_signing_key?: PublicKey | string | null\n hbd_exchange_rate?: { base: string; quote: string }\n hbd_interest_rate?: number\n url?: string\n}\n\n/** Return null for a valid username */\nexport const validateUsername = (username: string): null | string => {\n let suffix = 'Account name should '\n if (!username) {\n return suffix + 'not be empty.'\n }\n const length = username.length\n if (length < 3) {\n return suffix + 'be longer.'\n }\n if (length > 16) {\n return suffix + 'be shorter.'\n }\n if (/\\./.test(username)) {\n suffix = 'Each account segment should '\n }\n const ref = username.split('.')\n const len = ref.length\n for (let i = 0; i < len; i++) {\n const label = ref[i]\n if (!/^[a-z]/.test(label)) {\n return suffix + 'start with a lowercase letter.'\n }\n if (!/^[a-z0-9-]*$/.test(label)) {\n return suffix + 'have only lowercase letters, digits, or dashes.'\n }\n if (!/[a-z0-9]$/.test(label)) {\n return suffix + 'end with a lowercase letter or digit.'\n }\n if (label.length < 3) {\n return suffix + 'be longer.'\n }\n }\n return null\n}\n\nexport const operations = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n pow: 14,\n custom: 15,\n report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49,\n // virtual ops\n fill_convert_request: 50,\n author_reward: 51,\n curation_reward: 52,\n comment_reward: 53,\n liquidity_reward: 54,\n interest: 55,\n fill_vesting_withdraw: 56,\n fill_order: 57,\n shutdown_witness: 58,\n fill_transfer_from_savings: 59,\n hardfork: 60,\n comment_payout_update: 61,\n return_vesting_delegation: 62,\n comment_benefactor_reward: 63,\n producer_reward: 64,\n clear_null_account_balance: 65,\n proposal_pay: 66,\n sps_fund: 67,\n hardfork_hive: 68,\n hardfork_hive_restore: 69,\n delayed_voting: 70,\n consolidate_treasury_balance: 71,\n effective_comment_vote: 72,\n ineffective_delete_comment: 73,\n sps_convert: 74,\n expired_account_notification: 75,\n changed_recovery_account: 76,\n transfer_to_vesting_completed: 77,\n pow_reward: 78,\n vesting_shares_split: 79,\n account_created: 80,\n fill_collateralized_convert_request: 81,\n system_warning: 82,\n fill_recurrent_transfer: 83,\n failed_recurrent_transfer: 84,\n limit_order_cancelled: 85,\n producer_missed: 86,\n proposal_fee: 87,\n collateralized_convert_immediate_conversion: 88,\n escrow_approved: 89,\n escrow_rejected: 90,\n proxy_cleared: 91,\n declined_voting_rights: 92\n}\n\n/**\n * Make bitmask filter to be used with get_account_history call\n */\nexport const makeBitMaskFilter = (allowedOperations: number[]): [string | null, string | null] => {\n return allowedOperations\n .reduce(reduceFunction, [BigInt(0), BigInt(0)])\n .map((value: bigint) => (value !== BigInt(0) ? value.toString() : null)) as [string | null, string | null]\n}\nconst reduceFunction = (\n [low, high]: [bigint, bigint],\n allowedOperation: number\n): [bigint, bigint] => {\n if (allowedOperation < 64) {\n return [low | (BigInt(1) << BigInt(allowedOperation)), high]\n } else {\n return [low, high | (BigInt(1) << BigInt(allowedOperation - 64))]\n }\n}\n\nexport const buildWitnessSetProperties = (\n owner: string,\n props: WitnessProps\n): ['witness_set_properties', { extensions: never[]; owner: string; props: any }] => {\n const data = {\n extensions: [],\n owner,\n props: []\n }\n for (const key of Object.keys(props)) {\n if ((props as any)[key] === undefined) continue\n let type\n switch (key) {\n case 'key':\n case 'new_signing_key':\n type = Serializer.PublicKey\n break\n case 'account_subsidy_budget':\n case 'account_subsidy_decay':\n case 'maximum_block_size':\n type = Serializer.UInt32\n break\n case 'hbd_interest_rate':\n type = Serializer.UInt16\n break\n case 'url':\n type = Serializer.String\n break\n case 'hbd_exchange_rate':\n type = Serializer.Price\n break\n case 'account_creation_fee':\n type = Serializer.Asset\n break\n default:\n throw new Error(`Unknown witness prop: ${key}`)\n }\n data.props.push([key, serialize(type, props[key])])\n }\n data.props.sort((a: any, b: any) => a[0].localeCompare(b[0]))\n return ['witness_set_properties', data]\n}\n\nconst serialize = (serializer: any, data: any) => {\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n serializer(buffer, data)\n buffer.flip()\n // `props` values must be hex\n return bytesToHex(new Uint8Array(buffer.toBuffer()))\n}\n","/**\n * Re-exports hive-tx APIs and provides helper functions that bridge\n * API differences from the legacy dhive library.\n */\n\nimport {\n PrivateKey,\n Transaction,\n callRPCBroadcast,\n type BroadcastResult,\n} from \"../../hive-tx\";\nimport type { Operation, OperationName, OperationBody } from \"../../hive-tx\";\nimport { sha256 as nobleSha256 } from \"@noble/hashes/sha2.js\";\n\n// ── Re-exports ─────────────────────────────────────────────────────────────\n\nexport {\n Transaction as HiveTxTransaction,\n PrivateKey,\n PublicKey,\n Signature,\n Memo,\n config as hiveTxConfig,\n callRPC,\n callRPCBroadcast,\n callREST,\n callWithQuorum,\n utils as hiveTxUtils,\n} from \"../../hive-tx\";\n\nexport type {\n Operation,\n OperationName,\n OperationBody,\n AssetSymbol,\n BroadcastResult,\n AccountCreateOperation,\n CustomJsonOperation,\n // Referenced in ConfigManager.setResilience's public signature — must be\n // nameable from the main entry, not only from @ecency/sdk/hive.\n ResilienceOptions,\n} from \"../../hive-tx\";\n\n// ── Compat types (matching dhive shapes used throughout the codebase) ──────\n\n/** Compatible with dhive's TransactionConfirmation from broadcast_transaction_synchronous */\nexport interface TransactionConfirmation {\n id: string;\n block_num: number;\n trx_num: number;\n expired: boolean;\n}\n\n/** Authority role type used in key management */\nexport type AuthorityType = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\n/** SMT asset format (NAI representation) used in transaction history */\nexport interface SMTAsset {\n amount: string;\n precision: number;\n nai: string;\n}\n\n/** RC account data from rc_api.find_rc_accounts */\nexport interface RCAccount {\n account: string;\n rc_manabar: {\n current_mana: string | number;\n last_update_time: number;\n };\n max_rc: string | number;\n max_rc_creation_adjustment: {\n amount: string;\n precision: number;\n nai: string;\n };\n delegated_rc: number;\n received_delegated_rc: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Compute SHA-256 hash of a string or Uint8Array.\n * Drop-in replacement for dhive's `cryptoUtils.sha256()`.\n */\nexport function sha256(input: string | Uint8Array): Uint8Array {\n let data: Uint8Array;\n if (typeof input === \"string\") {\n // Inline UTF-8 encode — avoids TextEncoder which is unavailable on some\n // runtimes (React Native / Hermes).\n const bytes: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c < 0x80) {\n bytes.push(c);\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const next = input.charCodeAt(++i);\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff);\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n }\n }\n data = new Uint8Array(bytes);\n } else {\n data = input;\n }\n return nobleSha256(data);\n}\n\n/** Check if a string is a valid WIF-encoded private key. */\nexport function isWif(key: string): boolean {\n try {\n PrivateKey.fromString(key);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sign and broadcast operations, returning a dhive-compatible TransactionConfirmation.\n *\n * Uses broadcast_transaction_synchronous so the response includes block_num/trx_num,\n * matching the shape that the rest of the codebase expects from dhive's\n * `client.broadcast.sendOperations()`.\n *\n * @deprecated Prefer {@link broadcastOperationsAsync} (the default for\n * `useBroadcastMutation`); poll `transaction_status_api` if you need block\n * confirmation. Kept only for explicit `broadcastMode: 'sync'` opt-ins.\n */\nexport async function broadcastOperations(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return callRPCBroadcast(\"condenser_api.broadcast_transaction_synchronous\", [\n tx.transaction,\n ]);\n}\n\n/**\n * Sign and broadcast operations without waiting for block inclusion.\n *\n * Uses broadcast_transaction which returns as soon as the node accepts the\n * transaction into its mempool. Transport and RPC errors (network failures,\n * invalid operations, expired transactions) are still thrown immediately -\n * the only thing skipped is the wait for the transaction to appear in a block.\n *\n * Returns { tx_id, status: 'unknown' }. To confirm block inclusion afterward,\n * poll transaction_status_api with the returned tx_id.\n *\n * Prefer this for operations where faster response matters more than\n * immediate confirmation (e.g. votes, reblogs, follows).\n *\n * Use broadcastOperations() when you need block_num/trx_num confirmation\n * (e.g. transfers, account updates, key changes).\n */\nexport async function broadcastOperationsAsync(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return tx.broadcast(false);\n}\n\n// ── Mana calculations (ported from dhive's RCAPI) ──────────────────────────\n\ninterface Manabar {\n current_mana: string | number;\n last_update_time: number;\n}\n\ninterface ManaResult {\n current_mana: number;\n max_mana: number;\n percentage: number;\n}\n\nconst MANA_REGENERATION_SECONDS = 432000; // 5 days\n\nfunction calculateManabar(maxMana: number, manabar: Manabar): ManaResult {\n const delta = Date.now() / 1000 - manabar.last_update_time;\n let currentMana =\n Number(manabar.current_mana) +\n (delta * maxMana) / MANA_REGENERATION_SECONDS;\n let percentage = Math.round((currentMana / maxMana) * 10000);\n if (!isFinite(percentage) || percentage < 0) {\n percentage = 0;\n } else if (percentage > 10000) {\n percentage = 10000;\n }\n return { current_mana: currentMana, max_mana: maxMana, percentage };\n}\n\n/**\n * Get effective vesting shares for an account (matching dhive's getVests).\n * Subtracts delegated, adds received, accounts for pending withdrawals.\n */\nfunction getVests(account: any): number {\n const vests = parseFloat(account.vesting_shares);\n const delegated = parseFloat(account.delegated_vesting_shares);\n const received = parseFloat(account.received_vesting_shares);\n const withdrawRate = parseFloat(account.vesting_withdraw_rate);\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n return vests - withdrawVests - delegated + received;\n}\n\n/** Calculate voting power mana (equivalent to dhive client.rc.calculateVPMana) */\nexport function calculateVPMana(account: any): ManaResult {\n const maxMana = getVests(account) * 1e6;\n return calculateManabar(maxMana, account.voting_manabar);\n}\n\n/** Calculate RC mana (equivalent to dhive client.rc.calculateRCMana) */\nexport function calculateRCMana(rcAccount: RCAccount): ManaResult {\n return calculateManabar(\n Number(rcAccount.max_rc),\n rcAccount.rc_manabar\n );\n}\n\n// setHiveTxNodes and initHiveTx removed — config is now unified.\n// Use hiveTxConfig directly or ConfigManager.setHiveNodes().\n","/**\n * Chain error handling utilities\n * Extracted from web's operations.ts and mobile's dhive.ts error handling patterns\n */\n\nexport enum ErrorType {\n COMMON = \"common\",\n INFO = \"info\",\n INSUFFICIENT_RESOURCE_CREDITS = \"insufficient_resource_credits\",\n MISSING_AUTHORITY = \"missing_authority\",\n TOKEN_EXPIRED = \"token_expired\",\n NETWORK = \"network\",\n TIMEOUT = \"timeout\",\n VALIDATION = \"validation\",\n}\n\nexport interface ParsedChainError {\n message: string;\n type: ErrorType;\n originalError?: any;\n}\n\n/**\n * Parses Hive blockchain errors into standardized format.\n * Extracted from web's operations.ts and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string from a blockchain operation\n * @returns Parsed error with user-friendly message and categorized type\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * const parsed = parseChainError(error);\n * console.log(parsed.message); // \"Insufficient Resource Credits. Please wait or power up.\"\n * console.log(parsed.type); // ErrorType.INSUFFICIENT_RESOURCE_CREDITS\n * }\n * ```\n */\nexport function parseChainError(error: any): ParsedChainError {\n // Extract error strings from various error formats\n // Check both error_description and message independently for pattern matching\n const errorDescription = error?.error_description ? String(error.error_description) : '';\n const errorMessage = error?.message ? String(error.message) : '';\n // HiveSigner throws plain objects like { error: \"unauthorized\", error_description: \"...\" }\n const errorCode = error?.error ? String(error.error) : '';\n const errorString = errorDescription || errorMessage || String(error || '');\n\n // Helper function to test patterns against all error fields\n const testPattern = (pattern: RegExp): boolean => {\n // Check error code first (e.g. HiveSigner's { error: \"unauthorized\" })\n if (errorCode && pattern.test(errorCode)) return true;\n // Check error_description (priority)\n if (errorDescription && pattern.test(errorDescription)) return true;\n // Then check message\n if (errorMessage && pattern.test(errorMessage)) return true;\n // Finally check fallback errorString (handles plain string inputs)\n if (errorString && pattern.test(errorString)) return true;\n return false;\n };\n\n // Resource credits (from both web and mobile patterns)\n if (\n testPattern(/please wait to transact/i) ||\n testPattern(/insufficient rc/i) ||\n testPattern(/rc mana|rc account|resource credits/i)\n ) {\n return {\n message: \"Insufficient Resource Credits. Please wait or power up.\",\n type: ErrorType.INSUFFICIENT_RESOURCE_CREDITS,\n originalError: error,\n };\n }\n\n // Min comment interval (from web operations.ts line 29)\n if (testPattern(/you may only post once every/i)) {\n return {\n message: \"Please wait before posting again (minimum 3 second interval between comments).\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Identical vote (from web operations.ts line 31)\n if (testPattern(/your current vote on this comment is identical/i)) {\n return {\n message: \"You have already voted with the same weight.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Must claim something (from web operations.ts line 33)\n if (testPattern(/must claim something/i)) {\n return {\n message: \"You must claim rewards before performing this action.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot claim that much VESTS (from web operations.ts line 35)\n if (testPattern(/cannot claim that much vests/i)) {\n return {\n message: \"Cannot claim that amount. Please check your pending rewards.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot delete comment with positive votes (from web operations.ts line 42)\n if (testPattern(/cannot delete a comment with net positive/i)) {\n return {\n message: \"Cannot delete a comment with positive votes.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Comment has children (from web operations.ts line 44)\n if (testPattern(/children == 0/i)) {\n return {\n message: \"Cannot delete a comment with replies.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Comment already paid out (from web operations.ts line 46)\n if (testPattern(/comment_cashout/i)) {\n return {\n message: \"Cannot modify a comment that has already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Voting on paid out post (from web operations.ts line 48)\n if (testPattern(/votes evaluating for comment that is paid out is forbidden/i)) {\n return {\n message: \"Cannot vote on posts that have already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // No key available (SDK internal - from broadcastWithMethod when key not stored)\n if (testPattern(/no (active|owner|posting|memo) key available/i)) {\n return {\n message: \"Key not available. Please provide your key to sign this operation.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing active authority. Hive nodes return \"missing required active\n // authority\"; web operations.ts also throws the short form. Match both so the\n // auth fallback (auth-upgrade dialog) fires instead of misclassifying as a\n // generic chain error.\n if (testPattern(/missing (required )?active authority/i)) {\n return {\n message: \"Missing active authority. This operation requires your active key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing owner authority (\"missing required owner authority\" or short form)\n if (testPattern(/missing (required )?owner authority/i)) {\n return {\n message: \"Missing owner authority. This operation requires your owner key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing posting authority (general pattern)\n if (testPattern(/missing (required )?posting authority/i)) {\n return {\n message: \"Missing posting authority. Please check your login method.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Token expired / unauthorized (HiveSigner OAuth2 errors + general patterns)\n // HiveSigner returns: { error: \"invalid_grant\" } for invalid/expired tokens,\n // { error: \"unauthorized_access\" } for IP-based access denial\n if (\n errorCode === 'invalid_grant' ||\n errorCode === 'unauthorized_access' ||\n testPattern(/token expired/i) ||\n testPattern(/invalid token/i) ||\n testPattern(/\\bunauthorized\\b/i) ||\n testPattern(/\\bforbidden\\b/i)\n ) {\n return {\n message: \"Authentication token expired. Please log in again.\",\n type: ErrorType.TOKEN_EXPIRED,\n originalError: error,\n };\n }\n\n // Already reblogged\n if (testPattern(/has already reblogged/i) || testPattern(/already reblogged this post/i)) {\n return {\n message: \"You have already reblogged this post.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Duplicate transaction\n if (testPattern(/duplicate transaction/i)) {\n return {\n message: \"This transaction has already been processed.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Network errors (more specific patterns to avoid false positives)\n if (\n testPattern(/econnrefused/i) ||\n testPattern(/connection refused/i) ||\n testPattern(/failed to fetch/i) ||\n testPattern(/\\bnetwork[-\\s]?(request|error|timeout|unreachable|down|failed)\\b/i)\n ) {\n return {\n message: \"Network error. Please check your connection and try again.\",\n type: ErrorType.NETWORK,\n originalError: error,\n };\n }\n\n // Timeout errors\n if (testPattern(/timeout/i) || testPattern(/timed out/i)) {\n return {\n message: \"Request timed out. Please try again.\",\n type: ErrorType.TIMEOUT,\n originalError: error,\n };\n }\n\n // Account doesn't exist\n if (testPattern(/account.*does not exist/i) || testPattern(/account not found/i)) {\n return {\n message: \"Account not found. Please check the username.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Invalid memo key\n if (testPattern(/invalid memo key/i)) {\n return {\n message: \"Invalid memo key. Cannot encrypt message.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Insufficient funds (require both words in same string to avoid cross-field false positives)\n if (testPattern(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i)) {\n return {\n message: \"Insufficient funds for this transaction.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Generic validation errors (use word boundaries to be more specific)\n if (testPattern(/\\b(invalid|validation)\\b/i)) {\n // Truncate to 150 chars like other branches\n const message = (error?.message || errorString).substring(0, 150) || \"Validation error occurred\";\n return {\n message,\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Default: return original error message\n // Check for error_description first (from web operations.ts line 65-72)\n if (error?.error_description && typeof error.error_description === \"string\") {\n return {\n message: error.error_description.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Then check message field\n if (error?.message && typeof error.message === \"string\") {\n return {\n message: error.message.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Handle plain objects without message property (avoid \"[object Object]\")\n let message: string;\n if (typeof error === 'object' && error !== null) {\n // Check for common error properties\n if (error.error_description) {\n message = String(error.error_description);\n } else if (error.code) {\n message = `Error code: ${error.code}`;\n } else if (errorString && errorString !== '[object Object]') {\n message = errorString.substring(0, 150);\n } else {\n message = \"Unknown error occurred\";\n }\n } else {\n message = errorString.substring(0, 150) || \"Unknown error occurred\";\n }\n\n return {\n message,\n type: ErrorType.COMMON,\n originalError: error,\n };\n}\n\n/**\n * Formats error for display to user.\n * Returns tuple of [message, type] for backward compatibility with existing code.\n *\n * This function maintains compatibility with the old formatError signature from\n * web's operations.ts (line 59-84) and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string\n * @returns Tuple of [user-friendly message, error type]\n *\n * @example\n * ```typescript\n * try {\n * await transfer(...);\n * } catch (error) {\n * const [message, type] = formatError(error);\n * showToast(message, type);\n * }\n * ```\n */\nexport function formatError(error: any): [string, ErrorType] {\n const parsed = parseChainError(error);\n return [parsed.message, parsed.type];\n}\n\n/**\n * Checks if error indicates missing authority and should trigger auth fallback.\n * Used by the SDK's useBroadcastMutation to determine if it should retry with\n * an alternate authentication method.\n *\n * @param error - The error object or string\n * @returns true if auth fallback should be attempted\n *\n * @example\n * ```typescript\n * try {\n * await broadcast(operations);\n * } catch (error) {\n * if (shouldTriggerAuthFallback(error)) {\n * // Try with alternate auth method\n * await broadcastWithHiveAuth(operations);\n * }\n * }\n * ```\n */\nexport function shouldTriggerAuthFallback(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.MISSING_AUTHORITY || type === ErrorType.TOKEN_EXPIRED;\n}\n\n/**\n * Checks if error is a resource credits (RC) error.\n * Useful for showing specific UI feedback about RC issues.\n *\n * @param error - The error object or string\n * @returns true if the error is related to insufficient RC\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * if (isResourceCreditsError(error)) {\n * showRCWarning(); // Show specific RC education/power up UI\n * }\n * }\n * ```\n */\nexport function isResourceCreditsError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INSUFFICIENT_RESOURCE_CREDITS;\n}\n\n/**\n * Checks if error is informational (not critical).\n * Informational errors typically don't need retry logic.\n *\n * @param error - The error object or string\n * @returns true if the error is informational\n */\nexport function isInfoError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INFO;\n}\n\n/**\n * Checks if error is network-related and should be retried.\n *\n * @param error - The error object or string\n * @returns true if the error is network-related\n */\nexport function isNetworkError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.NETWORK || type === ErrorType.TIMEOUT;\n}\n","import {\n useMutation,\n type MutationKey,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { PrivateKey, RPCError } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { broadcastOperations, broadcastOperationsAsync, type TransactionConfirmation } from \"@/modules/core/hive-tx\";\nimport type { BroadcastResult } from \"../../../hive-tx\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { shouldTriggerAuthFallback } from \"@/modules/core/errors\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport hs from \"hivesigner\";\n\n/**\n * Broadcast mode controls whether the SDK waits for block inclusion.\n *\n * - `'async'` (default): Uses `broadcast_transaction` — returns once the node\n * accepts the transaction into its mempool. Transport and RPC errors are\n * still thrown immediately; only the block-inclusion wait is skipped.\n *\n * - `'sync'`: Uses `broadcast_transaction_synchronous` — waits for block\n * inclusion and returns `block_num`/`trx_num`. Deprecated; prefer `'async'`\n * and poll `transaction_status_api` if you need block confirmation.\n */\nexport type BroadcastMode = 'sync' | 'async';\n\n/**\n * Broadcasts operations using a specific auth method.\n *\n * @param method - Auth method to use ('key', 'hiveauth', 'hivesigner', 'keychain', 'custom')\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and configuration\n * @param authority - Key authority to use (posting, active, owner, or memo)\n * @param fetchedKey - Optional pre-fetched key to avoid duplicate fetches\n * @param fetchedToken - Optional pre-fetched access token to avoid duplicate fetches\n * @param broadcastMode - Whether to wait for block inclusion ('sync') or just mempool acceptance ('async')\n * @returns Transaction confirmation from the blockchain\n * @throws Error if method is not available or broadcast fails\n */\nasync function broadcastWithMethod(\n method: string,\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n fetchedKey?: string | null,\n fetchedToken?: string | null,\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n switch (method) {\n case 'key': {\n if (!adapter) {\n throw new Error('No adapter provided for key-based auth');\n }\n\n // Use pre-fetched key if provided, otherwise fetch it\n let key: string | null | undefined = fetchedKey;\n\n if (key === undefined) {\n // Key not pre-fetched, fetch it now based on authority\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n } else {\n throw new Error(\n `Owner key not supported by adapter. Owner operations (like account recovery) ` +\n `require master password login or manual key entry.`\n );\n }\n break;\n\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n } else {\n throw new Error(\n `Memo key not supported by adapter. Use memo encryption methods instead.`\n );\n }\n break;\n\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n }\n\n if (!key) {\n throw new Error(`No ${authority} key available for ${username}`);\n }\n\n // Attempt broadcast with key\n const privateKey = PrivateKey.fromString(key);\n if (broadcastMode === 'async') {\n return await broadcastOperationsAsync(ops, privateKey);\n }\n return await broadcastOperations(ops, privateKey);\n }\n\n case 'hiveauth': {\n if (!adapter?.broadcastWithHiveAuth) {\n throw new Error('HiveAuth not supported by adapter');\n }\n return await adapter.broadcastWithHiveAuth(username, ops, authority);\n }\n\n case 'hivesigner': {\n if (!adapter) {\n throw new Error('No adapter provided for HiveSigner auth');\n }\n\n // Access tokens only have posting authority — for active/owner/memo ops,\n // go directly to platform-specific HiveSigner broadcast (e.g., redirect to hivesigner.com)\n if (authority !== 'posting') {\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw new Error(`HiveSigner access token cannot sign ${authority} operations. No platform broadcast available.`);\n }\n\n // Try direct API broadcast with access token first (posting ops only)\n const token = fetchedToken !== undefined\n ? fetchedToken\n : await adapter.getAccessToken(username);\n\n if (token) {\n try {\n const client = new hs.Client({ accessToken: token });\n const response = await client.broadcast(ops);\n return response.result;\n } catch (tokenError) {\n // Token broadcast failed — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner && shouldTriggerAuthFallback(tokenError)) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw tokenError;\n }\n }\n\n // No token available — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n\n throw new Error(`No access token available for ${username}`);\n }\n\n case 'keychain': {\n if (!adapter?.broadcastWithKeychain) {\n throw new Error('Keychain not supported by adapter');\n }\n return await adapter.broadcastWithKeychain(username, ops, authority);\n }\n\n case 'custom': {\n if (!auth?.broadcast) {\n throw new Error('No custom broadcast function provided');\n }\n return (await auth.broadcast(ops, authority)) as TransactionConfirmation;\n }\n\n default:\n throw new Error(`Unknown auth method: ${method}`);\n }\n}\n\n/**\n * Attempts to broadcast operations using multiple auth methods in fallback chain.\n * Implements sophisticated fallback pattern from mobile app.\n *\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and fallback configuration\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n * @returns Transaction confirmation from the blockchain\n * @throws Error if all auth methods fail or if a non-auth error occurs\n *\n * @remarks\n * **Preferred Behavior (when adapter.getLoginType exists):**\n * - Calls adapter.getLoginType() to determine user's actual auth method\n * - Uses ONLY that method (no fallbacks) - more predictable and faster\n * - If it fails, throws the error immediately\n *\n * **Fallback Behavior (for backward compatibility):**\n * - Tries each auth method in the fallback chain order\n * - Only continues to next method if error is auth-related (missing authority, token expired)\n * - Stops immediately for non-auth errors (RC exhaustion, network errors, validation errors)\n * - Collects all errors and provides detailed failure message\n *\n * @example\n * ```typescript\n * // Preferred: Adapter with getLoginType (single method, no fallbacks)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter, // includes getLoginType()\n * };\n *\n * // Legacy: Explicit fallback chain (tries multiple methods)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter,\n * fallbackChain: ['key', 'hiveauth', 'hivesigner'],\n * };\n * ```\n */\nasync function broadcastWithFallback(\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n // PREFERRED APPROACH: If adapter provides getLoginType, use smart auth strategy\n // This avoids unnecessary fallback attempts and is more predictable\n if (adapter?.getLoginType) {\n const loginType = await adapter.getLoginType(username, authority);\n\n if (loginType) {\n // SMART AUTH STRATEGY: Optimize based on login type + authority + credentials\n\n // Check if user has granted ecency.app posting authority\n const hasPostingAuth = adapter.hasPostingAuthorization\n ? await adapter.hasPostingAuthorization(username)\n : false;\n\n // OPTIMIZATION: Use HiveSigner token for posting ops when posting auth is granted\n // This is faster than direct key signing or HiveAuth for key-based logins\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'key'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to direct key signing if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to key:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for keychain/MetaMask users with posting auth (faster, no popup)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'keychain'\n ) {\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n console.warn('[SDK] HiveSigner token auth failed, falling back to keychain/snap:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for HiveAuth users with posting auth (faster)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'hiveauth'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to HiveAuth if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to HiveAuth:', error);\n }\n }\n\n // Use user's actual login method\n try {\n return await broadcastWithMethod(loginType, username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Check if error is due to missing authority (e.g., posting key trying active op)\n if (shouldTriggerAuthFallback(error)) {\n // Show auth upgrade UI if available (only for posting/active operations)\n if (\n adapter.showAuthUpgradeUI &&\n (authority === 'posting' || authority === 'active')\n ) {\n // Guard against empty operations array\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n\n // User selected a specific method - delegate to broadcastWithMethod\n // This handles all auth methods (hiveauth, hivesigner, key, keychain, custom, etc.)\n // broadcastWithMethod already contains all necessary validation and method-specific logic\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // Not an auth error, or no upgrade UI available - throw original error\n throw error;\n }\n }\n\n // loginType is null — user's auth method is unknown (e.g., incomplete login data)\n if (authority === 'posting') {\n // For posting ops, try HiveSigner — access token is usually available for all logins\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (hsError) {\n if (shouldTriggerAuthFallback(hsError) && adapter.showAuthUpgradeUI) {\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`No login type available for ${username}. Please log in again.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n throw hsError;\n }\n } else if (authority === 'active' && adapter.showAuthUpgradeUI) {\n // For active ops, show auth upgrade dialog — no silent fallback possible\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // FALLBACK APPROACH: For backward compatibility, use fallback chain\n // This is only used if adapter doesn't provide getLoginType\n const chain = auth?.fallbackChain ?? ['key', 'hiveauth', 'hivesigner', 'keychain', 'custom'];\n const errors: Map = new Map();\n\n for (const method of chain) {\n try {\n // Check if method is available before attempting\n let shouldSkip = false;\n let skipReason = '';\n let prefetchedKey: string | null | undefined;\n let prefetchedToken: string | null | undefined;\n\n switch (method) {\n case 'key':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch key to check availability (will be reused in broadcast)\n let key: string | null | undefined;\n\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n }\n break;\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n }\n break;\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n\n if (!key) {\n shouldSkip = true;\n skipReason = `No ${authority} key available`;\n } else {\n prefetchedKey = key; // Store for reuse\n }\n }\n break;\n case 'hiveauth':\n if (!adapter?.broadcastWithHiveAuth) {\n shouldSkip = true;\n skipReason = 'HiveAuth not supported by adapter';\n }\n break;\n case 'hivesigner':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch token if available (will be reused in broadcast)\n const token = await adapter.getAccessToken(username);\n if (token) {\n prefetchedToken = token; // Store for reuse\n }\n // When no token but adapter exists, don't skip —\n // broadcastWithMethod can fall back to adapter.broadcastWithHiveSigner\n }\n break;\n case 'keychain':\n if (!adapter?.broadcastWithKeychain) {\n shouldSkip = true;\n skipReason = 'Keychain not supported by adapter';\n }\n break;\n case 'custom':\n if (!auth?.broadcast) {\n shouldSkip = true;\n skipReason = 'No custom broadcast function provided';\n }\n break;\n }\n\n if (shouldSkip) {\n errors.set(method, new Error(`Skipped: ${skipReason}`));\n continue;\n }\n\n // Method is available, attempt broadcast with pre-fetched credentials\n return await broadcastWithMethod(method, username, ops, auth, authority, prefetchedKey, prefetchedToken, broadcastMode);\n } catch (error) {\n // Record actual error from failed broadcast attempt\n errors.set(method, error as Error);\n\n // Only continue fallback if error suggests trying another method\n if (!shouldTriggerAuthFallback(error)) {\n // If it's not an auth error, throw immediately (e.g., RC error, network error)\n throw error;\n }\n }\n }\n\n // FIX #2: Improved error message distinguishes between skips and real failures\n const hasRealAttempts = Array.from(errors.values()).some(\n error => !error.message.startsWith('Skipped:')\n );\n\n if (!hasRealAttempts) {\n // All methods were skipped (none attempted)\n const skipReasons = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n throw new Error(\n `[SDK][Broadcast] No auth methods attempted for ${username}. ${skipReasons}`\n );\n }\n\n // At least one method was attempted but all failed\n const errorMessages = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n\n throw new Error(\n `[SDK][Broadcast] All auth methods failed for ${username}. Errors: ${errorMessages}`\n );\n}\n\n/**\n * React Query mutation hook for broadcasting Hive operations.\n * Supports multiple authentication methods with automatic fallback.\n *\n * @template T - Type of the mutation payload\n * @param mutationKey - React Query mutation key for cache management\n * @param username - Hive username (required for broadcast)\n * @param operations - Function that converts payload to Hive operations\n * @param onSuccess - Success callback after broadcast completes\n * @param auth - Authentication context (supports both legacy AuthContext and new AuthContextV2)\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Authentication Flow:**\n *\n * 1. **With AuthContextV2 + adapter + enableFallback** (recommended for new code):\n * - Tries auth methods in fallbackChain order\n * - Smart fallback: only retries on auth errors, not RC/network errors\n * - Uses platform adapter for storage, UI, and broadcasting\n *\n * 2. **With legacy AuthContext** (backward compatible):\n * - Tries auth.broadcast() first (custom implementation)\n * - Falls back to postingKey if available\n * - Falls back to accessToken (HiveSigner) if available\n * - Throws if no auth method available\n *\n * **Backward Compatibility:**\n * - All existing code using AuthContext will continue to work\n * - AuthContextV2 extends AuthContext, so it's a drop-in replacement\n * - enableFallback defaults to false if no adapter provided\n *\n * @example\n * ```typescript\n * // New pattern with platform adapter and fallback\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * },\n * 'posting'\n * );\n *\n * // Legacy pattern (still works)\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * { postingKey: 'wif-key' }\n * );\n * ```\n */\nexport function useBroadcastMutation(\n mutationKey: MutationKey = [],\n username: string | undefined,\n operations: (payload: T) => Operation[],\n onSuccess: UseMutationOptions[\"onSuccess\"] = () => {},\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n options?: {\n onMutate?: UseMutationOptions[\"onMutate\"];\n onError?: UseMutationOptions[\"onError\"];\n onSettled?: UseMutationOptions[\"onSettled\"];\n /**\n * Controls whether to wait for block inclusion or just mempool acceptance.\n *\n * - `'async'` (default): Returns after mempool acceptance. Recommended for\n * all operations; errors are still thrown immediately.\n *\n * - `'sync'`: Waits for block inclusion, returns block_num/trx_num.\n * Deprecated; prefer `'async'`.\n */\n broadcastMode?: BroadcastMode;\n }\n) {\n const broadcastMode = options?.broadcastMode ?? 'async';\n\n return useMutation({\n onSuccess,\n onMutate: options?.onMutate,\n onError: options?.onError,\n onSettled: options?.onSettled,\n mutationKey: [...mutationKey, username],\n mutationFn: async (payload: T) => {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n\n const ops = operations(payload);\n\n try {\n // New: Try auth methods in fallback chain (if enabled)\n if (auth?.enableFallback !== false && auth?.adapter) {\n return await broadcastWithFallback(username, ops, auth, authority, broadcastMode);\n }\n\n // Legacy behavior: try methods in fixed order (backward compatible)\n if (auth?.broadcast) {\n return await auth.broadcast(ops, authority);\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n // Legacy auth only supports posting authority\n if (authority !== 'posting') {\n throw new Error(\n `[SDK][Broadcast] Legacy auth only supports posting authority, but '${authority}' was requested. ` +\n `Use AuthContextV2 with an adapter for ${authority} operations.`\n );\n }\n\n const privateKey = PrivateKey.fromString(postingKey);\n\n return await broadcastOperations(\n ops,\n privateKey\n );\n }\n\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const client = new hs.Client({ accessToken });\n const response = await client.broadcast(ops);\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n } catch (e) {\n if (e instanceof RPCError) {\n // Normalize raw blockchain rejections (missing authority, RC exhaustion,\n // validation failures) from every broadcast path — sync and async — into\n // a plain Error whose message is preserved for downstream classification\n // (formatError), so React Query captures a handled mutation error.\n throw new Error(e.message);\n }\n throw e\n }\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\nimport hs from \"hivesigner\";\nimport type { AuthContext } from \"@/modules/core/types\";\n\nexport async function broadcastJson(\n username: string | undefined,\n id: string,\n payload: T,\n auth?: AuthContext\n) {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n const jjson = {\n id,\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify(payload),\n };\n\n if (auth?.broadcast) {\n return auth.broadcast([[\"custom_json\", jjson]], \"posting\");\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n const privateKey = PrivateKey.fromString(postingKey);\n\n return broadcastOperations(\n [[\"custom_json\", jjson]],\n privateKey\n );\n }\n\n // With hivesigner access token\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const response = await new hs.Client({\n accessToken,\n }).customJson([], [username], id, JSON.stringify(payload));\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n}\n","import type { BroadcastMode } from \"./use-broadcast-mutation\";\nimport type { PlatformAdapter } from \"@/modules/core/types\";\n\n/**\n * Delay (ms) before invalidating chain-derived queries after an async\n * broadcast. ~1.3 Hive blocks (3s/block) so the just-broadcast transaction has\n * landed in a block before we refetch — otherwise the refetch returns pre-tx\n * state (e.g. a stale wallet balance).\n */\nexport const BROADCAST_INCLUSION_DELAY_MS = 4000;\n\n/**\n * Invalidate queries after a broadcast, accounting for broadcast mode.\n *\n * - `'sync'`: the transaction already waited for block inclusion, so refetch\n * immediately (returns the adapter's promise so callers may await it).\n * - `'async'` (default) / undefined: the transaction is only in the mempool, so\n * a refetch now would read pre-tx state — defer by ~1 block.\n *\n * No-ops when the adapter can't invalidate.\n */\nexport function invalidateAfterBroadcast(\n adapter: PlatformAdapter | null | undefined,\n broadcastMode: BroadcastMode | undefined,\n keys: any[][]\n): void | Promise {\n if (!adapter?.invalidateQueries) return;\n if (broadcastMode === \"sync\") {\n // Method call (not an extracted reference) so `this` stays bound to adapter.\n return adapter.invalidateQueries(keys);\n }\n setTimeout(() => adapter.invalidateQueries?.(keys), BROADCAST_INCLUSION_DELAY_MS);\n}\n","export function withTimeoutSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n if (!signal) return timeoutSignal;\n\n // AbortSignal.any is available in Chrome 116+, Safari 17.4+, Firefox 124+.\n // Fall back to manual AbortController wiring for older browsers.\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([signal, timeoutSignal]);\n }\n\n const ac = new AbortController();\n const onAbort = () => {\n const reason = signal.aborted ? signal.reason : timeoutSignal.reason;\n ac.abort(reason);\n signal.removeEventListener(\"abort\", onAbort);\n timeoutSignal.removeEventListener(\"abort\", onAbort);\n };\n if (signal.aborted) {\n ac.abort(signal.reason);\n } else if (timeoutSignal.aborted) {\n ac.abort(timeoutSignal.reason);\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n timeoutSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return ac.signal;\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport {\n config as hiveTxConfig,\n setNodes as setHiveTxNodes,\n setRestNodes as setHiveTxRestNodes,\n setRestNodesByApi as setHiveTxRestNodesByApi,\n setUserAgent as setHiveTxUserAgent,\n setResilience as setHiveTxResilience,\n type ResilienceOptions,\n} from \"../../hive-tx\";\nimport type { APIMethods } from \"../../hive-tx/api-types\";\n\n// Safe environment variable access for browser builds\n// In browser builds, tsup will replace process.env.* with literal values at compile time\nconst isDevelopment = (() => {\n try {\n return process.env?.NODE_ENV === 'development';\n } catch {\n return false;\n }\n})();\n\nconst getHeliusApiKey = () => {\n try {\n return process.env?.VITE_HELIUS_API_KEY;\n } catch {\n return undefined;\n }\n};\n\n/** Timeout for internal API calls (search, private API). */\nexport const INTERNAL_API_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on `gcTime` for any query that runs during SSR.\n *\n * A long window is fine in a browser or native app, where the cache holds one\n * user's data and lives as long as the session. It is not fine in a server\n * renderer: every query schedules a gc timer, a pending timer is a GC root, and\n * `Query` holds the whole `QueryCache` — so one long-lived entry keeps\n * everything else that request cached reachable for its entire window. A server\n * process then settles at roughly `ingest rate × gcTime`, which is how\n * ecency.com's renderers ended up aborting on the old-space cap rather than\n * levelling off (2026-07-26).\n *\n * Two minutes is far longer than any single render, which is the only window a\n * server-side entry has to be reused before it is dehydrated into the payload.\n *\n * Note this bounds SDK queries at the source. `apps/web` additionally clamps\n * every query through `defaultQueryOptions`, which is what protects it from\n * options defined outside the SDK; hosts that do not clamp get the right\n * behaviour from these defaults alone.\n */\nexport const SERVER_GC_TIME_MS = 2 * 60 * 1000;\n\n/**\n * How `CONFIG.queryClient` is resolved.\n *\n * This used to be a plain `queryClient: new QueryClient()` property — a single\n * instance created at module import and shared by every caller for the lifetime\n * of the process. That is correct in a browser (one process, one user) but wrong\n * under SSR, where one process serves every request: each server render wrote its\n * fetched data into that one cache and nothing ever removed it, so the heap grew\n * monotonically until the renderer hit its old-space limit and aborted.\n *\n * A host that renders on the server registers a resolver (see\n * `ConfigManager.setQueryClientResolver`) which returns the *current request's*\n * client, so cached data dies with the request that produced it. Hosts that\n * genuinely want one long-lived client keep using `setQueryClient`, and callers\n * that configure nothing fall back to a lazily created instance.\n *\n * The resolver is consulted on every read rather than cached here on purpose:\n * request scoping is the host's concern, and only the host can know when one\n * request ends and the next begins.\n */\nlet queryClientResolver: (() => QueryClient) | undefined;\n\n/** Created on first use, and only when no resolver has been registered. */\nlet fallbackQueryClient: QueryClient | undefined;\n\nfunction resolveQueryClient(): QueryClient {\n if (queryClientResolver) {\n return queryClientResolver();\n }\n return (fallbackQueryClient ??= new QueryClient());\n}\n\nexport const CONFIG = {\n privateApiHost: \"https://ecency.com\",\n /**\n * Observer used for bridge calls when nobody is logged in. The bridge applies\n * this account's mute list to the response, marking muted authors' posts and\n * comments `stats.gray` so clients can dim or collapse them. Anonymous\n * visitors therefore inherit Ecency's moderation instead of seeing an\n * unfiltered firehose. Apps may override via `ConfigManager.setDefaultObserver`,\n * which expects a real account rather than \"\" (see that setter).\n *\n * Note this only *marks* content: the bridge still returns muted authors'\n * posts, so an observer never shortens a feed.\n */\n defaultObserver: \"ecency\",\n /**\n * First-party client identifier sent as the `X-Ecency-Client` header on\n * search/private API requests. Lets the origin distinguish Ecency's own\n * web/mobile/SSR traffic from third-party integrators (who should use the\n * keyed api.hivesearcher.com backend instead of the public proxy). This is\n * a routing marker, not a secret. Apps may override via\n * `ConfigManager.setClientId` (e.g. \"web\" or \"mobile\") for observability.\n */\n clientId: \"ecency-sdk\",\n imageHost: \"https://i.ecency.com\",\n /** Current Hive RPC nodes. Reads from the unified hive-tx config. */\n get hiveNodes(): string[] {\n return hiveTxConfig.nodes;\n },\n heliusApiKey: getHeliusApiKey(),\n /**\n * The React Query client all SDK code reads through `getQueryClient()`.\n * Backed by a resolver so an SSR host can scope it per request — see the\n * `queryClientResolver` note above. Assigning replaces the resolver with one\n * that always returns the assigned client, preserving the previous\n * \"one client, set once\" behaviour for browser and native hosts.\n */\n get queryClient(): QueryClient {\n return resolveQueryClient();\n },\n set queryClient(client: QueryClient) {\n queryClientResolver = () => client;\n },\n pollsApiHost: \"https://poll.ecency.com\",\n plausibleHost: \"https://pl.ecency.com\",\n // DMCA filtering - can be configured by the app\n dmcaAccounts: [] as string[],\n dmcaTags: [] as string[],\n dmcaPatterns: [] as string[],\n // Pre-compiled regex patterns for performance and security\n dmcaTagRegexes: [] as RegExp[],\n dmcaPatternRegexes: [] as RegExp[],\n // Track if DMCA has been initialized to avoid duplicate logs\n _dmcaInitialized: false,\n};\n\ntype DmcaListsInput = {\n accounts?: string[];\n tags?: string[];\n posts?: string[];\n};\n\nexport namespace ConfigManager {\n export function setQueryClient(client: QueryClient) {\n CONFIG.queryClient = client;\n }\n\n /**\n * Register how the SDK should obtain its React Query client, for hosts where\n * a single shared instance is wrong — principally SSR, where one process\n * serves many requests and a shared cache both leaks memory and risks serving\n * one request's data to another.\n *\n * `resolve` is called on every SDK cache access and should return the client\n * belonging to the request currently being handled. In a Next.js App Router\n * host that means wrapping the factory in React's `cache()`, which memoises\n * per request:\n *\n * ```ts\n * ConfigManager.setQueryClientResolver(() => getQueryClient());\n * ```\n *\n * Registering a resolver supersedes any client previously passed to\n * `setQueryClient`; assigning a client afterwards supersedes the resolver.\n */\n export function setQueryClientResolver(resolve: () => QueryClient) {\n queryClientResolver = resolve;\n }\n\n /**\n * Set the private API host\n * @param host - The private API host URL (e.g., \"https://ecency.com\" or \"\" for relative URLs)\n */\n export function setPrivateApiHost(host: string) {\n CONFIG.privateApiHost = host;\n }\n\n /**\n * Set the first-party client identifier sent as the `X-Ecency-Client` header\n * on search/private API requests (e.g. \"web\" or \"mobile\"). Defaults to\n * \"ecency-sdk\". Used by the origin to tell Ecency's own apps apart from\n * third-party integrators.\n * @param clientId - Short client label\n */\n export function setClientId(clientId: string) {\n CONFIG.clientId = clientId;\n }\n\n /**\n * Set the observer used for bridge calls made without a logged-in user.\n * Defaults to \"ecency\"; a third-party integrator should point this at their\n * own moderation account.\n *\n * Must be a real account. An empty value is rejected rather than treated as\n * an opt-out: consumers resolve the observer with `||`, and `getDiscussion`\n * separately falls back to the post author, so \"\" would not disable mute\n * marking. It would silently observe as someone else while being cached under\n * \"\", leaving the request and its cache key describing different things.\n * @param observer - Hive account whose mute list applies to anonymous reads\n * @throws If given an empty or whitespace-only value\n */\n export function setDefaultObserver(observer: string) {\n if (typeof observer !== \"string\" || observer.trim() === \"\") {\n throw new Error(\n \"setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; \" +\n \"observer resolution would fall back to the post author while caching under an empty key.\"\n );\n }\n\n CONFIG.defaultObserver = observer;\n }\n\n /**\n * Get a validated base URL for API requests\n * Returns a valid base URL that can be used with new URL(path, baseUrl)\n *\n * Priority:\n * 1. CONFIG.privateApiHost if set (dev/staging or explicit config)\n * 2. window.location.origin if in browser (production with relative URLs)\n * 3. 'https://ecency.com' as fallback for SSR (production default)\n *\n * @returns A valid base URL string\n * @throws Never throws - always returns a valid URL\n */\n export function getValidatedBaseUrl(): string {\n if (CONFIG.privateApiHost) {\n return CONFIG.privateApiHost;\n }\n\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n\n // Fallback for SSR when privateApiHost is empty (production case)\n return 'https://ecency.com';\n }\n\n /**\n * Set the polls API host\n * @param host - The polls API host URL (e.g., \"https://poll.ecency.com\")\n */\n export function setPollsApiHost(host: string) {\n CONFIG.pollsApiHost = host;\n }\n\n /**\n * Set the image host\n * @param host - The image host URL (e.g., \"https://i.ecency.com\")\n */\n export function setImageHost(host: string) {\n CONFIG.imageHost = host;\n }\n\n /**\n * Set Hive RPC nodes, replacing the default list.\n * Delegates to the unified hive-tx `setNodes` (single validated setter,\n * shared with the lean `@ecency/sdk/hive` entry) so node configuration is\n * defined in exactly one place.\n * @param nodes - Array of Hive RPC node URLs\n */\n export function setHiveNodes(nodes: string[]) {\n setHiveTxNodes(nodes);\n }\n\n /**\n * Set the REST-API node list, replacing the default `restNodes`. Lets an app\n * add/remove REST hosts at runtime (e.g. drop an own node being decommissioned,\n * or widen the public pool) without forking + republishing the SDK. Delegates to\n * the unified hive-tx `setRestNodes` (validated, shared with `@ecency/sdk/hive`).\n * @param nodes - Array of REST-capable node URLs (without a trailing slash)\n */\n export function setRestNodes(nodes: string[]) {\n setHiveTxRestNodes(nodes);\n }\n\n /**\n * Merge per-API REST node overrides. For each API a non-empty valid list pins it\n * to those hosts (so `callREST` never wastes its retry budget on a node that\n * 404/503s the API); an empty list removes the pin (falls back to `restNodes`).\n * Other APIs' pins (e.g. the built-in `hivesense`) are preserved. Delegates to the\n * unified hive-tx `setRestNodesByApi`.\n * @param map - Partial map of REST API name → capable node URLs\n */\n export function setRestNodesByApi(map: Partial>) {\n setHiveTxRestNodesByApi(map);\n }\n\n /**\n * Set the User-Agent sent on server-side (Node) requests to Hive nodes.\n * Lets an app label its own SSR/server traffic (otherwise Node's fetch sends a\n * bare `node` UA). No effect in browsers (User-Agent is a forbidden header) or\n * React Native (keeps its native UA). Delegates to the unified hive-tx setter.\n * @param userAgent - The User-Agent string (e.g. \"ecency-web-ssr (+https://ecency.com)\")\n */\n export function setUserAgent(userAgent: string) {\n setHiveTxUserAgent(userAgent);\n }\n\n /**\n * Tune read-call tail-latency resilience: adaptive per-attempt timeouts\n * (default on) and hedged requests (default OFF — a duplicate request races\n * the next healthy node when the primary stalls, bounded by a token bucket so\n * only the slow tail hedges and pool-wide slowness self-disables it). Partial:\n * only the fields provided are changed; invalid values are ignored\n * field-by-field. Delegates to the unified hive-tx `setResilience`.\n * @param opts - e.g. `{ hedge: true }` to opt into hedged reads\n */\n export function setResilience(opts: Partial) {\n setHiveTxResilience(opts);\n }\n\n /**\n * Static analysis: Check for known ReDoS-vulnerable patterns\n * @param pattern - Raw regex pattern string\n * @returns Object with risk level and reason\n */\n function analyzeRedosRisk(pattern: string): { safe: boolean; reason?: string } {\n // Check 1: Nested quantifiers (e.g., (a+)+, (a*)+, (a{1,})+)\n if (/(\\([^)]*[*+{][^)]*\\))[*+{]/.test(pattern)) {\n return { safe: false, reason: \"nested quantifiers detected\" };\n }\n\n // Check 2: Alternation with overlapping terms (e.g., (a|a)+, (ab|a)+)\n if (/\\([^|)]*\\|[^)]*\\)[*+{]/.test(pattern)) {\n return { safe: false, reason: \"alternation with quantifier (potential overlap)\" };\n }\n\n // Check 3: Catastrophic backtracking patterns (e.g., (a*)*b, (a+)+b)\n if (/\\([^)]*[*+][^)]*\\)[*+]/.test(pattern)) {\n return { safe: false, reason: \"repeated quantifiers (catastrophic backtracking risk)\" };\n }\n\n // Check 4: Greedy quantifiers followed by optional patterns (e.g., .*.*x, .+.+x)\n if (/\\.\\*\\.\\*/.test(pattern) || /\\.\\+\\.\\+/.test(pattern)) {\n return { safe: false, reason: \"multiple greedy quantifiers on wildcards\" };\n }\n\n // Check 5: Unbounded ranges with wildcards (e.g., .{1,999999})\n const unboundedRange = /\\.?\\{(\\d+),(\\d+)\\}/g;\n let match;\n while ((match = unboundedRange.exec(pattern)) !== null) {\n const [, min, max] = match;\n const range = parseInt(max, 10) - parseInt(min, 10);\n if (range > 1000) {\n return { safe: false, reason: `excessive range: {${min},${max}}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Runtime test: Execute regex against adversarial inputs with timeout\n * @param regex - Compiled regex\n * @returns Object indicating if regex passed runtime test\n */\n function testRegexPerformance(regex: RegExp): { safe: boolean; reason?: string } {\n // Test inputs designed to trigger ReDoS in vulnerable patterns\n const adversarialInputs = [\n // Nested quantifier attack\n \"a\".repeat(50) + \"x\",\n // Alternation attack\n \"ab\".repeat(50) + \"x\",\n // Wildcard attack\n \"x\".repeat(100),\n // Mixed attack\n \"aaa\".repeat(30) + \"bbb\".repeat(30) + \"x\",\n ];\n\n const maxExecutionTime = 5; // 5ms hard limit per test\n\n for (const input of adversarialInputs) {\n const start = Date.now();\n try {\n regex.test(input);\n const duration = Date.now() - start;\n\n if (duration > maxExecutionTime) {\n return {\n safe: false,\n reason: `runtime test exceeded ${maxExecutionTime}ms (took ${duration}ms on input length ${input.length})`\n };\n }\n } catch (err) {\n return { safe: false, reason: `runtime test threw error: ${err}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Safely compile a regex pattern with defense-in-depth validation\n * @param pattern - Raw regex pattern string\n * @param maxLength - Maximum allowed pattern length (default 200)\n * @returns Compiled RegExp or null if invalid/unsafe\n */\n function safeCompileRegex(pattern: string, maxLength = 200): RegExp | null {\n // Use the module-level isDevelopment constant\n\n try {\n // Layer 1: Basic validation\n if (!pattern) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: empty pattern`);\n }\n return null;\n }\n\n if (pattern.length > maxLength) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: length ${pattern.length} exceeds max ${maxLength} - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 2: Static ReDoS analysis\n const staticAnalysis = analyzeRedosRisk(pattern);\n if (!staticAnalysis.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${staticAnalysis.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 3: Compilation attempt\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (compileErr) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${pattern.substring(0, 50)}...`, compileErr);\n }\n return null;\n }\n\n // Layer 4: Runtime performance testing\n const runtimeTest = testRegexPerformance(regex);\n if (!runtimeTest.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${runtimeTest.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n return regex;\n } catch (err) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${pattern.substring(0, 50)}...`, err);\n }\n return null;\n }\n }\n\n /**\n * Set DMCA filtering lists\n * @param lists - DMCA lists object containing accounts/tags/posts arrays\n */\n export function setDmcaLists(\n lists: DmcaListsInput = {}\n ) {\n const coerceList = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n // Ensure we have a valid object to work with\n const input = lists || {};\n\n const resolved = {\n accounts: coerceList(input.accounts),\n tags: coerceList(input.tags),\n patterns: coerceList(input.posts),\n };\n\n CONFIG.dmcaAccounts = resolved.accounts;\n CONFIG.dmcaTags = resolved.tags;\n CONFIG.dmcaPatterns = resolved.patterns;\n\n // Pre-compile tag regex patterns (tags can be regex)\n CONFIG.dmcaTagRegexes = resolved.tags\n .map((pattern) => safeCompileRegex(pattern))\n .filter((r): r is RegExp => r !== null);\n\n // Post patterns are plain strings for exact matching, not regex\n // No compilation needed - they will be used with simple string comparison\n CONFIG.dmcaPatternRegexes = [];\n\n const rejectedTagCount = resolved.tags.length - CONFIG.dmcaTagRegexes.length;\n\n // Only log once to avoid noise during builds/hot reloads\n // Only show in development mode to avoid cluttering production console\n // Use the module-level isDevelopment constant\n\n if (!CONFIG._dmcaInitialized && isDevelopment) {\n console.log(`[SDK] DMCA configuration loaded:`);\n console.log(` - Accounts: ${resolved.accounts.length}`);\n console.log(` - Tag patterns: ${CONFIG.dmcaTagRegexes.length}/${resolved.tags.length} compiled (${rejectedTagCount} rejected)`);\n console.log(` - Post patterns: ${resolved.patterns.length} (using exact string matching)`);\n\n if (rejectedTagCount > 0) {\n console.warn(`[SDK] ${rejectedTagCount} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`);\n }\n }\n\n CONFIG._dmcaInitialized = true;\n }\n}\n","import {\n InfiniteData,\n QueryClient,\n QueryKey,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n useQuery,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { CONFIG } from \"./config\";\n\n/**\n * Builds a client with the SDK's defaults. It is only a factory — request\n * scoping is the host's job, via `ConfigManager.setQueryClientResolver`, since\n * only the host knows where one request ends and the next begins.\n */\nexport function makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // With SSR, we usually want to set some default staleTime\n // above 0 to avoid refetching immediately on the client\n // staleTime: 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n },\n },\n });\n}\nexport const getQueryClient = () => CONFIG.queryClient;\n\nexport namespace EcencyQueriesManager {\n export function getQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData(queryKey);\n }\n\n export function getInfiniteQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData>(queryKey);\n }\n\n export async function prefetchQuery(options: UseQueryOptions) {\n const queryClient = getQueryClient();\n await queryClient.prefetchQuery(options);\n return getQueryData(options.queryKey);\n }\n\n export async function prefetchInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n const queryClient = getQueryClient();\n await queryClient.prefetchInfiniteQuery(options);\n return getInfiniteQueryData(options.queryKey);\n }\n\n export function generateClientServerQuery(options: UseQueryOptions) {\n return {\n prefetch: () => prefetchQuery(options),\n getData: () => getQueryData(options.queryKey),\n useClientQuery: () => useQuery(options),\n fetchAndGet: () => getQueryClient().fetchQuery(options),\n };\n }\n\n export function generateClientServerInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n return {\n prefetch: () => prefetchInfiniteQuery(options),\n getData: () => getInfiniteQueryData(options.queryKey),\n useClientQuery: () => useInfiniteQuery(options),\n fetchAndGet: () => getQueryClient().fetchInfiniteQuery(options),\n };\n }\n}\n","export function encodeObj(o: any): string {\n return btoa(JSON.stringify(o));\n}\n\nexport function decodeObj(o: any): any {\n let dataToParse = atob(o);\n if (dataToParse[0] !== \"{\") {\n return undefined;\n }\n return JSON.parse(dataToParse);\n}\n","import type { SMTAsset } from \"@/modules/core/hive-tx\";\n\nexport enum Symbol {\n HIVE = \"HIVE\",\n HBD = \"HBD\",\n VESTS = \"VESTS\",\n}\n\nexport enum NaiMap {\n \"@@000000021\" = \"HIVE\",\n \"@@000000013\" = \"HBD\",\n \"@@000000037\" = \"VESTS\",\n}\n\nexport interface Asset {\n amount: number;\n symbol: Symbol;\n}\n\nexport function parseAsset(sval: string | SMTAsset): Asset {\n if (typeof sval === \"string\") {\n const sp = sval.split(\" \");\n return {\n amount: parseFloat(sp[0]),\n // @ts-ignore\n symbol: Symbol[sp[1]],\n };\n } else {\n return {\n amount: parseFloat(sval.amount.toString()) / Math.pow(10, sval.precision),\n // @ts-ignore\n symbol: NaiMap[sval.nai],\n };\n }\n}\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][SDK] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","export function isCommunity(value: unknown) {\n return typeof value === \"string\" ? /^hive-\\d+$/.test(value) : false;\n}\n","import { WrappedResponse } from \"../types/pagination\";\n\n/**\n * Type guard to check if response is wrapped with pagination metadata\n */\nexport function isWrappedResponse(response: any): response is WrappedResponse {\n return (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n \"pagination\" in response &&\n Array.isArray(response.data)\n );\n}\n\n/**\n * Normalize response to wrapped format for backwards compatibility\n * If the backend returns old format (array), convert it to wrapped format\n */\nexport function normalizeToWrappedResponse(\n response: T[] | WrappedResponse,\n limit: number\n): WrappedResponse {\n if (isWrappedResponse(response)) {\n return response;\n }\n\n // Old format - just an array\n // Since we don't have pagination metadata, assume no more pages\n return {\n data: Array.isArray(response) ? response : [],\n pagination: {\n total: Array.isArray(response) ? response.length : 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n}\n","export function vestsToHp(vests: number, hivePerMVests: number): number {\n return (vests / 1e6) * hivePerMVests;\n}\n","export function isEmptyDate(s: string | undefined): boolean {\n if (s === undefined) {\n return true;\n }\n\n return parseInt(s.split(\"-\")[0], 10) < 1980;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { DynamicProps } from \"../types\";\nimport { parseAsset } from \"../utils\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// This query powers wallet/HP/reward math that should stay close to chain state.\n// Keep a short refresh cadence despite the 5 RPC calls.\nconst DYNAMIC_PROPS_REFRESH_MS = 60 * 1000;\n\nexport function getDynamicPropsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.core.dynamicProps(),\n refetchInterval: DYNAMIC_PROPS_REFRESH_MS,\n staleTime: DYNAMIC_PROPS_REFRESH_MS,\n queryFn: async ({ signal }): Promise => {\n // Get raw blockchain data — all five calls are independent, run in parallel.\n // Hardfork properties is wrapped with catch since not all nodes support it.\n const [rawGlobalDynamic, rawFeedHistory, rawChainProps, rawRewardFund, rawHardforkProps] = await Promise.all([\n callRPC(\"condenser_api.get_dynamic_global_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_feed_history\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_chain_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_reward_fund\", [\"post\"], undefined, undefined, signal),\n callRPC(\"database_api.get_hardfork_properties\", {}, undefined, undefined, signal)\n .catch(() => ({ current_hardfork_version: \"1.28.0\", last_hardfork: 28 })),\n ]) as [any, any, any, any, any];\n\n // Calculate derived values for backward compatibility\n // parseAsset handles both string format (\"200905388484 HIVE\") and NAI format ({ amount, nai, precision })\n const totalVestingSharesAmount = parseAsset(rawGlobalDynamic.total_vesting_shares).amount;\n const totalVestingFundAmount = parseAsset(rawGlobalDynamic.total_vesting_fund_hive).amount;\n\n // Guard against division by zero/NaN/Infinity\n let hivePerMVests = 0;\n if (\n Number.isFinite(totalVestingSharesAmount) &&\n totalVestingSharesAmount !== 0 &&\n Number.isFinite(totalVestingFundAmount)\n ) {\n hivePerMVests = (totalVestingFundAmount / totalVestingSharesAmount) * 1e6;\n }\n const base = parseAsset(rawFeedHistory.current_median_history.base).amount;\n const quote = parseAsset(rawFeedHistory.current_median_history.quote).amount;\n const fundRecentClaims = parseFloat(rawRewardFund.recent_claims);\n const fundRewardBalance = parseAsset(rawRewardFund.reward_balance).amount;\n const votePowerReserveRate = Number(rawGlobalDynamic.vote_power_reserve_rate ?? 0);\n const authorRewardCurve = rawRewardFund.author_reward_curve ?? \"linear\";\n const contentConstant = Number(rawRewardFund.content_constant ?? 0);\n const currentHardforkVersion = String(rawHardforkProps.current_hardfork_version ?? \"0.0.0\");\n const lastHardfork = Number(rawHardforkProps.last_hardfork ?? 0);\n const hbdPrintRate = rawGlobalDynamic.hbd_print_rate;\n const hbdInterestRate = rawGlobalDynamic.hbd_interest_rate;\n const headBlock = rawGlobalDynamic.head_block_number;\n const totalVestingFund = totalVestingFundAmount;\n const totalVestingShares = totalVestingSharesAmount;\n const virtualSupply = parseAsset(rawGlobalDynamic.virtual_supply).amount;\n const vestingRewardPercent = rawGlobalDynamic.vesting_reward_percent || 0;\n const accountCreationFee = rawChainProps.account_creation_fee;\n\n return {\n // Backward compatible transformed fields (camelCase, parsed)\n hivePerMVests,\n base,\n quote,\n fundRecentClaims,\n fundRewardBalance,\n votePowerReserveRate,\n authorRewardCurve,\n contentConstant,\n currentHardforkVersion,\n lastHardfork,\n hbdPrintRate,\n hbdInterestRate,\n headBlock,\n totalVestingFund,\n totalVestingShares,\n virtualSupply,\n vestingRewardPercent,\n accountCreationFee,\n\n // Raw blockchain data (snake_case, unparsed) for direct use\n // Includes ALL fields from the blockchain responses\n raw: {\n globalDynamic: rawGlobalDynamic,\n feedHistory: rawFeedHistory,\n chainProps: rawChainProps,\n rewardFund: rawRewardFund,\n hardforkProps: rawHardforkProps,\n },\n } as DynamicProps;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface RewardFund {\n id: number;\n name: string;\n reward_balance: string;\n recent_claims: string;\n last_update: string;\n content_constant: string;\n percent_curation_rewards: number;\n percent_content_rewards: number;\n author_reward_curve: string;\n curation_reward_curve: string;\n}\n\n/**\n * Get reward fund information from the blockchain\n * @param fundName - Name of the reward fund (default: 'post')\n */\nexport function getRewardFundQueryOptions(fundName = \"post\") {\n return queryOptions({\n queryKey: QueryKeys.core.rewardFund(fundName),\n queryFn: () =>\n callRPC(\"condenser_api.get_reward_fund\", [\n fundName,\n ]) as Promise,\n });\n}\n","/**\n * Centralized query key definitions for all SDK queries.\n *\n * These key builders are the single source of truth for React Query cache keys.\n * Both SDK query options and web app consumers should reference these\n * instead of using inline string arrays.\n *\n * @example\n * ```typescript\n * import { QueryKeys } from \"@ecency/sdk\";\n *\n * // In query options\n * queryKey: QueryKeys.posts.entry(`/@${author}/${permlink}`)\n *\n * // In cache invalidation\n * queryClient.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) })\n * ```\n */\n/** Strip trailing undefined values so the key works as a prefix for partialMatchKey */\nfunction key(...parts: unknown[]): unknown[] {\n let end = parts.length;\n while (end > 0 && parts[end - 1] === undefined) {\n end--;\n }\n return parts.slice(0, end);\n}\n\nexport const QueryKeys = {\n // ===========================================================================\n // Posts\n // ===========================================================================\n posts: {\n entry: (entryPath: string) => [\"posts\", \"entry\", entryPath],\n postHeader: (author: string, permlink?: string) =>\n [\"posts\", \"post-header\", author, permlink],\n content: (author: string, permlink: string) =>\n [\"posts\", \"content\", author, permlink],\n contentReplies: (author: string, permlink: string) =>\n [\"posts\", \"content-replies\", author, permlink],\n accountPosts: (\n username: string,\n filter: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"account-posts\", username, filter, limit, observer],\n accountPostsPage: (\n username: string,\n filter: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n observer: string\n ) =>\n [\n \"posts\",\n \"account-posts-page\",\n username,\n filter,\n startAuthor,\n startPermlink,\n limit,\n observer,\n ],\n userPostVote: (username: string, author: string, permlink: string) =>\n [\"posts\", \"user-vote\", username, author, permlink],\n reblogs: (username: string, limit: number) =>\n [\"posts\", \"reblogs\", username, limit],\n entryActiveVotes: (author?: string, permlink?: string) =>\n [\"posts\", \"entry-active-votes\", author, permlink],\n rebloggedBy: (author: string, permlink: string) =>\n [\"posts\", \"reblogged-by\", author, permlink],\n tips: (author: string, permlink: string) =>\n [\"posts\", \"tips\", author, permlink],\n normalize: (author: string, permlink: string) =>\n [\"posts\", \"normalize\", author, permlink],\n drafts: (activeUsername?: string) =>\n [\"posts\", \"drafts\", activeUsername],\n draftsInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"drafts\", \"infinite\", activeUsername, limit),\n schedules: (activeUsername?: string) =>\n [\"posts\", \"schedules\", activeUsername],\n schedulesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"schedules\", \"infinite\", activeUsername, limit),\n fragments: (username?: string) =>\n [\"posts\", \"fragments\", username],\n fragmentsInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"fragments\", \"infinite\", username, limit),\n images: (username?: string) => [\"posts\", \"images\", username],\n galleryImages: (activeUsername?: string) =>\n [\"posts\", \"gallery-images\", activeUsername],\n imagesInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"images\", \"infinite\", username, limit),\n promoted: (type: string) => [\"posts\", \"promoted\", type],\n _promotedPrefix: [\"posts\", \"promoted\"],\n accountPostsBlogPrefix: (username: string) =>\n [\"posts\", \"account-posts\", username, \"blog\"] as const,\n postsRanked: (\n sort: string,\n tag: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"posts-ranked\", sort, tag, limit, observer],\n postsRankedPage: (\n sort: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n tag: string,\n observer: string\n ) =>\n [\n \"posts\",\n \"posts-ranked-page\",\n sort,\n startAuthor,\n startPermlink,\n limit,\n tag,\n observer,\n ],\n discussions: (\n author: string,\n permlink: string,\n order: string,\n observer: string\n ) => [\"posts\", \"discussions\", author, permlink, order, observer],\n discussion: (author: string, permlink: string, observer: string) =>\n [\"posts\", \"discussion\", author, permlink, observer],\n deletedEntry: (entryPath: string) =>\n [\"posts\", \"deleted-entry\", entryPath],\n commentHistory: (\n author: string,\n permlink: string,\n onlyMeta: boolean\n ) => [\"posts\", \"comment-history\", author, permlink, onlyMeta],\n trendingTags: () => [\"posts\", \"trending-tags\"],\n trendingTagsWithStats: (limit: number) =>\n [\"posts\", \"trending-tags\", \"stats\", limit],\n wavesFeed: (\n params: {\n containers?: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"feed\",\n params.tag ?? \"\",\n params.following ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n shortsFeed: (\n params: {\n containers?: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"shorts\",\n params.tag ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n wavesByHost: (host: string) =>\n [\"posts\", \"waves\", \"by-host\", host],\n wavesByTag: (host: string, tag: string) =>\n [\"posts\", \"waves\", \"by-tag\", host, tag],\n wavesFollowing: (host: string, username: string) =>\n [\"posts\", \"waves\", \"following\", host, username],\n wavesTrendingTags: (host: string, hours: number) =>\n [\"posts\", \"waves\", \"trending-tags\", host, hours],\n wavesByAccount: (host: string, username: string) =>\n [\"posts\", \"waves\", \"by-account\", host, username],\n wavesTrendingAuthors: (host: string) =>\n [\"posts\", \"waves\", \"trending-authors\", host],\n _prefix: [\"posts\"],\n },\n\n // ===========================================================================\n // Accounts\n // ===========================================================================\n accounts: {\n full: (username?: string) => [\"get-account-full\", username],\n list: (...usernames: string[]) =>\n [\"accounts\", \"list\", ...usernames],\n friends: (\n following: string,\n mode: string,\n followType: string,\n limit: number\n ) => [\"accounts\", \"friends\", following, mode, followType, limit],\n searchFriends: (username: string, mode: string, query: string) =>\n [\"accounts\", \"friends\", \"search\", username, mode, query],\n subscriptions: (username: string) =>\n [\"accounts\", \"subscriptions\", username],\n followCount: (username: string) =>\n [\"accounts\", \"follow-count\", username],\n recoveries: (username: string) =>\n [\"accounts\", \"recoveries\", username],\n pendingRecovery: (username: string) =>\n [\"accounts\", \"recoveries\", username, \"pending-request\"],\n checkWalletPending: (username: string, code: string | null) =>\n [\"accounts\", \"check-wallet-pending\", username, code],\n mutedUsers: (username: string) =>\n [\"accounts\", \"muted-users\", username],\n following: (\n follower: string,\n startFollowing: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"following\",\n follower,\n startFollowing,\n followType,\n limit,\n ],\n followers: (\n following: string,\n startFollower: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"followers\",\n following,\n startFollower,\n followType,\n limit,\n ],\n search: (query: string, excludeList?: string[]) =>\n [\"accounts\", \"search\", query, excludeList],\n profiles: (accounts: string[], observer: string) =>\n [\"accounts\", \"profiles\", accounts, observer],\n lookup: (query: string, limit: number) =>\n [\"accounts\", \"lookup\", query, limit],\n transactions: (username: string, group: string, limit: number) =>\n [\"accounts\", \"transactions\", username, group, limit],\n favorites: (activeUsername?: string) =>\n [\"accounts\", \"favorites\", activeUsername],\n favoritesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"favorites\", \"infinite\", activeUsername, limit),\n checkFavorite: (activeUsername: string, targetUsername: string) =>\n [\n \"accounts\",\n \"favorites\",\n \"check\",\n activeUsername,\n targetUsername,\n ],\n relations: (reference: string | undefined, target: string | undefined) =>\n [\"accounts\", \"relations\", reference, target],\n bots: () => [\"accounts\", \"bots\"],\n voteHistory: (username: string, limit: number) =>\n [\"accounts\", \"vote-history\", username, limit],\n reputations: (query: string, limit: number) =>\n [\"accounts\", \"reputations\", query, limit],\n bookmarks: (activeUsername?: string) =>\n [\"accounts\", \"bookmarks\", activeUsername],\n bookmarksInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"bookmarks\", \"infinite\", activeUsername, limit),\n referrals: (username: string) =>\n [\"accounts\", \"referrals\", username],\n referralsStats: (username: string) =>\n [\"accounts\", \"referrals-stats\", username],\n proMembers: () => [\"accounts\", \"pro-members\"],\n _prefix: [\"accounts\"],\n },\n\n // ===========================================================================\n // Notifications\n // ===========================================================================\n notifications: {\n announcements: () => [\"notifications\", \"announcements\"],\n spotlights: () => [\"notifications\", \"spotlights\"],\n list: (activeUsername?: string, filter?: string) =>\n [\"notifications\", activeUsername, filter],\n unreadCount: (activeUsername?: string) =>\n [\"notifications\", \"unread\", activeUsername],\n settings: (activeUsername?: string) =>\n [\"notifications\", \"settings\", activeUsername],\n _prefix: [\"notifications\"],\n },\n\n // ===========================================================================\n // Core\n // ===========================================================================\n core: {\n rewardFund: (fundName: string) =>\n [\"core\", \"reward-fund\", fundName],\n dynamicProps: () => [\"core\", \"dynamic-props\"],\n chainProperties: () => [\"core\", \"chain-properties\"],\n _prefix: [\"core\"],\n },\n\n // ===========================================================================\n // Communities\n // ===========================================================================\n communities: {\n single: (name?: string, observer?: string) =>\n [\"community\", \"single\", name, observer],\n /** Prefix key for matching all observer variants of a community */\n singlePrefix: (name: string) =>\n [\"community\", \"single\", name] as const,\n context: (username: string, communityName: string) =>\n [\"community\", \"context\", username, communityName],\n rewarded: () => [\"communities\", \"rewarded\"],\n list: (sort: string, query: string, limit: number) =>\n [\"communities\", \"list\", sort, query, limit],\n subscribers: (communityName: string) =>\n [\"communities\", \"subscribers\", communityName],\n subscribersInfinite: (communityName: string) =>\n [\"communities\", \"subscribers\", \"infinite\", communityName],\n accountNotifications: (account: string, limit: number) =>\n [\"communities\", \"account-notifications\", account, limit],\n },\n\n // ===========================================================================\n // Proposals\n // ===========================================================================\n proposals: {\n list: () => [\"proposals\", \"list\"],\n proposal: (id: number) => [\"proposals\", \"proposal\", id],\n votes: (proposalId: number, voter: string, limit: number) =>\n [\"proposals\", \"votes\", proposalId, voter, limit],\n votesPrefix: (proposalId: number) =>\n [\"proposals\", \"votes\", proposalId] as const,\n votesByUser: (voter: string) =>\n [\"proposals\", \"votes\", \"by-user\", voter],\n },\n\n // ===========================================================================\n // Search\n // ===========================================================================\n search: {\n topics: (q: string, limit: number) => [\"search\", \"topics\", q, limit],\n path: (q: string) => [\"search\", \"path\", q],\n account: (q: string, limit: number) =>\n [\"search\", \"account\", q, limit],\n results: (\n q: string,\n sort: string,\n hideLow: boolean | string,\n since?: string,\n scrollId?: string,\n votes?: number\n ) => {\n const normalizedHideLow = typeof hideLow === \"string\" ? hideLow === \"1\" || hideLow === \"true\" : hideLow;\n return [\"search\", q, sort, normalizedHideLow, since, scrollId, votes] as const;\n },\n controversialRising: (what: string, tag: string) =>\n [\"search\", \"controversial-rising\", what, tag],\n similarEntries: (author: string, permlink: string, content?: string) =>\n content\n ? [\"search\", \"similar-entries\", author, permlink, content]\n : [\"search\", \"similar-entries\", author, permlink],\n api: (\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n ) => key(\"search\", \"api\", q, sort, hideLow, since, votes, includeNsfw),\n },\n\n // ===========================================================================\n // Witnesses\n // ===========================================================================\n witnesses: {\n list: (limit: number) => [\"witnesses\", \"list\", limit],\n votes: (username: string | undefined) => [\"witnesses\", \"votes\", username],\n proxy: () => [\"witnesses\", \"proxy\"],\n voters: (\n witness: string,\n page: number,\n pageSize: number,\n sort: string,\n direction: string\n ) => [\"witnesses\", \"voters\", witness, page, pageSize, sort, direction],\n voterCount: (witness: string) =>\n [\"witnesses\", \"voter-count\", witness],\n },\n\n // ===========================================================================\n // Wallet\n // ===========================================================================\n wallet: {\n outgoingRcDelegations: (username: string, limit: number) =>\n [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n vestingDelegations: (username: string, limit: number) =>\n [\"wallet\", \"vesting-delegations\", username, limit],\n withdrawRoutes: (account: string) =>\n [\"wallet\", \"withdraw-routes\", account],\n incomingRc: (username: string) =>\n [\"wallet\", \"incoming-rc\", username],\n conversionRequests: (account: string) =>\n [\"wallet\", \"conversion-requests\", account],\n receivedVestingShares: (username: string) =>\n [\"wallet\", \"received-vesting-shares\", username],\n savingsWithdraw: (account: string) =>\n [\"wallet\", \"savings-withdraw\", account],\n openOrders: (user: string) =>\n [\"wallet\", \"open-orders\", user],\n collateralizedConversionRequests: (account: string) =>\n [\"wallet\", \"collateralized-conversion-requests\", account],\n recurrentTransfers: (username: string) =>\n [\"wallet\", \"recurrent-transfers\", username],\n balanceHistory: (username: string, coinType: string, pageSize: number) =>\n [\"wallet\", \"balance-history\", username, coinType, pageSize],\n aggregatedHistory: (\n username: string,\n coinType: string,\n granularity?: \"yearly\" | \"monthly\" | \"daily\"\n ) =>\n granularity === undefined\n ? [\"wallet\", \"aggregated-history\", username, coinType]\n : [\"wallet\", \"aggregated-history\", username, coinType, granularity],\n portfolio: (\n username: string,\n onlyEnabled: string,\n currency: string\n ) =>\n [\"wallet\", \"portfolio\", \"v2\", username, onlyEnabled, currency],\n },\n\n // ===========================================================================\n // Assets\n // ===========================================================================\n assets: {\n hiveGeneralInfo: (username: string) =>\n [\"assets\", \"hive\", \"general-info\", username],\n hiveTransactions: (username: string, limit: number, filterKey: string) =>\n [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n hiveWithdrawalRoutes: (username: string) =>\n [\"assets\", \"hive\", \"withdrawal-routes\", username],\n hiveMetrics: (bucketSeconds: number) =>\n [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n hbdGeneralInfo: (username: string) =>\n [\"assets\", \"hbd\", \"general-info\", username],\n hbdTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) => [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n hivePowerGeneralInfo: (username: string) =>\n [\"assets\", \"hive-power\", \"general-info\", username],\n hivePowerDelegates: (username: string) =>\n [\"assets\", \"hive-power\", \"delegates\", username],\n hivePowerDelegatings: (username: string) =>\n [\"assets\", \"hive-power\", \"delegatings\", username],\n hivePowerTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) =>\n [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n pointsGeneralInfo: (username: string) =>\n [\"assets\", \"points\", \"general-info\", username],\n pointsTransactions: (username: string, type: string) =>\n [\"assets\", \"points\", \"transactions\", username, type],\n ecencyAssetInfo: (username: string, asset: string, currency: string) =>\n [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n },\n\n // ===========================================================================\n // Market\n // ===========================================================================\n market: {\n statistics: () => [\"market\", \"statistics\"],\n orderBook: (limit: number) => [\"market\", \"order-book\", limit],\n history: (seconds: number, startDate: number, endDate: number) =>\n [\"market\", \"history\", seconds, startDate, endDate],\n feedHistory: () => [\"market\", \"feed-history\"],\n hiveHbdStats: () => [\"market\", \"hive-hbd-stats\"],\n data: (\n coin: string,\n vsCurrency: string,\n fromTs: number,\n toTs: number\n ) => [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n tradeHistory: (limit: number, start: number, end: number) =>\n [\"market\", \"trade-history\", limit, start, end],\n currentMedianHistoryPrice: () =>\n [\"market\", \"current-median-history-price\"],\n },\n\n // ===========================================================================\n // Analytics\n // ===========================================================================\n analytics: {\n discoverCuration: (duration: string) =>\n [\"analytics\", \"discover-curation\", duration],\n pageStats: (\n url: string,\n dimensions: string,\n metrics: string,\n dateRange: string\n ) =>\n [\"analytics\", \"page-stats\", url, dimensions, metrics, dateRange],\n discoverLeaderboard: (duration: string) =>\n [\"analytics\", \"discover-leaderboard\", duration],\n },\n\n // ===========================================================================\n // Promotions\n // ===========================================================================\n promotions: {\n promotePrice: () => [\"promotions\", \"promote-price\"],\n boostPlusPrices: () => [\"promotions\", \"boost-plus-prices\"],\n boostPlusAccounts: (account: string) =>\n [\"promotions\", \"boost-plus-accounts\", account],\n },\n\n // ===========================================================================\n // Resource Credits\n // ===========================================================================\n resourceCredits: {\n account: (username: string) =>\n [\"resource-credits\", \"account\", username],\n stats: () => [\"resource-credits\", \"stats\"],\n },\n\n // ===========================================================================\n // Points\n // ===========================================================================\n points: {\n points: (username: string, filter: number) =>\n [\"points\", username, filter],\n _prefix: (username: string) => [\"points\", username],\n },\n\n // ===========================================================================\n // Polls\n // ===========================================================================\n polls: {\n details: (author: string, permlink: string) =>\n [\"polls\", \"details\", author, permlink],\n vote: (author?: string, permlink?: string) =>\n author && permlink\n ? [\"polls\", \"vote\", author, permlink]\n : [\"polls\", \"vote\"],\n _prefix: [\"polls\"],\n },\n\n // ===========================================================================\n // Operations\n // ===========================================================================\n operations: {\n chainProperties: () => [\"operations\", \"chain-properties\"],\n },\n\n // ===========================================================================\n // Games\n // ===========================================================================\n games: {\n statusCheck: (gameType: string, username: string) =>\n [\"games\", \"status-check\", gameType, username],\n },\n\n quests: {\n status: (username: string | undefined) => [\"quests\", \"status\", username],\n },\n\n // ===========================================================================\n // Support Ecency\n // ===========================================================================\n support: {\n settings: (username: string | undefined) => [\"support\", \"settings\", username],\n _prefix: [\"support\"],\n },\n\n // ===========================================================================\n // Bad Actors\n // ===========================================================================\n badActors: {\n list: () => [\"bad-actors\", \"list\"],\n _prefix: [\"bad-actors\"],\n },\n\n // ===========================================================================\n // AI\n // ===========================================================================\n ai: {\n prices: () => [\"ai\", \"prices\"] as const,\n assistPrices: (username?: string) => [\"ai\", \"assist-prices\", username] as const,\n transcribePrice: (username?: string) => [\"ai\", \"transcribe-price\", username] as const,\n _prefix: [\"ai\"],\n },\n} as const;\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiImagePriceResponse } from \"../types\";\n\nexport function getAiGeneratePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.prices(),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-generate-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI generation prices: ${response.status}`);\n }\n\n return (await response.json()) as AiImagePriceResponse;\n },\n staleTime: 300_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiAssistPrice } from \"../types\";\n\nexport function getAiAssistPriceQueryOptions(username: string | undefined, accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.assistPrices(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-assist-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI assist prices: ${response.status}`);\n }\n\n return (await response.json()) as AiAssistPrice[];\n },\n staleTime: 60_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiTranscribePrice } from \"../types\";\n\n/**\n * Dictation pricing. Kept on its own route rather than folded into\n * /private-api/ai-assist-price: that endpoint returns a list of flat-cost actions and\n * shipped clients render every entry as a selectable assist action, so adding a\n * metered one there would surface in older clients as an action they cannot perform.\n *\n * Everything except `free_remaining` is static, so this is cheap to hold and lets the\n * client price a clip locally while the user is still recording.\n */\nexport function getAiTranscribePriceQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.ai.transcribePrice(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI transcribe price: ${response.status}`);\n }\n\n return (await response.json()) as AiTranscribePrice;\n },\n staleTime: 60_000,\n enabled: !!accessToken\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiGenerationResponse } from \"../types\";\n\nexport interface GenerateImageParams {\n prompt: string;\n aspect_ratio?: string;\n power?: number;\n // Pass a stable key to make a retry recover the same paid generation. If omitted a\n // fresh key is generated per call (only dedupes edge/proxy retries, not user retries).\n idempotency_key?: string;\n}\n\n// Generates a key matching the eepoints validator [A-Za-z0-9_-]{8,64}.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useGenerateImage(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"generate-image\"],\n mutationFn: async (params: GenerateImageParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-generate-image\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: accessToken,\n us: username,\n prompt: params.prompt,\n aspect_ratio: params.aspect_ratio ?? \"1:1\",\n power: params.power ?? 1,\n idempotency_key: params.idempotency_key ?? makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][GenerateImage] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n // 202 = the prediction is paid for and captured but not yet delivered to our image\n // host. Detect it by HTTP status BEFORE parsing (the body may be present or empty)\n // and surface it as a typed error so the caller can retry with the SAME\n // idempotency_key to fetch it — no second prediction, no second charge.\n if (response.status === 202) {\n let pendingData: Record = {};\n try {\n pendingData = await response.json();\n } catch {\n // empty / non-JSON 202 body is fine — the status alone drives recovery\n }\n const err = new Error(\"[SDK][AI][GenerateImage] – delivery pending\");\n (err as any).status = 202;\n (err as any).data = pendingData;\n throw err;\n }\n\n const data = (await response.json()) as AiGenerationResponse;\n\n return data;\n },\n onSuccess: () => {\n // Invalidate points cache since balance changed\n if (username) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiAssistResponse } from \"../types\";\n\nexport interface AiAssistParams {\n action: string;\n text: string;\n code?: string;\n}\n\n// Generates a key that matches the eepoints validator [A-Za-z0-9_-]{8,64}.\n// Used to dedupe duplicate POSTs caused by edge/proxy retries — same key on\n// retry returns the cached AI output without re-charging or re-calling Claude.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useAiAssist(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"assist\"],\n mutationFn: async (params: AiAssistParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][Assist] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][Assist] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-assist\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: params.code ?? accessToken,\n us: username,\n action: params.action,\n text: params.text,\n idempotency_key: makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][Assist] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n return (await response.json()) as AiAssistResponse;\n },\n onSuccess: (data) => {\n if (username) {\n // Invalidate points cache if cost was charged\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n // Invalidate assist prices to refresh free_remaining counts\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.assistPrices(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiTranscribeParams, AiTranscribeResponse } from \"../types\";\n\n// Matches the eepoints validator [A-Za-z0-9_-]{8,64}. Dedupes duplicate POSTs caused\n// by edge/proxy retries -- the same key returns the cached transcript without\n// re-charging or re-calling the vendor.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Transcribe an audio clip to text, charged per 30 seconds.\n *\n * Sends multipart/form-data rather than JSON because it carries a file. Unlike the\n * other AI mutations the charge is BURNED rather than moved to the treasury, so the\n * points transaction shows up as PointTransactionType.BURNED (997).\n */\nexport function useAiTranscribe(username: string | undefined, accessToken: string | undefined) {\n return useMutation({\n mutationKey: [\"ai\", \"transcribe\"],\n mutationFn: async (params: AiTranscribeParams): Promise => {\n if (!username) {\n throw new Error(\"[SDK][AI][Transcribe] – username wasn't provided\");\n }\n\n // Validate the token actually being sent, not just the bound one. A caller\n // that resolves a fresh token per call (because the bound one can expire\n // during a long recording) legitimately has nothing at hook construction.\n const code = params.code ?? accessToken;\n if (!code) {\n throw new Error(\"[SDK][AI][Transcribe] – access token wasn't found\");\n }\n\n const form = new FormData();\n form.append(\"code\", code);\n // `us` is resolved from the code server-side and is deliberately not sent:\n // upstream burns from whoever it names.\n form.append(\"duration_ms\", String(Math.round(params.durationMs)));\n // Caller-supplied key when there is one. Generating a fresh key per attempt\n // would defeat the dedupe in the one case it exists for: a POST that reached\n // the server whose response was lost. Retrying then would transcribe and\n // charge a second time. Same contract as useGenerateImage.\n form.append(\"idempotency_key\", params.idempotency_key ?? makeIdempotencyKey());\n form.append(\"audio\", params.audio, params.fileName ?? \"clip.webm\");\n\n const fetchApi = getBoundFetch();\n // No Content-Type header: fetch sets it, including the multipart boundary.\n // Setting it by hand drops the boundary and the body becomes unparseable.\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe\", {\n method: \"POST\",\n body: form\n });\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n // Object.assign rather than `as any` casts: callers need `status` to tell a\n // 402 (out of Points) from a 429 (rate limited) from a 400 (clip too long),\n // and this keeps that shape typed.\n throw Object.assign(\n new Error(\n `[SDK][AI][Transcribe] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n ),\n { status: response.status, data: parsed }\n );\n }\n\n return (await response.json()) as AiTranscribeResponse;\n },\n onSuccess: (data) => {\n if (username) {\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username)\n });\n }\n // Refresh free_remaining, which only Pro members ever have above zero.\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.transcribePrice(username)\n });\n }\n }\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport {\n AccountFollowStats,\n FullAccount,\n} from \"../types\";\nimport { parseProfileMetadata } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** The raw `condenser_api.get_accounts` row — every FullAccount field except the three\n * this query derives separately (follow_stats + reputation from bridge, profile parsed). */\ntype RawAccount = Omit;\n\n/** Minimal shape read from `bridge.get_profile` (hivemind social profile): it carries\n * the reputation score, the follower/following counts and hivemind's parsed\n * (normalized) profile — the latter is used only to cross-validate the chain row. */\ninterface BridgeProfile {\n reputation?: number;\n stats?: { followers?: number; following?: number };\n metadata?: { profile?: Record };\n}\n\n/** True when the chain row carries no account metadata at all. Legitimate for\n * accounts that never set a profile — but combined with a populated hivemind\n * profile it identifies a node serving stripped account rows. */\nfunction isMetadataStripped(account: RawAccount): boolean {\n return !account.posting_json_metadata && !account.json_metadata;\n}\n\n/** True when a hivemind `metadata.profile` object carries at least one real\n * value. Hivemind emits its fixed profile keys with empty strings for\n * accounts without a profile, so key presence alone proves nothing. */\nfunction hasProfileValues(profile?: Record | null): boolean {\n if (!profile) return false;\n return Object.values(profile).some((value) =>\n typeof value === \"string\" ? value.length > 0 : value != null\n );\n}\n\nexport function getAccountFullQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.full(username),\n queryFn: async ({ signal }) => {\n if (!username) {\n return null;\n }\n\n // Fetch the chain account (balances/keys/vesting) and the hivemind profile in\n // parallel — both only need the username. bridge.get_profile carries BOTH the\n // follower/following counts and the reputation score, so it replaces the old\n // second-layer condenser_api.get_follow_count RPC *and* the reputation-api REST\n // call: condenser_api.get_accounts no longer returns a usable reputation (it is 0\n // since the hardfork), and there is no reason to make two extra round-trips for\n // data one profile object already carries.\n const [response, bridgeProfile] = await Promise.all([\n callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so fail over to the next node instead of misreading it as\n // \"account does not exist\".\n (rows) => Array.isArray(rows)\n ),\n callRPC(\n \"bridge.get_profile\",\n { account: username },\n undefined,\n undefined,\n signal\n ).catch((e): BridgeProfile | null => {\n // A caller cancel (aborted signal) must propagate — only genuine RPC/transport\n // failures degrade to reputation 0 / no follow_stats.\n if (signal?.aborted) throw e;\n return null;\n })\n ]);\n if (!response?.[0]) {\n // The account does not exist (e.g. not yet finalized on-chain during\n // signup). Treat absence as a recoverable null instead of throwing, so\n // consumers (useQuery hooks and fetchQuery callers) surface it as empty\n // data rather than an unhandled rejection / error-boundary crash.\n return null;\n }\n\n let chainAccount = response[0];\n\n // Cross-validate the chain row against the hivemind profile fetched in\n // the same query. Some public nodes serve account rows with BOTH\n // metadata fields stripped to \"\" (observed in the wild) while their own\n // hivemind still returns the real profile — and a merge base built from\n // such a row wipes the user's profile on the next partial\n // account_update2. When the row claims \"no metadata\" but hivemind\n // disagrees, re-read once (failover may pick another node) and otherwise\n // fail the query: an error here is recoverable, a poisoned cache entry\n // is not.\n if (\n isMetadataStripped(chainAccount) &&\n hasProfileValues(bridgeProfile?.metadata?.profile)\n ) {\n // The re-read carries a payload validator: a stripped row is treated\n // as a node fault, so the failover walk moves on to other nodes (and\n // repeat offenders earn a per-API health cooldown) instead of asking\n // the same lying node twice.\n const reread = await callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n (rows) =>\n Array.isArray(rows) &&\n (!rows[0] || !isMetadataStripped(rows[0] as RawAccount))\n );\n if (reread[0] && !isMetadataStripped(reread[0])) {\n chainAccount = reread[0];\n } else {\n throw new Error(\n `[SDK][Accounts] – inconsistent account row for ${username}: empty json metadata while hivemind profile is populated`\n );\n }\n }\n\n const profile = parseProfileMetadata(chainAccount.posting_json_metadata);\n\n // bridge.get_profile.stats → follower/following counts; `reputation` is the\n // computed score (e.g. 78.29). accountReputation() floors an in-range score, so\n // it yields the same value the reputation-api used to return. Both degrade to a\n // safe default if the profile call failed.\n const stats = bridgeProfile?.stats;\n const follow_stats: AccountFollowStats | undefined = stats\n ? {\n account: chainAccount.name,\n follower_count: stats.followers ?? 0,\n following_count: stats.following ?? 0\n }\n : undefined;\n const reputationValue: number = bridgeProfile?.reputation ?? 0;\n\n return {\n name: chainAccount.name,\n owner: chainAccount.owner,\n active: chainAccount.active,\n posting: chainAccount.posting,\n memo_key: chainAccount.memo_key,\n post_count: chainAccount.post_count,\n created: chainAccount.created,\n posting_json_metadata: chainAccount.posting_json_metadata,\n last_vote_time: chainAccount.last_vote_time,\n last_post: chainAccount.last_post,\n json_metadata: chainAccount.json_metadata,\n reward_hive_balance: chainAccount.reward_hive_balance,\n reward_hbd_balance: chainAccount.reward_hbd_balance,\n reward_vesting_hive: chainAccount.reward_vesting_hive,\n reward_vesting_balance: chainAccount.reward_vesting_balance,\n balance: chainAccount.balance,\n hbd_balance: chainAccount.hbd_balance,\n savings_balance: chainAccount.savings_balance,\n savings_hbd_balance: chainAccount.savings_hbd_balance,\n savings_hbd_last_interest_payment:\n chainAccount.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update:\n chainAccount.savings_hbd_seconds_last_update,\n savings_hbd_seconds: chainAccount.savings_hbd_seconds,\n next_vesting_withdrawal: chainAccount.next_vesting_withdrawal,\n pending_claimed_accounts: chainAccount.pending_claimed_accounts,\n vesting_shares: chainAccount.vesting_shares,\n delegated_vesting_shares: chainAccount.delegated_vesting_shares,\n received_vesting_shares: chainAccount.received_vesting_shares,\n vesting_withdraw_rate: chainAccount.vesting_withdraw_rate,\n to_withdraw: chainAccount.to_withdraw,\n withdrawn: chainAccount.withdrawn,\n witness_votes: chainAccount.witness_votes,\n proxy: chainAccount.proxy,\n recovery_account: chainAccount.recovery_account,\n proxied_vsf_votes: chainAccount.proxied_vsf_votes,\n voting_manabar: chainAccount.voting_manabar,\n voting_power: chainAccount.voting_power,\n downvote_manabar: chainAccount.downvote_manabar,\n follow_stats,\n reputation: reputationValue,\n profile,\n } satisfies FullAccount;\n },\n enabled: !!username,\n staleTime: 60000,\n });\n}\n","import { AccountProfile, FullAccount } from \"../types\";\n\nexport type ProfileTokens = AccountProfile[\"tokens\"];\n\nconst DENIED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nfunction deepMerge>(target: T, source: Record): T {\n const result = { ...target } as Record;\n for (const key of Object.keys(source)) {\n if (DENIED_KEYS.has(key)) {\n continue;\n }\n const srcVal = source[key];\n const tgtVal = result[key];\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\n result[key] = deepMerge(tgtVal, srcVal);\n } else {\n result[key] = srcVal;\n }\n }\n return result as T;\n}\n\nexport interface BuildProfileMetadataArgs {\n existingProfile?: AccountProfile;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}\n\nfunction sanitizeTokens(\n tokens?: ProfileTokens | null\n): ProfileTokens | undefined {\n // Guard against corrupted data from blockchain where tokens is not an array\n if (!tokens || !Array.isArray(tokens)) {\n return undefined;\n }\n\n return tokens.map(({ meta, ...rest }) => {\n if (!meta || typeof meta !== \"object\") {\n return { ...rest, meta };\n }\n\n const { privateKey, username, ...safeMeta } = meta;\n return { ...rest, meta: safeMeta };\n });\n}\n\nexport function parseProfileMetadata(\n postingJsonMetadata?: string | null\n): AccountProfile {\n if (!postingJsonMetadata) {\n return {} as AccountProfile;\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n parsed.profile &&\n typeof parsed.profile === \"object\"\n ) {\n return parsed.profile as AccountProfile;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata:\", err, { length: postingJsonMetadata?.length ?? 0 });\n }\n\n return {} as AccountProfile;\n}\n\nexport function extractAccountProfile(\n data?: Pick | null\n): AccountProfile {\n return parseProfileMetadata(data?.posting_json_metadata);\n}\n\n/**\n * Choose between two account snapshots for a posting-metadata merge base.\n * Prefers `preferred` (typically the freshest cache entry) unless `fallback`\n * carries strictly more profile keys — guarding read-modify-write flows\n * against a snapshot whose metadata was served stripped by a misbehaving node\n * while another snapshot still holds the real profile. A partial update must\n * never shrink the profile while any snapshot still knows the full one.\n */\nexport function pickRicherMetadataSnapshot<\n T extends Pick\n>(\n preferred: T | null | undefined,\n fallback: T | null | undefined\n): T | null | undefined {\n if (!preferred) return fallback;\n if (!fallback) return preferred;\n const preferredKeys = Object.keys(\n parseProfileMetadata(preferred.posting_json_metadata)\n ).length;\n const fallbackKeys = Object.keys(\n parseProfileMetadata(fallback.posting_json_metadata)\n ).length;\n return fallbackKeys > preferredKeys ? fallback : preferred;\n}\n\n/**\n * Parse the FULL root object of posting_json_metadata, not just its `profile`\n * key. Returns {} for missing/invalid input or a non-object root.\n *\n * `parseProfileMetadata` intentionally returns only `parsed.profile`; this\n * helper exists so writers can carry forward any sibling top-level keys that\n * live alongside `profile` (data other Hive apps may store there) instead of\n * dropping them on the next update.\n */\nexport function parsePostingMetadataRoot(\n postingJsonMetadata?: string | null\n): Record {\n if (!postingJsonMetadata) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata root:\", err, {\n length: postingJsonMetadata?.length ?? 0,\n });\n }\n\n return {};\n}\n\n/**\n * Build the serialized `posting_json_metadata` string for an account_update2\n * operation. It deep-merges the profile (via {@link buildProfileMetadata}) over\n * the account's CURRENT on-chain profile AND preserves any non-`profile`\n * top-level keys present in the existing metadata, so a partial profile update\n * (e.g. only `pinned` or only `tokens`) never clobbers unrelated fields.\n */\nexport function buildPostingJsonMetadata({\n existingPostingJsonMetadata,\n profile,\n tokens,\n}: {\n existingPostingJsonMetadata?: string | null;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}): string {\n const root = parsePostingMetadataRoot(existingPostingJsonMetadata);\n const existingProfile = isPlainObject(root.profile)\n ? (root.profile as AccountProfile)\n : ({} as AccountProfile);\n\n const mergedProfile = buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n });\n\n return JSON.stringify({ ...root, profile: mergedProfile });\n}\n\nexport function buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n}: BuildProfileMetadataArgs): AccountProfile {\n const { tokens: profileTokens, version: _ignoredVersion, ...profileRest } =\n profile ?? {};\n\n const metadata = deepMerge(\n (existingProfile ?? {}) as Record,\n profileRest as Record,\n ) as AccountProfile;\n\n // Clean up corrupted tokens data from blockchain before processing\n if (metadata.tokens && !Array.isArray(metadata.tokens)) {\n metadata.tokens = undefined;\n }\n\n // tokens semantics:\n // undefined → no change, fall back to profileTokens from profile partial\n // null or [] → explicitly clear tokens\n // non-empty array → set tokens\n if (tokens !== undefined) {\n // Explicit intent from caller: null or [] clears, non-empty array sets\n metadata.tokens = tokens && tokens.length > 0 ? tokens : [];\n } else if (profileTokens !== undefined) {\n // Fall back to tokens from profile partial (including empty array to clear)\n metadata.tokens = profileTokens;\n }\n\n metadata.tokens = sanitizeTokens(metadata.tokens);\n metadata.version = 2;\n\n return metadata;\n}\n","import { FullAccount, AccountProfile } from \"../types\";\nimport { parseProfileMetadata } from \"./profile-metadata\";\n\n/**\n * Parses raw account data from Hive API into FullAccount type\n * Handles profile metadata extraction from posting_json_metadata or json_metadata\n */\nexport function parseAccounts(rawAccounts: any[]): FullAccount[] {\n return rawAccounts.map((x) => {\n const account: FullAccount = {\n name: x.name,\n owner: x.owner,\n active: x.active,\n posting: x.posting,\n memo_key: x.memo_key,\n post_count: x.post_count,\n created: x.created,\n reputation: x.reputation,\n posting_json_metadata: x.posting_json_metadata,\n last_vote_time: x.last_vote_time,\n last_post: x.last_post,\n json_metadata: x.json_metadata,\n reward_hive_balance: x.reward_hive_balance,\n reward_hbd_balance: x.reward_hbd_balance,\n reward_vesting_hive: x.reward_vesting_hive,\n reward_vesting_balance: x.reward_vesting_balance,\n balance: x.balance,\n hbd_balance: x.hbd_balance,\n savings_balance: x.savings_balance,\n savings_hbd_balance: x.savings_hbd_balance,\n savings_hbd_last_interest_payment: x.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update: x.savings_hbd_seconds_last_update,\n savings_hbd_seconds: x.savings_hbd_seconds,\n next_vesting_withdrawal: x.next_vesting_withdrawal,\n pending_claimed_accounts: x.pending_claimed_accounts,\n vesting_shares: x.vesting_shares,\n delegated_vesting_shares: x.delegated_vesting_shares,\n received_vesting_shares: x.received_vesting_shares,\n vesting_withdraw_rate: x.vesting_withdraw_rate,\n to_withdraw: x.to_withdraw,\n withdrawn: x.withdrawn,\n witness_votes: x.witness_votes,\n proxy: x.proxy,\n recovery_account: x.recovery_account,\n proxied_vsf_votes: x.proxied_vsf_votes,\n voting_manabar: x.voting_manabar,\n voting_power: x.voting_power,\n downvote_manabar: x.downvote_manabar,\n };\n\n // Try to parse profile from posting_json_metadata first\n let profile: AccountProfile | undefined = parseProfileMetadata(\n x.posting_json_metadata\n );\n\n // Fallback to json_metadata if posting_json_metadata didn't have a profile\n if (!profile || Object.keys(profile).length === 0) {\n try {\n const jsonMetadata = JSON.parse(x.json_metadata || \"{}\");\n if (jsonMetadata.profile) {\n profile = jsonMetadata.profile;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n // Ensure we always have a profile object\n if (!profile || Object.keys(profile).length === 0) {\n profile = {\n about: \"\",\n cover_image: \"\",\n location: \"\",\n name: \"\",\n profile_image: \"\",\n website: \"\",\n };\n }\n\n return { ...account, profile };\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { parseAccounts } from \"../utils/parse-accounts\";\nimport { FullAccount } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountsQueryOptions(usernames: string[]) {\n return queryOptions({\n queryKey: QueryKeys.accounts.list(...usernames),\n enabled: usernames.length > 0,\n queryFn: async (): Promise => {\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so the validator makes callRPC fail over to the next node\n // instead of resolving with a payload parseAccounts cannot map over.\n const response = (await callRPC(\n \"condenser_api.get_accounts\",\n [usernames],\n undefined,\n undefined,\n undefined,\n (rows) => Array.isArray(rows)\n )) as any[];\n return parseAccounts(response ?? []);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountFollowStats } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get follow count (followers and following) for an account\n */\nexport function getFollowCountQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followCount(username),\n queryFn: () =>\n callRPC(\"condenser_api.get_follow_count\", [\n username,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts following a user\n *\n * @param following - The account being followed\n * @param startFollower - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowersQueryOptions(\n following: string | undefined,\n startFollower: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followers(following!, startFollower, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_followers\", [\n following,\n startFollower,\n followType,\n limit,\n ]) as Promise,\n enabled: !!following,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts that a user is following\n *\n * @param follower - The account doing the following\n * @param startFollowing - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowingQueryOptions(\n follower: string,\n startFollowing: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.following(follower, startFollowing, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_following\", [\n follower,\n startFollowing,\n followType,\n limit,\n ]) as Promise,\n enabled: !!follower,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** `condenser_api.get_following` caps a single response at 1000 rows. */\nconst MUTED_USERS_PAGE_SIZE = 1000;\n\n/**\n * Safety valve for the paging loop: 20 pages is 20k muted accounts, far past\n * any real mute list. Bounds the work if a node ever stops advancing the\n * cursor, so a malformed response degrades to a truncated list rather than an\n * endless request loop.\n */\nconst MUTED_USERS_MAX_PAGES = 20;\n\n/**\n * Get the full list of accounts a user has muted.\n *\n * Pages until the list is exhausted instead of taking the first N. That is\n * load-bearing: this result dims muted authors in feeds and collapses their\n * comments (`entry-list-item-muted-content`, `discussion-list`), so a truncated\n * list silently renders muted accounts as though they were never muted.\n *\n * Takes no limit, on purpose. `QueryKeys.accounts.mutedUsers` keys on the\n * username alone, so a limit parameter meant callers requesting different\n * amounts shared one cache entry and whichever mounted first decided how much\n * of the list every other caller saw.\n *\n * @param username - The account whose mute list to fetch\n */\nexport function getMutedUsersQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.mutedUsers(username!),\n queryFn: async () => {\n const muted: string[] = [];\n let start = \"\";\n\n for (let page = 0; page < MUTED_USERS_MAX_PAGES; page++) {\n const response = (await callRPC(\"condenser_api.get_following\", [\n username,\n start,\n \"ignore\",\n MUTED_USERS_PAGE_SIZE,\n ])) as Follow[];\n\n if (!response?.length) {\n break;\n }\n\n let names = response.map((user) => user.following);\n\n // `start` is exclusive on Hive, so a page should not repeat the cursor.\n // Drop it defensively anyway: against a node treating `start` as\n // inclusive, this loop would otherwise re-append the same account until\n // it hit the page cap.\n if (names[0] === start) {\n names = names.slice(1);\n }\n\n if (!names.length) {\n break;\n }\n\n muted.push(...names);\n\n if (response.length < MUTED_USERS_PAGE_SIZE) {\n break;\n }\n\n start = names[names.length - 1];\n }\n\n return muted;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Lookup accounts by username prefix\n *\n * @param query - Username prefix to search for\n * @param limit - Maximum number of results (default: 50)\n */\nexport function lookupAccountsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.lookup(query, limit),\n queryFn: () =>\n callRPC(\"condenser_api.lookup_accounts\", [\n query,\n limit,\n ]) as Promise,\n enabled: !!query,\n staleTime: Infinity,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountsByUsernameQueryOptions(\n query: string,\n limit = 5,\n excludeList: string[] = []\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.search(query, excludeList),\n enabled: !!query,\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.lookup_accounts\", [query, limit])) as string[];\n return response.filter((item) =>\n excludeList.length > 0 ? !excludeList.includes(item) : true\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountProfile } from \"../types\";\n\ntype AccountProfileToken = NonNullable[number];\n\nexport type WalletMetadataCandidate = Partial & {\n currency?: string;\n show?: boolean;\n address?: string;\n publicKey?: string;\n privateKey?: string;\n username?: string;\n};\n\nexport interface CheckUsernameWalletsPendingResponse {\n exist: boolean;\n tokens?: WalletMetadataCandidate[];\n wallets?: WalletMetadataCandidate[];\n}\n\nconst RESERVED_META_KEYS = new Set([\n \"ownerPublicKey\",\n \"activePublicKey\",\n \"postingPublicKey\",\n \"memoPublicKey\",\n]);\n\ninterface WalletsEndpointResponseItem {\n token?: unknown;\n address?: unknown;\n status?: unknown;\n meta?: unknown;\n username?: unknown;\n}\n\nexport function checkUsernameWalletsPendingQueryOptions(\n username: string,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkWalletPending(username, code ?? null),\n queryFn: async () => {\n if (!username || !code) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/wallets\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code,\n }),\n }\n );\n\n if (!response.ok) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const payload = (await response.json()) as unknown;\n\n const wallets: WalletMetadataCandidate[] = Array.isArray(payload)\n ? payload.flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const walletItem = item as WalletsEndpointResponseItem;\n\n const symbol =\n typeof walletItem.token === \"string\"\n ? walletItem.token\n : undefined;\n\n if (!symbol) {\n return [];\n }\n\n const meta: Record =\n walletItem.meta && typeof walletItem.meta === \"object\"\n ? { ...(walletItem.meta as Record) }\n : {};\n\n const sanitizedMeta: Record = {};\n\n const address =\n typeof walletItem.address === \"string\" && walletItem.address\n ? walletItem.address\n : undefined;\n\n const statusShow =\n typeof walletItem.status === \"number\"\n ? walletItem.status === 3\n : undefined;\n\n const showFlag = statusShow ?? false;\n\n if (address) {\n sanitizedMeta.address = address;\n }\n\n sanitizedMeta.show = showFlag;\n\n const baseCandidate = {\n symbol,\n currency: symbol,\n address,\n show: showFlag,\n type: \"CHAIN\",\n meta: sanitizedMeta,\n } satisfies WalletMetadataCandidate;\n\n const metaTokenCandidates: WalletMetadataCandidate[] = [];\n\n for (const [metaSymbol, metaValue] of Object.entries(meta)) {\n if (typeof metaSymbol !== \"string\") {\n continue;\n }\n\n if (RESERVED_META_KEYS.has(metaSymbol)) {\n continue;\n }\n\n if (typeof metaValue !== \"string\" || !metaValue) {\n continue;\n }\n\n if (!/^[A-Z0-9]{2,10}$/.test(metaSymbol)) {\n continue;\n }\n\n metaTokenCandidates.push({\n symbol: metaSymbol,\n currency: metaSymbol,\n address: metaValue,\n show: showFlag,\n type: \"CHAIN\",\n meta: { address: metaValue, show: showFlag },\n });\n }\n\n return [baseCandidate, ...metaTokenCandidates];\n })\n : [];\n\n return {\n exist: wallets.length > 0,\n tokens: wallets.length ? wallets : undefined,\n wallets: wallets.length ? wallets : undefined,\n } satisfies CheckUsernameWalletsPendingResponse;\n },\n refetchOnMount: true,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountRelationship } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRelationshipBetweenAccountsQueryOptions(\n reference: string | undefined,\n target: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.relations(reference, target),\n enabled: !!reference && !!target,\n refetchOnMount: false,\n refetchInterval: 3_600_000,\n queryFn: async () => {\n const fallback: AccountRelationship = {\n follows: false,\n ignores: false,\n blacklists: false,\n follows_muted: false,\n follows_blacklists: false,\n };\n\n // `enabled` only gates the automatic useQuery run. fetchQuery and\n // prefetchQuery invoke queryFn regardless, so guard here as well rather\n // than sending a missing account name to the RPC and caching the result.\n if (!reference || !target) {\n return fallback;\n }\n\n const result = await callRPC(\"bridge.get_relationship_between_accounts\", [reference, target]);\n return (result ?? fallback) as AccountRelationship;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype Subscriptions = string[];\n\nexport function getAccountSubscriptionsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.subscriptions(username!),\n enabled: !!username,\n queryFn: async ({ signal }) => {\n const response = await callRPC(\"bridge.list_all_subscriptions\", {\n account: username,\n }, undefined, undefined, signal);\n return (response ?? []) as Subscriptions;\n },\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountBookmark } from \"../types\";\n\nexport function getBookmarksQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.bookmarks(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Bookmarks] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountBookmark[];\n },\n });\n}\n\nexport function getBookmarksInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.bookmarksInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bookmarks: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../types\";\n\nexport function getFavoritesQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.favorites(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountFavorite[];\n },\n });\n}\n\nexport function getFavoritesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.favoritesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/favorites?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch favorites: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n/**\n * Query options to check if a specific account is in the active user's favorites\n * @param activeUsername - The logged-in user's username\n * @param code - Access token for authentication\n * @param targetUsername - The username to check if favorited\n * @returns Query options for checking if target is favorited\n */\nexport function checkFavoriteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n targetUsername: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkFavorite(activeUsername!, targetUsername!),\n enabled: !!activeUsername && !!code && !!targetUsername,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n if (!targetUsername) {\n throw new Error(\"[SDK][Accounts][Favorites] – no target username\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-check\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n account: targetUsername,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n const result = await response.json();\n if (typeof result !== \"boolean\") {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check returned invalid type: expected boolean, got ${typeof result}`\n );\n }\n\n return result;\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetRecoveriesEmailResponse } from \"../types\";\n\nexport function getAccountRecoveriesQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n enabled: !!username && !!code,\n queryKey: QueryKeys.accounts.recoveries(username!),\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Accounts] Missing username or access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/recoveries\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n return response.json() as Promise;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountPendingRecoveryQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n enabled: !!username,\n queryKey: QueryKeys.accounts.pendingRecovery(username!),\n queryFn: () =>\n callRPC(\"database_api.find_change_recovery_account_requests\", { accounts: [username] }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountReputation } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountReputationsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.reputations(query, limit),\n enabled: !!query,\n queryFn: async (): Promise => {\n if (!query) {\n return [];\n }\n\n return callRPC(\"condenser_api.get_account_reputations\", [query, limit]) as Promise;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { utils } from \"../../../hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Transaction, OperationGroup } from \"../types/transaction\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { parseAsset, NaiMap } from \"@/modules/core/utils\";\n\nconst ops = utils.operations;\n\nexport const ACCOUNT_OPERATION_GROUPS: Record = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n};\n\nexport const ALL_ACCOUNT_OPERATIONS = [...Object.values(ACCOUNT_OPERATION_GROUPS)].reduce(\n (acc, val) => acc.concat(val),\n []\n);\n\ninterface TxPageRaw {\n entries: Transaction[];\n currentPage: number;\n}\n\n/**\n * Cursor for transaction pagination.\n * null = first request (returns newest page, API omits page param).\n * number = specific page to fetch (decrementing for older data).\n */\ntype TxCursor = number | null;\n\ninterface HafahOperation {\n op: {\n type: string;\n value: Record;\n };\n block: number;\n trx_id: string;\n op_pos: number;\n op_type_id: number;\n timestamp: string;\n virtual_op: boolean;\n operation_id: string;\n trx_in_block: number;\n}\n\ninterface HafahResponse {\n total_operations: number;\n total_pages: number;\n operations_result: HafahOperation[];\n}\n\n/**\n * Derive a safe, unique, and chronologically ordered `num` from REST fields.\n *\n * Layout: block * 10_000_000 + trx_in_block * 100 + op_pos\n * - trx_in_block: up to 99_999 (Hive max block size ~65K txs)\n * - op_pos: up to 99 (operations within a single transaction)\n * - Max value: 105_000_000 * 10_000_000 = 1.05e15, within MAX_SAFE_INTEGER (9.007e15)\n */\nfunction deriveNum(entry: HafahOperation): number {\n return entry.block * 10_000_000 + entry.trx_in_block * 100 + entry.op_pos;\n}\n\n/**\n * Strip the `_operation` suffix from the REST API type name\n * to match the Transaction type discriminants (e.g. \"transfer\").\n */\nfunction normalizeOpType(restType: string): string {\n return restType.replace(/_operation$/, \"\");\n}\n\n/**\n * Check if a value is a NAI asset object (e.g. { nai: \"@@000000021\", amount: \"1000\", precision: 3 }).\n */\nfunction isNaiAsset(v: unknown): v is { nai: string; amount: string; precision: number } {\n return typeof v === \"object\" && v !== null && \"nai\" in v && \"amount\" in v && \"precision\" in v;\n}\n\n/**\n * Convert a NAI asset object to a human-readable string like \"1.000 HIVE\".\n * Returns the value unchanged if it's not a NAI object.\n */\nfunction naiToString(v: unknown): unknown {\n if (!isNaiAsset(v)) return v;\n const parsed = parseAsset(v);\n const symbol = NaiMap[v.nai as keyof typeof NaiMap] ?? \"UNKNOWN\";\n return `${parsed.amount.toFixed(v.precision)} ${symbol}`;\n}\n\n/**\n * Convert all NAI asset objects in an operation's value to human-readable strings\n * so downstream renderers that expect \"1.000 HIVE\" don't crash with object values.\n */\nfunction normalizeOpValue(value: Record): Record {\n const result: Record = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = naiToString(v);\n }\n return result;\n}\n\n/**\n * Get account transaction history with pagination and filtering.\n * Uses the hafah-api REST endpoint for server-side op-type filtering\n * and real pagination metadata.\n *\n * @param username - Account name to get transactions for\n * @param limit - Number of transactions per page\n * @param group - Filter by operation group (transfers, market-orders, etc.)\n */\nexport function getTransactionsInfiniteQueryOptions(\n username?: string,\n limit = 20,\n group: OperationGroup | \"\" = \"\"\n) {\n const operationTypes = group\n ? ACCOUNT_OPERATION_GROUPS[group]\n : ALL_ACCOUNT_OPERATIONS;\n\n return infiniteQueryOptions<\n TxPageRaw,\n Error,\n InfiniteData,\n (string | number)[],\n TxCursor\n >({\n queryKey: QueryKeys.accounts.transactions(username ?? \"\", group, limit),\n initialPageParam: null as TxCursor,\n\n queryFn: async ({ pageParam, signal }: { pageParam: TxCursor; signal?: AbortSignal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"operation-types\": operationTypes.join(\",\"),\n \"page-size\": limit,\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number (decrementing)\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"hafah\",\n \"/accounts/{account-name}/operations\",\n params,\n undefined,\n undefined,\n signal\n )) as HafahResponse;\n\n const entries = response.operations_result.map((entry) => {\n const type = normalizeOpType(entry.op.type);\n const value = normalizeOpValue(entry.op.value);\n return {\n ...value,\n num: deriveNum(entry),\n type,\n timestamp: entry.timestamp,\n trx_id: entry.trx_id,\n } as Transaction;\n });\n\n return {\n entries,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getBotsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.bots(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/public/bots\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bots: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n refetchOnMount: true,\n staleTime: Infinity,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { ReferralItem } from \"../types/referral\";\n\ntype PageParam = { maxId?: number };\n\nexport function getReferralsInfiniteQueryOptions(username: string) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.referrals(username),\n initialPageParam: { maxId: undefined } as PageParam,\n queryFn: async ({ pageParam }: { pageParam: PageParam }) => {\n const { maxId } = pageParam ?? {};\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(`/private-api/referrals/${username}`, baseUrl);\n\n if (maxId !== undefined) {\n url.searchParams.set(\"max_id\", maxId.toString());\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referrals: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n getNextPageParam: (lastPage: ReferralItem[]) => {\n const nextMaxId = lastPage?.[lastPage.length - 1]?.id;\n return typeof nextMaxId === \"number\" ? ({ maxId: nextMaxId } as PageParam) : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ReferralStat } from \"../types/referral\";\n\ninterface ReferralStatsResponse {\n total?: number;\n rewarded?: number;\n}\n\nexport function getReferralsStatsQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.referralsStats(username),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/referrals/${username}/stats`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referral stats: ${response.status}`);\n }\n\n const data = await response.json() as ReferralStatsResponse;\n\n if (!data) {\n throw new Error(\"No Referrals for this user!\");\n }\n\n return {\n total: data.total ?? 0,\n rewarded: data.rewarded ?? 0,\n } as ReferralStat;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendsRow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FriendsPageParam {\n startFollowing: string;\n}\n\ntype FriendsPage = FriendsRow[];\n\n/**\n * Get list of friends (following/followers) with profile information\n *\n * @param following - The account whose friends to get\n * @param mode - \"following\" or \"followers\"\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Number of results per page (default: 100)\n * @param enabled - Whether query is enabled (default: true)\n */\nexport function getFriendsInfiniteQueryOptions(\n following: string,\n mode: \"following\" | \"followers\",\n options?: {\n followType?: string;\n limit?: number;\n enabled?: boolean;\n }\n) {\n const { followType = \"blog\", limit = 100, enabled = true } = options ?? {};\n\n return infiniteQueryOptions<\n FriendsPage,\n Error,\n InfiniteData,\n (string | number)[],\n FriendsPageParam\n >({\n queryKey: QueryKeys.accounts.friends(following, mode, followType, limit),\n initialPageParam: { startFollowing: \"\" } as FriendsPageParam,\n enabled,\n refetchOnMount: true,\n\n queryFn: async ({ pageParam }: { pageParam: FriendsPageParam }) => {\n const { startFollowing } = pageParam;\n\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [following, startFollowing === \"\" ? null : startFollowing, followType, limit])) as Follow[];\n\n const accountNames = response.map((e) =>\n mode === \"following\" ? e.following : e.follower\n );\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n const rows: FriendsPage = (accounts ?? []).map((a) => ({\n name: a.name,\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n }));\n\n return rows;\n },\n\n getNextPageParam: (lastPage: FriendsPage): FriendsPageParam | undefined =>\n lastPage && lastPage.length === limit\n ? { startFollowing: lastPage[lastPage.length - 1].name }\n : undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendSearchResult } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst SEARCH_LIMIT = 30;\n\n/**\n * Search friends (following/followers) by query string\n *\n * @param username - The account whose friends to search\n * @param mode - \"following\" or \"followers\"\n * @param query - Search query string\n */\nexport function getSearchFriendsQueryOptions(\n username: string,\n mode: \"following\" | \"followers\",\n query: string\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.searchFriends(username, mode, query),\n refetchOnMount: false,\n enabled: false, // Manual query via refetch\n queryFn: async (): Promise => {\n if (!query) return [];\n\n const start = query.slice(0, -1);\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [username, start, \"blog\", 1000])) as Follow[];\n\n const accountNames = response\n .map((e) => (mode === \"following\" ? e.following : e.follower))\n .filter((name) => name.toLowerCase().includes(query.toLowerCase()))\n .slice(0, SEARCH_LIMIT);\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n return (\n accounts?.map((a) => ({\n name: a.name,\n full_name: a.metadata.profile?.name || \"\",\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n })) ?? []\n );\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsQueryOptions(limit = 20) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTags(),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags\n .filter((x) => x.name !== \"\")\n .filter((x) => !x.name.startsWith(\"hive-\"))\n .map((x) => x.name)\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length > 0\n ? { afterTag: lastPage[lastPage.length - 1] }\n : undefined,\n staleTime: 60 * 60 * 1000, // 1 hour — tags change slowly\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { isCommunity } from \"@/modules/core/utils\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsWithStatsQueryOptions(limit = 250) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTagsWithStats(limit),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags.filter((tag) => tag.name !== \"\").filter((tag) => !isCommunity(tag.name))\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length ? { afterTag: lastPage[lastPage.length - 1].name } : undefined,\n staleTime: Infinity,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\n\nexport function getFragmentsQueryOptions(username: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.fragments(username),\n queryFn: async () => {\n if (!code) {\n return [];\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return response.json() as Promise;\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getFragmentsInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.fragmentsInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/fragments?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch fragments: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { ConfigManager, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n// TODO: replace any with Entry\nexport function getPromotedPostsQuery(\n type: \"feed\" | \"waves\" = \"feed\"\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.promoted(type),\n queryFn: async () => {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/promoted-entries\", baseUrl);\n if (type === \"waves\") {\n url.searchParams.append(\"short_content\", \"1\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n const data = await response.json();\n return data as T[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry, Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getEntryActiveVotesQueryOptions(entry?: Entry) {\n return queryOptions({\n queryKey: QueryKeys.posts.entryActiveVotes(entry?.author, entry?.permlink),\n queryFn: async () => {\n return callRPC(\"condenser_api.get_active_votes\", [\n entry?.author,\n entry?.permlink,\n ]) as Promise;\n },\n enabled: !!entry,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a specific user's vote on a post\n * Useful when post has >1000 votes to efficiently get one user's vote\n *\n * @param username - The voter's username\n * @param author - The post author\n * @param permlink - The post permlink\n */\nexport function getUserPostVoteQueryOptions(\n username: string | undefined,\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.userPostVote(username!, author!, permlink!),\n queryFn: async () => {\n const result = await callRPC(\"database_api.list_votes\", {\n start: [username, author, permlink],\n limit: 1,\n order: \"by_voter_comment\"\n });\n\n // Return first vote if found, otherwise null\n return (result?.votes?.[0] || null) as Vote | null;\n },\n enabled: !!username && !!author && !!permlink,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.content(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentRepliesQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.contentReplies(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content_replies\", {\n author,\n permlink,\n }) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostHeaderQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.postHeader(author, permlink),\n queryFn: async () => {\n return callRPC(\"bridge.get_post_header\", {\n author,\n permlink,\n }) as Promise;\n },\n initialData: null,\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { Entry } from \"../types\";\n\n/**\n * Filters and censors entries that match DMCA patterns\n * @param entry - Single entry or array of entries to filter\n * @returns Filtered entry/entries with DMCA content censored.\n * Note: Can return null/undefined if input is falsy - callers should guard against this.\n */\nexport function filterDmcaEntry(entry: Entry): Entry | null | undefined;\nexport function filterDmcaEntry(entries: Entry[]): Entry[];\nexport function filterDmcaEntry(entryOrEntries: Entry | Entry[] | null | undefined): Entry | Entry[] | null | undefined {\n if (Array.isArray(entryOrEntries)) {\n // Array elements are non-null Entries, so applyFilter never returns nullish here.\n return entryOrEntries.map((entry) => applyFilter(entry)) as Entry[];\n }\n return applyFilter(entryOrEntries);\n}\n\nfunction applyFilter(entry: Entry | null | undefined): Entry | null | undefined {\n if (!entry) return entry;\n\n const entryPath = `@${entry.author}/${entry.permlink}`;\n const isDmca =\n CONFIG.dmcaPatterns.includes(entryPath) ||\n CONFIG.dmcaPatternRegexes.some((regex) => regex.test(entryPath));\n\n if (isDmca) {\n return {\n ...entry,\n body: \"This post is not available due to a copyright/fraudulent claim.\",\n title: \"\",\n };\n }\n\n return entry;\n}\n","import { callWithQuorum } from \"../../hive-tx\";\nimport { Entry } from \"@/modules/posts/types\";\n\n/**\n * When the primary node returns null for a get_post call,\n * verify by querying multiple random nodes. If any node\n * returns the post, it exists (the first node was lagging).\n *\n * Uses callWithQuorum(quorum=1) which shuffles and queries\n * nodes in batches. Since it shuffles, it's unlikely to hit\n * the same node that just returned null first.\n */\nexport async function verifyPostOnAlternateNode(\n author: string,\n permlink: string,\n observer: string\n): Promise {\n try {\n const response = await callWithQuorum(\"bridge.get_post\", {\n author,\n permlink,\n observer,\n }, 1);\n\n if (\n response &&\n typeof response === \"object\" &&\n (response as Entry).author === author &&\n (response as Entry).permlink === permlink\n ) {\n return response as Entry;\n }\n } catch {\n // All nodes failed or returned null\n }\n\n return null;\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { verifyPostOnAlternateNode } from \"@/modules/bridge/verify-on-alternate-node\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostQueryOptions(\n author: string,\n permlink?: string,\n observer = \"\",\n num?: number\n) {\n const cleanPermlink = permlink?.trim();\n const entryPath = `/@${author}/${cleanPermlink ?? \"\"}`;\n\n return queryOptions({\n queryKey: QueryKeys.posts.entry(entryPath),\n queryFn: async () => {\n if (!cleanPermlink || cleanPermlink === \"undefined\") {\n return null;\n }\n\n // hive-tx tries nodes in order; the first healthy node (index 0) handles this call.\n // If it returns null, verifyPostOnAlternateNode skips index 0 and tries others.\n const response = await callRPC(\"bridge.get_post\", {\n author,\n permlink: cleanPermlink,\n observer,\n });\n\n if (!response) {\n // Primary node returned null — verify on alternate nodes\n // to guard against sync lag returning null for valid posts\n const verified = await verifyPostOnAlternateNode(author, cleanPermlink, observer);\n if (!verified) {\n return null;\n }\n const verifiedEntry = num !== undefined ? { ...verified, num } as Entry : verified as Entry;\n return filterDmcaEntry(verifiedEntry);\n }\n\n const entry = num !== undefined ? { ...response, num } as Entry : response as Entry;\n return filterDmcaEntry(entry);\n },\n enabled:\n !!author &&\n !!permlink &&\n permlink.trim() !== \"\" &&\n permlink.trim() !== \"undefined\",\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { AccountRelationship, Profile } from \"@/modules/accounts/types\";\nimport { Community } from \"@/modules/communities/types/community\";\nimport { Subscription } from \"@/modules/communities/types/subscription\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { filterDmcaEntry } from \"@/modules/posts/utils/filter-dmca-entries\";\n\ntype BridgeParams = Record | unknown[];\n\nexport function bridgeApiCall(endpoint: string, params: BridgeParams, signal?: AbortSignal): Promise {\n return callRPC(`bridge.${endpoint}`, params, undefined, undefined, signal) as Promise;\n}\n\nexport async function resolvePost(\n post: Entry,\n observer: string,\n num?: number,\n signal?: AbortSignal\n): Promise {\n const { json_metadata: json } = post;\n\n if (json?.original_author && json?.original_permlink && json.tags?.[0] === \"cross-post\") {\n try {\n const resp = await getPost(\n json.original_author,\n json.original_permlink,\n observer,\n num,\n signal\n );\n if (resp) {\n return {\n ...post,\n original_entry: resp,\n num,\n };\n }\n return post;\n } catch {\n return post;\n }\n }\n\n return { ...post, num };\n}\n\nasync function resolvePosts(posts: Entry[], observer: string, signal?: AbortSignal): Promise {\n const validatedPosts = posts.map(validateEntry);\n const resolved = await Promise.all(validatedPosts.map((p) => resolvePost(p, observer, undefined, signal)));\n return filterDmcaEntry(resolved) as Entry[];\n}\n\nexport async function getPostsRanked(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_ranked_posts\", {\n sort,\n start_author,\n start_permlink,\n limit,\n tag,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_ranked_posts returned ${typeof resp} instead of an array for sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\nexport async function getAccountPosts(\n sort: string,\n account: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n if (CONFIG.dmcaAccounts.includes(account)) {\n return [];\n }\n\n const resp = await bridgeApiCall(\"get_account_posts\", {\n sort,\n account,\n start_author,\n start_permlink,\n limit,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_account_posts returned ${typeof resp} instead of an array for account=${account}, sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\n/**\n * Validates that an Entry object has required properties with non-null values.\n */\nfunction validateEntry(entry: Entry): Entry {\n const newEntry: Entry = {\n ...entry,\n active_votes: Array.isArray(entry.active_votes) ? [...entry.active_votes] : [],\n beneficiaries: Array.isArray(entry.beneficiaries) ? [...entry.beneficiaries] : [],\n blacklists: Array.isArray(entry.blacklists) ? [...entry.blacklists] : [],\n replies: Array.isArray(entry.replies) ? [...entry.replies] : [],\n stats: entry.stats ? { ...entry.stats } : null,\n };\n\n const requiredStringProps: (keyof Entry)[] = [\n \"author\",\n \"title\",\n \"body\",\n \"created\",\n \"category\",\n \"permlink\",\n \"url\",\n \"updated\",\n ];\n\n for (const prop of requiredStringProps) {\n if (newEntry[prop] == null) {\n (newEntry as any)[prop] = \"\";\n }\n }\n\n if (newEntry.author_reputation == null) {\n newEntry.author_reputation = 0;\n }\n if (newEntry.children == null) {\n newEntry.children = 0;\n }\n if (newEntry.depth == null) {\n newEntry.depth = 0;\n }\n if (newEntry.net_rshares == null) {\n newEntry.net_rshares = 0;\n }\n if (newEntry.payout == null) {\n newEntry.payout = 0;\n }\n if (newEntry.percent_hbd == null) {\n newEntry.percent_hbd = 0;\n }\n\n if (!newEntry.stats) {\n newEntry.stats = {\n flag_weight: 0,\n gray: false,\n hide: false,\n total_votes: 0,\n };\n }\n\n if (newEntry.author_payout_value == null) {\n newEntry.author_payout_value = \"0.000 HBD\";\n }\n if (newEntry.curator_payout_value == null) {\n newEntry.curator_payout_value = \"0.000 HBD\";\n }\n if (newEntry.max_accepted_payout == null) {\n newEntry.max_accepted_payout = \"1000000.000 HBD\";\n }\n if (newEntry.payout_at == null) {\n newEntry.payout_at = \"\";\n }\n if (newEntry.pending_payout_value == null) {\n newEntry.pending_payout_value = \"0.000 HBD\";\n }\n if (newEntry.promoted == null) {\n newEntry.promoted = \"0.000 HBD\";\n }\n\n if (newEntry.is_paidout == null) {\n newEntry.is_paidout = false;\n }\n\n return newEntry;\n}\n\nexport async function getPost(\n author: string = \"\",\n permlink: string = \"\",\n observer: string = \"\",\n num?: number,\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_post\", {\n author,\n permlink,\n observer,\n }, signal);\n\n if (resp) {\n const validatedEntry = validateEntry(resp);\n const post = await resolvePost(validatedEntry, observer, num, signal);\n return filterDmcaEntry(post) as Entry;\n }\n\n return undefined;\n}\n\nexport async function getPostHeader(\n author: string = \"\",\n permlink: string = \"\"\n): Promise {\n const resp = await bridgeApiCall(\"get_post_header\", {\n author,\n permlink,\n });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getDiscussion(\n author: string,\n permlink: string,\n observer?: string\n): Promise | null> {\n const resp = await bridgeApiCall | null>(\"get_discussion\", {\n author,\n permlink,\n observer: observer || author,\n });\n\n if (resp) {\n const validatedResp: Record = {};\n for (const [key, entry] of Object.entries(resp)) {\n validatedResp[key] = validateEntry(entry);\n }\n return validatedResp;\n }\n return resp;\n}\n\nexport async function getCommunity(\n name: string,\n observer: string | undefined = \"\"\n): Promise {\n return bridgeApiCall(\"get_community\", { name, observer });\n}\n\nexport async function getCommunities(\n last: string = \"\",\n limit: number = 100,\n query?: string | null,\n sort: string = \"rank\",\n observer: string = \"\"\n): Promise {\n return bridgeApiCall(\"list_communities\", {\n last,\n limit,\n query,\n sort,\n observer,\n });\n}\n\nexport async function normalizePost(post: unknown): Promise {\n const resp = await bridgeApiCall(\"normalize_post\", { post });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getSubscriptions(account: string): Promise {\n return bridgeApiCall(\"list_all_subscriptions\", { account });\n}\n\nexport async function getSubscribers(community: string): Promise {\n return bridgeApiCall(\"list_subscribers\", { community });\n}\n\nexport async function getRelationshipBetweenAccounts(\n follower: string,\n following: string\n): Promise {\n return bridgeApiCall(\"get_relationship_between_accounts\", [\n follower,\n following,\n ]);\n}\n\nexport async function getProfiles(\n accounts: string[],\n observer?: string\n): Promise {\n return bridgeApiCall(\"get_profiles\", { accounts, observer });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getDiscussion } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport enum SortOrder {\n trending = \"trending\",\n author_reputation = \"author_reputation\",\n votes = \"votes\",\n created = \"created\",\n}\n\nfunction parseAsset(value: string): { amount: number; symbol: string } {\n const match = value.match(/^(\\d+\\.?\\d*)\\s*([A-Z]+)$/);\n if (!match) return { amount: 0, symbol: \"\" };\n return {\n amount: parseFloat(match[1]),\n symbol: match[2],\n };\n}\n\nexport function sortDiscussions(\n entry: Entry,\n discussion: Entry[],\n order: SortOrder\n) {\n const allPayout = (c: Entry) =>\n parseAsset(c.pending_payout_value).amount +\n parseAsset(c.author_payout_value).amount +\n parseAsset(c.curator_payout_value).amount;\n\n const absNegative = (a: Entry) => a.net_rshares < 0;\n const isPinned = (a: Entry) =>\n entry.json_metadata?.pinned_reply === `${a.author}/${a.permlink}`;\n\n const sortOrders = {\n trending: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const _a = allPayout(a);\n const _b = allPayout(b);\n if (_a !== _b) {\n return _b - _a;\n }\n\n return 0;\n },\n author_reputation: (a: Entry, b: Entry) => {\n const keyA = a.author_reputation;\n const keyB = b.author_reputation;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n votes: (a: Entry, b: Entry) => {\n const keyA = a.children;\n const keyB = b.children;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n created: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const keyA = Date.parse(a.created);\n const keyB = Date.parse(b.created);\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n };\n\n const sorted = discussion.sort(sortOrders[order]);\n const pinnedIndex = sorted.findIndex((i) => isPinned(i));\n const pinned = sorted[pinnedIndex];\n if (pinnedIndex >= 0) {\n sorted.splice(pinnedIndex, 1);\n sorted.unshift(pinned);\n }\n return sorted;\n}\n\nexport function getDiscussionsQueryOptions(\n entry: Entry,\n order: SortOrder = SortOrder.created,\n enabled: boolean = true,\n observer?: string\n) {\n // Anonymous readers fall back to CONFIG.defaultObserver rather than the post\n // author. Author-as-observer only helps the minority of authors who curate a\n // mute list; everyone else's comment section came back unfiltered, so the\n // shared moderation account is the better default for logged-out traffic.\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussions(entry?.author, entry?.permlink, order, resolvedObserver),\n queryFn: async () => {\n if (!entry) {\n return [];\n }\n\n const response = await callRPC(\"bridge.get_discussion\", {\n author: entry.author,\n permlink: entry.permlink,\n observer: resolvedObserver,\n });\n\n const results = response\n ? Array.from(Object.values(response as Record))\n : [];\n return filterDmcaEntry(results);\n },\n enabled: enabled && !!entry,\n select: (data: Entry[]) => sortDiscussions(entry, data, order),\n // Preserve optimistic entries during refetch by using structural sharing\n // This ensures newly added comments (is_optimistic: true) aren't wiped out\n // when blockchain hasn't indexed them yet\n structuralSharing: (oldData, newData) => {\n if (!oldData || !newData) return newData;\n\n // Find optimistic entries in old data that aren't in new data yet\n const optimisticEntries = (oldData as Entry[]).filter(\n (entry: Entry) => entry.is_optimistic === true\n );\n\n const fetchedPermlinks = new Set(\n (newData as Entry[]).map((e: Entry) => `${e.author}/${e.permlink}`)\n );\n\n const missingOptimistic = optimisticEntries.filter(\n (opt: Entry) => !fetchedPermlinks.has(`${opt.author}/${opt.permlink}`)\n );\n\n // If there are optimistic entries missing from new data, preserve them\n if (missingOptimistic.length > 0) {\n return [...(newData as Entry[]), ...missingOptimistic];\n }\n\n return newData;\n },\n });\n}\n\nexport function getDiscussionQueryOptions(\n author: string,\n permlink: string,\n observer?: string,\n enabled = true\n) {\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussion(author, permlink, resolvedObserver),\n enabled: enabled && !!author && !!permlink,\n queryFn: async () =>\n getDiscussion(author, permlink, resolvedObserver) as Promise | null>,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getAccountPosts } from \"@/modules/bridge\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n hasNextPage: boolean;\n};\ntype Page = Entry[];\n\nexport function getAccountPostsInfiniteQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return infiniteQueryOptions<\n Page,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.accountPosts(username ?? \"\", filter, limit, observer),\n enabled: !!username && enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n hasNextPage: true,\n } as PageParam,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!pageParam?.hasNextPage || !username) return [];\n\n const response = await getAccountPosts(\n filter,\n username,\n pageParam.author ?? \"\",\n pageParam.permlink ?? \"\",\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n\n getNextPageParam: (lastPage: Page): PageParam | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n // Only consider there's a next page if we got a full page of results\n // A partial page means we've reached the end\n const hasNextPage = (lastPage?.length ?? 0) === limit;\n\n if (!hasNextPage) {\n return undefined;\n }\n\n return {\n author: last?.author,\n permlink: last?.permlink,\n hasNextPage,\n };\n },\n });\n}\n\nexport function getAccountPostsQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.accountPostsPage(username ?? \"\", filter, start_author, start_permlink, limit, observer),\n enabled: !!username && enabled,\n queryFn: async ({ signal } = {} as any) => {\n if (!username) {\n return [];\n }\n\n const response = await getAccountPosts(\n filter,\n username,\n start_author,\n start_permlink,\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getPostsRanked } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n};\n\ninterface GetPostsRankedOptions {\n resolvePosts?: boolean;\n}\n\n/**\n * `select` runs on every render, and React Query only reuses its previous\n * result when both the data and the select function are unchanged. These\n * options are rebuilt on each render, so an inline arrow would be a new\n * function every time and every page would be re-sorted on every render.\n * One stable function per sort keeps that memoization working.\n */\nconst displaySelects = new Map<\n string,\n (data: InfiniteData) => InfiniteData\n>();\n\nfunction displaySelect(sort: string) {\n let select = displaySelects.get(sort);\n if (!select) {\n select = (data) => ({\n ...data,\n pages: data.pages.map((page) => orderForDisplay(page, sort)),\n });\n displaySelects.set(sort, select);\n }\n return select;\n}\n\n/**\n * Display order for one page.\n *\n * Pinned entries are captured before the created-date sort: the bridge surfaces\n * them at the head of the response in the community moderators' chosen order,\n * which the sort would scatter by age. Every pin is kept, since an earlier\n * post-sort find() kept one and silently dropped the rest, so multi-pin\n * communities never displayed their other pinned posts. Pins only occur on the\n * first page, cursor pages return none, so this is a no-op elsewhere.\n *\n * Applied in `select` rather than in the query function so it cannot reach the\n * pagination cursor.\n */\nfunction orderForDisplay(page: Entry[], sort: string): Entry[] {\n const pinned = page.filter((entry) => entry.stats?.is_pinned);\n const rest = page.filter((entry) => !entry.stats?.is_pinned);\n\n if (sort === \"hot\") {\n return [...pinned, ...rest];\n }\n\n const byCreated = [...rest].sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n return [...pinned, ...byCreated];\n}\n\nexport function getPostsRankedInfiniteQueryOptions(\n sort: string,\n tag: string,\n limit = 20,\n observer = \"\",\n enabled = true,\n _options: GetPostsRankedOptions = {}\n) {\n return infiniteQueryOptions<\n Entry[],\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.postsRanked(sort, tag, limit, observer),\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await callRPC(\"bridge.get_ranked_posts\", {\n sort,\n start_author: pageParam.author,\n start_permlink: pageParam.permlink,\n limit,\n tag: sanitizedTag,\n observer,\n }, undefined, undefined, signal);\n\n if (response === null || response === undefined) {\n return [];\n }\n\n if (!Array.isArray(response)) {\n throw new Error(\n `[SDK] get_ranked_posts returned ${typeof response} for sort=${sort}`\n );\n }\n\n // Kept in the bridge's own order. getNextPageParam takes the cursor from\n // the last entry of the page this returns, and the bridge continues from\n // that entry in ITS ranking, so reordering here made the next request\n // start from the middle of the previous ranked page: for trending, payout\n // and muted the last entry by date is not the last entry by rank, and\n // scrolling repeated some posts and skipped others. Display order is\n // applied in `select`, which React Query runs after pagination.\n return filterDmcaEntry(response as Entry[]);\n },\n select: displaySelect(sort),\n enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n } as PageParam,\n getNextPageParam: (lastPage: Entry[]) => {\n // React Query reads \"there is no next page\" from undefined alone, so\n // returning an object here always left it true. An infinite list\n // then keeps calling fetchNextPage at the end of the feed, appending an\n // empty page each time: the query state churns and the cache grows for as\n // long as the reader sits at the bottom.\n const last = lastPage?.[lastPage.length - 1];\n if (!last) {\n return undefined;\n }\n\n return { author: last.author, permlink: last.permlink };\n },\n });\n}\n\nexport function getPostsRankedQueryOptions(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.postsRankedPage(sort, start_author, start_permlink, limit, tag, observer),\n enabled,\n queryFn: async ({ signal } = {} as any) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await getPostsRanked(\n sort,\n start_author,\n start_permlink,\n limit,\n sanitizedTag,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface BlogEntry {\n author: string;\n permlink: string;\n blog: string;\n reblog_on: string;\n reblogged_on: string;\n entry_id: number;\n}\n\nexport interface Reblog {\n author: string;\n permlink: string;\n}\n\nexport function getReblogsQueryOptions(\n username?: string,\n activeUsername?: string,\n limit = 200\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.reblogs(username ?? \"\", limit),\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.get_blog_entries\", [\n username ?? activeUsername,\n 0,\n limit,\n ])) as BlogEntry[];\n\n return response\n .filter(\n (i) =>\n i.author !== activeUsername &&\n !i.reblogged_on.startsWith(\"1970-\")\n )\n .map((i) => ({ author: i.author, permlink: i.permlink })) as Reblog[];\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of usernames who reblogged a specific post\n */\nexport function getRebloggedByQueryOptions(author?: string, permlink?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.rebloggedBy(author ?? \"\", permlink ?? \"\"),\n queryFn: async () => {\n if (!author || !permlink) {\n return [];\n }\n\n const response = (await callRPC(\"condenser_api.get_reblogged_by\", [author, permlink])) as string[];\n\n return Array.isArray(response) ? response : [];\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Schedule } from \"../types/schedule\";\n\nexport function getSchedulesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.schedules(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getSchedulesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.schedulesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/schedules?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Draft } from \"../types/draft\";\n\nexport function getDraftsQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.drafts(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getDraftsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.draftsInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/drafts?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n const json = await response.json();\n // Normalize response for backwards compatibility\n // If backend doesn't support wrapped format yet, it returns Draft[]\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { UserImage } from \"../types/user-image\";\n\nasync function fetchUserImages(code: string | undefined): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nexport function getImagesQueryOptions(username?: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.images(username),\n queryFn: async () => {\n if (!username || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getGalleryImagesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.galleryImages(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getImagesInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.imagesInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/images?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nexport function getCommentHistoryQueryOptions(author: string, permlink: string, onlyMeta = false) {\n return queryOptions({\n queryKey: QueryKeys.posts.commentHistory(author, permlink, onlyMeta),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n onlyMeta: onlyMeta ? \"1\" : \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nfunction makeEntryPath(author: string, permlink: string): string {\n const cleanAuthor = author?.trim();\n const cleanPermlink = permlink?.trim();\n\n if (!cleanAuthor || !cleanPermlink) {\n throw new Error(\"Invalid entry path: author and permlink are required\");\n }\n\n // Normalize by removing any leading @ or / characters\n const normalizedAuthor = cleanAuthor.replace(/^@+/, \"\");\n const normalizedPermlink = cleanPermlink.replace(/^\\/+/, \"\");\n\n if (!normalizedAuthor || !normalizedPermlink) {\n throw new Error(\"Invalid entry path: author and permlink cannot be empty after normalization\");\n }\n\n return `@${normalizedAuthor}/${normalizedPermlink}`;\n}\n\nexport interface DeletedEntry {\n body: string;\n title: string;\n tags: string[];\n}\n\nexport function getDeletedEntryQueryOptions(author: string, permlink: string) {\n const cleanPermlink = permlink?.trim();\n const cleanAuthor = author?.trim();\n const isValid =\n !!cleanAuthor && !!cleanPermlink && cleanPermlink !== \"undefined\";\n\n const entryPath = isValid ? makeEntryPath(cleanAuthor, cleanPermlink) : \"\";\n\n return queryOptions({\n queryKey: QueryKeys.posts.deletedEntry(entryPath),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink: cleanPermlink || \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n select: (history): DeletedEntry | null => {\n if (!history?.list?.[0]) {\n return null;\n }\n const { body, title, tags } = history.list[0];\n return {\n body,\n title,\n tags,\n };\n },\n enabled: isValid,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { PostTipsResponse } from \"../types/post-tip\";\n\n/**\n * Tips for a single post.\n *\n * Addressed as a GET so the response can be cached. This was a POST, which no\n * cache may store, so the same tip totals were refetched on every mount. The\n * endpoint keys off nothing but author and permlink and needs no auth, and now\n * serves a Cache-Control, so a repeat read can come from the browser instead of\n * the network.\n *\n * `staleTime` is kept at or below the endpoint's own cache window rather than\n * extending it. react-query cannot see how old a response already was when\n * `fetch` served it from the browser cache, so it restarts its window from zero\n * on a body that may already be near expiry; worst-case staleness is the two\n * windows added together.\n */\nexport function getPostTipsQueryOptions(author: string, permlink: string, isEnabled = true) {\n return queryOptions({\n queryKey: QueryKeys.posts.tips(author, permlink),\n queryFn: async () => {\n const path = `/private-api/post-tips/${encodeURIComponent(author)}/${encodeURIComponent(permlink)}`;\n const response = await fetch(CONFIG.privateApiHost + path, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post tips: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink && isEnabled,\n staleTime: 60 * 1000,\n });\n}\n","import { Entry, WaveEntry } from \"../types\";\nimport { getDiscussionsQueryOptions, SortOrder } from \"../queries/get-discussions-query-options\";\nimport { CONFIG } from \"@/modules/core\";\n\ntype EntryWithPostId = Entry & { post_id: number };\n\nfunction normalizeContainer(entry: EntryWithPostId, host: string): WaveEntry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds send the publish time as `timestamp`, not `created`.\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n host\n } as WaveEntry;\n}\n\nfunction normalizeParent(entry: EntryWithPostId): Entry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id\n } as Entry;\n}\n\nexport function normalizeWaveEntryFromApi(\n entry:\n | (Entry & { post_id: number; container?: EntryWithPostId | null; parent?: EntryWithPostId | null })\n | null\n | undefined,\n host: string\n): WaveEntry | null {\n if (!entry) {\n return null;\n }\n\n const containerSource = entry.container ?? entry;\n const container = normalizeContainer(containerSource, host);\n\n const parent = entry.parent ? normalizeParent(entry.parent) : undefined;\n\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds (following / tag / account) send the publish\n // time as `timestamp`, not `created`; map it so the relative time renders on\n // every card (the For You feed already carries a real `created` from Hive RPC).\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n // The private-api waves feeds omit max_accepted_payout; default it (and the\n // payout strings) to the Hive shape so payout-rendering consumers run their\n // pending+author+curator summation instead of treating the value as missing.\n max_accepted_payout: entry.max_accepted_payout || \"1000000.000 HBD\",\n pending_payout_value: entry.pending_payout_value || \"0.000 HBD\",\n author_payout_value: entry.author_payout_value || \"0.000 HBD\",\n curator_payout_value: entry.curator_payout_value || \"0.000 HBD\",\n host,\n container,\n parent\n } as WaveEntry;\n}\n\nexport function toEntryArray(x: unknown): Entry[] {\n return Array.isArray(x) ? (x as Entry[]) : [];\n}\n\nexport async function getVisibleFirstLevelThreadItems(\n container: WaveEntry\n): Promise {\n const queryOptions = getDiscussionsQueryOptions(container, SortOrder.created, true);\n const discussionItemsRaw = await CONFIG.queryClient.fetchQuery(queryOptions);\n const discussionItems = toEntryArray(discussionItemsRaw);\n\n if (discussionItems.length <= 1) {\n return [];\n }\n\n const firstLevelItems = discussionItems.filter(\n ({ parent_author, parent_permlink }) =>\n parent_author === container.author && parent_permlink === container.permlink\n );\n\n if (firstLevelItems.length === 0) {\n return [];\n }\n\n const visibleItems = firstLevelItems.filter((item) => !item.stats?.gray);\n\n return visibleItems;\n}\n\nexport function mapThreadItemsToWaveEntries(\n items: Entry[],\n container: WaveEntry,\n host: string\n): WaveEntry[] {\n if (items.length === 0) {\n return [];\n }\n\n return items\n .map((item) => {\n const parent = items.find(\n (i) =>\n i.author === item.parent_author &&\n i.permlink === item.parent_permlink &&\n i.author !== host\n );\n\n return {\n ...item,\n id: item.post_id,\n host,\n container,\n parent\n } as WaveEntry;\n })\n .filter((entry) => entry.container.post_id !== entry.post_id)\n .sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\ntype WavesFeedRow = Entry & {\n post_id: number;\n // The wave's container account (e.g. ecency.waves, leothreads), so a mixed\n // cross-container feed can be rendered and acted on per item.\n host?: string;\n // Opaque keyset cursor pointing just past this row.\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type WavesFeedEntry = WaveEntry & { _cursor?: string };\n\nexport interface WavesFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only waves carrying this tag (across all containers). */\n tag?: string;\n /** Only waves from accounts this user follows (across all containers). */\n following?: string;\n /** Only this author's waves (across all containers); the per-author feed. */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedFeedParams {\n containers: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: WavesFeedParams): NormalizedFeedParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n following: params.following?.trim().toLowerCase() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchWavesFeedPage(\n { containers, tag, following, author, observer, limit }: NormalizedFeedParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/feed\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (following) {\n url.searchParams.set(\"following\", following);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves feed: ${response.status}`);\n }\n\n const data = (await response.json()) as WavesFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return { ...entry, _cursor: row._cursor } as WavesFeedEntry;\n })\n .filter((entry): entry is WavesFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container waves feed (the chronological \"For You\" stream, and\n * the Following / Tag feeds via filters).\n *\n * A single esync-backed call returns the newest waves across every indexed\n * container, already merged and time-ordered, with keyset (cursor) pagination,\n * replacing the per-container chain-RPC scan. The optional `tag` / `following`\n * filters narrow the same stream without changing the cursor.\n */\nexport function getWavesFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchWavesFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination. A short page (fewer than `limit` rows) is the\n // end-of-feed signal; on a full page the server always returns the next\n // cursor on the last row. Stopping (rather than looping) is the safe\n // fallback if that cursor were ever absent.\n getNextPageParam: (lastPage: WavesFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n\n/**\n * Page-one of the combined feed as a plain (non-infinite) query under a distinct\n * key, for the \"new waves\" poll. Separate from {@link getWavesFeedQueryOptions}\n * so refreshing it never truncates the infinite feed's loaded pages.\n */\nexport function getWavesLatestFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return queryOptions({\n queryKey: [\n ...QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n \"latest\"\n ],\n staleTime: 0,\n queryFn: ({ signal }) => fetchWavesFeedPage(normalized, undefined, signal)\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\n/** The 3Speak video a short embeds, as returned by esync /api/waves/shorts. */\nexport interface ShortVideo {\n platform: string;\n author: string;\n permlink: string;\n embed_url: string;\n thumbnail_url: string | null;\n duration_secs: number | null;\n}\n\ntype ShortsFeedRow = Entry & {\n post_id: number;\n host?: string;\n video?: ShortVideo;\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type ShortsFeedEntry = WaveEntry & {\n /** The embedded 3Speak video reference for the reels player. */\n video?: ShortVideo;\n _cursor?: string;\n};\n\nexport interface ShortsFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only shorts carrying this tag (across all containers). */\n tag?: string;\n /** Only this author's shorts (across all containers). */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedShortsParams {\n containers: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: ShortsFeedParams): NormalizedShortsParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchShortsFeedPage(\n { containers, tag, author, observer, limit }: NormalizedShortsParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/shorts\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch shorts feed: ${response.status}`);\n }\n\n const data = (await response.json()) as ShortsFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return {\n ...entry,\n // A lightweight feed row may omit active_votes; EntryVoteBtn (which uses\n // this entry as React Query initialData) calls .some() on it, so default\n // to an empty array to avoid a crash before the full post query loads.\n active_votes: entry.active_votes ?? [],\n video: row.video,\n _cursor: row._cursor\n } as ShortsFeedEntry;\n })\n .filter((entry): entry is ShortsFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container shorts (reels) feed: waves that embed a 3Speak video.\n *\n * Backed by esync /api/waves/shorts (via /private-api/waves/shorts). Same shape,\n * keyset pagination and filters as {@link getWavesFeedQueryOptions}, plus a\n * `video` block per item for the vertical reels player. There is no `following`\n * filter in v1.\n */\nexport function getShortsFeedQueryOptions(params: ShortsFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.shortsFeed({ containers, tag, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchShortsFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination: a short page (fewer than `limit` rows) ends the feed;\n // on a full page the server returns the next cursor on the last row.\n getNextPageParam: (lastPage: ShortsFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport {\n getVisibleFirstLevelThreadItems,\n mapThreadItemsToWaveEntries\n} from \"../utils/waves-helpers\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst THREAD_CONTAINER_BATCH_SIZE = 5;\nconst MAX_CONTAINERS_TO_SCAN = 50;\n\ninterface ThreadsResult {\n entries: WaveEntry[];\n}\n\nasync function getThreads(\n host: string,\n pageParam?: WaveEntry\n): Promise {\n let startAuthor = pageParam?.author;\n let startPermlink = pageParam?.permlink;\n let scannedContainers = 0;\n let skipContainerId = pageParam?.post_id;\n\n while (scannedContainers < MAX_CONTAINERS_TO_SCAN) {\n interface AccountPostsParams {\n sort: string;\n account: string;\n limit: number;\n start_author?: string;\n start_permlink?: string;\n }\n\n const rpcParams: AccountPostsParams = {\n sort: \"posts\", // ProfileFilter.posts\n account: host,\n limit: THREAD_CONTAINER_BATCH_SIZE,\n ...(startAuthor ? { start_author: startAuthor } : {}),\n ...(startPermlink ? { start_permlink: startPermlink } : {})\n };\n\n let containers: WaveEntry[];\n try {\n containers = (await callRPC(\"bridge.get_account_posts\", rpcParams)) as WaveEntry[];\n } catch (err) {\n console.error(\"[SDK] getThreads get_account_posts error:\", err);\n return null;\n }\n\n if (!containers || containers.length === 0) {\n return null;\n }\n\n const normalizedContainers = containers.map((container) => {\n container.id = container.post_id;\n container.host = host;\n return container;\n });\n\n for (const container of normalizedContainers) {\n if (skipContainerId && container.post_id === skipContainerId) {\n skipContainerId = undefined;\n continue;\n }\n\n scannedContainers += 1;\n\n if (container.stats?.gray) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n let visibleItems: Entry[];\n try {\n visibleItems = await getVisibleFirstLevelThreadItems(container);\n } catch (err) {\n // A transient bridge.get_discussion failure (RPC timeout, node error, or\n // an oversized response on a large late-day container) must not collapse\n // the whole feed. Treat this container as temporarily unavailable and scan\n // the next one — mirroring the empty-container handling below and the\n // get_account_posts guard above. The query's refetch interval retries it.\n console.error(\"[SDK] getThreads get_discussion error:\", err);\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n if (visibleItems.length === 0) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n return {\n entries: mapThreadItemsToWaveEntries(visibleItems, container, host)\n };\n }\n\n const lastContainer = normalizedContainers[normalizedContainers.length - 1];\n\n if (!lastContainer) {\n return null;\n }\n\n startAuthor = lastContainer.author;\n startPermlink = lastContainer.permlink;\n }\n\n return null;\n}\n\n// Page = array of WaveEntry; Cursor = WaveEntry (container) or undefined\ntype WavesPage = WaveEntry[];\ntype WavesCursor = WaveEntry | undefined;\n\nexport function getWavesByHostQueryOptions(host: string) {\n return infiniteQueryOptions<\n WavesPage,\n Error,\n InfiniteData,\n string[],\n WavesCursor\n >({\n queryKey: QueryKeys.posts.wavesByHost(host),\n initialPageParam: undefined as WavesCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WavesCursor }) => {\n const result = await getThreads(host, pageParam);\n if (!result) return []; // no items to show for this page\n\n return result.entries;\n },\n\n getNextPageParam: (lastPage: WavesPage): WavesCursor => lastPage?.[0]?.container,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesTagEntryResponse = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nconst DEFAULT_TAG_FEED_LIMIT = 40;\n\nexport function getWavesByTagQueryOptions(host: string, tag: string, limit = DEFAULT_TAG_FEED_LIMIT) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByTag(host, tag),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/tags\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"tag\", tag);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves by tag: ${response.status}`);\n }\n\n const data = await response.json() as WavesTagEntryResponse[];\n\n const result = data\n .slice(0, limit)\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n return result.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves by tag\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesFollowingEntry = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport function getWavesFollowingQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFollowing(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/following\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves following feed: ${response.status}`);\n }\n\n const data = await response.json() as WavesFollowingEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves following feed\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingTag } from \"../types\";\n\ninterface WavesTrendingTagResponse {\n tag: string;\n posts: number;\n}\n\nexport function getWavesTrendingTagsQueryOptions(host?: string, hours = 24) {\n // Omit the container for combined trending tags across all containers.\n const container = host?.trim() || undefined;\n\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingTags(container ?? \"\", hours),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/tags\", baseUrl);\n if (container) {\n url.searchParams.set(\"container\", container);\n }\n url.searchParams.set(\"hours\", hours.toString());\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending tags: ${response.status}`);\n }\n\n const data = await response.json() as WavesTrendingTagResponse[];\n\n return data.map(({ tag, posts }) => ({ tag, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending tags\", error);\n return [];\n }\n }\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ninterface WavesAccountEntry extends Entry {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n}\n\nexport function getWavesByAccountQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByAccount(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/account\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves for account: ${response.status}`);\n }\n\n const data = await response.json() as WavesAccountEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves for account\", error);\n throw error;\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingAuthor } from \"../types\";\n\nexport function getWavesTrendingAuthorsQueryOptions(host: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingAuthors(host),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/authors\", baseUrl);\n url.searchParams.set(\"container\", host);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending authors: ${response.status}`);\n }\n\n const data = await response.json() as WaveTrendingAuthor[];\n\n return data.map(({ author, posts }) => ({ author, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending authors\", error);\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"../types\";\nimport { normalizePost } from \"@/modules/bridge\";\n\nexport function getNormalizePostQueryOptions(\n post: { author?: string; permlink?: string } | undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.normalize(post?.author ?? \"\", post?.permlink ?? \"\"),\n enabled: enabled && !!post,\n queryFn: async () => normalizePost(post) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core/config\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { getPostQueryOptions } from \"@/modules/posts/queries\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ninterface VoteOperationDetails {\n voter: string;\n author: string;\n permlink: string;\n weight: number;\n}\n\ninterface AccountVoteHistoryItem {\n timestamp: string;\n op: [string, VoteOperationDetails];\n}\n\ntype AccountVoteHistoryRecord = [number, AccountVoteHistoryItem];\n\ninterface VoteHistoryResult extends VoteOperationDetails {\n num: number;\n timestamp: string;\n}\n\nexport interface VoteHistoryPageParam {\n start: number;\n}\n\nexport interface VoteHistoryPage {\n lastDate: number;\n lastItemFetched: number;\n entries: Entry[];\n}\n\nfunction isEntry(x: unknown): x is Entry {\n return (\n !!x &&\n typeof x === \"object\" &&\n \"author\" in x &&\n \"permlink\" in x &&\n \"active_votes\" in x\n );\n}\n\n/**\n * Calculate days since a date\n */\nfunction getDays(createdDate: string): number {\n const past = new Date(createdDate);\n const now = new Date();\n const diffMs = now.getTime() - past.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Get account vote history with entries\n *\n * @param username - Account name to get vote history for\n * @param limit - Number of history items per page (default: 20)\n * @param filters - Additional filters to pass to get_account_history\n * @param dayLimit - Only include votes from last N days (default: 7)\n */\nexport function getAccountVoteHistoryInfiniteQueryOptions(\n username: string,\n options?: {\n limit?: number;\n filters?: F[];\n dayLimit?: number;\n }\n) {\n const { limit = 20, filters = [], dayLimit = 7.0 } = options ?? {};\n\n return infiniteQueryOptions<\n VoteHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n VoteHistoryPageParam\n >({\n queryKey: QueryKeys.accounts.voteHistory(username, limit),\n initialPageParam: { start: -1 },\n\n queryFn: async ({ pageParam }: { pageParam: VoteHistoryPageParam }) => {\n const { start } = pageParam;\n\n const response = (await callRPC(\"condenser_api.get_account_history\", [username, start, limit, ...filters])) as AccountVoteHistoryRecord[];\n\n const mappedResults: VoteHistoryResult[] = response.map(([num, historyObj]) => ({\n ...historyObj.op[1],\n num,\n timestamp: historyObj.timestamp,\n }));\n\n const result = mappedResults.filter(\n (filtered) =>\n filtered.voter === username &&\n filtered.weight !== 0 &&\n getDays(filtered.timestamp) <= dayLimit\n );\n\n const entries: Entry[] = [];\n for (const obj of result) {\n const post = await CONFIG.queryClient.fetchQuery(\n getPostQueryOptions(obj.author, obj.permlink)\n );\n if (isEntry(post)) entries.push(post);\n }\n\n const [firstHistory] = response;\n\n return {\n lastDate: firstHistory ? getDays(firstHistory[1].timestamp) : 0,\n lastItemFetched: firstHistory ? firstHistory[0] : start,\n entries,\n };\n },\n\n getNextPageParam: (lastPage: VoteHistoryPage): VoteHistoryPageParam => ({\n start: lastPage.lastItemFetched,\n }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Profile } from \"../types\";\nimport { getProfiles } from \"@/modules/bridge\";\n\nexport function getProfilesQueryOptions(\n accounts: string[],\n observer?: string,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.profiles(accounts, observer ?? \"\"),\n enabled: enabled && accounts.length > 0,\n queryFn: async () => getProfiles(accounts, observer) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type {\n BalanceCoinType,\n BalanceHistoryEntry,\n BalanceHistoryResponse,\n} from \"../types\";\n\ninterface BalanceHistoryPage {\n entries: BalanceHistoryEntry[];\n currentPage: number;\n}\n\n/**\n * Cursor for balance history pagination.\n * null = first request (returns the newest page).\n * number = specific page to fetch (decrementing for older data).\n */\ntype BalanceHistoryCursor = number | null;\n\n/**\n * Get balance history for an account with pagination, newest first.\n * Uses the balance-api REST endpoint with direction=desc.\n *\n * Pagination: first call omits `page` to get the newest data.\n * The response includes `total_pages` so we know the current page number.\n * Subsequent calls decrement the page number to load older data.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param pageSize - Number of entries per page\n */\nexport function getBalanceHistoryInfiniteQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n pageSize = 200\n) {\n return infiniteQueryOptions<\n BalanceHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n BalanceHistoryCursor\n >({\n queryKey: QueryKeys.wallet.balanceHistory(\n username ?? \"\",\n coinType,\n pageSize\n ),\n initialPageParam: null as BalanceHistoryCursor,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"coin-type\": coinType,\n \"page-size\": pageSize,\n direction: \"desc\",\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"balance\",\n \"/accounts/{account-name}/balance-history\",\n params,\n undefined,\n undefined,\n signal\n )) as BalanceHistoryResponse;\n\n return {\n entries: response.operations_result,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n // Decrement page to go further back in time\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type { AggregatedBalanceEntry, BalanceCoinType } from \"../types\";\n\nexport type BalanceAggregationGranularity = \"yearly\" | \"monthly\" | \"daily\";\n\n/**\n * Get aggregated balance history for an account.\n * Uses the balance-api REST endpoint - enables yearly/monthly/daily summary\n * widgets that are impossible via RPC.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param granularity - yearly (default), monthly, or daily\n */\nexport function getAggregatedBalanceQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n granularity: BalanceAggregationGranularity = \"yearly\"\n) {\n return queryOptions({\n queryKey: QueryKeys.wallet.aggregatedHistory(\n username ?? \"\",\n coinType,\n granularity\n ),\n\n queryFn: async () => {\n if (!username) {\n return [];\n }\n\n return (await callREST(\n \"balance\",\n \"/accounts/{account-name}/aggregated-history\",\n {\n \"account-name\": username,\n \"coin-type\": coinType,\n granularity,\n }\n )) as AggregatedBalanceEntry[];\n },\n\n enabled: !!username,\n staleTime: 60_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport interface ProMembersResponse {\n /** Usernames of active Ecency Pro members. */\n members: string[];\n count: number;\n}\n\n/**\n * Public, cached roster of Ecency Pro members. Backed by a lightweight private-api\n * endpoint (no auth) so any surface can decorate a username with a Pro badge without\n * a per-user request.\n *\n * `staleTime` is deliberately shorter than the endpoint's own cache window and is\n * NOT raised to match it. react-query has no idea how old a response already was\n * when `fetch` served it from the browser cache: it treats a nine-minute-old\n * cached body as freshly fetched and starts its own window from zero. Worst-case\n * staleness is therefore the endpoint's window plus this one, so raising this to\n * match the server would roughly double it rather than align it.\n */\nexport function getProMembersQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.proMembers(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/pro-members\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch pro members: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Lowercased set of member usernames for O(1), case-insensitive membership checks. */\nexport function proMembersSet(members?: string[]): Set {\n return new Set((members ?? []).map((m) => m.toLowerCase()));\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { AccountProfile, FullAccount } from \"../types\";\nimport {\n buildPostingJsonMetadata,\n buildProfileMetadata,\n extractAccountProfile,\n pickRicherMetadataSnapshot,\n} from \"../utils/profile-metadata\";\n\ninterface Payload {\n profile: Partial;\n tokens: AccountProfile[\"tokens\"];\n}\n\n/**\n * React Query mutation hook for updating account profile metadata.\n *\n * This mutation broadcasts an account_update2 operation to update the user's\n * profile information (name, about, location, avatar, cover image, etc.).\n *\n * @param username - The username to update (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Profile Fields:**\n * - name: Display name\n * - about: Bio/description\n * - location: Location\n * - website: Website URL\n * - profile_image: Avatar URL\n * - cover_image: Cover/banner URL\n * - tokens: Social tokens (Twitter, Facebook, etc.)\n * - version: Profile metadata version (auto-set to 2)\n *\n * **Authentication:**\n * - Uses posting authority (account_update2 operation)\n * - Supports all auth methods via platform adapter\n *\n * **Post-Broadcast Actions:**\n * - Optimistically updates account cache with new profile data\n * - Invalidates account cache to refetch from blockchain\n *\n * @example\n * ```typescript\n * const updateProfile = useAccountUpdate(username, {\n * adapter: myAdapter,\n * });\n *\n * // Update profile\n * updateProfile.mutate({\n * profile: {\n * name: \"John Doe\",\n * about: \"Hive enthusiast\",\n * profile_image: \"https://...\",\n * }\n * });\n * ```\n */\nexport function useAccountUpdate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useBroadcastMutation(\n [\"accounts\", \"update\"],\n username,\n (payload: Partial) => {\n // Prefer the freshest cached snapshot. onMutate has just refetched the\n // account from chain, so this usually reflects the current on-chain\n // profile rather than a possibly stale/unloaded render-time value. If\n // the cache instead holds a metadata-poorer row than the render-time\n // snapshot (e.g. a node served a stripped account row), the richer\n // snapshot wins — a partial update must never shrink the profile while\n // any snapshot still knows the full one.\n const account = pickRicherMetadataSnapshot(\n queryClient.getQueryData(\n getAccountFullQueryOptions(username).queryKey\n ),\n data\n );\n\n if (!account) {\n throw new Error(\"[SDK][Accounts] – cannot update not existing account\");\n }\n\n return [\n [\n \"account_update2\",\n {\n account: username!,\n json_metadata: \"\",\n extensions: [] as [],\n // Read-modify-write the FULL on-chain metadata: deep-merge the\n // profile and preserve any non-`profile` top-level keys, so a\n // partial update never wipes unrelated fields.\n posting_json_metadata: buildPostingJsonMetadata({\n existingPostingJsonMetadata: account.posting_json_metadata,\n profile: payload.profile,\n tokens: payload.tokens,\n }),\n },\n ],\n ];\n },\n async (_data: unknown, variables: Partial) => {\n // Optimistic cache update\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n const obj = JSON.parse(JSON.stringify(data)) as FullAccount;\n obj.profile = buildProfileMetadata({\n existingProfile: extractAccountProfile(data),\n profile: variables.profile,\n tokens: variables.tokens,\n });\n\n return obj;\n }\n );\n\n // Invalidate cache to refetch from blockchain\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username)\n ]);\n },\n auth,\n undefined,\n {\n broadcastMode,\n // Before merging, force a fresh on-chain read so a stale or unloaded\n // cached snapshot cannot cause a partial update (e.g. pinning a post,\n // which sets only `pinned`) to overwrite the existing profile with a\n // near-empty object. Best-effort: if the refetch fails, the op builder\n // falls back to the cached snapshot.\n onMutate: async () => {\n if (!username) {\n return;\n }\n try {\n await queryClient.fetchQuery({\n ...getAccountFullQueryOptions(username),\n staleTime: 0,\n });\n } catch {\n // Ignore – fall back to whatever is already cached.\n }\n },\n }\n );\n}\n","import { broadcastJson, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getRelationshipBetweenAccountsQueryOptions, getAccountFullQueryOptions } from \"../queries\";\nimport { AccountRelationship } from \"../types\";\n\ntype Kind = \"toggle-ignore\" | \"toggle-follow\";\n\nexport function useAccountRelationsUpdate(\n reference: string | undefined,\n target: string | undefined,\n auth: AuthContext | undefined,\n onSuccess: (data: Partial | undefined) => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"relation\", \"update\", reference, target],\n mutationFn: async (kind: Kind) => {\n const relationsQuery = getRelationshipBetweenAccountsQueryOptions(\n reference!,\n target!\n );\n await getQueryClient().prefetchQuery(relationsQuery);\n const actualRelation = getQueryClient().getQueryData(\n relationsQuery.queryKey\n );\n\n await broadcastJson(\n reference,\n \"follow\",\n [\n \"follow\",\n {\n follower: reference,\n following: target,\n what: [\n ...(kind === \"toggle-ignore\" && !actualRelation?.ignores\n ? [\"ignore\"]\n : []),\n ...(kind === \"toggle-follow\" && !actualRelation?.follows\n ? [\"blog\"]\n : []),\n ],\n },\n ],\n auth\n );\n\n return {\n ...actualRelation,\n ignores:\n kind === \"toggle-ignore\"\n ? !actualRelation?.ignores\n : actualRelation?.ignores,\n follows:\n kind === \"toggle-follow\"\n ? !actualRelation?.follows\n : actualRelation?.follows,\n } satisfies Partial;\n },\n onError,\n onSuccess(data) {\n onSuccess(data);\n\n getQueryClient().setQueryData(\n QueryKeys.accounts.relations(reference!, target!),\n data\n );\n\n // Invalidate account query to refetch follow stats (follower_count, following_count)\n // This is needed because profile pages use staleTime: Infinity for performance\n if (target) {\n getQueryClient().invalidateQueries(\n getAccountFullQueryOptions(target)\n );\n }\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Content Operations\n * Operations for creating, voting, and managing content on Hive blockchain\n */\n\n/**\n * Builds a vote operation.\n * @param voter - Account casting the vote\n * @param author - Author of the post/comment\n * @param permlink - Permlink of the post/comment\n * @param weight - Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote)\n * @returns Vote operation\n */\nexport function buildVoteOp(\n voter: string,\n author: string,\n permlink: string,\n weight: number\n): Operation {\n if (!voter || !author || !permlink) {\n throw new Error(\"[SDK][buildVoteOp] Missing required parameters\");\n }\n if (weight < -10000 || weight > 10000) {\n throw new Error(\"[SDK][buildVoteOp] Weight must be between -10000 and 10000\");\n }\n\n return [\n \"vote\",\n {\n voter,\n author,\n permlink,\n weight,\n },\n ];\n}\n\n/**\n * Builds a comment operation (for posts or replies).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param parentAuthor - Parent author (empty string for top-level posts)\n * @param parentPermlink - Parent permlink (category/tag for top-level posts)\n * @param title - Title of the post (empty for comments)\n * @param body - Content body (required - cannot be empty)\n * @param jsonMetadata - JSON metadata object\n * @returns Comment operation\n */\nexport function buildCommentOp(\n author: string,\n permlink: string,\n parentAuthor: string,\n parentPermlink: string,\n title: string,\n body: string,\n jsonMetadata: Record\n): Operation {\n // Validate all required parameters including body\n if (!author || !permlink || parentPermlink === undefined || !body) {\n throw new Error(\"[SDK][buildCommentOp] Missing required parameters\");\n }\n\n return [\n \"comment\",\n {\n parent_author: parentAuthor,\n parent_permlink: parentPermlink,\n author,\n permlink,\n title,\n body,\n json_metadata: JSON.stringify(jsonMetadata),\n },\n ];\n}\n\n/**\n * Builds a comment options operation (for setting beneficiaries, rewards, etc.).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param maxAcceptedPayout - Maximum accepted payout (e.g., \"1000000.000 HBD\")\n * @param percentHbd - Percent of payout in HBD (10000 = 100%)\n * @param allowVotes - Allow votes on this content\n * @param allowCurationRewards - Allow curation rewards\n * @param extensions - Extensions array (for beneficiaries, etc.)\n * @returns Comment options operation\n */\nexport function buildCommentOptionsOp(\n author: string,\n permlink: string,\n maxAcceptedPayout: string,\n percentHbd: number,\n allowVotes: boolean,\n allowCurationRewards: boolean,\n extensions: any[]\n): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildCommentOptionsOp] Missing required parameters\");\n }\n\n return [\n \"comment_options\",\n {\n author,\n permlink,\n max_accepted_payout: maxAcceptedPayout,\n percent_hbd: percentHbd,\n allow_votes: allowVotes,\n allow_curation_rewards: allowCurationRewards,\n extensions,\n },\n ];\n}\n\n/**\n * Builds a delete comment operation.\n * @param author - Author of the comment/post to delete\n * @param permlink - Permlink of the comment/post to delete\n * @returns Delete comment operation\n */\nexport function buildDeleteCommentOp(author: string, permlink: string): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildDeleteCommentOp] Missing required parameters\");\n }\n\n return [\n \"delete_comment\",\n {\n author,\n permlink,\n },\n ];\n}\n\n/**\n * Builds a reblog operation (custom_json).\n * @param account - Account performing the reblog\n * @param author - Original post author\n * @param permlink - Original post permlink\n * @param deleteReblog - If true, removes the reblog\n * @returns Custom JSON operation for reblog\n */\nexport function buildReblogOp(\n account: string,\n author: string,\n permlink: string,\n deleteReblog: boolean = false\n): Operation {\n if (!account || !author || !permlink) {\n throw new Error(\"[SDK][buildReblogOp] Missing required parameters\");\n }\n\n const json: any = {\n account,\n author,\n permlink,\n };\n\n if (deleteReblog) {\n json.delete = \"delete\";\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\"reblog\", json]),\n required_auths: [],\n required_posting_auths: [account],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Wallet Operations\n * Operations for managing tokens, savings, vesting, and conversions\n */\n\n/**\n * Builds a transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer operation\n */\nexport function buildTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferOp] Missing required parameters\");\n }\n\n return [\n \"transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds multiple transfer operations for multiple recipients.\n * @param from - Sender account\n * @param destinations - Comma or space separated list of recipient accounts\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Array of transfer operations\n */\nexport function buildMultiTransferOps(\n from: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!from || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Create a transfer operation for each destination username\n return destArray.map((dest) =>\n buildTransferOp(from, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds a recurrent transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param recurrence - Recurrence in hours\n * @param executions - Number of executions (2 = executes twice)\n * @returns Recurrent transfer operation\n */\nexport function buildRecurrentTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n recurrence: number,\n executions: number\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Missing required parameters\");\n }\n if (recurrence < 24) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours\");\n }\n\n return [\n \"recurrent_transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n recurrence,\n executions,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a transfer to savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer to savings operation\n */\nexport function buildTransferToSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds a transfer from savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID (use timestamp)\n * @returns Transfer from savings operation\n */\nexport function buildTransferFromSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_from_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds a cancel transfer from savings operation.\n * @param from - Account that initiated the savings withdrawal\n * @param requestId - Request ID to cancel\n * @returns Cancel transfer from savings operation\n */\nexport function buildCancelTransferFromSavingsOp(\n from: string,\n requestId: number\n): Operation {\n if (!from || requestId === undefined) {\n throw new Error(\"[SDK][buildCancelTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"cancel_transfer_from_savings\",\n {\n from,\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds operations to claim savings interest.\n * Creates a transfer_from_savings and immediately cancels it to claim interest.\n * @param from - Account claiming interest\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"0.001 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID\n * @returns Array of operations [transfer_from_savings, cancel_transfer_from_savings]\n */\nexport function buildClaimInterestOps(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation[] {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildClaimInterestOps] Missing required parameters\");\n }\n\n return [\n buildTransferFromSavingsOp(from, to, amount, memo, requestId),\n buildCancelTransferFromSavingsOp(from, requestId),\n ];\n}\n\n/**\n * Builds a transfer to vesting operation (power up).\n * @param from - Account sending HIVE\n * @param to - Account receiving Hive Power\n * @param amount - Amount with HIVE symbol (e.g., \"1.000 HIVE\")\n * @returns Transfer to vesting operation\n */\nexport function buildTransferToVestingOp(\n from: string,\n to: string,\n amount: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToVestingOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_vesting\",\n {\n from,\n to,\n amount,\n },\n ];\n}\n\n/**\n * Builds a withdraw vesting operation (power down).\n * @param account - Account withdrawing vesting\n * @param vestingShares - Amount of VESTS to withdraw (e.g., \"1.000000 VESTS\")\n * @returns Withdraw vesting operation\n */\nexport function buildWithdrawVestingOp(\n account: string,\n vestingShares: string\n): Operation {\n if (!account || !vestingShares) {\n throw new Error(\"[SDK][buildWithdrawVestingOp] Missing required parameters\");\n }\n\n return [\n \"withdraw_vesting\",\n {\n account,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a delegate vesting shares operation (HP delegation).\n * @param delegator - Account delegating HP\n * @param delegatee - Account receiving HP delegation\n * @param vestingShares - Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\")\n * @returns Delegate vesting shares operation\n */\nexport function buildDelegateVestingSharesOp(\n delegator: string,\n delegatee: string,\n vestingShares: string\n): Operation {\n if (!delegator || !delegatee || !vestingShares) {\n throw new Error(\"[SDK][buildDelegateVestingSharesOp] Missing required parameters\");\n }\n\n return [\n \"delegate_vesting_shares\",\n {\n delegator,\n delegatee,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a set withdraw vesting route operation.\n * @param fromAccount - Account withdrawing vesting\n * @param toAccount - Account receiving withdrawn vesting\n * @param percent - Percentage to route (0-10000, where 10000 = 100%)\n * @param autoVest - Auto convert to vesting\n * @returns Set withdraw vesting route operation\n */\nexport function buildSetWithdrawVestingRouteOp(\n fromAccount: string,\n toAccount: string,\n percent: number,\n autoVest: boolean\n): Operation {\n if (!fromAccount || !toAccount || percent === undefined) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters\");\n }\n if (percent < 0 || percent > 10000) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000\");\n }\n\n return [\n \"set_withdraw_vesting_route\",\n {\n from_account: fromAccount,\n to_account: toAccount,\n percent,\n auto_vest: autoVest,\n },\n ];\n}\n\n/**\n * Builds a convert operation (HBD to HIVE).\n * @param owner - Account converting HBD\n * @param amount - Amount of HBD to convert (e.g., \"1.000 HBD\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Convert operation\n */\nexport function buildConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildConvertOp] Missing required parameters\");\n }\n\n return [\n \"convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a collateralized convert operation (HIVE to HBD via collateral).\n * @param owner - Account converting HIVE\n * @param amount - Amount of HIVE to convert (e.g., \"1.000 HIVE\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Collateralized convert operation\n */\nexport function buildCollateralizedConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildCollateralizedConvertOp] Missing required parameters\");\n }\n\n return [\n \"collateralized_convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a Hive Engine custom_json operation.\n * @param from - Account performing the operation\n * @param contractAction - Engine contract action (e.g., \"transfer\", \"stake\")\n * @param contractPayload - Payload for the contract action\n * @param contractName - Engine contract name (defaults to \"tokens\")\n * @returns Custom JSON operation\n */\nexport function buildEngineOp(\n from: string,\n contractAction: string,\n contractPayload: Record,\n contractName = \"tokens\"\n): Operation {\n return [\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [from],\n required_posting_auths: [],\n json: JSON.stringify({ contractName, contractAction, contractPayload }),\n }];\n}\n\n/**\n * Builds a scot_claim_token operation (posting authority).\n * @param account - Account claiming rewards\n * @param tokens - Array of token symbols to claim\n * @returns Custom JSON operation\n */\nexport function buildEngineClaimOp(\n account: string,\n tokens: string[]\n): Operation {\n return [\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [account],\n json: JSON.stringify(tokens.map((symbol) => ({ symbol }))),\n }];\n}\n\n/**\n * Builds a delegate RC operation (custom_json).\n * @param from - Account delegating RC\n * @param delegatees - Single delegatee or comma-separated list\n * @param maxRc - Maximum RC to delegate (in mana units)\n * @returns Custom JSON operation for RC delegation\n */\nexport function buildDelegateRcOp(\n from: string,\n delegatees: string,\n maxRc: string | number\n): Operation {\n if (!from || !delegatees || maxRc === undefined) {\n throw new Error(\"[SDK][buildDelegateRcOp] Missing required parameters\");\n }\n\n const delegateeArray = delegatees.includes(\",\")\n ? delegatees.split(\",\").map((d) => d.trim())\n : [delegatees];\n\n return [\n \"custom_json\",\n {\n id: \"rc\",\n json: JSON.stringify([\n \"delegate_rc\",\n {\n from,\n delegatees: delegateeArray,\n max_rc: maxRc,\n },\n ]),\n required_auths: [],\n required_posting_auths: [from],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Social Operations\n * Operations for following, muting, and managing social relationships\n */\n\n/**\n * Builds a follow operation (custom_json).\n * @param follower - Account following\n * @param following - Account to follow\n * @returns Custom JSON operation for follow\n */\nexport function buildFollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildFollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"blog\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unfollow operation (custom_json).\n * @param follower - Account unfollowing\n * @param following - Account to unfollow\n * @returns Custom JSON operation for unfollow\n */\nexport function buildUnfollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnfollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an ignore/mute operation (custom_json).\n * @param follower - Account ignoring\n * @param following - Account to ignore\n * @returns Custom JSON operation for ignore\n */\nexport function buildIgnoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildIgnoreOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"ignore\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unignore/unmute operation (custom_json).\n * @param follower - Account unignoring\n * @param following - Account to unignore\n * @returns Custom JSON operation for unignore\n */\nexport function buildUnignoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnignoreOp] Missing required parameters\");\n }\n\n return buildUnfollowOp(follower, following);\n}\n\n/**\n * Builds a Hive Notify set last read operation (custom_json).\n * @param username - Account setting last read\n * @param date - ISO date string (defaults to now)\n * @returns Array of custom JSON operations for setting last read\n */\nexport function buildSetLastReadOps(username: string, date?: string): Operation[] {\n if (!username) {\n throw new Error(\"[SDK][buildSetLastReadOps] Missing required parameters\");\n }\n\n const lastReadDate = date || new Date().toISOString().split(\".\")[0];\n\n const notifyOp: Operation = [\n \"custom_json\",\n {\n id: \"notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n const ecencyNotifyOp: Operation = [\n \"custom_json\",\n {\n id: \"ecency_notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n return [notifyOp, ecencyNotifyOp];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Governance Operations\n * Operations for witness voting, proposals, and proxy management\n */\n\n/**\n * Builds an account witness vote operation.\n * @param account - Account voting\n * @param witness - Witness account name\n * @param approve - True to approve, false to disapprove\n * @returns Account witness vote operation\n */\nexport function buildWitnessVoteOp(\n account: string,\n witness: string,\n approve: boolean\n): Operation {\n if (!account || !witness || approve === undefined) {\n throw new Error(\"[SDK][buildWitnessVoteOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_vote\",\n {\n account,\n witness,\n approve,\n },\n ];\n}\n\n/**\n * Builds an account witness proxy operation.\n * @param account - Account setting proxy\n * @param proxy - Proxy account name (empty string to remove proxy)\n * @returns Account witness proxy operation\n */\nexport function buildWitnessProxyOp(account: string, proxy: string): Operation {\n if (!account || proxy === undefined) {\n throw new Error(\"[SDK][buildWitnessProxyOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_proxy\",\n {\n account,\n proxy,\n },\n ];\n}\n\n/**\n * Payload for proposal creation\n */\nexport interface ProposalCreatePayload {\n receiver: string;\n subject: string;\n permlink: string;\n start: string;\n end: string;\n dailyPay: string;\n}\n\n/**\n * Builds a create proposal operation.\n * @param creator - Account creating the proposal\n * @param payload - Proposal details (must include start, end, and dailyPay)\n * @returns Create proposal operation\n */\nexport function buildProposalCreateOp(\n creator: string,\n payload: ProposalCreatePayload\n): Operation {\n // Validate required fields including start, end, and dailyPay\n if (\n !creator ||\n !payload.receiver ||\n !payload.subject ||\n !payload.permlink ||\n !payload.start ||\n !payload.end ||\n !payload.dailyPay\n ) {\n throw new Error(\"[SDK][buildProposalCreateOp] Missing required parameters\");\n }\n\n // Validate date format by attempting to parse them\n const startDate = new Date(payload.start);\n const endDate = new Date(payload.end);\n if (startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {\n throw new Error(\n \"[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings\"\n );\n }\n\n return [\n \"create_proposal\",\n {\n creator,\n receiver: payload.receiver,\n start_date: payload.start,\n end_date: payload.end,\n daily_pay: payload.dailyPay,\n subject: payload.subject,\n permlink: payload.permlink,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal votes operation.\n * @param voter - Account voting\n * @param proposalIds - Array of proposal IDs\n * @param approve - True to approve, false to disapprove\n * @returns Update proposal votes operation\n */\nexport function buildProposalVoteOp(\n voter: string,\n proposalIds: number[],\n approve: boolean\n): Operation {\n if (!voter || !proposalIds || proposalIds.length === 0 || approve === undefined) {\n throw new Error(\"[SDK][buildProposalVoteOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal_votes\",\n {\n voter,\n proposal_ids: proposalIds,\n approve,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a remove proposal operation.\n * @param proposalOwner - Owner of the proposal\n * @param proposalIds - Array of proposal IDs to remove\n * @returns Remove proposal operation\n */\nexport function buildRemoveProposalOp(\n proposalOwner: string,\n proposalIds: number[]\n): Operation {\n if (!proposalOwner || !proposalIds || proposalIds.length === 0) {\n throw new Error(\"[SDK][buildRemoveProposalOp] Missing required parameters\");\n }\n\n return [\n \"remove_proposal\",\n {\n proposal_owner: proposalOwner,\n proposal_ids: proposalIds,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal operation.\n * @param proposalId - Proposal ID to update (must be a valid number, including 0)\n * @param creator - Account that created the proposal\n * @param dailyPay - New daily pay amount\n * @param subject - New subject\n * @param permlink - New permlink\n * @returns Update proposal operation\n */\nexport function buildUpdateProposalOp(\n proposalId: number,\n creator: string,\n dailyPay: string,\n subject: string,\n permlink: string\n): Operation {\n // Validate proposalId properly - check for undefined/null instead of falsy\n // This allows proposalId of 0 which is a valid proposal ID\n if (\n proposalId === undefined ||\n proposalId === null ||\n typeof proposalId !== 'number' ||\n !creator ||\n !dailyPay ||\n !subject ||\n !permlink\n ) {\n throw new Error(\"[SDK][buildUpdateProposalOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal\",\n {\n proposal_id: proposalId,\n creator,\n daily_pay: dailyPay,\n subject,\n permlink,\n extensions: [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Community Operations\n * Operations for managing Hive communities\n */\n\n/**\n * Builds a subscribe to community operation (custom_json).\n * @param username - Account subscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for subscribe\n */\nexport function buildSubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildSubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"subscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds an unsubscribe from community operation (custom_json).\n * @param username - Account unsubscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for unsubscribe\n */\nexport function buildUnsubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildUnsubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"unsubscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a set user role in community operation (custom_json).\n * @param username - Account setting the role (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to set role for\n * @param role - Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\")\n * @returns Custom JSON operation for setRole\n */\nexport function buildSetRoleOp(\n username: string,\n community: string,\n account: string,\n role: string\n): Operation {\n if (!username || !community || !account || !role) {\n throw new Error(\n `[SDK][buildSetRoleOp] Missing required parameters: username=${username}, community=${community}, account=${account}, role=${role}`\n );\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"setRole\", { community, account, role }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Community properties for update\n */\nexport interface CommunityProps {\n title: string;\n about: string;\n lang: string;\n description: string;\n flag_text: string;\n is_nsfw: boolean;\n}\n\n/**\n * Builds an update community properties operation (custom_json).\n * @param username - Account updating (must be community admin)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param props - Properties to update\n * @returns Custom JSON operation for updateProps\n */\nexport function buildUpdateCommunityOp(\n username: string,\n community: string,\n props: CommunityProps\n): Operation {\n if (!username || !community || !props) {\n throw new Error(\"[SDK][buildUpdateCommunityOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"updateProps\", { community, props }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a pin/unpin post in community operation (custom_json).\n * @param username - Account pinning (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param pin - True to pin, false to unpin\n * @returns Custom JSON operation for pinPost/unpinPost\n */\nexport function buildPinPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n pin: boolean\n): Operation {\n if (!username || !community || !account || !permlink || pin === undefined) {\n throw new Error(\"[SDK][buildPinPostOp] Missing required parameters\");\n }\n\n const action = pin ? \"pinPost\" : \"unpinPost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute post in community operation (custom_json).\n * @param username - Account muting (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for mutePost/unmutePost\n */\nexport function buildMutePostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string,\n mute: boolean\n): Operation {\n if (\n !username ||\n !community ||\n !account ||\n !permlink ||\n mute === undefined\n ) {\n throw new Error(\"[SDK][buildMutePostOp] Missing required parameters\");\n }\n\n const action = mute ? \"mutePost\" : \"unmutePost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute user in community operation (custom_json).\n * @param username - Account performing mute (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to mute/unmute\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for muteUser/unmuteUser\n */\nexport function buildMuteUserOp(\n username: string,\n community: string,\n account: string,\n notes: string,\n mute: boolean\n): Operation {\n if (!username || !community || !account || mute === undefined) {\n throw new Error(\"[SDK][buildMuteUserOp] Missing required parameters\");\n }\n\n const action = mute ? \"muteUser\" : \"unmuteUser\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a flag post in community operation (custom_json).\n * @param username - Account flagging\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Flag reason/notes\n * @returns Custom JSON operation for flagPost\n */\nexport function buildFlagPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string\n): Operation {\n if (!username || !community || !account || !permlink) {\n throw new Error(\"[SDK][buildFlagPostOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"flagPost\", { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Market Operations\n * Operations for trading on the internal Hive market\n */\n\n/**\n * Transaction type for buy/sell operations\n */\nexport enum BuySellTransactionType {\n Buy = \"buy\",\n Sell = \"sell\",\n}\n\n/**\n * Order ID prefix for different order types\n */\nexport enum OrderIdPrefix {\n EMPTY = \"\",\n SWAP = \"9\",\n}\n\n/**\n * Builds a limit order create operation.\n * @param owner - Account creating the order\n * @param amountToSell - Amount and asset to sell\n * @param minToReceive - Minimum amount and asset to receive\n * @param fillOrKill - If true, order must be filled immediately or cancelled\n * @param expiration - Expiration date (ISO string)\n * @param orderId - Unique order ID\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOp(\n owner: string,\n amountToSell: string,\n minToReceive: string,\n fillOrKill: boolean,\n expiration: string,\n orderId: number\n): Operation {\n if (!owner || !amountToSell || !minToReceive || !expiration || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCreateOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_create\",\n {\n owner,\n orderid: orderId,\n amount_to_sell: amountToSell,\n min_to_receive: minToReceive,\n fill_or_kill: fillOrKill,\n expiration,\n },\n ];\n}\n\n/**\n * Helper to format number to 3 decimal places\n */\nfunction formatNumber(value: number, decimals: number = 3): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Builds a limit order create operation with automatic formatting.\n * This is a convenience method that handles buy/sell logic and formatting.\n *\n * For Buy orders: You're buying HIVE with HBD\n * - amountToSell: HBD amount you're spending\n * - minToReceive: HIVE amount you want to receive\n *\n * For Sell orders: You're selling HIVE for HBD\n * - amountToSell: HIVE amount you're selling\n * - minToReceive: HBD amount you want to receive\n *\n * @param owner - Account creating the order\n * @param amountToSell - Amount to sell (number)\n * @param minToReceive - Minimum to receive (number)\n * @param orderType - Buy or Sell\n * @param idPrefix - Order ID prefix\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOpWithType(\n owner: string,\n amountToSell: number,\n minToReceive: number,\n orderType: BuySellTransactionType,\n idPrefix: OrderIdPrefix = OrderIdPrefix.EMPTY\n): Operation {\n // Validate numeric inputs\n if (\n !owner ||\n orderType === undefined ||\n !Number.isFinite(amountToSell) ||\n amountToSell <= 0 ||\n !Number.isFinite(minToReceive) ||\n minToReceive <= 0\n ) {\n throw new Error(\"[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters\");\n }\n\n // Calculate expiration (27 days from now)\n const expiration = new Date(Date.now());\n expiration.setDate(expiration.getDate() + 27);\n const expirationStr = expiration.toISOString().split(\".\")[0];\n\n // Generate order ID\n const orderId = Number(\n `${idPrefix}${Math.floor(Date.now() / 1000)\n .toString()\n .slice(2)}`\n );\n\n // Format amounts based on order type\n // Buy: Sell HBD to buy HIVE\n // Sell: Sell HIVE to buy HBD\n const formattedAmountToSell =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(amountToSell, 3)} HBD`\n : `${formatNumber(amountToSell, 3)} HIVE`;\n\n const formattedMinToReceive =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(minToReceive, 3)} HIVE`\n : `${formatNumber(minToReceive, 3)} HBD`;\n\n return buildLimitOrderCreateOp(\n owner,\n formattedAmountToSell,\n formattedMinToReceive,\n false,\n expirationStr,\n orderId\n );\n}\n\n/**\n * Builds a limit order cancel operation.\n * @param owner - Account cancelling the order\n * @param orderId - Order ID to cancel\n * @returns Limit order cancel operation\n */\nexport function buildLimitOrderCancelOp(owner: string, orderId: number): Operation {\n if (!owner || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCancelOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_cancel\",\n {\n owner,\n orderid: orderId,\n },\n ];\n}\n\n/**\n * Builds a claim reward balance operation.\n * @param account - Account claiming rewards\n * @param rewardHive - HIVE reward to claim (e.g., \"0.000 HIVE\")\n * @param rewardHbd - HBD reward to claim (e.g., \"0.000 HBD\")\n * @param rewardVests - VESTS reward to claim (e.g., \"0.000000 VESTS\")\n * @returns Claim reward balance operation\n */\nexport function buildClaimRewardBalanceOp(\n account: string,\n rewardHive: string,\n rewardHbd: string,\n rewardVests: string\n): Operation {\n if (!account || !rewardHive || !rewardHbd || !rewardVests) {\n throw new Error(\"[SDK][buildClaimRewardBalanceOp] Missing required parameters\");\n }\n\n return [\n \"claim_reward_balance\",\n {\n account,\n reward_hive: rewardHive,\n reward_hbd: rewardHbd,\n reward_vests: rewardVests,\n },\n ];\n}\n","import type { Operation, Authority } from \"../../../hive-tx\";\n\nexport type { Authority };\n\n/**\n * Account Operations\n * Operations for managing accounts, keys, and permissions\n */\n\n/**\n * Builds an account update operation.\n * @param account - Account name\n * @param owner - Owner authority (optional)\n * @param active - Active authority (optional)\n * @param posting - Posting authority (optional)\n * @param memoKey - Memo public key\n * @param jsonMetadata - Account JSON metadata\n * @returns Account update operation\n */\nexport function buildAccountUpdateOp(\n account: string,\n owner: Authority | undefined,\n active: Authority | undefined,\n posting: Authority | undefined,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !memoKey) {\n throw new Error(\"[SDK][buildAccountUpdateOp] Missing required parameters\");\n }\n\n return [\n \"account_update\",\n {\n account,\n owner,\n active,\n posting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an account update2 operation (for posting_json_metadata).\n * @param account - Account name\n * @param jsonMetadata - Account JSON metadata (legacy, usually empty)\n * @param postingJsonMetadata - Posting JSON metadata string\n * @param extensions - Extensions array\n * @returns Account update2 operation\n */\nexport function buildAccountUpdate2Op(\n account: string,\n jsonMetadata: string,\n postingJsonMetadata: string,\n extensions: any[]\n): Operation {\n if (!account || postingJsonMetadata === undefined) {\n throw new Error(\"[SDK][buildAccountUpdate2Op] Missing required parameters\");\n }\n\n return [\n \"account_update2\",\n {\n account,\n json_metadata: jsonMetadata || \"\",\n posting_json_metadata: postingJsonMetadata,\n extensions: (extensions || []) as [],\n },\n ];\n}\n\n/**\n * Public keys for account creation\n */\nexport interface AccountKeys {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n}\n\n/**\n * Builds an account create operation.\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @param fee - Creation fee (e.g., \"3.000 HIVE\")\n * @returns Account create operation\n */\nexport function buildAccountCreateOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys,\n fee: string\n): Operation {\n if (!creator || !newAccountName || !keys || !fee) {\n throw new Error(\"[SDK][buildAccountCreateOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"account_create\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n fee,\n },\n ] satisfies Operation;\n}\n\n/**\n * Builds a create claimed account operation (using account creation tokens).\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @returns Create claimed account operation\n */\nexport function buildCreateClaimedAccountOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys\n): Operation {\n if (!creator || !newAccountName || !keys) {\n throw new Error(\"[SDK][buildCreateClaimedAccountOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"create_claimed_account\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds a claim account operation.\n * @param creator - Account claiming the token\n * @param fee - Fee for claiming (usually \"0.000 HIVE\" for RC-based claims)\n * @returns Claim account operation\n */\nexport function buildClaimAccountOp(creator: string, fee: string): Operation {\n if (!creator || !fee) {\n throw new Error(\"[SDK][buildClaimAccountOp] Missing required parameters\");\n }\n\n return [\n \"claim_account\",\n {\n creator,\n fee,\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds an operation to grant posting permission to another account.\n * Helper that modifies posting authority to add an account.\n * @param account - Account granting permission\n * @param currentPosting - Current posting authority\n * @param grantedAccount - Account to grant permission to\n * @param weightThreshold - Weight threshold of the granted account\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildGrantPostingPermissionOp(\n account: string,\n currentPosting: Authority,\n grantedAccount: string,\n weightThreshold: number,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !grantedAccount || !memoKey) {\n throw new Error(\"[SDK][buildGrantPostingPermissionOp] Missing required parameters\");\n }\n\n // Find existing account or create new entry to prevent duplicates\n const existingIndex = currentPosting.account_auths.findIndex(\n ([acc]) => acc === grantedAccount\n );\n\n const newAccountAuths = [...currentPosting.account_auths];\n if (existingIndex >= 0) {\n // Update existing entry with new weight\n newAccountAuths[existingIndex] = [grantedAccount, weightThreshold];\n } else {\n // Add new entry\n newAccountAuths.push([grantedAccount, weightThreshold]);\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: newAccountAuths,\n };\n\n // Sort account_auths alphabetically for consistency\n newPosting.account_auths.sort((a, b) => (a[0] > b[0] ? 1 : -1));\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an operation to revoke posting permission from an account.\n * Helper that modifies posting authority to remove an account.\n * @param account - Account revoking permission\n * @param currentPosting - Current posting authority\n * @param revokedAccount - Account to revoke permission from\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildRevokePostingPermissionOp(\n account: string,\n currentPosting: Authority,\n revokedAccount: string,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !revokedAccount || !memoKey) {\n throw new Error(\"[SDK][buildRevokePostingPermissionOp] Missing required parameters\");\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: currentPosting.account_auths.filter(\n ([acc]) => acc !== revokedAccount\n ),\n };\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds a change recovery account operation.\n * @param accountToRecover - Account to change recovery account for\n * @param newRecoveryAccount - New recovery account name\n * @param extensions - Extensions array\n * @returns Change recovery account operation\n */\nexport function buildChangeRecoveryAccountOp(\n accountToRecover: string,\n newRecoveryAccount: string,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newRecoveryAccount) {\n throw new Error(\"[SDK][buildChangeRecoveryAccountOp] Missing required parameters\");\n }\n\n return [\n \"change_recovery_account\",\n {\n account_to_recover: accountToRecover,\n new_recovery_account: newRecoveryAccount,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a request account recovery operation.\n * @param recoveryAccount - Recovery account performing the recovery\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param extensions - Extensions array\n * @returns Request account recovery operation\n */\nexport function buildRequestAccountRecoveryOp(\n recoveryAccount: string,\n accountToRecover: string,\n newOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {\n throw new Error(\"[SDK][buildRequestAccountRecoveryOp] Missing required parameters\");\n }\n\n return [\n \"request_account_recovery\",\n {\n recovery_account: recoveryAccount,\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a recover account operation.\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param recentOwnerAuthority - Recent owner authority (for proof)\n * @param extensions - Extensions array\n * @returns Recover account operation\n */\nexport function buildRecoverAccountOp(\n accountToRecover: string,\n newOwnerAuthority: Authority,\n recentOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newOwnerAuthority || !recentOwnerAuthority) {\n throw new Error(\"[SDK][buildRecoverAccountOp] Missing required parameters\");\n }\n\n return [\n \"recover_account\",\n {\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n recent_owner_authority: recentOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Ecency-Specific Operations\n * Custom operations for Ecency platform features (Points, Boost, Promote, etc.)\n */\n\n/**\n * Builds an Ecency Boost Plus subscription operation (custom_json).\n * @param user - User account\n * @param account - Account to subscribe\n * @param duration - Subscription duration in days (must be a valid finite number)\n * @returns Custom JSON operation for boost plus\n */\nexport function buildBoostPlusOp(\n user: string,\n account: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !account || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildBoostPlusOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_boost_plus\",\n json: JSON.stringify({\n user,\n account,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency RC top-up operation (custom_json): a short-term, RC-only\n * delegation to the user's OWN account, paid for with Ecency Points. Distinct\n * from Boost Plus (which delegates Hive Power). The RC amount is fixed\n * server-side, so the user only chooses a duration. Signed with active\n * authority because it spends Points. The actual on-chain `delegate_rc` is\n * broadcast by the Ecency relay account, not here.\n * @param user - User account (payer and recipient of the RC)\n * @param duration - Delegation duration in days (must be a valid finite number)\n * @returns Custom JSON operation for the RC top-up\n */\nexport function buildRcDelegationOp(user: string, duration: number): Operation {\n if (!user || !Number.isInteger(duration) || duration <= 0) {\n throw new Error(\"[SDK][buildRcDelegationOp] Missing or invalid parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_rc_delegation\",\n json: JSON.stringify({\n user,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency promote operation (custom_json).\n * @param user - User account\n * @param author - Post author\n * @param permlink - Post permlink\n * @param duration - Promotion duration in days (must be a valid finite number)\n * @returns Custom JSON operation for promote\n */\nexport function buildPromoteOp(\n user: string,\n author: string,\n permlink: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !author || !permlink || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildPromoteOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_promote\",\n json: JSON.stringify({\n user,\n author,\n permlink,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency point transfer operation (custom_json).\n * @param sender - Sender account\n * @param receiver - Receiver account\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Custom JSON operation for point transfer\n */\nexport function buildPointTransferOp(\n sender: string,\n receiver: string,\n amount: string,\n memo: string\n): Operation {\n if (!sender || !receiver || !amount) {\n throw new Error(\"[SDK][buildPointTransferOp] Missing required parameters\");\n }\n\n // Normalize \"POINTS\" to \"POINT\" — backend expects singular form\n const normalizedAmount = amount.replace(/POINTS\\b/, \"POINT\");\n\n return [\n \"custom_json\",\n {\n id: \"ecency_point_transfer\",\n json: JSON.stringify({\n sender,\n receiver,\n amount: normalizedAmount,\n memo: memo || \"\",\n }),\n required_auths: [sender],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds multiple Ecency point transfer operations for multiple recipients.\n * @param sender - Sender account\n * @param destinations - Comma or space separated list of recipients\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Array of custom JSON operations for point transfers\n */\nexport function buildMultiPointTransferOps(\n sender: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!sender || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Validate parsed destinations\n if (destArray.length === 0) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing valid destinations\");\n }\n\n // Create a point transfer operation for each destination\n return destArray.map((dest) =>\n buildPointTransferOp(sender, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds an Ecency community rewards registration operation (custom_json).\n * @param name - Account name to register\n * @returns Custom JSON operation for community registration\n */\nexport function buildCommunityRegistrationOp(name: string): Operation {\n if (!name) {\n throw new Error(\"[SDK][buildCommunityRegistrationOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_registration\",\n json: JSON.stringify({\n name,\n }),\n required_auths: [name],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic active authority custom_json operation.\n * Used for various Ecency operations that require active authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with active authority\n */\nexport function buildActiveCustomJsonOp(\n username: string,\n operationId: string,\n json: Record\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildActiveCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [username],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic posting authority custom_json operation.\n * Used for various operations that require posting authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with posting authority\n */\nexport function buildPostingCustomJsonOp(\n username: string,\n operationId: string,\n json: Record | any[]\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildPostingCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildFollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for following an account.\n */\nexport interface FollowPayload {\n /** Account to follow */\n following: string;\n}\n\n/**\n * React Query mutation hook for following an account.\n *\n * This mutation broadcasts a follow operation to the Hive blockchain,\n * adding the target account to the follower's \"blog\" follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const followMutation = useFollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Follow an account\n * followMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useFollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"follow\"],\n username,\n ({ following }) => [\n buildFollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnfollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unfollowing an account.\n */\nexport interface UnfollowPayload {\n /** Account to unfollow */\n following: string;\n}\n\n/**\n * React Query mutation hook for unfollowing an account.\n *\n * This mutation broadcasts an unfollow operation to the Hive blockchain,\n * removing the target account from the follower's follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const unfollowMutation = useUnfollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unfollow an account\n * unfollowMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useUnfollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"unfollow\"],\n username,\n ({ following }) => [\n buildUnfollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n author: string;\n permlink: string;\n}\n\nexport function useBookmarkAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"add\", username],\n mutationFn: async ({ author, permlink }: Payload) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useBookmarkDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"delete\", username],\n mutationFn: async (bookmarkId: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: bookmarkId,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useAccountFavoriteAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"add\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation, InfiniteData } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../../types\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAccountFavoriteDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"delete\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to delete favorite: ${response.status}`);\n }\n return response.json();\n },\n onMutate: async (account: string) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.accounts.favorites(username);\n const infinitePrefix = QueryKeys.accounts.favoritesInfinite(username);\n const checkKey = QueryKeys.accounts.checkFavorite(username, account);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n qc.cancelQueries({ queryKey: checkKey }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((f) => f.account !== account)\n );\n }\n\n const previousCheck = qc.getQueryData(checkKey);\n qc.setQueryData(checkKey, false);\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((f) => f.account !== account),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite, previousCheck };\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError: (err, account, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.accounts.favorites(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n if (context?.previousCheck !== undefined) {\n qc.setQueryData(\n QueryKeys.accounts.checkFavorite(username!, account),\n context.previousCheck\n );\n }\n onError(err);\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\nexport interface Keys {\n owner: PrivateKey;\n active: PrivateKey;\n posting: PrivateKey;\n memo_key: PrivateKey;\n}\n\ninterface Payload {\n keepCurrent?: boolean;\n currentKey: PrivateKey;\n keys: Keys[];\n keysToRevoke?: string[]; // Deprecated: will be treated as revoking from all authorities\n keysToRevokeByAuthority?: Partial>; // Authority-specific revocation\n}\n\nexport function dedupeAndSortKeyAuths(\n existing: Authority[\"key_auths\"],\n additions: [string, number][]\n): Authority[\"key_auths\"] {\n const merged = new Map();\n\n existing.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n additions.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n return Array.from(merged.entries())\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, weight]) => [key, weight] as [string, number]);\n}\n\ntype UpdateKeyAuthsOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdateKeyAuths(\n username: string,\n options?: UpdateKeyAuthsOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"keys-update\", username],\n mutationFn: async ({\n keys,\n keepCurrent = false,\n currentKey,\n keysToRevoke = [],\n keysToRevokeByAuthority = {}\n }: Payload) => {\n if (keys.length === 0) {\n throw new Error(\n \"[SDK][Update password] – no new keys provided\"\n );\n }\n\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update keys for anon user\"\n );\n }\n\n const prepareAuth = (keyName: keyof Keys) => {\n const auth: Authority = JSON.parse(JSON.stringify(accountData[keyName]));\n\n // Get keys to revoke for this specific authority\n const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];\n // Fallback to global keysToRevoke for backwards compatibility\n const allKeysToRevoke = [\n ...keysToRevokeForAuthority,\n ...(keysToRevokeByAuthority[keyName] === undefined ? keysToRevoke : [])\n ];\n\n // Filter out keys to revoke from existing keys (authority-specific)\n const existingKeys = keepCurrent\n ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString()))\n : [];\n\n auth.key_auths = dedupeAndSortKeyAuths(\n existingKeys,\n keys.map(\n (values, i) =>\n [values[keyName].createPublic().toString(), i + 1] as [\n string,\n number,\n ]\n )\n );\n\n return auth;\n };\n\n return broadcastOperations(\n [[\"account_update\", {\n account: username,\n json_metadata: accountData.json_metadata,\n owner: prepareAuth(\"owner\"),\n active: prepareAuth(\"active\"),\n posting: prepareAuth(\"posting\"),\n // Always use new memo key when adding new keys\n memo_key: keys[0].memo_key.createPublic().toString(),\n }]],\n currentKey\n );\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { useAccountUpdateKeyAuths } from \"./use-account-update-key-auths\";\n\ninterface Payload {\n newPassword: string;\n currentPassword: string;\n keepCurrent?: boolean;\n}\n\n/**\n * Only native Hive and custom passwords could be updated here\n * Seed based password cannot be updated here, it will be in an account always for now\n */\ntype UpdatePasswordOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdatePassword(\n username: string,\n options?: UpdatePasswordOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);\n\n return useMutation({\n mutationKey: [\"accounts\", \"password-update\", username],\n mutationFn: async ({\n newPassword,\n currentPassword,\n keepCurrent,\n }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update password for anon user\"\n );\n }\n const currentKey = PrivateKey.fromLogin(\n username,\n currentPassword,\n \"owner\"\n );\n\n return updateKeys({\n currentKey,\n keepCurrent,\n keys: [\n {\n owner: PrivateKey.fromLogin(username, newPassword, \"owner\"),\n active: PrivateKey.fromLogin(username, newPassword, \"active\"),\n posting: PrivateKey.fromLogin(username, newPassword, \"posting\"),\n memo_key: PrivateKey.fromLogin(username, newPassword, \"memo\"),\n },\n ],\n });\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { FullAccount } from \"../types\";\nimport hs from \"hivesigner\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n}\n\ntype RevokePostingOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountRevokePosting(\n username: string | undefined,\n options: RevokePostingOptions,\n auth?: AuthContext\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-posting\", data?.name],\n mutationFn: async ({ accountName, type, key }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot revoke posting for anonymous user\"\n );\n }\n\n const posting = JSON.parse(JSON.stringify(data.posting)) as FullAccount[\"posting\"];\n\n posting.account_auths = posting.account_auths.filter(\n ([account]) => account !== accountName\n );\n\n const operationBody = {\n account: data.name,\n posting,\n memo_key: data.memo_key,\n json_metadata: data.json_metadata,\n };\n\n if (type === \"key\" && key) {\n return broadcastOperations([[\"account_update\", operationBody]], key);\n } else if (type === \"keychain\") {\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.broadcast([[\"account_update\", operationBody]], \"active\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"account_update\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: (resp, payload, ctx) => {\n (options.onSuccess as\n | ((data: unknown, variables: CommonPayload, context: unknown) => unknown)\n | undefined)?.(resp, payload, ctx);\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) =>\n ({\n ...data,\n posting: {\n ...data?.posting,\n account_auths:\n data?.posting?.account_auths?.filter(\n ([account]) => account !== payload.accountName\n ) ?? [],\n },\n }) as FullAccount\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\" | \"ecency\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n email?: string;\n}\n\ntype UpdateRecoveryOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountUpdateRecovery(\n username: string | undefined,\n code: string | undefined,\n options: UpdateRecoveryOptions,\n auth?: AuthContext\n) {\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"recovery\", data?.name],\n mutationFn: async ({ accountName, type, key, email }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot change recovery for anonymous user\"\n );\n }\n\n const operationBody = {\n account_to_recover: data.name,\n new_recovery_account: accountName,\n extensions: [] as [],\n };\n\n if (type === \"ecency\") {\n if (!code) {\n throw new Error(\"[SDK][Accounts] – missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/recoveries-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n email,\n publicKeys: [\n ...data.owner.key_auths,\n ...data.active.key_auths,\n ...data.posting.key_auths,\n data.memo_key,\n ],\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx, so guard explicitly — otherwise the\n // caller's onSuccess shows a \"recovery updated\" toast on a failed request.\n // (The missing Content-Type header also made the backend skip JSON parsing.)\n if (!response.ok) {\n throw new Error(`[SDK][Accounts] Failed to add recovery: ${response.status}`);\n }\n\n return response;\n } else if (type === \"key\" && key) {\n return broadcastOperations(\n [[\"change_recovery_account\", operationBody]],\n key\n );\n } else if (type === \"keychain\") {\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.broadcast([[\"change_recovery_account\", operationBody]], \"owner\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"change_recovery_account\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: options.onSuccess,\n });\n}\n","import { PublicKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport { FullAccount } from \"../types\";\n\n/**\n * Check whether an authority would still meet its weight_threshold\n * after removing the given keys. This prevents revoking keys that\n * would leave an authority unable to sign (especially for multisig).\n */\nexport function canRevokeFromAuthority(\n auth: Authority,\n revokingKeyStrs: Set\n): boolean {\n const remainingWeight = auth.key_auths\n .filter(([key]) => !revokingKeyStrs.has(String(key)))\n .reduce((sum, [, weight]) => sum + weight, 0);\n\n // account_auths also contribute weight\n const accountWeight = (auth.account_auths ?? []).reduce(\n (sum: number, [, weight]: [string, number]) => sum + weight,\n 0\n );\n\n return (remainingWeight + accountWeight) >= auth.weight_threshold;\n}\n\n/**\n * Build an account_update operation that removes the given public keys\n * from the relevant authorities.\n *\n * Only includes the `owner` field when a revoking key actually exists\n * in the owner authority - omitting it allows active-level signing.\n *\n * Returns the operation payload (without the \"account_update\" tag) so\n * callers can wrap it as needed for their broadcast method.\n */\nexport function buildRevokeKeysOp(\n accountData: FullAccount,\n revokingKeys: PublicKey[]\n) {\n const revokingKeyStrs = new Set(revokingKeys.map((k) => k.toString()));\n\n const hasAnyKeyInAuth = (auth: Authority) =>\n auth.key_auths.some(\n ([key]: [string | PublicKey, number]) => revokingKeyStrs.has(String(key))\n );\n\n const prepareAuth = (auth: Authority): Authority => {\n const clone: Authority = JSON.parse(JSON.stringify(auth));\n clone.key_auths = clone.key_auths.filter(\n ([key]) => !revokingKeyStrs.has(key.toString())\n );\n return clone;\n };\n\n const needsOwnerUpdate = hasAnyKeyInAuth(accountData.owner);\n\n return {\n account: accountData.name,\n json_metadata: accountData.json_metadata,\n owner: needsOwnerUpdate ? prepareAuth(accountData.owner) : undefined,\n active: prepareAuth(accountData.active),\n posting: prepareAuth(accountData.posting),\n memo_key: accountData.memo_key\n };\n}\n","import { PrivateKey, PublicKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { buildRevokeKeysOp } from \"./build-revoke-keys-op\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ninterface Payload {\n currentKey: PrivateKey;\n /** Keys to revoke. Accepts a single key or an array. */\n revokingKey: PublicKey | PublicKey[];\n}\n\n/**\n * Revoke one or more keys from an account on the Hive blockchain.\n *\n * When revoking keys that exist only in active/posting authorities,\n * the owner field is omitted from the operation so active-level\n * signing is sufficient.\n */\ntype RevokeKeyOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountRevokeKey(\n username: string | undefined,\n options?: RevokeKeyOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-key\", accountData?.name],\n mutationFn: async ({ currentKey, revokingKey }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Revoke key] – cannot update keys for anon user\"\n );\n }\n\n const revokingKeys = Array.isArray(revokingKey) ? revokingKey : [revokingKey];\n const op = buildRevokeKeysOp(accountData, revokingKeys);\n\n return broadcastOperations([[\"account_update\", op]], currentKey);\n },\n ...options,\n });\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildClaimAccountOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for claiming account creation tokens.\n */\nexport interface ClaimAccountPayload {\n /** Creator account claiming the token */\n creator: string;\n /** Fee for claiming (usually \"0.000 HIVE\" for RC-based claims) */\n fee?: string;\n}\n\n/**\n * React Query mutation hook for claiming account creation tokens.\n *\n * This mutation broadcasts a claim_account operation to claim an account\n * creation token using Resource Credits (RC). The claimed token can later\n * be used to create a new account for free using the create_claimed_account\n * operation.\n *\n * @param username - The username claiming the account token (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account cache to update pending_claimed_accounts count\n * - Updates account query data to set pending_claimed_accounts = 0 optimistically\n *\n * **Operation Details:**\n * - Uses native claim_account operation\n * - Fee: \"0.000 HIVE\" (uses RC instead of HIVE)\n * - Authority: Active key (required for claiming)\n *\n * **RC Requirements:**\n * - Requires sufficient Resource Credits (RC)\n * - RC amount varies based on network conditions\n * - Claiming without sufficient RC will fail\n *\n * **Use Case:**\n * - Claim tokens in advance when RC is available\n * - Create accounts later without paying HIVE fee\n * - Useful for onboarding services and apps\n *\n * @example\n * ```typescript\n * const claimMutation = useClaimAccount(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Claim account token using RC\n * claimMutation.mutate({\n * creator: 'alice',\n * fee: '0.000 HIVE'\n * });\n * ```\n */\nexport function useClaimAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"claimAccount\"],\n username,\n ({ creator, fee = \"0.000 HIVE\" }) => [\n buildClaimAccountOp(creator, fee)\n ],\n async (_result: any, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(variables.creator),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildGrantPostingPermissionOp, type Authority } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface GrantPostingPermissionPayload {\n currentPosting: Authority;\n grantedAccount: string;\n weightThreshold: number;\n memoKey: string;\n jsonMetadata: string;\n}\n\nexport function useGrantPostingPermission(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"grant-posting-permission\"],\n username,\n (payload) => [\n buildGrantPostingPermissionOp(\n username!,\n payload.currentPosting,\n payload.grantedAccount,\n payload.weightThreshold,\n payload.memoKey,\n payload.jsonMetadata\n )\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildAccountCreateOp, buildCreateClaimedAccountOp, type AccountKeys } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface CreateAccountPayload {\n newAccountName: string;\n keys: AccountKeys;\n fee: string;\n /** If true, uses a claimed account token instead of paying the fee */\n useClaimed?: boolean;\n}\n\nexport function useCreateAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"create\"],\n username,\n (payload) => [\n payload.useClaimed\n ? buildCreateClaimedAccountOp(username!, payload.newAccountName, payload.keys)\n : buildAccountCreateOp(username!, payload.newAccountName, payload.keys, payload.fee)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { parseAsset } from \"@/modules/core/utils\";\nimport { DynamicProps } from \"@/modules/core/types\";\nimport { FullAccount } from \"../types\";\nimport { calculateVPMana, calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\n\nconst HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24; // 5 days\nconst HIVE_100_PERCENT = 10000;\nconst HIVE_VOTE_DUST_THRESHOLD = 50_000_000;\n\nfunction getEffectiveVests(account: FullAccount): number {\n const vesting = parseAsset(account.vesting_shares).amount;\n const received = parseAsset(account.received_vesting_shares).amount;\n const delegated = parseAsset(account.delegated_vesting_shares).amount;\n const withdrawRate = parseAsset(account.vesting_withdraw_rate).amount;\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n\n return vesting + received - delegated - withdrawVests;\n}\n\nfunction vestsToRshares(vests: number, votingPowerValue: number, votePerc: number): number {\n const vestingShares = vests * 1e6;\n const power = (votingPowerValue * votePerc) / 1e4 / 50 + 1;\n return (power * vestingShares) / 1e4;\n}\n\nfunction hasStableVoteHardfork(dynamicProps: DynamicProps): boolean {\n if (Number.isFinite(dynamicProps.lastHardfork)) {\n return dynamicProps.lastHardfork >= 28;\n }\n\n const [major = \"0\", minor = \"0\"] = (dynamicProps.currentHardforkVersion ?? \"0.0.0\").split(\".\");\n return Number(major) > 1 || (Number(major) === 1 && Number(minor) >= 28);\n}\n\nfunction stableVoteRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n weight: number\n): number {\n const reserveRate =\n dynamicProps.votePowerReserveRate ||\n Number(dynamicProps.raw?.globalDynamic?.vote_power_reserve_rate ?? 0);\n\n if (!Number.isFinite(reserveRate) || reserveRate <= 0) {\n return 0;\n }\n\n const effectiveVests = getEffectiveVests(account);\n if (!Number.isFinite(effectiveVests) || effectiveVests <= 0) {\n return 0;\n }\n\n const vestingShares = effectiveVests * 1e6;\n const usedMana =\n Math.ceil(\n (vestingShares * weight * 60 * 60 * 24) /\n HIVE_100_PERCENT /\n (reserveRate * HIVE_VOTING_MANA_REGENERATION_SECONDS)\n );\n\n const mana = calculateVPMana(account);\n const currentMana = Math.min(mana.current_mana, mana.max_mana);\n\n if (!Number.isFinite(currentMana) || usedMana > currentMana) {\n return 0;\n }\n\n return Math.max(usedMana - HIVE_VOTE_DUST_THRESHOLD, 0);\n}\n\nexport function votingRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n\n if (hasStableVoteHardfork(dynamicProps)) {\n return stableVoteRshares(account, dynamicProps, weight);\n }\n\n let totalVests = 0;\n try {\n totalVests = getEffectiveVests(account);\n if (!Number.isFinite(totalVests)) {\n return 0;\n }\n } catch {\n return 0;\n }\n\n return vestsToRshares(totalVests, votingPowerValue, weight);\n}\n\nexport function votingPower(account: FullAccount): number {\n const calc = calculateVPMana(account);\n return calc.percentage / 100;\n}\n\nexport function powerRechargeTime(power: number) {\n if (!Number.isFinite(power)) {\n throw new TypeError(\"Voting power must be a finite number\");\n }\n if (power < 0 || power > 100) {\n throw new RangeError(\"Voting power must be between 0 and 100\");\n }\n const missingPower = 100 - power;\n return (\n (missingPower * 100 * HIVE_VOTING_MANA_REGENERATION_SECONDS) / 10000\n );\n}\n\nexport function downVotingPower(account: FullAccount): number {\n const totalShares =\n parseFloat(account.vesting_shares) +\n parseFloat(account.received_vesting_shares) -\n parseFloat(account.delegated_vesting_shares);\n const elapsed = Math.floor(Date.now() / 1000) - account.downvote_manabar.last_update_time;\n const maxMana = (totalShares * 1000000) / 4;\n\n if (maxMana <= 0) {\n return 0;\n }\n\n let currentMana =\n parseFloat(account.downvote_manabar.current_mana.toString()) +\n (elapsed * maxMana) / HIVE_VOTING_MANA_REGENERATION_SECONDS;\n\n if (currentMana > maxMana) {\n currentMana = maxMana;\n }\n const currentManaPerc = (currentMana * 100) / maxMana;\n\n if (isNaN(currentManaPerc)) {\n return 0;\n }\n\n if (currentManaPerc > 100) {\n return 100;\n }\n return currentManaPerc;\n}\n\nexport function rcPower(account: RCAccount): number {\n const calc = calculateRCMana(account);\n return calc.percentage / 100;\n}\n\nexport function votingValue(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n const { fundRecentClaims, fundRewardBalance, base, quote } = dynamicProps;\n\n if (\n !Number.isFinite(fundRecentClaims) ||\n !Number.isFinite(fundRewardBalance) ||\n !Number.isFinite(base) ||\n !Number.isFinite(quote)\n ) {\n return 0;\n }\n\n if (fundRecentClaims === 0 || quote === 0) {\n return 0;\n }\n\n const rShares = votingRshares(account, dynamicProps, votingPowerValue, weight);\n\n if (!Number.isFinite(rShares)) {\n return 0;\n }\n\n return (rShares / fundRecentClaims) * fundRewardBalance * (base / quote);\n}\n","import type { Operation } from \"../../hive-tx\";\n\n/**\n * Authority levels for Hive blockchain operations.\n * - posting: Social operations (voting, commenting, reblogging)\n * - active: Financial and account management operations\n * - owner: Critical security operations (key changes, account recovery)\n * - memo: Memo encryption/decryption (rarely used for signing)\n */\nexport type AuthorityLevel = 'posting' | 'active' | 'owner' | 'memo';\n\n/**\n * Maps operation types to their required authority level.\n *\n * This mapping is used to determine which key is needed to sign a transaction,\n * enabling smart auth fallback and auth upgrade UI.\n *\n * @remarks\n * - Most social operations (vote, comment, reblog) require posting authority\n * - Financial operations (transfer, withdraw) require active authority\n * - Account management operations require active authority\n * - Security operations (password change, account recovery) require owner authority\n * - custom_json requires dynamic detection based on required_auths vs required_posting_auths\n */\nexport const OPERATION_AUTHORITY_MAP: Record = {\n // Posting authority operations\n vote: 'posting',\n comment: 'posting',\n delete_comment: 'posting',\n comment_options: 'posting',\n claim_reward_balance: 'posting',\n\n // Active authority operations - Financial\n cancel_transfer_from_savings: 'active',\n collateralized_convert: 'active',\n convert: 'active',\n delegate_vesting_shares: 'active',\n recurrent_transfer: 'active',\n set_withdraw_vesting_route: 'active',\n transfer: 'active',\n transfer_from_savings: 'active',\n transfer_to_savings: 'active',\n transfer_to_vesting: 'active',\n withdraw_vesting: 'active',\n\n // Active authority operations - Market\n limit_order_create: 'active',\n limit_order_cancel: 'active',\n\n // Active authority operations - Account Management\n account_update: 'active',\n account_update2: 'active',\n claim_account: 'active',\n create_claimed_account: 'active',\n\n // Active authority operations - Governance\n account_witness_proxy: 'active',\n account_witness_vote: 'active',\n remove_proposal: 'active',\n update_proposal_votes: 'active',\n\n // Owner authority operations - Security & Account Recovery\n change_recovery_account: 'owner',\n request_account_recovery: 'owner',\n recover_account: 'owner',\n reset_account: 'owner',\n set_reset_account: 'owner',\n\n // Note: Some operations are handled separately via content inspection:\n // - custom_json: via getCustomJsonAuthority() - posting or active based on required_auths\n // - create_proposal/update_proposal: via getProposalAuthority() - typically active\n};\n\n/**\n * Determines authority required for a custom_json operation.\n *\n * Custom JSON operations can require either posting or active authority\n * depending on which field is populated:\n * - required_auths (active authority)\n * - required_posting_auths (posting authority)\n *\n * @param customJsonOp - The custom_json operation to inspect\n * @returns 'active' if requires active authority, 'posting' if requires posting authority\n *\n * @example\n * ```typescript\n * // Reblog operation (posting authority)\n * const reblogOp: Operation = ['custom_json', {\n * required_auths: [],\n * required_posting_auths: ['alice'],\n * id: 'reblog',\n * json: '...'\n * }];\n * getCustomJsonAuthority(reblogOp); // Returns 'posting'\n *\n * // Some active authority custom_json\n * const activeOp: Operation = ['custom_json', {\n * required_auths: ['alice'],\n * required_posting_auths: [],\n * id: 'some_active_op',\n * json: '...'\n * }];\n * getCustomJsonAuthority(activeOp); // Returns 'active'\n * ```\n */\nexport function getCustomJsonAuthority(customJsonOp: Operation): AuthorityLevel {\n const opType = customJsonOp[0];\n const payload = customJsonOp[1];\n\n if (opType !== 'custom_json') {\n throw new Error('Operation is not a custom_json operation');\n }\n\n // Type assertion for custom_json payload\n const customJson = payload as {\n required_auths?: string[];\n required_posting_auths?: string[];\n id: string;\n json: string;\n };\n\n // If required_auths is set and non-empty, needs active authority\n if (customJson.required_auths && customJson.required_auths.length > 0) {\n return 'active';\n }\n\n // If only required_posting_auths is set, needs posting authority\n if (customJson.required_posting_auths && customJson.required_posting_auths.length > 0) {\n return 'posting';\n }\n\n // Default to posting for custom_json (most common case)\n return 'posting';\n}\n\n/**\n * Determines authority required for a proposal operation.\n *\n * Proposal operations (create_proposal, update_proposal) typically require\n * active authority as they involve financial commitments and funding allocations.\n *\n * @param proposalOp - The proposal operation to inspect\n * @returns 'active' authority requirement\n *\n * @remarks\n * Unlike custom_json, proposal operations don't have explicit required_auths fields.\n * They always use the creator's authority, which defaults to active for financial\n * operations involving the DAO treasury.\n *\n * @example\n * ```typescript\n * const proposalOp: Operation = ['create_proposal', {\n * creator: 'alice',\n * receiver: 'bob',\n * subject: 'My Proposal',\n * permlink: 'my-proposal',\n * start: '2026-03-01T00:00:00',\n * end: '2026-04-01T00:00:00',\n * daily_pay: '100.000 HBD',\n * extensions: []\n * }];\n * getProposalAuthority(proposalOp); // Returns 'active'\n * ```\n */\nexport function getProposalAuthority(proposalOp: Operation): AuthorityLevel {\n const opType = proposalOp[0];\n\n if (opType !== 'create_proposal' && opType !== 'update_proposal') {\n throw new Error('Operation is not a proposal operation');\n }\n\n // Proposal operations require active authority for financial operations\n return 'active';\n}\n\n/**\n * Determines the required authority level for any operation.\n *\n * Uses the OPERATION_AUTHORITY_MAP for standard operations, and dynamic\n * detection for custom_json operations.\n *\n * @param op - The operation to check\n * @returns 'posting' or 'active' authority requirement\n *\n * @example\n * ```typescript\n * const voteOp: Operation = ['vote', { voter: 'alice', author: 'bob', permlink: 'post', weight: 10000 }];\n * getOperationAuthority(voteOp); // Returns 'posting'\n *\n * const transferOp: Operation = ['transfer', { from: 'alice', to: 'bob', amount: '1.000 HIVE', memo: '' }];\n * getOperationAuthority(transferOp); // Returns 'active'\n * ```\n */\nexport function getOperationAuthority(op: Operation): AuthorityLevel {\n const opType = op[0];\n\n // Special handling for custom_json - requires content inspection\n if (opType === 'custom_json') {\n return getCustomJsonAuthority(op);\n }\n\n // Special handling for proposal operations - requires content inspection\n if (opType === 'create_proposal' || opType === 'update_proposal') {\n return getProposalAuthority(op);\n }\n\n // Use mapping for standard operations, default to posting if unknown\n return OPERATION_AUTHORITY_MAP[opType] ?? 'posting';\n}\n\n/**\n * Determines the highest authority level required for a list of operations.\n *\n * Useful when broadcasting multiple operations together - the highest authority\n * level required by any operation determines what key is needed for the batch.\n *\n * Authority hierarchy: owner > active > posting > memo\n *\n * @param ops - Array of operations\n * @returns Highest authority level required ('owner', 'active', or 'posting')\n *\n * @example\n * ```typescript\n * const ops: Operation[] = [\n * ['vote', { ... }], // posting\n * ['comment', { ... }], // posting\n * ];\n * getRequiredAuthority(ops); // Returns 'posting'\n *\n * const mixedOps: Operation[] = [\n * ['comment', { ... }], // posting\n * ['transfer', { ... }], // active\n * ];\n * getRequiredAuthority(mixedOps); // Returns 'active'\n *\n * const securityOps: Operation[] = [\n * ['transfer', { ... }], // active\n * ['change_recovery_account', { ... }], // owner\n * ];\n * getRequiredAuthority(securityOps); // Returns 'owner'\n * ```\n */\nexport function getRequiredAuthority(ops: Operation[]): AuthorityLevel {\n let highestAuthority: AuthorityLevel = 'posting';\n\n for (const op of ops) {\n const authority = getOperationAuthority(op);\n\n // Owner is highest - return immediately\n if (authority === 'owner') {\n return 'owner';\n }\n\n // Active is higher than posting\n if (authority === 'active' && highestAuthority === 'posting') {\n highestAuthority = 'active';\n }\n\n // Memo is lowest (same level as posting)\n // If we see memo but only have posting, stick with posting\n }\n\n return highestAuthority;\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { isWif, broadcastOperations } from \"@/modules/core/hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useSignOperationByKey(username: string | undefined) {\n return useMutation({\n mutationKey: [\"operations\", \"sign\", username],\n mutationFn: ({\n operation,\n keyOrSeed,\n }: {\n operation: Operation;\n keyOrSeed: string;\n }) => {\n if (!username) {\n throw new Error(\"[Operations][Sign] – cannot sign op with anon user\");\n }\n\n let privateKey: PrivateKey;\n if (keyOrSeed.split(\" \").length === 12) {\n privateKey = PrivateKey.fromLogin(username, keyOrSeed, \"active\");\n } else if (isWif(keyOrSeed)) {\n privateKey = PrivateKey.fromString(keyOrSeed);\n } else {\n privateKey = PrivateKey.from(keyOrSeed);\n }\n\n return broadcastOperations(\n [operation],\n privateKey\n );\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AuthContext } from \"@/modules/core/types\";\n\nexport function useSignOperationByKeychain(\n username: string | undefined,\n auth?: AuthContext,\n keyType: \"owner\" | \"active\" | \"posting\" | \"memo\" = \"active\"\n) {\n return useMutation({\n mutationKey: [\"operations\", \"sign-keychain\", username],\n mutationFn: ({ operation }: { operation: Operation }) => {\n if (!username) {\n throw new Error(\n \"[SDK][Keychain] – cannot sign operation with anon user\"\n );\n }\n if (!auth?.broadcast) {\n throw new Error(\"[SDK][Keychain] – missing keychain broadcaster\");\n }\n\n return auth.broadcast([operation], keyType);\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function useSignOperationByHivesigner(callbackUri = \"/\") {\n return useMutation({\n mutationKey: [\"operations\", \"sign-hivesigner\", callbackUri],\n mutationFn: async ({ operation }: { operation: Operation }) => {\n return hs.sendOperation(operation, { callback: callbackUri }, () => {});\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getChainPropertiesQueryOptions() {\n return queryOptions({\n queryKey: [\"operations\", \"chain-properties\"],\n queryFn: async () => {\n return await callRPC(\"condenser_api.get_chain_properties\", []);\n },\n });\n}\n","import { Fragment } from \"../types\";\n\n/**\n * Build the cache entry for an edited fragment.\n *\n * The `/private-api/fragments-update` endpoint returns only a minimal\n * acknowledgement, not the full fragment. Writing that response straight into\n * the query cache blanked out the edited snippet (the reported bug), so the\n * updated record is built from the values the user actually submitted, merged\n * over whatever fields the response does carry, on top of the existing cached\n * fragment (preserving id/created).\n */\nexport function applyFragmentUpdate(\n existing: Fragment,\n response: Partial | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...existing,\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n };\n}\n\n/**\n * Build the cache entry for a newly added fragment. Reaffirms the submitted\n * title/body over the server acknowledgement so a fresh snippet never renders\n * blank if the response omits them, while keeping any server-provided\n * id/timestamps.\n */\nexport function buildAddedFragment(\n response: Fragment | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n } as Fragment;\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { buildAddedFragment } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAddFragment(username: string, code: string | undefined) {\n return useMutation({\n mutationKey: [\"posts\", \"add-fragment\", username],\n mutationFn: async ({ title, body }: { title: string; body: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-add\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and insert a bogus fragment into the cache. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to add fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // Reaffirm the submitted title/body over the server acknowledgement so a\n // freshly added snippet never renders blank if the response omits them,\n // while keeping any server-provided id/timestamps.\n const newFragment = buildAddedFragment(response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [newFragment, ...(data ?? [])]\n );\n\n // Update infinite query cache - add new fragment to first page\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page, index) =>\n index === 0\n ? { ...page, data: [newFragment, ...page.data] }\n : page\n ),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { applyFragmentUpdate } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useEditFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"edit-fragment\", username],\n mutationFn: async ({\n fragmentId,\n title,\n body\n }: {\n fragmentId: string;\n title: string;\n body: string;\n }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-update\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and overwrite the cached fragment with bogus data. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to update fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // The /fragments-update endpoint returns a minimal acknowledgement, not the\n // full fragment, so writing the raw response into the cache blanked out the\n // edited snippet. Rebuild the fragment from the submitted values instead.\n const applyUpdate = (fragment: Fragment): Fragment =>\n applyFragmentUpdate(fragment, response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) =>\n data?.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ) ?? []\n );\n\n // Update infinite query cache - update fragment in all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useRemoveFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"remove-fragment\", username],\n mutationFn: async ({ fragmentId }: { fragmentId: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/fragments-delete\", {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // getBoundFetch returns the raw fetch, so a 401/403/500 resolves rather than\n // rejects. Without this guard onSuccess would run and strip the fragment from\n // cache on a failed delete (false success). Throw so onError fires instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to delete fragment: ${response.status}`);\n }\n\n return response;\n },\n onSuccess(_data, variables) {\n const queryClient = getQueryClient();\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [...(data ?? [])].filter(({ id }) => id !== variables.fragmentId)\n );\n\n // Update infinite query cache - remove fragment from all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((fragment) => fragment.id !== variables.fragmentId),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { ApiNotification, ApiNotificationSetting } from \"@/modules/notifications\";\nimport { Draft, DraftMetadata } from \"@/modules/posts/types/draft\";\nimport { Schedule } from \"@/modules/posts/types/schedule\";\nimport { ApiResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n if (!response.ok) {\n let errorData: unknown = undefined;\n try {\n errorData = await response.json();\n } catch {\n errorData = undefined;\n }\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = errorData;\n throw error;\n }\n\n // Handle empty responses gracefully (e.g., 204 No Content or empty body)\n const text = await response.text();\n if (!text || text.trim() === \"\") {\n return \"\" as T;\n }\n\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n // If JSON parsing fails, return empty string as fallback\n console.warn(\"[SDK] Failed to parse JSON response:\", e, \"Response:\", text);\n return \"\" as T;\n }\n}\n\nexport async function signUp(\n username: string,\n email: string,\n referral: string,\n captchaToken?: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/account-create\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, email, referral, captcha_token: captchaToken }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function subscribeEmail(\n email: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/subscribe\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function usrActivity(\n code: string | undefined,\n ty: number,\n bl: string | number = \"\",\n tx: string | number = \"\"\n): Promise {\n const params: {\n code: string | undefined;\n ty: number;\n bl?: string | number;\n tx?: string | number;\n } = { code, ty };\n\n if (bl) {\n params.bl = bl;\n }\n if (tx) {\n params.tx = tx;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/usr-activity\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(params),\n });\n\n await parseJsonResponse(response);\n}\n\nexport async function getNotifications(\n code: string | undefined,\n filter: string | null,\n since: string | null = null,\n user: string | null = null\n): Promise {\n const data: { code: string | undefined; filter?: string; since?: string; user?: string } = {\n code,\n };\n\n if (filter) {\n data.filter = filter;\n }\n\n if (since) {\n data.since = since;\n }\n\n if (user) {\n data.user = user;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function saveNotificationSetting(\n code: string | undefined,\n username: string,\n system: string,\n allows_notify: number,\n notify_types: number[],\n token: string\n): Promise {\n const data = {\n code,\n username,\n token,\n system,\n allows_notify,\n notify_types,\n };\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/register-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getNotificationSetting(\n code: string | undefined,\n username: string,\n token: string\n): Promise {\n const data = { code, username, token };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/detail-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function markNotifications(\n code: string | undefined,\n id?: string\n): Promise> {\n const data: { code: string | undefined; id?: string } = {\n code,\n };\n if (id) {\n data.id = id;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications/mark\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addImage(code: string | undefined, url: string): Promise> {\n const data = { code, url };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\n// Upload always targets the canonical Ecency image server, even when\n// the user has changed their viewing proxy (e.g. images.hive.blog).\n// i.ecency.com is the same imagehoster endpoint as images.ecency.com\n// (identical backend / token validation); it is the canonical host\n// because some ISPs SNI-filter the images.ecency.com hostname.\nconst UPLOAD_HOST = \"https://i.ecency.com\";\n\nexport async function uploadImage(\n file: File,\n token: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${UPLOAD_HOST}/hs/${token}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\n/**\n * Upload image using posting key signature (/:username/:signature path).\n * Works with any compatible image server (images.ecency.com, images.hive.blog).\n * The signature is sha256(\"ImageSigningChallenge\" + fileData) signed with the posting key.\n */\nexport async function uploadImageWithSignature(\n file: File,\n username: string,\n signature: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${CONFIG.imageHost}/${username}/${signature}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\nexport async function deleteImage(\n code: string | undefined,\n imageId: string\n): Promise> {\n const data = { code, id: imageId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addDraft(\n code: string | undefined,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function updateDraft(\n code: string | undefined,\n draftId: string,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, id: draftId, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-update\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function deleteDraft(\n code: string | undefined,\n draftId: string\n): Promise> {\n const data = { code, id: draftId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addSchedule(\n code: string | undefined,\n permlink: string,\n title: string,\n body: string,\n meta: Record,\n options: Record | null,\n schedule: string,\n reblog: boolean\n): Promise> {\n const data: Record = {\n code,\n permlink,\n title,\n body,\n meta,\n schedule,\n reblog,\n };\n\n if (options) {\n data.options = options;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function deleteSchedule(\n code: string | undefined,\n id: string\n): Promise> {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function moveSchedule(code: string | undefined, id: string): Promise {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-move\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getPromotedPost(\n code: string | undefined,\n author: string,\n permlink: string\n): Promise<{ author: string; permlink: string } | \"\"> {\n const data = { code, author, permlink };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/promoted-post\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ author: string; permlink: string } | \"\">(response);\n}\n\nexport async function onboardEmail(\n username: string,\n email: string,\n friend: string\n): Promise> {\n const dataBody = {\n username,\n email,\n friend,\n };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/account-create-friend\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(dataBody),\n }\n );\n\n return parseJsonResponse>(response);\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useAddDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"add\", username],\n mutationFn: async ({\n title,\n body,\n tags,\n meta,\n }: {\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addDraft\");\n }\n return addDraft(code, title, body, tags, meta);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full drafts list from the response (API returns complete list)\n if (data?.drafts) {\n qc.setQueryData(QueryKeys.posts.drafts(username), data.drafts);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n }\n // Also invalidate the infinite query so the drafts list refetches\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { updateDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useUpdateDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"update\", username],\n mutationFn: async ({\n draftId,\n title,\n body,\n tags,\n meta,\n }: {\n draftId: string;\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for updateDraft\");\n }\n return updateDraft(code, draftId, title, body, tags, meta);\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteDraft } from \"@/modules/private-api/requests\";\nimport type { Draft } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useDeleteDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"delete\", username],\n mutationFn: async ({ draftId }: { draftId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteDraft\");\n }\n return deleteDraft(code, draftId);\n },\n onMutate: async ({ draftId }) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.posts.drafts(username);\n const infinitePrefix = QueryKeys.posts.draftsInfinite(username);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((d) => d._id !== draftId)\n );\n }\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((d) => d._id !== draftId),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite };\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError: (err, _variables, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.posts.drafts(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n onError?.(err);\n },\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addSchedule } from \"@/modules/private-api/requests\";\n\nexport function useAddSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"add\", username],\n mutationFn: async ({\n permlink,\n title,\n body,\n meta,\n options,\n schedule,\n reblog,\n }: {\n permlink: string;\n title: string;\n body: string;\n meta: Record;\n options: Record | null;\n schedule: string;\n reblog: boolean;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addSchedule\");\n }\n return addSchedule(code, permlink, title, body, meta, options, schedule, reblog);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.schedules(username),\n });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteSchedule } from \"@/modules/private-api/requests\";\n\nexport function useDeleteSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"delete\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteSchedule\");\n }\n return deleteSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { moveSchedule } from \"@/modules/private-api/requests\";\n\nexport function useMoveSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"move\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for moveSchedule\");\n }\n return moveSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n // Also invalidate drafts since moving a schedule creates a draft\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to add an image URL to the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful addition\n * @param onError - Optional callback on error\n *\n * @example\n * const addImageMutation = useAddImage(username, code);\n * addImageMutation.mutate({ url: 'https://...' });\n */\nexport function useAddImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"add\", username],\n mutationFn: async ({ url, code: nextCode }: { url: string; code?: string }) => {\n const effectiveCode = nextCode ?? code;\n\n if (!username || !effectiveCode) {\n throw new Error(\"[SDK][Posts] – missing auth for addImage\");\n }\n return addImage(effectiveCode, url);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.images(username),\n });\n },\n onError,\n });\n}\n","import { useMutation, type InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport { deleteImage } from \"@/modules/private-api/requests\";\nimport type { UserImage } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\n/**\n * Hook to delete an image from the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful deletion\n * @param onError - Optional callback on error\n *\n * @example\n * const deleteImageMutation = useDeleteImage(username, code);\n * deleteImageMutation.mutate({ imageId: '123' });\n */\nexport function useDeleteImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"delete\", username],\n mutationFn: async ({ imageId }: { imageId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteImage\");\n }\n return deleteImage(code, imageId);\n },\n onSuccess: (_data, variables) => {\n onSuccess?.();\n const qc = getQueryClient();\n const { imageId } = variables;\n\n // Optimistic removal from regular cache\n qc.setQueryData(\n [\"posts\", \"images\", username],\n (prev) => prev?.filter((img) => img._id !== imageId)\n );\n\n // Optimistic removal from infinite cache pages\n qc.setQueriesData>>(\n { queryKey: [\"posts\", \"images\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((img) => img._id !== imageId),\n })),\n };\n }\n );\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { uploadImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to upload an image file to Ecency image hosting\n *\n * @param onSuccess - Optional callback on successful upload, receives { url: string }\n * @param onError - Optional callback on error\n *\n * Note: This hook uploads to Ecency's image server and requires a signature token.\n * The token should be generated using the user's posting key signature.\n *\n * @example\n * const uploadMutation = useUploadImage(\n * (data) => console.log('Uploaded:', data.url)\n * );\n * uploadMutation.mutate({ file, token });\n */\nexport function useUploadImage(\n onSuccess?: (data: { url: string }) => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"upload\"],\n mutationFn: async ({\n file,\n token,\n signal,\n }: {\n file: File;\n token: string;\n signal?: AbortSignal;\n }) => {\n return uploadImage(file, token, signal);\n },\n onSuccess,\n onError,\n });\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry, EntryVote } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nfunction makeEntryPath(author: string, permlink: string) {\n return `/@${author}/${permlink}`;\n}\n\nfunction getEntryFromCache(\n author: string,\n permlink: string,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n return queryClient.getQueryData(\n QueryKeys.posts.entry(makeEntryPath(author, permlink))\n );\n}\n\nfunction setEntryInCache(entry: Entry, qc?: QueryClient) {\n const queryClient = qc ?? getQueryClient();\n queryClient.setQueryData(\n QueryKeys.posts.entry(makeEntryPath(entry.author, entry.permlink)),\n entry\n );\n}\n\nfunction mutateEntry(\n author: string,\n permlink: string,\n updater: (entry: Entry) => Entry,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = makeEntryPath(author, permlink);\n const existing = queryClient.getQueryData(QueryKeys.posts.entry(path));\n if (!existing) return undefined;\n\n const updated = updater(existing);\n queryClient.setQueryData(QueryKeys.posts.entry(path), updated);\n return existing;\n}\n\n/**\n * SDK-level entry cache utilities. These operate on SDK cache keys\n * ([\"posts\", \"entry\", \"/@author/permlink\"]).\n *\n * Web layer can bridge these to its own QueryIdentifiers.ENTRY keys\n * during the migration period.\n */\nexport namespace EntriesCacheManagement {\n export function updateVotes(\n author: string,\n permlink: string,\n votes: EntryVote[],\n payout: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n active_votes: votes,\n stats: {\n ...(entry.stats || {\n gray: false,\n hide: false,\n flag_weight: 0,\n total_votes: 0,\n }),\n total_votes: votes.length,\n flag_weight: entry.stats?.flag_weight || 0,\n },\n total_votes: votes.length,\n payout,\n pending_payout_value: String(payout),\n }),\n qc\n );\n }\n\n export function updateReblogsCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n reblogs: count,\n }),\n qc\n );\n }\n\n export function updateRepliesCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n children: count,\n }),\n qc\n );\n }\n\n export function addReply(\n reply: Entry,\n parentAuthor: string,\n parentPermlink: string,\n qc?: QueryClient\n ) {\n mutateEntry(\n parentAuthor,\n parentPermlink,\n (entry) => ({\n ...entry,\n children: entry.children + 1,\n replies: [reply, ...entry.replies],\n }),\n qc\n );\n }\n\n export function updateEntries(entries: Entry[], qc?: QueryClient) {\n entries.forEach((entry) => setEntryInCache(entry, qc));\n }\n\n export function invalidateEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ) {\n const queryClient = qc ?? getQueryClient();\n queryClient.invalidateQueries({\n queryKey: QueryKeys.posts.entry(makeEntryPath(author, permlink)),\n });\n }\n\n export function getEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ): Entry | undefined {\n return getEntryFromCache(author, permlink, qc);\n }\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Whether the cached active_votes list already reflects the broadcast vote:\n * the voter is present for a vote (weight !== 0) or absent for an unvote\n * (weight === 0). Used to avoid stacking the SDK's post-broadcast optimistic\n * update on top of a platform-level optimistic update applied at press time.\n */\nexport function isVoteAlreadyReflected(\n activeVotes: Array<{ voter: string }>,\n voter: string | undefined,\n weight: number\n): boolean {\n const hasVoterRecord = activeVotes.some((v) => v.voter === voter);\n return weight !== 0 ? hasVoterRecord : !hasVoterRecord;\n}\n\n/**\n * Payload for voting on a post or comment.\n */\nexport interface VotePayload {\n /** Author of the post/comment to vote on */\n author: string;\n /** Permlink of the post/comment to vote on */\n permlink: string;\n /** Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote) */\n weight: number;\n /** Optional estimated payout change for optimistic UI */\n estimated?: number;\n}\n\n/**\n * Post-broadcast optimistic cache update for a vote: replaces the voter's\n * active_votes record and bumps the payout by `estimated`. Skipped when the\n * cached entry already reflects this vote (voter present for a vote, absent\n * for an unvote): platforms with their own at-press optimistic layer (e.g.\n * the mobile app) have applied it by the time the broadcast resolves, and\n * stacking a second update here double-counts the payout and clobbers the\n * platform's richer vote record until the deferred invalidation.\n */\nexport function applyVoteCacheUpdate(\n username: string | undefined,\n variables: VotePayload,\n qc?: QueryClient\n): void {\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink, qc);\n if (\n !entry?.active_votes ||\n isVoteAlreadyReflected(entry.active_votes, username, variables.weight)\n ) {\n return;\n }\n const newVotes = [\n ...entry.active_votes.filter((v) => v.voter !== username),\n ...(variables.weight !== 0 ? [{ rshares: variables.weight, voter: username! }] : [])\n ];\n const newPayout = entry.payout + (variables.estimated ?? 0);\n EntriesCacheManagement.updateVotes(\n variables.author,\n variables.permlink,\n newVotes,\n newPayout,\n qc\n );\n}\n\n/**\n * React Query mutation hook for voting on posts and comments.\n *\n * This mutation broadcasts a vote operation to the Hive blockchain,\n * supporting upvotes (positive weight) and downvotes (negative weight).\n *\n * @param username - The username of the voter (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 120) if adapter.recordActivity is available\n * - Invalidates post cache to refetch updated vote data\n * - Invalidates voting power cache to show updated VP\n *\n * **Vote Weight:**\n * - 10000 = 100% upvote\n * - 0 = remove vote\n * - -10000 = 100% downvote\n *\n * @example\n * ```typescript\n * const voteMutation = useVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Upvote a post\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 10000\n * });\n *\n * // Remove vote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 0\n * });\n *\n * // Downvote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: -10000\n * });\n * ```\n *\n * @remarks\n * broadcastMode: async — Votes don't require block confirmation.\n * The vote is accepted into the mempool immediately; UI can optimistically update.\n */\nexport function useVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"vote\"],\n username,\n ({ author, permlink, weight }) => [\n buildVoteOp(username!, author, permlink, weight)\n ],\n async (result: any, variables) => {\n // Optimistic vote list + payout update (no-op when the cache already\n // reflects this vote — see applyVoteCacheUpdate).\n applyVoteCacheUpdate(username, variables);\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(120, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n if (auth?.adapter?.invalidateQueries) {\n const doInvalidate = () => {\n auth.adapter!.invalidateQueries!([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.accounts.full(username)\n ]);\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(doInvalidate, 4000);\n } else {\n doInvalidate();\n }\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildReblogOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Payload for reblogging a post.\n */\nexport interface ReblogPayload {\n /** Original post author */\n author: string;\n /** Original post permlink */\n permlink: string;\n /** If true, removes the reblog instead of creating it */\n deleteReblog?: boolean;\n}\n\n/**\n * React Query mutation hook for reblogging posts.\n *\n * This mutation broadcasts a custom_json operation to reblog (or un-reblog)\n * a post to the user's blog feed.\n *\n * @param username - The username performing the reblog (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 130) if adapter.recordActivity is available\n * - Invalidates blog feed cache to show the reblogged post\n * - Invalidates post cache to update reblog status\n *\n * **Reblog vs Delete:**\n * - deleteReblog: false (default) - Creates a reblog\n * - deleteReblog: true - Removes an existing reblog\n *\n * @example\n * ```typescript\n * const reblogMutation = useReblog(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Reblog a post\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post'\n * });\n *\n * // Remove a reblog\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * deleteReblog: true\n * });\n * ```\n */\nexport function useReblog(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"reblog\"],\n username,\n ({ author, permlink, deleteReblog }) => [\n buildReblogOp(username!, author, permlink, deleteReblog ?? false)\n ],\n async (result: any, variables) => {\n // Optimistic reblog count update\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink);\n if (entry) {\n const newCount = Math.max(0, (entry.reblogs ?? 0) + (variables.deleteReblog ? -1 : 1));\n EntriesCacheManagement.updateReblogsCount(variables.author, variables.permlink, newCount);\n }\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(130, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n const invalidate = () => {\n const qc = getQueryClient();\n qc.invalidateQueries({\n queryKey: QueryKeys.posts.accountPostsBlogPrefix(username!),\n });\n if (auth?.adapter?.invalidateQueries) {\n auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.posts.rebloggedBy(variables.author, variables.permlink),\n ]);\n }\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(invalidate, 4000);\n } else {\n invalidate();\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Beneficiary account and weight.\n */\nexport interface Beneficiary {\n /** Beneficiary account name */\n account: string;\n /** Beneficiary weight (10000 = 100%) */\n weight: number;\n}\n\n/**\n * Payload for creating a comment or post.\n */\nexport interface CommentPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post */\n permlink: string;\n /** Parent author (empty string for top-level posts) */\n parentAuthor: string;\n /** Parent permlink (category/tag for top-level posts) */\n parentPermlink: string;\n /** Title of the post (empty for comments) */\n title: string;\n /** Content body */\n body: string;\n /** JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for creating posts and comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to create a new post or reply on the Hive blockchain.\n *\n * @param username - The username creating the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 100 for posts, 110 for comments) if adapter.recordActivity is available\n * - Invalidates feed caches to show the new content\n * - Invalidates parent post cache if this is a reply\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Post vs Comment:**\n * - Post: parentAuthor = \"\", parentPermlink = category/tag\n * - Comment: parentAuthor = parent author, parentPermlink = parent permlink\n *\n * @example\n * ```typescript\n * const commentMutation = useComment(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a post\n * commentMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post-20260209',\n * parentAuthor: '',\n * parentPermlink: 'technology',\n * title: 'My Awesome Post',\n * body: 'This is the post content...',\n * jsonMetadata: {\n * tags: ['technology', 'hive'],\n * app: 'ecency/3.0.0'\n * },\n * options: {\n * beneficiaries: [\n * { account: 'ecency', weight: 500 }\n * ]\n * }\n * });\n *\n * // Create a comment\n * commentMutation.mutate({\n * author: 'bob',\n * permlink: 're-alice-my-awesome-post-20260209',\n * parentAuthor: 'alice',\n * parentPermlink: 'my-awesome-post-20260209',\n * title: '',\n * body: 'Great post!',\n * jsonMetadata: { app: 'ecency/3.0.0' }\n * });\n * ```\n */\nexport function useComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"comment\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (result: any, variables) => {\n // Determine if this is a post or comment\n const isPost = !variables.parentAuthor;\n const activityType = isPost ? 100 : 110;\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(activityType, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation (always runs regardless of recordActivity outcome)\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (!isPost) {\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * Adds an optimistic entry to all discussions caches for the given root post.\n * Uses predicate matching to find all sort order variants.\n */\nexport function addOptimisticDiscussionEntry(\n entry: Entry,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n queryClient.setQueryData(queryKey, [entry, ...data]);\n }\n }\n}\n\n/**\n * Removes an entry from all discussions caches for the given root post.\n * Returns the previous state for rollback.\n */\nexport function removeOptimisticDiscussionEntry(\n author: string,\n permlink: string,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n): Map {\n const queryClient = qc ?? getQueryClient();\n const snapshots = new Map();\n\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n snapshots.set(queryKey, data);\n queryClient.setQueryData(\n queryKey,\n data.filter(\n (e) => e.author !== author || e.permlink !== permlink\n )\n );\n }\n }\n\n return snapshots;\n}\n\n/**\n * Restores discussion cache snapshots (for rollback on error).\n */\nexport function restoreDiscussionSnapshots(\n snapshots: Map,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n for (const [queryKey, data] of snapshots) {\n queryClient.setQueryData(queryKey, data);\n }\n}\n\n/**\n * Updates a specific entry in the SDK entry cache.\n * Returns the previous entry for rollback.\n */\nexport function updateEntryInCache(\n author: string,\n permlink: string,\n updates: Partial,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n const previous = queryClient.getQueryData(QueryKeys.posts.entry(path));\n\n if (previous) {\n queryClient.setQueryData(QueryKeys.posts.entry(path), {\n ...previous,\n ...updates,\n });\n }\n\n return previous;\n}\n\n/**\n * Restores an entry in cache (for rollback on error).\n */\nexport function restoreEntryInCache(\n author: string,\n permlink: string,\n entry: Entry,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n queryClient.setQueryData(QueryKeys.posts.entry(path), entry);\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDeleteCommentOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport {\n removeOptimisticDiscussionEntry,\n restoreDiscussionSnapshots,\n} from \"../cache/discussions-cache-utils\";\nimport type { Entry } from \"../types\";\n\n/**\n * Payload for deleting a comment or post.\n */\nexport interface DeleteCommentPayload {\n /** Author of the comment/post to delete */\n author: string;\n /** Permlink of the comment/post to delete */\n permlink: string;\n /** Optional: Parent author (for cache invalidation of discussions) */\n parentAuthor?: string;\n /** Optional: Parent permlink (for cache invalidation of discussions) */\n parentPermlink?: string;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n}\n\n/**\n * React Query mutation hook for deleting posts and comments.\n *\n * This mutation broadcasts a delete_comment operation to the Hive blockchain.\n * Includes optimistic removal from discussions cache with rollback on error.\n *\n * @param username - The username deleting the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n */\nexport function useDeleteComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"deleteComment\"],\n username,\n ({ author, permlink }) => [\n buildDeleteCommentOp(author, permlink)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (variables.parentAuthor && variables.parentPermlink) {\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n {\n broadcastMode,\n // Optimistic removal: remove from discussions cache before broadcast\n onMutate: async (variables) => {\n const rootAuthor = variables.rootAuthor || variables.parentAuthor;\n const rootPermlink = variables.rootPermlink || variables.parentPermlink;\n\n if (rootAuthor && rootPermlink) {\n const snapshots = removeOptimisticDiscussionEntry(\n variables.author,\n variables.permlink,\n rootAuthor,\n rootPermlink\n );\n return { snapshots };\n }\n return {};\n },\n // Rollback on error: restore discussions cache\n onError: (_error, _variables, context) => {\n const { snapshots } = (context as { snapshots?: Map }) ?? {};\n if (snapshots) {\n restoreDiscussionSnapshots(snapshots);\n }\n },\n }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Payload for creating a cross-post.\n */\nexport interface CrossPostPayload {\n /** Author of the cross-post (current user) */\n author: string;\n /** Permlink of the cross-post (usually: original-permlink-community-id) */\n permlink: string;\n /** Community ID to cross-post to (used as parent_permlink) */\n parentPermlink: string;\n /** Title of the cross-post (same as original) */\n title: string;\n /** Body of the cross-post (includes reference to original) */\n body: string;\n /** JSON metadata (must include original_author, original_permlink, tags, app) */\n jsonMetadata: Record;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"0.000 HBD\" for declined payout) */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n };\n}\n\n/**\n * React Query mutation hook for creating cross-posts.\n *\n * A cross-post is a special type of post that references an original post\n * and publishes it to a different community.\n *\n * @param username - The username creating the cross-post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates feed/blog caches to show the new cross-post\n *\n * **Operations:**\n * - Always includes a comment operation (with empty parent_author for top-level post)\n * - Optionally includes comment_options operation for rewards/beneficiaries\n *\n * **Metadata Requirements:**\n * The jsonMetadata must include:\n * - `original_author`: Author of the original post\n * - `original_permlink`: Permlink of the original post\n * - `tags`: Tags for the cross-post (typically [\"cross-post\"])\n * - `app`: Application identifier (e.g., \"ecency/3.0.0-vision\")\n *\n * @example\n * ```typescript\n * const crossPostMutation = useCrossPost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a cross-post\n * crossPostMutation.mutate({\n * author: 'alice',\n * permlink: 'great-post-hive-123456',\n * parentPermlink: 'hive-123456', // community ID\n * title: 'Great Post',\n * body: 'This is a cross post of [@bob/great-post](/technology/@bob/great-post) by @alice.

Check this out!',\n * jsonMetadata: {\n * app: 'ecency/3.0.0-vision',\n * tags: ['cross-post'],\n * original_author: 'bob',\n * original_permlink: 'great-post'\n * },\n * options: {\n * maxAcceptedPayout: '0.000 HBD',\n * allowCurationRewards: false\n * }\n * });\n * ```\n */\nexport function useCrossPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"cross-post\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (empty parent_author for top-level post)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n \"\", // empty parent_author for top-level post\n payload.parentPermlink, // community ID\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n } = payload.options;\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n [] // No beneficiaries for cross-posts\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n // Invalidate target community feed so cross-post appears\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.parentPermlink\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\nimport type { Beneficiary } from \"./use-comment\";\n\n/**\n * Payload for updating a reply/comment.\n */\nexport interface UpdateReplyPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post being updated */\n permlink: string;\n /** Parent author */\n parentAuthor: string;\n /** Parent permlink */\n parentPermlink: string;\n /** Title (empty for comments) */\n title: string;\n /** Updated content body */\n body: string;\n /** Updated JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for updating existing replies/comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to update an existing reply/comment on the Hive blockchain.\n *\n * @param username - The username updating the comment (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates parent post cache to reflect the updated comment\n * - Invalidates discussions cache (all sort orders)\n * - Invalidates RC cache (RC decreases after updating)\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Important:**\n * - Updates use the same comment operation as creating new comments\n * - The blockchain identifies this as an update based on matching author/permlink\n * - Only the author can update their own content\n * - Content can only be updated before payout (within 7 days)\n *\n * @example\n * ```typescript\n * const updateReplyMutation = useUpdateReply(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update a reply\n * updateReplyMutation.mutate({\n * author: 'alice',\n * permlink: 're-bob-my-post-20260209',\n * parentAuthor: 'bob',\n * parentPermlink: 'my-post-20260209',\n * title: '',\n * body: 'Updated comment content!',\n * jsonMetadata: {\n * tags: ['comment'],\n * app: 'ecency/3.0.0-vision'\n * },\n * rootAuthor: 'bob',\n * rootPermlink: 'my-post-20260209'\n * });\n * ```\n */\nexport function useUpdateReply(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"update-reply\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (same operation for create and update)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = _result?.id ?? _result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(110, txId, _result?.block_num).catch((error) => {\n console.debug(\"[SDK][Posts][useUpdateReply] recordActivity failed\", {\n activityType: 110,\n blockNum: _result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPromoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for promoting a post using Ecency Points.\n */\nexport interface PromotePayload {\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Promotion duration in days */\n duration: number;\n}\n\n/**\n * React Query mutation hook for promoting posts.\n *\n * This mutation broadcasts a custom_json operation to promote a post\n * using Ecency Points. The post will appear in promoted feeds for the\n * specified duration.\n *\n * @param username - The username promoting the post (required for broadcast, deducts points from this user)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates promoted posts cache to show newly promoted content\n * - Invalidates user points balance\n * - Invalidates post cache to update promotion status\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_promote\"\n * - JSON: {\"user\": \"username\", \"author\": \"postauthor\", \"permlink\": \"postpermlink\", \"duration\": 7}\n * - Authority: Active key (required for point spending)\n *\n * **Cost:**\n * - Costs Ecency Points based on duration\n * - User must have sufficient points balance\n *\n * @example\n * ```typescript\n * const promoteMutation = usePromote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Promote a post for 7 days\n * promoteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-great-post',\n * duration: 7\n * });\n * ```\n */\nexport function usePromote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"ecency\", \"promote\"],\n username,\n ({ author, permlink, duration }) => [\n buildPromoteOp(username!, author, permlink, duration)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate promoted posts feed\n [...QueryKeys.posts._promotedPrefix],\n // Invalidate user points balance\n [...QueryKeys.points._prefix(username!)],\n // Invalidate specific post cache to update promotion status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport type ValidatePostCreatingOptions = {\n delays?: number[];\n};\n\nconst DEFAULT_VALIDATE_POST_DELAYS = [3000, 3000, 3000];\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function getContent(author: string, permlink: string): Promise {\n return callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise;\n}\n\nexport async function validatePostCreating(\n author: string,\n permlink: string,\n attempts = 0,\n options?: ValidatePostCreatingOptions\n) {\n const delays = options?.delays ?? DEFAULT_VALIDATE_POST_DELAYS;\n\n let response: Entry | undefined;\n try {\n response = await getContent(author, permlink);\n } catch (e) {\n response = undefined;\n }\n\n if (response || attempts >= delays.length) {\n return;\n }\n\n const waitMs = delays[attempts];\n if (waitMs > 0) {\n await delay(waitMs);\n }\n\n return validatePostCreating(author, permlink, attempts + 1, options);\n}\n","export * from \"./use-record-activity\";\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ntype ActivityType =\n // Editor related\n | \"post-created\"\n | \"post-updated\"\n | \"post-scheduled\"\n | \"draft-created\"\n | \"video-published\"\n\n // Legacy editor related\n | \"legacy-post-created\"\n | \"legacy-post-updated\"\n | \"legacy-post-scheduled\"\n | \"legacy-draft-created\"\n | \"legacy-video-published\"\n\n // Perks related\n | \"perks-points-by-qr\"\n | \"perks-account-boost\"\n | \"perks-promote\"\n | \"perks-boost-plus\"\n | \"points-claimed\"\n | \"spin-rolled\"\n\n // Signup related\n | \"signed-up-with-wallets\"\n | \"signed-up-with-email\";\n\nexport interface RecordActivityOptions {\n url?: string;\n domain?: string;\n}\n\n/**\n * Get current location info safely (works in browser and Node.js)\n * Returns empty strings in non-browser environments\n */\nfunction getLocationInfo(): { url: string; domain: string } {\n if (typeof window !== \"undefined\" && window.location) {\n return {\n url: window.location.href,\n domain: window.location.host,\n };\n }\n return { url: \"\", domain: \"\" };\n}\n\nexport function useRecordActivity(\n username: string | undefined,\n activityType: ActivityType,\n options?: RecordActivityOptions\n) {\n return useMutation({\n mutationKey: [\"analytics\", activityType],\n mutationFn: async () => {\n if (!activityType) {\n throw new Error(\"[SDK][Analytics] – no activity type provided\");\n }\n const fetchApi = getBoundFetch();\n\n // Use provided values or auto-detect from browser environment\n // Falls back to empty strings in non-browser environments (Node.js, React Native, etc.)\n const locationInfo = getLocationInfo();\n const url = options?.url ?? locationInfo.url;\n const domain = options?.domain ?? locationInfo.domain;\n\n try {\n await fetchApi(CONFIG.plausibleHost + \"/api/event\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: activityType,\n url,\n domain,\n props: {\n username,\n },\n }),\n });\n } catch {\n // Analytics is fire-and-forget - network failures, ad blockers,\n // and CORS issues should not bubble up as user-facing errors\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { LeaderBoardDuration, LeaderBoardItem } from \"../types\";\n\nexport function getDiscoverLeaderboardQueryOptions(duration: LeaderBoardDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-leaderboard\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/leaderboard/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch leaderboard: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { CurationDuration, CurationItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getDiscoverCurationQueryOptions(duration: CurationDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-curation\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/curation/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch curation data: ${response.status}`);\n }\n\n const data = (await response.json()) as CurationItem[];\n\n // Fetch account data for efficiency calculation\n const accounts = data.map((item) => item.account);\n const accountsResponse = await callRPC(\"condenser_api.get_accounts\", [accounts]);\n\n // Calculate efficiency for each curator\n for (let index = 0; index < accountsResponse.length; index++) {\n const element = accountsResponse[index];\n const curator = data[index];\n\n // Convert Asset to string if needed\n const vestingShares = typeof element.vesting_shares === 'string'\n ? element.vesting_shares\n : element.vesting_shares.toString();\n const receivedVestingShares = typeof element.received_vesting_shares === 'string'\n ? element.received_vesting_shares\n : element.received_vesting_shares.toString();\n const delegatedVestingShares = typeof element.delegated_vesting_shares === 'string'\n ? element.delegated_vesting_shares\n : element.delegated_vesting_shares.toString();\n const vestingWithdrawRate = typeof element.vesting_withdraw_rate === 'string'\n ? element.vesting_withdraw_rate\n : element.vesting_withdraw_rate.toString();\n\n const effectiveVest: number =\n parseFloat(vestingShares) +\n parseFloat(receivedVestingShares) -\n parseFloat(delegatedVestingShares) -\n parseFloat(vestingWithdrawRate);\n // `hp` is the reward in Hive Power; the denominator stays in VESTS, which\n // is what the ranking has always compared. Every curator is scaled the\n // same way, so the ordering is unaffected by the unit mismatch.\n curator.efficiency = curator.hp / effectiveVest;\n }\n\n // Sort by efficiency descending\n data.sort((a: CurationItem, b: CurationItem) => b.efficiency - a.efficiency);\n\n return data;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PageStatsResponse } from \"../types\";\n\n/**\n * Get page statistics from the private analytics API\n *\n * @param url - URL to get stats for\n * @param dimensions - Dimensions to query (default: [])\n * @param metrics - Metrics to query (default: [\"visitors\", \"pageviews\", \"visit_duration\"])\n * @param dateRange - Date range for the query (e.g. \"day\", \"7d\", \"30d\", \"all\")\n */\nexport function getPageStatsQueryOptions(\n url: string,\n dimensions: string[] = [],\n metrics: string[] = [\"visitors\", \"pageviews\", \"visit_duration\"],\n dateRange?: string\n) {\n // Sort arrays to ensure stable query keys regardless of input order\n const sortedDimensions = [...dimensions].sort();\n const sortedMetrics = [...metrics].sort();\n\n return queryOptions({\n queryKey: [\"analytics\", \"page-stats\", url, sortedDimensions, sortedMetrics, dateRange],\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/api/stats\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n date_range: dateRange,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch page stats: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!url,\n // Analytics data should always be fresh - users expect current stats when changing range\n staleTime: 0,\n });\n}\n","/**\n * 3Speak takes an 11% beneficiary share on posts that embed one of its videos.\n *\n * This lives in the SDK because the rule is a payout contract that both the web app and the\n * mobile app have to apply identically. It was previously duplicated in each, which meant a\n * change to the weight, or to what counts as an embed, could land on one platform and not the\n * other and silently misroute revenue.\n */\n\n/** A beneficiary route as it appears in `comment_options`. */\nexport interface ThreeSpeakBeneficiaryRoute {\n account: string;\n weight: number;\n src?: string;\n}\n\nexport const THREESPEAK_BENEFICIARY_ACCOUNT = \"threespeakfund\";\n\n/** Beneficiary weight in basis points: 1100 = 11%. */\nexport const THREESPEAK_BENEFICIARY_WEIGHT = 1100;\n\n/**\n * Whether the body embeds a 3Speak video.\n *\n * Matches an actual embed url (e.g. `https://play.3speak.tv/embed?v=user/id`), not a plain\n * text mention of \"3speak.tv/embed\", which would otherwise attach an 11% route to a post that\n * merely talks about 3Speak.\n *\n * `3speak.tv` must be the host, either bare or under dot-delimited subdomains. The previous\n * `[a-z.]*` prefix also matched a lookalike domain such as `fake3speak.tv`, which would have\n * routed 11% of a user's rewards to threespeakfund for a video 3Speak never hosted. Matching\n * is case-insensitive because hostnames are, and a missed match means the route is silently\n * not attached rather than anything failing loudly.\n *\n * Note this requires an `/embed` path segment. The embed url is not built locally, it comes\n * back from 3Speak on upload, so if that shape ever changes this predicate stops recognising\n * it and the route is silently not attached.\n */\nexport function hasThreeSpeakEmbed(body: string): boolean {\n return /https?:\\/\\/([a-z0-9-]+\\.)*3speak\\.tv\\/embed[?/]/i.test(body);\n}\n\n/**\n * Ensures the 3Speak beneficiary is present, at the correct weight, when the body embeds a\n * 3Speak video. Other beneficiaries are preserved and the input is never mutated. Returns the\n * original array reference untouched when there is nothing to change, so callers can use it as\n * a cheap equality check.\n */\nexport function enforceThreeSpeakBeneficiary(\n beneficiaries: T[],\n body: string\n): (T | ThreeSpeakBeneficiaryRoute)[] {\n if (!hasThreeSpeakEmbed(body)) {\n return beneficiaries;\n }\n\n const existing = beneficiaries.find((b) => b.account === THREESPEAK_BENEFICIARY_ACCOUNT);\n\n if (existing && existing.weight === THREESPEAK_BENEFICIARY_WEIGHT) {\n return beneficiaries;\n }\n\n if (existing) {\n return beneficiaries.map((b) =>\n b.account === THREESPEAK_BENEFICIARY_ACCOUNT\n ? { ...b, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n : b\n );\n }\n\n return [\n ...beneficiaries,\n { account: THREESPEAK_BENEFICIARY_ACCOUNT, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n ];\n}\n\n/** Whether a beneficiary entry is the 3Speak route, which the UI locks from editing. */\nexport function isThreeSpeakBeneficiary(account: string): boolean {\n return account === THREESPEAK_BENEFICIARY_ACCOUNT;\n}\n","export * from \"./get-account-token-query-options\";\nexport * from \"./get-account-videos-query-options\";\n","export * from \"./get-decode-memo-query-options\";\n","import { queryOptions } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function getDecodeMemoQueryOptions(\n username: string,\n memo: string,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"hivesigner\", \"decode-memo\", username],\n queryFn: async () => {\n if (accessToken) {\n const hsClient = new hs.Client({\n accessToken,\n });\n return hsClient.decode(memo);\n }\n },\n });\n}\n","import * as queries from \"./queries\";\n\nconst HiveSignerIntegration = {\n queries,\n};\n\nexport { HiveSignerIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveSignerIntegration } from \"../../hivesigner\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\n\nexport function getAccountTokenQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"authenticate\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/login?username=${username}&hivesigner=true`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n const memoQueryOptions =\n HiveSignerIntegration.queries.getDecodeMemoQueryOptions(\n username,\n (await response.json()).memo,\n accessToken\n );\n await getQueryClient().prefetchQuery(memoQueryOptions);\n const { memoDecoded } = getQueryClient().getQueryData(\n memoQueryOptions.queryKey\n );\n\n return memoDecoded.replace(\"#\", \"\");\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ThreeSpeakVideo } from \"../types\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { getAccountTokenQueryOptions } from \"./get-account-token-query-options\";\n\nexport function getAccountVideosQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"videos\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const tokenQueryOptions = getAccountTokenQueryOptions(\n username,\n accessToken\n );\n\n await getQueryClient().prefetchQuery(tokenQueryOptions);\n const token = getQueryClient().getQueryData(tokenQueryOptions.queryKey);\n if (!token) {\n throw new Error(\"[SDK][Integrations][3Speak] – missing account token\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/api/my-videos`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n }\n );\n return (await response.json()) as ThreeSpeakVideo[];\n },\n });\n}\n","export * from \"./types\";\nexport * from \"./functions\";\nimport * as queries from \"./queries\";\n\nconst ThreeSpeakIntegration = {\n queries,\n};\n\nexport { ThreeSpeakIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/core\";\n\nexport function getHivePoshLinksQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"integrations\", \"hiveposh\", \"links\", username],\n retry: false, // Don't retry on user not found errors\n queryFn: async () => {\n try {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://hiveposh.com/api/v0/linked-accounts/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n // Handle 400 error when user is not registered on HivePosh\n if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n // Silently return null for \"User Not Connected\" errors\n if (errorData?.message === \"User Not Connected\") {\n return null;\n }\n }\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n\n return {\n twitter: {\n username: data.twitter_username,\n profile: data.twitter_profile,\n },\n reddit: {\n username: data.reddit_username,\n profile: data.reddit_profile,\n },\n } satisfies Record<\n \"twitter\" | \"reddit\",\n { username: string; profile: string }\n >;\n } catch (err) {\n // Silently handle all HivePosh API errors\n return null;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\n\nexport interface StatsResponse {\n results: [\n {\n metrics: number[];\n dimensions: string[];\n },\n ];\n query: {\n site_id: string;\n metrics: string[];\n date_range: string[];\n filters: string[];\n };\n}\ninterface UseStatsQueryOptions {\n url: string;\n dimensions?: string[];\n metrics?: string[];\n /**\n * Which dimension the `url` is matched against. `event:page` (default) matches\n * any visit that viewed the page; `visit:entry_page` matches only visits that\n * landed on it. The API route validates this against an allow-list.\n */\n filterBy?: \"event:page\" | \"visit:entry_page\";\n /**\n * Plausible `date_range`. Pass a tuple `[from, to]` (ISO `YYYY-MM-DD`) to scope\n * the query — e.g. a post's creation date through today. Scoping is essential:\n * ClickHouse orders events by `(site_id, toDate(timestamp), …)` and partitions\n * by month, so a bounded range prunes to a few granules instead of scanning the\n * whole history. Omitting it falls back to the route default (`\"all\"`), which on\n * a high-traffic site is a multi-second full scan. Plausible also accepts the\n * relative keywords `\"day\"`, `\"7d\"`, `\"30d\"`, `\"all\"`.\n */\n dateRange?: string | [string, string];\n enabled?: boolean;\n}\n\nexport function getStatsQueryOptions({\n url,\n dimensions = [],\n metrics = [\"visitors\", \"pageviews\", \"visit_duration\"],\n filterBy = \"event:page\",\n dateRange,\n enabled = true,\n}: UseStatsQueryOptions) {\n return queryOptions({\n queryKey: [\"integrations\", \"plausible\", url, dimensions, metrics, filterBy, dateRange],\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(`${CONFIG.privateApiHost}/api/stats`, {\n method: \"POST\",\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n filterBy,\n // Only forward a range when set, so the route keeps owning the default.\n ...(dateRange ? { date_range: dateRange } : {}),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // The proxy route returns 5xx (504/502) with an empty body on a Plausible\n // timeout/transport error, and Plausible itself can return a 4xx error JSON.\n // Without this guard those parse into an object with no `results`, and the UI\n // silently renders 0 — indistinguishable from a real zero. Throw instead so\n // React Query surfaces the error and retries.\n if (!response.ok) {\n throw new Error(`Failed to fetch Plausible stats: ${response.status}`);\n }\n\n return (await response.json()) as StatsResponse;\n },\n enabled: !!url && enabled,\n // Stats queries are now date-scoped and cheap; a single retry rides out a\n // transient slow scan without re-introducing the all-time pile-up.\n retry: 1,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRcStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"resource-credits\", \"stats\"],\n queryFn: async () => {\n const response = await callRPC(\"rc_api.get_rc_stats\", {});\n return response.rc_stats;\n },\n });\n}\n","import { callRPC } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getAccountRcQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"resource-credits\", \"account\", username],\n queryFn: async (): Promise => {\n const result = await callRPC(\"rc_api.find_rc_accounts\", {\n accounts: [username],\n });\n return result.rc_accounts;\n },\n enabled: !!username,\n });\n}\n","import { calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport type { RcStats } from \"../types/stats\";\n\n/**\n * Operations the RC pre-check can estimate. Mirrors the keys exposed by\n * `rc_api.get_rc_stats` (see {@link RcStats}[\"ops\"]).\n */\nexport type RcPrecheckOperation = keyof RcStats[\"ops\"];\n\nexport interface RcPrecheckInput {\n /** From `getAccountRcQueryOptions(username)` -> rcAccounts[0]. */\n rcAccount: RCAccount | null | undefined;\n /** From `getRcStatsQueryOptions()`. */\n rcStats: RcStats | null | undefined;\n /** The operation the user is about to broadcast. */\n operation: RcPrecheckOperation;\n /**\n * Safety multiplier applied to the average operation cost when deciding\n * whether the broadcast will \"likely fail\". Actual on-chain cost varies with\n * network load, so we keep headroom. Defaults to 1.2.\n */\n buffer?: number;\n}\n\nexport interface RcPrecheckResult {\n /** Both inputs were available, so the estimate is meaningful. */\n ready: boolean;\n /** Current RC mana of the account. */\n currentMana: number;\n /** Maximum RC mana of the account. */\n maxMana: number;\n /** Average RC cost of the operation. */\n avgCost: number;\n /** Average cost padded by `buffer`. */\n estimatedCost: number;\n /** `currentMana` is below the padded estimate -> broadcast likely fails. */\n willLikelyFail: boolean;\n /** RC shortfall vs the padded estimate (0 when not failing). */\n deficit: number;\n /** Roughly how many such operations the account can still afford. */\n remaining: number;\n}\n\nconst EMPTY: RcPrecheckResult = {\n ready: false,\n currentMana: 0,\n maxMana: 0,\n avgCost: 0,\n estimatedCost: 0,\n willLikelyFail: false,\n deficit: 0,\n remaining: 0,\n};\n\n/**\n * Pure, client-side estimate of whether an account has enough Resource Credits\n * to broadcast an operation, used to warn the user BEFORE they submit instead\n * of failing afterwards with the chain's \"Please wait to transact\" error.\n *\n * It is intentionally approximate: it uses the network-wide average cost from\n * `rc_api.get_rc_stats`, padded by a buffer. Treat `willLikelyFail` as a hint,\n * never a hard gate - the publish/comment/vote action must stay non-blocking.\n */\nexport function estimateRcPrecheck({\n rcAccount,\n rcStats,\n operation,\n buffer = 1.2,\n}: RcPrecheckInput): RcPrecheckResult {\n if (!rcAccount || !rcStats?.ops) {\n return EMPTY;\n }\n\n const { current_mana: currentMana, max_mana: maxMana } = calculateRCMana(rcAccount);\n const avgCost = Number(rcStats.ops[operation]?.avg_cost ?? 0);\n\n if (!(avgCost > 0)) {\n return { ...EMPTY, ready: true, currentMana, maxMana };\n }\n\n const safeBuffer = Number.isFinite(buffer) && buffer > 0 ? buffer : 1.2;\n const estimatedCost = avgCost * safeBuffer;\n const willLikelyFail = currentMana < estimatedCost;\n\n return {\n ready: true,\n currentMana,\n maxMana,\n avgCost,\n estimatedCost,\n willLikelyFail,\n deficit: willLikelyFail ? Math.ceil(estimatedCost - currentMana) : 0,\n remaining: Math.floor(currentMana / avgCost),\n };\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetGameStatus } from \"../types\";\n\nexport function getGameStatusCheckQueryOptions(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\"\n) {\n return queryOptions({\n queryKey: [\"games\", \"status-check\", gameType, username],\n enabled: !!username && !!code,\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/get-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()) as GetGameStatus;\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { GameClaim } from \"../types\";\nimport { useRecordActivity } from \"@/modules/analytics/mutations\";\n\nexport function useGameClaim(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\",\n key: string\n) {\n const { mutateAsync: recordActivity } = useRecordActivity(\n username,\n \"spin-rolled\"\n );\n\n return useMutation({\n mutationKey: [\"games\", \"post\", gameType, username],\n mutationFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/post-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n key,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (await response.json()) as GameClaim;\n },\n onSuccess() {\n recordActivity();\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { QuestsResponse } from \"../types\";\n\n/**\n * Read-only daily/weekly/monthly quest progress for a user. Aggregates the existing\n * points ledger (no auth required — same sensitivity as `/private-api/points`).\n */\nexport function getQuestsQueryOptions(username: string | undefined) {\n const name = username?.replace(\"@\", \"\");\n return queryOptions({\n queryKey: QueryKeys.quests.status(name),\n enabled: !!name,\n queryFn: async () => {\n if (!name) {\n throw new Error(\"[SDK][Quests] – username wasn't provided\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/quests\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ username: name }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch quests: ${response.status}`);\n }\n\n return (await response.json()) as QuestsResponse;\n },\n staleTime: 30000,\n refetchOnMount: true,\n });\n}\n","/**\n * Shared quest catalog — the single source of truth for which quests exist, their\n * encouraging goals, copy keys and icon hints. Lives in the SDK so the web and mobile\n * clients render an identical, harmonized set. The backend (`/private-api/quests`)\n * returns raw progress + the reward `cap`; this catalog layers the presentation.\n *\n * `goal` is an *encouraging, reachable* daily target and is intentionally independent of\n * the backend reward `cap` (the point at which the existing reward decays to ~0). It is\n * tunable here without any backend change.\n */\n\nexport type QuestTier = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface QuestCatalogEntry {\n id: string;\n tier: QuestTier;\n /** encouraging, reachable target for the period (tunable, not the reward cap) */\n goal: number;\n /** i18n key suffix; clients resolve e.g. `quests..title` / `.desc` */\n i18nKey: string;\n /** semantic icon hint; each client maps it to its own icon set */\n icon: string;\n}\n\nexport const QUEST_CATALOG: QuestCatalogEntry[] = [\n // Daily\n { id: \"checkin\", tier: \"daily\", goal: 1, i18nKey: \"checkin\", icon: \"check-circle\" },\n { id: \"post\", tier: \"daily\", goal: 1, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"daily\", goal: 3, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"daily\", goal: 10, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"daily\", goal: 1, i18nKey: \"reblog\", icon: \"repeat\" },\n { id: \"spin\", tier: \"daily\", goal: 1, i18nKey: \"spin\", icon: \"gift\" },\n // Weekly\n { id: \"post\", tier: \"weekly\", goal: 5, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"weekly\", goal: 15, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"weekly\", goal: 50, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"weekly\", goal: 5, i18nKey: \"reblog\", icon: \"repeat\" },\n // Monthly\n { id: \"post\", tier: \"monthly\", goal: 20, i18nKey: \"post\", icon: \"pencil\" },\n];\n\nexport function getQuestCatalogEntry(tier: QuestTier, id: string) {\n return QUEST_CATALOG.find((q) => q.tier === tier && q.id === id);\n}\n\n// Streak Freeze display config. MIRRORS the ePoints constants\n// (STREAK_FREEZE_PRICE / STREAK_FREEZE_MAX_OWNED) — the server is the source of truth\n// and validates every purchase; these drive the label + button state only, so a drift\n// here never over-charges (the buy is priced server-side).\nexport const STREAK_FREEZE_PRICE = 300;\nexport const STREAK_FREEZE_MAX_OWNED = 2;\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { StreakFreezeBuyResult } from \"../types\";\n\n/** A fresh idempotency key per purchase; guarded for runtimes without crypto.randomUUID. */\nfunction genIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * POST a single streak-freeze purchase. Throws on a non-2xx with the server's\n * `.status` + parsed `.data` attached so the caller can branch on 402 (insufficient)\n * / 409 (max owned). Exported for unit testing; the hook below wraps it.\n */\nexport async function buyStreakFreezeRequest(\n code: string\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/streak-freeze/buy\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code, idempotency_key: genIdempotencyKey() }),\n }\n );\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to buy streak freeze: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as StreakFreezeBuyResult;\n}\n\n/**\n * Buy one streak freeze (a Points-only sink). The server debits Points, caps owned\n * inventory, and is idempotent per key. On success the quests + points caches are\n * invalidated so the owned count and balance refresh. A 402 (insufficient) / 409 (max\n * owned) is rethrown with `.status` + `.data` so the caller can route to a Points top-up.\n */\nexport function useBuyStreakFreeze(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"streak-freeze\", \"buy\", name],\n mutationFn: async () => {\n if (!name || !code) {\n throw new Error(\"[SDK][StreakFreeze] – missing auth\");\n }\n return buyStreakFreezeRequest(code);\n },\n onSuccess() {\n // Balance only changes on a successful debit.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.points._prefix(name) });\n }\n },\n onSettled() {\n // Refresh freezes_owned on success AND error: a 409 (max owned) means the\n // client's count is stale, and without this the \"Protect streak\" button would\n // never hide and the user could keep re-triggering 409s.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.quests.status(name) });\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for subscribing to a community.\n */\nexport interface SubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for subscribing to a community.\n *\n * This mutation broadcasts a subscribe operation to the Hive blockchain,\n * adding the community to the user's subscription list.\n *\n * @param username - The username subscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"subscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const subscribeMutation = useSubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Subscribe to a community\n * subscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useSubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"subscribe\"],\n username,\n ({ community }) => [\n buildSubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnsubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unsubscribing from a community.\n */\nexport interface UnsubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for unsubscribing from a community.\n *\n * This mutation broadcasts an unsubscribe operation to the Hive blockchain,\n * removing the community from the user's subscription list.\n *\n * @param username - The username unsubscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"unsubscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const unsubscribeMutation = useUnsubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unsubscribe from a community\n * unsubscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useUnsubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"unsubscribe\"],\n username,\n ({ community }) => [\n buildUnsubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildMutePostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for muting/unmuting a post in a community.\n */\nexport interface MutePostPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Mute reason/notes (required even for unmute) */\n notes: string;\n /** True to mute, false to unmute */\n mute: boolean;\n}\n\n/**\n * React Query mutation hook for muting/unmuting posts in a community.\n *\n * This mutation broadcasts a custom_json operation to mute (or unmute)\n * a post within a community. Only community moderators/admins can mute posts.\n *\n * @param username - The username performing the mute (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community posts cache to hide muted content\n * - Invalidates post cache to update mute status\n * - Invalidates feed cache to remove muted posts from feeds\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"mutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Action (unmute): [\"unmutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Authority: Posting key\n *\n * **Mute vs Unmute:**\n * - mute: true - Mutes the post (hides from community feed)\n * - mute: false - Unmutes the post (restores to community feed)\n *\n * **Permission:**\n * - Only community moderators and admins can mute/unmute posts\n * - Attempting to mute without permission will fail with an error\n *\n * @example\n * ```typescript\n * const mutePostMutation = useMutePost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Mute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Violates community guidelines',\n * mute: true\n * });\n *\n * // Unmute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Resolved after editing',\n * mute: false\n * });\n * ```\n */\nexport function useMutePost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"mutePost\"],\n username,\n ({ community, author, permlink, notes, mute }) => [\n buildMutePostOp(username!, community, author, permlink, notes, mute)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n // Invalidate specific post cache to update mute status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n // Invalidate community data\n [\"community\", \"single\", variables.community],\n // Invalidate community feed/posts (matches all sort orders, limits, observers)\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.community\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetRoleOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community, CommunityTeam } from \"../types\";\n\n/**\n * Payload for setting a user's role in a community.\n */\nexport interface SetCommunityRolePayload {\n /** Account to set role for */\n account: string;\n /** Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\") */\n role: string;\n}\n\n/**\n * React Query mutation hook for setting a user's role in a community.\n *\n * This mutation broadcasts a setRole operation to the Hive blockchain,\n * updating the role of a community member. Only users with appropriate\n * permissions (community owner/admin) can set roles.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username setting the role (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated team member list\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"setRole\", {\"community\": \"hive-123456\", \"account\": \"user\", \"role\": \"mod\"}]\n * - Authority: Posting key\n *\n * **Role Types:**\n * - \"owner\" - Community owner (full permissions)\n * - \"admin\" - Administrator (can manage settings and team)\n * - \"mod\" - Moderator (can mute posts/users)\n * - \"member\" - Regular member (no special permissions)\n * - \"guest\" - Remove user from team (empty string also works)\n *\n * @example\n * ```typescript\n * const setRoleMutation = useSetCommunityRole('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Set a user as moderator\n * setRoleMutation.mutate({\n * account: 'alice',\n * role: 'mod'\n * });\n *\n * // Remove a user from the team\n * setRoleMutation.mutate({\n * account: 'bob',\n * role: 'guest'\n * });\n * ```\n */\nexport function useSetCommunityRole(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"set-role\", community],\n username,\n ({ account, role }) => [\n buildSetRoleOp(username!, community, account, role)\n ],\n async (_result: any, variables) => {\n // Optimistic team update in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n const team: CommunityTeam = [...(prev.team ?? [])];\n const idx = team.findIndex(([name]) => name === variables.account);\n if (idx >= 0) {\n team[idx] = [team[idx][0], variables.role, team[idx][2] ?? \"\"];\n } else {\n team.push([variables.account, variables.role, \"\"]);\n }\n return { ...prev, team };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries + context for affected user\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)],\n QueryKeys.communities.context(variables.account, community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUpdateCommunityOp, type CommunityProps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community } from \"../types\";\n\n/**\n * Payload for updating community properties.\n * Matches the CommunityProps interface from builders.\n */\nexport type UpdateCommunityPayload = CommunityProps;\n\n/**\n * React Query mutation hook for updating community properties.\n *\n * This mutation broadcasts an updateProps operation to the Hive blockchain,\n * modifying the community's metadata and settings. Only community admins\n * can update community properties.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username updating the community (required for broadcast, must be admin)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated properties\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"updateProps\", {\"community\": \"hive-123456\", \"props\": {...}}]\n * - Authority: Posting key\n *\n * **Properties:**\n * - title - Community display title\n * - about - Short description/tagline\n * - lang - Primary language code (e.g., \"en\")\n * - description - Full community description (markdown supported)\n * - flag_text - Custom text shown when flagging posts\n * - is_nsfw - Whether community contains NSFW content\n *\n * @example\n * ```typescript\n * const updateMutation = useUpdateCommunity('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update community properties\n * updateMutation.mutate({\n * title: 'My Awesome Community',\n * about: 'A place for awesome people',\n * lang: 'en',\n * description: '# Welcome\\nThis is our community description',\n * flag_text: 'Please explain why this content violates our rules',\n * is_nsfw: false\n * });\n * ```\n */\nexport function useUpdateCommunity(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"update\", community],\n username,\n (props) => [\n buildUpdateCommunityOp(username!, community, props)\n ],\n async (_result: any, variables) => {\n // Optimistic property merge in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n return { ...prev, ...(variables as unknown as Partial) };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)]\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommunityRegistrationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for community rewards registration.\n */\nexport interface CommunityRewardsRegisterPayload {\n /** Community account name (usually the community creator's account) */\n name: string;\n}\n\n/**\n * React Query mutation hook for registering to receive community rewards.\n *\n * This mutation broadcasts a custom_json operation to register a community\n * account to receive Ecency Points rewards for community activity.\n *\n * @param username - The username registering for community rewards (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to update registration status\n * - Invalidates points balance to reflect potential initial rewards\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_registration\"\n * - JSON: {\"name\": \"communityname\"}\n * - Authority: Active key (required for registration)\n *\n * **Purpose:**\n * - Enables communities to receive Ecency Points for activity\n * - One-time registration per community\n * - Can only be done by the community owner/creator\n *\n * @example\n * ```typescript\n * const registerMutation = useRegisterCommunityRewards(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Register community for rewards\n * registerMutation.mutate({\n * name: 'hive-123456'\n * });\n * ```\n */\nexport function useRegisterCommunityRewards(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"registerRewards\"],\n username,\n ({ name }) => [\n buildCommunityRegistrationOp(name)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate community cache to update registration status\n [...QueryKeys.communities.singlePrefix(variables.name)],\n // Invalidate points balance\n [...QueryKeys.points._prefix(username!)],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPinPostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface PinPostPayload {\n community: string;\n account: string;\n permlink: string;\n pin: boolean;\n}\n\nexport function usePinPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"pin-post\"],\n username,\n ({ community, account, permlink, pin }) => [\n buildPinPostOp(username!, community, account, permlink, pin)\n ],\n async (_result, variables) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.account}/${variables.permlink}`),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Communities } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunitiesQueryOptions(\n sort: string,\n query?: string,\n limit = 100,\n observer: string | undefined = undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.list(sort, query ?? \"\", limit),\n enabled,\n queryFn: async () => {\n const response = await callRPC(\"bridge.list_communities\", {\n last: \"\",\n limit,\n sort: sort === \"hot\" ? \"rank\" : sort,\n query: query ? query : null,\n observer,\n });\n return (\n response\n ? sort === \"hot\"\n ? response.sort(() => Math.random() - 0.5)\n : response\n : []\n ) as Communities;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { CommunityRole } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunityContextQueryOptions(\n username: string | undefined,\n communityName: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.context(username!, communityName!),\n enabled: !!username && !!communityName,\n queryFn: async () => {\n const response = await callRPC(\"bridge.get_community_context\", {\n account: username,\n name: communityName,\n });\n\n return {\n role: response?.role ?? \"guest\",\n subscribed: response?.subscribed ?? false,\n } satisfies {\n role: CommunityRole;\n subscribed: boolean;\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Community } from \"../types/community\";\nimport { getCommunity } from \"@/modules/bridge\";\nimport { QueryKeys } from \"@/modules/core\";\n\nexport function getCommunityQueryOptions(\n name: string | undefined,\n observer: string | undefined = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.single(name, observer),\n enabled: enabled && !!name,\n queryFn: async () => getCommunity(name ?? \"\", observer) as Promise,\n });\n}\n","import {\n InfiniteData,\n infiniteQueryOptions,\n queryOptions\n} from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Subscription } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * hivemind caps `bridge.list_subscribers` at 100 rows per call, regardless of a\n * larger requested limit.\n */\nexport const SUBSCRIBERS_PAGE_SIZE = 100;\n\ntype SubscribersPage = Subscription[];\ntype SubscribersCursor = string | null;\n\n/**\n * Fetches one page of subscribers.\n *\n * `last` is omitted on the first page rather than passed as an empty string:\n * hivemind reads `\"\"` as a real cursor positioned before the first account and\n * returns zero rows.\n */\nasync function fetchSubscribersPage(\n communityName: string,\n last: SubscribersCursor\n): Promise {\n const response = await callRPC(\"bridge.list_subscribers\", {\n community: communityName,\n limit: SUBSCRIBERS_PAGE_SIZE,\n ...(last ? { last } : {})\n });\n return (response as Subscription[] | null) ?? [];\n}\n\n/**\n * Get the first page of subscribers for a community.\n *\n * @deprecated Returns at most {@link SUBSCRIBERS_PAGE_SIZE} subscribers, which\n * for most communities is a small fraction of the total while looking like the\n * complete list. Prefer {@link getCommunitySubscribersInfiniteQueryOptions}\n * unless a single page is genuinely all that is wanted.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersQueryOptions(communityName: string) {\n return queryOptions({\n queryKey: QueryKeys.communities.subscribers(communityName),\n queryFn: async () => fetchSubscribersPage(communityName, null),\n staleTime: 60000\n });\n}\n\n/**\n * Get all subscribers for a community, paged with hivemind's `last` cursor.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersInfiniteQueryOptions(\n communityName: string\n) {\n return infiniteQueryOptions<\n SubscribersPage,\n Error,\n InfiniteData,\n string[],\n SubscribersCursor\n >({\n queryKey: QueryKeys.communities.subscribersInfinite(communityName),\n initialPageParam: null as SubscribersCursor,\n queryFn: async ({ pageParam }: { pageParam: SubscribersCursor }) =>\n fetchSubscribersPage(communityName, pageParam),\n // The cursor is the previous page's last account name. A short page is the\n // end of the list.\n getNextPageParam: (lastPage: SubscribersPage): SubscribersCursor =>\n lastPage?.length >= SUBSCRIBERS_PAGE_SIZE\n ? lastPage[lastPage.length - 1]?.[0] ?? null\n : null,\n staleTime: 60000\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountNotification } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype NotifPage = AccountNotification[];\ntype NotifCursor = number | null;\n\n/**\n * Get account notifications for a community (bridge API)\n *\n * @param account - The account/community name\n * @param limit - Number of notifications per page\n */\nexport function getAccountNotificationsInfiniteQueryOptions(\n account: string,\n limit: number\n) {\n return infiniteQueryOptions<\n NotifPage,\n Error,\n InfiniteData,\n (string | number)[],\n NotifCursor\n >({\n queryKey: QueryKeys.communities.accountNotifications(account, limit),\n initialPageParam: null as NotifCursor,\n\n // Errors are deliberately not caught. Returning [] on failure made an RPC\n // outage indistinguishable from an empty log: `isError` never became true,\n // so consumers rendered \"no activity\" for a failed request, and a failed\n // page produced no cursor and silently ended pagination. Let React Query\n // own the error so `isError` and retry behave normally.\n queryFn: async ({ pageParam }: { pageParam: NotifCursor }) => {\n const response = await callRPC(\"bridge.account_notifications\", {\n account,\n limit,\n last_id: pageParam ?? undefined,\n });\n return (response as AccountNotification[] | null) ?? [];\n },\n\n // A short page is the end of the log. Keying on \"empty\" alone would also\n // treat a truncated page as the end.\n getNextPageParam: (lastPage: NotifPage): NotifCursor =>\n lastPage?.length >= limit ? lastPage[lastPage.length - 1].id : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { RewardedCommunity } from \"../types/rewarded-community\";\n\nexport function getRewardedCommunitiesQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.communities.rewarded(),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/rewarded-communities\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch rewarded communities: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","export enum ROLES {\n OWNER = \"owner\",\n ADMIN = \"admin\",\n MOD = \"mod\",\n MEMBER = \"member\",\n GUEST = \"guest\",\n MUTED = \"muted\",\n}\n\nexport const roleMap: Record = {\n [ROLES.OWNER]: [\n ROLES.ADMIN,\n ROLES.MOD,\n ROLES.MEMBER,\n ROLES.GUEST,\n ROLES.MUTED,\n ],\n [ROLES.ADMIN]: [ROLES.MOD, ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n [ROLES.MOD]: [ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n};\n\nexport type CommunityTeam = Array>;\nexport type CommunityRole = (typeof ROLES)[keyof typeof ROLES]; // \"owner\" | \"member\" | ...\nexport type CommunityType = \"Topic\" | \"Journal\" | \"Council\";\n\nexport interface Community {\n about: string;\n admins?: string[];\n avatar_url: string;\n created_at: string;\n description: string;\n flag_text: string;\n id: number;\n is_nsfw: boolean;\n lang: string;\n name: string;\n num_authors: number;\n num_pending: number;\n subscribers: number;\n sum_pending: number;\n settings?: any;\n team: CommunityTeam;\n title: string;\n type_id: number;\n}\n\nexport type Communities = Community[];\n","import { CommunityRole, CommunityType, ROLES } from \"../types\";\n\nexport function getCommunityType(name: string, type_id: number): CommunityType {\n if (name.startsWith(\"hive-3\") || type_id === 3) return \"Council\";\n if (name.startsWith(\"hive-2\") || type_id === 2) return \"Journal\";\n return \"Topic\";\n}\n\nexport function getCommunityPermissions({\n communityType,\n userRole,\n subscribed,\n}: {\n communityType: CommunityType;\n userRole: CommunityRole;\n subscribed: boolean;\n}) {\n const canPost = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n if (communityType === \"Topic\") return true;\n\n // Journal & Council\n return [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD, ROLES.MEMBER].includes(\n userRole\n );\n })();\n\n const canComment = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n switch (communityType) {\n case \"Topic\":\n return true;\n case \"Journal\":\n return userRole !== ROLES.GUEST || subscribed;\n case \"Council\":\n return canPost;\n }\n })();\n\n const isModerator = [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD].includes(userRole);\n\n return {\n canPost,\n canComment,\n isModerator,\n };\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getNotificationsUnreadCountQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.unreadCount(activeUsername),\n queryFn: async () => {\n if (!code) {\n return 0;\n }\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/notifications/unread`,\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n const data = (await response.json()) as { count: number };\n return data.count;\n },\n enabled: !!activeUsername && !!code,\n initialData: 0,\n refetchInterval: 60000,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { NotificationFilter } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ApiNotification } from \"../types\";\n\nexport function getNotificationsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n filter: NotificationFilter | undefined = undefined\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.notifications.list(activeUsername, filter),\n queryFn: async ({ pageParam }) => {\n if (!code) {\n return [];\n }\n const data = {\n code,\n filter,\n since: pageParam,\n user: undefined,\n };\n\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/notifications\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }\n );\n\n if (!response.ok) {\n return [];\n }\n\n try {\n return (await response.json()) as ApiNotification[];\n } catch {\n return [];\n }\n },\n enabled: !!activeUsername && !!code,\n initialData: { pages: [], pageParams: [] },\n initialPageParam: \"\",\n getNextPageParam: (lastPage) => lastPage?.[lastPage.length - 1]?.id ?? \"\",\n refetchOnMount: true,\n });\n}\n","export enum NotificationFilter {\n VOTES = \"rvotes\",\n MENTIONS = \"mentions\",\n FAVORITES = \"nfavorites\",\n BOOKMARKS = \"nbookmarks\",\n FOLLOWS = \"follows\",\n REPLIES = \"replies\",\n REBLOGS = \"reblogs\",\n TRANSFERS = \"transfers\",\n DELEGATIONS = \"delegations\",\n PAYOUTS = \"payouts\",\n SCHEDULED_PUBLISHED = \"scheduled_published\",\n // Filter path is plural while the notification `type` string is singular\n // (`account_update`) - enotify routes on the plural form.\n ACCOUNT_UPDATES = \"account_updates\",\n WEEKLY_EARNINGS = \"weekly_earnings\",\n}\n","// Values are enotify's ACTIVITY_MAIN_TYPE_* ints and are validated server-side at\n// device registration, so they must match enotify constants.py exactly. Note payouts\n// is 19: the original 16 is commented out upstream and must not be reused.\nexport enum NotifyTypes {\n VOTE = 1,\n MENTION = 2,\n FOLLOW = 3,\n COMMENT = 4,\n RE_BLOG = 5,\n TRANSFERS = 6,\n DELEGATIONS = 10,\n FAVORITES = 13,\n BOOKMARKS = 15,\n PAYOUTS = 19,\n ACCOUNT_UPDATE = 20,\n WEEKLY_EARNINGS = 21,\n SCHEDULED_PUBLISHED = 22,\n ALLOW_NOTIFY = \"ALLOW_NOTIFY\",\n}\n\nexport const ALL_NOTIFY_TYPES = [\n NotifyTypes.VOTE,\n NotifyTypes.MENTION,\n NotifyTypes.FOLLOW,\n NotifyTypes.COMMENT,\n NotifyTypes.RE_BLOG,\n NotifyTypes.TRANSFERS,\n NotifyTypes.DELEGATIONS,\n NotifyTypes.FAVORITES,\n NotifyTypes.BOOKMARKS,\n NotifyTypes.PAYOUTS,\n NotifyTypes.ACCOUNT_UPDATE,\n NotifyTypes.WEEKLY_EARNINGS,\n NotifyTypes.SCHEDULED_PUBLISHED,\n] as const;\n\nexport enum NotificationViewType {\n ALL = \"All\",\n UNREAD = \"Unread\",\n READ = \"Read\",\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ApiNotificationSetting } from \"../types\";\nimport { ALL_NOTIFY_TYPES } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getNotificationsSettingsQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n initialMuted?: boolean\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.settings(activeUsername),\n queryFn: async () => {\n let token = activeUsername + \"-web\";\n if (!code) {\n throw new Error(\"Missing access token\");\n }\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/detail-device\",\n {\n body: JSON.stringify({\n code,\n username: activeUsername,\n token,\n }),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch notification settings: ${response.status}`);\n }\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n refetchOnMount: false,\n initialData: () => {\n return {\n status: 0,\n system: \"web\",\n allows_notify: 0,\n notify_types: initialMuted ? [] : ([...ALL_NOTIFY_TYPES] as number[]),\n } as ApiNotificationSetting;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Announcement } from \"../types/announcement\";\n\nexport function getAnnouncementsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.notifications.announcements(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/announcements\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch announcements: ${response.status}`);\n }\n\n const data = await response.json() as Announcement[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Spotlight } from \"../types/spotlight\";\n\n// `_accessToken` is accepted for call-site parity with mobile (which passes one) but is\n// intentionally unused: the spotlights endpoint is anonymous and only filters by date window.\nexport function getSpotlightsQueryOptions(_accessToken?: string) {\n return queryOptions({\n queryKey: QueryKeys.notifications.spotlights(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/spotlights\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch spotlights: ${response.status}`);\n }\n\n const data = (await response.json()) as Spotlight[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { useMutation, QueryKey, InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { markNotifications } from \"@/modules/private-api/requests\";\nimport { ApiNotification } from \"../types\";\n\ntype NotificationPage = ApiNotification[];\ntype InfiniteNotificationData = InfiniteData;\n\nfunction markNotificationRead(item: ApiNotification, id?: string): ApiNotification {\n return {\n ...item,\n read: (!id || id === item.id ? 1 : item.read) as 0 | 1,\n };\n}\n\nfunction isInfiniteData(data: unknown): data is InfiniteNotificationData {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"pages\" in data &&\n \"pageParams\" in data &&\n Array.isArray((data as InfiniteNotificationData).pages)\n );\n}\n\n/**\n * Hook to mark notifications as read with optimistic updates\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful mutation, receives unread count\n * @param onError - Optional callback on error\n *\n * @returns Mutation hook that accepts { id?: string }\n *\n * @example\n * ```typescript\n * const markAsRead = useMarkNotificationsRead(username, code);\n *\n * // Mark specific notification\n * markAsRead.mutate({ id: \"notification-id\" });\n *\n * // Mark all notifications (omit id)\n * markAsRead.mutate({});\n * ```\n */\nexport function useMarkNotificationsRead(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: (unreadCount?: number) => void,\n onError?: (e: Error) => void\n) {\n const queryClient = getQueryClient();\n\n return useMutation({\n mutationKey: [\"notifications\", \"mark-read\", username],\n\n mutationFn: async ({ id }: { id?: string }) => {\n if (!username || !code) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[SDK][Notifications] – missing auth for markNotifications\");\n }\n return;\n }\n return markNotifications(code, id);\n },\n\n // Optimistic update: Immediately mark notifications as read in cache\n onMutate: async ({ id }: { id?: string }) => {\n // Skip optimistic updates when auth is not available\n if (!username || !code) {\n return { previousData: [] };\n }\n\n // Cancel any outgoing refetches to prevent overwriting optimistic update\n await queryClient.cancelQueries({ queryKey: QueryKeys.notifications._prefix });\n\n // Snapshot current state for rollback\n const previousData: Array<[QueryKey, unknown]> = [];\n\n // Update infinite notification list queries (pages structure)\n const infiniteQueries = queryClient.getQueriesData({\n queryKey: QueryKeys.notifications._prefix,\n predicate: (query) => {\n const data = query.state.data;\n return isInfiniteData(data);\n },\n });\n\n infiniteQueries.forEach(([queryKey, data]) => {\n if (data && isInfiniteData(data)) {\n previousData.push([queryKey, data]);\n\n const updatedData: InfiniteNotificationData = {\n ...data,\n pages: data.pages.map((page) =>\n page.map((item) => markNotificationRead(item, id))\n ),\n };\n\n queryClient.setQueryData(queryKey, updatedData);\n }\n });\n\n // Optimistically decrement unread count\n const unreadKey = QueryKeys.notifications.unreadCount(username);\n const currentUnread = queryClient.getQueryData(unreadKey);\n if (typeof currentUnread === \"number\" && currentUnread > 0) {\n previousData.push([unreadKey, currentUnread]);\n\n if (!id) {\n // Mark all: set to 0\n queryClient.setQueryData(unreadKey, 0);\n } else {\n // Mark single: only decrement if the notification is currently unread\n const isUnread = infiniteQueries.some(([, d]) =>\n d?.pages.some((page) =>\n page.some((item) => item.id === id && item.read === 0)\n )\n );\n if (isUnread) {\n queryClient.setQueryData(unreadKey, currentUnread - 1);\n }\n }\n }\n\n // Return context for rollback\n return { previousData };\n },\n\n onSuccess: (response) => {\n // Extract unread count from response if available\n const unreadCount = typeof response === \"object\" && response !== null\n ? (response as { unread?: number }).unread\n : undefined;\n\n // Update unread count cache with server value\n if (typeof unreadCount === \"number\") {\n queryClient.setQueryData(\n QueryKeys.notifications.unreadCount(username),\n unreadCount\n );\n }\n\n onSuccess?.(unreadCount);\n },\n\n // Rollback optimistic update on error\n onError: (error, _variables, context) => {\n // Restore previous state\n if (context?.previousData) {\n context.previousData.forEach(([queryKey, data]) => {\n queryClient.setQueryData(queryKey, data);\n });\n }\n\n onError?.(error as Error);\n },\n\n // Always refetch after mutation settles\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: QueryKeys.notifications._prefix,\n });\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetLastReadOps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface SetLastReadPayload {\n date?: string;\n}\n\nexport function useSetLastRead(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"notifications\", \"set-last-read\"],\n username,\n ({ date }) => buildSetLastReadOps(username!, date),\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.notifications.unreadCount(username),\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a single proposal by ID\n */\nexport function getProposalQueryOptions(id: number) {\n return queryOptions({\n queryKey: [\"proposals\", \"proposal\", id],\n queryFn: async () => {\n const r = await callRPC(\"condenser_api.find_proposals\", [[id]]);\n const proposal = r[0];\n\n // Determine proposal status based on dates\n if (new Date(proposal.start_date) < new Date() && new Date(proposal.end_date) >= new Date()) {\n proposal.status = \"active\";\n } else if (new Date(proposal.end_date) < new Date()) {\n proposal.status = \"expired\";\n } else {\n proposal.status = \"inactive\";\n }\n\n return proposal as Proposal;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get all proposals, sorted with expired proposals at the end\n */\nexport function getProposalsQueryOptions() {\n return queryOptions({\n queryKey: [\"proposals\", \"list\"],\n queryFn: async () => {\n const response = (await callRPC(\"database_api.list_proposals\", {\n start: [-1],\n limit: 500,\n order: \"by_total_votes\",\n order_direction: \"descending\",\n status: \"all\",\n })) as { proposals: Proposal[] };\n\n const proposals = response.proposals;\n const expired = proposals.filter((x) => x.status === \"expired\");\n const others = proposals.filter((x) => x.status !== \"expired\");\n\n return [...others, ...expired];\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { FullAccount } from \"@/modules/accounts\";\nimport { parseAccounts } from \"@/modules/accounts/utils\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// One page = array of enriched vote rows\nexport type ProposalVoteRow = {\n id: number;\n voter: string;\n voterAccount: FullAccount;\n};\n\ntype Cursor = string; // we paginate by last voter name\n\n/**\n * Get proposal votes with pagination and enriched voter account data\n *\n * @param proposalId - The proposal ID\n * @param voter - Starting voter for pagination\n * @param limit - Number of votes per page\n */\nexport function getProposalVotesInfiniteQueryOptions(\n proposalId: number,\n voter: string,\n limit: number\n) {\n return infiniteQueryOptions<\n ProposalVoteRow[],\n Error,\n InfiniteData,\n (string | number)[],\n Cursor\n >({\n queryKey: [\"proposals\", \"votes\", proposalId, voter, limit],\n initialPageParam: voter as Cursor,\n refetchOnMount: true,\n staleTime: 0, // Always refetch on mount\n\n queryFn: async ({ pageParam }: { pageParam: Cursor }) => {\n const startParam = pageParam ?? voter;\n\n const response = (await callRPC(\"condenser_api.list_proposal_votes\", [\n [proposalId, startParam],\n limit,\n \"by_proposal_voter\",\n ])) as ProposalVote[];\n\n const list = response\n .filter((x) => x.proposal?.proposal_id === proposalId)\n .map((x) => ({ id: x.id, voter: x.voter }));\n\n const rawAccounts = await callRPC(\"condenser_api.get_accounts\", [list.map((l) => l.voter)]);\n const accounts = parseAccounts(rawAccounts);\n\n const page: ProposalVoteRow[] = list.map((i) => ({\n ...i,\n voterAccount: accounts.find((a) => i.voter === a.name)!,\n }));\n\n return page;\n },\n\n getNextPageParam: (lastPage: ProposalVoteRow[]): Cursor | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n return last?.voter ?? undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Fetches ALL proposal votes for a specific user in a single query.\n * Much more efficient than querying each proposal individually.\n * Uses \"by_voter_proposal\" order to get all votes by a user.\n */\nexport function getUserProposalVotesQueryOptions(voter: string) {\n return queryOptions({\n queryKey: [\"proposals\", \"votes\", \"by-user\", voter],\n enabled: !!voter && voter !== \"\",\n staleTime: 60 * 1000, // Cache for 1 minute\n queryFn: async () => {\n if (!voter || voter === \"\") {\n return [];\n }\n\n const response = (await callRPC(\"database_api.list_proposal_votes\", {\n start: [voter],\n limit: 1000,\n order: \"by_voter_proposal\",\n order_direction: \"ascending\",\n status: \"votable\",\n })) as { proposal_votes: ProposalVote[] };\n\n // Filter to only this user's votes (API might return votes after this user alphabetically)\n const userVotes = (response.proposal_votes || []).filter((vote) => vote.voter === voter);\n\n return userVotes;\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting on proposals.\n */\nexport interface ProposalVotePayload {\n /** Array of proposal IDs to vote on */\n proposalIds: number[];\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting on Hive proposals.\n *\n * This mutation broadcasts an update_proposal_votes operation to vote on\n * one or more proposals in the Hive Decentralized Fund (HDF).\n *\n * @param username - The username voting on proposals (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 150) if adapter.recordActivity is available\n * - Invalidates proposal list cache to show updated vote status\n * - Invalidates voter's proposal votes cache\n *\n * **Multiple Proposals:**\n * - You can vote on multiple proposals in a single transaction\n * - All proposals receive the same vote (approve or disapprove)\n * - Proposal IDs are integers, not strings\n *\n * **Vote Types:**\n * - approve: true - Vote in favor of the proposal(s)\n * - approve: false - Remove your vote from the proposal(s)\n *\n * @example\n * ```typescript\n * const proposalVoteMutation = useProposalVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Approve a single proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: true\n * });\n *\n * // Approve multiple proposals\n * proposalVoteMutation.mutate({\n * proposalIds: [123, 124, 125],\n * approve: true\n * });\n *\n * // Remove vote from a proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: false\n * });\n * ```\n */\nexport function useProposalVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"vote\"],\n username,\n ({ proposalIds, approve }) => [\n buildProposalVoteOp(username!, proposalIds, approve)\n ],\n async (result: any) => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(150, txId, result?.block_num).catch((error) => {\n console.debug(\"[SDK][Proposals][useProposalVote] recordActivity failed\", {\n activityType: 150,\n blockNum: result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.proposals.list(),\n QueryKeys.proposals.votesByUser(username!)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useProposalVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for proposal votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalCreateOp, type ProposalCreatePayload } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport { type ProposalCreatePayload };\n\nexport function useProposalCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"create\"],\n username,\n (payload) => [\n buildProposalCreateOp(username!, payload)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.proposals.list(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get vesting delegations for an account with infinite scroll support\n *\n * @param username - The account username\n * @param limit - Maximum number of results per page (default: 50)\n */\nexport function getVestingDelegationsQueryOptions(\n username?: string,\n limit = 50\n) {\n return infiniteQueryOptions({\n queryKey: [\"wallet\", \"vesting-delegations\", username, limit],\n initialPageParam: \"\" as string,\n queryFn: async ({ pageParam }: { pageParam: string }) => {\n // Request one extra item on subsequent pages to handle inclusive cursor\n const fetchLimit = pageParam ? limit + 1 : limit;\n\n const result = await callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n pageParam || \"\",\n fetchLimit,\n ]) as DelegatedVestingShare[];\n\n // Filter out duplicate first item on subsequent pages\n // Hive API is inclusive of the 'from' cursor\n if (pageParam && result.length > 0 && result[0]?.delegatee === pageParam) {\n // Return at most limit items after removing the duplicate\n return result.slice(1, limit + 1);\n }\n\n return result;\n },\n getNextPageParam: (lastPage: DelegatedVestingShare[]) => {\n // If we got fewer results than limit, we've reached the end\n if (!lastPage || lastPage.length < limit) {\n return undefined;\n }\n\n // Return the last delegatee as cursor for next page\n const lastDelegation = lastPage[lastPage.length - 1];\n return lastDelegation?.delegatee;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { AccountDelegations } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\n\n/**\n * Account vesting delegations via the HAF balance-api REST endpoint\n * (`/balance-api/accounts/{account-name}/delegations`).\n *\n * Unlike `condenser_api.get_vesting_delegations` (see\n * {@link getHivePowerDelegatesInfiniteQueryOptions}), this returns the\n * complete outgoing AND incoming lists in a single request, with `callREST`\n * handling multi-node failover. `amount` is raw vests (vests * 10^6).\n */\nexport function getAccountDelegationsQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"assets\", \"account-delegations\", username],\n enabled: !!username,\n queryFn: ({ signal }) =>\n callREST(\n \"balance\",\n \"/accounts/{account-name}/delegations\",\n { \"account-name\": username },\n undefined,\n undefined,\n signal\n ) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { VestingDelegationExpiration } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get expiring vesting delegations for an account.\n *\n * When a delegation is removed (set to 0 VESTS), the HP doesn't return\n * immediately — it enters a 5-day cooldown. This query fetches those\n * in-flight expirations so they can be shown alongside active delegations.\n *\n * Uses database_api.find_vesting_delegation_expirations which returns\n * vesting_shares as NAI asset objects ({amount, nai, precision}).\n *\n * @param username - The delegator account username\n */\nexport function getVestingDelegationExpirationsQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"vesting-delegation-expirations\", username],\n queryFn: async () => {\n if (!username) return [];\n const result = await callRPC(\"database_api.find_vesting_delegation_expirations\", { account: username }) as { delegations: VestingDelegationExpiration[] };\n return result.delegations;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HBD to HIVE conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CollateralizedConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get collateralized HIVE to HBD conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getCollateralizedConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"collateralized-conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_collateralized_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { SavingsWithdrawRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get pending savings withdrawal requests for an account\n *\n * @param account - The account username\n */\nexport function getSavingsWithdrawFromQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"savings-withdraw\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_savings_withdraw_from\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.request_id - b.request_id),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get power down (vesting withdrawal) routes for an account\n *\n * @param account - The account username\n */\nexport function getWithdrawRoutesQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"withdraw-routes\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n account,\n \"outgoing\",\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OpenOrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get open market orders for an account\n *\n * @param user - The account username\n */\nexport function getOpenOrdersQueryOptions(user: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"open-orders\", user],\n queryFn: () =>\n callRPC(\"condenser_api.get_open_orders\", [\n user,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.orderid - b.orderid),\n enabled: !!user,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { RcDirectDelegation, RcDirectDelegationsResponse } from \"../types/rc-direct-delegation\";\n\ntype RcPage = RcDirectDelegation[];\ntype RcCursor = string | null;\n\n/**\n * Get outgoing RC delegations for an account\n *\n * @param username - Account name to get delegations for\n * @param limit - Number of delegations per page\n */\nexport function getOutgoingRcDelegationsInfiniteQueryOptions(username: string, limit = 100) {\n return infiniteQueryOptions<\n RcPage,\n Error,\n InfiniteData,\n (string | number)[],\n RcCursor\n >({\n queryKey: [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n initialPageParam: null as RcCursor,\n\n queryFn: async ({ pageParam }: { pageParam: RcCursor }) => {\n const response = await callRPC(\"rc_api.list_rc_direct_delegations\", {\n start: [username, pageParam ?? \"\"],\n limit,\n })\n .then((r: any) => r as RcDirectDelegationsResponse);\n\n let delegations: RcDirectDelegation[] = response.rc_direct_delegations || [];\n\n // Filter out the starting delegation when paginating\n if (pageParam) {\n delegations = delegations.filter((delegation) => delegation.to !== pageParam);\n }\n\n return delegations;\n },\n\n getNextPageParam: (lastPage: RcPage): RcCursor =>\n lastPage.length === limit ? lastPage[lastPage.length - 1].to : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { IncomingRcResponse } from \"../types\";\n\nexport function getIncomingRcQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"wallet\", \"incoming-rc\", username],\n enabled: !!username,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] - Missing username for incoming RC\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/received-rc/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch incoming RC: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { ReceivedVestingShare } from \"../types/received-vesting-share\";\n\nexport function getReceivedVestingSharesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"received-vesting-shares\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch received vesting shares: ${response.status}`);\n }\n\n const data = (await response.json()) as { list: ReceivedVestingShare[] };\n return data.list;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { RecurrentTransfer } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get recurrent transfers for an account\n *\n * @param username - The account username\n */\nexport function getRecurrentTransfersQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"recurrent-transfers\", username],\n queryFn: () =>\n callRPC(\"condenser_api.find_recurrent_transfers\", [\n username,\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { ConfigManager } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\ntype PortfolioLayer = \"points\" | \"hive\" | \"chain\" | \"engine\";\n\ninterface TokenAction {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface PortfolioWalletItem {\n name: string;\n symbol: string;\n layer: PortfolioLayer;\n balance: number;\n fiatRate: number;\n currency: string;\n precision: number;\n address?: string;\n error?: string;\n pendingRewards?: number;\n pendingRewardsFiat?: number;\n liquid?: number;\n liquidFiat?: number;\n savings?: number;\n savingsFiat?: number;\n staked?: number;\n stakedFiat?: number;\n iconUrl?: string;\n actions?: TokenAction[];\n extraData?: Array<{ dataKey: string; value: any }>;\n apr?: number;\n}\n\nexport interface PortfolioResponse {\n username: string;\n currency?: string;\n wallets: PortfolioWalletItem[];\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const direct = Number.parseFloat(trimmed);\n if (Number.isFinite(direct)) {\n return direct;\n }\n\n const sanitized = trimmed.replace(/,/g, \"\");\n const match = sanitized.match(/[-+]?\\d+(?:\\.\\d+)?/);\n if (match) {\n const parsed = Number.parseFloat(match[0]);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseToken(rawToken: unknown): PortfolioWalletItem | undefined {\n if (!rawToken || typeof rawToken !== \"object\") {\n return undefined;\n }\n\n const token = rawToken as Record;\n\n // Portfolio v2 returns well-defined PortfolioItem structure\n return {\n name: normalizeString(token.name) ?? \"\",\n symbol: normalizeString(token.symbol) ?? \"\",\n layer: (normalizeString(token.layer) ?? \"hive\") as PortfolioLayer,\n balance: normalizeNumber(token.balance) ?? 0,\n fiatRate: normalizeNumber(token.fiatRate) ?? 0,\n currency: normalizeString(token.currency) ?? \"usd\",\n precision: normalizeNumber(token.precision) ?? 3,\n address: normalizeString(token.address),\n error: normalizeString(token.error),\n pendingRewards: normalizeNumber(token.pendingRewards),\n pendingRewardsFiat: normalizeNumber(token.pendingRewardsFiat),\n liquid: normalizeNumber(token.liquid),\n liquidFiat: normalizeNumber(token.liquidFiat),\n savings: normalizeNumber(token.savings),\n savingsFiat: normalizeNumber(token.savingsFiat),\n staked: normalizeNumber(token.staked),\n stakedFiat: normalizeNumber(token.stakedFiat),\n iconUrl: normalizeString(token.iconUrl),\n actions: (token.actions ?? []) as TokenAction[],\n extraData: (token.extraData ?? []) as Array<{ dataKey: string; value: any }>,\n apr: normalizeNumber(token.apr),\n };\n}\n\nfunction extractTokens(payload: unknown): unknown[] {\n if (!payload || typeof payload !== \"object\") {\n return [];\n }\n\n const containers = [payload];\n const record = payload as Record;\n if (record.data && typeof record.data === \"object\") {\n containers.push(record.data as Record);\n }\n if (record.result && typeof record.result === \"object\") {\n containers.push(record.result as Record);\n }\n if (record.portfolio && typeof record.portfolio === \"object\") {\n containers.push(record.portfolio as Record);\n }\n\n for (const container of containers) {\n if (Array.isArray(container)) {\n return container;\n }\n\n if (container && typeof container === \"object\") {\n for (const key of [\n \"wallets\",\n \"tokens\",\n \"assets\",\n \"items\",\n \"portfolio\",\n \"balances\",\n ]) {\n const value = (container as Record)[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n }\n\n return [];\n}\n\nfunction resolveUsername(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record;\n return (\n normalizeString(record.username) ??\n normalizeString(record.name) ??\n normalizeString(record.account)\n );\n}\n\n/**\n * Get portfolio query options for fetching user's wallet balances across all layers\n * @param username - Hive username\n * @param currency - Fiat currency code (default: \"usd\")\n * @param onlyEnabled - Only return enabled tokens (default: true)\n * @returns TanStack Query options for portfolio data\n */\nexport function getPortfolioQueryOptions(\n username: string,\n currency: string = \"usd\",\n onlyEnabled: boolean = true\n) {\n return queryOptions({\n queryKey: [\n \"wallet\",\n \"portfolio\",\n \"v2\",\n username,\n onlyEnabled ? \"only-enabled\" : \"all\",\n currency,\n ],\n enabled: Boolean(username),\n staleTime: 60000,\n refetchInterval: 120000,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] – username is required\");\n }\n\n const endpoint = `${ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, onlyEnabled, currency }),\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallet] – Portfolio request failed (${response.status})`\n );\n }\n\n const payload = (await response.json()) as unknown;\n const tokens = extractTokens(payload)\n .map((item) => parseToken(item))\n .filter((item): item is PortfolioWalletItem => Boolean(item))\n // Backend may still emit removed SPK-layer items; drop them defensively\n .filter((item) => (item.layer as string) !== \"spk\");\n\n if (!tokens.length) {\n throw new Error(\n \"[SDK][Wallet] – Portfolio payload contained no tokens\"\n );\n }\n\n return {\n username: resolveUsername(payload) ?? username,\n currency: normalizeString(\n (payload as Record | undefined)?.fiatCurrency ??\n (payload as Record | undefined)?.currency\n )?.toUpperCase(),\n wallets: tokens,\n };\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHiveAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n\n if (!accountData) {\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: 0,\n } satisfies GeneralAssetInfo;\n }\n\n const liquidBalance = parseAsset(accountData.balance).amount;\n const savingsBalance = parseAsset(accountData.savings_balance).amount;\n\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: liquidBalance + savingsBalance,\n parts: [\n {\n name: \"current\",\n balance: liquidBalance,\n },\n {\n name: \"savings\",\n balance: savingsBalance,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHbdAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hbd\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n\n const price = 1;\n\n if (!accountData) {\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance: 0,\n };\n }\n\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance:\n parseAsset(accountData.hbd_balance).amount +\n parseAsset(accountData?.savings_hbd_balance).amount,\n apr: ((dynamicProps?.hbdInterestRate ?? 0) / 100).toFixed(3),\n parts: [\n {\n name: \"current\",\n balance: parseAsset(accountData.hbd_balance).amount,\n },\n {\n name: \"savings\",\n balance: parseAsset(accountData.savings_hbd_balance).amount,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { isEmptyDate, parseAsset, vestsToHp } from \"@/modules/core/utils\";\n\nfunction getAPR(dynamicProps: DynamicProps) {\n const initialInflationRate = 9.5;\n const initialBlock = 7000000;\n const decreaseRate = 250000;\n const decreasePercentPerIncrement = 0.01;\n\n const headBlock = dynamicProps.headBlock;\n const deltaBlocks = headBlock - initialBlock;\n const decreaseIncrements = deltaBlocks / decreaseRate;\n\n let currentInflationRate =\n initialInflationRate - decreaseIncrements * decreasePercentPerIncrement;\n\n if (currentInflationRate < 0.95) {\n currentInflationRate = 0.95;\n }\n\n const vestingRewardPercent = dynamicProps.vestingRewardPercent / 10000;\n const virtualSupply = dynamicProps.virtualSupply;\n const totalVestingFunds = dynamicProps.totalVestingFund;\n\n return (\n (virtualSupply * currentInflationRate * vestingRewardPercent) /\n totalVestingFunds\n ).toFixed(3);\n}\n\nexport function getHivePowerAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n if (!dynamicProps || !accountData) {\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price: 0,\n accountBalance: 0,\n };\n }\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n const price = Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps.base / dynamicProps.quote;\n\n const vestingShares = parseAsset(accountData.vesting_shares).amount;\n const delegatedVests = parseAsset(\n accountData.delegated_vesting_shares\n ).amount;\n const receivedVests = parseAsset(\n accountData.received_vesting_shares\n ).amount;\n const withdrawRateVests = parseAsset(\n accountData.vesting_withdraw_rate\n ).amount;\n const remainingToWithdrawVests = Math.max(\n (Number(accountData.to_withdraw) - Number(accountData.withdrawn)) /\n 1e6,\n 0\n );\n const nextWithdrawalVests = !isEmptyDate(\n accountData.next_vesting_withdrawal\n )\n ? Math.min(withdrawRateVests, remainingToWithdrawVests)\n : 0;\n\n const hpBalance = +vestsToHp(\n vestingShares,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const outgoingDelegationsHp = +vestsToHp(\n delegatedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const incomingDelegationsHp = +vestsToHp(\n receivedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const pendingPowerDownHp = +vestsToHp(\n remainingToWithdrawVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const nextPowerDownHp = +vestsToHp(\n nextWithdrawalVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const totalBalance = Math.max(hpBalance - pendingPowerDownHp, 0);\n const availableHp = Math.max(hpBalance - outgoingDelegationsHp, 0);\n\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price,\n accountBalance: +totalBalance.toFixed(3),\n apr: getAPR(dynamicProps),\n parts: [\n {\n name: \"hp_balance\",\n balance: hpBalance,\n },\n {\n name: \"available\",\n balance: +availableHp.toFixed(3),\n },\n {\n name: \"outgoing_delegations\",\n balance: outgoingDelegationsHp,\n },\n {\n name: \"incoming_delegations\",\n balance: incomingDelegationsHp,\n },\n ...(pendingPowerDownHp > 0\n ? [\n {\n name: \"pending_power_down\",\n balance: +pendingPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ...(nextPowerDownHp > 0 && nextPowerDownHp !== pendingPowerDownHp\n ? [\n {\n name: \"next_power_down\",\n balance: +nextPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { utils } from \"../../../hive-tx\";\nimport { HiveOperationGroup } from \"../types\";\nconst ops = utils.operations;\n\nexport const HIVE_ACCOUNT_OPERATION_GROUPS: Record<\n HiveOperationGroup,\n number[]\n> = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n \"\": [],\n};\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nexport const HIVE_OPERATION_LIST = Object.keys(\n utils.operations\n) as HiveOperationName[];\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nconst operationOrders = utils.operations as Record<\n HiveOperationName,\n number\n>;\n\nexport const HIVE_OPERATION_ORDERS = operationOrders;\n\nexport const HIVE_OPERATION_NAME_BY_ID: Record =\n Object.entries(operationOrders).reduce((acc, [name, id]) => {\n acc[id] = name as HiveOperationName;\n return acc;\n }, {} as Record);\n","import { callRPC } from \"../../../hive-tx\";\nimport { utils } from \"../../../hive-tx\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { HIVE_ACCOUNT_OPERATION_GROUPS } from \"../consts\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationFilterKey,\n HiveOperationFilterValue,\n HiveOperationGroup,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nconst operationOrders = utils.operations;\n\nfunction isHiveOperationName(value: string): value is HiveOperationName {\n return Object.prototype.hasOwnProperty.call(operationOrders, value);\n}\n\nexport function resolveHiveOperationFilters(filters: HiveOperationFilter): {\n filterKey: HiveOperationFilterKey;\n filterArgs: any[];\n} {\n const rawValues: HiveOperationFilterValue[] = Array.isArray(filters)\n ? filters\n : [filters];\n\n const hasAll = rawValues.includes(\"\" as HiveOperationGroup);\n\n const uniqueValues = Array.from(\n new Set(\n rawValues.filter(\n (value): value is HiveOperationFilterValue =>\n value !== undefined &&\n value !== null &&\n value !== (\"\" as HiveOperationGroup)\n )\n )\n );\n\n const filterKey: HiveOperationFilterKey =\n hasAll || uniqueValues.length === 0\n ? \"all\"\n : uniqueValues\n .map((value) => value.toString())\n .sort()\n .join(\"|\");\n\n const operationIds = new Set();\n\n if (!hasAll) {\n uniqueValues.forEach((value) => {\n if (value in HIVE_ACCOUNT_OPERATION_GROUPS) {\n HIVE_ACCOUNT_OPERATION_GROUPS[value as HiveOperationGroup].forEach(\n (id) => operationIds.add(id)\n );\n return;\n }\n\n if (isHiveOperationName(value)) {\n operationIds.add(operationOrders[value]);\n }\n });\n }\n\n const filterArgs = makeBitMaskFilter(Array.from(operationIds));\n\n return {\n filterKey,\n filterArgs,\n };\n}\n\nfunction makeBitMaskFilter(allowedOperations: number[]) {\n let low = 0n;\n let high = 0n;\n\n allowedOperations.forEach((operation) => {\n if (operation < 64) {\n low |= 1n << BigInt(operation);\n } else {\n high |= 1n << BigInt(operation - 64);\n }\n });\n\n return [\n low !== 0n ? low.toString() : null,\n high !== 0n ? high.toString() : null,\n ];\n}\n\nexport function getHiveAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterArgs, filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n initialData: { pages: [], pageParams: [] },\n initialPageParam: -1,\n getNextPageParam: (lastPage, __) =>\n lastPage ? +(lastPage[lastPage.length - 1]?.num ?? 0) - 1 : -1,\n\n queryFn: async ({ pageParam }) => {\n const response = await callRPC(\n \"condenser_api.get_account_history\",\n [username, pageParam, limit, ...filterArgs]\n );\n\n return response.map(\n (x: any) =>\n ({\n num: x[0],\n type: x[1].op[0],\n timestamp: x[1].timestamp,\n trx_id: x[1].trx_id,\n ...x[1].op[1],\n }) satisfies HiveTransaction\n );\n },\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hivePayout = parseAsset(\n (item as AuthorReward).hive_payout\n );\n return hivePayout.amount > 0;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HIVE\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HIVE\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HIVE\"].includes(asset.symbol);\n\n case \"claim_reward_balance\":\n const rewardHive = parseAsset(\n (item as ClaimRewardBalance).reward_hive\n );\n return rewardHive.amount > 0;\n\n case \"curation_reward\":\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHbdAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hbdPayout = parseAsset(\n (item as AuthorReward).hbd_payout\n );\n return hbdPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardHbd = parseAsset(\n (item as ClaimRewardBalance).reward_hbd\n );\n return rewardHbd.amount > 0;\n\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HBD\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HBD\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HBD\"].includes(asset.symbol);\n\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n case \"proposal_pay\":\n case \"interest\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHivePowerAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n const userSelectedOperations = new Set(\n Array.isArray(filters) ? filters : [filters]\n );\n const hasAllFilter =\n userSelectedOperations.has(\"\" as any) || userSelectedOperations.size === 0;\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const vestingPayout = parseAsset(\n (item as AuthorReward).vesting_payout\n );\n return vestingPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardVests = parseAsset(\n (item as ClaimRewardBalance).reward_vests\n );\n return rewardVests.amount > 0;\n\n case \"transfer_to_vesting\":\n return true;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"recurrent_transfer\":\n return [\"VESTS\", \"HP\"].includes(parseAsset(item.amount).symbol);\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"VESTS\", \"HP\"].includes(asset.symbol);\n\n case \"curation_reward\":\n case \"withdraw_vesting\":\n case \"delegate_vesting_shares\":\n case \"fill_vesting_withdraw\":\n case \"return_vesting_delegation\":\n case \"producer_reward\":\n case \"set_withdraw_vesting_route\":\n return true;\n default:\n return hasAllFilter || userSelectedOperations.has(item.type);\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveMarketMetric } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nfunction subtractSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() - seconds * 1000);\n}\n\nexport function getHiveAssetMetricQueryOptions(bucketSeconds = 86_400) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n queryFn: async ({ pageParam: [startDate, endDate] }) => {\n const apiData: HiveMarketMetric[] = await callRPC(\"condenser_api.get_market_history\", [bucketSeconds, formatDate(startDate), formatDate(endDate)]\n );\n\n return apiData.map(({ hive, non_hive, open }) => ({\n close: non_hive.close / hive.close,\n open: non_hive.open / hive.open,\n low: non_hive.low / hive.low,\n high: non_hive.high / hive.high,\n volume: hive.volume,\n time: new Date(open),\n }));\n },\n initialPageParam: [\n subtractSeconds(new Date(), Math.max(100 * bucketSeconds, 28_800)),\n new Date(),\n ],\n getNextPageParam: (_, __, [prevStartDate]) => [\n subtractSeconds(prevStartDate, Math.max(100 * bucketSeconds, 28_800)),\n subtractSeconds(prevStartDate, bucketSeconds),\n ],\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHiveAssetWithdrawalRoutesQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"withdrawal-routes\", username],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n username,\n \"outgoing\",\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHivePowerDelegatesInfiniteQueryOptions(\n username: string,\n limit = 50\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegates\", username],\n enabled: !!username,\n queryFn: () =>\n callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n \"\",\n limit,\n ]) as Promise,\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { ReceivedVestingShare } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHivePowerDelegatingsQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegatings\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()).list as ReceivedVestingShare[];\n },\n select: (data) =>\n data.sort(\n (a, b) =>\n parseAsset(b.vesting_shares).amount -\n parseAsset(a.vesting_shares).amount\n ),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get the internal HIVE/HBD market order book\n *\n * @param limit - Maximum number of orders to fetch (default: 500)\n */\nexport function getOrderBookQueryOptions(limit = 500) {\n return queryOptions({\n queryKey: [\"market\", \"order-book\", limit],\n queryFn: () =>\n callRPC(\"condenser_api.get_order_book\", [\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market statistics from the blockchain\n */\nexport function getMarketStatisticsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"statistics\"],\n queryFn: () =>\n callRPC(\"condenser_api.get_ticker\", []) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketCandlestickDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market history (candlestick data)\n *\n * @param seconds - Bucket size in seconds\n * @param startDate - Start date for the data\n * @param endDate - End date for the data\n */\nexport function getMarketHistoryQueryOptions(\n seconds: number,\n startDate: Date,\n endDate: Date\n) {\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n return queryOptions({\n queryKey: [\"market\", \"history\", seconds, startDate.getTime(), endDate.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_market_history\", [\n seconds,\n formatDate(startDate),\n formatDate(endDate),\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveHbdStats, MarketCandlestickDataItem, MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get combined HIVE/HBD statistics including price, 24h change, and volume\n */\nexport function getHiveHbdStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"hive-hbd-stats\"],\n queryFn: async () => {\n // Get current market statistics\n const stats = (await callRPC(\"condenser_api.get_ticker\", [])) as MarketStatistics;\n\n // Get 24h market history\n const now = new Date();\n const oneDayAgo = new Date(now.getTime() - 86400000); // 24 hours ago\n\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n const dayChange = (await callRPC(\"condenser_api.get_market_history\", [86400, formatDate(oneDayAgo), formatDate(now)]\n )) as MarketCandlestickDataItem[];\n\n // Calculate stats\n const result: HiveHbdStats = {\n price: +stats.latest,\n close: dayChange[0] ? dayChange[0].non_hive.open / dayChange[0].hive.open : 0,\n high: dayChange[0] ? dayChange[0].non_hive.high / dayChange[0].hive.high : 0,\n low: dayChange[0] ? dayChange[0].non_hive.low / dayChange[0].hive.low : 0,\n percent: dayChange[0]\n ? 100 - ((dayChange[0].non_hive.open / dayChange[0].hive.open) * 100) / +stats.latest\n : 0,\n totalFromAsset: stats.hive_volume.split(\" \")[0],\n totalToAsset: stats.hbd_volume.split(\" \")[0],\n };\n\n return result;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketData } from \"../types\";\nimport { getBoundFetch } from \"@/modules/core\";\n\n/**\n * Get market chart data from CoinGecko API\n *\n * @param coin - Coin ID (e.g., \"hive\", \"bitcoin\")\n * @param vsCurrency - Currency to compare against (e.g., \"usd\", \"eur\")\n * @param fromTs - From timestamp (Unix timestamp in seconds)\n * @param toTs - To timestamp (Unix timestamp in seconds)\n */\nexport function getMarketDataQueryOptions(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n) {\n return queryOptions({\n queryKey: [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n queryFn: async ({ signal }) => {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n\n const response = await fetchApi(url, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch market data: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date) {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n}\n\nexport function getTradeHistoryQueryOptions(\n limit = 1000,\n startDate?: Date,\n endDate?: Date\n) {\n const end = endDate ?? new Date();\n const start =\n startDate ?? new Date(end.getTime() - 10 * 60 * 60 * 1000);\n\n return queryOptions({\n queryKey: [\"market\", \"trade-history\", limit, start.getTime(), end.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_trade_history\", [\n formatDate(start),\n formatDate(end),\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FeedHistoryItem {\n id: number;\n current_median_history: {\n base: string;\n quote: string;\n };\n market_median_history: {\n base: string;\n quote: string;\n };\n current_min_history: {\n base: string;\n quote: string;\n };\n current_max_history: {\n base: string;\n quote: string;\n };\n price_history: Array<{\n base: string;\n quote: string;\n }>;\n}\n\n/**\n * Get feed history from the blockchain\n * Returns price feed history including median prices\n */\nexport function getFeedHistoryQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"feed-history\"],\n queryFn: async () => {\n try {\n const feedHistory = await callRPC(\"condenser_api.get_feed_history\", []);\n return feedHistory as FeedHistoryItem;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface MedianHistoryPrice {\n base: string;\n quote: string;\n}\n\n/**\n * Get current median history price from the blockchain\n * Returns the current median price for HIVE/HBD conversion\n */\nexport function getCurrentMedianHistoryPriceQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"current-median-history-price\"],\n queryFn: async () => {\n try {\n const price = await callRPC(\"condenser_api.get_current_median_history_price\", []);\n return price as MedianHistoryPrice;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCreateOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCreatePayload {\n amountToSell: string;\n minToReceive: string;\n fillOrKill: boolean;\n expiration: string;\n orderId: number;\n}\n\nexport function useLimitOrderCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-create\"],\n username,\n (payload) => [\n buildLimitOrderCreateOp(\n username!,\n payload.amountToSell,\n payload.minToReceive,\n payload.fillOrKill,\n payload.expiration,\n payload.orderId\n )\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCancelOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCancelPayload {\n orderId: number;\n}\n\nexport function useLimitOrderCancel(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-cancel\"],\n username,\n ({ orderId }) => [\n buildLimitOrderCancelOp(username!, orderId)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { MarketData } from \"./types\";\nimport { CurrencyRates } from \"@/modules/private-api/types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n const data = (await response.json()) as T;\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n return data;\n}\n\nexport async function getMarketData(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n): Promise {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n const response = await fetchApi(url);\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRate(cur: string): Promise {\n if (cur === \"hbd\") {\n return 1;\n }\n\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${cur}`;\n const response = await fetchApi(url);\n const data = await parseJsonResponse<{ hive_dollar: Record }>(response);\n return data.hive_dollar[cur];\n}\n\nexport async function getCurrencyTokenRate(currency: string, token: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost +\n `/private-api/market-data/${currency === \"hbd\" ? \"usd\" : currency}/${token}`\n );\n\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRates(): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/market-data/latest\");\n return parseJsonResponse(response);\n}\n\nexport async function getHivePrice(): Promise<{ hive: { usd: number } }> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n \"https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd\"\n );\n return parseJsonResponse<{ hive: { usd: number } }>(response);\n}\n","import { ConfigManager, getBoundFetch } from \"@/modules/core\";\nimport type { HiveEngineOpenOrder } from \"./types\";\n\ntype EngineOrderBookEntry = {\n txId: string;\n timestamp: number;\n account: string;\n symbol: string;\n quantity: string;\n price: string;\n tokensLocked?: string;\n};\n\nconst ENGINE_RPC_HEADERS = { \"Content-type\": \"application/json\" };\n\nasync function engineRpc(payload: Record): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(`${baseUrl}/private-api/engine-api`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: ENGINE_RPC_HEADERS,\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – request failed with ${response.status}`\n );\n }\n\n const data = (await response.json()) as { result: T };\n return data.result;\n}\n\nasync function engineRpcSafe(\n payload: Record,\n fallback: T\n): Promise {\n try {\n return await engineRpc(payload);\n } catch (e) {\n return fallback;\n }\n}\n\nexport async function getHiveEngineOrderBook(\n symbol: string,\n limit: number = 50\n): Promise<{ buy: T[]; sell: T[] }> {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buy, sell] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"price\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"price\", descending: false }],\n },\n },\n []\n ),\n ]);\n\n const sortByPriceDesc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return right - left;\n });\n const sortByPriceAsc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return left - right;\n });\n\n return {\n buy: sortByPriceDesc(buy),\n sell: sortByPriceAsc(sell),\n };\n}\n\nexport async function getHiveEngineTradeHistory>(\n symbol: string,\n limit: number = 50\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"tradesHistory\",\n query: { symbol },\n limit,\n offset: 0,\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineOpenOrders(\n account: string,\n symbol: string,\n limit: number = 100\n): Promise {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol, account },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buyRaw, sellRaw] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n ]);\n\n const formatTotal = (quantity: string, price: string) =>\n (Number(quantity || 0) * Number(price || 0)).toFixed(8);\n\n const buy: HiveEngineOpenOrder[] = buyRaw.map((order) => ({\n id: order.txId,\n type: \"buy\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: order.tokensLocked ?? formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n const sell: HiveEngineOpenOrder[] = sellRaw.map((order) => ({\n id: order.txId,\n type: \"sell\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n return [...buy, ...sell].sort((a, b) => b.timestamp - a.timestamp) as T[];\n}\n\n/**\n * Market metrics, optionally narrowed to one symbol or to a list of them.\n *\n * An unfiltered call is served from a single page – the node caps `find` at 1000 rows\n * while Hive engine has far more traded tokens than that – so callers that only care\n * about specific symbols must pass them. Scanning the unfiltered page for a symbol\n * silently reports \"no market\" for everything outside it.\n */\nexport async function getHiveEngineMetrics>(\n symbol?: string | string[],\n account?: string\n): Promise {\n if (Array.isArray(symbol) && symbol.length === 0) {\n return [];\n }\n\n const symbolQuery = Array.isArray(symbol)\n ? { symbol: { $in: symbol } }\n : symbol\n ? { symbol }\n : {};\n\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"metrics\",\n query: {\n ...symbolQuery,\n ...(account ? { account } : {}),\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMarket>(\n account?: string,\n symbol?: string | string[]\n): Promise {\n return getHiveEngineMetrics(symbol, account);\n}\n\nexport async function getHiveEngineTokensBalances>(\n username: string\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"balances\",\n query: {\n account: username,\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMetadata>(\n tokens: string[]\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"tokens\",\n query: {\n symbol: { $in: tokens },\n },\n },\n id: 2,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokenTransactions>(\n username: string,\n symbol: string,\n limit: number,\n offset: number\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-account-history\", baseUrl);\n url.searchParams.set(\"account\", username);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"limit\", limit.toString());\n url.searchParams.set(\"offset\", offset.toString());\n\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – account history failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineTokenMetrics>(\n symbol: string,\n interval = \"daily\"\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-chart-api\", baseUrl);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"interval\", interval);\n\n const response = await fetchApi(url.toString(), {\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – chart failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineUnclaimedRewards>(\n username: string\n): Promise> {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(\n `${baseUrl}/private-api/engine-reward-api/${username}?hive=1`\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – rewards failed with ${response.status}`\n );\n }\n\n return (await response.json()) as Record;\n}\n","import { getHiveEngineTokensBalances } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenBalance } from \"../types\";\n\nexport function getHiveEngineTokensBalancesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"balances\", username] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensBalances(username);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMarketResponse } from \"../types\";\nimport { getHiveEngineTokensMarket } from \"../requests\";\n\nexport function getHiveEngineTokensMarketQueryOptions() {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"markets\"],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMarket();\n },\n });\n}\n","import { getHiveEngineTokensMetadata } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenMetadataResponse } from \"../types\";\n\nexport function getHiveEngineTokensMetadataQueryOptions(tokens: string[]) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"metadata-list\", tokens] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMetadata(tokens);\n },\n });\n}\n","import { getHiveEngineTokenTransactions } from \"../requests\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTransaction } from \"../types\";\n\nexport function getHiveEngineTokenTransactionsQueryOptions(\n username: string | undefined,\n symbol: string,\n limit = 20\n) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"transactions\", username],\n enabled: !!symbol && !!username,\n initialPageParam: 0,\n queryFn: async ({ pageParam }) => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n return getHiveEngineTokenTransactions(\n username,\n symbol,\n limit,\n pageParam as number\n );\n },\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n (lastPage?.length ?? 0) === limit ? (lastPageParam as number) + limit : undefined,\n getPreviousPageParam: (_firstPage, _allPages, firstPageParam) =>\n (firstPageParam as number) > 0 ? (firstPageParam as number) - limit : undefined,\n });\n}\n","import { getHiveEngineTokenMetrics } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMetric } from \"../types\";\n\nexport function getHiveEngineTokensMetricsQueryOptions(\n symbol: string,\n interval = \"daily\"\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokenMetrics(symbol, interval);\n },\n });\n}\n","import { getHiveEngineUnclaimedRewards } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenStatus } from \"../types\";\n\nexport function getHiveEngineUnclaimedRewardsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"unclaimed\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n enabled: !!username,\n queryFn: async () => {\n try {\n const data = await getHiveEngineUnclaimedRewards(\n username as string\n );\n return Object.values(data).filter(\n ({ pending_token }) => pending_token > 0\n );\n } catch (e) {\n return [];\n }\n },\n });\n}\n","import { getHiveEngineTokensMarket } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenInfo } from \"../types\";\n\nexport function getAllHiveEngineTokensQueryOptions(\n account?: string,\n symbol?: string | string[]\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"all-tokens\", account, symbol] as const,\n queryFn: async () => {\n return getHiveEngineTokensMarket(account, symbol);\n },\n });\n}\n","interface Options {\n fractionDigits?: number;\n prefix?: string;\n suffix?: string;\n}\n\nexport function formattedNumber(\n value: number | string,\n options: Options | undefined = undefined\n) {\n let opts: Options = {\n fractionDigits: 3,\n prefix: \"\",\n suffix: \"\",\n };\n\n if (options) {\n opts = { ...opts, ...options };\n }\n\n const { fractionDigits, prefix, suffix } = opts;\n\n let out = \"\";\n\n if (prefix) out += prefix + \" \";\n // turn too small values to zero. Bug: https://github.com/adamwdraper/Numeral-js/issues/563\n const av = Math.abs(parseFloat(value.toString())) < 0.0001 ? 0 : value;\n const num = typeof av === \"string\" ? parseFloat(av) : av;\n out += num.toLocaleString(\"en-US\", {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n useGrouping: true,\n });\n if (suffix) out += \" \" + suffix;\n\n return out;\n}\n","import { formattedNumber } from \"./formatted-number\";\n\ninterface HiveEngineTokenProps {\n symbol: string;\n name: string;\n icon: string;\n precision: number;\n stakingEnabled: boolean;\n delegationEnabled: boolean;\n balance: string;\n stake: string;\n delegationsIn: string;\n delegationsOut: string;\n usdValue: number;\n}\n\nexport class HiveEngineToken {\n symbol: string;\n name?: string;\n icon?: string;\n\n precision?: number;\n stakingEnabled?: boolean;\n delegationEnabled?: boolean;\n balance: number;\n stake: number;\n stakedBalance: number;\n delegationsIn: number;\n delegationsOut: number;\n usdValue: number;\n\n constructor(props: HiveEngineTokenProps) {\n this.symbol = props.symbol;\n this.name = props.name || \"\";\n this.icon = props.icon || \"\";\n\n this.precision = props.precision || 0;\n this.stakingEnabled = props.stakingEnabled || false;\n this.delegationEnabled = props.delegationEnabled || false;\n this.balance = parseFloat(props.balance) || 0;\n this.stake = parseFloat(props.stake) || 0;\n this.delegationsIn = parseFloat(props.delegationsIn) || 0;\n this.delegationsOut = parseFloat(props.delegationsOut) || 0;\n this.stakedBalance =\n this.stake + this.delegationsIn - this.delegationsOut;\n this.usdValue = props.usdValue;\n }\n\n hasDelegations = (): boolean => {\n if (!this.delegationEnabled) {\n return false;\n }\n\n return this.delegationsIn > 0 && this.delegationsOut > 0;\n };\n\n delegations = (): string => {\n if (!this.hasDelegations()) {\n return \"\";\n }\n\n return `(${formattedNumber(this.stake, {\n fractionDigits: this.precision,\n })} + ${formattedNumber(this.delegationsIn, {\n fractionDigits: this.precision,\n })} - ${formattedNumber(this.delegationsOut, {\n fractionDigits: this.precision,\n })})`;\n };\n\n staked = (): string => {\n if (!this.stakingEnabled) {\n return \"-\";\n }\n\n if (this.stakedBalance < 0.0001) {\n return this.stakedBalance.toString();\n }\n\n return formattedNumber(this.stakedBalance, {\n fractionDigits: this.precision,\n });\n };\n\n balanced = (): string => {\n if (this.balance < 0.0001) {\n return this.balance.toString();\n }\n\n return formattedNumber(this.balance, { fractionDigits: this.precision });\n };\n}\n","import {\n getHiveEngineTokensBalances,\n getHiveEngineTokensMarket,\n getHiveEngineTokensMetadata,\n} from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type {\n HiveEngineTokenBalance,\n Token,\n TokenMetadata,\n HiveEngineTokenInfo,\n} from \"../types\";\nimport { HiveEngineToken } from \"../utils\";\n\ninterface DynamicProps {\n base: number;\n quote: number;\n}\n\nexport function getHiveEngineBalancesWithUsdQueryOptions(\n account: string,\n dynamicProps?: DynamicProps,\n allTokens?: HiveEngineTokenInfo[]\n) {\n return queryOptions({\n queryKey: [\n \"assets\",\n \"hive-engine\",\n \"balances-with-usd\",\n account,\n dynamicProps,\n allTokens,\n ] as const,\n queryFn: async () => {\n if (!account) {\n throw new Error(\"[HiveEngine] No account in a balances query\");\n }\n\n const balances = await getHiveEngineTokensBalances(account);\n\n const tokens = await getHiveEngineTokensMetadata(\n balances.map((t) => t.symbol)\n );\n\n const pricePerHive = dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0;\n const providedMetrics: ReadonlyArray = Array.isArray(\n allTokens\n )\n ? allTokens\n : [];\n\n // Whatever the caller passed comes from an unfiltered metrics call, which the node\n // caps at 1000 rows – held tokens outside that page have no price and used to be\n // valued at zero, understating the wallet. Ask for the missing ones by symbol.\n const unpricedSymbols = balances\n .map((balance) => balance.symbol)\n .filter(\n (symbol) =>\n symbol !== \"SWAP.HIVE\" &&\n !providedMetrics.some((metric) => metric.symbol === symbol)\n );\n\n const metrics: ReadonlyArray = [\n ...providedMetrics,\n ...(unpricedSymbols.length\n ? await getHiveEngineTokensMarket(\n undefined,\n unpricedSymbols\n )\n : []),\n ];\n\n return balances.map((balance) => {\n const token = tokens.find((t) => t.symbol === balance.symbol);\n let tokenMetadata: TokenMetadata | undefined;\n\n if (token?.metadata) {\n try {\n tokenMetadata = JSON.parse(token.metadata) as TokenMetadata;\n } catch {\n tokenMetadata = undefined;\n }\n }\n\n const metric = metrics.find((m) => m.symbol === balance.symbol);\n const lastPrice = Number(metric?.lastPrice ?? \"0\");\n const balanceAmount = Number(balance.balance);\n\n const usdValue =\n balance.symbol === \"SWAP.HIVE\"\n ? pricePerHive * balanceAmount\n : lastPrice === 0\n ? 0\n : Number(\n (lastPrice * pricePerHive * balanceAmount).toFixed(10)\n );\n\n return new HiveEngineToken({\n symbol: balance.symbol,\n name: token?.name ?? balance.symbol,\n icon: tokenMetadata?.icon ?? \"\",\n precision: token?.precision ?? 0,\n stakingEnabled: token?.stakingEnabled ?? false,\n delegationEnabled: token?.delegationEnabled ?? false,\n balance: balance.balance,\n stake: balance.stake,\n delegationsIn: balance.delegationsIn,\n delegationsOut: balance.delegationsOut,\n usdValue,\n });\n });\n },\n enabled: !!account,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getHiveEngineTokensMetadataQueryOptions } from \"./get-hive-engine-tokens-metadata-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"./get-hive-engine-tokens-balances-query-options\";\nimport { getAllHiveEngineTokensQueryOptions } from \"./get-all-hive-engine-tokens-query-options\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"@/modules/wallet/queries/get-hive-asset-general-info-query-options\";\n\nexport function getHiveEngineTokenGeneralInfoQueryOptions(\n username?: string,\n symbol?: string\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"general-info\", username],\n enabled: !!symbol && !!username,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n const queryClient = getQueryClient();\n const hiveQuery = getHiveAssetGeneralInfoQueryOptions(username);\n await queryClient.prefetchQuery(hiveQuery);\n const hiveData = queryClient.getQueryData(\n hiveQuery.queryKey\n );\n\n const metadataList = await queryClient.ensureQueryData(\n getHiveEngineTokensMetadataQueryOptions([symbol])\n );\n\n const balanceList = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n // Scoped to this symbol: the unfiltered metrics call is capped at 1000 rows, so a\n // token outside that page reported no market and rendered a zero price.\n const marketList = await queryClient.ensureQueryData(\n getAllHiveEngineTokensQueryOptions(undefined, symbol)\n );\n\n const metadata = metadataList?.find((i) => i.symbol === symbol);\n const balance = balanceList?.find((i) => i.symbol === symbol);\n const market = marketList?.find((i) => i.symbol === symbol);\n\n const lastPrice = +(market?.lastPrice ?? \"0\");\n\n const liquidBalance = parseFloat(balance?.balance ?? \"0\");\n const stakedBalance = parseFloat(balance?.stake ?? \"0\");\n const unstakingBalance = parseFloat(balance?.pendingUnstake ?? \"0\");\n\n const parts: GeneralAssetInfo[\"parts\"] = [\n { name: \"liquid\", balance: liquidBalance },\n { name: \"staked\", balance: stakedBalance },\n ];\n\n if (unstakingBalance > 0) {\n parts.push({ name: \"unstaking\", balance: unstakingBalance });\n }\n\n return {\n name: symbol,\n title: metadata?.name ?? \"\",\n price: lastPrice === 0 ? 0 : Number(lastPrice * (hiveData?.price ?? 0)),\n accountBalance: liquidBalance + stakedBalance,\n layer: \"ENGINE\",\n parts,\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PointTransaction } from \"../types/point-transaction\";\n\ninterface PointsResponse {\n points: string;\n unclaimed_points: string;\n}\n\nexport function getPointsQueryOptions(username?: string, filter = 0) {\n return queryOptions({\n queryKey: [\"points\", username, filter],\n queryFn: async () => {\n if (!username) {\n throw new Error(\"Get points query – username wasn't provided\");\n }\n\n const name = username.replace(\"@\", \"\");\n\n // Get points\n const pointsResponse = await fetch(CONFIG.privateApiHost + \"/private-api/points\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name }),\n });\n\n if (!pointsResponse.ok) {\n throw new Error(`Failed to fetch points: ${pointsResponse.status}`);\n }\n\n const points = (await pointsResponse.json()) as PointsResponse;\n\n // Get transactions\n const transactionsResponse = await fetch(\n CONFIG.privateApiHost + \"/private-api/point-list\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name, type: filter }),\n }\n );\n\n if (!transactionsResponse.ok) {\n throw new Error(`Failed to fetch point transactions: ${transactionsResponse.status}`);\n }\n\n const transactions = (await transactionsResponse.json()) as PointTransaction[];\n\n return {\n points: points.points,\n uPoints: points.unclaimed_points,\n transactions,\n } as const;\n },\n staleTime: 30000,\n refetchOnMount: true,\n enabled: !!username,\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getPointsQueryOptions } from \"./get-points-query-options\";\n\nexport function getPointsAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getPointsQueryOptions(username));\n const data = getQueryClient().getQueryData(\n getPointsQueryOptions(username).queryKey\n );\n return {\n name: \"POINTS\",\n title: \"Ecency Points\",\n price: 0.002,\n accountBalance: +(data?.points ?? 0),\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { PointTransaction } from \"../types\";\nimport { PointTransactionType } from \"../types\";\nimport type { GeneralAssetTransaction } from \"@/modules/wallet/types\";\n\nexport function getPointsAssetTransactionsQueryOptions(\n username: string | undefined,\n type?: PointTransactionType\n) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"transactions\", username, type],\n queryFn: async () => {\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/point-list`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n type: type ?? 0,\n }),\n }\n );\n const data = (await response.json()) as PointTransaction[];\n return data.map(({ created, type, amount, id, sender, receiver, memo }) => ({\n created: new Date(created),\n type,\n results: [\n {\n amount: parseFloat(amount),\n asset: \"POINTS\",\n },\n ],\n id,\n from: sender ?? undefined,\n to: receiver ?? undefined,\n memo: memo ?? undefined,\n })) satisfies GeneralAssetTransaction[];\n },\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { getCurrencyRate } from \"@/modules/market\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"./get-hive-asset-general-info-query-options\";\nimport { getHbdAssetGeneralInfoQueryOptions } from \"./get-hbd-asset-general-info-query-options\";\nimport { getHivePowerAssetGeneralInfoQueryOptions } from \"./get-hive-power-asset-general-info-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getHiveEngineTokenGeneralInfoQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getPointsAssetGeneralInfoQueryOptions } from \"@/modules/points/queries\";\nimport {\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"./get-portfolio-query-options\";\n\ninterface Options {\n refetch?: boolean;\n currency?: string;\n}\n\nexport function getAccountWalletAssetInfoQueryOptions(\n username: string,\n asset: string,\n options: Options = { refetch: false }\n) {\n const queryClient = getQueryClient();\n const currency = options.currency ?? \"usd\";\n\n const fetchQuery = async (qo: any) => {\n if (options.refetch) {\n await queryClient.fetchQuery(qo);\n } else {\n await queryClient.prefetchQuery(qo);\n }\n return queryClient.getQueryData(qo.queryKey);\n };\n\n const convertPriceToUserCurrency = async (\n assetInfo: GeneralAssetInfo | undefined\n ): Promise => {\n if (!assetInfo || currency === \"usd\") {\n return assetInfo;\n }\n\n try {\n const conversionRate = await getCurrencyRate(currency);\n return {\n ...assetInfo,\n price: assetInfo.price * conversionRate,\n };\n } catch (error) {\n console.warn(`Failed to convert price from USD to ${currency}:`, error);\n return assetInfo;\n }\n };\n\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n\n const getPortfolioAssetInfo = async () => {\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const assetItem = portfolio.wallets.find(\n (item: PortfolioWalletItem) =>\n item.symbol.toUpperCase() === asset.toUpperCase()\n );\n\n if (!assetItem) return undefined;\n\n const parts: Array<{ name: string; balance: number }> = [];\n\n if (assetItem.liquid !== undefined && assetItem.liquid !== null) {\n parts.push({ name: \"liquid\", balance: assetItem.liquid });\n }\n\n if (assetItem.staked !== undefined && assetItem.staked !== null && assetItem.staked > 0) {\n parts.push({ name: \"staked\", balance: assetItem.staked });\n }\n\n if (assetItem.savings !== undefined && assetItem.savings !== null && assetItem.savings > 0) {\n parts.push({ name: \"savings\", balance: assetItem.savings });\n }\n\n if (assetItem.extraData && Array.isArray(assetItem.extraData)) {\n for (const extraItem of assetItem.extraData) {\n if (!extraItem || typeof extraItem !== \"object\") continue;\n\n const dataKey = extraItem.dataKey;\n const value = extraItem.value;\n\n if (typeof value === \"string\") {\n const cleanValue = value.replace(/,/g, \"\");\n const match = cleanValue.match(/[+-]?\\s*(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const numValue = Math.abs(Number.parseFloat(match[1]));\n\n if (dataKey === \"delegated_hive_power\") {\n parts.push({ name: \"outgoing_delegations\", balance: numValue });\n } else if (dataKey === \"received_hive_power\") {\n parts.push({ name: \"incoming_delegations\", balance: numValue });\n } else if (dataKey === \"powering_down_hive_power\") {\n parts.push({ name: \"pending_power_down\", balance: numValue });\n }\n }\n }\n }\n }\n\n return {\n name: assetItem.symbol,\n title: assetItem.name,\n price: assetItem.fiatRate,\n accountBalance: assetItem.balance,\n apr: assetItem.apr?.toString(),\n layer: assetItem.layer,\n pendingRewards: assetItem.pendingRewards,\n parts,\n } as GeneralAssetInfo;\n } catch {\n return undefined;\n }\n };\n\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n queryFn: async () => {\n const portfolioAssetInfo = await getPortfolioAssetInfo();\n\n if (portfolioAssetInfo && portfolioAssetInfo.price > 0) {\n return portfolioAssetInfo;\n }\n\n let assetInfo: GeneralAssetInfo | undefined;\n\n if (asset === \"HIVE\") {\n assetInfo = await fetchQuery(getHiveAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HP\") {\n assetInfo = await fetchQuery(getHivePowerAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HBD\") {\n assetInfo = await fetchQuery(getHbdAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"POINTS\") {\n assetInfo = await fetchQuery(getPointsAssetGeneralInfoQueryOptions(username));\n } else {\n // Check if it's a Hive Engine token\n const balances = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n if (balances.some((balance) => balance.symbol === asset)) {\n assetInfo = await fetchQuery(\n getHiveEngineTokenGeneralInfoQueryOptions(username, asset)\n );\n } else if (portfolioAssetInfo) {\n // Unknown asset but portfolio has data — use it as-is\n return portfolioAssetInfo;\n } else {\n throw new Error(\n `[SDK][Wallet] – unrecognized asset \"${asset}\"`\n );\n }\n }\n\n // If portfolio had rich data (parts, balance) but zero price,\n // merge the fallback price into the portfolio data\n if (portfolioAssetInfo && assetInfo && assetInfo.price > 0) {\n const converted = await convertPriceToUserCurrency(assetInfo);\n return {\n ...portfolioAssetInfo,\n price: converted!.price,\n };\n }\n\n return await convertPriceToUserCurrency(assetInfo);\n },\n });\n}\n","export enum AssetOperation {\n // Common\n Transfer = \"transfer\",\n\n // APR\n TransferToSavings = \"transfer-saving\",\n WithdrawFromSavings = \"withdraw-saving\",\n Delegate = \"delegate\",\n PowerUp = \"power-up\",\n PowerDown = \"power-down\",\n WithdrawRoutes = \"withdraw-routes\",\n ClaimInterest = \"claim-interest\",\n Swap = \"swap\",\n Convert = \"convert\",\n\n // Points\n Gift = \"gift\",\n Promote = \"promote\",\n Claim = \"claim\",\n Buy = \"buy\",\n\n // Layer 2\n Stake = \"stake\",\n Unstake = \"unstake\",\n Undelegate = \"undelegate\",\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for transferring tokens.\n */\nexport interface TransferPayload {\n /** Recipient account */\n to: string;\n /** Amount with asset symbol (e.g., \"1.000 HIVE\", \"5.000 HBD\") */\n amount: string;\n /** Transfer memo */\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring tokens.\n *\n * This mutation broadcasts a transfer operation to send HIVE or HBD\n * to another account. **Requires ACTIVE authority**.\n *\n * Uses `useBroadcastMutation` with the smart auth strategy:\n * - Adapter determines login type and dispatches to appropriate method\n * - If active key not available (common on web), triggers `showAuthUpgradeUI`\n * - Supports keychain, hivesigner, hiveauth, and direct key signing\n *\n * @param username - The username sending the transfer (required for broadcast)\n * @param auth - Authentication context with platform adapter\n *\n * @returns React Query mutation result\n */\nexport function useTransfer(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer\"],\n username,\n (payload) => [\n buildTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildPointTransferOp } from \"@/modules/operations/builders\";\n\nexport interface TransferPointPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring Ecency points.\n *\n * Uses `ecency_point_transfer` custom_json operation with ACTIVE authority.\n */\nexport function useTransferPoint(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-point\"],\n username,\n (payload) => [\n buildPointTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildDelegateVestingSharesOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for delegating Hive Power (vesting shares).\n */\nexport interface DelegateVestingSharesPayload {\n /** Account receiving HP delegation */\n delegatee: string;\n /** Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\"). Use \"0.000000 VESTS\" to remove delegation. */\n vestingShares: string;\n}\n\n/**\n * React Query mutation hook for delegating Hive Power (HP).\n *\n * This mutation broadcasts a delegate_vesting_shares operation to delegate HP\n * to another account. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username delegating HP (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Delegation operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Delegation Mechanics:**\n * - Delegated HP can be used by the delegatee for resource credits\n * - Delegatee CANNOT power down or transfer the delegated HP\n * - Delegation can be removed by setting vestingShares to \"0.000000 VESTS\"\n * - Removing delegation has a 5-day cooldown before HP returns to delegator\n *\n * **Post-Broadcast Actions:**\n * - Invalidates delegations list cache to show updated delegation\n * - Invalidates account data for both delegator and delegatee\n *\n * @example\n * ```typescript\n * const delegateMutation = useDelegateVestingShares(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Delegate HP\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '1000.000000 VESTS'\n * });\n *\n * // Remove delegation\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '0.000000 VESTS'\n * });\n * ```\n */\nexport function useDelegateVestingShares(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-vesting-shares\"],\n username,\n (payload) => [\n buildDelegateVestingSharesOp(\n username!,\n payload.delegatee,\n payload.vestingShares\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.delegatee),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildSetWithdrawVestingRouteOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for setting withdraw vesting route.\n */\nexport interface SetWithdrawVestingRoutePayload {\n /** Account receiving withdrawn vesting */\n toAccount: string;\n /** Percentage to route (0-10000, where 10000 = 100%). Already scaled. */\n percent: number;\n /** Auto convert to vesting (power up) */\n autoVest: boolean;\n}\n\n/**\n * React Query mutation hook for setting withdraw vesting route.\n *\n * This mutation broadcasts a set_withdraw_vesting_route operation to configure\n * where withdrawn VESTS (power down) are sent. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username setting withdraw route (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Withdraw route operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Withdraw Route Mechanics:**\n * - Routes a percentage of power down (withdraw_vesting) to another account\n * - Percent must be between 0-10000 (where 10000 = 100%)\n * - Multiple routes can be set, total cannot exceed 100%\n * - autoVest=true converts withdrawn VESTS to HP in destination account\n * - autoVest=false converts withdrawn VESTS to liquid HIVE\n *\n * **Post-Broadcast Actions:**\n * - Invalidates withdraw routes cache to show updated routes\n * - Invalidates account data for both accounts\n *\n * @example\n * ```typescript\n * const setRouteMutation = useSetWithdrawVestingRoute(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Route 50% of power down to another account (auto vest)\n * setRouteMutation.mutate({\n * toAccount: 'alice',\n * percent: 5000, // 50% (already scaled)\n * autoVest: true\n * });\n *\n * // Route 100% of power down to another account (liquid HIVE)\n * setRouteMutation.mutate({\n * toAccount: 'bob',\n * percent: 10000, // 100% (already scaled)\n * autoVest: false\n * });\n * ```\n */\nexport function useSetWithdrawVestingRoute(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"set-withdraw-vesting-route\"],\n username,\n (payload) => [\n buildSetWithdrawVestingRouteOp(\n username!,\n payload.toAccount,\n payload.percent,\n payload.autoVest\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.wallet.withdrawRoutes(username!),\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.toAccount)\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface TransferEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n memo: string;\n}\n\nexport function useTransferEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"transfer\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n memo: payload.memo\n }\n });\n return [[\"custom_json\", {\n required_auths: [username!],\n required_posting_auths: [],\n id: \"ssc-mainnet-hive\",\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\nexport function useTransferToSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-savings\"],\n username,\n (payload) => [\n buildTransferToSavingsOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferFromSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferFromSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useTransferFromSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-from-savings\"],\n username,\n (payload) => [\n buildTransferFromSavingsOp(username!, payload.to, payload.amount, payload.memo, payload.requestId)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToVestingOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToVestingPayload {\n to: string;\n amount: string;\n}\n\nexport function useTransferToVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-vesting\"],\n username,\n (payload) => [\n buildTransferToVestingOp(username!, payload.to, payload.amount)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildWithdrawVestingOp } from \"@/modules/operations/builders\";\n\nexport interface WithdrawVestingPayload {\n vestingShares: string;\n}\n\nexport function useWithdrawVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"withdraw-vesting\"],\n username,\n (payload) => [\n buildWithdrawVestingOp(username!, payload.vestingShares)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildConvertOp, buildCollateralizedConvertOp } from \"@/modules/operations/builders\";\n\nexport interface ConvertPayload {\n amount: string;\n requestId: number;\n collateralized?: boolean;\n}\n\nexport function useConvert(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"convert\"],\n username,\n (payload) => [\n payload.collateralized\n ? buildCollateralizedConvertOp(username!, payload.amount, payload.requestId)\n : buildConvertOp(username!, payload.amount, payload.requestId)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimInterestOps } from \"@/modules/operations/builders\";\n\nexport interface ClaimInterestPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useClaimInterest(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-interest\"],\n username,\n (payload) => buildClaimInterestOps(username!, payload.to, payload.amount, payload.memo, payload.requestId),\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimRewardBalanceOp } from \"@/modules/operations/builders\";\n\nexport interface ClaimRewardsPayload {\n rewardHive: string;\n rewardHbd: string;\n rewardVests: string;\n}\n\nconst CLAIM_REWARDS_INVALIDATION_DELAY_MS = 5000;\nconst pendingInvalidationTimers = new Map>();\n\nexport function useClaimRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-rewards\"],\n username,\n (payload) => [\n buildClaimRewardBalanceOp(username!, payload.rewardHive, payload.rewardHbd, payload.rewardVests)\n ],\n () => {\n const timerKey = username ?? \"__anonymous__\";\n const keysToInvalidate = [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n QueryKeys.assets.hiveGeneralInfo(username!),\n QueryKeys.assets.hbdGeneralInfo(username!),\n QueryKeys.assets.hivePowerGeneralInfo(username!),\n ];\n\n // Delay invalidation to allow blockchain to propagate the transaction.\n // Immediate invalidation would fetch stale (pre-confirmation) data.\n const existingTimer = pendingInvalidationTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n pendingInvalidationTimers.delete(timerKey);\n }\n\n const timer = setTimeout(async () => {\n try {\n const qc = getQueryClient();\n const results = await Promise.allSettled(\n keysToInvalidate.map((key) => qc.invalidateQueries({ queryKey: key }))\n );\n const rejected = results.filter((result) => result.status === \"rejected\");\n if (rejected.length > 0) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation rejected\", {\n username,\n rejectedCount: rejected.length,\n rejected\n });\n }\n } catch (error) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation failed\", {\n username,\n error\n });\n } finally {\n pendingInvalidationTimers.delete(timerKey);\n }\n }, CLAIM_REWARDS_INVALIDATION_DELAY_MS);\n\n pendingInvalidationTimers.set(timerKey, timer);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface DelegateEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useDelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"delegate\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UndelegateEngineTokenPayload {\n from: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUndelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"undelegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"undelegate\",\n contractPayload: {\n symbol: payload.symbol,\n from: payload.from,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface StakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useStakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"stake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"stake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UnstakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUnstakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"unstake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"unstake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface ClaimEngineRewardsPayload {\n tokens: string[];\n}\n\nexport function useClaimEngineRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-engine-rewards\"],\n username,\n (payload) => {\n const json = JSON.stringify(payload.tokens.map((symbol) => ({ symbol })));\n return [[\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [username!],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface EngineMarketOrderPayload {\n action: \"buy\" | \"sell\" | \"cancel\";\n symbol: string;\n quantity?: string;\n price?: string;\n orderId?: string;\n orderType?: \"buy\" | \"sell\";\n}\n\nexport function useEngineMarketOrder(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"engine-market-order\"],\n username,\n (payload) => {\n let contractPayload: Record;\n let contractAction: string;\n\n if (payload.action === \"cancel\") {\n contractAction = \"cancel\";\n contractPayload = {\n type: payload.orderType!,\n id: payload.orderId!,\n };\n } else {\n contractAction = payload.action;\n contractPayload = {\n symbol: payload.symbol,\n quantity: payload.quantity!,\n price: payload.price!,\n };\n }\n\n const json = JSON.stringify({\n contractName: \"market\",\n contractAction,\n contractPayload,\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport { AssetOperation } from \"../types\";\nimport {\n buildTransferOp,\n buildTransferToSavingsOp,\n buildTransferFromSavingsOp,\n buildTransferToVestingOp,\n buildWithdrawVestingOp,\n buildDelegateVestingSharesOp,\n buildSetWithdrawVestingRouteOp,\n buildConvertOp,\n buildClaimInterestOps,\n buildPointTransferOp,\n buildEngineOp,\n buildEngineClaimOp,\n} from \"@/modules/operations/builders\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface WalletOperationPayload {\n from: string;\n to?: string;\n amount?: string;\n memo?: string;\n request_id?: number;\n from_account?: string;\n to_account?: string;\n percent?: number;\n auto_vest?: boolean;\n mode?: string;\n [key: string]: unknown;\n}\n\nfunction buildHiveOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\", memo = \"\" } = payload;\n const requestId = payload.request_id ?? (Date.now() >>> 0);\n\n switch (asset) {\n case \"HIVE\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.PowerUp:\n return [buildTransferToVestingOp(from, to, amount)];\n }\n break;\n\n case \"HBD\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.ClaimInterest:\n return buildClaimInterestOps(from, to, amount, memo, requestId);\n case AssetOperation.Convert:\n return [buildConvertOp(from, amount, Math.floor(Date.now() / 1000))];\n }\n break;\n\n case \"HP\":\n switch (operation) {\n case AssetOperation.PowerDown:\n return [buildWithdrawVestingOp(from, amount)];\n case AssetOperation.Delegate:\n return [buildDelegateVestingSharesOp(from, to, amount)];\n case AssetOperation.WithdrawRoutes:\n return [buildSetWithdrawVestingRouteOp(\n payload.from_account ?? from,\n payload.to_account ?? to,\n payload.percent ?? 0,\n payload.auto_vest ?? false\n )];\n }\n break;\n\n case \"POINTS\":\n if (operation === AssetOperation.Transfer || operation === AssetOperation.Gift) {\n return [buildPointTransferOp(from, to, amount, memo)];\n }\n break;\n }\n\n return null;\n}\n\nfunction buildEngineOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\" } = payload;\n const quantity = typeof amount === \"string\" && amount.includes(\" \")\n ? amount.split(\" \")[0]\n : String(amount);\n\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildEngineOp(from, \"transfer\", {\n symbol: asset, to, quantity, memo: payload.memo ?? \"\"\n })];\n case AssetOperation.Stake:\n return [buildEngineOp(from, \"stake\", { symbol: asset, to, quantity })];\n case AssetOperation.Unstake:\n return [buildEngineOp(from, \"unstake\", { symbol: asset, to, quantity })];\n case AssetOperation.Delegate:\n return [buildEngineOp(from, \"delegate\", { symbol: asset, to, quantity })];\n case AssetOperation.Undelegate:\n return [buildEngineOp(from, \"undelegate\", { symbol: asset, from: to, quantity })];\n case AssetOperation.Claim:\n return [buildEngineClaimOp(from, [asset])];\n }\n\n return null;\n}\n\n/**\n * Determines authority level for a wallet operation.\n * Engine token claims use posting authority; everything else uses active.\n */\nfunction getWalletOperationAuthority(operation: AssetOperation): AuthorityLevel {\n if (operation === AssetOperation.Claim) {\n return 'posting';\n }\n return 'active';\n}\n\n/**\n * Meta-mutation hook that dispatches wallet operations based on asset and operation type.\n *\n * Supports HIVE, HBD, HP, POINTS, and Hive Engine tokens.\n * Uses `useBroadcastMutation` for unified auth handling via `AuthContextV2`.\n *\n * @param username - The Hive account performing the operation\n * @param asset - The asset symbol (e.g., \"HIVE\", \"HBD\", \"HP\", \"POINTS\", or engine token)\n * @param operation - The operation type from AssetOperation enum\n * @param auth - Auth context for broadcasting\n */\nexport function useWalletOperation(\n username: string | undefined,\n asset: string,\n operation: AssetOperation,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n operation as any\n );\n\n return useBroadcastMutation(\n [\"ecency-wallets\", asset, operation],\n username,\n (payload) => {\n // Try native Hive + POINTS operations\n const hiveOps = buildHiveOperations(asset, operation, payload);\n if (hiveOps) return hiveOps;\n\n // Try engine token operations\n const engineOps = buildEngineOperations(asset, operation, payload);\n if (engineOps) return engineOps;\n\n throw new Error(`[SDK][Wallet] – no operation builder for asset=\"${asset}\" operation=\"${operation}\"`);\n },\n () => {\n recordActivity();\n\n const keysToInvalidate: (string | undefined)[][] = [];\n\n // Invalidate asset-specific queries (prefix-matches all currency variants)\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, asset]);\n\n if (asset === \"HIVE\") {\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, \"HP\"]);\n }\n\n // Invalidate portfolio (prefix-matches all currency/filter variants)\n keysToInvalidate.push([\"wallet\", \"portfolio\", \"v2\", username]);\n\n // Delay invalidation to allow blockchain to process\n setTimeout(() => {\n keysToInvalidate.forEach((key) => {\n getQueryClient().invalidateQueries({ queryKey: key });\n });\n }, 5000);\n },\n auth,\n getWalletOperationAuthority(operation),\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDelegateRcOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface DelegateRcPayload {\n to: string;\n maxRc: string | number;\n}\n\nexport function useDelegateRc(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-rc\"],\n username,\n ({ to, maxRc }) => [\n buildDelegateRcOp(username!, to, maxRc)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n QueryKeys.resourceCredits.account(username!),\n QueryKeys.resourceCredits.account(variables.to),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting for a witness.\n */\nexport interface WitnessVotePayload {\n /** Witness account name to vote for/against */\n witness: string;\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting for a Hive witness.\n *\n * This mutation broadcasts an account_witness_vote operation to vote for\n * or remove a vote from a witness.\n *\n * @param username - The username voting for the witness (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account data cache to show updated witness votes\n * - Invalidates witness votes cache\n *\n * **Vote Types:**\n * - approve: true - Vote for the witness\n * - approve: false - Remove your vote from the witness\n *\n * **Authority Required:**\n * - Active authority is required for witness voting\n *\n * @example\n * ```typescript\n * const witnessVoteMutation = useWitnessVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Vote for a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: true\n * });\n *\n * // Remove vote from a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: false\n * });\n * ```\n */\nexport function useWitnessVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"vote\"],\n username,\n ({ witness, approve }) => [\n buildWitnessVoteOp(username!, witness, approve)\n ],\n async () => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.votes(username)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useWitnessVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for witness votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessProxyOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface WitnessProxyPayload {\n proxy: string;\n}\n\nexport function useWitnessProxy(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"proxy\"],\n username,\n ({ proxy }) => [\n buildWitnessProxyOp(username!, proxy)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.proxy(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Witness, WitnessVotersResponse } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\n\ntype WitnessPage = Witness[];\ntype WitnessCursor = number;\n\ninterface HafbeWitness {\n witness_name: string;\n rank: number;\n url: string;\n vests: string;\n votes_daily_change: string;\n voters_num: number;\n voters_num_daily_change: number;\n price_feed: number;\n bias: number;\n feed_updated_at: string;\n block_size: number;\n signing_key: string;\n version: string;\n missed_blocks: number;\n hbd_interest_rate: number;\n last_confirmed_block_num: number;\n account_creation_fee: number;\n}\n\ninterface HafbeWitnessesResponse {\n total_witnesses: number;\n total_pages: number;\n witnesses: HafbeWitness[];\n}\n\n/**\n * Map a hafbe-api witness to the SDK Witness shape so existing consumers\n * (e.g. the web app's transform()) keep working unchanged.\n */\nfunction mapRestWitness(w: HafbeWitness): Witness {\n return {\n owner: w.witness_name,\n total_missed: w.missed_blocks,\n url: w.url,\n props: {\n account_creation_fee: `${(w.account_creation_fee / 1000).toFixed(3)} HIVE`,\n account_subsidy_budget: 0,\n maximum_block_size: w.block_size,\n },\n hbd_exchange_rate: {\n base: `${w.price_feed.toFixed(3)} HBD`,\n },\n available_witness_account_subsidies: 0,\n running_version: w.version,\n signing_key: w.signing_key,\n last_hbd_exchange_update: w.feed_updated_at,\n rank: w.rank,\n vests: w.vests,\n voters_num: w.voters_num,\n voters_num_daily_change: w.voters_num_daily_change,\n price_feed: w.price_feed,\n hbd_interest_rate: w.hbd_interest_rate,\n last_confirmed_block_num: w.last_confirmed_block_num,\n };\n}\n\n/**\n * Get witnesses ordered by vote count (infinite scroll).\n * Uses the hafbe-api REST endpoint - replaces multi-call RPC assembly\n * with a single paginated call. Includes voter count, rank, and other\n * data that was previously unavailable.\n *\n * @param limit - Number of witnesses per page\n */\nexport function getWitnessesInfiniteQueryOptions(limit: number) {\n return infiniteQueryOptions<\n WitnessPage,\n Error,\n InfiniteData,\n (string | number)[],\n WitnessCursor\n >({\n queryKey: QueryKeys.witnesses.list(limit),\n initialPageParam: 1 as WitnessCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WitnessCursor }) => {\n const response = (await callREST(\n \"hafbe\",\n \"/witnesses\",\n {\n \"page-size\": limit,\n page: pageParam,\n }\n )) as HafbeWitnessesResponse;\n\n return response.witnesses.map(mapRestWitness);\n },\n\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n lastPage.length === limit ? lastPageParam + 1 : undefined,\n });\n}\n\nexport type WitnessVoterSortField =\n | \"vests\"\n | \"account_vests\"\n | \"proxied_vests\"\n | \"account_name\"\n | \"timestamp\";\n\nexport type WitnessVoterSortDirection = \"asc\" | \"desc\";\n\n/**\n * Get a single page of voters for a specific witness.\n *\n * Server-side pagination + sort: each page click fetches that page directly\n * from hafbe rather than scrolling through accumulated pages on the client.\n *\n * @param witness - Witness account name\n * @param page - 1-based page index\n * @param pageSize - Number of voters per page\n * @param sort - Field to sort by\n * @param direction - asc or desc\n */\nexport function getWitnessVotersPageQueryOptions(\n witness: string,\n page: number,\n pageSize: number,\n sort: WitnessVoterSortField = \"vests\",\n direction: WitnessVoterSortDirection = \"desc\"\n) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voters(witness, page, pageSize, sort, direction),\n queryFn: async ({ signal }) => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters\",\n {\n \"witness-name\": witness,\n \"page-size\": pageSize,\n page,\n sort,\n direction,\n },\n undefined,\n undefined,\n signal\n )) as WitnessVotersResponse;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n\n/**\n * Get total voter count for a witness.\n *\n * @param witness - Witness account name\n */\nexport function getWitnessVoterCountQueryOptions(witness: string) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voterCount(witness),\n queryFn: async () => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters/count\",\n { \"witness-name\": witness }\n )) as number;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n","export enum PointTransactionType {\n CHECKIN = 10,\n LOGIN = 20,\n CHECKIN_EXTRA = 30,\n POST = 100,\n COMMENT = 110,\n VOTE = 120,\n REBLOG = 130,\n DELEGATION = 150,\n REFERRAL = 160,\n COMMUNITY = 170,\n TRANSFER_SENT = 998,\n TRANSFER_INCOMING = 999,\n MINTED = 991,\n /**\n * Points burned out of supply rather than moved to the treasury. Written by the\n * AI surfaces (assist, image, transcribe), which pay a real per-request vendor\n * bill, so the Points are consumed rather than parked.\n *\n * The row carries no counterparty at all, which is what distinguishes it from\n * TRANSFER_SENT: `sender` and `receiver` are both null. A refund of a burn comes\n * back as this same type with a positive amount, so read the sign rather than\n * assuming a burn is always a debit.\n */\n BURNED = 997,\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPointsQueryOptions } from \"../queries\";\nimport type { Points } from \"../types\";\n\n/**\n * POST a points claim and return the parsed JSON body.\n *\n * The endpoint normally answers with JSON, but an edge/proxy layer can\n * occasionally return a 2xx whose body is an HTML interstitial or plain text\n * (ECENCY-NEXT-1FCJ). Calling `response.json()` on that throws a bare\n * `SyntaxError` that names neither the endpoint nor the cause. Instead we check\n * the content type first and fail with a STABLE, low-cardinality message\n * (content type + status) — never the raw body — so these group as a single\n * Sentry issue instead of fragmenting on every distinct HTML page.\n */\nexport async function claimPointsRequest(\n username: string | undefined,\n accessToken: string | undefined\n) {\n if (!username) {\n throw new Error(\"[SDK][Points][Claim] – username wasn't provided\");\n }\n\n if (!accessToken) {\n throw new Error(\"[SDK][Points][Claim] – access token wasn't found\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/points-claim\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n }\n );\n\n // Media types are case-insensitive; normalise once and reuse in every branch.\n const contentType = (response.headers.get(\"content-type\") ?? \"\")\n .split(\";\")[0]\n .trim()\n .toLowerCase();\n const body = await response.text();\n\n if (!response.ok) {\n if (response.status === 406) {\n try {\n return JSON.parse(body);\n } catch {\n return { message: body, code: response.status };\n }\n }\n // Only fold a short JSON error body into the message; an HTML gateway page\n // (e.g. 502/503) would otherwise fragment the Sentry group per distinct\n // page — the same problem the non-JSON guard below avoids for a 2xx body.\n const detail =\n body && contentType.includes(\"json\") ? `: ${body.slice(0, 200)}` : \"\";\n throw new Error(\n `[SDK][Points][Claim] – failed with status ${response.status}${detail}`\n );\n }\n\n if (!contentType.includes(\"json\")) {\n throw new Error(\n `[SDK][Points][Claim] – expected JSON but received \"${contentType || \"empty\"}\" response (status ${response.status})`\n );\n }\n\n try {\n return JSON.parse(body);\n } catch {\n throw new Error(\n `[SDK][Points][Claim] – malformed JSON response (status ${response.status})`\n );\n }\n}\n\nexport function useClaimPoints(\n username: string | undefined,\n accessToken: string | undefined,\n onSuccess?: () => void,\n onError?: Parameters[\"0\"][\"onError\"]\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n \"points-claimed\"\n );\n\n return useMutation({\n mutationFn: () => claimPointsRequest(username, accessToken),\n onError,\n onSuccess: () => {\n recordActivity();\n\n getQueryClient().setQueryData(\n getPointsQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n return {\n ...data,\n points: (\n parseFloat(data.points) + parseFloat(data.uPoints)\n ).toFixed(3),\n uPoints: \"0\",\n };\n }\n );\n\n onSuccess?.();\n },\n });\n}\n","// A token only counts at the start of the query or after whitespace, matching\n// the search API's parser. Unanchored, these matched inside ordinary words:\n// \"prototype:v2\" read as type=v2 and the API rejected it as an invalid type,\n// \"subcategory:hive-1\" filtered on category=hive-1 with a stray \"sub\" left as\n// required text. The boundary is captured rather than looked behind so it can\n// be put back when the token is stripped, keeping the neighbouring words apart\n// (a lookbehind would also be fine here, but this stays portable).\nconst author_re = /(^|\\s)author:([^\\s]+)/g;\nconst type_re = /(^|\\s)type:([^\\s]+)/g;\nconst category_re = /(^|\\s)category:([^\\s]+)/g;\nconst tag_re = /(^|\\s)tag:([^\\s]+)/g;\n\n// Index of the token value in a match; group 1 is the boundary.\nconst VALUE = 2;\n\nexport enum SearchType {\n ALL = \"\",\n POST = \"post\",\n COMMENT = \"comment\"\n}\n\nexport const MAX_SEARCH_TAGS = 5;\n\n// The search API applies both caps itself (see query_validator); mirrored here\n// so the client can refuse instead of turning a 400 into an empty result list.\nexport const MAX_SEARCH_QUERY_LENGTH = 100;\n\n/**\n * Both parsers match a token with /author:([^\\s]+)/, so a value containing a\n * space stops filtering at the space and the remainder silently becomes\n * required free text. Keep the first word only, which is what the API would\n * have filtered on anyway.\n */\nfunction firstToken(value: string): string {\n return value.trim().split(/\\s+/)[0] ?? \"\";\n}\n\n/**\n * Hive account names are lowercase and the API filters authors with an exact\n * term query, so \"@Demo\" has to become \"demo\" or it matches nothing.\n */\nexport function normalizeSearchAuthor(value: string): string {\n return firstToken(value).replace(/^@+/, \"\").toLowerCase();\n}\n\nexport function normalizeSearchCategory(value: string): string {\n // Leading \"#\" goes for the same reason it goes on tags: a category is matched\n // by an exact term query, and users write categories the way they write tags.\n return firstToken(value).replace(/^#+/, \"\").toLowerCase();\n}\n\n/**\n * Accepts what a user actually types (\"travel, photography\", \"#travel travel\")\n * and returns exact-match ready tags, deduped in first-seen order.\n */\nexport function normalizeSearchTags(value: string): string[] {\n const seen = new Set();\n\n return value\n .split(/[\\s,]+/)\n .map((tag) => tag.replace(/^#+/, \"\").toLowerCase())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n}\n\nexport interface SearchQueryParts {\n search?: string;\n author?: string;\n type?: SearchType;\n category?: string;\n /** Raw user input (\"a, b\") or an already split list. */\n tags?: string | string[];\n}\n\nexport interface BuiltSearchQuery {\n /** The `q` value to put in the URL. Round-trips through `SearchQuery`. */\n q: string;\n search: string;\n author: string;\n type: SearchType;\n category: string;\n tags: string[];\n}\n\n/**\n * Assembles the single `q` string that both this app and the search API parse\n * back into filters. Returns the normalized parts too, because the caller has\n * to validate the tag count and the total length before navigating.\n */\nexport function buildSearchQuery({\n search = \"\",\n author = \"\",\n type = SearchType.ALL,\n category = \"\",\n tags = []\n}: SearchQueryParts): BuiltSearchQuery {\n const normalizedSearch = search.trim().replace(/\\s+/g, \" \");\n const normalizedAuthor = normalizeSearchAuthor(author);\n const normalizedCategory = normalizeSearchCategory(category);\n const normalizedTags = normalizeSearchTags(Array.isArray(tags) ? tags.join(\",\") : tags);\n\n const parts = [normalizedSearch];\n\n if (normalizedAuthor) {\n parts.push(`author:${normalizedAuthor}`);\n }\n\n if (type) {\n parts.push(`type:${type}`);\n }\n\n if (normalizedCategory) {\n parts.push(`category:${normalizedCategory}`);\n }\n\n if (normalizedTags.length > 0) {\n // No space after the commas: a tag token ends at the first space, so\n // anything past one stops filtering and becomes required free text.\n parts.push(`tag:${normalizedTags.join(\",\")}`);\n }\n\n return {\n // Dropping the empty free text here is what keeps a filter-only query from\n // starting with a space.\n q: parts.filter((part) => part !== \"\").join(\" \"),\n search: normalizedSearch,\n author: normalizedAuthor,\n type,\n category: normalizedCategory,\n tags: normalizedTags\n };\n}\n\nexport class SearchQuery {\n public query: string = \"\";\n public search: string = \"\";\n public author: string = \"\";\n public type: SearchType = SearchType.ALL;\n public category: string = \"\";\n public tags: string[] = [];\n\n constructor(_query: string) {\n this.query = _query;\n this.search = _query;\n\n this.grabAuthor();\n this.grabType();\n this.grabCategory();\n this.grabTags();\n this.grabSearch();\n }\n\n private grab = (re: RegExp): string => {\n // @ts-ignore\n const matches = [...this.query.matchAll(re)];\n if (matches.length > 0) {\n return matches[0][VALUE].trim();\n }\n\n return \"\";\n };\n\n private grabAuthor = () => {\n this.author = this.grab(author_re);\n };\n\n private grabType = () => {\n const type = this.grab(type_re) as SearchType;\n if (Object.values(SearchType).includes(type)) {\n this.type = type as SearchType;\n }\n };\n\n private grabCategory = () => {\n this.category = this.grab(category_re);\n };\n\n private grabTags = () => {\n // Every tag: token counts, not just the first one. The API joins all of its\n // own tag: matches before splitting on commas, so reading only the first\n // token here under-reports the tags a query really applies and let a query\n // past the MAX_SEARCH_TAGS guard that the API then rejects with a 400.\n // A trailing comma (\"tag:a,\") must not yield an empty tag either - it would\n // be shown back as a phantom tag and counted against the same cap.\n const seen = new Set();\n\n this.tags = [...this.query.matchAll(tag_re)]\n .flatMap((match) => match[VALUE].split(\",\"))\n .map((tag) => tag.trim())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n };\n\n private grabSearch = () => {\n [author_re, type_re, category_re, tag_re].forEach((r) => {\n // Put the captured boundary back, or removing a mid-query token would\n // run the words either side of it together.\n this.search = this.search.replace(r, \"$1\");\n });\n\n while (this.search.indexOf(\" \") !== -1) {\n this.search = this.search.replace(\" \", \" \");\n }\n\n this.search = this.search.trim();\n };\n}\n","export type RequestError = Error & { status?: number; data?: unknown };\n\n/**\n * Reads a response body and, when the status is not OK, throws an error that\n * keeps both the status and the parsed body.\n *\n * The search backend answers a malformed query with an explanation the user can\n * act on (\"Maximum 5 tags!\", \"Query string too long! ...\", \"Parsed query is\n * empty!\"). Dropping the body leaves callers with a bare status: they can\n * neither tell the user what to change nor tell a deterministic rejection from\n * a transient failure worth retrying.\n *\n * Module-internal on purpose - it is not part of the published SDK surface.\n */\nexport async function parseJsonResponse(\n response: Response,\n /**\n * Shape guard for a SUCCESSFUL body. JSON.parse happily accepts `null`,\n * `\"maintenance\"` and `{\"error\": \"...\"}`, none of which are the payload the\n * caller asked for, and all of which would otherwise be returned as `T` and\n * cached as valid data. Callers that have a known shape pass a guard so an\n * unexpected 200 fails here instead of at the first property access.\n */\n isValid?: (data: unknown) => boolean\n): Promise {\n const parseBody = async (): Promise => {\n // Read the body ONCE. Calling json() and then falling back to text() on the\n // same response cannot work: json() consumes the stream, so the fallback\n // always threw and the raw body of a non-JSON failure (an HTML error page\n // from a proxy) was silently lost.\n let raw: string;\n try {\n raw = await response.text();\n } catch {\n return undefined;\n }\n\n if (raw === \"\") {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n // Raw text is a diagnostic, not a payload. On a failed response it is\n // what the caller shows or logs, but on a 2xx returning it would hand\n // back a string typed as the parsed body: callers reading `.results`\n // would see undefined and report an empty result set, and the\n // controversial/rising pager would throw on `resp.results.length`. An\n // unparseable success is a failure, so let it fall through to the throw\n // below rather than caching a string as a SearchResponse.\n return response.ok ? undefined : raw;\n }\n };\n\n const data = await parseBody();\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n if (data === undefined || (isValid !== undefined && !isValid(data))) {\n throw new Error(\"Response body was empty, invalid JSON, or not the expected shape\");\n }\n\n return data as T;\n}\n\n/**\n * The contract every /search-api consumer relies on: an object carrying a\n * `results` array. Enough to keep a stray 200 from reaching `resp.results.length`.\n */\nexport function isSearchResponse(data: unknown): boolean {\n return (\n typeof data === \"object\" &&\n data !== null &&\n Array.isArray((data as { results?: unknown }).results)\n );\n}\n","import { isServer } from \"@tanstack/react-query\";\nimport type { RequestError } from \"./parse-json-response\";\n\n/**\n * The app-wide default the browser QueryClient uses. Restated because supplying\n * a `retry` callback replaces React Query's own budget rather than adding to it.\n *\n * The 0 on the server is load-bearing: server QueryClients set `retry: false`\n * globally, and these queries are prefetched during SSR, so a flat 3 would\n * resurrect SSR retries against a single-region backend.\n */\nconst MAX_RETRIES = isServer ? 0 : 3;\n\n/**\n * Shared retry rule for every /search-api call.\n *\n * A 4xx is the backend rejecting the query itself (too many tags, over the\n * length cap, nothing left to search once the filters are parsed out).\n * Repeating it repeats the same answer, so the only effect is four requests\n * over several seconds before the UI can say what to change.\n *\n * 408 and 429 are the exceptions: they describe when the request arrived rather\n * than what it contained, and backing off is what resolves them. A client-side\n * timeout aborts the fetch and carries no status at all, so it falls through to\n * the normal budget like any other transport failure.\n */\nexport function searchRetryPolicy(failureCount: number, error: Error): boolean {\n const { status } = error as RequestError;\n const isTransient = status === 408 || status === 429;\n\n if (status !== undefined && status >= 400 && status < 500 && !isTransient) {\n return false;\n }\n\n return failureCount < MAX_RETRIES;\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function searchQueryOptions(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number\n) {\n return queryOptions({\n queryKey: QueryKeys.search.results(q, sort, hideLow, since, scroll_id, votes),\n queryFn: async ({ signal }) => {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (scroll_id) data.scroll_id = scroll_id;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n retry: searchRetryPolicy,\n });\n}\n\ntype PageParam = {\n sid: string | undefined;\n hasNextPage: boolean;\n};\n\nexport function getControversialRisingInfiniteQueryOptions(\n what: string,\n tag: string,\n enabled = true\n) {\n return infiniteQueryOptions<\n SearchResponse,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.search.controversialRising(what, tag),\n initialPageParam: { sid: undefined, hasNextPage: true } as PageParam,\n\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n if (!pageParam.hasNextPage) {\n return {\n hits: 0,\n took: 0,\n results: [],\n };\n }\n\n let sinceDate: Date | undefined;\n const now = new Date();\n\n switch (tag) {\n case \"today\":\n sinceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case \"week\":\n sinceDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case \"month\":\n sinceDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case \"year\":\n sinceDate = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);\n break;\n default:\n sinceDate = undefined;\n }\n\n const q = \"* type:post\";\n const sort = what === \"rising\" ? \"children\" : what;\n const since = sinceDate ? sinceDate.toISOString().split(\".\")[0] : undefined;\n const hideLow = \"0\";\n const votes = tag === \"today\" ? 50 : 200;\n\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (pageParam.sid) data.scroll_id = pageParam.sid;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n\n getNextPageParam: (resp: SearchResponse): PageParam => {\n return {\n sid: resp?.scroll_id,\n hasNextPage: resp.results.length > 0,\n };\n },\n\n enabled,\n retry: searchRetryPolicy,\n });\n}\n","import { CONFIG, INTERNAL_API_TIMEOUT_MS, getBoundFetch, withTimeoutSignal } from \"@/modules/core\";\nimport { SearchResponse } from \"./types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"./parse-json-response\";\n\nexport async function search(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number,\n signal?: AbortSignal\n): Promise {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) {\n data.since = since;\n }\n if (scroll_id) {\n data.scroll_id = scroll_id;\n }\n if (votes) {\n data.votes = votes;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function similar(\n params: {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n tags?: string[];\n since?: string;\n },\n signal?: AbortSignal,\n timeoutMs: number = INTERNAL_API_TIMEOUT_MS\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/similar\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(params),\n signal: withTimeoutSignal(timeoutMs, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function searchPath(q: string, signal?: AbortSignal): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n const data = await parseJsonResponse(response, Array.isArray);\n return data?.length > 0 ? data : [q];\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { similar } from \"../requests\";\nimport { SearchResult } from \"../types/search-response\";\n\n// Without a recency window the backend ranks across the entire historical\n// index and surfaces years-old posts. Constrain suggestions to the last\n// ~6 months so related posts stay fresh (it also bounds the backend's\n// more_like_this candidate set, which is what keeps it fast).\nconst SIMILAR_ENTRIES_SINCE_MS = 182 * 24 * 60 * 60 * 1000;\n\n// How many results the suggestions strip renders at most.\nconst SIMILAR_ENTRIES_TARGET = 4;\n\n// more_like_this only extracts a handful of significant terms, so an excerpt is\n// enough signal and keeps the request payload small.\nconst SIMILAR_ENTRIES_BODY_LIMIT = 3000;\n\n// On the server the prefetch sits on the entry-page render path, and the search\n// backend is single-region (EU) — so anything slower than this stalls SSR for a\n// non-essential \"related posts\" strip. Keep the SSR cap short and let the strip\n// fall back to a client fetch (only that render misses the in-HTML strip; it's\n// ISR-cached anyway). Do NOT raise this — 2s is the SSR budget.\nconst SIMILAR_ENTRIES_SSR_TIMEOUT_MS = 2000;\n\n// The client fetch doesn't block paint, so it previously had no cap and fell\n// through to the SDK's generic INTERNAL_API_TIMEOUT_MS (10s; CF's worker further\n// truncates at ~8s). Combined with React Query's default client retry (3×), a\n// /search-api/similar outage turned this best-effort strip into a multi-second\n// post-onload tail (observed as a ~29s \"fully loaded\" in GTmetrix). Cap the\n// client call short and disable retry (below) so a degraded backend just hides\n// the strip quickly instead of churning.\nconst SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS = 4000;\n\n// The strip is hidden below this many results. A lone suggestion looks\n// sparse. Exported so the web component shares one threshold (filter == render).\nexport const SIMILAR_ENTRIES_MIN_RENDER = 2;\n\n// Strip markdown image/link/URL noise before truncating, so more_like_this\n// keys on prose terms instead of image-CDN domains and file hashes (which\n// rarely match the index's sanitized body and just waste the term budget).\nfunction toMltExcerpt(body: string, limit: number): string {\n return body\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, \" \") // markdown images\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\") // markdown links -> keep link text\n .replace(/<[^>]+>/g, \" \") // html tags\n .replace(/https?:\\/\\/\\S+/g, \" \") // bare URLs\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, limit);\n}\n\n// Compact deterministic fingerprint (djb2) of the MLT inputs. Folded into the\n// cache key so an edited post (title/tags/body changed) refetches instead of\n// serving stale recommendations under the same author/permlink. Deterministic\n// so the SSR prefetch and the client compute the same key from the same entry.\nfunction fingerprint(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\ninterface Entry {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n json_metadata?: {\n // Hive's json_metadata is user-controlled and untyped on-chain: `tags` is\n // usually a string[] but some posts store it as a bare string (or other\n // junk). Typed as unknown on purpose so callers can't assume an array —\n // it's narrowed with a runtime guard below.\n tags?: unknown;\n };\n}\n\nexport function getSimilarEntriesQueryOptions(entry: Entry) {\n const title = entry.title ?? \"\";\n // `?? []` only guards null/undefined; a non-array tags value (e.g. a bare\n // string from json_metadata) slips through and crashes `.filter` — which\n // took down the entry-page SSR prefetch (Sentry ECENCY-NEXT-1FMA). Guard on\n // Array.isArray so only real arrays reach the filter.\n const rawTags = entry.json_metadata?.tags;\n const tags = (Array.isArray(rawTags) ? rawTags : []).filter(\n (tag): tag is string => typeof tag === \"string\" && tag !== \"\"\n );\n const body = toMltExcerpt(entry.body ?? \"\", SIMILAR_ENTRIES_BODY_LIMIT);\n const contentKey = fingerprint(`${title}|${tags.join(\",\")}|${body}`);\n\n return queryOptions({\n queryKey: QueryKeys.search.similarEntries(entry.author, entry.permlink, contentKey),\n queryFn: async ({ signal }) => {\n // Naive `YYYY-MM-DDTHH:mm:ss` (no `Z`) matches the search-api date\n // contract used elsewhere; a <14h skew on a 182-day boundary is immaterial.\n const since = new Date(Date.now() - SIMILAR_ENTRIES_SINCE_MS).toISOString().slice(0, 19);\n\n // Elasticsearch more_like_this recommendations: content-based \"related\n // posts\" ranked by shared significant terms in title/body/tags, scoped\n // to the recency window. The backend already excludes the source author,\n // spam and nsfw.\n const response = await similar(\n {\n author: entry.author,\n permlink: entry.permlink,\n title,\n body,\n tags,\n since\n },\n signal,\n // Short cap server-side so a slow cross-region call can't stall SSR;\n // a slightly longer (but still bounded) cap client-side so a degraded\n // backend can't hang the request on the SDK's generic 8s timeout.\n typeof window === \"undefined\"\n ? SIMILAR_ENTRIES_SSR_TIMEOUT_MS\n : SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS\n );\n\n // Light client guard mirroring the render contract: never the source\n // post, never nsfw, one per author, capped at the render target.\n const collected: SearchResult[] = [];\n const seenAuthors = new Set();\n for (const r of response.results) {\n if (collected.length >= SIMILAR_ENTRIES_TARGET) break;\n if (r.permlink === entry.permlink) continue;\n if ((r.tags ?? []).indexOf(\"nsfw\") !== -1) continue;\n if (seenAuthors.has(r.author)) continue;\n seenAuthors.add(r.author);\n collected.push(r);\n }\n\n return collected;\n },\n // The entry page server-prefetches this query and dehydrates it. Without a\n // staleTime, React Query treats the hydrated data as stale and refetches on\n // mount — issuing a *redundant* /search-api/similar XHR right after\n // hydration even though SSR already provided the data. That refetch was the\n // long post-onload tail in the waterfall (held open to the client timeout),\n // inflating GTmetrix \"Fully Loaded\" while the visible strip was already\n // populated from SSR. A staleTime makes the hydrated data fresh so the\n // client skips that refetch; if SSR delivered nothing (empty cache), the\n // client still fetches. Recommendations are stable per post (and the cache\n // key is content-fingerprinted), so 5 min matches the page's ISR cadence.\n staleTime: 5 * 60 * 1000,\n // Best-effort suggestions strip — never retry-storm a degraded backend.\n // The web QueryClient only disables retries on the server; the browser\n // client keeps React Query's default retry (3×) — and other SDK consumers\n // (e.g. mobile) may too — so pin retry:false here to cover every caller.\n retry: false\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { getProfiles } from \"@/modules/bridge\";\nimport { Profile } from \"@/modules/accounts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountQueryOptions(q: string, limit = 5) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.account(normalized, limit),\n queryFn: async (): Promise => {\n const usernames = (await callRPC(\"condenser_api.lookup_accounts\", [\n normalized,\n limit,\n ])) as string[];\n\n if (usernames.length === 0) {\n return [];\n }\n\n return getProfiles(usernames);\n },\n enabled: !!normalized,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { TrendingTag } from \"@/modules/posts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchTopicsQueryOptions(q: string, limit = 10) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.topics(normalized, limit),\n queryFn: async (): Promise => {\n const tags = (await callRPC(\"condenser_api.get_trending_tags\", [\n normalized,\n limit + 1,\n ])) as TrendingTag[];\n\n return tags\n .map((t) => t.name)\n .filter((name) => name !== \"\" && !name.startsWith(\"hive-\"))\n .slice(0, limit);\n },\n enabled: !!normalized,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function getSearchApiInfiniteQueryOptions(\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.search.api(q, sort, hideLow, since, votes, includeNsfw),\n queryFn: async ({ pageParam, signal }: { pageParam: string | undefined; signal: AbortSignal }) => {\n interface SearchApiPayload {\n q: string;\n sort: string;\n hide_low: boolean;\n since?: string;\n scroll_id?: string;\n votes?: number;\n include_nsfw?: number;\n }\n\n const payload: SearchApiPayload = { q, sort, hide_low: hideLow };\n\n if (since) {\n payload.since = since;\n }\n if (pageParam) {\n payload.scroll_id = pageParam;\n }\n if (votes !== undefined) {\n payload.votes = votes;\n }\n if (includeNsfw) {\n payload.include_nsfw = 1;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(payload),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body), instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: SearchResponse) => lastPage?.scroll_id,\n enabled: !!q,\n retry: searchRetryPolicy,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\n\nexport function getSearchPathQueryOptions(q: string) {\n return queryOptions({\n queryKey: [\"search\", \"path\", q],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n });\n\n if (!response.ok) {\n throw new Error(`Search path failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data?.length > 0) {\n return data as string[];\n }\n\n return [q];\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { SupportSettings } from \"../types\";\n\n/**\n * Fetch the active user's Support Ecency settings. The username is resolved\n * server-side from the validated `code`, so only the code is sent. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached. Exported for\n * unit testing; the query options below wrap it.\n */\nexport async function getSupportSettingsRequest(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to fetch support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Query options for the active user's Support Ecency settings\n * (beneficiary percent + curation holdback percent). Zeros mean both\n * opt-ins are off; the backend returns zeros when no row exists.\n */\nexport function getSupportSettingsQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n const name = username?.replace(\"@\", \"\");\n\n return queryOptions({\n queryKey: QueryKeys.support.settings(name),\n queryFn: () => {\n if (!code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return getSupportSettingsRequest(code);\n },\n enabled: !!name && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { QueryClient, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { SupportSettings, UpdateSupportSettingsPayload } from \"../types\";\n\n/**\n * POST a Support Ecency settings update. Both percents are integers within\n * 0..100 (0 = off); the gateway rejects anything else with a 400. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached so the caller\n * can surface the plain validation message. Exported for unit testing; the\n * hook below wraps it.\n */\nexport async function updateSupportSettingsRequest(\n code: string,\n payload: UpdateSupportSettingsPayload\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings-update\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n code,\n beneficiary_percent: payload.beneficiary_percent,\n curation_percent: payload.curation_percent,\n }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to update support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Sync the settings cache after a successful update: seed the fresh server\n * response and invalidate so any active observers refetch. Exported for unit\n * testing; `useUpdateSupportSettings` calls it from `onSuccess`.\n */\nexport function applySupportSettingsUpdate(\n queryClient: QueryClient,\n username: string,\n data: SupportSettings\n) {\n queryClient.setQueryData(QueryKeys.support.settings(username), data);\n return queryClient.invalidateQueries({ queryKey: QueryKeys.support.settings(username) });\n}\n\n/**\n * Update the user's voluntary Support Ecency opt-ins (post beneficiary percent\n * and curation holdback percent). On success the settings query is refreshed\n * so every surface (publish dialog, settings card, injection hooks) sees the\n * new preference.\n */\nexport function useUpdateSupportSettings(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"support\", \"settings-update\", name],\n mutationFn: async (payload: UpdateSupportSettingsPayload) => {\n if (!name || !code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return updateSupportSettingsRequest(code, payload);\n },\n onSuccess(data) {\n if (name) {\n applySupportSettingsUpdate(queryClient, name, data);\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getBoostPlusPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boost-plus-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\n/**\n * RC top-up pricing: duration -> Points cost tiers, served by the ePoints\n * backend via the private API. Reuses the {@link PromotePrice} shape\n * ({ duration, price }).\n */\nexport function getRcDelegationPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation prices: ${response.status}`);\n }\n\n return (await response.json()) as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface RcDelegationActive {\n user: string;\n expires: Date;\n}\n\n/**\n * The active (ON) RC top-up for a user, if any. Lets the UI block a duplicate\n * purchase up front (only one RC top-up is allowed at a time). Returns null\n * when the user has no active top-up.\n */\nexport function getRcDelegationActiveQueryOptions(username: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-active\", username],\n queryFn: async (): Promise => {\n if (!accessToken || !username) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-active\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken, username })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation active: ${response.status}`);\n }\n\n const responseData = (await response.json()) as { user?: string; expires?: string };\n\n return responseData && responseData.expires && responseData.user\n ? { user: responseData.user, expires: new Date(responseData.expires) }\n : null;\n },\n enabled: !!username && !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getPromotePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"promote-price\"],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/promote-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch promote prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface BoostPlusAccountPrice {\n account: string;\n expires: Date;\n}\n\nexport function getBoostPlusAccountPricesQueryOptions(account: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-accounts\", account],\n queryFn: async (): Promise => {\n if (!accessToken || !account) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boosted-plus-account\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken, account }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus account prices: ${response.status}`);\n }\n\n const responseData = await response.json() as {\n expires: string;\n account: string;\n };\n\n return responseData\n ? {\n account: responseData.account,\n expires: new Date(responseData.expires)\n }\n : null;\n },\n enabled: !!account && !!accessToken\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildBoostPlusOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface BoostPlusPayload {\n account: string;\n duration: number;\n}\n\nexport function useBoostPlus(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"boost-plus\"],\n username,\n ({ account, duration }) => [\n buildBoostPlusOp(username!, account, duration)\n ],\n async (_data, { account }) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.promotions.boostPlusAccounts(account),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildRcDelegationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface RcDelegationPayload {\n duration: number;\n}\n\n/**\n * Buys a short-term, RC-only delegation (RC top-up) for the active user, paid\n * with Ecency Points. Mirrors {@link useBoostPlus} but is RC-only (no Hive\n * Power / voting power transferred). Invalidates the user's account + RC caches\n * so the new RC shows up once the relay delegation lands.\n */\nexport function useRcDelegation(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"rc-delegation\"],\n username,\n ({ duration }) => [buildRcDelegationOp(username!, duration)],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!),\n [\"promotions\", \"rc-delegation-active\", username]\n ]);\n }\n },\n auth,\n \"active\",\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { HsTokenRenewResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nexport async function hsTokenRenew(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/auth-api/hs-token-refresh\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n const error = new Error(`Failed to refresh token: ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n const data = (await response.json()) as HsTokenRenewResponse;\n return data;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"../../core\";\n\nconst BAD_ACTORS_URL =\n \"https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt\";\n\nexport function getBadActorsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.badActors.list(),\n queryFn: async ({ signal }) => {\n const response = await fetch(BAD_ACTORS_URL, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bad actors list: ${response.status}`);\n }\n\n const text = await response.text();\n return new Set(text.split(\"\\n\").filter(Boolean));\n },\n staleTime: 24 * 60 * 60 * 1000,\n /**\n * Deliberately left unbounded, including under SSR.\n *\n * `Infinity` is the one value that schedules no gc timer at all —\n * `isValidTimeout` in query-core rejects non-finite timeouts, so\n * `scheduleGc` is a no-op. With no timer there is no GC root, and on a\n * per-request client the entry dies with the request that made it.\n * Replacing it with a finite window would *create* a timer that retains the\n * Query and, through it, that request's whole QueryCache — strictly worse\n * here than leaving it alone.\n */\n gcTime: Infinity\n });\n}\n","export const POLLS_PROTOCOL_VERSION = 1.1;\n\nexport enum PollPreferredInterpretation {\n NUMBER_OF_VOTES = \"number_of_votes\",\n TOKENS = \"tokens\",\n}\n\nexport interface PollChoiceVotes {\n total_votes: number;\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied: number | null;\n}\n\nexport interface PollChoice {\n choice_num: number;\n choice_text: string;\n votes?: PollChoiceVotes;\n}\n\nexport interface PollVoter {\n name: string;\n choices: number[];\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied?: number;\n}\n\nexport interface PollStats {\n total_voting_accounts_num: number;\n total_hive_hp?: number;\n total_hive_proxied_hp?: number;\n total_hive_hp_incl_proxied: number | null;\n}\n\nexport interface Poll {\n author: string;\n permlink: string;\n question: string;\n poll_choices: PollChoice[];\n poll_voters?: PollVoter[];\n poll_stats?: PollStats;\n poll_trx_id: string;\n status: string;\n end_time: string;\n preferred_interpretation: PollPreferredInterpretation | string;\n max_choices_voted: number;\n filter_account_age_days: number;\n protocol_version: number;\n created: string;\n post_title: string;\n post_body: string;\n parent_permlink: string;\n tags: string[];\n image: unknown[];\n token?: string | null;\n community_membership?: string[];\n allow_vote_changes?: boolean;\n ui_hide_res_until_voted?: boolean;\n platform?: string;\n}\n\nexport function mapMetaChoicesToPollChoices(metaChoices: string[]): PollChoice[] {\n if (!metaChoices) {\n return [];\n }\n\n return metaChoices.map((choice, index) => ({\n choice_num: index + 1,\n choice_text: choice,\n votes: {\n total_votes: 0,\n hive_hp: 0,\n hive_proxied_hp: 0,\n hive_hp_incl_proxied: 0,\n },\n }));\n}\n","import { isServer, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys, SERVER_GC_TIME_MS } from \"@/modules/core\";\nimport { getBoundFetch } from \"@/modules/core/utils\";\nimport type { Poll, PollChoice, PollVoter, PollStats } from \"../types\";\n\nfunction normalizePoll(raw: Record): Poll {\n const pollChoices = (raw.poll_choices as Record[] | undefined) ?? [];\n const pollVoters = (raw.poll_voters as Record[] | undefined) ?? [];\n const rawStats = raw.poll_stats as Record | undefined;\n\n const choices: PollChoice[] = pollChoices.map((c) => {\n const votes = c.votes as Record | undefined;\n return {\n choice_num: (c.choice_num as number) ?? 0,\n choice_text: (c.choice_text as string) ?? \"\",\n votes: votes\n ? {\n total_votes: (votes.total_votes as number) ?? 0,\n hive_hp: votes.hive_hp as number | undefined,\n hive_proxied_hp: votes.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: (votes.hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined,\n };\n });\n\n const voters: PollVoter[] = pollVoters.map((v) => ({\n name: (v.name as string) ?? \"\",\n choices: (v.choices as number[]) ?? [],\n hive_hp: v.hive_hp as number | undefined,\n hive_proxied_hp: v.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: v.hive_hp_incl_proxied as number | undefined,\n }));\n\n const stats: PollStats | undefined = rawStats\n ? {\n total_voting_accounts_num: (rawStats.total_voting_accounts_num as number) ?? 0,\n total_hive_hp: rawStats.total_hive_hp as number | undefined,\n total_hive_proxied_hp: rawStats.total_hive_proxied_hp as number | undefined,\n total_hive_hp_incl_proxied: (rawStats.total_hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined;\n\n return {\n author: (raw.author as string) ?? \"\",\n permlink: (raw.permlink as string) ?? \"\",\n question: (raw.question as string) ?? \"\",\n poll_choices: choices,\n poll_voters: voters,\n poll_stats: stats,\n poll_trx_id: (raw.poll_trx_id as string) ?? \"\",\n status: (raw.status as string) ?? \"\",\n end_time: (raw.end_time as string) ?? \"\",\n preferred_interpretation: (raw.preferred_interpretation as string) ?? \"number_of_votes\",\n max_choices_voted: (raw.max_choices_voted as number) ?? 1,\n filter_account_age_days: (raw.filter_account_age_days as number) ?? 0,\n protocol_version: (raw.protocol_version as number) ?? 0,\n created: (raw.created as string) ?? \"\",\n post_title: (raw.post_title as string) ?? \"\",\n post_body: (raw.post_body as string) ?? \"\",\n parent_permlink: (raw.parent_permlink as string) ?? \"\",\n tags: (raw.tags as string[]) ?? [],\n image: (raw.image as unknown[]) ?? [],\n token: raw.token as string | null | undefined,\n community_membership: raw.community_membership as string[] | undefined,\n allow_vote_changes: raw.allow_vote_changes as boolean | undefined,\n ui_hide_res_until_voted: (raw.ui_hide_res_until_voted as boolean | undefined) ?? false,\n platform: raw.platform as string | undefined,\n };\n}\n\nexport function getPollQueryOptions(\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.polls.details(author ?? \"\", permlink ?? \"\"),\n enabled: !!author && !!permlink,\n // Long in a browser, where a poll is cheap to keep and often revisited;\n // bounded during SSR, where holding it also holds that request's whole\n // cache. See SERVER_GC_TIME_MS.\n gcTime: isServer ? SERVER_GC_TIME_MS : 30 * 60 * 1000,\n queryFn: async (): Promise => {\n if (!author || !permlink) {\n throw new Error(\"[SDK][Polls] – missing author or permlink\");\n }\n\n const fetchApi = getBoundFetch();\n const url = `${CONFIG.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(author)}&permlink=eq.${encodeURIComponent(permlink)}`;\n const response = await fetchApi(url);\n\n if (!response.ok) {\n throw new Error(`[SDK][Polls] – fetch failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data) || !data[0]) {\n throw new Error(\"[SDK][Polls] – no poll data found\");\n }\n\n return normalizePoll(data[0]);\n },\n });\n}\n","import { QueryKeys, useBroadcastMutation } from \"@/modules/core\";\nimport type { BroadcastMode, AuthContextV2 } from \"@/modules/core\";\n\nexport interface PollVotePayload {\n pollTrxId: string;\n choices: number[];\n}\n\nexport function usePollVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n QueryKeys.polls.vote(),\n username ?? \"\",\n ({ pollTrxId, choices }) => {\n if (!username) {\n throw new Error(\"[SDK][Polls] Cannot vote without an authenticated username\");\n }\n return [\n [\n \"custom_json\",\n {\n id: \"polls\",\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify({\n poll: pollTrxId,\n action: \"vote\",\n choices,\n }),\n },\n ],\n ];\n },\n undefined,\n auth,\n \"posting\",\n { broadcastMode: broadcastMode ?? \"async\" }\n );\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/hive-tx/helpers/ByteBuffer.ts","../../src/hive-tx/config.ts","../../src/hive-tx/helpers/Signature.ts","../../src/hive-tx/helpers/PublicKey.ts","../../src/hive-tx/helpers/Asset.ts","../../src/hive-tx/helpers/HexBuffer.ts","../../src/hive-tx/helpers/serializer.ts","../../src/hive-tx/helpers/sleep.ts","../../src/hive-tx/helpers/call.ts","../../src/hive-tx/Transaction.ts","../../src/hive-tx/helpers/PrivateKey.ts","../../src/hive-tx/helpers/aes.ts","../../src/hive-tx/helpers/deserializer.ts","../../src/hive-tx/helpers/memo.ts","../../src/hive-tx/helpers/utils.ts","../../src/modules/core/hive-tx.ts","../../src/modules/core/errors/chain-errors.ts","../../src/modules/core/mutations/use-broadcast-mutation.ts","../../src/modules/core/mutations/broadcast-json.ts","../../src/modules/core/mutations/invalidate-after-broadcast.ts","../../src/modules/core/abort-signal.ts","../../src/modules/core/config.ts","../../src/modules/core/queries-manager.ts","../../src/modules/core/utils/decoder-encoder.ts","../../src/modules/core/utils/parse-asset.ts","../../src/modules/core/utils/get-bound-fetch.ts","../../src/modules/core/utils/is-community.ts","../../src/modules/core/utils/pagination-helpers.ts","../../src/modules/core/utils/vests-to-hp.ts","../../src/modules/core/utils/is-empty-date.ts","../../src/modules/core/queries/get-dynamic-props-query-options.ts","../../src/modules/core/queries/get-reward-fund-query-options.ts","../../src/modules/core/query-keys.ts","../../src/modules/ai/queries/get-ai-generate-price-query-options.ts","../../src/modules/ai/queries/get-ai-assist-price-query-options.ts","../../src/modules/ai/queries/get-ai-transcribe-price-query-options.ts","../../src/modules/ai/mutations/use-generate-image.ts","../../src/modules/ai/mutations/use-ai-assist.ts","../../src/modules/ai/mutations/use-ai-transcribe.ts","../../src/modules/accounts/queries/get-account-full-query-options.ts","../../src/modules/accounts/utils/profile-metadata.ts","../../src/modules/accounts/utils/parse-accounts.ts","../../src/modules/accounts/queries/get-accounts-query-options.ts","../../src/modules/accounts/queries/get-follow-count-query-options.ts","../../src/modules/accounts/queries/get-followers-query-options.ts","../../src/modules/accounts/queries/get-following-query-options.ts","../../src/modules/accounts/queries/get-muted-users-query-options.ts","../../src/modules/accounts/queries/lookup-accounts-query-options.ts","../../src/modules/accounts/queries/search-accounts-by-username-query-options.ts","../../src/modules/accounts/queries/check-username-wallets-pending-query-options.ts","../../src/modules/accounts/queries/get-relationship-between-accounts-query-options.ts","../../src/modules/accounts/queries/get-account-subscriptions-query-options.ts","../../src/modules/accounts/queries/get-bookmarks-query-options.ts","../../src/modules/accounts/queries/get-favorites-query-options.ts","../../src/modules/accounts/queries/check-favorite-query-options.ts","../../src/modules/accounts/queries/get-account-recoveries-query-options.ts","../../src/modules/accounts/queries/get-account-pending-recovery-query-options.ts","../../src/modules/accounts/queries/get-account-reputations-query-options.ts","../../src/modules/accounts/queries/get-transactions-infinite-query-options.ts","../../src/modules/accounts/queries/get-bots-query-options.ts","../../src/modules/accounts/queries/get-referrals-infinite-query-options.ts","../../src/modules/accounts/queries/get-referrals-stats-query-options.ts","../../src/modules/accounts/queries/get-friends-infinite-query-options.ts","../../src/modules/accounts/queries/get-search-friends-query-options.ts","../../src/modules/posts/queries/get-trending-tags-query-options.ts","../../src/modules/posts/queries/get-trending-tags-with-stats-query-options.ts","../../src/modules/posts/queries/get-fragments-query-options.ts","../../src/modules/posts/queries/get-promoted-posts-query-options.ts","../../src/modules/posts/queries/get-entry-active-votes-query-options.ts","../../src/modules/posts/queries/get-user-post-vote-query-options.ts","../../src/modules/posts/queries/get-content-query-options.ts","../../src/modules/posts/queries/get-content-replies-query-options.ts","../../src/modules/posts/queries/get-post-header-query-options.ts","../../src/modules/posts/utils/filter-dmca-entries.ts","../../src/modules/bridge/verify-on-alternate-node.ts","../../src/modules/posts/queries/get-post-query-options.ts","../../src/modules/bridge/requests.ts","../../src/modules/posts/queries/get-discussions-query-options.ts","../../src/modules/posts/queries/get-account-posts-query-options.ts","../../src/modules/posts/queries/get-posts-ranked-query-options.ts","../../src/modules/posts/queries/get-reblogs-query-options.ts","../../src/modules/posts/queries/get-reblogged-by-query-options.ts","../../src/modules/posts/queries/get-schedules-query-options.ts","../../src/modules/posts/queries/get-drafts-query-options.ts","../../src/modules/posts/queries/get-images-query-options.ts","../../src/modules/posts/queries/get-comment-history-query-options.ts","../../src/modules/posts/queries/get-deleted-entry-query-options.ts","../../src/modules/posts/queries/get-post-tips-query-options.ts","../../src/modules/posts/utils/waves-helpers.ts","../../src/modules/posts/queries/get-waves-feed-query-options.ts","../../src/modules/posts/queries/get-shorts-feed-query-options.ts","../../src/modules/posts/queries/get-waves-by-host-query-options.ts","../../src/modules/posts/queries/get-waves-by-tag-query-options.ts","../../src/modules/posts/queries/get-waves-following-query-options.ts","../../src/modules/posts/queries/get-waves-trending-tags-query-options.ts","../../src/modules/posts/queries/get-waves-by-account-query-options.ts","../../src/modules/posts/queries/get-waves-trending-authors-query-options.ts","../../src/modules/posts/queries/get-normalize-post-query-options.ts","../../src/modules/accounts/queries/get-account-vote-history-infinite-query-options.ts","../../src/modules/accounts/queries/get-profiles-query-options.ts","../../src/modules/accounts/queries/get-balance-history-query-options.ts","../../src/modules/accounts/queries/get-aggregated-balance-query-options.ts","../../src/modules/accounts/queries/get-pro-members-query-options.ts","../../src/modules/accounts/mutations/use-account-update.ts","../../src/modules/accounts/mutations/use-account-relations-update.ts","../../src/modules/operations/builders/content.ts","../../src/modules/operations/builders/wallet.ts","../../src/modules/operations/builders/social.ts","../../src/modules/operations/builders/governance.ts","../../src/modules/operations/builders/community.ts","../../src/modules/operations/builders/market.ts","../../src/modules/operations/builders/account.ts","../../src/modules/operations/builders/ecency.ts","../../src/modules/accounts/mutations/use-follow.ts","../../src/modules/accounts/mutations/use-unfollow.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-add.ts","../../src/modules/accounts/mutations/bookmarks/use-account-bookmark-delete.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-add.ts","../../src/modules/accounts/mutations/favorites/use-account-favorite-delete.ts","../../src/modules/accounts/mutations/use-account-update-key-auths.ts","../../src/modules/accounts/mutations/use-account-update-password.ts","../../src/modules/accounts/mutations/use-account-revoke-posting.ts","../../src/modules/accounts/mutations/use-account-update-recovery.ts","../../src/modules/accounts/mutations/build-revoke-keys-op.ts","../../src/modules/accounts/mutations/use-account-revoke-key.ts","../../src/modules/accounts/mutations/use-claim-account.ts","../../src/modules/accounts/mutations/use-grant-posting-permission.ts","../../src/modules/accounts/mutations/use-create-account.ts","../../src/modules/accounts/utils/account-power.ts","../../src/modules/operations/authority-map.ts","../../src/modules/operations/mutations/sign-operation-by-key.ts","../../src/modules/operations/mutations/sign-operation-by-keychain.ts","../../src/modules/operations/mutations/sign-operation-by-hivesigner.ts","../../src/modules/operations/queries/get-chain-properties-query-options.ts","../../src/modules/posts/utils/fragment-cache-helpers.ts","../../src/modules/posts/mutations/add-fragment.ts","../../src/modules/posts/mutations/edit-fragment.ts","../../src/modules/posts/mutations/remove-fragment.ts","../../src/modules/private-api/requests.ts","../../src/modules/posts/mutations/use-add-draft.ts","../../src/modules/posts/mutations/use-update-draft.ts","../../src/modules/posts/mutations/use-delete-draft.ts","../../src/modules/posts/mutations/use-add-schedule.ts","../../src/modules/posts/mutations/use-delete-schedule.ts","../../src/modules/posts/mutations/use-move-schedule.ts","../../src/modules/posts/mutations/use-add-image.ts","../../src/modules/posts/mutations/use-delete-image.ts","../../src/modules/posts/mutations/use-upload-image.ts","../../src/modules/posts/cache/entries-cache-management.ts","../../src/modules/posts/mutations/use-vote.ts","../../src/modules/posts/mutations/use-reblog.ts","../../src/modules/posts/mutations/use-comment.ts","../../src/modules/posts/cache/discussions-cache-utils.ts","../../src/modules/posts/mutations/use-delete-comment.ts","../../src/modules/posts/mutations/use-cross-post.ts","../../src/modules/posts/mutations/use-update-reply.ts","../../src/modules/posts/mutations/use-promote.ts","../../src/modules/posts/utils/validate-post-creating.ts","../../src/modules/analytics/mutations/index.ts","../../src/modules/analytics/mutations/use-record-activity.ts","../../src/modules/analytics/queries/get-discover-leaderboard-query-options.ts","../../src/modules/analytics/queries/get-discover-curation-query-options.ts","../../src/modules/analytics/queries/get-page-stats-query-options.ts","../../src/modules/integrations/3speak/functions/beneficiary.ts","../../src/modules/integrations/3speak/queries/index.ts","../../src/modules/integrations/hivesigner/queries/index.ts","../../src/modules/integrations/hivesigner/queries/get-decode-memo-query-options.ts","../../src/modules/integrations/hivesigner/index.ts","../../src/modules/integrations/3speak/queries/get-account-token-query-options.ts","../../src/modules/integrations/3speak/queries/get-account-videos-query-options.ts","../../src/modules/integrations/3speak/index.ts","../../src/modules/integrations/hiveposh/queries/get-hiveposh-links-query-options.ts","../../src/modules/integrations/plausible/queries/get-stats-query-options.ts","../../src/modules/resource-credits/queries/get-rc-stats-query-options.ts","../../src/modules/resource-credits/queries/get-account-rc-query-options.ts","../../src/modules/resource-credits/utils/estimate-rc-precheck.ts","../../src/modules/games/queries/game-status-check-query-options.ts","../../src/modules/games/mutations/game-claim.ts","../../src/modules/quests/queries/get-quests-query-options.ts","../../src/modules/quests/catalog.ts","../../src/modules/quests/mutations/buy-streak-freeze.ts","../../src/modules/communities/mutations/use-subscribe-community.ts","../../src/modules/communities/mutations/use-unsubscribe-community.ts","../../src/modules/communities/mutations/use-mute-post.ts","../../src/modules/communities/mutations/use-set-community-role.ts","../../src/modules/communities/mutations/use-update-community.ts","../../src/modules/communities/mutations/use-register-community-rewards.ts","../../src/modules/communities/mutations/use-pin-post.ts","../../src/modules/communities/queries/get-communities-query-options.ts","../../src/modules/communities/queries/get-community-context-query-options.ts","../../src/modules/communities/queries/get-community-query-options.ts","../../src/modules/communities/queries/get-community-subscribers-query-options.ts","../../src/modules/communities/queries/get-account-notifications-infinite-query-options.ts","../../src/modules/communities/queries/get-rewarded-communities-query-options.ts","../../src/modules/communities/types/community.ts","../../src/modules/communities/utils/index.ts","../../src/modules/notifications/queries/get-notifications-unread-count-query-options.ts","../../src/modules/notifications/queries/get-notifications-infinite-query-options.ts","../../src/modules/notifications/enums/notification-filter.ts","../../src/modules/notifications/enums/notify-types.ts","../../src/modules/notifications/queries/get-notifications-settings-query-options.ts","../../src/modules/notifications/queries/get-announcements-query-options.ts","../../src/modules/notifications/queries/get-spotlights-query-options.ts","../../src/modules/notifications/mutations/use-mark-notifications-read.ts","../../src/modules/notifications/mutations/use-set-last-read.ts","../../src/modules/proposals/queries/get-proposal-query-options.ts","../../src/modules/proposals/queries/get-proposals-query-options.ts","../../src/modules/proposals/queries/get-proposal-votes-query-options.ts","../../src/modules/proposals/queries/get-user-proposal-votes-query-options.ts","../../src/modules/proposals/mutations/use-proposal-vote.ts","../../src/modules/proposals/mutations/use-proposal-create.ts","../../src/modules/wallet/queries/get-vesting-delegations-query-options.ts","../../src/modules/wallet/queries/get-account-delegations-query-options.ts","../../src/modules/wallet/queries/get-vesting-delegation-expirations-query-options.ts","../../src/modules/wallet/queries/get-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-collateralized-conversion-requests-query-options.ts","../../src/modules/wallet/queries/get-savings-withdraw-from-query-options.ts","../../src/modules/wallet/queries/get-withdraw-routes-query-options.ts","../../src/modules/wallet/queries/get-open-orders-query-options.ts","../../src/modules/wallet/queries/get-outgoing-rc-delegations-infinite-query-options.ts","../../src/modules/wallet/queries/get-incoming-rc-query-options.ts","../../src/modules/wallet/queries/get-received-vesting-shares-query-options.ts","../../src/modules/wallet/queries/get-recurrent-transfers-query-options.ts","../../src/modules/wallet/queries/get-portfolio-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-general-info-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-general-info-query-options.ts","../../src/modules/wallet/consts/hive-account-operation-groups.ts","../../src/modules/wallet/consts/hive-operation-list.ts","../../src/modules/wallet/consts/hive-operation-orders.ts","../../src/modules/wallet/queries/get-hive-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hbd-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-power-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-metric-query-options.ts","../../src/modules/wallet/queries/get-hive-asset-withdrawal-routes-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegates-query-options.ts","../../src/modules/wallet/queries/get-hive-power-delegatings-query-options.ts","../../src/modules/market/queries/get-order-book-query-options.ts","../../src/modules/market/queries/get-market-statistics-query-options.ts","../../src/modules/market/queries/get-market-history-query-options.ts","../../src/modules/market/queries/get-hive-hbd-stats-query-options.ts","../../src/modules/market/queries/get-market-data-query-options.ts","../../src/modules/market/queries/get-trade-history-query-options.ts","../../src/modules/market/queries/get-feed-history-query-options.ts","../../src/modules/market/queries/get-current-median-history-price-query-options.ts","../../src/modules/market/mutations/use-limit-order-create.ts","../../src/modules/market/mutations/use-limit-order-cancel.ts","../../src/modules/market/requests.ts","../../src/modules/hive-engine/requests.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-balances-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-market-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-tokens-metadata-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-transactions-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-metrics-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-unclaimed-rewards-query-options.ts","../../src/modules/hive-engine/queries/get-all-hive-engine-tokens-query-options.ts","../../src/modules/hive-engine/utils/formatted-number.ts","../../src/modules/hive-engine/utils/hive-engine-token.ts","../../src/modules/hive-engine/queries/get-hive-engine-balances-with-usd-query-options.ts","../../src/modules/hive-engine/queries/get-hive-engine-token-general-info-query-options.ts","../../src/modules/points/queries/get-points-query-options.ts","../../src/modules/points/queries/get-points-asset-general-info-query-options.ts","../../src/modules/points/queries/get-points-asset-transactions-query-options.ts","../../src/modules/wallet/queries/get-account-wallet-asset-info-query-options.ts","../../src/modules/wallet/types/asset-operation.ts","../../src/modules/wallet/mutations/use-transfer.ts","../../src/modules/wallet/mutations/use-transfer-point.ts","../../src/modules/wallet/mutations/use-delegate-vesting-shares.ts","../../src/modules/wallet/mutations/use-set-withdraw-vesting-route.ts","../../src/modules/wallet/mutations/use-transfer-engine-token.ts","../../src/modules/wallet/mutations/use-transfer-to-savings.ts","../../src/modules/wallet/mutations/use-transfer-from-savings.ts","../../src/modules/wallet/mutations/use-transfer-to-vesting.ts","../../src/modules/wallet/mutations/use-withdraw-vesting.ts","../../src/modules/wallet/mutations/use-convert.ts","../../src/modules/wallet/mutations/use-claim-interest.ts","../../src/modules/wallet/mutations/use-claim-rewards.ts","../../src/modules/wallet/mutations/use-delegate-engine-token.ts","../../src/modules/wallet/mutations/use-undelegate-engine-token.ts","../../src/modules/wallet/mutations/use-stake-engine-token.ts","../../src/modules/wallet/mutations/use-unstake-engine-token.ts","../../src/modules/wallet/mutations/use-claim-engine-rewards.ts","../../src/modules/wallet/mutations/use-engine-market-order.ts","../../src/modules/wallet/mutations/use-wallet-operation.ts","../../src/modules/wallet/mutations/use-delegate-rc.ts","../../src/modules/witnesses/mutations/use-witness-vote.ts","../../src/modules/witnesses/mutations/use-witness-proxy.ts","../../src/modules/witnesses/queries/get-witnesses-query-options.ts","../../src/modules/points/types/point-transaction-type.ts","../../src/modules/points/mutations/use-claim-points.ts","../../src/modules/search/query-builder.ts","../../src/modules/search/parse-json-response.ts","../../src/modules/search/retry-policy.ts","../../src/modules/search/queries/get-search-query-options.ts","../../src/modules/search/requests.ts","../../src/modules/search/queries/get-similar-entries-query-options.ts","../../src/modules/search/queries/get-search-account-query-options.ts","../../src/modules/search/queries/get-search-topics-query-options.ts","../../src/modules/search/queries/get-search-api-infinite-query-options.ts","../../src/modules/search/queries/get-search-path-query-options.ts","../../src/modules/support/queries/get-support-settings-query-options.ts","../../src/modules/support/mutations/update-support-settings.ts","../../src/modules/promotions/queries/get-boost-plus-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-prices-query-options.ts","../../src/modules/promotions/queries/get-rc-delegation-active-query-options.ts","../../src/modules/promotions/queries/get-promote-price-query-options.ts","../../src/modules/promotions/queries/get-boost-plus-account-prices-query-options.ts","../../src/modules/promotions/mutations/use-boost-plus.ts","../../src/modules/promotions/mutations/use-rc-delegation.ts","../../src/modules/auth/requests.ts","../../src/modules/bad-actors/queries/get-bad-actors-query-options.ts","../../src/modules/polls/types/poll.ts","../../src/modules/polls/queries/get-poll-query-options.ts","../../src/modules/polls/mutations/use-poll-vote.ts"],"names":["EMPTY_BUFFER","_encoder","_decoder","getEncoder","s","utf8","i","c","next","getDecoder","b","bytes","result","byte","codePoint","ByteBuffer","_ByteBuffer","capacity","littleEndian","buffers","buf","bb","view","offset","buffer","source","value","relative","src","copy","begin","end","target","targetOffset","sourceOffset","sourceLimit","targetRelative","len","current","length","forceCopy","limit","size","str","currentOffset","encoded","lenVarintSize","start","lenResult","lenValue","lenLength","config","sanitizeNodeList","nodes","n","setNodes","validNodes","setRestNodes","valid","setRestNodesByApi","map","api","list","setUserAgent","ua","setResilience","opts","r","bool","v","pos","Signature","_Signature","data","recovery","compressed","string","temp","hexToBytes","bytesToHex","message","sig","secp256k1","PublicKey","_PublicKey","key","prefix","wif","expectedPrefix","bs58","checksum","expectedChecksum","ripemd160","isUint8ArrayEqual","signature","encodePublic","a","Asset","_Asset","amount","symbol","expectedSymbol","amountString","HexBuffer","_HexBuffer","OPERATION_IDS","VoidSerializer","StringSerializer","Int16Serializer","Int64Serializer","UInt8Serializer","UInt16Serializer","UInt32Serializer","UInt64Serializer","BooleanSerializer","StaticVariantSerializer","itemSerializers","id","item","AssetSerializer","asset","precision","DateSerializer","PublicKeySerializer","BinarySerializer","VariableBinarySerializer","FlatMapSerializer","keySerializer","valueSerializer","ArraySerializer","itemSerializer","ObjectSerializer","keySerializers","serializer","error","OptionalSerializer","AuthoritySerializer","BeneficiarySerializer","PriceSerializer","ChainPropertiesSerializer","OperationDataSerializer","operationId","definitions","objectSerializer","OperationSerializers","ProposalUpdateSerializer","OperationSerializer","operation","TransactionSerializer","EncryptedMemoSerializer","Serializer","sleep","ms","resolve","isNodeRuntime","serverIdentityHeaders","RPCError","rpcError","NodeError","node","parseRetryAfterMs","header","secs","dateMs","delta","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","RATE_LIMIT_BASE_MS","RATE_LIMIT_MAX_MS","RATE_LIMIT_STREAK_RESET_MS","MAX_API_FAILURES_BEFORE_COOLDOWN","API_COOLDOWN_MS","HEAD_BLOCK_MAX_AGE_MS","STALE_BLOCK_THRESHOLD","LATENCY_EWMA_ALPHA","LATENCY_MIN_SAMPLES","LATENCY_MAX_AGE_MS","LATENCY_REPROBE_MS","LATENCY_UNPROVEN_PRIOR_MS","LATENCY_SLOW_FAILURE_MS","NodeHealthTracker","h","durationMs","profileKey","apiFail","now","p","elapsedMs","existing","retryAfterMs","hasHeader","cooldown","blockNum","recent","best","healthy","unhealthy","ordered","d","probe","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","HedgeBudget","tokens","rpcHedgeBudget","adaptiveAttemptTimeout","tracker","callerTimeout","explicit","ewma","recordError","e","tryRecordHeadBlock","block","createTimeoutReason","err","createTimeoutSignal","controller","timer","mergeSignals","primary","secondary","onPrimaryAbort","onSecondaryAbort","cleanup","jsonRPCCall","url","params","timeout","shouldRetry","externalSignal","body","tSignal","cleanupTimeout","signal","cleanupMerge","res","jitterDelay","hedgedRpcAttempt","hedgePool","explicitTimeout","deadlineAt","onHedgeFired","validate","reject","done","pendingLegs","hedgeFired","primarySettled","lastError","hedgeTimer","primaryStart","controllers","finish","settle","startLeg","isHedge","merged","legTimeout","primaryWindow","delay","live","callRPC","retry","ceiling","deadline","triedInRound","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","restProfileKey","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","restSignal","restCleanup","restCallStart","response","callWithQuorum","quorum","allNodes","arr","j","currentBatchSize","allResults","batchNodes","promises","batchResults","consensusResult","findConsensus","results","resultGroups","consensusGroup","group","chainId","Transaction","_Transaction","options","operationName","operationBody","keys","digest","txId","checkStatus","maxPollAttempts","status","transactionData","sha256","expiration","props","refBlockPrefix","expirationIso","NETWORK_ID","PrivateKey","_PrivateKey","decodePrivate","seed","username","password","role","rv","encodePrivate","publicKey","sha512","doubleSha256","input","encodedKey","checksumVerify","encrypt","privateKey","nonce","uniqueNonce","crypt","decrypt","nonceL","S","ebuf","encryptionKey","iv","tag","check","cbuf","check32","cryptoJsDecrypt","cryptoJsEncrypt","messageBuffer","AESCBC","uniqueNonceEntropy","randomPrivateKey","long","entropy","PublicKeyDeserializer","fixedBuf","UInt64Deserializer","UInt32Deserializer","BinaryDeserializer","bCopy","BufferDeserializer","keyDeserializers","obj","deserializer","EncryptedMemoDeserializer","Deserializer","encode","memo","testNonce","checkEncryption","toPrivateObj","toPublicObj","mbuf","memoBuffer","mbuf2","decode","from","to","encrypted","otherpub","encodeTest","plaintext","cyphertext","o","Memo","utils_exports","__export","buildWitnessSetProperties","makeBitMaskFilter","operations","validateUsername","suffix","ref","label","allowedOperations","reduceFunction","low","high","allowedOperation","owner","type","serialize","nobleSha256","isWif","broadcastOperations","ops","tx","op","broadcastOperationsAsync","MANA_REGENERATION_SECONDS","calculateManabar","maxMana","manabar","currentMana","percentage","getVests","account","vests","delegated","received","withdrawRate","alreadyWithdrawn","withdrawVests","calculateVPMana","calculateRCMana","rcAccount","ErrorType","parseChainError","errorDescription","errorMessage","errorCode","errorString","testPattern","pattern","formatError","parsed","shouldTriggerAuthFallback","isResourceCreditsError","isInfoError","isNetworkError","broadcastWithMethod","auth","authority","fetchedKey","fetchedToken","broadcastMode","adapter","token","hs","tokenError","broadcastWithFallback","loginType","hasPostingAuth","selectedMethod","hsError","chain","errors","shouldSkip","skipReason","prefetchedKey","prefetchedToken","skipReasons","errorMessages","useBroadcastMutation","mutationKey","onSuccess","useMutation","payload","postingKey","accessToken","broadcastJson","jjson","BROADCAST_INCLUSION_DELAY_MS","invalidateAfterBroadcast","withTimeoutSignal","timeoutMs","timeoutSignal","ac","onAbort","reason","isDevelopment","getHeliusApiKey","INTERNAL_API_TIMEOUT_MS","SERVER_GC_TIME_MS","queryClientResolver","fallbackQueryClient","resolveQueryClient","QueryClient","CONFIG","client","ConfigManager","setQueryClient","setQueryClientResolver","setPrivateApiHost","host","setClientId","clientId","setDefaultObserver","observer","getValidatedBaseUrl","setPollsApiHost","setImageHost","setHiveNodes","userAgent","analyzeRedosRisk","unboundedRange","match","min","max","testRegexPerformance","regex","adversarialInputs","maxExecutionTime","duration","safeCompileRegex","maxLength","staticAnalysis","compileErr","runtimeTest","setDmcaLists","lists","coerceList","resolved","rejectedTagCount","makeQueryClient","getQueryClient","EcencyQueriesManager","getQueryData","queryKey","getInfiniteQueryData","prefetchQuery","prefetchInfiniteQuery","generateClientServerQuery","useQuery","generateClientServerInfiniteQuery","useInfiniteQuery","encodeObj","decodeObj","dataToParse","Symbol","NaiMap","parseAsset","sval","sp","cachedFetch","getBoundFetch","isCommunity","isWrappedResponse","normalizeToWrappedResponse","vestsToHp","hivePerMVests","isEmptyDate","DYNAMIC_PROPS_REFRESH_MS","getDynamicPropsQueryOptions","queryOptions","QueryKeys","rawGlobalDynamic","rawFeedHistory","rawChainProps","rawRewardFund","rawHardforkProps","totalVestingSharesAmount","totalVestingFundAmount","base","quote","fundRecentClaims","fundRewardBalance","votePowerReserveRate","authorRewardCurve","contentConstant","currentHardforkVersion","lastHardfork","hbdPrintRate","hbdInterestRate","headBlock","totalVestingFund","totalVestingShares","virtualSupply","vestingRewardPercent","accountCreationFee","getRewardFundQueryOptions","fundName","entryPath","author","permlink","filter","startAuthor","startPermlink","activeUsername","sort","order","onlyMeta","hours","usernames","following","mode","followType","query","follower","startFollowing","startFollower","excludeList","accounts","targetUsername","reference","name","communityName","proposalId","voter","q","hideLow","since","scrollId","votes","what","content","includeNsfw","witness","page","pageSize","direction","user","coinType","granularity","onlyEnabled","currency","filterKey","bucketSeconds","seconds","startDate","endDate","coin","vsCurrency","fromTs","toTs","dimensions","metrics","dateRange","gameType","getAiGeneratePriceQueryOptions","getAiAssistPriceQueryOptions","getAiTranscribePriceQueryOptions","makeIdempotencyKey","useGenerateImage","pendingData","useAiAssist","useAiTranscribe","form","isMetadataStripped","hasProfileValues","profile","getAccountFullQueryOptions","bridgeProfile","rows","chainAccount","reread","parseProfileMetadata","stats","follow_stats","reputationValue","DENIED_KEYS","isPlainObject","proto","deepMerge","srcVal","tgtVal","sanitizeTokens","meta","rest","safeMeta","postingJsonMetadata","extractAccountProfile","pickRicherMetadataSnapshot","preferred","fallback","preferredKeys","parsePostingMetadataRoot","buildPostingJsonMetadata","existingPostingJsonMetadata","root","existingProfile","mergedProfile","buildProfileMetadata","profileTokens","_ignoredVersion","profileRest","metadata","parseAccounts","rawAccounts","x","jsonMetadata","getAccountsQueryOptions","getFollowCountQueryOptions","getFollowersQueryOptions","getFollowingQueryOptions","MUTED_USERS_PAGE_SIZE","MUTED_USERS_MAX_PAGES","getMutedUsersQueryOptions","muted","names","lookupAccountsQueryOptions","getSearchAccountsByUsernameQueryOptions","RESERVED_META_KEYS","checkUsernameWalletsPendingQueryOptions","wallets","walletItem","sanitizedMeta","address","showFlag","baseCandidate","metaTokenCandidates","metaSymbol","metaValue","getRelationshipBetweenAccountsQueryOptions","getAccountSubscriptionsQueryOptions","getBookmarksQueryOptions","getBookmarksInfiniteQueryOptions","infiniteQueryOptions","pageParam","json","lastPage","getFavoritesQueryOptions","getFavoritesInfiniteQueryOptions","checkFavoriteQueryOptions","getAccountRecoveriesQueryOptions","getAccountPendingRecoveryQueryOptions","getAccountReputationsQueryOptions","ACCOUNT_OPERATION_GROUPS","ALL_ACCOUNT_OPERATIONS","acc","val","deriveNum","entry","normalizeOpType","restType","isNaiAsset","naiToString","normalizeOpValue","k","getTransactionsInfiniteQueryOptions","operationTypes","nextPage","getBotsQueryOptions","getReferralsInfiniteQueryOptions","maxId","nextMaxId","getReferralsStatsQueryOptions","getFriendsInfiniteQueryOptions","enabled","accountNames","SEARCH_LIMIT","getSearchFriendsQueryOptions","getTrendingTagsQueryOptions","afterTag","tags","getTrendingTagsWithStatsQueryOptions","getFragmentsQueryOptions","getFragmentsInfiniteQueryOptions","getPromotedPostsQuery","getEntryActiveVotesQueryOptions","getUserPostVoteQueryOptions","getContentQueryOptions","getContentRepliesQueryOptions","getPostHeaderQueryOptions","filterDmcaEntry","entryOrEntries","applyFilter","verifyPostOnAlternateNode","getPostQueryOptions","num","cleanPermlink","verified","verifiedEntry","bridgeApiCall","resolvePost","post","resp","getPost","resolvePosts","posts","validatedPosts","validateEntry","getPostsRanked","start_author","start_permlink","getAccountPosts","newEntry","requiredStringProps","prop","validatedEntry","getPostHeader","getDiscussion","validatedResp","getCommunity","getCommunities","last","normalizePost","getSubscriptions","getSubscribers","community","getRelationshipBetweenAccounts","getProfiles","SortOrder","sortDiscussions","discussion","allPayout","absNegative","isPinned","sortOrders","_a","_b","keyA","keyB","sorted","pinnedIndex","pinned","getDiscussionsQueryOptions","resolvedObserver","oldData","newData","optimisticEntries","fetchedPermlinks","missingOptimistic","opt","getDiscussionQueryOptions","getAccountPostsInfiniteQueryOptions","hasNextPage","getAccountPostsQueryOptions","displaySelects","displaySelect","select","orderForDisplay","byCreated","getPostsRankedInfiniteQueryOptions","_options","sanitizedTag","getPostsRankedQueryOptions","getReblogsQueryOptions","getRebloggedByQueryOptions","getSchedulesQueryOptions","getSchedulesInfiniteQueryOptions","getDraftsQueryOptions","getDraftsInfiniteQueryOptions","fetchUserImages","getImagesQueryOptions","getGalleryImagesQueryOptions","getImagesInfiniteQueryOptions","getCommentHistoryQueryOptions","makeEntryPath","cleanAuthor","normalizedAuthor","normalizedPermlink","getDeletedEntryQueryOptions","isValid","history","title","getPostTipsQueryOptions","isEnabled","normalizeContainer","normalizeParent","normalizeWaveEntryFromApi","containerSource","container","parent","toEntryArray","getVisibleFirstLevelThreadItems","discussionItemsRaw","discussionItems","firstLevelItems","parent_author","parent_permlink","mapThreadItemsToWaveEntries","items","DEFAULT_FEED_LIMIT","normalizeParams","fetchWavesFeedPage","containers","cursor","row","getWavesFeedQueryOptions","normalized","getWavesLatestFeedQueryOptions","fetchShortsFeedPage","getShortsFeedQueryOptions","THREAD_CONTAINER_BATCH_SIZE","MAX_CONTAINERS_TO_SCAN","getThreads","scannedContainers","skipContainerId","rpcParams","normalizedContainers","visibleItems","lastContainer","getWavesByHostQueryOptions","DEFAULT_TAG_FEED_LIMIT","getWavesByTagQueryOptions","getWavesFollowingQueryOptions","normalizedUsername","flattened","getWavesTrendingTagsQueryOptions","getWavesByAccountQueryOptions","getWavesTrendingAuthorsQueryOptions","getNormalizePostQueryOptions","isEntry","getDays","createdDate","past","getAccountVoteHistoryInfiniteQueryOptions","filters","dayLimit","historyObj","filtered","entries","firstHistory","getProfilesQueryOptions","getBalanceHistoryInfiniteQueryOptions","getAggregatedBalanceQueryOptions","getProMembersQueryOptions","proMembersSet","members","m","useAccountUpdate","queryClient","useQueryClient","_data","variables","useAccountRelationsUpdate","onError","kind","relationsQuery","actualRelation","buildVoteOp","weight","buildCommentOp","parentAuthor","parentPermlink","buildCommentOptionsOp","maxAcceptedPayout","percentHbd","allowVotes","allowCurationRewards","extensions","buildDeleteCommentOp","buildReblogOp","deleteReblog","buildTransferOp","buildMultiTransferOps","destinations","dest","buildRecurrentTransferOp","recurrence","executions","buildTransferToSavingsOp","buildTransferFromSavingsOp","requestId","buildCancelTransferFromSavingsOp","buildClaimInterestOps","buildTransferToVestingOp","buildWithdrawVestingOp","vestingShares","buildDelegateVestingSharesOp","delegator","delegatee","buildSetWithdrawVestingRouteOp","fromAccount","toAccount","percent","autoVest","buildConvertOp","buildCollateralizedConvertOp","buildEngineOp","contractAction","contractPayload","contractName","buildEngineClaimOp","buildDelegateRcOp","delegatees","maxRc","delegateeArray","buildFollowOp","buildUnfollowOp","buildIgnoreOp","buildUnignoreOp","buildSetLastReadOps","date","lastReadDate","notifyOp","ecencyNotifyOp","buildWitnessVoteOp","approve","buildWitnessProxyOp","proxy","buildProposalCreateOp","creator","buildProposalVoteOp","proposalIds","buildRemoveProposalOp","proposalOwner","buildUpdateProposalOp","dailyPay","subject","buildSubscribeOp","buildUnsubscribeOp","buildSetRoleOp","buildUpdateCommunityOp","buildPinPostOp","pin","buildMutePostOp","notes","mute","buildMuteUserOp","buildFlagPostOp","BuySellTransactionType","OrderIdPrefix","buildLimitOrderCreateOp","amountToSell","minToReceive","fillOrKill","orderId","formatNumber","decimals","buildLimitOrderCreateOpWithType","orderType","idPrefix","expirationStr","formattedAmountToSell","formattedMinToReceive","buildLimitOrderCancelOp","buildClaimRewardBalanceOp","rewardHive","rewardHbd","rewardVests","buildAccountUpdateOp","active","posting","memoKey","buildAccountUpdate2Op","buildAccountCreateOp","newAccountName","fee","buildCreateClaimedAccountOp","buildClaimAccountOp","buildGrantPostingPermissionOp","currentPosting","grantedAccount","weightThreshold","existingIndex","newAccountAuths","newPosting","buildRevokePostingPermissionOp","revokedAccount","buildChangeRecoveryAccountOp","accountToRecover","newRecoveryAccount","buildRequestAccountRecoveryOp","recoveryAccount","newOwnerAuthority","buildRecoverAccountOp","recentOwnerAuthority","buildBoostPlusOp","buildRcDelegationOp","buildPromoteOp","buildPointTransferOp","sender","receiver","normalizedAmount","buildMultiPointTransferOps","destArray","buildCommunityRegistrationOp","buildActiveCustomJsonOp","buildPostingCustomJsonOp","useFollow","_result","useUnfollow","useBookmarkAdd","useBookmarkDelete","bookmarkId","useAccountFavoriteAdd","qc","useAccountFavoriteDelete","listKey","infinitePrefix","checkKey","previousList","f","previousCheck","infiniteQueries","previousInfinite","context","dedupeAndSortKeyAuths","additions","useAccountUpdateKeyAuths","accountData","keepCurrent","currentKey","keysToRevoke","keysToRevokeByAuthority","prepareAuth","keyName","allKeysToRevoke","existingKeys","values","useAccountUpdatePassword","updateKeys","newPassword","currentPassword","useAccountRevokePosting","accountName","ctx","useAccountUpdateRecovery","email","canRevokeFromAuthority","revokingKeyStrs","remainingWeight","sum","accountWeight","buildRevokeKeysOp","revokingKeys","hasAnyKeyInAuth","clone","needsOwnerUpdate","useAccountRevokeKey","revokingKey","useClaimAccount","useGrantPostingPermission","useCreateAccount","HIVE_VOTING_MANA_REGENERATION_SECONDS","HIVE_100_PERCENT","HIVE_VOTE_DUST_THRESHOLD","getEffectiveVests","vesting","vestsToRshares","votingPowerValue","votePerc","hasStableVoteHardfork","dynamicProps","major","minor","stableVoteRshares","reserveRate","effectiveVests","usedMana","mana","votingRshares","totalVests","votingPower","powerRechargeTime","power","downVotingPower","totalShares","elapsed","currentManaPerc","rcPower","votingValue","rShares","OPERATION_AUTHORITY_MAP","getCustomJsonAuthority","customJsonOp","opType","customJson","getProposalAuthority","proposalOp","getOperationAuthority","getRequiredAuthority","highestAuthority","useSignOperationByKey","keyOrSeed","useSignOperationByKeychain","keyType","useSignOperationByHivesigner","callbackUri","getChainPropertiesQueryOptions","applyFragmentUpdate","vars","buildAddedFragment","useAddFragment","newFragment","index","useEditFragment","fragmentId","applyUpdate","fragment","useRemoveFragment","parseJsonResponse","errorData","signUp","referral","captchaToken","subscribeEmail","usrActivity","ty","bl","getNotifications","saveNotificationSetting","system","allows_notify","notify_types","getNotificationSetting","markNotifications","addImage","UPLOAD_HOST","uploadImage","file","fetchApi","formData","uploadImageWithSignature","deleteImage","imageId","addDraft","updateDraft","draftId","deleteDraft","addSchedule","schedule","reblog","deleteSchedule","moveSchedule","getPromotedPost","onboardEmail","friend","dataBody","useAddDraft","useUpdateDraft","useDeleteDraft","_variables","useAddSchedule","useDeleteSchedule","useMoveSchedule","useAddImage","nextCode","effectiveCode","useDeleteImage","prev","img","useUploadImage","getEntryFromCache","setEntryInCache","mutateEntry","updater","updated","EntriesCacheManagement","updateVotes","payout","updateReblogsCount","count","updateRepliesCount","addReply","reply","updateEntries","invalidateEntry","getEntry","isVoteAlreadyReflected","activeVotes","hasVoterRecord","applyVoteCacheUpdate","newVotes","newPayout","useVote","doInvalidate","useReblog","newCount","invalidate","useComment","beneficiaries","sortedBeneficiaries","isPost","activityType","queriesToInvalidate","discussionsAuthor","discussionsPermlink","addOptimisticDiscussionEntry","rootAuthor","rootPermlink","queries","removeOptimisticDiscussionEntry","snapshots","restoreDiscussionSnapshots","updateEntryInCache","updates","previous","restoreEntryInCache","useDeleteComment","_error","useCrossPost","useUpdateReply","usePromote","DEFAULT_VALIDATE_POST_DELAYS","getContent","validatePostCreating","attempts","delays","waitMs","mutations_exports","useRecordActivity","getLocationInfo","locationInfo","domain","getDiscoverLeaderboardQueryOptions","getDiscoverCurationQueryOptions","accountsResponse","element","curator","receivedVestingShares","delegatedVestingShares","vestingWithdrawRate","effectiveVest","getPageStatsQueryOptions","sortedDimensions","sortedMetrics","THREESPEAK_BENEFICIARY_ACCOUNT","THREESPEAK_BENEFICIARY_WEIGHT","hasThreeSpeakEmbed","enforceThreeSpeakBeneficiary","isThreeSpeakBeneficiary","queries_exports","getAccountTokenQueryOptions","getAccountVideosQueryOptions","getDecodeMemoQueryOptions","HiveSignerIntegration","memoQueryOptions","memoDecoded","tokenQueryOptions","ThreeSpeakIntegration","getHivePoshLinksQueryOptions","getStatsQueryOptions","filterBy","getRcStatsQueryOptions","getAccountRcQueryOptions","EMPTY","estimateRcPrecheck","rcStats","avgCost","safeBuffer","estimatedCost","willLikelyFail","getGameStatusCheckQueryOptions","useGameClaim","recordActivity","getQuestsQueryOptions","QUEST_CATALOG","getQuestCatalogEntry","tier","STREAK_FREEZE_PRICE","STREAK_FREEZE_MAX_OWNED","genIdempotencyKey","buyStreakFreezeRequest","useBuyStreakFreeze","useSubscribeCommunity","useUnsubscribeCommunity","useMutePost","useSetCommunityRole","team","idx","useUpdateCommunity","useRegisterCommunityRewards","usePinPost","getCommunitiesQueryOptions","getCommunityContextQueryOptions","getCommunityQueryOptions","SUBSCRIBERS_PAGE_SIZE","fetchSubscribersPage","getCommunitySubscribersQueryOptions","getCommunitySubscribersInfiniteQueryOptions","getAccountNotificationsInfiniteQueryOptions","getRewardedCommunitiesQueryOptions","ROLES","roleMap","getCommunityType","type_id","getCommunityPermissions","communityType","userRole","subscribed","canPost","canComment","isModerator","getNotificationsUnreadCountQueryOptions","getNotificationsInfiniteQueryOptions","NotificationFilter","NotifyTypes","ALL_NOTIFY_TYPES","NotificationViewType","getNotificationsSettingsQueryOptions","initialMuted","getAnnouncementsQueryOptions","getSpotlightsQueryOptions","_accessToken","markNotificationRead","isInfiniteData","useMarkNotificationsRead","previousData","updatedData","unreadKey","currentUnread","unreadCount","useSetLastRead","getProposalQueryOptions","proposal","getProposalsQueryOptions","proposals","expired","getProposalVotesInfiniteQueryOptions","getUserProposalVotesQueryOptions","vote","useProposalVote","useProposalCreate","getVestingDelegationsQueryOptions","fetchLimit","getAccountDelegationsQueryOptions","getVestingDelegationExpirationsQueryOptions","getConversionRequestsQueryOptions","getCollateralizedConversionRequestsQueryOptions","getSavingsWithdrawFromQueryOptions","getWithdrawRoutesQueryOptions","getOpenOrdersQueryOptions","getOutgoingRcDelegationsInfiniteQueryOptions","delegations","delegation","getIncomingRcQueryOptions","getReceivedVestingSharesQueryOptions","getRecurrentTransfersQueryOptions","normalizeString","trimmed","normalizeNumber","direct","parseToken","rawToken","extractTokens","record","resolveUsername","getPortfolioQueryOptions","getHiveAssetGeneralInfoQueryOptions","marketTicker","marketPrice","liquidBalance","savingsBalance","getHbdAssetGeneralInfoQueryOptions","price","getAPR","currentInflationRate","totalVestingFunds","getHivePowerAssetGeneralInfoQueryOptions","delegatedVests","receivedVests","withdrawRateVests","remainingToWithdrawVests","nextWithdrawalVests","hpBalance","outgoingDelegationsHp","incomingDelegationsHp","pendingPowerDownHp","nextPowerDownHp","totalBalance","availableHp","HIVE_ACCOUNT_OPERATION_GROUPS","HIVE_OPERATION_LIST","operationOrders","HIVE_OPERATION_ORDERS","HIVE_OPERATION_NAME_BY_ID","isHiveOperationName","resolveHiveOperationFilters","rawValues","hasAll","uniqueValues","operationIds","filterArgs","getHiveAssetTransactionsQueryOptions","__","pages","pageParams","getHbdAssetTransactionsQueryOptions","getHivePowerAssetTransactionsQueryOptions","userSelectedOperations","hasAllFilter","formatDate","pad","subtractSeconds","getHiveAssetMetricQueryOptions","hive","non_hive","open","_","prevStartDate","getHiveAssetWithdrawalRoutesQueryOptions","getHivePowerDelegatesInfiniteQueryOptions","getHivePowerDelegatingsQueryOptions","getOrderBookQueryOptions","getMarketStatisticsQueryOptions","getMarketHistoryQueryOptions","getHiveHbdStatsQueryOptions","oneDayAgo","dayChange","getMarketDataQueryOptions","getTradeHistoryQueryOptions","getFeedHistoryQueryOptions","getCurrentMedianHistoryPriceQueryOptions","useLimitOrderCreate","useLimitOrderCancel","getMarketData","getCurrencyRate","cur","getCurrencyTokenRate","getCurrencyRates","getHivePrice","ENGINE_RPC_HEADERS","engineRpc","engineRpcSafe","getHiveEngineOrderBook","baseParams","buy","sell","sortByPriceDesc","left","sortByPriceAsc","right","getHiveEngineTradeHistory","getHiveEngineOpenOrders","buyRaw","sellRaw","formatTotal","quantity","getHiveEngineMetrics","symbolQuery","getHiveEngineTokensMarket","getHiveEngineTokensBalances","getHiveEngineTokensMetadata","getHiveEngineTokenTransactions","getHiveEngineTokenMetrics","interval","getHiveEngineUnclaimedRewards","getHiveEngineTokensBalancesQueryOptions","getHiveEngineTokensMarketQueryOptions","getHiveEngineTokensMetadataQueryOptions","getHiveEngineTokenTransactionsQueryOptions","_allPages","lastPageParam","_firstPage","firstPageParam","getHiveEngineTokensMetricsQueryOptions","getHiveEngineUnclaimedRewardsQueryOptions","pending_token","getAllHiveEngineTokensQueryOptions","formattedNumber","fractionDigits","out","av","HiveEngineToken","getHiveEngineBalancesWithUsdQueryOptions","allTokens","balances","t","pricePerHive","providedMetrics","unpricedSymbols","balance","metric","tokenMetadata","lastPrice","balanceAmount","usdValue","getHiveEngineTokenGeneralInfoQueryOptions","hiveQuery","hiveData","metadataList","balanceList","marketList","stakedBalance","unstakingBalance","getPointsQueryOptions","pointsResponse","points","transactionsResponse","transactions","getPointsAssetGeneralInfoQueryOptions","getPointsAssetTransactionsQueryOptions","created","getAccountWalletAssetInfoQueryOptions","fetchQuery","qo","convertPriceToUserCurrency","assetInfo","conversionRate","portfolioQuery","getPortfolioAssetInfo","assetItem","extraItem","dataKey","numValue","portfolioAssetInfo","converted","AssetOperation","useTransfer","useTransferPoint","useDelegateVestingShares","useSetWithdrawVestingRoute","useTransferEngineToken","useTransferToSavings","useTransferFromSavings","useTransferToVesting","useWithdrawVesting","useConvert","useClaimInterest","CLAIM_REWARDS_INVALIDATION_DELAY_MS","pendingInvalidationTimers","useClaimRewards","timerKey","keysToInvalidate","existingTimer","rejected","useDelegateEngineToken","useUndelegateEngineToken","useStakeEngineToken","useUnstakeEngineToken","useClaimEngineRewards","useEngineMarketOrder","buildHiveOperations","buildEngineOperations","getWalletOperationAuthority","useWalletOperation","hiveOps","engineOps","useDelegateRc","useWitnessVote","useWitnessProxy","mapRestWitness","w","getWitnessesInfiniteQueryOptions","getWitnessVotersPageQueryOptions","getWitnessVoterCountQueryOptions","PointTransactionType","claimPointsRequest","contentType","detail","useClaimPoints","author_re","type_re","category_re","tag_re","SearchType","MAX_SEARCH_TAGS","MAX_SEARCH_QUERY_LENGTH","firstToken","normalizeSearchAuthor","normalizeSearchCategory","normalizeSearchTags","seen","buildSearchQuery","search","category","normalizedSearch","normalizedCategory","normalizedTags","part","SearchQuery","_query","re","matches","raw","isSearchResponse","MAX_RETRIES","isServer","searchRetryPolicy","failureCount","isTransient","searchQueryOptions","scroll_id","getControversialRisingInfiniteQueryOptions","sinceDate","similar","searchPath","SIMILAR_ENTRIES_SINCE_MS","SIMILAR_ENTRIES_TARGET","SIMILAR_ENTRIES_BODY_LIMIT","SIMILAR_ENTRIES_SSR_TIMEOUT_MS","SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS","SIMILAR_ENTRIES_MIN_RENDER","toMltExcerpt","fingerprint","getSimilarEntriesQueryOptions","rawTags","contentKey","collected","seenAuthors","getSearchAccountQueryOptions","getSearchTopicsQueryOptions","getSearchApiInfiniteQueryOptions","getSearchPathQueryOptions","getSupportSettingsRequest","getSupportSettingsQueryOptions","updateSupportSettingsRequest","applySupportSettingsUpdate","useUpdateSupportSettings","getBoostPlusPricesQueryOptions","getRcDelegationPricesQueryOptions","getRcDelegationActiveQueryOptions","responseData","getPromotePriceQueryOptions","getBoostPlusAccountPricesQueryOptions","useBoostPlus","useRcDelegation","hsTokenRenew","BAD_ACTORS_URL","getBadActorsQueryOptions","POLLS_PROTOCOL_VERSION","PollPreferredInterpretation","mapMetaChoicesToPollChoices","metaChoices","choice","normalizePoll","pollChoices","pollVoters","rawStats","choices","voters","getPollQueryOptions","usePollVote","pollTrxId"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @license bytebuffer.ts (c) 2015 Daniel Wirtz \n * Backing buffer: ArrayBuffer, Accessor: DataView\n * Released under the Apache License, Version 2.0\n * see: https://github.com/dcodeIO/bytebuffer.ts for details\n * modified by @xmcl/bytebuffer\n * And customized for hive-tx\n */\n\nconst EMPTY_BUFFER = new ArrayBuffer(0)\n\n// Lazy-init to avoid crashing on runtimes that lack TextEncoder/TextDecoder\n// (notably React Native with Hermes). Falls back to manual UTF-8 encode/decode.\nlet _encoder: { encode(s: string): Uint8Array } | null = null\nlet _decoder: { decode(b: BufferSource): string } | null = null\n\nfunction getEncoder(): { encode(s: string): Uint8Array } {\n if (!_encoder) {\n if (typeof TextEncoder !== 'undefined') {\n _encoder = new TextEncoder()\n } else {\n _encoder = {\n encode(s: string): Uint8Array {\n // Manual UTF-8 encode fallback\n const utf8: number[] = []\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i)\n if (c < 0x80) {\n utf8.push(c)\n } else if (c < 0x800) {\n utf8.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {\n const next = s.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n utf8.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n utf8.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n return new Uint8Array(utf8)\n },\n }\n }\n }\n return _encoder\n}\n\nfunction getDecoder(): { decode(b: BufferSource): string } {\n if (!_decoder) {\n if (typeof TextDecoder !== 'undefined') {\n _decoder = new TextDecoder()\n } else {\n _decoder = {\n decode(b: BufferSource): string {\n const bytes = b instanceof ArrayBuffer ? new Uint8Array(b) : new Uint8Array((b as ArrayBufferView).buffer, (b as ArrayBufferView).byteOffset, (b as ArrayBufferView).byteLength)\n let result = ''\n for (let i = 0; i < bytes.length; ) {\n const byte = bytes[i]\n let codePoint: number\n if (byte < 0x80) { codePoint = byte; i += 1 }\n else if ((byte & 0xe0) === 0xc0) { codePoint = ((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f); i += 2 }\n else if ((byte & 0xf0) === 0xe0) { codePoint = ((byte & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f); i += 3 }\n else { codePoint = ((byte & 0x07) << 18) | ((bytes[i + 1] & 0x3f) << 12) | ((bytes[i + 2] & 0x3f) << 6) | (bytes[i + 3] & 0x3f); i += 4 }\n if (codePoint <= 0xffff) { result += String.fromCharCode(codePoint) }\n else { codePoint -= 0x10000; result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff)) }\n }\n return result\n },\n }\n }\n }\n return _decoder\n}\n\nexport class ByteBuffer {\n static LITTLE_ENDIAN = true\n static BIG_ENDIAN = false\n static DEFAULT_CAPACITY = 16\n static DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN\n\n buffer: ArrayBufferLike\n view: DataView\n offset: number\n markedOffset: number\n limit: number\n littleEndian: boolean\n\n constructor(\n capacity: number = ByteBuffer.DEFAULT_CAPACITY,\n littleEndian: boolean = ByteBuffer.DEFAULT_ENDIAN\n ) {\n this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity)\n this.view = capacity === 0 ? new DataView(EMPTY_BUFFER) : new DataView(this.buffer)\n this.offset = 0\n this.markedOffset = -1\n this.limit = capacity\n this.littleEndian = littleEndian\n }\n\n static allocate(capacity?: number, littleEndian?: boolean): ByteBuffer {\n return new ByteBuffer(capacity, littleEndian)\n }\n\n static concat(\n buffers: Array,\n littleEndian?: boolean\n ): ByteBuffer {\n let capacity = 0\n for (let i = 0; i < buffers.length; ++i) {\n const buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n capacity += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n capacity += buf.length\n } else if (buf instanceof ArrayBuffer) {\n capacity += buf.byteLength\n } else if (Array.isArray(buf)) {\n capacity += buf.length\n } else {\n throw TypeError('Illegal buffer')\n }\n }\n\n if (capacity === 0) {\n return new ByteBuffer(0, littleEndian)\n }\n\n const bb = new ByteBuffer(capacity, littleEndian)\n const view = new Uint8Array(bb.buffer)\n let offset = 0\n\n for (let i = 0; i < buffers.length; ++i) {\n let buf = buffers[i]\n if (buf instanceof ByteBuffer) {\n view.set(new Uint8Array(buf.buffer, buf.offset, buf.limit - buf.offset), offset)\n offset += buf.limit - buf.offset\n } else if (buf instanceof Uint8Array) {\n view.set(buf, offset)\n offset += buf.length\n } else if (buf instanceof ArrayBuffer) {\n view.set(new Uint8Array(buf), offset)\n offset += buf.byteLength\n } else {\n // Array\n view.set(buf as number[], offset)\n offset += (buf as number[]).length\n }\n }\n\n bb.limit = bb.offset = offset\n bb.offset = 0\n return bb\n }\n\n static wrap(\n buffer: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n littleEndian?: boolean\n ): ByteBuffer {\n if (buffer instanceof ByteBuffer) {\n const bb = buffer.clone()\n bb.markedOffset = -1\n return bb\n }\n\n let bb: ByteBuffer\n if (buffer instanceof Uint8Array) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.length > 0) {\n bb.buffer = buffer.buffer\n bb.offset = buffer.byteOffset\n bb.limit = buffer.byteOffset + buffer.byteLength\n bb.view = new DataView(buffer.buffer)\n }\n } else if (buffer instanceof ArrayBuffer) {\n bb = new ByteBuffer(0, littleEndian)\n if (buffer.byteLength > 0) {\n bb.buffer = buffer\n bb.offset = 0\n bb.limit = buffer.byteLength\n bb.view = buffer.byteLength > 0 ? new DataView(buffer) : new DataView(EMPTY_BUFFER)\n }\n } else if (Array.isArray(buffer)) {\n bb = new ByteBuffer(buffer.length, littleEndian)\n bb.limit = buffer.length\n new Uint8Array(bb.buffer).set(buffer)\n } else {\n throw TypeError('Illegal buffer')\n }\n\n return bb\n }\n\n writeBytes(\n source: ByteBuffer | ArrayBuffer | Uint8Array | number[],\n offset?: number\n ): ByteBuffer {\n return this.append(source, offset)\n }\n\n writeInt8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setInt8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeByte(value: number, offset?: number): ByteBuffer {\n return this.writeInt8(value, offset)\n }\n\n writeUint8(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 1 > this.buffer.byteLength) {\n this.resize(offset + 1)\n }\n\n this.view.setUint8(offset, value)\n\n if (relative) this.offset += 1\n return this\n }\n\n writeUInt8(value: number, offset?: number): ByteBuffer {\n return this.writeUint8(value, offset)\n }\n\n readUint8(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint8(offset)\n if (relative) this.offset += 1\n return value\n }\n\n readUInt8(offset?: number): number {\n return this.readUint8(offset)\n }\n\n writeInt16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setInt16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeShort(value: number, offset?: number): ByteBuffer {\n return this.writeInt16(value, offset)\n }\n\n writeUint16(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 2 > this.buffer.byteLength) {\n this.resize(offset + 2)\n }\n\n this.view.setUint16(offset, value, this.littleEndian)\n\n if (relative) this.offset += 2\n return this\n }\n\n writeUInt16(value: number, offset?: number): ByteBuffer {\n return this.writeUint16(value, offset)\n }\n\n writeInt32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setInt32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeInt(value: number, offset?: number): ByteBuffer {\n return this.writeInt32(value, offset)\n }\n\n writeUint32(value: number, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (offset + 4 > this.buffer.byteLength) {\n this.resize(offset + 4)\n }\n\n this.view.setUint32(offset, value, this.littleEndian)\n\n if (relative) this.offset += 4\n return this\n }\n\n writeUInt32(value: number, offset?: number): ByteBuffer {\n return this.writeUint32(value, offset)\n }\n\n readUint32(offset?: number): number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getUint32(offset, this.littleEndian)\n if (relative) {\n this.offset += 4\n }\n return value\n }\n\n readUInt32 = this.readUint32\n\n append(source: ByteBuffer | ArrayBuffer | Uint8Array | number[], offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n let src: Uint8Array\n if (source instanceof ByteBuffer) {\n src = new Uint8Array(source.buffer, source.offset, source.limit - source.offset)\n source.offset += src.length\n } else if (source instanceof Uint8Array) {\n src = source\n } else if (source instanceof ArrayBuffer) {\n src = new Uint8Array(source)\n } else {\n src = new Uint8Array(source)\n }\n\n if (src.length <= 0) return this\n\n if (offset + src.length > this.buffer.byteLength) {\n this.resize(offset + src.length)\n }\n\n new Uint8Array(this.buffer).set(src, offset)\n\n if (relative) this.offset += src.length\n return this\n }\n\n clone(copy?: boolean): ByteBuffer {\n const bb = new ByteBuffer(0, this.littleEndian)\n if (copy) {\n bb.buffer = new ArrayBuffer(this.buffer.byteLength)\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer))\n bb.view = new DataView(bb.buffer)\n } else {\n bb.buffer = this.buffer\n bb.view = this.view\n }\n bb.offset = this.offset\n bb.markedOffset = this.markedOffset\n bb.limit = this.limit\n return bb\n }\n\n copy(begin?: number, end?: number): ByteBuffer {\n if (begin === undefined) begin = this.offset\n if (end === undefined) end = this.limit\n\n if (begin === end) {\n return new ByteBuffer(0, this.littleEndian)\n }\n\n const capacity = end - begin\n const bb = new ByteBuffer(capacity, this.littleEndian)\n bb.offset = 0\n bb.limit = capacity\n\n new Uint8Array(bb.buffer).set(new Uint8Array(this.buffer).subarray(begin, end), 0)\n return bb\n }\n\n copyTo(\n target: ByteBuffer,\n targetOffset?: number,\n sourceOffset?: number,\n sourceLimit?: number\n ): ByteBuffer {\n const targetRelative = typeof targetOffset === 'undefined'\n const relative = typeof sourceOffset === 'undefined'\n targetOffset = targetRelative ? target.offset : targetOffset!\n sourceOffset = relative ? this.offset : sourceOffset!\n sourceLimit = sourceLimit === undefined ? this.limit : sourceLimit\n\n const len = sourceLimit - sourceOffset\n if (len === 0) return target\n\n target.ensureCapacity(targetOffset + len)\n new Uint8Array(target.buffer).set(\n new Uint8Array(this.buffer).subarray(sourceOffset, sourceLimit),\n targetOffset\n )\n\n if (relative) this.offset += len\n if (targetRelative) target.offset += len\n return this\n }\n\n ensureCapacity(capacity: number): ByteBuffer {\n let current = this.buffer.byteLength\n if (current < capacity) {\n return this.resize((current *= 2) > capacity ? current : capacity)\n }\n return this\n }\n\n flip(): ByteBuffer {\n this.limit = this.offset\n this.offset = 0\n return this\n }\n\n resize(capacity: number): ByteBuffer {\n if (this.buffer.byteLength < capacity) {\n const buffer = new ArrayBuffer(capacity)\n new Uint8Array(buffer).set(new Uint8Array(this.buffer))\n this.buffer = buffer\n this.view = new DataView(buffer)\n }\n return this\n }\n\n skip(length: number): ByteBuffer {\n this.offset += length\n return this\n }\n\n writeInt64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigInt64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeLong(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeInt64(value, offset)\n }\n\n readInt64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigInt64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readLong(offset?: number): bigint {\n return this.readInt64(offset)\n }\n\n writeUint64(value: number | bigint, offset?: number): ByteBuffer {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n if (typeof value === 'number') value = BigInt(value)\n\n if (offset + 8 > this.buffer.byteLength) {\n this.resize(offset + 8)\n }\n\n this.view.setBigUint64(offset, value, this.littleEndian)\n\n if (relative) this.offset += 8\n return this\n }\n\n writeUInt64(value: number | bigint, offset?: number): ByteBuffer {\n return this.writeUint64(value, offset)\n }\n\n readUint64(offset?: number): bigint {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const value = this.view.getBigUint64(offset, this.littleEndian)\n if (relative) this.offset += 8\n return value\n }\n\n readUInt64(offset?: number): bigint {\n return this.readUint64(offset)\n }\n\n toBuffer(forceCopy?: boolean): ArrayBufferLike {\n const offset = this.offset\n const limit = this.limit\n if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) {\n return this.buffer\n }\n if (offset === limit) return EMPTY_BUFFER\n return this.buffer.slice(offset, limit)\n }\n\n toArrayBuffer(forceCopy?: boolean): ArrayBufferLike {\n return this.toBuffer(forceCopy)\n }\n\n writeVarint32(value: number, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const size = this.calculateVarint32(value)\n if (offset + size > this.buffer.byteLength) {\n this.resize(offset + size)\n }\n\n value >>>= 0\n while (value >= 0x80) {\n this.view.setUint8(offset++, (value & 0x7f) | 0x80)\n value >>>= 7\n }\n this.view.setUint8(offset++, value)\n\n if (relative) {\n this.offset = offset\n return this\n }\n return size\n }\n\n readVarint32(offset?: number): number | { value: number; length: number } {\n const relative = typeof offset === 'undefined'\n if (typeof offset === 'undefined') {\n offset = this.offset\n }\n let c = 0\n let value = 0 >>> 0\n let b: number\n do {\n b = this.view.getUint8(offset++)\n if (c < 5) {\n value |= (b & 0x7f) << (7 * c)\n }\n ++c\n } while ((b & 0x80) !== 0)\n value |= 0\n\n if (relative) {\n this.offset = offset\n return value\n }\n return { value, length: c }\n }\n\n calculateVarint32(value: number): number {\n value = value >>> 0\n if (value < 1 << 7) return 1\n else if (value < 1 << 14) return 2\n else if (value < 1 << 21) return 3\n else if (value < 1 << 28) return 4\n else return 5\n }\n\n writeVString(str: string, offset?: number): ByteBuffer | number {\n const relative = typeof offset === 'undefined'\n let currentOffset = relative ? this.offset : offset!\n\n const encoded = getEncoder().encode(str)\n const len = encoded.length\n const lenVarintSize = this.calculateVarint32(len)\n\n if (currentOffset + lenVarintSize + len > this.buffer.byteLength) {\n this.resize(currentOffset + lenVarintSize + len)\n }\n\n this.writeVarint32(len, currentOffset)\n currentOffset += lenVarintSize\n\n new Uint8Array(this.buffer).set(encoded, currentOffset)\n currentOffset += len\n\n if (relative) {\n this.offset = currentOffset\n return this\n }\n return currentOffset - (offset || 0)\n }\n\n readVString(offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n const start = offset\n const lenResult = this.readVarint32(offset) as { value: number; length: number }\n const lenValue = lenResult.value\n const lenLength = lenResult.length\n\n offset += lenLength\n\n // TextDecoder can take Uint8Array view directly\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, lenValue))\n offset += lenValue\n\n if (relative) {\n this.offset = offset\n return str\n } else {\n return {\n string: str,\n length: offset - start\n }\n }\n }\n\n readUTF8String(length: number, offset?: number): string | { string: string; length: number } {\n const relative = typeof offset === 'undefined'\n if (relative) offset = this.offset\n else offset = offset!\n\n // const strBuffer = this.buffer.slice(offset, end)\n // Faster to view if Shared? No, Decoder takes buffer or view.\n // Making a view is cheap.\n // But DataView vs Uint8Array. TextDecoder takes BufferSource (ArrayBuffer or ArrayBufferView).\n const str = getDecoder().decode(new Uint8Array(this.buffer as ArrayBuffer, offset, length))\n\n if (relative) {\n this.offset += length\n return str\n } else {\n return {\n string: str,\n length\n }\n }\n }\n}\n","import type { APIMethods } from './api-types'\n\n/**\n * Unified configuration for Hive blockchain connectivity.\n * This is the single source of truth for node endpoints, timeouts, and chain settings.\n * Mutate this object directly or use ConfigManager.setHiveNodes() for validated updates.\n */\nexport const config = {\n /**\n * Array of Hive API node endpoints for load balancing and failover.\n */\n nodes: [\n 'https://api.hive.blog',\n 'https://api.deathwing.me',\n 'https://api.openhive.network',\n 'https://techcoderx.com',\n 'https://api.syncad.com',\n 'https://rpc.mahdiyari.info',\n ],\n\n /**\n * Array of Hive API node endpoints that support REST APIs.\n * Note: Without the trailing /\n */\n restNodes: [\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://api.syncad.com',\n 'https://hiveapi.actifit.io',\n 'https://api.c0ff33a.uk'\n ],\n\n /**\n * Per-API REST node override. Some APIs are served by only a subset of\n * nodes; list just those capable hosts here so callREST never burns its\n * (small) retry budget on nodes that 404/503 the API, and a cold start\n * hits a capable node immediately. Any API not listed falls back to\n * `restNodes`. The health tracker still orders *within* this list.\n *\n * hivesense: empirically only ~2 public nodes serve /hivesense-api (the\n * other configured nodes 404/503 it; Ecency's own was decommissioned), so\n * pin them — otherwise the health tracker keeps rediscovering incapable\n * nodes each cooldown and cold starts waste attempts.\n */\n restNodesByApi: {\n hivesense: ['https://api.hive.blog', 'https://api.syncad.com']\n } as Partial>,\n\n /**\n * User-Agent sent on server-side (Node) HTTP requests to Hive nodes.\n *\n * Node's built-in fetch (undici) sends a bare `User-Agent: node` when none is\n * set, which is indistinguishable from any random Node script in node/CDN\n * analytics. A descriptive value lets operators tell their own SSR/server\n * traffic apart from anonymous scrapers. Only applied in Node — browsers\n * forbid overriding User-Agent (it is silently dropped) and React Native sets\n * its own native UA, so client and mobile traffic are untouched. Override via\n * `ConfigManager.setUserAgent()` (or `setUserAgent()` from `@ecency/sdk/hive`).\n */\n userAgent: 'ecency-sdk',\n\n /**\n * The Hive blockchain chain ID for transaction signing and verification.\n */\n chain_id: 'beeab0de00000000000000000000000000000000000000000000000000000000',\n\n /**\n * Address prefix used for public key formatting (STM for mainnet).\n */\n address_prefix: 'STM',\n\n /**\n * Timeout in milliseconds for read API calls (get_content, get_accounts, etc.).\n * Kept short so the health tracker can fail over to another node quickly.\n */\n timeout: 5_000,\n\n /**\n * Timeout in milliseconds for broadcast API calls.\n * Longer than read timeout because broadcast_transaction_synchronous waits\n * for block inclusion, which depends on the 3-second block interval and\n * network conditions.\n */\n broadcastTimeout: 15_000,\n\n /**\n * Number of retry attempts for failed API calls before throwing an error.\n * Total attempts = retry + 1. With ~7 nodes in the list, a budget of 5\n * means callRPC iterates through 6 distinct nodes before giving up, so a\n * single sick node (or two) can't surface as an unhandled error to the\n * caller while the rest of the list is healthy.\n */\n retry: 5,\n\n /**\n * Tail-latency resilience for READ calls. Motivation: on a shared public-node\n * pool a node can slow down or throttle *mid-request*; a fixed `timeout` means\n * the caller only notices after the full window, and under SSR concurrency\n * those stalled renders pile up. Two mechanisms, both scoped to reads only\n * (broadcasts never hedge and keep their fixed `broadcastTimeout`):\n *\n * - Adaptive per-attempt timeout (`adaptiveTimeout`, default ON): when a\n * node has a usable latency profile (EWMA), the per-attempt timeout becomes\n * `min(callerTimeout, max(floorMs, factor × EWMA))` — a node running far\n * above its own baseline is abandoned early and failover starts sooner.\n * Never *raises* the caller's timeout; unprofiled nodes keep it unchanged.\n *\n * - Hedged requests (`hedge`, default OFF — opt in via `setResilience`): if\n * the primary attempt is still pending after `max(hedgeDelayFloorMs,\n * hedgeDelayFactor × EWMA)`, a duplicate request is fired at the next\n * healthy untried node and the first success wins (the loser is aborted).\n * A token bucket (`hedgeBucketCapacity` burst, refilled by\n * `hedgeRefillPerSuccess` per un-hedged success) caps hedges to roughly\n * `hedgeRefillPerSuccess` of traffic, so only the slow tail hedges — and\n * under pool-wide slowness the bucket drains and hedging auto-disables\n * instead of amplifying load into public-node rate limits.\n */\n resilience: {\n adaptiveTimeout: true,\n adaptiveTimeoutFloorMs: 2_000,\n adaptiveTimeoutFactor: 4,\n hedge: false,\n hedgeDelayFloorMs: 750,\n hedgeDelayFactor: 2,\n hedgeBucketCapacity: 10,\n hedgeRefillPerSuccess: 0.1,\n /**\n * Wall-clock budget for one read call across ALL failover attempts, as a\n * multiple of the per-attempt timeout: no NEW attempt starts past\n * `totalBudgetFactor × timeout` (an in-flight attempt still finishes its\n * own window). Bounds the pathological pool-wide-slowness walk — without\n * it a read could hold its caller for (retry+1) × timeout ≈ 30s, which\n * under SSR concurrency is a memory pile-up, the exact incident this\n * feature exists for. Applies to reads only (callRPC / callREST);\n * broadcasts keep their try-each-node-once semantics.\n */\n totalBudgetFactor: 2\n }\n}\n\n/** Shape of the `config.resilience` bag (see its doc comment). */\nexport type ResilienceOptions = typeof config.resilience\n\n/**\n * Validated setter for the Hive RPC node list — replaces `config.nodes`.\n * Trims, drops non-http(s) entries, and de-dupes (order-preserving). A no-op\n * if nothing valid remains, so a bad input can't empty the list.\n *\n * Lives here, in the React-free `hive-tx` core, on purpose: it must be\n * reachable from BOTH the full `@ecency/sdk` entry (via\n * `ConfigManager.setHiveNodes`, which delegates here) and the lean\n * `@ecency/sdk/hive` server/CLI entry — without dragging react-query or the\n * DMCA/ReDoS surface of `ConfigManager` into the lean entry. Within a single\n * bundle this mutates the one `config` instance `callRPC` reads; the\n * cross-bundle single-instance guarantee is a separate (build-level) concern.\n */\n/**\n * Trim, drop non-string / non-http(s), and de-dupe (order-preserving) a node\n * list. Shared by `setNodes` and the REST-node setters below so all three\n * normalize identically.\n */\nconst sanitizeNodeList = (nodes: unknown): string[] =>\n Array.isArray(nodes)\n ? [\n ...new Set(\n nodes\n .filter((n): n is string => typeof n === 'string')\n // Trim, then strip trailing slashes so REST paths concatenate cleanly:\n // `callREST` builds `node + '/status-api'`, and a `https://host/` node would\n // otherwise yield `https://host//status-api`, which several HAF nodes 404.\n // De-dupe AFTER normalizing so `host` and `host/` collapse to one entry.\n .map((n) => n.trim().replace(/\\/+$/, ''))\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n : []\n\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = sanitizeNodeList(nodes)\n if (!validNodes.length) return\n config.nodes = validNodes\n}\n\n/**\n * Validated setter for the REST-API node list — replaces `config.restNodes`.\n * Same shape/guarantees as `setNodes` (trim, drop non-http(s), de-dupe, no-op on\n * empty). Exists because `restNodes` is otherwise baked into the SDK: an app that\n * wants to add/remove a REST host (e.g. drop an own node it is decommissioning, or\n * widen the public pool) previously had to fork + republish the SDK. With this, the\n * REST pool is app-configurable at runtime exactly like the read pool. Lives in the\n * React-free `hive-tx` core so both the full `@ecency/sdk` entry and the lean\n * `@ecency/sdk/hive` entry can reach it.\n */\nexport const setRestNodes = (nodes: string[]): void => {\n const valid = sanitizeNodeList(nodes)\n if (!valid.length) return\n config.restNodes = valid\n}\n\n/**\n * Merge validated per-API REST node overrides into `config.restNodesByApi`.\n * For each entry: a non-empty, valid list pins that API to those hosts; an empty or\n * all-invalid list REMOVES the pin so the API falls back to `restNodes`. Other APIs'\n * existing pins (e.g. the built-in `hivesense`) are preserved. Lets an app pin the\n * APIs it actually uses to known-capable hosts (so `callREST` never burns its small\n * retry budget on a node that 404/503s the API) without an SDK republish.\n */\nexport const setRestNodesByApi = (\n map: Partial>\n): void => {\n if (!map || typeof map !== 'object') return\n const next: Partial> = { ...config.restNodesByApi }\n for (const [api, list] of Object.entries(map)) {\n const valid = sanitizeNodeList(list)\n if (valid.length) {\n next[api as APIMethods] = valid\n } else {\n delete next[api as APIMethods]\n }\n }\n config.restNodesByApi = next\n}\n\n/**\n * Validated setter for the User-Agent sent on server-side (Node) requests.\n * Trims the input and ignores an empty value so a bad input can't blank out the\n * header. Like `setNodes`, it lives in the React-free `hive-tx` core so it is\n * reachable from both the full `@ecency/sdk` entry (via\n * `ConfigManager.setUserAgent`) and the lean `@ecency/sdk/hive` server/CLI entry.\n */\nexport const setUserAgent = (ua: string): void => {\n // Defensive against plain-JS / React Native callers that may pass a non-string\n // despite the `string` type (avoids throwing on `.trim()`).\n if (typeof ua !== 'string') return\n const value = ua.trim()\n // Ignore blank values, and reject control characters (CR, LF, and other\n // C0/DEL controls). An invalid header value would otherwise be stored and make\n // every subsequent fetch throw, and rejecting CR/LF closes a header-injection\n // vector for any caller that builds the UA from untrusted input.\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return\n config.userAgent = value\n}\n\n/**\n * Validated partial setter for `config.resilience` (adaptive read timeouts +\n * hedged requests — see the field's doc comment). Booleans must be booleans;\n * numeric fields must be finite and positive, with the refill rate additionally\n * capped at 1 so a typo can't turn the tail-hedge into a traffic doubler\n * (refill ≤ 1 ⇒ hedges can never exceed un-hedged successes). Invalid values\n * are ignored field-by-field, so one bad entry can't block the rest. Lives in\n * the React-free `hive-tx` core (like the other setters) so both `@ecency/sdk`\n * (via `ConfigManager.setResilience`) and the lean `@ecency/sdk/hive` entry\n * can reach it.\n */\nexport const setResilience = (opts: Partial): void => {\n if (!opts || typeof opts !== 'object') return\n const r = config.resilience\n const bool = (v: unknown): v is boolean => typeof v === 'boolean'\n const pos = (v: unknown): v is number =>\n typeof v === 'number' && Number.isFinite(v) && v > 0\n if (bool(opts.adaptiveTimeout)) r.adaptiveTimeout = opts.adaptiveTimeout\n // Floor must stay ≥ the tracker's slow-failure recording floor (2s): the\n // safety argument for adaptive timeouts is that an abort at the window IS\n // recorded as a slow sample, growing the EWMA so the window self-corrects\n // upward. A floor below 2s would abort without recording — the window could\n // never converge and a too-tight profile would starve that call forever.\n if (pos(opts.adaptiveTimeoutFloorMs)) {\n r.adaptiveTimeoutFloorMs = Math.max(opts.adaptiveTimeoutFloorMs, 2_000)\n }\n if (pos(opts.adaptiveTimeoutFactor)) r.adaptiveTimeoutFactor = opts.adaptiveTimeoutFactor\n if (bool(opts.hedge)) r.hedge = opts.hedge\n if (pos(opts.hedgeDelayFloorMs)) r.hedgeDelayFloorMs = opts.hedgeDelayFloorMs\n if (pos(opts.hedgeDelayFactor)) r.hedgeDelayFactor = opts.hedgeDelayFactor\n if (pos(opts.hedgeBucketCapacity)) r.hedgeBucketCapacity = opts.hedgeBucketCapacity\n // Refill must stay ≤ 1: at 1 token per success the hedge rate could reach\n // 100% of traffic, defeating the \"tail only\" contract. Cap rather than reject\n // so a caller asking for \"more hedging\" gets the safe maximum.\n if (pos(opts.hedgeRefillPerSuccess)) {\n r.hedgeRefillPerSuccess = Math.min(opts.hedgeRefillPerSuccess, 1)\n }\n // Below 1 the budget could not even cover the configured per-attempt window.\n if (pos(opts.totalBudgetFactor)) {\n r.totalBudgetFactor = Math.max(opts.totalBudgetFactor, 1)\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport class Signature {\n data: Uint8Array\n recovery: number\n private compressed: boolean\n\n /**\n * Creates a new Signature instance.\n * @param data Raw signature data (64 bytes)\n * @param recovery Recovery byte (0-3)\n * @param compressed Whether signature is compressed (default: true)\n */\n constructor(data: Uint8Array, recovery: number, compressed?: boolean) {\n this.data = data\n this.recovery = recovery\n this.compressed = compressed ?? true\n }\n\n /**\n * Creates a Signature from a hex string.\n * @param string 130-character hex string containing signature and recovery data\n * @returns New Signature instance\n * @throws Error if input is not a string\n */\n static from(string: string) {\n if (typeof string === 'string') {\n const temp = hexToBytes(string)\n let recovery = parseInt(bytesToHex(temp.subarray(0, 1)), 16) - 31\n let compressed = true\n // non-compressed signatures have -4\n // https://github.com/bitcoin/bitcoin/blob/95ea54ba089610019a74c1176a2c7c0dba144b1c/src/key.cpp#L257\n if (recovery < 0) {\n compressed = false\n recovery = recovery + 4\n }\n const data = temp.subarray(1)\n return new Signature(data, recovery, compressed)\n } else {\n throw new Error('Expected string for data')\n }\n }\n\n /**\n * Converts signature to 65-byte buffer format.\n * @returns 65-byte buffer containing recovery byte + signature data\n */\n toBuffer() {\n const buffer = new Uint8Array(65).fill(0)\n if (this.compressed) {\n buffer[0] = (this.recovery + 31) & 0xff\n } else {\n buffer[0] = (this.recovery + 27) & 0xff\n }\n buffer.set(this.data, 1)\n return buffer\n }\n\n /**\n * Returns signature as 130-character hex string.\n * @returns Hex string representation of signature\n */\n customToString() {\n return bytesToHex(this.toBuffer())\n }\n\n /**\n * Returns signature as 130-character hex string.\n * Overrides Object.prototype.toString() so that String(sig) and\n * template literals produce the hex representation instead of \"[object Object]\".\n * @returns Hex string representation of signature\n */\n toString() {\n return this.customToString()\n }\n\n /**\n * Recovers the public key from this signature and message.\n * @param message 32-byte message hash (Uint8Array) or 64-character hex string\n * @returns PublicKey that created this signature\n * @throws Error if message is not a valid 32-byte SHA256 hash\n */\n getPublicKey(message: Uint8Array | string): PublicKey {\n if (\n (message instanceof Uint8Array && message.length !== 32) ||\n (typeof message === 'string' && message.length !== 64)\n ) {\n throw new Error('Expected a valid sha256 hash as message')\n }\n if (typeof message === 'string') {\n message = hexToBytes(message)\n }\n const sig = secp256k1.Signature.fromBytes(this.data, 'compact')\n const temp = new secp256k1.Signature(sig.r, sig.s, this.recovery)\n return new PublicKey(temp.recoverPublicKey(message).toBytes())\n }\n}\n","import { ripemd160 } from '@noble/hashes/legacy.js'\nimport bs58 from 'bs58'\nimport { config } from '../config'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { Signature } from './Signature'\n\nexport class PublicKey {\n key: Uint8Array\n prefix: string\n\n /**\n * Creates a new PublicKey instance from raw bytes.\n * @param key Raw public key bytes (33 bytes, compressed format)\n * @param prefix Optional address prefix (defaults to the current config.address_prefix)\n */\n constructor(key: Uint8Array, prefix?: string) {\n this.key = key\n // Read config at call time so runtime mutations to config.address_prefix\n // (e.g. switching to a non-mainnet network) take effect for new instances.\n this.prefix = prefix ?? config.address_prefix\n }\n\n /**\n * Creates a PublicKey from a string representation.\n * The expected prefix is read from config.address_prefix at call time, so\n * consumers can switch networks at runtime.\n * @param wif Public key string (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n * @returns New PublicKey instance\n * @throws Error if the prefix, length, checksum, or curve point is invalid\n */\n static fromString(wif: string): PublicKey {\n const expectedPrefix = config.address_prefix\n if (typeof wif !== 'string' || wif.length <= expectedPrefix.length) {\n throw new Error('Invalid public key')\n }\n const prefix = wif.slice(0, expectedPrefix.length)\n if (prefix !== expectedPrefix) {\n throw new Error(`Public key must start with ${expectedPrefix}`)\n }\n let buffer: Uint8Array\n try {\n buffer = bs58.decode(wif.slice(expectedPrefix.length))\n } catch {\n throw new Error('Invalid public key encoding')\n }\n // 33-byte compressed secp256k1 point + 4-byte RIPEMD160 checksum\n if (buffer.length !== 37) {\n throw new Error('Invalid public key length')\n }\n const key = buffer.subarray(0, 33)\n const checksum = buffer.subarray(33, 37)\n const expectedChecksum = ripemd160(key).subarray(0, 4)\n if (!isUint8ArrayEqual(checksum, expectedChecksum)) {\n throw new Error('Public key checksum mismatch')\n }\n try {\n secp256k1.Point.fromBytes(key)\n } catch {\n throw new Error('Invalid public key')\n }\n return new PublicKey(key, prefix)\n }\n\n /**\n * Creates a PublicKey from a string or returns the instance if already a PublicKey.\n * @param value Public key string or PublicKey instance\n * @returns New or existing PublicKey instance\n */\n static from(value: string | PublicKey): PublicKey {\n if (value instanceof PublicKey) {\n return value\n } else {\n return PublicKey.fromString(value as string)\n }\n }\n\n /**\n * Verifies a signature against a message hash.\n * @param message 32-byte message hash to verify\n * @param signature Signature to verify\n * @returns True if signature is valid, false otherwise\n */\n verify(message: Uint8Array, signature: Signature | string): boolean {\n if (typeof signature === 'string') {\n signature = Signature.from(signature)\n }\n return secp256k1.verify(signature.data, message, this.key, {\n prehash: false,\n format: 'compact'\n })\n }\n\n /**\n * Returns the public key as a string for storage or transmission.\n * @returns Public key string with prefix (e.g., \"STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA\")\n */\n toString(): string {\n return encodePublic(this.key, this.prefix)\n }\n\n /**\n * Returns JSON representation (same as toString()).\n * @returns Public key string\n */\n toJSON(): string {\n return this.toString()\n }\n\n /**\n * Returns a string representation for debugging.\n * @returns Formatted public key string\n */\n inspect(): string {\n return `PublicKey: ${this.toString()}`\n }\n}\n\nconst encodePublic = (key: Uint8Array, prefix: string): string => {\n const checksum = ripemd160(key)\n return prefix + bs58.encode(new Uint8Array([...key, ...checksum.subarray(0, 4)]))\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array): boolean => {\n if (a.byteLength !== b.byteLength) return false\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n","/** Class representing a hive asset,\n * e.g. `1.000 HIVE` or `12.112233 VESTS`. */\nexport class Asset {\n amount: number\n symbol: string\n\n constructor(amount: number, symbol: string) {\n this.amount = amount\n this.symbol = symbol === 'HIVE' ? 'STEEM' : symbol === 'HBD' ? 'SBD' : symbol\n }\n\n /** Create a new Asset instance from a string, e.g. `42.000 HIVE`. */\n static fromString(string: string, expectedSymbol: string | null = null): Asset {\n const [amountString, symbol] = string.split(' ')\n if (['STEEM', 'VESTS', 'SBD', 'TESTS', 'TBD', 'HIVE', 'HBD'].indexOf(symbol) === -1) {\n throw new Error(`Invalid asset symbol: ${symbol}`)\n }\n if (expectedSymbol && symbol !== expectedSymbol) {\n throw new Error(`Invalid asset, expected symbol: ${expectedSymbol} got: ${symbol}`)\n }\n const amount = Number.parseFloat(amountString)\n if (!Number.isFinite(amount)) {\n throw new Error(`Invalid asset amount: ${amountString}`)\n }\n return new Asset(amount, symbol)\n }\n\n /**\n * Convenience to create new Asset.\n * @param symbol Symbol to use when created from number. Will also be used to validate\n * the asset, throws if the passed value has a different symbol than this.\n */\n static from(value: number | string | Asset, symbol?: string | null): Asset {\n if (value instanceof Asset) {\n if (symbol && value.symbol !== symbol) {\n throw new Error(`Invalid asset, expected symbol: ${symbol} got: ${value.symbol}`)\n }\n return value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n return new Asset(value, symbol || 'STEEM')\n } else if (typeof value === 'string') {\n return Asset.fromString(value, symbol)\n } else {\n throw new Error(`Invalid asset '${String(value)}'`)\n }\n }\n\n // We convert HIVE & HBD strings to STEEM & SBD because the serialization should be based on STEEM & SBD\n\n /** Return asset precision. */\n getPrecision() {\n switch (this.symbol) {\n case 'TESTS':\n case 'TBD':\n case 'STEEM':\n case 'SBD':\n case 'HBD':\n case 'HIVE':\n return 3\n case 'VESTS':\n return 6\n default:\n return 3\n }\n }\n\n /** Return a string representation of this asset, e.g. `42.000 HIVE`. */\n toString() {\n return `${this.amount.toFixed(this.getPrecision())} ${this.symbol}`\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\n/** Buffer wrapper that serializes to a hex-encoded string. */\nexport class HexBuffer {\n buffer: Uint8Array\n /** Convenience to create a new HexBuffer, does not copy data if value passed is already a buffer. */\n static from(value: string | Uint8Array | HexBuffer) {\n if (value instanceof HexBuffer) {\n return value\n } else if (value instanceof Uint8Array) {\n return new HexBuffer(value)\n } else if (typeof value === 'string') {\n return new HexBuffer(hexToBytes(value))\n } else {\n return new HexBuffer(new Uint8Array(value))\n }\n }\n\n constructor(buffer: Uint8Array) {\n this.buffer = buffer\n }\n\n toString() {\n return bytesToHex(this.buffer)\n }\n\n toJSON() {\n return this.toString()\n }\n}\n","import { PublicKey } from './PublicKey'\nimport { Asset } from './Asset'\nimport { HexBuffer } from './HexBuffer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Operation } from '../types'\n\n// Operation ID constants for better maintainability\nconst OPERATION_IDS = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n // pow: 14,\n custom: 15,\n // report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n // pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n // custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49\n} as const\n\ntype OperationId = (typeof OPERATION_IDS)[keyof typeof OPERATION_IDS]\n\nconst VoidSerializer = () => {\n throw new Error('Void can not be serialized')\n}\nconst StringSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeVString(data)\n}\n\nconst Int16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeInt16(data)\n}\n\nconst Int64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeInt64(data)\n}\n\nconst UInt8Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint8(data)\n}\n\nconst UInt16Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint16(data)\n}\n\nconst UInt32Serializer = (buffer: ByteBuffer, data: number) => {\n buffer.writeUint32(data)\n}\n\nconst UInt64Serializer = (buffer: ByteBuffer, data: number | bigint) => {\n buffer.writeUint64(data)\n}\n\nconst BooleanSerializer = (buffer: ByteBuffer, data: number | boolean) => {\n buffer.writeByte(data ? 1 : 0)\n}\n\nconst StaticVariantSerializer = (itemSerializers: any) => {\n // return (buffer: ByteBuffer, data: any[]) => {\n // let id = data[0]\n // const item = data[1]\n // // id was/is supposed to be 0 or integer here but seems to have been changed in e.g. comment_options\n // // extensions: [\n // // [\n // // \"comment_payout_beneficiaries\",\n // // {\n // // \"beneficiaries\": [\n // // {\n // // \"account\": \"vimm\",\n // // \"weight\": 1000\n // // }\n // // ]\n // // }\n // // ]\n // // ]\n // // Keep it here just in case\n // // https://gitlab.syncad.com/hive/hive/-/issues/722\n // // \"comment_payout_beneficiaries\" was 0 and at some point it got changed\n // // It should still be serialized as a 0 or an integer\n // // Now the question is, always 0? will need an example transaction to prove otherwise\n // if (typeof id === 'string') {\n // if (id === 'update_proposal_end_date') {\n // id = 1\n // } else {\n // id = 0\n // }\n // }\n // buffer.writeVarint32(id)\n // itemSerializers[id](buffer, item)\n return (buffer: ByteBuffer, data: any) => {\n const [id, item] = data\n buffer.writeVarint32(id)\n itemSerializers[id](buffer, item)\n }\n}\n\n/**\n * Serialize asset.\n * @note This looses precision for amounts larger than 2^53-1/10^precision.\n * Should not be a problem in real-word usage.\n */\nconst AssetSerializer = (buffer: ByteBuffer, data: string | Asset) => {\n const asset = Asset.from(data)\n const precision = asset.getPrecision()\n buffer.writeInt64(Math.round(asset.amount * Math.pow(10, precision)))\n buffer.writeUint8(precision)\n for (let i = 0; i < 7; i++) {\n buffer.writeUint8(asset.symbol.charCodeAt(i) || 0)\n }\n}\n\nconst DateSerializer = (buffer: ByteBuffer, data: string) => {\n buffer.writeUint32(Math.floor(new Date(data + 'Z').getTime() / 1000))\n}\n\nconst PublicKeySerializer = (buffer: ByteBuffer, data: string | PublicKey) => {\n if (\n data === null ||\n (typeof data === 'string' && data.slice(-39) === '1111111111111111111111111111111114T1Anm')\n ) {\n buffer.append(new Uint8Array(33).fill(0))\n } else {\n buffer.append(PublicKey.from(data).key)\n }\n}\n\nconst BinarySerializer = (size: null | number = null) => {\n return (buffer: ByteBuffer, data: string | Uint8Array | HexBuffer) => {\n data = HexBuffer.from(data)\n const len = data.buffer.length\n if (size) {\n if (len !== size) {\n throw new Error(`Unable to serialize binary. Expected ${size} bytes, got ${len}`)\n }\n } else {\n buffer.writeVarint32(len)\n }\n buffer.append(data.buffer)\n }\n}\n\nconst VariableBinarySerializer = BinarySerializer()\n\nconst FlatMapSerializer = (keySerializer: any, valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(data.length)\n for (const [key, value] of data) {\n keySerializer(buffer, key)\n valueSerializer(buffer, value)\n }\n }\n}\n\nconst ArraySerializer = (itemSerializer: any) => {\n return (buffer: ByteBuffer, data: any[]) => {\n buffer.writeVarint32(data.length)\n for (const item of data) {\n itemSerializer(buffer, item)\n }\n }\n}\n\nconst ObjectSerializer = (keySerializers: any) => {\n return (buffer: ByteBuffer, data: any) => {\n for (const [key, serializer] of keySerializers) {\n try {\n serializer(buffer, data[key])\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n }\n}\n\nconst OptionalSerializer = (valueSerializer: any) => {\n return (buffer: ByteBuffer, data: any | undefined) => {\n if (data !== undefined) {\n buffer.writeByte(1)\n valueSerializer(buffer, data)\n } else {\n buffer.writeByte(0)\n }\n }\n}\n\nconst AuthoritySerializer = ObjectSerializer([\n ['weight_threshold', UInt32Serializer],\n ['account_auths', FlatMapSerializer(StringSerializer, UInt16Serializer)],\n ['key_auths', FlatMapSerializer(PublicKeySerializer, UInt16Serializer)]\n])\n\nconst BeneficiarySerializer = ObjectSerializer([\n ['account', StringSerializer],\n ['weight', UInt16Serializer]\n])\n\nconst PriceSerializer = ObjectSerializer([\n ['base', AssetSerializer],\n ['quote', AssetSerializer]\n])\n\n// const SignedBlockHeaderSerializer = ObjectSerializer([\n// ['previous', BinarySerializer(20)],\n// ['timestamp', DateSerializer],\n// ['witness', StringSerializer],\n// ['transaction_merkle_root', BinarySerializer(20)],\n// ['extensions', ArraySerializer(VoidSerializer)],\n// ['witness_signature', BinarySerializer(65)]\n// ])\n\nconst ChainPropertiesSerializer = ObjectSerializer([\n ['account_creation_fee', AssetSerializer],\n ['maximum_block_size', UInt32Serializer],\n ['hbd_interest_rate', UInt16Serializer]\n])\n\nconst OperationDataSerializer = (operationId: OperationId, definitions: any) => {\n const objectSerializer = ObjectSerializer(definitions)\n return (buffer: ByteBuffer, data: any) => {\n buffer.writeVarint32(operationId)\n objectSerializer(buffer, data)\n }\n}\n\nconst OperationSerializers: Record> = {}\n\nOperationSerializers.account_create = OperationDataSerializer(OPERATION_IDS.account_create, [\n ['fee', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_create_with_delegation = OperationDataSerializer(\n OPERATION_IDS.account_create_with_delegation,\n [\n ['fee', AssetSerializer],\n ['delegation', AssetSerializer],\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update = OperationDataSerializer(OPERATION_IDS.account_update, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.account_witness_proxy = OperationDataSerializer(\n OPERATION_IDS.account_witness_proxy,\n [\n ['account', StringSerializer],\n ['proxy', StringSerializer]\n ]\n)\n\nOperationSerializers.account_witness_vote = OperationDataSerializer(\n OPERATION_IDS.account_witness_vote,\n [\n ['account', StringSerializer],\n ['witness', StringSerializer],\n ['approve', BooleanSerializer]\n ]\n)\n\nOperationSerializers.cancel_transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.cancel_transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer]\n ]\n)\n\nOperationSerializers.change_recovery_account = OperationDataSerializer(\n OPERATION_IDS.change_recovery_account,\n [\n ['account_to_recover', StringSerializer],\n ['new_recovery_account', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.claim_account = OperationDataSerializer(OPERATION_IDS.claim_account, [\n ['creator', StringSerializer],\n ['fee', AssetSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.claim_reward_balance = OperationDataSerializer(\n OPERATION_IDS.claim_reward_balance,\n [\n ['account', StringSerializer],\n ['reward_hive', AssetSerializer],\n ['reward_hbd', AssetSerializer],\n ['reward_vests', AssetSerializer]\n ]\n)\n\nOperationSerializers.comment = OperationDataSerializer(OPERATION_IDS.comment, [\n ['parent_author', StringSerializer],\n ['parent_permlink', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['title', StringSerializer],\n ['body', StringSerializer],\n ['json_metadata', StringSerializer]\n])\n\nOperationSerializers.comment_options = OperationDataSerializer(OPERATION_IDS.comment_options, [\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['max_accepted_payout', AssetSerializer],\n ['percent_hbd', UInt16Serializer],\n ['allow_votes', BooleanSerializer],\n ['allow_curation_rewards', BooleanSerializer],\n [\n 'extensions',\n ArraySerializer(\n StaticVariantSerializer([\n ObjectSerializer([['beneficiaries', ArraySerializer(BeneficiarySerializer)]])\n ])\n )\n ]\n])\n\nOperationSerializers.convert = OperationDataSerializer(OPERATION_IDS.convert, [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n])\n\nOperationSerializers.create_claimed_account = OperationDataSerializer(\n OPERATION_IDS.create_claimed_account,\n [\n ['creator', StringSerializer],\n ['new_account_name', StringSerializer],\n ['owner', AuthoritySerializer],\n ['active', AuthoritySerializer],\n ['posting', AuthoritySerializer],\n ['memo_key', PublicKeySerializer],\n ['json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.custom = OperationDataSerializer(OPERATION_IDS.custom, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['id', UInt16Serializer],\n ['data', VariableBinarySerializer]\n])\n\n// Not used on chain\n// OperationSerializers.custom_binary = OperationDataSerializer(OPERATION_IDS.custom_binary, [\n// ['required_owner_auths', ArraySerializer(StringSerializer)],\n// ['required_active_auths', ArraySerializer(StringSerializer)],\n// ['required_posting_auths', ArraySerializer(StringSerializer)],\n// ['required_auths', ArraySerializer(AuthoritySerializer)],\n// ['id', StringSerializer],\n// ['data', VariableBinarySerializer]\n// ])\n\nOperationSerializers.custom_json = OperationDataSerializer(OPERATION_IDS.custom_json, [\n ['required_auths', ArraySerializer(StringSerializer)],\n ['required_posting_auths', ArraySerializer(StringSerializer)],\n ['id', StringSerializer],\n ['json', StringSerializer]\n])\n\nOperationSerializers.decline_voting_rights = OperationDataSerializer(\n OPERATION_IDS.decline_voting_rights,\n [\n ['account', StringSerializer],\n ['decline', BooleanSerializer]\n ]\n)\n\nOperationSerializers.delegate_vesting_shares = OperationDataSerializer(\n OPERATION_IDS.delegate_vesting_shares,\n [\n ['delegator', StringSerializer],\n ['delegatee', StringSerializer],\n ['vesting_shares', AssetSerializer]\n ]\n)\n\nOperationSerializers.delete_comment = OperationDataSerializer(OPERATION_IDS.delete_comment, [\n ['author', StringSerializer],\n ['permlink', StringSerializer]\n])\n\nOperationSerializers.escrow_approve = OperationDataSerializer(OPERATION_IDS.escrow_approve, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['approve', BooleanSerializer]\n])\n\nOperationSerializers.escrow_dispute = OperationDataSerializer(OPERATION_IDS.escrow_dispute, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['escrow_id', UInt32Serializer]\n])\n\nOperationSerializers.escrow_release = OperationDataSerializer(OPERATION_IDS.escrow_release, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['agent', StringSerializer],\n ['who', StringSerializer],\n ['receiver', StringSerializer],\n ['escrow_id', UInt32Serializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer]\n])\n\nOperationSerializers.escrow_transfer = OperationDataSerializer(OPERATION_IDS.escrow_transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['hbd_amount', AssetSerializer],\n ['hive_amount', AssetSerializer],\n ['escrow_id', UInt32Serializer],\n ['agent', StringSerializer],\n ['fee', AssetSerializer],\n ['json_meta', StringSerializer],\n ['ratification_deadline', DateSerializer],\n ['escrow_expiration', DateSerializer]\n])\n\nOperationSerializers.feed_publish = OperationDataSerializer(OPERATION_IDS.feed_publish, [\n ['publisher', StringSerializer],\n ['exchange_rate', PriceSerializer]\n])\n\nOperationSerializers.limit_order_cancel = OperationDataSerializer(\n OPERATION_IDS.limit_order_cancel,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer]\n ]\n)\n\nOperationSerializers.limit_order_create = OperationDataSerializer(\n OPERATION_IDS.limit_order_create,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['min_to_receive', AssetSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.limit_order_create2 = OperationDataSerializer(\n OPERATION_IDS.limit_order_create2,\n [\n ['owner', StringSerializer],\n ['orderid', UInt32Serializer],\n ['amount_to_sell', AssetSerializer],\n ['exchange_rate', PriceSerializer],\n ['fill_or_kill', BooleanSerializer],\n ['expiration', DateSerializer]\n ]\n)\n\nOperationSerializers.recover_account = OperationDataSerializer(OPERATION_IDS.recover_account, [\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['recent_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\n// Not used on chain\n// OperationSerializers.report_over_production = OperationDataSerializer(\n// OPERATION_IDS.report_over_production,\n// [\n// ['reporter', StringSerializer],\n// ['first_block', SignedBlockHeaderSerializer],\n// ['second_block', SignedBlockHeaderSerializer]\n// ]\n// )\n\nOperationSerializers.request_account_recovery = OperationDataSerializer(\n OPERATION_IDS.request_account_recovery,\n [\n ['recovery_account', StringSerializer],\n ['account_to_recover', StringSerializer],\n ['new_owner_authority', AuthoritySerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.reset_account = OperationDataSerializer(OPERATION_IDS.reset_account, [\n ['reset_account', StringSerializer],\n ['account_to_reset', StringSerializer],\n ['new_owner_authority', AuthoritySerializer]\n])\n\nOperationSerializers.set_reset_account = OperationDataSerializer(OPERATION_IDS.set_reset_account, [\n ['account', StringSerializer],\n ['current_reset_account', StringSerializer],\n ['reset_account', StringSerializer]\n])\n\nOperationSerializers.set_withdraw_vesting_route = OperationDataSerializer(\n OPERATION_IDS.set_withdraw_vesting_route,\n [\n ['from_account', StringSerializer],\n ['to_account', StringSerializer],\n ['percent', UInt16Serializer],\n ['auto_vest', BooleanSerializer]\n ]\n)\n\nOperationSerializers.transfer = OperationDataSerializer(OPERATION_IDS.transfer, [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n])\n\nOperationSerializers.transfer_from_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_from_savings,\n [\n ['from', StringSerializer],\n ['request_id', UInt32Serializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_savings = OperationDataSerializer(\n OPERATION_IDS.transfer_to_savings,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer]\n ]\n)\n\nOperationSerializers.transfer_to_vesting = OperationDataSerializer(\n OPERATION_IDS.transfer_to_vesting,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.vote = OperationDataSerializer(OPERATION_IDS.vote, [\n ['voter', StringSerializer],\n ['author', StringSerializer],\n ['permlink', StringSerializer],\n ['weight', Int16Serializer]\n])\n\nOperationSerializers.withdraw_vesting = OperationDataSerializer(OPERATION_IDS.withdraw_vesting, [\n ['account', StringSerializer],\n ['vesting_shares', AssetSerializer]\n])\n\nOperationSerializers.witness_update = OperationDataSerializer(OPERATION_IDS.witness_update, [\n ['owner', StringSerializer],\n ['url', StringSerializer],\n ['block_signing_key', PublicKeySerializer],\n ['props', ChainPropertiesSerializer],\n ['fee', AssetSerializer]\n])\n\nOperationSerializers.witness_set_properties = OperationDataSerializer(\n OPERATION_IDS.witness_set_properties,\n [\n ['owner', StringSerializer],\n ['props', FlatMapSerializer(StringSerializer, VariableBinarySerializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.account_update2 = OperationDataSerializer(OPERATION_IDS.account_update2, [\n ['account', StringSerializer],\n ['owner', OptionalSerializer(AuthoritySerializer)],\n ['active', OptionalSerializer(AuthoritySerializer)],\n ['posting', OptionalSerializer(AuthoritySerializer)],\n ['memo_key', OptionalSerializer(PublicKeySerializer)],\n ['json_metadata', StringSerializer],\n ['posting_json_metadata', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.create_proposal = OperationDataSerializer(OPERATION_IDS.create_proposal, [\n ['creator', StringSerializer],\n ['receiver', StringSerializer],\n ['start_date', DateSerializer],\n ['end_date', DateSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nOperationSerializers.update_proposal_votes = OperationDataSerializer(\n OPERATION_IDS.update_proposal_votes,\n [\n ['voter', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['approve', BooleanSerializer],\n ['extensions', ArraySerializer(VoidSerializer)]\n ]\n)\n\nOperationSerializers.remove_proposal = OperationDataSerializer(OPERATION_IDS.remove_proposal, [\n ['proposal_owner', StringSerializer],\n ['proposal_ids', ArraySerializer(Int64Serializer)],\n ['extensions', ArraySerializer(VoidSerializer)]\n])\n\nconst ProposalUpdateSerializer = ObjectSerializer([['end_date', DateSerializer]])\n\nOperationSerializers.update_proposal = OperationDataSerializer(OPERATION_IDS.update_proposal, [\n ['proposal_id', UInt64Serializer],\n ['creator', StringSerializer],\n ['daily_pay', AssetSerializer],\n ['subject', StringSerializer],\n ['permlink', StringSerializer],\n [\n 'extensions',\n ArraySerializer(StaticVariantSerializer([VoidSerializer, ProposalUpdateSerializer]))\n ]\n])\n\nOperationSerializers.collateralized_convert = OperationDataSerializer(\n OPERATION_IDS.collateralized_convert,\n [\n ['owner', StringSerializer],\n ['requestid', UInt32Serializer],\n ['amount', AssetSerializer]\n ]\n)\n\nOperationSerializers.recurrent_transfer = OperationDataSerializer(\n OPERATION_IDS.recurrent_transfer,\n [\n ['from', StringSerializer],\n ['to', StringSerializer],\n ['amount', AssetSerializer],\n ['memo', StringSerializer],\n ['recurrence', UInt16Serializer],\n ['executions', UInt16Serializer],\n [\n 'extensions',\n ArraySerializer(\n ObjectSerializer([\n ['type', UInt8Serializer],\n ['value', ObjectSerializer([['pair_id', UInt8Serializer]])]\n ])\n )\n ]\n ]\n)\n\nconst OperationSerializer = (buffer: ByteBuffer, operation: Operation) => {\n const serializer = OperationSerializers[operation[0]]\n if (!serializer) {\n throw new Error(`No serializer for operation: ${operation[0]}`)\n }\n try {\n serializer(buffer, operation[1])\n } catch (error: any) {\n error.message = `${operation[0]}: ${error.message}`\n throw error\n }\n}\n\nconst TransactionSerializer = ObjectSerializer([\n ['ref_block_num', UInt16Serializer],\n ['ref_block_prefix', UInt32Serializer],\n ['expiration', DateSerializer],\n ['operations', ArraySerializer(OperationSerializer)],\n ['extensions', ArraySerializer(StringSerializer)]\n])\n\nconst EncryptedMemoSerializer = ObjectSerializer([\n ['from', PublicKeySerializer],\n ['to', PublicKeySerializer],\n ['nonce', UInt64Serializer],\n ['check', UInt32Serializer],\n ['encrypted', BinarySerializer()]\n])\n\nexport const Serializer = {\n // Array: ArraySerializer,\n Asset: AssetSerializer,\n // Authority: AuthoritySerializer,\n // Binary: BinarySerializer,\n // Boolean: BooleanSerializer,\n // Date: DateSerializer,\n // FlatMap: FlatMapSerializer,\n // Int16: Int16Serializer,\n // Int32: Int32Serializer,\n // Int64: Int64Serializer,\n // Int8: Int8Serializer,\n Memo: EncryptedMemoSerializer,\n // Object: ObjectSerializer,\n // Operation: OperationSerializer,\n // Optional: OptionalSerializer,\n Price: PriceSerializer,\n PublicKey: PublicKeySerializer,\n // StaticVariant: StaticVariantSerializer,\n String: StringSerializer,\n Transaction: TransactionSerializer,\n UInt16: UInt16Serializer,\n UInt32: UInt32Serializer\n // UInt64: UInt64Serializer,\n // UInt8: UInt8Serializer,\n // Void: VoidSerializer\n}\n","export const sleep = (ms: number): Promise => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { config } from '../config'\nimport { CallResponse } from '../types'\nimport type { APIMethods } from '../api-types'\nimport { sleep } from './sleep'\n\n// ── Server identity (User-Agent) ────────────────────────────────────────────\n\n/**\n * True only when running under Node.js (SSR / server / CLI). Computed once.\n *\n * We attach a descriptive `User-Agent` exclusively here because that is the only\n * place it (a) takes effect and (b) is wanted:\n * - Node's undici fetch otherwise sends a bare `User-Agent: node`, which is\n * indistinguishable from any anonymous script in node/CDN analytics.\n * - Browsers treat `User-Agent` as a forbidden header and silently drop any\n * override, so setting it there is pointless (and we avoid the churn).\n * - React Native sets its own native UA (e.g. the mobile app's own string);\n * overriding it would relabel real mobile traffic, so we explicitly exclude\n * it via `navigator.product === 'ReactNative'`.\n */\nconst isNodeRuntime: boolean = (() => {\n try {\n const isReactNative =\n typeof navigator !== 'undefined' && (navigator as any).product === 'ReactNative'\n return (\n !isReactNative &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null\n )\n } catch {\n return false\n }\n})()\n\n/**\n * Headers that identify the caller on server-side requests. Returns the\n * configured `User-Agent` only under Node; an empty object everywhere else so\n * browser and React Native requests are left exactly as they were.\n */\nfunction serverIdentityHeaders(): Record {\n return isNodeRuntime ? { 'User-Agent': config.userAgent } : {}\n}\n\n// ── Error Types ─────────────────────────────────────────────────────────────\n\nexport class RPCError extends Error {\n name = 'RPCError'\n data?: any\n code: number\n stack: undefined = undefined\n constructor(rpcError: { message: string; code: number; data?: any }) {\n super(rpcError.message)\n this.code = rpcError.code\n if ('data' in rpcError) {\n this.data = rpcError.data\n }\n }\n}\n\n/**\n * Transport-level error thrown by jsonRPCCall for HTTP status errors (429, 503).\n * Carries node identity and rate-limit info so callers can record health\n * exactly once without double-counting.\n */\nclass NodeError extends Error {\n node: string\n /** Explicit server `Retry-After` in ms, or 0 when the 429 carried no usable header. */\n rateLimitMs: number\n /** True for an HTTP 429 regardless of whether a `Retry-After` header was present, so\n * a header-less rate limit is still cooled down (with escalating backoff) rather than\n * mis-recorded as a plain transport failure. */\n isRateLimit: boolean\n constructor(\n node: string,\n message: string,\n opts: { rateLimitMs?: number; isRateLimit?: boolean } = {}\n ) {\n super(message)\n this.node = node\n this.rateLimitMs = opts.rateLimitMs ?? 0\n this.isRateLimit = opts.isRateLimit ?? false\n }\n}\n\n/**\n * Parse an HTTP `Retry-After` header to milliseconds. Supports both forms in the\n * spec: `` (e.g. \"120\") and ``. Returns 0 when the header\n * is absent or unparseable (including a non-numeric junk value or a past date) so the\n * caller falls back to escalating backoff instead of a NaN/negative cooldown.\n */\nfunction parseRetryAfterMs(header: string | null): number {\n if (!header) return 0\n const secs = Number(header)\n if (Number.isFinite(secs)) return secs > 0 ? secs * 1000 : 0\n const dateMs = Date.parse(header)\n if (Number.isFinite(dateMs)) {\n const delta = dateMs - Date.now()\n return delta > 0 ? delta : 0\n }\n return 0\n}\n\n/** Errors that indicate the request definitely never reached the server. */\nconst PRE_CONNECTION_ERRORS = ['ECONNREFUSED', 'ENOTFOUND', 'EHOSTUNREACH', 'EAI_AGAIN']\n\n/** Browser fetch network-failure messages — emitted by Chromium/Firefox/Safari\n * when CORS preflight fails, DNS fails, TLS fails, or the response is blocked.\n * These map to scenarios where retrying the same signed broadcast is safe: the\n * request either never reached the node, or its response was blocked but a\n * re-broadcast of the *same* signed tx will be deduped by Hive (same trx_id). */\nconst BROWSER_NETWORK_ERRORS = [\n 'Failed to fetch', // Chromium\n 'NetworkError when attempting to fetch', // Firefox\n 'Load failed', // Safari\n 'fetch failed' // Node 18+ undici / Bun — also covered via cause chain\n]\n\n/**\n * Concatenate the error's surface text + the messages/codes from up to 5\n * levels of nested `cause`. Node.js fetch wraps connection failures as\n * `TypeError('fetch failed')` with the real `code` (ECONNREFUSED, etc.)\n * nested in the cause chain. Browser fetch failures have no cause but\n * carry their identifier in `message`.\n */\nfunction flattenErrorText(e: any): string {\n if (!e) return ''\n const parts: string[] = [String(e.name || ''), String(e.message || ''), String(e.code || '')]\n let cause = e.cause\n for (let depth = 0; cause && depth < 5; depth++) {\n parts.push(String(cause.code || ''), String(cause.message || ''))\n cause = cause.cause\n }\n return parts.join(' ')\n}\n\n/**\n * Decide whether a broadcast attempt can safely be retried on another node.\n *\n * Safe to retry (same signed tx → Hive dedupes by trx_id at the mempool layer):\n * - Pre-connection failures (ECONNREFUSED, ENOTFOUND, etc.) — request never sent.\n * - Browser fetch network failures (CORS block, TLS error, DNS) — TypeError with\n * a well-known message string.\n * - JSON parse failures — node returned an HTML error page (typical for\n * Cloudflare 1033 tunnel-down / 5xx interstitials), so the request never\n * reached the Hive RPC layer.\n * - NodeError (HTTP 429/5xx surfaced from jsonRPCCall) — already known transient.\n *\n * NOT safe to retry:\n * - RPCError — the node accepted the request and the blockchain rejected it.\n * Retrying on another node would either get the same rejection or accept\n * a different one; surface the original error instead.\n */\nfunction isBroadcastSafeToRetry(e: any): boolean {\n if (!e) return false\n if (e instanceof NodeError) return true\n if (e instanceof RPCError) return false\n\n const text = flattenErrorText(e)\n if (PRE_CONNECTION_ERRORS.some((code) => text.includes(code))) return true\n if (BROWSER_NETWORK_ERRORS.some((msg) => text.includes(msg))) return true\n\n // res.json() against an HTML body (Cloudflare/proxy interstitials) throws\n // SyntaxError. The Hive RPC layer never saw the tx, so failover is safe.\n if (e instanceof SyntaxError) return true\n // Some runtimes surface JSON parse errors as plain Error with this text.\n if (/Unexpected token|JSON\\.parse|Unexpected end of JSON/i.test(text)) return true\n\n return false\n}\n\n// ── Node Health Tracker ─────────────────────────────────────────────────────\n\n/** Node-level health state tracked by NodeHealthTracker. */\ninterface NodeHealth {\n /** Global consecutive-failure counter. Resets on success. */\n consecutiveFailures: number\n /** Timestamp of the most recent failure. Used with the 30s cooldown window. */\n lastFailureTime: number\n /** Epoch ms after which the node is no longer rate-limited. */\n rateLimitedUntil: number\n /** Count of consecutive 429s (no intervening success) with no usable Retry-After.\n * Drives escalating backoff; reset by a success or by RATE_LIMIT_STREAK_RESET_MS. */\n rateLimitStreak: number\n /** Epoch ms of the most recent 429. Used to expire the escalation streak. */\n lastRateLimitAt: number\n /** Per-API failure counters. Some nodes disable specific API plugins; tracking\n * per-API lets us deprioritize a node only for the APIs that fail, not globally.\n * `defective` marks a cooldown set by recordDefectiveResponse (payload\n * validation failure) — unlike ordinary strike cooldowns it survives\n * recordSuccess and only expires on its own. */\n apiFailures: Map<\n string,\n { count: number; cooldownUntil: number; lastFailureTime: number; defective?: boolean }\n >\n /** Most recent head_block_number observed for this node. */\n headBlock: number\n /** Epoch ms when the head_block was recorded. Used to expire stale observations. */\n headBlockUpdatedAt: number\n\n // ── Latency tracking (adaptive ordering) ────────────────────────────────\n /** EWMA of observed round-trip ms. Fed by successful calls AND by slow/timeout\n * failures (so a node that returns 200 in 15s, or aborts at the timeout, is\n * ranked on its real slowness — not treated as merely \"healthy\"). `undefined`\n * until the first sample. */\n ewmaLatencyMs?: number\n /** Number of latency samples folded into the EWMA. Gates \"warmup\": below\n * LATENCY_MIN_SAMPLES the node is unproven and keeps its config-order prior. */\n latencySampleCount: number\n /** Epoch ms of the most recent latency sample. Used for usability expiry and to\n * decide when a node is overdue for an exploratory re-probe. */\n latencyUpdatedAt: number\n /** Epoch ms of the most recent exploratory promotion. Single-flight guard so a\n * burst of concurrent orderings doesn't all re-probe the same stale node. */\n lastProbeAt: number\n\n /**\n * Per-profile-key latency (same EWMA/warmup/expiry rules as the global one).\n * The global EWMA mixes cheap calls (get_accounts ~300ms) with heavy ones\n * (get_account_history, bridge.get_discussion — legitimately seconds), so it\n * ranks nodes fine but is the WRONG baseline for per-attempt deadlines: a\n * profile dominated by cheap calls would abort every legitimately-heavy call.\n * Deadlines/hedge delays therefore key on the FULL method for RPC\n * (\"condenser_api.get_account_history\") and api+endpoint template for REST —\n * an API prefix alone still mixes cheap and heavy methods. Ranking keeps the\n * global profile. Bounded: #nodes × #distinct methods called (code-defined,\n * not user input); fully cleared whenever the node's global profile expires\n * (the global clock advances on every sample, so global-stale ⇒ all stale).\n */\n apiLatency: Map\n}\n\n/**\n * JSON-RPC error codes that indicate the node itself is unhealthy, not that the\n * client sent a bad request. These should trigger failover to another node.\n *\n * Background: Hive nodes fronted by HAF/jussi/drone return HTTP 200 with a\n * JSON-RPC error body when a backing service (hivemind, postgrest, etc.) is down.\n * The HTTP layer looks healthy, so failover never triggers — the caller just gets\n * an error and gives up. This function identifies those node-level errors.\n */\nfunction isNodeLevelRPCError(code: number, message: string): boolean {\n // -32603: Internal error — node is having problems\n if (code === -32603) return true\n // -32000 to -32099: Server error range (implementation-defined server errors)\n if (code <= -32000 && code >= -32099) return true\n // -32601: Method not found — node may be missing this API plugin\n if (code === -32601) return true\n // -32602 with node-sick indicators (vs normal \"invalid params\" from bad client input)\n // e.g. \"Unable to parse endpoint data\" from HAF when a backing service is down\n if (code === -32602 && /unable to parse|endpoint data|internal/i.test(message)) return true\n return false\n}\n\n/** Extract the API prefix from a method name like \"rc_api.find_rc_accounts\" -> \"rc_api\". */\nfunction apiOf(method: string): string {\n const dot = method.indexOf('.')\n return dot > 0 ? method.slice(0, dot) : method\n}\n\n// ── Rate-limit (429) backoff constants ───────────────────────────────────────\n/** Base cooldown applied to a 429 with no usable `Retry-After` header. Matches the\n * previous flat default so first-offence behaviour is unchanged. */\nconst RATE_LIMIT_BASE_MS = 10_000\n/** Ceiling for the escalating header-less cooldown. Prevents a node from being\n * parked far longer than a real public node's throttle window. */\nconst RATE_LIMIT_MAX_MS = 60_000\n/** No 429 from a node for this long ⇒ its escalation streak resets to 0, so an\n * occasional throttle hours apart doesn't compound into a long park. */\nconst RATE_LIMIT_STREAK_RESET_MS = 120_000\n\n/** Per-API failure threshold before the node is deprioritized for that API only. */\nconst MAX_API_FAILURES_BEFORE_COOLDOWN = 2\n/** How long a node stays deprioritized for a specific API after repeated failures. */\nconst API_COOLDOWN_MS = 60_000\n/** How long head_block observations remain valid before being treated as unknown. */\nconst HEAD_BLOCK_MAX_AGE_MS = 120_000\n/** Maximum lag (in blocks) before a node is considered stale relative to the best-known head. */\nconst STALE_BLOCK_THRESHOLD = 30\n\n// ── Adaptive latency-ordering constants ──────────────────────────────────────\n/** EWMA smoothing weight for a new latency sample. 0.3 ⇒ ~5–6 samples to converge;\n * absorbs one-off GC/TLS spikes while still reacting to a real regional shift fast. */\nconst LATENCY_EWMA_ALPHA = 0.3\n/** Samples required before a node's latency is trusted for ranking. Below this the\n * node is \"warming\" and ranks at a neutral prior (config order via tiebreak), so a\n * single fluke never reorders the list and cold start == today's behavior. */\nconst LATENCY_MIN_SAMPLES = 3\n/** How long a latency sample stays usable for ranking. Past this a node reverts to\n * warming. Must be > LATENCY_REPROBE_MS so re-probes keep a busy node's profile fresh. */\nconst LATENCY_MAX_AGE_MS = 5 * 60_000\n/** A healthy node not sampled within this window is overdue for an exploratory\n * re-probe (promoted to front of ONE ordering). This is what lets a demoted node\n * climb back when it recovers — and what profiles a node that organic traffic never\n * reaches. 60s ⇒ ~1 probe/node/min worst case = negligible cost. */\nconst LATENCY_REPROBE_MS = 60_000\n/** Neutral score (ms) for an unproven/warming node: optimistic enough to sit ahead\n * of a proven-slow node (so we explore an unknown before hammering a known-slow one)\n * but behind a proven-fast node. Fixed, so a node makes at most ONE rank transition\n * when it crosses LATENCY_MIN_SAMPLES — no churn. */\nconst LATENCY_UNPROVEN_PRIOR_MS = 1_000\n/** A failed call only feeds a latency penalty if it was actually slow (≥ this). Keeps\n * a genuine timeout / slow-5xx (a far-region node case) visible to the ranker while an\n * instant ECONNREFUSED (a *down* node, handled by consecutiveFailures) is NOT mis-read\n * as \"slow\". The penalty value is the *measured* elapsed, never a static constant. */\nconst LATENCY_SLOW_FAILURE_MS = 2_000\n\n/**\n * Latency-ranking tuning, re-exported as a frozen bag so tests assert behaviour\n * against the real numbers instead of mirroring literals that can silently drift.\n * @internal — not part of the package's public API; for the co-located spec only.\n */\nexport const __LATENCY_TUNING__ = Object.freeze({\n EWMA_ALPHA: LATENCY_EWMA_ALPHA,\n MIN_SAMPLES: LATENCY_MIN_SAMPLES,\n MAX_AGE_MS: LATENCY_MAX_AGE_MS,\n REPROBE_MS: LATENCY_REPROBE_MS,\n UNPROVEN_PRIOR_MS: LATENCY_UNPROVEN_PRIOR_MS,\n SLOW_FAILURE_MS: LATENCY_SLOW_FAILURE_MS\n})\n\n/** @internal Exported for testing only. */\nexport class NodeHealthTracker {\n private health = new Map()\n\n private getOrCreate(node: string): NodeHealth {\n let h = this.health.get(node)\n if (!h) {\n h = {\n consecutiveFailures: 0,\n lastFailureTime: 0,\n rateLimitedUntil: 0,\n rateLimitStreak: 0,\n lastRateLimitAt: 0,\n apiFailures: new Map(),\n headBlock: 0,\n headBlockUpdatedAt: 0,\n ewmaLatencyMs: undefined,\n latencySampleCount: 0,\n latencyUpdatedAt: 0,\n // Stamp the probe clock at creation so a brand-new (never-sampled) node is\n // NOT treated as \"overdue for re-probe\" on its very first ordering pass.\n // With lastProbeAt=0 the re-probe gate (touch <= now - LATENCY_REPROBE_MS)\n // fired immediately, so the 2nd+ ordering on a cold worker promoted unproven\n // nodes ahead of the configured order for no measured reason. Seeding it to\n // \"now\" preserves configured order during warmup; a genuinely slow preferred\n // node is still demoted by its EWMA score (not by epoch-zero exploration),\n // and idle nodes are still re-probed once LATENCY_REPROBE_MS has truly elapsed.\n lastProbeAt: Date.now(),\n apiLatency: new Map()\n }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number, profileKey?: string): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 0\n // A success means the node recovered — clear the escalation streak so the next\n // throttle starts from the base cooldown. We deliberately do NOT clear an active\n // rateLimitedUntil window here: under concurrency a success from a request that was\n // already in flight can resolve *after* another request recorded a fresh 429\n // Retry-After, and erasing the window would put a just-throttled node back into\n // rotation early. The window expires on its own (short for header-less; the server's\n // value for an explicit Retry-After).\n h.rateLimitStreak = 0\n if (api) {\n // A successful API call clears that API's failure counter — but never an\n // ACTIVE defective-response cooldown: the \"success\" may itself be an\n // unvalidated read from the same lying node (validated calls are the\n // minority of traffic), and re-admitting it early defeats the decisive\n // penalty. That window expires on its own, like rateLimitedUntil above.\n const apiFail = h.apiFailures.get(api)\n if (!apiFail || !(apiFail.defective && apiFail.cooldownUntil > Date.now())) {\n h.apiFailures.delete(api)\n }\n }\n if (typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0) {\n // Latency profiles use the finest key available (full method / endpoint\n // template); the API prefix is only a fallback so bare callers still\n // profile SOMETHING. Failure state above stays per-API on purpose.\n this.recordLatency(h, durationMs, profileKey ?? api)\n }\n }\n\n /**\n * Record a *slow* failed call as a latency signal. The failure counters are\n * updated separately (recordFailure/recordError); this only feeds the EWMA so a\n * node that returns 200-but-too-slow, times out, or returns a slow 5xx is ranked\n * on its real slowness. Callers pass the MEASURED elapsed ms and only call this\n * when the call was genuinely slow (≥ LATENCY_SLOW_FAILURE_MS) — an instant\n * connection failure (a *down* node) must NOT look \"slow\".\n */\n recordSlowFailure(node: string, durationMs: number, profileKey?: string): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs, profileKey)\n }\n\n /**\n * Usable latency profile (EWMA ms), or `undefined` while unproven or stale.\n * With a `profileKey` (full RPC method / REST api+endpoint template),\n * returns that (node, key) profile ONLY — deliberately no fallback to the\n * mixed global profile, because an average dominated by cheap calls is the\n * wrong deadline baseline for a heavy method (that fallback is exactly the\n * \"2s window starves get_account_history\" failure mode). Without a key,\n * returns the global ranking profile. Both follow the same \"profiled and\n * fresh\" gate as the ranker.\n * @internal\n */\n getUsableLatencyMs(node: string, profileKey?: string): number | undefined {\n const h = this.health.get(node)\n if (!h) return undefined\n const now = Date.now()\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n return p &&\n p.sampleCount >= LATENCY_MIN_SAMPLES &&\n now - p.updatedAt <= LATENCY_MAX_AGE_MS\n ? p.ewmaMs\n : undefined\n }\n return this.isLatencyUsable(h, now) ? h.ewmaLatencyMs : undefined\n }\n\n /**\n * Censored latency sample for a request that was ABORTED because a hedge\n * completed first while it was still in flight. The elapsed-at-abort is a\n * *lower bound* on the true latency, so folding it in can only move the\n * node's EWMA toward the truth, never below it — which is what lets repeated\n * hedge-wins reorder the pool. Deliberately does NOT touch the failure\n * counters or rate-limit state: the node returned no error, it was merely\n * slow, and treating cancellation as failure would flap `isNodeHealthy`.\n * Callers must NOT record this for a primary that already settled on its own\n * (its outcome was recorded normally; a second sample would be fabricated).\n * Bypasses the `recordSlowFailure` 2s floor (a hedge can win well below it).\n * By construction the elapsed is ≥ the hedge delay, so only a degenerate\n * near-zero epsilon needs rejecting — anything under one LAN round trip is\n * noise, not a latency measurement.\n * @internal\n */\n recordCensoredLatency(node: string, elapsedMs: number, profileKey?: string): void {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 50) return\n this.recordLatency(this.getOrCreate(node), elapsedMs, profileKey)\n }\n\n /**\n * Fold a latency sample into the node's global EWMA (warmup + usability\n * bookkeeping) and, when a profile key is given, into that (node, key)\n * profile — the global one ranks nodes, the keyed one calibrates deadlines.\n */\n private recordLatency(h: NodeHealth, durationMs: number, profileKey?: string): void {\n const now = Date.now()\n // A profile older than the usable window starts fresh, so an idled process\n // re-learns from scratch rather than ranking on hour-old data. Every keyed\n // profile shares this clock (each sample updates both), so global-stale\n // implies every keyed profile is stale too — clear the map rather than\n // leave never-again-read tombstone entries for the life of the process.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\n h.apiLatency.clear()\n }\n h.ewmaLatencyMs =\n h.ewmaLatencyMs === undefined\n ? durationMs\n : LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * h.ewmaLatencyMs\n h.latencySampleCount++\n h.latencyUpdatedAt = now\n\n if (profileKey !== undefined) {\n const p = h.apiLatency.get(profileKey)\n if (!p || now - p.updatedAt > LATENCY_MAX_AGE_MS) {\n h.apiLatency.set(profileKey, { ewmaMs: durationMs, sampleCount: 1, updatedAt: now })\n } else {\n p.ewmaMs = LATENCY_EWMA_ALPHA * durationMs + (1 - LATENCY_EWMA_ALPHA) * p.ewmaMs\n p.sampleCount++\n p.updatedAt = now\n }\n }\n }\n\n recordFailure(node: string, api?: string): void {\n const h = this.getOrCreate(node)\n if (api) {\n // API-specific failure: only update the per-API tracker.\n // This prevents e.g. 3 rc_api failures from marking the node\n // globally unhealthy for condenser_api too.\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n // Reset counter if previous cooldown expired OR last failure was >30s ago\n // (avoids sticky penalties from sparse failures hours apart)\n if (\n (existing.cooldownUntil > 0 && existing.cooldownUntil <= now) ||\n (existing.lastFailureTime > 0 && now - existing.lastFailureTime > 30_000)\n ) {\n existing.count = 0\n existing.cooldownUntil = 0\n }\n existing.count++\n existing.lastFailureTime = now\n if (existing.count >= MAX_API_FAILURES_BEFORE_COOLDOWN) {\n existing.cooldownUntil = now + API_COOLDOWN_MS\n }\n h.apiFailures.set(api, existing)\n } else {\n // Transport-level failure (no specific API): update global counter\n h.consecutiveFailures++\n h.lastFailureTime = Date.now()\n }\n }\n\n /**\n * A response that failed the caller's payload validation is a decisive,\n * reproducible node fault — the node answered 200 with data the caller KNOWS\n * to be impossible — so it trips the per-API cooldown immediately instead of\n * accruing ordinary strikes. Deliberately its own method rather than\n * recordFailure × N: ordinary strikes are cleared by any success, and a\n * top-ranked lying node keeps recording successes on the unvalidated calls\n * between probes, which would reset its strikes forever and keep it in\n * rotation (observed live). Scope stays per-API: the node may be perfectly\n * healthy for its other API families.\n */\n recordDefectiveResponse(node: string, api: string): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n const existing: {\n count: number\n cooldownUntil: number\n lastFailureTime: number\n defective?: boolean\n } = h.apiFailures.get(api) ?? { count: 0, cooldownUntil: 0, lastFailureTime: 0 }\n existing.count = Math.max(existing.count + 1, MAX_API_FAILURES_BEFORE_COOLDOWN)\n existing.lastFailureTime = now\n existing.cooldownUntil = now + API_COOLDOWN_MS\n existing.defective = true\n h.apiFailures.set(api, existing)\n }\n\n /**\n * Cool down a rate-limited node. Honors an explicit server `Retry-After`\n * (`retryAfterMs`) exactly — the server told us when to return. With no usable\n * header, applies escalating backoff: BASE, 2×BASE, 4×BASE … capped at\n * RATE_LIMIT_MAX_MS, indexed by the node's consecutive-429 streak (reset by a\n * success or after RATE_LIMIT_STREAK_RESET_MS of quiet). This stops a throttled\n * public node from being re-admitted every 10s and re-hammered under sustained\n * load, which matters most when the fleet's own unlimited node is removed.\n */\n recordRateLimit(node: string, retryAfterMs?: number): void {\n const h = this.getOrCreate(node)\n const now = Date.now()\n // Expire a stale streak so an occasional throttle hours apart doesn't compound.\n if (h.rateLimitStreak > 0 && now - h.lastRateLimitAt > RATE_LIMIT_STREAK_RESET_MS) {\n h.rateLimitStreak = 0\n }\n const hasHeader = typeof retryAfterMs === 'number' && Number.isFinite(retryAfterMs) && retryAfterMs > 0\n const cooldown = hasHeader\n ? retryAfterMs!\n : Math.min(RATE_LIMIT_BASE_MS * 2 ** h.rateLimitStreak, RATE_LIMIT_MAX_MS)\n // Only a header-less 429 advances the escalation streak — an explicit Retry-After is\n // honored exactly and must not compound the header-less backoff (else several\n // Retry-After 429s would push a later header-less 429 straight to the 60s cap).\n if (!hasHeader) h.rateLimitStreak++\n h.lastRateLimitAt = now\n // Explicit Retry-After is honored exactly (the server's current instruction). A\n // header-less cooldown may only move the window FORWARD — it must never truncate a\n // longer window already set, e.g. a node parked for an hour by an explicit\n // Retry-After that is later retried as a last resort and returns a header-less 429\n // must not have its 1h window cut down to the 10s base.\n h.rateLimitedUntil = hasHeader\n ? now + cooldown\n : Math.max(h.rateLimitedUntil, now + cooldown)\n h.consecutiveFailures++\n h.lastFailureTime = now\n }\n\n /** Record an observed head_block_number for this node. */\n recordHeadBlock(node: string, blockNum: number): void {\n if (!blockNum || !Number.isFinite(blockNum)) return\n const h = this.getOrCreate(node)\n h.headBlock = blockNum\n h.headBlockUpdatedAt = Date.now()\n }\n\n /**\n * Consensus head block from recent observations. Uses the median rather than the\n * max to prevent a single bad/misconfigured node from poisoning the reference.\n * A node reporting an inflated head_block won't affect the median unless the\n * majority of nodes agree on that range.\n */\n private consensusHeadBlock(): number {\n const now = Date.now()\n const recent: number[] = []\n for (const h of this.health.values()) {\n if (h.headBlock > 0 && now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS) {\n recent.push(h.headBlock)\n }\n }\n if (recent.length < 2) return 0 // Need at least 2 observations to compare\n recent.sort((a, b) => a - b)\n // Median: for even length, use the lower-middle value (conservative)\n return recent[Math.floor((recent.length - 1) / 2)]\n }\n\n /** True if this node is healthy (globally and for the given API if provided). */\n isNodeHealthy(node: string, api?: string): boolean {\n const h = this.health.get(node)\n if (!h) return true // unknown nodes assumed healthy\n const now = Date.now()\n\n // Rate-limited and cooldown hasn't expired\n if (h.rateLimitedUntil > now) return false\n\n // Too many consecutive failures within the last 30 seconds\n if (h.consecutiveFailures >= 3 && now - h.lastFailureTime < 30_000) return false\n\n // Per-API cooldown: node may be healthy overall but missing this API plugin\n if (api) {\n const apiFail = h.apiFailures.get(api)\n if (apiFail && apiFail.cooldownUntil > now) return false\n }\n\n // Head-block staleness: deprioritize nodes lagging behind the consensus head\n const best = this.consensusHeadBlock()\n if (\n best > 0 &&\n h.headBlock > 0 &&\n now - h.headBlockUpdatedAt <= HEAD_BLOCK_MAX_AGE_MS &&\n best - h.headBlock > STALE_BLOCK_THRESHOLD\n ) {\n return false\n }\n\n return true\n }\n\n /**\n * Order nodes best-first: healthy nodes sorted by adaptive latency score, then\n * unhealthy nodes appended. Capability / staleness / rate-limit filtering stays in\n * `isNodeHealthy` and is unchanged — latency only reorders WITHIN the healthy set,\n * and only WITHIN the array it is handed (so it never leaves the configured list).\n *\n * One ordering per pass MAY promote a healthy node overdue for a re-probe (never\n * sampled, or not sampled within LATENCY_REPROBE_MS) to the front — single-flight\n * via `lastProbeAt`. This is what lets a demoted node climb back when it recovers,\n * and profiles a node that organic traffic (always served by a faster peer) never\n * reaches. Cold start: with no profiles, every node scores the neutral prior and the\n * stable config-index tiebreak yields the original order — i.e. today's behavior.\n */\n getOrderedNodes(nodes: string[], api?: string): string[] {\n const healthy: string[] = []\n const unhealthy: string[] = []\n for (const node of nodes) {\n if (this.isNodeHealthy(node, api)) {\n healthy.push(node)\n } else {\n unhealthy.push(node)\n }\n }\n if (healthy.length <= 1) {\n return [...healthy, ...unhealthy]\n }\n const now = Date.now()\n // Every score in THIS pass falls back to config index on ties → a total,\n // transitive order with no memo (so no stale-denominator inversions).\n const ordered = healthy\n .map((node, i) => ({ node, i, score: this.scoreNode(node, now) }))\n .sort((a, b) => a.score - b.score || a.i - b.i)\n .map((d) => d.node)\n const probe = this.pickReprobeCandidate(healthy, now)\n if (probe && ordered[0] !== probe) {\n return [probe, ...ordered.filter((n) => n !== probe), ...unhealthy]\n }\n return [...ordered, ...unhealthy]\n }\n\n /** A node's latency is usable for ranking only if profiled (≥ MIN_SAMPLES) and fresh. */\n private isLatencyUsable(h: NodeHealth | undefined, now: number): boolean {\n return (\n !!h &&\n h.ewmaLatencyMs !== undefined &&\n h.latencySampleCount >= LATENCY_MIN_SAMPLES &&\n now - h.latencyUpdatedAt <= LATENCY_MAX_AGE_MS\n )\n }\n\n /**\n * Ranking score (lower = better). Unproven/warming nodes get a fixed neutral prior\n * so they sit ahead of a proven-slow node but behind a proven-fast one, and make at\n * most one rank transition when they cross MIN_SAMPLES (no churn).\n */\n private scoreNode(node: string, now: number): number {\n const h = this.health.get(node)\n if (!this.isLatencyUsable(h, now)) return LATENCY_UNPROVEN_PRIOR_MS\n return h!.ewmaLatencyMs!\n }\n\n /**\n * At most one healthy node overdue for an exploratory re-probe: never sampled, or\n * neither sampled nor re-probed within LATENCY_REPROBE_MS. Returns the stalest such\n * node and stamps `lastProbeAt` to single-flight it against concurrent orderings.\n *\n * Note: `getOrCreate` here materializes a health entry per node in the passed list.\n * The node list (`config.nodes`/`restNodes`) is treated as effectively static — set\n * once via `setNodes` — so the map is bounded. If a host is ever removed from the\n * list at runtime its stale entry is simply ignored (never re-surfaced) and is a\n * negligible, bounded amount of memory.\n */\n private pickReprobeCandidate(healthy: string[], now: number): string | undefined {\n const threshold = now - LATENCY_REPROBE_MS\n let cand: string | undefined\n let candTouch = Infinity\n for (const n of healthy) {\n const h = this.getOrCreate(n)\n const touch = Math.max(h.latencyUpdatedAt, h.lastProbeAt)\n if (touch <= threshold && touch < candTouch) {\n cand = n\n candTouch = touch\n }\n }\n if (cand) this.getOrCreate(cand).lastProbeAt = now\n return cand\n }\n}\n\n// Exported for the co-located specs only (asserting the call sites' effect on\n// health). Not re-exported by hive-tx/index.ts, so NOT part of the public API.\n// @internal\nexport const rpcHealthTracker = new NodeHealthTracker()\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\n\n// ── Hedged-request budget ────────────────────────────────────────────────────\n\n/**\n * Token bucket bounding hedged (duplicated) read requests to a fraction of\n * overall traffic. A hedge spends 1 token; every un-hedged success refills\n * `config.resilience.hedgeRefillPerSuccess` (default 0.1 ⇒ steady-state hedge\n * rate ≤ ~9% of successful traffic, with bursts up to `hedgeBucketCapacity`).\n * The self-limiting property this buys: under pool-wide slowness nearly every\n * request wants to hedge while successes (the refills) stagnate, so the bucket\n * drains and hedging auto-disables instead of doubling load into public-node\n * rate limits — the standard hedged-request guard (cf. gRPC's hedging throttle;\n * Dean & Barroso, \"The Tail at Scale\"). One instance per process shared across\n * concurrent calls; plain synchronous mutation is race-free on the JS event\n * loop. Reads config live so runtime tuning via `setResilience` applies.\n * @internal Exported for testing only.\n */\nexport class HedgeBudget {\n private tokens = config.resilience.hedgeBucketCapacity\n\n trySpend(): boolean {\n this.clamp()\n // Epsilon guards fractional-refill float accumulation (10 × 0.1 < 1 in FP64).\n if (this.tokens >= 1 - 1e-9) {\n this.tokens -= 1\n return true\n }\n return false\n }\n\n refill(): void {\n this.clamp()\n this.tokens = Math.min(\n config.resilience.hedgeBucketCapacity,\n this.tokens + config.resilience.hedgeRefillPerSuccess\n )\n }\n\n /** Capacity may be lowered at runtime; never let stored tokens exceed it. */\n private clamp(): void {\n if (this.tokens > config.resilience.hedgeBucketCapacity) {\n this.tokens = config.resilience.hedgeBucketCapacity\n }\n }\n\n /** @internal test hook */\n get available(): number {\n return this.tokens\n }\n\n /** @internal test hook */\n reset(tokens = config.resilience.hedgeBucketCapacity): void {\n this.tokens = tokens\n }\n}\n\n// @internal — exported for the co-located spec only, like the trackers above.\nexport const rpcHedgeBudget = new HedgeBudget()\n\n/**\n * Per-attempt timeout for a read call. A node profiled for THIS profile key\n * (full RPC method / REST api+endpoint template) is given `factor × EWMA` —\n * floored (≥2s) so a moderate spike on a fast call is not cut off, and capped\n * at the caller's ceiling so this can only ever *shorten* the wait. The\n * effect: a node running far above its own baseline for this exact kind of\n * call is abandoned early and failover starts in seconds instead of the full\n * fixed window.\n *\n * Two deliberate exclusions:\n * - `explicit` callers (who passed a timeout argument) keep exactly what they\n * asked for — the documented meaning of the parameter is preserved, and a\n * consumer who knows their call is heavy is never second-guessed.\n * - The profile is per (node, full method) with NO fallback to the node's\n * mixed global EWMA or even the API-prefix average: a baseline dominated by\n * cheap `condenser_api.get_accounts` calls must not set the deadline for a\n * heavy `condenser_api.get_account_history`. An unprofiled (node, method)\n * pair keeps the caller's timeout unchanged (cold start == old behavior).\n */\nfunction adaptiveAttemptTimeout(\n tracker: NodeHealthTracker,\n node: string,\n profileKey: string,\n callerTimeout: number,\n explicit: boolean\n): number {\n const r = config.resilience\n if (!r.adaptiveTimeout || explicit) return callerTimeout\n const ewma = tracker.getUsableLatencyMs(node, profileKey)\n if (ewma === undefined) return callerTimeout\n // EWMAs are fractional, but the result feeds AbortSignal.timeout(), which\n // Node rejects with ERR_OUT_OF_RANGE for non-integer delays (browsers coerce).\n return Math.ceil(\n Math.min(callerTimeout, Math.max(r.adaptiveTimeoutFloorMs, r.adaptiveTimeoutFactor * ewma))\n )\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/** Record a caught error on the health tracker (handles NodeError to avoid double-counting). */\nfunction recordError(tracker: NodeHealthTracker, node: string, e: any, api?: string): void {\n if (e instanceof NodeError) {\n if (e.isRateLimit) {\n // 0 → no usable Retry-After → let recordRateLimit apply escalating backoff.\n tracker.recordRateLimit(node, e.rateLimitMs || undefined)\n } else {\n tracker.recordFailure(node, api)\n }\n } else if (e instanceof RPCError) {\n // RPC-level errors are API-specific (e.g., disabled API)\n tracker.recordFailure(node, api)\n } else {\n // Transport-level failures (DNS, TLS, timeout) affect the whole node\n tracker.recordFailure(node)\n }\n}\n\n/**\n * Passively extract head_block_number from known RPC responses\n * (e.g. `condenser_api.get_dynamic_global_properties`, `database_api.get_dynamic_global_properties`).\n * Silently ignores responses without that shape.\n */\nfunction tryRecordHeadBlock(\n tracker: NodeHealthTracker,\n node: string,\n method: string,\n result: any\n): void {\n if (!result || typeof result !== 'object') return\n if (!method.includes('get_dynamic_global_properties')) return\n const block = (result as any).head_block_number\n if (typeof block === 'number') {\n tracker.recordHeadBlock(node, block)\n }\n}\n\n// ── AbortSignal helpers (browser fallbacks) ─────────────────────────────────\n\n/**\n * Build a TimeoutError \"reason\" for an aborted signal.\n * Prefers the standard `DOMException` when available. Runtimes that ship\n * `AbortController` without `DOMException` (notably React Native / Hermes,\n * old Node < 17) fall back to a plain Error tagged with `name: 'TimeoutError'`\n * — which is what consumers actually check on `signal.reason`.\n */\nfunction createTimeoutReason(): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException('The operation was aborted due to timeout', 'TimeoutError')\n }\n const err = new Error('The operation was aborted due to timeout')\n err.name = 'TimeoutError'\n return err\n}\n\n/** AbortSignal.timeout polyfill for pre-Chrome 103 / pre-Safari 16.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to clear the dangling timer. */\nfunction createTimeoutSignal(ms: number): { signal: AbortSignal; cleanup: () => void } {\n // Node's AbortSignal.timeout throws ERR_OUT_OF_RANGE on fractional delays\n // (browsers coerce them), so guard every caller here.\n ms = Math.ceil(ms)\n if (typeof AbortSignal.timeout === 'function') {\n return { signal: AbortSignal.timeout(ms), cleanup: () => {} }\n }\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(createTimeoutReason()), ms)\n return { signal: controller.signal, cleanup: () => clearTimeout(timer) }\n}\n\n/** AbortSignal.any polyfill for pre-Chrome 116 / pre-Safari 17.4.\n * Returns { signal, cleanup } — caller must invoke cleanup() on success\n * to remove listeners from the input signals (prevents leaks when the\n * same long-lived signal is reused across many callRPC invocations). */\nfunction mergeSignals(\n primary: AbortSignal,\n secondary?: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!secondary) return { signal: primary, cleanup: () => {} }\n if (typeof AbortSignal.any === 'function') {\n return { signal: AbortSignal.any([primary, secondary]), cleanup: () => {} }\n }\n // Fallback: controller that aborts with the winning signal's reason\n const controller = new AbortController()\n if (primary.aborted) {\n controller.abort(primary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n if (secondary.aborted) {\n controller.abort(secondary.reason)\n return { signal: controller.signal, cleanup: () => {} }\n }\n\n const onPrimaryAbort = () => controller.abort(primary.reason)\n const onSecondaryAbort = () => controller.abort(secondary.reason)\n primary.addEventListener('abort', onPrimaryAbort, { once: true })\n secondary.addEventListener('abort', onSecondaryAbort, { once: true })\n\n const cleanup = () => {\n primary.removeEventListener('abort', onPrimaryAbort)\n secondary.removeEventListener('abort', onSecondaryAbort)\n }\n return { signal: controller.signal, cleanup }\n}\n\n/**\n * Low-level JSON-RPC call to a single node. No failover.\n * Throws RPCError for blockchain rejections, NodeError for HTTP 429/5xx,\n * and generic Error for other transport failures.\n * @param shouldRetry - If true, retries once on the same node for transient errors.\n */\nconst jsonRPCCall = async (\n url: string,\n method: string,\n params: any,\n timeout = config.timeout,\n shouldRetry = false,\n externalSignal?: AbortSignal\n) => {\n const id = Math.floor(Math.random() * 100_000_000)\n const body = {\n jsonrpc: '2.0',\n method,\n params,\n id\n }\n // Merge the per-call timeout with any external abort signal (e.g., SSR\n // request cancellation). Either one firing cancels the fetch.\n // Fallbacks for browsers without AbortSignal.timeout (pre-Chrome 103)\n // or AbortSignal.any (pre-Chrome 116).\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\n const { signal, cleanup: cleanupMerge } = mergeSignals(tSignal, externalSignal)\n const cleanup = () => {\n cleanupTimeout()\n cleanupMerge()\n }\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json', ...serverIdentityHeaders() },\n signal\n })\n\n // Handle HTTP-level errors before parsing JSON.\n // Throw NodeError so callers can record health exactly once.\n if (res.status === 429) {\n throw new NodeError(url, `HTTP 429 Rate Limited`, {\n rateLimitMs: parseRetryAfterMs(res.headers.get('Retry-After')),\n isRateLimit: true\n })\n }\n // Any other 5xx is a node-level failure. Common cases:\n // 502 Bad Gateway — upstream HAF/jussi down\n // 503 Service Unavail — node draining / maintenance\n // 504 Gateway Timeout — slow upstream\n // 520-530 — Cloudflare interstitials (1033 tunnel error → 530)\n // Without this branch, the HTML error-page body would fall into res.json()\n // and throw a generic SyntaxError downstream, making failover guess at\n // whether the request reached the node.\n if (res.status >= 500 && res.status < 600) {\n throw new NodeError(url, `HTTP ${res.status} from ${url}`)\n }\n\n const result = (await res.json()) as CallResponse\n if (\n !result ||\n typeof result.id === 'undefined' ||\n result.id !== id ||\n result.jsonrpc !== '2.0'\n ) {\n throw new Error('JSONRPC id mismatch')\n }\n if ('result' in result) {\n return result.result\n }\n if ('error' in result) {\n const e = result.error\n if ('message' in e && 'code' in e) {\n throw new RPCError(e)\n }\n throw result.error\n }\n // No result and no error?\n throw result\n } catch (e) {\n if (e instanceof RPCError) {\n throw e\n }\n // NodeError should not be retried on the same node - it's an HTTP status issue\n if (e instanceof NodeError) {\n throw e\n }\n if (externalSignal?.aborted) {\n throw e\n }\n if (shouldRetry) {\n return jsonRPCCall(url, method, params, timeout, false, externalSignal)\n }\n throw e\n } finally {\n cleanup()\n }\n}\n\n/** Small jitter delay between failover attempts to prevent thundering herd. */\nfunction jitterDelay(): Promise {\n return sleep(50 + Math.random() * 50)\n}\n\n// ── Hedged read attempt ─────────────────────────────────────────────────────\n\n/**\n * One hedged READ attempt: start the primary node, and if it is still pending\n * after `max(hedgeDelayFloorMs, hedgeDelayFactor × primary EWMA)`, race a\n * duplicate against the next healthy untried node. First success wins and the\n * loser is aborted. Resolution rules (mirroring the sequential path exactly):\n *\n * - External abort (caller cancelled): reject immediately, record nothing.\n * - Authoritative RPCError (non-node-level blockchain rejection) from either\n * leg: an answer, not a fault — abort the other leg, reject immediately.\n * - Failover-class failure: record health for that leg (recordError +\n * recordSlowFailure — identical to the sequential catch); if the other leg\n * is still running, keep waiting on it; when both have failed, reject with\n * the last error so the outer loop continues its normal failover.\n * - Primary fails BEFORE the hedge fires: reject immediately (plain failover —\n * hedging only ever races slowness, never a node that failed fast).\n *\n * Health/budget bookkeeping on a win: winner records a normal success sample;\n * if the hedge won, the primary gets a censored latency sample (elapsed at\n * abort — a lower bound on its true latency) so repeated hedge-wins reorder\n * the pool; if the primary won without the hedge ever firing, the budget\n * refills. An aborted hedge leg records nothing (it was never given a fair\n * run). Broadcasts NEVER go through this path (double-broadcast risk) — it is\n * wired into `callRPC` only.\n */\nfunction hedgedRpcAttempt(opts: {\n method: string\n params: any[] | object\n api: string\n primary: string\n /**\n * Pre-selected healthy untried peers (up to a few, in rank order). The\n * actual hedge target is drawn uniformly at random at FIRE time: with many\n * concurrent callers behind one origin IP, always duplicating to the single\n * next-ranked node would concentrate the whole hedge stream on it and could\n * trip its per-IP rate limit — spreading over the top candidates keeps the\n * same budget bound without a single-target hotspot. Marked tried only if\n * the hedge actually fires.\n */\n hedgePool: string[]\n callerTimeout: number\n /** Caller passed an explicit timeout — adaptive shortening is disabled. */\n explicitTimeout: boolean\n /** The call's wall-clock deadline: a hedge must not START past it (it would\n * be a brand-new request the outer loop itself would refuse to start). */\n deadlineAt: number\n externalSignal?: AbortSignal\n /** Lets the outer loop add the hedge node to its tried-set at fire time. */\n onHedgeFired: (node: string) => void\n /** Caller-supplied payload validation — see callRPC's `validate` param. */\n validate?: (result: unknown) => boolean\n}): Promise {\n const {\n method,\n params,\n api,\n primary,\n hedgePool,\n callerTimeout,\n explicitTimeout,\n deadlineAt,\n externalSignal,\n onHedgeFired,\n validate\n } = opts\n return new Promise((resolve, reject) => {\n let done = false\n let pendingLegs = 0\n let hedgeFired = false\n /** The primary settled on its own (success OR failure). A censored latency\n * sample is only valid for a primary that was still in flight when the\n * hedge won — recording one after the primary already failed would\n * fabricate a second sample for a request whose outcome was recorded. */\n let primarySettled = false\n let lastError: any\n let hedgeTimer: ReturnType | undefined\n let primaryStart = 0\n const controllers: AbortController[] = []\n\n /** Settle exactly once: clear the timer, abort every other in-flight leg\n * (their rejections land behind the `done` guard and are dropped). */\n const finish = (settle: () => void) => {\n if (done) return\n done = true\n if (hedgeTimer !== undefined) {\n clearTimeout(hedgeTimer)\n hedgeTimer = undefined\n }\n for (const c of controllers) {\n if (!c.signal.aborted) c.abort()\n }\n settle()\n }\n\n const startLeg = (node: string, isHedge: boolean) => {\n pendingLegs++\n const controller = new AbortController()\n controllers.push(controller)\n // Merge our cancellation handle with the caller's signal; jsonRPCCall\n // merges the result with its own per-attempt timeout signal.\n const merged = mergeSignals(controller.signal, externalSignal)\n const legTimeout = adaptiveAttemptTimeout(\n rpcHealthTracker,\n node,\n method,\n callerTimeout,\n explicitTimeout\n )\n const start = Date.now()\n if (!isHedge) primaryStart = start\n jsonRPCCall(node, method, params, legTimeout, false, merged.signal)\n .then((res) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Same handling as the catch\n // path — record the fault against this node's API health, never\n // record a success for a lie, and let the other leg still win.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(\n `[hive-tx] response validation failed for ${method} from ${node}`\n )\n if (!isHedge && !hedgeFired) {\n finish(() => reject(lastError))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n return\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - start, method)\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n if (isHedge) {\n if (!primarySettled) {\n // Primary lost the race while still in flight: censored sample\n // (lower bound of its true latency) so the ranker learns without\n // marking it as failed. A primary that already failed was fully\n // recorded by its own catch — nothing more to record.\n rpcHealthTracker.recordCensoredLatency(primary, Date.now() - primaryStart, method)\n }\n } else if (!hedgeFired) {\n rpcHedgeBudget.refill()\n }\n finish(() => resolve(res as T))\n })\n .catch((e) => {\n merged.cleanup()\n pendingLegs--\n if (!isHedge) primarySettled = true\n if (done) return // aborted loser (or late settle) — already resolved\n if (externalSignal?.aborted) {\n // Caller cancelled — bail without recording (mirrors sequential path).\n finish(() => reject(e))\n return\n }\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n // Authoritative rejection: an answer, not a node fault.\n finish(() => reject(e))\n return\n }\n // Failover-class failure — record exactly as the sequential catch does.\n recordError(rpcHealthTracker, node, e, api)\n rpcHealthTracker.recordSlowFailure(node, Date.now() - start, method)\n lastError = e\n if (!isHedge && !hedgeFired) {\n // Primary failed fast, before the hedge delay: plain failover.\n finish(() => reject(e))\n return\n }\n if (pendingLegs === 0) {\n finish(() => reject(lastError))\n }\n // else: the other leg is still in flight and may still win.\n })\n }\n\n startLeg(primary, false)\n\n // Delay from the primary's per-method profile (the eligibility gate\n // ensured it is usable); a raced expiry just means the floor applies. It is\n // then clamped BELOW the primary's own attempt window: for a heavy API\n // (EWMA > window/hedgeDelayFactor) the un-clamped delay would land past\n // the primary's timeout-abort — which clears this timer — so hedging would\n // silently never fire for exactly the heavy tail it exists to protect.\n // Firing at ~80% of the window keeps the duplicate meaningful (it starts\n // while the primary is still allowed to win) for every profile shape.\n const ewma = rpcHealthTracker.getUsableLatencyMs(primary, method) ?? 0\n const primaryWindow = adaptiveAttemptTimeout(\n rpcHealthTracker,\n primary,\n method,\n callerTimeout,\n explicitTimeout\n )\n const delay = Math.min(\n Math.max(config.resilience.hedgeDelayFloorMs, config.resilience.hedgeDelayFactor * ewma),\n 0.8 * primaryWindow\n )\n hedgeTimer = setTimeout(() => {\n hedgeTimer = undefined\n if (done || externalSignal?.aborted) return\n // Never START a duplicate past the call's wall-clock deadline — it would\n // extend the hold and spend a token on work the outer loop would refuse.\n if (Date.now() >= deadlineAt) return\n // Candidates were selected before the delay elapsed — re-check health at\n // fire time (one may have been rate-limited meanwhile) BEFORE spending a\n // token, so a stale pool costs nothing. Random draw spreads concurrent\n // callers' duplicates across the top candidates (see hedgePool doc).\n const live = hedgePool.filter((n) => rpcHealthTracker.isNodeHealthy(n, api))\n if (live.length === 0) return\n const target = live[Math.floor(Math.random() * live.length)]\n // Budget check at fire time, not arm time: only actual duplicates spend.\n if (!rpcHedgeBudget.trySpend()) return\n hedgeFired = true\n onHedgeFired(target)\n startLeg(target, true)\n }, delay)\n })\n}\n\n// ── Public API: callRPC ─────────────────────────────────────────────────────\n\n/**\n * Makes API calls to Hive blockchain nodes with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, jitter between retries,\n * and HTTP status awareness (429 rate limiting, 503).\n *\n * If the current node fails, it will automatically try the next healthy node.\n * When all nodes have been tried, wraps around to give earlier nodes another chance\n * until the full retry budget (config.retry) is exhausted.\n * RPCErrors (valid blockchain rejections) are never retried.\n *\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Maximum number of retry attempts (default: config.retry). The\n * wall-clock budget (`config.resilience.totalBudgetFactor` × timeout) may end\n * the failover walk before the retry count is exhausted.\n * @param validate - Optional payload validation. Some nodes return a valid\n * JSON-RPC envelope carrying an impossible payload (e.g. account rows with\n * metadata fields stripped to \"\"), which no transport-level check can catch.\n * When the callback returns false the response is treated as a node fault:\n * recorded against that node's per-API health (repeat offenders get an API\n * cooldown and are deprioritized) and the failover walk continues to the\n * next node instead of returning the lie. Keep validators conservative —\n * reject only payloads the caller KNOWS cannot be correct, or a strict\n * validator turns every node's honest answer into a failover storm.\n * @returns Promise resolving to the API response\n * @throws {RPCError} On blockchain-level errors (bad params, missing authority, etc.)\n * @throws {Error} If all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callRPC } from 'hive-tx'\n *\n * // Get account information\n * const accounts = await callRPC('condenser_api.get_accounts', [['alice']])\n *\n * // Custom timeout and retry settings\n * const data = await callRPC('condenser_api.get_content', ['alice', 'test-post'], 10_000, 5)\n * ```\n */\nexport const callRPC = async (\n method: string,\n params: any[] | object = [],\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal,\n validate?: (result: unknown) => boolean\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n // An explicit timeout argument is authoritative: adaptive shortening only\n // applies to callers who left the window to the SDK (timeout === undefined),\n // so `callRPC(m, p, 10_000)` still means \"give each attempt 10s\" exactly.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const api = apiOf(method)\n // Wall-clock budget across ALL failover attempts. Without it the worst case\n // is (retry+1) × timeout ≈ 30s — exactly the render pile-up this feature\n // exists to prevent — whenever the WHOLE pool is slow (adaptive timeouts\n // rise with the EWMAs and hedging self-throttles, both by design). The\n // deadline is checked before each new attempt AND before a hedge fires; an\n // in-flight attempt still finishes its own window, so the true ceiling is\n // deadline + one attempt window (up to ~2× the window if a hedge fired just\n // before the deadline and the attempt then waits out the hedge leg too).\n // Note this budget also bounds callers who passed an explicit `retry`: the\n // wall clock, not the attempt count, is the stronger promise here.\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Track nodes tried in the current round. When all nodes have been tried,\n // clear the set to allow a second round (wrap-around) using the retry budget.\n const triedInRound = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so nodes with an API-specific cooldown are deprioritized.\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n // Pick the healthiest untried node. If all tried, start a new round.\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n\n // Hedge eligibility for THIS attempt: opted in, the primary has a usable\n // latency profile for this exact method (so the hedge delay is grounded in\n // data — cold starts stay sequential), and healthy untried peers exist.\n let hedgePool: string[] = []\n if (\n config.resilience.hedge &&\n rpcHealthTracker.getUsableLatencyMs(node, method) !== undefined\n ) {\n hedgePool = orderedNodes\n .filter((n) => !triedInRound.has(n) && rpcHealthTracker.isNodeHealthy(n, api))\n .slice(0, 3)\n }\n\n if (hedgePool.length > 0) {\n try {\n // All health/budget recording happens inside the hedged attempt —\n // the catch below must NOT record again (unlike the sequential path).\n return await hedgedRpcAttempt({\n method,\n params,\n api,\n primary: node,\n hedgePool,\n callerTimeout: ceiling,\n explicitTimeout,\n deadlineAt: deadline,\n externalSignal: signal,\n onHedgeFired: (n) => triedInRound.add(n),\n validate\n })\n } catch (e: any) {\n if (e instanceof RPCError && !isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n lastError = e\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n }\n\n const callStart = Date.now()\n try {\n const res = await jsonRPCCall(\n node,\n method,\n params,\n adaptiveAttemptTimeout(rpcHealthTracker, node, method, ceiling, explicitTimeout),\n false,\n signal\n )\n if (validate && !validate(res)) {\n // Well-formed envelope, impossible payload: a node fault the\n // HTTP/JSON-RPC layers cannot see. Count it against this node's API\n // health (never record a success or refill the hedge budget for a\n // lie) and fail over to the next node.\n rpcHealthTracker.recordDefectiveResponse(node, api)\n lastError = new Error(`[hive-tx] response validation failed for ${method} from ${node}`)\n if (attempt < retry) {\n await jitterDelay()\n }\n continue\n }\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart, method)\n // An un-hedged success is what earns hedge budget back (see HedgeBudget).\n rpcHedgeBudget.refill()\n tryRecordHeadBlock(rpcHealthTracker, node, method, res)\n return res as T\n } catch (e: any) {\n // RPCErrors: distinguish node-level failures from genuine blockchain rejections.\n // Node-level errors (e.g. -32602 \"Unable to parse endpoint data\" from a sick\n // HAF/jussi backend) should failover; real rejections (bad params, missing\n // authority, etc.) propagate immediately.\n if (e instanceof RPCError) {\n if (!isNodeLevelRPCError(e.code, e.message)) {\n throw e\n }\n // Node-level RPC error — record failure and fall through to failover\n }\n // External abort — stop retrying immediately\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n // A genuinely slow failure (timeout/abort/slow-5xx) is also a latency signal so\n // a node that 200s-but-too-slow or aborts at the timeout is demoted by the\n // ranker, not only by the (transient) failure gate. Measured elapsed, never a\n // constant; recordSlowFailure ignores instant (down-node) failures.\n rpcHealthTracker.recordSlowFailure(node, Date.now() - callStart, method)\n lastError = e\n\n // Add jitter before trying next node\n if (attempt < retry) {\n await jitterDelay()\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callRPC for broadcasts ──────────────────────────────────────\n\n/**\n * Broadcast-safe RPC call. Only retries on pre-connection errors where the\n * request definitively never reached the server (ECONNREFUSED, ENOTFOUND, etc.).\n * On timeouts, HTTP errors, or any ambiguous failure, throws immediately to\n * prevent double-broadcasting transactions.\n *\n * Tries each node once (no wrap-around) since broadcast retries are dangerous.\n *\n * @internal Used by Transaction.broadcast()\n */\nexport const callRPCBroadcast = async (\n method: string,\n params: any[] | object = [],\n timeout = config.broadcastTimeout,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an array')\n }\n if (config.nodes.length === 0) {\n throw new Error('config.nodes is empty')\n }\n const api = apiOf(method)\n // Track which nodes we've already tried - broadcasts must never retry the same node\n const triedNodes = new Set()\n let lastError: any\n\n for (let attempt = 0; attempt < config.nodes.length; attempt++) {\n // Re-evaluate order each attempt so health changes are respected\n const orderedNodes = rpcHealthTracker.getOrderedNodes(config.nodes, api)\n const node = orderedNodes.find((n) => !triedNodes.has(n))\n if (!node) break\n triedNodes.add(node)\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n // Deliberately no latency sample for broadcasts: broadcast_transaction_synchronous\n // blocks for block inclusion (~1.5–3s+) regardless of the node's read speed, so\n // feeding it into the shared read EWMA would wrongly demote a fast node for reads.\n // The same nodes are profiled by callRPC read traffic, so a genuinely slow node is\n // still demoted there.\n rpcHealthTracker.recordSuccess(node, api)\n return res as T\n } catch (e: any) {\n // RPCErrors are valid blockchain rejections - never retry\n if (e instanceof RPCError) {\n throw e\n }\n if (signal?.aborted) {\n throw e\n }\n recordError(rpcHealthTracker, node, e, api)\n lastError = e\n\n // Broadcast safety: only fail over when the request is safe to re-send.\n // `broadcastOperations` signs the tx exactly once and `callRPCBroadcast`\n // reuses that signed payload across nodes, so any case where the next\n // node would dedupe by trx_id is fine. RPCErrors (real blockchain\n // rejections) propagate immediately — see isBroadcastSafeToRetry.\n if (!isBroadcastSafeToRetry(e)) {\n throw e\n }\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callREST ────────────────────────────────────────────────────\n\nconst apiMethods: Record = {\n balance: '/balance-api',\n hafah: '/hafah-api',\n hafbe: '/hafbe-api',\n hivemind: '/hivemind-api',\n hivesense: '/hivesense-api',\n reputation: '/reputation-api',\n 'nft-tracker': '/nft-tracker-api',\n hafsql: '/hafsql',\n status: '/status-api'\n}\n\n/**\n * Makes REST API calls to Hive blockchain REST endpoints with automatic retry and failover support.\n * Uses per-request retry counters, node health tracking, and timeout support.\n * Wraps around the node list to honor the full retry budget.\n *\n * @template Api - The REST API method type (e.g., 'balance', 'hafah', 'hivemind', etc.)\n * @template P - The endpoint path type for the specified API\n *\n * @param api - The REST API method name to call\n * @param endpoint - The specific endpoint path within the API\n * @param params - Optional parameters for path and query string replacement\n * @param timeout - Request timeout in milliseconds (default: config.timeout)\n * @param retry - Number of retry attempts before throwing an error (default:\n * config.retry). The wall-clock budget (`config.resilience.totalBudgetFactor`\n * × timeout) may end the failover walk before the retry count is exhausted.\n *\n * @returns Promise resolving to the API response data with proper typing\n * @throws Error if all retry attempts fail\n *\n * @example\n * ```typescript\n * import { callREST } from 'hive-tx'\n *\n * // Get account balance\n * const balance = await callREST('balance', '/accounts/{account-name}/balances', { \"account-name\": 'alice' })\n *\n * // Custom timeout and retry settings\n * const data = await callREST('status', '/status', undefined, 10_000, 3)\n * ```\n */\nexport async function callREST(\n api: APIMethods,\n endpoint: string,\n params?: Record,\n timeout?: number,\n retry = config.retry,\n signal?: AbortSignal\n): Promise {\n if (!Array.isArray(config.restNodes)) {\n throw new Error('config.restNodes is not an array')\n }\n if (config.restNodes.length === 0) {\n throw new Error('config.restNodes is empty')\n }\n // Same contract as callRPC: an explicit timeout argument is authoritative\n // (no adaptive shortening), and a wall-clock deadline bounds the total\n // failover walk when the whole pool is slow.\n const explicitTimeout = timeout !== undefined\n const ceiling = timeout ?? config.timeout\n const deadline = Date.now() + config.resilience.totalBudgetFactor * ceiling\n // Latency-profile key: api + endpoint TEMPLATE (pre-substitution, so the\n // cardinality is code-defined) — a cheap endpoint's baseline must not set\n // the deadline for a heavy one within the same REST api.\n const restProfileKey = `${api}:${endpoint}`\n // Per-API node override: an API served by only a subset of nodes (e.g.\n // hivesense) uses its own capable-host list so the small retry budget and\n // cold starts aren't wasted on nodes that 404/503 it. Any API without an\n // override (or with an empty one) falls back to the generic restNodes.\n const apiNodes =\n config.restNodesByApi?.[api]?.length\n ? config.restNodesByApi[api]!\n : config.restNodes\n const triedInRound = new Set()\n let lastError: any\n // Track whether the error was already recorded by the HTTP status handler\n let alreadyRecorded = false\n\n for (let attempt = 0; attempt <= retry; attempt++) {\n if (attempt > 0 && Date.now() >= deadline) {\n break\n }\n // Re-evaluate node order each attempt so health changes are respected.\n // Pass api so per-API cooldowns are respected.\n const orderedNodes = restHealthTracker.getOrderedNodes(apiNodes, api)\n let node = orderedNodes.find((n) => !triedInRound.has(n))\n if (!node) {\n triedInRound.clear()\n node = orderedNodes[0]\n }\n triedInRound.add(node)\n const baseUrl = node + apiMethods[api]\n let path = endpoint as string\n const paramObj = params || ({} as Record)\n const processedPathParams = new Set()\n\n // Replace path params ONLY\n Object.entries(paramObj).forEach(([key, value]) => {\n if (path.includes(`{${key}}`)) {\n path = path.replace(`{${key}}`, encodeURIComponent(String(value)))\n processedPathParams.add(key)\n }\n })\n const url = new URL(baseUrl + path)\n // Add ONLY remaining params as query (if any)\n Object.entries(paramObj).forEach(([key, value]) => {\n if (!processedPathParams.has(key)) {\n if (Array.isArray(value)) {\n value.forEach((v) => url.searchParams.append(key, String(v)))\n } else {\n url.searchParams.set(key, String(value))\n }\n }\n })\n\n if (signal?.aborted) {\n throw new Error('Aborted')\n }\n alreadyRecorded = false\n // Adaptive per-attempt timeout (see adaptiveAttemptTimeout): a profiled\n // REST node is abandoned at factor×EWMA instead of the full fixed window.\n const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(\n adaptiveAttemptTimeout(restHealthTracker, node, restProfileKey, ceiling, explicitTimeout)\n )\n const { signal: restSignal, cleanup: cleanupMerge } = mergeSignals(tSignal, signal)\n const restCleanup = () => { cleanupTimeout(); cleanupMerge() }\n const restCallStart = Date.now()\n try {\n const response = await fetch(url.toString(), {\n signal: restSignal,\n headers: serverIdentityHeaders()\n })\n if (response.status === 404) {\n throw new Error('HTTP 404 - Hint: can happen on wrong params')\n }\n if (response.status === 429) {\n // 0 (no usable Retry-After) → undefined → escalating backoff in recordRateLimit.\n restHealthTracker.recordRateLimit(\n node,\n parseRetryAfterMs(response.headers.get('Retry-After')) || undefined\n )\n alreadyRecorded = true\n throw new Error(`HTTP 429 Rate Limited by ${node}`)\n }\n if (response.status === 503) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP 503 Service Unavailable from ${node}`)\n }\n if (!response.ok) {\n restHealthTracker.recordFailure(node, api)\n alreadyRecorded = true\n throw new Error(`HTTP ${response.status} from ${node}`)\n }\n restHealthTracker.recordSuccess(node, api, Date.now() - restCallStart, restProfileKey)\n return response.json() as any\n } catch (e: any) {\n // 404 is not a node issue, don't failover\n if (e?.message?.includes('HTTP 404')) {\n throw e\n }\n // External abort (caller unmounted / React Query cancelled the request) is the\n // client's decision, NOT a node fault. Mirror callRPC: bail before recording any\n // failure or slow-latency sample so a healthy REST node (e.g. an own node) is never\n // demoted by routine navigation/cancellation.\n if (signal?.aborted) {\n throw e\n }\n // Only record if not already recorded by 429/503 handler above\n if (!alreadyRecorded) {\n restHealthTracker.recordFailure(node, api)\n }\n // A slow failure (timeout/abort/slow-5xx — e.g. an own node from a far region) is a\n // latency signal too, so it is demoted by the ranker, not only the failure gate.\n // Measured elapsed; recordSlowFailure floors at LATENCY_SLOW_FAILURE_MS so a fast\n // 404/429 or instant down-node failure is NOT mis-read as \"slow\".\n restHealthTracker.recordSlowFailure(node, Date.now() - restCallStart, restProfileKey)\n lastError = e\n\n if (attempt < retry) {\n await jitterDelay()\n }\n } finally {\n restCleanup()\n }\n }\n\n throw lastError\n}\n\n// ── Public API: callWithQuorum ───────────────────────────────────────────────\n\n/**\n * Make a JSONRPC call with quorum. The method will cross-check the result\n * with `quorum` number of nodes before returning the result.\n * @param method - The API method name (e.g., 'condenser_api.get_accounts')\n * @param params - Parameters for the API method as array or object\n * @param quorum - Default: 2 (recommended)\n */\nexport const callWithQuorum = async (\n method: string,\n params: any[] | object = [],\n quorum = 2,\n signal?: AbortSignal\n): Promise => {\n if (!Array.isArray(config.nodes)) {\n throw new Error('config.nodes is not an Array')\n }\n if (quorum > config.nodes.length) {\n throw new Error('quorum > config.nodes.length')\n }\n // We call random nodes for better security (Fisher-Yates shuffle)\n const shuffleNodes = (arr: string[]) => {\n const a = [...arr]\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]]\n }\n return a\n }\n let allNodes = shuffleNodes(config.nodes)\n let currentBatchSize = Math.min(quorum, allNodes.length)\n let allResults: any[] = []\n while (currentBatchSize > 0 && allNodes.length > 0) {\n // Take next batch of nodes\n const batchNodes = allNodes.splice(0, currentBatchSize)\n const promises: Promise[] = []\n const batchResults: any[] = []\n // Launch batch calls in parallel\n for (let i = 0; i < batchNodes.length; i++) {\n promises.push(\n jsonRPCCall(batchNodes[i], method, params, undefined, true, signal)\n .then((data) => batchResults.push(data))\n .catch(() => {})\n )\n }\n await Promise.all(promises)\n allResults.push(...batchResults)\n // Check for consensus in successful results\n const consensusResult = findConsensus(allResults, quorum)\n if (consensusResult) {\n return consensusResult\n }\n // Prepare next batch\n currentBatchSize = Math.min(quorum, allNodes.length)\n if (currentBatchSize === 0) {\n throw new Error('No more nodes available.')\n }\n }\n throw new Error(\"Couldn't reach quorum.\")\n}\n\nfunction findConsensus(results: any[], quorum: number) {\n const resultGroups = new Map()\n for (const result of results) {\n const key = JSON.stringify(result)\n if (!resultGroups.has(key)) {\n resultGroups.set(key, [])\n }\n resultGroups.get(key)!.push(result)\n }\n const consensusGroup = Array.from(resultGroups.values()).find((group) => group.length >= quorum)\n return consensusGroup ? consensusGroup[0] : null\n}\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\nimport { PrivateKey } from './helpers/PrivateKey'\nimport {\n OperationName,\n OperationBody,\n TransactionType,\n TransactionStatus,\n BroadcastResult\n} from './types'\nimport { ByteBuffer } from './helpers/ByteBuffer'\nimport { Serializer } from './helpers/serializer'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { config } from './config'\nimport { callRPC, callRPCBroadcast, RPCError } from './helpers/call'\nimport { DigestData } from './types'\nimport { sleep } from './helpers/sleep'\n\nconst chainId = hexToBytes(config.chain_id)\n\ninterface TransactionOptions {\n transaction?: TransactionType | Transaction\n /**\n * Transaction expiration in milliseconds (ms) - max 86400000 (24 hours)\n * @default 60_000\n */\n expiration?: number\n}\n\nexport class Transaction {\n transaction?: TransactionType\n\n expiration: number = 60_000\n\n private txId?: string\n\n constructor(options?: TransactionOptions) {\n if (options?.transaction) {\n if (options.transaction instanceof Transaction) {\n this.transaction = options.transaction.transaction\n this.expiration = options.transaction.expiration\n } else {\n this.transaction = options.transaction\n }\n // A transaction built externally (e.g. from a hive-uri signing request)\n // may omit the `signatures` array. sign(), addSignature() and broadcast()\n // all assume it exists, so normalize it here to avoid\n // \"Cannot read property 'push' of undefined\" on sign.\n if (this.transaction && !Array.isArray(this.transaction.signatures)) {\n this.transaction.signatures = []\n }\n this.txId = this.digest().txId\n }\n if (options?.expiration) {\n this.expiration = options.expiration\n }\n }\n\n /**\n * Adds an operation to the transaction. If no transaction exists, creates one first.\n * @template O Operation name type for type safety\n * @param operationName The name/type of the operation to add (e.g., 'transfer', 'vote', 'comment')\n * @param operationBody The operation data/body for the specified operation type\n * @returns Promise that resolves when the operation is added\n * @throws Error if transaction creation fails or global properties cannot be retrieved\n */\n async addOperation(\n operationName: O,\n operationBody: OperationBody\n ): Promise {\n if (!this.transaction) {\n await this.createTransaction(this.expiration)\n }\n this.transaction!.operations.push([operationName, operationBody])\n }\n\n /**\n * Signs the transaction with the provided key(s), supporting both single and multi-signature transactions.\n * For multi-signature, you can sign with all keys at once or sign individually by calling this method multiple times.\n * @param keys Single PrivateKey or array of PrivateKeys to sign the transaction with\n * @returns The signed transaction\n * @throws Error if no transaction exists to sign\n */\n sign(keys: PrivateKey | PrivateKey[]): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n if (this.transaction) {\n const { digest, txId } = this.digest()\n if (!Array.isArray(keys)) {\n keys = [keys]\n }\n for (const key of keys) {\n const signature = key.sign(digest)\n this.transaction.signatures.push(signature.customToString())\n }\n this.txId = txId\n return this.transaction\n } else {\n throw new Error('No transaction to sign')\n }\n }\n\n /**\n * Broadcasts the signed transaction to the Hive network.\n * Automatically handles retries and duplicate transaction detection.\n * @param checkStatus By default (false) the transaction is not guaranteed to be included in a block.\n * For example the transaction can expire while waiting in mempool.\n * If you pass true here, the function will wait for the transaction to be either included or dropped\n * before returning a result.\n * @returns Promise resolving to broadcast result\n * @throws Error if no transaction exists or transaction is not signed or transaction got rejected\n */\n async broadcast(checkStatus = false): Promise {\n if (!this.transaction) {\n throw new Error(\n 'Attempted to broadcast an empty transaction. Add operations by .addOperation()'\n )\n }\n if (this.transaction.signatures.length === 0) {\n throw new Error(\n 'Attempted to broadcast a transaction with no signatures. Sign using .sign(keys)'\n )\n }\n try {\n await callRPCBroadcast('condenser_api.broadcast_transaction', [this.transaction])\n } catch (e) {\n if (e instanceof RPCError && e.message.includes('Duplicate transaction check failed')) {\n // ignore duplicate transaction error as this can happen when we retry the broadcast\n } else {\n throw e\n }\n }\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n if (!checkStatus) {\n return { tx_id: this.txId, status: 'unknown' }\n }\n // Poll until the transaction reaches a final state or max attempts exceeded.\n // With 60 attempts: delays grow from 1.3s to 19s, total wait ~10 minutes.\n const maxPollAttempts = 60\n await sleep(1000)\n let status = await this.checkStatus()\n let i = 1\n while (\n status?.status !== 'within_irreversible_block' &&\n status?.status !== 'expired_irreversible' &&\n status?.status !== 'too_old' &&\n i < maxPollAttempts\n ) {\n await sleep(1000 + i * 300)\n status = await this.checkStatus()\n i++\n }\n return {\n tx_id: this.txId,\n status: (status?.status ?? 'unknown') as BroadcastResult['status']\n }\n }\n\n /**\n * Returns the transaction digest containing the transaction ID and hash.\n * The digest can be used to verify signatures and for transaction identification.\n * @returns DigestData containing transaction ID and hash\n * @throws Error if no transaction exists\n */\n digest(): DigestData {\n if (!this.transaction) {\n throw new Error('First create a transaction by .addOperation()')\n }\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n const temp = { ...this.transaction }\n try {\n Serializer.Transaction(buffer, temp)\n } catch (cause) {\n throw new Error('Unable to serialize transaction: ' + cause)\n }\n buffer.flip()\n const transactionData = new Uint8Array(buffer.toBuffer())\n const txId = bytesToHex(sha256(transactionData)).slice(0, 40)\n const digest = sha256(new Uint8Array([...chainId, ...transactionData]))\n return { digest, txId }\n }\n\n /**\n * Adds a signature to an already created transaction. Useful when signing with external tools.\n * Multiple signatures can be added one at a time for multi-signature transactions.\n * @param signature The signature string in hex format (must be exactly 130 characters)\n * @returns The transaction with the added signature\n * @throws Error if no transaction exists or signature format is invalid\n */\n addSignature(signature: string): TransactionType {\n if (!this.transaction) {\n throw new Error('First create a transaction by .create(operations)')\n }\n if (typeof signature !== 'string') {\n throw new Error('Signature must be string')\n }\n if (signature.length !== 130) {\n throw new Error('Signature must be 130 characters long')\n }\n this.transaction.signatures.push(signature)\n return this.transaction\n }\n\n /** Get status of this transaction. Usually called internally after broadcasting. */\n async checkStatus(): Promise {\n if (!this.txId) {\n this.txId = this.digest().txId\n }\n return callRPC('transaction_status_api.find_transaction', {\n transaction_id: this.txId,\n expiration: this.transaction?.expiration\n })\n }\n\n /**\n * Creates the transaction structure and initializes it with blockchain data.\n * Retrieves current head block information and sets up reference block data.\n * @private\n * @param expiration Transaction expiration in milliseconds\n */\n private createTransaction = async (expiration: number) => {\n const props = await callRPC('condenser_api.get_dynamic_global_properties', [])\n const bytes = hexToBytes(props.head_block_id)\n const refBlockPrefix = Number(new Uint32Array(bytes.buffer, bytes.byteOffset + 4, 1)[0])\n const expirationIso = new Date(Date.now() + expiration).toISOString().slice(0, -5)\n this.transaction = {\n expiration: expirationIso,\n extensions: [],\n operations: [],\n ref_block_num: props.head_block_number & 0xffff,\n ref_block_prefix: refBlockPrefix,\n signatures: []\n }\n }\n}\n","import bs58 from 'bs58'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PublicKey } from './PublicKey'\nimport { Signature } from './Signature'\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\n\nexport type KeyRole = 'owner' | 'active' | 'posting' | 'memo'\n\nconst NETWORK_ID = new Uint8Array([0x80])\n\n/**\n * ECDSA (secp256k1) private key for signing and encryption operations.\n * Handles key generation, derivation from seeds/passwords, and cryptographic operations.\n *\n * All private keys are stored internally as Uint8Array and can be converted to/from\n * Wallet Import Format (WIF) strings for storage and transmission.\n *\n * @example\n * ```typescript\n * // From WIF string\n * const key = PrivateKey.from('5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw')\n *\n * // Generate random key\n * const randomKey = PrivateKey.randomKey()\n *\n * // From username and password\n * const loginKey = PrivateKey.fromLogin('username', 'password')\n *\n * // Sign a message\n * const signature = key.sign(someHash)\n *\n * // Get public key\n * const pubKey = key.createPublic()\n * ```\n */\nexport class PrivateKey {\n key: Uint8Array\n\n constructor(key: Uint8Array) {\n this.key = key\n try {\n secp256k1.getPublicKey(key)\n } catch (e) {\n throw new Error('invalid private key')\n }\n }\n\n /**\n * Creates a PrivateKey instance from a WIF string or raw Uint8Array.\n * Automatically detects the input type and uses the appropriate method.\n *\n * @param value - WIF formatted string or raw 32-byte key as Uint8Array\n * @returns New PrivateKey instance\n * @throws Error if the key format is invalid\n */\n static from(value: string | Uint8Array): PrivateKey {\n if (typeof value === 'string') {\n return PrivateKey.fromString(value)\n } else {\n return new PrivateKey(value)\n }\n }\n\n /**\n * Creates a PrivateKey from a Wallet Import Format (WIF) encoded string.\n *\n * @param wif - WIF encoded private key string\n * @returns New PrivateKey instance\n * @throws Error if WIF format is invalid or checksum fails\n */\n static fromString(wif: string): PrivateKey {\n return new PrivateKey(decodePrivate(wif).subarray(1))\n }\n\n /**\n * Creates a PrivateKey from a seed string or Uint8Array.\n * The seed is hashed with SHA256 to produce the private key.\n *\n * @param seed - Seed string (converted to bytes) or raw byte array\n * @returns New PrivateKey instance derived from seed\n */\n static fromSeed(seed: string | Uint8Array): PrivateKey {\n if (typeof seed === 'string') {\n const isHex = /^[0-9a-fA-F]+$/.test(seed)\n if (isHex) {\n seed = hexToBytes(seed)\n } else {\n // Convert non-hex string to Uint8Array using UTF-8 encoding\n // Avoid top-level TextEncoder — not available on all runtimes (e.g. Hermes)\n const bytes: number[] = []\n for (let i = 0; i < seed.length; i++) {\n let c = seed.charCodeAt(i)\n if (c < 0x80) {\n bytes.push(c)\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f))\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < seed.length) {\n const next = seed.charCodeAt(++i)\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff)\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f))\n }\n }\n seed = new Uint8Array(bytes)\n }\n }\n return new PrivateKey(sha256(seed))\n }\n\n /**\n * Derives a PrivateKey from username, password, and role using Hive's key derivation scheme.\n * This generates the same keys that the Hive wallet uses for login-based keys.\n *\n * @param username - Hive username\n * @param password - Master password (or seed phrase)\n * @param role - Key role ('owner', 'active', 'posting', 'memo')\n * @returns New PrivateKey instance for the specified role\n */\n static fromLogin(username: string, password: string, role: KeyRole = 'active'): PrivateKey {\n const seed = username + role + password\n return PrivateKey.fromSeed(seed)\n }\n\n /**\n * Signs a 32-byte message hash using ECDSA and returns a recoverable signature.\n * The signature includes recovery information to allow public key recovery.\n *\n * @param message - 32-byte message hash to sign (Uint8Array)\n * @returns Signature object containing the signature data\n */\n sign(message: Uint8Array): Signature {\n const rv = secp256k1.sign(message, this.key, {\n extraEntropy: true,\n format: 'recovered',\n prehash: false // prehash does sha256 on the message\n })\n const recovery = parseInt(bytesToHex(rv.subarray(0, 1)), 16)\n return Signature.from((recovery + 31).toString(16) + bytesToHex(rv.subarray(1)))\n }\n\n /**\n * Derives the corresponding public key for this private key.\n *\n * @param prefix - Optional address prefix (defaults to config.address_prefix)\n * @returns PublicKey instance derived from this private key\n */\n createPublic(prefix?: string): PublicKey {\n return new PublicKey(secp256k1.getPublicKey(this.key), prefix)\n }\n\n /**\n * Returns the private key as a Wallet Import Format (WIF) encoded string.\n * This includes network ID and checksum for safe storage/transmission.\n *\n * @returns WIF encoded private key string\n */\n toString(): string {\n return encodePrivate(new Uint8Array([...NETWORK_ID, ...this.key]))\n }\n\n /**\n * Returns a masked representation of the private key for debugging/logging.\n * Shows only the first and last 6 characters to avoid accidental exposure.\n * Use toString() to get the full key for export/serialization.\n *\n * @returns Masked key representation for safe logging\n */\n inspect(): string {\n const key = this.toString()\n return `PrivateKey: ${key.slice(0, 6)}...${key.slice(-6)}`\n }\n\n /**\n * Computes a shared secret using ECDH key exchange for memo encryption.\n * The shared secret is used as a key for AES encryption/decryption.\n *\n * @param publicKey - Other party's public key\n * @returns 64-byte shared secret as Uint8Array\n */\n getSharedSecret(publicKey: PublicKey): Uint8Array {\n const s = secp256k1.getSharedSecret(this.key, publicKey.key)\n // strip the parity byte\n return sha512(s.subarray(1))\n }\n\n /**\n * Generates a new cryptographically secure random private key.\n * Uses the secp256k1 key generation algorithm for security.\n * This method may take up to 250ms due to entropy collection.\n *\n * @returns New randomly generated PrivateKey instance\n */\n static randomKey(): PrivateKey {\n return new PrivateKey(secp256k1.keygen().secretKey)\n }\n}\n\nconst doubleSha256 = (input: Uint8Array) => {\n const dbl = sha256(sha256(input))\n return dbl\n}\n\n/** Encode bs58+doubleSha256-checksum private key. */\nconst encodePrivate = (key: Uint8Array) => {\n // assert.equal(key.readUInt8(0), 0x80, 'private key network id mismatch')\n const checksum = doubleSha256(key)\n return bs58.encode(new Uint8Array([...key, ...checksum.slice(0, 4)]))\n}\n\n/** Decode bs58+doubleSha256-checksum encoded private key. */\nconst decodePrivate = (encodedKey: string) => {\n const buffer = bs58.decode(encodedKey)\n if (!isUint8ArrayEqual(buffer.slice(0, 1), NETWORK_ID)) {\n throw new Error('Private key network id mismatch')\n }\n const checksum = buffer.slice(-4)\n const key = buffer.slice(0, -4)\n const checksumVerify = doubleSha256(key).slice(0, 4)\n if (!isUint8ArrayEqual(checksum, checksumVerify)) {\n throw new Error('Private key checksum mismatch')\n }\n return key\n}\n\nconst isUint8ArrayEqual = (a: Uint8Array, b: Uint8Array) => {\n if (a === b) return true\n if (a.byteLength !== b.byteLength) return false\n const len = a.byteLength\n let i = 0\n while (i < len && a[i] === b[i]) i++\n return i === len\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { cbc as AESCBC } from '@noble/ciphers/aes.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256, sha512 } from '@noble/hashes/sha2.js'\nimport { PrivateKey } from './PrivateKey'\nimport { PublicKey } from './PublicKey'\n\nexport const encrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n message: Uint8Array,\n nonce: bigint = uniqueNonce()\n) => crypt(privateKey, publicKey, nonce, message)\n\nexport const decrypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum: number\n): Uint8Array => {\n const d = crypt(privateKey, publicKey, nonce, message, checksum)\n return d.message\n}\n\n/**\n * @arg message - Encrypted or plain text message (see checksum)\n * @arg checksum - shared secret checksum (null to encrypt, non-null to decrypt)\n */\nconst crypt = (\n privateKey: PrivateKey,\n publicKey: PublicKey,\n nonce: bigint,\n message: Uint8Array,\n checksum?: number\n): { nonce: bigint; message: Uint8Array; checksum: number } => {\n const nonceL = nonce\n const S = privateKey.getSharedSecret(publicKey)\n let ebuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n ebuf.writeUint64(nonceL)\n ebuf.append(S)\n ebuf.flip()\n\n const encryptionKey = sha512(new Uint8Array(ebuf.toBuffer()))\n const iv = encryptionKey.subarray(32, 48)\n const tag = encryptionKey.subarray(0, 32)\n\n // check if first 64 bit of sha256 hash treated as uint64_t truncated to 32 bits.\n const check = sha256(encryptionKey).subarray(0, 4)\n const cbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n cbuf.append(check)\n cbuf.flip()\n const check32 = cbuf.readUint32()\n if (checksum !== undefined) {\n if (check32 !== checksum) {\n throw new Error('Invalid key')\n }\n message = cryptoJsDecrypt(message, tag, iv)\n } else {\n message = cryptoJsEncrypt(message, tag, iv)\n }\n return { nonce: nonceL, message, checksum: check32 }\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} ciphertext - binary format\n * @return {Uint8Array} the decrypted message\n */\nconst cryptoJsDecrypt = (message: Uint8Array, tag: Uint8Array, iv: Uint8Array): Uint8Array => {\n let messageBuffer = message\n const decipher = AESCBC(tag, iv)\n messageBuffer = decipher.decrypt(messageBuffer)\n return messageBuffer\n}\n\n/**\n * This method does not use a checksum, the returned data must be validated some other way.\n * @arg {string|Uint8Array} plaintext - binary format\n * @return {Uint8Array} binary\n */\nexport const cryptoJsEncrypt = (\n message: Uint8Array,\n tag: Uint8Array,\n iv: Uint8Array\n): Uint8Array => {\n let messageBuffer = message\n const cipher = AESCBC(tag, iv)\n messageBuffer = cipher.encrypt(messageBuffer)\n return messageBuffer\n}\n\nlet uniqueNonceEntropy: number | null = null\n\nconst uniqueNonce = (): bigint => {\n if (uniqueNonceEntropy === null) {\n const randomPrivateKey = secp256k1.utils.randomSecretKey()\n uniqueNonceEntropy = (randomPrivateKey[0] << 8) | randomPrivateKey[1]\n }\n let long = BigInt(Date.now())\n const entropy = ++uniqueNonceEntropy % 0x10000\n long = (long << BigInt(16)) | BigInt(entropy)\n return long\n}\n","import { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\n\nconst PublicKeyDeserializer = (buf: ByteBuffer) => {\n const c = fixedBuf(buf, 33)\n return new PublicKey(c)\n}\n\nconst UInt64Deserializer = (b: ByteBuffer) => {\n return b.readUint64()\n}\n\nconst UInt32Deserializer = (b: ByteBuffer) => {\n return b.readUint32()\n}\n\nconst BinaryDeserializer = (b: ByteBuffer) => {\n const len = b.readVarint32()\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n}\n\nconst BufferDeserializer = (keyDeserializers: any) => (buf: Uint8Array) => {\n const obj: any = {}\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n buffer.append(buf)\n buffer.flip()\n for (const [key, deserializer] of keyDeserializers) {\n try {\n obj[key] = deserializer(buffer)\n } catch (error: any) {\n error.message = `${key}: ${error.message}`\n throw error\n }\n }\n return obj\n}\n\nfunction fixedBuf(b: ByteBuffer, len: number) {\n if (!b) {\n throw Error('No buffer found on first parameter')\n } else {\n const bCopy = b.copy(b.offset, b.offset + len)\n b.skip(len)\n return new Uint8Array(bCopy.toBuffer())\n }\n}\n\nconst EncryptedMemoDeserializer = BufferDeserializer([\n ['from', PublicKeyDeserializer],\n ['to', PublicKeyDeserializer],\n ['nonce', UInt64Deserializer],\n ['check', UInt32Deserializer],\n ['encrypted', BinaryDeserializer]\n])\n\nexport const Deserializer = {\n Memo: EncryptedMemoDeserializer\n}\n","import bs58 from 'bs58'\nimport { ByteBuffer } from './ByteBuffer'\nimport { Serializer } from './serializer'\nimport { PrivateKey } from './PrivateKey'\nimport * as Aes from './aes'\nimport { PublicKey } from './PublicKey'\nimport { Deserializer } from './deserializer'\n\nexport type Memo = {\n /**\n * Encrypts a memo for secure private messaging\n */\n encode(\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n ): string\n\n /**\n * Decrypts a memo message\n */\n decode(privateKey: string | PrivateKey, memo: string): string\n}\n\n/**\n * Encodes a memo using AES encryption for secure private messaging on Hive.\n * Messages must start with '#' to be encrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Sender's private memo key (string WIF format or PrivateKey instance)\n * @param publicKey - Recipient's public memo key (string or PublicKey instance)\n * @param memo - Message to encrypt (must start with '#' for encryption)\n * @param testNonce - Optional nonce for testing (advanced usage)\n * @returns Encrypted memo string prefixed with '#'\n * @throws Error if encryption is not supported in current environment\n */\nconst encode = (\n privateKey: string | PrivateKey,\n publicKey: string | PublicKey,\n memo: string,\n testNonce?: any\n): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n publicKey = toPublicObj(publicKey)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.writeVString(memo)\n const memoBuffer = new Uint8Array(mbuf.copy(0, mbuf.offset).toBuffer())\n const { nonce, message, checksum } = Aes.encrypt(privateKey, publicKey, memoBuffer, testNonce)\n const mbuf2 = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n Serializer.Memo(mbuf2, {\n check: checksum,\n encrypted: message,\n from: privateKey.createPublic(),\n nonce,\n to: publicKey\n })\n mbuf2.flip()\n const data = new Uint8Array(mbuf2.toBuffer())\n return '#' + bs58.encode(data)\n}\n\n/**\n * Decrypts an encrypted memo using AES decryption.\n * Messages must start with '#' to be decrypted. Plain text messages are returned unchanged.\n *\n * @param privateKey - Recipient's private memo key (string WIF format or PrivateKey instance)\n * @param memo - Encrypted memo string (must start with '#' for decryption)\n * @returns Decrypted memo content with '#' prefix\n * @throws Error if decryption fails or encryption not supported in current environment\n */\nconst decode = (privateKey: string | PrivateKey, memo: string): string => {\n if (!memo.startsWith('#')) {\n return memo\n }\n memo = memo.substring(1)\n checkEncryption()\n privateKey = toPrivateObj(privateKey)\n // memo = bs58.decode(memo)\n let memoBuffer = Deserializer.Memo(bs58.decode(memo))\n const { from, to, nonce, check, encrypted } = memoBuffer\n const pubkey = privateKey.createPublic().toString()\n const otherpub =\n pubkey === new PublicKey(from.key).toString() ? new PublicKey(to.key) : new PublicKey(from.key)\n memoBuffer = Aes.decrypt(privateKey, otherpub, nonce, encrypted, check)\n const mbuf = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n mbuf.append(memoBuffer)\n mbuf.flip()\n return '#' + mbuf.readVString()\n}\n\nlet encodeTest: boolean | undefined\nconst checkEncryption = () => {\n if (encodeTest === undefined) {\n let plaintext\n encodeTest = true // prevent infinate looping\n try {\n const wif = '5JdeC9P7Pbd1uGdFVEsJ41EkEnADbbHGq6p1BwFxm6txNBsQnsw'\n const pubkey = 'STM8m5UgaFAAYQRuaNejYdS8FVLVp9Ss3K1qAVk5de6F8s3HnVbvA'\n const cyphertext = encode(wif, pubkey, '#memo爱')\n plaintext = decode(wif, cyphertext)\n } finally {\n encodeTest = plaintext === '#memo爱'\n }\n }\n if (encodeTest === false) {\n throw new Error('This environment does not support encryption.')\n }\n}\n\nconst toPrivateObj = (o: string | PrivateKey): PrivateKey => {\n if (typeof o === 'string') {\n return PrivateKey.fromString(o)\n } else {\n return o\n }\n}\nconst toPublicObj = (o: string | PublicKey): PublicKey => {\n if (typeof o === 'string') {\n return PublicKey.fromString(o)\n } else {\n return o\n }\n}\n\n/**\n * Memo utilities for encrypting and decrypting private messages between Hive users.\n * Uses AES encryption with ECDH key exchange for secure communication.\n *\n * Messages must start with '#' to be encrypted/decrypted.\n * Plain text messages (without '#') are returned unchanged.\n *\n * @example\n * ```typescript\n * import { Memo, PrivateKey, PublicKey } from 'hive-tx'\n *\n * // Encrypt a message\n * const encrypted = Memo.encode(senderPrivateKey, recipientPublicKey, '#Hello World')\n *\n * // Decrypt a message\n * const decrypted = Memo.decode(recipientPrivateKey, encrypted)\n * console.log(decrypted) // '#Hello World'\n * ```\n */\nexport const Memo = {\n decode,\n encode\n}\n","import { Serializer } from './serializer'\nimport { ByteBuffer } from './ByteBuffer'\nimport { PublicKey } from './PublicKey'\nimport { bytesToHex } from '@noble/hashes/utils.js'\n\nexport interface WitnessProps {\n account_creation_fee?: string\n account_subsidy_budget?: number\n account_subsidy_decay?: number\n key: PublicKey | string\n maximum_block_size?: number\n new_signing_key?: PublicKey | string | null\n hbd_exchange_rate?: { base: string; quote: string }\n hbd_interest_rate?: number\n url?: string\n}\n\n/** Return null for a valid username */\nexport const validateUsername = (username: string): null | string => {\n let suffix = 'Account name should '\n if (!username) {\n return suffix + 'not be empty.'\n }\n const length = username.length\n if (length < 3) {\n return suffix + 'be longer.'\n }\n if (length > 16) {\n return suffix + 'be shorter.'\n }\n if (/\\./.test(username)) {\n suffix = 'Each account segment should '\n }\n const ref = username.split('.')\n const len = ref.length\n for (let i = 0; i < len; i++) {\n const label = ref[i]\n if (!/^[a-z]/.test(label)) {\n return suffix + 'start with a lowercase letter.'\n }\n if (!/^[a-z0-9-]*$/.test(label)) {\n return suffix + 'have only lowercase letters, digits, or dashes.'\n }\n if (!/[a-z0-9]$/.test(label)) {\n return suffix + 'end with a lowercase letter or digit.'\n }\n if (label.length < 3) {\n return suffix + 'be longer.'\n }\n }\n return null\n}\n\nexport const operations = {\n vote: 0,\n comment: 1,\n transfer: 2,\n transfer_to_vesting: 3,\n withdraw_vesting: 4,\n limit_order_create: 5,\n limit_order_cancel: 6,\n feed_publish: 7,\n convert: 8,\n account_create: 9,\n account_update: 10,\n witness_update: 11,\n account_witness_vote: 12,\n account_witness_proxy: 13,\n pow: 14,\n custom: 15,\n report_over_production: 16,\n delete_comment: 17,\n custom_json: 18,\n comment_options: 19,\n set_withdraw_vesting_route: 20,\n limit_order_create2: 21,\n claim_account: 22,\n create_claimed_account: 23,\n request_account_recovery: 24,\n recover_account: 25,\n change_recovery_account: 26,\n escrow_transfer: 27,\n escrow_dispute: 28,\n escrow_release: 29,\n pow2: 30,\n escrow_approve: 31,\n transfer_to_savings: 32,\n transfer_from_savings: 33,\n cancel_transfer_from_savings: 34,\n custom_binary: 35,\n decline_voting_rights: 36,\n reset_account: 37,\n set_reset_account: 38,\n claim_reward_balance: 39,\n delegate_vesting_shares: 40,\n account_create_with_delegation: 41,\n witness_set_properties: 42,\n account_update2: 43,\n create_proposal: 44,\n update_proposal_votes: 45,\n remove_proposal: 46,\n update_proposal: 47,\n collateralized_convert: 48,\n recurrent_transfer: 49,\n // virtual ops\n fill_convert_request: 50,\n author_reward: 51,\n curation_reward: 52,\n comment_reward: 53,\n liquidity_reward: 54,\n interest: 55,\n fill_vesting_withdraw: 56,\n fill_order: 57,\n shutdown_witness: 58,\n fill_transfer_from_savings: 59,\n hardfork: 60,\n comment_payout_update: 61,\n return_vesting_delegation: 62,\n comment_benefactor_reward: 63,\n producer_reward: 64,\n clear_null_account_balance: 65,\n proposal_pay: 66,\n sps_fund: 67,\n hardfork_hive: 68,\n hardfork_hive_restore: 69,\n delayed_voting: 70,\n consolidate_treasury_balance: 71,\n effective_comment_vote: 72,\n ineffective_delete_comment: 73,\n sps_convert: 74,\n expired_account_notification: 75,\n changed_recovery_account: 76,\n transfer_to_vesting_completed: 77,\n pow_reward: 78,\n vesting_shares_split: 79,\n account_created: 80,\n fill_collateralized_convert_request: 81,\n system_warning: 82,\n fill_recurrent_transfer: 83,\n failed_recurrent_transfer: 84,\n limit_order_cancelled: 85,\n producer_missed: 86,\n proposal_fee: 87,\n collateralized_convert_immediate_conversion: 88,\n escrow_approved: 89,\n escrow_rejected: 90,\n proxy_cleared: 91,\n declined_voting_rights: 92\n}\n\n/**\n * Make bitmask filter to be used with get_account_history call\n */\nexport const makeBitMaskFilter = (allowedOperations: number[]): [string | null, string | null] => {\n return allowedOperations\n .reduce(reduceFunction, [BigInt(0), BigInt(0)])\n .map((value: bigint) => (value !== BigInt(0) ? value.toString() : null)) as [string | null, string | null]\n}\nconst reduceFunction = (\n [low, high]: [bigint, bigint],\n allowedOperation: number\n): [bigint, bigint] => {\n if (allowedOperation < 64) {\n return [low | (BigInt(1) << BigInt(allowedOperation)), high]\n } else {\n return [low, high | (BigInt(1) << BigInt(allowedOperation - 64))]\n }\n}\n\nexport const buildWitnessSetProperties = (\n owner: string,\n props: WitnessProps\n): ['witness_set_properties', { extensions: never[]; owner: string; props: any }] => {\n const data = {\n extensions: [],\n owner,\n props: []\n }\n for (const key of Object.keys(props)) {\n if ((props as any)[key] === undefined) continue\n let type\n switch (key) {\n case 'key':\n case 'new_signing_key':\n type = Serializer.PublicKey\n break\n case 'account_subsidy_budget':\n case 'account_subsidy_decay':\n case 'maximum_block_size':\n type = Serializer.UInt32\n break\n case 'hbd_interest_rate':\n type = Serializer.UInt16\n break\n case 'url':\n type = Serializer.String\n break\n case 'hbd_exchange_rate':\n type = Serializer.Price\n break\n case 'account_creation_fee':\n type = Serializer.Asset\n break\n default:\n throw new Error(`Unknown witness prop: ${key}`)\n }\n data.props.push([key, serialize(type, props[key])])\n }\n data.props.sort((a: any, b: any) => a[0].localeCompare(b[0]))\n return ['witness_set_properties', data]\n}\n\nconst serialize = (serializer: any, data: any) => {\n const buffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN)\n serializer(buffer, data)\n buffer.flip()\n // `props` values must be hex\n return bytesToHex(new Uint8Array(buffer.toBuffer()))\n}\n","/**\n * Re-exports hive-tx APIs and provides helper functions that bridge\n * API differences from the legacy dhive library.\n */\n\nimport {\n PrivateKey,\n Transaction,\n callRPCBroadcast,\n type BroadcastResult,\n} from \"../../hive-tx\";\nimport type { Operation, OperationName, OperationBody } from \"../../hive-tx\";\nimport { sha256 as nobleSha256 } from \"@noble/hashes/sha2.js\";\n\n// ── Re-exports ─────────────────────────────────────────────────────────────\n\nexport {\n Transaction as HiveTxTransaction,\n PrivateKey,\n PublicKey,\n Signature,\n Memo,\n config as hiveTxConfig,\n callRPC,\n callRPCBroadcast,\n callREST,\n callWithQuorum,\n utils as hiveTxUtils,\n} from \"../../hive-tx\";\n\nexport type {\n Operation,\n OperationName,\n OperationBody,\n AssetSymbol,\n BroadcastResult,\n AccountCreateOperation,\n CustomJsonOperation,\n // Referenced in ConfigManager.setResilience's public signature — must be\n // nameable from the main entry, not only from @ecency/sdk/hive.\n ResilienceOptions,\n} from \"../../hive-tx\";\n\n// ── Compat types (matching dhive shapes used throughout the codebase) ──────\n\n/** Compatible with dhive's TransactionConfirmation from broadcast_transaction_synchronous */\nexport interface TransactionConfirmation {\n id: string;\n block_num: number;\n trx_num: number;\n expired: boolean;\n}\n\n/** Authority role type used in key management */\nexport type AuthorityType = \"owner\" | \"active\" | \"posting\" | \"memo\";\n\n/** SMT asset format (NAI representation) used in transaction history */\nexport interface SMTAsset {\n amount: string;\n precision: number;\n nai: string;\n}\n\n/** RC account data from rc_api.find_rc_accounts */\nexport interface RCAccount {\n account: string;\n rc_manabar: {\n current_mana: string | number;\n last_update_time: number;\n };\n max_rc: string | number;\n max_rc_creation_adjustment: {\n amount: string;\n precision: number;\n nai: string;\n };\n delegated_rc: number;\n received_delegated_rc: number;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Compute SHA-256 hash of a string or Uint8Array.\n * Drop-in replacement for dhive's `cryptoUtils.sha256()`.\n */\nexport function sha256(input: string | Uint8Array): Uint8Array {\n let data: Uint8Array;\n if (typeof input === \"string\") {\n // Inline UTF-8 encode — avoids TextEncoder which is unavailable on some\n // runtimes (React Native / Hermes).\n const bytes: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let c = input.charCodeAt(i);\n if (c < 0x80) {\n bytes.push(c);\n } else if (c < 0x800) {\n bytes.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < input.length) {\n const next = input.charCodeAt(++i);\n c = 0x10000 + ((c & 0x3ff) << 10) + (next & 0x3ff);\n bytes.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n } else {\n bytes.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n }\n }\n data = new Uint8Array(bytes);\n } else {\n data = input;\n }\n return nobleSha256(data);\n}\n\n/** Check if a string is a valid WIF-encoded private key. */\nexport function isWif(key: string): boolean {\n try {\n PrivateKey.fromString(key);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sign and broadcast operations, returning a dhive-compatible TransactionConfirmation.\n *\n * Uses broadcast_transaction_synchronous so the response includes block_num/trx_num,\n * matching the shape that the rest of the codebase expects from dhive's\n * `client.broadcast.sendOperations()`.\n *\n * @deprecated Prefer {@link broadcastOperationsAsync} (the default for\n * `useBroadcastMutation`); poll `transaction_status_api` if you need block\n * confirmation. Kept only for explicit `broadcastMode: 'sync'` opt-ins.\n */\nexport async function broadcastOperations(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return callRPCBroadcast(\"condenser_api.broadcast_transaction_synchronous\", [\n tx.transaction,\n ]);\n}\n\n/**\n * Sign and broadcast operations without waiting for block inclusion.\n *\n * Uses broadcast_transaction which returns as soon as the node accepts the\n * transaction into its mempool. Transport and RPC errors (network failures,\n * invalid operations, expired transactions) are still thrown immediately -\n * the only thing skipped is the wait for the transaction to appear in a block.\n *\n * Returns { tx_id, status: 'unknown' }. To confirm block inclusion afterward,\n * poll transaction_status_api with the returned tx_id.\n *\n * Prefer this for operations where faster response matters more than\n * immediate confirmation (e.g. votes, reblogs, follows).\n *\n * Use broadcastOperations() when you need block_num/trx_num confirmation\n * (e.g. transfers, account updates, key changes).\n */\nexport async function broadcastOperationsAsync(\n ops: Operation[],\n key: PrivateKey\n): Promise {\n const tx = new Transaction();\n for (const op of ops) {\n await tx.addOperation(\n op[0] as OperationName,\n op[1] as OperationBody\n );\n }\n tx.sign(key);\n return tx.broadcast(false);\n}\n\n// ── Mana calculations (ported from dhive's RCAPI) ──────────────────────────\n\ninterface Manabar {\n current_mana: string | number;\n last_update_time: number;\n}\n\ninterface ManaResult {\n current_mana: number;\n max_mana: number;\n percentage: number;\n}\n\nconst MANA_REGENERATION_SECONDS = 432000; // 5 days\n\nfunction calculateManabar(maxMana: number, manabar: Manabar): ManaResult {\n const delta = Date.now() / 1000 - manabar.last_update_time;\n let currentMana =\n Number(manabar.current_mana) +\n (delta * maxMana) / MANA_REGENERATION_SECONDS;\n let percentage = Math.round((currentMana / maxMana) * 10000);\n if (!isFinite(percentage) || percentage < 0) {\n percentage = 0;\n } else if (percentage > 10000) {\n percentage = 10000;\n }\n return { current_mana: currentMana, max_mana: maxMana, percentage };\n}\n\n/**\n * Get effective vesting shares for an account (matching dhive's getVests).\n * Subtracts delegated, adds received, accounts for pending withdrawals.\n */\nfunction getVests(account: any): number {\n const vests = parseFloat(account.vesting_shares);\n const delegated = parseFloat(account.delegated_vesting_shares);\n const received = parseFloat(account.received_vesting_shares);\n const withdrawRate = parseFloat(account.vesting_withdraw_rate);\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n return vests - withdrawVests - delegated + received;\n}\n\n/** Calculate voting power mana (equivalent to dhive client.rc.calculateVPMana) */\nexport function calculateVPMana(account: any): ManaResult {\n const maxMana = getVests(account) * 1e6;\n return calculateManabar(maxMana, account.voting_manabar);\n}\n\n/** Calculate RC mana (equivalent to dhive client.rc.calculateRCMana) */\nexport function calculateRCMana(rcAccount: RCAccount): ManaResult {\n return calculateManabar(\n Number(rcAccount.max_rc),\n rcAccount.rc_manabar\n );\n}\n\n// setHiveTxNodes and initHiveTx removed — config is now unified.\n// Use hiveTxConfig directly or ConfigManager.setHiveNodes().\n","/**\n * Chain error handling utilities\n * Extracted from web's operations.ts and mobile's dhive.ts error handling patterns\n */\n\nexport enum ErrorType {\n COMMON = \"common\",\n INFO = \"info\",\n INSUFFICIENT_RESOURCE_CREDITS = \"insufficient_resource_credits\",\n MISSING_AUTHORITY = \"missing_authority\",\n TOKEN_EXPIRED = \"token_expired\",\n NETWORK = \"network\",\n TIMEOUT = \"timeout\",\n VALIDATION = \"validation\",\n}\n\nexport interface ParsedChainError {\n message: string;\n type: ErrorType;\n originalError?: any;\n}\n\n/**\n * Parses Hive blockchain errors into standardized format.\n * Extracted from web's operations.ts and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string from a blockchain operation\n * @returns Parsed error with user-friendly message and categorized type\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * const parsed = parseChainError(error);\n * console.log(parsed.message); // \"Insufficient Resource Credits. Please wait or power up.\"\n * console.log(parsed.type); // ErrorType.INSUFFICIENT_RESOURCE_CREDITS\n * }\n * ```\n */\nexport function parseChainError(error: any): ParsedChainError {\n // Extract error strings from various error formats\n // Check both error_description and message independently for pattern matching\n const errorDescription = error?.error_description ? String(error.error_description) : '';\n const errorMessage = error?.message ? String(error.message) : '';\n // HiveSigner throws plain objects like { error: \"unauthorized\", error_description: \"...\" }\n const errorCode = error?.error ? String(error.error) : '';\n const errorString = errorDescription || errorMessage || String(error || '');\n\n // Helper function to test patterns against all error fields\n const testPattern = (pattern: RegExp): boolean => {\n // Check error code first (e.g. HiveSigner's { error: \"unauthorized\" })\n if (errorCode && pattern.test(errorCode)) return true;\n // Check error_description (priority)\n if (errorDescription && pattern.test(errorDescription)) return true;\n // Then check message\n if (errorMessage && pattern.test(errorMessage)) return true;\n // Finally check fallback errorString (handles plain string inputs)\n if (errorString && pattern.test(errorString)) return true;\n return false;\n };\n\n // Resource credits (from both web and mobile patterns)\n if (\n testPattern(/please wait to transact/i) ||\n testPattern(/insufficient rc/i) ||\n testPattern(/rc mana|rc account|resource credits/i)\n ) {\n return {\n message: \"Insufficient Resource Credits. Please wait or power up.\",\n type: ErrorType.INSUFFICIENT_RESOURCE_CREDITS,\n originalError: error,\n };\n }\n\n // Min comment interval (from web operations.ts line 29)\n if (testPattern(/you may only post once every/i)) {\n return {\n message: \"Please wait before posting again (minimum 3 second interval between comments).\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Identical vote (from web operations.ts line 31)\n if (testPattern(/your current vote on this comment is identical/i)) {\n return {\n message: \"You have already voted with the same weight.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Must claim something (from web operations.ts line 33)\n if (testPattern(/must claim something/i)) {\n return {\n message: \"You must claim rewards before performing this action.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot claim that much VESTS (from web operations.ts line 35)\n if (testPattern(/cannot claim that much vests/i)) {\n return {\n message: \"Cannot claim that amount. Please check your pending rewards.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Cannot delete comment with positive votes (from web operations.ts line 42)\n if (testPattern(/cannot delete a comment with net positive/i)) {\n return {\n message: \"Cannot delete a comment with positive votes.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Comment has children (from web operations.ts line 44)\n if (testPattern(/children == 0/i)) {\n return {\n message: \"Cannot delete a comment with replies.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Comment already paid out (from web operations.ts line 46)\n if (testPattern(/comment_cashout/i)) {\n return {\n message: \"Cannot modify a comment that has already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Voting on paid out post (from web operations.ts line 48)\n if (testPattern(/votes evaluating for comment that is paid out is forbidden/i)) {\n return {\n message: \"Cannot vote on posts that have already been paid out.\",\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // No key available (SDK internal - from broadcastWithMethod when key not stored)\n if (testPattern(/no (active|owner|posting|memo) key available/i)) {\n return {\n message: \"Key not available. Please provide your key to sign this operation.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing active authority. Hive nodes return \"missing required active\n // authority\"; web operations.ts also throws the short form. Match both so the\n // auth fallback (auth-upgrade dialog) fires instead of misclassifying as a\n // generic chain error.\n if (testPattern(/missing (required )?active authority/i)) {\n return {\n message: \"Missing active authority. This operation requires your active key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing owner authority (\"missing required owner authority\" or short form)\n if (testPattern(/missing (required )?owner authority/i)) {\n return {\n message: \"Missing owner authority. This operation requires your owner key.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Missing posting authority (general pattern)\n if (testPattern(/missing (required )?posting authority/i)) {\n return {\n message: \"Missing posting authority. Please check your login method.\",\n type: ErrorType.MISSING_AUTHORITY,\n originalError: error,\n };\n }\n\n // Token expired / unauthorized (HiveSigner OAuth2 errors + general patterns)\n // HiveSigner returns: { error: \"invalid_grant\" } for invalid/expired tokens,\n // { error: \"unauthorized_access\" } for IP-based access denial\n if (\n errorCode === 'invalid_grant' ||\n errorCode === 'unauthorized_access' ||\n testPattern(/token expired/i) ||\n testPattern(/invalid token/i) ||\n testPattern(/\\bunauthorized\\b/i) ||\n testPattern(/\\bforbidden\\b/i)\n ) {\n return {\n message: \"Authentication token expired. Please log in again.\",\n type: ErrorType.TOKEN_EXPIRED,\n originalError: error,\n };\n }\n\n // Already reblogged\n if (testPattern(/has already reblogged/i) || testPattern(/already reblogged this post/i)) {\n return {\n message: \"You have already reblogged this post.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Duplicate transaction\n if (testPattern(/duplicate transaction/i)) {\n return {\n message: \"This transaction has already been processed.\",\n type: ErrorType.INFO,\n originalError: error,\n };\n }\n\n // Network errors (more specific patterns to avoid false positives)\n if (\n testPattern(/econnrefused/i) ||\n testPattern(/connection refused/i) ||\n testPattern(/failed to fetch/i) ||\n testPattern(/\\bnetwork[-\\s]?(request|error|timeout|unreachable|down|failed)\\b/i)\n ) {\n return {\n message: \"Network error. Please check your connection and try again.\",\n type: ErrorType.NETWORK,\n originalError: error,\n };\n }\n\n // Timeout errors\n if (testPattern(/timeout/i) || testPattern(/timed out/i)) {\n return {\n message: \"Request timed out. Please try again.\",\n type: ErrorType.TIMEOUT,\n originalError: error,\n };\n }\n\n // Account doesn't exist\n if (testPattern(/account.*does not exist/i) || testPattern(/account not found/i)) {\n return {\n message: \"Account not found. Please check the username.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Invalid memo key\n if (testPattern(/invalid memo key/i)) {\n return {\n message: \"Invalid memo key. Cannot encrypt message.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Insufficient funds (require both words in same string to avoid cross-field false positives)\n if (testPattern(/(?:insufficient.*(?:funds|balance)|(?:funds|balance).*insufficient)/i)) {\n return {\n message: \"Insufficient funds for this transaction.\",\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Generic validation errors (use word boundaries to be more specific)\n if (testPattern(/\\b(invalid|validation)\\b/i)) {\n // Truncate to 150 chars like other branches\n const message = (error?.message || errorString).substring(0, 150) || \"Validation error occurred\";\n return {\n message,\n type: ErrorType.VALIDATION,\n originalError: error,\n };\n }\n\n // Default: return original error message\n // Check for error_description first (from web operations.ts line 65-72)\n if (error?.error_description && typeof error.error_description === \"string\") {\n return {\n message: error.error_description.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Then check message field\n if (error?.message && typeof error.message === \"string\") {\n return {\n message: error.message.substring(0, 150),\n type: ErrorType.COMMON,\n originalError: error,\n };\n }\n\n // Handle plain objects without message property (avoid \"[object Object]\")\n let message: string;\n if (typeof error === 'object' && error !== null) {\n // Check for common error properties\n if (error.error_description) {\n message = String(error.error_description);\n } else if (error.code) {\n message = `Error code: ${error.code}`;\n } else if (errorString && errorString !== '[object Object]') {\n message = errorString.substring(0, 150);\n } else {\n message = \"Unknown error occurred\";\n }\n } else {\n message = errorString.substring(0, 150) || \"Unknown error occurred\";\n }\n\n return {\n message,\n type: ErrorType.COMMON,\n originalError: error,\n };\n}\n\n/**\n * Formats error for display to user.\n * Returns tuple of [message, type] for backward compatibility with existing code.\n *\n * This function maintains compatibility with the old formatError signature from\n * web's operations.ts (line 59-84) and mobile's dhive.ts error handling.\n *\n * @param error - The error object or string\n * @returns Tuple of [user-friendly message, error type]\n *\n * @example\n * ```typescript\n * try {\n * await transfer(...);\n * } catch (error) {\n * const [message, type] = formatError(error);\n * showToast(message, type);\n * }\n * ```\n */\nexport function formatError(error: any): [string, ErrorType] {\n const parsed = parseChainError(error);\n return [parsed.message, parsed.type];\n}\n\n/**\n * Checks if error indicates missing authority and should trigger auth fallback.\n * Used by the SDK's useBroadcastMutation to determine if it should retry with\n * an alternate authentication method.\n *\n * @param error - The error object or string\n * @returns true if auth fallback should be attempted\n *\n * @example\n * ```typescript\n * try {\n * await broadcast(operations);\n * } catch (error) {\n * if (shouldTriggerAuthFallback(error)) {\n * // Try with alternate auth method\n * await broadcastWithHiveAuth(operations);\n * }\n * }\n * ```\n */\nexport function shouldTriggerAuthFallback(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.MISSING_AUTHORITY || type === ErrorType.TOKEN_EXPIRED;\n}\n\n/**\n * Checks if error is a resource credits (RC) error.\n * Useful for showing specific UI feedback about RC issues.\n *\n * @param error - The error object or string\n * @returns true if the error is related to insufficient RC\n *\n * @example\n * ```typescript\n * try {\n * await vote(...);\n * } catch (error) {\n * if (isResourceCreditsError(error)) {\n * showRCWarning(); // Show specific RC education/power up UI\n * }\n * }\n * ```\n */\nexport function isResourceCreditsError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INSUFFICIENT_RESOURCE_CREDITS;\n}\n\n/**\n * Checks if error is informational (not critical).\n * Informational errors typically don't need retry logic.\n *\n * @param error - The error object or string\n * @returns true if the error is informational\n */\nexport function isInfoError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.INFO;\n}\n\n/**\n * Checks if error is network-related and should be retried.\n *\n * @param error - The error object or string\n * @returns true if the error is network-related\n */\nexport function isNetworkError(error: any): boolean {\n const { type } = parseChainError(error);\n return type === ErrorType.NETWORK || type === ErrorType.TIMEOUT;\n}\n","import {\n useMutation,\n type MutationKey,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { PrivateKey, RPCError } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { broadcastOperations, broadcastOperationsAsync, type TransactionConfirmation } from \"@/modules/core/hive-tx\";\nimport type { BroadcastResult } from \"../../../hive-tx\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { shouldTriggerAuthFallback } from \"@/modules/core/errors\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport hs from \"hivesigner\";\n\n/**\n * Broadcast mode controls whether the SDK waits for block inclusion.\n *\n * - `'async'` (default): Uses `broadcast_transaction` — returns once the node\n * accepts the transaction into its mempool. Transport and RPC errors are\n * still thrown immediately; only the block-inclusion wait is skipped.\n *\n * - `'sync'`: Uses `broadcast_transaction_synchronous` — waits for block\n * inclusion and returns `block_num`/`trx_num`. Deprecated; prefer `'async'`\n * and poll `transaction_status_api` if you need block confirmation.\n */\nexport type BroadcastMode = 'sync' | 'async';\n\n/**\n * Broadcasts operations using a specific auth method.\n *\n * @param method - Auth method to use ('key', 'hiveauth', 'hivesigner', 'keychain', 'custom')\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and configuration\n * @param authority - Key authority to use (posting, active, owner, or memo)\n * @param fetchedKey - Optional pre-fetched key to avoid duplicate fetches\n * @param fetchedToken - Optional pre-fetched access token to avoid duplicate fetches\n * @param broadcastMode - Whether to wait for block inclusion ('sync') or just mempool acceptance ('async')\n * @returns Transaction confirmation from the blockchain\n * @throws Error if method is not available or broadcast fails\n */\nasync function broadcastWithMethod(\n method: string,\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n fetchedKey?: string | null,\n fetchedToken?: string | null,\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n switch (method) {\n case 'key': {\n if (!adapter) {\n throw new Error('No adapter provided for key-based auth');\n }\n\n // Use pre-fetched key if provided, otherwise fetch it\n let key: string | null | undefined = fetchedKey;\n\n if (key === undefined) {\n // Key not pre-fetched, fetch it now based on authority\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n } else {\n throw new Error(\n `Owner key not supported by adapter. Owner operations (like account recovery) ` +\n `require master password login or manual key entry.`\n );\n }\n break;\n\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n } else {\n throw new Error(\n `Memo key not supported by adapter. Use memo encryption methods instead.`\n );\n }\n break;\n\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n }\n\n if (!key) {\n throw new Error(`No ${authority} key available for ${username}`);\n }\n\n // Attempt broadcast with key\n const privateKey = PrivateKey.fromString(key);\n if (broadcastMode === 'async') {\n return await broadcastOperationsAsync(ops, privateKey);\n }\n return await broadcastOperations(ops, privateKey);\n }\n\n case 'hiveauth': {\n if (!adapter?.broadcastWithHiveAuth) {\n throw new Error('HiveAuth not supported by adapter');\n }\n return await adapter.broadcastWithHiveAuth(username, ops, authority);\n }\n\n case 'hivesigner': {\n if (!adapter) {\n throw new Error('No adapter provided for HiveSigner auth');\n }\n\n // Access tokens only have posting authority — for active/owner/memo ops,\n // go directly to platform-specific HiveSigner broadcast (e.g., redirect to hivesigner.com)\n if (authority !== 'posting') {\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw new Error(`HiveSigner access token cannot sign ${authority} operations. No platform broadcast available.`);\n }\n\n // Try direct API broadcast with access token first (posting ops only)\n const token = fetchedToken !== undefined\n ? fetchedToken\n : await adapter.getAccessToken(username);\n\n if (token) {\n try {\n const client = new hs.Client({ accessToken: token });\n const response = await client.broadcast(ops);\n return response.result;\n } catch (tokenError) {\n // Token broadcast failed — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner && shouldTriggerAuthFallback(tokenError)) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n throw tokenError;\n }\n }\n\n // No token available — try platform-specific HiveSigner broadcast\n if (adapter.broadcastWithHiveSigner) {\n return await adapter.broadcastWithHiveSigner(username, ops, authority);\n }\n\n throw new Error(`No access token available for ${username}`);\n }\n\n case 'keychain': {\n if (!adapter?.broadcastWithKeychain) {\n throw new Error('Keychain not supported by adapter');\n }\n return await adapter.broadcastWithKeychain(username, ops, authority);\n }\n\n case 'custom': {\n if (!auth?.broadcast) {\n throw new Error('No custom broadcast function provided');\n }\n return (await auth.broadcast(ops, authority)) as TransactionConfirmation;\n }\n\n default:\n throw new Error(`Unknown auth method: ${method}`);\n }\n}\n\n/**\n * Attempts to broadcast operations using multiple auth methods in fallback chain.\n * Implements sophisticated fallback pattern from mobile app.\n *\n * @param username - Hive username to broadcast for\n * @param ops - Operations to broadcast\n * @param auth - AuthContextV2 with adapter and fallback configuration\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n * @returns Transaction confirmation from the blockchain\n * @throws Error if all auth methods fail or if a non-auth error occurs\n *\n * @remarks\n * **Preferred Behavior (when adapter.getLoginType exists):**\n * - Calls adapter.getLoginType() to determine user's actual auth method\n * - Uses ONLY that method (no fallbacks) - more predictable and faster\n * - If it fails, throws the error immediately\n *\n * **Fallback Behavior (for backward compatibility):**\n * - Tries each auth method in the fallback chain order\n * - Only continues to next method if error is auth-related (missing authority, token expired)\n * - Stops immediately for non-auth errors (RC exhaustion, network errors, validation errors)\n * - Collects all errors and provides detailed failure message\n *\n * @example\n * ```typescript\n * // Preferred: Adapter with getLoginType (single method, no fallbacks)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter, // includes getLoginType()\n * };\n *\n * // Legacy: Explicit fallback chain (tries multiple methods)\n * const auth: AuthContextV2 = {\n * adapter: myAdapter,\n * fallbackChain: ['key', 'hiveauth', 'hivesigner'],\n * };\n * ```\n */\nasync function broadcastWithFallback(\n username: string,\n ops: Operation[],\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n broadcastMode: BroadcastMode = 'async'\n): Promise {\n const adapter = auth?.adapter;\n\n // PREFERRED APPROACH: If adapter provides getLoginType, use smart auth strategy\n // This avoids unnecessary fallback attempts and is more predictable\n if (adapter?.getLoginType) {\n const loginType = await adapter.getLoginType(username, authority);\n\n if (loginType) {\n // SMART AUTH STRATEGY: Optimize based on login type + authority + credentials\n\n // Check if user has granted ecency.app posting authority\n const hasPostingAuth = adapter.hasPostingAuthorization\n ? await adapter.hasPostingAuthorization(username)\n : false;\n\n // OPTIMIZATION: Use HiveSigner token for posting ops when posting auth is granted\n // This is faster than direct key signing or HiveAuth for key-based logins\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'key'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to direct key signing if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to key:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for keychain/MetaMask users with posting auth (faster, no popup)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'keychain'\n ) {\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n console.warn('[SDK] HiveSigner token auth failed, falling back to keychain/snap:', error);\n }\n }\n\n // OPTIMIZATION: Use HiveSigner token for HiveAuth users with posting auth (faster)\n if (\n authority === 'posting' &&\n hasPostingAuth &&\n loginType === 'hiveauth'\n ) {\n try {\n // Try HiveSigner API first (faster)\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Only fallback if this is an auth-related error\n // Otherwise, rethrow the original error (e.g., network errors, validation errors)\n if (!shouldTriggerAuthFallback(error)) {\n throw error;\n }\n // Fallback to HiveAuth if token auth method fails\n console.warn('[SDK] HiveSigner token auth failed, falling back to HiveAuth:', error);\n }\n }\n\n // Use user's actual login method\n try {\n return await broadcastWithMethod(loginType, username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (error) {\n // Check if error is due to missing authority (e.g., posting key trying active op)\n if (shouldTriggerAuthFallback(error)) {\n // Show auth upgrade UI if available (only for posting/active operations)\n if (\n adapter.showAuthUpgradeUI &&\n (authority === 'posting' || authority === 'active')\n ) {\n // Guard against empty operations array\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n\n // User selected a specific method - delegate to broadcastWithMethod\n // This handles all auth methods (hiveauth, hivesigner, key, keychain, custom, etc.)\n // broadcastWithMethod already contains all necessary validation and method-specific logic\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // Not an auth error, or no upgrade UI available - throw original error\n throw error;\n }\n }\n\n // loginType is null — user's auth method is unknown (e.g., incomplete login data)\n if (authority === 'posting') {\n // For posting ops, try HiveSigner — access token is usually available for all logins\n try {\n return await broadcastWithMethod('hivesigner', username, ops, auth, authority, undefined, undefined, broadcastMode);\n } catch (hsError) {\n if (shouldTriggerAuthFallback(hsError) && adapter.showAuthUpgradeUI) {\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`No login type available for ${username}. Please log in again.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n throw hsError;\n }\n } else if (authority === 'active' && adapter.showAuthUpgradeUI) {\n // For active ops, show auth upgrade dialog — no silent fallback possible\n const operationName = ops.length > 0 ? ops[0][0] : 'unknown';\n const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);\n if (!selectedMethod) {\n throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);\n }\n return await broadcastWithMethod(selectedMethod, username, ops, auth, authority, undefined, undefined, broadcastMode);\n }\n }\n\n // FALLBACK APPROACH: For backward compatibility, use fallback chain\n // This is only used if adapter doesn't provide getLoginType\n const chain = auth?.fallbackChain ?? ['key', 'hiveauth', 'hivesigner', 'keychain', 'custom'];\n const errors: Map = new Map();\n\n for (const method of chain) {\n try {\n // Check if method is available before attempting\n let shouldSkip = false;\n let skipReason = '';\n let prefetchedKey: string | null | undefined;\n let prefetchedToken: string | null | undefined;\n\n switch (method) {\n case 'key':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch key to check availability (will be reused in broadcast)\n let key: string | null | undefined;\n\n switch (authority) {\n case 'owner':\n if (adapter.getOwnerKey) {\n key = await adapter.getOwnerKey(username);\n }\n break;\n case 'active':\n if (adapter.getActiveKey) {\n key = await adapter.getActiveKey(username);\n }\n break;\n case 'memo':\n if (adapter.getMemoKey) {\n key = await adapter.getMemoKey(username);\n }\n break;\n case 'posting':\n default:\n key = await adapter.getPostingKey(username);\n break;\n }\n\n if (!key) {\n shouldSkip = true;\n skipReason = `No ${authority} key available`;\n } else {\n prefetchedKey = key; // Store for reuse\n }\n }\n break;\n case 'hiveauth':\n if (!adapter?.broadcastWithHiveAuth) {\n shouldSkip = true;\n skipReason = 'HiveAuth not supported by adapter';\n }\n break;\n case 'hivesigner':\n if (!adapter) {\n shouldSkip = true;\n skipReason = 'No adapter provided';\n } else {\n // Pre-fetch token if available (will be reused in broadcast)\n const token = await adapter.getAccessToken(username);\n if (token) {\n prefetchedToken = token; // Store for reuse\n }\n // When no token but adapter exists, don't skip —\n // broadcastWithMethod can fall back to adapter.broadcastWithHiveSigner\n }\n break;\n case 'keychain':\n if (!adapter?.broadcastWithKeychain) {\n shouldSkip = true;\n skipReason = 'Keychain not supported by adapter';\n }\n break;\n case 'custom':\n if (!auth?.broadcast) {\n shouldSkip = true;\n skipReason = 'No custom broadcast function provided';\n }\n break;\n }\n\n if (shouldSkip) {\n errors.set(method, new Error(`Skipped: ${skipReason}`));\n continue;\n }\n\n // Method is available, attempt broadcast with pre-fetched credentials\n return await broadcastWithMethod(method, username, ops, auth, authority, prefetchedKey, prefetchedToken, broadcastMode);\n } catch (error) {\n // Record actual error from failed broadcast attempt\n errors.set(method, error as Error);\n\n // Only continue fallback if error suggests trying another method\n if (!shouldTriggerAuthFallback(error)) {\n // If it's not an auth error, throw immediately (e.g., RC error, network error)\n throw error;\n }\n }\n }\n\n // FIX #2: Improved error message distinguishes between skips and real failures\n const hasRealAttempts = Array.from(errors.values()).some(\n error => !error.message.startsWith('Skipped:')\n );\n\n if (!hasRealAttempts) {\n // All methods were skipped (none attempted)\n const skipReasons = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n throw new Error(\n `[SDK][Broadcast] No auth methods attempted for ${username}. ${skipReasons}`\n );\n }\n\n // At least one method was attempted but all failed\n const errorMessages = Array.from(errors.entries())\n .map(([method, error]) => `${method}: ${error.message}`)\n .join(', ');\n\n throw new Error(\n `[SDK][Broadcast] All auth methods failed for ${username}. Errors: ${errorMessages}`\n );\n}\n\n/**\n * React Query mutation hook for broadcasting Hive operations.\n * Supports multiple authentication methods with automatic fallback.\n *\n * @template T - Type of the mutation payload\n * @param mutationKey - React Query mutation key for cache management\n * @param username - Hive username (required for broadcast)\n * @param operations - Function that converts payload to Hive operations\n * @param onSuccess - Success callback after broadcast completes\n * @param auth - Authentication context (supports both legacy AuthContext and new AuthContextV2)\n * @param authority - Key authority to use ('posting' | 'active' | 'owner' | 'memo'), defaults to 'posting'\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Authentication Flow:**\n *\n * 1. **With AuthContextV2 + adapter + enableFallback** (recommended for new code):\n * - Tries auth methods in fallbackChain order\n * - Smart fallback: only retries on auth errors, not RC/network errors\n * - Uses platform adapter for storage, UI, and broadcasting\n *\n * 2. **With legacy AuthContext** (backward compatible):\n * - Tries auth.broadcast() first (custom implementation)\n * - Falls back to postingKey if available\n * - Falls back to accessToken (HiveSigner) if available\n * - Throws if no auth method available\n *\n * **Backward Compatibility:**\n * - All existing code using AuthContext will continue to work\n * - AuthContextV2 extends AuthContext, so it's a drop-in replacement\n * - enableFallback defaults to false if no adapter provided\n *\n * @example\n * ```typescript\n * // New pattern with platform adapter and fallback\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * },\n * 'posting'\n * );\n *\n * // Legacy pattern (still works)\n * const mutation = useBroadcastMutation(\n * ['vote'],\n * username,\n * (payload) => [voteOperation(payload)],\n * () => console.log('Success!'),\n * { postingKey: 'wif-key' }\n * );\n * ```\n */\nexport function useBroadcastMutation(\n mutationKey: MutationKey = [],\n username: string | undefined,\n operations: (payload: T) => Operation[],\n onSuccess: UseMutationOptions[\"onSuccess\"] = () => {},\n auth?: AuthContextV2,\n authority: AuthorityLevel = 'posting',\n options?: {\n onMutate?: UseMutationOptions[\"onMutate\"];\n onError?: UseMutationOptions[\"onError\"];\n onSettled?: UseMutationOptions[\"onSettled\"];\n /**\n * Controls whether to wait for block inclusion or just mempool acceptance.\n *\n * - `'async'` (default): Returns after mempool acceptance. Recommended for\n * all operations; errors are still thrown immediately.\n *\n * - `'sync'`: Waits for block inclusion, returns block_num/trx_num.\n * Deprecated; prefer `'async'`.\n */\n broadcastMode?: BroadcastMode;\n }\n) {\n const broadcastMode = options?.broadcastMode ?? 'async';\n\n return useMutation({\n onSuccess,\n onMutate: options?.onMutate,\n onError: options?.onError,\n onSettled: options?.onSettled,\n mutationKey: [...mutationKey, username],\n mutationFn: async (payload: T) => {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n\n const ops = operations(payload);\n\n try {\n // New: Try auth methods in fallback chain (if enabled)\n if (auth?.enableFallback !== false && auth?.adapter) {\n return await broadcastWithFallback(username, ops, auth, authority, broadcastMode);\n }\n\n // Legacy behavior: try methods in fixed order (backward compatible)\n if (auth?.broadcast) {\n return await auth.broadcast(ops, authority);\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n // Legacy auth only supports posting authority\n if (authority !== 'posting') {\n throw new Error(\n `[SDK][Broadcast] Legacy auth only supports posting authority, but '${authority}' was requested. ` +\n `Use AuthContextV2 with an adapter for ${authority} operations.`\n );\n }\n\n const privateKey = PrivateKey.fromString(postingKey);\n\n return await broadcastOperations(\n ops,\n privateKey\n );\n }\n\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const client = new hs.Client({ accessToken });\n const response = await client.broadcast(ops);\n return response.result;\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n } catch (e) {\n if (e instanceof RPCError) {\n // Normalize raw blockchain rejections (missing authority, RC exhaustion,\n // validation failures) from every broadcast path — sync and async — into\n // a plain Error whose message is preserved for downstream classification\n // (formatError), so React Query captures a handled mutation error.\n throw new Error(e.message);\n }\n throw e\n }\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\nimport hs from \"hivesigner\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport async function broadcastJson(\n username: string | undefined,\n id: string,\n payload: T,\n auth?: AuthContextV2\n) {\n if (!username) {\n throw new Error(\n \"[Core][Broadcast] Attempted to call broadcast API with anon user\"\n );\n }\n const jjson = {\n id,\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify(payload),\n };\n\n if (auth?.broadcast) {\n return auth.broadcast([[\"custom_json\", jjson]], \"posting\");\n }\n\n const postingKey = auth?.postingKey;\n if (postingKey) {\n const privateKey = PrivateKey.fromString(postingKey);\n\n return broadcastOperations(\n [[\"custom_json\", jjson]],\n privateKey\n );\n }\n\n // With hivesigner access token\n const accessToken = auth?.accessToken;\n if (accessToken) {\n const response = await new hs.Client({\n accessToken,\n }).customJson([], [username], id, JSON.stringify(payload));\n return response.result;\n }\n\n /*\n * Adapter, as a last resort rather than first.\n *\n * `auth.broadcast` above is the deprecated V1 field, and an AuthContextV2\n * does not carry it, so a Keychain user whose posting key is not stored and\n * who has no HiveSigner token reached the throw below instead of being asked\n * to sign. The web app passes V2 everywhere (`getSdkAuthContext`), so this is\n * reachable today from follow and unfollow.\n *\n * Placed last on purpose: every branch above already works for the sessions\n * that reach it, and reordering would change which method signs for people\n * it currently serves. This only claims cases that were previously errors.\n */\n const adapter = auth?.adapter;\n if (adapter) {\n const ops: Parameters>[1] =\n [[\"custom_json\", jjson]];\n\n if (auth?.loginType === \"keychain\" && adapter.broadcastWithKeychain) {\n return adapter.broadcastWithKeychain(username, ops, \"posting\");\n }\n if (auth?.loginType === \"hiveauth\" && adapter.broadcastWithHiveAuth) {\n return adapter.broadcastWithHiveAuth(username, ops, \"posting\");\n }\n }\n\n throw new Error(\n \"[SDK][Broadcast] – cannot broadcast w/o posting key or token\"\n );\n}\n","import type { BroadcastMode } from \"./use-broadcast-mutation\";\nimport type { PlatformAdapter } from \"@/modules/core/types\";\n\n/**\n * Delay (ms) before invalidating chain-derived queries after an async\n * broadcast. ~1.3 Hive blocks (3s/block) so the just-broadcast transaction has\n * landed in a block before we refetch — otherwise the refetch returns pre-tx\n * state (e.g. a stale wallet balance).\n */\nexport const BROADCAST_INCLUSION_DELAY_MS = 4000;\n\n/**\n * Invalidate queries after a broadcast, accounting for broadcast mode.\n *\n * - `'sync'`: the transaction already waited for block inclusion, so refetch\n * immediately (returns the adapter's promise so callers may await it).\n * - `'async'` (default) / undefined: the transaction is only in the mempool, so\n * a refetch now would read pre-tx state — defer by ~1 block.\n *\n * No-ops when the adapter can't invalidate.\n */\nexport function invalidateAfterBroadcast(\n adapter: PlatformAdapter | null | undefined,\n broadcastMode: BroadcastMode | undefined,\n keys: any[][]\n): void | Promise {\n if (!adapter?.invalidateQueries) return;\n if (broadcastMode === \"sync\") {\n // Method call (not an extracted reference) so `this` stays bound to adapter.\n return adapter.invalidateQueries(keys);\n }\n setTimeout(() => adapter.invalidateQueries?.(keys), BROADCAST_INCLUSION_DELAY_MS);\n}\n","export function withTimeoutSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n if (!signal) return timeoutSignal;\n\n // AbortSignal.any is available in Chrome 116+, Safari 17.4+, Firefox 124+.\n // Fall back to manual AbortController wiring for older browsers.\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any([signal, timeoutSignal]);\n }\n\n const ac = new AbortController();\n const onAbort = () => {\n const reason = signal.aborted ? signal.reason : timeoutSignal.reason;\n ac.abort(reason);\n signal.removeEventListener(\"abort\", onAbort);\n timeoutSignal.removeEventListener(\"abort\", onAbort);\n };\n if (signal.aborted) {\n ac.abort(signal.reason);\n } else if (timeoutSignal.aborted) {\n ac.abort(timeoutSignal.reason);\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n timeoutSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n return ac.signal;\n}\n","import { QueryClient } from \"@tanstack/react-query\";\nimport {\n config as hiveTxConfig,\n setNodes as setHiveTxNodes,\n setRestNodes as setHiveTxRestNodes,\n setRestNodesByApi as setHiveTxRestNodesByApi,\n setUserAgent as setHiveTxUserAgent,\n setResilience as setHiveTxResilience,\n type ResilienceOptions,\n} from \"../../hive-tx\";\nimport type { APIMethods } from \"../../hive-tx/api-types\";\n\n// Safe environment variable access for browser builds\n// In browser builds, tsup will replace process.env.* with literal values at compile time\nconst isDevelopment = (() => {\n try {\n return process.env?.NODE_ENV === 'development';\n } catch {\n return false;\n }\n})();\n\nconst getHeliusApiKey = () => {\n try {\n return process.env?.VITE_HELIUS_API_KEY;\n } catch {\n return undefined;\n }\n};\n\n/** Timeout for internal API calls (search, private API). */\nexport const INTERNAL_API_TIMEOUT_MS = 10_000;\n\n/**\n * Ceiling on `gcTime` for any query that runs during SSR.\n *\n * A long window is fine in a browser or native app, where the cache holds one\n * user's data and lives as long as the session. It is not fine in a server\n * renderer: every query schedules a gc timer, a pending timer is a GC root, and\n * `Query` holds the whole `QueryCache` — so one long-lived entry keeps\n * everything else that request cached reachable for its entire window. A server\n * process then settles at roughly `ingest rate × gcTime`, which is how\n * ecency.com's renderers ended up aborting on the old-space cap rather than\n * levelling off (2026-07-26).\n *\n * Two minutes is far longer than any single render, which is the only window a\n * server-side entry has to be reused before it is dehydrated into the payload.\n *\n * Note this bounds SDK queries at the source. `apps/web` additionally clamps\n * every query through `defaultQueryOptions`, which is what protects it from\n * options defined outside the SDK; hosts that do not clamp get the right\n * behaviour from these defaults alone.\n */\nexport const SERVER_GC_TIME_MS = 2 * 60 * 1000;\n\n/**\n * How `CONFIG.queryClient` is resolved.\n *\n * This used to be a plain `queryClient: new QueryClient()` property — a single\n * instance created at module import and shared by every caller for the lifetime\n * of the process. That is correct in a browser (one process, one user) but wrong\n * under SSR, where one process serves every request: each server render wrote its\n * fetched data into that one cache and nothing ever removed it, so the heap grew\n * monotonically until the renderer hit its old-space limit and aborted.\n *\n * A host that renders on the server registers a resolver (see\n * `ConfigManager.setQueryClientResolver`) which returns the *current request's*\n * client, so cached data dies with the request that produced it. Hosts that\n * genuinely want one long-lived client keep using `setQueryClient`, and callers\n * that configure nothing fall back to a lazily created instance.\n *\n * The resolver is consulted on every read rather than cached here on purpose:\n * request scoping is the host's concern, and only the host can know when one\n * request ends and the next begins.\n */\nlet queryClientResolver: (() => QueryClient) | undefined;\n\n/** Created on first use, and only when no resolver has been registered. */\nlet fallbackQueryClient: QueryClient | undefined;\n\nfunction resolveQueryClient(): QueryClient {\n if (queryClientResolver) {\n return queryClientResolver();\n }\n return (fallbackQueryClient ??= new QueryClient());\n}\n\nexport const CONFIG = {\n privateApiHost: \"https://ecency.com\",\n /**\n * Observer used for bridge calls when nobody is logged in. The bridge applies\n * this account's mute list to the response, marking muted authors' posts and\n * comments `stats.gray` so clients can dim or collapse them. Anonymous\n * visitors therefore inherit Ecency's moderation instead of seeing an\n * unfiltered firehose. Apps may override via `ConfigManager.setDefaultObserver`,\n * which expects a real account rather than \"\" (see that setter).\n *\n * Note this only *marks* content: the bridge still returns muted authors'\n * posts, so an observer never shortens a feed.\n */\n defaultObserver: \"ecency\",\n /**\n * First-party client identifier sent as the `X-Ecency-Client` header on\n * search/private API requests. Lets the origin distinguish Ecency's own\n * web/mobile/SSR traffic from third-party integrators (who should use the\n * keyed api.hivesearcher.com backend instead of the public proxy). This is\n * a routing marker, not a secret. Apps may override via\n * `ConfigManager.setClientId` (e.g. \"web\" or \"mobile\") for observability.\n */\n clientId: \"ecency-sdk\",\n imageHost: \"https://i.ecency.com\",\n /** Current Hive RPC nodes. Reads from the unified hive-tx config. */\n get hiveNodes(): string[] {\n return hiveTxConfig.nodes;\n },\n heliusApiKey: getHeliusApiKey(),\n /**\n * The React Query client all SDK code reads through `getQueryClient()`.\n * Backed by a resolver so an SSR host can scope it per request — see the\n * `queryClientResolver` note above. Assigning replaces the resolver with one\n * that always returns the assigned client, preserving the previous\n * \"one client, set once\" behaviour for browser and native hosts.\n */\n get queryClient(): QueryClient {\n return resolveQueryClient();\n },\n set queryClient(client: QueryClient) {\n queryClientResolver = () => client;\n },\n pollsApiHost: \"https://poll.ecency.com\",\n plausibleHost: \"https://pl.ecency.com\",\n // DMCA filtering - can be configured by the app\n dmcaAccounts: [] as string[],\n dmcaTags: [] as string[],\n dmcaPatterns: [] as string[],\n // Pre-compiled regex patterns for performance and security\n dmcaTagRegexes: [] as RegExp[],\n dmcaPatternRegexes: [] as RegExp[],\n // Track if DMCA has been initialized to avoid duplicate logs\n _dmcaInitialized: false,\n};\n\ntype DmcaListsInput = {\n accounts?: string[];\n tags?: string[];\n posts?: string[];\n};\n\nexport namespace ConfigManager {\n export function setQueryClient(client: QueryClient) {\n CONFIG.queryClient = client;\n }\n\n /**\n * Register how the SDK should obtain its React Query client, for hosts where\n * a single shared instance is wrong — principally SSR, where one process\n * serves many requests and a shared cache both leaks memory and risks serving\n * one request's data to another.\n *\n * `resolve` is called on every SDK cache access and should return the client\n * belonging to the request currently being handled. In a Next.js App Router\n * host that means wrapping the factory in React's `cache()`, which memoises\n * per request:\n *\n * ```ts\n * ConfigManager.setQueryClientResolver(() => getQueryClient());\n * ```\n *\n * Registering a resolver supersedes any client previously passed to\n * `setQueryClient`; assigning a client afterwards supersedes the resolver.\n */\n export function setQueryClientResolver(resolve: () => QueryClient) {\n queryClientResolver = resolve;\n }\n\n /**\n * Set the private API host\n * @param host - The private API host URL (e.g., \"https://ecency.com\" or \"\" for relative URLs)\n */\n export function setPrivateApiHost(host: string) {\n CONFIG.privateApiHost = host;\n }\n\n /**\n * Set the first-party client identifier sent as the `X-Ecency-Client` header\n * on search/private API requests (e.g. \"web\" or \"mobile\"). Defaults to\n * \"ecency-sdk\". Used by the origin to tell Ecency's own apps apart from\n * third-party integrators.\n * @param clientId - Short client label\n */\n export function setClientId(clientId: string) {\n CONFIG.clientId = clientId;\n }\n\n /**\n * Set the observer used for bridge calls made without a logged-in user.\n * Defaults to \"ecency\"; a third-party integrator should point this at their\n * own moderation account.\n *\n * Must be a real account. An empty value is rejected rather than treated as\n * an opt-out: consumers resolve the observer with `||`, and `getDiscussion`\n * separately falls back to the post author, so \"\" would not disable mute\n * marking. It would silently observe as someone else while being cached under\n * \"\", leaving the request and its cache key describing different things.\n * @param observer - Hive account whose mute list applies to anonymous reads\n * @throws If given an empty or whitespace-only value\n */\n export function setDefaultObserver(observer: string) {\n if (typeof observer !== \"string\" || observer.trim() === \"\") {\n throw new Error(\n \"setDefaultObserver requires a non-empty Hive account. There is no empty-string opt-out; \" +\n \"observer resolution would fall back to the post author while caching under an empty key.\"\n );\n }\n\n CONFIG.defaultObserver = observer;\n }\n\n /**\n * Get a validated base URL for API requests\n * Returns a valid base URL that can be used with new URL(path, baseUrl)\n *\n * Priority:\n * 1. CONFIG.privateApiHost if set (dev/staging or explicit config)\n * 2. window.location.origin if in browser (production with relative URLs)\n * 3. 'https://ecency.com' as fallback for SSR (production default)\n *\n * @returns A valid base URL string\n * @throws Never throws - always returns a valid URL\n */\n export function getValidatedBaseUrl(): string {\n if (CONFIG.privateApiHost) {\n return CONFIG.privateApiHost;\n }\n\n if (typeof window !== 'undefined' && window.location?.origin) {\n return window.location.origin;\n }\n\n // Fallback for SSR when privateApiHost is empty (production case)\n return 'https://ecency.com';\n }\n\n /**\n * Set the polls API host\n * @param host - The polls API host URL (e.g., \"https://poll.ecency.com\")\n */\n export function setPollsApiHost(host: string) {\n CONFIG.pollsApiHost = host;\n }\n\n /**\n * Set the image host\n * @param host - The image host URL (e.g., \"https://i.ecency.com\")\n */\n export function setImageHost(host: string) {\n CONFIG.imageHost = host;\n }\n\n /**\n * Set Hive RPC nodes, replacing the default list.\n * Delegates to the unified hive-tx `setNodes` (single validated setter,\n * shared with the lean `@ecency/sdk/hive` entry) so node configuration is\n * defined in exactly one place.\n * @param nodes - Array of Hive RPC node URLs\n */\n export function setHiveNodes(nodes: string[]) {\n setHiveTxNodes(nodes);\n }\n\n /**\n * Set the REST-API node list, replacing the default `restNodes`. Lets an app\n * add/remove REST hosts at runtime (e.g. drop an own node being decommissioned,\n * or widen the public pool) without forking + republishing the SDK. Delegates to\n * the unified hive-tx `setRestNodes` (validated, shared with `@ecency/sdk/hive`).\n * @param nodes - Array of REST-capable node URLs (without a trailing slash)\n */\n export function setRestNodes(nodes: string[]) {\n setHiveTxRestNodes(nodes);\n }\n\n /**\n * Merge per-API REST node overrides. For each API a non-empty valid list pins it\n * to those hosts (so `callREST` never wastes its retry budget on a node that\n * 404/503s the API); an empty list removes the pin (falls back to `restNodes`).\n * Other APIs' pins (e.g. the built-in `hivesense`) are preserved. Delegates to the\n * unified hive-tx `setRestNodesByApi`.\n * @param map - Partial map of REST API name → capable node URLs\n */\n export function setRestNodesByApi(map: Partial>) {\n setHiveTxRestNodesByApi(map);\n }\n\n /**\n * Set the User-Agent sent on server-side (Node) requests to Hive nodes.\n * Lets an app label its own SSR/server traffic (otherwise Node's fetch sends a\n * bare `node` UA). No effect in browsers (User-Agent is a forbidden header) or\n * React Native (keeps its native UA). Delegates to the unified hive-tx setter.\n * @param userAgent - The User-Agent string (e.g. \"ecency-web-ssr (+https://ecency.com)\")\n */\n export function setUserAgent(userAgent: string) {\n setHiveTxUserAgent(userAgent);\n }\n\n /**\n * Tune read-call tail-latency resilience: adaptive per-attempt timeouts\n * (default on) and hedged requests (default OFF — a duplicate request races\n * the next healthy node when the primary stalls, bounded by a token bucket so\n * only the slow tail hedges and pool-wide slowness self-disables it). Partial:\n * only the fields provided are changed; invalid values are ignored\n * field-by-field. Delegates to the unified hive-tx `setResilience`.\n * @param opts - e.g. `{ hedge: true }` to opt into hedged reads\n */\n export function setResilience(opts: Partial) {\n setHiveTxResilience(opts);\n }\n\n /**\n * Static analysis: Check for known ReDoS-vulnerable patterns\n * @param pattern - Raw regex pattern string\n * @returns Object with risk level and reason\n */\n function analyzeRedosRisk(pattern: string): { safe: boolean; reason?: string } {\n // Check 1: Nested quantifiers (e.g., (a+)+, (a*)+, (a{1,})+)\n if (/(\\([^)]*[*+{][^)]*\\))[*+{]/.test(pattern)) {\n return { safe: false, reason: \"nested quantifiers detected\" };\n }\n\n // Check 2: Alternation with overlapping terms (e.g., (a|a)+, (ab|a)+)\n if (/\\([^|)]*\\|[^)]*\\)[*+{]/.test(pattern)) {\n return { safe: false, reason: \"alternation with quantifier (potential overlap)\" };\n }\n\n // Check 3: Catastrophic backtracking patterns (e.g., (a*)*b, (a+)+b)\n if (/\\([^)]*[*+][^)]*\\)[*+]/.test(pattern)) {\n return { safe: false, reason: \"repeated quantifiers (catastrophic backtracking risk)\" };\n }\n\n // Check 4: Greedy quantifiers followed by optional patterns (e.g., .*.*x, .+.+x)\n if (/\\.\\*\\.\\*/.test(pattern) || /\\.\\+\\.\\+/.test(pattern)) {\n return { safe: false, reason: \"multiple greedy quantifiers on wildcards\" };\n }\n\n // Check 5: Unbounded ranges with wildcards (e.g., .{1,999999})\n const unboundedRange = /\\.?\\{(\\d+),(\\d+)\\}/g;\n let match;\n while ((match = unboundedRange.exec(pattern)) !== null) {\n const [, min, max] = match;\n const range = parseInt(max, 10) - parseInt(min, 10);\n if (range > 1000) {\n return { safe: false, reason: `excessive range: {${min},${max}}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Runtime test: Execute regex against adversarial inputs with timeout\n * @param regex - Compiled regex\n * @returns Object indicating if regex passed runtime test\n */\n function testRegexPerformance(regex: RegExp): { safe: boolean; reason?: string } {\n // Test inputs designed to trigger ReDoS in vulnerable patterns\n const adversarialInputs = [\n // Nested quantifier attack\n \"a\".repeat(50) + \"x\",\n // Alternation attack\n \"ab\".repeat(50) + \"x\",\n // Wildcard attack\n \"x\".repeat(100),\n // Mixed attack\n \"aaa\".repeat(30) + \"bbb\".repeat(30) + \"x\",\n ];\n\n const maxExecutionTime = 5; // 5ms hard limit per test\n\n for (const input of adversarialInputs) {\n const start = Date.now();\n try {\n regex.test(input);\n const duration = Date.now() - start;\n\n if (duration > maxExecutionTime) {\n return {\n safe: false,\n reason: `runtime test exceeded ${maxExecutionTime}ms (took ${duration}ms on input length ${input.length})`\n };\n }\n } catch (err) {\n return { safe: false, reason: `runtime test threw error: ${err}` };\n }\n }\n\n return { safe: true };\n }\n\n /**\n * Safely compile a regex pattern with defense-in-depth validation\n * @param pattern - Raw regex pattern string\n * @param maxLength - Maximum allowed pattern length (default 200)\n * @returns Compiled RegExp or null if invalid/unsafe\n */\n function safeCompileRegex(pattern: string, maxLength = 200): RegExp | null {\n // Use the module-level isDevelopment constant\n\n try {\n // Layer 1: Basic validation\n if (!pattern) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: empty pattern`);\n }\n return null;\n }\n\n if (pattern.length > maxLength) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: length ${pattern.length} exceeds max ${maxLength} - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 2: Static ReDoS analysis\n const staticAnalysis = analyzeRedosRisk(pattern);\n if (!staticAnalysis.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: static analysis failed (${staticAnalysis.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n // Layer 3: Compilation attempt\n let regex: RegExp;\n try {\n regex = new RegExp(pattern);\n } catch (compileErr) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: compilation failed - pattern: ${pattern.substring(0, 50)}...`, compileErr);\n }\n return null;\n }\n\n // Layer 4: Runtime performance testing\n const runtimeTest = testRegexPerformance(regex);\n if (!runtimeTest.safe) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: runtime test failed (${runtimeTest.reason}) - pattern: ${pattern.substring(0, 50)}...`);\n }\n return null;\n }\n\n return regex;\n } catch (err) {\n if (isDevelopment) {\n console.warn(`[SDK] DMCA pattern rejected: unexpected error - pattern: ${pattern.substring(0, 50)}...`, err);\n }\n return null;\n }\n }\n\n /**\n * Set DMCA filtering lists\n * @param lists - DMCA lists object containing accounts/tags/posts arrays\n */\n export function setDmcaLists(\n lists: DmcaListsInput = {}\n ) {\n const coerceList = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n // Ensure we have a valid object to work with\n const input = lists || {};\n\n const resolved = {\n accounts: coerceList(input.accounts),\n tags: coerceList(input.tags),\n patterns: coerceList(input.posts),\n };\n\n CONFIG.dmcaAccounts = resolved.accounts;\n CONFIG.dmcaTags = resolved.tags;\n CONFIG.dmcaPatterns = resolved.patterns;\n\n // Pre-compile tag regex patterns (tags can be regex)\n CONFIG.dmcaTagRegexes = resolved.tags\n .map((pattern) => safeCompileRegex(pattern))\n .filter((r): r is RegExp => r !== null);\n\n // Post patterns are plain strings for exact matching, not regex\n // No compilation needed - they will be used with simple string comparison\n CONFIG.dmcaPatternRegexes = [];\n\n const rejectedTagCount = resolved.tags.length - CONFIG.dmcaTagRegexes.length;\n\n // Only log once to avoid noise during builds/hot reloads\n // Only show in development mode to avoid cluttering production console\n // Use the module-level isDevelopment constant\n\n if (!CONFIG._dmcaInitialized && isDevelopment) {\n console.log(`[SDK] DMCA configuration loaded:`);\n console.log(` - Accounts: ${resolved.accounts.length}`);\n console.log(` - Tag patterns: ${CONFIG.dmcaTagRegexes.length}/${resolved.tags.length} compiled (${rejectedTagCount} rejected)`);\n console.log(` - Post patterns: ${resolved.patterns.length} (using exact string matching)`);\n\n if (rejectedTagCount > 0) {\n console.warn(`[SDK] ${rejectedTagCount} DMCA tag patterns were rejected due to security validation. Check warnings above for details.`);\n }\n }\n\n CONFIG._dmcaInitialized = true;\n }\n}\n","import {\n InfiniteData,\n QueryClient,\n QueryKey,\n useInfiniteQuery,\n UseInfiniteQueryOptions,\n useQuery,\n UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { CONFIG } from \"./config\";\n\n/**\n * Builds a client with the SDK's defaults. It is only a factory — request\n * scoping is the host's job, via `ConfigManager.setQueryClientResolver`, since\n * only the host knows where one request ends and the next begins.\n */\nexport function makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // With SSR, we usually want to set some default staleTime\n // above 0 to avoid refetching immediately on the client\n // staleTime: 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n },\n },\n });\n}\nexport const getQueryClient = () => CONFIG.queryClient;\n\nexport namespace EcencyQueriesManager {\n export function getQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData(queryKey);\n }\n\n export function getInfiniteQueryData(queryKey: QueryKey) {\n const queryClient = getQueryClient();\n return queryClient.getQueryData>(queryKey);\n }\n\n export async function prefetchQuery(options: UseQueryOptions) {\n const queryClient = getQueryClient();\n await queryClient.prefetchQuery(options);\n return getQueryData(options.queryKey);\n }\n\n export async function prefetchInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n const queryClient = getQueryClient();\n await queryClient.prefetchInfiniteQuery(options);\n return getInfiniteQueryData(options.queryKey);\n }\n\n export function generateClientServerQuery(options: UseQueryOptions) {\n return {\n prefetch: () => prefetchQuery(options),\n getData: () => getQueryData(options.queryKey),\n useClientQuery: () => useQuery(options),\n fetchAndGet: () => getQueryClient().fetchQuery(options),\n };\n }\n\n export function generateClientServerInfiniteQuery(\n options: UseInfiniteQueryOptions<\n T,\n Error,\n InfiniteData,\n QueryKey,\n P\n >\n ) {\n return {\n prefetch: () => prefetchInfiniteQuery(options),\n getData: () => getInfiniteQueryData(options.queryKey),\n useClientQuery: () => useInfiniteQuery(options),\n fetchAndGet: () => getQueryClient().fetchInfiniteQuery(options),\n };\n }\n}\n","export function encodeObj(o: any): string {\n return btoa(JSON.stringify(o));\n}\n\nexport function decodeObj(o: any): any {\n let dataToParse = atob(o);\n if (dataToParse[0] !== \"{\") {\n return undefined;\n }\n return JSON.parse(dataToParse);\n}\n","import type { SMTAsset } from \"@/modules/core/hive-tx\";\n\nexport enum Symbol {\n HIVE = \"HIVE\",\n HBD = \"HBD\",\n VESTS = \"VESTS\",\n}\n\nexport enum NaiMap {\n \"@@000000021\" = \"HIVE\",\n \"@@000000013\" = \"HBD\",\n \"@@000000037\" = \"VESTS\",\n}\n\nexport interface Asset {\n amount: number;\n symbol: Symbol;\n}\n\nexport function parseAsset(sval: string | SMTAsset): Asset {\n if (typeof sval === \"string\") {\n const sp = sval.split(\" \");\n return {\n amount: parseFloat(sp[0]),\n // @ts-ignore\n symbol: Symbol[sp[1]],\n };\n } else {\n return {\n amount: parseFloat(sval.amount.toString()) / Math.pow(10, sval.precision),\n // @ts-ignore\n symbol: NaiMap[sval.nai],\n };\n }\n}\n","let cachedFetch: typeof globalThis.fetch | undefined;\n\nexport function getBoundFetch() {\n if (!cachedFetch) {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"[Ecency][SDK] - global fetch is not available\");\n }\n\n cachedFetch = globalThis.fetch.bind(globalThis);\n }\n\n return cachedFetch;\n}\n","export function isCommunity(value: unknown) {\n return typeof value === \"string\" ? /^hive-\\d+$/.test(value) : false;\n}\n","import { WrappedResponse } from \"../types/pagination\";\n\n/**\n * Type guard to check if response is wrapped with pagination metadata\n */\nexport function isWrappedResponse(response: any): response is WrappedResponse {\n return (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n \"pagination\" in response &&\n Array.isArray(response.data)\n );\n}\n\n/**\n * Normalize response to wrapped format for backwards compatibility\n * If the backend returns old format (array), convert it to wrapped format\n */\nexport function normalizeToWrappedResponse(\n response: T[] | WrappedResponse,\n limit: number\n): WrappedResponse {\n if (isWrappedResponse(response)) {\n return response;\n }\n\n // Old format - just an array\n // Since we don't have pagination metadata, assume no more pages\n return {\n data: Array.isArray(response) ? response : [],\n pagination: {\n total: Array.isArray(response) ? response.length : 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n}\n","export function vestsToHp(vests: number, hivePerMVests: number): number {\n return (vests / 1e6) * hivePerMVests;\n}\n","export function isEmptyDate(s: string | undefined): boolean {\n if (s === undefined) {\n return true;\n }\n\n return parseInt(s.split(\"-\")[0], 10) < 1980;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { DynamicProps } from \"../types\";\nimport { parseAsset } from \"../utils\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// This query powers wallet/HP/reward math that should stay close to chain state.\n// Keep a short refresh cadence despite the 5 RPC calls.\nconst DYNAMIC_PROPS_REFRESH_MS = 60 * 1000;\n\nexport function getDynamicPropsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.core.dynamicProps(),\n refetchInterval: DYNAMIC_PROPS_REFRESH_MS,\n staleTime: DYNAMIC_PROPS_REFRESH_MS,\n queryFn: async ({ signal }): Promise => {\n // Get raw blockchain data — all five calls are independent, run in parallel.\n // Hardfork properties is wrapped with catch since not all nodes support it.\n const [rawGlobalDynamic, rawFeedHistory, rawChainProps, rawRewardFund, rawHardforkProps] = await Promise.all([\n callRPC(\"condenser_api.get_dynamic_global_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_feed_history\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_chain_properties\", [], undefined, undefined, signal),\n callRPC(\"condenser_api.get_reward_fund\", [\"post\"], undefined, undefined, signal),\n callRPC(\"database_api.get_hardfork_properties\", {}, undefined, undefined, signal)\n .catch(() => ({ current_hardfork_version: \"1.28.0\", last_hardfork: 28 })),\n ]) as [any, any, any, any, any];\n\n // Calculate derived values for backward compatibility\n // parseAsset handles both string format (\"200905388484 HIVE\") and NAI format ({ amount, nai, precision })\n const totalVestingSharesAmount = parseAsset(rawGlobalDynamic.total_vesting_shares).amount;\n const totalVestingFundAmount = parseAsset(rawGlobalDynamic.total_vesting_fund_hive).amount;\n\n // Guard against division by zero/NaN/Infinity\n let hivePerMVests = 0;\n if (\n Number.isFinite(totalVestingSharesAmount) &&\n totalVestingSharesAmount !== 0 &&\n Number.isFinite(totalVestingFundAmount)\n ) {\n hivePerMVests = (totalVestingFundAmount / totalVestingSharesAmount) * 1e6;\n }\n const base = parseAsset(rawFeedHistory.current_median_history.base).amount;\n const quote = parseAsset(rawFeedHistory.current_median_history.quote).amount;\n const fundRecentClaims = parseFloat(rawRewardFund.recent_claims);\n const fundRewardBalance = parseAsset(rawRewardFund.reward_balance).amount;\n const votePowerReserveRate = Number(rawGlobalDynamic.vote_power_reserve_rate ?? 0);\n const authorRewardCurve = rawRewardFund.author_reward_curve ?? \"linear\";\n const contentConstant = Number(rawRewardFund.content_constant ?? 0);\n const currentHardforkVersion = String(rawHardforkProps.current_hardfork_version ?? \"0.0.0\");\n const lastHardfork = Number(rawHardforkProps.last_hardfork ?? 0);\n const hbdPrintRate = rawGlobalDynamic.hbd_print_rate;\n const hbdInterestRate = rawGlobalDynamic.hbd_interest_rate;\n const headBlock = rawGlobalDynamic.head_block_number;\n const totalVestingFund = totalVestingFundAmount;\n const totalVestingShares = totalVestingSharesAmount;\n const virtualSupply = parseAsset(rawGlobalDynamic.virtual_supply).amount;\n const vestingRewardPercent = rawGlobalDynamic.vesting_reward_percent || 0;\n const accountCreationFee = rawChainProps.account_creation_fee;\n\n return {\n // Backward compatible transformed fields (camelCase, parsed)\n hivePerMVests,\n base,\n quote,\n fundRecentClaims,\n fundRewardBalance,\n votePowerReserveRate,\n authorRewardCurve,\n contentConstant,\n currentHardforkVersion,\n lastHardfork,\n hbdPrintRate,\n hbdInterestRate,\n headBlock,\n totalVestingFund,\n totalVestingShares,\n virtualSupply,\n vestingRewardPercent,\n accountCreationFee,\n\n // Raw blockchain data (snake_case, unparsed) for direct use\n // Includes ALL fields from the blockchain responses\n raw: {\n globalDynamic: rawGlobalDynamic,\n feedHistory: rawFeedHistory,\n chainProps: rawChainProps,\n rewardFund: rawRewardFund,\n hardforkProps: rawHardforkProps,\n },\n } as DynamicProps;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface RewardFund {\n id: number;\n name: string;\n reward_balance: string;\n recent_claims: string;\n last_update: string;\n content_constant: string;\n percent_curation_rewards: number;\n percent_content_rewards: number;\n author_reward_curve: string;\n curation_reward_curve: string;\n}\n\n/**\n * Get reward fund information from the blockchain\n * @param fundName - Name of the reward fund (default: 'post')\n */\nexport function getRewardFundQueryOptions(fundName = \"post\") {\n return queryOptions({\n queryKey: QueryKeys.core.rewardFund(fundName),\n queryFn: () =>\n callRPC(\"condenser_api.get_reward_fund\", [\n fundName,\n ]) as Promise,\n });\n}\n","/**\n * Centralized query key definitions for all SDK queries.\n *\n * These key builders are the single source of truth for React Query cache keys.\n * Both SDK query options and web app consumers should reference these\n * instead of using inline string arrays.\n *\n * @example\n * ```typescript\n * import { QueryKeys } from \"@ecency/sdk\";\n *\n * // In query options\n * queryKey: QueryKeys.posts.entry(`/@${author}/${permlink}`)\n *\n * // In cache invalidation\n * queryClient.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) })\n * ```\n */\n/** Strip trailing undefined values so the key works as a prefix for partialMatchKey */\nfunction key(...parts: unknown[]): unknown[] {\n let end = parts.length;\n while (end > 0 && parts[end - 1] === undefined) {\n end--;\n }\n return parts.slice(0, end);\n}\n\nexport const QueryKeys = {\n // ===========================================================================\n // Posts\n // ===========================================================================\n posts: {\n entry: (entryPath: string) => [\"posts\", \"entry\", entryPath],\n postHeader: (author: string, permlink?: string) =>\n [\"posts\", \"post-header\", author, permlink],\n content: (author: string, permlink: string) =>\n [\"posts\", \"content\", author, permlink],\n contentReplies: (author: string, permlink: string) =>\n [\"posts\", \"content-replies\", author, permlink],\n accountPosts: (\n username: string,\n filter: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"account-posts\", username, filter, limit, observer],\n accountPostsPage: (\n username: string,\n filter: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n observer: string\n ) =>\n [\n \"posts\",\n \"account-posts-page\",\n username,\n filter,\n startAuthor,\n startPermlink,\n limit,\n observer,\n ],\n userPostVote: (username: string, author: string, permlink: string) =>\n [\"posts\", \"user-vote\", username, author, permlink],\n reblogs: (username: string, limit: number) =>\n [\"posts\", \"reblogs\", username, limit],\n entryActiveVotes: (author?: string, permlink?: string) =>\n [\"posts\", \"entry-active-votes\", author, permlink],\n rebloggedBy: (author: string, permlink: string) =>\n [\"posts\", \"reblogged-by\", author, permlink],\n tips: (author: string, permlink: string) =>\n [\"posts\", \"tips\", author, permlink],\n normalize: (author: string, permlink: string) =>\n [\"posts\", \"normalize\", author, permlink],\n drafts: (activeUsername?: string) =>\n [\"posts\", \"drafts\", activeUsername],\n draftsInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"drafts\", \"infinite\", activeUsername, limit),\n schedules: (activeUsername?: string) =>\n [\"posts\", \"schedules\", activeUsername],\n schedulesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"posts\", \"schedules\", \"infinite\", activeUsername, limit),\n fragments: (username?: string) =>\n [\"posts\", \"fragments\", username],\n fragmentsInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"fragments\", \"infinite\", username, limit),\n images: (username?: string) => [\"posts\", \"images\", username],\n galleryImages: (activeUsername?: string) =>\n [\"posts\", \"gallery-images\", activeUsername],\n imagesInfinite: (username?: string, limit?: number) =>\n key(\"posts\", \"images\", \"infinite\", username, limit),\n promoted: (type: string) => [\"posts\", \"promoted\", type],\n _promotedPrefix: [\"posts\", \"promoted\"],\n accountPostsBlogPrefix: (username: string) =>\n [\"posts\", \"account-posts\", username, \"blog\"] as const,\n postsRanked: (\n sort: string,\n tag: string,\n limit: number,\n observer: string\n ) => [\"posts\", \"posts-ranked\", sort, tag, limit, observer],\n postsRankedPage: (\n sort: string,\n startAuthor: string,\n startPermlink: string,\n limit: number,\n tag: string,\n observer: string\n ) =>\n [\n \"posts\",\n \"posts-ranked-page\",\n sort,\n startAuthor,\n startPermlink,\n limit,\n tag,\n observer,\n ],\n discussions: (\n author: string,\n permlink: string,\n order: string,\n observer: string\n ) => [\"posts\", \"discussions\", author, permlink, order, observer],\n discussion: (author: string, permlink: string, observer: string) =>\n [\"posts\", \"discussion\", author, permlink, observer],\n deletedEntry: (entryPath: string) =>\n [\"posts\", \"deleted-entry\", entryPath],\n commentHistory: (\n author: string,\n permlink: string,\n onlyMeta: boolean\n ) => [\"posts\", \"comment-history\", author, permlink, onlyMeta],\n trendingTags: () => [\"posts\", \"trending-tags\"],\n trendingTagsWithStats: (limit: number) =>\n [\"posts\", \"trending-tags\", \"stats\", limit],\n wavesFeed: (\n params: {\n containers?: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"feed\",\n params.tag ?? \"\",\n params.following ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n shortsFeed: (\n params: {\n containers?: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit?: number;\n } = {}\n ) => [\n \"posts\",\n \"waves\",\n \"shorts\",\n params.tag ?? \"\",\n params.author ?? \"\",\n params.observer ?? \"\",\n params.limit ?? 0,\n [...(params.containers ?? [])].sort().join(\",\")\n ],\n wavesByHost: (host: string) =>\n [\"posts\", \"waves\", \"by-host\", host],\n wavesByTag: (host: string, tag: string) =>\n [\"posts\", \"waves\", \"by-tag\", host, tag],\n wavesFollowing: (host: string, username: string) =>\n [\"posts\", \"waves\", \"following\", host, username],\n wavesTrendingTags: (host: string, hours: number) =>\n [\"posts\", \"waves\", \"trending-tags\", host, hours],\n wavesByAccount: (host: string, username: string) =>\n [\"posts\", \"waves\", \"by-account\", host, username],\n wavesTrendingAuthors: (host: string) =>\n [\"posts\", \"waves\", \"trending-authors\", host],\n _prefix: [\"posts\"],\n },\n\n // ===========================================================================\n // Accounts\n // ===========================================================================\n accounts: {\n full: (username?: string) => [\"get-account-full\", username],\n list: (...usernames: string[]) =>\n [\"accounts\", \"list\", ...usernames],\n friends: (\n following: string,\n mode: string,\n followType: string,\n limit: number\n ) => [\"accounts\", \"friends\", following, mode, followType, limit],\n searchFriends: (username: string, mode: string, query: string) =>\n [\"accounts\", \"friends\", \"search\", username, mode, query],\n subscriptions: (username: string) =>\n [\"accounts\", \"subscriptions\", username],\n followCount: (username: string) =>\n [\"accounts\", \"follow-count\", username],\n recoveries: (username: string) =>\n [\"accounts\", \"recoveries\", username],\n pendingRecovery: (username: string) =>\n [\"accounts\", \"recoveries\", username, \"pending-request\"],\n checkWalletPending: (username: string, code: string | null) =>\n [\"accounts\", \"check-wallet-pending\", username, code],\n mutedUsers: (username: string) =>\n [\"accounts\", \"muted-users\", username],\n following: (\n follower: string,\n startFollowing: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"following\",\n follower,\n startFollowing,\n followType,\n limit,\n ],\n followers: (\n following: string,\n startFollower: string,\n followType: string,\n limit: number\n ) =>\n [\n \"accounts\",\n \"followers\",\n following,\n startFollower,\n followType,\n limit,\n ],\n search: (query: string, excludeList?: string[]) =>\n [\"accounts\", \"search\", query, excludeList],\n profiles: (accounts: string[], observer: string) =>\n [\"accounts\", \"profiles\", accounts, observer],\n lookup: (query: string, limit: number) =>\n [\"accounts\", \"lookup\", query, limit],\n transactions: (username: string, group: string, limit: number) =>\n [\"accounts\", \"transactions\", username, group, limit],\n favorites: (activeUsername?: string) =>\n [\"accounts\", \"favorites\", activeUsername],\n favoritesInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"favorites\", \"infinite\", activeUsername, limit),\n checkFavorite: (activeUsername: string, targetUsername: string) =>\n [\n \"accounts\",\n \"favorites\",\n \"check\",\n activeUsername,\n targetUsername,\n ],\n relations: (reference: string | undefined, target: string | undefined) =>\n [\"accounts\", \"relations\", reference, target],\n bots: () => [\"accounts\", \"bots\"],\n voteHistory: (username: string, limit: number) =>\n [\"accounts\", \"vote-history\", username, limit],\n reputations: (query: string, limit: number) =>\n [\"accounts\", \"reputations\", query, limit],\n bookmarks: (activeUsername?: string) =>\n [\"accounts\", \"bookmarks\", activeUsername],\n bookmarksInfinite: (activeUsername?: string, limit?: number) =>\n key(\"accounts\", \"bookmarks\", \"infinite\", activeUsername, limit),\n referrals: (username: string) =>\n [\"accounts\", \"referrals\", username],\n referralsStats: (username: string) =>\n [\"accounts\", \"referrals-stats\", username],\n proMembers: () => [\"accounts\", \"pro-members\"],\n _prefix: [\"accounts\"],\n },\n\n // ===========================================================================\n // Notifications\n // ===========================================================================\n notifications: {\n announcements: () => [\"notifications\", \"announcements\"],\n spotlights: () => [\"notifications\", \"spotlights\"],\n list: (activeUsername?: string, filter?: string) =>\n [\"notifications\", activeUsername, filter],\n unreadCount: (activeUsername?: string) =>\n [\"notifications\", \"unread\", activeUsername],\n settings: (activeUsername?: string) =>\n [\"notifications\", \"settings\", activeUsername],\n _prefix: [\"notifications\"],\n },\n\n // ===========================================================================\n // Core\n // ===========================================================================\n core: {\n rewardFund: (fundName: string) =>\n [\"core\", \"reward-fund\", fundName],\n dynamicProps: () => [\"core\", \"dynamic-props\"],\n chainProperties: () => [\"core\", \"chain-properties\"],\n _prefix: [\"core\"],\n },\n\n // ===========================================================================\n // Communities\n // ===========================================================================\n communities: {\n single: (name?: string, observer?: string) =>\n [\"community\", \"single\", name, observer],\n /** Prefix key for matching all observer variants of a community */\n singlePrefix: (name: string) =>\n [\"community\", \"single\", name] as const,\n context: (username: string, communityName: string) =>\n [\"community\", \"context\", username, communityName],\n rewarded: () => [\"communities\", \"rewarded\"],\n list: (sort: string, query: string, limit: number) =>\n [\"communities\", \"list\", sort, query, limit],\n subscribers: (communityName: string) =>\n [\"communities\", \"subscribers\", communityName],\n subscribersInfinite: (communityName: string) =>\n [\"communities\", \"subscribers\", \"infinite\", communityName],\n accountNotifications: (account: string, limit: number) =>\n [\"communities\", \"account-notifications\", account, limit],\n },\n\n // ===========================================================================\n // Proposals\n // ===========================================================================\n proposals: {\n list: () => [\"proposals\", \"list\"],\n proposal: (id: number) => [\"proposals\", \"proposal\", id],\n votes: (proposalId: number, voter: string, limit: number) =>\n [\"proposals\", \"votes\", proposalId, voter, limit],\n votesPrefix: (proposalId: number) =>\n [\"proposals\", \"votes\", proposalId] as const,\n votesByUser: (voter: string) =>\n [\"proposals\", \"votes\", \"by-user\", voter],\n },\n\n // ===========================================================================\n // Search\n // ===========================================================================\n search: {\n topics: (q: string, limit: number) => [\"search\", \"topics\", q, limit],\n path: (q: string) => [\"search\", \"path\", q],\n account: (q: string, limit: number) =>\n [\"search\", \"account\", q, limit],\n results: (\n q: string,\n sort: string,\n hideLow: boolean | string,\n since?: string,\n scrollId?: string,\n votes?: number\n ) => {\n const normalizedHideLow = typeof hideLow === \"string\" ? hideLow === \"1\" || hideLow === \"true\" : hideLow;\n return [\"search\", q, sort, normalizedHideLow, since, scrollId, votes] as const;\n },\n controversialRising: (what: string, tag: string) =>\n [\"search\", \"controversial-rising\", what, tag],\n similarEntries: (author: string, permlink: string, content?: string) =>\n content\n ? [\"search\", \"similar-entries\", author, permlink, content]\n : [\"search\", \"similar-entries\", author, permlink],\n api: (\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n ) => key(\"search\", \"api\", q, sort, hideLow, since, votes, includeNsfw),\n },\n\n // ===========================================================================\n // Witnesses\n // ===========================================================================\n witnesses: {\n list: (limit: number) => [\"witnesses\", \"list\", limit],\n votes: (username: string | undefined) => [\"witnesses\", \"votes\", username],\n proxy: () => [\"witnesses\", \"proxy\"],\n voters: (\n witness: string,\n page: number,\n pageSize: number,\n sort: string,\n direction: string\n ) => [\"witnesses\", \"voters\", witness, page, pageSize, sort, direction],\n voterCount: (witness: string) =>\n [\"witnesses\", \"voter-count\", witness],\n },\n\n // ===========================================================================\n // Wallet\n // ===========================================================================\n wallet: {\n outgoingRcDelegations: (username: string, limit: number) =>\n [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n vestingDelegations: (username: string, limit: number) =>\n [\"wallet\", \"vesting-delegations\", username, limit],\n withdrawRoutes: (account: string) =>\n [\"wallet\", \"withdraw-routes\", account],\n incomingRc: (username: string) =>\n [\"wallet\", \"incoming-rc\", username],\n conversionRequests: (account: string) =>\n [\"wallet\", \"conversion-requests\", account],\n receivedVestingShares: (username: string) =>\n [\"wallet\", \"received-vesting-shares\", username],\n savingsWithdraw: (account: string) =>\n [\"wallet\", \"savings-withdraw\", account],\n openOrders: (user: string) =>\n [\"wallet\", \"open-orders\", user],\n collateralizedConversionRequests: (account: string) =>\n [\"wallet\", \"collateralized-conversion-requests\", account],\n recurrentTransfers: (username: string) =>\n [\"wallet\", \"recurrent-transfers\", username],\n balanceHistory: (username: string, coinType: string, pageSize: number) =>\n [\"wallet\", \"balance-history\", username, coinType, pageSize],\n aggregatedHistory: (\n username: string,\n coinType: string,\n granularity?: \"yearly\" | \"monthly\" | \"daily\"\n ) =>\n granularity === undefined\n ? [\"wallet\", \"aggregated-history\", username, coinType]\n : [\"wallet\", \"aggregated-history\", username, coinType, granularity],\n portfolio: (\n username: string,\n onlyEnabled: string,\n currency: string\n ) =>\n [\"wallet\", \"portfolio\", \"v2\", username, onlyEnabled, currency],\n },\n\n // ===========================================================================\n // Assets\n // ===========================================================================\n assets: {\n hiveGeneralInfo: (username: string) =>\n [\"assets\", \"hive\", \"general-info\", username],\n hiveTransactions: (username: string, limit: number, filterKey: string) =>\n [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n hiveWithdrawalRoutes: (username: string) =>\n [\"assets\", \"hive\", \"withdrawal-routes\", username],\n hiveMetrics: (bucketSeconds: number) =>\n [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n hbdGeneralInfo: (username: string) =>\n [\"assets\", \"hbd\", \"general-info\", username],\n hbdTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) => [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n hivePowerGeneralInfo: (username: string) =>\n [\"assets\", \"hive-power\", \"general-info\", username],\n hivePowerDelegates: (username: string) =>\n [\"assets\", \"hive-power\", \"delegates\", username],\n hivePowerDelegatings: (username: string) =>\n [\"assets\", \"hive-power\", \"delegatings\", username],\n hivePowerTransactions: (\n username: string,\n limit: number,\n filterKey: string\n ) =>\n [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n pointsGeneralInfo: (username: string) =>\n [\"assets\", \"points\", \"general-info\", username],\n pointsTransactions: (username: string, type: string) =>\n [\"assets\", \"points\", \"transactions\", username, type],\n ecencyAssetInfo: (username: string, asset: string, currency: string) =>\n [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n },\n\n // ===========================================================================\n // Market\n // ===========================================================================\n market: {\n statistics: () => [\"market\", \"statistics\"],\n orderBook: (limit: number) => [\"market\", \"order-book\", limit],\n history: (seconds: number, startDate: number, endDate: number) =>\n [\"market\", \"history\", seconds, startDate, endDate],\n feedHistory: () => [\"market\", \"feed-history\"],\n hiveHbdStats: () => [\"market\", \"hive-hbd-stats\"],\n data: (\n coin: string,\n vsCurrency: string,\n fromTs: number,\n toTs: number\n ) => [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n tradeHistory: (limit: number, start: number, end: number) =>\n [\"market\", \"trade-history\", limit, start, end],\n currentMedianHistoryPrice: () =>\n [\"market\", \"current-median-history-price\"],\n },\n\n // ===========================================================================\n // Analytics\n // ===========================================================================\n analytics: {\n discoverCuration: (duration: string) =>\n [\"analytics\", \"discover-curation\", duration],\n pageStats: (\n url: string,\n dimensions: string,\n metrics: string,\n dateRange: string\n ) =>\n [\"analytics\", \"page-stats\", url, dimensions, metrics, dateRange],\n discoverLeaderboard: (duration: string) =>\n [\"analytics\", \"discover-leaderboard\", duration],\n },\n\n // ===========================================================================\n // Promotions\n // ===========================================================================\n promotions: {\n promotePrice: () => [\"promotions\", \"promote-price\"],\n boostPlusPrices: () => [\"promotions\", \"boost-plus-prices\"],\n boostPlusAccounts: (account: string) =>\n [\"promotions\", \"boost-plus-accounts\", account],\n },\n\n // ===========================================================================\n // Resource Credits\n // ===========================================================================\n resourceCredits: {\n account: (username: string) =>\n [\"resource-credits\", \"account\", username],\n stats: () => [\"resource-credits\", \"stats\"],\n },\n\n // ===========================================================================\n // Points\n // ===========================================================================\n points: {\n points: (username: string, filter: number) =>\n [\"points\", username, filter],\n _prefix: (username: string) => [\"points\", username],\n },\n\n // ===========================================================================\n // Polls\n // ===========================================================================\n polls: {\n details: (author: string, permlink: string) =>\n [\"polls\", \"details\", author, permlink],\n vote: (author?: string, permlink?: string) =>\n author && permlink\n ? [\"polls\", \"vote\", author, permlink]\n : [\"polls\", \"vote\"],\n _prefix: [\"polls\"],\n },\n\n // ===========================================================================\n // Operations\n // ===========================================================================\n operations: {\n chainProperties: () => [\"operations\", \"chain-properties\"],\n },\n\n // ===========================================================================\n // Games\n // ===========================================================================\n games: {\n statusCheck: (gameType: string, username: string) =>\n [\"games\", \"status-check\", gameType, username],\n },\n\n quests: {\n status: (username: string | undefined) => [\"quests\", \"status\", username],\n },\n\n // ===========================================================================\n // Support Ecency\n // ===========================================================================\n support: {\n settings: (username: string | undefined) => [\"support\", \"settings\", username],\n _prefix: [\"support\"],\n },\n\n // ===========================================================================\n // Bad Actors\n // ===========================================================================\n badActors: {\n list: () => [\"bad-actors\", \"list\"],\n _prefix: [\"bad-actors\"],\n },\n\n // ===========================================================================\n // AI\n // ===========================================================================\n ai: {\n prices: () => [\"ai\", \"prices\"] as const,\n assistPrices: (username?: string) => [\"ai\", \"assist-prices\", username] as const,\n transcribePrice: (username?: string) => [\"ai\", \"transcribe-price\", username] as const,\n _prefix: [\"ai\"],\n },\n} as const;\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiImagePriceResponse } from \"../types\";\n\nexport function getAiGeneratePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.prices(),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-generate-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI generation prices: ${response.status}`);\n }\n\n return (await response.json()) as AiImagePriceResponse;\n },\n staleTime: 300_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiAssistPrice } from \"../types\";\n\nexport function getAiAssistPriceQueryOptions(username: string | undefined, accessToken: string) {\n return queryOptions({\n queryKey: QueryKeys.ai.assistPrices(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-assist-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI assist prices: ${response.status}`);\n }\n\n return (await response.json()) as AiAssistPrice[];\n },\n staleTime: 60_000,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"../../core\";\nimport type { AiTranscribePrice } from \"../types\";\n\n/**\n * Dictation pricing. Kept on its own route rather than folded into\n * /private-api/ai-assist-price: that endpoint returns a list of flat-cost actions and\n * shipped clients render every entry as a selectable assist action, so adding a\n * metered one there would surface in older clients as an action they cannot perform.\n *\n * Everything except `free_remaining` is static, so this is cheap to hold and lets the\n * client price a clip locally while the user is still recording.\n */\nexport function getAiTranscribePriceQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.ai.transcribePrice(username),\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch AI transcribe price: ${response.status}`);\n }\n\n return (await response.json()) as AiTranscribePrice;\n },\n staleTime: 60_000,\n enabled: !!accessToken\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiGenerationResponse } from \"../types\";\n\nexport interface GenerateImageParams {\n prompt: string;\n aspect_ratio?: string;\n power?: number;\n // Pass a stable key to make a retry recover the same paid generation. If omitted a\n // fresh key is generated per call (only dedupes edge/proxy retries, not user retries).\n idempotency_key?: string;\n}\n\n// Generates a key matching the eepoints validator [A-Za-z0-9_-]{8,64}.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useGenerateImage(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"generate-image\"],\n mutationFn: async (params: GenerateImageParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][GenerateImage] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-generate-image\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: accessToken,\n us: username,\n prompt: params.prompt,\n aspect_ratio: params.aspect_ratio ?? \"1:1\",\n power: params.power ?? 1,\n idempotency_key: params.idempotency_key ?? makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][GenerateImage] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n // 202 = the prediction is paid for and captured but not yet delivered to our image\n // host. Detect it by HTTP status BEFORE parsing (the body may be present or empty)\n // and surface it as a typed error so the caller can retry with the SAME\n // idempotency_key to fetch it — no second prediction, no second charge.\n if (response.status === 202) {\n let pendingData: Record = {};\n try {\n pendingData = await response.json();\n } catch {\n // empty / non-JSON 202 body is fine — the status alone drives recovery\n }\n const err = new Error(\"[SDK][AI][GenerateImage] – delivery pending\");\n (err as any).status = 202;\n (err as any).data = pendingData;\n throw err;\n }\n\n const data = (await response.json()) as AiGenerationResponse;\n\n return data;\n },\n onSuccess: () => {\n // Invalidate points cache since balance changed\n if (username) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiAssistResponse } from \"../types\";\n\nexport interface AiAssistParams {\n action: string;\n text: string;\n code?: string;\n}\n\n// Generates a key that matches the eepoints validator [A-Za-z0-9_-]{8,64}.\n// Used to dedupe duplicate POSTs caused by edge/proxy retries — same key on\n// retry returns the cached AI output without re-charging or re-calling Claude.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function useAiAssist(\n username: string | undefined,\n accessToken: string | undefined,\n) {\n return useMutation({\n mutationKey: [\"ai\", \"assist\"],\n mutationFn: async (params: AiAssistParams): Promise => {\n if (!username) {\n throw new Error(\n \"[SDK][AI][Assist] – username wasn't provided\"\n );\n }\n\n if (!accessToken) {\n throw new Error(\n \"[SDK][AI][Assist] – access token wasn't found\"\n );\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/ai-assist\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code: params.code ?? accessToken,\n us: username,\n action: params.action,\n text: params.text,\n idempotency_key: makeIdempotencyKey(),\n }),\n }\n );\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n const err = new Error(\n `[SDK][AI][Assist] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n );\n (err as any).status = response.status;\n (err as any).data = parsed;\n throw err;\n }\n\n return (await response.json()) as AiAssistResponse;\n },\n onSuccess: (data) => {\n if (username) {\n // Invalidate points cache if cost was charged\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username),\n });\n }\n // Invalidate assist prices to refresh free_remaining counts\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.assistPrices(username),\n });\n }\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AiTranscribeParams, AiTranscribeResponse } from \"../types\";\n\n// Matches the eepoints validator [A-Za-z0-9_-]{8,64}. Dedupes duplicate POSTs caused\n// by edge/proxy retries -- the same key returns the cached transcript without\n// re-charging or re-calling the vendor.\nfunction makeIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const arr = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < arr.length; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Transcribe an audio clip to text, charged per 30 seconds.\n *\n * Sends multipart/form-data rather than JSON because it carries a file. Unlike the\n * other AI mutations the charge is BURNED rather than moved to the treasury, so the\n * points transaction shows up as PointTransactionType.BURNED (997).\n */\nexport function useAiTranscribe(username: string | undefined, accessToken: string | undefined) {\n return useMutation({\n mutationKey: [\"ai\", \"transcribe\"],\n mutationFn: async (params: AiTranscribeParams): Promise => {\n if (!username) {\n throw new Error(\"[SDK][AI][Transcribe] – username wasn't provided\");\n }\n\n // Validate the token actually being sent, not just the bound one. A caller\n // that resolves a fresh token per call (because the bound one can expire\n // during a long recording) legitimately has nothing at hook construction.\n const code = params.code ?? accessToken;\n if (!code) {\n throw new Error(\"[SDK][AI][Transcribe] – access token wasn't found\");\n }\n\n const form = new FormData();\n form.append(\"code\", code);\n // `us` is resolved from the code server-side and is deliberately not sent:\n // upstream burns from whoever it names.\n form.append(\"duration_ms\", String(Math.round(params.durationMs)));\n // Caller-supplied key when there is one. Generating a fresh key per attempt\n // would defeat the dedupe in the one case it exists for: a POST that reached\n // the server whose response was lost. Retrying then would transcribe and\n // charge a second time. Same contract as useGenerateImage.\n form.append(\"idempotency_key\", params.idempotency_key ?? makeIdempotencyKey());\n form.append(\"audio\", params.audio, params.fileName ?? \"clip.webm\");\n\n const fetchApi = getBoundFetch();\n // No Content-Type header: fetch sets it, including the multipart boundary.\n // Setting it by hand drops the boundary and the body becomes unparseable.\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/ai-transcribe\", {\n method: \"POST\",\n body: form\n });\n\n if (!response.ok) {\n const body = await response.text();\n let parsed: Record = {};\n try {\n parsed = JSON.parse(body);\n } catch {\n // not JSON\n }\n\n // Object.assign rather than `as any` casts: callers need `status` to tell a\n // 402 (out of Points) from a 429 (rate limited) from a 400 (clip too long),\n // and this keeps that shape typed.\n throw Object.assign(\n new Error(\n `[SDK][AI][Transcribe] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n ),\n { status: response.status, data: parsed }\n );\n }\n\n return (await response.json()) as AiTranscribeResponse;\n },\n onSuccess: (data) => {\n if (username) {\n if (data.cost > 0) {\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.points._prefix(username)\n });\n }\n // Refresh free_remaining, which only Pro members ever have above zero.\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.ai.transcribePrice(username)\n });\n }\n }\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport {\n AccountFollowStats,\n FullAccount,\n} from \"../types\";\nimport { parseProfileMetadata } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** The raw `condenser_api.get_accounts` row — every FullAccount field except the three\n * this query derives separately (follow_stats + reputation from bridge, profile parsed). */\ntype RawAccount = Omit;\n\n/** Minimal shape read from `bridge.get_profile` (hivemind social profile): it carries\n * the reputation score, the follower/following counts and hivemind's parsed\n * (normalized) profile — the latter is used only to cross-validate the chain row. */\ninterface BridgeProfile {\n reputation?: number;\n stats?: { followers?: number; following?: number };\n metadata?: { profile?: Record };\n}\n\n/** True when the chain row carries no account metadata at all. Legitimate for\n * accounts that never set a profile — but combined with a populated hivemind\n * profile it identifies a node serving stripped account rows. */\nfunction isMetadataStripped(account: RawAccount): boolean {\n return !account.posting_json_metadata && !account.json_metadata;\n}\n\n/** True when a hivemind `metadata.profile` object carries at least one real\n * value. Hivemind emits its fixed profile keys with empty strings for\n * accounts without a profile, so key presence alone proves nothing. */\nfunction hasProfileValues(profile?: Record | null): boolean {\n if (!profile) return false;\n return Object.values(profile).some((value) =>\n typeof value === \"string\" ? value.length > 0 : value != null\n );\n}\n\nexport function getAccountFullQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.full(username),\n queryFn: async ({ signal }) => {\n if (!username) {\n return null;\n }\n\n // Fetch the chain account (balances/keys/vesting) and the hivemind profile in\n // parallel — both only need the username. bridge.get_profile carries BOTH the\n // follower/following counts and the reputation score, so it replaces the old\n // second-layer condenser_api.get_follow_count RPC *and* the reputation-api REST\n // call: condenser_api.get_accounts no longer returns a usable reputation (it is 0\n // since the hardfork), and there is no reason to make two extra round-trips for\n // data one profile object already carries.\n const [response, bridgeProfile] = await Promise.all([\n callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so fail over to the next node instead of misreading it as\n // \"account does not exist\".\n (rows) => Array.isArray(rows)\n ),\n callRPC(\n \"bridge.get_profile\",\n { account: username },\n undefined,\n undefined,\n signal\n ).catch((e): BridgeProfile | null => {\n // A caller cancel (aborted signal) must propagate — only genuine RPC/transport\n // failures degrade to reputation 0 / no follow_stats.\n if (signal?.aborted) throw e;\n return null;\n })\n ]);\n if (!response?.[0]) {\n // The account does not exist (e.g. not yet finalized on-chain during\n // signup). Treat absence as a recoverable null instead of throwing, so\n // consumers (useQuery hooks and fetchQuery callers) surface it as empty\n // data rather than an unhandled rejection / error-boundary crash.\n return null;\n }\n\n let chainAccount = response[0];\n\n // Cross-validate the chain row against the hivemind profile fetched in\n // the same query. Some public nodes serve account rows with BOTH\n // metadata fields stripped to \"\" (observed in the wild) while their own\n // hivemind still returns the real profile — and a merge base built from\n // such a row wipes the user's profile on the next partial\n // account_update2. When the row claims \"no metadata\" but hivemind\n // disagrees, re-read once (failover may pick another node) and otherwise\n // fail the query: an error here is recoverable, a poisoned cache entry\n // is not.\n if (\n isMetadataStripped(chainAccount) &&\n hasProfileValues(bridgeProfile?.metadata?.profile)\n ) {\n // The re-read carries a payload validator: a stripped row is treated\n // as a node fault, so the failover walk moves on to other nodes (and\n // repeat offenders earn a per-API health cooldown) instead of asking\n // the same lying node twice.\n const reread = await callRPC(\n \"condenser_api.get_accounts\",\n [[username]],\n undefined,\n undefined,\n signal,\n (rows) =>\n Array.isArray(rows) &&\n (!rows[0] || !isMetadataStripped(rows[0] as RawAccount))\n );\n if (reread[0] && !isMetadataStripped(reread[0])) {\n chainAccount = reread[0];\n } else {\n throw new Error(\n `[SDK][Accounts] – inconsistent account row for ${username}: empty json metadata while hivemind profile is populated`\n );\n }\n }\n\n const profile = parseProfileMetadata(chainAccount.posting_json_metadata);\n\n // bridge.get_profile.stats → follower/following counts; `reputation` is the\n // computed score (e.g. 78.29). accountReputation() floors an in-range score, so\n // it yields the same value the reputation-api used to return. Both degrade to a\n // safe default if the profile call failed.\n const stats = bridgeProfile?.stats;\n const follow_stats: AccountFollowStats | undefined = stats\n ? {\n account: chainAccount.name,\n follower_count: stats.followers ?? 0,\n following_count: stats.following ?? 0\n }\n : undefined;\n const reputationValue: number = bridgeProfile?.reputation ?? 0;\n\n return {\n name: chainAccount.name,\n owner: chainAccount.owner,\n active: chainAccount.active,\n posting: chainAccount.posting,\n memo_key: chainAccount.memo_key,\n post_count: chainAccount.post_count,\n created: chainAccount.created,\n posting_json_metadata: chainAccount.posting_json_metadata,\n last_vote_time: chainAccount.last_vote_time,\n last_post: chainAccount.last_post,\n json_metadata: chainAccount.json_metadata,\n reward_hive_balance: chainAccount.reward_hive_balance,\n reward_hbd_balance: chainAccount.reward_hbd_balance,\n reward_vesting_hive: chainAccount.reward_vesting_hive,\n reward_vesting_balance: chainAccount.reward_vesting_balance,\n balance: chainAccount.balance,\n hbd_balance: chainAccount.hbd_balance,\n savings_balance: chainAccount.savings_balance,\n savings_hbd_balance: chainAccount.savings_hbd_balance,\n savings_hbd_last_interest_payment:\n chainAccount.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update:\n chainAccount.savings_hbd_seconds_last_update,\n savings_hbd_seconds: chainAccount.savings_hbd_seconds,\n next_vesting_withdrawal: chainAccount.next_vesting_withdrawal,\n pending_claimed_accounts: chainAccount.pending_claimed_accounts,\n vesting_shares: chainAccount.vesting_shares,\n delegated_vesting_shares: chainAccount.delegated_vesting_shares,\n received_vesting_shares: chainAccount.received_vesting_shares,\n vesting_withdraw_rate: chainAccount.vesting_withdraw_rate,\n to_withdraw: chainAccount.to_withdraw,\n withdrawn: chainAccount.withdrawn,\n witness_votes: chainAccount.witness_votes,\n proxy: chainAccount.proxy,\n recovery_account: chainAccount.recovery_account,\n proxied_vsf_votes: chainAccount.proxied_vsf_votes,\n voting_manabar: chainAccount.voting_manabar,\n voting_power: chainAccount.voting_power,\n downvote_manabar: chainAccount.downvote_manabar,\n follow_stats,\n reputation: reputationValue,\n profile,\n } satisfies FullAccount;\n },\n enabled: !!username,\n staleTime: 60000,\n });\n}\n","import { AccountProfile, FullAccount } from \"../types\";\n\nexport type ProfileTokens = AccountProfile[\"tokens\"];\n\nconst DENIED_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nfunction deepMerge>(target: T, source: Record): T {\n const result = { ...target } as Record;\n for (const key of Object.keys(source)) {\n if (DENIED_KEYS.has(key)) {\n continue;\n }\n const srcVal = source[key];\n const tgtVal = result[key];\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\n result[key] = deepMerge(tgtVal, srcVal);\n } else {\n result[key] = srcVal;\n }\n }\n return result as T;\n}\n\nexport interface BuildProfileMetadataArgs {\n existingProfile?: AccountProfile;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}\n\nfunction sanitizeTokens(\n tokens?: ProfileTokens | null\n): ProfileTokens | undefined {\n // Guard against corrupted data from blockchain where tokens is not an array\n if (!tokens || !Array.isArray(tokens)) {\n return undefined;\n }\n\n return tokens.map(({ meta, ...rest }) => {\n if (!meta || typeof meta !== \"object\") {\n return { ...rest, meta };\n }\n\n const { privateKey, username, ...safeMeta } = meta;\n return { ...rest, meta: safeMeta };\n });\n}\n\nexport function parseProfileMetadata(\n postingJsonMetadata?: string | null\n): AccountProfile {\n if (!postingJsonMetadata) {\n return {} as AccountProfile;\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n parsed.profile &&\n typeof parsed.profile === \"object\"\n ) {\n return parsed.profile as AccountProfile;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata:\", err, { length: postingJsonMetadata?.length ?? 0 });\n }\n\n return {} as AccountProfile;\n}\n\nexport function extractAccountProfile(\n data?: Pick | null\n): AccountProfile {\n return parseProfileMetadata(data?.posting_json_metadata);\n}\n\n/**\n * Choose between two account snapshots for a posting-metadata merge base.\n * Prefers `preferred` (typically the freshest cache entry) unless `fallback`\n * carries strictly more profile keys — guarding read-modify-write flows\n * against a snapshot whose metadata was served stripped by a misbehaving node\n * while another snapshot still holds the real profile. A partial update must\n * never shrink the profile while any snapshot still knows the full one.\n */\nexport function pickRicherMetadataSnapshot<\n T extends Pick\n>(\n preferred: T | null | undefined,\n fallback: T | null | undefined\n): T | null | undefined {\n if (!preferred) return fallback;\n if (!fallback) return preferred;\n const preferredKeys = Object.keys(\n parseProfileMetadata(preferred.posting_json_metadata)\n ).length;\n const fallbackKeys = Object.keys(\n parseProfileMetadata(fallback.posting_json_metadata)\n ).length;\n return fallbackKeys > preferredKeys ? fallback : preferred;\n}\n\n/**\n * Parse the FULL root object of posting_json_metadata, not just its `profile`\n * key. Returns {} for missing/invalid input or a non-object root.\n *\n * `parseProfileMetadata` intentionally returns only `parsed.profile`; this\n * helper exists so writers can carry forward any sibling top-level keys that\n * live alongside `profile` (data other Hive apps may store there) instead of\n * dropping them on the next update.\n */\nexport function parsePostingMetadataRoot(\n postingJsonMetadata?: string | null\n): Record {\n if (!postingJsonMetadata) {\n return {};\n }\n\n try {\n const parsed = JSON.parse(postingJsonMetadata);\n if (isPlainObject(parsed)) {\n return parsed;\n }\n } catch (err) {\n console.warn(\"[SDK] Failed to parse posting_json_metadata root:\", err, {\n length: postingJsonMetadata?.length ?? 0,\n });\n }\n\n return {};\n}\n\n/**\n * Build the serialized `posting_json_metadata` string for an account_update2\n * operation. It deep-merges the profile (via {@link buildProfileMetadata}) over\n * the account's CURRENT on-chain profile AND preserves any non-`profile`\n * top-level keys present in the existing metadata, so a partial profile update\n * (e.g. only `pinned` or only `tokens`) never clobbers unrelated fields.\n */\nexport function buildPostingJsonMetadata({\n existingPostingJsonMetadata,\n profile,\n tokens,\n}: {\n existingPostingJsonMetadata?: string | null;\n profile?: Partial | null;\n tokens?: ProfileTokens | null;\n}): string {\n const root = parsePostingMetadataRoot(existingPostingJsonMetadata);\n const existingProfile = isPlainObject(root.profile)\n ? (root.profile as AccountProfile)\n : ({} as AccountProfile);\n\n const mergedProfile = buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n });\n\n return JSON.stringify({ ...root, profile: mergedProfile });\n}\n\nexport function buildProfileMetadata({\n existingProfile,\n profile,\n tokens,\n}: BuildProfileMetadataArgs): AccountProfile {\n const { tokens: profileTokens, version: _ignoredVersion, ...profileRest } =\n profile ?? {};\n\n const metadata = deepMerge(\n (existingProfile ?? {}) as Record,\n profileRest as Record,\n ) as AccountProfile;\n\n // Clean up corrupted tokens data from blockchain before processing\n if (metadata.tokens && !Array.isArray(metadata.tokens)) {\n metadata.tokens = undefined;\n }\n\n // tokens semantics:\n // undefined → no change, fall back to profileTokens from profile partial\n // null or [] → explicitly clear tokens\n // non-empty array → set tokens\n if (tokens !== undefined) {\n // Explicit intent from caller: null or [] clears, non-empty array sets\n metadata.tokens = tokens && tokens.length > 0 ? tokens : [];\n } else if (profileTokens !== undefined) {\n // Fall back to tokens from profile partial (including empty array to clear)\n metadata.tokens = profileTokens;\n }\n\n metadata.tokens = sanitizeTokens(metadata.tokens);\n metadata.version = 2;\n\n return metadata;\n}\n","import { FullAccount, AccountProfile } from \"../types\";\nimport { parseProfileMetadata } from \"./profile-metadata\";\n\n/**\n * Parses raw account data from Hive API into FullAccount type\n * Handles profile metadata extraction from posting_json_metadata or json_metadata\n */\nexport function parseAccounts(rawAccounts: any[]): FullAccount[] {\n return rawAccounts.map((x) => {\n const account: FullAccount = {\n name: x.name,\n owner: x.owner,\n active: x.active,\n posting: x.posting,\n memo_key: x.memo_key,\n post_count: x.post_count,\n created: x.created,\n reputation: x.reputation,\n posting_json_metadata: x.posting_json_metadata,\n last_vote_time: x.last_vote_time,\n last_post: x.last_post,\n json_metadata: x.json_metadata,\n reward_hive_balance: x.reward_hive_balance,\n reward_hbd_balance: x.reward_hbd_balance,\n reward_vesting_hive: x.reward_vesting_hive,\n reward_vesting_balance: x.reward_vesting_balance,\n balance: x.balance,\n hbd_balance: x.hbd_balance,\n savings_balance: x.savings_balance,\n savings_hbd_balance: x.savings_hbd_balance,\n savings_hbd_last_interest_payment: x.savings_hbd_last_interest_payment,\n savings_hbd_seconds_last_update: x.savings_hbd_seconds_last_update,\n savings_hbd_seconds: x.savings_hbd_seconds,\n next_vesting_withdrawal: x.next_vesting_withdrawal,\n pending_claimed_accounts: x.pending_claimed_accounts,\n vesting_shares: x.vesting_shares,\n delegated_vesting_shares: x.delegated_vesting_shares,\n received_vesting_shares: x.received_vesting_shares,\n vesting_withdraw_rate: x.vesting_withdraw_rate,\n to_withdraw: x.to_withdraw,\n withdrawn: x.withdrawn,\n witness_votes: x.witness_votes,\n proxy: x.proxy,\n recovery_account: x.recovery_account,\n proxied_vsf_votes: x.proxied_vsf_votes,\n voting_manabar: x.voting_manabar,\n voting_power: x.voting_power,\n downvote_manabar: x.downvote_manabar,\n };\n\n // Try to parse profile from posting_json_metadata first\n let profile: AccountProfile | undefined = parseProfileMetadata(\n x.posting_json_metadata\n );\n\n // Fallback to json_metadata if posting_json_metadata didn't have a profile\n if (!profile || Object.keys(profile).length === 0) {\n try {\n const jsonMetadata = JSON.parse(x.json_metadata || \"{}\");\n if (jsonMetadata.profile) {\n profile = jsonMetadata.profile;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n // Ensure we always have a profile object\n if (!profile || Object.keys(profile).length === 0) {\n profile = {\n about: \"\",\n cover_image: \"\",\n location: \"\",\n name: \"\",\n profile_image: \"\",\n website: \"\",\n };\n }\n\n return { ...account, profile };\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { parseAccounts } from \"../utils/parse-accounts\";\nimport { FullAccount } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountsQueryOptions(usernames: string[]) {\n return queryOptions({\n queryKey: QueryKeys.accounts.list(...usernames),\n enabled: usernames.length > 0,\n queryFn: async (): Promise => {\n // A correct node always answers get_accounts with an array — a null\n // result in a well-formed envelope is a node fault (observed in the\n // wild), so the validator makes callRPC fail over to the next node\n // instead of resolving with a payload parseAccounts cannot map over.\n const response = (await callRPC(\n \"condenser_api.get_accounts\",\n [usernames],\n undefined,\n undefined,\n undefined,\n (rows) => Array.isArray(rows)\n )) as any[];\n return parseAccounts(response ?? []);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountFollowStats } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get follow count (followers and following) for an account\n */\nexport function getFollowCountQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followCount(username),\n queryFn: () =>\n callRPC(\"condenser_api.get_follow_count\", [\n username,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts following a user\n *\n * @param following - The account being followed\n * @param startFollower - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowersQueryOptions(\n following: string | undefined,\n startFollower: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.followers(following!, startFollower, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_followers\", [\n following,\n startFollower,\n followType,\n limit,\n ]) as Promise,\n enabled: !!following,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of accounts that a user is following\n *\n * @param follower - The account doing the following\n * @param startFollowing - Pagination start point (account name)\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getFollowingQueryOptions(\n follower: string,\n startFollowing: string,\n followType = \"blog\",\n limit = 100\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.following(follower, startFollowing, followType, limit),\n queryFn: () =>\n callRPC(\"condenser_api.get_following\", [\n follower,\n startFollowing,\n followType,\n limit,\n ]) as Promise,\n enabled: !!follower,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/** `condenser_api.get_following` caps a single response at 1000 rows. */\nconst MUTED_USERS_PAGE_SIZE = 1000;\n\n/**\n * Safety valve for the paging loop: 20 pages is 20k muted accounts, far past\n * any real mute list. Bounds the work if a node ever stops advancing the\n * cursor, so a malformed response degrades to a truncated list rather than an\n * endless request loop.\n */\nconst MUTED_USERS_MAX_PAGES = 20;\n\n/**\n * Get the full list of accounts a user has muted.\n *\n * Pages until the list is exhausted instead of taking the first N. That is\n * load-bearing: this result dims muted authors in feeds and collapses their\n * comments (`entry-list-item-muted-content`, `discussion-list`), so a truncated\n * list silently renders muted accounts as though they were never muted.\n *\n * Takes no limit, on purpose. `QueryKeys.accounts.mutedUsers` keys on the\n * username alone, so a limit parameter meant callers requesting different\n * amounts shared one cache entry and whichever mounted first decided how much\n * of the list every other caller saw.\n *\n * @param username - The account whose mute list to fetch\n */\nexport function getMutedUsersQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: QueryKeys.accounts.mutedUsers(username!),\n queryFn: async () => {\n const muted: string[] = [];\n let start = \"\";\n\n for (let page = 0; page < MUTED_USERS_MAX_PAGES; page++) {\n const response = (await callRPC(\"condenser_api.get_following\", [\n username,\n start,\n \"ignore\",\n MUTED_USERS_PAGE_SIZE,\n ])) as Follow[];\n\n if (!response?.length) {\n break;\n }\n\n let names = response.map((user) => user.following);\n\n // `start` is exclusive on Hive, so a page should not repeat the cursor.\n // Drop it defensively anyway: against a node treating `start` as\n // inclusive, this loop would otherwise re-append the same account until\n // it hit the page cap.\n if (names[0] === start) {\n names = names.slice(1);\n }\n\n if (!names.length) {\n break;\n }\n\n muted.push(...names);\n\n if (response.length < MUTED_USERS_PAGE_SIZE) {\n break;\n }\n\n start = names[names.length - 1];\n }\n\n return muted;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Lookup accounts by username prefix\n *\n * @param query - Username prefix to search for\n * @param limit - Maximum number of results (default: 50)\n */\nexport function lookupAccountsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.lookup(query, limit),\n queryFn: () =>\n callRPC(\"condenser_api.lookup_accounts\", [\n query,\n limit,\n ]) as Promise,\n enabled: !!query,\n staleTime: Infinity,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountsByUsernameQueryOptions(\n query: string,\n limit = 5,\n excludeList: string[] = []\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.search(query, excludeList),\n enabled: !!query,\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.lookup_accounts\", [query, limit])) as string[];\n return response.filter((item) =>\n excludeList.length > 0 ? !excludeList.includes(item) : true\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountProfile } from \"../types\";\n\ntype AccountProfileToken = NonNullable[number];\n\nexport type WalletMetadataCandidate = Partial & {\n currency?: string;\n show?: boolean;\n address?: string;\n publicKey?: string;\n privateKey?: string;\n username?: string;\n};\n\nexport interface CheckUsernameWalletsPendingResponse {\n exist: boolean;\n tokens?: WalletMetadataCandidate[];\n wallets?: WalletMetadataCandidate[];\n}\n\nconst RESERVED_META_KEYS = new Set([\n \"ownerPublicKey\",\n \"activePublicKey\",\n \"postingPublicKey\",\n \"memoPublicKey\",\n]);\n\ninterface WalletsEndpointResponseItem {\n token?: unknown;\n address?: unknown;\n status?: unknown;\n meta?: unknown;\n username?: unknown;\n}\n\nexport function checkUsernameWalletsPendingQueryOptions(\n username: string,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkWalletPending(username, code ?? null),\n queryFn: async () => {\n if (!username || !code) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/wallets\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n code,\n }),\n }\n );\n\n if (!response.ok) {\n return { exist: false } satisfies CheckUsernameWalletsPendingResponse;\n }\n\n const payload = (await response.json()) as unknown;\n\n const wallets: WalletMetadataCandidate[] = Array.isArray(payload)\n ? payload.flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n\n const walletItem = item as WalletsEndpointResponseItem;\n\n const symbol =\n typeof walletItem.token === \"string\"\n ? walletItem.token\n : undefined;\n\n if (!symbol) {\n return [];\n }\n\n const meta: Record =\n walletItem.meta && typeof walletItem.meta === \"object\"\n ? { ...(walletItem.meta as Record) }\n : {};\n\n const sanitizedMeta: Record = {};\n\n const address =\n typeof walletItem.address === \"string\" && walletItem.address\n ? walletItem.address\n : undefined;\n\n const statusShow =\n typeof walletItem.status === \"number\"\n ? walletItem.status === 3\n : undefined;\n\n const showFlag = statusShow ?? false;\n\n if (address) {\n sanitizedMeta.address = address;\n }\n\n sanitizedMeta.show = showFlag;\n\n const baseCandidate = {\n symbol,\n currency: symbol,\n address,\n show: showFlag,\n type: \"CHAIN\",\n meta: sanitizedMeta,\n } satisfies WalletMetadataCandidate;\n\n const metaTokenCandidates: WalletMetadataCandidate[] = [];\n\n for (const [metaSymbol, metaValue] of Object.entries(meta)) {\n if (typeof metaSymbol !== \"string\") {\n continue;\n }\n\n if (RESERVED_META_KEYS.has(metaSymbol)) {\n continue;\n }\n\n if (typeof metaValue !== \"string\" || !metaValue) {\n continue;\n }\n\n if (!/^[A-Z0-9]{2,10}$/.test(metaSymbol)) {\n continue;\n }\n\n metaTokenCandidates.push({\n symbol: metaSymbol,\n currency: metaSymbol,\n address: metaValue,\n show: showFlag,\n type: \"CHAIN\",\n meta: { address: metaValue, show: showFlag },\n });\n }\n\n return [baseCandidate, ...metaTokenCandidates];\n })\n : [];\n\n return {\n exist: wallets.length > 0,\n tokens: wallets.length ? wallets : undefined,\n wallets: wallets.length ? wallets : undefined,\n } satisfies CheckUsernameWalletsPendingResponse;\n },\n refetchOnMount: true,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { AccountRelationship } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRelationshipBetweenAccountsQueryOptions(\n reference: string | undefined,\n target: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.relations(reference, target),\n enabled: !!reference && !!target,\n refetchOnMount: false,\n refetchInterval: 3_600_000,\n queryFn: async () => {\n const fallback: AccountRelationship = {\n follows: false,\n ignores: false,\n blacklists: false,\n follows_muted: false,\n follows_blacklists: false,\n };\n\n // `enabled` only gates the automatic useQuery run. fetchQuery and\n // prefetchQuery invoke queryFn regardless, so guard here as well rather\n // than sending a missing account name to the RPC and caching the result.\n if (!reference || !target) {\n return fallback;\n }\n\n const result = await callRPC(\"bridge.get_relationship_between_accounts\", [reference, target]);\n return (result ?? fallback) as AccountRelationship;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype Subscriptions = string[];\n\nexport function getAccountSubscriptionsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.subscriptions(username!),\n enabled: !!username,\n queryFn: async ({ signal }) => {\n const response = await callRPC(\"bridge.list_all_subscriptions\", {\n account: username,\n }, undefined, undefined, signal);\n return (response ?? []) as Subscriptions;\n },\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountBookmark } from \"../types\";\n\nexport function getBookmarksQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.bookmarks(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Bookmarks] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountBookmark[];\n },\n });\n}\n\nexport function getBookmarksInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.bookmarksInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/bookmarks?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bookmarks: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../types\";\n\nexport function getFavoritesQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.favorites(activeUsername),\n enabled: !!activeUsername && !!code,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n return (await response.json()) as AccountFavorite[];\n },\n });\n}\n\nexport function getFavoritesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.favoritesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/favorites?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch favorites: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n/**\n * Query options to check if a specific account is in the active user's favorites\n * @param activeUsername - The logged-in user's username\n * @param code - Access token for authentication\n * @param targetUsername - The username to check if favorited\n * @returns Query options for checking if target is favorited\n */\nexport function checkFavoriteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n targetUsername: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.checkFavorite(activeUsername!, targetUsername!),\n enabled: !!activeUsername && !!code && !!targetUsername,\n queryFn: async () => {\n if (!activeUsername || !code) {\n throw new Error(\"[SDK][Accounts][Favorites] – missing auth\");\n }\n if (!targetUsername) {\n throw new Error(\"[SDK][Accounts][Favorites] – no target username\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-check\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n account: targetUsername,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n const result = await response.json();\n if (typeof result !== \"boolean\") {\n throw new Error(\n `[SDK][Accounts][Favorites] – favorites-check returned invalid type: expected boolean, got ${typeof result}`\n );\n }\n\n return result;\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetRecoveriesEmailResponse } from \"../types\";\n\nexport function getAccountRecoveriesQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n enabled: !!username && !!code,\n queryKey: QueryKeys.accounts.recoveries(username!),\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Accounts] Missing username or access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/recoveries\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n }\n );\n\n return response.json() as Promise;\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountPendingRecoveryQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n enabled: !!username,\n queryKey: QueryKeys.accounts.pendingRecovery(username!),\n queryFn: () =>\n callRPC(\"database_api.find_change_recovery_account_requests\", { accounts: [username] }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountReputation } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getAccountReputationsQueryOptions(query: string, limit = 50) {\n return queryOptions({\n queryKey: QueryKeys.accounts.reputations(query, limit),\n enabled: !!query,\n queryFn: async (): Promise => {\n if (!query) {\n return [];\n }\n\n return callRPC(\"condenser_api.get_account_reputations\", [query, limit]) as Promise;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { utils } from \"../../../hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Transaction, OperationGroup } from \"../types/transaction\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { parseAsset, NaiMap } from \"@/modules/core/utils\";\n\nconst ops = utils.operations;\n\nexport const ACCOUNT_OPERATION_GROUPS: Record = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n};\n\nexport const ALL_ACCOUNT_OPERATIONS = [...Object.values(ACCOUNT_OPERATION_GROUPS)].reduce(\n (acc, val) => acc.concat(val),\n []\n);\n\ninterface TxPageRaw {\n entries: Transaction[];\n currentPage: number;\n}\n\n/**\n * Cursor for transaction pagination.\n * null = first request (returns newest page, API omits page param).\n * number = specific page to fetch (decrementing for older data).\n */\ntype TxCursor = number | null;\n\ninterface HafahOperation {\n op: {\n type: string;\n value: Record;\n };\n block: number;\n trx_id: string;\n op_pos: number;\n op_type_id: number;\n timestamp: string;\n virtual_op: boolean;\n operation_id: string;\n trx_in_block: number;\n}\n\ninterface HafahResponse {\n total_operations: number;\n total_pages: number;\n operations_result: HafahOperation[];\n}\n\n/**\n * Derive a safe, unique, and chronologically ordered `num` from REST fields.\n *\n * Layout: block * 10_000_000 + trx_in_block * 100 + op_pos\n * - trx_in_block: up to 99_999 (Hive max block size ~65K txs)\n * - op_pos: up to 99 (operations within a single transaction)\n * - Max value: 105_000_000 * 10_000_000 = 1.05e15, within MAX_SAFE_INTEGER (9.007e15)\n */\nfunction deriveNum(entry: HafahOperation): number {\n return entry.block * 10_000_000 + entry.trx_in_block * 100 + entry.op_pos;\n}\n\n/**\n * Strip the `_operation` suffix from the REST API type name\n * to match the Transaction type discriminants (e.g. \"transfer\").\n */\nfunction normalizeOpType(restType: string): string {\n return restType.replace(/_operation$/, \"\");\n}\n\n/**\n * Check if a value is a NAI asset object (e.g. { nai: \"@@000000021\", amount: \"1000\", precision: 3 }).\n */\nfunction isNaiAsset(v: unknown): v is { nai: string; amount: string; precision: number } {\n return typeof v === \"object\" && v !== null && \"nai\" in v && \"amount\" in v && \"precision\" in v;\n}\n\n/**\n * Convert a NAI asset object to a human-readable string like \"1.000 HIVE\".\n * Returns the value unchanged if it's not a NAI object.\n */\nfunction naiToString(v: unknown): unknown {\n if (!isNaiAsset(v)) return v;\n const parsed = parseAsset(v);\n const symbol = NaiMap[v.nai as keyof typeof NaiMap] ?? \"UNKNOWN\";\n return `${parsed.amount.toFixed(v.precision)} ${symbol}`;\n}\n\n/**\n * Convert all NAI asset objects in an operation's value to human-readable strings\n * so downstream renderers that expect \"1.000 HIVE\" don't crash with object values.\n */\nfunction normalizeOpValue(value: Record): Record {\n const result: Record = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = naiToString(v);\n }\n return result;\n}\n\n/**\n * Get account transaction history with pagination and filtering.\n * Uses the hafah-api REST endpoint for server-side op-type filtering\n * and real pagination metadata.\n *\n * @param username - Account name to get transactions for\n * @param limit - Number of transactions per page\n * @param group - Filter by operation group (transfers, market-orders, etc.)\n */\nexport function getTransactionsInfiniteQueryOptions(\n username?: string,\n limit = 20,\n group: OperationGroup | \"\" = \"\"\n) {\n const operationTypes = group\n ? ACCOUNT_OPERATION_GROUPS[group]\n : ALL_ACCOUNT_OPERATIONS;\n\n return infiniteQueryOptions<\n TxPageRaw,\n Error,\n InfiniteData,\n (string | number)[],\n TxCursor\n >({\n queryKey: QueryKeys.accounts.transactions(username ?? \"\", group, limit),\n initialPageParam: null as TxCursor,\n\n queryFn: async ({ pageParam, signal }: { pageParam: TxCursor; signal?: AbortSignal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"operation-types\": operationTypes.join(\",\"),\n \"page-size\": limit,\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number (decrementing)\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"hafah\",\n \"/accounts/{account-name}/operations\",\n params,\n undefined,\n undefined,\n signal\n )) as HafahResponse;\n\n const entries = response.operations_result.map((entry) => {\n const type = normalizeOpType(entry.op.type);\n const value = normalizeOpValue(entry.op.value);\n return {\n ...value,\n num: deriveNum(entry),\n type,\n timestamp: entry.timestamp,\n trx_id: entry.trx_id,\n } as Transaction;\n });\n\n return {\n entries,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getBotsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.bots(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/public/bots\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bots: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n refetchOnMount: true,\n staleTime: Infinity,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { ReferralItem } from \"../types/referral\";\n\ntype PageParam = { maxId?: number };\n\nexport function getReferralsInfiniteQueryOptions(username: string) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.accounts.referrals(username),\n initialPageParam: { maxId: undefined } as PageParam,\n queryFn: async ({ pageParam }: { pageParam: PageParam }) => {\n const { maxId } = pageParam ?? {};\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(`/private-api/referrals/${username}`, baseUrl);\n\n if (maxId !== undefined) {\n url.searchParams.set(\"max_id\", maxId.toString());\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referrals: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n getNextPageParam: (lastPage: ReferralItem[]) => {\n const nextMaxId = lastPage?.[lastPage.length - 1]?.id;\n return typeof nextMaxId === \"number\" ? ({ maxId: nextMaxId } as PageParam) : undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ReferralStat } from \"../types/referral\";\n\ninterface ReferralStatsResponse {\n total?: number;\n rewarded?: number;\n}\n\nexport function getReferralsStatsQueryOptions(username: string) {\n return queryOptions({\n queryKey: QueryKeys.accounts.referralsStats(username),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/referrals/${username}/stats`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch referral stats: ${response.status}`);\n }\n\n const data = await response.json() as ReferralStatsResponse;\n\n if (!data) {\n throw new Error(\"No Referrals for this user!\");\n }\n\n return {\n total: data.total ?? 0,\n rewarded: data.rewarded ?? 0,\n } as ReferralStat;\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendsRow } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FriendsPageParam {\n startFollowing: string;\n}\n\ntype FriendsPage = FriendsRow[];\n\n/**\n * Get list of friends (following/followers) with profile information\n *\n * @param following - The account whose friends to get\n * @param mode - \"following\" or \"followers\"\n * @param followType - Type of follow relationship (default: \"blog\")\n * @param limit - Number of results per page (default: 100)\n * @param enabled - Whether query is enabled (default: true)\n */\nexport function getFriendsInfiniteQueryOptions(\n following: string,\n mode: \"following\" | \"followers\",\n options?: {\n followType?: string;\n limit?: number;\n enabled?: boolean;\n }\n) {\n const { followType = \"blog\", limit = 100, enabled = true } = options ?? {};\n\n return infiniteQueryOptions<\n FriendsPage,\n Error,\n InfiniteData,\n (string | number)[],\n FriendsPageParam\n >({\n queryKey: QueryKeys.accounts.friends(following, mode, followType, limit),\n initialPageParam: { startFollowing: \"\" } as FriendsPageParam,\n enabled,\n refetchOnMount: true,\n\n queryFn: async ({ pageParam }: { pageParam: FriendsPageParam }) => {\n const { startFollowing } = pageParam;\n\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [following, startFollowing === \"\" ? null : startFollowing, followType, limit])) as Follow[];\n\n const accountNames = response.map((e) =>\n mode === \"following\" ? e.following : e.follower\n );\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n const rows: FriendsPage = (accounts ?? []).map((a) => ({\n name: a.name,\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n }));\n\n return rows;\n },\n\n getNextPageParam: (lastPage: FriendsPage): FriendsPageParam | undefined =>\n lastPage && lastPage.length === limit\n ? { startFollowing: lastPage[lastPage.length - 1].name }\n : undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Follow, Profile, FriendSearchResult } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst SEARCH_LIMIT = 30;\n\n/**\n * Search friends (following/followers) by query string\n *\n * @param username - The account whose friends to search\n * @param mode - \"following\" or \"followers\"\n * @param query - Search query string\n */\nexport function getSearchFriendsQueryOptions(\n username: string,\n mode: \"following\" | \"followers\",\n query: string\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.searchFriends(username, mode, query),\n refetchOnMount: false,\n enabled: false, // Manual query via refetch\n queryFn: async (): Promise => {\n if (!query) return [];\n\n const start = query.slice(0, -1);\n const method = mode === \"following\" ? \"get_following\" : \"get_followers\";\n const response = (await callRPC(`condenser_api.${method}`, [username, start, \"blog\", 1000])) as Follow[];\n\n const accountNames = response\n .map((e) => (mode === \"following\" ? e.following : e.follower))\n .filter((name) => name.toLowerCase().includes(query.toLowerCase()))\n .slice(0, SEARCH_LIMIT);\n\n // Get profiles via bridge API\n const accounts = (await callRPC(\"bridge.get_profiles\", {\n accounts: accountNames,\n observer: undefined,\n })) as Profile[];\n\n return (\n accounts?.map((a) => ({\n name: a.name,\n full_name: a.metadata.profile?.name || \"\",\n reputation: a.reputation,\n active: a.active, // Return raw timestamp\n })) ?? []\n );\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsQueryOptions(limit = 20) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTags(),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags\n .filter((x) => x.name !== \"\")\n .filter((x) => !x.name.startsWith(\"hive-\"))\n .map((x) => x.name)\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length > 0\n ? { afterTag: lastPage[lastPage.length - 1] }\n : undefined,\n staleTime: 60 * 60 * 1000, // 1 hour — tags change slowly\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { isCommunity } from \"@/modules/core/utils\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { TrendingTag } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getTrendingTagsWithStatsQueryOptions(limit = 250) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.trendingTagsWithStats(limit),\n queryFn: async ({ pageParam: { afterTag } }) =>\n callRPC(\"condenser_api.get_trending_tags\", [afterTag, limit])\n .then((tags: TrendingTag[]) =>\n tags.filter((tag) => tag.name !== \"\").filter((tag) => !isCommunity(tag.name))\n ),\n initialPageParam: { afterTag: \"\" },\n getNextPageParam: (lastPage) =>\n lastPage?.length ? { afterTag: lastPage[lastPage.length - 1].name } : undefined,\n staleTime: Infinity,\n });\n}\n","import { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\n\nexport function getFragmentsQueryOptions(username: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.fragments(username),\n queryFn: async () => {\n if (!code) {\n return [];\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return response.json() as Promise;\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getFragmentsInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.fragmentsInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/fragments?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch fragments: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { ConfigManager, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\n// TODO: replace any with Entry\nexport function getPromotedPostsQuery(\n type: \"feed\" | \"waves\" = \"feed\"\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.promoted(type),\n queryFn: async () => {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/promoted-entries\", baseUrl);\n if (type === \"waves\") {\n url.searchParams.append(\"short_content\", \"1\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n const data = await response.json();\n return data as T[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry, Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getEntryActiveVotesQueryOptions(entry?: Entry) {\n return queryOptions({\n queryKey: QueryKeys.posts.entryActiveVotes(entry?.author, entry?.permlink),\n queryFn: async () => {\n return callRPC(\"condenser_api.get_active_votes\", [\n entry?.author,\n entry?.permlink,\n ]) as Promise;\n },\n enabled: !!entry,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { Vote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a specific user's vote on a post\n * Useful when post has >1000 votes to efficiently get one user's vote\n *\n * @param username - The voter's username\n * @param author - The post author\n * @param permlink - The post permlink\n */\nexport function getUserPostVoteQueryOptions(\n username: string | undefined,\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.userPostVote(username!, author!, permlink!),\n queryFn: async () => {\n const result = await callRPC(\"database_api.list_votes\", {\n start: [username, author, permlink],\n limit: 1,\n order: \"by_voter_comment\"\n });\n\n // Return first vote if found, otherwise null\n return (result?.votes?.[0] || null) as Vote | null;\n },\n enabled: !!username && !!author && !!permlink,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.content(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getContentRepliesQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.contentReplies(author, permlink),\n enabled: !!author && !!permlink,\n queryFn: async (): Promise =>\n callRPC(\"condenser_api.get_content_replies\", {\n author,\n permlink,\n }) as Promise,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostHeaderQueryOptions(author: string, permlink: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.postHeader(author, permlink),\n queryFn: async () => {\n return callRPC(\"bridge.get_post_header\", {\n author,\n permlink,\n }) as Promise;\n },\n initialData: null,\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { Entry } from \"../types\";\n\n/**\n * Filters and censors entries that match DMCA patterns\n * @param entry - Single entry or array of entries to filter\n * @returns Filtered entry/entries with DMCA content censored.\n * Note: Can return null/undefined if input is falsy - callers should guard against this.\n */\nexport function filterDmcaEntry(entry: Entry): Entry | null | undefined;\nexport function filterDmcaEntry(entries: Entry[]): Entry[];\nexport function filterDmcaEntry(entryOrEntries: Entry | Entry[] | null | undefined): Entry | Entry[] | null | undefined {\n if (Array.isArray(entryOrEntries)) {\n // Array elements are non-null Entries, so applyFilter never returns nullish here.\n return entryOrEntries.map((entry) => applyFilter(entry)) as Entry[];\n }\n return applyFilter(entryOrEntries);\n}\n\nfunction applyFilter(entry: Entry | null | undefined): Entry | null | undefined {\n if (!entry) return entry;\n\n const entryPath = `@${entry.author}/${entry.permlink}`;\n const isDmca =\n CONFIG.dmcaPatterns.includes(entryPath) ||\n CONFIG.dmcaPatternRegexes.some((regex) => regex.test(entryPath));\n\n if (isDmca) {\n return {\n ...entry,\n body: \"This post is not available due to a copyright/fraudulent claim.\",\n title: \"\",\n };\n }\n\n return entry;\n}\n","import { callWithQuorum } from \"../../hive-tx\";\nimport { Entry } from \"@/modules/posts/types\";\n\n/**\n * When the primary node returns null for a get_post call,\n * verify by querying multiple random nodes. If any node\n * returns the post, it exists (the first node was lagging).\n *\n * Uses callWithQuorum(quorum=1) which shuffles and queries\n * nodes in batches. Since it shuffles, it's unlikely to hit\n * the same node that just returned null first.\n */\nexport async function verifyPostOnAlternateNode(\n author: string,\n permlink: string,\n observer: string\n): Promise {\n try {\n const response = await callWithQuorum(\"bridge.get_post\", {\n author,\n permlink,\n observer,\n }, 1);\n\n if (\n response &&\n typeof response === \"object\" &&\n (response as Entry).author === author &&\n (response as Entry).permlink === permlink\n ) {\n return response as Entry;\n }\n } catch {\n // All nodes failed or returned null\n }\n\n return null;\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { verifyPostOnAlternateNode } from \"@/modules/bridge/verify-on-alternate-node\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getPostQueryOptions(\n author: string,\n permlink?: string,\n observer = \"\",\n num?: number\n) {\n const cleanPermlink = permlink?.trim();\n const entryPath = `/@${author}/${cleanPermlink ?? \"\"}`;\n\n return queryOptions({\n queryKey: QueryKeys.posts.entry(entryPath),\n queryFn: async () => {\n if (!cleanPermlink || cleanPermlink === \"undefined\") {\n return null;\n }\n\n // hive-tx tries nodes in order; the first healthy node (index 0) handles this call.\n // If it returns null, verifyPostOnAlternateNode skips index 0 and tries others.\n const response = await callRPC(\"bridge.get_post\", {\n author,\n permlink: cleanPermlink,\n observer,\n });\n\n if (!response) {\n // Primary node returned null — verify on alternate nodes\n // to guard against sync lag returning null for valid posts\n const verified = await verifyPostOnAlternateNode(author, cleanPermlink, observer);\n if (!verified) {\n return null;\n }\n const verifiedEntry = num !== undefined ? { ...verified, num } as Entry : verified as Entry;\n return filterDmcaEntry(verifiedEntry);\n }\n\n const entry = num !== undefined ? { ...response, num } as Entry : response as Entry;\n return filterDmcaEntry(entry);\n },\n enabled:\n !!author &&\n !!permlink &&\n permlink.trim() !== \"\" &&\n permlink.trim() !== \"undefined\",\n });\n}\n","import { CONFIG } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { AccountRelationship, Profile } from \"@/modules/accounts/types\";\nimport { Community } from \"@/modules/communities/types/community\";\nimport { Subscription } from \"@/modules/communities/types/subscription\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { filterDmcaEntry } from \"@/modules/posts/utils/filter-dmca-entries\";\n\ntype BridgeParams = Record | unknown[];\n\nexport function bridgeApiCall(endpoint: string, params: BridgeParams, signal?: AbortSignal): Promise {\n return callRPC(`bridge.${endpoint}`, params, undefined, undefined, signal) as Promise;\n}\n\nexport async function resolvePost(\n post: Entry,\n observer: string,\n num?: number,\n signal?: AbortSignal\n): Promise {\n const { json_metadata: json } = post;\n\n if (json?.original_author && json?.original_permlink && json.tags?.[0] === \"cross-post\") {\n try {\n const resp = await getPost(\n json.original_author,\n json.original_permlink,\n observer,\n num,\n signal\n );\n if (resp) {\n return {\n ...post,\n original_entry: resp,\n num,\n };\n }\n return post;\n } catch {\n return post;\n }\n }\n\n return { ...post, num };\n}\n\nasync function resolvePosts(posts: Entry[], observer: string, signal?: AbortSignal): Promise {\n const validatedPosts = posts.map(validateEntry);\n const resolved = await Promise.all(validatedPosts.map((p) => resolvePost(p, observer, undefined, signal)));\n return filterDmcaEntry(resolved) as Entry[];\n}\n\nexport async function getPostsRanked(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_ranked_posts\", {\n sort,\n start_author,\n start_permlink,\n limit,\n tag,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_ranked_posts returned ${typeof resp} instead of an array for sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\nexport async function getAccountPosts(\n sort: string,\n account: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n observer: string = \"\",\n signal?: AbortSignal\n): Promise {\n if (CONFIG.dmcaAccounts.includes(account)) {\n return [];\n }\n\n const resp = await bridgeApiCall(\"get_account_posts\", {\n sort,\n account,\n start_author,\n start_permlink,\n limit,\n observer,\n }, signal);\n\n if (Array.isArray(resp)) {\n return resolvePosts(resp, observer, signal);\n }\n\n if (resp != null) {\n console.warn(\n `[SDK] get_account_posts returned ${typeof resp} instead of an array for account=${account}, sort=${sort}; treating as no results.`\n );\n }\n\n return null;\n}\n\n/**\n * Validates that an Entry object has required properties with non-null values.\n */\nfunction validateEntry(entry: Entry): Entry {\n const newEntry: Entry = {\n ...entry,\n active_votes: Array.isArray(entry.active_votes) ? [...entry.active_votes] : [],\n beneficiaries: Array.isArray(entry.beneficiaries) ? [...entry.beneficiaries] : [],\n blacklists: Array.isArray(entry.blacklists) ? [...entry.blacklists] : [],\n replies: Array.isArray(entry.replies) ? [...entry.replies] : [],\n stats: entry.stats ? { ...entry.stats } : null,\n };\n\n const requiredStringProps: (keyof Entry)[] = [\n \"author\",\n \"title\",\n \"body\",\n \"created\",\n \"category\",\n \"permlink\",\n \"url\",\n \"updated\",\n ];\n\n for (const prop of requiredStringProps) {\n if (newEntry[prop] == null) {\n (newEntry as any)[prop] = \"\";\n }\n }\n\n if (newEntry.author_reputation == null) {\n newEntry.author_reputation = 0;\n }\n if (newEntry.children == null) {\n newEntry.children = 0;\n }\n if (newEntry.depth == null) {\n newEntry.depth = 0;\n }\n if (newEntry.net_rshares == null) {\n newEntry.net_rshares = 0;\n }\n if (newEntry.payout == null) {\n newEntry.payout = 0;\n }\n if (newEntry.percent_hbd == null) {\n newEntry.percent_hbd = 0;\n }\n\n if (!newEntry.stats) {\n newEntry.stats = {\n flag_weight: 0,\n gray: false,\n hide: false,\n total_votes: 0,\n };\n }\n\n if (newEntry.author_payout_value == null) {\n newEntry.author_payout_value = \"0.000 HBD\";\n }\n if (newEntry.curator_payout_value == null) {\n newEntry.curator_payout_value = \"0.000 HBD\";\n }\n if (newEntry.max_accepted_payout == null) {\n newEntry.max_accepted_payout = \"1000000.000 HBD\";\n }\n if (newEntry.payout_at == null) {\n newEntry.payout_at = \"\";\n }\n if (newEntry.pending_payout_value == null) {\n newEntry.pending_payout_value = \"0.000 HBD\";\n }\n if (newEntry.promoted == null) {\n newEntry.promoted = \"0.000 HBD\";\n }\n\n if (newEntry.is_paidout == null) {\n newEntry.is_paidout = false;\n }\n\n return newEntry;\n}\n\nexport async function getPost(\n author: string = \"\",\n permlink: string = \"\",\n observer: string = \"\",\n num?: number,\n signal?: AbortSignal\n): Promise {\n const resp = await bridgeApiCall(\"get_post\", {\n author,\n permlink,\n observer,\n }, signal);\n\n if (resp) {\n const validatedEntry = validateEntry(resp);\n const post = await resolvePost(validatedEntry, observer, num, signal);\n return filterDmcaEntry(post) as Entry;\n }\n\n return undefined;\n}\n\nexport async function getPostHeader(\n author: string = \"\",\n permlink: string = \"\"\n): Promise {\n const resp = await bridgeApiCall(\"get_post_header\", {\n author,\n permlink,\n });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getDiscussion(\n author: string,\n permlink: string,\n observer?: string\n): Promise | null> {\n const resp = await bridgeApiCall | null>(\"get_discussion\", {\n author,\n permlink,\n observer: observer || author,\n });\n\n if (resp) {\n const validatedResp: Record = {};\n for (const [key, entry] of Object.entries(resp)) {\n validatedResp[key] = validateEntry(entry);\n }\n return validatedResp;\n }\n return resp;\n}\n\nexport async function getCommunity(\n name: string,\n observer: string | undefined = \"\"\n): Promise {\n return bridgeApiCall(\"get_community\", { name, observer });\n}\n\nexport async function getCommunities(\n last: string = \"\",\n limit: number = 100,\n query?: string | null,\n sort: string = \"rank\",\n observer: string = \"\"\n): Promise {\n return bridgeApiCall(\"list_communities\", {\n last,\n limit,\n query,\n sort,\n observer,\n });\n}\n\nexport async function normalizePost(post: unknown): Promise {\n const resp = await bridgeApiCall(\"normalize_post\", { post });\n return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getSubscriptions(account: string): Promise {\n return bridgeApiCall(\"list_all_subscriptions\", { account });\n}\n\nexport async function getSubscribers(community: string): Promise {\n return bridgeApiCall(\"list_subscribers\", { community });\n}\n\nexport async function getRelationshipBetweenAccounts(\n follower: string,\n following: string\n): Promise {\n return bridgeApiCall(\"get_relationship_between_accounts\", [\n follower,\n following,\n ]);\n}\n\nexport async function getProfiles(\n accounts: string[],\n observer?: string\n): Promise {\n return bridgeApiCall(\"get_profiles\", { accounts, observer });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getDiscussion } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport enum SortOrder {\n trending = \"trending\",\n author_reputation = \"author_reputation\",\n votes = \"votes\",\n created = \"created\",\n}\n\nfunction parseAsset(value: string): { amount: number; symbol: string } {\n const match = value.match(/^(\\d+\\.?\\d*)\\s*([A-Z]+)$/);\n if (!match) return { amount: 0, symbol: \"\" };\n return {\n amount: parseFloat(match[1]),\n symbol: match[2],\n };\n}\n\nexport function sortDiscussions(\n entry: Entry,\n discussion: Entry[],\n order: SortOrder\n) {\n const allPayout = (c: Entry) =>\n parseAsset(c.pending_payout_value).amount +\n parseAsset(c.author_payout_value).amount +\n parseAsset(c.curator_payout_value).amount;\n\n const absNegative = (a: Entry) => a.net_rshares < 0;\n const isPinned = (a: Entry) =>\n entry.json_metadata?.pinned_reply === `${a.author}/${a.permlink}`;\n\n const sortOrders = {\n trending: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const _a = allPayout(a);\n const _b = allPayout(b);\n if (_a !== _b) {\n return _b - _a;\n }\n\n return 0;\n },\n author_reputation: (a: Entry, b: Entry) => {\n const keyA = a.author_reputation;\n const keyB = b.author_reputation;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n votes: (a: Entry, b: Entry) => {\n const keyA = a.children;\n const keyB = b.children;\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n created: (a: Entry, b: Entry) => {\n if (absNegative(a)) {\n return 1;\n }\n\n if (absNegative(b)) {\n return -1;\n }\n\n const keyA = Date.parse(a.created);\n const keyB = Date.parse(b.created);\n\n if (keyA > keyB) return -1;\n if (keyA < keyB) return 1;\n\n return 0;\n },\n };\n\n const sorted = discussion.sort(sortOrders[order]);\n const pinnedIndex = sorted.findIndex((i) => isPinned(i));\n const pinned = sorted[pinnedIndex];\n if (pinnedIndex >= 0) {\n sorted.splice(pinnedIndex, 1);\n sorted.unshift(pinned);\n }\n return sorted;\n}\n\nexport function getDiscussionsQueryOptions(\n entry: Entry,\n order: SortOrder = SortOrder.created,\n enabled: boolean = true,\n observer?: string\n) {\n // Anonymous readers fall back to CONFIG.defaultObserver rather than the post\n // author. Author-as-observer only helps the minority of authors who curate a\n // mute list; everyone else's comment section came back unfiltered, so the\n // shared moderation account is the better default for logged-out traffic.\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussions(entry?.author, entry?.permlink, order, resolvedObserver),\n queryFn: async () => {\n if (!entry) {\n return [];\n }\n\n const response = await callRPC(\"bridge.get_discussion\", {\n author: entry.author,\n permlink: entry.permlink,\n observer: resolvedObserver,\n });\n\n const results = response\n ? Array.from(Object.values(response as Record))\n : [];\n return filterDmcaEntry(results);\n },\n enabled: enabled && !!entry,\n select: (data: Entry[]) => sortDiscussions(entry, data, order),\n // Preserve optimistic entries during refetch by using structural sharing\n // This ensures newly added comments (is_optimistic: true) aren't wiped out\n // when blockchain hasn't indexed them yet\n structuralSharing: (oldData, newData) => {\n if (!oldData || !newData) return newData;\n\n // Find optimistic entries in old data that aren't in new data yet\n const optimisticEntries = (oldData as Entry[]).filter(\n (entry: Entry) => entry.is_optimistic === true\n );\n\n const fetchedPermlinks = new Set(\n (newData as Entry[]).map((e: Entry) => `${e.author}/${e.permlink}`)\n );\n\n const missingOptimistic = optimisticEntries.filter(\n (opt: Entry) => !fetchedPermlinks.has(`${opt.author}/${opt.permlink}`)\n );\n\n // If there are optimistic entries missing from new data, preserve them\n if (missingOptimistic.length > 0) {\n return [...(newData as Entry[]), ...missingOptimistic];\n }\n\n return newData;\n },\n });\n}\n\nexport function getDiscussionQueryOptions(\n author: string,\n permlink: string,\n observer?: string,\n enabled = true\n) {\n const resolvedObserver = observer || CONFIG.defaultObserver;\n\n return queryOptions({\n queryKey: QueryKeys.posts.discussion(author, permlink, resolvedObserver),\n enabled: enabled && !!author && !!permlink,\n queryFn: async () =>\n getDiscussion(author, permlink, resolvedObserver) as Promise | null>,\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getAccountPosts } from \"@/modules/bridge\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n hasNextPage: boolean;\n};\ntype Page = Entry[];\n\nexport function getAccountPostsInfiniteQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return infiniteQueryOptions<\n Page,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.accountPosts(username ?? \"\", filter, limit, observer),\n enabled: !!username && enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n hasNextPage: true,\n } as PageParam,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!pageParam?.hasNextPage || !username) return [];\n\n const response = await getAccountPosts(\n filter,\n username,\n pageParam.author ?? \"\",\n pageParam.permlink ?? \"\",\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n\n getNextPageParam: (lastPage: Page): PageParam | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n // Only consider there's a next page if we got a full page of results\n // A partial page means we've reached the end\n const hasNextPage = (lastPage?.length ?? 0) === limit;\n\n if (!hasNextPage) {\n return undefined;\n }\n\n return {\n author: last?.author,\n permlink: last?.permlink,\n hasNextPage,\n };\n },\n });\n}\n\nexport function getAccountPostsQueryOptions(\n username: string | undefined,\n filter = \"posts\",\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit = 20,\n observer = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.accountPostsPage(username ?? \"\", filter, start_author, start_permlink, limit, observer),\n enabled: !!username && enabled,\n queryFn: async ({ signal } = {} as any) => {\n if (!username) {\n return [];\n }\n\n const response = await getAccountPosts(\n filter,\n username,\n start_author,\n start_permlink,\n limit,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Entry } from \"../types\";\nimport { filterDmcaEntry } from \"../utils/filter-dmca-entries\";\nimport { getPostsRanked } from \"@/modules/bridge\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype PageParam = {\n author: string | undefined;\n permlink: string | undefined;\n};\n\ninterface GetPostsRankedOptions {\n resolvePosts?: boolean;\n}\n\n/**\n * `select` runs on every render, and React Query only reuses its previous\n * result when both the data and the select function are unchanged. These\n * options are rebuilt on each render, so an inline arrow would be a new\n * function every time and every page would be re-sorted on every render.\n * One stable function per sort keeps that memoization working.\n */\nconst displaySelects = new Map<\n string,\n (data: InfiniteData) => InfiniteData\n>();\n\nfunction displaySelect(sort: string) {\n let select = displaySelects.get(sort);\n if (!select) {\n select = (data) => ({\n ...data,\n pages: data.pages.map((page) => orderForDisplay(page, sort)),\n });\n displaySelects.set(sort, select);\n }\n return select;\n}\n\n/**\n * Display order for one page.\n *\n * Pinned entries are captured before the created-date sort: the bridge surfaces\n * them at the head of the response in the community moderators' chosen order,\n * which the sort would scatter by age. Every pin is kept, since an earlier\n * post-sort find() kept one and silently dropped the rest, so multi-pin\n * communities never displayed their other pinned posts. Pins only occur on the\n * first page, cursor pages return none, so this is a no-op elsewhere.\n *\n * Applied in `select` rather than in the query function so it cannot reach the\n * pagination cursor.\n */\nfunction orderForDisplay(page: Entry[], sort: string): Entry[] {\n const pinned = page.filter((entry) => entry.stats?.is_pinned);\n const rest = page.filter((entry) => !entry.stats?.is_pinned);\n\n if (sort === \"hot\") {\n return [...pinned, ...rest];\n }\n\n const byCreated = [...rest].sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n return [...pinned, ...byCreated];\n}\n\nexport function getPostsRankedInfiniteQueryOptions(\n sort: string,\n tag: string,\n limit = 20,\n observer = \"\",\n enabled = true,\n _options: GetPostsRankedOptions = {}\n) {\n return infiniteQueryOptions<\n Entry[],\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.posts.postsRanked(sort, tag, limit, observer),\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await callRPC(\"bridge.get_ranked_posts\", {\n sort,\n start_author: pageParam.author,\n start_permlink: pageParam.permlink,\n limit,\n tag: sanitizedTag,\n observer,\n }, undefined, undefined, signal);\n\n if (response === null || response === undefined) {\n return [];\n }\n\n if (!Array.isArray(response)) {\n throw new Error(\n `[SDK] get_ranked_posts returned ${typeof response} for sort=${sort}`\n );\n }\n\n // Kept in the bridge's own order. getNextPageParam takes the cursor from\n // the last entry of the page this returns, and the bridge continues from\n // that entry in ITS ranking, so reordering here made the next request\n // start from the middle of the previous ranked page: for trending, payout\n // and muted the last entry by date is not the last entry by rank, and\n // scrolling repeated some posts and skipped others. Display order is\n // applied in `select`, which React Query runs after pagination.\n return filterDmcaEntry(response as Entry[]);\n },\n select: displaySelect(sort),\n enabled,\n initialPageParam: {\n author: undefined,\n permlink: undefined,\n } as PageParam,\n getNextPageParam: (lastPage: Entry[]) => {\n // React Query reads \"there is no next page\" from undefined alone, so\n // returning an object here always left it true. An infinite list\n // then keeps calling fetchNextPage at the end of the feed, appending an\n // empty page each time: the query state churns and the cache grows for as\n // long as the reader sits at the bottom.\n const last = lastPage?.[lastPage.length - 1];\n if (!last) {\n return undefined;\n }\n\n return { author: last.author, permlink: last.permlink };\n },\n });\n}\n\nexport function getPostsRankedQueryOptions(\n sort: string,\n start_author: string = \"\",\n start_permlink: string = \"\",\n limit: number = 20,\n tag: string = \"\",\n observer: string = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.postsRankedPage(sort, start_author, start_permlink, limit, tag, observer),\n enabled,\n queryFn: async ({ signal } = {} as any) => {\n let sanitizedTag = tag;\n if (CONFIG.dmcaTagRegexes.some((regex) => regex.test(tag))) {\n sanitizedTag = \"\";\n }\n\n const response = await getPostsRanked(\n sort,\n start_author,\n start_permlink,\n limit,\n sanitizedTag,\n observer,\n signal\n );\n\n return filterDmcaEntry(response ?? []) as Entry[];\n },\n });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface BlogEntry {\n author: string;\n permlink: string;\n blog: string;\n reblog_on: string;\n reblogged_on: string;\n entry_id: number;\n}\n\nexport interface Reblog {\n author: string;\n permlink: string;\n}\n\nexport function getReblogsQueryOptions(\n username?: string,\n activeUsername?: string,\n limit = 200\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.reblogs(username ?? \"\", limit),\n queryFn: async () => {\n const response = (await callRPC(\"condenser_api.get_blog_entries\", [\n username ?? activeUsername,\n 0,\n limit,\n ])) as BlogEntry[];\n\n return response\n .filter(\n (i) =>\n i.author !== activeUsername &&\n !i.reblogged_on.startsWith(\"1970-\")\n )\n .map((i) => ({ author: i.author, permlink: i.permlink })) as Reblog[];\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of usernames who reblogged a specific post\n */\nexport function getRebloggedByQueryOptions(author?: string, permlink?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.rebloggedBy(author ?? \"\", permlink ?? \"\"),\n queryFn: async () => {\n if (!author || !permlink) {\n return [];\n }\n\n const response = (await callRPC(\"condenser_api.get_reblogged_by\", [author, permlink])) as string[];\n\n return Array.isArray(response) ? response : [];\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Schedule } from \"../types/schedule\";\n\nexport function getSchedulesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.schedules(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getSchedulesInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.schedulesInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/schedules?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schedules: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { Draft } from \"../types/draft\";\n\nexport function getDraftsQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.drafts(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getDraftsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.draftsInfinite(activeUsername, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!activeUsername || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/drafts?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch drafts: ${response.status}`);\n }\n\n const json = await response.json();\n // Normalize response for backwards compatibility\n // If backend doesn't support wrapped format yet, it returns Draft[]\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!activeUsername && !!code,\n });\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, normalizeToWrappedResponse, QueryKeys } from \"@/modules/core\";\nimport { UserImage } from \"../types/user-image\";\n\nasync function fetchUserImages(code: string | undefined): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nexport function getImagesQueryOptions(username?: string, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.images(username),\n queryFn: async () => {\n if (!username || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!username && !!code,\n });\n}\n\nexport function getGalleryImagesQueryOptions(activeUsername: string | undefined, code?: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.galleryImages(activeUsername),\n queryFn: async () => {\n if (!activeUsername || !code) {\n return [];\n }\n return fetchUserImages(code);\n },\n enabled: !!activeUsername && !!code,\n });\n}\n\nexport function getImagesInfiniteQueryOptions(\n username: string | undefined,\n code?: string,\n limit: number = 10\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.imagesInfinite(username, limit),\n queryFn: async ({ pageParam = 0 }) => {\n if (!username || !code) {\n return {\n data: [],\n pagination: {\n total: 0,\n limit,\n offset: 0,\n has_next: false,\n },\n };\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/images?format=wrapped&offset=${pageParam}&limit=${limit}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch images: ${response.status}`);\n }\n\n const json = await response.json();\n return normalizeToWrappedResponse(json, limit);\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage) => {\n if (lastPage.pagination.has_next) {\n return lastPage.pagination.offset + lastPage.pagination.limit;\n }\n return undefined;\n },\n enabled: !!username && !!code,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nexport function getCommentHistoryQueryOptions(author: string, permlink: string, onlyMeta = false) {\n return queryOptions({\n queryKey: QueryKeys.posts.commentHistory(author, permlink, onlyMeta),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n onlyMeta: onlyMeta ? \"1\" : \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { CommentHistory } from \"../types/comment-history\";\n\nfunction makeEntryPath(author: string, permlink: string): string {\n const cleanAuthor = author?.trim();\n const cleanPermlink = permlink?.trim();\n\n if (!cleanAuthor || !cleanPermlink) {\n throw new Error(\"Invalid entry path: author and permlink are required\");\n }\n\n // Normalize by removing any leading @ or / characters\n const normalizedAuthor = cleanAuthor.replace(/^@+/, \"\");\n const normalizedPermlink = cleanPermlink.replace(/^\\/+/, \"\");\n\n if (!normalizedAuthor || !normalizedPermlink) {\n throw new Error(\"Invalid entry path: author and permlink cannot be empty after normalization\");\n }\n\n return `@${normalizedAuthor}/${normalizedPermlink}`;\n}\n\nexport interface DeletedEntry {\n body: string;\n title: string;\n tags: string[];\n}\n\nexport function getDeletedEntryQueryOptions(author: string, permlink: string) {\n const cleanPermlink = permlink?.trim();\n const cleanAuthor = author?.trim();\n const isValid =\n !!cleanAuthor && !!cleanPermlink && cleanPermlink !== \"undefined\";\n\n const entryPath = isValid ? makeEntryPath(cleanAuthor, cleanPermlink) : \"\";\n\n return queryOptions({\n queryKey: QueryKeys.posts.deletedEntry(entryPath),\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/comment-history\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink: cleanPermlink || \"\",\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch comment history: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n select: (history): DeletedEntry | null => {\n if (!history?.list?.[0]) {\n return null;\n }\n const { body, title, tags } = history.list[0];\n return {\n body,\n title,\n tags,\n };\n },\n enabled: isValid,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { PostTipsResponse } from \"../types/post-tip\";\n\n/**\n * Tips for a single post.\n *\n * Addressed as a GET so the response can be cached. This was a POST, which no\n * cache may store, so the same tip totals were refetched on every mount. The\n * endpoint keys off nothing but author and permlink and needs no auth, and now\n * serves a Cache-Control, so a repeat read can come from the browser instead of\n * the network.\n *\n * `staleTime` is kept at or below the endpoint's own cache window rather than\n * extending it. react-query cannot see how old a response already was when\n * `fetch` served it from the browser cache, so it restarts its window from zero\n * on a body that may already be near expiry; worst-case staleness is the two\n * windows added together.\n */\nexport function getPostTipsQueryOptions(author: string, permlink: string, isEnabled = true) {\n return queryOptions({\n queryKey: QueryKeys.posts.tips(author, permlink),\n queryFn: async () => {\n const path = `/private-api/post-tips/${encodeURIComponent(author)}/${encodeURIComponent(permlink)}`;\n const response = await fetch(CONFIG.privateApiHost + path, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch post tips: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!author && !!permlink && isEnabled,\n staleTime: 60 * 1000,\n });\n}\n","import { Entry, WaveEntry } from \"../types\";\nimport { getDiscussionsQueryOptions, SortOrder } from \"../queries/get-discussions-query-options\";\nimport { CONFIG } from \"@/modules/core\";\n\ntype EntryWithPostId = Entry & { post_id: number };\n\nfunction normalizeContainer(entry: EntryWithPostId, host: string): WaveEntry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds send the publish time as `timestamp`, not `created`.\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n host\n } as WaveEntry;\n}\n\nfunction normalizeParent(entry: EntryWithPostId): Entry {\n return {\n ...entry,\n id: entry.id ?? entry.post_id\n } as Entry;\n}\n\nexport function normalizeWaveEntryFromApi(\n entry:\n | (Entry & { post_id: number; container?: EntryWithPostId | null; parent?: EntryWithPostId | null })\n | null\n | undefined,\n host: string\n): WaveEntry | null {\n if (!entry) {\n return null;\n }\n\n const containerSource = entry.container ?? entry;\n const container = normalizeContainer(containerSource, host);\n\n const parent = entry.parent ? normalizeParent(entry.parent) : undefined;\n\n return {\n ...entry,\n id: entry.id ?? entry.post_id,\n // The private-api waves feeds (following / tag / account) send the publish\n // time as `timestamp`, not `created`; map it so the relative time renders on\n // every card (the For You feed already carries a real `created` from Hive RPC).\n created: entry.created ?? (entry as unknown as { timestamp?: string }).timestamp,\n // The private-api waves feeds omit max_accepted_payout; default it (and the\n // payout strings) to the Hive shape so payout-rendering consumers run their\n // pending+author+curator summation instead of treating the value as missing.\n max_accepted_payout: entry.max_accepted_payout || \"1000000.000 HBD\",\n pending_payout_value: entry.pending_payout_value || \"0.000 HBD\",\n author_payout_value: entry.author_payout_value || \"0.000 HBD\",\n curator_payout_value: entry.curator_payout_value || \"0.000 HBD\",\n host,\n container,\n parent\n } as WaveEntry;\n}\n\nexport function toEntryArray(x: unknown): Entry[] {\n return Array.isArray(x) ? (x as Entry[]) : [];\n}\n\nexport async function getVisibleFirstLevelThreadItems(\n container: WaveEntry\n): Promise {\n const queryOptions = getDiscussionsQueryOptions(container, SortOrder.created, true);\n const discussionItemsRaw = await CONFIG.queryClient.fetchQuery(queryOptions);\n const discussionItems = toEntryArray(discussionItemsRaw);\n\n if (discussionItems.length <= 1) {\n return [];\n }\n\n const firstLevelItems = discussionItems.filter(\n ({ parent_author, parent_permlink }) =>\n parent_author === container.author && parent_permlink === container.permlink\n );\n\n if (firstLevelItems.length === 0) {\n return [];\n }\n\n const visibleItems = firstLevelItems.filter((item) => !item.stats?.gray);\n\n return visibleItems;\n}\n\nexport function mapThreadItemsToWaveEntries(\n items: Entry[],\n container: WaveEntry,\n host: string\n): WaveEntry[] {\n if (items.length === 0) {\n return [];\n }\n\n return items\n .map((item) => {\n const parent = items.find(\n (i) =>\n i.author === item.parent_author &&\n i.permlink === item.parent_permlink &&\n i.author !== host\n );\n\n return {\n ...item,\n id: item.post_id,\n host,\n container,\n parent\n } as WaveEntry;\n })\n .filter((entry) => entry.container.post_id !== entry.post_id)\n .sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n}\n","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\ntype WavesFeedRow = Entry & {\n post_id: number;\n // The wave's container account (e.g. ecency.waves, leothreads), so a mixed\n // cross-container feed can be rendered and acted on per item.\n host?: string;\n // Opaque keyset cursor pointing just past this row.\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type WavesFeedEntry = WaveEntry & { _cursor?: string };\n\nexport interface WavesFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only waves carrying this tag (across all containers). */\n tag?: string;\n /** Only waves from accounts this user follows (across all containers). */\n following?: string;\n /** Only this author's waves (across all containers); the per-author feed. */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedFeedParams {\n containers: string[];\n tag?: string;\n following?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: WavesFeedParams): NormalizedFeedParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n following: params.following?.trim().toLowerCase() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchWavesFeedPage(\n { containers, tag, following, author, observer, limit }: NormalizedFeedParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/feed\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (following) {\n url.searchParams.set(\"following\", following);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves feed: ${response.status}`);\n }\n\n const data = (await response.json()) as WavesFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return { ...entry, _cursor: row._cursor } as WavesFeedEntry;\n })\n .filter((entry): entry is WavesFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container waves feed (the chronological \"For You\" stream, and\n * the Following / Tag feeds via filters).\n *\n * A single esync-backed call returns the newest waves across every indexed\n * container, already merged and time-ordered, with keyset (cursor) pagination,\n * replacing the per-container chain-RPC scan. The optional `tag` / `following`\n * filters narrow the same stream without changing the cursor.\n */\nexport function getWavesFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchWavesFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination. A short page (fewer than `limit` rows) is the\n // end-of-feed signal; on a full page the server always returns the next\n // cursor on the last row. Stopping (rather than looping) is the safe\n // fallback if that cursor were ever absent.\n getNextPageParam: (lastPage: WavesFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n\n/**\n * Page-one of the combined feed as a plain (non-infinite) query under a distinct\n * key, for the \"new waves\" poll. Separate from {@link getWavesFeedQueryOptions}\n * so refreshing it never truncates the infinite feed's loaded pages.\n */\nexport function getWavesLatestFeedQueryOptions(params: WavesFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, following, author, observer, limit } = normalized;\n\n return queryOptions({\n queryKey: [\n ...QueryKeys.posts.wavesFeed({ containers, tag, following, author, observer, limit }),\n \"latest\"\n ],\n staleTime: 0,\n queryFn: ({ signal }) => fetchWavesFeedPage(normalized, undefined, signal)\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\nconst DEFAULT_FEED_LIMIT = 20;\n\n/** The 3Speak video a short embeds, as returned by esync /api/waves/shorts. */\nexport interface ShortVideo {\n platform: string;\n author: string;\n permlink: string;\n embed_url: string;\n thumbnail_url: string | null;\n duration_secs: number | null;\n}\n\ntype ShortsFeedRow = Entry & {\n post_id: number;\n host?: string;\n video?: ShortVideo;\n _cursor?: string;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport type ShortsFeedEntry = WaveEntry & {\n /** The embedded 3Speak video reference for the reels player. */\n video?: ShortVideo;\n _cursor?: string;\n};\n\nexport interface ShortsFeedParams {\n /** Scope to one or more container accounts; omit for the full combined feed. */\n containers?: string[];\n /** Only shorts carrying this tag (across all containers). */\n tag?: string;\n /** Only this author's shorts (across all containers). */\n author?: string;\n /** The viewing user; exclude authors they currently mute. */\n observer?: string;\n /** Page size (default 20). */\n limit?: number;\n}\n\ninterface NormalizedShortsParams {\n containers: string[];\n tag?: string;\n author?: string;\n observer?: string;\n limit: number;\n}\n\nfunction normalizeParams(params: ShortsFeedParams): NormalizedShortsParams {\n return {\n containers: params.containers ?? [],\n tag: params.tag?.trim() || undefined,\n author: params.author?.trim().toLowerCase() || undefined,\n observer: params.observer?.trim().toLowerCase() || undefined,\n limit: params.limit ?? DEFAULT_FEED_LIMIT\n };\n}\n\nasync function fetchShortsFeedPage(\n { containers, tag, author, observer, limit }: NormalizedShortsParams,\n cursor: string | undefined,\n signal?: AbortSignal\n): Promise {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/shorts\", baseUrl);\n url.searchParams.set(\"limit\", String(limit));\n if (cursor) {\n url.searchParams.set(\"cursor\", cursor);\n }\n containers.forEach((container) => url.searchParams.append(\"container\", container));\n if (tag) {\n url.searchParams.set(\"tag\", tag);\n }\n if (author) {\n url.searchParams.set(\"author\", author);\n }\n if (observer) {\n url.searchParams.set(\"observer\", observer);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch shorts feed: ${response.status}`);\n }\n\n const data = (await response.json()) as ShortsFeedRow[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n return data\n .map((row) => {\n const entry = normalizeWaveEntryFromApi(row, row.host ?? \"\");\n if (!entry) {\n return null;\n }\n return {\n ...entry,\n // A lightweight feed row may omit active_votes; EntryVoteBtn (which uses\n // this entry as React Query initialData) calls .some() on it, so default\n // to an empty array to avoid a crash before the full post query loads.\n active_votes: entry.active_votes ?? [],\n video: row.video,\n _cursor: row._cursor\n } as ShortsFeedEntry;\n })\n .filter((entry): entry is ShortsFeedEntry => Boolean(entry));\n}\n\n/**\n * Combined cross-container shorts (reels) feed: waves that embed a 3Speak video.\n *\n * Backed by esync /api/waves/shorts (via /private-api/waves/shorts). Same shape,\n * keyset pagination and filters as {@link getWavesFeedQueryOptions}, plus a\n * `video` block per item for the vertical reels player. There is no `following`\n * filter in v1.\n */\nexport function getShortsFeedQueryOptions(params: ShortsFeedParams = {}) {\n const normalized = normalizeParams(params);\n const { containers, tag, author, observer, limit } = normalized;\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.shortsFeed({ containers, tag, author, observer, limit }),\n initialPageParam: undefined as string | undefined,\n\n queryFn: ({ pageParam, signal }) => fetchShortsFeedPage(normalized, pageParam, signal),\n\n // Keyset pagination: a short page (fewer than `limit` rows) ends the feed;\n // on a full page the server returns the next cursor on the last row.\n getNextPageParam: (lastPage: ShortsFeedEntry[]) => {\n if (lastPage.length < limit) {\n return undefined;\n }\n return lastPage[lastPage.length - 1]?._cursor;\n }\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport {\n getVisibleFirstLevelThreadItems,\n mapThreadItemsToWaveEntries\n} from \"../utils/waves-helpers\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nconst THREAD_CONTAINER_BATCH_SIZE = 5;\nconst MAX_CONTAINERS_TO_SCAN = 50;\n\ninterface ThreadsResult {\n entries: WaveEntry[];\n}\n\nasync function getThreads(\n host: string,\n pageParam?: WaveEntry\n): Promise {\n let startAuthor = pageParam?.author;\n let startPermlink = pageParam?.permlink;\n let scannedContainers = 0;\n let skipContainerId = pageParam?.post_id;\n\n while (scannedContainers < MAX_CONTAINERS_TO_SCAN) {\n interface AccountPostsParams {\n sort: string;\n account: string;\n limit: number;\n start_author?: string;\n start_permlink?: string;\n }\n\n const rpcParams: AccountPostsParams = {\n sort: \"posts\", // ProfileFilter.posts\n account: host,\n limit: THREAD_CONTAINER_BATCH_SIZE,\n ...(startAuthor ? { start_author: startAuthor } : {}),\n ...(startPermlink ? { start_permlink: startPermlink } : {})\n };\n\n let containers: WaveEntry[];\n try {\n containers = (await callRPC(\"bridge.get_account_posts\", rpcParams)) as WaveEntry[];\n } catch (err) {\n console.error(\"[SDK] getThreads get_account_posts error:\", err);\n return null;\n }\n\n if (!containers || containers.length === 0) {\n return null;\n }\n\n const normalizedContainers = containers.map((container) => {\n container.id = container.post_id;\n container.host = host;\n return container;\n });\n\n for (const container of normalizedContainers) {\n if (skipContainerId && container.post_id === skipContainerId) {\n skipContainerId = undefined;\n continue;\n }\n\n scannedContainers += 1;\n\n if (container.stats?.gray) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n let visibleItems: Entry[];\n try {\n visibleItems = await getVisibleFirstLevelThreadItems(container);\n } catch (err) {\n // A transient bridge.get_discussion failure (RPC timeout, node error, or\n // an oversized response on a large late-day container) must not collapse\n // the whole feed. Treat this container as temporarily unavailable and scan\n // the next one — mirroring the empty-container handling below and the\n // get_account_posts guard above. The query's refetch interval retries it.\n console.error(\"[SDK] getThreads get_discussion error:\", err);\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n if (visibleItems.length === 0) {\n startAuthor = container.author;\n startPermlink = container.permlink;\n continue;\n }\n\n return {\n entries: mapThreadItemsToWaveEntries(visibleItems, container, host)\n };\n }\n\n const lastContainer = normalizedContainers[normalizedContainers.length - 1];\n\n if (!lastContainer) {\n return null;\n }\n\n startAuthor = lastContainer.author;\n startPermlink = lastContainer.permlink;\n }\n\n return null;\n}\n\n// Page = array of WaveEntry; Cursor = WaveEntry (container) or undefined\ntype WavesPage = WaveEntry[];\ntype WavesCursor = WaveEntry | undefined;\n\nexport function getWavesByHostQueryOptions(host: string) {\n return infiniteQueryOptions<\n WavesPage,\n Error,\n InfiniteData,\n string[],\n WavesCursor\n >({\n queryKey: QueryKeys.posts.wavesByHost(host),\n initialPageParam: undefined as WavesCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WavesCursor }) => {\n const result = await getThreads(host, pageParam);\n if (!result) return []; // no items to show for this page\n\n return result.entries;\n },\n\n getNextPageParam: (lastPage: WavesPage): WavesCursor => lastPage?.[0]?.container,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesTagEntryResponse = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nconst DEFAULT_TAG_FEED_LIMIT = 40;\n\nexport function getWavesByTagQueryOptions(host: string, tag: string, limit = DEFAULT_TAG_FEED_LIMIT) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByTag(host, tag),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/tags\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"tag\", tag);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves by tag: ${response.status}`);\n }\n\n const data = await response.json() as WavesTagEntryResponse[];\n\n const result = data\n .slice(0, limit)\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n return result.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves by tag\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ntype WavesFollowingEntry = Entry & {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n};\n\nexport function getWavesFollowingQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesFollowing(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/following\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves following feed: ${response.status}`);\n }\n\n const data = await response.json() as WavesFollowingEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves following feed\", error);\n return [];\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingTag } from \"../types\";\n\ninterface WavesTrendingTagResponse {\n tag: string;\n posts: number;\n}\n\nexport function getWavesTrendingTagsQueryOptions(host?: string, hours = 24) {\n // Omit the container for combined trending tags across all containers.\n const container = host?.trim() || undefined;\n\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingTags(container ?? \"\", hours),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/tags\", baseUrl);\n if (container) {\n url.searchParams.set(\"container\", container);\n }\n url.searchParams.set(\"hours\", hours.toString());\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending tags: ${response.status}`);\n }\n\n const data = await response.json() as WavesTrendingTagResponse[];\n\n return data.map(({ tag, posts }) => ({ tag, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending tags\", error);\n return [];\n }\n }\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { Entry, WaveEntry } from \"../types\";\nimport { normalizeWaveEntryFromApi } from \"../utils/waves-helpers\";\n\ninterface WavesAccountEntry extends Entry {\n post_id: number;\n container?: (Entry & { post_id: number }) | null;\n parent?: (Entry & { post_id: number }) | null;\n}\n\nexport function getWavesByAccountQueryOptions(host: string, username?: string) {\n const normalizedUsername = username?.trim().toLowerCase();\n\n return infiniteQueryOptions({\n queryKey: QueryKeys.posts.wavesByAccount(host, normalizedUsername ?? \"\"),\n enabled: Boolean(normalizedUsername),\n initialPageParam: undefined,\n\n queryFn: async ({ signal }) => {\n if (!normalizedUsername) {\n return [];\n }\n\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/account\", baseUrl);\n url.searchParams.set(\"container\", host);\n url.searchParams.set(\"username\", normalizedUsername);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves for account: ${response.status}`);\n }\n\n const data = await response.json() as WavesAccountEntry[];\n\n if (!Array.isArray(data) || data.length === 0) {\n return [];\n }\n\n const flattened = data\n .map((entry) => normalizeWaveEntryFromApi(entry, host))\n .filter((entry): entry is WaveEntry => Boolean(entry));\n\n if (flattened.length === 0) {\n return [];\n }\n\n return flattened.sort(\n (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime()\n );\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves for account\", error);\n throw error;\n }\n },\n\n getNextPageParam: () => undefined,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConfigManager, QueryKeys } from \"@/modules/core\";\nimport { WaveTrendingAuthor } from \"../types\";\n\nexport function getWavesTrendingAuthorsQueryOptions(host: string) {\n return queryOptions({\n queryKey: QueryKeys.posts.wavesTrendingAuthors(host),\n queryFn: async ({ signal }): Promise => {\n try {\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/waves/trending/authors\", baseUrl);\n url.searchParams.set(\"container\", host);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch waves trending authors: ${response.status}`);\n }\n\n const data = await response.json() as WaveTrendingAuthor[];\n\n return data.map(({ author, posts }) => ({ author, posts }));\n } catch (error) {\n console.error(\"[SDK] Failed to fetch waves trending authors\", error);\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"../types\";\nimport { normalizePost } from \"@/modules/bridge\";\n\nexport function getNormalizePostQueryOptions(\n post: { author?: string; permlink?: string } | undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.posts.normalize(post?.author ?? \"\", post?.permlink ?? \"\"),\n enabled: enabled && !!post,\n queryFn: async () => normalizePost(post) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core/config\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Entry } from \"@/modules/posts/types\";\nimport { getPostQueryOptions } from \"@/modules/posts/queries\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ninterface VoteOperationDetails {\n voter: string;\n author: string;\n permlink: string;\n weight: number;\n}\n\ninterface AccountVoteHistoryItem {\n timestamp: string;\n op: [string, VoteOperationDetails];\n}\n\ntype AccountVoteHistoryRecord = [number, AccountVoteHistoryItem];\n\ninterface VoteHistoryResult extends VoteOperationDetails {\n num: number;\n timestamp: string;\n}\n\nexport interface VoteHistoryPageParam {\n start: number;\n}\n\nexport interface VoteHistoryPage {\n lastDate: number;\n lastItemFetched: number;\n entries: Entry[];\n}\n\nfunction isEntry(x: unknown): x is Entry {\n return (\n !!x &&\n typeof x === \"object\" &&\n \"author\" in x &&\n \"permlink\" in x &&\n \"active_votes\" in x\n );\n}\n\n/**\n * Calculate days since a date\n */\nfunction getDays(createdDate: string): number {\n const past = new Date(createdDate);\n const now = new Date();\n const diffMs = now.getTime() - past.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n}\n\n/**\n * Get account vote history with entries\n *\n * @param username - Account name to get vote history for\n * @param limit - Number of history items per page (default: 20)\n * @param filters - Additional filters to pass to get_account_history\n * @param dayLimit - Only include votes from last N days (default: 7)\n */\nexport function getAccountVoteHistoryInfiniteQueryOptions(\n username: string,\n options?: {\n limit?: number;\n filters?: F[];\n dayLimit?: number;\n }\n) {\n const { limit = 20, filters = [], dayLimit = 7.0 } = options ?? {};\n\n return infiniteQueryOptions<\n VoteHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n VoteHistoryPageParam\n >({\n queryKey: QueryKeys.accounts.voteHistory(username, limit),\n initialPageParam: { start: -1 },\n\n queryFn: async ({ pageParam }: { pageParam: VoteHistoryPageParam }) => {\n const { start } = pageParam;\n\n const response = (await callRPC(\"condenser_api.get_account_history\", [username, start, limit, ...filters])) as AccountVoteHistoryRecord[];\n\n const mappedResults: VoteHistoryResult[] = response.map(([num, historyObj]) => ({\n ...historyObj.op[1],\n num,\n timestamp: historyObj.timestamp,\n }));\n\n const result = mappedResults.filter(\n (filtered) =>\n filtered.voter === username &&\n filtered.weight !== 0 &&\n getDays(filtered.timestamp) <= dayLimit\n );\n\n const entries: Entry[] = [];\n for (const obj of result) {\n const post = await CONFIG.queryClient.fetchQuery(\n getPostQueryOptions(obj.author, obj.permlink)\n );\n if (isEntry(post)) entries.push(post);\n }\n\n const [firstHistory] = response;\n\n return {\n lastDate: firstHistory ? getDays(firstHistory[1].timestamp) : 0,\n lastItemFetched: firstHistory ? firstHistory[0] : start,\n entries,\n };\n },\n\n getNextPageParam: (lastPage: VoteHistoryPage): VoteHistoryPageParam => ({\n start: lastPage.lastItemFetched,\n }),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Profile } from \"../types\";\nimport { getProfiles } from \"@/modules/bridge\";\n\nexport function getProfilesQueryOptions(\n accounts: string[],\n observer?: string,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.accounts.profiles(accounts, observer ?? \"\"),\n enabled: enabled && accounts.length > 0,\n queryFn: async () => getProfiles(accounts, observer) as Promise,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type {\n BalanceCoinType,\n BalanceHistoryEntry,\n BalanceHistoryResponse,\n} from \"../types\";\n\ninterface BalanceHistoryPage {\n entries: BalanceHistoryEntry[];\n currentPage: number;\n}\n\n/**\n * Cursor for balance history pagination.\n * null = first request (returns the newest page).\n * number = specific page to fetch (decrementing for older data).\n */\ntype BalanceHistoryCursor = number | null;\n\n/**\n * Get balance history for an account with pagination, newest first.\n * Uses the balance-api REST endpoint with direction=desc.\n *\n * Pagination: first call omits `page` to get the newest data.\n * The response includes `total_pages` so we know the current page number.\n * Subsequent calls decrement the page number to load older data.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param pageSize - Number of entries per page\n */\nexport function getBalanceHistoryInfiniteQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n pageSize = 200\n) {\n return infiniteQueryOptions<\n BalanceHistoryPage,\n Error,\n InfiniteData,\n (string | number)[],\n BalanceHistoryCursor\n >({\n queryKey: QueryKeys.wallet.balanceHistory(\n username ?? \"\",\n coinType,\n pageSize\n ),\n initialPageParam: null as BalanceHistoryCursor,\n\n queryFn: async ({ pageParam, signal }) => {\n if (!username) {\n return { entries: [], currentPage: 0 };\n }\n\n const params: Record = {\n \"account-name\": username,\n \"coin-type\": coinType,\n \"page-size\": pageSize,\n direction: \"desc\",\n };\n\n // First call: omit page to get newest data\n // Subsequent calls: pass specific page number\n if (pageParam !== null) {\n params.page = pageParam;\n }\n\n const response = (await callREST(\n \"balance\",\n \"/accounts/{account-name}/balance-history\",\n params,\n undefined,\n undefined,\n signal\n )) as BalanceHistoryResponse;\n\n return {\n entries: response.operations_result,\n currentPage: pageParam ?? response.total_pages,\n };\n },\n\n getNextPageParam: (lastPage) => {\n // Decrement page to go further back in time\n const nextPage = lastPage.currentPage - 1;\n return nextPage >= 1 ? nextPage : undefined;\n },\n\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport type { AggregatedBalanceEntry, BalanceCoinType } from \"../types\";\n\nexport type BalanceAggregationGranularity = \"yearly\" | \"monthly\" | \"daily\";\n\n/**\n * Get aggregated balance history for an account.\n * Uses the balance-api REST endpoint - enables yearly/monthly/daily summary\n * widgets that are impossible via RPC.\n *\n * @param username - Account name\n * @param coinType - HIVE, HBD, or VESTS\n * @param granularity - yearly (default), monthly, or daily\n */\nexport function getAggregatedBalanceQueryOptions(\n username?: string,\n coinType: BalanceCoinType = \"HIVE\",\n granularity: BalanceAggregationGranularity = \"yearly\"\n) {\n return queryOptions({\n queryKey: QueryKeys.wallet.aggregatedHistory(\n username ?? \"\",\n coinType,\n granularity\n ),\n\n queryFn: async () => {\n if (!username) {\n return [];\n }\n\n return (await callREST(\n \"balance\",\n \"/accounts/{account-name}/aggregated-history\",\n {\n \"account-name\": username,\n \"coin-type\": coinType,\n granularity,\n }\n )) as AggregatedBalanceEntry[];\n },\n\n enabled: !!username,\n staleTime: 60_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport interface ProMembersResponse {\n /** Usernames of active Ecency Pro members. */\n members: string[];\n count: number;\n}\n\n/**\n * Public, cached roster of Ecency Pro members. Backed by a lightweight private-api\n * endpoint (no auth) so any surface can decorate a username with a Pro badge without\n * a per-user request.\n *\n * `staleTime` is deliberately shorter than the endpoint's own cache window and is\n * NOT raised to match it. react-query has no idea how old a response already was\n * when `fetch` served it from the browser cache: it treats a nine-minute-old\n * cached body as freshly fetched and starts its own window from zero. Worst-case\n * staleness is therefore the endpoint's window plus this one, so raising this to\n * match the server would roughly double it rather than align it.\n */\nexport function getProMembersQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.accounts.proMembers(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/pro-members\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch pro members: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Lowercased set of member usernames for O(1), case-insensitive membership checks. */\nexport function proMembersSet(members?: string[]): Set {\n return new Set((members ?? []).map((m) => m.toLowerCase()));\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { AccountProfile, FullAccount } from \"../types\";\nimport {\n buildPostingJsonMetadata,\n buildProfileMetadata,\n extractAccountProfile,\n pickRicherMetadataSnapshot,\n} from \"../utils/profile-metadata\";\n\ninterface Payload {\n profile: Partial;\n tokens: AccountProfile[\"tokens\"];\n}\n\n/**\n * React Query mutation hook for updating account profile metadata.\n *\n * This mutation broadcasts an account_update2 operation to update the user's\n * profile information (name, about, location, avatar, cover image, etc.).\n *\n * @param username - The username to update (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Profile Fields:**\n * - name: Display name\n * - about: Bio/description\n * - location: Location\n * - website: Website URL\n * - profile_image: Avatar URL\n * - cover_image: Cover/banner URL\n * - tokens: Social tokens (Twitter, Facebook, etc.)\n * - version: Profile metadata version (auto-set to 2)\n *\n * **Authentication:**\n * - Uses posting authority (account_update2 operation)\n * - Supports all auth methods via platform adapter\n *\n * **Post-Broadcast Actions:**\n * - Optimistically updates account cache with new profile data\n * - Invalidates account cache to refetch from blockchain\n *\n * @example\n * ```typescript\n * const updateProfile = useAccountUpdate(username, {\n * adapter: myAdapter,\n * });\n *\n * // Update profile\n * updateProfile.mutate({\n * profile: {\n * name: \"John Doe\",\n * about: \"Hive enthusiast\",\n * profile_image: \"https://...\",\n * }\n * });\n * ```\n */\nexport function useAccountUpdate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useBroadcastMutation(\n [\"accounts\", \"update\"],\n username,\n (payload: Partial) => {\n // Prefer the freshest cached snapshot. onMutate has just refetched the\n // account from chain, so this usually reflects the current on-chain\n // profile rather than a possibly stale/unloaded render-time value. If\n // the cache instead holds a metadata-poorer row than the render-time\n // snapshot (e.g. a node served a stripped account row), the richer\n // snapshot wins — a partial update must never shrink the profile while\n // any snapshot still knows the full one.\n const account = pickRicherMetadataSnapshot(\n queryClient.getQueryData(\n getAccountFullQueryOptions(username).queryKey\n ),\n data\n );\n\n if (!account) {\n throw new Error(\"[SDK][Accounts] – cannot update not existing account\");\n }\n\n return [\n [\n \"account_update2\",\n {\n account: username!,\n json_metadata: \"\",\n extensions: [] as [],\n // Read-modify-write the FULL on-chain metadata: deep-merge the\n // profile and preserve any non-`profile` top-level keys, so a\n // partial update never wipes unrelated fields.\n posting_json_metadata: buildPostingJsonMetadata({\n existingPostingJsonMetadata: account.posting_json_metadata,\n profile: payload.profile,\n tokens: payload.tokens,\n }),\n },\n ],\n ];\n },\n async (_data: unknown, variables: Partial) => {\n // Optimistic cache update\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n const obj = JSON.parse(JSON.stringify(data)) as FullAccount;\n obj.profile = buildProfileMetadata({\n existingProfile: extractAccountProfile(data),\n profile: variables.profile,\n tokens: variables.tokens,\n });\n\n return obj;\n }\n );\n\n // Invalidate cache to refetch from blockchain\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username)\n ]);\n },\n auth,\n undefined,\n {\n broadcastMode,\n // Before merging, force a fresh on-chain read so a stale or unloaded\n // cached snapshot cannot cause a partial update (e.g. pinning a post,\n // which sets only `pinned`) to overwrite the existing profile with a\n // near-empty object. Best-effort: if the refetch fails, the op builder\n // falls back to the cached snapshot.\n onMutate: async () => {\n if (!username) {\n return;\n }\n try {\n await queryClient.fetchQuery({\n ...getAccountFullQueryOptions(username),\n staleTime: 0,\n });\n } catch {\n // Ignore – fall back to whatever is already cached.\n }\n },\n }\n );\n}\n","import { broadcastJson, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { AuthContext } from \"@/modules/core/types\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getRelationshipBetweenAccountsQueryOptions, getAccountFullQueryOptions } from \"../queries\";\nimport { AccountRelationship } from \"../types\";\n\ntype Kind = \"toggle-ignore\" | \"toggle-follow\";\n\nexport function useAccountRelationsUpdate(\n reference: string | undefined,\n target: string | undefined,\n auth: AuthContext | undefined,\n onSuccess: (data: Partial | undefined) => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"relation\", \"update\", reference, target],\n mutationFn: async (kind: Kind) => {\n const relationsQuery = getRelationshipBetweenAccountsQueryOptions(\n reference!,\n target!\n );\n await getQueryClient().prefetchQuery(relationsQuery);\n const actualRelation = getQueryClient().getQueryData(\n relationsQuery.queryKey\n );\n\n await broadcastJson(\n reference,\n \"follow\",\n [\n \"follow\",\n {\n follower: reference,\n following: target,\n what: [\n ...(kind === \"toggle-ignore\" && !actualRelation?.ignores\n ? [\"ignore\"]\n : []),\n ...(kind === \"toggle-follow\" && !actualRelation?.follows\n ? [\"blog\"]\n : []),\n ],\n },\n ],\n auth\n );\n\n return {\n ...actualRelation,\n ignores:\n kind === \"toggle-ignore\"\n ? !actualRelation?.ignores\n : actualRelation?.ignores,\n follows:\n kind === \"toggle-follow\"\n ? !actualRelation?.follows\n : actualRelation?.follows,\n } satisfies Partial;\n },\n onError,\n onSuccess(data) {\n onSuccess(data);\n\n getQueryClient().setQueryData(\n QueryKeys.accounts.relations(reference!, target!),\n data\n );\n\n // Invalidate account query to refetch follow stats (follower_count, following_count)\n // This is needed because profile pages use staleTime: Infinity for performance\n if (target) {\n getQueryClient().invalidateQueries(\n getAccountFullQueryOptions(target)\n );\n }\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Content Operations\n * Operations for creating, voting, and managing content on Hive blockchain\n */\n\n/**\n * Builds a vote operation.\n * @param voter - Account casting the vote\n * @param author - Author of the post/comment\n * @param permlink - Permlink of the post/comment\n * @param weight - Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote)\n * @returns Vote operation\n */\nexport function buildVoteOp(\n voter: string,\n author: string,\n permlink: string,\n weight: number\n): Operation {\n if (!voter || !author || !permlink) {\n throw new Error(\"[SDK][buildVoteOp] Missing required parameters\");\n }\n if (weight < -10000 || weight > 10000) {\n throw new Error(\"[SDK][buildVoteOp] Weight must be between -10000 and 10000\");\n }\n\n return [\n \"vote\",\n {\n voter,\n author,\n permlink,\n weight,\n },\n ];\n}\n\n/**\n * Builds a comment operation (for posts or replies).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param parentAuthor - Parent author (empty string for top-level posts)\n * @param parentPermlink - Parent permlink (category/tag for top-level posts)\n * @param title - Title of the post (empty for comments)\n * @param body - Content body (required - cannot be empty)\n * @param jsonMetadata - JSON metadata object\n * @returns Comment operation\n */\nexport function buildCommentOp(\n author: string,\n permlink: string,\n parentAuthor: string,\n parentPermlink: string,\n title: string,\n body: string,\n jsonMetadata: Record\n): Operation {\n // Validate all required parameters including body\n if (!author || !permlink || parentPermlink === undefined || !body) {\n throw new Error(\"[SDK][buildCommentOp] Missing required parameters\");\n }\n\n return [\n \"comment\",\n {\n parent_author: parentAuthor,\n parent_permlink: parentPermlink,\n author,\n permlink,\n title,\n body,\n json_metadata: JSON.stringify(jsonMetadata),\n },\n ];\n}\n\n/**\n * Builds a comment options operation (for setting beneficiaries, rewards, etc.).\n * @param author - Author of the comment/post\n * @param permlink - Permlink of the comment/post\n * @param maxAcceptedPayout - Maximum accepted payout (e.g., \"1000000.000 HBD\")\n * @param percentHbd - Percent of payout in HBD (10000 = 100%)\n * @param allowVotes - Allow votes on this content\n * @param allowCurationRewards - Allow curation rewards\n * @param extensions - Extensions array (for beneficiaries, etc.)\n * @returns Comment options operation\n */\nexport function buildCommentOptionsOp(\n author: string,\n permlink: string,\n maxAcceptedPayout: string,\n percentHbd: number,\n allowVotes: boolean,\n allowCurationRewards: boolean,\n extensions: any[]\n): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildCommentOptionsOp] Missing required parameters\");\n }\n\n return [\n \"comment_options\",\n {\n author,\n permlink,\n max_accepted_payout: maxAcceptedPayout,\n percent_hbd: percentHbd,\n allow_votes: allowVotes,\n allow_curation_rewards: allowCurationRewards,\n extensions,\n },\n ];\n}\n\n/**\n * Builds a delete comment operation.\n * @param author - Author of the comment/post to delete\n * @param permlink - Permlink of the comment/post to delete\n * @returns Delete comment operation\n */\nexport function buildDeleteCommentOp(author: string, permlink: string): Operation {\n if (!author || !permlink) {\n throw new Error(\"[SDK][buildDeleteCommentOp] Missing required parameters\");\n }\n\n return [\n \"delete_comment\",\n {\n author,\n permlink,\n },\n ];\n}\n\n/**\n * Builds a reblog operation (custom_json).\n * @param account - Account performing the reblog\n * @param author - Original post author\n * @param permlink - Original post permlink\n * @param deleteReblog - If true, removes the reblog\n * @returns Custom JSON operation for reblog\n */\nexport function buildReblogOp(\n account: string,\n author: string,\n permlink: string,\n deleteReblog: boolean = false\n): Operation {\n if (!account || !author || !permlink) {\n throw new Error(\"[SDK][buildReblogOp] Missing required parameters\");\n }\n\n const json: any = {\n account,\n author,\n permlink,\n };\n\n if (deleteReblog) {\n json.delete = \"delete\";\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\"reblog\", json]),\n required_auths: [],\n required_posting_auths: [account],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Wallet Operations\n * Operations for managing tokens, savings, vesting, and conversions\n */\n\n/**\n * Builds a transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer operation\n */\nexport function buildTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferOp] Missing required parameters\");\n }\n\n return [\n \"transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds multiple transfer operations for multiple recipients.\n * @param from - Sender account\n * @param destinations - Comma or space separated list of recipient accounts\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Array of transfer operations\n */\nexport function buildMultiTransferOps(\n from: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!from || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Create a transfer operation for each destination username\n return destArray.map((dest) =>\n buildTransferOp(from, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds a recurrent transfer operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param recurrence - Recurrence in hours\n * @param executions - Number of executions (2 = executes twice)\n * @returns Recurrent transfer operation\n */\nexport function buildRecurrentTransferOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n recurrence: number,\n executions: number\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Missing required parameters\");\n }\n if (recurrence < 24) {\n throw new Error(\"[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours\");\n }\n\n return [\n \"recurrent_transfer\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n recurrence,\n executions,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a transfer to savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @returns Transfer to savings operation\n */\nexport function buildTransferToSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n },\n ];\n}\n\n/**\n * Builds a transfer from savings operation.\n * @param from - Sender account\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"1.000 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID (use timestamp)\n * @returns Transfer from savings operation\n */\nexport function buildTransferFromSavingsOp(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"transfer_from_savings\",\n {\n from,\n to,\n amount,\n memo: memo || \"\",\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds a cancel transfer from savings operation.\n * @param from - Account that initiated the savings withdrawal\n * @param requestId - Request ID to cancel\n * @returns Cancel transfer from savings operation\n */\nexport function buildCancelTransferFromSavingsOp(\n from: string,\n requestId: number\n): Operation {\n if (!from || requestId === undefined) {\n throw new Error(\"[SDK][buildCancelTransferFromSavingsOp] Missing required parameters\");\n }\n\n return [\n \"cancel_transfer_from_savings\",\n {\n from,\n request_id: requestId,\n },\n ];\n}\n\n/**\n * Builds operations to claim savings interest.\n * Creates a transfer_from_savings and immediately cancels it to claim interest.\n * @param from - Account claiming interest\n * @param to - Receiver account\n * @param amount - Amount with asset symbol (e.g., \"0.001 HIVE\")\n * @param memo - Transfer memo\n * @param requestId - Unique request ID\n * @returns Array of operations [transfer_from_savings, cancel_transfer_from_savings]\n */\nexport function buildClaimInterestOps(\n from: string,\n to: string,\n amount: string,\n memo: string,\n requestId: number\n): Operation[] {\n if (!from || !to || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildClaimInterestOps] Missing required parameters\");\n }\n\n return [\n buildTransferFromSavingsOp(from, to, amount, memo, requestId),\n buildCancelTransferFromSavingsOp(from, requestId),\n ];\n}\n\n/**\n * Builds a transfer to vesting operation (power up).\n * @param from - Account sending HIVE\n * @param to - Account receiving Hive Power\n * @param amount - Amount with HIVE symbol (e.g., \"1.000 HIVE\")\n * @returns Transfer to vesting operation\n */\nexport function buildTransferToVestingOp(\n from: string,\n to: string,\n amount: string\n): Operation {\n if (!from || !to || !amount) {\n throw new Error(\"[SDK][buildTransferToVestingOp] Missing required parameters\");\n }\n\n return [\n \"transfer_to_vesting\",\n {\n from,\n to,\n amount,\n },\n ];\n}\n\n/**\n * Builds a withdraw vesting operation (power down).\n * @param account - Account withdrawing vesting\n * @param vestingShares - Amount of VESTS to withdraw (e.g., \"1.000000 VESTS\")\n * @returns Withdraw vesting operation\n */\nexport function buildWithdrawVestingOp(\n account: string,\n vestingShares: string\n): Operation {\n if (!account || !vestingShares) {\n throw new Error(\"[SDK][buildWithdrawVestingOp] Missing required parameters\");\n }\n\n return [\n \"withdraw_vesting\",\n {\n account,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a delegate vesting shares operation (HP delegation).\n * @param delegator - Account delegating HP\n * @param delegatee - Account receiving HP delegation\n * @param vestingShares - Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\")\n * @returns Delegate vesting shares operation\n */\nexport function buildDelegateVestingSharesOp(\n delegator: string,\n delegatee: string,\n vestingShares: string\n): Operation {\n if (!delegator || !delegatee || !vestingShares) {\n throw new Error(\"[SDK][buildDelegateVestingSharesOp] Missing required parameters\");\n }\n\n return [\n \"delegate_vesting_shares\",\n {\n delegator,\n delegatee,\n vesting_shares: vestingShares,\n },\n ];\n}\n\n/**\n * Builds a set withdraw vesting route operation.\n * @param fromAccount - Account withdrawing vesting\n * @param toAccount - Account receiving withdrawn vesting\n * @param percent - Percentage to route (0-10000, where 10000 = 100%)\n * @param autoVest - Auto convert to vesting\n * @returns Set withdraw vesting route operation\n */\nexport function buildSetWithdrawVestingRouteOp(\n fromAccount: string,\n toAccount: string,\n percent: number,\n autoVest: boolean\n): Operation {\n if (!fromAccount || !toAccount || percent === undefined) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters\");\n }\n if (percent < 0 || percent > 10000) {\n throw new Error(\"[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000\");\n }\n\n return [\n \"set_withdraw_vesting_route\",\n {\n from_account: fromAccount,\n to_account: toAccount,\n percent,\n auto_vest: autoVest,\n },\n ];\n}\n\n/**\n * Builds a convert operation (HBD to HIVE).\n * @param owner - Account converting HBD\n * @param amount - Amount of HBD to convert (e.g., \"1.000 HBD\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Convert operation\n */\nexport function buildConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildConvertOp] Missing required parameters\");\n }\n\n return [\n \"convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a collateralized convert operation (HIVE to HBD via collateral).\n * @param owner - Account converting HIVE\n * @param amount - Amount of HIVE to convert (e.g., \"1.000 HIVE\")\n * @param requestId - Unique request ID (use timestamp)\n * @returns Collateralized convert operation\n */\nexport function buildCollateralizedConvertOp(\n owner: string,\n amount: string,\n requestId: number\n): Operation {\n if (!owner || !amount || requestId === undefined) {\n throw new Error(\"[SDK][buildCollateralizedConvertOp] Missing required parameters\");\n }\n\n return [\n \"collateralized_convert\",\n {\n owner,\n amount,\n requestid: requestId,\n },\n ];\n}\n\n/**\n * Builds a Hive Engine custom_json operation.\n * @param from - Account performing the operation\n * @param contractAction - Engine contract action (e.g., \"transfer\", \"stake\")\n * @param contractPayload - Payload for the contract action\n * @param contractName - Engine contract name (defaults to \"tokens\")\n * @returns Custom JSON operation\n */\nexport function buildEngineOp(\n from: string,\n contractAction: string,\n contractPayload: Record,\n contractName = \"tokens\"\n): Operation {\n return [\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [from],\n required_posting_auths: [],\n json: JSON.stringify({ contractName, contractAction, contractPayload }),\n }];\n}\n\n/**\n * Builds a scot_claim_token operation (posting authority).\n * @param account - Account claiming rewards\n * @param tokens - Array of token symbols to claim\n * @returns Custom JSON operation\n */\nexport function buildEngineClaimOp(\n account: string,\n tokens: string[]\n): Operation {\n return [\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [account],\n json: JSON.stringify(tokens.map((symbol) => ({ symbol }))),\n }];\n}\n\n/**\n * Builds a delegate RC operation (custom_json).\n * @param from - Account delegating RC\n * @param delegatees - Single delegatee or comma-separated list\n * @param maxRc - Maximum RC to delegate (in mana units)\n * @returns Custom JSON operation for RC delegation\n */\nexport function buildDelegateRcOp(\n from: string,\n delegatees: string,\n maxRc: string | number\n): Operation {\n if (!from || !delegatees || maxRc === undefined) {\n throw new Error(\"[SDK][buildDelegateRcOp] Missing required parameters\");\n }\n\n const delegateeArray = delegatees.includes(\",\")\n ? delegatees.split(\",\").map((d) => d.trim())\n : [delegatees];\n\n return [\n \"custom_json\",\n {\n id: \"rc\",\n json: JSON.stringify([\n \"delegate_rc\",\n {\n from,\n delegatees: delegateeArray,\n max_rc: maxRc,\n },\n ]),\n required_auths: [],\n required_posting_auths: [from],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Social Operations\n * Operations for following, muting, and managing social relationships\n */\n\n/**\n * Builds a follow operation (custom_json).\n * @param follower - Account following\n * @param following - Account to follow\n * @returns Custom JSON operation for follow\n */\nexport function buildFollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildFollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"blog\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unfollow operation (custom_json).\n * @param follower - Account unfollowing\n * @param following - Account to unfollow\n * @returns Custom JSON operation for unfollow\n */\nexport function buildUnfollowOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnfollowOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an ignore/mute operation (custom_json).\n * @param follower - Account ignoring\n * @param following - Account to ignore\n * @returns Custom JSON operation for ignore\n */\nexport function buildIgnoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildIgnoreOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"follow\",\n json: JSON.stringify([\n \"follow\",\n {\n follower,\n following,\n what: [\"ignore\"],\n },\n ]),\n required_auths: [],\n required_posting_auths: [follower],\n },\n ];\n}\n\n/**\n * Builds an unignore/unmute operation (custom_json).\n * @param follower - Account unignoring\n * @param following - Account to unignore\n * @returns Custom JSON operation for unignore\n */\nexport function buildUnignoreOp(follower: string, following: string): Operation {\n if (!follower || !following) {\n throw new Error(\"[SDK][buildUnignoreOp] Missing required parameters\");\n }\n\n return buildUnfollowOp(follower, following);\n}\n\n/**\n * Builds a Hive Notify set last read operation (custom_json).\n * @param username - Account setting last read\n * @param date - ISO date string (defaults to now)\n * @returns Array of custom JSON operations for setting last read\n */\nexport function buildSetLastReadOps(username: string, date?: string): Operation[] {\n if (!username) {\n throw new Error(\"[SDK][buildSetLastReadOps] Missing required parameters\");\n }\n\n const lastReadDate = date || new Date().toISOString().split(\".\")[0];\n\n const notifyOp: Operation = [\n \"custom_json\",\n {\n id: \"notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n const ecencyNotifyOp: Operation = [\n \"custom_json\",\n {\n id: \"ecency_notify\",\n json: JSON.stringify([\"setLastRead\", { date: lastReadDate }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n\n return [notifyOp, ecencyNotifyOp];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Governance Operations\n * Operations for witness voting, proposals, and proxy management\n */\n\n/**\n * Builds an account witness vote operation.\n * @param account - Account voting\n * @param witness - Witness account name\n * @param approve - True to approve, false to disapprove\n * @returns Account witness vote operation\n */\nexport function buildWitnessVoteOp(\n account: string,\n witness: string,\n approve: boolean\n): Operation {\n if (!account || !witness || approve === undefined) {\n throw new Error(\"[SDK][buildWitnessVoteOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_vote\",\n {\n account,\n witness,\n approve,\n },\n ];\n}\n\n/**\n * Builds an account witness proxy operation.\n * @param account - Account setting proxy\n * @param proxy - Proxy account name (empty string to remove proxy)\n * @returns Account witness proxy operation\n */\nexport function buildWitnessProxyOp(account: string, proxy: string): Operation {\n if (!account || proxy === undefined) {\n throw new Error(\"[SDK][buildWitnessProxyOp] Missing required parameters\");\n }\n\n return [\n \"account_witness_proxy\",\n {\n account,\n proxy,\n },\n ];\n}\n\n/**\n * Payload for proposal creation\n */\nexport interface ProposalCreatePayload {\n receiver: string;\n subject: string;\n permlink: string;\n start: string;\n end: string;\n dailyPay: string;\n}\n\n/**\n * Builds a create proposal operation.\n * @param creator - Account creating the proposal\n * @param payload - Proposal details (must include start, end, and dailyPay)\n * @returns Create proposal operation\n */\nexport function buildProposalCreateOp(\n creator: string,\n payload: ProposalCreatePayload\n): Operation {\n // Validate required fields including start, end, and dailyPay\n if (\n !creator ||\n !payload.receiver ||\n !payload.subject ||\n !payload.permlink ||\n !payload.start ||\n !payload.end ||\n !payload.dailyPay\n ) {\n throw new Error(\"[SDK][buildProposalCreateOp] Missing required parameters\");\n }\n\n // Validate date format by attempting to parse them\n const startDate = new Date(payload.start);\n const endDate = new Date(payload.end);\n if (startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {\n throw new Error(\n \"[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings\"\n );\n }\n\n return [\n \"create_proposal\",\n {\n creator,\n receiver: payload.receiver,\n start_date: payload.start,\n end_date: payload.end,\n daily_pay: payload.dailyPay,\n subject: payload.subject,\n permlink: payload.permlink,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal votes operation.\n * @param voter - Account voting\n * @param proposalIds - Array of proposal IDs\n * @param approve - True to approve, false to disapprove\n * @returns Update proposal votes operation\n */\nexport function buildProposalVoteOp(\n voter: string,\n proposalIds: number[],\n approve: boolean\n): Operation {\n if (!voter || !proposalIds || proposalIds.length === 0 || approve === undefined) {\n throw new Error(\"[SDK][buildProposalVoteOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal_votes\",\n {\n voter,\n proposal_ids: proposalIds,\n approve,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds a remove proposal operation.\n * @param proposalOwner - Owner of the proposal\n * @param proposalIds - Array of proposal IDs to remove\n * @returns Remove proposal operation\n */\nexport function buildRemoveProposalOp(\n proposalOwner: string,\n proposalIds: number[]\n): Operation {\n if (!proposalOwner || !proposalIds || proposalIds.length === 0) {\n throw new Error(\"[SDK][buildRemoveProposalOp] Missing required parameters\");\n }\n\n return [\n \"remove_proposal\",\n {\n proposal_owner: proposalOwner,\n proposal_ids: proposalIds,\n extensions: [],\n },\n ];\n}\n\n/**\n * Builds an update proposal operation.\n * @param proposalId - Proposal ID to update (must be a valid number, including 0)\n * @param creator - Account that created the proposal\n * @param dailyPay - New daily pay amount\n * @param subject - New subject\n * @param permlink - New permlink\n * @returns Update proposal operation\n */\nexport function buildUpdateProposalOp(\n proposalId: number,\n creator: string,\n dailyPay: string,\n subject: string,\n permlink: string\n): Operation {\n // Validate proposalId properly - check for undefined/null instead of falsy\n // This allows proposalId of 0 which is a valid proposal ID\n if (\n proposalId === undefined ||\n proposalId === null ||\n typeof proposalId !== 'number' ||\n !creator ||\n !dailyPay ||\n !subject ||\n !permlink\n ) {\n throw new Error(\"[SDK][buildUpdateProposalOp] Missing required parameters\");\n }\n\n return [\n \"update_proposal\",\n {\n proposal_id: proposalId,\n creator,\n daily_pay: dailyPay,\n subject,\n permlink,\n extensions: [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Community Operations\n * Operations for managing Hive communities\n */\n\n/**\n * Builds a subscribe to community operation (custom_json).\n * @param username - Account subscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for subscribe\n */\nexport function buildSubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildSubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"subscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds an unsubscribe from community operation (custom_json).\n * @param username - Account unsubscribing\n * @param community - Community name (e.g., \"hive-123456\")\n * @returns Custom JSON operation for unsubscribe\n */\nexport function buildUnsubscribeOp(username: string, community: string): Operation {\n if (!username || !community) {\n throw new Error(\"[SDK][buildUnsubscribeOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"unsubscribe\", { community }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a set user role in community operation (custom_json).\n * @param username - Account setting the role (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to set role for\n * @param role - Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\")\n * @returns Custom JSON operation for setRole\n */\nexport function buildSetRoleOp(\n username: string,\n community: string,\n account: string,\n role: string\n): Operation {\n if (!username || !community || !account || !role) {\n throw new Error(\n `[SDK][buildSetRoleOp] Missing required parameters: username=${username}, community=${community}, account=${account}, role=${role}`\n );\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"setRole\", { community, account, role }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Community properties for update\n */\nexport interface CommunityProps {\n title: string;\n about: string;\n lang: string;\n description: string;\n flag_text: string;\n is_nsfw: boolean;\n}\n\n/**\n * Builds an update community properties operation (custom_json).\n * @param username - Account updating (must be community admin)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param props - Properties to update\n * @returns Custom JSON operation for updateProps\n */\nexport function buildUpdateCommunityOp(\n username: string,\n community: string,\n props: CommunityProps\n): Operation {\n if (!username || !community || !props) {\n throw new Error(\"[SDK][buildUpdateCommunityOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"updateProps\", { community, props }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a pin/unpin post in community operation (custom_json).\n * @param username - Account pinning (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param pin - True to pin, false to unpin\n * @returns Custom JSON operation for pinPost/unpinPost\n */\nexport function buildPinPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n pin: boolean\n): Operation {\n if (!username || !community || !account || !permlink || pin === undefined) {\n throw new Error(\"[SDK][buildPinPostOp] Missing required parameters\");\n }\n\n const action = pin ? \"pinPost\" : \"unpinPost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute post in community operation (custom_json).\n * @param username - Account muting (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for mutePost/unmutePost\n */\nexport function buildMutePostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string,\n mute: boolean\n): Operation {\n if (\n !username ||\n !community ||\n !account ||\n !permlink ||\n mute === undefined\n ) {\n throw new Error(\"[SDK][buildMutePostOp] Missing required parameters\");\n }\n\n const action = mute ? \"mutePost\" : \"unmutePost\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a mute/unmute user in community operation (custom_json).\n * @param username - Account performing mute (must have permission)\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Account to mute/unmute\n * @param notes - Mute reason/notes\n * @param mute - True to mute, false to unmute\n * @returns Custom JSON operation for muteUser/unmuteUser\n */\nexport function buildMuteUserOp(\n username: string,\n community: string,\n account: string,\n notes: string,\n mute: boolean\n): Operation {\n if (!username || !community || !account || mute === undefined) {\n throw new Error(\"[SDK][buildMuteUserOp] Missing required parameters\");\n }\n\n const action = mute ? \"muteUser\" : \"unmuteUser\";\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([action, { community, account, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n\n/**\n * Builds a flag post in community operation (custom_json).\n * @param username - Account flagging\n * @param community - Community name (e.g., \"hive-123456\")\n * @param account - Post author\n * @param permlink - Post permlink\n * @param notes - Flag reason/notes\n * @returns Custom JSON operation for flagPost\n */\nexport function buildFlagPostOp(\n username: string,\n community: string,\n account: string,\n permlink: string,\n notes: string\n): Operation {\n if (!username || !community || !account || !permlink) {\n throw new Error(\"[SDK][buildFlagPostOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"community\",\n json: JSON.stringify([\"flagPost\", { community, account, permlink, notes }]),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Market Operations\n * Operations for trading on the internal Hive market\n */\n\n/**\n * Transaction type for buy/sell operations\n */\nexport enum BuySellTransactionType {\n Buy = \"buy\",\n Sell = \"sell\",\n}\n\n/**\n * Order ID prefix for different order types\n */\nexport enum OrderIdPrefix {\n EMPTY = \"\",\n SWAP = \"9\",\n}\n\n/**\n * Builds a limit order create operation.\n * @param owner - Account creating the order\n * @param amountToSell - Amount and asset to sell\n * @param minToReceive - Minimum amount and asset to receive\n * @param fillOrKill - If true, order must be filled immediately or cancelled\n * @param expiration - Expiration date (ISO string)\n * @param orderId - Unique order ID\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOp(\n owner: string,\n amountToSell: string,\n minToReceive: string,\n fillOrKill: boolean,\n expiration: string,\n orderId: number\n): Operation {\n if (!owner || !amountToSell || !minToReceive || !expiration || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCreateOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_create\",\n {\n owner,\n orderid: orderId,\n amount_to_sell: amountToSell,\n min_to_receive: minToReceive,\n fill_or_kill: fillOrKill,\n expiration,\n },\n ];\n}\n\n/**\n * Helper to format number to 3 decimal places\n */\nfunction formatNumber(value: number, decimals: number = 3): string {\n return value.toFixed(decimals);\n}\n\n/**\n * Builds a limit order create operation with automatic formatting.\n * This is a convenience method that handles buy/sell logic and formatting.\n *\n * For Buy orders: You're buying HIVE with HBD\n * - amountToSell: HBD amount you're spending\n * - minToReceive: HIVE amount you want to receive\n *\n * For Sell orders: You're selling HIVE for HBD\n * - amountToSell: HIVE amount you're selling\n * - minToReceive: HBD amount you want to receive\n *\n * @param owner - Account creating the order\n * @param amountToSell - Amount to sell (number)\n * @param minToReceive - Minimum to receive (number)\n * @param orderType - Buy or Sell\n * @param idPrefix - Order ID prefix\n * @returns Limit order create operation\n */\nexport function buildLimitOrderCreateOpWithType(\n owner: string,\n amountToSell: number,\n minToReceive: number,\n orderType: BuySellTransactionType,\n idPrefix: OrderIdPrefix = OrderIdPrefix.EMPTY\n): Operation {\n // Validate numeric inputs\n if (\n !owner ||\n orderType === undefined ||\n !Number.isFinite(amountToSell) ||\n amountToSell <= 0 ||\n !Number.isFinite(minToReceive) ||\n minToReceive <= 0\n ) {\n throw new Error(\"[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters\");\n }\n\n // Calculate expiration (27 days from now)\n const expiration = new Date(Date.now());\n expiration.setDate(expiration.getDate() + 27);\n const expirationStr = expiration.toISOString().split(\".\")[0];\n\n // Generate order ID\n const orderId = Number(\n `${idPrefix}${Math.floor(Date.now() / 1000)\n .toString()\n .slice(2)}`\n );\n\n // Format amounts based on order type\n // Buy: Sell HBD to buy HIVE\n // Sell: Sell HIVE to buy HBD\n const formattedAmountToSell =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(amountToSell, 3)} HBD`\n : `${formatNumber(amountToSell, 3)} HIVE`;\n\n const formattedMinToReceive =\n orderType === BuySellTransactionType.Buy\n ? `${formatNumber(minToReceive, 3)} HIVE`\n : `${formatNumber(minToReceive, 3)} HBD`;\n\n return buildLimitOrderCreateOp(\n owner,\n formattedAmountToSell,\n formattedMinToReceive,\n false,\n expirationStr,\n orderId\n );\n}\n\n/**\n * Builds a limit order cancel operation.\n * @param owner - Account cancelling the order\n * @param orderId - Order ID to cancel\n * @returns Limit order cancel operation\n */\nexport function buildLimitOrderCancelOp(owner: string, orderId: number): Operation {\n if (!owner || orderId === undefined) {\n throw new Error(\"[SDK][buildLimitOrderCancelOp] Missing required parameters\");\n }\n\n return [\n \"limit_order_cancel\",\n {\n owner,\n orderid: orderId,\n },\n ];\n}\n\n/**\n * Builds a claim reward balance operation.\n * @param account - Account claiming rewards\n * @param rewardHive - HIVE reward to claim (e.g., \"0.000 HIVE\")\n * @param rewardHbd - HBD reward to claim (e.g., \"0.000 HBD\")\n * @param rewardVests - VESTS reward to claim (e.g., \"0.000000 VESTS\")\n * @returns Claim reward balance operation\n */\nexport function buildClaimRewardBalanceOp(\n account: string,\n rewardHive: string,\n rewardHbd: string,\n rewardVests: string\n): Operation {\n if (!account || !rewardHive || !rewardHbd || !rewardVests) {\n throw new Error(\"[SDK][buildClaimRewardBalanceOp] Missing required parameters\");\n }\n\n return [\n \"claim_reward_balance\",\n {\n account,\n reward_hive: rewardHive,\n reward_hbd: rewardHbd,\n reward_vests: rewardVests,\n },\n ];\n}\n","import type { Operation, Authority } from \"../../../hive-tx\";\n\nexport type { Authority };\n\n/**\n * Account Operations\n * Operations for managing accounts, keys, and permissions\n */\n\n/**\n * Builds an account update operation.\n * @param account - Account name\n * @param owner - Owner authority (optional)\n * @param active - Active authority (optional)\n * @param posting - Posting authority (optional)\n * @param memoKey - Memo public key\n * @param jsonMetadata - Account JSON metadata\n * @returns Account update operation\n */\nexport function buildAccountUpdateOp(\n account: string,\n owner: Authority | undefined,\n active: Authority | undefined,\n posting: Authority | undefined,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !memoKey) {\n throw new Error(\"[SDK][buildAccountUpdateOp] Missing required parameters\");\n }\n\n return [\n \"account_update\",\n {\n account,\n owner,\n active,\n posting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an account update2 operation (for posting_json_metadata).\n * @param account - Account name\n * @param jsonMetadata - Account JSON metadata (legacy, usually empty)\n * @param postingJsonMetadata - Posting JSON metadata string\n * @param extensions - Extensions array\n * @returns Account update2 operation\n */\nexport function buildAccountUpdate2Op(\n account: string,\n jsonMetadata: string,\n postingJsonMetadata: string,\n extensions: any[]\n): Operation {\n if (!account || postingJsonMetadata === undefined) {\n throw new Error(\"[SDK][buildAccountUpdate2Op] Missing required parameters\");\n }\n\n return [\n \"account_update2\",\n {\n account,\n json_metadata: jsonMetadata || \"\",\n posting_json_metadata: postingJsonMetadata,\n extensions: (extensions || []) as [],\n },\n ];\n}\n\n/**\n * Public keys for account creation\n */\nexport interface AccountKeys {\n ownerPublicKey: string;\n activePublicKey: string;\n postingPublicKey: string;\n memoPublicKey: string;\n}\n\n/**\n * Builds an account create operation.\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @param fee - Creation fee (e.g., \"3.000 HIVE\")\n * @returns Account create operation\n */\nexport function buildAccountCreateOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys,\n fee: string\n): Operation {\n if (!creator || !newAccountName || !keys || !fee) {\n throw new Error(\"[SDK][buildAccountCreateOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"account_create\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n fee,\n },\n ] satisfies Operation;\n}\n\n/**\n * Builds a create claimed account operation (using account creation tokens).\n * @param creator - Creator account name\n * @param newAccountName - New account name\n * @param keys - Public keys for the new account\n * @returns Create claimed account operation\n */\nexport function buildCreateClaimedAccountOp(\n creator: string,\n newAccountName: string,\n keys: AccountKeys\n): Operation {\n if (!creator || !newAccountName || !keys) {\n throw new Error(\"[SDK][buildCreateClaimedAccountOp] Missing required parameters\");\n }\n\n const owner: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.ownerPublicKey, 1]],\n };\n\n const active: Authority = {\n weight_threshold: 1,\n account_auths: [],\n key_auths: [[keys.activePublicKey, 1]],\n };\n\n const posting: Authority = {\n weight_threshold: 1,\n account_auths: [[\"ecency.app\", 1]],\n key_auths: [[keys.postingPublicKey, 1]],\n };\n\n return [\n \"create_claimed_account\",\n {\n creator,\n new_account_name: newAccountName,\n owner,\n active,\n posting,\n memo_key: keys.memoPublicKey,\n json_metadata: \"\",\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds a claim account operation.\n * @param creator - Account claiming the token\n * @param fee - Fee for claiming (usually \"0.000 HIVE\" for RC-based claims)\n * @returns Claim account operation\n */\nexport function buildClaimAccountOp(creator: string, fee: string): Operation {\n if (!creator || !fee) {\n throw new Error(\"[SDK][buildClaimAccountOp] Missing required parameters\");\n }\n\n return [\n \"claim_account\",\n {\n creator,\n fee,\n extensions: [] as [],\n },\n ];\n}\n\n/**\n * Builds an operation to grant posting permission to another account.\n * Helper that modifies posting authority to add an account.\n * @param account - Account granting permission\n * @param currentPosting - Current posting authority\n * @param grantedAccount - Account to grant permission to\n * @param weightThreshold - Weight threshold of the granted account\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildGrantPostingPermissionOp(\n account: string,\n currentPosting: Authority,\n grantedAccount: string,\n weightThreshold: number,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !grantedAccount || !memoKey) {\n throw new Error(\"[SDK][buildGrantPostingPermissionOp] Missing required parameters\");\n }\n\n // Find existing account or create new entry to prevent duplicates\n const existingIndex = currentPosting.account_auths.findIndex(\n ([acc]) => acc === grantedAccount\n );\n\n const newAccountAuths = [...currentPosting.account_auths];\n if (existingIndex >= 0) {\n // Update existing entry with new weight\n newAccountAuths[existingIndex] = [grantedAccount, weightThreshold];\n } else {\n // Add new entry\n newAccountAuths.push([grantedAccount, weightThreshold]);\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: newAccountAuths,\n };\n\n // Sort account_auths alphabetically for consistency\n newPosting.account_auths.sort((a, b) => (a[0] > b[0] ? 1 : -1));\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds an operation to revoke posting permission from an account.\n * Helper that modifies posting authority to remove an account.\n * @param account - Account revoking permission\n * @param currentPosting - Current posting authority\n * @param revokedAccount - Account to revoke permission from\n * @param memoKey - Memo public key (required by Hive blockchain)\n * @param jsonMetadata - Account JSON metadata (required by Hive blockchain)\n * @returns Account update operation with modified posting authority\n */\nexport function buildRevokePostingPermissionOp(\n account: string,\n currentPosting: Authority,\n revokedAccount: string,\n memoKey: string,\n jsonMetadata: string\n): Operation {\n if (!account || !currentPosting || !revokedAccount || !memoKey) {\n throw new Error(\"[SDK][buildRevokePostingPermissionOp] Missing required parameters\");\n }\n\n const newPosting: Authority = {\n ...currentPosting,\n account_auths: currentPosting.account_auths.filter(\n ([acc]) => acc !== revokedAccount\n ),\n };\n\n return [\n \"account_update\",\n {\n account,\n posting: newPosting,\n memo_key: memoKey,\n json_metadata: jsonMetadata,\n },\n ];\n}\n\n/**\n * Builds a change recovery account operation.\n * @param accountToRecover - Account to change recovery account for\n * @param newRecoveryAccount - New recovery account name\n * @param extensions - Extensions array\n * @returns Change recovery account operation\n */\nexport function buildChangeRecoveryAccountOp(\n accountToRecover: string,\n newRecoveryAccount: string,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newRecoveryAccount) {\n throw new Error(\"[SDK][buildChangeRecoveryAccountOp] Missing required parameters\");\n }\n\n return [\n \"change_recovery_account\",\n {\n account_to_recover: accountToRecover,\n new_recovery_account: newRecoveryAccount,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a request account recovery operation.\n * @param recoveryAccount - Recovery account performing the recovery\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param extensions - Extensions array\n * @returns Request account recovery operation\n */\nexport function buildRequestAccountRecoveryOp(\n recoveryAccount: string,\n accountToRecover: string,\n newOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {\n throw new Error(\"[SDK][buildRequestAccountRecoveryOp] Missing required parameters\");\n }\n\n return [\n \"request_account_recovery\",\n {\n recovery_account: recoveryAccount,\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n\n/**\n * Builds a recover account operation.\n * @param accountToRecover - Account to recover\n * @param newOwnerAuthority - New owner authority\n * @param recentOwnerAuthority - Recent owner authority (for proof)\n * @param extensions - Extensions array\n * @returns Recover account operation\n */\nexport function buildRecoverAccountOp(\n accountToRecover: string,\n newOwnerAuthority: Authority,\n recentOwnerAuthority: Authority,\n extensions: any[] = []\n): Operation {\n if (!accountToRecover || !newOwnerAuthority || !recentOwnerAuthority) {\n throw new Error(\"[SDK][buildRecoverAccountOp] Missing required parameters\");\n }\n\n return [\n \"recover_account\",\n {\n account_to_recover: accountToRecover,\n new_owner_authority: newOwnerAuthority,\n recent_owner_authority: recentOwnerAuthority,\n extensions: extensions as [],\n },\n ];\n}\n","import type { Operation } from \"../../../hive-tx\";\n\n/**\n * Ecency-Specific Operations\n * Custom operations for Ecency platform features (Points, Boost, Promote, etc.)\n */\n\n/**\n * Builds an Ecency Boost Plus subscription operation (custom_json).\n * @param user - User account\n * @param account - Account to subscribe\n * @param duration - Subscription duration in days (must be a valid finite number)\n * @returns Custom JSON operation for boost plus\n */\nexport function buildBoostPlusOp(\n user: string,\n account: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !account || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildBoostPlusOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_boost_plus\",\n json: JSON.stringify({\n user,\n account,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency RC top-up operation (custom_json): a short-term, RC-only\n * delegation to the user's OWN account, paid for with Ecency Points. Distinct\n * from Boost Plus (which delegates Hive Power). The RC amount is fixed\n * server-side, so the user only chooses a duration. Signed with active\n * authority because it spends Points. The actual on-chain `delegate_rc` is\n * broadcast by the Ecency relay account, not here.\n * @param user - User account (payer and recipient of the RC)\n * @param duration - Delegation duration in days (must be a valid finite number)\n * @returns Custom JSON operation for the RC top-up\n */\nexport function buildRcDelegationOp(user: string, duration: number): Operation {\n if (!user || !Number.isInteger(duration) || duration <= 0) {\n throw new Error(\"[SDK][buildRcDelegationOp] Missing or invalid parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_rc_delegation\",\n json: JSON.stringify({\n user,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency promote operation (custom_json).\n * @param user - User account\n * @param author - Post author\n * @param permlink - Post permlink\n * @param duration - Promotion duration in days (must be a valid finite number)\n * @returns Custom JSON operation for promote\n */\nexport function buildPromoteOp(\n user: string,\n author: string,\n permlink: string,\n duration: number\n): Operation {\n // Validate required parameters and ensure duration is a finite number (reject NaN, Infinity)\n if (!user || !author || !permlink || !Number.isFinite(duration)) {\n throw new Error(\"[SDK][buildPromoteOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_promote\",\n json: JSON.stringify({\n user,\n author,\n permlink,\n duration,\n }),\n required_auths: [user],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds an Ecency point transfer operation (custom_json).\n * @param sender - Sender account\n * @param receiver - Receiver account\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Custom JSON operation for point transfer\n */\nexport function buildPointTransferOp(\n sender: string,\n receiver: string,\n amount: string,\n memo: string\n): Operation {\n if (!sender || !receiver || !amount) {\n throw new Error(\"[SDK][buildPointTransferOp] Missing required parameters\");\n }\n\n // Normalize \"POINTS\" to \"POINT\" — backend expects singular form\n const normalizedAmount = amount.replace(/POINTS\\b/, \"POINT\");\n\n return [\n \"custom_json\",\n {\n id: \"ecency_point_transfer\",\n json: JSON.stringify({\n sender,\n receiver,\n amount: normalizedAmount,\n memo: memo || \"\",\n }),\n required_auths: [sender],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds multiple Ecency point transfer operations for multiple recipients.\n * @param sender - Sender account\n * @param destinations - Comma or space separated list of recipients\n * @param amount - Amount to transfer\n * @param memo - Transfer memo\n * @returns Array of custom JSON operations for point transfers\n */\nexport function buildMultiPointTransferOps(\n sender: string,\n destinations: string,\n amount: string,\n memo: string\n): Operation[] {\n if (!sender || !destinations || !amount) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing required parameters\");\n }\n\n // Split the destination input into an array of usernames\n const destArray = destinations\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean);\n\n // Validate parsed destinations\n if (destArray.length === 0) {\n throw new Error(\"[SDK][buildMultiPointTransferOps] Missing valid destinations\");\n }\n\n // Create a point transfer operation for each destination\n return destArray.map((dest) =>\n buildPointTransferOp(sender, dest.trim(), amount, memo)\n );\n}\n\n/**\n * Builds an Ecency community rewards registration operation (custom_json).\n * @param name - Account name to register\n * @returns Custom JSON operation for community registration\n */\nexport function buildCommunityRegistrationOp(name: string): Operation {\n if (!name) {\n throw new Error(\"[SDK][buildCommunityRegistrationOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: \"ecency_registration\",\n json: JSON.stringify({\n name,\n }),\n required_auths: [name],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic active authority custom_json operation.\n * Used for various Ecency operations that require active authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with active authority\n */\nexport function buildActiveCustomJsonOp(\n username: string,\n operationId: string,\n json: Record\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildActiveCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [username],\n required_posting_auths: [],\n },\n ];\n}\n\n/**\n * Builds a generic posting authority custom_json operation.\n * Used for various operations that require posting authority.\n * @param username - Account performing the operation\n * @param operationId - Custom JSON operation ID\n * @param json - JSON payload\n * @returns Custom JSON operation with posting authority\n */\nexport function buildPostingCustomJsonOp(\n username: string,\n operationId: string,\n json: Record | any[]\n): Operation {\n if (!username || !operationId || !json) {\n throw new Error(\"[SDK][buildPostingCustomJsonOp] Missing required parameters\");\n }\n\n return [\n \"custom_json\",\n {\n id: operationId,\n json: JSON.stringify(json),\n required_auths: [],\n required_posting_auths: [username],\n },\n ];\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildFollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for following an account.\n */\nexport interface FollowPayload {\n /** Account to follow */\n following: string;\n}\n\n/**\n * React Query mutation hook for following an account.\n *\n * This mutation broadcasts a follow operation to the Hive blockchain,\n * adding the target account to the follower's \"blog\" follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const followMutation = useFollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Follow an account\n * followMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useFollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"follow\"],\n username,\n ({ following }) => [\n buildFollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnfollowOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unfollowing an account.\n */\nexport interface UnfollowPayload {\n /** Account to unfollow */\n following: string;\n}\n\n/**\n * React Query mutation hook for unfollowing an account.\n *\n * This mutation broadcasts an unfollow operation to the Hive blockchain,\n * removing the target account from the follower's follow list.\n *\n * @param username - The username of the follower (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates relationship cache to show updated follow status\n * - Invalidates account cache to refetch updated follower/following counts\n *\n * @example\n * ```typescript\n * const unfollowMutation = useUnfollow(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unfollow an account\n * unfollowMutation.mutate({\n * following: 'alice'\n * });\n * ```\n */\nexport function useUnfollow(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"unfollow\"],\n username,\n ({ following }) => [\n buildUnfollowOp(username!, following)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.relations(username!, variables.following),\n QueryKeys.accounts.full(variables.following),\n QueryKeys.accounts.followCount(variables.following),\n QueryKeys.accounts.followCount(username!)\n ]);\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ninterface Payload {\n author: string;\n permlink: string;\n}\n\nexport function useBookmarkAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"add\", username],\n mutationFn: async ({ author, permlink }: Payload) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n author,\n permlink,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useBookmarkDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"bookmarks\", \"delete\", username],\n mutationFn: async (bookmarkId: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Bookmarks] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/bookmarks-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n id: bookmarkId,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: () => {\n onSuccess();\n getQueryClient().invalidateQueries({\n queryKey: [\"accounts\", \"bookmarks\", username],\n });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useAccountFavoriteAdd(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"add\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-add\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n return response.json();\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError,\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { useMutation, InfiniteData } from \"@tanstack/react-query\";\nimport { AccountFavorite } from \"../../types\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAccountFavoriteDelete(\n username: string | undefined,\n code: string | undefined,\n onSuccess: () => void,\n onError: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"accounts\", \"favorites\", \"delete\", username],\n mutationFn: async (account: string) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Account][Favorites] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/favorites-delete\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n account,\n code,\n }),\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to delete favorite: ${response.status}`);\n }\n return response.json();\n },\n onMutate: async (account: string) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.accounts.favorites(username);\n const infinitePrefix = QueryKeys.accounts.favoritesInfinite(username);\n const checkKey = QueryKeys.accounts.checkFavorite(username, account);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n qc.cancelQueries({ queryKey: checkKey }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((f) => f.account !== account)\n );\n }\n\n const previousCheck = qc.getQueryData(checkKey);\n qc.setQueryData(checkKey, false);\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((f) => f.account !== account),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite, previousCheck };\n },\n onSuccess: (_data, account) => {\n onSuccess();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favorites(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.favoritesInfinite(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.accounts.checkFavorite(username!, account) });\n },\n onError: (err, account, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.accounts.favorites(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n if (context?.previousCheck !== undefined) {\n qc.setQueryData(\n QueryKeys.accounts.checkFavorite(username!, account),\n context.previousCheck\n );\n }\n onError(err);\n },\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\nexport interface Keys {\n owner: PrivateKey;\n active: PrivateKey;\n posting: PrivateKey;\n memo_key: PrivateKey;\n}\n\ninterface Payload {\n keepCurrent?: boolean;\n currentKey: PrivateKey;\n keys: Keys[];\n keysToRevoke?: string[]; // Deprecated: will be treated as revoking from all authorities\n keysToRevokeByAuthority?: Partial>; // Authority-specific revocation\n}\n\nexport function dedupeAndSortKeyAuths(\n existing: Authority[\"key_auths\"],\n additions: [string, number][]\n): Authority[\"key_auths\"] {\n const merged = new Map();\n\n existing.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n additions.forEach(([key, weight]) => {\n merged.set(key.toString(), weight);\n });\n\n return Array.from(merged.entries())\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, weight]) => [key, weight] as [string, number]);\n}\n\ntype UpdateKeyAuthsOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdateKeyAuths(\n username: string,\n options?: UpdateKeyAuthsOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"keys-update\", username],\n mutationFn: async ({\n keys,\n keepCurrent = false,\n currentKey,\n keysToRevoke = [],\n keysToRevokeByAuthority = {}\n }: Payload) => {\n if (keys.length === 0) {\n throw new Error(\n \"[SDK][Update password] – no new keys provided\"\n );\n }\n\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update keys for anon user\"\n );\n }\n\n const prepareAuth = (keyName: keyof Keys) => {\n const auth: Authority = JSON.parse(JSON.stringify(accountData[keyName]));\n\n // Get keys to revoke for this specific authority\n const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];\n // Fallback to global keysToRevoke for backwards compatibility\n const allKeysToRevoke = [\n ...keysToRevokeForAuthority,\n ...(keysToRevokeByAuthority[keyName] === undefined ? keysToRevoke : [])\n ];\n\n // Filter out keys to revoke from existing keys (authority-specific)\n const existingKeys = keepCurrent\n ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString()))\n : [];\n\n auth.key_auths = dedupeAndSortKeyAuths(\n existingKeys,\n keys.map(\n (values, i) =>\n [values[keyName].createPublic().toString(), i + 1] as [\n string,\n number,\n ]\n )\n );\n\n return auth;\n };\n\n return broadcastOperations(\n [[\"account_update\", {\n account: username,\n json_metadata: accountData.json_metadata,\n owner: prepareAuth(\"owner\"),\n active: prepareAuth(\"active\"),\n posting: prepareAuth(\"posting\"),\n // Always use new memo key when adding new keys\n memo_key: keys[0].memo_key.createPublic().toString(),\n }]],\n currentKey\n );\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { useAccountUpdateKeyAuths } from \"./use-account-update-key-auths\";\n\ninterface Payload {\n newPassword: string;\n currentPassword: string;\n keepCurrent?: boolean;\n}\n\n/**\n * Only native Hive and custom passwords could be updated here\n * Seed based password cannot be updated here, it will be in an account always for now\n */\ntype UpdatePasswordOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountUpdatePassword(\n username: string,\n options?: UpdatePasswordOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);\n\n return useMutation({\n mutationKey: [\"accounts\", \"password-update\", username],\n mutationFn: async ({\n newPassword,\n currentPassword,\n keepCurrent,\n }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Update password] – cannot update password for anon user\"\n );\n }\n const currentKey = PrivateKey.fromLogin(\n username,\n currentPassword,\n \"owner\"\n );\n\n return updateKeys({\n currentKey,\n keepCurrent,\n keys: [\n {\n owner: PrivateKey.fromLogin(username, newPassword, \"owner\"),\n active: PrivateKey.fromLogin(username, newPassword, \"active\"),\n posting: PrivateKey.fromLogin(username, newPassword, \"posting\"),\n memo_key: PrivateKey.fromLogin(username, newPassword, \"memo\"),\n },\n ],\n });\n },\n ...options,\n });\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { FullAccount } from \"../types\";\nimport hs from \"hivesigner\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n}\n\ntype RevokePostingOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountRevokePosting(\n username: string | undefined,\n options: RevokePostingOptions,\n auth?: AuthContextV2\n) {\n const queryClient = useQueryClient();\n\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-posting\", data?.name],\n mutationFn: async ({ accountName, type, key }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot revoke posting for anonymous user\"\n );\n }\n\n const posting = JSON.parse(JSON.stringify(data.posting)) as FullAccount[\"posting\"];\n\n posting.account_auths = posting.account_auths.filter(\n ([account]) => account !== accountName\n );\n\n const operationBody = {\n account: data.name,\n posting,\n memo_key: data.memo_key,\n json_metadata: data.json_metadata,\n };\n\n if (type === \"key\" && key) {\n return broadcastOperations([[\"account_update\", operationBody]], key);\n } else if (type === \"keychain\") {\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.adapter.broadcastWithKeychain(\n data.name,\n [[\"account_update\", operationBody]],\n \"active\"\n );\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner revoke-posting; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"account_update\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: (resp, payload, ctx) => {\n (options.onSuccess as\n | ((data: unknown, variables: CommonPayload, context: unknown) => unknown)\n | undefined)?.(resp, payload, ctx);\n queryClient.setQueryData(\n getAccountFullQueryOptions(username).queryKey,\n (data) =>\n ({\n ...data,\n posting: {\n ...data?.posting,\n account_auths:\n data?.posting?.account_auths?.filter(\n ([account]) => account !== payload.accountName\n ) ?? [],\n },\n }) as FullAccount\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { PrivateKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ntype SignType = \"key\" | \"keychain\" | \"hivesigner\" | \"ecency\";\n\ninterface CommonPayload {\n accountName: string;\n type: SignType;\n key?: PrivateKey;\n email?: string;\n}\n\ntype UpdateRecoveryOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n> & {\n hsCallbackUrl?: string;\n};\n\nexport function useAccountUpdateRecovery(\n username: string | undefined,\n code: string | undefined,\n options: UpdateRecoveryOptions,\n auth?: AuthContextV2\n) {\n const { data } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"recovery\", data?.name],\n mutationFn: async ({ accountName, type, key, email }: CommonPayload) => {\n if (!data) {\n throw new Error(\n \"[SDK][Accounts] – cannot change recovery for anonymous user\"\n );\n }\n\n const operationBody = {\n account_to_recover: data.name,\n new_recovery_account: accountName,\n extensions: [] as [],\n };\n\n if (type === \"ecency\") {\n if (!code) {\n throw new Error(\"[SDK][Accounts] – missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/recoveries-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n code,\n email,\n publicKeys: [\n ...data.owner.key_auths,\n ...data.active.key_auths,\n ...data.posting.key_auths,\n data.memo_key,\n ],\n }),\n });\n\n // Raw fetch resolves on 4xx/5xx, so guard explicitly — otherwise the\n // caller's onSuccess shows a \"recovery updated\" toast on a failed request.\n // (The missing Content-Type header also made the backend skip JSON parsing.)\n if (!response.ok) {\n throw new Error(`[SDK][Accounts] Failed to add recovery: ${response.status}`);\n }\n\n return response;\n } else if (type === \"key\" && key) {\n return broadcastOperations(\n [[\"change_recovery_account\", operationBody]],\n key\n );\n } else if (type === \"keychain\") {\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Accounts] – missing keychain broadcaster\");\n }\n return auth.adapter.broadcastWithKeychain(data.name, [[\"change_recovery_account\", operationBody]], \"owner\");\n } else {\n if (!options.hsCallbackUrl && process.env.NODE_ENV === \"development\") {\n console.warn(\"[SDK][Accounts] hsCallbackUrl not provided for HiveSigner update-recovery; user will not be redirected after signing.\");\n }\n return hs.sendOperation(\n [\"change_recovery_account\", operationBody],\n options.hsCallbackUrl ? { callback: options.hsCallbackUrl } : {},\n () => {}\n );\n }\n },\n onError: options.onError,\n onSuccess: options.onSuccess,\n });\n}\n","import { PublicKey } from \"../../../hive-tx\";\nimport type { Authority } from \"../../../hive-tx\";\nimport { FullAccount } from \"../types\";\n\n/**\n * Check whether an authority would still meet its weight_threshold\n * after removing the given keys. This prevents revoking keys that\n * would leave an authority unable to sign (especially for multisig).\n */\nexport function canRevokeFromAuthority(\n auth: Authority,\n revokingKeyStrs: Set\n): boolean {\n const remainingWeight = auth.key_auths\n .filter(([key]) => !revokingKeyStrs.has(String(key)))\n .reduce((sum, [, weight]) => sum + weight, 0);\n\n // account_auths also contribute weight\n const accountWeight = (auth.account_auths ?? []).reduce(\n (sum: number, [, weight]: [string, number]) => sum + weight,\n 0\n );\n\n return (remainingWeight + accountWeight) >= auth.weight_threshold;\n}\n\n/**\n * Build an account_update operation that removes the given public keys\n * from the relevant authorities.\n *\n * Only includes the `owner` field when a revoking key actually exists\n * in the owner authority - omitting it allows active-level signing.\n *\n * Returns the operation payload (without the \"account_update\" tag) so\n * callers can wrap it as needed for their broadcast method.\n */\nexport function buildRevokeKeysOp(\n accountData: FullAccount,\n revokingKeys: PublicKey[]\n) {\n const revokingKeyStrs = new Set(revokingKeys.map((k) => k.toString()));\n\n const hasAnyKeyInAuth = (auth: Authority) =>\n auth.key_auths.some(\n ([key]: [string | PublicKey, number]) => revokingKeyStrs.has(String(key))\n );\n\n const prepareAuth = (auth: Authority): Authority => {\n const clone: Authority = JSON.parse(JSON.stringify(auth));\n clone.key_auths = clone.key_auths.filter(\n ([key]) => !revokingKeyStrs.has(key.toString())\n );\n return clone;\n };\n\n const needsOwnerUpdate = hasAnyKeyInAuth(accountData.owner);\n\n return {\n account: accountData.name,\n json_metadata: accountData.json_metadata,\n owner: needsOwnerUpdate ? prepareAuth(accountData.owner) : undefined,\n active: prepareAuth(accountData.active),\n posting: prepareAuth(accountData.posting),\n memo_key: accountData.memo_key\n };\n}\n","import { PrivateKey, PublicKey } from \"../../../hive-tx\";\nimport {\n useMutation,\n useQuery,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { getAccountFullQueryOptions } from \"../queries\";\nimport { buildRevokeKeysOp } from \"./build-revoke-keys-op\";\nimport { broadcastOperations } from \"@/modules/core/hive-tx\";\n\ninterface Payload {\n currentKey: PrivateKey;\n /** Keys to revoke. Accepts a single key or an array. */\n revokingKey: PublicKey | PublicKey[];\n}\n\n/**\n * Revoke one or more keys from an account on the Hive blockchain.\n *\n * When revoking keys that exist only in active/posting authorities,\n * the owner field is omitted from the operation so active-level\n * signing is sufficient.\n */\ntype RevokeKeyOptions = Pick<\n UseMutationOptions,\n \"onSuccess\" | \"onError\"\n>;\n\nexport function useAccountRevokeKey(\n username: string | undefined,\n options?: RevokeKeyOptions\n) {\n const { data: accountData } = useQuery(getAccountFullQueryOptions(username));\n\n return useMutation({\n mutationKey: [\"accounts\", \"revoke-key\", accountData?.name],\n mutationFn: async ({ currentKey, revokingKey }: Payload) => {\n if (!accountData) {\n throw new Error(\n \"[SDK][Revoke key] – cannot update keys for anon user\"\n );\n }\n\n const revokingKeys = Array.isArray(revokingKey) ? revokingKey : [revokingKey];\n const op = buildRevokeKeysOp(accountData, revokingKeys);\n\n return broadcastOperations([[\"account_update\", op]], currentKey);\n },\n ...options,\n });\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildClaimAccountOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for claiming account creation tokens.\n */\nexport interface ClaimAccountPayload {\n /** Creator account claiming the token */\n creator: string;\n /** Fee for claiming (usually \"0.000 HIVE\" for RC-based claims) */\n fee?: string;\n}\n\n/**\n * React Query mutation hook for claiming account creation tokens.\n *\n * This mutation broadcasts a claim_account operation to claim an account\n * creation token using Resource Credits (RC). The claimed token can later\n * be used to create a new account for free using the create_claimed_account\n * operation.\n *\n * @param username - The username claiming the account token (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account cache to update pending_claimed_accounts count\n * - Updates account query data to set pending_claimed_accounts = 0 optimistically\n *\n * **Operation Details:**\n * - Uses native claim_account operation\n * - Fee: \"0.000 HIVE\" (uses RC instead of HIVE)\n * - Authority: Active key (required for claiming)\n *\n * **RC Requirements:**\n * - Requires sufficient Resource Credits (RC)\n * - RC amount varies based on network conditions\n * - Claiming without sufficient RC will fail\n *\n * **Use Case:**\n * - Claim tokens in advance when RC is available\n * - Create accounts later without paying HIVE fee\n * - Useful for onboarding services and apps\n *\n * @example\n * ```typescript\n * const claimMutation = useClaimAccount(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Claim account token using RC\n * claimMutation.mutate({\n * creator: 'alice',\n * fee: '0.000 HIVE'\n * });\n * ```\n */\nexport function useClaimAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"claimAccount\"],\n username,\n ({ creator, fee = \"0.000 HIVE\" }) => [\n buildClaimAccountOp(creator, fee)\n ],\n async (_result: any, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(variables.creator),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildGrantPostingPermissionOp, type Authority } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface GrantPostingPermissionPayload {\n currentPosting: Authority;\n grantedAccount: string;\n weightThreshold: number;\n memoKey: string;\n jsonMetadata: string;\n}\n\nexport function useGrantPostingPermission(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"grant-posting-permission\"],\n username,\n (payload) => [\n buildGrantPostingPermissionOp(\n username!,\n payload.currentPosting,\n payload.grantedAccount,\n payload.weightThreshold,\n payload.memoKey,\n payload.jsonMetadata\n )\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildAccountCreateOp, buildCreateClaimedAccountOp, type AccountKeys } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface CreateAccountPayload {\n newAccountName: string;\n keys: AccountKeys;\n fee: string;\n /** If true, uses a claimed account token instead of paying the fee */\n useClaimed?: boolean;\n}\n\nexport function useCreateAccount(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"accounts\", \"create\"],\n username,\n (payload) => [\n payload.useClaimed\n ? buildCreateClaimedAccountOp(username!, payload.newAccountName, payload.keys)\n : buildAccountCreateOp(username!, payload.newAccountName, payload.keys, payload.fee)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { parseAsset } from \"@/modules/core/utils\";\nimport { DynamicProps } from \"@/modules/core/types\";\nimport { FullAccount } from \"../types\";\nimport { calculateVPMana, calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\n\nconst HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24; // 5 days\nconst HIVE_100_PERCENT = 10000;\nconst HIVE_VOTE_DUST_THRESHOLD = 50_000_000;\n\nfunction getEffectiveVests(account: FullAccount): number {\n const vesting = parseAsset(account.vesting_shares).amount;\n const received = parseAsset(account.received_vesting_shares).amount;\n const delegated = parseAsset(account.delegated_vesting_shares).amount;\n const withdrawRate = parseAsset(account.vesting_withdraw_rate).amount;\n const alreadyWithdrawn =\n (Number(account.to_withdraw) - Number(account.withdrawn)) / 1e6;\n const withdrawVests = Math.min(withdrawRate, alreadyWithdrawn);\n\n return vesting + received - delegated - withdrawVests;\n}\n\nfunction vestsToRshares(vests: number, votingPowerValue: number, votePerc: number): number {\n const vestingShares = vests * 1e6;\n const power = (votingPowerValue * votePerc) / 1e4 / 50 + 1;\n return (power * vestingShares) / 1e4;\n}\n\nfunction hasStableVoteHardfork(dynamicProps: DynamicProps): boolean {\n if (Number.isFinite(dynamicProps.lastHardfork)) {\n return dynamicProps.lastHardfork >= 28;\n }\n\n const [major = \"0\", minor = \"0\"] = (dynamicProps.currentHardforkVersion ?? \"0.0.0\").split(\".\");\n return Number(major) > 1 || (Number(major) === 1 && Number(minor) >= 28);\n}\n\nfunction stableVoteRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n weight: number\n): number {\n const reserveRate =\n dynamicProps.votePowerReserveRate ||\n Number(dynamicProps.raw?.globalDynamic?.vote_power_reserve_rate ?? 0);\n\n if (!Number.isFinite(reserveRate) || reserveRate <= 0) {\n return 0;\n }\n\n const effectiveVests = getEffectiveVests(account);\n if (!Number.isFinite(effectiveVests) || effectiveVests <= 0) {\n return 0;\n }\n\n const vestingShares = effectiveVests * 1e6;\n const usedMana =\n Math.ceil(\n (vestingShares * weight * 60 * 60 * 24) /\n HIVE_100_PERCENT /\n (reserveRate * HIVE_VOTING_MANA_REGENERATION_SECONDS)\n );\n\n const mana = calculateVPMana(account);\n const currentMana = Math.min(mana.current_mana, mana.max_mana);\n\n if (!Number.isFinite(currentMana) || usedMana > currentMana) {\n return 0;\n }\n\n return Math.max(usedMana - HIVE_VOTE_DUST_THRESHOLD, 0);\n}\n\nexport function votingRshares(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n\n if (hasStableVoteHardfork(dynamicProps)) {\n return stableVoteRshares(account, dynamicProps, weight);\n }\n\n let totalVests = 0;\n try {\n totalVests = getEffectiveVests(account);\n if (!Number.isFinite(totalVests)) {\n return 0;\n }\n } catch {\n return 0;\n }\n\n return vestsToRshares(totalVests, votingPowerValue, weight);\n}\n\nexport function votingPower(account: FullAccount): number {\n const calc = calculateVPMana(account);\n return calc.percentage / 100;\n}\n\nexport function powerRechargeTime(power: number) {\n if (!Number.isFinite(power)) {\n throw new TypeError(\"Voting power must be a finite number\");\n }\n if (power < 0 || power > 100) {\n throw new RangeError(\"Voting power must be between 0 and 100\");\n }\n const missingPower = 100 - power;\n return (\n (missingPower * 100 * HIVE_VOTING_MANA_REGENERATION_SECONDS) / 10000\n );\n}\n\nexport function downVotingPower(account: FullAccount): number {\n const totalShares =\n parseFloat(account.vesting_shares) +\n parseFloat(account.received_vesting_shares) -\n parseFloat(account.delegated_vesting_shares);\n const elapsed = Math.floor(Date.now() / 1000) - account.downvote_manabar.last_update_time;\n const maxMana = (totalShares * 1000000) / 4;\n\n if (maxMana <= 0) {\n return 0;\n }\n\n let currentMana =\n parseFloat(account.downvote_manabar.current_mana.toString()) +\n (elapsed * maxMana) / HIVE_VOTING_MANA_REGENERATION_SECONDS;\n\n if (currentMana > maxMana) {\n currentMana = maxMana;\n }\n const currentManaPerc = (currentMana * 100) / maxMana;\n\n if (isNaN(currentManaPerc)) {\n return 0;\n }\n\n if (currentManaPerc > 100) {\n return 100;\n }\n return currentManaPerc;\n}\n\nexport function rcPower(account: RCAccount): number {\n const calc = calculateRCMana(account);\n return calc.percentage / 100;\n}\n\nexport function votingValue(\n account: FullAccount,\n dynamicProps: DynamicProps,\n votingPowerValue: number,\n weight: number = 10000\n): number {\n if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {\n return 0;\n }\n const { fundRecentClaims, fundRewardBalance, base, quote } = dynamicProps;\n\n if (\n !Number.isFinite(fundRecentClaims) ||\n !Number.isFinite(fundRewardBalance) ||\n !Number.isFinite(base) ||\n !Number.isFinite(quote)\n ) {\n return 0;\n }\n\n if (fundRecentClaims === 0 || quote === 0) {\n return 0;\n }\n\n const rShares = votingRshares(account, dynamicProps, votingPowerValue, weight);\n\n if (!Number.isFinite(rShares)) {\n return 0;\n }\n\n return (rShares / fundRecentClaims) * fundRewardBalance * (base / quote);\n}\n","import type { Operation } from \"../../hive-tx\";\n\n/**\n * Authority levels for Hive blockchain operations.\n * - posting: Social operations (voting, commenting, reblogging)\n * - active: Financial and account management operations\n * - owner: Critical security operations (key changes, account recovery)\n * - memo: Memo encryption/decryption (rarely used for signing)\n */\nexport type AuthorityLevel = 'posting' | 'active' | 'owner' | 'memo';\n\n/**\n * Maps operation types to their required authority level.\n *\n * This mapping is used to determine which key is needed to sign a transaction,\n * enabling smart auth fallback and auth upgrade UI.\n *\n * @remarks\n * - Most social operations (vote, comment, reblog) require posting authority\n * - Financial operations (transfer, withdraw) require active authority\n * - Account management operations require active authority\n * - Security operations (password change, account recovery) require owner authority\n * - custom_json requires dynamic detection based on required_auths vs required_posting_auths\n */\nexport const OPERATION_AUTHORITY_MAP: Record = {\n // Posting authority operations\n vote: 'posting',\n comment: 'posting',\n delete_comment: 'posting',\n comment_options: 'posting',\n claim_reward_balance: 'posting',\n\n // Active authority operations - Financial\n cancel_transfer_from_savings: 'active',\n collateralized_convert: 'active',\n convert: 'active',\n delegate_vesting_shares: 'active',\n recurrent_transfer: 'active',\n set_withdraw_vesting_route: 'active',\n transfer: 'active',\n transfer_from_savings: 'active',\n transfer_to_savings: 'active',\n transfer_to_vesting: 'active',\n withdraw_vesting: 'active',\n\n // Active authority operations - Market\n limit_order_create: 'active',\n limit_order_cancel: 'active',\n\n // Active authority operations - Account Management\n account_update: 'active',\n account_update2: 'active',\n claim_account: 'active',\n create_claimed_account: 'active',\n\n // Active authority operations - Governance\n account_witness_proxy: 'active',\n account_witness_vote: 'active',\n remove_proposal: 'active',\n update_proposal_votes: 'active',\n\n // Owner authority operations - Security & Account Recovery\n change_recovery_account: 'owner',\n request_account_recovery: 'owner',\n recover_account: 'owner',\n reset_account: 'owner',\n set_reset_account: 'owner',\n\n // Note: Some operations are handled separately via content inspection:\n // - custom_json: via getCustomJsonAuthority() - posting or active based on required_auths\n // - create_proposal/update_proposal: via getProposalAuthority() - typically active\n};\n\n/**\n * Determines authority required for a custom_json operation.\n *\n * Custom JSON operations can require either posting or active authority\n * depending on which field is populated:\n * - required_auths (active authority)\n * - required_posting_auths (posting authority)\n *\n * @param customJsonOp - The custom_json operation to inspect\n * @returns 'active' if requires active authority, 'posting' if requires posting authority\n *\n * @example\n * ```typescript\n * // Reblog operation (posting authority)\n * const reblogOp: Operation = ['custom_json', {\n * required_auths: [],\n * required_posting_auths: ['alice'],\n * id: 'reblog',\n * json: '...'\n * }];\n * getCustomJsonAuthority(reblogOp); // Returns 'posting'\n *\n * // Some active authority custom_json\n * const activeOp: Operation = ['custom_json', {\n * required_auths: ['alice'],\n * required_posting_auths: [],\n * id: 'some_active_op',\n * json: '...'\n * }];\n * getCustomJsonAuthority(activeOp); // Returns 'active'\n * ```\n */\nexport function getCustomJsonAuthority(customJsonOp: Operation): AuthorityLevel {\n const opType = customJsonOp[0];\n const payload = customJsonOp[1];\n\n if (opType !== 'custom_json') {\n throw new Error('Operation is not a custom_json operation');\n }\n\n // Type assertion for custom_json payload\n const customJson = payload as {\n required_auths?: string[];\n required_posting_auths?: string[];\n id: string;\n json: string;\n };\n\n // If required_auths is set and non-empty, needs active authority\n if (customJson.required_auths && customJson.required_auths.length > 0) {\n return 'active';\n }\n\n // If only required_posting_auths is set, needs posting authority\n if (customJson.required_posting_auths && customJson.required_posting_auths.length > 0) {\n return 'posting';\n }\n\n // Default to posting for custom_json (most common case)\n return 'posting';\n}\n\n/**\n * Determines authority required for a proposal operation.\n *\n * Proposal operations (create_proposal, update_proposal) typically require\n * active authority as they involve financial commitments and funding allocations.\n *\n * @param proposalOp - The proposal operation to inspect\n * @returns 'active' authority requirement\n *\n * @remarks\n * Unlike custom_json, proposal operations don't have explicit required_auths fields.\n * They always use the creator's authority, which defaults to active for financial\n * operations involving the DAO treasury.\n *\n * @example\n * ```typescript\n * const proposalOp: Operation = ['create_proposal', {\n * creator: 'alice',\n * receiver: 'bob',\n * subject: 'My Proposal',\n * permlink: 'my-proposal',\n * start: '2026-03-01T00:00:00',\n * end: '2026-04-01T00:00:00',\n * daily_pay: '100.000 HBD',\n * extensions: []\n * }];\n * getProposalAuthority(proposalOp); // Returns 'active'\n * ```\n */\nexport function getProposalAuthority(proposalOp: Operation): AuthorityLevel {\n const opType = proposalOp[0];\n\n if (opType !== 'create_proposal' && opType !== 'update_proposal') {\n throw new Error('Operation is not a proposal operation');\n }\n\n // Proposal operations require active authority for financial operations\n return 'active';\n}\n\n/**\n * Determines the required authority level for any operation.\n *\n * Uses the OPERATION_AUTHORITY_MAP for standard operations, and dynamic\n * detection for custom_json operations.\n *\n * @param op - The operation to check\n * @returns 'posting' or 'active' authority requirement\n *\n * @example\n * ```typescript\n * const voteOp: Operation = ['vote', { voter: 'alice', author: 'bob', permlink: 'post', weight: 10000 }];\n * getOperationAuthority(voteOp); // Returns 'posting'\n *\n * const transferOp: Operation = ['transfer', { from: 'alice', to: 'bob', amount: '1.000 HIVE', memo: '' }];\n * getOperationAuthority(transferOp); // Returns 'active'\n * ```\n */\nexport function getOperationAuthority(op: Operation): AuthorityLevel {\n const opType = op[0];\n\n // Special handling for custom_json - requires content inspection\n if (opType === 'custom_json') {\n return getCustomJsonAuthority(op);\n }\n\n // Special handling for proposal operations - requires content inspection\n if (opType === 'create_proposal' || opType === 'update_proposal') {\n return getProposalAuthority(op);\n }\n\n // Use mapping for standard operations, default to posting if unknown\n return OPERATION_AUTHORITY_MAP[opType] ?? 'posting';\n}\n\n/**\n * Determines the highest authority level required for a list of operations.\n *\n * Useful when broadcasting multiple operations together - the highest authority\n * level required by any operation determines what key is needed for the batch.\n *\n * Authority hierarchy: owner > active > posting > memo\n *\n * @param ops - Array of operations\n * @returns Highest authority level required ('owner', 'active', or 'posting')\n *\n * @example\n * ```typescript\n * const ops: Operation[] = [\n * ['vote', { ... }], // posting\n * ['comment', { ... }], // posting\n * ];\n * getRequiredAuthority(ops); // Returns 'posting'\n *\n * const mixedOps: Operation[] = [\n * ['comment', { ... }], // posting\n * ['transfer', { ... }], // active\n * ];\n * getRequiredAuthority(mixedOps); // Returns 'active'\n *\n * const securityOps: Operation[] = [\n * ['transfer', { ... }], // active\n * ['change_recovery_account', { ... }], // owner\n * ];\n * getRequiredAuthority(securityOps); // Returns 'owner'\n * ```\n */\nexport function getRequiredAuthority(ops: Operation[]): AuthorityLevel {\n let highestAuthority: AuthorityLevel = 'posting';\n\n for (const op of ops) {\n const authority = getOperationAuthority(op);\n\n // Owner is highest - return immediately\n if (authority === 'owner') {\n return 'owner';\n }\n\n // Active is higher than posting\n if (authority === 'active' && highestAuthority === 'posting') {\n highestAuthority = 'active';\n }\n\n // Memo is lowest (same level as posting)\n // If we see memo but only have posting, stick with posting\n }\n\n return highestAuthority;\n}\n","import { PrivateKey } from \"../../../hive-tx\";\nimport type { Operation } from \"../../../hive-tx\";\nimport { isWif, broadcastOperations } from \"@/modules/core/hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\n\nexport function useSignOperationByKey(username: string | undefined) {\n return useMutation({\n mutationKey: [\"operations\", \"sign\", username],\n mutationFn: ({\n operation,\n keyOrSeed,\n }: {\n operation: Operation;\n keyOrSeed: string;\n }) => {\n if (!username) {\n throw new Error(\"[Operations][Sign] – cannot sign op with anon user\");\n }\n\n let privateKey: PrivateKey;\n if (keyOrSeed.split(\" \").length === 12) {\n privateKey = PrivateKey.fromLogin(username, keyOrSeed, \"active\");\n } else if (isWif(keyOrSeed)) {\n privateKey = PrivateKey.fromString(keyOrSeed);\n } else {\n privateKey = PrivateKey.from(keyOrSeed);\n }\n\n return broadcastOperations(\n [operation],\n privateKey\n );\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport function useSignOperationByKeychain(\n username: string | undefined,\n auth?: AuthContextV2,\n keyType: \"owner\" | \"active\" | \"posting\" | \"memo\" = \"active\"\n) {\n return useMutation({\n mutationKey: [\"operations\", \"sign-keychain\", username],\n mutationFn: ({ operation }: { operation: Operation }) => {\n if (!username) {\n throw new Error(\n \"[SDK][Keychain] – cannot sign operation with anon user\"\n );\n }\n if (!auth?.adapter?.broadcastWithKeychain) {\n throw new Error(\"[SDK][Keychain] – missing keychain broadcaster\");\n }\n\n return auth.adapter.broadcastWithKeychain(username, [operation], keyType);\n },\n });\n}\n","import type { Operation } from \"../../../hive-tx\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function useSignOperationByHivesigner(callbackUri = \"/\") {\n return useMutation({\n mutationKey: [\"operations\", \"sign-hivesigner\", callbackUri],\n mutationFn: async ({ operation }: { operation: Operation }) => {\n return hs.sendOperation(operation, { callback: callbackUri }, () => {});\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getChainPropertiesQueryOptions() {\n return queryOptions({\n queryKey: [\"operations\", \"chain-properties\"],\n queryFn: async () => {\n return await callRPC(\"condenser_api.get_chain_properties\", []);\n },\n });\n}\n","import { Fragment } from \"../types\";\n\n/**\n * Build the cache entry for an edited fragment.\n *\n * The `/private-api/fragments-update` endpoint returns only a minimal\n * acknowledgement, not the full fragment. Writing that response straight into\n * the query cache blanked out the edited snippet (the reported bug), so the\n * updated record is built from the values the user actually submitted, merged\n * over whatever fields the response does carry, on top of the existing cached\n * fragment (preserving id/created).\n */\nexport function applyFragmentUpdate(\n existing: Fragment,\n response: Partial | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...existing,\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n };\n}\n\n/**\n * Build the cache entry for a newly added fragment. Reaffirms the submitted\n * title/body over the server acknowledgement so a fresh snippet never renders\n * blank if the response omits them, while keeping any server-provided\n * id/timestamps.\n */\nexport function buildAddedFragment(\n response: Fragment | null | undefined,\n vars: { title: string; body: string }\n): Fragment {\n return {\n ...(response ?? {}),\n title: vars.title,\n body: vars.body\n } as Fragment;\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { buildAddedFragment } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useAddFragment(username: string, code: string | undefined) {\n return useMutation({\n mutationKey: [\"posts\", \"add-fragment\", username],\n mutationFn: async ({ title, body }: { title: string; body: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-add\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and insert a bogus fragment into the cache. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to add fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // Reaffirm the submitted title/body over the server acknowledgement so a\n // freshly added snippet never renders blank if the response omits them,\n // while keeping any server-provided id/timestamps.\n const newFragment = buildAddedFragment(response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [newFragment, ...(data ?? [])]\n );\n\n // Update infinite query cache - add new fragment to first page\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page, index) =>\n index === 0\n ? { ...page, data: [newFragment, ...page.data] }\n : page\n ),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { applyFragmentUpdate } from \"../utils/fragment-cache-helpers\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useEditFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"edit-fragment\", username],\n mutationFn: async ({\n fragmentId,\n title,\n body\n }: {\n fragmentId: string;\n title: string;\n body: string;\n }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/fragments-update\",\n {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n title,\n body,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n // Raw fetch resolves on 4xx/5xx, so a JSON error response would otherwise run\n // onSuccess and overwrite the cached fragment with bogus data. Throw instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to update fragment: ${response.status}`);\n }\n return response.json() as Promise;\n },\n onSuccess(response, variables) {\n const queryClient = getQueryClient();\n\n // The /fragments-update endpoint returns a minimal acknowledgement, not the\n // full fragment, so writing the raw response into the cache blanked out the\n // edited snippet. Rebuild the fragment from the submitted values instead.\n const applyUpdate = (fragment: Fragment): Fragment =>\n applyFragmentUpdate(fragment, response, variables);\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) =>\n data?.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ) ?? []\n );\n\n // Update infinite query cache - update fragment in all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.map((fragment) =>\n fragment.id === variables.fragmentId ? applyUpdate(fragment) : fragment\n ),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { Fragment } from \"../types\";\nimport { getFragmentsQueryOptions } from \"../queries\";\nimport { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useRemoveFragment(\n username: string,\n code: string | undefined\n) {\n return useMutation({\n mutationKey: [\"posts\", \"remove-fragment\", username],\n mutationFn: async ({ fragmentId }: { fragmentId: string }) => {\n if (!code) {\n throw new Error(\"[SDK][Posts] Missing access token\");\n }\n const fetchApi = getBoundFetch();\n\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/fragments-delete\", {\n method: \"POST\",\n body: JSON.stringify({\n code,\n id: fragmentId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // getBoundFetch returns the raw fetch, so a 401/403/500 resolves rather than\n // rejects. Without this guard onSuccess would run and strip the fragment from\n // cache on a failed delete (false success). Throw so onError fires instead.\n if (!response.ok) {\n throw new Error(`[SDK][Posts] Failed to delete fragment: ${response.status}`);\n }\n\n return response;\n },\n onSuccess(_data, variables) {\n const queryClient = getQueryClient();\n\n // Update regular query cache\n queryClient.setQueryData(\n getFragmentsQueryOptions(username, code).queryKey,\n (data) => [...(data ?? [])].filter(({ id }) => id !== variables.fragmentId)\n );\n\n // Update infinite query cache - remove fragment from all pages\n queryClient.setQueriesData>>(\n { queryKey: [\"posts\", \"fragments\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((fragment) => fragment.id !== variables.fragmentId),\n })),\n };\n }\n );\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { ApiNotification, ApiNotificationSetting } from \"@/modules/notifications\";\nimport { Draft, DraftMetadata } from \"@/modules/posts/types/draft\";\nimport { Schedule } from \"@/modules/posts/types/schedule\";\nimport { ApiResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n if (!response.ok) {\n let errorData: unknown = undefined;\n try {\n errorData = await response.json();\n } catch {\n errorData = undefined;\n }\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = errorData;\n throw error;\n }\n\n // Handle empty responses gracefully (e.g., 204 No Content or empty body)\n const text = await response.text();\n if (!text || text.trim() === \"\") {\n return \"\" as T;\n }\n\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n // If JSON parsing fails, return empty string as fallback\n console.warn(\"[SDK] Failed to parse JSON response:\", e, \"Response:\", text);\n return \"\" as T;\n }\n}\n\nexport async function signUp(\n username: string,\n email: string,\n referral: string,\n captchaToken?: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/account-create\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, email, referral, captcha_token: captchaToken }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function subscribeEmail(\n email: string\n): Promise>> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/subscribe\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ email }),\n });\n\n const data = await parseJsonResponse>(response);\n return { status: response.status, data };\n}\n\nexport async function usrActivity(\n code: string | undefined,\n ty: number,\n bl: string | number = \"\",\n tx: string | number = \"\"\n): Promise {\n const params: {\n code: string | undefined;\n ty: number;\n bl?: string | number;\n tx?: string | number;\n } = { code, ty };\n\n if (bl) {\n params.bl = bl;\n }\n if (tx) {\n params.tx = tx;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/usr-activity\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(params),\n });\n\n await parseJsonResponse(response);\n}\n\nexport async function getNotifications(\n code: string | undefined,\n filter: string | null,\n since: string | null = null,\n user: string | null = null\n): Promise {\n const data: { code: string | undefined; filter?: string; since?: string; user?: string } = {\n code,\n };\n\n if (filter) {\n data.filter = filter;\n }\n\n if (since) {\n data.since = since;\n }\n\n if (user) {\n data.user = user;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function saveNotificationSetting(\n code: string | undefined,\n username: string,\n system: string,\n allows_notify: number,\n notify_types: number[],\n token: string\n): Promise {\n const data = {\n code,\n username,\n token,\n system,\n allows_notify,\n notify_types,\n };\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/register-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getNotificationSetting(\n code: string | undefined,\n username: string,\n token: string\n): Promise {\n const data = { code, username, token };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/detail-device\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function markNotifications(\n code: string | undefined,\n id?: string\n): Promise> {\n const data: { code: string | undefined; id?: string } = {\n code,\n };\n if (id) {\n data.id = id;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/notifications/mark\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addImage(code: string | undefined, url: string): Promise> {\n const data = { code, url };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\n// Upload always targets the canonical Ecency image server, even when\n// the user has changed their viewing proxy (e.g. images.hive.blog).\n// i.ecency.com is the same imagehoster endpoint as images.ecency.com\n// (identical backend / token validation); it is the canonical host\n// because some ISPs SNI-filter the images.ecency.com hostname.\nconst UPLOAD_HOST = \"https://i.ecency.com\";\n\nexport async function uploadImage(\n file: File,\n token: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${UPLOAD_HOST}/hs/${token}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\n/**\n * Upload image using posting key signature (/:username/:signature path).\n * Works with any compatible image server (images.ecency.com, images.hive.blog).\n * The signature is sha256(\"ImageSigningChallenge\" + fileData) signed with the posting key.\n */\nexport async function uploadImageWithSignature(\n file: File,\n username: string,\n signature: string,\n signal?: AbortSignal\n): Promise<{ url: string }> {\n const fetchApi = getBoundFetch();\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetchApi(`${CONFIG.imageHost}/${username}/${signature}`, {\n method: \"POST\",\n body: formData,\n signal,\n });\n\n return parseJsonResponse<{ url: string }>(response);\n}\n\nexport async function deleteImage(\n code: string | undefined,\n imageId: string\n): Promise> {\n const data = { code, id: imageId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/images-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addDraft(\n code: string | undefined,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function updateDraft(\n code: string | undefined,\n draftId: string,\n title: string,\n body: string,\n tags: string,\n meta: DraftMetadata\n): Promise<{ drafts: Draft[] }> {\n const data = { code, id: draftId, title, body, tags, meta };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-update\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ drafts: Draft[] }>(response);\n}\n\nexport async function deleteDraft(\n code: string | undefined,\n draftId: string\n): Promise> {\n const data = { code, id: draftId };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/drafts-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function addSchedule(\n code: string | undefined,\n permlink: string,\n title: string,\n body: string,\n meta: Record,\n options: Record | null,\n schedule: string,\n reblog: boolean\n): Promise> {\n const data: Record = {\n code,\n permlink,\n title,\n body,\n meta,\n schedule,\n reblog,\n };\n\n if (options) {\n data.options = options;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-add\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function deleteSchedule(\n code: string | undefined,\n id: string\n): Promise> {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-delete\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse>(response);\n}\n\nexport async function moveSchedule(code: string | undefined, id: string): Promise {\n const data = { code, id };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/schedules-move\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse(response);\n}\n\nexport async function getPromotedPost(\n code: string | undefined,\n author: string,\n permlink: string\n): Promise<{ author: string; permlink: string } | \"\"> {\n const data = { code, author, permlink };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/promoted-post\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n });\n\n return parseJsonResponse<{ author: string; permlink: string } | \"\">(response);\n}\n\nexport async function onboardEmail(\n username: string,\n email: string,\n friend: string\n): Promise> {\n const dataBody = {\n username,\n email,\n friend,\n };\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/account-create-friend\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(dataBody),\n }\n );\n\n return parseJsonResponse>(response);\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useAddDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"add\", username],\n mutationFn: async ({\n title,\n body,\n tags,\n meta,\n }: {\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addDraft\");\n }\n return addDraft(code, title, body, tags, meta);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full drafts list from the response (API returns complete list)\n if (data?.drafts) {\n qc.setQueryData(QueryKeys.posts.drafts(username), data.drafts);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n }\n // Also invalidate the infinite query so the drafts list refetches\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { updateDraft } from \"@/modules/private-api/requests\";\nimport { DraftMetadata } from \"../types\";\n\nexport function useUpdateDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"update\", username],\n mutationFn: async ({\n draftId,\n title,\n body,\n tags,\n meta,\n }: {\n draftId: string;\n title: string;\n body: string;\n tags: string;\n meta: DraftMetadata;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for updateDraft\");\n }\n return updateDraft(code, draftId, title, body, tags, meta);\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError,\n });\n}\n","import { InfiniteData, useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteDraft } from \"@/modules/private-api/requests\";\nimport type { Draft } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\nexport function useDeleteDraft(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"drafts\", \"delete\", username],\n mutationFn: async ({ draftId }: { draftId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteDraft\");\n }\n return deleteDraft(code, draftId);\n },\n onMutate: async ({ draftId }) => {\n if (!username) {\n return;\n }\n\n const qc = getQueryClient();\n const listKey = QueryKeys.posts.drafts(username);\n const infinitePrefix = QueryKeys.posts.draftsInfinite(username);\n\n await Promise.all([\n qc.cancelQueries({ queryKey: listKey }),\n qc.cancelQueries({ queryKey: infinitePrefix }),\n ]);\n\n const previousList = qc.getQueryData(listKey);\n if (previousList) {\n qc.setQueryData(\n listKey,\n previousList.filter((d) => d._id !== draftId)\n );\n }\n\n const infiniteQueries = qc.getQueriesData>>({\n queryKey: infinitePrefix,\n });\n const previousInfinite = new Map(infiniteQueries);\n for (const [key, data] of infiniteQueries) {\n if (data) {\n qc.setQueryData(key, {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((d) => d._id !== draftId),\n })),\n });\n }\n }\n\n return { previousList, previousInfinite };\n },\n onSuccess: () => {\n onSuccess?.();\n const qc = getQueryClient();\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n qc.invalidateQueries({ queryKey: QueryKeys.posts.draftsInfinite(username) });\n },\n onError: (err, _variables, context) => {\n const qc = getQueryClient();\n if (context?.previousList) {\n qc.setQueryData(QueryKeys.posts.drafts(username), context.previousList);\n }\n if (context?.previousInfinite) {\n for (const [key, data] of context.previousInfinite) {\n qc.setQueryData(key, data);\n }\n }\n onError?.(err);\n },\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addSchedule } from \"@/modules/private-api/requests\";\n\nexport function useAddSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"add\", username],\n mutationFn: async ({\n permlink,\n title,\n body,\n meta,\n options,\n schedule,\n reblog,\n }: {\n permlink: string;\n title: string;\n body: string;\n meta: Record;\n options: Record | null;\n schedule: string;\n reblog: boolean;\n }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for addSchedule\");\n }\n return addSchedule(code, permlink, title, body, meta, options, schedule, reblog);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.schedules(username),\n });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { deleteSchedule } from \"@/modules/private-api/requests\";\n\nexport function useDeleteSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"delete\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteSchedule\");\n }\n return deleteSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { moveSchedule } from \"@/modules/private-api/requests\";\n\nexport function useMoveSchedule(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"schedules\", \"move\", username],\n mutationFn: async ({ id }: { id: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for moveSchedule\");\n }\n return moveSchedule(code, id);\n },\n onSuccess: (data) => {\n onSuccess?.();\n const qc = getQueryClient();\n // Set the full schedules list from the response (API returns complete list)\n if (data) {\n qc.setQueryData(QueryKeys.posts.schedules(username), data);\n } else {\n qc.invalidateQueries({ queryKey: QueryKeys.posts.schedules(username) });\n }\n // Also invalidate drafts since moving a schedule creates a draft\n qc.invalidateQueries({ queryKey: QueryKeys.posts.drafts(username) });\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { addImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to add an image URL to the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful addition\n * @param onError - Optional callback on error\n *\n * @example\n * const addImageMutation = useAddImage(username, code);\n * addImageMutation.mutate({ url: 'https://...' });\n */\nexport function useAddImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"add\", username],\n mutationFn: async ({ url, code: nextCode }: { url: string; code?: string }) => {\n const effectiveCode = nextCode ?? code;\n\n if (!username || !effectiveCode) {\n throw new Error(\"[SDK][Posts] – missing auth for addImage\");\n }\n return addImage(effectiveCode, url);\n },\n onSuccess: () => {\n onSuccess?.();\n getQueryClient().invalidateQueries({\n queryKey: QueryKeys.posts.images(username),\n });\n },\n onError,\n });\n}\n","import { useMutation, type InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport { deleteImage } from \"@/modules/private-api/requests\";\nimport type { UserImage } from \"../types\";\nimport type { WrappedResponse } from \"@/modules/core/types\";\n\n/**\n * Hook to delete an image from the user's Ecency gallery\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful deletion\n * @param onError - Optional callback on error\n *\n * @example\n * const deleteImageMutation = useDeleteImage(username, code);\n * deleteImageMutation.mutate({ imageId: '123' });\n */\nexport function useDeleteImage(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: () => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"delete\", username],\n mutationFn: async ({ imageId }: { imageId: string }) => {\n if (!username || !code) {\n throw new Error(\"[SDK][Posts] – missing auth for deleteImage\");\n }\n return deleteImage(code, imageId);\n },\n onSuccess: (_data, variables) => {\n onSuccess?.();\n const qc = getQueryClient();\n const { imageId } = variables;\n\n // Optimistic removal from regular cache\n qc.setQueryData(\n [\"posts\", \"images\", username],\n (prev) => prev?.filter((img) => img._id !== imageId)\n );\n\n // Optimistic removal from infinite cache pages\n qc.setQueriesData>>(\n { queryKey: [\"posts\", \"images\", \"infinite\", username] },\n (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n data: page.data.filter((img) => img._id !== imageId),\n })),\n };\n }\n );\n },\n onError,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { uploadImage } from \"@/modules/private-api/requests\";\n\n/**\n * Hook to upload an image file to Ecency image hosting\n *\n * @param onSuccess - Optional callback on successful upload, receives { url: string }\n * @param onError - Optional callback on error\n *\n * Note: This hook uploads to Ecency's image server and requires a signature token.\n * The token should be generated using the user's posting key signature.\n *\n * @example\n * const uploadMutation = useUploadImage(\n * (data) => console.log('Uploaded:', data.url)\n * );\n * uploadMutation.mutate({ file, token });\n */\nexport function useUploadImage(\n onSuccess?: (data: { url: string }) => void,\n onError?: (e: Error) => void\n) {\n return useMutation({\n mutationKey: [\"posts\", \"images\", \"upload\"],\n mutationFn: async ({\n file,\n token,\n signal,\n }: {\n file: File;\n token: string;\n signal?: AbortSignal;\n }) => {\n return uploadImage(file, token, signal);\n },\n onSuccess,\n onError,\n });\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry, EntryVote } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nfunction makeEntryPath(author: string, permlink: string) {\n return `/@${author}/${permlink}`;\n}\n\nfunction getEntryFromCache(\n author: string,\n permlink: string,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n return queryClient.getQueryData(\n QueryKeys.posts.entry(makeEntryPath(author, permlink))\n );\n}\n\nfunction setEntryInCache(entry: Entry, qc?: QueryClient) {\n const queryClient = qc ?? getQueryClient();\n queryClient.setQueryData(\n QueryKeys.posts.entry(makeEntryPath(entry.author, entry.permlink)),\n entry\n );\n}\n\nfunction mutateEntry(\n author: string,\n permlink: string,\n updater: (entry: Entry) => Entry,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = makeEntryPath(author, permlink);\n const existing = queryClient.getQueryData(QueryKeys.posts.entry(path));\n if (!existing) return undefined;\n\n const updated = updater(existing);\n queryClient.setQueryData(QueryKeys.posts.entry(path), updated);\n return existing;\n}\n\n/**\n * SDK-level entry cache utilities. These operate on SDK cache keys\n * ([\"posts\", \"entry\", \"/@author/permlink\"]).\n *\n * Web layer can bridge these to its own QueryIdentifiers.ENTRY keys\n * during the migration period.\n */\nexport namespace EntriesCacheManagement {\n export function updateVotes(\n author: string,\n permlink: string,\n votes: EntryVote[],\n payout: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n active_votes: votes,\n stats: {\n ...(entry.stats || {\n gray: false,\n hide: false,\n flag_weight: 0,\n total_votes: 0,\n }),\n total_votes: votes.length,\n flag_weight: entry.stats?.flag_weight || 0,\n },\n total_votes: votes.length,\n payout,\n pending_payout_value: String(payout),\n }),\n qc\n );\n }\n\n export function updateReblogsCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n reblogs: count,\n }),\n qc\n );\n }\n\n export function updateRepliesCount(\n author: string,\n permlink: string,\n count: number,\n qc?: QueryClient\n ) {\n mutateEntry(\n author,\n permlink,\n (entry) => ({\n ...entry,\n children: count,\n }),\n qc\n );\n }\n\n export function addReply(\n reply: Entry,\n parentAuthor: string,\n parentPermlink: string,\n qc?: QueryClient\n ) {\n mutateEntry(\n parentAuthor,\n parentPermlink,\n (entry) => ({\n ...entry,\n children: entry.children + 1,\n replies: [reply, ...entry.replies],\n }),\n qc\n );\n }\n\n export function updateEntries(entries: Entry[], qc?: QueryClient) {\n entries.forEach((entry) => setEntryInCache(entry, qc));\n }\n\n export function invalidateEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ) {\n const queryClient = qc ?? getQueryClient();\n queryClient.invalidateQueries({\n queryKey: QueryKeys.posts.entry(makeEntryPath(author, permlink)),\n });\n }\n\n export function getEntry(\n author: string,\n permlink: string,\n qc?: QueryClient\n ): Entry | undefined {\n return getEntryFromCache(author, permlink, qc);\n }\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Whether the cached active_votes list already reflects the broadcast vote:\n * the voter is present for a vote (weight !== 0) or absent for an unvote\n * (weight === 0). Used to avoid stacking the SDK's post-broadcast optimistic\n * update on top of a platform-level optimistic update applied at press time.\n */\nexport function isVoteAlreadyReflected(\n activeVotes: Array<{ voter: string }>,\n voter: string | undefined,\n weight: number\n): boolean {\n const hasVoterRecord = activeVotes.some((v) => v.voter === voter);\n return weight !== 0 ? hasVoterRecord : !hasVoterRecord;\n}\n\n/**\n * Payload for voting on a post or comment.\n */\nexport interface VotePayload {\n /** Author of the post/comment to vote on */\n author: string;\n /** Permlink of the post/comment to vote on */\n permlink: string;\n /** Vote weight (-10000 to 10000, where 10000 = 100% upvote, -10000 = 100% downvote) */\n weight: number;\n /** Optional estimated payout change for optimistic UI */\n estimated?: number;\n}\n\n/**\n * Post-broadcast optimistic cache update for a vote: replaces the voter's\n * active_votes record and bumps the payout by `estimated`. Skipped when the\n * cached entry already reflects this vote (voter present for a vote, absent\n * for an unvote): platforms with their own at-press optimistic layer (e.g.\n * the mobile app) have applied it by the time the broadcast resolves, and\n * stacking a second update here double-counts the payout and clobbers the\n * platform's richer vote record until the deferred invalidation.\n */\nexport function applyVoteCacheUpdate(\n username: string | undefined,\n variables: VotePayload,\n qc?: QueryClient\n): void {\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink, qc);\n if (\n !entry?.active_votes ||\n isVoteAlreadyReflected(entry.active_votes, username, variables.weight)\n ) {\n return;\n }\n const newVotes = [\n ...entry.active_votes.filter((v) => v.voter !== username),\n ...(variables.weight !== 0 ? [{ rshares: variables.weight, voter: username! }] : [])\n ];\n const newPayout = entry.payout + (variables.estimated ?? 0);\n EntriesCacheManagement.updateVotes(\n variables.author,\n variables.permlink,\n newVotes,\n newPayout,\n qc\n );\n}\n\n/**\n * React Query mutation hook for voting on posts and comments.\n *\n * This mutation broadcasts a vote operation to the Hive blockchain,\n * supporting upvotes (positive weight) and downvotes (negative weight).\n *\n * @param username - The username of the voter (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 120) if adapter.recordActivity is available\n * - Invalidates post cache to refetch updated vote data\n * - Invalidates voting power cache to show updated VP\n *\n * **Vote Weight:**\n * - 10000 = 100% upvote\n * - 0 = remove vote\n * - -10000 = 100% downvote\n *\n * @example\n * ```typescript\n * const voteMutation = useVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Upvote a post\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 10000\n * });\n *\n * // Remove vote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: 0\n * });\n *\n * // Downvote\n * voteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * weight: -10000\n * });\n * ```\n *\n * @remarks\n * broadcastMode: async — Votes don't require block confirmation.\n * The vote is accepted into the mempool immediately; UI can optimistically update.\n */\nexport function useVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"vote\"],\n username,\n ({ author, permlink, weight }) => [\n buildVoteOp(username!, author, permlink, weight)\n ],\n async (result: any, variables) => {\n // Optimistic vote list + payout update (no-op when the cache already\n // reflects this vote — see applyVoteCacheUpdate).\n applyVoteCacheUpdate(username, variables);\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(120, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n if (auth?.adapter?.invalidateQueries) {\n const doInvalidate = () => {\n auth.adapter!.invalidateQueries!([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.accounts.full(username)\n ]);\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(doInvalidate, 4000);\n } else {\n doInvalidate();\n }\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildReblogOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EntriesCacheManagement } from \"../cache/entries-cache-management\";\n\n/**\n * Payload for reblogging a post.\n */\nexport interface ReblogPayload {\n /** Original post author */\n author: string;\n /** Original post permlink */\n permlink: string;\n /** If true, removes the reblog instead of creating it */\n deleteReblog?: boolean;\n}\n\n/**\n * React Query mutation hook for reblogging posts.\n *\n * This mutation broadcasts a custom_json operation to reblog (or un-reblog)\n * a post to the user's blog feed.\n *\n * @param username - The username performing the reblog (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 130) if adapter.recordActivity is available\n * - Invalidates blog feed cache to show the reblogged post\n * - Invalidates post cache to update reblog status\n *\n * **Reblog vs Delete:**\n * - deleteReblog: false (default) - Creates a reblog\n * - deleteReblog: true - Removes an existing reblog\n *\n * @example\n * ```typescript\n * const reblogMutation = useReblog(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Reblog a post\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post'\n * });\n *\n * // Remove a reblog\n * reblogMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post',\n * deleteReblog: true\n * });\n * ```\n */\nexport function useReblog(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"reblog\"],\n username,\n ({ author, permlink, deleteReblog }) => [\n buildReblogOp(username!, author, permlink, deleteReblog ?? false)\n ],\n async (result: any, variables) => {\n // Optimistic reblog count update\n const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink);\n if (entry) {\n const newCount = Math.max(0, (entry.reblogs ?? 0) + (variables.deleteReblog ? -1 : 1));\n EntriesCacheManagement.updateReblogsCount(variables.author, variables.permlink, newCount);\n }\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(130, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation — deferred for async broadcasts since onSuccess fires\n // at mempool acceptance before block inclusion.\n const invalidate = () => {\n const qc = getQueryClient();\n qc.invalidateQueries({\n queryKey: QueryKeys.posts.accountPostsBlogPrefix(username!),\n });\n if (auth?.adapter?.invalidateQueries) {\n auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n QueryKeys.posts.rebloggedBy(variables.author, variables.permlink),\n ]);\n }\n };\n const mode = broadcastMode ?? 'async';\n if (mode === 'async') {\n setTimeout(invalidate, 4000);\n } else {\n invalidate();\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Beneficiary account and weight.\n */\nexport interface Beneficiary {\n /** Beneficiary account name */\n account: string;\n /** Beneficiary weight (10000 = 100%) */\n weight: number;\n}\n\n/**\n * Payload for creating a comment or post.\n */\nexport interface CommentPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post */\n permlink: string;\n /** Parent author (empty string for top-level posts) */\n parentAuthor: string;\n /** Parent permlink (category/tag for top-level posts) */\n parentPermlink: string;\n /** Title of the post (empty for comments) */\n title: string;\n /** Content body */\n body: string;\n /** JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for creating posts and comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to create a new post or reply on the Hive blockchain.\n *\n * @param username - The username creating the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 100 for posts, 110 for comments) if adapter.recordActivity is available\n * - Invalidates feed caches to show the new content\n * - Invalidates parent post cache if this is a reply\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Post vs Comment:**\n * - Post: parentAuthor = \"\", parentPermlink = category/tag\n * - Comment: parentAuthor = parent author, parentPermlink = parent permlink\n *\n * @example\n * ```typescript\n * const commentMutation = useComment(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a post\n * commentMutation.mutate({\n * author: 'alice',\n * permlink: 'my-awesome-post-20260209',\n * parentAuthor: '',\n * parentPermlink: 'technology',\n * title: 'My Awesome Post',\n * body: 'This is the post content...',\n * jsonMetadata: {\n * tags: ['technology', 'hive'],\n * app: 'ecency/3.0.0'\n * },\n * options: {\n * beneficiaries: [\n * { account: 'ecency', weight: 500 }\n * ]\n * }\n * });\n *\n * // Create a comment\n * commentMutation.mutate({\n * author: 'bob',\n * permlink: 're-alice-my-awesome-post-20260209',\n * parentAuthor: 'alice',\n * parentPermlink: 'my-awesome-post-20260209',\n * title: '',\n * body: 'Great post!',\n * jsonMetadata: { app: 'ecency/3.0.0' }\n * });\n * ```\n */\nexport function useComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"comment\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (result: any, variables) => {\n // Determine if this is a post or comment\n const isPost = !variables.parentAuthor;\n const activityType = isPost ? 100 : 110;\n\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(activityType, txId, result?.block_num).catch(() => {});\n }\n\n // Cache invalidation (always runs regardless of recordActivity outcome)\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (!isPost) {\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { Entry } from \"../types\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * Adds an optimistic entry to all discussions caches for the given root post.\n * Uses predicate matching to find all sort order variants.\n */\nexport function addOptimisticDiscussionEntry(\n entry: Entry,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n queryClient.setQueryData(queryKey, [entry, ...data]);\n }\n }\n}\n\n/**\n * Removes an entry from all discussions caches for the given root post.\n * Returns the previous state for rollback.\n */\nexport function removeOptimisticDiscussionEntry(\n author: string,\n permlink: string,\n rootAuthor: string,\n rootPermlink: string,\n qc?: QueryClient\n): Map {\n const queryClient = qc ?? getQueryClient();\n const snapshots = new Map();\n\n const queries = queryClient.getQueriesData({\n predicate: (query) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === rootAuthor &&\n key[3] === rootPermlink\n );\n },\n });\n\n for (const [queryKey, data] of queries) {\n if (data) {\n snapshots.set(queryKey, data);\n queryClient.setQueryData(\n queryKey,\n data.filter(\n (e) => e.author !== author || e.permlink !== permlink\n )\n );\n }\n }\n\n return snapshots;\n}\n\n/**\n * Restores discussion cache snapshots (for rollback on error).\n */\nexport function restoreDiscussionSnapshots(\n snapshots: Map,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n for (const [queryKey, data] of snapshots) {\n queryClient.setQueryData(queryKey, data);\n }\n}\n\n/**\n * Updates a specific entry in the SDK entry cache.\n * Returns the previous entry for rollback.\n */\nexport function updateEntryInCache(\n author: string,\n permlink: string,\n updates: Partial,\n qc?: QueryClient\n): Entry | undefined {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n const previous = queryClient.getQueryData(QueryKeys.posts.entry(path));\n\n if (previous) {\n queryClient.setQueryData(QueryKeys.posts.entry(path), {\n ...previous,\n ...updates,\n });\n }\n\n return previous;\n}\n\n/**\n * Restores an entry in cache (for rollback on error).\n */\nexport function restoreEntryInCache(\n author: string,\n permlink: string,\n entry: Entry,\n qc?: QueryClient\n) {\n const queryClient = qc ?? getQueryClient();\n const path = `/@${author}/${permlink}`;\n queryClient.setQueryData(QueryKeys.posts.entry(path), entry);\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDeleteCommentOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport {\n removeOptimisticDiscussionEntry,\n restoreDiscussionSnapshots,\n} from \"../cache/discussions-cache-utils\";\nimport type { Entry } from \"../types\";\n\n/**\n * Payload for deleting a comment or post.\n */\nexport interface DeleteCommentPayload {\n /** Author of the comment/post to delete */\n author: string;\n /** Permlink of the comment/post to delete */\n permlink: string;\n /** Optional: Parent author (for cache invalidation of discussions) */\n parentAuthor?: string;\n /** Optional: Parent permlink (for cache invalidation of discussions) */\n parentPermlink?: string;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n}\n\n/**\n * React Query mutation hook for deleting posts and comments.\n *\n * This mutation broadcasts a delete_comment operation to the Hive blockchain.\n * Includes optimistic removal from discussions cache with rollback on error.\n *\n * @param username - The username deleting the comment/post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n */\nexport function useDeleteComment(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"deleteComment\"],\n username,\n ({ author, permlink }) => [\n buildDeleteCommentOp(author, permlink)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username)\n ];\n\n // If this is a reply, invalidate parent post and discussions\n if (variables.parentAuthor && variables.parentPermlink) {\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n }\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n {\n broadcastMode,\n // Optimistic removal: remove from discussions cache before broadcast\n onMutate: async (variables) => {\n const rootAuthor = variables.rootAuthor || variables.parentAuthor;\n const rootPermlink = variables.rootPermlink || variables.parentPermlink;\n\n if (rootAuthor && rootPermlink) {\n const snapshots = removeOptimisticDiscussionEntry(\n variables.author,\n variables.permlink,\n rootAuthor,\n rootPermlink\n );\n return { snapshots };\n }\n return {};\n },\n // Rollback on error: restore discussions cache\n onError: (_error, _variables, context) => {\n const { snapshots } = (context as { snapshots?: Map }) ?? {};\n if (snapshots) {\n restoreDiscussionSnapshots(snapshots);\n }\n },\n }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\n/**\n * Payload for creating a cross-post.\n */\nexport interface CrossPostPayload {\n /** Author of the cross-post (current user) */\n author: string;\n /** Permlink of the cross-post (usually: original-permlink-community-id) */\n permlink: string;\n /** Community ID to cross-post to (used as parent_permlink) */\n parentPermlink: string;\n /** Title of the cross-post (same as original) */\n title: string;\n /** Body of the cross-post (includes reference to original) */\n body: string;\n /** JSON metadata (must include original_author, original_permlink, tags, app) */\n jsonMetadata: Record;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"0.000 HBD\" for declined payout) */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n };\n}\n\n/**\n * React Query mutation hook for creating cross-posts.\n *\n * A cross-post is a special type of post that references an original post\n * and publishes it to a different community.\n *\n * @param username - The username creating the cross-post (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates feed/blog caches to show the new cross-post\n *\n * **Operations:**\n * - Always includes a comment operation (with empty parent_author for top-level post)\n * - Optionally includes comment_options operation for rewards/beneficiaries\n *\n * **Metadata Requirements:**\n * The jsonMetadata must include:\n * - `original_author`: Author of the original post\n * - `original_permlink`: Permlink of the original post\n * - `tags`: Tags for the cross-post (typically [\"cross-post\"])\n * - `app`: Application identifier (e.g., \"ecency/3.0.0-vision\")\n *\n * @example\n * ```typescript\n * const crossPostMutation = useCrossPost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Create a cross-post\n * crossPostMutation.mutate({\n * author: 'alice',\n * permlink: 'great-post-hive-123456',\n * parentPermlink: 'hive-123456', // community ID\n * title: 'Great Post',\n * body: 'This is a cross post of [@bob/great-post](/technology/@bob/great-post) by @alice.

Check this out!',\n * jsonMetadata: {\n * app: 'ecency/3.0.0-vision',\n * tags: ['cross-post'],\n * original_author: 'bob',\n * original_permlink: 'great-post'\n * },\n * options: {\n * maxAcceptedPayout: '0.000 HBD',\n * allowCurationRewards: false\n * }\n * });\n * ```\n */\nexport function useCrossPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"cross-post\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (empty parent_author for top-level post)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n \"\", // empty parent_author for top-level post\n payload.parentPermlink, // community ID\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n } = payload.options;\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n [] // No beneficiaries for cross-posts\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.accounts.full(username),\n // Invalidate target community feed so cross-post appears\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.parentPermlink\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommentOp, buildCommentOptionsOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\nimport type { Beneficiary } from \"./use-comment\";\n\n/**\n * Payload for updating a reply/comment.\n */\nexport interface UpdateReplyPayload {\n /** Author of the comment/post */\n author: string;\n /** Permlink of the comment/post being updated */\n permlink: string;\n /** Parent author */\n parentAuthor: string;\n /** Parent permlink */\n parentPermlink: string;\n /** Title (empty for comments) */\n title: string;\n /** Updated content body */\n body: string;\n /** Updated JSON metadata object */\n jsonMetadata: Record;\n /** Optional: Root post author (for nested replies, used for discussions cache invalidation) */\n rootAuthor?: string;\n /** Optional: Root post permlink (for nested replies, used for discussions cache invalidation) */\n rootPermlink?: string;\n /** Optional: Comment options (beneficiaries, rewards) */\n options?: {\n /** Maximum accepted payout (e.g., \"1000000.000 HBD\") */\n maxAcceptedPayout?: string;\n /** Percent of payout in HBD (10000 = 100%) */\n percentHbd?: number;\n /** Allow votes on this content */\n allowVotes?: boolean;\n /** Allow curation rewards */\n allowCurationRewards?: boolean;\n /** Beneficiaries array */\n beneficiaries?: Beneficiary[];\n };\n}\n\n/**\n * React Query mutation hook for updating existing replies/comments.\n *\n * This mutation broadcasts a comment operation (and optionally comment_options)\n * to update an existing reply/comment on the Hive blockchain.\n *\n * @param username - The username updating the comment (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates parent post cache to reflect the updated comment\n * - Invalidates discussions cache (all sort orders)\n * - Invalidates RC cache (RC decreases after updating)\n *\n * **Operations:**\n * - Always includes a comment operation\n * - Optionally includes comment_options operation for beneficiaries/rewards\n *\n * **Important:**\n * - Updates use the same comment operation as creating new comments\n * - The blockchain identifies this as an update based on matching author/permlink\n * - Only the author can update their own content\n * - Content can only be updated before payout (within 7 days)\n *\n * @example\n * ```typescript\n * const updateReplyMutation = useUpdateReply(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update a reply\n * updateReplyMutation.mutate({\n * author: 'alice',\n * permlink: 're-bob-my-post-20260209',\n * parentAuthor: 'bob',\n * parentPermlink: 'my-post-20260209',\n * title: '',\n * body: 'Updated comment content!',\n * jsonMetadata: {\n * tags: ['comment'],\n * app: 'ecency/3.0.0-vision'\n * },\n * rootAuthor: 'bob',\n * rootPermlink: 'my-post-20260209'\n * });\n * ```\n */\nexport function useUpdateReply(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"posts\", \"update-reply\"],\n username,\n (payload) => {\n const operations: Operation[] = [];\n\n // Main comment operation (same operation for create and update)\n operations.push(\n buildCommentOp(\n payload.author,\n payload.permlink,\n payload.parentAuthor,\n payload.parentPermlink,\n payload.title,\n payload.body,\n payload.jsonMetadata\n )\n );\n\n // Optional comment options operation\n if (payload.options) {\n const {\n maxAcceptedPayout = \"1000000.000 HBD\",\n percentHbd = 10000,\n allowVotes = true,\n allowCurationRewards = true,\n beneficiaries = []\n } = payload.options;\n\n const extensions: any[] = [];\n\n // Add beneficiaries extension if provided\n if (beneficiaries.length > 0) {\n // Sort beneficiaries alphabetically by account name (required by blockchain)\n const sortedBeneficiaries = [...beneficiaries].sort((a, b) =>\n a.account.localeCompare(b.account)\n );\n\n extensions.push([\n 0,\n {\n beneficiaries: sortedBeneficiaries.map(b => ({\n account: b.account,\n weight: b.weight\n }))\n }\n ]);\n }\n\n operations.push(\n buildCommentOptionsOp(\n payload.author,\n payload.permlink,\n maxAcceptedPayout,\n percentHbd,\n allowVotes,\n allowCurationRewards,\n extensions\n )\n );\n }\n\n return operations;\n },\n async (_result: any, variables) => {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = _result?.id ?? _result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(110, txId, _result?.block_num).catch((error) => {\n console.debug(\"[SDK][Posts][useUpdateReply] recordActivity failed\", {\n activityType: 110,\n blockNum: _result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n QueryKeys.resourceCredits.account(username!)\n ];\n\n // Invalidate parent entry\n queriesToInvalidate.push(\n QueryKeys.posts.entry(`/@${variables.parentAuthor}/${variables.parentPermlink}`)\n );\n\n // Invalidate discussions (matches all sort orders)\n // Use partial key to match all sort order variants\n // For nested replies, use rootAuthor/rootPermlink to match the root post's discussions\n // Fall back to parentAuthor/parentPermlink for direct replies to posts\n const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;\n const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;\n\n queriesToInvalidate.push({\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"discussions\" &&\n key[2] === discussionsAuthor &&\n key[3] === discussionsPermlink\n );\n }\n });\n\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPromoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for promoting a post using Ecency Points.\n */\nexport interface PromotePayload {\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Promotion duration in days */\n duration: number;\n}\n\n/**\n * React Query mutation hook for promoting posts.\n *\n * This mutation broadcasts a custom_json operation to promote a post\n * using Ecency Points. The post will appear in promoted feeds for the\n * specified duration.\n *\n * @param username - The username promoting the post (required for broadcast, deducts points from this user)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates promoted posts cache to show newly promoted content\n * - Invalidates user points balance\n * - Invalidates post cache to update promotion status\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_promote\"\n * - JSON: {\"user\": \"username\", \"author\": \"postauthor\", \"permlink\": \"postpermlink\", \"duration\": 7}\n * - Authority: Active key (required for point spending)\n *\n * **Cost:**\n * - Costs Ecency Points based on duration\n * - User must have sufficient points balance\n *\n * @example\n * ```typescript\n * const promoteMutation = usePromote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Promote a post for 7 days\n * promoteMutation.mutate({\n * author: 'alice',\n * permlink: 'my-great-post',\n * duration: 7\n * });\n * ```\n */\nexport function usePromote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"ecency\", \"promote\"],\n username,\n ({ author, permlink, duration }) => [\n buildPromoteOp(username!, author, permlink, duration)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate promoted posts feed\n [...QueryKeys.posts._promotedPrefix],\n // Invalidate user points balance\n [...QueryKeys.points._prefix(username!)],\n // Invalidate specific post cache to update promotion status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { Entry } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport type ValidatePostCreatingOptions = {\n delays?: number[];\n};\n\nconst DEFAULT_VALIDATE_POST_DELAYS = [3000, 3000, 3000];\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function getContent(author: string, permlink: string): Promise {\n return callRPC(\"condenser_api.get_content\", [\n author,\n permlink,\n ]) as Promise;\n}\n\nexport async function validatePostCreating(\n author: string,\n permlink: string,\n attempts = 0,\n options?: ValidatePostCreatingOptions\n) {\n const delays = options?.delays ?? DEFAULT_VALIDATE_POST_DELAYS;\n\n let response: Entry | undefined;\n try {\n response = await getContent(author, permlink);\n } catch (e) {\n response = undefined;\n }\n\n if (response || attempts >= delays.length) {\n return;\n }\n\n const waitMs = delays[attempts];\n if (waitMs > 0) {\n await delay(waitMs);\n }\n\n return validatePostCreating(author, permlink, attempts + 1, options);\n}\n","export * from \"./use-record-activity\";\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\n\ntype ActivityType =\n // Editor related\n | \"post-created\"\n | \"post-updated\"\n | \"post-scheduled\"\n | \"draft-created\"\n | \"video-published\"\n\n // Legacy editor related\n | \"legacy-post-created\"\n | \"legacy-post-updated\"\n | \"legacy-post-scheduled\"\n | \"legacy-draft-created\"\n | \"legacy-video-published\"\n\n // Perks related\n | \"perks-points-by-qr\"\n | \"perks-account-boost\"\n | \"perks-promote\"\n | \"perks-boost-plus\"\n | \"points-claimed\"\n | \"spin-rolled\"\n\n // Signup related\n | \"signed-up-with-wallets\"\n | \"signed-up-with-email\";\n\nexport interface RecordActivityOptions {\n url?: string;\n domain?: string;\n}\n\n/**\n * Get current location info safely (works in browser and Node.js)\n * Returns empty strings in non-browser environments\n */\nfunction getLocationInfo(): { url: string; domain: string } {\n if (typeof window !== \"undefined\" && window.location) {\n return {\n url: window.location.href,\n domain: window.location.host,\n };\n }\n return { url: \"\", domain: \"\" };\n}\n\nexport function useRecordActivity(\n username: string | undefined,\n activityType: ActivityType,\n options?: RecordActivityOptions\n) {\n return useMutation({\n mutationKey: [\"analytics\", activityType],\n mutationFn: async () => {\n if (!activityType) {\n throw new Error(\"[SDK][Analytics] – no activity type provided\");\n }\n const fetchApi = getBoundFetch();\n\n // Use provided values or auto-detect from browser environment\n // Falls back to empty strings in non-browser environments (Node.js, React Native, etc.)\n const locationInfo = getLocationInfo();\n const url = options?.url ?? locationInfo.url;\n const domain = options?.domain ?? locationInfo.domain;\n\n try {\n await fetchApi(CONFIG.plausibleHost + \"/api/event\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n name: activityType,\n url,\n domain,\n props: {\n username,\n },\n }),\n });\n } catch {\n // Analytics is fire-and-forget - network failures, ad blockers,\n // and CORS issues should not bubble up as user-facing errors\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { LeaderBoardDuration, LeaderBoardItem } from \"../types\";\n\nexport function getDiscoverLeaderboardQueryOptions(duration: LeaderBoardDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-leaderboard\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/leaderboard/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch leaderboard: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { CurationDuration, CurationItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getDiscoverCurationQueryOptions(duration: CurationDuration) {\n return queryOptions({\n queryKey: [\"analytics\", \"discover-curation\", duration],\n queryFn: async ({ signal }) => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/curation/${duration}`,\n { signal }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch curation data: ${response.status}`);\n }\n\n const data = (await response.json()) as CurationItem[];\n\n // Fetch account data for efficiency calculation\n const accounts = data.map((item) => item.account);\n const accountsResponse = await callRPC(\"condenser_api.get_accounts\", [accounts]);\n\n // Calculate efficiency for each curator\n for (let index = 0; index < accountsResponse.length; index++) {\n const element = accountsResponse[index];\n const curator = data[index];\n\n // Convert Asset to string if needed\n const vestingShares = typeof element.vesting_shares === 'string'\n ? element.vesting_shares\n : element.vesting_shares.toString();\n const receivedVestingShares = typeof element.received_vesting_shares === 'string'\n ? element.received_vesting_shares\n : element.received_vesting_shares.toString();\n const delegatedVestingShares = typeof element.delegated_vesting_shares === 'string'\n ? element.delegated_vesting_shares\n : element.delegated_vesting_shares.toString();\n const vestingWithdrawRate = typeof element.vesting_withdraw_rate === 'string'\n ? element.vesting_withdraw_rate\n : element.vesting_withdraw_rate.toString();\n\n const effectiveVest: number =\n parseFloat(vestingShares) +\n parseFloat(receivedVestingShares) -\n parseFloat(delegatedVestingShares) -\n parseFloat(vestingWithdrawRate);\n // `hp` is the reward in Hive Power; the denominator stays in VESTS, which\n // is what the ranking has always compared. Every curator is scaled the\n // same way, so the ordering is unaffected by the unit mismatch.\n curator.efficiency = curator.hp / effectiveVest;\n }\n\n // Sort by efficiency descending\n data.sort((a: CurationItem, b: CurationItem) => b.efficiency - a.efficiency);\n\n return data;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PageStatsResponse } from \"../types\";\n\n/**\n * Get page statistics from the private analytics API\n *\n * @param url - URL to get stats for\n * @param dimensions - Dimensions to query (default: [])\n * @param metrics - Metrics to query (default: [\"visitors\", \"pageviews\", \"visit_duration\"])\n * @param dateRange - Date range for the query (e.g. \"day\", \"7d\", \"30d\", \"all\")\n */\nexport function getPageStatsQueryOptions(\n url: string,\n dimensions: string[] = [],\n metrics: string[] = [\"visitors\", \"pageviews\", \"visit_duration\"],\n dateRange?: string\n) {\n // Sort arrays to ensure stable query keys regardless of input order\n const sortedDimensions = [...dimensions].sort();\n const sortedMetrics = [...metrics].sort();\n\n return queryOptions({\n queryKey: [\"analytics\", \"page-stats\", url, sortedDimensions, sortedMetrics, dateRange],\n queryFn: async ({ signal }) => {\n const response = await fetch(CONFIG.privateApiHost + \"/api/stats\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n date_range: dateRange,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch page stats: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n enabled: !!url,\n // Analytics data should always be fresh - users expect current stats when changing range\n staleTime: 0,\n });\n}\n","/**\n * 3Speak takes an 11% beneficiary share on posts that embed one of its videos.\n *\n * This lives in the SDK because the rule is a payout contract that both the web app and the\n * mobile app have to apply identically. It was previously duplicated in each, which meant a\n * change to the weight, or to what counts as an embed, could land on one platform and not the\n * other and silently misroute revenue.\n */\n\n/** A beneficiary route as it appears in `comment_options`. */\nexport interface ThreeSpeakBeneficiaryRoute {\n account: string;\n weight: number;\n src?: string;\n}\n\nexport const THREESPEAK_BENEFICIARY_ACCOUNT = \"threespeakfund\";\n\n/** Beneficiary weight in basis points: 1100 = 11%. */\nexport const THREESPEAK_BENEFICIARY_WEIGHT = 1100;\n\n/**\n * Whether the body embeds a 3Speak video.\n *\n * Matches an actual embed url (e.g. `https://play.3speak.tv/embed?v=user/id`), not a plain\n * text mention of \"3speak.tv/embed\", which would otherwise attach an 11% route to a post that\n * merely talks about 3Speak.\n *\n * `3speak.tv` must be the host, either bare or under dot-delimited subdomains. The previous\n * `[a-z.]*` prefix also matched a lookalike domain such as `fake3speak.tv`, which would have\n * routed 11% of a user's rewards to threespeakfund for a video 3Speak never hosted. Matching\n * is case-insensitive because hostnames are, and a missed match means the route is silently\n * not attached rather than anything failing loudly.\n *\n * Note this requires an `/embed` path segment. The embed url is not built locally, it comes\n * back from 3Speak on upload, so if that shape ever changes this predicate stops recognising\n * it and the route is silently not attached.\n */\nexport function hasThreeSpeakEmbed(body: string): boolean {\n return /https?:\\/\\/([a-z0-9-]+\\.)*3speak\\.tv\\/embed[?/]/i.test(body);\n}\n\n/**\n * Ensures the 3Speak beneficiary is present, at the correct weight, when the body embeds a\n * 3Speak video. Other beneficiaries are preserved and the input is never mutated. Returns the\n * original array reference untouched when there is nothing to change, so callers can use it as\n * a cheap equality check.\n */\nexport function enforceThreeSpeakBeneficiary(\n beneficiaries: T[],\n body: string\n): (T | ThreeSpeakBeneficiaryRoute)[] {\n if (!hasThreeSpeakEmbed(body)) {\n return beneficiaries;\n }\n\n const existing = beneficiaries.find((b) => b.account === THREESPEAK_BENEFICIARY_ACCOUNT);\n\n if (existing && existing.weight === THREESPEAK_BENEFICIARY_WEIGHT) {\n return beneficiaries;\n }\n\n if (existing) {\n return beneficiaries.map((b) =>\n b.account === THREESPEAK_BENEFICIARY_ACCOUNT\n ? { ...b, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n : b\n );\n }\n\n return [\n ...beneficiaries,\n { account: THREESPEAK_BENEFICIARY_ACCOUNT, weight: THREESPEAK_BENEFICIARY_WEIGHT }\n ];\n}\n\n/** Whether a beneficiary entry is the 3Speak route, which the UI locks from editing. */\nexport function isThreeSpeakBeneficiary(account: string): boolean {\n return account === THREESPEAK_BENEFICIARY_ACCOUNT;\n}\n","export * from \"./get-account-token-query-options\";\nexport * from \"./get-account-videos-query-options\";\n","export * from \"./get-decode-memo-query-options\";\n","import { queryOptions } from \"@tanstack/react-query\";\nimport hs from \"hivesigner\";\n\nexport function getDecodeMemoQueryOptions(\n username: string,\n memo: string,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"hivesigner\", \"decode-memo\", username],\n queryFn: async () => {\n if (accessToken) {\n const hsClient = new hs.Client({\n accessToken,\n });\n return hsClient.decode(memo);\n }\n },\n });\n}\n","import * as queries from \"./queries\";\n\nconst HiveSignerIntegration = {\n queries,\n};\n\nexport { HiveSignerIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveSignerIntegration } from \"../../hivesigner\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\n\nexport function getAccountTokenQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"authenticate\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/login?username=${username}&hivesigner=true`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n const memoQueryOptions =\n HiveSignerIntegration.queries.getDecodeMemoQueryOptions(\n username,\n (await response.json()).memo,\n accessToken\n );\n await getQueryClient().prefetchQuery(memoQueryOptions);\n const { memoDecoded } = getQueryClient().getQueryData(\n memoQueryOptions.queryKey\n );\n\n return memoDecoded.replace(\"#\", \"\");\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ThreeSpeakVideo } from \"../types\";\nimport { getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { getAccountTokenQueryOptions } from \"./get-account-token-query-options\";\n\nexport function getAccountVideosQueryOptions(\n username: string | undefined,\n accessToken: string | undefined\n) {\n return queryOptions({\n queryKey: [\"integrations\", \"3speak\", \"videos\", username],\n enabled: !!username && !!accessToken,\n queryFn: async () => {\n if (!username || !accessToken) {\n throw new Error(\"[SDK][Integrations][3Speak] – anon user\");\n }\n\n const tokenQueryOptions = getAccountTokenQueryOptions(\n username,\n accessToken\n );\n\n await getQueryClient().prefetchQuery(tokenQueryOptions);\n const token = getQueryClient().getQueryData(tokenQueryOptions.queryKey);\n if (!token) {\n throw new Error(\"[SDK][Integrations][3Speak] – missing account token\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://studio.3speak.tv/mobile/api/my-videos`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n }\n );\n return (await response.json()) as ThreeSpeakVideo[];\n },\n });\n}\n","export * from \"./types\";\nexport * from \"./functions\";\nimport * as queries from \"./queries\";\n\nconst ThreeSpeakIntegration = {\n queries,\n};\n\nexport { ThreeSpeakIntegration };\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getBoundFetch } from \"@/modules/core\";\n\nexport function getHivePoshLinksQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"integrations\", \"hiveposh\", \"links\", username],\n retry: false, // Don't retry on user not found errors\n queryFn: async () => {\n try {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `https://hiveposh.com/api/v0/linked-accounts/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n // Handle 400 error when user is not registered on HivePosh\n if (response.status === 400) {\n const errorData = await response.json().catch(() => ({}));\n // Silently return null for \"User Not Connected\" errors\n if (errorData?.message === \"User Not Connected\") {\n return null;\n }\n }\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n\n return {\n twitter: {\n username: data.twitter_username,\n profile: data.twitter_profile,\n },\n reddit: {\n username: data.reddit_username,\n profile: data.reddit_profile,\n },\n } satisfies Record<\n \"twitter\" | \"reddit\",\n { username: string; profile: string }\n >;\n } catch (err) {\n // Silently handle all HivePosh API errors\n return null;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\n\nexport interface StatsResponse {\n results: [\n {\n metrics: number[];\n dimensions: string[];\n },\n ];\n query: {\n site_id: string;\n metrics: string[];\n date_range: string[];\n filters: string[];\n };\n}\ninterface UseStatsQueryOptions {\n url: string;\n dimensions?: string[];\n metrics?: string[];\n /**\n * Which dimension the `url` is matched against. `event:page` (default) matches\n * any visit that viewed the page; `visit:entry_page` matches only visits that\n * landed on it. The API route validates this against an allow-list.\n */\n filterBy?: \"event:page\" | \"visit:entry_page\";\n /**\n * Plausible `date_range`. Pass a tuple `[from, to]` (ISO `YYYY-MM-DD`) to scope\n * the query — e.g. a post's creation date through today. Scoping is essential:\n * ClickHouse orders events by `(site_id, toDate(timestamp), …)` and partitions\n * by month, so a bounded range prunes to a few granules instead of scanning the\n * whole history. Omitting it falls back to the route default (`\"all\"`), which on\n * a high-traffic site is a multi-second full scan. Plausible also accepts the\n * relative keywords `\"day\"`, `\"7d\"`, `\"30d\"`, `\"all\"`.\n */\n dateRange?: string | [string, string];\n enabled?: boolean;\n}\n\nexport function getStatsQueryOptions({\n url,\n dimensions = [],\n metrics = [\"visitors\", \"pageviews\", \"visit_duration\"],\n filterBy = \"event:page\",\n dateRange,\n enabled = true,\n}: UseStatsQueryOptions) {\n return queryOptions({\n queryKey: [\"integrations\", \"plausible\", url, dimensions, metrics, filterBy, dateRange],\n queryFn: async () => {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(`${CONFIG.privateApiHost}/api/stats`, {\n method: \"POST\",\n body: JSON.stringify({\n metrics,\n url: encodeURIComponent(url),\n dimensions,\n filterBy,\n // Only forward a range when set, so the route keeps owning the default.\n ...(dateRange ? { date_range: dateRange } : {}),\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // The proxy route returns 5xx (504/502) with an empty body on a Plausible\n // timeout/transport error, and Plausible itself can return a 4xx error JSON.\n // Without this guard those parse into an object with no `results`, and the UI\n // silently renders 0 — indistinguishable from a real zero. Throw instead so\n // React Query surfaces the error and retries.\n if (!response.ok) {\n throw new Error(`Failed to fetch Plausible stats: ${response.status}`);\n }\n\n return (await response.json()) as StatsResponse;\n },\n enabled: !!url && enabled,\n // Stats queries are now date-scoped and cheap; a single retry rides out a\n // transient slow scan without re-introducing the all-time pile-up.\n retry: 1,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getRcStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"resource-credits\", \"stats\"],\n queryFn: async () => {\n const response = await callRPC(\"rc_api.get_rc_stats\", {});\n return response.rc_stats;\n },\n });\n}\n","import { callRPC } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getAccountRcQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"resource-credits\", \"account\", username],\n queryFn: async (): Promise => {\n const result = await callRPC(\"rc_api.find_rc_accounts\", {\n accounts: [username],\n });\n return result.rc_accounts;\n },\n enabled: !!username,\n });\n}\n","import { calculateRCMana } from \"@/modules/core/hive-tx\";\nimport type { RCAccount } from \"@/modules/core/hive-tx\";\nimport type { RcStats } from \"../types/stats\";\n\n/**\n * Operations the RC pre-check can estimate. Mirrors the keys exposed by\n * `rc_api.get_rc_stats` (see {@link RcStats}[\"ops\"]).\n */\nexport type RcPrecheckOperation = keyof RcStats[\"ops\"];\n\nexport interface RcPrecheckInput {\n /** From `getAccountRcQueryOptions(username)` -> rcAccounts[0]. */\n rcAccount: RCAccount | null | undefined;\n /** From `getRcStatsQueryOptions()`. */\n rcStats: RcStats | null | undefined;\n /** The operation the user is about to broadcast. */\n operation: RcPrecheckOperation;\n /**\n * Safety multiplier applied to the average operation cost when deciding\n * whether the broadcast will \"likely fail\". Actual on-chain cost varies with\n * network load, so we keep headroom. Defaults to 1.2.\n */\n buffer?: number;\n}\n\nexport interface RcPrecheckResult {\n /** Both inputs were available, so the estimate is meaningful. */\n ready: boolean;\n /** Current RC mana of the account. */\n currentMana: number;\n /** Maximum RC mana of the account. */\n maxMana: number;\n /** Average RC cost of the operation. */\n avgCost: number;\n /** Average cost padded by `buffer`. */\n estimatedCost: number;\n /** `currentMana` is below the padded estimate -> broadcast likely fails. */\n willLikelyFail: boolean;\n /** RC shortfall vs the padded estimate (0 when not failing). */\n deficit: number;\n /** Roughly how many such operations the account can still afford. */\n remaining: number;\n}\n\nconst EMPTY: RcPrecheckResult = {\n ready: false,\n currentMana: 0,\n maxMana: 0,\n avgCost: 0,\n estimatedCost: 0,\n willLikelyFail: false,\n deficit: 0,\n remaining: 0,\n};\n\n/**\n * Pure, client-side estimate of whether an account has enough Resource Credits\n * to broadcast an operation, used to warn the user BEFORE they submit instead\n * of failing afterwards with the chain's \"Please wait to transact\" error.\n *\n * It is intentionally approximate: it uses the network-wide average cost from\n * `rc_api.get_rc_stats`, padded by a buffer. Treat `willLikelyFail` as a hint,\n * never a hard gate - the publish/comment/vote action must stay non-blocking.\n */\nexport function estimateRcPrecheck({\n rcAccount,\n rcStats,\n operation,\n buffer = 1.2,\n}: RcPrecheckInput): RcPrecheckResult {\n if (!rcAccount || !rcStats?.ops) {\n return EMPTY;\n }\n\n const { current_mana: currentMana, max_mana: maxMana } = calculateRCMana(rcAccount);\n const avgCost = Number(rcStats.ops[operation]?.avg_cost ?? 0);\n\n if (!(avgCost > 0)) {\n return { ...EMPTY, ready: true, currentMana, maxMana };\n }\n\n const safeBuffer = Number.isFinite(buffer) && buffer > 0 ? buffer : 1.2;\n const estimatedCost = avgCost * safeBuffer;\n const willLikelyFail = currentMana < estimatedCost;\n\n return {\n ready: true,\n currentMana,\n maxMana,\n avgCost,\n estimatedCost,\n willLikelyFail,\n deficit: willLikelyFail ? Math.ceil(estimatedCost - currentMana) : 0,\n remaining: Math.floor(currentMana / avgCost),\n };\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { GetGameStatus } from \"../types\";\n\nexport function getGameStatusCheckQueryOptions(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\"\n) {\n return queryOptions({\n queryKey: [\"games\", \"status-check\", gameType, username],\n enabled: !!username && !!code,\n queryFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/get-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()) as GetGameStatus;\n },\n });\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { GameClaim } from \"../types\";\nimport { useRecordActivity } from \"@/modules/analytics/mutations\";\n\nexport function useGameClaim(\n username: string | undefined,\n code: string | undefined,\n gameType: \"spin\",\n key: string\n) {\n const { mutateAsync: recordActivity } = useRecordActivity(\n username,\n \"spin-rolled\"\n );\n\n return useMutation({\n mutationKey: [\"games\", \"post\", gameType, username],\n mutationFn: async () => {\n if (!username || !code) {\n throw new Error(\"[SDK][Games] – missing auth\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/post-game\",\n {\n method: \"POST\",\n body: JSON.stringify({\n game_type: gameType,\n code,\n key,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (await response.json()) as GameClaim;\n },\n onSuccess() {\n recordActivity();\n },\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { QuestsResponse } from \"../types\";\n\n/**\n * Read-only daily/weekly/monthly quest progress for a user. Aggregates the existing\n * points ledger (no auth required — same sensitivity as `/private-api/points`).\n */\nexport function getQuestsQueryOptions(username: string | undefined) {\n const name = username?.replace(\"@\", \"\");\n return queryOptions({\n queryKey: QueryKeys.quests.status(name),\n enabled: !!name,\n queryFn: async () => {\n if (!name) {\n throw new Error(\"[SDK][Quests] – username wasn't provided\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/quests\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ username: name }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch quests: ${response.status}`);\n }\n\n return (await response.json()) as QuestsResponse;\n },\n staleTime: 30000,\n refetchOnMount: true,\n });\n}\n","/**\n * Shared quest catalog — the single source of truth for which quests exist, their\n * encouraging goals, copy keys and icon hints. Lives in the SDK so the web and mobile\n * clients render an identical, harmonized set. The backend (`/private-api/quests`)\n * returns raw progress + the reward `cap`; this catalog layers the presentation.\n *\n * `goal` is an *encouraging, reachable* daily target and is intentionally independent of\n * the backend reward `cap` (the point at which the existing reward decays to ~0). It is\n * tunable here without any backend change.\n */\n\nexport type QuestTier = \"daily\" | \"weekly\" | \"monthly\";\n\nexport interface QuestCatalogEntry {\n id: string;\n tier: QuestTier;\n /** encouraging, reachable target for the period (tunable, not the reward cap) */\n goal: number;\n /** i18n key suffix; clients resolve e.g. `quests..title` / `.desc` */\n i18nKey: string;\n /** semantic icon hint; each client maps it to its own icon set */\n icon: string;\n}\n\nexport const QUEST_CATALOG: QuestCatalogEntry[] = [\n // Daily\n { id: \"checkin\", tier: \"daily\", goal: 1, i18nKey: \"checkin\", icon: \"check-circle\" },\n { id: \"post\", tier: \"daily\", goal: 1, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"daily\", goal: 3, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"daily\", goal: 10, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"daily\", goal: 1, i18nKey: \"reblog\", icon: \"repeat\" },\n { id: \"spin\", tier: \"daily\", goal: 1, i18nKey: \"spin\", icon: \"gift\" },\n // Weekly\n { id: \"post\", tier: \"weekly\", goal: 5, i18nKey: \"post\", icon: \"pencil\" },\n { id: \"comment\", tier: \"weekly\", goal: 15, i18nKey: \"comment\", icon: \"comment\" },\n { id: \"vote\", tier: \"weekly\", goal: 50, i18nKey: \"vote\", icon: \"chevron-up-circle\" },\n { id: \"reblog\", tier: \"weekly\", goal: 5, i18nKey: \"reblog\", icon: \"repeat\" },\n // Monthly\n { id: \"post\", tier: \"monthly\", goal: 20, i18nKey: \"post\", icon: \"pencil\" },\n];\n\nexport function getQuestCatalogEntry(tier: QuestTier, id: string) {\n return QUEST_CATALOG.find((q) => q.tier === tier && q.id === id);\n}\n\n// Streak Freeze display config. MIRRORS the ePoints constants\n// (STREAK_FREEZE_PRICE / STREAK_FREEZE_MAX_OWNED) — the server is the source of truth\n// and validates every purchase; these drive the label + button state only, so a drift\n// here never over-charges (the buy is priced server-side).\nexport const STREAK_FREEZE_PRICE = 300;\nexport const STREAK_FREEZE_MAX_OWNED = 2;\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { StreakFreezeBuyResult } from \"../types\";\n\n/** A fresh idempotency key per purchase; guarded for runtimes without crypto.randomUUID. */\nfunction genIdempotencyKey(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * POST a single streak-freeze purchase. Throws on a non-2xx with the server's\n * `.status` + parsed `.data` attached so the caller can branch on 402 (insufficient)\n * / 409 (max owned). Exported for unit testing; the hook below wraps it.\n */\nexport async function buyStreakFreezeRequest(\n code: string\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/streak-freeze/buy\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code, idempotency_key: genIdempotencyKey() }),\n }\n );\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to buy streak freeze: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as StreakFreezeBuyResult;\n}\n\n/**\n * Buy one streak freeze (a Points-only sink). The server debits Points, caps owned\n * inventory, and is idempotent per key. On success the quests + points caches are\n * invalidated so the owned count and balance refresh. A 402 (insufficient) / 409 (max\n * owned) is rethrown with `.status` + `.data` so the caller can route to a Points top-up.\n */\nexport function useBuyStreakFreeze(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"streak-freeze\", \"buy\", name],\n mutationFn: async () => {\n if (!name || !code) {\n throw new Error(\"[SDK][StreakFreeze] – missing auth\");\n }\n return buyStreakFreezeRequest(code);\n },\n onSuccess() {\n // Balance only changes on a successful debit.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.points._prefix(name) });\n }\n },\n onSettled() {\n // Refresh freezes_owned on success AND error: a 409 (max owned) means the\n // client's count is stale, and without this the \"Protect streak\" button would\n // never hide and the user could keep re-triggering 409s.\n if (name) {\n queryClient.invalidateQueries({ queryKey: QueryKeys.quests.status(name) });\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for subscribing to a community.\n */\nexport interface SubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for subscribing to a community.\n *\n * This mutation broadcasts a subscribe operation to the Hive blockchain,\n * adding the community to the user's subscription list.\n *\n * @param username - The username subscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"subscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const subscribeMutation = useSubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Subscribe to a community\n * subscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useSubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"subscribe\"],\n username,\n ({ community }) => [\n buildSubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUnsubscribeOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for unsubscribing from a community.\n */\nexport interface UnsubscribeCommunityPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n}\n\n/**\n * React Query mutation hook for unsubscribing from a community.\n *\n * This mutation broadcasts an unsubscribe operation to the Hive blockchain,\n * removing the community from the user's subscription list.\n *\n * @param username - The username unsubscribing (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates subscriptions cache to show updated subscription list\n * - Invalidates community cache to refetch updated subscriber count\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"unsubscribe\", {\"community\": \"hive-123456\"}]\n * - Authority: Posting key\n *\n * @example\n * ```typescript\n * const unsubscribeMutation = useUnsubscribeCommunity(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Unsubscribe from a community\n * unsubscribeMutation.mutate({\n * community: 'hive-123456'\n * });\n * ```\n */\nexport function useUnsubscribeCommunity(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"unsubscribe\"],\n username,\n ({ community }) => [\n buildUnsubscribeOp(username!, community)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.subscriptions(username!),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n QueryKeys.communities.context(username!, variables.community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildMutePostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for muting/unmuting a post in a community.\n */\nexport interface MutePostPayload {\n /** Community name (e.g., \"hive-123456\") */\n community: string;\n /** Post author */\n author: string;\n /** Post permlink */\n permlink: string;\n /** Mute reason/notes (required even for unmute) */\n notes: string;\n /** True to mute, false to unmute */\n mute: boolean;\n}\n\n/**\n * React Query mutation hook for muting/unmuting posts in a community.\n *\n * This mutation broadcasts a custom_json operation to mute (or unmute)\n * a post within a community. Only community moderators/admins can mute posts.\n *\n * @param username - The username performing the mute (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community posts cache to hide muted content\n * - Invalidates post cache to update mute status\n * - Invalidates feed cache to remove muted posts from feeds\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"mutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Action (unmute): [\"unmutePost\", {\"community\": \"hive-123456\", \"account\": \"author\", \"permlink\": \"post\", \"notes\": \"reason\"}]\n * - Authority: Posting key\n *\n * **Mute vs Unmute:**\n * - mute: true - Mutes the post (hides from community feed)\n * - mute: false - Unmutes the post (restores to community feed)\n *\n * **Permission:**\n * - Only community moderators and admins can mute/unmute posts\n * - Attempting to mute without permission will fail with an error\n *\n * @example\n * ```typescript\n * const mutePostMutation = useMutePost(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Mute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Violates community guidelines',\n * mute: true\n * });\n *\n * // Unmute a post\n * mutePostMutation.mutate({\n * community: 'hive-123456',\n * author: 'alice',\n * permlink: 'my-post',\n * notes: 'Resolved after editing',\n * mute: false\n * });\n * ```\n */\nexport function useMutePost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"mutePost\"],\n username,\n ({ community, author, permlink, notes, mute }) => [\n buildMutePostOp(username!, community, author, permlink, notes, mute)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n const queriesToInvalidate: any[] = [\n // Invalidate specific post cache to update mute status\n QueryKeys.posts.entry(`/@${variables.author}/${variables.permlink}`),\n // Invalidate community data\n [\"community\", \"single\", variables.community],\n // Invalidate community feed/posts (matches all sort orders, limits, observers)\n {\n predicate: (query: any) => {\n const key = query.queryKey;\n return (\n Array.isArray(key) &&\n key[0] === \"posts\" &&\n key[1] === \"posts-ranked\" &&\n key[3] === variables.community\n );\n }\n }\n ];\n await auth.adapter.invalidateQueries(queriesToInvalidate);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'sync' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetRoleOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community, CommunityTeam } from \"../types\";\n\n/**\n * Payload for setting a user's role in a community.\n */\nexport interface SetCommunityRolePayload {\n /** Account to set role for */\n account: string;\n /** Role name (e.g., \"admin\", \"mod\", \"member\", \"guest\") */\n role: string;\n}\n\n/**\n * React Query mutation hook for setting a user's role in a community.\n *\n * This mutation broadcasts a setRole operation to the Hive blockchain,\n * updating the role of a community member. Only users with appropriate\n * permissions (community owner/admin) can set roles.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username setting the role (required for broadcast, must have permission)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated team member list\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"setRole\", {\"community\": \"hive-123456\", \"account\": \"user\", \"role\": \"mod\"}]\n * - Authority: Posting key\n *\n * **Role Types:**\n * - \"owner\" - Community owner (full permissions)\n * - \"admin\" - Administrator (can manage settings and team)\n * - \"mod\" - Moderator (can mute posts/users)\n * - \"member\" - Regular member (no special permissions)\n * - \"guest\" - Remove user from team (empty string also works)\n *\n * @example\n * ```typescript\n * const setRoleMutation = useSetCommunityRole('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Set a user as moderator\n * setRoleMutation.mutate({\n * account: 'alice',\n * role: 'mod'\n * });\n *\n * // Remove a user from the team\n * setRoleMutation.mutate({\n * account: 'bob',\n * role: 'guest'\n * });\n * ```\n */\nexport function useSetCommunityRole(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"set-role\", community],\n username,\n ({ account, role }) => [\n buildSetRoleOp(username!, community, account, role)\n ],\n async (_result: any, variables) => {\n // Optimistic team update in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n const team: CommunityTeam = [...(prev.team ?? [])];\n const idx = team.findIndex(([name]) => name === variables.account);\n if (idx >= 0) {\n team[idx] = [team[idx][0], variables.role, team[idx][2] ?? \"\"];\n } else {\n team.push([variables.account, variables.role, \"\"]);\n }\n return { ...prev, team };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries + context for affected user\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)],\n QueryKeys.communities.context(variables.account, community)\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, getQueryClient, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildUpdateCommunityOp, type CommunityProps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Community } from \"../types\";\n\n/**\n * Payload for updating community properties.\n * Matches the CommunityProps interface from builders.\n */\nexport type UpdateCommunityPayload = CommunityProps;\n\n/**\n * React Query mutation hook for updating community properties.\n *\n * This mutation broadcasts an updateProps operation to the Hive blockchain,\n * modifying the community's metadata and settings. Only community admins\n * can update community properties.\n *\n * @param community - Community name (e.g., \"hive-123456\")\n * @param username - The username updating the community (required for broadcast, must be admin)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to refetch updated properties\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"community\"\n * - Action: [\"updateProps\", {\"community\": \"hive-123456\", \"props\": {...}}]\n * - Authority: Posting key\n *\n * **Properties:**\n * - title - Community display title\n * - about - Short description/tagline\n * - lang - Primary language code (e.g., \"en\")\n * - description - Full community description (markdown supported)\n * - flag_text - Custom text shown when flagging posts\n * - is_nsfw - Whether community contains NSFW content\n *\n * @example\n * ```typescript\n * const updateMutation = useUpdateCommunity('hive-123456', username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Update community properties\n * updateMutation.mutate({\n * title: 'My Awesome Community',\n * about: 'A place for awesome people',\n * lang: 'en',\n * description: '# Welcome\\nThis is our community description',\n * flag_text: 'Please explain why this content violates our rules',\n * is_nsfw: false\n * });\n * ```\n */\nexport function useUpdateCommunity(\n community: string,\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"update\", community],\n username,\n (props) => [\n buildUpdateCommunityOp(username!, community, props)\n ],\n async (_result: any, variables) => {\n // Optimistic property merge in community cache\n // Query key is [\"community\",\"single\",name,observer] — observer varies, so use predicate\n const qc = getQueryClient();\n qc.setQueriesData(\n { queryKey: QueryKeys.communities.singlePrefix(community) },\n (prev) => {\n if (!prev) return prev;\n return { ...prev, ...(variables as unknown as Partial) };\n }\n );\n\n // Cache invalidation — prefix-match all community single queries\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n [...QueryKeys.communities.singlePrefix(community)]\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildCommunityRegistrationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for community rewards registration.\n */\nexport interface CommunityRewardsRegisterPayload {\n /** Community account name (usually the community creator's account) */\n name: string;\n}\n\n/**\n * React Query mutation hook for registering to receive community rewards.\n *\n * This mutation broadcasts a custom_json operation to register a community\n * account to receive Ecency Points rewards for community activity.\n *\n * @param username - The username registering for community rewards (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates community cache to update registration status\n * - Invalidates points balance to reflect potential initial rewards\n *\n * **Operation Details:**\n * - Uses custom_json operation with id \"ecency_registration\"\n * - JSON: {\"name\": \"communityname\"}\n * - Authority: Active key (required for registration)\n *\n * **Purpose:**\n * - Enables communities to receive Ecency Points for activity\n * - One-time registration per community\n * - Can only be done by the community owner/creator\n *\n * @example\n * ```typescript\n * const registerMutation = useRegisterCommunityRewards(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Register community for rewards\n * registerMutation.mutate({\n * name: 'hive-123456'\n * });\n * ```\n */\nexport function useRegisterCommunityRewards(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"registerRewards\"],\n username,\n ({ name }) => [\n buildCommunityRegistrationOp(name)\n ],\n async (_result: any, variables) => {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n // Invalidate community cache to update registration status\n [...QueryKeys.communities.singlePrefix(variables.name)],\n // Invalidate points balance\n [...QueryKeys.points._prefix(username!)],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildPinPostOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface PinPostPayload {\n community: string;\n account: string;\n permlink: string;\n pin: boolean;\n}\n\nexport function usePinPost(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"communities\", \"pin-post\"],\n username,\n ({ community, account, permlink, pin }) => [\n buildPinPostOp(username!, community, account, permlink, pin)\n ],\n async (_result, variables) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.posts.entry(`/@${variables.account}/${variables.permlink}`),\n [...QueryKeys.communities.singlePrefix(variables.community)],\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport { Communities } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunitiesQueryOptions(\n sort: string,\n query?: string,\n limit = 100,\n observer: string | undefined = undefined,\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.list(sort, query ?? \"\", limit),\n enabled,\n queryFn: async () => {\n const response = await callRPC(\"bridge.list_communities\", {\n last: \"\",\n limit,\n sort: sort === \"hot\" ? \"rank\" : sort,\n query: query ? query : null,\n observer,\n });\n return (\n response\n ? sort === \"hot\"\n ? response.sort(() => Math.random() - 0.5)\n : response\n : []\n ) as Communities;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { CommunityRole } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getCommunityContextQueryOptions(\n username: string | undefined,\n communityName: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.context(username!, communityName!),\n enabled: !!username && !!communityName,\n queryFn: async () => {\n const response = await callRPC(\"bridge.get_community_context\", {\n account: username,\n name: communityName,\n });\n\n return {\n role: response?.role ?? \"guest\",\n subscribed: response?.subscribed ?? false,\n } satisfies {\n role: CommunityRole;\n subscribed: boolean;\n };\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Community } from \"../types/community\";\nimport { getCommunity } from \"@/modules/bridge\";\nimport { QueryKeys } from \"@/modules/core\";\n\nexport function getCommunityQueryOptions(\n name: string | undefined,\n observer: string | undefined = \"\",\n enabled = true\n) {\n return queryOptions({\n queryKey: QueryKeys.communities.single(name, observer),\n enabled: enabled && !!name,\n queryFn: async () => getCommunity(name ?? \"\", observer) as Promise,\n });\n}\n","import {\n InfiniteData,\n infiniteQueryOptions,\n queryOptions\n} from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Subscription } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * hivemind caps `bridge.list_subscribers` at 100 rows per call, regardless of a\n * larger requested limit.\n */\nexport const SUBSCRIBERS_PAGE_SIZE = 100;\n\ntype SubscribersPage = Subscription[];\ntype SubscribersCursor = string | null;\n\n/**\n * Fetches one page of subscribers.\n *\n * `last` is omitted on the first page rather than passed as an empty string:\n * hivemind reads `\"\"` as a real cursor positioned before the first account and\n * returns zero rows.\n */\nasync function fetchSubscribersPage(\n communityName: string,\n last: SubscribersCursor\n): Promise {\n const response = await callRPC(\"bridge.list_subscribers\", {\n community: communityName,\n limit: SUBSCRIBERS_PAGE_SIZE,\n ...(last ? { last } : {})\n });\n return (response as Subscription[] | null) ?? [];\n}\n\n/**\n * Get the first page of subscribers for a community.\n *\n * @deprecated Returns at most {@link SUBSCRIBERS_PAGE_SIZE} subscribers, which\n * for most communities is a small fraction of the total while looking like the\n * complete list. Prefer {@link getCommunitySubscribersInfiniteQueryOptions}\n * unless a single page is genuinely all that is wanted.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersQueryOptions(communityName: string) {\n return queryOptions({\n queryKey: QueryKeys.communities.subscribers(communityName),\n queryFn: async () => fetchSubscribersPage(communityName, null),\n staleTime: 60000\n });\n}\n\n/**\n * Get all subscribers for a community, paged with hivemind's `last` cursor.\n *\n * @param communityName - The community name (e.g., \"hive-123456\")\n */\nexport function getCommunitySubscribersInfiniteQueryOptions(\n communityName: string\n) {\n return infiniteQueryOptions<\n SubscribersPage,\n Error,\n InfiniteData,\n string[],\n SubscribersCursor\n >({\n queryKey: QueryKeys.communities.subscribersInfinite(communityName),\n initialPageParam: null as SubscribersCursor,\n queryFn: async ({ pageParam }: { pageParam: SubscribersCursor }) =>\n fetchSubscribersPage(communityName, pageParam),\n // The cursor is the previous page's last account name. A short page is the\n // end of the list.\n getNextPageParam: (lastPage: SubscribersPage): SubscribersCursor =>\n lastPage?.length >= SUBSCRIBERS_PAGE_SIZE\n ? lastPage[lastPage.length - 1]?.[0] ?? null\n : null,\n staleTime: 60000\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { AccountNotification } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\ntype NotifPage = AccountNotification[];\ntype NotifCursor = number | null;\n\n/**\n * Get account notifications for a community (bridge API)\n *\n * @param account - The account/community name\n * @param limit - Number of notifications per page\n */\nexport function getAccountNotificationsInfiniteQueryOptions(\n account: string,\n limit: number\n) {\n return infiniteQueryOptions<\n NotifPage,\n Error,\n InfiniteData,\n (string | number)[],\n NotifCursor\n >({\n queryKey: QueryKeys.communities.accountNotifications(account, limit),\n initialPageParam: null as NotifCursor,\n\n // Errors are deliberately not caught. Returning [] on failure made an RPC\n // outage indistinguishable from an empty log: `isError` never became true,\n // so consumers rendered \"no activity\" for a failed request, and a failed\n // page produced no cursor and silently ended pagination. Let React Query\n // own the error so `isError` and retry behave normally.\n queryFn: async ({ pageParam }: { pageParam: NotifCursor }) => {\n const response = await callRPC(\"bridge.account_notifications\", {\n account,\n limit,\n last_id: pageParam ?? undefined,\n });\n return (response as AccountNotification[] | null) ?? [];\n },\n\n // A short page is the end of the log. Keying on \"empty\" alone would also\n // treat a truncated page as the end.\n getNextPageParam: (lastPage: NotifPage): NotifCursor =>\n lastPage?.length >= limit ? lastPage[lastPage.length - 1].id : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { RewardedCommunity } from \"../types/rewarded-community\";\n\nexport function getRewardedCommunitiesQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.communities.rewarded(),\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/rewarded-communities\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch rewarded communities: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","export enum ROLES {\n OWNER = \"owner\",\n ADMIN = \"admin\",\n MOD = \"mod\",\n MEMBER = \"member\",\n GUEST = \"guest\",\n MUTED = \"muted\",\n}\n\nexport const roleMap: Record = {\n [ROLES.OWNER]: [\n ROLES.ADMIN,\n ROLES.MOD,\n ROLES.MEMBER,\n ROLES.GUEST,\n ROLES.MUTED,\n ],\n [ROLES.ADMIN]: [ROLES.MOD, ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n [ROLES.MOD]: [ROLES.MEMBER, ROLES.GUEST, ROLES.MUTED],\n};\n\nexport type CommunityTeam = Array>;\nexport type CommunityRole = (typeof ROLES)[keyof typeof ROLES]; // \"owner\" | \"member\" | ...\nexport type CommunityType = \"Topic\" | \"Journal\" | \"Council\";\n\nexport interface Community {\n about: string;\n admins?: string[];\n avatar_url: string;\n created_at: string;\n description: string;\n flag_text: string;\n id: number;\n is_nsfw: boolean;\n lang: string;\n name: string;\n num_authors: number;\n num_pending: number;\n subscribers: number;\n sum_pending: number;\n settings?: any;\n team: CommunityTeam;\n title: string;\n type_id: number;\n}\n\nexport type Communities = Community[];\n","import { CommunityRole, CommunityType, ROLES } from \"../types\";\n\nexport function getCommunityType(name: string, type_id: number): CommunityType {\n if (name.startsWith(\"hive-3\") || type_id === 3) return \"Council\";\n if (name.startsWith(\"hive-2\") || type_id === 2) return \"Journal\";\n return \"Topic\";\n}\n\nexport function getCommunityPermissions({\n communityType,\n userRole,\n subscribed,\n}: {\n communityType: CommunityType;\n userRole: CommunityRole;\n subscribed: boolean;\n}) {\n const canPost = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n if (communityType === \"Topic\") return true;\n\n // Journal & Council\n return [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD, ROLES.MEMBER].includes(\n userRole\n );\n })();\n\n const canComment = (() => {\n if (userRole === ROLES.MUTED) return false;\n\n switch (communityType) {\n case \"Topic\":\n return true;\n case \"Journal\":\n return userRole !== ROLES.GUEST || subscribed;\n case \"Council\":\n return canPost;\n }\n })();\n\n const isModerator = [ROLES.OWNER, ROLES.ADMIN, ROLES.MOD].includes(userRole);\n\n return {\n canPost,\n canComment,\n isModerator,\n };\n}\n","import { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nexport function getNotificationsUnreadCountQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.unreadCount(activeUsername),\n queryFn: async () => {\n if (!code) {\n return 0;\n }\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/notifications/unread`,\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n const data = (await response.json()) as { count: number };\n return data.count;\n },\n enabled: !!activeUsername && !!code,\n initialData: 0,\n refetchInterval: 60000,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { NotificationFilter } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { ApiNotification } from \"../types\";\n\nexport function getNotificationsInfiniteQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n filter: NotificationFilter | undefined = undefined\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.notifications.list(activeUsername, filter),\n queryFn: async ({ pageParam }) => {\n if (!code) {\n return [];\n }\n const data = {\n code,\n filter,\n since: pageParam,\n user: undefined,\n };\n\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/notifications\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }\n );\n\n if (!response.ok) {\n return [];\n }\n\n try {\n return (await response.json()) as ApiNotification[];\n } catch {\n return [];\n }\n },\n enabled: !!activeUsername && !!code,\n initialData: { pages: [], pageParams: [] },\n initialPageParam: \"\",\n getNextPageParam: (lastPage) => lastPage?.[lastPage.length - 1]?.id ?? \"\",\n refetchOnMount: true,\n });\n}\n","export enum NotificationFilter {\n VOTES = \"rvotes\",\n MENTIONS = \"mentions\",\n FAVORITES = \"nfavorites\",\n BOOKMARKS = \"nbookmarks\",\n FOLLOWS = \"follows\",\n REPLIES = \"replies\",\n REBLOGS = \"reblogs\",\n TRANSFERS = \"transfers\",\n DELEGATIONS = \"delegations\",\n PAYOUTS = \"payouts\",\n SCHEDULED_PUBLISHED = \"scheduled_published\",\n // Filter path is plural while the notification `type` string is singular\n // (`account_update`) - enotify routes on the plural form.\n ACCOUNT_UPDATES = \"account_updates\",\n WEEKLY_EARNINGS = \"weekly_earnings\",\n}\n","// Values are enotify's ACTIVITY_MAIN_TYPE_* ints and are validated server-side at\n// device registration, so they must match enotify constants.py exactly. Note payouts\n// is 19: the original 16 is commented out upstream and must not be reused.\nexport enum NotifyTypes {\n VOTE = 1,\n MENTION = 2,\n FOLLOW = 3,\n COMMENT = 4,\n RE_BLOG = 5,\n TRANSFERS = 6,\n DELEGATIONS = 10,\n FAVORITES = 13,\n BOOKMARKS = 15,\n PAYOUTS = 19,\n ACCOUNT_UPDATE = 20,\n WEEKLY_EARNINGS = 21,\n SCHEDULED_PUBLISHED = 22,\n ALLOW_NOTIFY = \"ALLOW_NOTIFY\",\n}\n\nexport const ALL_NOTIFY_TYPES = [\n NotifyTypes.VOTE,\n NotifyTypes.MENTION,\n NotifyTypes.FOLLOW,\n NotifyTypes.COMMENT,\n NotifyTypes.RE_BLOG,\n NotifyTypes.TRANSFERS,\n NotifyTypes.DELEGATIONS,\n NotifyTypes.FAVORITES,\n NotifyTypes.BOOKMARKS,\n NotifyTypes.PAYOUTS,\n NotifyTypes.ACCOUNT_UPDATE,\n NotifyTypes.WEEKLY_EARNINGS,\n NotifyTypes.SCHEDULED_PUBLISHED,\n] as const;\n\nexport enum NotificationViewType {\n ALL = \"All\",\n UNREAD = \"Unread\",\n READ = \"Read\",\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ApiNotificationSetting } from \"../types\";\nimport { ALL_NOTIFY_TYPES } from \"../enums\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\n\nexport function getNotificationsSettingsQueryOptions(\n activeUsername: string | undefined,\n code: string | undefined,\n initialMuted?: boolean\n) {\n return queryOptions({\n queryKey: QueryKeys.notifications.settings(activeUsername),\n queryFn: async () => {\n let token = activeUsername + \"-web\";\n if (!code) {\n throw new Error(\"Missing access token\");\n }\n const response = await fetch(\n CONFIG.privateApiHost + \"/private-api/detail-device\",\n {\n body: JSON.stringify({\n code,\n username: activeUsername,\n token,\n }),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch notification settings: ${response.status}`);\n }\n return response.json() as Promise;\n },\n enabled: !!activeUsername && !!code,\n refetchOnMount: false,\n initialData: () => {\n return {\n status: 0,\n system: \"web\",\n allows_notify: 0,\n notify_types: initialMuted ? [] : ([...ALL_NOTIFY_TYPES] as number[]),\n } as ApiNotificationSetting;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Announcement } from \"../types/announcement\";\n\nexport function getAnnouncementsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.notifications.announcements(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/announcements\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch announcements: ${response.status}`);\n }\n\n const data = await response.json() as Announcement[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { Spotlight } from \"../types/spotlight\";\n\n// `_accessToken` is accepted for call-site parity with mobile (which passes one) but is\n// intentionally unused: the spotlights endpoint is anonymous and only filters by date window.\nexport function getSpotlightsQueryOptions(_accessToken?: string) {\n return queryOptions({\n queryKey: QueryKeys.notifications.spotlights(),\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/spotlights\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch spotlights: ${response.status}`);\n }\n\n const data = (await response.json()) as Spotlight[];\n return data || [];\n },\n staleTime: 3_600_000,\n });\n}\n","import { useMutation, QueryKey, InfiniteData } from \"@tanstack/react-query\";\nimport { getQueryClient, QueryKeys } from \"@/modules/core\";\nimport { markNotifications } from \"@/modules/private-api/requests\";\nimport { ApiNotification } from \"../types\";\n\ntype NotificationPage = ApiNotification[];\ntype InfiniteNotificationData = InfiniteData;\n\nfunction markNotificationRead(item: ApiNotification, id?: string): ApiNotification {\n return {\n ...item,\n read: (!id || id === item.id ? 1 : item.read) as 0 | 1,\n };\n}\n\nfunction isInfiniteData(data: unknown): data is InfiniteNotificationData {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"pages\" in data &&\n \"pageParams\" in data &&\n Array.isArray((data as InfiniteNotificationData).pages)\n );\n}\n\n/**\n * Hook to mark notifications as read with optimistic updates\n *\n * @param username - Current user's username\n * @param code - Access token for authentication\n * @param onSuccess - Optional callback on successful mutation, receives unread count\n * @param onError - Optional callback on error\n *\n * @returns Mutation hook that accepts { id?: string }\n *\n * @example\n * ```typescript\n * const markAsRead = useMarkNotificationsRead(username, code);\n *\n * // Mark specific notification\n * markAsRead.mutate({ id: \"notification-id\" });\n *\n * // Mark all notifications (omit id)\n * markAsRead.mutate({});\n * ```\n */\nexport function useMarkNotificationsRead(\n username: string | undefined,\n code: string | undefined,\n onSuccess?: (unreadCount?: number) => void,\n onError?: (e: Error) => void\n) {\n const queryClient = getQueryClient();\n\n return useMutation({\n mutationKey: [\"notifications\", \"mark-read\", username],\n\n mutationFn: async ({ id }: { id?: string }) => {\n if (!username || !code) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[SDK][Notifications] – missing auth for markNotifications\");\n }\n return;\n }\n return markNotifications(code, id);\n },\n\n // Optimistic update: Immediately mark notifications as read in cache\n onMutate: async ({ id }: { id?: string }) => {\n // Skip optimistic updates when auth is not available\n if (!username || !code) {\n return { previousData: [] };\n }\n\n // Cancel any outgoing refetches to prevent overwriting optimistic update\n await queryClient.cancelQueries({ queryKey: QueryKeys.notifications._prefix });\n\n // Snapshot current state for rollback\n const previousData: Array<[QueryKey, unknown]> = [];\n\n // Update infinite notification list queries (pages structure)\n const infiniteQueries = queryClient.getQueriesData({\n queryKey: QueryKeys.notifications._prefix,\n predicate: (query) => {\n const data = query.state.data;\n return isInfiniteData(data);\n },\n });\n\n infiniteQueries.forEach(([queryKey, data]) => {\n if (data && isInfiniteData(data)) {\n previousData.push([queryKey, data]);\n\n const updatedData: InfiniteNotificationData = {\n ...data,\n pages: data.pages.map((page) =>\n page.map((item) => markNotificationRead(item, id))\n ),\n };\n\n queryClient.setQueryData(queryKey, updatedData);\n }\n });\n\n // Optimistically decrement unread count\n const unreadKey = QueryKeys.notifications.unreadCount(username);\n const currentUnread = queryClient.getQueryData(unreadKey);\n if (typeof currentUnread === \"number\" && currentUnread > 0) {\n previousData.push([unreadKey, currentUnread]);\n\n if (!id) {\n // Mark all: set to 0\n queryClient.setQueryData(unreadKey, 0);\n } else {\n // Mark single: only decrement if the notification is currently unread\n const isUnread = infiniteQueries.some(([, d]) =>\n d?.pages.some((page) =>\n page.some((item) => item.id === id && item.read === 0)\n )\n );\n if (isUnread) {\n queryClient.setQueryData(unreadKey, currentUnread - 1);\n }\n }\n }\n\n // Return context for rollback\n return { previousData };\n },\n\n onSuccess: (response) => {\n // Extract unread count from response if available\n const unreadCount = typeof response === \"object\" && response !== null\n ? (response as { unread?: number }).unread\n : undefined;\n\n // Update unread count cache with server value\n if (typeof unreadCount === \"number\") {\n queryClient.setQueryData(\n QueryKeys.notifications.unreadCount(username),\n unreadCount\n );\n }\n\n onSuccess?.(unreadCount);\n },\n\n // Rollback optimistic update on error\n onError: (error, _variables, context) => {\n // Restore previous state\n if (context?.previousData) {\n context.previousData.forEach(([queryKey, data]) => {\n queryClient.setQueryData(queryKey, data);\n });\n }\n\n onError?.(error as Error);\n },\n\n // Always refetch after mutation settles\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: QueryKeys.notifications._prefix,\n });\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildSetLastReadOps } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface SetLastReadPayload {\n date?: string;\n}\n\nexport function useSetLastRead(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"notifications\", \"set-last-read\"],\n username,\n ({ date }) => buildSetLastReadOps(username!, date),\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.notifications.unreadCount(username),\n ]);\n }\n },\n auth,\n 'posting',\n { broadcastMode: broadcastMode ?? 'async' }\n );\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get a single proposal by ID\n */\nexport function getProposalQueryOptions(id: number) {\n return queryOptions({\n queryKey: [\"proposals\", \"proposal\", id],\n queryFn: async () => {\n const r = await callRPC(\"condenser_api.find_proposals\", [[id]]);\n const proposal = r[0];\n\n // Determine proposal status based on dates\n if (new Date(proposal.start_date) < new Date() && new Date(proposal.end_date) >= new Date()) {\n proposal.status = \"active\";\n } else if (new Date(proposal.end_date) < new Date()) {\n proposal.status = \"expired\";\n } else {\n proposal.status = \"inactive\";\n }\n\n return proposal as Proposal;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { Proposal } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get all proposals, sorted with expired proposals at the end\n */\nexport function getProposalsQueryOptions() {\n return queryOptions({\n queryKey: [\"proposals\", \"list\"],\n queryFn: async () => {\n const response = (await callRPC(\"database_api.list_proposals\", {\n start: [-1],\n limit: 500,\n order: \"by_total_votes\",\n order_direction: \"descending\",\n status: \"all\",\n })) as { proposals: Proposal[] };\n\n const proposals = response.proposals;\n const expired = proposals.filter((x) => x.status === \"expired\");\n const others = proposals.filter((x) => x.status !== \"expired\");\n\n return [...others, ...expired];\n },\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { FullAccount } from \"@/modules/accounts\";\nimport { parseAccounts } from \"@/modules/accounts/utils\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n// One page = array of enriched vote rows\nexport type ProposalVoteRow = {\n id: number;\n voter: string;\n voterAccount: FullAccount;\n};\n\ntype Cursor = string; // we paginate by last voter name\n\n/**\n * Get proposal votes with pagination and enriched voter account data\n *\n * @param proposalId - The proposal ID\n * @param voter - Starting voter for pagination\n * @param limit - Number of votes per page\n */\nexport function getProposalVotesInfiniteQueryOptions(\n proposalId: number,\n voter: string,\n limit: number\n) {\n return infiniteQueryOptions<\n ProposalVoteRow[],\n Error,\n InfiniteData,\n (string | number)[],\n Cursor\n >({\n queryKey: [\"proposals\", \"votes\", proposalId, voter, limit],\n initialPageParam: voter as Cursor,\n refetchOnMount: true,\n staleTime: 0, // Always refetch on mount\n\n queryFn: async ({ pageParam }: { pageParam: Cursor }) => {\n const startParam = pageParam ?? voter;\n\n const response = (await callRPC(\"condenser_api.list_proposal_votes\", [\n [proposalId, startParam],\n limit,\n \"by_proposal_voter\",\n ])) as ProposalVote[];\n\n const list = response\n .filter((x) => x.proposal?.proposal_id === proposalId)\n .map((x) => ({ id: x.id, voter: x.voter }));\n\n const rawAccounts = await callRPC(\"condenser_api.get_accounts\", [list.map((l) => l.voter)]);\n const accounts = parseAccounts(rawAccounts);\n\n const page: ProposalVoteRow[] = list.map((i) => ({\n ...i,\n voterAccount: accounts.find((a) => i.voter === a.name)!,\n }));\n\n return page;\n },\n\n getNextPageParam: (lastPage: ProposalVoteRow[]): Cursor | undefined => {\n const last = lastPage?.[lastPage.length - 1];\n return last?.voter ?? undefined;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ProposalVote } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Fetches ALL proposal votes for a specific user in a single query.\n * Much more efficient than querying each proposal individually.\n * Uses \"by_voter_proposal\" order to get all votes by a user.\n */\nexport function getUserProposalVotesQueryOptions(voter: string) {\n return queryOptions({\n queryKey: [\"proposals\", \"votes\", \"by-user\", voter],\n enabled: !!voter && voter !== \"\",\n staleTime: 60 * 1000, // Cache for 1 minute\n queryFn: async () => {\n if (!voter || voter === \"\") {\n return [];\n }\n\n const response = (await callRPC(\"database_api.list_proposal_votes\", {\n start: [voter],\n limit: 1000,\n order: \"by_voter_proposal\",\n order_direction: \"ascending\",\n status: \"votable\",\n })) as { proposal_votes: ProposalVote[] };\n\n // Filter to only this user's votes (API might return votes after this user alphabetically)\n const userVotes = (response.proposal_votes || []).filter((vote) => vote.voter === voter);\n\n return userVotes;\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting on proposals.\n */\nexport interface ProposalVotePayload {\n /** Array of proposal IDs to vote on */\n proposalIds: number[];\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting on Hive proposals.\n *\n * This mutation broadcasts an update_proposal_votes operation to vote on\n * one or more proposals in the Hive Decentralized Fund (HDF).\n *\n * @param username - The username voting on proposals (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Records activity (type 150) if adapter.recordActivity is available\n * - Invalidates proposal list cache to show updated vote status\n * - Invalidates voter's proposal votes cache\n *\n * **Multiple Proposals:**\n * - You can vote on multiple proposals in a single transaction\n * - All proposals receive the same vote (approve or disapprove)\n * - Proposal IDs are integers, not strings\n *\n * **Vote Types:**\n * - approve: true - Vote in favor of the proposal(s)\n * - approve: false - Remove your vote from the proposal(s)\n *\n * @example\n * ```typescript\n * const proposalVoteMutation = useProposalVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Approve a single proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: true\n * });\n *\n * // Approve multiple proposals\n * proposalVoteMutation.mutate({\n * proposalIds: [123, 124, 125],\n * approve: true\n * });\n *\n * // Remove vote from a proposal\n * proposalVoteMutation.mutate({\n * proposalIds: [123],\n * approve: false\n * });\n * ```\n */\nexport function useProposalVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"vote\"],\n username,\n ({ proposalIds, approve }) => [\n buildProposalVoteOp(username!, proposalIds, approve)\n ],\n async (result: any) => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Activity tracking (fire-and-forget — non-critical, shouldn't block mutation completion)\n // Async broadcasts return BroadcastResult ({ tx_id, status }) instead of TransactionConfirmation,\n // so fall back to tx_id when id is absent.\n const txId = result?.id ?? result?.tx_id;\n if (auth?.adapter?.recordActivity && txId) {\n auth.adapter.recordActivity(150, txId, result?.block_num).catch((error) => {\n console.debug(\"[SDK][Proposals][useProposalVote] recordActivity failed\", {\n activityType: 150,\n blockNum: result?.block_num,\n transactionId: txId,\n error\n });\n });\n }\n\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.proposals.list(),\n QueryKeys.proposals.votesByUser(username!)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useProposalVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for proposal votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildProposalCreateOp, type ProposalCreatePayload } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport { type ProposalCreatePayload };\n\nexport function useProposalCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"proposals\", \"create\"],\n username,\n (payload) => [\n buildProposalCreateOp(username!, payload)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.proposals.list(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get vesting delegations for an account with infinite scroll support\n *\n * @param username - The account username\n * @param limit - Maximum number of results per page (default: 50)\n */\nexport function getVestingDelegationsQueryOptions(\n username?: string,\n limit = 50\n) {\n return infiniteQueryOptions({\n queryKey: [\"wallet\", \"vesting-delegations\", username, limit],\n initialPageParam: \"\" as string,\n queryFn: async ({ pageParam }: { pageParam: string }) => {\n // Request one extra item on subsequent pages to handle inclusive cursor\n const fetchLimit = pageParam ? limit + 1 : limit;\n\n const result = await callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n pageParam || \"\",\n fetchLimit,\n ]) as DelegatedVestingShare[];\n\n // Filter out duplicate first item on subsequent pages\n // Hive API is inclusive of the 'from' cursor\n if (pageParam && result.length > 0 && result[0]?.delegatee === pageParam) {\n // Return at most limit items after removing the duplicate\n return result.slice(1, limit + 1);\n }\n\n return result;\n },\n getNextPageParam: (lastPage: DelegatedVestingShare[]) => {\n // If we got fewer results than limit, we've reached the end\n if (!lastPage || lastPage.length < limit) {\n return undefined;\n }\n\n // Return the last delegatee as cursor for next page\n const lastDelegation = lastPage[lastPage.length - 1];\n return lastDelegation?.delegatee;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { AccountDelegations } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\n\n/**\n * Account vesting delegations via the HAF balance-api REST endpoint\n * (`/balance-api/accounts/{account-name}/delegations`).\n *\n * Unlike `condenser_api.get_vesting_delegations` (see\n * {@link getHivePowerDelegatesInfiniteQueryOptions}), this returns the\n * complete outgoing AND incoming lists in a single request, with `callREST`\n * handling multi-node failover. `amount` is raw vests (vests * 10^6).\n */\nexport function getAccountDelegationsQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"assets\", \"account-delegations\", username],\n enabled: !!username,\n queryFn: ({ signal }) =>\n callREST(\n \"balance\",\n \"/accounts/{account-name}/delegations\",\n { \"account-name\": username },\n undefined,\n undefined,\n signal\n ) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { VestingDelegationExpiration } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get expiring vesting delegations for an account.\n *\n * When a delegation is removed (set to 0 VESTS), the HP doesn't return\n * immediately — it enters a 5-day cooldown. This query fetches those\n * in-flight expirations so they can be shown alongside active delegations.\n *\n * Uses database_api.find_vesting_delegation_expirations which returns\n * vesting_shares as NAI asset objects ({amount, nai, precision}).\n *\n * @param username - The delegator account username\n */\nexport function getVestingDelegationExpirationsQueryOptions(username?: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"vesting-delegation-expirations\", username],\n queryFn: async () => {\n if (!username) return [];\n const result = await callRPC(\"database_api.find_vesting_delegation_expirations\", { account: username }) as { delegations: VestingDelegationExpiration[] };\n return result.delegations;\n },\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { ConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HBD to HIVE conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CollateralizedConversionRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get collateralized HIVE to HBD conversion requests for an account\n *\n * @param account - The account username\n */\nexport function getCollateralizedConversionRequestsQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"collateralized-conversion-requests\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_collateralized_conversion_requests\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.requestid - b.requestid),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { SavingsWithdrawRequest } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get pending savings withdrawal requests for an account\n *\n * @param account - The account username\n */\nexport function getSavingsWithdrawFromQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"savings-withdraw\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_savings_withdraw_from\", [\n account,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.request_id - b.request_id),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get power down (vesting withdrawal) routes for an account\n *\n * @param account - The account username\n */\nexport function getWithdrawRoutesQueryOptions(account: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"withdraw-routes\", account],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n account,\n \"outgoing\",\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OpenOrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get open market orders for an account\n *\n * @param user - The account username\n */\nexport function getOpenOrdersQueryOptions(user: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"open-orders\", user],\n queryFn: () =>\n callRPC(\"condenser_api.get_open_orders\", [\n user,\n ]) as Promise,\n select: (data) => data.sort((a, b) => a.orderid - b.orderid),\n enabled: !!user,\n });\n}\n","import { InfiniteData, infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { RcDirectDelegation, RcDirectDelegationsResponse } from \"../types/rc-direct-delegation\";\n\ntype RcPage = RcDirectDelegation[];\ntype RcCursor = string | null;\n\n/**\n * Get outgoing RC delegations for an account\n *\n * @param username - Account name to get delegations for\n * @param limit - Number of delegations per page\n */\nexport function getOutgoingRcDelegationsInfiniteQueryOptions(username: string, limit = 100) {\n return infiniteQueryOptions<\n RcPage,\n Error,\n InfiniteData,\n (string | number)[],\n RcCursor\n >({\n queryKey: [\"wallet\", \"outgoing-rc-delegations\", username, limit],\n initialPageParam: null as RcCursor,\n\n queryFn: async ({ pageParam }: { pageParam: RcCursor }) => {\n const response = await callRPC(\"rc_api.list_rc_direct_delegations\", {\n start: [username, pageParam ?? \"\"],\n limit,\n })\n .then((r: any) => r as RcDirectDelegationsResponse);\n\n let delegations: RcDirectDelegation[] = response.rc_direct_delegations || [];\n\n // Filter out the starting delegation when paginating\n if (pageParam) {\n delegations = delegations.filter((delegation) => delegation.to !== pageParam);\n }\n\n return delegations;\n },\n\n getNextPageParam: (lastPage: RcPage): RcCursor =>\n lastPage.length === limit ? lastPage[lastPage.length - 1].to : null,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { IncomingRcResponse } from \"../types\";\n\nexport function getIncomingRcQueryOptions(username: string | undefined) {\n return queryOptions({\n queryKey: [\"wallet\", \"incoming-rc\", username],\n enabled: !!username,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] - Missing username for incoming RC\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n `${CONFIG.privateApiHost}/private-api/received-rc/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch incoming RC: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { ReceivedVestingShare } from \"../types/received-vesting-share\";\n\nexport function getReceivedVestingSharesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"received-vesting-shares\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch received vesting shares: ${response.status}`);\n }\n\n const data = (await response.json()) as { list: ReceivedVestingShare[] };\n return data.list;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { RecurrentTransfer } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get recurrent transfers for an account\n *\n * @param username - The account username\n */\nexport function getRecurrentTransfersQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"wallet\", \"recurrent-transfers\", username],\n queryFn: () =>\n callRPC(\"condenser_api.find_recurrent_transfers\", [\n username,\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { ConfigManager } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\ntype PortfolioLayer = \"points\" | \"hive\" | \"chain\" | \"engine\";\n\ninterface TokenAction {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface PortfolioWalletItem {\n name: string;\n symbol: string;\n layer: PortfolioLayer;\n balance: number;\n fiatRate: number;\n currency: string;\n precision: number;\n address?: string;\n error?: string;\n pendingRewards?: number;\n pendingRewardsFiat?: number;\n liquid?: number;\n liquidFiat?: number;\n savings?: number;\n savingsFiat?: number;\n staked?: number;\n stakedFiat?: number;\n iconUrl?: string;\n actions?: TokenAction[];\n extraData?: Array<{ dataKey: string; value: any }>;\n apr?: number;\n}\n\nexport interface PortfolioResponse {\n username: string;\n currency?: string;\n wallets: PortfolioWalletItem[];\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const direct = Number.parseFloat(trimmed);\n if (Number.isFinite(direct)) {\n return direct;\n }\n\n const sanitized = trimmed.replace(/,/g, \"\");\n const match = sanitized.match(/[-+]?\\d+(?:\\.\\d+)?/);\n if (match) {\n const parsed = Number.parseFloat(match[0]);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseToken(rawToken: unknown): PortfolioWalletItem | undefined {\n if (!rawToken || typeof rawToken !== \"object\") {\n return undefined;\n }\n\n const token = rawToken as Record;\n\n // Portfolio v2 returns well-defined PortfolioItem structure\n return {\n name: normalizeString(token.name) ?? \"\",\n symbol: normalizeString(token.symbol) ?? \"\",\n layer: (normalizeString(token.layer) ?? \"hive\") as PortfolioLayer,\n balance: normalizeNumber(token.balance) ?? 0,\n fiatRate: normalizeNumber(token.fiatRate) ?? 0,\n currency: normalizeString(token.currency) ?? \"usd\",\n precision: normalizeNumber(token.precision) ?? 3,\n address: normalizeString(token.address),\n error: normalizeString(token.error),\n pendingRewards: normalizeNumber(token.pendingRewards),\n pendingRewardsFiat: normalizeNumber(token.pendingRewardsFiat),\n liquid: normalizeNumber(token.liquid),\n liquidFiat: normalizeNumber(token.liquidFiat),\n savings: normalizeNumber(token.savings),\n savingsFiat: normalizeNumber(token.savingsFiat),\n staked: normalizeNumber(token.staked),\n stakedFiat: normalizeNumber(token.stakedFiat),\n iconUrl: normalizeString(token.iconUrl),\n actions: (token.actions ?? []) as TokenAction[],\n extraData: (token.extraData ?? []) as Array<{ dataKey: string; value: any }>,\n apr: normalizeNumber(token.apr),\n };\n}\n\nfunction extractTokens(payload: unknown): unknown[] {\n if (!payload || typeof payload !== \"object\") {\n return [];\n }\n\n const containers = [payload];\n const record = payload as Record;\n if (record.data && typeof record.data === \"object\") {\n containers.push(record.data as Record);\n }\n if (record.result && typeof record.result === \"object\") {\n containers.push(record.result as Record);\n }\n if (record.portfolio && typeof record.portfolio === \"object\") {\n containers.push(record.portfolio as Record);\n }\n\n for (const container of containers) {\n if (Array.isArray(container)) {\n return container;\n }\n\n if (container && typeof container === \"object\") {\n for (const key of [\n \"wallets\",\n \"tokens\",\n \"assets\",\n \"items\",\n \"portfolio\",\n \"balances\",\n ]) {\n const value = (container as Record)[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n }\n\n return [];\n}\n\nfunction resolveUsername(payload: unknown): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n\n const record = payload as Record;\n return (\n normalizeString(record.username) ??\n normalizeString(record.name) ??\n normalizeString(record.account)\n );\n}\n\n/**\n * Get portfolio query options for fetching user's wallet balances across all layers\n * @param username - Hive username\n * @param currency - Fiat currency code (default: \"usd\")\n * @param onlyEnabled - Only return enabled tokens (default: true)\n * @returns TanStack Query options for portfolio data\n */\nexport function getPortfolioQueryOptions(\n username: string,\n currency: string = \"usd\",\n onlyEnabled: boolean = true\n) {\n return queryOptions({\n queryKey: [\n \"wallet\",\n \"portfolio\",\n \"v2\",\n username,\n onlyEnabled ? \"only-enabled\" : \"all\",\n currency,\n ],\n enabled: Boolean(username),\n staleTime: 60000,\n refetchInterval: 120000,\n queryFn: async (): Promise => {\n if (!username) {\n throw new Error(\"[SDK][Wallet] – username is required\");\n }\n\n const endpoint = `${ConfigManager.getValidatedBaseUrl()}/wallet-api/portfolio-v2`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username, onlyEnabled, currency }),\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][Wallet] – Portfolio request failed (${response.status})`\n );\n }\n\n const payload = (await response.json()) as unknown;\n const tokens = extractTokens(payload)\n .map((item) => parseToken(item))\n .filter((item): item is PortfolioWalletItem => Boolean(item))\n // Backend may still emit removed SPK-layer items; drop them defensively\n .filter((item) => (item.layer as string) !== \"spk\");\n\n if (!tokens.length) {\n throw new Error(\n \"[SDK][Wallet] – Portfolio payload contained no tokens\"\n );\n }\n\n return {\n username: resolveUsername(payload) ?? username,\n currency: normalizeString(\n (payload as Record | undefined)?.fiatCurrency ??\n (payload as Record | undefined)?.currency\n )?.toUpperCase(),\n wallets: tokens,\n };\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHiveAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n\n if (!accountData) {\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: 0,\n } satisfies GeneralAssetInfo;\n }\n\n const liquidBalance = parseAsset(accountData.balance).amount;\n const savingsBalance = parseAsset(accountData.savings_balance).amount;\n\n return {\n name: \"HIVE\",\n title: \"Hive\",\n price: Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0,\n accountBalance: liquidBalance + savingsBalance,\n parts: [\n {\n name: \"current\",\n balance: liquidBalance,\n },\n {\n name: \"savings\",\n balance: savingsBalance,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHbdAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hbd\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n\n const price = 1;\n\n if (!accountData) {\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance: 0,\n };\n }\n\n return {\n name: \"HBD\",\n title: \"Hive Dollar\",\n price,\n accountBalance:\n parseAsset(accountData.hbd_balance).amount +\n parseAsset(accountData?.savings_hbd_balance).amount,\n apr: ((dynamicProps?.hbdInterestRate ?? 0) / 100).toFixed(3),\n parts: [\n {\n name: \"current\",\n balance: parseAsset(accountData.hbd_balance).amount,\n },\n {\n name: \"savings\",\n balance: parseAsset(accountData.savings_hbd_balance).amount,\n },\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import type { DynamicProps } from \"@/modules/core\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\nimport { getAccountFullQueryOptions } from \"@/modules/accounts\";\nimport { getDynamicPropsQueryOptions, getQueryClient } from \"@/modules/core\";\nimport type { FullAccount } from \"@/modules/accounts\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { isEmptyDate, parseAsset, vestsToHp } from \"@/modules/core/utils\";\n\nfunction getAPR(dynamicProps: DynamicProps) {\n const initialInflationRate = 9.5;\n const initialBlock = 7000000;\n const decreaseRate = 250000;\n const decreasePercentPerIncrement = 0.01;\n\n const headBlock = dynamicProps.headBlock;\n const deltaBlocks = headBlock - initialBlock;\n const decreaseIncrements = deltaBlocks / decreaseRate;\n\n let currentInflationRate =\n initialInflationRate - decreaseIncrements * decreasePercentPerIncrement;\n\n if (currentInflationRate < 0.95) {\n currentInflationRate = 0.95;\n }\n\n const vestingRewardPercent = dynamicProps.vestingRewardPercent / 10000;\n const virtualSupply = dynamicProps.virtualSupply;\n const totalVestingFunds = dynamicProps.totalVestingFund;\n\n return (\n (virtualSupply * currentInflationRate * vestingRewardPercent) /\n totalVestingFunds\n ).toFixed(3);\n}\n\nexport function getHivePowerAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getDynamicPropsQueryOptions());\n await getQueryClient().prefetchQuery(\n getAccountFullQueryOptions(username)\n );\n\n const dynamicProps = getQueryClient().getQueryData(\n getDynamicPropsQueryOptions().queryKey\n );\n const accountData = getQueryClient().getQueryData(\n getAccountFullQueryOptions(username).queryKey\n );\n\n if (!dynamicProps || !accountData) {\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price: 0,\n accountBalance: 0,\n };\n }\n\n const marketTicker = (await callRPC(\"condenser_api.get_ticker\", [])\n .catch(() => undefined)) as { latest?: string } | undefined;\n\n const marketPrice = Number.parseFloat(marketTicker?.latest ?? \"\");\n const price = Number.isFinite(marketPrice)\n ? marketPrice\n : dynamicProps.base / dynamicProps.quote;\n\n const vestingShares = parseAsset(accountData.vesting_shares).amount;\n const delegatedVests = parseAsset(\n accountData.delegated_vesting_shares\n ).amount;\n const receivedVests = parseAsset(\n accountData.received_vesting_shares\n ).amount;\n const withdrawRateVests = parseAsset(\n accountData.vesting_withdraw_rate\n ).amount;\n const remainingToWithdrawVests = Math.max(\n (Number(accountData.to_withdraw) - Number(accountData.withdrawn)) /\n 1e6,\n 0\n );\n const nextWithdrawalVests = !isEmptyDate(\n accountData.next_vesting_withdrawal\n )\n ? Math.min(withdrawRateVests, remainingToWithdrawVests)\n : 0;\n\n const hpBalance = +vestsToHp(\n vestingShares,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const outgoingDelegationsHp = +vestsToHp(\n delegatedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const incomingDelegationsHp = +vestsToHp(\n receivedVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const pendingPowerDownHp = +vestsToHp(\n remainingToWithdrawVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const nextPowerDownHp = +vestsToHp(\n nextWithdrawalVests,\n dynamicProps.hivePerMVests\n ).toFixed(3);\n const totalBalance = Math.max(hpBalance - pendingPowerDownHp, 0);\n const availableHp = Math.max(hpBalance - outgoingDelegationsHp, 0);\n\n return {\n name: \"HP\",\n title: \"Hive Power\",\n price,\n accountBalance: +totalBalance.toFixed(3),\n apr: getAPR(dynamicProps),\n parts: [\n {\n name: \"hp_balance\",\n balance: hpBalance,\n },\n {\n name: \"available\",\n balance: +availableHp.toFixed(3),\n },\n {\n name: \"outgoing_delegations\",\n balance: outgoingDelegationsHp,\n },\n {\n name: \"incoming_delegations\",\n balance: incomingDelegationsHp,\n },\n ...(pendingPowerDownHp > 0\n ? [\n {\n name: \"pending_power_down\",\n balance: +pendingPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ...(nextPowerDownHp > 0 && nextPowerDownHp !== pendingPowerDownHp\n ? [\n {\n name: \"next_power_down\",\n balance: +nextPowerDownHp.toFixed(3),\n },\n ]\n : []),\n ],\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { utils } from \"../../../hive-tx\";\nimport { HiveOperationGroup } from \"../types\";\nconst ops = utils.operations;\n\nexport const HIVE_ACCOUNT_OPERATION_GROUPS: Record<\n HiveOperationGroup,\n number[]\n> = {\n transfers: [\n ops.transfer,\n ops.transfer_to_savings,\n ops.transfer_from_savings,\n ops.cancel_transfer_from_savings,\n ops.recurrent_transfer,\n ops.fill_recurrent_transfer,\n ops.escrow_transfer,\n ops.fill_recurrent_transfer,\n ],\n \"market-orders\": [\n ops.fill_convert_request,\n ops.fill_order,\n ops.fill_collateralized_convert_request,\n ops.limit_order_create2,\n ops.limit_order_create,\n ops.limit_order_cancel,\n ],\n interests: [ops.interest],\n \"stake-operations\": [\n ops.return_vesting_delegation,\n ops.withdraw_vesting,\n ops.transfer_to_vesting,\n ops.set_withdraw_vesting_route,\n ops.update_proposal_votes,\n ops.fill_vesting_withdraw,\n ops.account_witness_proxy,\n ops.delegate_vesting_shares,\n ],\n rewards: [\n ops.author_reward,\n ops.curation_reward,\n ops.producer_reward,\n ops.claim_reward_balance,\n ops.comment_benefactor_reward,\n ops.liquidity_reward,\n ops.proposal_pay,\n ],\n \"\": [],\n};\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nexport const HIVE_OPERATION_LIST = Object.keys(\n utils.operations\n) as HiveOperationName[];\n","import { utils } from \"../../../hive-tx\";\nimport type { HiveOperationName } from \"../types\";\n\nconst operationOrders = utils.operations as Record<\n HiveOperationName,\n number\n>;\n\nexport const HIVE_OPERATION_ORDERS = operationOrders;\n\nexport const HIVE_OPERATION_NAME_BY_ID: Record =\n Object.entries(operationOrders).reduce((acc, [name, id]) => {\n acc[id] = name as HiveOperationName;\n return acc;\n }, {} as Record);\n","import { callRPC } from \"../../../hive-tx\";\nimport { utils } from \"../../../hive-tx\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { HIVE_ACCOUNT_OPERATION_GROUPS } from \"../consts\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationFilterKey,\n HiveOperationFilterValue,\n HiveOperationGroup,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nconst operationOrders = utils.operations;\n\nfunction isHiveOperationName(value: string): value is HiveOperationName {\n return Object.prototype.hasOwnProperty.call(operationOrders, value);\n}\n\nexport function resolveHiveOperationFilters(filters: HiveOperationFilter): {\n filterKey: HiveOperationFilterKey;\n filterArgs: any[];\n} {\n const rawValues: HiveOperationFilterValue[] = Array.isArray(filters)\n ? filters\n : [filters];\n\n const hasAll = rawValues.includes(\"\" as HiveOperationGroup);\n\n const uniqueValues = Array.from(\n new Set(\n rawValues.filter(\n (value): value is HiveOperationFilterValue =>\n value !== undefined &&\n value !== null &&\n value !== (\"\" as HiveOperationGroup)\n )\n )\n );\n\n const filterKey: HiveOperationFilterKey =\n hasAll || uniqueValues.length === 0\n ? \"all\"\n : uniqueValues\n .map((value) => value.toString())\n .sort()\n .join(\"|\");\n\n const operationIds = new Set();\n\n if (!hasAll) {\n uniqueValues.forEach((value) => {\n if (value in HIVE_ACCOUNT_OPERATION_GROUPS) {\n HIVE_ACCOUNT_OPERATION_GROUPS[value as HiveOperationGroup].forEach(\n (id) => operationIds.add(id)\n );\n return;\n }\n\n if (isHiveOperationName(value)) {\n operationIds.add(operationOrders[value]);\n }\n });\n }\n\n const filterArgs = makeBitMaskFilter(Array.from(operationIds));\n\n return {\n filterKey,\n filterArgs,\n };\n}\n\nfunction makeBitMaskFilter(allowedOperations: number[]) {\n let low = 0n;\n let high = 0n;\n\n allowedOperations.forEach((operation) => {\n if (operation < 64) {\n low |= 1n << BigInt(operation);\n } else {\n high |= 1n << BigInt(operation - 64);\n }\n });\n\n return [\n low !== 0n ? low.toString() : null,\n high !== 0n ? high.toString() : null,\n ];\n}\n\nexport function getHiveAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterArgs, filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"transactions\", username, limit, filterKey],\n initialData: { pages: [], pageParams: [] },\n initialPageParam: -1,\n getNextPageParam: (lastPage, __) =>\n lastPage ? +(lastPage[lastPage.length - 1]?.num ?? 0) - 1 : -1,\n\n queryFn: async ({ pageParam }) => {\n const response = await callRPC(\n \"condenser_api.get_account_history\",\n [username, pageParam, limit, ...filterArgs]\n );\n\n return response.map(\n (x: any) =>\n ({\n num: x[0],\n type: x[1].op[0],\n timestamp: x[1].timestamp,\n trx_id: x[1].trx_id,\n ...x[1].op[1],\n }) satisfies HiveTransaction\n );\n },\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hivePayout = parseAsset(\n (item as AuthorReward).hive_payout\n );\n return hivePayout.amount > 0;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HIVE\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HIVE\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HIVE\"].includes(asset.symbol);\n\n case \"claim_reward_balance\":\n const rewardHive = parseAsset(\n (item as ClaimRewardBalance).reward_hive\n );\n return rewardHive.amount > 0;\n\n case \"curation_reward\":\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n HiveOperationName,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHbdAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\"assets\", \"hbd\", \"transactions\", username, limit, filterKey],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const hbdPayout = parseAsset(\n (item as AuthorReward).hbd_payout\n );\n return hbdPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardHbd = parseAsset(\n (item as ClaimRewardBalance).reward_hbd\n );\n return rewardHbd.amount > 0;\n\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"transfer_to_vesting\":\n case \"recurrent_transfer\":\n return parseAsset(item.amount).symbol === \"HBD\";\n\n case \"transfer_from_savings\" as HiveOperationName:\n return parseAsset((item as any).amount).symbol === \"HBD\";\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"HBD\"].includes(asset.symbol);\n\n case \"cancel_transfer_from_savings\":\n case \"fill_order\":\n case \"limit_order_create\":\n case \"limit_order_cancel\":\n case \"fill_convert_request\":\n case \"fill_collateralized_convert_request\":\n case \"proposal_pay\":\n case \"interest\":\n return true;\n\n case \"limit_order_create2\" as HiveOperationName:\n return true;\n default:\n return false;\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { parseAsset } from \"@/modules/core/utils\";\nimport type {\n AuthorReward,\n ClaimRewardBalance,\n HiveOperationFilter,\n} from \"../types\";\nimport type { HiveTransaction } from \"../types\";\nimport {\n getHiveAssetTransactionsQueryOptions,\n resolveHiveOperationFilters,\n} from \"./get-hive-asset-transactions-query-options\";\n\nexport function getHivePowerAssetTransactionsQueryOptions(\n username: string | undefined,\n limit = 20,\n filters: HiveOperationFilter = []\n) {\n const { filterKey } = resolveHiveOperationFilters(filters);\n\n const userSelectedOperations = new Set(\n Array.isArray(filters) ? filters : [filters]\n );\n const hasAllFilter =\n userSelectedOperations.has(\"\" as any) || userSelectedOperations.size === 0;\n\n return infiniteQueryOptions({\n ...getHiveAssetTransactionsQueryOptions(username, limit, filters),\n queryKey: [\n \"assets\",\n \"hive-power\",\n \"transactions\",\n username,\n limit,\n filterKey,\n ],\n select: ({ pages, pageParams }) => ({\n pageParams,\n pages: pages.map((page) =>\n page.filter((item) => {\n switch (item.type) {\n case \"author_reward\":\n case \"comment_benefactor_reward\":\n const vestingPayout = parseAsset(\n (item as AuthorReward).vesting_payout\n );\n return vestingPayout.amount > 0;\n\n case \"claim_reward_balance\":\n const rewardVests = parseAsset(\n (item as ClaimRewardBalance).reward_vests\n );\n return rewardVests.amount > 0;\n\n case \"transfer_to_vesting\":\n return true;\n case \"transfer\":\n case \"transfer_to_savings\":\n case \"recurrent_transfer\":\n return [\"VESTS\", \"HP\"].includes(parseAsset(item.amount).symbol);\n\n case \"fill_recurrent_transfer\":\n const asset = parseAsset(item.amount);\n return [\"VESTS\", \"HP\"].includes(asset.symbol);\n\n case \"curation_reward\":\n case \"withdraw_vesting\":\n case \"delegate_vesting_shares\":\n case \"fill_vesting_withdraw\":\n case \"return_vesting_delegation\":\n case \"producer_reward\":\n case \"set_withdraw_vesting_route\":\n return true;\n default:\n return hasAllFilter || userSelectedOperations.has(item.type);\n }\n })\n ),\n }),\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveMarketMetric } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\n\nfunction subtractSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() - seconds * 1000);\n}\n\nexport function getHiveAssetMetricQueryOptions(bucketSeconds = 86_400) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive\", \"metrics\", bucketSeconds],\n queryFn: async ({ pageParam: [startDate, endDate] }) => {\n const apiData: HiveMarketMetric[] = await callRPC(\"condenser_api.get_market_history\", [bucketSeconds, formatDate(startDate), formatDate(endDate)]\n );\n\n return apiData.map(({ hive, non_hive, open }) => ({\n close: non_hive.close / hive.close,\n open: non_hive.open / hive.open,\n low: non_hive.low / hive.low,\n high: non_hive.high / hive.high,\n volume: hive.volume,\n time: new Date(open),\n }));\n },\n initialPageParam: [\n subtractSeconds(new Date(), Math.max(100 * bucketSeconds, 28_800)),\n new Date(),\n ],\n getNextPageParam: (_, __, [prevStartDate]) => [\n subtractSeconds(prevStartDate, Math.max(100 * bucketSeconds, 28_800)),\n subtractSeconds(prevStartDate, bucketSeconds),\n ],\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawRoute } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHiveAssetWithdrawalRoutesQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive\", \"withdrawal-routes\", username],\n queryFn: () =>\n callRPC(\"condenser_api.get_withdraw_routes\", [\n username,\n \"outgoing\",\n ]) as Promise,\n enabled: !!username,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { DelegatedVestingShare } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getHivePowerDelegatesInfiniteQueryOptions(\n username: string,\n limit = 50\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegates\", username],\n enabled: !!username,\n queryFn: () =>\n callRPC(\"condenser_api.get_vesting_delegations\", [\n username,\n \"\",\n limit,\n ]) as Promise,\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { ReceivedVestingShare } from \"../types\";\nimport { parseAsset } from \"@/modules/core/utils\";\n\nexport function getHivePowerDelegatingsQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-power\", \"delegatings\", username],\n queryFn: async () => {\n const response = await fetch(\n CONFIG.privateApiHost + `/private-api/received-vesting/${username}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return (await response.json()).list as ReceivedVestingShare[];\n },\n select: (data) =>\n data.sort(\n (a, b) =>\n parseAsset(b.vesting_shares).amount -\n parseAsset(a.vesting_shares).amount\n ),\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersData } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get the internal HIVE/HBD market order book\n *\n * @param limit - Maximum number of orders to fetch (default: 500)\n */\nexport function getOrderBookQueryOptions(limit = 500) {\n return queryOptions({\n queryKey: [\"market\", \"order-book\", limit],\n queryFn: () =>\n callRPC(\"condenser_api.get_order_book\", [\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market statistics from the blockchain\n */\nexport function getMarketStatisticsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"statistics\"],\n queryFn: () =>\n callRPC(\"condenser_api.get_ticker\", []) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketCandlestickDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get HIVE/HBD market history (candlestick data)\n *\n * @param seconds - Bucket size in seconds\n * @param startDate - Start date for the data\n * @param endDate - End date for the data\n */\nexport function getMarketHistoryQueryOptions(\n seconds: number,\n startDate: Date,\n endDate: Date\n) {\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n return queryOptions({\n queryKey: [\"market\", \"history\", seconds, startDate.getTime(), endDate.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_market_history\", [\n seconds,\n formatDate(startDate),\n formatDate(endDate),\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { HiveHbdStats, MarketCandlestickDataItem, MarketStatistics } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get combined HIVE/HBD statistics including price, 24h change, and volume\n */\nexport function getHiveHbdStatsQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"hive-hbd-stats\"],\n queryFn: async () => {\n // Get current market statistics\n const stats = (await callRPC(\"condenser_api.get_ticker\", [])) as MarketStatistics;\n\n // Get 24h market history\n const now = new Date();\n const oneDayAgo = new Date(now.getTime() - 86400000); // 24 hours ago\n\n const formatDate = (date: Date) => {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n };\n\n const dayChange = (await callRPC(\"condenser_api.get_market_history\", [86400, formatDate(oneDayAgo), formatDate(now)]\n )) as MarketCandlestickDataItem[];\n\n // Calculate stats\n const result: HiveHbdStats = {\n price: +stats.latest,\n close: dayChange[0] ? dayChange[0].non_hive.open / dayChange[0].hive.open : 0,\n high: dayChange[0] ? dayChange[0].non_hive.high / dayChange[0].hive.high : 0,\n low: dayChange[0] ? dayChange[0].non_hive.low / dayChange[0].hive.low : 0,\n percent: dayChange[0]\n ? 100 - ((dayChange[0].non_hive.open / dayChange[0].hive.open) * 100) / +stats.latest\n : 0,\n totalFromAsset: stats.hive_volume.split(\" \")[0],\n totalToAsset: stats.hbd_volume.split(\" \")[0],\n };\n\n return result;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { MarketData } from \"../types\";\nimport { getBoundFetch } from \"@/modules/core\";\n\n/**\n * Get market chart data from CoinGecko API\n *\n * @param coin - Coin ID (e.g., \"hive\", \"bitcoin\")\n * @param vsCurrency - Currency to compare against (e.g., \"usd\", \"eur\")\n * @param fromTs - From timestamp (Unix timestamp in seconds)\n * @param toTs - To timestamp (Unix timestamp in seconds)\n */\nexport function getMarketDataQueryOptions(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n) {\n return queryOptions({\n queryKey: [\"market\", \"data\", coin, vsCurrency, fromTs, toTs],\n queryFn: async ({ signal }) => {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n\n const response = await fetchApi(url, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch market data: ${response.status}`);\n }\n\n return response.json() as Promise;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { OrdersDataItem } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nfunction formatDate(date: Date) {\n return date.toISOString().replace(/\\.\\d{3}Z$/, \"\");\n}\n\nexport function getTradeHistoryQueryOptions(\n limit = 1000,\n startDate?: Date,\n endDate?: Date\n) {\n const end = endDate ?? new Date();\n const start =\n startDate ?? new Date(end.getTime() - 10 * 60 * 60 * 1000);\n\n return queryOptions({\n queryKey: [\"market\", \"trade-history\", limit, start.getTime(), end.getTime()],\n queryFn: () =>\n callRPC(\"condenser_api.get_trade_history\", [\n formatDate(start),\n formatDate(end),\n limit,\n ]) as Promise,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface FeedHistoryItem {\n id: number;\n current_median_history: {\n base: string;\n quote: string;\n };\n market_median_history: {\n base: string;\n quote: string;\n };\n current_min_history: {\n base: string;\n quote: string;\n };\n current_max_history: {\n base: string;\n quote: string;\n };\n price_history: Array<{\n base: string;\n quote: string;\n }>;\n}\n\n/**\n * Get feed history from the blockchain\n * Returns price feed history including median prices\n */\nexport function getFeedHistoryQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"feed-history\"],\n queryFn: async () => {\n try {\n const feedHistory = await callRPC(\"condenser_api.get_feed_history\", []);\n return feedHistory as FeedHistoryItem;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport interface MedianHistoryPrice {\n base: string;\n quote: string;\n}\n\n/**\n * Get current median history price from the blockchain\n * Returns the current median price for HIVE/HBD conversion\n */\nexport function getCurrentMedianHistoryPriceQueryOptions() {\n return queryOptions({\n queryKey: [\"market\", \"current-median-history-price\"],\n queryFn: async () => {\n try {\n const price = await callRPC(\"condenser_api.get_current_median_history_price\", []);\n return price as MedianHistoryPrice;\n } catch (error) {\n throw error;\n }\n },\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCreateOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCreatePayload {\n amountToSell: string;\n minToReceive: string;\n fillOrKill: boolean;\n expiration: string;\n orderId: number;\n}\n\nexport function useLimitOrderCreate(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-create\"],\n username,\n (payload) => [\n buildLimitOrderCreateOp(\n username!,\n payload.amountToSell,\n payload.minToReceive,\n payload.fillOrKill,\n payload.expiration,\n payload.orderId\n )\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildLimitOrderCancelOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface LimitOrderCancelPayload {\n orderId: number;\n}\n\nexport function useLimitOrderCancel(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"market\", \"limit-order-cancel\"],\n username,\n ({ orderId }) => [\n buildLimitOrderCancelOp(username!, orderId)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.wallet.openOrders(username!),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { MarketData } from \"./types\";\nimport { CurrencyRates } from \"@/modules/private-api/types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse(response: Response): Promise {\n const data = (await response.json()) as T;\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n return data;\n}\n\nexport async function getMarketData(\n coin: string,\n vsCurrency: string,\n fromTs: string,\n toTs: string\n): Promise {\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/coins/${coin}/market_chart/range?vs_currency=${vsCurrency}&from=${fromTs}&to=${toTs}`;\n const response = await fetchApi(url);\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRate(cur: string): Promise {\n if (cur === \"hbd\") {\n return 1;\n }\n\n const fetchApi = getBoundFetch();\n const url = `https://api.coingecko.com/api/v3/simple/price?ids=hive_dollar&vs_currencies=${cur}`;\n const response = await fetchApi(url);\n const data = await parseJsonResponse<{ hive_dollar: Record }>(response);\n return data.hive_dollar[cur];\n}\n\nexport async function getCurrencyTokenRate(currency: string, token: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost +\n `/private-api/market-data/${currency === \"hbd\" ? \"usd\" : currency}/${token}`\n );\n\n return parseJsonResponse(response);\n}\n\nexport async function getCurrencyRates(): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/market-data/latest\");\n return parseJsonResponse(response);\n}\n\nexport async function getHivePrice(): Promise<{ hive: { usd: number } }> {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n \"https://api.coingecko.com/api/v3/simple/price?ids=hive&vs_currencies=usd\"\n );\n return parseJsonResponse<{ hive: { usd: number } }>(response);\n}\n","import { ConfigManager, getBoundFetch } from \"@/modules/core\";\nimport type { HiveEngineOpenOrder } from \"./types\";\n\ntype EngineOrderBookEntry = {\n txId: string;\n timestamp: number;\n account: string;\n symbol: string;\n quantity: string;\n price: string;\n tokensLocked?: string;\n};\n\nconst ENGINE_RPC_HEADERS = { \"Content-type\": \"application/json\" };\n\nasync function engineRpc(payload: Record): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(`${baseUrl}/private-api/engine-api`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: ENGINE_RPC_HEADERS,\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – request failed with ${response.status}`\n );\n }\n\n const data = (await response.json()) as { result: T };\n return data.result;\n}\n\nasync function engineRpcSafe(\n payload: Record,\n fallback: T\n): Promise {\n try {\n return await engineRpc(payload);\n } catch (e) {\n return fallback;\n }\n}\n\nexport async function getHiveEngineOrderBook(\n symbol: string,\n limit: number = 50\n): Promise<{ buy: T[]; sell: T[] }> {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buy, sell] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"price\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"price\", descending: false }],\n },\n },\n []\n ),\n ]);\n\n const sortByPriceDesc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return right - left;\n });\n const sortByPriceAsc = (items: T[]) =>\n items.sort((a, b) => {\n const left = Number((a as EngineOrderBookEntry).price ?? 0);\n const right = Number((b as EngineOrderBookEntry).price ?? 0);\n return left - right;\n });\n\n return {\n buy: sortByPriceDesc(buy),\n sell: sortByPriceAsc(sell),\n };\n}\n\nexport async function getHiveEngineTradeHistory>(\n symbol: string,\n limit: number = 50\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"tradesHistory\",\n query: { symbol },\n limit,\n offset: 0,\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineOpenOrders(\n account: string,\n symbol: string,\n limit: number = 100\n): Promise {\n const baseParams = {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n query: { symbol, account },\n limit,\n offset: 0,\n },\n id: 1,\n };\n\n const [buyRaw, sellRaw] = await Promise.all([\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"buyBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n engineRpcSafe(\n {\n ...baseParams,\n params: {\n ...baseParams.params,\n table: \"sellBook\",\n indexes: [{ index: \"timestamp\", descending: true }],\n },\n },\n []\n ),\n ]);\n\n const formatTotal = (quantity: string, price: string) =>\n (Number(quantity || 0) * Number(price || 0)).toFixed(8);\n\n const buy: HiveEngineOpenOrder[] = buyRaw.map((order) => ({\n id: order.txId,\n type: \"buy\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: order.tokensLocked ?? formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n const sell: HiveEngineOpenOrder[] = sellRaw.map((order) => ({\n id: order.txId,\n type: \"sell\",\n account: order.account,\n symbol: order.symbol,\n quantity: order.quantity,\n price: order.price,\n total: formatTotal(order.quantity, order.price),\n timestamp: Number(order.timestamp ?? 0),\n }));\n\n return [...buy, ...sell].sort((a, b) => b.timestamp - a.timestamp) as T[];\n}\n\n/**\n * Market metrics, optionally narrowed to one symbol or to a list of them.\n *\n * An unfiltered call is served from a single page – the node caps `find` at 1000 rows\n * while Hive engine has far more traded tokens than that – so callers that only care\n * about specific symbols must pass them. Scanning the unfiltered page for a symbol\n * silently reports \"no market\" for everything outside it.\n */\nexport async function getHiveEngineMetrics>(\n symbol?: string | string[],\n account?: string\n): Promise {\n if (Array.isArray(symbol) && symbol.length === 0) {\n return [];\n }\n\n const symbolQuery = Array.isArray(symbol)\n ? { symbol: { $in: symbol } }\n : symbol\n ? { symbol }\n : {};\n\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"market\",\n table: \"metrics\",\n query: {\n ...symbolQuery,\n ...(account ? { account } : {}),\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMarket>(\n account?: string,\n symbol?: string | string[]\n): Promise {\n return getHiveEngineMetrics(symbol, account);\n}\n\nexport async function getHiveEngineTokensBalances>(\n username: string\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"balances\",\n query: {\n account: username,\n },\n },\n id: 1,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokensMetadata>(\n tokens: string[]\n): Promise {\n return engineRpcSafe(\n {\n jsonrpc: \"2.0\",\n method: \"find\",\n params: {\n contract: \"tokens\",\n table: \"tokens\",\n query: {\n symbol: { $in: tokens },\n },\n },\n id: 2,\n },\n []\n );\n}\n\nexport async function getHiveEngineTokenTransactions>(\n username: string,\n symbol: string,\n limit: number,\n offset: number\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-account-history\", baseUrl);\n url.searchParams.set(\"account\", username);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"limit\", limit.toString());\n url.searchParams.set(\"offset\", offset.toString());\n\n const response = await fetchApi(url.toString(), {\n method: \"GET\",\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – account history failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineTokenMetrics>(\n symbol: string,\n interval = \"daily\"\n): Promise {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const url = new URL(\"/private-api/engine-chart-api\", baseUrl);\n url.searchParams.set(\"symbol\", symbol);\n url.searchParams.set(\"interval\", interval);\n\n const response = await fetchApi(url.toString(), {\n headers: { \"Content-type\": \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – chart failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T[];\n}\n\nexport async function getHiveEngineUnclaimedRewards>(\n username: string\n): Promise> {\n const fetchApi = getBoundFetch();\n const baseUrl = ConfigManager.getValidatedBaseUrl();\n const response = await fetchApi(\n `${baseUrl}/private-api/engine-reward-api/${username}?hive=1`\n );\n\n if (!response.ok) {\n throw new Error(\n `[SDK][HiveEngine] – rewards failed with ${response.status}`\n );\n }\n\n return (await response.json()) as Record;\n}\n","import { getHiveEngineTokensBalances } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenBalance } from \"../types\";\n\nexport function getHiveEngineTokensBalancesQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"balances\", username] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensBalances(username);\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMarketResponse } from \"../types\";\nimport { getHiveEngineTokensMarket } from \"../requests\";\n\nexport function getHiveEngineTokensMarketQueryOptions() {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"markets\"],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMarket();\n },\n });\n}\n","import { getHiveEngineTokensMetadata } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenMetadataResponse } from \"../types\";\n\nexport function getHiveEngineTokensMetadataQueryOptions(tokens: string[]) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"metadata-list\", tokens] as const,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokensMetadata(tokens);\n },\n });\n}\n","import { getHiveEngineTokenTransactions } from \"../requests\";\nimport { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTransaction } from \"../types\";\n\nexport function getHiveEngineTokenTransactionsQueryOptions(\n username: string | undefined,\n symbol: string,\n limit = 20\n) {\n return infiniteQueryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"transactions\", username],\n enabled: !!symbol && !!username,\n initialPageParam: 0,\n queryFn: async ({ pageParam }) => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n return getHiveEngineTokenTransactions(\n username,\n symbol,\n limit,\n pageParam as number\n );\n },\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n (lastPage?.length ?? 0) === limit ? (lastPageParam as number) + limit : undefined,\n getPreviousPageParam: (_firstPage, _allPages, firstPageParam) =>\n (firstPageParam as number) > 0 ? (firstPageParam as number) - limit : undefined,\n });\n}\n","import { getHiveEngineTokenMetrics } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineMetric } from \"../types\";\n\nexport function getHiveEngineTokensMetricsQueryOptions(\n symbol: string,\n interval = \"daily\"\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n return getHiveEngineTokenMetrics(symbol, interval);\n },\n });\n}\n","import { getHiveEngineUnclaimedRewards } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenStatus } from \"../types\";\n\nexport function getHiveEngineUnclaimedRewardsQueryOptions(\n username: string | undefined\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"unclaimed\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n enabled: !!username,\n queryFn: async () => {\n try {\n const data = await getHiveEngineUnclaimedRewards(\n username as string\n );\n return Object.values(data).filter(\n ({ pending_token }) => pending_token > 0\n );\n } catch (e) {\n return [];\n }\n },\n });\n}\n","import { getHiveEngineTokensMarket } from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { HiveEngineTokenInfo } from \"../types\";\n\nexport function getAllHiveEngineTokensQueryOptions(\n account?: string,\n symbol?: string | string[]\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", \"all-tokens\", account, symbol] as const,\n queryFn: async () => {\n return getHiveEngineTokensMarket(account, symbol);\n },\n });\n}\n","interface Options {\n fractionDigits?: number;\n prefix?: string;\n suffix?: string;\n}\n\nexport function formattedNumber(\n value: number | string,\n options: Options | undefined = undefined\n) {\n let opts: Options = {\n fractionDigits: 3,\n prefix: \"\",\n suffix: \"\",\n };\n\n if (options) {\n opts = { ...opts, ...options };\n }\n\n const { fractionDigits, prefix, suffix } = opts;\n\n let out = \"\";\n\n if (prefix) out += prefix + \" \";\n // turn too small values to zero. Bug: https://github.com/adamwdraper/Numeral-js/issues/563\n const av = Math.abs(parseFloat(value.toString())) < 0.0001 ? 0 : value;\n const num = typeof av === \"string\" ? parseFloat(av) : av;\n out += num.toLocaleString(\"en-US\", {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n useGrouping: true,\n });\n if (suffix) out += \" \" + suffix;\n\n return out;\n}\n","import { formattedNumber } from \"./formatted-number\";\n\ninterface HiveEngineTokenProps {\n symbol: string;\n name: string;\n icon: string;\n precision: number;\n stakingEnabled: boolean;\n delegationEnabled: boolean;\n balance: string;\n stake: string;\n delegationsIn: string;\n delegationsOut: string;\n usdValue: number;\n}\n\nexport class HiveEngineToken {\n symbol: string;\n name?: string;\n icon?: string;\n\n precision?: number;\n stakingEnabled?: boolean;\n delegationEnabled?: boolean;\n balance: number;\n stake: number;\n stakedBalance: number;\n delegationsIn: number;\n delegationsOut: number;\n usdValue: number;\n\n constructor(props: HiveEngineTokenProps) {\n this.symbol = props.symbol;\n this.name = props.name || \"\";\n this.icon = props.icon || \"\";\n\n this.precision = props.precision || 0;\n this.stakingEnabled = props.stakingEnabled || false;\n this.delegationEnabled = props.delegationEnabled || false;\n this.balance = parseFloat(props.balance) || 0;\n this.stake = parseFloat(props.stake) || 0;\n this.delegationsIn = parseFloat(props.delegationsIn) || 0;\n this.delegationsOut = parseFloat(props.delegationsOut) || 0;\n this.stakedBalance =\n this.stake + this.delegationsIn - this.delegationsOut;\n this.usdValue = props.usdValue;\n }\n\n hasDelegations = (): boolean => {\n if (!this.delegationEnabled) {\n return false;\n }\n\n return this.delegationsIn > 0 && this.delegationsOut > 0;\n };\n\n delegations = (): string => {\n if (!this.hasDelegations()) {\n return \"\";\n }\n\n return `(${formattedNumber(this.stake, {\n fractionDigits: this.precision,\n })} + ${formattedNumber(this.delegationsIn, {\n fractionDigits: this.precision,\n })} - ${formattedNumber(this.delegationsOut, {\n fractionDigits: this.precision,\n })})`;\n };\n\n staked = (): string => {\n if (!this.stakingEnabled) {\n return \"-\";\n }\n\n if (this.stakedBalance < 0.0001) {\n return this.stakedBalance.toString();\n }\n\n return formattedNumber(this.stakedBalance, {\n fractionDigits: this.precision,\n });\n };\n\n balanced = (): string => {\n if (this.balance < 0.0001) {\n return this.balance.toString();\n }\n\n return formattedNumber(this.balance, { fractionDigits: this.precision });\n };\n}\n","import {\n getHiveEngineTokensBalances,\n getHiveEngineTokensMarket,\n getHiveEngineTokensMetadata,\n} from \"../requests\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type {\n HiveEngineTokenBalance,\n Token,\n TokenMetadata,\n HiveEngineTokenInfo,\n} from \"../types\";\nimport { HiveEngineToken } from \"../utils\";\n\ninterface DynamicProps {\n base: number;\n quote: number;\n}\n\nexport function getHiveEngineBalancesWithUsdQueryOptions(\n account: string,\n dynamicProps?: DynamicProps,\n allTokens?: HiveEngineTokenInfo[]\n) {\n return queryOptions({\n queryKey: [\n \"assets\",\n \"hive-engine\",\n \"balances-with-usd\",\n account,\n dynamicProps,\n allTokens,\n ] as const,\n queryFn: async () => {\n if (!account) {\n throw new Error(\"[HiveEngine] No account in a balances query\");\n }\n\n const balances = await getHiveEngineTokensBalances(account);\n\n const tokens = await getHiveEngineTokensMetadata(\n balances.map((t) => t.symbol)\n );\n\n const pricePerHive = dynamicProps\n ? dynamicProps.base / dynamicProps.quote\n : 0;\n const providedMetrics: ReadonlyArray = Array.isArray(\n allTokens\n )\n ? allTokens\n : [];\n\n // Whatever the caller passed comes from an unfiltered metrics call, which the node\n // caps at 1000 rows – held tokens outside that page have no price and used to be\n // valued at zero, understating the wallet. Ask for the missing ones by symbol.\n const unpricedSymbols = balances\n .map((balance) => balance.symbol)\n .filter(\n (symbol) =>\n symbol !== \"SWAP.HIVE\" &&\n !providedMetrics.some((metric) => metric.symbol === symbol)\n );\n\n const metrics: ReadonlyArray = [\n ...providedMetrics,\n ...(unpricedSymbols.length\n ? await getHiveEngineTokensMarket(\n undefined,\n unpricedSymbols\n )\n : []),\n ];\n\n return balances.map((balance) => {\n const token = tokens.find((t) => t.symbol === balance.symbol);\n let tokenMetadata: TokenMetadata | undefined;\n\n if (token?.metadata) {\n try {\n tokenMetadata = JSON.parse(token.metadata) as TokenMetadata;\n } catch {\n tokenMetadata = undefined;\n }\n }\n\n const metric = metrics.find((m) => m.symbol === balance.symbol);\n const lastPrice = Number(metric?.lastPrice ?? \"0\");\n const balanceAmount = Number(balance.balance);\n\n const usdValue =\n balance.symbol === \"SWAP.HIVE\"\n ? pricePerHive * balanceAmount\n : lastPrice === 0\n ? 0\n : Number(\n (lastPrice * pricePerHive * balanceAmount).toFixed(10)\n );\n\n return new HiveEngineToken({\n symbol: balance.symbol,\n name: token?.name ?? balance.symbol,\n icon: tokenMetadata?.icon ?? \"\",\n precision: token?.precision ?? 0,\n stakingEnabled: token?.stakingEnabled ?? false,\n delegationEnabled: token?.delegationEnabled ?? false,\n balance: balance.balance,\n stake: balance.stake,\n delegationsIn: balance.delegationsIn,\n delegationsOut: balance.delegationsOut,\n usdValue,\n });\n });\n },\n enabled: !!account,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getHiveEngineTokensMetadataQueryOptions } from \"./get-hive-engine-tokens-metadata-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"./get-hive-engine-tokens-balances-query-options\";\nimport { getAllHiveEngineTokensQueryOptions } from \"./get-all-hive-engine-tokens-query-options\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"@/modules/wallet/queries/get-hive-asset-general-info-query-options\";\n\nexport function getHiveEngineTokenGeneralInfoQueryOptions(\n username?: string,\n symbol?: string\n) {\n return queryOptions({\n queryKey: [\"assets\", \"hive-engine\", symbol, \"general-info\", username],\n enabled: !!symbol && !!username,\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n if (!symbol || !username) {\n throw new Error(\n \"[SDK][HiveEngine] – token or username missed\"\n );\n }\n const queryClient = getQueryClient();\n const hiveQuery = getHiveAssetGeneralInfoQueryOptions(username);\n await queryClient.prefetchQuery(hiveQuery);\n const hiveData = queryClient.getQueryData(\n hiveQuery.queryKey\n );\n\n const metadataList = await queryClient.ensureQueryData(\n getHiveEngineTokensMetadataQueryOptions([symbol])\n );\n\n const balanceList = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n // Scoped to this symbol: the unfiltered metrics call is capped at 1000 rows, so a\n // token outside that page reported no market and rendered a zero price.\n const marketList = await queryClient.ensureQueryData(\n getAllHiveEngineTokensQueryOptions(undefined, symbol)\n );\n\n const metadata = metadataList?.find((i) => i.symbol === symbol);\n const balance = balanceList?.find((i) => i.symbol === symbol);\n const market = marketList?.find((i) => i.symbol === symbol);\n\n const lastPrice = +(market?.lastPrice ?? \"0\");\n\n const liquidBalance = parseFloat(balance?.balance ?? \"0\");\n const stakedBalance = parseFloat(balance?.stake ?? \"0\");\n const unstakingBalance = parseFloat(balance?.pendingUnstake ?? \"0\");\n\n const parts: GeneralAssetInfo[\"parts\"] = [\n { name: \"liquid\", balance: liquidBalance },\n { name: \"staked\", balance: stakedBalance },\n ];\n\n if (unstakingBalance > 0) {\n parts.push({ name: \"unstaking\", balance: unstakingBalance });\n }\n\n return {\n name: symbol,\n title: metadata?.name ?? \"\",\n price: lastPrice === 0 ? 0 : Number(lastPrice * (hiveData?.price ?? 0)),\n accountBalance: liquidBalance + stakedBalance,\n layer: \"ENGINE\",\n parts,\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\nimport { PointTransaction } from \"../types/point-transaction\";\n\ninterface PointsResponse {\n points: string;\n unclaimed_points: string;\n}\n\nexport function getPointsQueryOptions(username?: string, filter = 0) {\n return queryOptions({\n queryKey: [\"points\", username, filter],\n queryFn: async () => {\n if (!username) {\n throw new Error(\"Get points query – username wasn't provided\");\n }\n\n const name = username.replace(\"@\", \"\");\n\n // Get points\n const pointsResponse = await fetch(CONFIG.privateApiHost + \"/private-api/points\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name }),\n });\n\n if (!pointsResponse.ok) {\n throw new Error(`Failed to fetch points: ${pointsResponse.status}`);\n }\n\n const points = (await pointsResponse.json()) as PointsResponse;\n\n // Get transactions\n const transactionsResponse = await fetch(\n CONFIG.privateApiHost + \"/private-api/point-list\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ username: name, type: filter }),\n }\n );\n\n if (!transactionsResponse.ok) {\n throw new Error(`Failed to fetch point transactions: ${transactionsResponse.status}`);\n }\n\n const transactions = (await transactionsResponse.json()) as PointTransaction[];\n\n return {\n points: points.points,\n uPoints: points.unclaimed_points,\n transactions,\n } as const;\n },\n staleTime: 30000,\n refetchOnMount: true,\n enabled: !!username,\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"@/modules/wallet/types\";\nimport { getPointsQueryOptions } from \"./get-points-query-options\";\n\nexport function getPointsAssetGeneralInfoQueryOptions(username: string) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"general-info\", username],\n staleTime: 60000,\n refetchInterval: 90000,\n queryFn: async () => {\n await getQueryClient().prefetchQuery(getPointsQueryOptions(username));\n const data = getQueryClient().getQueryData(\n getPointsQueryOptions(username).queryKey\n );\n return {\n name: \"POINTS\",\n title: \"Ecency Points\",\n price: 0.002,\n accountBalance: +(data?.points ?? 0),\n } satisfies GeneralAssetInfo;\n },\n });\n}\n","import { CONFIG } from \"@/modules/core/config\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { PointTransaction } from \"../types\";\nimport { PointTransactionType } from \"../types\";\nimport type { GeneralAssetTransaction } from \"@/modules/wallet/types\";\n\nexport function getPointsAssetTransactionsQueryOptions(\n username: string | undefined,\n type?: PointTransactionType\n) {\n return queryOptions({\n queryKey: [\"assets\", \"points\", \"transactions\", username, type],\n queryFn: async () => {\n const response = await fetch(\n `${CONFIG.privateApiHost}/private-api/point-list`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n username,\n type: type ?? 0,\n }),\n }\n );\n const data = (await response.json()) as PointTransaction[];\n return data.map(({ created, type, amount, id, sender, receiver, memo }) => ({\n created: new Date(created),\n type,\n results: [\n {\n amount: parseFloat(amount),\n asset: \"POINTS\",\n },\n ],\n id,\n from: sender ?? undefined,\n to: receiver ?? undefined,\n memo: memo ?? undefined,\n })) satisfies GeneralAssetTransaction[];\n },\n });\n}\n","import { getQueryClient } from \"@/modules/core\";\nimport { getCurrencyRate } from \"@/modules/market\";\nimport { queryOptions } from \"@tanstack/react-query\";\nimport type { GeneralAssetInfo } from \"../types\";\nimport { getHiveAssetGeneralInfoQueryOptions } from \"./get-hive-asset-general-info-query-options\";\nimport { getHbdAssetGeneralInfoQueryOptions } from \"./get-hbd-asset-general-info-query-options\";\nimport { getHivePowerAssetGeneralInfoQueryOptions } from \"./get-hive-power-asset-general-info-query-options\";\nimport { getHiveEngineTokensBalancesQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getHiveEngineTokenGeneralInfoQueryOptions } from \"@/modules/hive-engine/queries\";\nimport { getPointsAssetGeneralInfoQueryOptions } from \"@/modules/points/queries\";\nimport {\n getPortfolioQueryOptions,\n type PortfolioResponse,\n type PortfolioWalletItem,\n} from \"./get-portfolio-query-options\";\n\ninterface Options {\n refetch?: boolean;\n currency?: string;\n}\n\nexport function getAccountWalletAssetInfoQueryOptions(\n username: string,\n asset: string,\n options: Options = { refetch: false }\n) {\n const queryClient = getQueryClient();\n const currency = options.currency ?? \"usd\";\n\n const fetchQuery = async (qo: any) => {\n if (options.refetch) {\n await queryClient.fetchQuery(qo);\n } else {\n await queryClient.prefetchQuery(qo);\n }\n return queryClient.getQueryData(qo.queryKey);\n };\n\n const convertPriceToUserCurrency = async (\n assetInfo: GeneralAssetInfo | undefined\n ): Promise => {\n if (!assetInfo || currency === \"usd\") {\n return assetInfo;\n }\n\n try {\n const conversionRate = await getCurrencyRate(currency);\n return {\n ...assetInfo,\n price: assetInfo.price * conversionRate,\n };\n } catch (error) {\n console.warn(`Failed to convert price from USD to ${currency}:`, error);\n return assetInfo;\n }\n };\n\n const portfolioQuery = getPortfolioQueryOptions(username, currency, true);\n\n const getPortfolioAssetInfo = async () => {\n try {\n const portfolio: PortfolioResponse = await queryClient.fetchQuery(portfolioQuery);\n const assetItem = portfolio.wallets.find(\n (item: PortfolioWalletItem) =>\n item.symbol.toUpperCase() === asset.toUpperCase()\n );\n\n if (!assetItem) return undefined;\n\n const parts: Array<{ name: string; balance: number }> = [];\n\n if (assetItem.liquid !== undefined && assetItem.liquid !== null) {\n parts.push({ name: \"liquid\", balance: assetItem.liquid });\n }\n\n if (assetItem.staked !== undefined && assetItem.staked !== null && assetItem.staked > 0) {\n parts.push({ name: \"staked\", balance: assetItem.staked });\n }\n\n if (assetItem.savings !== undefined && assetItem.savings !== null && assetItem.savings > 0) {\n parts.push({ name: \"savings\", balance: assetItem.savings });\n }\n\n if (assetItem.extraData && Array.isArray(assetItem.extraData)) {\n for (const extraItem of assetItem.extraData) {\n if (!extraItem || typeof extraItem !== \"object\") continue;\n\n const dataKey = extraItem.dataKey;\n const value = extraItem.value;\n\n if (typeof value === \"string\") {\n const cleanValue = value.replace(/,/g, \"\");\n const match = cleanValue.match(/[+-]?\\s*(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const numValue = Math.abs(Number.parseFloat(match[1]));\n\n if (dataKey === \"delegated_hive_power\") {\n parts.push({ name: \"outgoing_delegations\", balance: numValue });\n } else if (dataKey === \"received_hive_power\") {\n parts.push({ name: \"incoming_delegations\", balance: numValue });\n } else if (dataKey === \"powering_down_hive_power\") {\n parts.push({ name: \"pending_power_down\", balance: numValue });\n }\n }\n }\n }\n }\n\n return {\n name: assetItem.symbol,\n title: assetItem.name,\n price: assetItem.fiatRate,\n accountBalance: assetItem.balance,\n apr: assetItem.apr?.toString(),\n layer: assetItem.layer,\n pendingRewards: assetItem.pendingRewards,\n parts,\n } as GeneralAssetInfo;\n } catch {\n return undefined;\n }\n };\n\n return queryOptions({\n queryKey: [\"ecency-wallets\", \"asset-info\", username, asset, currency],\n queryFn: async () => {\n const portfolioAssetInfo = await getPortfolioAssetInfo();\n\n if (portfolioAssetInfo && portfolioAssetInfo.price > 0) {\n return portfolioAssetInfo;\n }\n\n let assetInfo: GeneralAssetInfo | undefined;\n\n if (asset === \"HIVE\") {\n assetInfo = await fetchQuery(getHiveAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HP\") {\n assetInfo = await fetchQuery(getHivePowerAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"HBD\") {\n assetInfo = await fetchQuery(getHbdAssetGeneralInfoQueryOptions(username));\n } else if (asset === \"POINTS\") {\n assetInfo = await fetchQuery(getPointsAssetGeneralInfoQueryOptions(username));\n } else {\n // Check if it's a Hive Engine token\n const balances = await queryClient.ensureQueryData(\n getHiveEngineTokensBalancesQueryOptions(username)\n );\n\n if (balances.some((balance) => balance.symbol === asset)) {\n assetInfo = await fetchQuery(\n getHiveEngineTokenGeneralInfoQueryOptions(username, asset)\n );\n } else if (portfolioAssetInfo) {\n // Unknown asset but portfolio has data — use it as-is\n return portfolioAssetInfo;\n } else {\n throw new Error(\n `[SDK][Wallet] – unrecognized asset \"${asset}\"`\n );\n }\n }\n\n // If portfolio had rich data (parts, balance) but zero price,\n // merge the fallback price into the portfolio data\n if (portfolioAssetInfo && assetInfo && assetInfo.price > 0) {\n const converted = await convertPriceToUserCurrency(assetInfo);\n return {\n ...portfolioAssetInfo,\n price: converted!.price,\n };\n }\n\n return await convertPriceToUserCurrency(assetInfo);\n },\n });\n}\n","export enum AssetOperation {\n // Common\n Transfer = \"transfer\",\n\n // APR\n TransferToSavings = \"transfer-saving\",\n WithdrawFromSavings = \"withdraw-saving\",\n Delegate = \"delegate\",\n PowerUp = \"power-up\",\n PowerDown = \"power-down\",\n WithdrawRoutes = \"withdraw-routes\",\n ClaimInterest = \"claim-interest\",\n Swap = \"swap\",\n Convert = \"convert\",\n\n // Points\n Gift = \"gift\",\n Promote = \"promote\",\n Claim = \"claim\",\n Buy = \"buy\",\n\n // Layer 2\n Stake = \"stake\",\n Unstake = \"unstake\",\n Undelegate = \"undelegate\",\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for transferring tokens.\n */\nexport interface TransferPayload {\n /** Recipient account */\n to: string;\n /** Amount with asset symbol (e.g., \"1.000 HIVE\", \"5.000 HBD\") */\n amount: string;\n /** Transfer memo */\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring tokens.\n *\n * This mutation broadcasts a transfer operation to send HIVE or HBD\n * to another account. **Requires ACTIVE authority**.\n *\n * Uses `useBroadcastMutation` with the smart auth strategy:\n * - Adapter determines login type and dispatches to appropriate method\n * - If active key not available (common on web), triggers `showAuthUpgradeUI`\n * - Supports keychain, hivesigner, hiveauth, and direct key signing\n *\n * @param username - The username sending the transfer (required for broadcast)\n * @param auth - Authentication context with platform adapter\n *\n * @returns React Query mutation result\n */\nexport function useTransfer(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer\"],\n username,\n (payload) => [\n buildTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildPointTransferOp } from \"@/modules/operations/builders\";\n\nexport interface TransferPointPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\n/**\n * React Query mutation hook for transferring Ecency points.\n *\n * Uses `ecency_point_transfer` custom_json operation with ACTIVE authority.\n */\nexport function useTransferPoint(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-point\"],\n username,\n (payload) => [\n buildPointTransferOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildDelegateVestingSharesOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for delegating Hive Power (vesting shares).\n */\nexport interface DelegateVestingSharesPayload {\n /** Account receiving HP delegation */\n delegatee: string;\n /** Amount of VESTS to delegate (e.g., \"1000.000000 VESTS\"). Use \"0.000000 VESTS\" to remove delegation. */\n vestingShares: string;\n}\n\n/**\n * React Query mutation hook for delegating Hive Power (HP).\n *\n * This mutation broadcasts a delegate_vesting_shares operation to delegate HP\n * to another account. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username delegating HP (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Delegation operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Delegation Mechanics:**\n * - Delegated HP can be used by the delegatee for resource credits\n * - Delegatee CANNOT power down or transfer the delegated HP\n * - Delegation can be removed by setting vestingShares to \"0.000000 VESTS\"\n * - Removing delegation has a 5-day cooldown before HP returns to delegator\n *\n * **Post-Broadcast Actions:**\n * - Invalidates delegations list cache to show updated delegation\n * - Invalidates account data for both delegator and delegatee\n *\n * @example\n * ```typescript\n * const delegateMutation = useDelegateVestingShares(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Delegate HP\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '1000.000000 VESTS'\n * });\n *\n * // Remove delegation\n * delegateMutation.mutate({\n * delegatee: 'alice',\n * vestingShares: '0.000000 VESTS'\n * });\n * ```\n */\nexport function useDelegateVestingShares(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-vesting-shares\"],\n username,\n (payload) => [\n buildDelegateVestingSharesOp(\n username!,\n payload.delegatee,\n payload.vestingShares\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.delegatee),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildSetWithdrawVestingRouteOp } from \"@/modules/operations/builders\";\n\n/**\n * Payload for setting withdraw vesting route.\n */\nexport interface SetWithdrawVestingRoutePayload {\n /** Account receiving withdrawn vesting */\n toAccount: string;\n /** Percentage to route (0-10000, where 10000 = 100%). Already scaled. */\n percent: number;\n /** Auto convert to vesting (power up) */\n autoVest: boolean;\n}\n\n/**\n * React Query mutation hook for setting withdraw vesting route.\n *\n * This mutation broadcasts a set_withdraw_vesting_route operation to configure\n * where withdrawn VESTS (power down) are sent. **Requires ACTIVE authority**, not posting.\n *\n * @param username - The username setting withdraw route (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **IMPORTANT: Active Authority Required**\n * - Withdraw route operations require ACTIVE key, not posting key\n * - Make sure your auth adapter provides getActiveKey() method\n * - Keychain/HiveAuth will prompt for Active authority\n *\n * **Withdraw Route Mechanics:**\n * - Routes a percentage of power down (withdraw_vesting) to another account\n * - Percent must be between 0-10000 (where 10000 = 100%)\n * - Multiple routes can be set, total cannot exceed 100%\n * - autoVest=true converts withdrawn VESTS to HP in destination account\n * - autoVest=false converts withdrawn VESTS to liquid HIVE\n *\n * **Post-Broadcast Actions:**\n * - Invalidates withdraw routes cache to show updated routes\n * - Invalidates account data for both accounts\n *\n * @example\n * ```typescript\n * const setRouteMutation = useSetWithdrawVestingRoute(username, {\n * adapter: {\n * ...myAdapter,\n * getActiveKey: async (username) => getActiveKeyFromStorage(username)\n * },\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Route 50% of power down to another account (auto vest)\n * setRouteMutation.mutate({\n * toAccount: 'alice',\n * percent: 5000, // 50% (already scaled)\n * autoVest: true\n * });\n *\n * // Route 100% of power down to another account (liquid HIVE)\n * setRouteMutation.mutate({\n * toAccount: 'bob',\n * percent: 10000, // 100% (already scaled)\n * autoVest: false\n * });\n * ```\n */\nexport function useSetWithdrawVestingRoute(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"set-withdraw-vesting-route\"],\n username,\n (payload) => [\n buildSetWithdrawVestingRouteOp(\n username!,\n payload.toAccount,\n payload.percent,\n payload.autoVest\n )\n ],\n async (_result, variables) => {\n // Cache invalidation\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.wallet.withdrawRoutes(username!),\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.toAccount)\n ]);\n },\n auth,\n 'active', // IMPORTANT: Active authority required\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface TransferEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n memo: string;\n}\n\nexport function useTransferEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"transfer\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n memo: payload.memo\n }\n });\n return [[\"custom_json\", {\n required_auths: [username!],\n required_posting_auths: [],\n id: \"ssc-mainnet-hive\",\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n}\n\nexport function useTransferToSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-savings\"],\n username,\n (payload) => [\n buildTransferToSavingsOp(username!, payload.to, payload.amount, payload.memo)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferFromSavingsOp } from \"@/modules/operations/builders\";\n\nexport interface TransferFromSavingsPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useTransferFromSavings(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-from-savings\"],\n username,\n (payload) => [\n buildTransferFromSavingsOp(username!, payload.to, payload.amount, payload.memo, payload.requestId)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildTransferToVestingOp } from \"@/modules/operations/builders\";\n\nexport interface TransferToVestingPayload {\n to: string;\n amount: string;\n}\n\nexport function useTransferToVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"transfer-to-vesting\"],\n username,\n (payload) => [\n buildTransferToVestingOp(username!, payload.to, payload.amount)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildWithdrawVestingOp } from \"@/modules/operations/builders\";\n\nexport interface WithdrawVestingPayload {\n vestingShares: string;\n}\n\nexport function useWithdrawVesting(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"withdraw-vesting\"],\n username,\n (payload) => [\n buildWithdrawVestingOp(username!, payload.vestingShares)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildConvertOp, buildCollateralizedConvertOp } from \"@/modules/operations/builders\";\n\nexport interface ConvertPayload {\n amount: string;\n requestId: number;\n collateralized?: boolean;\n}\n\nexport function useConvert(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"convert\"],\n username,\n (payload) => [\n payload.collateralized\n ? buildCollateralizedConvertOp(username!, payload.amount, payload.requestId)\n : buildConvertOp(username!, payload.amount, payload.requestId)\n ],\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimInterestOps } from \"@/modules/operations/builders\";\n\nexport interface ClaimInterestPayload {\n to: string;\n amount: string;\n memo: string;\n requestId: number;\n}\n\nexport function useClaimInterest(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-interest\"],\n username,\n (payload) => buildClaimInterestOps(username!, payload.to, payload.amount, payload.memo, payload.requestId),\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys, getQueryClient } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { buildClaimRewardBalanceOp } from \"@/modules/operations/builders\";\n\nexport interface ClaimRewardsPayload {\n rewardHive: string;\n rewardHbd: string;\n rewardVests: string;\n}\n\nconst CLAIM_REWARDS_INVALIDATION_DELAY_MS = 5000;\nconst pendingInvalidationTimers = new Map>();\n\nexport function useClaimRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-rewards\"],\n username,\n (payload) => [\n buildClaimRewardBalanceOp(username!, payload.rewardHive, payload.rewardHbd, payload.rewardVests)\n ],\n () => {\n const timerKey = username ?? \"__anonymous__\";\n const keysToInvalidate = [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username],\n QueryKeys.assets.hiveGeneralInfo(username!),\n QueryKeys.assets.hbdGeneralInfo(username!),\n QueryKeys.assets.hivePowerGeneralInfo(username!),\n ];\n\n // Delay invalidation to allow blockchain to propagate the transaction.\n // Immediate invalidation would fetch stale (pre-confirmation) data.\n const existingTimer = pendingInvalidationTimers.get(timerKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n pendingInvalidationTimers.delete(timerKey);\n }\n\n const timer = setTimeout(async () => {\n try {\n const qc = getQueryClient();\n const results = await Promise.allSettled(\n keysToInvalidate.map((key) => qc.invalidateQueries({ queryKey: key }))\n );\n const rejected = results.filter((result) => result.status === \"rejected\");\n if (rejected.length > 0) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation rejected\", {\n username,\n rejectedCount: rejected.length,\n rejected\n });\n }\n } catch (error) {\n console.error(\"[SDK][Wallet][useClaimRewards] delayed invalidation failed\", {\n username,\n error\n });\n } finally {\n pendingInvalidationTimers.delete(timerKey);\n }\n }, CLAIM_REWARDS_INVALIDATION_DELAY_MS);\n\n pendingInvalidationTimers.set(timerKey, timer);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface DelegateEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useDelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"delegate\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UndelegateEngineTokenPayload {\n from: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUndelegateEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"undelegate-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"undelegate\",\n contractPayload: {\n symbol: payload.symbol,\n from: payload.from,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface StakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useStakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"stake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"stake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface UnstakeEngineTokenPayload {\n to: string;\n symbol: string;\n quantity: string;\n}\n\nexport function useUnstakeEngineToken(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"unstake-engine-token\"],\n username,\n (payload) => {\n const json = JSON.stringify({\n contractName: \"tokens\",\n contractAction: \"unstake\",\n contractPayload: {\n symbol: payload.symbol,\n to: payload.to,\n quantity: payload.quantity,\n }\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface ClaimEngineRewardsPayload {\n tokens: string[];\n}\n\nexport function useClaimEngineRewards(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"claim-engine-rewards\"],\n username,\n (payload) => {\n const json = JSON.stringify(payload.tokens.map((symbol) => ({ symbol })));\n return [[\"custom_json\", {\n id: \"scot_claim_token\",\n required_auths: [],\n required_posting_auths: [username!],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'posting',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport { QueryKeys } from \"@/modules/core\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface EngineMarketOrderPayload {\n action: \"buy\" | \"sell\" | \"cancel\";\n symbol: string;\n quantity?: string;\n price?: string;\n orderId?: string;\n orderType?: \"buy\" | \"sell\";\n}\n\nexport function useEngineMarketOrder(username: string | undefined, auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"engine-market-order\"],\n username,\n (payload) => {\n let contractPayload: Record;\n let contractAction: string;\n\n if (payload.action === \"cancel\") {\n contractAction = \"cancel\";\n contractPayload = {\n type: payload.orderType!,\n id: payload.orderId!,\n };\n } else {\n contractAction = payload.action;\n contractPayload = {\n symbol: payload.symbol,\n quantity: payload.quantity!,\n price: payload.price!,\n };\n }\n\n const json = JSON.stringify({\n contractName: \"market\",\n contractAction,\n contractPayload,\n });\n return [[\"custom_json\", {\n id: \"ssc-mainnet-hive\",\n required_auths: [username!],\n required_posting_auths: [],\n json,\n }] as Operation];\n },\n async () => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n [\"ecency-wallets\", \"asset-info\", username],\n [\"wallet\", \"portfolio\", \"v2\", username]\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation } from \"@/modules/core/mutations\";\nimport type { BroadcastMode } from \"@/modules/core/mutations\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { getQueryClient } from \"@/modules/core\";\nimport type { AuthorityLevel } from \"@/modules/operations/authority-map\";\nimport { AssetOperation } from \"../types\";\nimport {\n buildTransferOp,\n buildTransferToSavingsOp,\n buildTransferFromSavingsOp,\n buildTransferToVestingOp,\n buildWithdrawVestingOp,\n buildDelegateVestingSharesOp,\n buildSetWithdrawVestingRouteOp,\n buildConvertOp,\n buildClaimInterestOps,\n buildPointTransferOp,\n buildEngineOp,\n buildEngineClaimOp,\n} from \"@/modules/operations/builders\";\nimport type { Operation } from \"../../../hive-tx\";\n\nexport interface WalletOperationPayload {\n from: string;\n to?: string;\n amount?: string;\n memo?: string;\n request_id?: number;\n from_account?: string;\n to_account?: string;\n percent?: number;\n auto_vest?: boolean;\n mode?: string;\n [key: string]: unknown;\n}\n\nfunction buildHiveOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\", memo = \"\" } = payload;\n const requestId = payload.request_id ?? (Date.now() >>> 0);\n\n switch (asset) {\n case \"HIVE\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.PowerUp:\n return [buildTransferToVestingOp(from, to, amount)];\n }\n break;\n\n case \"HBD\":\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildTransferOp(from, to, amount, memo)];\n case AssetOperation.TransferToSavings:\n return [buildTransferToSavingsOp(from, to, amount, memo)];\n case AssetOperation.WithdrawFromSavings:\n return [buildTransferFromSavingsOp(from, to, amount, memo, requestId)];\n case AssetOperation.ClaimInterest:\n return buildClaimInterestOps(from, to, amount, memo, requestId);\n case AssetOperation.Convert:\n return [buildConvertOp(from, amount, Math.floor(Date.now() / 1000))];\n }\n break;\n\n case \"HP\":\n switch (operation) {\n case AssetOperation.PowerDown:\n return [buildWithdrawVestingOp(from, amount)];\n case AssetOperation.Delegate:\n return [buildDelegateVestingSharesOp(from, to, amount)];\n case AssetOperation.WithdrawRoutes:\n return [buildSetWithdrawVestingRouteOp(\n payload.from_account ?? from,\n payload.to_account ?? to,\n payload.percent ?? 0,\n payload.auto_vest ?? false\n )];\n }\n break;\n\n case \"POINTS\":\n if (operation === AssetOperation.Transfer || operation === AssetOperation.Gift) {\n return [buildPointTransferOp(from, to, amount, memo)];\n }\n break;\n }\n\n return null;\n}\n\nfunction buildEngineOperations(\n asset: string,\n operation: AssetOperation,\n payload: WalletOperationPayload\n): Operation[] | null {\n const { from, to = \"\", amount = \"\" } = payload;\n const quantity = typeof amount === \"string\" && amount.includes(\" \")\n ? amount.split(\" \")[0]\n : String(amount);\n\n switch (operation) {\n case AssetOperation.Transfer:\n return [buildEngineOp(from, \"transfer\", {\n symbol: asset, to, quantity, memo: payload.memo ?? \"\"\n })];\n case AssetOperation.Stake:\n return [buildEngineOp(from, \"stake\", { symbol: asset, to, quantity })];\n case AssetOperation.Unstake:\n return [buildEngineOp(from, \"unstake\", { symbol: asset, to, quantity })];\n case AssetOperation.Delegate:\n return [buildEngineOp(from, \"delegate\", { symbol: asset, to, quantity })];\n case AssetOperation.Undelegate:\n return [buildEngineOp(from, \"undelegate\", { symbol: asset, from: to, quantity })];\n case AssetOperation.Claim:\n return [buildEngineClaimOp(from, [asset])];\n }\n\n return null;\n}\n\n/**\n * Determines authority level for a wallet operation.\n * Engine token claims use posting authority; everything else uses active.\n */\nfunction getWalletOperationAuthority(operation: AssetOperation): AuthorityLevel {\n if (operation === AssetOperation.Claim) {\n return 'posting';\n }\n return 'active';\n}\n\n/**\n * Meta-mutation hook that dispatches wallet operations based on asset and operation type.\n *\n * Supports HIVE, HBD, HP, POINTS, and Hive Engine tokens.\n * Uses `useBroadcastMutation` for unified auth handling via `AuthContextV2`.\n *\n * @param username - The Hive account performing the operation\n * @param asset - The asset symbol (e.g., \"HIVE\", \"HBD\", \"HP\", \"POINTS\", or engine token)\n * @param operation - The operation type from AssetOperation enum\n * @param auth - Auth context for broadcasting\n */\nexport function useWalletOperation(\n username: string | undefined,\n asset: string,\n operation: AssetOperation,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n operation as any\n );\n\n return useBroadcastMutation(\n [\"ecency-wallets\", asset, operation],\n username,\n (payload) => {\n // Try native Hive + POINTS operations\n const hiveOps = buildHiveOperations(asset, operation, payload);\n if (hiveOps) return hiveOps;\n\n // Try engine token operations\n const engineOps = buildEngineOperations(asset, operation, payload);\n if (engineOps) return engineOps;\n\n throw new Error(`[SDK][Wallet] – no operation builder for asset=\"${asset}\" operation=\"${operation}\"`);\n },\n () => {\n recordActivity();\n\n const keysToInvalidate: (string | undefined)[][] = [];\n\n // Invalidate asset-specific queries (prefix-matches all currency variants)\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, asset]);\n\n if (asset === \"HIVE\") {\n keysToInvalidate.push([\"ecency-wallets\", \"asset-info\", username, \"HP\"]);\n }\n\n // Invalidate portfolio (prefix-matches all currency/filter variants)\n keysToInvalidate.push([\"wallet\", \"portfolio\", \"v2\", username]);\n\n // Delay invalidation to allow blockchain to process\n setTimeout(() => {\n keysToInvalidate.forEach((key) => {\n getQueryClient().invalidateQueries({ queryKey: key });\n });\n }, 5000);\n },\n auth,\n getWalletOperationAuthority(operation),\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, invalidateAfterBroadcast, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildDelegateRcOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface DelegateRcPayload {\n to: string;\n maxRc: string | number;\n}\n\nexport function useDelegateRc(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"wallet\", \"delegate-rc\"],\n username,\n ({ to, maxRc }) => [\n buildDelegateRcOp(username!, to, maxRc)\n ],\n async (_result, variables) => {\n await invalidateAfterBroadcast(auth?.adapter, broadcastMode, [\n QueryKeys.accounts.full(username),\n QueryKeys.accounts.full(variables.to),\n QueryKeys.resourceCredits.account(username!),\n QueryKeys.resourceCredits.account(variables.to),\n ]);\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessVoteOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\n/**\n * Payload for voting for a witness.\n */\nexport interface WitnessVotePayload {\n /** Witness account name to vote for/against */\n witness: string;\n /** True to approve, false to disapprove */\n approve: boolean;\n}\n\n/**\n * React Query mutation hook for voting for a Hive witness.\n *\n * This mutation broadcasts an account_witness_vote operation to vote for\n * or remove a vote from a witness.\n *\n * @param username - The username voting for the witness (required for broadcast)\n * @param auth - Authentication context with platform adapter and fallback configuration\n *\n * @returns React Query mutation result\n *\n * @remarks\n * **Post-Broadcast Actions:**\n * - Invalidates account data cache to show updated witness votes\n * - Invalidates witness votes cache\n *\n * **Vote Types:**\n * - approve: true - Vote for the witness\n * - approve: false - Remove your vote from the witness\n *\n * **Authority Required:**\n * - Active authority is required for witness voting\n *\n * @example\n * ```typescript\n * const witnessVoteMutation = useWitnessVote(username, {\n * adapter: myAdapter,\n * enableFallback: true,\n * fallbackChain: ['keychain', 'key', 'hivesigner']\n * });\n *\n * // Vote for a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: true\n * });\n *\n * // Remove vote from a witness\n * witnessVoteMutation.mutate({\n * witness: 'good-karma',\n * approve: false\n * });\n * ```\n */\nexport function useWitnessVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"vote\"],\n username,\n ({ witness, approve }) => [\n buildWitnessVoteOp(username!, witness, approve)\n ],\n async () => {\n // Wrap post-broadcast side-effects in try-catch to prevent propagating errors\n try {\n // Cache invalidation\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.votes(username)\n ]);\n }\n } catch (error) {\n // Log but don't rethrow - don't fail mutation due to side-effect errors\n console.warn('[useWitnessVote] Post-broadcast side-effect failed:', error);\n }\n },\n auth,\n 'active', // Use active authority for witness votes (required by blockchain)\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildWitnessProxyOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface WitnessProxyPayload {\n proxy: string;\n}\n\nexport function useWitnessProxy(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"witnesses\", \"proxy\"],\n username,\n ({ proxy }) => [\n buildWitnessProxyOp(username!, proxy)\n ],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.witnesses.proxy(),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Witness, WitnessVotersResponse } from \"../types\";\nimport { callREST } from \"@/modules/core/hive-tx\";\nimport { QueryKeys } from \"@/modules/core\";\n\ntype WitnessPage = Witness[];\ntype WitnessCursor = number;\n\ninterface HafbeWitness {\n witness_name: string;\n rank: number;\n url: string;\n vests: string;\n votes_daily_change: string;\n voters_num: number;\n voters_num_daily_change: number;\n price_feed: number;\n bias: number;\n feed_updated_at: string;\n block_size: number;\n signing_key: string;\n version: string;\n missed_blocks: number;\n hbd_interest_rate: number;\n last_confirmed_block_num: number;\n account_creation_fee: number;\n}\n\ninterface HafbeWitnessesResponse {\n total_witnesses: number;\n total_pages: number;\n witnesses: HafbeWitness[];\n}\n\n/**\n * Map a hafbe-api witness to the SDK Witness shape so existing consumers\n * (e.g. the web app's transform()) keep working unchanged.\n */\nfunction mapRestWitness(w: HafbeWitness): Witness {\n return {\n owner: w.witness_name,\n total_missed: w.missed_blocks,\n url: w.url,\n props: {\n account_creation_fee: `${(w.account_creation_fee / 1000).toFixed(3)} HIVE`,\n account_subsidy_budget: 0,\n maximum_block_size: w.block_size,\n },\n hbd_exchange_rate: {\n base: `${w.price_feed.toFixed(3)} HBD`,\n },\n available_witness_account_subsidies: 0,\n running_version: w.version,\n signing_key: w.signing_key,\n last_hbd_exchange_update: w.feed_updated_at,\n rank: w.rank,\n vests: w.vests,\n voters_num: w.voters_num,\n voters_num_daily_change: w.voters_num_daily_change,\n price_feed: w.price_feed,\n hbd_interest_rate: w.hbd_interest_rate,\n last_confirmed_block_num: w.last_confirmed_block_num,\n };\n}\n\n/**\n * Get witnesses ordered by vote count (infinite scroll).\n * Uses the hafbe-api REST endpoint - replaces multi-call RPC assembly\n * with a single paginated call. Includes voter count, rank, and other\n * data that was previously unavailable.\n *\n * @param limit - Number of witnesses per page\n */\nexport function getWitnessesInfiniteQueryOptions(limit: number) {\n return infiniteQueryOptions<\n WitnessPage,\n Error,\n InfiniteData,\n (string | number)[],\n WitnessCursor\n >({\n queryKey: QueryKeys.witnesses.list(limit),\n initialPageParam: 1 as WitnessCursor,\n\n queryFn: async ({ pageParam }: { pageParam: WitnessCursor }) => {\n const response = (await callREST(\n \"hafbe\",\n \"/witnesses\",\n {\n \"page-size\": limit,\n page: pageParam,\n }\n )) as HafbeWitnessesResponse;\n\n return response.witnesses.map(mapRestWitness);\n },\n\n getNextPageParam: (lastPage, _allPages, lastPageParam) =>\n lastPage.length === limit ? lastPageParam + 1 : undefined,\n });\n}\n\nexport type WitnessVoterSortField =\n | \"vests\"\n | \"account_vests\"\n | \"proxied_vests\"\n | \"account_name\"\n | \"timestamp\";\n\nexport type WitnessVoterSortDirection = \"asc\" | \"desc\";\n\n/**\n * Get a single page of voters for a specific witness.\n *\n * Server-side pagination + sort: each page click fetches that page directly\n * from hafbe rather than scrolling through accumulated pages on the client.\n *\n * @param witness - Witness account name\n * @param page - 1-based page index\n * @param pageSize - Number of voters per page\n * @param sort - Field to sort by\n * @param direction - asc or desc\n */\nexport function getWitnessVotersPageQueryOptions(\n witness: string,\n page: number,\n pageSize: number,\n sort: WitnessVoterSortField = \"vests\",\n direction: WitnessVoterSortDirection = \"desc\"\n) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voters(witness, page, pageSize, sort, direction),\n queryFn: async ({ signal }) => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters\",\n {\n \"witness-name\": witness,\n \"page-size\": pageSize,\n page,\n sort,\n direction,\n },\n undefined,\n undefined,\n signal\n )) as WitnessVotersResponse;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n\n/**\n * Get total voter count for a witness.\n *\n * @param witness - Witness account name\n */\nexport function getWitnessVoterCountQueryOptions(witness: string) {\n return queryOptions({\n queryKey: QueryKeys.witnesses.voterCount(witness),\n queryFn: async () => {\n return (await callREST(\n \"hafbe\",\n \"/witnesses/{witness-name}/voters/count\",\n { \"witness-name\": witness }\n )) as number;\n },\n enabled: !!witness,\n staleTime: 60_000,\n });\n}\n","export enum PointTransactionType {\n CHECKIN = 10,\n LOGIN = 20,\n CHECKIN_EXTRA = 30,\n POST = 100,\n COMMENT = 110,\n VOTE = 120,\n REBLOG = 130,\n DELEGATION = 150,\n REFERRAL = 160,\n COMMUNITY = 170,\n TRANSFER_SENT = 998,\n TRANSFER_INCOMING = 999,\n MINTED = 991,\n /**\n * Points burned out of supply rather than moved to the treasury. Written by the\n * AI surfaces (assist, image, transcribe), which pay a real per-request vendor\n * bill, so the Points are consumed rather than parked.\n *\n * The row carries no counterparty at all, which is what distinguishes it from\n * TRANSFER_SENT: `sender` and `receiver` are both null. A refund of a burn comes\n * back as this same type with a positive amount, so read the sign rather than\n * assuming a burn is always a debit.\n */\n BURNED = 997,\n}\n","import { CONFIG, getBoundFetch, getQueryClient } from \"@/modules/core\";\nimport { EcencyAnalytics } from \"@/modules/analytics\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { getPointsQueryOptions } from \"../queries\";\nimport type { Points } from \"../types\";\n\n/**\n * POST a points claim and return the parsed JSON body.\n *\n * The endpoint normally answers with JSON, but an edge/proxy layer can\n * occasionally return a 2xx whose body is an HTML interstitial or plain text\n * (ECENCY-NEXT-1FCJ). Calling `response.json()` on that throws a bare\n * `SyntaxError` that names neither the endpoint nor the cause. Instead we check\n * the content type first and fail with a STABLE, low-cardinality message\n * (content type + status) — never the raw body — so these group as a single\n * Sentry issue instead of fragmenting on every distinct HTML page.\n */\nexport async function claimPointsRequest(\n username: string | undefined,\n accessToken: string | undefined\n) {\n if (!username) {\n throw new Error(\"[SDK][Points][Claim] – username wasn't provided\");\n }\n\n if (!accessToken) {\n throw new Error(\"[SDK][Points][Claim] – access token wasn't found\");\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(\n CONFIG.privateApiHost + \"/private-api/points-claim\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n }\n );\n\n // Media types are case-insensitive; normalise once and reuse in every branch.\n const contentType = (response.headers.get(\"content-type\") ?? \"\")\n .split(\";\")[0]\n .trim()\n .toLowerCase();\n const body = await response.text();\n\n if (!response.ok) {\n if (response.status === 406) {\n try {\n return JSON.parse(body);\n } catch {\n return { message: body, code: response.status };\n }\n }\n // Only fold a short JSON error body into the message; an HTML gateway page\n // (e.g. 502/503) would otherwise fragment the Sentry group per distinct\n // page — the same problem the non-JSON guard below avoids for a 2xx body.\n const detail =\n body && contentType.includes(\"json\") ? `: ${body.slice(0, 200)}` : \"\";\n throw new Error(\n `[SDK][Points][Claim] – failed with status ${response.status}${detail}`\n );\n }\n\n if (!contentType.includes(\"json\")) {\n throw new Error(\n `[SDK][Points][Claim] – expected JSON but received \"${contentType || \"empty\"}\" response (status ${response.status})`\n );\n }\n\n try {\n return JSON.parse(body);\n } catch {\n throw new Error(\n `[SDK][Points][Claim] – malformed JSON response (status ${response.status})`\n );\n }\n}\n\nexport function useClaimPoints(\n username: string | undefined,\n accessToken: string | undefined,\n onSuccess?: () => void,\n onError?: Parameters[\"0\"][\"onError\"]\n) {\n const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n username,\n \"points-claimed\"\n );\n\n return useMutation({\n mutationFn: () => claimPointsRequest(username, accessToken),\n onError,\n onSuccess: () => {\n recordActivity();\n\n getQueryClient().setQueryData(\n getPointsQueryOptions(username).queryKey,\n (data) => {\n if (!data) {\n return data;\n }\n\n return {\n ...data,\n points: (\n parseFloat(data.points) + parseFloat(data.uPoints)\n ).toFixed(3),\n uPoints: \"0\",\n };\n }\n );\n\n onSuccess?.();\n },\n });\n}\n","// A token only counts at the start of the query or after whitespace, matching\n// the search API's parser. Unanchored, these matched inside ordinary words:\n// \"prototype:v2\" read as type=v2 and the API rejected it as an invalid type,\n// \"subcategory:hive-1\" filtered on category=hive-1 with a stray \"sub\" left as\n// required text. The boundary is captured rather than looked behind so it can\n// be put back when the token is stripped, keeping the neighbouring words apart\n// (a lookbehind would also be fine here, but this stays portable).\nconst author_re = /(^|\\s)author:([^\\s]+)/g;\nconst type_re = /(^|\\s)type:([^\\s]+)/g;\nconst category_re = /(^|\\s)category:([^\\s]+)/g;\nconst tag_re = /(^|\\s)tag:([^\\s]+)/g;\n\n// Index of the token value in a match; group 1 is the boundary.\nconst VALUE = 2;\n\nexport enum SearchType {\n ALL = \"\",\n POST = \"post\",\n COMMENT = \"comment\"\n}\n\nexport const MAX_SEARCH_TAGS = 5;\n\n// The search API applies both caps itself (see query_validator); mirrored here\n// so the client can refuse instead of turning a 400 into an empty result list.\nexport const MAX_SEARCH_QUERY_LENGTH = 100;\n\n/**\n * Both parsers match a token with /author:([^\\s]+)/, so a value containing a\n * space stops filtering at the space and the remainder silently becomes\n * required free text. Keep the first word only, which is what the API would\n * have filtered on anyway.\n */\nfunction firstToken(value: string): string {\n return value.trim().split(/\\s+/)[0] ?? \"\";\n}\n\n/**\n * Hive account names are lowercase and the API filters authors with an exact\n * term query, so \"@Demo\" has to become \"demo\" or it matches nothing.\n */\nexport function normalizeSearchAuthor(value: string): string {\n return firstToken(value).replace(/^@+/, \"\").toLowerCase();\n}\n\nexport function normalizeSearchCategory(value: string): string {\n // Leading \"#\" goes for the same reason it goes on tags: a category is matched\n // by an exact term query, and users write categories the way they write tags.\n return firstToken(value).replace(/^#+/, \"\").toLowerCase();\n}\n\n/**\n * Accepts what a user actually types (\"travel, photography\", \"#travel travel\")\n * and returns exact-match ready tags, deduped in first-seen order.\n */\nexport function normalizeSearchTags(value: string): string[] {\n const seen = new Set();\n\n return value\n .split(/[\\s,]+/)\n .map((tag) => tag.replace(/^#+/, \"\").toLowerCase())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n}\n\nexport interface SearchQueryParts {\n search?: string;\n author?: string;\n type?: SearchType;\n category?: string;\n /** Raw user input (\"a, b\") or an already split list. */\n tags?: string | string[];\n}\n\nexport interface BuiltSearchQuery {\n /** The `q` value to put in the URL. Round-trips through `SearchQuery`. */\n q: string;\n search: string;\n author: string;\n type: SearchType;\n category: string;\n tags: string[];\n}\n\n/**\n * Assembles the single `q` string that both this app and the search API parse\n * back into filters. Returns the normalized parts too, because the caller has\n * to validate the tag count and the total length before navigating.\n */\nexport function buildSearchQuery({\n search = \"\",\n author = \"\",\n type = SearchType.ALL,\n category = \"\",\n tags = []\n}: SearchQueryParts): BuiltSearchQuery {\n const normalizedSearch = search.trim().replace(/\\s+/g, \" \");\n const normalizedAuthor = normalizeSearchAuthor(author);\n const normalizedCategory = normalizeSearchCategory(category);\n const normalizedTags = normalizeSearchTags(Array.isArray(tags) ? tags.join(\",\") : tags);\n\n const parts = [normalizedSearch];\n\n if (normalizedAuthor) {\n parts.push(`author:${normalizedAuthor}`);\n }\n\n if (type) {\n parts.push(`type:${type}`);\n }\n\n if (normalizedCategory) {\n parts.push(`category:${normalizedCategory}`);\n }\n\n if (normalizedTags.length > 0) {\n // No space after the commas: a tag token ends at the first space, so\n // anything past one stops filtering and becomes required free text.\n parts.push(`tag:${normalizedTags.join(\",\")}`);\n }\n\n return {\n // Dropping the empty free text here is what keeps a filter-only query from\n // starting with a space.\n q: parts.filter((part) => part !== \"\").join(\" \"),\n search: normalizedSearch,\n author: normalizedAuthor,\n type,\n category: normalizedCategory,\n tags: normalizedTags\n };\n}\n\nexport class SearchQuery {\n public query: string = \"\";\n public search: string = \"\";\n public author: string = \"\";\n public type: SearchType = SearchType.ALL;\n public category: string = \"\";\n public tags: string[] = [];\n\n constructor(_query: string) {\n this.query = _query;\n this.search = _query;\n\n this.grabAuthor();\n this.grabType();\n this.grabCategory();\n this.grabTags();\n this.grabSearch();\n }\n\n private grab = (re: RegExp): string => {\n // @ts-ignore\n const matches = [...this.query.matchAll(re)];\n if (matches.length > 0) {\n return matches[0][VALUE].trim();\n }\n\n return \"\";\n };\n\n private grabAuthor = () => {\n this.author = this.grab(author_re);\n };\n\n private grabType = () => {\n const type = this.grab(type_re) as SearchType;\n if (Object.values(SearchType).includes(type)) {\n this.type = type as SearchType;\n }\n };\n\n private grabCategory = () => {\n this.category = this.grab(category_re);\n };\n\n private grabTags = () => {\n // Every tag: token counts, not just the first one. The API joins all of its\n // own tag: matches before splitting on commas, so reading only the first\n // token here under-reports the tags a query really applies and let a query\n // past the MAX_SEARCH_TAGS guard that the API then rejects with a 400.\n // A trailing comma (\"tag:a,\") must not yield an empty tag either - it would\n // be shown back as a phantom tag and counted against the same cap.\n const seen = new Set();\n\n this.tags = [...this.query.matchAll(tag_re)]\n .flatMap((match) => match[VALUE].split(\",\"))\n .map((tag) => tag.trim())\n .filter((tag) => {\n if (tag === \"\" || seen.has(tag)) {\n return false;\n }\n\n seen.add(tag);\n return true;\n });\n };\n\n private grabSearch = () => {\n [author_re, type_re, category_re, tag_re].forEach((r) => {\n // Put the captured boundary back, or removing a mid-query token would\n // run the words either side of it together.\n this.search = this.search.replace(r, \"$1\");\n });\n\n while (this.search.indexOf(\" \") !== -1) {\n this.search = this.search.replace(\" \", \" \");\n }\n\n this.search = this.search.trim();\n };\n}\n","export type RequestError = Error & { status?: number; data?: unknown };\n\n/**\n * Reads a response body and, when the status is not OK, throws an error that\n * keeps both the status and the parsed body.\n *\n * The search backend answers a malformed query with an explanation the user can\n * act on (\"Maximum 5 tags!\", \"Query string too long! ...\", \"Parsed query is\n * empty!\"). Dropping the body leaves callers with a bare status: they can\n * neither tell the user what to change nor tell a deterministic rejection from\n * a transient failure worth retrying.\n *\n * Module-internal on purpose - it is not part of the published SDK surface.\n */\nexport async function parseJsonResponse(\n response: Response,\n /**\n * Shape guard for a SUCCESSFUL body. JSON.parse happily accepts `null`,\n * `\"maintenance\"` and `{\"error\": \"...\"}`, none of which are the payload the\n * caller asked for, and all of which would otherwise be returned as `T` and\n * cached as valid data. Callers that have a known shape pass a guard so an\n * unexpected 200 fails here instead of at the first property access.\n */\n isValid?: (data: unknown) => boolean\n): Promise {\n const parseBody = async (): Promise => {\n // Read the body ONCE. Calling json() and then falling back to text() on the\n // same response cannot work: json() consumes the stream, so the fallback\n // always threw and the raw body of a non-JSON failure (an HTML error page\n // from a proxy) was silently lost.\n let raw: string;\n try {\n raw = await response.text();\n } catch {\n return undefined;\n }\n\n if (raw === \"\") {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n // Raw text is a diagnostic, not a payload. On a failed response it is\n // what the caller shows or logs, but on a 2xx returning it would hand\n // back a string typed as the parsed body: callers reading `.results`\n // would see undefined and report an empty result set, and the\n // controversial/rising pager would throw on `resp.results.length`. An\n // unparseable success is a failure, so let it fall through to the throw\n // below rather than caching a string as a SearchResponse.\n return response.ok ? undefined : raw;\n }\n };\n\n const data = await parseBody();\n if (!response.ok) {\n const error = new Error(`Request failed with status ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n if (data === undefined || (isValid !== undefined && !isValid(data))) {\n throw new Error(\"Response body was empty, invalid JSON, or not the expected shape\");\n }\n\n return data as T;\n}\n\n/**\n * The contract every /search-api consumer relies on: an object carrying a\n * `results` array. Enough to keep a stray 200 from reaching `resp.results.length`.\n */\nexport function isSearchResponse(data: unknown): boolean {\n return (\n typeof data === \"object\" &&\n data !== null &&\n Array.isArray((data as { results?: unknown }).results)\n );\n}\n","import { isServer } from \"@tanstack/react-query\";\nimport type { RequestError } from \"./parse-json-response\";\n\n/**\n * The app-wide default the browser QueryClient uses. Restated because supplying\n * a `retry` callback replaces React Query's own budget rather than adding to it.\n *\n * The 0 on the server is load-bearing: server QueryClients set `retry: false`\n * globally, and these queries are prefetched during SSR, so a flat 3 would\n * resurrect SSR retries against a single-region backend.\n */\nconst MAX_RETRIES = isServer ? 0 : 3;\n\n/**\n * Shared retry rule for every /search-api call.\n *\n * A 4xx is the backend rejecting the query itself (too many tags, over the\n * length cap, nothing left to search once the filters are parsed out).\n * Repeating it repeats the same answer, so the only effect is four requests\n * over several seconds before the UI can say what to change.\n *\n * 408 and 429 are the exceptions: they describe when the request arrived rather\n * than what it contained, and backing off is what resolves them. A client-side\n * timeout aborts the fetch and carries no status at all, so it falls through to\n * the normal budget like any other transport failure.\n */\nexport function searchRetryPolicy(failureCount: number, error: Error): boolean {\n const { status } = error as RequestError;\n const isTransient = status === 408 || status === 429;\n\n if (status !== undefined && status >= 400 && status < 500 && !isTransient) {\n return false;\n }\n\n return failureCount < MAX_RETRIES;\n}\n","import { InfiniteData, infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function searchQueryOptions(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number\n) {\n return queryOptions({\n queryKey: QueryKeys.search.results(q, sort, hideLow, since, scroll_id, votes),\n queryFn: async ({ signal }) => {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (scroll_id) data.scroll_id = scroll_id;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n retry: searchRetryPolicy,\n });\n}\n\ntype PageParam = {\n sid: string | undefined;\n hasNextPage: boolean;\n};\n\nexport function getControversialRisingInfiniteQueryOptions(\n what: string,\n tag: string,\n enabled = true\n) {\n return infiniteQueryOptions<\n SearchResponse,\n Error,\n InfiniteData,\n (string | number)[],\n PageParam\n >({\n queryKey: QueryKeys.search.controversialRising(what, tag),\n initialPageParam: { sid: undefined, hasNextPage: true } as PageParam,\n\n queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n if (!pageParam.hasNextPage) {\n return {\n hits: 0,\n took: 0,\n results: [],\n };\n }\n\n let sinceDate: Date | undefined;\n const now = new Date();\n\n switch (tag) {\n case \"today\":\n sinceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case \"week\":\n sinceDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case \"month\":\n sinceDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case \"year\":\n sinceDate = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);\n break;\n default:\n sinceDate = undefined;\n }\n\n const q = \"* type:post\";\n const sort = what === \"rising\" ? \"children\" : what;\n const since = sinceDate ? sinceDate.toISOString().split(\".\")[0] : undefined;\n const hideLow = \"0\";\n const votes = tag === \"today\" ? 50 : 200;\n\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) data.since = since;\n if (pageParam.sid) data.scroll_id = pageParam.sid;\n if (votes) data.votes = votes;\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body) instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n\n getNextPageParam: (resp: SearchResponse): PageParam => {\n return {\n sid: resp?.scroll_id,\n hasNextPage: resp.results.length > 0,\n };\n },\n\n enabled,\n retry: searchRetryPolicy,\n });\n}\n","import { CONFIG, INTERNAL_API_TIMEOUT_MS, getBoundFetch, withTimeoutSignal } from \"@/modules/core\";\nimport { SearchResponse } from \"./types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"./parse-json-response\";\n\nexport async function search(\n q: string,\n sort: string,\n hideLow: string,\n since?: string,\n scroll_id?: string,\n votes?: number,\n signal?: AbortSignal\n): Promise {\n const data: {\n q: string;\n sort: string;\n hide_low: string;\n since?: string;\n scroll_id?: string;\n votes?: number;\n } = { q, sort, hide_low: hideLow };\n\n if (since) {\n data.since = since;\n }\n if (scroll_id) {\n data.scroll_id = scroll_id;\n }\n if (votes) {\n data.votes = votes;\n }\n\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(data),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function similar(\n params: {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n tags?: string[];\n since?: string;\n },\n signal?: AbortSignal,\n timeoutMs: number = INTERNAL_API_TIMEOUT_MS\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/similar\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(params),\n signal: withTimeoutSignal(timeoutMs, signal),\n });\n\n return parseJsonResponse(response, isSearchResponse);\n}\n\nexport async function searchPath(q: string, signal?: AbortSignal): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n const data = await parseJsonResponse(response, Array.isArray);\n return data?.length > 0 ? data : [q];\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { similar } from \"../requests\";\nimport { SearchResult } from \"../types/search-response\";\n\n// Without a recency window the backend ranks across the entire historical\n// index and surfaces years-old posts. Constrain suggestions to the last\n// ~6 months so related posts stay fresh (it also bounds the backend's\n// more_like_this candidate set, which is what keeps it fast).\nconst SIMILAR_ENTRIES_SINCE_MS = 182 * 24 * 60 * 60 * 1000;\n\n// How many results the suggestions strip renders at most.\nconst SIMILAR_ENTRIES_TARGET = 4;\n\n// more_like_this only extracts a handful of significant terms, so an excerpt is\n// enough signal and keeps the request payload small.\nconst SIMILAR_ENTRIES_BODY_LIMIT = 3000;\n\n// On the server the prefetch sits on the entry-page render path, and the search\n// backend is single-region (EU) — so anything slower than this stalls SSR for a\n// non-essential \"related posts\" strip. Keep the SSR cap short and let the strip\n// fall back to a client fetch (only that render misses the in-HTML strip; it's\n// ISR-cached anyway). Do NOT raise this — 2s is the SSR budget.\nconst SIMILAR_ENTRIES_SSR_TIMEOUT_MS = 2000;\n\n// The client fetch doesn't block paint, so it previously had no cap and fell\n// through to the SDK's generic INTERNAL_API_TIMEOUT_MS (10s; CF's worker further\n// truncates at ~8s). Combined with React Query's default client retry (3×), a\n// /search-api/similar outage turned this best-effort strip into a multi-second\n// post-onload tail (observed as a ~29s \"fully loaded\" in GTmetrix). Cap the\n// client call short and disable retry (below) so a degraded backend just hides\n// the strip quickly instead of churning.\nconst SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS = 4000;\n\n// The strip is hidden below this many results. A lone suggestion looks\n// sparse. Exported so the web component shares one threshold (filter == render).\nexport const SIMILAR_ENTRIES_MIN_RENDER = 2;\n\n// Strip markdown image/link/URL noise before truncating, so more_like_this\n// keys on prose terms instead of image-CDN domains and file hashes (which\n// rarely match the index's sanitized body and just waste the term budget).\nfunction toMltExcerpt(body: string, limit: number): string {\n return body\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, \" \") // markdown images\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\") // markdown links -> keep link text\n .replace(/<[^>]+>/g, \" \") // html tags\n .replace(/https?:\\/\\/\\S+/g, \" \") // bare URLs\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, limit);\n}\n\n// Compact deterministic fingerprint (djb2) of the MLT inputs. Folded into the\n// cache key so an edited post (title/tags/body changed) refetches instead of\n// serving stale recommendations under the same author/permlink. Deterministic\n// so the SSR prefetch and the client compute the same key from the same entry.\nfunction fingerprint(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\ninterface Entry {\n author: string;\n permlink: string;\n title?: string;\n body?: string;\n json_metadata?: {\n // Hive's json_metadata is user-controlled and untyped on-chain: `tags` is\n // usually a string[] but some posts store it as a bare string (or other\n // junk). Typed as unknown on purpose so callers can't assume an array —\n // it's narrowed with a runtime guard below.\n tags?: unknown;\n };\n}\n\nexport function getSimilarEntriesQueryOptions(entry: Entry) {\n const title = entry.title ?? \"\";\n // `?? []` only guards null/undefined; a non-array tags value (e.g. a bare\n // string from json_metadata) slips through and crashes `.filter` — which\n // took down the entry-page SSR prefetch (Sentry ECENCY-NEXT-1FMA). Guard on\n // Array.isArray so only real arrays reach the filter.\n const rawTags = entry.json_metadata?.tags;\n const tags = (Array.isArray(rawTags) ? rawTags : []).filter(\n (tag): tag is string => typeof tag === \"string\" && tag !== \"\"\n );\n const body = toMltExcerpt(entry.body ?? \"\", SIMILAR_ENTRIES_BODY_LIMIT);\n const contentKey = fingerprint(`${title}|${tags.join(\",\")}|${body}`);\n\n return queryOptions({\n queryKey: QueryKeys.search.similarEntries(entry.author, entry.permlink, contentKey),\n queryFn: async ({ signal }) => {\n // Naive `YYYY-MM-DDTHH:mm:ss` (no `Z`) matches the search-api date\n // contract used elsewhere; a <14h skew on a 182-day boundary is immaterial.\n const since = new Date(Date.now() - SIMILAR_ENTRIES_SINCE_MS).toISOString().slice(0, 19);\n\n // Elasticsearch more_like_this recommendations: content-based \"related\n // posts\" ranked by shared significant terms in title/body/tags, scoped\n // to the recency window. The backend already excludes the source author,\n // spam and nsfw.\n const response = await similar(\n {\n author: entry.author,\n permlink: entry.permlink,\n title,\n body,\n tags,\n since\n },\n signal,\n // Short cap server-side so a slow cross-region call can't stall SSR;\n // a slightly longer (but still bounded) cap client-side so a degraded\n // backend can't hang the request on the SDK's generic 8s timeout.\n typeof window === \"undefined\"\n ? SIMILAR_ENTRIES_SSR_TIMEOUT_MS\n : SIMILAR_ENTRIES_CLIENT_TIMEOUT_MS\n );\n\n // Light client guard mirroring the render contract: never the source\n // post, never nsfw, one per author, capped at the render target.\n const collected: SearchResult[] = [];\n const seenAuthors = new Set();\n for (const r of response.results) {\n if (collected.length >= SIMILAR_ENTRIES_TARGET) break;\n if (r.permlink === entry.permlink) continue;\n if ((r.tags ?? []).indexOf(\"nsfw\") !== -1) continue;\n if (seenAuthors.has(r.author)) continue;\n seenAuthors.add(r.author);\n collected.push(r);\n }\n\n return collected;\n },\n // The entry page server-prefetches this query and dehydrates it. Without a\n // staleTime, React Query treats the hydrated data as stale and refetches on\n // mount — issuing a *redundant* /search-api/similar XHR right after\n // hydration even though SSR already provided the data. That refetch was the\n // long post-onload tail in the waterfall (held open to the client timeout),\n // inflating GTmetrix \"Fully Loaded\" while the visible strip was already\n // populated from SSR. A staleTime makes the hydrated data fresh so the\n // client skips that refetch; if SSR delivered nothing (empty cache), the\n // client still fetches. Recommendations are stable per post (and the cache\n // key is content-fingerprinted), so 5 min matches the page's ISR cadence.\n staleTime: 5 * 60 * 1000,\n // Best-effort suggestions strip — never retry-storm a degraded backend.\n // The web QueryClient only disables retries on the server; the browser\n // client keeps React Query's default retry (3×) — and other SDK consumers\n // (e.g. mobile) may too — so pin retry:false here to cover every caller.\n retry: false\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { getProfiles } from \"@/modules/bridge\";\nimport { Profile } from \"@/modules/accounts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchAccountQueryOptions(q: string, limit = 5) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.account(normalized, limit),\n queryFn: async (): Promise => {\n const usernames = (await callRPC(\"condenser_api.lookup_accounts\", [\n normalized,\n limit,\n ])) as string[];\n\n if (usernames.length === 0) {\n return [];\n }\n\n return getProfiles(usernames);\n },\n enabled: !!normalized,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { TrendingTag } from \"@/modules/posts/types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\nexport function getSearchTopicsQueryOptions(q: string, limit = 10) {\n const normalized = q.trim();\n\n return queryOptions({\n queryKey: QueryKeys.search.topics(normalized, limit),\n queryFn: async (): Promise => {\n const tags = (await callRPC(\"condenser_api.get_trending_tags\", [\n normalized,\n limit + 1,\n ])) as TrendingTag[];\n\n return tags\n .map((t) => t.name)\n .filter((name) => name !== \"\" && !name.startsWith(\"hive-\"))\n .slice(0, limit);\n },\n enabled: !!normalized,\n });\n}\n","import { infiniteQueryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\nimport { isSearchResponse, parseJsonResponse } from \"../parse-json-response\";\nimport { searchRetryPolicy } from \"../retry-policy\";\n\nexport function getSearchApiInfiniteQueryOptions(\n q: string,\n sort: string,\n hideLow: boolean,\n since?: string,\n votes?: number,\n includeNsfw?: boolean\n) {\n return infiniteQueryOptions({\n queryKey: QueryKeys.search.api(q, sort, hideLow, since, votes, includeNsfw),\n queryFn: async ({ pageParam, signal }: { pageParam: string | undefined; signal: AbortSignal }) => {\n interface SearchApiPayload {\n q: string;\n sort: string;\n hide_low: boolean;\n since?: string;\n scroll_id?: string;\n votes?: number;\n include_nsfw?: number;\n }\n\n const payload: SearchApiPayload = { q, sort, hide_low: hideLow };\n\n if (since) {\n payload.since = since;\n }\n if (pageParam) {\n payload.scroll_id = pageParam;\n }\n if (votes !== undefined) {\n payload.votes = votes;\n }\n if (includeNsfw) {\n payload.include_nsfw = 1;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify(payload),\n signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n });\n\n // Keeps the backend's own explanation of a rejected query on the error\n // (status + body), instead of collapsing it to a status code.\n return parseJsonResponse(response, isSearchResponse);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: SearchResponse) => lastPage?.scroll_id,\n enabled: !!q,\n retry: searchRetryPolicy,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"@/modules/core\";\n\nexport function getSearchPathQueryOptions(q: string) {\n return queryOptions({\n queryKey: [\"search\", \"path\", q],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/search-api/search-path\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Ecency-Client\": CONFIG.clientId,\n },\n body: JSON.stringify({ q }),\n });\n\n if (!response.ok) {\n throw new Error(`Search path failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (data?.length > 0) {\n return data as string[];\n }\n\n return [q];\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { SupportSettings } from \"../types\";\n\n/**\n * Fetch the active user's Support Ecency settings. The username is resolved\n * server-side from the validated `code`, so only the code is sent. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached. Exported for\n * unit testing; the query options below wrap it.\n */\nexport async function getSupportSettingsRequest(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to fetch support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Query options for the active user's Support Ecency settings\n * (beneficiary percent + curation holdback percent). Zeros mean both\n * opt-ins are off; the backend returns zeros when no row exists.\n */\nexport function getSupportSettingsQueryOptions(\n username: string | undefined,\n code: string | undefined\n) {\n const name = username?.replace(\"@\", \"\");\n\n return queryOptions({\n queryKey: QueryKeys.support.settings(name),\n queryFn: () => {\n if (!code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return getSupportSettingsRequest(code);\n },\n enabled: !!name && !!code,\n });\n}\n","import { CONFIG, getBoundFetch, QueryKeys } from \"@/modules/core\";\nimport { QueryClient, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { SupportSettings, UpdateSupportSettingsPayload } from \"../types\";\n\n/**\n * POST a Support Ecency settings update. Both percents are integers within\n * 0..100 (0 = off); the gateway rejects anything else with a 400. Throws on a\n * non-2xx with the server's `.status` + parsed `.data` attached so the caller\n * can surface the plain validation message. Exported for unit testing; the\n * hook below wraps it.\n */\nexport async function updateSupportSettingsRequest(\n code: string,\n payload: UpdateSupportSettingsPayload\n): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/support-settings-update\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n code,\n beneficiary_percent: payload.beneficiary_percent,\n curation_percent: payload.curation_percent,\n }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n // non-JSON error body; fall through with status only\n }\n const message =\n (data as { message?: string })?.message ??\n `Failed to update support settings: ${response.status}`;\n const err = new Error(message) as Error & { status?: number; data?: unknown };\n err.status = response.status;\n err.data = data;\n throw err;\n }\n\n return (await response.json()) as SupportSettings;\n}\n\n/**\n * Sync the settings cache after a successful update: seed the fresh server\n * response and invalidate so any active observers refetch. Exported for unit\n * testing; `useUpdateSupportSettings` calls it from `onSuccess`.\n */\nexport function applySupportSettingsUpdate(\n queryClient: QueryClient,\n username: string,\n data: SupportSettings\n) {\n queryClient.setQueryData(QueryKeys.support.settings(username), data);\n return queryClient.invalidateQueries({ queryKey: QueryKeys.support.settings(username) });\n}\n\n/**\n * Update the user's voluntary Support Ecency opt-ins (post beneficiary percent\n * and curation holdback percent). On success the settings query is refreshed\n * so every surface (publish dialog, settings card, injection hooks) sees the\n * new preference.\n */\nexport function useUpdateSupportSettings(\n username: string | undefined,\n code: string | undefined\n) {\n const queryClient = useQueryClient();\n const name = username?.replace(\"@\", \"\");\n\n return useMutation({\n mutationKey: [\"support\", \"settings-update\", name],\n mutationFn: async (payload: UpdateSupportSettingsPayload) => {\n if (!name || !code) {\n throw new Error(\"[SDK][Support] missing auth\");\n }\n return updateSupportSettingsRequest(code, payload);\n },\n onSuccess(data) {\n if (name) {\n applySupportSettingsUpdate(queryClient, name, data);\n }\n },\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getBoostPlusPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boost-plus-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\n/**\n * RC top-up pricing: duration -> Points cost tiers, served by the ePoints\n * backend via the private API. Reuses the {@link PromotePrice} shape\n * ({ duration, price }).\n */\nexport function getRcDelegationPricesQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-prices\"],\n queryFn: async () => {\n if (!accessToken) {\n return [];\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation prices: ${response.status}`);\n }\n\n return (await response.json()) as PromotePrice[];\n },\n staleTime: Infinity,\n enabled: !!accessToken,\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface RcDelegationActive {\n user: string;\n expires: Date;\n}\n\n/**\n * The active (ON) RC top-up for a user, if any. Lets the UI block a duplicate\n * purchase up front (only one RC top-up is allowed at a time). Returns null\n * when the user has no active top-up.\n */\nexport function getRcDelegationActiveQueryOptions(username: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"rc-delegation-active\", username],\n queryFn: async (): Promise => {\n if (!accessToken || !username) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/rc-delegation-active\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ code: accessToken, username })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch RC delegation active: ${response.status}`);\n }\n\n const responseData = (await response.json()) as { user?: string; expires?: string };\n\n return responseData && responseData.expires && responseData.user\n ? { user: responseData.user, expires: new Date(responseData.expires) }\n : null;\n },\n enabled: !!username && !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\nimport type { PromotePrice } from \"../types\";\n\nexport function getPromotePriceQueryOptions(accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"promote-price\"],\n queryFn: async () => {\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/promote-price\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch promote prices: ${response.status}`);\n }\n\n return await response.json() as PromotePrice[];\n },\n enabled: !!accessToken\n });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG } from \"../../core\";\n\nexport interface BoostPlusAccountPrice {\n account: string;\n expires: Date;\n}\n\nexport function getBoostPlusAccountPricesQueryOptions(account: string, accessToken: string) {\n return queryOptions({\n queryKey: [\"promotions\", \"boost-plus-accounts\", account],\n queryFn: async (): Promise => {\n if (!accessToken || !account) {\n return null;\n }\n\n const response = await fetch(CONFIG.privateApiHost + \"/private-api/boosted-plus-account\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code: accessToken, account }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch boost plus account prices: ${response.status}`);\n }\n\n const responseData = await response.json() as {\n expires: string;\n account: string;\n };\n\n return responseData\n ? {\n account: responseData.account,\n expires: new Date(responseData.expires)\n }\n : null;\n },\n enabled: !!account && !!accessToken\n });\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildBoostPlusOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface BoostPlusPayload {\n account: string;\n duration: number;\n}\n\nexport function useBoostPlus(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"boost-plus\"],\n username,\n ({ account, duration }) => [\n buildBoostPlusOp(username!, account, duration)\n ],\n async (_data, { account }) => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.promotions.boostPlusAccounts(account),\n ]);\n }\n },\n auth,\n 'active',\n { broadcastMode }\n );\n}\n","import { useBroadcastMutation, QueryKeys } from \"@/modules/core\";\nimport type { BroadcastMode } from \"@/modules/core\";\nimport { buildRcDelegationOp } from \"@/modules/operations/builders\";\nimport type { AuthContextV2 } from \"@/modules/core/types\";\n\nexport interface RcDelegationPayload {\n duration: number;\n}\n\n/**\n * Buys a short-term, RC-only delegation (RC top-up) for the active user, paid\n * with Ecency Points. Mirrors {@link useBoostPlus} but is RC-only (no Hive\n * Power / voting power transferred). Invalidates the user's account + RC caches\n * so the new RC shows up once the relay delegation lands.\n */\nexport function useRcDelegation(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n [\"promotions\", \"rc-delegation\"],\n username,\n ({ duration }) => [buildRcDelegationOp(username!, duration)],\n async () => {\n if (auth?.adapter?.invalidateQueries) {\n await auth.adapter.invalidateQueries([\n QueryKeys.accounts.full(username),\n QueryKeys.resourceCredits.account(username!),\n [\"promotions\", \"rc-delegation-active\", username]\n ]);\n }\n },\n auth,\n \"active\",\n { broadcastMode }\n );\n}\n","import { CONFIG, getBoundFetch } from \"@/modules/core\";\nimport { HsTokenRenewResponse } from \"./types\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nexport async function hsTokenRenew(code: string): Promise {\n const fetchApi = getBoundFetch();\n const response = await fetchApi(CONFIG.privateApiHost + \"/auth-api/hs-token-refresh\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n let data: unknown = undefined;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n const error = new Error(`Failed to refresh token: ${response.status}`) as RequestError;\n error.status = response.status;\n error.data = data;\n throw error;\n }\n\n const data = (await response.json()) as HsTokenRenewResponse;\n return data;\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"../../core\";\n\nconst BAD_ACTORS_URL =\n \"https://raw.githubusercontent.com/openhive-network/watchmen/main/output/flat/badactors.txt\";\n\nexport function getBadActorsQueryOptions() {\n return queryOptions({\n queryKey: QueryKeys.badActors.list(),\n queryFn: async ({ signal }) => {\n const response = await fetch(BAD_ACTORS_URL, { signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch bad actors list: ${response.status}`);\n }\n\n const text = await response.text();\n return new Set(text.split(\"\\n\").filter(Boolean));\n },\n staleTime: 24 * 60 * 60 * 1000,\n /**\n * Deliberately left unbounded, including under SSR.\n *\n * `Infinity` is the one value that schedules no gc timer at all —\n * `isValidTimeout` in query-core rejects non-finite timeouts, so\n * `scheduleGc` is a no-op. With no timer there is no GC root, and on a\n * per-request client the entry dies with the request that made it.\n * Replacing it with a finite window would *create* a timer that retains the\n * Query and, through it, that request's whole QueryCache — strictly worse\n * here than leaving it alone.\n */\n gcTime: Infinity\n });\n}\n","export const POLLS_PROTOCOL_VERSION = 1.1;\n\nexport enum PollPreferredInterpretation {\n NUMBER_OF_VOTES = \"number_of_votes\",\n TOKENS = \"tokens\",\n}\n\nexport interface PollChoiceVotes {\n total_votes: number;\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied: number | null;\n}\n\nexport interface PollChoice {\n choice_num: number;\n choice_text: string;\n votes?: PollChoiceVotes;\n}\n\nexport interface PollVoter {\n name: string;\n choices: number[];\n hive_hp?: number;\n hive_proxied_hp?: number;\n hive_hp_incl_proxied?: number;\n}\n\nexport interface PollStats {\n total_voting_accounts_num: number;\n total_hive_hp?: number;\n total_hive_proxied_hp?: number;\n total_hive_hp_incl_proxied: number | null;\n}\n\nexport interface Poll {\n author: string;\n permlink: string;\n question: string;\n poll_choices: PollChoice[];\n poll_voters?: PollVoter[];\n poll_stats?: PollStats;\n poll_trx_id: string;\n status: string;\n end_time: string;\n preferred_interpretation: PollPreferredInterpretation | string;\n max_choices_voted: number;\n filter_account_age_days: number;\n protocol_version: number;\n created: string;\n post_title: string;\n post_body: string;\n parent_permlink: string;\n tags: string[];\n image: unknown[];\n token?: string | null;\n community_membership?: string[];\n allow_vote_changes?: boolean;\n ui_hide_res_until_voted?: boolean;\n platform?: string;\n}\n\nexport function mapMetaChoicesToPollChoices(metaChoices: string[]): PollChoice[] {\n if (!metaChoices) {\n return [];\n }\n\n return metaChoices.map((choice, index) => ({\n choice_num: index + 1,\n choice_text: choice,\n votes: {\n total_votes: 0,\n hive_hp: 0,\n hive_proxied_hp: 0,\n hive_hp_incl_proxied: 0,\n },\n }));\n}\n","import { isServer, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys, SERVER_GC_TIME_MS } from \"@/modules/core\";\nimport { getBoundFetch } from \"@/modules/core/utils\";\nimport type { Poll, PollChoice, PollVoter, PollStats } from \"../types\";\n\nfunction normalizePoll(raw: Record): Poll {\n const pollChoices = (raw.poll_choices as Record[] | undefined) ?? [];\n const pollVoters = (raw.poll_voters as Record[] | undefined) ?? [];\n const rawStats = raw.poll_stats as Record | undefined;\n\n const choices: PollChoice[] = pollChoices.map((c) => {\n const votes = c.votes as Record | undefined;\n return {\n choice_num: (c.choice_num as number) ?? 0,\n choice_text: (c.choice_text as string) ?? \"\",\n votes: votes\n ? {\n total_votes: (votes.total_votes as number) ?? 0,\n hive_hp: votes.hive_hp as number | undefined,\n hive_proxied_hp: votes.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: (votes.hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined,\n };\n });\n\n const voters: PollVoter[] = pollVoters.map((v) => ({\n name: (v.name as string) ?? \"\",\n choices: (v.choices as number[]) ?? [],\n hive_hp: v.hive_hp as number | undefined,\n hive_proxied_hp: v.hive_proxied_hp as number | undefined,\n hive_hp_incl_proxied: v.hive_hp_incl_proxied as number | undefined,\n }));\n\n const stats: PollStats | undefined = rawStats\n ? {\n total_voting_accounts_num: (rawStats.total_voting_accounts_num as number) ?? 0,\n total_hive_hp: rawStats.total_hive_hp as number | undefined,\n total_hive_proxied_hp: rawStats.total_hive_proxied_hp as number | undefined,\n total_hive_hp_incl_proxied: (rawStats.total_hive_hp_incl_proxied as number | null) ?? null,\n }\n : undefined;\n\n return {\n author: (raw.author as string) ?? \"\",\n permlink: (raw.permlink as string) ?? \"\",\n question: (raw.question as string) ?? \"\",\n poll_choices: choices,\n poll_voters: voters,\n poll_stats: stats,\n poll_trx_id: (raw.poll_trx_id as string) ?? \"\",\n status: (raw.status as string) ?? \"\",\n end_time: (raw.end_time as string) ?? \"\",\n preferred_interpretation: (raw.preferred_interpretation as string) ?? \"number_of_votes\",\n max_choices_voted: (raw.max_choices_voted as number) ?? 1,\n filter_account_age_days: (raw.filter_account_age_days as number) ?? 0,\n protocol_version: (raw.protocol_version as number) ?? 0,\n created: (raw.created as string) ?? \"\",\n post_title: (raw.post_title as string) ?? \"\",\n post_body: (raw.post_body as string) ?? \"\",\n parent_permlink: (raw.parent_permlink as string) ?? \"\",\n tags: (raw.tags as string[]) ?? [],\n image: (raw.image as unknown[]) ?? [],\n token: raw.token as string | null | undefined,\n community_membership: raw.community_membership as string[] | undefined,\n allow_vote_changes: raw.allow_vote_changes as boolean | undefined,\n ui_hide_res_until_voted: (raw.ui_hide_res_until_voted as boolean | undefined) ?? false,\n platform: raw.platform as string | undefined,\n };\n}\n\nexport function getPollQueryOptions(\n author: string | undefined,\n permlink: string | undefined\n) {\n return queryOptions({\n queryKey: QueryKeys.polls.details(author ?? \"\", permlink ?? \"\"),\n enabled: !!author && !!permlink,\n // Long in a browser, where a poll is cheap to keep and often revisited;\n // bounded during SSR, where holding it also holds that request's whole\n // cache. See SERVER_GC_TIME_MS.\n gcTime: isServer ? SERVER_GC_TIME_MS : 30 * 60 * 1000,\n queryFn: async (): Promise => {\n if (!author || !permlink) {\n throw new Error(\"[SDK][Polls] – missing author or permlink\");\n }\n\n const fetchApi = getBoundFetch();\n const url = `${CONFIG.pollsApiHost}/rpc/poll?author=eq.${encodeURIComponent(author)}&permlink=eq.${encodeURIComponent(permlink)}`;\n const response = await fetchApi(url);\n\n if (!response.ok) {\n throw new Error(`[SDK][Polls] – fetch failed: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (!Array.isArray(data) || !data[0]) {\n throw new Error(\"[SDK][Polls] – no poll data found\");\n }\n\n return normalizePoll(data[0]);\n },\n });\n}\n","import { QueryKeys, useBroadcastMutation } from \"@/modules/core\";\nimport type { BroadcastMode, AuthContextV2 } from \"@/modules/core\";\n\nexport interface PollVotePayload {\n pollTrxId: string;\n choices: number[];\n}\n\nexport function usePollVote(\n username: string | undefined,\n auth?: AuthContextV2,\n broadcastMode?: BroadcastMode\n) {\n return useBroadcastMutation(\n QueryKeys.polls.vote(),\n username ?? \"\",\n ({ pollTrxId, choices }) => {\n if (!username) {\n throw new Error(\"[SDK][Polls] Cannot vote without an authenticated username\");\n }\n return [\n [\n \"custom_json\",\n {\n id: \"polls\",\n required_auths: [],\n required_posting_auths: [username],\n json: JSON.stringify({\n poll: pollTrxId,\n action: \"vote\",\n choices,\n }),\n },\n ],\n ];\n },\n undefined,\n auth,\n \"posting\",\n { broadcastMode: broadcastMode ?? \"async\" }\n );\n}\n"]} \ No newline at end of file diff --git a/packages/sdk/package.json b/packages/sdk/package.json index fd33a9bddc..c4834cbfbb 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,7 +1,7 @@ { "name": "@ecency/sdk", "private": false, - "version": "2.3.76", + "version": "2.3.77", "description": "Ecency SDK", "repository": { "type": "git", diff --git a/packages/wallets/CHANGELOG.md b/packages/wallets/CHANGELOG.md index 96e51f9fc2..5a48025a47 100644 --- a/packages/wallets/CHANGELOG.md +++ b/packages/wallets/CHANGELOG.md @@ -1,5 +1,12 @@ # @ecency/wallets +## 5.0.77 + +### Patch Changes + +- Updated dependencies []: + - @ecency/sdk@2.3.77 + ## 5.0.76 ### Patch Changes diff --git a/packages/wallets/package.json b/packages/wallets/package.json index 72fdfc2bf9..62d19ff43f 100644 --- a/packages/wallets/package.json +++ b/packages/wallets/package.json @@ -1,7 +1,7 @@ { "name": "@ecency/wallets", "private": false, - "version": "5.0.76", + "version": "5.0.77", "description": "Ecency wallets", "repository": { "type": "git",