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":"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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 { 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":"wkBASA,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,MAAMC,CAAW,CACtB,OAAO,aAAA,CAAgB,IAAA,CACvB,OAAO,UAAA,CAAa,KAAA,CACpB,OAAO,gBAAA,CAAmB,EAAA,CAC1B,OAAO,eAAiBA,CAAAA,CAAW,UAAA,CAEnC,OACA,IAAA,CACA,MAAA,CACA,aACA,KAAA,CACA,YAAA,CAEA,WAAA,CACEC,CAAAA,CAAmBD,CAAAA,CAAW,gBAAA,CAC9BE,EAAwBF,CAAAA,CAAW,cAAA,CACnC,CACA,IAAA,CAAK,MAAA,CAASC,IAAa,CAAA,CAAIjB,EAAAA,CAAe,IAAI,WAAA,CAAYiB,CAAQ,EACtE,IAAA,CAAK,IAAA,CAAOA,IAAa,CAAA,CAAI,IAAI,SAASjB,EAAY,CAAA,CAAI,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,EAClF,IAAA,CAAK,MAAA,CAAS,EACd,IAAA,CAAK,YAAA,CAAe,GACpB,IAAA,CAAK,KAAA,CAAQiB,CAAAA,CACb,IAAA,CAAK,YAAA,CAAeC,EACtB,CAEA,OAAO,QAAA,CAASD,EAAmBC,CAAAA,CAAoC,CACrE,OAAO,IAAIF,CAAAA,CAAWC,CAAAA,CAAUC,CAAY,CAC9C,CAEA,OAAO,MAAA,CACLC,CAAAA,CACAD,EACY,CACZ,IAAID,EAAW,CAAA,CACf,IAAA,IAASX,EAAI,CAAA,CAAGA,CAAAA,CAAIa,EAAQ,MAAA,CAAQ,EAAEb,EAAG,CACvC,IAAMc,EAAMD,CAAAA,CAAQb,CAAC,CAAA,CACrB,GAAIc,CAAAA,YAAeJ,CAAAA,CACjBC,GAAYG,CAAAA,CAAI,KAAA,CAAQA,EAAI,MAAA,CAAA,KAAA,GACnBA,CAAAA,YAAe,WACxBH,CAAAA,EAAYG,CAAAA,CAAI,MAAA,CAAA,KAAA,GACPA,CAAAA,YAAe,WAAA,CACxBH,CAAAA,EAAYG,EAAI,UAAA,CAAA,KAAA,GACP,KAAA,CAAM,QAAQA,CAAG,CAAA,CAC1BH,GAAYG,CAAAA,CAAI,MAAA,CAAA,KAEhB,MAAM,SAAA,CAAU,gBAAgB,CAEpC,CAEA,GAAIH,CAAAA,GAAa,EACf,OAAO,IAAID,EAAW,CAAA,CAAGE,CAAY,EAGvC,IAAMG,CAAAA,CAAK,IAAIL,CAAAA,CAAWC,CAAAA,CAAUC,CAAY,CAAA,CAC1CI,CAAAA,CAAO,IAAI,UAAA,CAAWD,CAAAA,CAAG,MAAM,CAAA,CACjCE,CAAAA,CAAS,CAAA,CAEb,QAASjB,CAAAA,CAAI,CAAA,CAAGA,EAAIa,CAAAA,CAAQ,MAAA,CAAQ,EAAEb,CAAAA,CAAG,CACvC,IAAIc,CAAAA,CAAMD,CAAAA,CAAQb,CAAC,EACfc,CAAAA,YAAeJ,CAAAA,EACjBM,EAAK,GAAA,CAAI,IAAI,WAAWF,CAAAA,CAAI,MAAA,CAAQA,CAAAA,CAAI,MAAA,CAAQA,CAAAA,CAAI,KAAA,CAAQA,EAAI,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,WAAA,EACxBE,CAAAA,CAAK,GAAA,CAAI,IAAI,WAAWF,CAAG,CAAA,CAAGG,CAAM,CAAA,CACpCA,CAAAA,EAAUH,EAAI,UAAA,GAGdE,CAAAA,CAAK,GAAA,CAAIF,CAAAA,CAAiBG,CAAM,CAAA,CAChCA,GAAWH,CAAAA,CAAiB,MAAA,EAEhC,CAEA,OAAAC,CAAAA,CAAG,MAAQA,CAAAA,CAAG,MAAA,CAASE,CAAAA,CACvBF,CAAAA,CAAG,MAAA,CAAS,CAAA,CACLA,CACT,CAEA,OAAO,KACLG,CAAAA,CACAN,CAAAA,CACY,CACZ,GAAIM,CAAAA,YAAkBR,EAAY,CAChC,IAAMK,EAAKG,CAAAA,CAAO,KAAA,GAClB,OAAAH,CAAAA,CAAG,aAAe,EAAA,CACXA,CACT,CAEA,IAAIA,CAAAA,CACJ,GAAIG,aAAkB,UAAA,CACpBH,CAAAA,CAAK,IAAIL,CAAAA,CAAW,CAAA,CAAGE,CAAY,CAAA,CAC/BM,CAAAA,CAAO,MAAA,CAAS,CAAA,GAClBH,CAAAA,CAAG,MAAA,CAASG,EAAO,MAAA,CACnBH,CAAAA,CAAG,OAASG,CAAAA,CAAO,UAAA,CACnBH,EAAG,KAAA,CAAQG,CAAAA,CAAO,UAAA,CAAaA,CAAAA,CAAO,UAAA,CACtCH,CAAAA,CAAG,KAAO,IAAI,QAAA,CAASG,EAAO,MAAM,CAAA,CAAA,CAAA,KAAA,GAE7BA,aAAkB,WAAA,CAC3BH,CAAAA,CAAK,IAAIL,CAAAA,CAAW,CAAA,CAAGE,CAAY,CAAA,CAC/BM,CAAAA,CAAO,WAAa,CAAA,GACtBH,CAAAA,CAAG,OAASG,CAAAA,CACZH,CAAAA,CAAG,MAAA,CAAS,CAAA,CACZA,CAAAA,CAAG,KAAA,CAAQG,EAAO,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,IAAIL,CAAAA,CAAWQ,CAAAA,CAAO,MAAA,CAAQN,CAAY,CAAA,CAC/CG,EAAG,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,CAAAA,CACY,CACZ,OAAO,IAAA,CAAK,OAAOE,CAAAA,CAAQF,CAAM,CACnC,CAEA,SAAA,CAAUG,EAAeH,CAAAA,CAA6B,CACpD,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,IACnC,OAAII,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEVA,CAAAA,CAAS,CAAA,CAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAC3B,KAAK,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,EAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEVA,EAAS,CAAA,CAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAC3B,IAAA,CAAK,MAAA,CAAOA,EAAS,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,UAAA,CAAWG,CAAAA,CAAOH,CAAM,CACtC,CAEA,SAAA,CAAUA,CAAAA,CAAyB,CACjC,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,CAAAA,CAEd,IAAMG,EAAQ,IAAA,CAAK,IAAA,CAAK,SAASH,CAAM,CAAA,CACvC,OAAII,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,GACtBD,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,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,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAE/CC,CAAAA,GAAU,IAAA,CAAK,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,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,SAAA,CAAUA,EAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAEhDC,CAAAA,GAAU,IAAA,CAAK,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,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,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAE/CC,CAAAA,GAAU,IAAA,CAAK,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,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,SAAA,CAAUA,EAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAEhDC,CAAAA,GAAU,IAAA,CAAK,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,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,EAEd,IAAMG,CAAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAUH,EAAQ,IAAA,CAAK,YAAY,CAAA,CAC3D,OAAII,CAAAA,GACF,IAAA,CAAK,QAAU,CAAA,CAAA,CAEVD,CACT,CAEA,UAAA,CAAa,IAAA,CAAK,WAElB,MAAA,CAAOD,CAAAA,CAA0DF,CAAAA,CAA6B,CAC5F,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/BI,EAAUJ,CAAAA,CAAS,IAAA,CAAK,OACvBA,CAAAA,CAASA,CAAAA,CAEd,IAAIK,CAAAA,CAYJ,OAXIH,aAAkBT,CAAAA,EACpBY,CAAAA,CAAM,IAAI,UAAA,CAAWH,CAAAA,CAAO,OAAQA,CAAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,KAAA,CAAQA,CAAAA,CAAO,MAAM,EAC/EA,CAAAA,CAAO,MAAA,EAAUG,EAAI,MAAA,EACZH,CAAAA,YAAkB,WAC3BG,CAAAA,CAAMH,CAAAA,CACGA,CAAAA,YAAkB,WAAA,CAC3BG,CAAAA,CAAM,IAAI,WAAWH,CAAM,CAAA,CAE3BG,EAAM,IAAI,UAAA,CAAWH,CAAM,CAAA,CAGzBG,CAAAA,CAAI,MAAA,EAAU,CAAA,CAAU,IAAA,EAExBL,CAAAA,CAASK,EAAI,MAAA,CAAS,IAAA,CAAK,OAAO,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,IAAA,CAAK,MAAA,EAAUC,CAAAA,CAAI,MAAA,CAAA,CAC1B,KACT,CAEA,KAAA,CAAMC,EAA4B,CAChC,IAAMR,EAAK,IAAIL,CAAAA,CAAW,CAAA,CAAG,IAAA,CAAK,YAAY,CAAA,CAC9C,OAAIa,CAAAA,EACFR,CAAAA,CAAG,OAAS,IAAI,WAAA,CAAY,KAAK,MAAA,CAAO,UAAU,CAAA,CAClD,IAAI,UAAA,CAAWA,CAAAA,CAAG,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,IAAA,CAAO,IAAA,CAAK,IAAA,CAAA,CAEjBA,CAAAA,CAAG,OAAS,IAAA,CAAK,MAAA,CACjBA,EAAG,YAAA,CAAe,IAAA,CAAK,aACvBA,CAAAA,CAAG,KAAA,CAAQ,IAAA,CAAK,KAAA,CACTA,CACT,CAEA,KAAKS,CAAAA,CAAgBC,CAAAA,CAA0B,CAI7C,GAHID,CAAAA,GAAU,SAAWA,CAAAA,CAAQ,IAAA,CAAK,MAAA,CAAA,CAClCC,CAAAA,GAAQ,MAAA,GAAWA,CAAAA,CAAM,KAAK,KAAA,CAAA,CAE9BD,CAAAA,GAAUC,EACZ,OAAO,IAAIf,EAAW,CAAA,CAAG,IAAA,CAAK,YAAY,CAAA,CAG5C,IAAMC,EAAWc,CAAAA,CAAMD,CAAAA,CACjBT,EAAK,IAAIL,CAAAA,CAAWC,EAAU,IAAA,CAAK,YAAY,CAAA,CACrD,OAAAI,CAAAA,CAAG,MAAA,CAAS,EACZA,CAAAA,CAAG,KAAA,CAAQJ,EAEX,IAAI,UAAA,CAAWI,EAAG,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,CAAE,QAAA,CAASS,EAAOC,CAAG,CAAA,CAAG,CAAC,CAAA,CAC1EV,CACT,CAEA,MAAA,CACEW,CAAAA,CACAC,CAAAA,CACAC,EACAC,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,CAAAA,CACxCC,CAAAA,CAAcA,CAAAA,GAAgB,MAAA,CAAY,KAAK,KAAA,CAAQA,CAAAA,CAEvD,IAAME,CAAAA,CAAMF,CAAAA,CAAcD,EAC1B,OAAIG,CAAAA,GAAQ,CAAA,CAAUL,CAAAA,EAEtBA,CAAAA,CAAO,cAAA,CAAeC,EAAeI,CAAG,CAAA,CACxC,IAAI,UAAA,CAAWL,CAAAA,CAAO,MAAM,CAAA,CAAE,GAAA,CAC5B,IAAI,UAAA,CAAW,IAAA,CAAK,MAAM,EAAE,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,CAAepB,EAA8B,CAC3C,IAAIqB,CAAAA,CAAU,IAAA,CAAK,MAAA,CAAO,UAAA,CAC1B,OAAIA,CAAAA,CAAUrB,CAAAA,CACL,KAAK,MAAA,CAAA,CAAQqB,CAAAA,EAAW,GAAKrB,CAAAA,CAAWqB,CAAAA,CAAUrB,CAAQ,CAAA,CAE5D,IACT,CAEA,MAAmB,CACjB,OAAA,IAAA,CAAK,MAAQ,IAAA,CAAK,MAAA,CAClB,KAAK,MAAA,CAAS,CAAA,CACP,IACT,CAEA,MAAA,CAAOA,CAAAA,CAA8B,CACnC,GAAI,IAAA,CAAK,OAAO,UAAA,CAAaA,CAAAA,CAAU,CACrC,IAAMO,CAAAA,CAAS,IAAI,WAAA,CAAYP,CAAQ,EACvC,IAAI,UAAA,CAAWO,CAAM,CAAA,CAAE,GAAA,CAAI,IAAI,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CACtD,IAAA,CAAK,OAASA,CAAAA,CACd,IAAA,CAAK,KAAO,IAAI,QAAA,CAASA,CAAM,EACjC,CACA,OAAO,IACT,CAEA,IAAA,CAAKe,EAA4B,CAC/B,OAAA,IAAA,CAAK,QAAUA,CAAAA,CACR,IACT,CAEA,UAAA,CAAWb,CAAAA,CAAwBH,CAAAA,CAA6B,CAC9D,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,UAAA,EAC3B,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAS,CAAC,CAAA,CAGxB,IAAA,CAAK,KAAK,WAAA,CAAYA,CAAAA,CAAQG,EAAO,IAAA,CAAK,YAAY,CAAA,CAElDC,CAAAA,GAAU,IAAA,CAAK,MAAA,EAAU,GACtB,IACT,CAEA,UAAUD,CAAAA,CAAwBH,CAAAA,CAA6B,CAC7D,OAAO,IAAA,CAAK,UAAA,CAAWG,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,IAAA,CAAK,YAAY,CAAA,CAC7D,OAAII,IAAU,IAAA,CAAK,MAAA,EAAU,GACtBD,CACT,CAEA,SAASH,CAAAA,CAAyB,CAChC,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAM,CAC9B,CAEA,WAAA,CAAYG,EAAwBH,CAAAA,CAA6B,CAC/D,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CACnC,OAAII,CAAAA,CAAUJ,EAAS,IAAA,CAAK,MAAA,CACvBA,EAASA,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,CAAA,CAGxB,IAAA,CAAK,IAAA,CAAK,YAAA,CAAaA,EAAQG,CAAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAEnDC,CAAAA,GAAU,KAAK,MAAA,EAAU,CAAA,CAAA,CACtB,IACT,CAEA,WAAA,CAAYD,CAAAA,CAAwBH,EAA6B,CAC/D,OAAO,KAAK,WAAA,CAAYG,CAAAA,CAAOH,CAAM,CACvC,CAEA,UAAA,CAAWA,CAAAA,CAAyB,CAClC,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,IAC/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,IAAA,CAAK,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,OACdkB,CAAAA,CAAQ,IAAA,CAAK,MACnB,OAAI,CAACD,CAAAA,EAAajB,CAAAA,GAAW,CAAA,EAAKkB,CAAAA,GAAU,KAAK,MAAA,CAAO,UAAA,CAC/C,KAAK,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,aAAA,CAAcd,EAAeH,CAAAA,CAAsC,CACjE,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,EAEd,IAAMmB,CAAAA,CAAO,KAAK,iBAAA,CAAkBhB,CAAK,EAMzC,IALIH,CAAAA,CAASmB,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAA,EAC9B,KAAK,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,IAAA,CAAK,QAAA,CAASH,CAAAA,EAAAA,CAAUG,CAAK,EAE9BC,CAAAA,EACF,IAAA,CAAK,OAASJ,CAAAA,CACP,IAAA,EAEFmB,CACT,CAEA,YAAA,CAAanB,CAAAA,CAA6D,CACxE,IAAMI,CAAAA,CAAW,OAAOJ,CAAAA,CAAW,GAAA,CAC/B,OAAOA,CAAAA,CAAW,GAAA,GACpBA,EAAS,IAAA,CAAK,MAAA,CAAA,CAEhB,IAAIhB,CAAAA,CAAI,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,EAAI,GAAA,IAAU,CAAA,EAGxB,OAFAgB,CAAAA,EAAS,CAAA,CAELC,CAAAA,EACF,KAAK,MAAA,CAASJ,CAAAA,CACPG,GAEF,CAAE,KAAA,CAAAA,EAAO,MAAA,CAAQnB,CAAE,CAC5B,CAEA,iBAAA,CAAkBmB,CAAAA,CAAuB,CAEvC,OADAA,CAAAA,CAAQA,IAAU,CAAA,CACdA,CAAAA,CAAQ,IAAe,CAAA,CAClBA,CAAAA,CAAQ,KAAA,CAAgB,CAAA,CACxBA,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,EAAW,IAAA,CAAK,MAAA,CAASJ,CAAAA,CAEvCsB,CAAAA,CAAU1C,EAAAA,EAAW,CAAE,OAAOwC,CAAG,CAAA,CACjCN,EAAMQ,CAAAA,CAAQ,MAAA,CACdC,EAAgB,IAAA,CAAK,iBAAA,CAAkBT,CAAG,CAAA,CAYhD,OAVIO,CAAAA,CAAgBE,EAAgBT,CAAAA,CAAM,IAAA,CAAK,OAAO,UAAA,EACpD,IAAA,CAAK,OAAOO,CAAAA,CAAgBE,CAAAA,CAAgBT,CAAG,CAAA,CAGjD,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,OAASiB,CAAAA,CACP,IAAA,EAEFA,CAAAA,EAAiBrB,CAAAA,EAAU,CAAA,CACpC,CAEA,YAAYA,CAAAA,CAA8D,CACxE,IAAMI,CAAAA,CAAW,OAAOJ,EAAW,GAAA,CAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,IAAA,CAAK,MAAA,CACvBA,CAAAA,CAASA,EAEd,IAAMwB,CAAAA,CAAQxB,EACRyB,CAAAA,CAAY,IAAA,CAAK,aAAazB,CAAM,CAAA,CACpC0B,CAAAA,CAAWD,CAAAA,CAAU,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,GAAU0B,CAAAA,CAENtB,CAAAA,EACF,IAAA,CAAK,MAAA,CAASJ,CAAAA,CACPoB,CAAAA,EAEA,CACL,MAAA,CAAQA,CAAAA,CACR,OAAQpB,CAAAA,CAASwB,CACnB,CAEJ,CAEA,cAAA,CAAeR,CAAAA,CAAgBhB,CAAAA,CAA8D,CAC3F,IAAMI,EAAW,OAAOJ,CAAAA,CAAW,IAC/BI,CAAAA,CAAUJ,CAAAA,CAAS,KAAK,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,EACR,MAAA,CAAAJ,CACF,CAEJ,CACF,CAAA,KCzpBaY,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,4BAAA,CACA,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,MAAO,CAAA,CAyBP,UAAA,CAAY,CACV,eAAA,CAAiB,IAAA,CACjB,sBAAA,CAAwB,IACxB,qBAAA,CAAuB,CAAA,CACvB,MAAO,KAAA,CACP,iBAAA,CAAmB,IACnB,gBAAA,CAAkB,CAAA,CAClB,mBAAA,CAAqB,EAAA,CACrB,qBAAA,CAAuB,EAAA,CAWvB,kBAAmB,CACrB,CACF,EAuBMC,EAAAA,CAAoBC,CAAAA,EACxB,MAAM,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,OAAQA,CAAAA,EAAMA,CAAAA,CAAE,MAAA,CAAS,CAAA,EAAK,gBAAA,CAAiB,IAAA,CAAKA,CAAC,CAAC,CAC3D,CACF,CAAA,CACA,GAEOC,EAAAA,CAAYF,CAAAA,EAA0B,CACjD,IAAMG,CAAAA,CAAaJ,EAAAA,CAAiBC,CAAK,CAAA,CACpCG,CAAAA,CAAW,SAChBL,CAAAA,CAAO,KAAA,CAAQK,GACjB,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,OAAO,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,CAAAA,CAAKqD,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,CAAAA,EAAS,QAAA,CAAU,OACvC,IAAMC,CAAAA,CAAIhB,CAAAA,CAAO,WACXiB,CAAAA,CAAQC,CAAAA,EAA6B,OAAOA,CAAAA,EAAM,SAAA,CAClDC,CAAAA,CAAOD,CAAAA,EACX,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,IACjCC,CAAAA,CAAE,sBAAA,CAAyB,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAK,sBAAA,CAAwB,GAAK,CAAA,CAAA,CAEpEI,CAAAA,CAAIJ,EAAK,qBAAqB,CAAA,GAAGC,EAAE,qBAAA,CAAwBD,CAAAA,CAAK,qBAAA,CAAA,CAChEE,CAAAA,CAAKF,CAAAA,CAAK,KAAK,IAAGC,CAAAA,CAAE,KAAA,CAAQD,EAAK,KAAA,CAAA,CACjCI,CAAAA,CAAIJ,EAAK,iBAAiB,CAAA,GAAGC,CAAAA,CAAE,iBAAA,CAAoBD,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,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAK,sBAAuB,CAAC,CAAA,CAAA,CAG9DI,EAAIJ,CAAAA,CAAK,iBAAiB,IAC5BC,CAAAA,CAAE,iBAAA,CAAoB,IAAA,CAAK,GAAA,CAAID,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,KAAOF,CAAAA,CACZ,IAAA,CAAK,QAAA,CAAWC,CAAAA,CAChB,IAAA,CAAK,UAAA,CAAaC,GAAc,KAClC,CAQA,OAAO,IAAA,CAAKC,CAAAA,CAAgB,CAC1B,GAAI,OAAOA,CAAAA,EAAW,QAAA,CAAU,CAC9B,IAAMC,EAAOC,mBAAAA,CAAWF,CAAM,EAC1BF,CAAAA,CAAW,QAAA,CAASK,oBAAWF,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,CAAAA,CAAUC,CAAU,CACjD,MACE,MAAM,IAAI,MAAM,0BAA0B,CAE9C,CAMA,QAAA,EAAW,CACT,IAAMnD,CAAAA,CAAS,IAAI,UAAA,CAAW,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CACxC,OAAI,KAAK,UAAA,CACPA,CAAAA,CAAO,CAAC,CAAA,CAAK,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,mBAAAA,CAAW,IAAA,CAAK,QAAA,EAAU,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,UAAYA,CAAAA,CAAQ,MAAA,GAAW,EAAA,CAEnD,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA,CAEvD,OAAOA,GAAY,QAAA,GACrBA,CAAAA,CAAUF,oBAAWE,CAAO,CAAA,CAAA,CAE9B,IAAMC,CAAAA,CAAMC,sBAAAA,CAAU,UAAU,SAAA,CAAU,IAAA,CAAK,KAAM,SAAS,CAAA,CACxDL,EAAO,IAAIK,sBAAAA,CAAU,SAAA,CAAUD,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,EAAG,IAAA,CAAK,QAAQ,EAChE,OAAO,IAAIE,EAAUN,CAAAA,CAAK,gBAAA,CAAiBG,CAAO,CAAA,CAAE,OAAA,EAAS,CAC/D,CACF,MC5FaG,CAAAA,CAAN,MAAMC,CAAU,CACrB,GAAA,CACA,MAAA,CAOA,WAAA,CAAYC,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,CAAAA,CAAI,MAAA,EAAUC,CAAAA,CAAe,OAC1D,MAAM,IAAI,MAAM,oBAAoB,CAAA,CAEtC,IAAMF,CAAAA,CAASC,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAGC,CAAAA,CAAe,MAAM,EACjD,GAAIF,CAAAA,GAAWE,EACb,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8BA,CAAc,CAAA,CAAE,CAAA,CAEhE,IAAIhE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAASiE,oBAAK,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,EAAA,CACpB,MAAM,IAAI,MAAM,2BAA2B,CAAA,CAE7C,IAAM6D,CAAAA,CAAM7D,CAAAA,CAAO,SAAS,CAAA,CAAG,EAAE,CAAA,CAC3BkE,CAAAA,CAAWlE,CAAAA,CAAO,QAAA,CAAS,GAAI,EAAE,CAAA,CACjCmE,EAAmBC,mBAAAA,CAAUP,CAAG,EAAE,QAAA,CAAS,CAAA,CAAG,CAAC,CAAA,CACrD,GAAI,CAACQ,GAAkBH,CAAAA,CAAUC,CAAgB,EAC/C,MAAM,IAAI,MAAM,8BAA8B,CAAA,CAEhD,GAAI,CACFT,sBAAAA,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,OAAOsD,CAAAA,CAAqBc,CAAAA,CAAwC,CAClE,OAAI,OAAOA,CAAAA,EAAc,WACvBA,CAAAA,CAAYvB,EAAAA,CAAU,KAAKuB,CAAS,CAAA,CAAA,CAE/BZ,uBAAU,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,QAAiB,CACf,OAAO,IAAA,CAAK,QAAA,EACd,CAMA,SAAkB,CAChB,OAAO,cAAc,IAAA,CAAK,QAAA,EAAU,CAAA,CACtC,CACF,CAAA,CAEMA,EAAAA,CAAe,CAACV,CAAAA,CAAiBC,IAA2B,CAChE,IAAMI,EAAWE,mBAAAA,CAAUP,CAAG,EAC9B,OAAOC,CAAAA,CAASG,oBAAK,MAAA,CAAO,IAAI,WAAW,CAAC,GAAGJ,EAAK,GAAGK,CAAAA,CAAS,SAAS,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAClF,EAEMG,EAAAA,CAAoB,CAACG,EAAetF,CAAAA,GAA2B,CACnE,GAAIsF,CAAAA,CAAE,UAAA,GAAetF,CAAAA,CAAE,UAAA,CAAY,OAAO,MAAA,CAC1C,QAASJ,CAAAA,CAAI,CAAA,CAAGA,EAAI0F,CAAAA,CAAE,UAAA,CAAY1F,IAChC,GAAI0F,CAAAA,CAAE1F,CAAC,CAAA,GAAMI,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,OAASD,CAAAA,CACd,IAAA,CAAK,MAAA,CAASC,CAAAA,GAAW,MAAA,CAAS,OAAA,CAAUA,IAAW,KAAA,CAAQ,KAAA,CAAQA,EACzE,CAGA,OAAO,WAAWxB,CAAAA,CAAgByB,CAAAA,CAAgC,IAAA,CAAa,CAC7E,GAAM,CAACC,EAAcF,CAAM,CAAA,CAAIxB,EAAO,KAAA,CAAM,GAAG,EAC/C,GAAI,CAAC,OAAA,CAAS,OAAA,CAAS,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,EAC/B,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCA,CAAc,CAAA,MAAA,EAASD,CAAM,CAAA,CAAE,CAAA,CAEpF,IAAMD,CAAAA,CAAS,MAAA,CAAO,WAAWG,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,CAAA,MAAA,EAAS1E,CAAAA,CAAM,MAAM,EAAE,CAAA,CAElF,OAAOA,CACT,CAAA,KAAO,CAAA,GAAI,OAAOA,CAAAA,EAAU,QAAA,EAAY,MAAA,CAAO,QAAA,CAASA,CAAK,CAAA,CAC3D,OAAO,IAAIwE,CAAAA,CAAMxE,EAAO0E,CAAAA,EAAU,OAAO,EACpC,GAAI,OAAO1E,CAAAA,EAAU,QAAA,CAC1B,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,QACX,KAAK,OAAA,CACL,KAAK,KAAA,CACL,KAAK,QACL,KAAK,KAAA,CACL,KAAK,KAAA,CACL,KAAK,OACH,OAAO,CAAA,CACT,KAAK,OAAA,CACH,OAAO,CAAA,CACT,QACE,OAAO,CACX,CACF,CAGA,QAAA,EAAW,CACT,OAAO,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,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,CAAAA,CACEA,CAAAA,YAAiB,UAAA,CACnB,IAAI8E,CAAAA,CAAU9E,CAAK,EACjB,OAAOA,CAAAA,EAAU,SACnB,IAAI8E,CAAAA,CAAU1B,mBAAAA,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,oBAAW,IAAA,CAAK,MAAM,CAC/B,CAEA,MAAA,EAAS,CACP,OAAO,IAAA,CAAK,QAAA,EACd,CACF,CAAA,CCtBA,IAAM0B,CAAAA,CAAgB,CACpB,IAAA,CAAM,CAAA,CACN,OAAA,CAAS,CAAA,CACT,SAAU,CAAA,CACV,mBAAA,CAAqB,EACrB,gBAAA,CAAkB,CAAA,CAClB,mBAAoB,CAAA,CACpB,kBAAA,CAAoB,CAAA,CACpB,YAAA,CAAc,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,GACjB,0BAAA,CAA4B,EAAA,CAC5B,mBAAA,CAAqB,EAAA,CACrB,aAAA,CAAe,EAAA,CACf,uBAAwB,EAAA,CACxB,wBAAA,CAA0B,GAC1B,eAAA,CAAiB,EAAA,CACjB,wBAAyB,EAAA,CACzB,eAAA,CAAiB,EAAA,CACjB,cAAA,CAAgB,EAAA,CAChB,cAAA,CAAgB,GAEhB,cAAA,CAAgB,EAAA,CAChB,oBAAqB,EAAA,CACrB,qBAAA,CAAuB,GACvB,4BAAA,CAA8B,EAAA,CAE9B,qBAAA,CAAuB,EAAA,CACvB,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,gBAAiB,EAAA,CACjB,sBAAA,CAAwB,EAAA,CACxB,kBAAA,CAAoB,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,GAAkB,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,EAAO,UAAA,CAAWiD,CAAI,EACxB,CAAA,CAEMsC,EAAAA,CAAmB,CAACvF,EAAoBiD,CAAAA,GAAiB,CAC7DjD,EAAO,WAAA,CAAYiD,CAAI,EACzB,CAAA,CAEMuC,CAAAA,CAAmB,CAACxF,CAAAA,CAAoBiD,CAAAA,GAAiB,CAC7DjD,EAAO,WAAA,CAAYiD,CAAI,EACzB,CAAA,CAEMwC,EAAAA,CAAmB,CAACzF,CAAAA,CAAoBiD,CAAAA,GAA0B,CACtEjD,CAAAA,CAAO,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,IAAc,CACxC,GAAM,CAAC4C,CAAAA,CAAIC,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,GAAM,IAAA,CAAKxB,CAAI,CAAA,CACvBgD,CAAAA,CAAYD,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,QAAS,CAAA,CAAI,CAAA,CAAG,CAAA,CAAI,CAAA,CAAG,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,KAAKiD,CAAAA,CAAO,GAAG,CAAA,CAAE,OAAA,EAAQ,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,EAAO,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,EAAAA,CAAmB,CAAClF,CAAAA,CAAsB,IAAA,GACvC,CAAClB,CAAAA,CAAoBiD,CAAAA,GAA0C,CACpEA,CAAAA,CAAO8B,EAAAA,CAAU,IAAA,CAAK9B,CAAI,CAAA,CAC1B,IAAMpC,EAAMoC,CAAAA,CAAK,MAAA,CAAO,OACxB,GAAI/B,CAAAA,CAAAA,CACF,GAAIL,CAAAA,GAAQK,CAAAA,CACV,MAAM,IAAI,KAAA,CAAM,wCAAwCA,CAAI,CAAA,YAAA,EAAeL,CAAG,CAAA,CAAE,CAAA,CAAA,KAGlFb,EAAO,aAAA,CAAca,CAAG,CAAA,CAE1Bb,CAAAA,CAAO,MAAA,CAAOiD,CAAAA,CAAK,MAAM,EAC3B,CAAA,CAGIoD,GAA2BD,EAAAA,EAAiB,CAE5CE,GAAoB,CAACC,CAAAA,CAAoBC,CAAAA,GACtC,CAACxG,CAAAA,CAAoBiD,CAAAA,GAAc,CACxCjD,CAAAA,CAAO,aAAA,CAAciD,EAAK,MAAM,CAAA,CAChC,OAAW,CAACY,CAAAA,CAAK3D,CAAK,CAAA,GAAK+C,CAAAA,CACzBsD,CAAAA,CAAcvG,EAAQ6D,CAAG,CAAA,CACzB2C,EAAgBxG,CAAAA,CAAQE,CAAK,EAEjC,CAAA,CAGIuG,CAAAA,CAAmBC,GAChB,CAAC1G,CAAAA,CAAoBiD,IAAgB,CAC1CjD,CAAAA,CAAO,cAAciD,CAAAA,CAAK,MAAM,EAChC,IAAA,IAAW6C,CAAAA,IAAQ7C,CAAAA,CACjByD,CAAAA,CAAe1G,CAAAA,CAAQ8F,CAAI,EAE/B,CAAA,CAGIa,EAAAA,CAAoBC,GACjB,CAAC5G,CAAAA,CAAoBiD,IAAc,CACxC,IAAA,GAAW,CAACY,CAAAA,CAAKgD,CAAU,CAAA,GAAKD,EAC9B,GAAI,CACFC,EAAW7G,CAAAA,CAAQiD,CAAAA,CAAKY,CAAG,CAAC,EAC9B,CAAA,MAASiD,CAAAA,CAAY,CACnB,MAAAA,EAAM,OAAA,CAAU,CAAA,EAAGjD,CAAG,CAAA,EAAA,EAAKiD,CAAAA,CAAM,OAAO,CAAA,CAAA,CAClCA,CACR,CAEJ,CAAA,CAGIC,EAAAA,CAAsBP,GACnB,CAACxG,CAAAA,CAAoBiD,IAA0B,CAChDA,CAAAA,GAAS,QACXjD,CAAAA,CAAO,SAAA,CAAU,CAAC,CAAA,CAClBwG,CAAAA,CAAgBxG,CAAAA,CAAQiD,CAAI,CAAA,EAE5BjD,CAAAA,CAAO,UAAU,CAAC,EAEtB,EAGIgH,CAAAA,CAAsBL,EAAAA,CAAiB,CAC3C,CAAC,kBAAA,CAAoBnB,CAAgB,EACrC,CAAC,eAAA,CAAiBc,GAAkBnB,CAAAA,CAAkBI,EAAgB,CAAC,CAAA,CACvE,CAAC,WAAA,CAAae,EAAAA,CAAkBH,EAAAA,CAAqBZ,EAAgB,CAAC,CACxE,CAAC,EAEK0B,EAAAA,CAAwBN,EAAAA,CAAiB,CAC7C,CAAC,SAAA,CAAWxB,CAAgB,CAAA,CAC5B,CAAC,SAAUI,EAAgB,CAC7B,CAAC,CAAA,CAEK2B,EAAAA,CAAkBP,GAAiB,CACvC,CAAC,MAAA,CAAQZ,CAAe,CAAA,CACxB,CAAC,QAASA,CAAe,CAC3B,CAAC,CAAA,CAWKoB,EAAAA,CAA4BR,GAAiB,CACjD,CAAC,sBAAA,CAAwBZ,CAAe,CAAA,CACxC,CAAC,qBAAsBP,CAAgB,CAAA,CACvC,CAAC,mBAAA,CAAqBD,EAAgB,CACxC,CAAC,CAAA,CAEK6B,CAAAA,CAA0B,CAACC,CAAAA,CAA0BC,CAAAA,GAAqB,CAC9E,IAAMC,CAAAA,CAAmBZ,GAAiBW,CAAW,CAAA,CACrD,OAAO,CAACtH,CAAAA,CAAoBiD,IAAc,CACxCjD,CAAAA,CAAO,cAAcqH,CAAW,CAAA,CAChCE,EAAiBvH,CAAAA,CAAQiD,CAAI,EAC/B,CACF,CAAA,CAEMuE,CAAAA,CAAmF,EAAC,CAE1FA,CAAAA,CAAqB,eAAiBJ,CAAAA,CAAwBnC,CAAAA,CAAc,eAAgB,CAC1F,CAAC,MAAOc,CAAe,CAAA,CACvB,CAAC,SAAA,CAAWZ,CAAgB,CAAA,CAC5B,CAAC,kBAAA,CAAoBA,CAAgB,EACrC,CAAC,OAAA,CAAS6B,CAAmB,CAAA,CAC7B,CAAC,QAAA,CAAUA,CAAmB,CAAA,CAC9B,CAAC,UAAWA,CAAmB,CAAA,CAC/B,CAAC,UAAA,CAAYb,EAAmB,EAChC,CAAC,eAAA,CAAiBhB,CAAgB,CACpC,CAAC,EAEDqC,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,CAAA,CACrC,CAAC,OAAA,CAAS6B,CAAmB,EAC7B,CAAC,QAAA,CAAUA,CAAmB,CAAA,CAC9B,CAAC,UAAWA,CAAmB,CAAA,CAC/B,CAAC,UAAA,CAAYb,EAAmB,CAAA,CAChC,CAAC,eAAA,CAAiBhB,CAAgB,EAClC,CAAC,YAAA,CAAcsB,EAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,EAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,EAAc,cAAA,CAAgB,CAC1F,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,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,WAAYb,EAAmB,CAAA,CAChC,CAAC,eAAA,CAAiBhB,CAAgB,CACpC,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,sBAAwBJ,CAAAA,CAC3CnC,CAAAA,CAAc,sBACd,CACE,CAAC,UAAWE,CAAgB,CAAA,CAC5B,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,CAAA,CAEA8B,CAAAA,CAAqB,4BAAA,CAA+BJ,CAAAA,CAClDnC,EAAc,4BAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,EACzB,CAAC,YAAA,CAAcK,CAAgB,CACjC,CACF,CAAA,CAEAgC,EAAqB,uBAAA,CAA0BJ,CAAAA,CAC7CnC,EAAc,uBAAA,CACd,CACE,CAAC,oBAAA,CAAsBE,CAAgB,EACvC,CAAC,sBAAA,CAAwBA,CAAgB,CAAA,CACzC,CAAC,aAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,CAAAA,CAAqB,aAAA,CAAgBJ,CAAAA,CAAwBnC,EAAc,aAAA,CAAe,CACxF,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,KAAA,CAAOY,CAAe,CAAA,CACvB,CAAC,YAAA,CAAcU,EAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAEDsC,EAAqB,oBAAA,CAAuBJ,CAAAA,CAC1CnC,CAAAA,CAAc,oBAAA,CACd,CACE,CAAC,UAAWE,CAAgB,CAAA,CAC5B,CAAC,aAAA,CAAeY,CAAe,EAC/B,CAAC,YAAA,CAAcA,CAAe,CAAA,CAC9B,CAAC,eAAgBA,CAAe,CAClC,CACF,CAAA,CAEAyB,CAAAA,CAAqB,QAAUJ,CAAAA,CAAwBnC,CAAAA,CAAc,OAAA,CAAS,CAC5E,CAAC,eAAA,CAAiBE,CAAgB,CAAA,CAClC,CAAC,kBAAmBA,CAAgB,CAAA,CACpC,CAAC,QAAA,CAAUA,CAAgB,CAAA,CAC3B,CAAC,UAAA,CAAYA,CAAgB,EAC7B,CAAC,OAAA,CAASA,CAAgB,CAAA,CAC1B,CAAC,OAAQA,CAAgB,CAAA,CACzB,CAAC,eAAA,CAAiBA,CAAgB,CACpC,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,gBAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,gBAAiB,CAC5F,CAAC,SAAUE,CAAgB,CAAA,CAC3B,CAAC,UAAA,CAAYA,CAAgB,EAC7B,CAAC,qBAAA,CAAuBY,CAAe,CAAA,CACvC,CAAC,aAAA,CAAeR,EAAgB,CAAA,CAChC,CAAC,cAAeG,EAAiB,CAAA,CACjC,CAAC,wBAAA,CAA0BA,EAAiB,EAC5C,CACE,YAAA,CACAe,CAAAA,CACEd,EAAAA,CAAwB,CACtBgB,EAAAA,CAAiB,CAAC,CAAC,eAAA,CAAiBF,EAAgBQ,EAAqB,CAAC,CAAC,CAAC,CAC9E,CAAC,CACH,CACF,CACF,CAAC,CAAA,CAEDO,CAAAA,CAAqB,QAAUJ,CAAAA,CAAwBnC,CAAAA,CAAc,QAAS,CAC5E,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,WAAA,CAAaK,CAAgB,EAC9B,CAAC,QAAA,CAAUO,CAAe,CAC5B,CAAC,CAAA,CAEDyB,CAAAA,CAAqB,sBAAA,CAAyBJ,CAAAA,CAC5CnC,EAAc,sBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,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,MAAA,CAASJ,EAAwBnC,CAAAA,CAAc,MAAA,CAAQ,CAC1E,CAAC,gBAAA,CAAkBwB,CAAAA,CAAgBtB,CAAgB,CAAC,CAAA,CACpD,CAAC,IAAA,CAAMI,EAAgB,EACvB,CAAC,MAAA,CAAQc,EAAwB,CACnC,CAAC,CAAA,CAYDmB,CAAAA,CAAqB,WAAA,CAAcJ,CAAAA,CAAwBnC,EAAc,WAAA,CAAa,CACpF,CAAC,gBAAA,CAAkBwB,CAAAA,CAAgBtB,CAAgB,CAAC,CAAA,CACpD,CAAC,wBAAA,CAA0BsB,CAAAA,CAAgBtB,CAAgB,CAAC,CAAA,CAC5D,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,MAAA,CAAQA,CAAgB,CAC3B,CAAC,CAAA,CAEDqC,EAAqB,qBAAA,CAAwBJ,CAAAA,CAC3CnC,EAAc,qBAAA,CACd,CACE,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,SAAA,CAAWO,EAAiB,CAC/B,CACF,CAAA,CAEA8B,EAAqB,uBAAA,CAA0BJ,CAAAA,CAC7CnC,EAAc,uBAAA,CACd,CACE,CAAC,WAAA,CAAaE,CAAgB,CAAA,CAC9B,CAAC,WAAA,CAAaA,CAAgB,EAC9B,CAAC,gBAAA,CAAkBY,CAAe,CACpC,CACF,CAAA,CAEAyB,CAAAA,CAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,EAAc,cAAA,CAAgB,CAC1F,CAAC,QAAA,CAAUE,CAAgB,EAC3B,CAAC,UAAA,CAAYA,CAAgB,CAC/B,CAAC,EAEDqC,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,CAAA,CACxB,CAAC,WAAA,CAAaK,CAAgB,EAC9B,CAAC,SAAA,CAAWE,EAAiB,CAC/B,CAAC,EAED8B,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,WAAA,CAAaK,CAAgB,CAChC,CAAC,CAAA,CAEDgC,CAAAA,CAAqB,cAAA,CAAiBJ,CAAAA,CAAwBnC,EAAc,cAAA,CAAgB,CAC1F,CAAC,MAAA,CAAQE,CAAgB,EACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,OAAA,CAASA,CAAgB,CAAA,CAC1B,CAAC,MAAOA,CAAgB,CAAA,CACxB,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,WAAA,CAAaK,CAAgB,EAC9B,CAAC,YAAA,CAAcO,CAAe,CAAA,CAC9B,CAAC,cAAeA,CAAe,CACjC,CAAC,CAAA,CAEDyB,CAAAA,CAAqB,gBAAkBJ,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,WAAA,CAAaP,CAAgB,CAAA,CAC9B,CAAC,QAASL,CAAgB,CAAA,CAC1B,CAAC,KAAA,CAAOY,CAAe,EACvB,CAAC,WAAA,CAAaZ,CAAgB,CAAA,CAC9B,CAAC,uBAAA,CAAyBe,EAAc,CAAA,CACxC,CAAC,oBAAqBA,EAAc,CACtC,CAAC,CAAA,CAEDsB,CAAAA,CAAqB,aAAeJ,CAAAA,CAAwBnC,CAAAA,CAAc,aAAc,CACtF,CAAC,YAAaE,CAAgB,CAAA,CAC9B,CAAC,eAAA,CAAiB+B,EAAe,CACnC,CAAC,CAAA,CAEDM,CAAAA,CAAqB,mBAAqBJ,CAAAA,CACxCnC,CAAAA,CAAc,mBACd,CACE,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,SAAA,CAAWK,CAAgB,CAC9B,CACF,CAAA,CAEAgC,CAAAA,CAAqB,mBAAqBJ,CAAAA,CACxCnC,CAAAA,CAAc,mBACd,CACE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,UAAWK,CAAgB,CAAA,CAC5B,CAAC,gBAAA,CAAkBO,CAAe,EAClC,CAAC,gBAAA,CAAkBA,CAAe,CAAA,CAClC,CAAC,eAAgBL,EAAiB,CAAA,CAClC,CAAC,YAAA,CAAcQ,EAAc,CAC/B,CACF,CAAA,CAEAsB,CAAAA,CAAqB,mBAAA,CAAsBJ,CAAAA,CACzCnC,CAAAA,CAAc,oBACd,CACE,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,SAAA,CAAWK,CAAgB,CAAA,CAC5B,CAAC,gBAAA,CAAkBO,CAAe,EAClC,CAAC,eAAA,CAAiBmB,EAAe,CAAA,CACjC,CAAC,eAAgBxB,EAAiB,CAAA,CAClC,CAAC,YAAA,CAAcQ,EAAc,CAC/B,CACF,CAAA,CAEAsB,CAAAA,CAAqB,gBAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,gBAAiB,CAC5F,CAAC,qBAAsBE,CAAgB,CAAA,CACvC,CAAC,qBAAA,CAAuB6B,CAAmB,EAC3C,CAAC,wBAAA,CAA0BA,CAAmB,CAAA,CAC9C,CAAC,YAAA,CAAcP,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAYDsC,EAAqB,wBAAA,CAA2BJ,CAAAA,CAC9CnC,EAAc,wBAAA,CACd,CACE,CAAC,kBAAA,CAAoBE,CAAgB,CAAA,CACrC,CAAC,oBAAA,CAAsBA,CAAgB,EACvC,CAAC,qBAAA,CAAuB6B,CAAmB,CAAA,CAC3C,CAAC,YAAA,CAAcP,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,CAAA,CAEAsC,EAAqB,aAAA,CAAgBJ,CAAAA,CAAwBnC,EAAc,aAAA,CAAe,CACxF,CAAC,eAAA,CAAiBE,CAAgB,EAClC,CAAC,kBAAA,CAAoBA,CAAgB,CAAA,CACrC,CAAC,sBAAuB6B,CAAmB,CAC7C,CAAC,CAAA,CAEDQ,CAAAA,CAAqB,iBAAA,CAAoBJ,EAAwBnC,CAAAA,CAAc,iBAAA,CAAmB,CAChG,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,uBAAA,CAAyBA,CAAgB,CAAA,CAC1C,CAAC,gBAAiBA,CAAgB,CACpC,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,2BAA6BJ,CAAAA,CAChDnC,CAAAA,CAAc,0BAAA,CACd,CACE,CAAC,cAAA,CAAgBE,CAAgB,CAAA,CACjC,CAAC,aAAcA,CAAgB,CAAA,CAC/B,CAAC,SAAA,CAAWI,EAAgB,EAC5B,CAAC,WAAA,CAAaG,EAAiB,CACjC,CACF,EAEA8B,CAAAA,CAAqB,QAAA,CAAWJ,EAAwBnC,CAAAA,CAAc,QAAA,CAAU,CAC9E,CAAC,MAAA,CAAQE,CAAgB,EACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,SAAUY,CAAe,CAAA,CAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAC3B,CAAC,CAAA,CAEDqC,CAAAA,CAAqB,sBAAwBJ,CAAAA,CAC3CnC,CAAAA,CAAc,sBACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,aAAcK,CAAgB,CAAA,CAC/B,CAAC,IAAA,CAAML,CAAgB,EACvB,CAAC,QAAA,CAAUY,CAAe,CAAA,CAC1B,CAAC,OAAQZ,CAAgB,CAC3B,CACF,CAAA,CAEAqC,CAAAA,CAAqB,oBAAsBJ,CAAAA,CACzCnC,CAAAA,CAAc,mBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,KAAMA,CAAgB,CAAA,CACvB,CAAC,QAAA,CAAUY,CAAe,CAAA,CAC1B,CAAC,MAAA,CAAQZ,CAAgB,CAC3B,CACF,CAAA,CAEAqC,EAAqB,mBAAA,CAAsBJ,CAAAA,CACzCnC,EAAc,mBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,EACvB,CAAC,QAAA,CAAUY,CAAe,CAC5B,CACF,EAEAyB,CAAAA,CAAqB,IAAA,CAAOJ,EAAwBnC,CAAAA,CAAc,IAAA,CAAM,CACtE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,QAAA,CAAUA,CAAgB,CAAA,CAC3B,CAAC,WAAYA,CAAgB,CAAA,CAC7B,CAAC,QAAA,CAAUC,EAAe,CAC5B,CAAC,CAAA,CAEDoC,CAAAA,CAAqB,gBAAA,CAAmBJ,CAAAA,CAAwBnC,CAAAA,CAAc,iBAAkB,CAC9F,CAAC,UAAWE,CAAgB,CAAA,CAC5B,CAAC,gBAAA,CAAkBY,CAAe,CACpC,CAAC,CAAA,CAEDyB,CAAAA,CAAqB,eAAiBJ,CAAAA,CAAwBnC,CAAAA,CAAc,eAAgB,CAC1F,CAAC,QAASE,CAAgB,CAAA,CAC1B,CAAC,KAAA,CAAOA,CAAgB,EACxB,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,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,QAASmB,EAAAA,CAAkBnB,CAAAA,CAAkBkB,EAAwB,CAAC,CAAA,CACvE,CAAC,YAAA,CAAcI,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,EAEAsC,CAAAA,CAAqB,eAAA,CAAkBJ,EAAwBnC,CAAAA,CAAc,eAAA,CAAiB,CAC5F,CAAC,SAAA,CAAWE,CAAgB,CAAA,CAC5B,CAAC,QAAS4B,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CACjD,CAAC,SAAUD,EAAAA,CAAmBC,CAAmB,CAAC,CAAA,CAClD,CAAC,SAAA,CAAWD,GAAmBC,CAAmB,CAAC,EACnD,CAAC,UAAA,CAAYD,GAAmBZ,EAAmB,CAAC,CAAA,CACpD,CAAC,eAAA,CAAiBhB,CAAgB,EAClC,CAAC,uBAAA,CAAyBA,CAAgB,CAAA,CAC1C,CAAC,aAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAEDsC,EAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,EAAc,eAAA,CAAiB,CAC5F,CAAC,SAAA,CAAWE,CAAgB,EAC5B,CAAC,UAAA,CAAYA,CAAgB,CAAA,CAC7B,CAAC,aAAce,EAAc,CAAA,CAC7B,CAAC,UAAA,CAAYA,EAAc,CAAA,CAC3B,CAAC,WAAA,CAAaH,CAAe,EAC7B,CAAC,SAAA,CAAWZ,CAAgB,CAAA,CAC5B,CAAC,WAAYA,CAAgB,CAAA,CAC7B,CAAC,YAAA,CAAcsB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,EAEDsC,CAAAA,CAAqB,qBAAA,CAAwBJ,EAC3CnC,CAAAA,CAAc,qBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,EAC1B,CAAC,cAAA,CAAgBsB,EAAgBpB,EAAe,CAAC,EACjD,CAAC,SAAA,CAAWK,EAAiB,CAAA,CAC7B,CAAC,aAAce,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CACF,EAEAsC,CAAAA,CAAqB,eAAA,CAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,eAAA,CAAiB,CAC5F,CAAC,gBAAA,CAAkBE,CAAgB,EACnC,CAAC,cAAA,CAAgBsB,EAAgBpB,EAAe,CAAC,CAAA,CACjD,CAAC,YAAA,CAAcoB,CAAAA,CAAgBvB,EAAc,CAAC,CAChD,CAAC,CAAA,CAED,IAAMuC,GAA2Bd,EAAAA,CAAiB,CAAC,CAAC,UAAA,CAAYT,EAAc,CAAC,CAAC,CAAA,CAEhFsB,CAAAA,CAAqB,gBAAkBJ,CAAAA,CAAwBnC,CAAAA,CAAc,gBAAiB,CAC5F,CAAC,cAAeQ,EAAgB,CAAA,CAChC,CAAC,SAAA,CAAWN,CAAgB,EAC5B,CAAC,WAAA,CAAaY,CAAe,CAAA,CAC7B,CAAC,SAAA,CAAWZ,CAAgB,CAAA,CAC5B,CAAC,WAAYA,CAAgB,CAAA,CAC7B,CACE,YAAA,CACAsB,CAAAA,CAAgBd,GAAwB,CAACT,EAAAA,CAAgBuC,EAAwB,CAAC,CAAC,CACrF,CACF,CAAC,CAAA,CAEDD,EAAqB,sBAAA,CAAyBJ,CAAAA,CAC5CnC,EAAc,sBAAA,CACd,CACE,CAAC,OAAA,CAASE,CAAgB,CAAA,CAC1B,CAAC,WAAA,CAAaK,CAAgB,EAC9B,CAAC,QAAA,CAAUO,CAAe,CAC5B,CACF,EAEAyB,CAAAA,CAAqB,kBAAA,CAAqBJ,EACxCnC,CAAAA,CAAc,kBAAA,CACd,CACE,CAAC,MAAA,CAAQE,CAAgB,CAAA,CACzB,CAAC,IAAA,CAAMA,CAAgB,CAAA,CACvB,CAAC,SAAUY,CAAe,CAAA,CAC1B,CAAC,MAAA,CAAQZ,CAAgB,EACzB,CAAC,YAAA,CAAcI,EAAgB,CAAA,CAC/B,CAAC,YAAA,CAAcA,EAAgB,CAAA,CAC/B,CACE,aACAkB,CAAAA,CACEE,EAAAA,CAAiB,CACf,CAAC,MAAA,CAAQrB,EAAe,CAAA,CACxB,CAAC,OAAA,CAASqB,GAAiB,CAAC,CAAC,UAAWrB,EAAe,CAAC,CAAC,CAAC,CAC5D,CAAC,CACH,CACF,CACF,CACF,CAAA,CAEA,IAAMoC,EAAAA,CAAsB,CAAC1H,EAAoB2H,CAAAA,GAAyB,CACxE,IAAMd,CAAAA,CAAaW,CAAAA,CAAqBG,CAAAA,CAAU,CAAC,CAAC,CAAA,CACpD,GAAI,CAACd,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCc,CAAAA,CAAU,CAAC,CAAC,EAAE,CAAA,CAEhE,GAAI,CACFd,CAAAA,CAAW7G,CAAAA,CAAQ2H,EAAU,CAAC,CAAC,EACjC,CAAA,MAASb,CAAAA,CAAY,CACnB,MAAAA,CAAAA,CAAM,OAAA,CAAU,GAAGa,CAAAA,CAAU,CAAC,CAAC,CAAA,EAAA,EAAKb,CAAAA,CAAM,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,CAAA,CACnD,CAAC,YAAA,CAAcjB,CAAAA,CAAgBtB,CAAgB,CAAC,CAClD,CAAC,CAAA,CAEK0C,EAAAA,CAA0BlB,GAAiB,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,GAAa,CAExB,KAAA,CAAO/B,CAAAA,CAUP,IAAA,CAAM8B,EAAAA,CAIN,KAAA,CAAOX,GACP,SAAA,CAAWf,EAAAA,CAEX,OAAQhB,CAAAA,CACR,WAAA,CAAayC,GACb,MAAA,CAAQrC,EAAAA,CACR,MAAA,CAAQC,CAIV,CAAA,CCvwBO,IAAMuC,EAAAA,CAASC,CAAAA,EACb,IAAI,OAAA,CAASC,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAASD,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,QAAQ,QAAA,EAAY,IAAA,EACpB,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAQ,IAE7B,MAAQ,CACN,OAAO,MACT,CACF,CAAA,IAOA,SAASC,EAAAA,EAAgD,CACvD,OAAOD,EAAAA,CAAgB,CAAE,aAAcvG,CAAAA,CAAO,SAAU,EAAI,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,KACjB,MAAA,GAAUA,CAAAA,GACZ,KAAK,IAAA,CAAOA,CAAAA,CAAS,IAAA,EAEzB,CACF,CAAA,CAOMC,EAAAA,CAAN,cAAwB,KAAM,CAC5B,KAEA,WAAA,CAIA,WAAA,CACA,YACEC,CAAAA,CACA/E,CAAAA,CACAd,CAAAA,CAAwD,EAAC,CACzD,CACA,MAAMc,CAAO,CAAA,CACb,KAAK,IAAA,CAAO+E,CAAAA,CACZ,KAAK,WAAA,CAAc7F,CAAAA,CAAK,WAAA,EAAe,CAAA,CACvC,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,EAAO,MAAA,CAAOD,CAAM,EAC1B,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,MAAA,CAAO,SAASE,CAAM,CAAA,CAAG,CAC3B,IAAMC,CAAAA,CAAQD,EAAS,IAAA,CAAK,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,cACA,cACF,CAAA,CASA,SAASC,EAAAA,CAAiB,CAAA,CAAgB,CACxC,GAAI,CAAC,CAAA,CAAG,OAAO,EAAA,CACf,IAAMC,EAAkB,CAAC,MAAA,CAAO,CAAA,CAAE,IAAA,EAAQ,EAAE,CAAA,CAAG,OAAO,CAAA,CAAE,OAAA,EAAW,EAAE,CAAA,CAAG,MAAA,CAAO,EAAE,IAAA,EAAQ,EAAE,CAAC,CAAA,CACxFC,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,OAAOA,CAAAA,CAAM,OAAA,EAAW,EAAE,CAAC,CAAA,CAChEA,CAAAA,CAAQA,CAAAA,CAAM,KAAA,CAEhB,OAAOD,EAAM,IAAA,CAAK,GAAG,CACvB,CAmBA,SAASG,GAAuB,CAAA,CAAiB,CAC/C,GAAI,CAAC,CAAA,CAAG,OAAO,OACf,GAAI,CAAA,YAAab,GAAW,OAAO,KAAA,CACnC,GAAI,CAAA,YAAaF,CAAAA,CAAU,OAAO,MAAA,CAElC,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,GAAQF,CAAAA,CAAK,QAAA,CAASE,CAAG,CAAC,CAAA,EAIvD,CAAA,YAAa,WAAA,EAEb,sDAAA,CAAuD,IAAA,CAAKF,CAAI,CAAA,CAGtE,CAwEA,SAASG,EAAAA,CAAoBF,CAAAA,CAAc7F,EAA0B,CASnE,OAPI,CAAA,EAAA6F,CAAAA,GAAS,MAAA,EAETA,CAAAA,EAAQ,OAAUA,CAAAA,EAAQ,MAAA,EAE1BA,IAAS,MAAA,EAGTA,CAAAA,GAAS,QAAU,yCAAA,CAA0C,IAAA,CAAK7F,CAAO,CAAA,CAE/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,CAKA,IAAME,EAAAA,CAAqB,GAAA,CAGrBC,EAAAA,CAAoB,GAAA,CAGpBC,EAAAA,CAA6B,KAG7BC,EAAAA,CAAmC,CAAA,CAEnCC,GAAkB,GAAA,CAElBC,EAAAA,CAAwB,KAExBC,EAAAA,CAAwB,EAAA,CAKxBC,EAAAA,CAAqB,EAAA,CAIrBC,EAAAA,CAAsB,CAAA,CAGtBC,GAAqB,CAAA,CAAI,GAAA,CAKzBC,GAAqB,GAAA,CAKrBC,EAAAA,CAA4B,IAK5BC,EAAAA,CAA0B,GAAA,CAiBnBC,EAAAA,CAAN,KAAwB,CACrB,MAAA,CAAS,IAAI,GAAA,CAEb,WAAA,CAAYjC,CAAAA,CAA0B,CAC5C,IAAIkC,CAAAA,CAAI,KAAK,MAAA,CAAO,GAAA,CAAIlC,CAAI,CAAA,CAC5B,OAAKkC,IACHA,CAAAA,CAAI,CACF,mBAAA,CAAqB,CAAA,CACrB,eAAA,CAAiB,CAAA,CACjB,iBAAkB,CAAA,CAClB,eAAA,CAAiB,EACjB,eAAA,CAAiB,CAAA,CACjB,YAAa,IAAI,GAAA,CACjB,SAAA,CAAW,CAAA,CACX,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,OAAO,GAAA,CAAIlC,CAAAA,CAAMkC,CAAC,CAAA,CAAA,CAElBA,CACT,CAEA,aAAA,CAAclC,CAAAA,CAAclG,CAAAA,CAAcqI,EAAqBC,CAAAA,CAA2B,CACxF,IAAMF,CAAAA,CAAI,IAAA,CAAK,YAAYlC,CAAI,CAAA,CAU/B,GATAkC,CAAAA,CAAE,mBAAA,CAAsB,CAAA,CAQxBA,EAAE,eAAA,CAAkB,CAAA,CAChBpI,EAAK,CAMP,IAAMuI,EAAUH,CAAAA,CAAE,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,OAAO,QAAA,CAASA,CAAU,CAAA,EAAKA,CAAAA,EAAc,CAAA,EAIjF,IAAA,CAAK,cAAcD,CAAAA,CAAGC,CAAAA,CAAYC,GAActI,CAAG,EAEvD,CAUA,iBAAA,CAAkBkG,CAAAA,CAAcmC,CAAAA,CAAoBC,CAAAA,CAA2B,CACzE,CAAC,OAAO,QAAA,CAASD,CAAU,GAAKA,CAAAA,CAAaH,EAAAA,EACjD,KAAK,aAAA,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,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CACrB,GAAIF,CAAAA,GAAe,OAAW,CAC5B,IAAMG,EAAIL,CAAAA,CAAE,UAAA,CAAW,IAAIE,CAAU,CAAA,CACrC,OAAOG,CAAAA,EACLA,CAAAA,CAAE,WAAA,EAAeX,IACjBU,CAAAA,CAAMC,CAAAA,CAAE,WAAaV,EAAAA,CACnBU,CAAAA,CAAE,OACF,MACN,CACA,OAAO,IAAA,CAAK,eAAA,CAAgBL,CAAAA,CAAGI,CAAG,CAAA,CAAIJ,CAAAA,CAAE,cAAgB,MAC1D,CAkBA,sBAAsBlC,CAAAA,CAAcwC,CAAAA,CAAmBJ,EAA2B,CAC5E,CAAC,OAAO,QAAA,CAASI,CAAS,GAAKA,CAAAA,CAAY,EAAA,EAC/C,KAAK,aAAA,CAAc,IAAA,CAAK,WAAA,CAAYxC,CAAI,CAAA,CAAGwC,CAAAA,CAAWJ,CAAU,EAClE,CAOQ,cAAcF,CAAAA,CAAeC,CAAAA,CAAoBC,EAA2B,CAClF,IAAME,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAkBrB,GAZIJ,CAAAA,CAAE,gBAAA,CAAmB,GAAKI,CAAAA,CAAMJ,CAAAA,CAAE,iBAAmBL,EAAAA,GACvDK,CAAAA,CAAE,aAAA,CAAgB,MAAA,CAClBA,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,EAAE,aAAA,CACrEA,CAAAA,CAAE,qBACFA,CAAAA,CAAE,gBAAA,CAAmBI,CAAAA,CAEjBF,CAAAA,GAAe,MAAA,CAAW,CAC5B,IAAMG,CAAAA,CAAIL,CAAAA,CAAE,WAAW,GAAA,CAAIE,CAAU,EACjC,CAACG,CAAAA,EAAKD,CAAAA,CAAMC,CAAAA,CAAE,SAAA,CAAYV,EAAAA,CAC5BK,EAAE,UAAA,CAAW,GAAA,CAAIE,EAAY,CAAE,MAAA,CAAQD,EAAY,WAAA,CAAa,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,cAActC,CAAAA,CAAclG,CAAAA,CAAoB,CAC9C,IAAMoI,CAAAA,CAAI,IAAA,CAAK,WAAA,CAAYlC,CAAI,CAAA,CAC/B,GAAIlG,CAAAA,CAAK,CAIP,IAAMwI,CAAAA,CAAM,IAAA,CAAK,KAAI,CACfG,CAAAA,CAKFP,CAAAA,CAAE,WAAA,CAAY,GAAA,CAAIpI,CAAG,GAAK,CAAE,KAAA,CAAO,EAAG,aAAA,CAAe,CAAA,CAAG,gBAAiB,CAAE,CAAA,CAAA,CAI5E2I,CAAAA,CAAS,aAAA,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,EAAS,KAAA,EAAA,CACTA,CAAAA,CAAS,gBAAkBH,CAAAA,CACvBG,CAAAA,CAAS,KAAA,EAASlB,EAAAA,GACpBkB,CAAAA,CAAS,aAAA,CAAgBH,EAAMd,EAAAA,CAAAA,CAEjCU,CAAAA,CAAE,YAAY,GAAA,CAAIpI,CAAAA,CAAK2I,CAAQ,EACjC,CAAA,KAEEP,CAAAA,CAAE,mBAAA,EAAA,CACFA,CAAAA,CAAE,eAAA,CAAkB,KAAK,GAAA,GAE7B,CAaA,uBAAA,CAAwBlC,CAAAA,CAAclG,EAAmB,CACvD,IAAMoI,CAAAA,CAAI,IAAA,CAAK,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,EAAG,eAAA,CAAiB,CAAE,EAC/E2I,CAAAA,CAAS,KAAA,CAAQ,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAS,KAAA,CAAQ,EAAGlB,EAAgC,CAAA,CAC9EkB,EAAS,eAAA,CAAkBH,CAAAA,CAC3BG,EAAS,aAAA,CAAgBH,CAAAA,CAAMd,EAAAA,CAC/BiB,CAAAA,CAAS,SAAA,CAAY,IAAA,CACrBP,EAAE,WAAA,CAAY,GAAA,CAAIpI,EAAK2I,CAAQ,EACjC,CAWA,eAAA,CAAgBzC,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,EAAE,eAAA,CAAkB,CAAA,CAAA,CAEtB,IAAMS,CAAAA,CAAY,OAAOD,CAAAA,EAAiB,QAAA,EAAY,MAAA,CAAO,QAAA,CAASA,CAAY,CAAA,EAAKA,CAAAA,CAAe,EAChGE,CAAAA,CAAWD,CAAAA,CACbD,EACA,IAAA,CAAK,GAAA,CAAItB,EAAAA,CAAqB,CAAA,EAAKc,CAAAA,CAAE,eAAA,CAAiBb,EAAiB,CAAA,CAItEsB,CAAAA,EAAWT,EAAE,eAAA,EAAA,CAClBA,CAAAA,CAAE,gBAAkBI,CAAAA,CAMpBJ,CAAAA,CAAE,gBAAA,CAAmBS,CAAAA,CACjBL,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,EAAwB,CACpD,GAAI,CAACA,CAAAA,EAAY,CAAC,MAAA,CAAO,QAAA,CAASA,CAAQ,CAAA,CAAG,OAC7C,IAAMX,CAAAA,CAAI,KAAK,WAAA,CAAYlC,CAAI,EAC/BkC,CAAAA,CAAE,SAAA,CAAYW,CAAAA,CACdX,CAAAA,CAAE,kBAAA,CAAqB,IAAA,CAAK,MAC9B,CAQQ,oBAA6B,CACnC,IAAMI,EAAM,IAAA,CAAK,GAAA,EAAI,CACfQ,CAAAA,CAAmB,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,EAAE,SAAS,CAAA,CAG3B,OAAIY,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAU,CAAA,EAC9BA,CAAAA,CAAO,IAAA,CAAK,CAAC7G,CAAAA,CAAGtF,CAAAA,GAAMsF,EAAItF,CAAC,CAAA,CAEpBmM,EAAO,IAAA,CAAK,KAAA,CAAA,CAAOA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAK,CAAC,CAAC,CAAA,CACnD,CAGA,cAAc9C,CAAAA,CAAclG,CAAAA,CAAuB,CACjD,IAAMoI,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAIlC,CAAI,EAC9B,GAAI,CAACkC,EAAG,OAAO,KAAA,CACf,IAAMI,CAAAA,CAAM,IAAA,CAAK,KAAI,CAMrB,GAHIJ,EAAE,gBAAA,CAAmBI,CAAAA,EAGrBJ,EAAE,mBAAA,EAAuB,CAAA,EAAKI,EAAMJ,CAAAA,CAAE,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,aAAA,CAAgBC,EAAK,OAAO,MACrD,CAGA,IAAMS,CAAAA,CAAO,KAAK,kBAAA,EAAmB,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,EAAC,CACrBC,CAAAA,CAAsB,EAAC,CAC7B,IAAA,IAAWjD,CAAAA,IAAQ1G,EACb,IAAA,CAAK,aAAA,CAAc0G,EAAMlG,CAAG,CAAA,CAC9BkJ,EAAQ,IAAA,CAAKhD,CAAI,CAAA,CAEjBiD,CAAAA,CAAU,IAAA,CAAKjD,CAAI,EAGvB,GAAIgD,CAAAA,CAAQ,QAAU,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,MAAO,IAAA,CAAK,SAAA,CAAUyJ,EAAMsC,CAAG,CAAE,CAAA,CAAE,CAAA,CAChE,IAAA,CAAK,CAACrG,EAAGtF,CAAAA,GAAMsF,CAAAA,CAAE,MAAQtF,CAAAA,CAAE,KAAA,EAASsF,EAAE,CAAA,CAAItF,CAAAA,CAAE,CAAC,CAAA,CAC7C,GAAA,CAAKwM,CAAAA,EAAMA,EAAE,IAAI,CAAA,CACdC,EAAQ,IAAA,CAAK,oBAAA,CAAqBJ,EAASV,CAAG,CAAA,CACpD,OAAIc,CAAAA,EAASF,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,CAAAA,CAA2BI,CAAAA,CAAsB,CACvE,OACE,CAAC,CAACJ,GACFA,CAAAA,CAAE,aAAA,GAAkB,QACpBA,CAAAA,CAAE,kBAAA,EAAsBN,EAAAA,EACxBU,CAAAA,CAAMJ,CAAAA,CAAE,gBAAA,EAAoBL,EAEhC,CAOQ,SAAA,CAAU7B,EAAcsC,CAAAA,CAAqB,CACnD,IAAMJ,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAIlC,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,EAAYf,CAAAA,CAAMR,EAAAA,CACpBwB,EACAC,CAAAA,CAAY,CAAA,CAAA,CAAA,CAChB,IAAA,IAAWhK,CAAAA,IAAKyJ,CAAAA,CAAS,CACvB,IAAMd,CAAAA,CAAI,IAAA,CAAK,YAAY3I,CAAC,CAAA,CACtBiK,EAAQ,IAAA,CAAK,GAAA,CAAItB,CAAAA,CAAE,gBAAA,CAAkBA,CAAAA,CAAE,WAAW,EACpDsB,CAAAA,EAASH,CAAAA,EAAaG,EAAQD,CAAAA,GAChCD,CAAAA,CAAO/J,EACPgK,CAAAA,CAAYC,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,EAAO,UAAA,CAAW,mBAAA,CAEnC,QAAA,EAAoB,CAGlB,OAFA,IAAA,CAAK,OAAM,CAEP,IAAA,CAAK,QAAU,CAAA,CAAI,IAAA,EACrB,KAAK,MAAA,EAAU,CAAA,CACR,IAAA,EAEF,KACT,CAEA,MAAA,EAAe,CACb,IAAA,CAAK,KAAA,GACL,IAAA,CAAK,MAAA,CAAS,KAAK,GAAA,CACjBA,CAAAA,CAAO,UAAA,CAAW,mBAAA,CAClB,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,WAAW,mBAAA,EAEpC,CAGA,IAAI,SAAA,EAAoB,CACtB,OAAO,IAAA,CAAK,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,IAAS,MAAA,CAAkBF,CAAAA,CAGxB,KAAK,IAAA,CACV,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAe,IAAA,CAAK,GAAA,CAAI5J,EAAE,sBAAA,CAAwBA,CAAAA,CAAE,sBAAwB8J,CAAI,CAAC,CAC5F,CACF,CAKA,SAASC,EAAAA,CAAYJ,CAAAA,CAA4B/D,CAAAA,CAAcoE,EAAQtK,CAAAA,CAAoB,CACrFsK,aAAarE,EAAAA,CACXqE,CAAAA,CAAE,YAEJL,CAAAA,CAAQ,eAAA,CAAgB/D,CAAAA,CAAMoE,CAAAA,CAAE,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,EAAAA,CACPN,CAAAA,CACA/D,CAAAA,CACAkB,CAAAA,CACArK,CAAAA,CACM,CAEN,GADI,CAACA,CAAAA,EAAU,OAAOA,CAAAA,EAAW,QAAA,EAC7B,CAACqK,CAAAA,CAAO,QAAA,CAAS,+BAA+B,CAAA,CAAG,OACvD,IAAMoD,EAASzN,CAAAA,CAAe,iBAAA,CAC1B,OAAOyN,CAAAA,EAAU,QAAA,EACnBP,EAAQ,eAAA,CAAgB/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,MAAM,0CAA0C,CAAA,CAChE,OAAAA,CAAAA,CAAI,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,EAAa,IAAI,eAAA,CACjBC,EAAQ,UAAA,CAAW,IAAMD,EAAW,KAAA,CAAMH,EAAAA,EAAqB,CAAA,CAAG9E,CAAE,EAC1E,OAAO,CAAE,OAAQiF,CAAAA,CAAW,MAAA,CAAQ,QAAS,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,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,CAAAA,CAAW,KAAA,CAAMG,CAAAA,CAAQ,MAAM,CAAA,CACxB,CAAE,OAAQH,CAAAA,CAAW,MAAA,CAAQ,QAAS,IAAM,CAAC,CAAE,CAAA,CAExD,GAAII,CAAAA,CAAU,OAAA,CACZ,OAAAJ,CAAAA,CAAW,MAAMI,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,EAAU,MAAM,CAAA,CAChED,EAAQ,gBAAA,CAAiB,OAAA,CAASE,EAAgB,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAChED,CAAAA,CAAU,iBAAiB,OAAA,CAASE,CAAAA,CAAkB,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAEpE,IAAMC,CAAAA,CAAU,IAAM,CACpBJ,CAAAA,CAAQ,oBAAoB,OAAA,CAASE,CAAc,EACnDD,CAAAA,CAAU,mBAAA,CAAoB,QAASE,CAAgB,EACzD,CAAA,CACA,OAAO,CAAE,MAAA,CAAQN,EAAW,MAAA,CAAQ,OAAA,CAAAO,CAAQ,CAC9C,CAQA,IAAMC,EAAAA,CAAc,MAClBC,EACAjE,CAAAA,CACAkE,CAAAA,CACAC,EAAUjM,CAAAA,CAAO,OAAA,CACjBkM,EAAc,KAAA,CACdC,CAAAA,GACG,CACH,IAAMjI,CAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAW,GAAW,CAAA,CAC3CkI,EAAO,CACX,OAAA,CAAS,MACT,MAAA,CAAAtE,CAAAA,CACA,MAAA,CAAAkE,CAAAA,CACA,EAAA,CAAA9H,CACF,EAKM,CAAE,MAAA,CAAQmI,EAAS,OAAA,CAASC,CAAe,EAAIjB,EAAAA,CAAoBY,CAAO,CAAA,CAC1E,CAAE,MAAA,CAAAM,CAAAA,CAAQ,QAASC,CAAa,CAAA,CAAIhB,GAAaa,CAAAA,CAASF,CAAc,EACxEN,CAAAA,CAAU,IAAM,CACpBS,CAAAA,EAAe,CACfE,IACF,CAAA,CAEA,GAAI,CACF,IAAMC,EAAM,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,OAAA+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,EAUH,GAAIA,CAAAA,CAAI,QAAU,GAAA,EAAOA,CAAAA,CAAI,OAAS,GAAA,CACpC,MAAM,IAAI9F,EAAAA,CAAUoF,CAAAA,CAAK,CAAA,KAAA,EAAQU,EAAI,MAAM,CAAA,MAAA,EAASV,CAAG,CAAA,CAAE,CAAA,CAG3D,IAAMtO,CAAAA,CAAU,MAAMgP,CAAAA,CAAI,IAAA,EAAK,CAC/B,GACE,CAAChP,CAAAA,EACD,OAAOA,EAAO,EAAA,CAAO,GAAA,EACrBA,EAAO,EAAA,GAAOyG,CAAAA,EACdzG,CAAAA,CAAO,OAAA,GAAY,KAAA,CAEnB,MAAM,IAAI,KAAA,CAAM,qBAAqB,EAEvC,GAAI,QAAA,GAAYA,EACd,OAAOA,CAAAA,CAAO,OAEhB,GAAI,OAAA,GAAWA,EAAQ,CACrB,IAAMuN,EAAIvN,CAAAA,CAAO,KAAA,CACjB,MAAI,SAAA,GAAauN,CAAAA,EAAK,MAAA,GAAUA,CAAAA,CACxB,IAAIvE,CAAAA,CAASuE,CAAC,CAAA,CAEhBvN,CAAAA,CAAO,KACf,CAEA,MAAMA,CACR,CAAA,MAASuN,CAAAA,CAAG,CAQV,GAPIA,CAAAA,YAAavE,CAAAA,EAIbuE,aAAarE,EAAAA,EAGbwF,CAAAA,EAAgB,QAClB,MAAMnB,CAAAA,CAER,GAAIkB,CAAAA,CACF,OAAOJ,EAAAA,CAAYC,CAAAA,CAAKjE,CAAAA,CAAQkE,CAAAA,CAAQC,EAAS,KAAA,CAAOE,CAAc,EAExE,MAAMnB,CACR,QAAE,CACAa,CAAAA,GACF,CACF,CAAA,CAGA,SAASa,EAAAA,EAA6B,CACpC,OAAOtG,EAAAA,CAAM,EAAA,CAAK,KAAK,MAAA,EAAO,CAAI,EAAE,CACtC,CA4BA,SAASuG,GAAoB5L,CAAAA,CA0Bd,CACb,GAAM,CACJ,MAAA,CAAA+G,EACA,MAAA,CAAAkE,CAAAA,CACA,GAAA,CAAAtL,CAAAA,CACA,OAAA,CAAA+K,CAAAA,CACA,UAAAmB,CAAAA,CACA,aAAA,CAAAhC,EACA,eAAA,CAAAiC,CAAAA,CACA,WAAAC,CAAAA,CACA,cAAA,CAAAX,CAAAA,CACA,YAAA,CAAAY,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,CAAIjM,CAAAA,CACJ,OAAO,IAAI,OAAA,CAAW,CAACuF,CAAAA,CAAS2G,CAAAA,GAAW,CACzC,IAAIC,CAAAA,CAAO,MACPC,CAAAA,CAAc,CAAA,CACdC,EAAa,KAAA,CAKbC,CAAAA,CAAiB,MACjBC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAAe,CAAA,CACbC,CAAAA,CAAiC,GAIjCC,CAAAA,CAAUC,CAAAA,EAAuB,CACrC,GAAI,CAAAT,EACJ,CAAAA,CAAAA,CAAO,IAAA,CACHK,CAAAA,GAAe,MAAA,GACjB,YAAA,CAAaA,CAAU,CAAA,CACvBA,CAAAA,CAAa,QAEf,IAAA,IAAWnQ,CAAAA,IAAKqQ,EACTrQ,CAAAA,CAAE,MAAA,CAAO,OAAA,EAASA,CAAAA,CAAE,KAAA,EAAM,CAEjCuQ,IAAO,CACT,CAAA,CAEMC,EAAW,CAAChH,CAAAA,CAAciH,IAAqB,CACnDV,CAAAA,EAAAA,CACA,IAAM7B,EAAAA,CAAa,IAAI,gBACvBmC,CAAAA,CAAY,IAAA,CAAKnC,EAAU,CAAA,CAG3B,IAAMwC,GAAStC,EAAAA,CAAaF,EAAAA,CAAW,MAAA,CAAQa,CAAc,CAAA,CACvD4B,EAAAA,CAAarD,GACjBL,CAAAA,CACAzD,CAAAA,CACAkB,EACA8C,CAAAA,CACAiC,CACF,EACMjN,EAAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,CAClBiO,CAAAA,GAASL,CAAAA,CAAe5N,IAC7BkM,EAAAA,CAAYlF,CAAAA,CAAMkB,EAAQkE,CAAAA,CAAQ+B,EAAAA,CAAY,MAAOD,EAAAA,CAAO,MAAM,CAAA,CAC/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,EAAG,CAS9B,GAJApC,EAAiB,uBAAA,CAAwBzD,CAAAA,CAAMlG,CAAG,CAAA,CAClD4M,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,CAAAA,CAAO,IAAMT,CAAAA,CAAOK,CAAS,CAAC,CAAA,CAEhC,MACF,CACAjD,CAAAA,CAAiB,aAAA,CAAczD,EAAMlG,CAAAA,CAAK,IAAA,CAAK,KAAI,CAAId,EAAAA,CAAOkI,CAAM,CAAA,CACpEmD,EAAAA,CAAmBZ,EAAkBzD,CAAAA,CAAMkB,CAAAA,CAAQ2E,EAAG,CAAA,CAClDoB,CAAAA,CACGR,CAAAA,EAKHhD,CAAAA,CAAiB,qBAAA,CAAsBoB,CAAAA,CAAS,KAAK,GAAA,EAAI,CAAI+B,EAAc1F,CAAM,CAAA,CAEzEsF,GACV3C,EAAAA,CAAe,MAAA,EAAO,CAExBiD,CAAAA,CAAO,IAAMpH,CAAAA,CAAQmG,EAAQ,CAAC,EAAA,CAChC,CAAC,CAAA,CACA,KAAA,CAAOzB,IAAM,CAIZ,GAHA8C,EAAAA,CAAO,OAAA,EAAQ,CACfX,CAAAA,EAAAA,CACKU,IAASR,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,cAAavE,CAAAA,EAAY,CAACmB,EAAAA,CAAoBoD,EAAAA,CAAE,IAAA,CAAMA,EAAAA,CAAE,OAAO,CAAA,CAAG,CAEpE0C,EAAO,IAAMT,CAAAA,CAAOjC,EAAC,CAAC,CAAA,CACtB,MACF,CAKA,GAHAD,EAAAA,CAAYV,EAAkBzD,CAAAA,CAAMoE,EAAAA,CAAGtK,CAAG,CAAA,CAC1C2J,CAAAA,CAAiB,kBAAkBzD,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAAIhH,EAAAA,CAAOkI,CAAM,EACnEwF,CAAAA,CAAYtC,EAAAA,CACR,CAAC6C,CAAAA,EAAW,CAACT,EAAY,CAE3BM,CAAAA,CAAO,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,EAAS,KAAK,CAAA,CAUvB,IAAMX,EAAAA,CAAOT,CAAAA,CAAiB,kBAAA,CAAmBoB,CAAAA,CAAS3D,CAAM,CAAA,EAAK,EAC/DkG,EAAAA,CAAgBtD,EAAAA,CACpBL,EACAoB,CAAAA,CACA3D,CAAAA,CACA8C,EACAiC,CACF,CAAA,CACMoB,EAAAA,CAAQ,IAAA,CAAK,GAAA,CACjB,IAAA,CAAK,IAAIjO,CAAAA,CAAO,UAAA,CAAW,kBAAmBA,CAAAA,CAAO,UAAA,CAAW,iBAAmB8K,EAAI,CAAA,CACvF,GAAMkD,EACR,CAAA,CACAT,EAAa,UAAA,CAAW,IAAM,CAK5B,GAJAA,CAAAA,CAAa,OACTL,CAAAA,EAAQf,CAAAA,EAAgB,OAAA,EAGxB,IAAA,CAAK,GAAA,EAAI,EAAKW,EAAY,OAK9B,IAAMoB,EAAOtB,CAAAA,CAAU,MAAA,CAAQzM,IAAMkK,CAAAA,CAAiB,aAAA,CAAclK,EAAAA,CAAGO,CAAG,CAAC,CAAA,CAC3E,GAAIwN,CAAAA,CAAK,MAAA,GAAW,EAAG,OACvB,IAAMrP,EAASqP,CAAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,CAAIA,EAAK,MAAM,CAAC,EAEtDzD,EAAAA,CAAe,QAAA,KACpB2C,CAAAA,CAAa,IAAA,CACbL,EAAalO,CAAM,CAAA,CACnB+O,EAAS/O,CAAAA,CAAQ,IAAI,GACvB,CAAA,CAAGoP,EAAK,EACV,CAAC,CACH,CA4CO,IAAME,CAAAA,CAAU,MACrBrG,EACAkE,CAAAA,CAAyB,GACzBC,CAAAA,CACAmC,CAAAA,CAAQpO,EAAO,KAAA,CACfuM,CAAAA,CACAS,CAAAA,GACe,CACf,GAAI,CAAC,MAAM,OAAA,CAAQhN,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA,CAEhD,GAAIA,CAAAA,CAAO,KAAA,CAAM,SAAW,CAAA,CAC1B,MAAM,IAAI,KAAA,CAAM,uBAAuB,EAKzC,IAAM6M,CAAAA,CAAkBZ,IAAY,MAAA,CAC9BoC,CAAAA,CAAUpC,GAAWjM,CAAAA,CAAO,OAAA,CAC5BU,EAAMmH,EAAAA,CAAMC,CAAM,EAWlBwG,CAAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAItO,CAAAA,CAAO,UAAA,CAAW,kBAAoBqO,CAAAA,CAG9DE,CAAAA,CAAe,IAAI,GAAA,CACrBjB,CAAAA,CAEJ,QAASkB,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAWJ,CAAAA,EAC3B,EAAAI,CAAAA,CAAU,GAAK,IAAA,CAAK,GAAA,IAASF,CAAAA,CAAAA,CADKE,CAAAA,EAAAA,CAAW,CAMjD,IAAMC,CAAAA,CAAepE,CAAAA,CAAiB,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,IACH2H,CAAAA,CAAa,KAAA,GACb3H,CAAAA,CAAO6H,CAAAA,CAAa,CAAC,CAAA,CAAA,CAEvBF,CAAAA,CAAa,GAAA,CAAI3H,CAAI,CAAA,CAKrB,IAAIgG,EAAsB,EAAC,CAU3B,GARE5M,CAAAA,CAAO,UAAA,CAAW,OAClBqK,CAAAA,CAAiB,kBAAA,CAAmBzD,CAAAA,CAAMkB,CAAM,CAAA,GAAM,MAAA,GAEtD8E,EAAY6B,CAAAA,CACT,MAAA,CAAQtO,GAAM,CAACoO,CAAAA,CAAa,IAAIpO,CAAC,CAAA,EAAKkK,CAAAA,CAAiB,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,OAAA7E,CAAAA,CACA,MAAA,CAAAkE,EACA,GAAA,CAAAtL,CAAAA,CACA,OAAA,CAASkG,CAAAA,CACT,SAAA,CAAAgG,CAAAA,CACA,cAAeyB,CAAAA,CACf,eAAA,CAAAxB,EACA,UAAA,CAAYyB,CAAAA,CACZ,eAAgB/B,CAAAA,CAChB,YAAA,CAAepM,CAAAA,EAAMoO,CAAAA,CAAa,GAAA,CAAIpO,CAAC,EACvC,QAAA,CAAA6M,CACF,CAAC,CACH,CAAA,MAAShC,EAAQ,CAIf,GAHIA,CAAAA,YAAavE,CAAAA,EAAY,CAACmB,EAAAA,CAAoBoD,EAAE,IAAA,CAAMA,CAAAA,CAAE,OAAO,CAAA,EAG/DuB,CAAAA,EAAQ,QACV,MAAMvB,CAAAA,CAERsC,EAAYtC,CAAAA,CACRwD,CAAAA,CAAUJ,GACZ,MAAM1B,EAAAA,GAER,QACF,CAGF,IAAMgC,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAC3B,GAAI,CACF,IAAMjC,CAAAA,CAAM,MAAMX,GAChBlF,CAAAA,CACAkB,CAAAA,CACAkE,EACAtB,EAAAA,CAAuBL,CAAAA,CAAkBzD,CAAAA,CAAMkB,CAAAA,CAAQuG,CAAAA,CAASxB,CAAe,EAC/E,CAAA,CAAA,CACAN,CACF,EACA,GAAIS,CAAAA,EAAY,CAACA,CAAAA,CAASP,CAAG,CAAA,CAAG,CAK9BpC,CAAAA,CAAiB,uBAAA,CAAwBzD,EAAMlG,CAAG,CAAA,CAClD4M,EAAY,IAAI,KAAA,CAAM,4CAA4CxF,CAAM,CAAA,MAAA,EAASlB,CAAI,CAAA,CAAE,CAAA,CACnF4H,EAAUJ,CAAAA,EACZ,MAAM1B,IAAY,CAEpB,QACF,CACA,OAAArC,CAAAA,CAAiB,aAAA,CAAczD,CAAAA,CAAMlG,CAAAA,CAAK,IAAA,CAAK,KAAI,CAAIgO,CAAAA,CAAW5G,CAAM,CAAA,CAExE2C,EAAAA,CAAe,QAAO,CACtBQ,EAAAA,CAAmBZ,CAAAA,CAAkBzD,CAAAA,CAAMkB,CAAAA,CAAQ2E,CAAG,EAC/CA,CACT,CAAA,MAASzB,EAAQ,CAYf,GAPIA,aAAavE,CAAAA,EACX,CAACmB,EAAAA,CAAoBoD,CAAAA,CAAE,IAAA,CAAMA,CAAAA,CAAE,OAAO,CAAA,EAMxCuB,CAAAA,EAAQ,QACV,MAAMvB,CAAAA,CAERD,GAAYV,CAAAA,CAAkBzD,CAAAA,CAAMoE,EAAGtK,CAAG,CAAA,CAK1C2J,EAAiB,iBAAA,CAAkBzD,CAAAA,CAAM,KAAK,GAAA,EAAI,CAAI8H,EAAW5G,CAAM,CAAA,CACvEwF,CAAAA,CAAYtC,CAAAA,CAGRwD,CAAAA,CAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,GAEV,CACF,CAEA,MAAMY,CACR,CAAA,CAcaqB,EAAAA,CAAmB,MAC9B7G,CAAAA,CACAkE,CAAAA,CAAyB,GACzBC,CAAAA,CAAUjM,CAAAA,CAAO,iBACjBuM,CAAAA,GACe,CACf,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQvM,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA,CAEhD,GAAIA,EAAO,KAAA,CAAM,MAAA,GAAW,EAC1B,MAAM,IAAI,MAAM,uBAAuB,CAAA,CAEzC,IAAMU,CAAAA,CAAMmH,EAAAA,CAAMC,CAAM,CAAA,CAElB8G,CAAAA,CAAa,IAAI,GAAA,CACnBtB,CAAAA,CAEJ,IAAA,IAASkB,EAAU,CAAA,CAAGA,CAAAA,CAAUxO,EAAO,KAAA,CAAM,MAAA,CAAQwO,IAAW,CAG9D,IAAM5H,CAAAA,CADeyD,CAAAA,CAAiB,eAAA,CAAgBrK,CAAAA,CAAO,MAAOU,CAAG,CAAA,CAC7C,KAAMP,CAAAA,EAAM,CAACyO,EAAW,GAAA,CAAIzO,CAAC,CAAC,CAAA,CACxD,GAAI,CAACyG,EAAM,MAEX,GADAgI,EAAW,GAAA,CAAIhI,CAAI,EACf2F,CAAAA,EAAQ,OAAA,CACV,MAAM,IAAI,KAAA,CAAM,SAAS,CAAA,CAE3B,GAAI,CACF,IAAME,CAAAA,CAAM,MAAMX,EAAAA,CAAYlF,CAAAA,CAAMkB,CAAAA,CAAQkE,CAAAA,CAAQC,CAAAA,CAAS,CAAA,CAAA,CAAOM,CAAM,CAAA,CAM1E,OAAAlC,EAAiB,aAAA,CAAczD,CAAAA,CAAMlG,CAAG,CAAA,CACjC+L,CACT,CAAA,MAASzB,CAAAA,CAAQ,CAgBf,GAdIA,aAAavE,CAAAA,EAGb8F,CAAAA,EAAQ,UAGZxB,EAAAA,CAAYV,CAAAA,CAAkBzD,EAAMoE,CAAAA,CAAGtK,CAAG,CAAA,CAC1C4M,CAAAA,CAAYtC,CAAAA,CAOR,CAACxD,GAAuBwD,CAAC,CAAA,CAAA,CAC3B,MAAMA,CAEV,CACF,CAEA,MAAMsC,CACR,EAIMuB,EAAAA,CAAyC,CAC7C,QAAS,cAAA,CACT,KAAA,CAAO,aACP,KAAA,CAAO,YAAA,CACP,SAAU,eAAA,CACV,SAAA,CAAW,gBAAA,CACX,UAAA,CAAY,iBAAA,CACZ,aAAA,CAAe,mBACf,MAAA,CAAQ,SAAA,CACR,OAAQ,aACV,EAgCA,eAAsBC,EAAAA,CACpBpO,CAAAA,CACAqO,CAAAA,CACA/C,CAAAA,CACAC,CAAAA,CACAmC,CAAAA,CAAQpO,EAAO,KAAA,CACfuM,CAAAA,CACc,CACd,GAAI,CAAC,MAAM,OAAA,CAAQvM,CAAAA,CAAO,SAAS,CAAA,CACjC,MAAM,IAAI,MAAM,kCAAkC,CAAA,CAEpD,GAAIA,CAAAA,CAAO,SAAA,CAAU,SAAW,CAAA,CAC9B,MAAM,IAAI,KAAA,CAAM,2BAA2B,EAK7C,IAAM6M,CAAAA,CAAkBZ,IAAY,MAAA,CAC9BoC,CAAAA,CAAUpC,GAAWjM,CAAAA,CAAO,OAAA,CAC5BsO,CAAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAItO,EAAO,UAAA,CAAW,iBAAA,CAAoBqO,EAI9DW,CAAAA,CAAiB,CAAA,EAAGtO,CAAG,CAAA,CAAA,EAAIqO,CAAQ,CAAA,CAAA,CAKnCE,CAAAA,CACJjP,CAAAA,CAAO,cAAA,GAAiBU,CAAG,CAAA,EAAG,MAAA,CAC1BV,EAAO,cAAA,CAAeU,CAAG,EACzBV,CAAAA,CAAO,SAAA,CACPuO,CAAAA,CAAe,IAAI,GAAA,CACrBjB,CAAAA,CAEA4B,EAAkB,KAAA,CAEtB,IAAA,IAASV,EAAU,CAAA,CAAGA,CAAAA,EAAWJ,GAC3B,EAAAI,CAAAA,CAAU,GAAK,IAAA,CAAK,GAAA,IAASF,CAAAA,CAAAA,CADKE,CAAAA,EAAAA,CAAW,CAMjD,IAAMC,CAAAA,CAAenE,GAAkB,eAAA,CAAgB2E,CAAAA,CAAUvO,CAAG,CAAA,CAChEkG,CAAAA,CAAO6H,CAAAA,CAAa,KAAMtO,CAAAA,EAAM,CAACoO,EAAa,GAAA,CAAIpO,CAAC,CAAC,CAAA,CACnDyG,CAAAA,GACH2H,CAAAA,CAAa,KAAA,EAAM,CACnB3H,CAAAA,CAAO6H,EAAa,CAAC,CAAA,CAAA,CAEvBF,EAAa,GAAA,CAAI3H,CAAI,EACrB,IAAMuI,CAAAA,CAAUvI,CAAAA,CAAOiI,EAAAA,CAAWnO,CAAG,CAAA,CACjC0O,EAAOL,CAAAA,CACLM,CAAAA,CAAWrD,GAAW,EAAC,CACvBsD,EAAsB,IAAI,GAAA,CAGhC,OAAO,OAAA,CAAQD,CAAQ,EAAE,OAAA,CAAQ,CAAC,CAACnN,CAAAA,CAAK3D,EAAK,IAAM,CAC7C6Q,CAAAA,CAAK,QAAA,CAAS,CAAA,CAAA,EAAIlN,CAAG,CAAA,CAAA,CAAG,IAC1BkN,CAAAA,CAAOA,CAAAA,CAAK,QAAQ,CAAA,CAAA,EAAIlN,CAAG,IAAK,kBAAA,CAAmB,MAAA,CAAO3D,EAAK,CAAC,CAAC,CAAA,CACjE+Q,EAAoB,GAAA,CAAIpN,CAAG,GAE/B,CAAC,CAAA,CACD,IAAM6J,CAAAA,CAAM,IAAI,GAAA,CAAIoD,CAAAA,CAAUC,CAAI,CAAA,CAYlC,GAVA,MAAA,CAAO,OAAA,CAAQC,CAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACnN,CAAAA,CAAK3D,EAAK,CAAA,GAAM,CAC5C+Q,EAAoB,GAAA,CAAIpN,CAAG,IAC1B,KAAA,CAAM,OAAA,CAAQ3D,EAAK,CAAA,CACrBA,EAAAA,CAAM,OAAA,CAAS2C,EAAAA,EAAM6K,CAAAA,CAAI,YAAA,CAAa,OAAO7J,CAAAA,CAAK,MAAA,CAAOhB,EAAC,CAAC,CAAC,EAE5D6K,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI7J,CAAAA,CAAK,MAAA,CAAO3D,EAAK,CAAC,CAAA,EAG7C,CAAC,EAEGgO,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,EAASxB,CAAe,CAC1F,EACM,CAAE,MAAA,CAAQ0C,GAAY,OAAA,CAAS/C,EAAa,CAAA,CAAIhB,EAAAA,CAAaa,CAAAA,CAASE,CAAM,EAC5EiD,EAAAA,CAAc,IAAM,CAAElD,CAAAA,EAAe,CAAGE,KAAe,CAAA,CACvDiD,CAAAA,CAAgB,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,IACX,CAAC,EACD,GAAIkJ,CAAAA,CAAS,SAAW,GAAA,CACtB,MAAM,IAAI,KAAA,CAAM,6CAA6C,EAE/D,GAAIA,CAAAA,CAAS,SAAW,GAAA,CAEtB,MAAApF,GAAkB,eAAA,CAChB1D,CAAAA,CACAC,EAAAA,CAAkB6I,CAAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,EAAK,MAC5D,CAAA,CACAR,CAAAA,CAAkB,GACZ,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4BtI,CAAI,CAAA,CAAE,CAAA,CAEpD,GAAI8I,CAAAA,CAAS,MAAA,GAAW,IACtB,MAAApF,EAAAA,CAAkB,cAAc1D,CAAAA,CAAMlG,CAAG,CAAA,CACzCwO,CAAAA,CAAkB,CAAA,CAAA,CACZ,IAAI,MAAM,CAAA,kCAAA,EAAqCtI,CAAI,EAAE,CAAA,CAE7D,GAAI,CAAC8I,CAAAA,CAAS,EAAA,CACZ,MAAApF,EAAAA,CAAkB,aAAA,CAAc1D,EAAMlG,CAAG,CAAA,CACzCwO,EAAkB,CAAA,CAAA,CACZ,IAAI,MAAM,CAAA,KAAA,EAAQQ,CAAAA,CAAS,MAAM,CAAA,MAAA,EAAS9I,CAAI,CAAA,CAAE,EAExD,OAAA0D,EAAAA,CAAkB,cAAc1D,CAAAA,CAAMlG,CAAAA,CAAK,KAAK,GAAA,EAAI,CAAI+O,CAAAA,CAAeT,CAAc,CAAA,CAC9EU,CAAAA,CAAS,MAClB,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,KAAI,CAAI6I,CAAAA,CAAeT,CAAc,CAAA,CACpF1B,CAAAA,CAAYtC,EAERwD,CAAAA,CAAUJ,CAAAA,EACZ,MAAM1B,EAAAA,GAEV,CAAA,OAAE,CACA8C,EAAAA,GACF,CACF,CAEA,MAAMlC,CACR,CAWO,IAAMqC,EAAAA,CAAiB,MAC5B7H,CAAAA,CACAkE,CAAAA,CAAyB,EAAC,CAC1B4D,CAAAA,CAAS,EACTrD,CAAAA,GACe,CACf,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQvM,CAAAA,CAAO,KAAK,CAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA,CAEhD,GAAI4P,EAAS5P,CAAAA,CAAO,KAAA,CAAM,OACxB,MAAM,IAAI,MAAM,8BAA8B,CAAA,CAWhD,IAAI6P,CAAAA,CAAAA,CARkBC,CAAAA,EAAkB,CACtC,IAAMjN,CAAAA,CAAI,CAAC,GAAGiN,CAAG,CAAA,CACjB,QAAS3S,CAAAA,CAAI0F,CAAAA,CAAE,OAAS,CAAA,CAAG1F,CAAAA,CAAI,EAAGA,CAAAA,EAAAA,CAAK,CACrC,IAAM4S,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,EAAK5S,EAAI,CAAA,CAAE,CAAA,CAC5C,CAAC0F,CAAAA,CAAE1F,CAAC,CAAA,CAAG0F,CAAAA,CAAEkN,CAAC,CAAC,EAAI,CAAClN,CAAAA,CAAEkN,CAAC,CAAA,CAAGlN,CAAAA,CAAE1F,CAAC,CAAC,EAC5B,CACA,OAAO0F,CACT,GAC4B7C,CAAAA,CAAO,KAAK,EACpCgQ,CAAAA,CAAmB,IAAA,CAAK,IAAIJ,CAAAA,CAAQC,CAAAA,CAAS,MAAM,CAAA,CACnDI,CAAAA,CAAoB,GACxB,KAAOD,CAAAA,CAAmB,GAAKH,CAAAA,CAAS,MAAA,CAAS,GAAG,CAElD,IAAMK,CAAAA,CAAaL,CAAAA,CAAS,MAAA,CAAO,CAAA,CAAGG,CAAgB,CAAA,CAChDG,CAAAA,CAA2B,EAAC,CAC5BC,CAAAA,CAAsB,EAAC,CAE7B,IAAA,IAASjT,CAAAA,CAAI,CAAA,CAAGA,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,GAAS8O,CAAAA,CAAa,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,EAAkBC,EAAAA,CAAcL,CAAAA,CAAYL,CAAM,CAAA,CACxD,GAAIS,EACF,OAAOA,CAAAA,CAIT,GADAL,CAAAA,CAAmB,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,EAAAA,CAAcC,CAAAA,CAAgBX,CAAAA,CAAgB,CACrD,IAAMY,CAAAA,CAAe,IAAI,GAAA,CACzB,IAAA,IAAW/S,KAAU8S,CAAAA,CAAS,CAC5B,IAAMrO,CAAAA,CAAM,IAAA,CAAK,SAAA,CAAUzE,CAAM,CAAA,CAC5B+S,CAAAA,CAAa,IAAItO,CAAG,CAAA,EACvBsO,EAAa,GAAA,CAAItO,CAAAA,CAAK,EAAE,CAAA,CAE1BsO,CAAAA,CAAa,GAAA,CAAItO,CAAG,CAAA,CAAG,KAAKzE,CAAM,EACpC,CACA,IAAMgT,CAAAA,CAAiB,MAAM,IAAA,CAAKD,CAAAA,CAAa,QAAQ,CAAA,CAAE,KAAME,CAAAA,EAAUA,CAAAA,CAAM,QAAUd,CAAM,CAAA,CAC/F,OAAOa,CAAAA,CAAiBA,CAAAA,CAAe,CAAC,CAAA,CAAI,IAC9C,KC7vDME,EAAAA,CAAUhP,mBAAAA,CAAW3B,EAAO,QAAQ,CAAA,CAW7B4Q,GAAN,MAAMC,CAAY,CACvB,WAAA,CAEA,UAAA,CAAqB,GAAA,CAEb,KAER,WAAA,CAAYC,CAAAA,CAA8B,CACpCA,CAAAA,EAAS,WAAA,GACPA,EAAQ,WAAA,YAAuBD,CAAAA,EACjC,IAAA,CAAK,WAAA,CAAcC,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,KAAK,WAAA,CAAY,UAAU,IAChE,IAAA,CAAK,WAAA,CAAY,UAAA,CAAa,EAAC,CAAA,CAEjC,IAAA,CAAK,KAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAA,CAExBA,CAAAA,EAAS,aACX,IAAA,CAAK,UAAA,CAAaA,CAAAA,CAAQ,UAAA,EAE9B,CAUA,MAAM,aACJC,CAAAA,CACAC,CAAAA,CACe,CACV,IAAA,CAAK,WAAA,EACR,MAAM,IAAA,CAAK,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,YACR,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAEjE,GAAI,IAAA,CAAK,WAAA,CAAa,CACpB,GAAM,CAAE,MAAA,CAAAC,EAAQ,IAAA,CAAAC,CAAK,EAAI,IAAA,CAAK,MAAA,EAAO,CAChC,KAAA,CAAM,OAAA,CAAQF,CAAI,IACrBA,CAAAA,CAAO,CAACA,CAAI,CAAA,CAAA,CAEd,IAAA,IAAW/O,KAAO+O,CAAAA,CAAM,CACtB,IAAMtO,CAAAA,CAAYT,CAAAA,CAAI,IAAA,CAAKgP,CAAM,CAAA,CACjC,IAAA,CAAK,YAAY,UAAA,CAAW,IAAA,CAAKvO,EAAU,cAAA,EAAgB,EAC7D,CACA,OAAA,IAAA,CAAK,KAAOwO,CAAAA,CACL,IAAA,CAAK,WACd,CAAA,KACE,MAAM,IAAI,KAAA,CAAM,wBAAwB,CAE5C,CAYA,MAAM,SAAA,CAAUC,EAAc,KAAA,CAAiC,CAC7D,GAAI,CAAC,IAAA,CAAK,YACR,MAAM,IAAI,KAAA,CACR,gFACF,CAAA,CAEF,GAAI,KAAK,WAAA,CAAY,UAAA,CAAW,SAAW,CAAA,CACzC,MAAM,IAAI,KAAA,CACR,iFACF,CAAA,CAEF,GAAI,CACF,MAAMzC,GAAiB,qCAAA,CAAuC,CAAC,KAAK,WAAW,CAAC,EAClF,CAAA,MAAS3D,CAAAA,CAAG,CACV,GAAI,EAAAA,aAAavE,CAAAA,EAAYuE,CAAAA,CAAE,QAAQ,QAAA,CAAS,oCAAoC,GAGlF,MAAMA,CAEV,CAIA,GAHK,IAAA,CAAK,IAAA,GACR,KAAK,IAAA,CAAO,IAAA,CAAK,QAAO,CAAE,IAAA,CAAA,CAExB,CAACoG,CAAAA,CACH,OAAO,CAAE,KAAA,CAAO,IAAA,CAAK,IAAA,CAAM,OAAQ,SAAU,CAAA,CAI/C,IAAMC,CAAAA,CAAkB,EAAA,CACxB,MAAMjL,EAAAA,CAAM,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,GAAQ,MAAA,GAAW,SAAA,EACnB,EAAID,CAAAA,EAEJ,MAAMjL,GAAM,GAAA,CAAO,CAAA,CAAI,GAAG,CAAA,CAC1BkL,CAAAA,CAAS,MAAM,KAAK,WAAA,EAAY,CAChC,IAEF,OAAO,CACL,MAAO,IAAA,CAAK,IAAA,CACZ,MAAA,CAASA,CAAAA,EAAQ,MAAA,EAAU,SAC7B,CACF,CAQA,MAAA,EAAqB,CACnB,GAAI,CAAC,KAAK,WAAA,CACR,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAEjE,IAAMjT,CAAAA,CAAS,IAAIT,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CAC7E8D,EAAO,CAAE,GAAG,KAAK,WAAY,CAAA,CACnC,GAAI,CACFyE,EAAAA,CAAW,YAAY9H,CAAAA,CAAQqD,CAAI,EACrC,CAAA,MAAS4F,CAAAA,CAAO,CACd,MAAM,IAAI,KAAA,CAAM,oCAAsCA,CAAK,CAC7D,CACAjJ,CAAAA,CAAO,IAAA,EAAK,CACZ,IAAMkT,CAAAA,CAAkB,IAAI,WAAWlT,CAAAA,CAAO,QAAA,EAAU,CAAA,CAClD8S,CAAAA,CAAOvP,oBAAW4P,cAAAA,CAAOD,CAAe,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAE5D,OAAO,CAAE,MAAA,CADMC,cAAAA,CAAO,IAAI,UAAA,CAAW,CAAC,GAAGb,EAAAA,CAAS,GAAGY,CAAe,CAAC,CAAC,EACrD,IAAA,CAAAJ,CAAK,CACxB,CASA,YAAA,CAAaxO,CAAAA,CAAoC,CAC/C,GAAI,CAAC,KAAK,WAAA,CACR,MAAM,IAAI,KAAA,CAAM,mDAAmD,EAErE,GAAI,OAAOA,CAAAA,EAAc,QAAA,CACvB,MAAM,IAAI,MAAM,0BAA0B,CAAA,CAE5C,GAAIA,CAAAA,CAAU,MAAA,GAAW,IACvB,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,KAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAA,CAErBwL,CAAAA,CAAQ,yCAAA,CAA2C,CACxD,cAAA,CAAgB,IAAA,CAAK,KACrB,UAAA,CAAY,IAAA,CAAK,aAAa,UAChC,CAAC,CACH,CAQQ,iBAAA,CAAoB,MAAOsD,CAAAA,EAAuB,CACxD,IAAMC,EAAQ,MAAMvD,CAAAA,CAAQ,8CAA+C,EAAE,EACvE3Q,CAAAA,CAAQmE,mBAAAA,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,EACjFoU,CAAAA,CAAgB,IAAI,KAAK,IAAA,CAAK,GAAA,GAAQH,CAAU,CAAA,CAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACjF,IAAA,CAAK,YAAc,CACjB,UAAA,CAAYG,EACZ,UAAA,CAAY,EAAC,CACb,UAAA,CAAY,EAAC,CACb,cAAeF,CAAAA,CAAM,iBAAA,CAAoB,MACzC,gBAAA,CAAkBC,CAAAA,CAClB,WAAY,EACd,EACF,CACF,MCnOME,EAAAA,CAAa,IAAI,UAAA,CAAW,CAAC,GAAI,CAAC,EA2B3BC,CAAAA,CAAN,MAAMC,CAAW,CACtB,GAAA,CAEA,YAAY7P,CAAAA,CAAiB,CAC3B,IAAA,CAAK,GAAA,CAAMA,CAAAA,CACX,GAAI,CACFH,sBAAAA,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,EAE3B,IAAIwT,CAAAA,CAAWxT,CAAK,CAE/B,CASA,OAAO,UAAA,CAAW6D,CAAAA,CAAyB,CACzC,OAAO,IAAI2P,CAAAA,CAAWC,GAAc5P,CAAG,CAAA,CAAE,SAAS,CAAC,CAAC,CACtD,CASA,OAAO,QAAA,CAAS6P,CAAAA,CAAuC,CACrD,GAAI,OAAOA,CAAAA,EAAS,QAAA,CAElB,GADc,gBAAA,CAAiB,IAAA,CAAKA,CAAI,CAAA,CAEtCA,CAAAA,CAAOtQ,mBAAAA,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,WAAW,CAAC,CAAA,CACzB,GAAI7U,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,KAAA,EAAUA,GAAK,KAAA,EAAU,CAAA,CAAI,EAAI6U,CAAAA,CAAK,MAAA,CAAQ,CAC5D,IAAM5U,CAAAA,CAAO4U,CAAAA,CAAK,UAAA,CAAW,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,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,EAAA,CAAO,GAAA,CAAQA,CAAAA,CAAI,EAAK,EAE5E,CACA6U,CAAAA,CAAO,IAAI,UAAA,CAAWzU,CAAK,EAC7B,CAEF,OAAO,IAAIuU,CAAAA,CAAWP,cAAAA,CAAOS,CAAI,CAAC,CACpC,CAWA,OAAO,SAAA,CAAUC,CAAAA,CAAkBC,EAAkBC,CAAAA,CAAgB,QAAA,CAAsB,CACzF,IAAMH,CAAAA,CAAOC,EAAWE,CAAAA,CAAOD,CAAAA,CAC/B,OAAOJ,CAAAA,CAAW,QAAA,CAASE,CAAI,CACjC,CASA,IAAA,CAAKpQ,CAAAA,CAAgC,CACnC,IAAMwQ,EAAKtQ,sBAAAA,CAAU,IAAA,CAAKF,EAAS,IAAA,CAAK,GAAA,CAAK,CAC3C,YAAA,CAAc,IAAA,CACd,MAAA,CAAQ,WAAA,CACR,OAAA,CAAS,KACX,CAAC,CAAA,CACKN,CAAAA,CAAW,SAASK,mBAAAA,CAAWyQ,CAAAA,CAAG,SAAS,CAAA,CAAG,CAAC,CAAC,CAAA,CAAG,EAAE,CAAA,CAC3D,OAAOjR,EAAAA,CAAU,IAAA,CAAA,CAAMG,EAAW,EAAA,EAAI,QAAA,CAAS,EAAE,CAAA,CAAIK,mBAAAA,CAAWyQ,EAAG,QAAA,CAAS,CAAC,CAAC,CAAC,CACjF,CAQA,YAAA,CAAalQ,CAAAA,CAA4B,CACvC,OAAO,IAAIH,CAAAA,CAAUD,sBAAAA,CAAU,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,CAAGI,CAAM,CAC/D,CAQA,QAAA,EAAmB,CACjB,OAAOmQ,EAAAA,CAAc,IAAI,UAAA,CAAW,CAAC,GAAGT,GAAY,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,eAAA,CAAgBqQ,CAAAA,CAAkC,CAChD,IAAMtV,CAAAA,CAAI8E,sBAAAA,CAAU,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAKwQ,EAAU,GAAG,CAAA,CAE3D,OAAOC,cAAAA,CAAOvV,CAAAA,CAAE,SAAS,CAAC,CAAC,CAC7B,CASA,OAAO,SAAA,EAAwB,CAC7B,OAAO,IAAI8U,EAAWhQ,sBAAAA,CAAU,MAAA,GAAS,SAAS,CACpD,CACF,CAAA,CAEM0Q,EAAAA,CAAgBC,CAAAA,EACRlB,eAAOA,cAAAA,CAAOkB,CAAK,CAAC,CAAA,CAK5BJ,EAAAA,CAAiBpQ,GAAoB,CAEzC,IAAMK,EAAWkQ,EAAAA,CAAavQ,CAAG,EACjC,OAAOI,mBAAAA,CAAK,OAAO,IAAI,UAAA,CAAW,CAAC,GAAGJ,CAAAA,CAAK,GAAGK,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CACtE,CAAA,CAGMyP,GAAiBW,CAAAA,EAAuB,CAC5C,IAAMtU,CAAAA,CAASiE,mBAAAA,CAAK,MAAA,CAAOqQ,CAAU,CAAA,CACrC,GAAI,CAACjQ,EAAAA,CAAkBrE,CAAAA,CAAO,MAAM,CAAA,CAAG,CAAC,CAAA,CAAGwT,EAAU,CAAA,CACnD,MAAM,IAAI,KAAA,CAAM,iCAAiC,EAEnD,IAAMtP,CAAAA,CAAWlE,EAAO,KAAA,CAAM,EAAE,EAC1B6D,CAAAA,CAAM7D,CAAAA,CAAO,MAAM,CAAA,CAAG,EAAE,EACxBuU,CAAAA,CAAiBH,EAAAA,CAAavQ,CAAG,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CACnD,GAAI,CAACQ,EAAAA,CAAkBH,CAAAA,CAAUqQ,CAAc,CAAA,CAC7C,MAAM,IAAI,KAAA,CAAM,+BAA+B,CAAA,CAEjD,OAAO1Q,CACT,CAAA,CAEMQ,GAAoB,CAACG,CAAAA,CAAetF,IAAkB,CAC1D,GAAIsF,IAAMtF,CAAAA,CAAG,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,GAAO2D,CAAAA,CAAE1F,CAAC,IAAMI,CAAAA,CAAEJ,CAAC,GAAGA,CAAAA,EAAAA,CACjC,OAAOA,CAAAA,GAAM+B,CACf,EClOO,IAAM2T,EAAAA,CAAU,CACrBC,EACAP,CAAAA,CACA1Q,CAAAA,CACAkR,CAAAA,CAAgBC,EAAAA,EAAY,GACzBC,EAAAA,CAAMH,EAAYP,CAAAA,CAAWQ,CAAAA,CAAOlR,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,CAAAA,CACAlR,EACAU,CAAAA,GAC6D,CAC7D,IAAM4Q,CAAAA,CAASJ,CAAAA,CACTK,EAAIN,CAAAA,CAAW,eAAA,CAAgBP,CAAS,CAAA,CAC1Cc,CAAAA,CAAO,IAAIzV,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CAC/EyV,EAAK,WAAA,CAAYF,CAAM,CAAA,CACvBE,CAAAA,CAAK,MAAA,CAAOD,CAAC,EACbC,CAAAA,CAAK,IAAA,GAEL,IAAMC,CAAAA,CAAgBd,eAAO,IAAI,UAAA,CAAWa,EAAK,QAAA,EAAU,CAAC,CAAA,CACtDE,CAAAA,CAAKD,EAAc,QAAA,CAAS,EAAA,CAAI,EAAE,CAAA,CAClCE,CAAAA,CAAMF,CAAAA,CAAc,QAAA,CAAS,CAAA,CAAG,EAAE,EAGlCG,CAAAA,CAAQjC,cAAAA,CAAO8B,CAAa,CAAA,CAAE,QAAA,CAAS,EAAG,CAAC,CAAA,CAC3CI,CAAAA,CAAO,IAAI9V,CAAAA,CAAWA,CAAAA,CAAW,iBAAkBA,CAAAA,CAAW,aAAa,EACjF8V,CAAAA,CAAK,MAAA,CAAOD,CAAK,CAAA,CACjBC,CAAAA,CAAK,IAAA,EAAK,CACV,IAAMC,CAAAA,CAAUD,EAAK,UAAA,EAAW,CAChC,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,CAAA,KACE1R,CAAAA,CAAUgS,EAAAA,CAAgBhS,CAAAA,CAAS2R,EAAKD,CAAE,CAAA,CAE5C,OAAO,CAAE,KAAA,CAAOJ,EAAQ,OAAA,CAAAtR,CAAAA,CAAS,QAAA,CAAU8R,CAAQ,CACrD,CAAA,CAOMC,GAAkB,CAAC/R,CAAAA,CAAqB2R,EAAiBD,CAAAA,GAA+B,CAC5F,IAAIO,CAAAA,CAAgBjS,CAAAA,CAEpB,OAAAiS,CAAAA,CADiBC,UAAAA,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,EAEpB,OAAAiS,CAAAA,CADeC,WAAOP,CAAAA,CAAKD,CAAE,CAAA,CACN,OAAA,CAAQO,CAAa,CAAA,CACrCA,CACT,CAAA,CAEIE,EAAAA,CAAoC,KAElChB,EAAAA,CAAc,IAAc,CAChC,GAAIgB,EAAAA,GAAuB,IAAA,CAAM,CAC/B,IAAMC,CAAAA,CAAmBlS,uBAAU,KAAA,CAAM,eAAA,GACzCiS,EAAAA,CAAsBC,CAAAA,CAAiB,CAAC,CAAA,EAAK,CAAA,CAAKA,CAAAA,CAAiB,CAAC,EACtE,CACA,IAAIC,CAAAA,CAAO,MAAA,CAAO,KAAK,GAAA,EAAK,EACtBC,CAAAA,CAAU,EAAEH,GAAqB,KAAA,CACvC,OAAAE,EAAQA,CAAAA,EAAQ,MAAA,CAAO,EAAE,CAAA,CAAK,MAAA,CAAOC,CAAO,CAAA,CACrCD,CACT,CAAA,CCpGA,IAAME,EAAAA,CAAyBnW,CAAAA,EAAoB,CACjD,IAAMb,CAAAA,CAAIiX,GAASpW,CAAAA,CAAK,EAAE,EAC1B,OAAO,IAAI+D,CAAAA,CAAU5E,CAAC,CACxB,CAAA,CAEMkX,GAAsB/W,CAAAA,EACnBA,CAAAA,CAAE,YAAW,CAGhBgX,EAAAA,CAAsBhX,GACnBA,CAAAA,CAAE,UAAA,EAAW,CAGhBiX,EAAAA,CAAsBjX,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,EAAE,IAAA,CAAK2B,CAAG,EACH,IAAI,UAAA,CAAWuV,CAAAA,CAAM,QAAA,EAAU,CACxC,EAEMC,EAAAA,CAAsBC,CAAAA,EAA2B1W,GAAoB,CACzE,IAAM2W,EAAW,EAAC,CACZvW,CAAAA,CAAS,IAAIT,CAAAA,CAAWA,CAAAA,CAAW,iBAAkBA,CAAAA,CAAW,aAAa,EACnFS,CAAAA,CAAO,MAAA,CAAOJ,CAAG,CAAA,CACjBI,CAAAA,CAAO,IAAA,EAAK,CACZ,IAAA,GAAW,CAAC6D,EAAK2S,CAAY,CAAA,GAAKF,EAChC,GAAI,CACFC,EAAI1S,CAAG,CAAA,CAAI2S,EAAaxW,CAAM,EAChC,OAAS8G,CAAAA,CAAY,CACnB,MAAAA,CAAAA,CAAM,OAAA,CAAU,GAAGjD,CAAG,CAAA,EAAA,EAAKiD,CAAAA,CAAM,OAAO,CAAA,CAAA,CAClCA,CACR,CAEF,OAAOyP,CACT,EAEA,SAASP,EAAAA,CAAS9W,EAAe2B,CAAAA,CAAa,CAC5C,GAAK3B,CAAAA,CAEE,CACL,IAAMkX,EAAQlX,CAAAA,CAAE,IAAA,CAAKA,EAAE,MAAA,CAAQA,CAAAA,CAAE,OAAS2B,CAAG,CAAA,CAC7C,OAAA3B,CAAAA,CAAE,IAAA,CAAK2B,CAAG,EACH,IAAI,UAAA,CAAWuV,EAAM,QAAA,EAAU,CACxC,CAAA,KALE,MAAM,MAAM,oCAAoC,CAMpD,CAEA,IAAMK,EAAAA,CAA4BJ,GAAmB,CACnD,CAAC,OAAQN,EAAqB,CAAA,CAC9B,CAAC,IAAA,CAAMA,EAAqB,CAAA,CAC5B,CAAC,OAAA,CAASE,EAAkB,EAC5B,CAAC,OAAA,CAASC,EAAkB,CAAA,CAC5B,CAAC,WAAA,CAAaC,EAAkB,CAClC,CAAC,EAEYO,EAAAA,CAAe,CAC1B,KAAMD,EACR,CAAA,KCvBME,EAAAA,CAAS,CACblC,CAAAA,CACAP,CAAAA,CACA0C,CAAAA,CACAC,CAAAA,GACW,CACX,GAAI,CAACD,EAAK,UAAA,CAAW,GAAG,EACtB,OAAOA,CAAAA,CAETA,EAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CACvBE,EAAAA,GACArC,CAAAA,CAAasC,EAAAA,CAAatC,CAAU,CAAA,CACpCP,CAAAA,CAAY8C,EAAAA,CAAY9C,CAAS,CAAA,CACjC,IAAM+C,EAAO,IAAI1X,CAAAA,CAAWA,EAAW,gBAAA,CAAkBA,CAAAA,CAAW,aAAa,CAAA,CACjF0X,CAAAA,CAAK,YAAA,CAAaL,CAAI,CAAA,CACtB,IAAMM,EAAa,IAAI,UAAA,CAAWD,EAAK,IAAA,CAAK,CAAA,CAAGA,EAAK,MAAM,CAAA,CAAE,QAAA,EAAU,CAAA,CAChE,CAAE,MAAAvC,CAAAA,CAAO,OAAA,CAAAlR,EAAS,QAAA,CAAAU,CAAS,EAAQsQ,EAAAA,CAAQC,CAAAA,CAAYP,EAAWgD,CAAAA,CAAYL,CAAS,EACvFM,CAAAA,CAAQ,IAAI5X,EAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CAClFuI,EAAAA,CAAW,IAAA,CAAKqP,CAAAA,CAAO,CACrB,MAAOjT,CAAAA,CACP,SAAA,CAAWV,EACX,IAAA,CAAMiR,CAAAA,CAAW,cAAa,CAC9B,KAAA,CAAAC,CAAAA,CACA,EAAA,CAAIR,CACN,CAAC,EACDiD,CAAAA,CAAM,IAAA,GACN,IAAMlU,CAAAA,CAAO,IAAI,UAAA,CAAWkU,CAAAA,CAAM,QAAA,EAAU,CAAA,CAC5C,OAAO,IAAMlT,mBAAAA,CAAK,MAAA,CAAOhB,CAAI,CAC/B,CAAA,CAWMmU,GAAS,CAAC3C,CAAAA,CAAiCmC,IAAyB,CACxE,GAAI,CAACA,CAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,CACtB,OAAOA,EAETA,CAAAA,CAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CACvBE,EAAAA,GACArC,CAAAA,CAAasC,EAAAA,CAAatC,CAAU,CAAA,CAEpC,IAAIyC,EAAaR,EAAAA,CAAa,IAAA,CAAKzS,mBAAAA,CAAK,MAAA,CAAO2S,CAAI,CAAC,EAC9C,CAAE,IAAA,CAAAS,EAAM,EAAA,CAAAC,CAAAA,CAAI,MAAA5C,CAAAA,CAAO,KAAA,CAAAU,CAAAA,CAAO,SAAA,CAAAmC,CAAU,CAAA,CAAIL,EAExCM,CAAAA,CADS/C,CAAAA,CAAW,cAAa,CAAE,QAAA,KAE5B,IAAI9Q,CAAAA,CAAU0T,EAAK,GAAG,CAAA,CAAE,UAAS,CAAI,IAAI1T,EAAU2T,CAAAA,CAAG,GAAG,EAAI,IAAI3T,CAAAA,CAAU0T,CAAAA,CAAK,GAAG,CAAA,CAChGH,CAAAA,CAAiBrC,GAAQJ,CAAAA,CAAY+C,CAAAA,CAAU9C,EAAO6C,CAAAA,CAAWnC,CAAK,EACtE,IAAM6B,CAAAA,CAAO,IAAI1X,CAAAA,CAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CACjF,OAAA0X,CAAAA,CAAK,MAAA,CAAOC,CAAU,CAAA,CACtBD,CAAAA,CAAK,IAAA,EAAK,CACH,GAAA,CAAMA,CAAAA,CAAK,aACpB,CAAA,CAEIQ,GACEX,EAAAA,CAAkB,IAAM,CAC5B,GAAIW,EAAAA,GAAe,OAAW,CAC5B,IAAIC,EACJD,EAAAA,CAAa,IAAA,CACb,GAAI,CACF,IAAM1T,EAAM,qDAAA,CAEN4T,CAAAA,CAAahB,EAAAA,CAAO5S,CAAAA,CADX,uDAAA,CACwB,aAAQ,EAC/C2T,CAAAA,CAAYN,EAAAA,CAAOrT,EAAK4T,CAAU,EACpC,QAAE,CACAF,EAAAA,CAAaC,CAAAA,GAAc,cAC7B,CACF,CACA,GAAID,EAAAA,GAAe,KAAA,CACjB,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAEnE,CAAA,CAEMV,EAAAA,CAAgBa,CAAAA,EAChB,OAAOA,CAAAA,EAAM,SACRnE,CAAAA,CAAW,UAAA,CAAWmE,CAAC,CAAA,CAEvBA,CAAAA,CAGLZ,GAAeY,CAAAA,EACf,OAAOA,GAAM,QAAA,CACRjU,CAAAA,CAAU,WAAWiU,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,gBAAA,CAAA,IAAAC,EAAAA,CAAAA,CAAAA,CAkBO,IAAMA,GAAoBtE,CAAAA,EAAoC,CACnE,IAAIuE,CAAAA,CAAS,sBAAA,CACb,GAAI,CAACvE,CAAAA,CACH,OAAOuE,EAAS,eAAA,CAElB,IAAMrX,EAAS8S,CAAAA,CAAS,MAAA,CACxB,GAAI9S,CAAAA,CAAS,CAAA,CACX,OAAOqX,CAAAA,CAAS,YAAA,CAElB,GAAIrX,CAAAA,CAAS,EAAA,CACX,OAAOqX,CAAAA,CAAS,aAAA,CAEd,KAAK,IAAA,CAAKvE,CAAQ,CAAA,GACpBuE,CAAAA,CAAS,8BAAA,CAAA,CAEX,IAAMC,EAAMxE,CAAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CACxBhT,CAAAA,CAAMwX,EAAI,MAAA,CAChB,IAAA,IAASvZ,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI+B,CAAAA,CAAK/B,IAAK,CAC5B,IAAMwZ,EAAQD,CAAAA,CAAIvZ,CAAC,EACnB,GAAI,CAAC,QAAA,CAAS,IAAA,CAAKwZ,CAAK,CAAA,CACtB,OAAOF,CAAAA,CAAS,gCAAA,CAElB,GAAI,CAAC,cAAA,CAAe,KAAKE,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,CAAA,CACjB,OAAOF,CAAAA,CAAS,YAEpB,CACA,OAAO,IACT,EAEaF,EAAAA,CAAa,CACxB,IAAA,CAAM,CAAA,CACN,OAAA,CAAS,CAAA,CACT,SAAU,CAAA,CACV,mBAAA,CAAqB,EACrB,gBAAA,CAAkB,CAAA,CAClB,mBAAoB,CAAA,CACpB,kBAAA,CAAoB,CAAA,CACpB,YAAA,CAAc,CAAA,CACd,OAAA,CAAS,EACT,cAAA,CAAgB,CAAA,CAChB,eAAgB,EAAA,CAChB,cAAA,CAAgB,GAChB,oBAAA,CAAsB,EAAA,CACtB,sBAAuB,EAAA,CACvB,GAAA,CAAK,GACL,MAAA,CAAQ,EAAA,CACR,uBAAwB,EAAA,CACxB,cAAA,CAAgB,GAChB,WAAA,CAAa,EAAA,CACb,eAAA,CAAiB,EAAA,CACjB,0BAAA,CAA4B,EAAA,CAC5B,oBAAqB,EAAA,CACrB,aAAA,CAAe,GACf,sBAAA,CAAwB,EAAA,CACxB,yBAA0B,EAAA,CAC1B,eAAA,CAAiB,EAAA,CACjB,uBAAA,CAAyB,EAAA,CACzB,eAAA,CAAiB,GACjB,cAAA,CAAgB,EAAA,CAChB,eAAgB,EAAA,CAChB,IAAA,CAAM,GACN,cAAA,CAAgB,EAAA,CAChB,mBAAA,CAAqB,EAAA,CACrB,qBAAA,CAAuB,EAAA,CACvB,6BAA8B,EAAA,CAC9B,aAAA,CAAe,GACf,qBAAA,CAAuB,EAAA,CACvB,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,EAAA,CACjB,qBAAA,CAAuB,EAAA,CACvB,eAAA,CAAiB,GACjB,eAAA,CAAiB,EAAA,CACjB,uBAAwB,EAAA,CACxB,kBAAA,CAAoB,GAEpB,oBAAA,CAAsB,EAAA,CACtB,aAAA,CAAe,EAAA,CACf,eAAA,CAAiB,EAAA,CACjB,eAAgB,EAAA,CAChB,gBAAA,CAAkB,GAClB,QAAA,CAAU,EAAA,CACV,sBAAuB,EAAA,CACvB,UAAA,CAAY,EAAA,CACZ,gBAAA,CAAkB,EAAA,CAClB,0BAAA,CAA4B,GAC5B,QAAA,CAAU,EAAA,CACV,sBAAuB,EAAA,CACvB,yBAAA,CAA2B,GAC3B,yBAAA,CAA2B,EAAA,CAC3B,gBAAiB,EAAA,CACjB,0BAAA,CAA4B,GAC5B,YAAA,CAAc,EAAA,CACd,SAAU,EAAA,CACV,aAAA,CAAe,GACf,qBAAA,CAAuB,EAAA,CACvB,cAAA,CAAgB,EAAA,CAChB,4BAAA,CAA8B,EAAA,CAC9B,uBAAwB,EAAA,CACxB,0BAAA,CAA4B,GAC5B,WAAA,CAAa,EAAA,CACb,6BAA8B,EAAA,CAC9B,wBAAA,CAA0B,EAAA,CAC1B,6BAAA,CAA+B,EAAA,CAC/B,UAAA,CAAY,GACZ,oBAAA,CAAsB,EAAA,CACtB,gBAAiB,EAAA,CACjB,mCAAA,CAAqC,GACrC,cAAA,CAAgB,EAAA,CAChB,uBAAA,CAAyB,EAAA,CACzB,yBAAA,CAA2B,EAAA,CAC3B,sBAAuB,EAAA,CACvB,eAAA,CAAiB,GACjB,YAAA,CAAc,EAAA,CACd,4CAA6C,EAAA,CAC7C,eAAA,CAAiB,GACjB,eAAA,CAAiB,EAAA,CACjB,cAAe,EAAA,CACf,sBAAA,CAAwB,EAC1B,CAAA,CAKaD,EAAAA,CAAqBM,GACzBA,CAAAA,CACJ,MAAA,CAAOC,EAAAA,CAAgB,CAAC,MAAA,CAAO,CAAC,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAC7C,IAAKtY,CAAAA,EAAmBA,CAAAA,GAAU,MAAA,CAAO,CAAC,CAAA,CAAIA,CAAAA,CAAM,UAAS,CAAI,IAAK,EAErEsY,EAAAA,CAAiB,CACrB,CAACC,CAAAA,CAAKC,CAAI,CAAA,CACVC,CAAAA,GAEIA,CAAAA,CAAmB,EAAA,CACd,CAACF,CAAAA,CAAO,MAAA,CAAO,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,EAAAA,CAA4B,CACvCY,CAAAA,CACAvF,CAAAA,GACmF,CACnF,IAAMpQ,CAAAA,CAAO,CACX,UAAA,CAAY,GACZ,KAAA,CAAA2V,CAAAA,CACA,KAAA,CAAY,EACd,CAAA,CACA,QAAW/U,CAAAA,IAAO,MAAA,CAAO,KAAKwP,CAAK,CAAA,CAAG,CACpC,GAAKA,CAAAA,CAAcxP,CAAG,CAAA,GAAM,MAAA,CAAW,SACvC,IAAIgV,CAAAA,CACJ,OAAQhV,GACN,KAAK,MACL,KAAK,iBAAA,CACHgV,EAAO/Q,EAAAA,CAAW,SAAA,CAClB,MACF,KAAK,wBAAA,CACL,KAAK,uBAAA,CACL,KAAK,qBACH+Q,CAAAA,CAAO/Q,EAAAA,CAAW,MAAA,CAClB,MACF,KAAK,mBAAA,CACH+Q,EAAO/Q,EAAAA,CAAW,MAAA,CAClB,MACF,KAAK,KAAA,CACH+Q,EAAO/Q,EAAAA,CAAW,MAAA,CAClB,MACF,KAAK,mBAAA,CACH+Q,CAAAA,CAAO/Q,GAAW,KAAA,CAClB,MACF,KAAK,sBAAA,CACH+Q,CAAAA,CAAO/Q,GAAW,KAAA,CAClB,MACF,QACE,MAAM,IAAI,KAAA,CAAM,yBAAyBjE,CAAG,CAAA,CAAE,CAClD,CACAZ,CAAAA,CAAK,MAAM,IAAA,CAAK,CAACY,EAAKiV,EAAAA,CAAUD,CAAAA,CAAMxF,EAAMxP,CAAG,CAAC,CAAC,CAAC,EACpD,CACA,OAAAZ,CAAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAACuB,CAAAA,CAAQtF,IAAWsF,CAAAA,CAAE,CAAC,EAAE,aAAA,CAActF,CAAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CACrD,CAAC,wBAAA,CAA0B+D,CAAI,CACxC,CAAA,CAEM6V,EAAAA,CAAY,CAACjS,CAAAA,CAAiB5D,CAAAA,GAAc,CAChD,IAAMjD,CAAAA,CAAS,IAAIT,CAAAA,CAAWA,CAAAA,CAAW,gBAAA,CAAkBA,EAAW,aAAa,CAAA,CACnF,OAAAsH,CAAAA,CAAW7G,CAAAA,CAAQiD,CAAI,CAAA,CACvBjD,CAAAA,CAAO,MAAK,CAELuD,mBAAAA,CAAW,IAAI,UAAA,CAAWvD,CAAAA,CAAO,UAAU,CAAC,CACrD,CAAA,CCpIO,SAASmT,GAAOkB,CAAAA,CAAwC,CAC7D,IAAIpR,CAAAA,CACJ,GAAI,OAAOoR,CAAAA,EAAU,QAAA,CAAU,CAG7B,IAAMlV,CAAAA,CAAkB,GACxB,IAAA,IAASL,CAAAA,CAAI,EAAGA,CAAAA,CAAIuV,CAAAA,CAAM,OAAQvV,CAAAA,EAAAA,CAAK,CACrC,IAAIC,CAAAA,CAAIsV,CAAAA,CAAM,UAAA,CAAWvV,CAAC,CAAA,CAC1B,GAAIC,EAAI,GAAA,CACNI,CAAAA,CAAM,KAAKJ,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,KAAA,EAAUA,CAAAA,EAAK,KAAA,EAAUD,CAAAA,CAAI,EAAIuV,CAAAA,CAAM,MAAA,CAAQ,CAC7D,IAAMrV,CAAAA,CAAOqV,EAAM,UAAA,CAAW,EAAEvV,CAAC,CAAA,CACjCC,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,MACEI,CAAAA,CAAM,IAAA,CAAK,IAAQJ,CAAAA,EAAK,EAAA,CAAK,IAASA,CAAAA,EAAK,CAAA,CAAK,GAAO,GAAA,CAAQA,CAAAA,CAAI,EAAK,EAE5E,CACAkE,CAAAA,CAAO,IAAI,UAAA,CAAW9D,CAAK,EAC7B,CAAA,KACE8D,CAAAA,CAAOoR,EAET,OAAO0E,cAAAA,CAAY9V,CAAI,CACzB,CAGO,SAAS+V,GAAMnV,CAAAA,CAAsB,CAC1C,GAAI,CACF,OAAA4P,EAAW,UAAA,CAAW5P,CAAG,CAAA,CAClB,CAAA,CACT,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CAaA,eAAsBoV,CAAAA,CACpBC,EACArV,CAAAA,CACkC,CAClC,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,CACJyM,GAAiB,iDAAA,CAAmD,CACzE6I,CAAAA,CAAG,WACL,CAAC,CACH,CAmBA,eAAsBE,EAAAA,CACpBH,EACArV,CAAAA,CAC0B,CAC1B,IAAMsV,CAAAA,CAAK,IAAI5G,EAAAA,CACf,IAAA,IAAW6G,CAAAA,IAAMF,CAAAA,CACf,MAAMC,CAAAA,CAAG,YAAA,CACPC,EAAG,CAAC,CAAA,CACJA,EAAG,CAAC,CACN,EAEF,OAAAD,CAAAA,CAAG,KAAKtV,CAAG,CAAA,CACJsV,EAAG,SAAA,CAAU,KAAK,CAC3B,CAeA,IAAMG,EAAAA,CAA4B,KAAA,CAElC,SAASC,EAAAA,CAAiBC,EAAiBC,CAAAA,CAA8B,CACvE,IAAM7Q,CAAAA,CAAQ,IAAA,CAAK,KAAI,CAAI,GAAA,CAAO6Q,CAAAA,CAAQ,gBAAA,CACtCC,CAAAA,CACF,MAAA,CAAOD,EAAQ,YAAY,CAAA,CAC1B7Q,EAAQ4Q,CAAAA,CAAWF,EAAAA,CAClBK,EAAa,IAAA,CAAK,KAAA,CAAOD,CAAAA,CAAcF,CAAAA,CAAW,GAAK,CAAA,CAC3D,OAAI,CAAC,QAAA,CAASG,CAAU,CAAA,EAAKA,CAAAA,CAAa,EACxCA,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,CAAAA,CAAsB,CACtC,IAAMC,CAAAA,CAAQ,WAAWD,CAAAA,CAAQ,cAAc,EACzCE,CAAAA,CAAY,UAAA,CAAWF,CAAAA,CAAQ,wBAAwB,CAAA,CACvDG,CAAAA,CAAW,WAAWH,CAAAA,CAAQ,uBAAuB,EACrDI,CAAAA,CAAe,UAAA,CAAWJ,EAAQ,qBAAqB,CAAA,CACvDK,CAAAA,CAAAA,CACH,MAAA,CAAOL,CAAAA,CAAQ,WAAW,EAAI,MAAA,CAAOA,CAAAA,CAAQ,SAAS,CAAA,EAAK,GAAA,CACxDM,EAAgB,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,EAAAA,CAASC,CAAO,CAAA,CAAI,GAAA,CACpC,OAAON,EAAAA,CAAiBC,CAAAA,CAASK,EAAQ,cAAc,CACzD,CAGO,SAASQ,EAAAA,CAAgBC,CAAAA,CAAkC,CAChE,OAAOf,EAAAA,CACL,OAAOe,CAAAA,CAAU,MAAM,EACvBA,CAAAA,CAAU,UACZ,CACF,CC1OO,IAAKC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,MAAA,CAAS,QAAA,CACTA,EAAA,IAAA,CAAO,MAAA,CACPA,EAAA,6BAAA,CAAgC,+BAAA,CAChCA,EAAA,iBAAA,CAAoB,mBAAA,CACpBA,EAAA,aAAA,CAAgB,eAAA,CAChBA,EAAA,OAAA,CAAU,SAAA,CACVA,EAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,UAAA,CAAa,YAAA,CARHA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IAmCL,SAASC,EAAAA,CAAgB1T,EAA8B,CAG5D,IAAM2T,EAAmB3T,CAAAA,EAAO,iBAAA,CAAoB,MAAA,CAAOA,CAAAA,CAAM,iBAAiB,CAAA,CAAI,GAChF4T,CAAAA,CAAe5T,CAAAA,EAAO,QAAU,MAAA,CAAOA,CAAAA,CAAM,OAAO,CAAA,CAAI,EAAA,CAExD6T,CAAAA,CAAY7T,CAAAA,EAAO,KAAA,CAAQ,MAAA,CAAOA,EAAM,KAAK,CAAA,CAAI,GACjD8T,CAAAA,CAAcH,CAAAA,EAAoBC,GAAgB,MAAA,CAAO5T,CAAAA,EAAS,EAAE,CAAA,CAGpE+T,CAAAA,CAAeC,GAEf,CAAA,EAAAH,CAAAA,EAAaG,EAAQ,IAAA,CAAKH,CAAS,GAEnCF,CAAAA,EAAoBK,CAAAA,CAAQ,IAAA,CAAKL,CAAgB,CAAA,EAEjDC,CAAAA,EAAgBI,EAAQ,IAAA,CAAKJ,CAAY,GAEzCE,CAAAA,EAAeE,CAAAA,CAAQ,KAAKF,CAAW,CAAA,CAAA,CAK7C,GACEC,CAAAA,CAAY,0BAA0B,CAAA,EACtCA,EAAY,kBAAkB,CAAA,EAC9BA,EAAY,sCAAsC,CAAA,CAElD,OAAO,CACL,OAAA,CAAS,yDAAA,CACT,IAAA,CAAM,+BAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,EAAY,+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,OAAA,CAAS,8CAAA,CACT,IAAA,CAAM,MAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,uBAAuB,EACrC,OAAO,CACL,OAAA,CAAS,uDAAA,CACT,IAAA,CAAM,MAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,+BAA+B,EAC7C,OAAO,CACL,OAAA,CAAS,8DAAA,CACT,IAAA,CAAM,MAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,4CAA4C,EAC1D,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,IAAA,CAAM,SACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,kBAAkB,CAAA,CAChC,OAAO,CACL,OAAA,CAAS,yDAAA,CACT,IAAA,CAAM,SACN,aAAA,CAAe/T,CACjB,EAIF,GAAI+T,CAAAA,CAAY,6DAA6D,CAAA,CAC3E,OAAO,CACL,OAAA,CAAS,uDAAA,CACT,IAAA,CAAM,SACN,aAAA,CAAe/T,CACjB,EAIF,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,oEAAA,CACT,KAAM,mBAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,EAAY,sCAAsC,CAAA,CACpD,OAAO,CACL,OAAA,CAAS,kEAAA,CACT,KAAM,mBAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,EAAY,wCAAwC,CAAA,CACtD,OAAO,CACL,OAAA,CAAS,4DAAA,CACT,KAAM,mBAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAMF,GACE6T,IAAc,eAAA,EACdA,CAAAA,GAAc,uBACdE,CAAAA,CAAY,gBAAgB,GAC5BA,CAAAA,CAAY,gBAAgB,GAC5BA,CAAAA,CAAY,mBAAmB,GAC/BA,CAAAA,CAAY,gBAAgB,CAAA,CAE5B,OAAO,CACL,OAAA,CAAS,qDACT,IAAA,CAAM,eAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,wBAAwB,CAAA,EAAKA,CAAAA,CAAY,8BAA8B,CAAA,CACrF,OAAO,CACL,OAAA,CAAS,wCACT,IAAA,CAAM,MAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,wBAAwB,CAAA,CACtC,OAAO,CACL,OAAA,CAAS,+CACT,IAAA,CAAM,MAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GACE+T,CAAAA,CAAY,eAAe,GAC3BA,CAAAA,CAAY,qBAAqB,GACjCA,CAAAA,CAAY,kBAAkB,GAC9BA,CAAAA,CAAY,mEAAmE,CAAA,CAE/E,OAAO,CACL,OAAA,CAAS,6DACT,IAAA,CAAM,SAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,UAAU,CAAA,EAAKA,CAAAA,CAAY,YAAY,CAAA,CACrD,OAAO,CACL,OAAA,CAAS,uCACT,IAAA,CAAM,SAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,0BAA0B,CAAA,EAAKA,EAAY,oBAAoB,CAAA,CAC7E,OAAO,CACL,OAAA,CAAS,gDACT,IAAA,CAAM,YAAA,CACN,cAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,mBAAmB,EACjC,OAAO,CACL,QAAS,2CAAA,CACT,IAAA,CAAM,YAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,sEAAsE,EACpF,OAAO,CACL,QAAS,0CAAA,CACT,IAAA,CAAM,YAAA,CACN,aAAA,CAAe/T,CACjB,CAAA,CAIF,GAAI+T,CAAAA,CAAY,2BAA2B,EAGzC,OAAO,CACL,SAFe/T,CAAAA,EAAO,OAAA,EAAW8T,CAAAA,EAAa,SAAA,CAAU,CAAA,CAAG,GAAG,GAAK,2BAAA,CAGnE,IAAA,CAAM,aACN,aAAA,CAAe9T,CACjB,EAKF,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,QAAA,CACN,cAAeA,CACjB,CAAA,CAIF,GAAIA,CAAAA,EAAO,OAAA,EAAW,OAAOA,CAAAA,CAAM,OAAA,EAAY,QAAA,CAC7C,OAAO,CACL,OAAA,CAASA,EAAM,OAAA,CAAQ,SAAA,CAAU,EAAG,GAAG,CAAA,CACvC,KAAM,QAAA,CACN,aAAA,CAAeA,CACjB,CAAA,CAIF,IAAItD,CAAAA,CACJ,OAAI,OAAOsD,CAAAA,EAAU,UAAYA,CAAAA,GAAU,IAAA,CAErCA,EAAM,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,CAAAA,GAAgB,iBAAA,CACxCpX,CAAAA,CAAUoX,CAAAA,CAAY,UAAU,CAAA,CAAG,GAAG,EAEtCpX,CAAAA,CAAU,wBAAA,CAGZA,EAAUoX,CAAAA,CAAY,SAAA,CAAU,CAAA,CAAG,GAAG,CAAA,EAAK,wBAAA,CAGtC,CACL,OAAA,CAAApX,CAAAA,CACA,KAAM,QAAA,CACN,aAAA,CAAesD,CACjB,CACF,CAsBO,SAASiU,EAAAA,CAAYjU,CAAAA,CAAiC,CAC3D,IAAMkU,CAAAA,CAASR,EAAAA,CAAgB1T,CAAK,CAAA,CACpC,OAAO,CAACkU,CAAAA,CAAO,OAAA,CAASA,EAAO,IAAI,CACrC,CAsBO,SAASC,EAAAA,CAA0BnU,EAAqB,CAC7D,GAAM,CAAE,IAAA,CAAA+R,CAAK,CAAA,CAAI2B,EAAAA,CAAgB1T,CAAK,CAAA,CACtC,OAAO+R,CAAAA,GAAS,mBAAA,EAA+BA,IAAS,eAC1D,CAoBO,SAASqC,EAAAA,CAAuBpU,CAAAA,CAAqB,CAC1D,GAAM,CAAE,IAAA,CAAA+R,CAAK,CAAA,CAAI2B,EAAAA,CAAgB1T,CAAK,CAAA,CACtC,OAAO+R,IAAS,+BAClB,CASO,SAASsC,EAAAA,CAAYrU,CAAAA,CAAqB,CAC/C,GAAM,CAAE,IAAA,CAAA+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,EAAAA,CAAgB1T,CAAK,CAAA,CACtC,OAAO+R,IAAS,SAAA,EAAqBA,CAAAA,GAAS,SAChD,CC3XA,eAAewC,EAAAA,CACb5R,CAAAA,CACAoK,CAAAA,CACAqF,CAAAA,CACAoC,EACAC,CAAAA,CAA4B,SAAA,CAC5BC,EACAC,CAAAA,CACAC,CAAAA,CAA+B,QACqB,CACpD,IAAMC,CAAAA,CAAUL,CAAAA,EAAM,OAAA,CAEtB,OAAQ7R,GACN,KAAK,MAAO,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,EAAQ,WAAA,CACV9X,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,WAAA,CAAY9H,CAAQ,CAAA,CAAA,KAExC,MAAM,IAAI,KAAA,CACR,iIAEF,CAAA,CAEF,MAEF,KAAK,QAAA,CACC8H,EAAQ,YAAA,GACV9X,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,YAAA,CAAa9H,CAAQ,CAAA,CAAA,CAE3C,MAEF,KAAK,OACH,GAAI8H,CAAAA,CAAQ,WACV9X,CAAAA,CAAM,MAAM8X,EAAQ,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,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,MAAM0X,CAAS,CAAA,mBAAA,EAAsB1H,CAAQ,CAAA,CAAE,CAAA,CAIjE,IAAMY,EAAahB,CAAAA,CAAW,UAAA,CAAW5P,CAAG,CAAA,CAC5C,OAAI6X,IAAkB,OAAA,CACb,MAAMrC,EAAAA,CAAyBH,CAAAA,CAAKzE,CAAU,CAAA,CAEhD,MAAMwE,CAAAA,CAAoBC,CAAAA,CAAKzE,CAAU,CAClD,CAEA,KAAK,UAAA,CAAY,CACf,GAAI,CAACkH,CAAAA,EAAS,sBACZ,MAAM,IAAI,MAAM,mCAAmC,CAAA,CAErD,OAAO,MAAMA,CAAAA,CAAQ,qBAAA,CAAsB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CACrE,CAEA,KAAK,aAAc,CACjB,GAAI,CAACI,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA,CAK3D,GAAIJ,CAAAA,GAAc,SAAA,CAAW,CAC3B,GAAII,CAAAA,CAAQ,wBACV,OAAO,MAAMA,CAAAA,CAAQ,uBAAA,CAAwB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,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,CAAAA,CACF,GAAI,CAGF,OAAA,CADiB,MADF,IAAIC,mBAAAA,CAAG,OAAO,CAAE,WAAA,CAAaD,CAAM,CAAC,CAAA,CACrB,SAAA,CAAU1C,CAAG,CAAA,EAC3B,MAClB,OAAS4C,CAAAA,CAAY,CAEnB,GAAIH,CAAAA,CAAQ,uBAAA,EAA2BV,GAA0Ba,CAAU,CAAA,CACzE,OAAO,MAAMH,CAAAA,CAAQ,uBAAA,CAAwB9H,EAAUqF,CAAAA,CAAKqC,CAAS,EAEvE,MAAMO,CACR,CAIF,GAAIH,CAAAA,CAAQ,wBACV,OAAO,MAAMA,EAAQ,uBAAA,CAAwB9H,CAAAA,CAAUqF,EAAKqC,CAAS,CAAA,CAGvE,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC1H,CAAQ,CAAA,CAAE,CAC7D,CAEA,KAAK,UAAA,CAAY,CACf,GAAI,CAAC8H,GAAS,qBAAA,CACZ,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAErD,OAAO,MAAMA,CAAAA,CAAQ,sBAAsB9H,CAAAA,CAAUqF,CAAAA,CAAKqC,CAAS,CACrE,CAEA,KAAK,QAAA,CAAU,CACb,GAAI,CAACD,CAAAA,EAAM,SAAA,CACT,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,EAAAA,CACblI,EACAqF,CAAAA,CACAoC,CAAAA,CACAC,EAA4B,SAAA,CAC5BG,CAAAA,CAA+B,OAAA,CACqB,CACpD,IAAMC,CAAAA,CAAUL,GAAM,OAAA,CAItB,GAAIK,GAAS,YAAA,CAAc,CACzB,IAAMK,CAAAA,CAAY,MAAML,CAAAA,CAAQ,YAAA,CAAa9H,CAAAA,CAAU0H,CAAS,EAEhE,GAAIS,CAAAA,CAAW,CAIb,IAAMC,CAAAA,CAAiBN,EAAQ,uBAAA,CAC3B,MAAMA,EAAQ,uBAAA,CAAwB9H,CAAQ,EAC9C,KAAA,CAIJ,GACE0H,IAAc,SAAA,EACdU,CAAAA,EACAD,IAAc,KAAA,CAEd,GAAI,CAEF,OAAO,MAAMX,EAAAA,CAAoB,aAAcxH,CAAAA,CAAUqF,CAAAA,CAAKoC,EAAMC,CAAAA,CAAW,KAAA,CAAA,CAAW,OAAWG,CAAa,CACpH,CAAA,MAAS5U,CAAAA,CAAO,CAGd,GAAI,CAACmU,EAAAA,CAA0BnU,CAAK,EAClC,MAAMA,CAAAA,CAGR,QAAQ,IAAA,CAAK,0DAAA,CAA4DA,CAAK,EAChF,CAIF,GACEyU,IAAc,SAAA,EACdU,CAAAA,EACAD,IAAc,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,EAAAA,CAA0BnU,CAAK,CAAA,CAClC,MAAMA,EAER,OAAA,CAAQ,IAAA,CAAK,qEAAsEA,CAAK,EAC1F,CAIF,GACEyU,CAAAA,GAAc,SAAA,EACdU,GACAD,CAAAA,GAAc,UAAA,CAEd,GAAI,CAEF,OAAO,MAAMX,EAAAA,CAAoB,YAAA,CAAcxH,CAAAA,CAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,CAAAA,CAAW,OAAW,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,EAAAA,CAAoBW,EAAWnI,CAAAA,CAAUqF,CAAAA,CAAKoC,EAAMC,CAAAA,CAAW,KAAA,CAAA,CAAW,OAAWG,CAAa,CACjH,CAAA,MAAS5U,CAAAA,CAAO,CAEd,GAAImU,GAA0BnU,CAAK,CAAA,EAG/B6U,EAAQ,iBAAA,GACPJ,CAAAA,GAAc,WAAaA,CAAAA,GAAc,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,EAAW7I,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,EAAgBrI,CAAAA,CAAUqF,CAAAA,CAAKoC,EAAMC,CAAAA,CAAW,MAAA,CAAW,MAAA,CAAWG,CAAa,CACtH,CAIF,MAAM5U,CACR,CACF,CAGA,GAAIyU,CAAAA,GAAc,UAEhB,GAAI,CACF,OAAO,MAAMF,EAAAA,CAAoB,YAAA,CAAcxH,EAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,KAAA,CAAA,CAAW,KAAA,CAAA,CAAWG,CAAa,CACpH,CAAA,MAASS,EAAS,CAChB,GAAIlB,GAA0BkB,CAAO,CAAA,EAAKR,EAAQ,iBAAA,CAAmB,CACnE,IAAMjJ,CAAAA,CAAgBwG,CAAAA,CAAI,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAI,CAAC,EAAE,CAAC,CAAA,CAAI,UAC7CgD,CAAAA,CAAiB,MAAMP,EAAQ,iBAAA,CAAkBJ,CAAAA,CAAW7I,CAAa,CAAA,CAC/E,GAAI,CAACwJ,EACH,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+BrI,CAAQ,wBAAwB,CAAA,CAEjF,OAAO,MAAMwH,EAAAA,CAAoBa,CAAAA,CAAgBrI,CAAAA,CAAUqF,EAAKoC,CAAAA,CAAMC,CAAAA,CAAW,OAAW,MAAA,CAAWG,CAAa,CACtH,CACA,MAAMS,CACR,CAAA,KAAA,GACSZ,CAAAA,GAAc,UAAYI,CAAAA,CAAQ,iBAAA,CAAmB,CAE9D,IAAMjJ,CAAAA,CAAgBwG,EAAI,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAI,CAAC,CAAA,CAAE,CAAC,EAAI,SAAA,CAC7CgD,CAAAA,CAAiB,MAAMP,CAAAA,CAAQ,iBAAA,CAAkBJ,EAAW7I,CAAa,CAAA,CAC/E,GAAI,CAACwJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsBX,CAAS,CAAA,yCAAA,CAA2C,CAAA,CAE5F,OAAO,MAAMF,EAAAA,CAAoBa,CAAAA,CAAgBrI,CAAAA,CAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,EAAW,MAAA,CAAW,MAAA,CAAWG,CAAa,CACtH,CACF,CAIA,IAAMU,CAAAA,CAAQd,GAAM,aAAA,EAAiB,CAAC,MAAO,UAAA,CAAY,YAAA,CAAc,WAAY,QAAQ,CAAA,CACrFe,EAA6B,IAAI,GAAA,CAEvC,IAAA,IAAW5S,CAAAA,IAAU2S,CAAAA,CACnB,GAAI,CAEF,IAAIE,CAAAA,CAAa,GACbC,CAAAA,CAAa,EAAA,CACbC,EACAC,CAAAA,CAEJ,OAAQhT,CAAAA,EACN,KAAK,KAAA,CACH,GAAI,CAACkS,CAAAA,CACHW,EAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,2BACR,CAEL,IAAI1Y,CAAAA,CAEJ,OAAQ0X,CAAAA,EACN,KAAK,OAAA,CACCI,CAAAA,CAAQ,cACV9X,CAAAA,CAAM,MAAM8X,EAAQ,WAAA,CAAY9H,CAAQ,GAE1C,MACF,KAAK,SACC8H,CAAAA,CAAQ,YAAA,GACV9X,EAAM,MAAM8X,CAAAA,CAAQ,aAAa9H,CAAQ,CAAA,CAAA,CAE3C,MACF,KAAK,MAAA,CACC8H,CAAAA,CAAQ,aACV9X,CAAAA,CAAM,MAAM8X,EAAQ,UAAA,CAAW9H,CAAQ,GAEzC,MAEF,QACEhQ,CAAAA,CAAM,MAAM8X,CAAAA,CAAQ,aAAA,CAAc9H,CAAQ,CAAA,CAC1C,KACJ,CAEKhQ,CAAAA,CAIH2Y,CAAAA,CAAgB3Y,GAHhByY,CAAAA,CAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,CAAA,GAAA,EAAMhB,CAAS,CAAA,cAAA,CAAA,EAIhC,CACA,MACF,KAAK,WACEI,CAAAA,EAAS,qBAAA,GACZW,EAAa,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,CAAAA,CAAQ,eAAe9H,CAAQ,CAAA,CAC/C+H,IACFa,CAAAA,CAAkBb,CAAAA,EAItB,CACA,MACF,KAAK,UAAA,CACED,CAAAA,EAAS,qBAAA,GACZW,CAAAA,CAAa,GACbC,CAAAA,CAAa,mCAAA,CAAA,CAEf,MACF,KAAK,QAAA,CACEjB,GAAM,SAAA,GACTgB,CAAAA,CAAa,CAAA,CAAA,CACbC,CAAAA,CAAa,uCAAA,CAAA,CAEf,KACJ,CAEA,GAAID,CAAAA,CAAY,CACdD,CAAAA,CAAO,GAAA,CAAI5S,EAAQ,IAAI,KAAA,CAAM,YAAY8S,CAAU,CAAA,CAAE,CAAC,CAAA,CACtD,QACF,CAGA,OAAO,MAAMlB,GAAoB5R,CAAAA,CAAQoK,CAAAA,CAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,CAAAA,CAAWiB,CAAAA,CAAeC,EAAiBf,CAAa,CACxH,OAAS5U,CAAAA,CAAO,CAKd,GAHAuV,CAAAA,CAAO,GAAA,CAAI5S,CAAAA,CAAQ3C,CAAc,CAAA,CAG7B,CAACmU,GAA0BnU,CAAK,CAAA,CAElC,MAAMA,CAEV,CAQF,GAAI,CAJoB,KAAA,CAAM,IAAA,CAAKuV,CAAAA,CAAO,MAAA,EAAQ,EAAE,IAAA,CAClDvV,CAAAA,EAAS,CAACA,CAAAA,CAAM,OAAA,CAAQ,WAAW,UAAU,CAC/C,EAEsB,CAEpB,IAAM4V,EAAc,KAAA,CAAM,IAAA,CAAKL,EAAO,OAAA,EAAS,EAC5C,GAAA,CAAI,CAAC,CAAC5S,CAAAA,CAAQ3C,CAAK,CAAA,GAAM,GAAG2C,CAAM,CAAA,EAAA,EAAK3C,EAAM,OAAO,CAAA,CAAE,EACtD,IAAA,CAAK,IAAI,CAAA,CACZ,MAAM,IAAI,KAAA,CACR,kDAAkD+M,CAAQ,CAAA,EAAA,EAAK6I,CAAW,CAAA,CAC5E,CACF,CAGA,IAAMC,CAAAA,CAAgB,KAAA,CAAM,IAAA,CAAKN,CAAAA,CAAO,OAAA,EAAS,CAAA,CAC9C,GAAA,CAAI,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,CAAA,6CAAA,EAAgD+M,CAAQ,CAAA,UAAA,EAAa8I,CAAa,EACpF,CACF,CA6DO,SAASC,CAAAA,CACdC,CAAAA,CAA2B,EAAC,CAC5BhJ,CAAAA,CACAqE,CAAAA,CACA4E,CAAAA,CAAgE,IAAM,CAAC,EACvExB,CAAAA,CACAC,CAAAA,CAA4B,UAC5B9I,CAAAA,CAeA,CACA,IAAMiJ,CAAAA,CAAgBjJ,CAAAA,EAAS,aAAA,EAAiB,OAAA,CAEhD,OAAOsK,sBAAAA,CAAY,CACjB,SAAA,CAAAD,CAAAA,CACA,SAAUrK,CAAAA,EAAS,QAAA,CACnB,QAASA,CAAAA,EAAS,OAAA,CAClB,UAAWA,CAAAA,EAAS,SAAA,CACpB,YAAa,CAAC,GAAGoK,EAAahJ,CAAQ,CAAA,CACtC,WAAY,MAAOmJ,CAAAA,EAAe,CAChC,GAAI,CAACnJ,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,kEACF,CAAA,CAGF,IAAMqF,EAAMhB,CAAAA,CAAW8E,CAAO,CAAA,CAE9B,GAAI,CAEF,GAAI1B,GAAM,cAAA,GAAmB,CAAA,CAAA,EAASA,GAAM,OAAA,CAC1C,OAAO,MAAMS,EAAAA,CAAsBlI,CAAAA,CAAUqF,CAAAA,CAAKoC,CAAAA,CAAMC,CAAAA,CAAWG,CAAa,EAIlF,GAAIJ,CAAAA,EAAM,UACR,OAAO,MAAMA,EAAK,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,CAAA,mEAAA,EAAsEA,CAAS,CAAA,uDAAA,EACtCA,CAAS,cACpD,CAAA,CAGF,IAAM9G,EAAahB,CAAAA,CAAW,UAAA,CAAWwJ,CAAU,CAAA,CAEnD,OAAO,MAAMhE,EACXC,CAAAA,CACAzE,CACF,CACF,CAEA,IAAMyI,EAAc5B,CAAAA,EAAM,WAAA,CAC1B,GAAI4B,CAAAA,CAGF,OAAA,CADiB,MADF,IAAIrB,mBAAAA,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,EAAG,CACV,MAAIA,CAAAA,YAAavE,CAAAA,CAKT,IAAI,KAAA,CAAMuE,EAAE,OAAO,CAAA,CAErBA,CACR,CACF,CACF,CAAC,CACH,CClnBA,eAAsBwQ,GACpBtJ,CAAAA,CACAhO,CAAAA,CACAmX,EACA1B,CAAAA,CACA,CACA,GAAI,CAACzH,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,kEACF,EAEF,IAAMuJ,CAAAA,CAAQ,CACZ,EAAA,CAAAvX,CAAAA,CACA,eAAgB,EAAC,CACjB,uBAAwB,CAACgO,CAAQ,EACjC,IAAA,CAAM,IAAA,CAAK,UAAUmJ,CAAO,CAC9B,EAEA,GAAI1B,CAAAA,EAAM,SAAA,CACR,OAAOA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAC,aAAA,CAAe8B,CAAK,CAAC,CAAA,CAAG,SAAS,CAAA,CAG3D,IAAMH,CAAAA,CAAa3B,CAAAA,EAAM,UAAA,CACzB,GAAI2B,EAAY,CACd,IAAMxI,EAAahB,CAAAA,CAAW,UAAA,CAAWwJ,CAAU,CAAA,CAEnD,OAAOhE,CAAAA,CACL,CAAC,CAAC,aAAA,CAAemE,CAAK,CAAC,CAAA,CACvB3I,CACF,CACF,CAGA,IAAMyI,CAAAA,CAAc5B,CAAAA,EAAM,YAC1B,GAAI4B,CAAAA,CAIF,QAHiB,MAAM,IAAIrB,oBAAG,MAAA,CAAO,CACnC,YAAAqB,CACF,CAAC,CAAA,CAAE,UAAA,CAAW,EAAC,CAAG,CAACrJ,CAAQ,CAAA,CAAGhO,EAAI,IAAA,CAAK,SAAA,CAAUmX,CAAO,CAAC,CAAA,EACzC,MAAA,CAgBlB,IAAMrB,CAAAA,CAAUL,CAAAA,EAAM,QACtB,GAAIK,CAAAA,CAAS,CACX,IAAMzC,CAAAA,CACJ,CAAC,CAAC,aAAA,CAAekE,CAAK,CAAC,CAAA,CAEzB,GAAI9B,GAAM,SAAA,GAAc,UAAA,EAAcK,EAAQ,qBAAA,CAC5C,OAAOA,EAAQ,qBAAA,CAAsB9H,CAAAA,CAAUqF,EAAK,SAAS,CAAA,CAE/D,GAAIoC,CAAAA,EAAM,SAAA,GAAc,YAAcK,CAAAA,CAAQ,qBAAA,CAC5C,OAAOA,CAAAA,CAAQ,qBAAA,CAAsB9H,CAAAA,CAAUqF,CAAAA,CAAK,SAAS,CAEjE,CAEA,MAAM,IAAI,MACR,mEACF,CACF,CClEO,IAAMmE,EAAAA,CAA+B,IAYrC,SAASC,CAAAA,CACd3B,CAAAA,CACAD,EACA9I,CAAAA,CACsB,CACtB,GAAK+I,CAAAA,EAAS,iBAAA,CACd,IAAID,CAAAA,GAAkB,MAAA,CAEpB,OAAOC,CAAAA,CAAQ,iBAAA,CAAkB/I,CAAI,EAEvC,UAAA,CAAW,IAAM+I,EAAQ,iBAAA,GAAoB/I,CAAI,EAAG,GAA4B,EAAA,CAClF,CChCO,SAAS2K,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,OAAA,CAAQ,KAAK,QAAA,GAAa,aACnC,MAAQ,CACN,OAAO,MACT,CACF,CAAA,GAAG,CAEGC,GAAkB,IAAM,CAC5B,GAAI,CACF,OAAO,QAAQ,GAAA,EAAK,mBACtB,CAAA,KAAQ,CACN,MACF,CACF,EAGaC,EAAAA,CAA0B,GAAA,CAsB1BC,GAAoB,GAAA,CAAS,GAAA,CAsBtCC,GAGAC,GAEJ,SAASC,EAAAA,EAAkC,CACzC,OAAIF,EAAAA,CACKA,IAAoB,CAErBC,EAAAA,GAAwB,IAAIE,sBACtC,KAEaC,CAAAA,CAAS,CACpB,eAAgB,oBAAA,CAYhB,eAAA,CAAiB,SASjB,QAAA,CAAU,YAAA,CACV,UAAW,sBAAA,CAEX,IAAI,WAAsB,CACxB,OAAO1c,CAAAA,CAAa,KACtB,CAAA,CACA,YAAA,CAAcmc,IAAgB,CAQ9B,IAAI,aAA2B,CAC7B,OAAOK,IACT,CAAA,CACA,IAAI,WAAA,CAAYG,CAAAA,CAAqB,CACnCL,GAAsB,IAAMK,EAC9B,EACA,YAAA,CAAc,yBAAA,CACd,cAAe,uBAAA,CAEf,YAAA,CAAc,EAAC,CACf,QAAA,CAAU,GACV,YAAA,CAAc,GAEd,cAAA,CAAgB,GAChB,kBAAA,CAAoB,GAEpB,gBAAA,CAAkB,KACpB,EAQiBC,6BAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CAAeF,CAAAA,CAAqB,CAClDD,CAAAA,CAAO,WAAA,CAAcC,EACvB,CAFOC,CAAAA,CAAS,cAAA,CAAAC,EAsBT,SAASC,CAAAA,CAAuBxW,EAA4B,CACjEgW,EAAAA,CAAsBhW,EACxB,CAFOsW,CAAAA,CAAS,sBAAA,CAAAE,CAAAA,CAQT,SAASC,CAAAA,CAAkBC,EAAc,CAC9CN,CAAAA,CAAO,eAAiBM,EAC1B,CAFOJ,EAAS,iBAAA,CAAAG,CAAAA,CAWT,SAASE,CAAAA,CAAYC,CAAAA,CAAkB,CAC5CR,EAAO,QAAA,CAAWQ,EACpB,CAFON,CAAAA,CAAS,WAAA,CAAAK,EAiBT,SAASE,CAAAA,CAAmBC,CAAAA,CAAkB,CACnD,GAAI,OAAOA,GAAa,QAAA,EAAYA,CAAAA,CAAS,MAAK,GAAM,EAAA,CACtD,MAAM,IAAI,KAAA,CACR,kLAEF,CAAA,CAGFV,CAAAA,CAAO,eAAA,CAAkBU,EAC3B,CATOR,CAAAA,CAAS,mBAAAO,CAAAA,CAuBT,SAASE,GAA8B,CAC5C,OAAIX,CAAAA,CAAO,cAAA,CACFA,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,EAiBT,SAASC,CAAAA,CAAgBN,EAAc,CAC5CN,CAAAA,CAAO,aAAeM,EACxB,CAFOJ,EAAS,eAAA,CAAAU,CAAAA,CAQT,SAASC,CAAAA,CAAaP,CAAAA,CAAc,CACzCN,CAAAA,CAAO,SAAA,CAAYM,EACrB,CAFOJ,CAAAA,CAAS,YAAA,CAAAW,CAAAA,CAWT,SAASC,CAAAA,CAAatd,EAAiB,CAC5CE,EAAAA,CAAeF,CAAK,EACtB,CAFO0c,EAAS,YAAA,CAAAY,CAAAA,CAWT,SAASld,CAAAA,CAAaJ,CAAAA,CAAiB,CAC5CI,GAAmBJ,CAAK,EAC1B,CAFO0c,CAAAA,CAAS,YAAA,CAAAtc,EAYT,SAASE,CAAAA,CAAkBC,CAAAA,CAA4C,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,cAAA9b,CAAAA,CAShB,SAAS4c,EAAiBvE,CAAAA,CAAqD,CAE7E,GAAI,4BAAA,CAA6B,IAAA,CAAKA,CAAO,CAAA,CAC3C,OAAO,CAAE,KAAM,KAAA,CAAO,MAAA,CAAQ,6BAA8B,CAAA,CAI9D,GAAI,yBAAyB,IAAA,CAAKA,CAAO,CAAA,CACvC,OAAO,CAAE,IAAA,CAAM,MAAO,MAAA,CAAQ,iDAAkD,EAIlF,GAAI,wBAAA,CAAyB,KAAKA,CAAO,CAAA,CACvC,OAAO,CAAE,IAAA,CAAM,MAAO,MAAA,CAAQ,uDAAwD,EAIxF,GAAI,UAAA,CAAW,KAAKA,CAAO,CAAA,EAAK,UAAA,CAAW,IAAA,CAAKA,CAAO,CAAA,CACrD,OAAO,CAAE,IAAA,CAAM,MAAO,MAAA,CAAQ,0CAA2C,EAI3E,IAAMwE,CAAAA,CAAiB,qBAAA,CACnBC,CAAAA,CACJ,KAAA,CAAQA,CAAAA,CAAQD,EAAe,IAAA,CAAKxE,CAAO,KAAO,IAAA,EAAM,CACtD,GAAM,EAAG0E,CAAAA,CAAKC,CAAG,CAAA,CAAIF,CAAAA,CAErB,GADc,QAAA,CAASE,CAAAA,CAAK,EAAE,CAAA,CAAI,QAAA,CAASD,EAAK,EAAE,CAAA,CACtC,IACV,OAAO,CAAE,KAAM,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,EAAI,GAAA,CAEjB,IAAA,CAAK,OAAO,EAAE,CAAA,CAAI,IAElB,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAEd,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,CAAI,KAAA,CAAM,OAAO,EAAE,CAAA,CAAI,GACxC,CAAA,CAEMC,CAAAA,CAAmB,EAEzB,IAAA,IAAWxL,CAAAA,IAASuL,EAAmB,CACrC,IAAMre,EAAQ,IAAA,CAAK,GAAA,GACnB,GAAI,CACFoe,CAAAA,CAAM,IAAA,CAAKtL,CAAK,CAAA,CAChB,IAAMyL,CAAAA,CAAW,IAAA,CAAK,KAAI,CAAIve,CAAAA,CAE9B,GAAIue,CAAAA,CAAWD,CAAAA,CACb,OAAO,CACL,IAAA,CAAM,CAAA,CAAA,CACN,OAAQ,CAAA,sBAAA,EAAyBA,CAAgB,YAAYC,CAAQ,CAAA,mBAAA,EAAsBzL,EAAM,MAAM,CAAA,CAAA,CACzG,CAEJ,CAAA,MAAStH,CAAAA,CAAK,CACZ,OAAO,CAAE,IAAA,CAAM,MAAO,MAAA,CAAQ,CAAA,0BAAA,EAA6BA,CAAG,CAAA,CAAG,CACnE,CACF,CAEA,OAAO,CAAE,IAAA,CAAM,IAAK,CACtB,CAQA,SAASgT,EAAiBjF,CAAAA,CAAiBkF,CAAAA,CAAY,GAAA,CAAoB,CAGzE,GAAI,CAEF,GAAI,CAAClF,CAAAA,CACH,OAAI+C,EAAAA,EACF,OAAA,CAAQ,KAAK,4CAA4C,CAAA,CAEpD,IAAA,CAGT,GAAI/C,CAAAA,CAAQ,MAAA,CAASkF,EACnB,OAAInC,EAAAA,EACF,QAAQ,IAAA,CAAK,CAAA,oCAAA,EAAuC/C,EAAQ,MAAM,CAAA,aAAA,EAAgBkF,CAAS,CAAA,YAAA,EAAelF,CAAAA,CAAQ,SAAA,CAAU,EAAG,EAAE,CAAC,KAAK,CAAA,CAElI,IAAA,CAIT,IAAMmF,CAAAA,CAAiBZ,CAAAA,CAAiBvE,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,EAAG,EAAE,CAAC,KAAK,CAAA,CAElI,IAAA,CAIT,IAAI6E,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAQ,IAAI,MAAA,CAAO7E,CAAO,EAC5B,CAAA,MAASoF,EAAY,CACnB,OAAIrC,IACF,OAAA,CAAQ,IAAA,CAAK,CAAA,2DAAA,EAA8D/C,CAAAA,CAAQ,SAAA,CAAU,CAAA,CAAG,EAAE,CAAC,CAAA,GAAA,CAAA,CAAOoF,CAAU,CAAA,CAE/G,IACT,CAGA,IAAMC,CAAAA,CAAcT,EAAqBC,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,EAAG,EAAE,CAAC,KAAK,CAAA,CAE5H,IAAA,CAIX,OAAS/N,CAAAA,CAAK,CACZ,OAAI8Q,EAAAA,EACF,OAAA,CAAQ,IAAA,CAAK,4DAA4D/C,CAAAA,CAAQ,SAAA,CAAU,EAAG,EAAE,CAAC,MAAO/N,CAAG,CAAA,CAEtG,IACT,CACF,CAMO,SAASqT,EACdC,CAAAA,CAAwB,GACxB,CACA,IAAMC,EAAcpgB,CAAAA,EAClB,KAAA,CAAM,QAAQA,CAAK,CAAA,CAAIA,EAAM,MAAA,CAAQ4F,EAAAA,EAAyB,OAAOA,EAAAA,EAAS,QAAQ,EAAI,EAAC,CAGvFuO,CAAAA,CAAQgM,CAAAA,EAAS,EAAC,CAElBE,EAAW,CACf,QAAA,CAAUD,EAAWjM,CAAAA,CAAM,QAAQ,EACnC,IAAA,CAAMiM,CAAAA,CAAWjM,CAAAA,CAAM,IAAI,CAAA,CAC3B,QAAA,CAAUiM,EAAWjM,CAAAA,CAAM,KAAK,CAClC,CAAA,CAEAgK,CAAAA,CAAO,aAAekC,CAAAA,CAAS,QAAA,CAC/BlC,CAAAA,CAAO,QAAA,CAAWkC,CAAAA,CAAS,IAAA,CAC3BlC,EAAO,YAAA,CAAekC,CAAAA,CAAS,SAG/BlC,CAAAA,CAAO,cAAA,CAAiBkC,EAAS,IAAA,CAC9B,GAAA,CAAKzF,GAAYiF,CAAAA,CAAiBjF,CAAO,CAAC,CAAA,CAC1C,MAAA,CAAQnY,GAAmBA,CAAAA,GAAM,IAAI,EAIxC0b,CAAAA,CAAO,kBAAA,CAAqB,EAAC,CAE7B,IAAMmC,CAAAA,CAAmBD,EAAS,IAAA,CAAK,MAAA,CAASlC,EAAO,cAAA,CAAe,MAAA,CAMlE,CAACA,CAAAA,CAAO,gBAAA,EAAoBR,EAAAA,GAC9B,OAAA,CAAQ,GAAA,CAAI,kCAAkC,EAC9C,OAAA,CAAQ,GAAA,CAAI,iBAAiB0C,CAAAA,CAAS,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CACvD,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqBlC,CAAAA,CAAO,eAAe,MAAM,CAAA,CAAA,EAAIkC,EAAS,IAAA,CAAK,MAAM,cAAcC,CAAgB,CAAA,UAAA,CAAY,EAC/H,OAAA,CAAQ,GAAA,CAAI,sBAAsBD,CAAAA,CAAS,QAAA,CAAS,MAAM,CAAA,8BAAA,CAAgC,CAAA,CAEtFC,EAAmB,CAAA,EACrB,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAASA,CAAgB,CAAA,8FAAA,CAAgG,GAI1InC,CAAAA,CAAO,gBAAA,CAAmB,KAC5B,CA9COE,CAAAA,CAAS,aAAA6B,EAAAA,CAAAA,EA5TD7B,qBAAAA,GAAA,EAAA,CAAA,CCpIV,SAASkC,IAAkB,CAChC,OAAO,IAAIrC,sBAAAA,CAAY,CACrB,cAAA,CAAgB,CACd,OAAA,CAAS,CAIP,qBAAsB,KAAA,CACtB,cAAA,CAAgB,KAClB,CACF,CACF,CAAC,CACH,KACasC,CAAAA,CAAiB,IAAMrC,EAAO,WAAA,CAE1BsC,oCAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CAAgBC,CAAAA,CAAoB,CAElD,OADoBH,CAAAA,GACD,YAAA,CAAgBG,CAAQ,CAC7C,CAHOF,CAAAA,CAAS,aAAAC,CAAAA,CAKT,SAASE,CAAAA,CAAwBD,CAAAA,CAAoB,CAE1D,OADoBH,GAAe,CAChB,YAAA,CAA8BG,CAAQ,CAC3D,CAHOF,EAAS,oBAAA,CAAAG,CAAAA,CAKhB,eAAsBC,CAAAA,CAAiBtO,CAAAA,CAA6B,CAElE,aADoBiO,CAAAA,EAAe,CACjB,cAAcjO,CAAO,CAAA,CAChCmO,EAAgBnO,CAAAA,CAAQ,QAAQ,CACzC,CAJAkO,CAAAA,CAAsB,cAAAI,CAAAA,CAMtB,eAAsBC,EACpBvO,CAAAA,CAOA,CAEA,aADoBiO,CAAAA,EAAe,CACjB,qBAAA,CAAsBjO,CAAO,CAAA,CACxCqO,CAAAA,CAAwBrO,EAAQ,QAAQ,CACjD,CAZAkO,CAAAA,CAAsB,qBAAA,CAAAK,EAcf,SAASC,CAAAA,CAA6BxO,CAAAA,CAA6B,CACxE,OAAO,CACL,SAAU,IAAMsO,CAAAA,CAActO,CAAO,CAAA,CACrC,OAAA,CAAS,IAAMmO,CAAAA,CAAgBnO,CAAAA,CAAQ,QAAQ,CAAA,CAC/C,cAAA,CAAgB,IAAMyO,oBAASzO,CAAO,CAAA,CACtC,YAAa,IAAMiO,CAAAA,GAAiB,UAAA,CAAWjO,CAAO,CACxD,CACF,CAPOkO,EAAS,yBAAA,CAAAM,CAAAA,CAST,SAASE,CAAAA,CACd1O,CAAAA,CAOA,CACA,OAAO,CACL,QAAA,CAAU,IAAMuO,CAAAA,CAAsBvO,CAAO,EAC7C,OAAA,CAAS,IAAMqO,EAAwBrO,CAAAA,CAAQ,QAAQ,EACvD,cAAA,CAAgB,IAAM2O,2BAAAA,CAAiB3O,CAAO,CAAA,CAC9C,WAAA,CAAa,IAAMiO,CAAAA,EAAe,CAAE,mBAAmBjO,CAAO,CAChE,CACF,CAfOkO,CAAAA,CAAS,iCAAA,CAAAQ,EAAAA,CAAAA,EAxCDR,4BAAAA,GAAA,EAAA,CAAA,CC/BV,SAASU,EAAAA,CAAUzJ,EAAgB,CACxC,OAAO,KAAK,IAAA,CAAK,SAAA,CAAUA,CAAC,CAAC,CAC/B,CAEO,SAAS0J,EAAAA,CAAU1J,EAAa,CACrC,IAAI2J,CAAAA,CAAc,IAAA,CAAK3J,CAAC,CAAA,CACxB,GAAI2J,CAAAA,CAAY,CAAC,IAAM,GAAA,CAGvB,OAAO,KAAK,KAAA,CAAMA,CAAW,CAC/B,CCRO,IAAKC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,IAAA,CAAO,MAAA,CACPA,EAAA,GAAA,CAAM,KAAA,CACNA,EAAA,KAAA,CAAQ,OAAA,CAHEA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,CAAA,CAMAC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,eAAgB,MAAA,CAChBA,CAAAA,CAAA,eAAgB,KAAA,CAChBA,CAAAA,CAAA,eAAgB,OAAA,CAHNA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IAWL,SAASC,CAAAA,CAAWC,EAAgC,CACzD,GAAI,OAAOA,CAAAA,EAAS,QAAA,CAAU,CAC5B,IAAMC,CAAAA,CAAKD,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CACzB,OAAO,CACL,MAAA,CAAQ,WAAWC,CAAAA,CAAG,CAAC,CAAC,CAAA,CAExB,MAAA,CAAQJ,EAAAA,CAAOI,CAAAA,CAAG,CAAC,CAAC,CACtB,CACF,CAAA,YACS,CACL,MAAA,CAAQ,WAAWD,CAAAA,CAAK,MAAA,CAAO,QAAA,EAAU,CAAA,CAAI,IAAA,CAAK,IAAI,EAAA,CAAIA,CAAAA,CAAK,SAAS,CAAA,CAExE,MAAA,CAAQF,GAAOE,CAAAA,CAAK,GAAG,CACzB,CAEJ,CClCA,IAAIE,EAAAA,CAEG,SAASC,GAAgB,CAC9B,GAAI,CAACD,EAAAA,CAAa,CAChB,GAAI,OAAO,UAAA,CAAW,KAAA,EAAU,WAC9B,MAAM,IAAI,MAAM,+CAA+C,CAAA,CAGjEA,GAAc,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,UAAU,EAChD,CAEA,OAAOA,EACT,CCZO,SAASE,EAAAA,CAAY7hB,CAAAA,CAAgB,CAC1C,OAAO,OAAOA,CAAAA,EAAU,QAAA,CAAW,YAAA,CAAa,IAAA,CAAKA,CAAK,CAAA,CAAI,KAChE,CCGO,SAAS8hB,EAAAA,CAAqB3Q,EAA+C,CAClF,OACEA,GACA,OAAOA,CAAAA,EAAa,UACpB,MAAA,GAAUA,CAAAA,EACV,eAAgBA,CAAAA,EAChB,KAAA,CAAM,QAAQA,CAAAA,CAAS,IAAI,CAE/B,CAMO,SAAS4Q,EAAAA,CACd5Q,EACApQ,CAAAA,CACoB,CACpB,OAAI+gB,EAAAA,CAAqB3Q,CAAQ,EACxBA,CAAAA,CAKF,CACL,IAAA,CAAM,KAAA,CAAM,OAAA,CAAQA,CAAQ,EAAIA,CAAAA,CAAW,GAC3C,UAAA,CAAY,CACV,MAAO,KAAA,CAAM,OAAA,CAAQA,CAAQ,CAAA,CAAIA,CAAAA,CAAS,MAAA,CAAS,EACnD,KAAA,CAAApQ,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CACF,CCtCO,SAASihB,EAAAA,CAAUpI,EAAeqI,CAAAA,CAA+B,CACtE,OAAQrI,CAAAA,CAAQ,GAAA,CAAOqI,CACzB,CCFO,SAASC,EAAAA,CAAYxjB,CAAAA,CAAgC,CAC1D,OAAIA,IAAM,MAAA,CACD,IAAA,CAGF,SAASA,CAAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAG,EAAE,CAAA,CAAI,IACzC,CCEA,IAAMyjB,EAAAA,CAA2B,GAAK,GAAA,CAE/B,SAASC,IAA8B,CAC5C,OAAOC,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAK,YAAA,EAAa,CACtC,gBAAiBH,EAAAA,CACjB,SAAA,CAAWA,GACX,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAnU,CAAO,IAA6B,CAGpD,GAAM,CAACuU,CAAAA,CAAkBC,CAAAA,CAAgBC,EAAeC,CAAAA,CAAeC,CAAgB,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAC3G/S,CAAAA,CAAQ,6CAAA,CAA+C,EAAC,CAAG,MAAA,CAAW,OAAW5B,CAAM,CAAA,CACvF4B,CAAAA,CAAQ,gCAAA,CAAkC,EAAC,CAAG,OAAW,MAAA,CAAW5B,CAAM,EAC1E4B,CAAAA,CAAQ,oCAAA,CAAsC,EAAC,CAAG,MAAA,CAAW,MAAA,CAAW5B,CAAM,CAAA,CAC9E4B,CAAAA,CAAQ,gCAAiC,CAAC,MAAM,EAAG,MAAA,CAAW,MAAA,CAAW5B,CAAM,CAAA,CAC/E4B,CAAAA,CAAQ,uCAAwC,EAAC,CAAG,OAAW,MAAA,CAAW5B,CAAM,EAC7E,KAAA,CAAM,KAAO,CAAE,wBAAA,CAA0B,QAAA,CAAU,aAAA,CAAe,EAAG,CAAA,CAAE,CAC5E,CAAC,CAAA,CAIK4U,CAAAA,CAA2BpB,EAAWe,CAAAA,CAAiB,oBAAoB,EAAE,MAAA,CAC7EM,CAAAA,CAAyBrB,CAAAA,CAAWe,CAAAA,CAAiB,uBAAuB,CAAA,CAAE,OAGhFN,CAAAA,CAAgB,CAAA,CAElB,OAAO,QAAA,CAASW,CAAwB,GACxCA,CAAAA,GAA6B,CAAA,EAC7B,MAAA,CAAO,QAAA,CAASC,CAAsB,CAAA,GAEtCZ,EAAiBY,CAAAA,CAAyBD,CAAAA,CAA4B,KAExE,IAAME,CAAAA,CAAOtB,EAAWgB,CAAAA,CAAe,sBAAA,CAAuB,IAAI,CAAA,CAAE,MAAA,CAC9DO,EAAQvB,CAAAA,CAAWgB,CAAAA,CAAe,uBAAuB,KAAK,CAAA,CAAE,OAChEQ,CAAAA,CAAmB,UAAA,CAAWN,CAAAA,CAAc,aAAa,CAAA,CACzDO,CAAAA,CAAoBzB,EAAWkB,CAAAA,CAAc,cAAc,EAAE,MAAA,CAC7DQ,CAAAA,CAAuB,OAAOX,CAAAA,CAAiB,uBAAA,EAA2B,CAAC,CAAA,CAC3EY,CAAAA,CAAoBT,CAAAA,CAAc,qBAAuB,QAAA,CACzDU,CAAAA,CAAkB,OAAOV,CAAAA,CAAc,gBAAA,EAAoB,CAAC,CAAA,CAC5DW,CAAAA,CAAyB,MAAA,CAAOV,CAAAA,CAAiB,wBAAA,EAA4B,OAAO,EACpFW,CAAAA,CAAe,MAAA,CAAOX,EAAiB,aAAA,EAAiB,CAAC,EACzDY,CAAAA,CAAehB,CAAAA,CAAiB,eAChCiB,CAAAA,CAAkBjB,CAAAA,CAAiB,kBACnCkB,CAAAA,CAAYlB,CAAAA,CAAiB,kBAC7BmB,CAAAA,CAAmBb,CAAAA,CACnBc,EAAqBf,CAAAA,CACrBgB,CAAAA,CAAgBpC,CAAAA,CAAWe,CAAAA,CAAiB,cAAc,CAAA,CAAE,OAC5DsB,EAAAA,CAAuBtB,CAAAA,CAAiB,wBAA0B,CAAA,CAClEuB,EAAAA,CAAqBrB,EAAc,oBAAA,CAEzC,OAAO,CAEL,aAAA,CAAAR,CAAAA,CACA,IAAA,CAAAa,EACA,KAAA,CAAAC,CAAAA,CACA,iBAAAC,CAAAA,CACA,iBAAA,CAAAC,EACA,oBAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,uBAAAC,CAAAA,CACA,YAAA,CAAAC,EACA,YAAA,CAAAC,CAAAA,CACA,gBAAAC,CAAAA,CACA,SAAA,CAAAC,EACA,gBAAA,CAAAC,CAAAA,CACA,mBAAAC,CAAAA,CACA,aAAA,CAAAC,EACA,oBAAA,CAAAC,EAAAA,CACA,mBAAAC,EAAAA,CAIA,GAAA,CAAK,CACH,aAAA,CAAevB,CAAAA,CACf,WAAA,CAAaC,EACb,UAAA,CAAYC,CAAAA,CACZ,WAAYC,CAAAA,CACZ,aAAA,CAAeC,CACjB,CACF,CACF,CACF,CAAC,CACH,CCvEO,SAASoB,EAAAA,CAA0BC,EAAW,MAAA,CAAQ,CAC3D,OAAO3B,uBAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,IAAA,CAAK,UAAA,CAAW0B,CAAQ,CAAA,CAC5C,OAAA,CAAS,IACPpU,CAAAA,CAAQ,+BAAA,CAAiC,CACvCoU,CACF,CAAC,CACL,CAAC,CACH,CCVA,SAASrgB,EAAAA,CAAAA,GAAOmF,EAA6B,CAC3C,IAAIzI,CAAAA,CAAMyI,CAAAA,CAAM,MAAA,CAChB,KAAOzI,EAAM,CAAA,EAAKyI,CAAAA,CAAMzI,EAAM,CAAC,CAAA,GAAM,QACnCA,CAAAA,EAAAA,CAEF,OAAOyI,CAAAA,CAAM,KAAA,CAAM,CAAA,CAAGzI,CAAG,CAC3B,CAEO,IAAMiiB,EAAY,CAIvB,KAAA,CAAO,CACL,KAAA,CAAQ2B,CAAAA,EAAsB,CAAC,OAAA,CAAS,OAAA,CAASA,CAAS,EAC1D,UAAA,CAAY,CAACC,EAAgBC,CAAAA,GAC3B,CAAC,QAAS,aAAA,CAAeD,CAAAA,CAAQC,CAAQ,CAAA,CAC3C,OAAA,CAAS,CAACD,CAAAA,CAAgBC,CAAAA,GACxB,CAAC,OAAA,CAAS,SAAA,CAAWD,EAAQC,CAAQ,CAAA,CACvC,cAAA,CAAgB,CAACD,CAAAA,CAAgBC,CAAAA,GAC/B,CAAC,OAAA,CAAS,iBAAA,CAAmBD,EAAQC,CAAQ,CAAA,CAC/C,aAAc,CACZxQ,CAAAA,CACAyQ,CAAAA,CACArjB,CAAAA,CACA8d,CAAAA,GACG,CAAC,QAAS,eAAA,CAAiBlL,CAAAA,CAAUyQ,EAAQrjB,CAAAA,CAAO8d,CAAQ,EACjE,gBAAA,CAAkB,CAChBlL,CAAAA,CACAyQ,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAvjB,EACA8d,CAAAA,GAEA,CACE,QACA,oBAAA,CACAlL,CAAAA,CACAyQ,EACAC,CAAAA,CACAC,CAAAA,CACAvjB,EACA8d,CACF,CAAA,CACF,aAAc,CAAClL,CAAAA,CAAkBuQ,EAAgBC,CAAAA,GAC/C,CAAC,QAAS,WAAA,CAAaxQ,CAAAA,CAAUuQ,CAAAA,CAAQC,CAAQ,CAAA,CACnD,OAAA,CAAS,CAACxQ,CAAAA,CAAkB5S,CAAAA,GAC1B,CAAC,OAAA,CAAS,SAAA,CAAW4S,EAAU5S,CAAK,CAAA,CACtC,gBAAA,CAAkB,CAACmjB,CAAAA,CAAiBC,CAAAA,GAClC,CAAC,OAAA,CAAS,oBAAA,CAAsBD,EAAQC,CAAQ,CAAA,CAClD,YAAa,CAACD,CAAAA,CAAgBC,CAAAA,GAC5B,CAAC,OAAA,CAAS,cAAA,CAAgBD,EAAQC,CAAQ,CAAA,CAC5C,KAAM,CAACD,CAAAA,CAAgBC,IACrB,CAAC,OAAA,CAAS,OAAQD,CAAAA,CAAQC,CAAQ,EACpC,SAAA,CAAW,CAACD,EAAgBC,CAAAA,GAC1B,CAAC,QAAS,WAAA,CAAaD,CAAAA,CAAQC,CAAQ,CAAA,CACzC,MAAA,CAASI,CAAAA,EACP,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAc,CAAA,CACpC,cAAA,CAAgB,CAACA,CAAAA,CAAyBxjB,CAAAA,GACxC4C,EAAAA,CAAI,OAAA,CAAS,QAAA,CAAU,UAAA,CAAY4gB,EAAgBxjB,CAAK,CAAA,CAC1D,UAAYwjB,CAAAA,EACV,CAAC,QAAS,WAAA,CAAaA,CAAc,CAAA,CACvC,iBAAA,CAAmB,CAACA,CAAAA,CAAyBxjB,IAC3C4C,EAAAA,CAAI,OAAA,CAAS,YAAa,UAAA,CAAY4gB,CAAAA,CAAgBxjB,CAAK,CAAA,CAC7D,SAAA,CAAY4S,GACV,CAAC,OAAA,CAAS,YAAaA,CAAQ,CAAA,CACjC,kBAAmB,CAACA,CAAAA,CAAmB5S,IACrC4C,EAAAA,CAAI,OAAA,CAAS,WAAA,CAAa,UAAA,CAAYgQ,CAAAA,CAAU5S,CAAK,EACvD,MAAA,CAAS4S,CAAAA,EAAsB,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAQ,CAAA,CAC3D,aAAA,CAAgB4Q,CAAAA,EACd,CAAC,OAAA,CAAS,gBAAA,CAAkBA,CAAc,CAAA,CAC5C,cAAA,CAAgB,CAAC5Q,CAAAA,CAAmB5S,CAAAA,GAClC4C,GAAI,OAAA,CAAS,QAAA,CAAU,UAAA,CAAYgQ,CAAAA,CAAU5S,CAAK,CAAA,CACpD,SAAW4X,CAAAA,EAAiB,CAAC,QAAS,UAAA,CAAYA,CAAI,EACtD,eAAA,CAAiB,CAAC,QAAS,UAAU,CAAA,CACrC,uBAAyBhF,CAAAA,EACvB,CAAC,QAAS,eAAA,CAAiBA,CAAAA,CAAU,MAAM,CAAA,CAC7C,WAAA,CAAa,CACX6Q,CAAAA,CACAvP,CAAAA,CACAlU,CAAAA,CACA8d,IACG,CAAC,OAAA,CAAS,eAAgB2F,CAAAA,CAAMvP,CAAAA,CAAKlU,EAAO8d,CAAQ,CAAA,CACzD,eAAA,CAAiB,CACf2F,CAAAA,CACAH,CAAAA,CACAC,EACAvjB,CAAAA,CACAkU,CAAAA,CACA4J,IAEA,CACE,OAAA,CACA,oBACA2F,CAAAA,CACAH,CAAAA,CACAC,CAAAA,CACAvjB,CAAAA,CACAkU,CAAAA,CACA4J,CACF,EACF,WAAA,CAAa,CACXqF,EACAC,CAAAA,CACAM,CAAAA,CACA5F,IACG,CAAC,OAAA,CAAS,cAAeqF,CAAAA,CAAQC,CAAAA,CAAUM,EAAO5F,CAAQ,CAAA,CAC/D,WAAY,CAACqF,CAAAA,CAAgBC,EAAkBtF,CAAAA,GAC7C,CAAC,OAAA,CAAS,YAAA,CAAcqF,CAAAA,CAAQC,CAAAA,CAAUtF,CAAQ,CAAA,CACpD,YAAA,CAAeoF,GACb,CAAC,OAAA,CAAS,gBAAiBA,CAAS,CAAA,CACtC,cAAA,CAAgB,CACdC,CAAAA,CACAC,CAAAA,CACAO,IACG,CAAC,OAAA,CAAS,kBAAmBR,CAAAA,CAAQC,CAAAA,CAAUO,CAAQ,CAAA,CAC5D,YAAA,CAAc,IAAM,CAAC,OAAA,CAAS,eAAe,EAC7C,qBAAA,CAAwB3jB,CAAAA,EACtB,CAAC,OAAA,CAAS,eAAA,CAAiB,QAASA,CAAK,CAAA,CAC3C,UAAW,CACT0M,CAAAA,CAOI,EAAC,GACF,CACH,QACA,OAAA,CACA,MAAA,CACAA,EAAO,GAAA,EAAO,EAAA,CACdA,CAAAA,CAAO,SAAA,EAAa,EAAA,CACpBA,CAAAA,CAAO,QAAU,EAAA,CACjBA,CAAAA,CAAO,UAAY,EAAA,CACnBA,CAAAA,CAAO,OAAS,CAAA,CAChB,CAAC,GAAIA,CAAAA,CAAO,UAAA,EAAc,EAAG,CAAA,CAAE,IAAA,GAAO,IAAA,CAAK,GAAG,CAChD,CAAA,CACA,UAAA,CAAY,CACVA,CAAAA,CAMI,EAAC,GACF,CACH,OAAA,CACA,OAAA,CACA,SACAA,CAAAA,CAAO,GAAA,EAAO,GACdA,CAAAA,CAAO,MAAA,EAAU,GACjBA,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,WAAA,CAAcgR,CAAAA,EACZ,CAAC,OAAA,CAAS,OAAA,CAAS,SAAA,CAAWA,CAAI,CAAA,CACpC,UAAA,CAAY,CAACA,CAAAA,CAAcxJ,CAAAA,GACzB,CAAC,OAAA,CAAS,OAAA,CAAS,SAAUwJ,CAAAA,CAAMxJ,CAAG,CAAA,CACxC,cAAA,CAAgB,CAACwJ,CAAAA,CAAc9K,IAC7B,CAAC,OAAA,CAAS,QAAS,WAAA,CAAa8K,CAAAA,CAAM9K,CAAQ,CAAA,CAChD,iBAAA,CAAmB,CAAC8K,CAAAA,CAAckG,CAAAA,GAChC,CAAC,OAAA,CAAS,OAAA,CAAS,gBAAiBlG,CAAAA,CAAMkG,CAAK,EACjD,cAAA,CAAgB,CAAClG,CAAAA,CAAc9K,CAAAA,GAC7B,CAAC,OAAA,CAAS,QAAS,YAAA,CAAc8K,CAAAA,CAAM9K,CAAQ,CAAA,CACjD,oBAAA,CAAuB8K,GACrB,CAAC,OAAA,CAAS,OAAA,CAAS,kBAAA,CAAoBA,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,QAAS,CACPC,CAAAA,CACAC,EACAC,CAAAA,CACAhkB,CAAAA,GACG,CAAC,UAAA,CAAY,SAAA,CAAW8jB,EAAWC,CAAAA,CAAMC,CAAAA,CAAYhkB,CAAK,CAAA,CAC/D,aAAA,CAAe,CAAC4S,EAAkBmR,CAAAA,CAAcE,CAAAA,GAC9C,CAAC,UAAA,CAAY,SAAA,CAAW,SAAUrR,CAAAA,CAAUmR,CAAAA,CAAME,CAAK,CAAA,CACzD,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,WAAY,YAAA,CAAcA,CAAAA,CAAU,iBAAiB,CAAA,CACxD,kBAAA,CAAoB,CAACA,CAAAA,CAAkBxK,CAAAA,GACrC,CAAC,UAAA,CAAY,sBAAA,CAAwBwK,CAAAA,CAAUxK,CAAI,CAAA,CACrD,UAAA,CAAawK,GACX,CAAC,UAAA,CAAY,cAAeA,CAAQ,CAAA,CACtC,UAAW,CACTsR,CAAAA,CACAC,CAAAA,CACAH,CAAAA,CACAhkB,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,UAAA,CAAY,QAAA,CAAUJ,EAAOI,CAAW,CAAA,CAC3C,SAAU,CAACC,CAAAA,CAAoBxG,CAAAA,GAC7B,CAAC,UAAA,CAAY,UAAA,CAAYwG,EAAUxG,CAAQ,CAAA,CAC7C,OAAQ,CAACmG,CAAAA,CAAejkB,IACtB,CAAC,UAAA,CAAY,QAAA,CAAUikB,CAAAA,CAAOjkB,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,IAC3C4C,EAAAA,CAAI,UAAA,CAAY,YAAa,UAAA,CAAY4gB,CAAAA,CAAgBxjB,CAAK,CAAA,CAChE,aAAA,CAAe,CAACwjB,CAAAA,CAAwBe,CAAAA,GACtC,CACE,UAAA,CACA,WAAA,CACA,OAAA,CACAf,EACAe,CACF,CAAA,CACF,UAAW,CAACC,CAAAA,CAA+BjlB,IACzC,CAAC,UAAA,CAAY,WAAA,CAAailB,CAAAA,CAAWjlB,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,cAAeikB,CAAAA,CAAOjkB,CAAK,EAC1C,SAAA,CAAYwjB,CAAAA,EACV,CAAC,UAAA,CAAY,WAAA,CAAaA,CAAc,CAAA,CAC1C,iBAAA,CAAmB,CAACA,CAAAA,CAAyBxjB,CAAAA,GAC3C4C,EAAAA,CAAI,WAAY,WAAA,CAAa,UAAA,CAAY4gB,EAAgBxjB,CAAK,CAAA,CAChE,UAAY4S,CAAAA,EACV,CAAC,UAAA,CAAY,WAAA,CAAaA,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,EACtD,UAAA,CAAY,IAAM,CAAC,eAAA,CAAiB,YAAY,EAChD,IAAA,CAAM,CAAC4Q,CAAAA,CAAyBH,CAAAA,GAC9B,CAAC,eAAA,CAAiBG,EAAgBH,CAAM,CAAA,CAC1C,YAAcG,CAAAA,EACZ,CAAC,gBAAiB,QAAA,CAAUA,CAAc,CAAA,CAC5C,QAAA,CAAWA,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,CAAA,CAClD,OAAA,CAAS,CAAC,MAAM,CAClB,CAAA,CAKA,WAAA,CAAa,CACX,MAAA,CAAQ,CAACwB,CAAAA,CAAe3G,CAAAA,GACtB,CAAC,WAAA,CAAa,QAAA,CAAU2G,EAAM3G,CAAQ,CAAA,CAExC,YAAA,CAAe2G,CAAAA,EACb,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,EAAejkB,CAAAA,GAClC,CAAC,cAAe,MAAA,CAAQyjB,CAAAA,CAAMQ,EAAOjkB,CAAK,CAAA,CAC5C,YAAc0kB,CAAAA,EACZ,CAAC,aAAA,CAAe,aAAA,CAAeA,CAAa,CAAA,CAC9C,oBAAsBA,CAAAA,EACpB,CAAC,cAAe,aAAA,CAAe,UAAA,CAAYA,CAAa,CAAA,CAC1D,oBAAA,CAAsB,CAAC9L,CAAAA,CAAiB5Y,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,IACzC,CAAC,WAAA,CAAa,QAAS2kB,CAAAA,CAAYC,CAAAA,CAAO5kB,CAAK,CAAA,CACjD,WAAA,CAAc2kB,CAAAA,EACZ,CAAC,WAAA,CAAa,OAAA,CAASA,CAAU,CAAA,CACnC,WAAA,CAAcC,GACZ,CAAC,WAAA,CAAa,QAAS,SAAA,CAAWA,CAAK,CAC3C,CAAA,CAKA,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,SAAU,SAAA,CAAW6kB,CAAAA,CAAG7kB,CAAK,CAAA,CAChC,OAAA,CAAS,CACP6kB,CAAAA,CACApB,CAAAA,CACAqB,EACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GAGO,CAAC,QAAA,CAAUJ,CAAAA,CAAGpB,EADK,OAAOqB,CAAAA,EAAY,SAAWA,CAAAA,GAAY,GAAA,EAAOA,IAAY,MAAA,CAASA,CAAAA,CAClDC,CAAAA,CAAOC,CAAAA,CAAUC,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,EACvD,CAAC,QAAA,CAAU,kBAAmBhC,CAAAA,CAAQC,CAAQ,EACpD,GAAA,CAAK,CACHyB,EACApB,CAAAA,CACAqB,CAAAA,CACAC,CAAAA,CACAE,CAAAA,CACAG,CAAAA,GACGxiB,EAAAA,CAAI,SAAU,KAAA,CAAOiiB,CAAAA,CAAGpB,EAAMqB,CAAAA,CAASC,CAAAA,CAAOE,EAAOG,CAAW,CACvE,CAAA,CAKA,SAAA,CAAW,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,EACAC,CAAAA,CACA9B,CAAAA,CACA+B,IACG,CAAC,WAAA,CAAa,SAAUH,CAAAA,CAASC,CAAAA,CAAMC,EAAU9B,CAAAA,CAAM+B,CAAS,CAAA,CACrE,UAAA,CAAaH,CAAAA,EACX,CAAC,YAAa,aAAA,CAAeA,CAAO,CACxC,CAAA,CAKA,MAAA,CAAQ,CACN,qBAAA,CAAuB,CAACzS,CAAAA,CAAkB5S,CAAAA,GACxC,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,GACX,CAAC,QAAA,CAAU,cAAeA,CAAQ,CAAA,CACpC,mBAAqBgG,CAAAA,EACnB,CAAC,SAAU,qBAAA,CAAuBA,CAAO,CAAA,CAC3C,qBAAA,CAAwBhG,CAAAA,EACtB,CAAC,SAAU,yBAAA,CAA2BA,CAAQ,EAChD,eAAA,CAAkBgG,CAAAA,EAChB,CAAC,QAAA,CAAU,kBAAA,CAAoBA,CAAO,CAAA,CACxC,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,EAAkBH,CAAAA,GACnD,CAAC,SAAU,iBAAA,CAAmB3S,CAAAA,CAAU8S,EAAUH,CAAQ,CAAA,CAC5D,kBAAmB,CACjB3S,CAAAA,CACA8S,CAAAA,CACAC,CAAAA,GAEAA,CAAAA,GAAgB,MAAA,CACZ,CAAC,QAAA,CAAU,oBAAA,CAAsB/S,EAAU8S,CAAQ,CAAA,CACnD,CAAC,QAAA,CAAU,oBAAA,CAAsB9S,CAAAA,CAAU8S,CAAAA,CAAUC,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,CAAAA,CAAkB5S,CAAAA,CAAe8lB,IAClD,CAAC,QAAA,CAAU,OAAQ,cAAA,CAAgBlT,CAAAA,CAAU5S,CAAAA,CAAO8lB,CAAS,CAAA,CAC/D,oBAAA,CAAuBlT,GACrB,CAAC,QAAA,CAAU,OAAQ,mBAAA,CAAqBA,CAAQ,EAClD,WAAA,CAAcmT,CAAAA,EACZ,CAAC,QAAA,CAAU,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,EACjE,oBAAA,CAAuBlT,CAAAA,EACrB,CAAC,QAAA,CAAU,YAAA,CAAc,eAAgBA,CAAQ,CAAA,CACnD,mBAAqBA,CAAAA,EACnB,CAAC,QAAA,CAAU,YAAA,CAAc,WAAA,CAAaA,CAAQ,EAChD,oBAAA,CAAuBA,CAAAA,EACrB,CAAC,QAAA,CAAU,YAAA,CAAc,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,SAAU,QAAA,CAAU,cAAA,CAAgBhF,EAAUgF,CAAI,CAAA,CACrD,gBAAiB,CAAChF,CAAAA,CAAkB7N,EAAe8gB,CAAAA,GACjD,CAAC,gBAAA,CAAkB,YAAA,CAAcjT,CAAAA,CAAU7N,CAAAA,CAAO8gB,CAAQ,CAC9D,CAAA,CAKA,OAAQ,CACN,UAAA,CAAY,IAAM,CAAC,QAAA,CAAU,YAAY,CAAA,CACzC,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,EAC5C,YAAA,CAAc,IAAM,CAAC,QAAA,CAAU,gBAAgB,EAC/C,IAAA,CAAM,CACJC,EACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GACG,CAAC,QAAA,CAAU,MAAA,CAAQH,EAAMC,CAAAA,CAAYC,CAAAA,CAAQC,CAAI,CAAA,CACtD,YAAA,CAAc,CAACtmB,CAAAA,CAAeM,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,EACA8Z,CAAAA,CACAC,CAAAA,CACAC,IAEA,CAAC,WAAA,CAAa,aAAcha,CAAAA,CAAK8Z,CAAAA,CAAYC,EAASC,CAAS,CAAA,CACjE,mBAAA,CAAsB5H,CAAAA,EACpB,CAAC,WAAA,CAAa,uBAAwBA,CAAQ,CAClD,EAKA,UAAA,CAAY,CACV,aAAc,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,MAAO,IAAM,CAAC,mBAAoB,OAAO,CAC3C,EAKA,MAAA,CAAQ,CACN,OAAQ,CAACA,CAAAA,CAAkByQ,CAAAA,GACzB,CAAC,QAAA,CAAUzQ,CAAAA,CAAUyQ,CAAM,CAAA,CAC7B,OAAA,CAAUzQ,GAAqB,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,EAKA,UAAA,CAAY,CACV,gBAAiB,IAAM,CAAC,YAAA,CAAc,kBAAkB,CAC1D,CAAA,CAKA,MAAO,CACL,WAAA,CAAa,CAACsD,CAAAA,CAAkB9T,CAAAA,GAC9B,CAAC,OAAA,CAAS,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,IAAA,CAAM,IAAM,CAAC,YAAA,CAAc,MAAM,EACjC,OAAA,CAAS,CAAC,YAAY,CACxB,CAAA,CAKA,EAAA,CAAI,CACF,MAAA,CAAQ,IAAM,CAAC,IAAA,CAAM,QAAQ,EAC7B,YAAA,CAAeA,CAAAA,EAAsB,CAAC,IAAA,CAAM,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,wBAAa,CAClB,QAAA,CAAUC,EAAU,EAAA,CAAG,MAAA,GACvB,OAAA,CAAS,SAAY,CAEnB,IAAMnR,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,gCAAA,CAAkC,CACxF,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,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG5E,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAAA,CACA,UAAW,GAAA,CACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCtBO,SAAS2K,EAAAA,CAA6BhU,CAAAA,CAA8BqJ,EAAqB,CAC9F,OAAOqF,wBAAa,CAClB,QAAA,CAAUC,EAAU,EAAA,CAAG,YAAA,CAAa3O,CAAQ,CAAA,CAC5C,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,CAAA,CAED,GAAI,CAAC7L,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqCA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGxE,OAAQ,MAAMA,EAAS,IAAA,EACzB,EACA,SAAA,CAAW,GAAA,CACX,OAAA,CAAS,CAAC,CAAC6L,CACb,CAAC,CACH,CCbO,SAAS4K,EAAAA,CACdjU,CAAAA,CACAqJ,CAAAA,CACA,CACA,OAAOqF,wBAAa,CAClB,QAAA,CAAUC,EAAU,EAAA,CAAG,eAAA,CAAgB3O,CAAQ,CAAA,CAC/C,OAAA,CAAS,SAAY,CAEnB,IAAMxC,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,mCAAoC,CAC1F,MAAA,CAAQ,MAAA,CACR,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,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,IAA6B,CACpC,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,OAAO,UAAA,EAAe,UAAA,CAChE,OAAO,MAAA,CAAO,UAAA,GAEhB,IAAMtW,CAAAA,CAAM,IAAI,UAAA,CAAW,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,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,CAAI,GAAG,EAE9E,OAAO,KAAA,CAAM,KAAK2S,CAAG,CAAA,CAClB,GAAA,CAAKvS,CAAAA,EAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAG,GAAG,CAAC,EAC1C,IAAA,CAAK,EAAE,CACZ,CAEO,SAAS8oB,EAAAA,CACdnU,EACAqJ,CAAAA,CACA,CACA,OAAOH,sBAAAA,CAAY,CACjB,YAAa,CAAC,IAAA,CAAM,gBAAgB,CAAA,CACpC,UAAA,CAAY,MAAOpP,GAA+D,CAChF,GAAI,CAACkG,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,0DACF,EAGF,GAAI,CAACqJ,EACH,MAAM,IAAI,MACR,2DACF,CAAA,CAIF,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,iCACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,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,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,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,IAAK,CAC3B,IAAI4W,EAAuC,EAAC,CAC5C,GAAI,CACFA,CAAAA,CAAc,MAAM5W,CAAAA,CAAS,IAAA,GAC/B,MAAQ,CAER,CACA,IAAMtE,CAAAA,CAAM,IAAI,MAAM,kDAA6C,CAAA,CACnE,MAACA,CAAAA,CAAY,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,MAAA,CAAO,UAAA,EAAW,CAE3B,IAAMtW,EAAM,IAAI,UAAA,CAAW,EAAE,CAAA,CAC7B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,eAAA,EAAoB,UAAA,CACrE,OAAO,eAAA,CAAgBA,CAAG,OAE1B,IAAA,IAAS3S,CAAAA,CAAI,EAAGA,CAAAA,CAAI2S,CAAAA,CAAI,OAAQ3S,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,IAAA,CAAK,EAAE,CACZ,CAEO,SAASgpB,EAAAA,CACdrU,CAAAA,CACAqJ,EACA,CACA,OAAOH,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,KAAM,QAAQ,CAAA,CAC5B,WAAY,MAAOpP,CAAAA,EAAsD,CACvE,GAAI,CAACkG,EACH,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,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAM1Q,EAAO,IAAA,EAAQuP,CAAAA,CACrB,EAAA,CAAIrJ,CAAAA,CACJ,MAAA,CAAQlG,CAAAA,CAAO,OACf,IAAA,CAAMA,CAAAA,CAAO,KACb,eAAA,CAAiBoa,EAAAA,EACnB,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,MACd,CAAA,4CAAA,EAA0CsE,CAAAA,CAAS,MAAM,CAAA,EAAGtD,CAAAA,CAAO,KAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,CAAA,CACrF,CAAA,CACA,MAAChB,EAAY,MAAA,CAASsE,CAAAA,CAAS,OAC9BtE,CAAAA,CAAY,IAAA,CAAOiO,EACdjO,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,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,SAAU8B,CAAAA,CAAU,EAAA,CAAG,aAAa3O,CAAQ,CAC9C,CAAC,CAAA,EAEL,CACF,CAAC,CACH,CC5FA,SAASkU,EAAAA,EAA6B,CACpC,GAAI,OAAO,MAAA,CAAW,KAAe,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,CAAAA,CAAI,EAAGA,CAAAA,CAAI2S,CAAAA,CAAI,OAAQ3S,CAAAA,EAAAA,CAAK2S,CAAAA,CAAI3S,CAAC,CAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,CAAI,GAAG,CAAA,CAE9E,OAAO,MAAM,IAAA,CAAK2S,CAAG,EAClB,GAAA,CAAKvS,CAAAA,EAAMA,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CACZ,CASO,SAASipB,EAAAA,CAAgBtU,CAAAA,CAA8BqJ,EAAiC,CAC7F,OAAOH,uBAAY,CACjB,WAAA,CAAa,CAAC,IAAA,CAAM,YAAY,CAAA,CAChC,UAAA,CAAY,MAAOpP,CAAAA,EAA8D,CAC/E,GAAI,CAACkG,EACH,MAAM,IAAI,MAAM,uDAAkD,CAAA,CAMpE,IAAMxK,CAAAA,CAAOsE,CAAAA,CAAO,IAAA,EAAQuP,EAC5B,GAAI,CAAC7T,EACH,MAAM,IAAI,MAAM,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,EAAAA,EAAoB,CAAA,CAC7EK,CAAAA,CAAK,OAAO,OAAA,CAASza,CAAAA,CAAO,MAAOA,CAAAA,CAAO,QAAA,EAAY,WAAW,CAAA,CAKjE,IAAM0D,CAAAA,CAAW,MAHAyQ,CAAAA,EAAc,CAGCzD,EAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,KAAM+J,CACR,CAAC,EAED,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,MACF,CAAA,gDAAA,EAA8CsD,CAAAA,CAAS,MAAM,CAAA,EAAGtD,CAAAA,CAAO,KAAKA,CAAI,CAAA,CAAA,CAAK,EAAE,CAAA,CACzF,CAAA,CACA,CAAE,OAAQsD,CAAAA,CAAS,MAAA,CAAQ,KAAM2J,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,EAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU8B,EAAU,EAAA,CAAG,eAAA,CAAgB3O,CAAQ,CACjD,CAAC,GAEL,CACF,CAAC,CACH,CC5EA,SAASwU,GAAmBxO,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,QAAA,CAAWA,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAIA,GAAS,IAC1D,CAAA,CAHqB,KAIvB,CAEO,SAASsoB,EAA2B3U,CAAAA,CAA8B,CACvE,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAC1C,OAAA,CAAS,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,MAAA,CACA3F,CAAAA,CAKCwa,CAAAA,EAAS,KAAA,CAAM,QAAQA,CAAI,CAC9B,EACA5Y,CAAAA,CACE,oBAAA,CACA,CAAE,OAAA,CAAS+D,CAAS,CAAA,CACpB,MAAA,CACA,MAAA,CACA3F,CACF,EAAE,KAAA,CAAOvB,CAAAA,EAA4B,CAGnC,GAAIuB,CAAAA,EAAQ,QAAS,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,EAAS,MAAM9Y,CAAAA,CACnB,6BACA,CAAC,CAAC+D,CAAQ,CAAC,CAAA,CACX,MAAA,CACA,MAAA,CACA3F,CAAAA,CACCwa,CAAAA,EACC,MAAM,OAAA,CAAQA,CAAI,IACjB,CAACA,CAAAA,CAAK,CAAC,CAAA,EAAK,CAACL,GAAmBK,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,CAAA,yDAAA,CAC5D,CAEJ,CAEA,IAAM0U,EAAUM,EAAAA,CAAqBF,CAAAA,CAAa,qBAAqB,CAAA,CAMjEG,CAAAA,CAAQL,GAAe,KAAA,CACvBM,CAAAA,CAA+CD,CAAAA,CACjD,CACE,OAAA,CAASH,CAAAA,CAAa,KACtB,cAAA,CAAgBG,CAAAA,CAAM,WAAa,CAAA,CACnC,eAAA,CAAiBA,EAAM,SAAA,EAAa,CACtC,EACA,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,UAAA,CACzB,OAAA,CAASA,CAAAA,CAAa,OAAA,CACtB,sBAAuBA,CAAAA,CAAa,qBAAA,CACpC,eAAgBA,CAAAA,CAAa,cAAA,CAC7B,UAAWA,CAAAA,CAAa,SAAA,CACxB,aAAA,CAAeA,CAAAA,CAAa,aAAA,CAC5B,mBAAA,CAAqBA,EAAa,mBAAA,CAClC,kBAAA,CAAoBA,EAAa,kBAAA,CACjC,mBAAA,CAAqBA,EAAa,mBAAA,CAClC,sBAAA,CAAwBA,EAAa,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,uBAAA,CACtC,wBAAA,CAA0BA,CAAAA,CAAa,wBAAA,CACvC,eAAgBA,CAAAA,CAAa,cAAA,CAC7B,yBAA0BA,CAAAA,CAAa,wBAAA,CACvC,wBAAyBA,CAAAA,CAAa,uBAAA,CACtC,qBAAA,CAAuBA,CAAAA,CAAa,qBAAA,CACpC,WAAA,CAAaA,EAAa,WAAA,CAC1B,SAAA,CAAWA,EAAa,SAAA,CACxB,aAAA,CAAeA,EAAa,aAAA,CAC5B,KAAA,CAAOA,EAAa,KAAA,CACpB,gBAAA,CAAkBA,EAAa,gBAAA,CAC/B,iBAAA,CAAmBA,EAAa,iBAAA,CAChC,cAAA,CAAgBA,EAAa,cAAA,CAC7B,YAAA,CAAcA,CAAAA,CAAa,YAAA,CAC3B,gBAAA,CAAkBA,CAAAA,CAAa,iBAC/B,YAAA,CAAAI,CAAAA,CACA,WAAYC,CAAAA,CACZ,OAAA,CAAAT,CACF,CACF,CAAA,CACA,OAAA,CAAS,CAAC,CAAC1U,CAAAA,CACX,UAAW,GACb,CAAC,CACH,CC1LA,IAAMoV,EAAAA,CAAc,IAAI,GAAA,CAAI,CAAC,WAAA,CAAa,aAAA,CAAe,WAAW,CAAC,CAAA,CAErE,SAASC,EAAAA,CAAchpB,CAAAA,CAAkD,CACvE,GAAI,CAACA,GAAS,OAAOA,CAAAA,EAAU,UAAY,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAC5D,OAAO,MAAA,CAET,IAAMipB,CAAAA,CAAQ,MAAA,CAAO,eAAejpB,CAAK,CAAA,CACzC,OAAOipB,CAAAA,GAAU,IAAA,EAAQA,IAAU,MAAA,CAAO,SAC5C,CAEA,SAASC,EAAAA,CAA6C5oB,CAAAA,CAAWP,EAAoC,CACnG,IAAMb,EAAS,CAAE,GAAGoB,CAAO,CAAA,CAC3B,IAAA,IAAWqD,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAK5D,CAAM,EAAG,CACrC,GAAIgpB,GAAY,GAAA,CAAIplB,CAAG,EACrB,SAEF,IAAMwlB,EAASppB,CAAAA,CAAO4D,CAAG,EACnBylB,CAAAA,CAASlqB,CAAAA,CAAOyE,CAAG,CAAA,CACrBqlB,EAAAA,CAAcG,CAAM,CAAA,EAAKH,EAAAA,CAAcI,CAAM,CAAA,CAC/ClqB,CAAAA,CAAOyE,CAAG,EAAIulB,EAAAA,CAAUE,CAAAA,CAAQD,CAAM,CAAA,CAEtCjqB,CAAAA,CAAOyE,CAAG,CAAA,CAAIwlB,EAElB,CACA,OAAOjqB,CACT,CAQA,SAASmqB,EAAAA,CACPpd,CAAAA,CAC2B,CAE3B,GAAI,EAAA,CAACA,GAAU,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAM,CAAA,CAAA,CAIpC,OAAOA,EAAO,GAAA,CAAI,CAAC,CAAE,IAAA,CAAAqd,CAAAA,CAAM,GAAGC,CAAK,CAAA,GAAM,CACvC,GAAI,CAACD,GAAQ,OAAOA,CAAAA,EAAS,SAC3B,OAAO,CAAE,GAAGC,CAAAA,CAAM,IAAA,CAAAD,CAAK,CAAA,CAGzB,GAAM,CAAE,WAAA/U,CAAAA,CAAY,QAAA,CAAAZ,EAAU,GAAG6V,CAAS,EAAIF,CAAAA,CAC9C,OAAO,CAAE,GAAGC,CAAAA,CAAM,IAAA,CAAMC,CAAS,CACnC,CAAC,CACH,CAEO,SAASb,GACdc,CAAAA,CACgB,CAChB,GAAI,CAACA,CAAAA,CACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAM3O,CAAAA,CAAS,KAAK,KAAA,CAAM2O,CAAmB,EAC7C,GACE3O,CAAAA,EACA,OAAOA,CAAAA,EAAW,QAAA,EAClBA,EAAO,OAAA,EACP,OAAOA,EAAO,OAAA,EAAY,QAAA,CAE1B,OAAOA,CAAAA,CAAO,OAElB,CAAA,MAASjO,EAAK,CACZ,OAAA,CAAQ,KAAK,8CAAA,CAAgDA,CAAAA,CAAK,CAAE,MAAA,CAAQ4c,CAAAA,EAAqB,MAAA,EAAU,CAAE,CAAC,EAChH,CAEA,OAAO,EACT,CAEO,SAASC,GACd3mB,CAAAA,CACgB,CAChB,OAAO4lB,EAAAA,CAAqB5lB,CAAAA,EAAM,qBAAqB,CACzD,CAUO,SAAS4mB,GAGdC,CAAAA,CACAC,CAAAA,CACsB,CACtB,GAAI,CAACD,EAAW,OAAOC,CAAAA,CACvB,GAAI,CAACA,CAAAA,CAAU,OAAOD,CAAAA,CACtB,IAAME,EAAgB,MAAA,CAAO,IAAA,CAC3BnB,EAAAA,CAAqBiB,CAAAA,CAAU,qBAAqB,CACtD,EAAE,MAAA,CAIF,OAHqB,OAAO,IAAA,CAC1BjB,EAAAA,CAAqBkB,EAAS,qBAAqB,CACrD,CAAA,CAAE,MAAA,CACoBC,CAAAA,CAAgBD,CAAAA,CAAWD,CACnD,CAWO,SAASG,GACdN,CAAAA,CACyB,CACzB,GAAI,CAACA,CAAAA,CACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAM3O,CAAAA,CAAS,KAAK,KAAA,CAAM2O,CAAmB,EAC7C,GAAIT,EAAAA,CAAclO,CAAM,CAAA,CACtB,OAAOA,CAEX,CAAA,MAASjO,CAAAA,CAAK,CACZ,OAAA,CAAQ,IAAA,CAAK,oDAAqDA,CAAAA,CAAK,CACrE,MAAA,CAAQ4c,CAAAA,EAAqB,MAAA,EAAU,CACzC,CAAC,EACH,CAEA,OAAO,EACT,CASO,SAASO,EAAAA,CAAyB,CACvC,2BAAA,CAAAC,CAAAA,CACA,OAAA,CAAA5B,EACA,MAAA,CAAApc,CACF,EAIW,CACT,IAAMie,EAAOH,EAAAA,CAAyBE,CAA2B,CAAA,CAC3DE,CAAAA,CAAkBnB,EAAAA,CAAckB,CAAAA,CAAK,OAAO,CAAA,CAC7CA,CAAAA,CAAK,QACL,EAAC,CAEAE,EAAgBC,EAAAA,CAAqB,CACzC,gBAAAF,CAAAA,CACA,OAAA,CAAA9B,EACA,MAAA,CAAApc,CACF,CAAC,CAAA,CAED,OAAO,KAAK,SAAA,CAAU,CAAE,GAAGie,CAAAA,CAAM,OAAA,CAASE,CAAc,CAAC,CAC3D,CAEO,SAASC,EAAAA,CAAqB,CACnC,gBAAAF,CAAAA,CACA,OAAA,CAAA9B,CAAAA,CACA,MAAA,CAAApc,CACF,CAAA,CAA6C,CAC3C,GAAM,CAAE,OAAQqe,CAAAA,CAAe,OAAA,CAASC,EAAiB,GAAGC,CAAY,CAAA,CACtEnC,CAAAA,EAAW,EAAC,CAERoC,EAAWvB,EAAAA,CACdiB,CAAAA,EAAmB,EAAC,CACrBK,CACF,EAGA,OAAIC,CAAAA,CAAS,QAAU,CAAC,KAAA,CAAM,QAAQA,CAAAA,CAAS,MAAM,IACnDA,CAAAA,CAAS,MAAA,CAAS,QAOhBxe,CAAAA,GAAW,MAAA,CAEbwe,CAAAA,CAAS,MAAA,CAASxe,CAAAA,EAAUA,CAAAA,CAAO,OAAS,CAAA,CAAIA,CAAAA,CAAS,EAAC,CACjDqe,CAAAA,GAAkB,SAE3BG,CAAAA,CAAS,MAAA,CAASH,CAAAA,CAAAA,CAGpBG,CAAAA,CAAS,MAAA,CAASpB,EAAAA,CAAeoB,EAAS,MAAM,CAAA,CAChDA,EAAS,OAAA,CAAU,CAAA,CAEZA,CACT,CCrMO,SAASC,EAAAA,CAAcC,CAAAA,CAAmC,CAC/D,OAAOA,EAAY,GAAA,CAAKC,CAAAA,EAAM,CAC5B,IAAMjR,CAAAA,CAAuB,CAC3B,IAAA,CAAMiR,CAAAA,CAAE,KACR,KAAA,CAAOA,CAAAA,CAAE,MACT,MAAA,CAAQA,CAAAA,CAAE,OACV,OAAA,CAASA,CAAAA,CAAE,QACX,QAAA,CAAUA,CAAAA,CAAE,QAAA,CACZ,UAAA,CAAYA,CAAAA,CAAE,UAAA,CACd,QAASA,CAAAA,CAAE,OAAA,CACX,WAAYA,CAAAA,CAAE,UAAA,CACd,sBAAuBA,CAAAA,CAAE,qBAAA,CACzB,cAAA,CAAgBA,CAAAA,CAAE,cAAA,CAClB,SAAA,CAAWA,EAAE,SAAA,CACb,aAAA,CAAeA,EAAE,aAAA,CACjB,mBAAA,CAAqBA,EAAE,mBAAA,CACvB,kBAAA,CAAoBA,CAAAA,CAAE,kBAAA,CACtB,mBAAA,CAAqBA,CAAAA,CAAE,oBACvB,sBAAA,CAAwBA,CAAAA,CAAE,uBAC1B,OAAA,CAASA,CAAAA,CAAE,QACX,WAAA,CAAaA,CAAAA,CAAE,YACf,eAAA,CAAiBA,CAAAA,CAAE,gBACnB,mBAAA,CAAqBA,CAAAA,CAAE,oBACvB,iCAAA,CAAmCA,CAAAA,CAAE,kCACrC,+BAAA,CAAiCA,CAAAA,CAAE,+BAAA,CACnC,mBAAA,CAAqBA,CAAAA,CAAE,mBAAA,CACvB,wBAAyBA,CAAAA,CAAE,uBAAA,CAC3B,yBAA0BA,CAAAA,CAAE,wBAAA,CAC5B,eAAgBA,CAAAA,CAAE,cAAA,CAClB,wBAAA,CAA0BA,CAAAA,CAAE,wBAAA,CAC5B,uBAAA,CAAyBA,EAAE,uBAAA,CAC3B,qBAAA,CAAuBA,EAAE,qBAAA,CACzB,WAAA,CAAaA,EAAE,WAAA,CACf,SAAA,CAAWA,CAAAA,CAAE,SAAA,CACb,aAAA,CAAeA,CAAAA,CAAE,cACjB,KAAA,CAAOA,CAAAA,CAAE,MACT,gBAAA,CAAkBA,CAAAA,CAAE,iBACpB,iBAAA,CAAmBA,CAAAA,CAAE,kBACrB,cAAA,CAAgBA,CAAAA,CAAE,eAClB,YAAA,CAAcA,CAAAA,CAAE,aAChB,gBAAA,CAAkBA,CAAAA,CAAE,gBACtB,CAAA,CAGIvC,CAAAA,CAAsCM,EAAAA,CACxCiC,CAAAA,CAAE,qBACJ,CAAA,CAGA,GAAI,CAACvC,CAAAA,EAAW,OAAO,IAAA,CAAKA,CAAO,EAAE,MAAA,GAAW,CAAA,CAC9C,GAAI,CACF,IAAMwC,CAAAA,CAAe,KAAK,KAAA,CAAMD,CAAAA,CAAE,eAAiB,IAAI,CAAA,CACnDC,EAAa,OAAA,GACfxC,CAAAA,CAAUwC,CAAAA,CAAa,OAAA,EAE3B,CAAA,KAAY,CAEZ,CAIF,OAAA,CAAI,CAACxC,GAAW,MAAA,CAAO,IAAA,CAAKA,CAAO,CAAA,CAAE,MAAA,GAAW,KAC9CA,CAAAA,CAAU,CACR,MAAO,EAAA,CACP,WAAA,CAAa,GACb,QAAA,CAAU,EAAA,CACV,KAAM,EAAA,CACN,aAAA,CAAe,EAAA,CACf,OAAA,CAAS,EACX,CAAA,CAAA,CAGK,CAAE,GAAG1O,CAAAA,CAAS,QAAA0O,CAAQ,CAC/B,CAAC,CACH,CC3EO,SAASyC,EAAAA,CAAwBlG,CAAAA,CAAqB,CAC3D,OAAOvC,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,KAAK,GAAGsC,CAAS,CAAA,CAC9C,OAAA,CAASA,CAAAA,CAAU,MAAA,CAAS,EAC5B,OAAA,CAAS,SAAoC,CAK3C,IAAMzT,CAAAA,CAAY,MAAMvB,CAAAA,CACtB,4BAAA,CACA,CAACgV,CAAS,CAAA,CACV,OACA,MAAA,CACA,MAAA,CACC4D,GAAS,KAAA,CAAM,OAAA,CAAQA,CAAI,CAC9B,CAAA,CACA,OAAOkC,EAAAA,CAAcvZ,CAAAA,EAAY,EAAE,CACrC,CACF,CAAC,CACH,CClBO,SAAS4Z,EAAAA,CAA2BpX,CAAAA,CAAkB,CAC3D,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,WAAA,CAAY3O,CAAQ,CAAA,CACjD,OAAA,CAAS,IACP/D,CAAAA,CAAQ,iCAAkC,CACxC+D,CACF,CAAC,CACL,CAAC,CACH,CCHO,SAASqX,EAAAA,CACdnG,CAAAA,CACAM,EACAJ,CAAAA,CAAa,MAAA,CACbhkB,EAAQ,GAAA,CACR,CACA,OAAOshB,uBAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,SAAA,CAAUuC,EAAYM,CAAAA,CAAeJ,CAAAA,CAAYhkB,CAAK,CAAA,CACnF,OAAA,CAAS,IACP6O,CAAAA,CAAQ,6BAAA,CAA+B,CACrCiV,EACAM,CAAAA,CACAJ,CAAAA,CACAhkB,CACF,CAAC,CAAA,CACH,QAAS,CAAC,CAAC8jB,CACb,CAAC,CACH,CCjBO,SAASoG,EAAAA,CACdhG,EACAC,CAAAA,CACAH,CAAAA,CAAa,OACbhkB,CAAAA,CAAQ,GAAA,CACR,CACA,OAAOshB,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,SAAA,CAAU2C,CAAAA,CAAUC,CAAAA,CAAgBH,CAAAA,CAAYhkB,CAAK,CAAA,CAClF,QAAS,IACP6O,CAAAA,CAAQ,8BAA+B,CACrCqV,CAAAA,CACAC,EACAH,CAAAA,CACAhkB,CACF,CAAC,CAAA,CACH,OAAA,CAAS,CAAC,CAACkkB,CACb,CAAC,CACH,CCxBA,IAAMiG,EAAAA,CAAwB,GAAA,CAQxBC,EAAAA,CAAwB,GAiBvB,SAASC,EAAAA,CAA0BzX,EAA8B,CACtE,OAAO0O,wBAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,UAAA,CAAW3O,CAAS,CAAA,CACjD,OAAA,CAAS,SAAY,CACnB,IAAM0X,EAAkB,EAAC,CACrBhqB,CAAAA,CAAQ,EAAA,CAEZ,IAAA,IAASglB,CAAAA,CAAO,EAAGA,CAAAA,CAAO8E,EAAAA,CAAuB9E,IAAQ,CACvD,IAAMlV,EAAY,MAAMvB,CAAAA,CAAQ,6BAAA,CAA+B,CAC7D+D,CAAAA,CACAtS,CAAAA,CACA,SACA6pB,EACF,CAAC,EAED,GAAI,CAAC/Z,GAAU,MAAA,CACb,MAGF,IAAIma,CAAAA,CAAQna,CAAAA,CAAS,GAAA,CAAKqV,GAASA,CAAAA,CAAK,SAAS,EAgBjD,GAVI8E,CAAAA,CAAM,CAAC,CAAA,GAAMjqB,CAAAA,GACfiqB,EAAQA,CAAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAA,CAGnB,CAACA,EAAM,MAAA,GAIXD,CAAAA,CAAM,KAAK,GAAGC,CAAK,CAAA,CAEfna,CAAAA,CAAS,MAAA,CAAS+Z,EAAAA,CAAAA,CACpB,MAGF7pB,CAAAA,CAAQiqB,CAAAA,CAAMA,EAAM,MAAA,CAAS,CAAC,EAChC,CAEA,OAAOD,CACT,CAAA,CACA,OAAA,CAAS,CAAC,CAAC1X,CACb,CAAC,CACH,CCnEO,SAAS4X,EAAAA,CAA2BvG,CAAAA,CAAejkB,CAAAA,CAAQ,GAAI,CACpE,OAAOshB,wBAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,MAAA,CAAO0C,EAAOjkB,CAAK,CAAA,CAChD,QAAS,IACP6O,CAAAA,CAAQ,gCAAiC,CACvCoV,CAAAA,CACAjkB,CACF,CAAC,CAAA,CACH,OAAA,CAAS,CAAC,CAACikB,CAAAA,CACX,UAAW,CAAA,CAAA,CACb,CAAC,CACH,CCjBO,SAASwG,EAAAA,CACdxG,CAAAA,CACAjkB,CAAAA,CAAQ,EACRqkB,CAAAA,CAAwB,GACxB,CACA,OAAO/C,wBAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,MAAA,CAAO0C,CAAAA,CAAOI,CAAW,CAAA,CACtD,OAAA,CAAS,CAAC,CAACJ,CAAAA,CACX,QAAS,SAAA,CACW,MAAMpV,EAAQ,+BAAA,CAAiC,CAACoV,EAAOjkB,CAAK,CAAC,GAC/D,MAAA,CAAQ6E,CAAAA,EACtBwf,EAAY,MAAA,CAAS,CAAA,CAAI,CAACA,CAAAA,CAAY,QAAA,CAASxf,CAAI,EAAI,IACzD,CAEJ,CAAC,CACH,CCEA,IAAM6lB,EAAAA,CAAqB,IAAI,IAAI,CACjC,gBAAA,CACA,kBACA,kBAAA,CACA,eACF,CAAC,CAAA,CAUM,SAASC,EAAAA,CACd/X,CAAAA,CACAxK,CAAAA,CACA,CACA,OAAOkZ,uBAAAA,CAAkD,CACvD,SAAUC,CAAAA,CAAU,QAAA,CAAS,mBAAmB3O,CAAAA,CAAUxK,CAAAA,EAAQ,IAAI,CAAA,CACtE,OAAA,CAAS,SAAY,CACnB,GAAI,CAACwK,CAAAA,EAAY,CAACxK,EAChB,OAAO,CAAE,KAAA,CAAO,KAAM,CAAA,CAIxB,IAAMgI,EAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,uBACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,SAAAxK,CAAAA,CACA,IAAA,CAAAxK,CACF,CAAC,CACH,CACF,EAEA,GAAI,CAACgI,EAAS,EAAA,CACZ,OAAO,CAAE,KAAA,CAAO,KAAM,EAGxB,IAAM2L,CAAAA,CAAW,MAAM3L,CAAAA,CAAS,IAAA,GAE1Bwa,CAAAA,CAAqC,KAAA,CAAM,QAAQ7O,CAAO,CAAA,CAC5DA,CAAAA,CAAQ,OAAA,CAASlX,CAAAA,EAAS,CACxB,GAAI,CAACA,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC3B,OAAO,EAAC,CAGV,IAAMgmB,CAAAA,CAAahmB,CAAAA,CAEblB,CAAAA,CACJ,OAAOknB,CAAAA,CAAW,KAAA,EAAU,SACxBA,CAAAA,CAAW,KAAA,CACX,OAEN,GAAI,CAAClnB,CAAAA,CACH,OAAO,EAAC,CAGV,IAAM4kB,CAAAA,CACJsC,CAAAA,CAAW,MAAQ,OAAOA,CAAAA,CAAW,MAAS,QAAA,CAC1C,CAAE,GAAIA,CAAAA,CAAW,IAAiC,EAClD,EAAC,CAEDC,EAAyC,EAAC,CAE1CC,EACJ,OAAOF,CAAAA,CAAW,OAAA,EAAY,QAAA,EAAYA,CAAAA,CAAW,OAAA,CACjDA,EAAW,OAAA,CACX,MAAA,CAOAG,GAJJ,OAAOH,CAAAA,CAAW,QAAW,QAAA,CACzBA,CAAAA,CAAW,MAAA,GAAW,CAAA,CACtB,MAAA,GAEyB,KAAA,CAE3BE,IACFD,CAAAA,CAAc,OAAA,CAAUC,GAG1BD,CAAAA,CAAc,IAAA,CAAOE,EAErB,IAAMC,CAAAA,CAAgB,CACpB,MAAA,CAAAtnB,CAAAA,CACA,QAAA,CAAUA,EACV,OAAA,CAAAonB,CAAAA,CACA,KAAMC,CAAAA,CACN,IAAA,CAAM,QACN,IAAA,CAAMF,CACR,EAEMI,CAAAA,CAAiD,GAEvD,IAAA,GAAW,CAACC,EAAYC,CAAS,CAAA,GAAK,OAAO,OAAA,CAAQ7C,CAAI,CAAA,CACnD,OAAO4C,CAAAA,EAAe,QAAA,GAItBT,GAAmB,GAAA,CAAIS,CAAU,GAIjC,OAAOC,CAAAA,EAAc,UAAY,CAACA,CAAAA,EAIjC,kBAAA,CAAmB,IAAA,CAAKD,CAAU,CAAA,EAIvCD,EAAoB,IAAA,CAAK,CACvB,OAAQC,CAAAA,CACR,QAAA,CAAUA,EACV,OAAA,CAASC,CAAAA,CACT,IAAA,CAAMJ,CAAAA,CACN,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,CAAA,CACD,GAEJ,OAAO,CACL,KAAA,CAAON,CAAAA,CAAQ,MAAA,CAAS,CAAA,CACxB,OAAQA,CAAAA,CAAQ,MAAA,CAASA,EAAU,MAAA,CACnC,OAAA,CAASA,EAAQ,MAAA,CAASA,CAAAA,CAAU,MACtC,CACF,CAAA,CACA,cAAA,CAAgB,IAClB,CAAC,CACH,CC3JO,SAASS,EAAAA,CACd7G,CAAAA,CACAjlB,CAAAA,CACA,CACA,OAAO+hB,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,UAAUiD,CAAAA,CAAWjlB,CAAM,EACxD,OAAA,CAAS,CAAC,CAACilB,CAAAA,EAAa,CAAC,CAACjlB,CAAAA,CAC1B,cAAA,CAAgB,MAChB,eAAA,CAAiB,IAAA,CACjB,OAAA,CAAS,SAAY,CACnB,IAAMupB,EAAgC,CACpC,OAAA,CAAS,MACT,OAAA,CAAS,KAAA,CACT,WAAY,KAAA,CACZ,aAAA,CAAe,KAAA,CACf,kBAAA,CAAoB,KACtB,CAAA,CAKA,OAAI,CAACtE,CAAAA,EAAa,CAACjlB,CAAAA,CACVupB,CAAAA,CAGM,MAAMja,CAAAA,CAAQ,0CAAA,CAA4C,CAAC2V,CAAAA,CAAWjlB,CAAM,CAAC,GAC1EupB,CACpB,CACF,CAAC,CACH,CC5BO,SAASwC,EAAAA,CACd1Y,EACA,CACA,OAAO0O,wBAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,aAAA,CAAc3O,CAAS,CAAA,CACpD,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA3F,CAAO,CAAA,GACN,MAAM4B,CAAAA,CAAQ,+BAAA,CAAiC,CAC5D,OAAA,CAAS+D,CACX,CAAA,CAAG,MAAA,CAAW,OAAW3F,CAAM,CAAA,EACb,EAExB,CAAC,CACH,CCfO,SAASse,EAAAA,CACd/H,EACApb,CAAAA,CACA,CACA,OAAOkZ,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,UAAUiC,CAAc,CAAA,CACrD,QAAS,CAAC,CAACA,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,QAAS,SAAY,CACnB,GAAI,CAACob,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,MAAM,IAAI,KAAA,CAAM,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,GACuB,IAAA,EACzB,CACF,CAAC,CACH,CAEO,SAASojB,EAAAA,CACdhI,CAAAA,CACApb,CAAAA,CACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,SAAS,iBAAA,CAAkBiC,CAAAA,CAAgBxjB,CAAK,CAAA,CACpE,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,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,GAAc,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,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,GAC5B,OAAO4Q,EAAAA,CAA4C2K,EAAM3rB,CAAK,CAChE,EACA,gBAAA,CAAkB,CAAA,CAClB,gBAAA,CAAmB4rB,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,CAACpI,CAAAA,EAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CC3EO,SAASyjB,EAAAA,CACdrI,EACApb,CAAAA,CACA,CACA,OAAOkZ,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,UAAUiC,CAAc,CAAA,CACrD,QAAS,CAAC,CAACA,GAAkB,CAAC,CAACpb,CAAAA,CAC/B,OAAA,CAAS,SAAY,CACnB,GAAI,CAACob,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,MAAM,IAAI,KAAA,CAAM,gDAA2C,CAAA,CAa7D,OAAQ,KAAA,CAVS,MADAyY,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,wBAAA,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,GACuB,IAAA,EACzB,CACF,CAAC,CACH,CAEO,SAAS0jB,EAAAA,CACdtI,EACApb,CAAAA,CACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,SAAS,iBAAA,CAAkBiC,CAAAA,CAAgBxjB,CAAK,CAAA,CACpE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,CACL,IAAA,CAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,EACP,KAAA,CAAApI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,EAAGzD,EAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,CAAA,OAAA,EAAU1rB,CAAK,CAAA,CAAA,CAChG,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,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,GAC5B,OAAO4Q,EAAAA,CAA4C2K,EAAM3rB,CAAK,CAChE,EACA,gBAAA,CAAkB,CAAA,CAClB,iBAAmB4rB,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,CCrEO,SAAS2jB,EAAAA,CACdvI,CAAAA,CACApb,CAAAA,CACAmc,EACA,CACA,OAAOjD,wBAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,aAAA,CAAciC,EAAiBe,CAAe,CAAA,CAC3E,QAAS,CAAC,CAACf,GAAkB,CAAC,CAACpb,GAAQ,CAAC,CAACmc,CAAAA,CACzC,OAAA,CAAS,SAAY,CACnB,GAAI,CAACf,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,MAAM,IAAI,KAAA,CAAM,gDAA2C,CAAA,CAE7D,GAAI,CAACmc,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAiD,CAAA,CAGnE,IAAMnU,EAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,8BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAhV,CAAAA,CACA,OAAA,CAASmc,CACX,CAAC,CACH,CACF,CAAA,CAEA,GAAI,CAACnU,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA,qEAAA,EAAmEA,EAAS,MAAM,CAAA,EAAA,EAAKA,EAAS,UAAU,CAAA,CAC5G,CAAA,CAGF,IAAMjS,CAAAA,CAAS,MAAMiS,EAAS,IAAA,EAAK,CACnC,GAAI,OAAOjS,CAAAA,EAAW,UACpB,MAAM,IAAI,KAAA,CACR,CAAA,+FAAA,EAA6F,OAAOA,CAAM,EAC5G,CAAA,CAGF,OAAOA,CACT,CACF,CAAC,CACH,CCpDO,SAAS6tB,EAAAA,CACdpZ,CAAAA,CACAxK,EACA,CACA,OAAOkZ,wBAAa,CAClB,OAAA,CAAS,CAAC,CAAC1O,CAAAA,EAAY,CAAC,CAACxK,CAAAA,CACzB,QAAA,CAAUmZ,EAAU,QAAA,CAAS,UAAA,CAAW3O,CAAS,CAAA,CACjD,OAAA,CAAS,SAAY,CACnB,GAAI,CAACA,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAcpE,OAAA,CAXiB,MADAyY,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,eAAiB,yBAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAAhV,CAAK,CAAC,CAC/B,CACF,CAAA,EAEgB,IAAA,EAClB,CACF,CAAC,CACH,CC1BO,SAAS6jB,GACdrZ,CAAAA,CACA,CACA,OAAO0O,uBAAAA,CAAa,CAClB,OAAA,CAAS,CAAC,CAAC1O,CAAAA,CACX,SAAU2O,CAAAA,CAAU,QAAA,CAAS,gBAAgB3O,CAAS,CAAA,CACtD,OAAA,CAAS,IACP/D,CAAAA,CAAQ,oDAAA,CAAsD,CAAE,QAAA,CAAU,CAAC+D,CAAQ,CAAE,CAAC,CAC1F,CAAC,CACH,CCRO,SAASsZ,GAAkCjI,CAAAA,CAAejkB,CAAAA,CAAQ,GAAI,CAC3E,OAAOshB,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,SAAS,WAAA,CAAY0C,CAAAA,CAAOjkB,CAAK,CAAA,CACrD,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,GAA6D,CACxE,SAAA,CAAW,CACTlU,CAAAA,CAAI,QAAA,CACJA,EAAI,mBAAA,CACJA,CAAAA,CAAI,sBACJA,CAAAA,CAAI,4BAAA,CACJA,EAAI,kBAAA,CACJA,CAAAA,CAAI,uBAAA,CACJA,CAAAA,CAAI,eAAA,CACJA,CAAAA,CAAI,uBACN,CAAA,CACA,eAAA,CAAiB,CACfA,CAAAA,CAAI,oBAAA,CACJA,EAAI,UAAA,CACJA,CAAAA,CAAI,mCAAA,CACJA,CAAAA,CAAI,mBAAA,CACJA,CAAAA,CAAI,mBACJA,CAAAA,CAAI,kBACN,EACA,SAAA,CAAW,CAACA,EAAI,QAAQ,CAAA,CACxB,kBAAA,CAAoB,CAClBA,CAAAA,CAAI,yBAAA,CACJA,EAAI,gBAAA,CACJA,CAAAA,CAAI,oBACJA,CAAAA,CAAI,0BAAA,CACJA,EAAI,qBAAA,CACJA,CAAAA,CAAI,sBACJA,CAAAA,CAAI,qBAAA,CACJA,EAAI,uBACN,CAAA,CACA,QAAS,CACPA,CAAAA,CAAI,cACJA,CAAAA,CAAI,eAAA,CACJA,CAAAA,CAAI,eAAA,CACJA,CAAAA,CAAI,oBAAA,CACJA,EAAI,yBAAA,CACJA,CAAAA,CAAI,iBACJA,CAAAA,CAAI,YACN,CACF,CAAA,CAEamU,EAAAA,CAAyB,CAAC,GAAG,MAAA,CAAO,MAAA,CAAOD,EAAwB,CAAC,CAAA,CAAE,OACjF,CAACE,CAAAA,CAAKC,IAAQD,CAAAA,CAAI,MAAA,CAAOC,CAAG,CAAA,CAC5B,EACF,EA2CA,SAASC,EAAAA,CAAUC,EAA+B,CAChD,OAAOA,EAAM,KAAA,CAAQ,GAAA,CAAaA,EAAM,YAAA,CAAe,GAAA,CAAMA,EAAM,MACrE,CAMA,SAASC,EAAAA,CAAgBC,CAAAA,CAA0B,CACjD,OAAOA,CAAAA,CAAS,OAAA,CAAQ,aAAA,CAAe,EAAE,CAC3C,CAKA,SAASC,EAAAA,CAAW/qB,EAAqE,CACvF,OAAO,OAAOA,CAAAA,EAAM,QAAA,EAAYA,CAAAA,GAAM,IAAA,EAAQ,KAAA,GAASA,CAAAA,EAAK,WAAYA,CAAAA,EAAK,WAAA,GAAeA,CAC9F,CAMA,SAASgrB,GAAYhrB,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,GAAO5e,CAAAA,CAAE,GAA0B,GAAK,SAAA,CACvD,OAAO,GAAGmY,CAAAA,CAAO,MAAA,CAAO,QAAQnY,CAAAA,CAAE,SAAS,CAAC,CAAA,CAAA,EAAI+B,CAAM,CAAA,CACxD,CAMA,SAASkpB,EAAAA,CAAiB5tB,EAAyD,CACjF,IAAMd,EAAkC,EAAC,CACzC,IAAA,GAAW,CAAC2uB,CAAAA,CAAGlrB,CAAC,IAAK,MAAA,CAAO,OAAA,CAAQ3C,CAAK,CAAA,CACvCd,CAAAA,CAAO2uB,CAAC,CAAA,CAAIF,EAAAA,CAAYhrB,CAAC,CAAA,CAE3B,OAAOzD,CACT,CAWO,SAAS4uB,EAAAA,CACdna,EACA5S,CAAAA,CAAQ,EAAA,CACRoR,EAA6B,EAAA,CAC7B,CACA,IAAM4b,CAAAA,CAAiB5b,CAAAA,CACnB+a,GAAyB/a,CAAK,CAAA,CAC9Bgb,GAEJ,OAAOX,+BAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,QAAA,CAAS,YAAA,CAAa3O,CAAAA,EAAY,EAAA,CAAIxB,EAAOpR,CAAK,CAAA,CACtE,iBAAkB,IAAA,CAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAqD,CACvF,GAAI,CAAC2F,EACH,OAAO,CAAE,QAAS,EAAC,CAAG,WAAA,CAAa,CAAE,CAAA,CAGvC,IAAMlG,EAA0C,CAC9C,cAAA,CAAgBkG,EAChB,iBAAA,CAAmBoa,CAAAA,CAAe,KAAK,GAAG,CAAA,CAC1C,YAAahtB,CACf,CAAA,CAII0rB,IAAc,IAAA,GAChBhf,CAAAA,CAAO,KAAOgf,CAAAA,CAAAA,CAGhB,IAAMtb,EAAY,MAAMZ,EAAAA,CACtB,OAAA,CACA,qCAAA,CACA9C,CAAAA,CACA,MAAA,CACA,OACAO,CACF,CAAA,CAcA,OAAO,CACL,OAAA,CAbcmD,EAAS,iBAAA,CAAkB,GAAA,CAAKoc,CAAAA,EAAU,CACxD,IAAM5U,CAAAA,CAAO6U,GAAgBD,CAAAA,CAAM,EAAA,CAAG,IAAI,CAAA,CAE1C,OAAO,CACL,GAFYK,EAAAA,CAAiBL,CAAAA,CAAM,EAAA,CAAG,KAAK,CAAA,CAG3C,IAAKD,EAAAA,CAAUC,CAAK,EACpB,IAAA,CAAA5U,CAAAA,CACA,UAAW4U,CAAAA,CAAM,SAAA,CACjB,MAAA,CAAQA,CAAAA,CAAM,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,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,IAAA,GAC7B,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,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,eAAgB,IAAA,CAChB,SAAA,CAAW,GACb,CAAC,CACH,CCjBO,SAAS+c,EAAAA,CAAiCva,EAAkB,CACjE,OAAO6Y,gCAAqB,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,CAAA,GAAgC,CAC1D,GAAM,CAAE,MAAA0B,CAAM,CAAA,CAAI1B,GAAa,EAAC,CAC1B7b,EAAUyN,qBAAAA,CAAc,mBAAA,EAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,0BAA0BmG,CAAQ,CAAA,CAAA,CAAI/C,CAAO,CAAA,CAE7Dud,CAAAA,GAAU,QACZ3gB,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,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,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,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,wBAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,cAAA,CAAe3O,CAAQ,EACpD,OAAA,CAAS,SAAY,CACnB,IAAMxC,CAAAA,CAAW,MAAM,KAAA,CACrBgN,CAAAA,CAAO,cAAA,CAAiB,CAAA,uBAAA,EAA0BxK,CAAQ,CAAA,MAAA,CAAA,CAC1D,CACE,MAAA,CAAQ,KAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAEA,GAAI,CAACxC,CAAAA,CAAS,GACZ,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,MAAOA,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,EAAa,MAAA,CAAQ,KAAA,CAAAhkB,EAAQ,GAAA,CAAK,OAAA,CAAAwtB,EAAU,IAAK,CAAA,CAAIhc,GAAW,EAAC,CAEzE,OAAOia,+BAAAA,CAML,CACA,SAAUlK,CAAAA,CAAU,QAAA,CAAS,QAAQuC,CAAAA,CAAWC,CAAAA,CAAMC,CAAAA,CAAYhkB,CAAK,CAAA,CACvE,gBAAA,CAAkB,CAAE,cAAA,CAAgB,EAAG,EACvC,OAAA,CAAAwtB,CAAAA,CACA,eAAgB,IAAA,CAEhB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA9B,CAAU,IAAuC,CACjE,GAAM,CAAE,cAAA,CAAAvH,CAAe,EAAIuH,CAAAA,CAKrB+B,CAAAA,CAAAA,CAFY,MAAM5e,CAAAA,CAAQ,CAAA,cAAA,EADjBkV,CAAAA,GAAS,YAAc,eAAA,CAAkB,eACD,GAAI,CAACD,CAAAA,CAAWK,IAAmB,EAAA,CAAK,IAAA,CAAOA,EAAgBH,CAAAA,CAAYhkB,CAAK,CAAC,CAAA,EAE1G,GAAA,CAAK0L,GACjCqY,CAAAA,GAAS,WAAA,CAAcrY,EAAE,SAAA,CAAYA,CAAAA,CAAE,QACzC,CAAA,CAcA,OAAA,CAXkB,MAAMmD,EAAQ,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,iBAAmBqoB,CAAAA,EACjBA,CAAAA,EAAYA,EAAS,MAAA,GAAW5rB,CAAAA,CAC5B,CAAE,cAAA,CAAgB4rB,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,EAAE,IAAK,CAAA,CACrD,MACR,CAAC,CACH,CCpEA,IAAM8B,EAAAA,CAAe,GASd,SAASC,EAAAA,CACd/a,EACAmR,CAAAA,CACAE,CAAAA,CACA,CACA,OAAO3C,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,QAAA,CAAS,cAAc3O,CAAAA,CAAUmR,CAAAA,CAAME,CAAK,CAAA,CAChE,cAAA,CAAgB,MAChB,OAAA,CAAS,KAAA,CACT,OAAA,CAAS,SAA2C,CAClD,GAAI,CAACA,CAAAA,CAAO,OAAO,EAAC,CAEpB,IAAM3jB,EAAQ2jB,CAAAA,CAAM,KAAA,CAAM,EAAG,EAAE,CAAA,CAIzBwJ,GAFY,MAAM5e,CAAAA,CAAQ,iBADjBkV,CAAAA,GAAS,WAAA,CAAc,gBAAkB,eACD,CAAA,CAAA,CAAI,CAACnR,CAAAA,CAAUtS,CAAAA,CAAO,MAAA,CAAQ,GAAI,CAAC,CAAA,EAGvF,IAAKoL,CAAAA,EAAOqY,CAAAA,GAAS,YAAcrY,CAAAA,CAAE,SAAA,CAAYA,CAAAA,CAAE,QAAS,CAAA,CAC5D,MAAA,CAAQ+Y,GAASA,CAAAA,CAAK,WAAA,GAAc,QAAA,CAASR,CAAAA,CAAM,aAAa,CAAC,CAAA,CACjE,KAAA,CAAM,CAAA,CAAGyJ,EAAY,EAQxB,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,OAAA,EAAS,IAAA,EAAQ,EAAA,CACvC,UAAA,CAAYA,EAAE,UAAA,CACd,MAAA,CAAQA,EAAE,MACZ,CAAA,CAAE,GAAK,EAEX,CACF,CAAC,CACH,CC9CO,SAASqqB,EAAAA,CAA4B5tB,CAAAA,CAAQ,EAAA,CAAI,CACtD,OAAOyrB,+BAAAA,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,CAAU7tB,CAAK,CAAC,CAAA,CACzD,IAAA,CAAM8tB,GACLA,CAAAA,CACG,MAAA,CAAQjE,GAAMA,CAAAA,CAAE,IAAA,GAAS,EAAE,CAAA,CAC3B,MAAA,CAAQA,CAAAA,EAAM,CAACA,CAAAA,CAAE,IAAA,CAAK,WAAW,OAAO,CAAC,EACzC,GAAA,CAAKA,CAAAA,EAAMA,EAAE,IAAI,CACtB,CAAA,CACJ,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,CAAqC/tB,EAAQ,GAAA,CAAK,CAChE,OAAOyrB,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,qBAAA,CAAsBvhB,CAAK,CAAA,CACrD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAW,CAAE,QAAA,CAAA6tB,CAAS,CAAE,CAAA,GACxChf,CAAAA,CAAQ,iCAAA,CAAmC,CAACgf,CAAAA,CAAU7tB,CAAK,CAAC,CAAA,CACzD,IAAA,CAAM8tB,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,SAAU,EAAG,CAAA,CACjC,iBAAmB0X,CAAAA,EACjBA,CAAAA,EAAU,OAAS,CAAE,QAAA,CAAUA,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,EAAE,IAAK,CAAA,CAAI,OACxE,SAAA,CAAW,CAAA,CAAA,CACb,CAAC,CACH,CCfO,SAASoC,GAAyBpb,CAAAA,CAAkBxK,CAAAA,CAAe,CACxE,OAAOkZ,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,SAAA,CAAU3O,CAAQ,EAC5C,OAAA,CAAS,SACFxK,GAIY,MADAyY,CAAAA,EAAc,CAE7BzD,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,eAAgB,kBAClB,CACF,CACF,CAAA,EAEgB,IAAA,GAhBP,EAAC,CAkBZ,OAAA,CAAS,CAAC,CAACwK,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CAEO,SAAS6lB,EAAAA,CACdrb,CAAAA,CACAxK,EACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,iBAAA,CAAkB3O,CAAAA,CAAU5S,CAAK,CAAA,CAC3D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAC9Y,CAAAA,EAAY,CAACxK,CAAAA,CAChB,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,UAAU1rB,CAAK,CAAA,CAAA,CAChG,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAoI,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,CAAM3rB,CAAK,CACzD,CAAA,CACA,iBAAkB,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,CAAChZ,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CC7EO,SAAS8lB,GACdtW,CAAAA,CAAyB,MAAA,CACzB,CACA,OAAO0J,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,QAAA,CAAS3J,CAAI,CAAA,CACvC,QAAS,SAAY,CACnB,IAAM/H,CAAAA,CAAUyN,qBAAAA,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,GAAc,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,GAAgC3B,CAAAA,CAAe,CAC7D,OAAOlL,uBAAAA,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,MAAA,CACPA,CAAAA,EAAO,QACT,CAAC,EAEH,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CCHO,SAAS4B,GACdxb,CAAAA,CACAuQ,CAAAA,CACAC,EACA,CACA,OAAO9B,wBAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,YAAA,CAAa3O,CAAAA,CAAWuQ,EAASC,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,KAAA,GAAQ,CAAC,CAAA,EAAK,IAAA,CAEhC,QAAS,CAAC,CAACxQ,GAAY,CAAC,CAACuQ,GAAU,CAAC,CAACC,CACvC,CAAC,CACH,CC3BO,SAASiL,EAAAA,CAAuBlL,EAAgBC,CAAAA,CAAkB,CACvE,OAAO9B,uBAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,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,uBAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,cAAA,CAAe4B,EAAQC,CAAQ,CAAA,CACzD,QAAS,CAAC,CAACD,CAAAA,EAAU,CAAC,CAACC,CAAAA,CACvB,QAAS,SACPvU,CAAAA,CAAQ,oCAAqC,CAC3C,MAAA,CAAAsU,EACA,QAAA,CAAAC,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAASmL,EAAAA,CAA0BpL,CAAAA,CAAgBC,CAAAA,CAAkB,CAC1E,OAAO9B,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,UAAA,CAAW4B,CAAAA,CAAQC,CAAQ,CAAA,CACrD,OAAA,CAAS,SACAvU,CAAAA,CAAQ,wBAAA,CAA0B,CACvC,OAAAsU,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,CAAAA,CAAM,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAM,QAAQ,CAAA,CAAA,CAKpD,OAHEpP,EAAO,YAAA,CAAa,QAAA,CAAS8F,CAAS,CAAA,EACtC9F,CAAAA,CAAO,kBAAA,CAAmB,IAAA,CAAMsB,CAAAA,EAAUA,CAAAA,CAAM,KAAKwE,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,GAAe,iBAAA,CAAmB,CACvD,OAAA8S,CAAAA,CACA,QAAA,CAAAC,EACA,QAAA,CAAAtF,CACF,CAAA,CAAG,CAAC,CAAA,CAEJ,GACE1N,GACA,OAAOA,CAAAA,EAAa,UACnBA,CAAAA,CAAmB,MAAA,GAAW+S,GAC9B/S,CAAAA,CAAmB,QAAA,GAAagT,CAAAA,CAEjC,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,CAAA,CAAA,EAAI2L,CAAAA,EAAiB,EAAE,CAAA,CAAA,CAEpD,OAAOxN,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,MAAM2B,CAAS,CAAA,CACzC,OAAA,CAAS,SAAY,CACnB,GAAI,CAAC4L,CAAAA,EAAiBA,CAAAA,GAAkB,YACtC,OAAO,IAAA,CAKT,IAAM1e,CAAAA,CAAW,MAAMvB,CAAAA,CAAQ,iBAAA,CAAmB,CAChD,MAAA,CAAAsU,EACA,QAAA,CAAU2L,CAAAA,CACV,SAAAhR,CACF,CAAC,EAED,GAAI,CAAC1N,EAAU,CAGb,IAAM2e,EAAW,MAAMJ,EAAAA,CAA0BxL,EAAQ2L,CAAAA,CAAehR,CAAQ,EAChF,GAAI,CAACiR,CAAAA,CACH,OAAO,IAAA,CAET,IAAMC,EAAgBH,CAAAA,GAAQ,MAAA,CAAY,CAAE,GAAGE,CAAAA,CAAU,IAAAF,CAAI,CAAA,CAAaE,CAAAA,CAC1E,OAAOP,EAAAA,CAAgBQ,CAAa,CACtC,CAEA,IAAMxC,EAAQqC,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,EAAS,IAAA,EAAK,GAAM,IACpBA,CAAAA,CAAS,IAAA,KAAW,WACxB,CAAC,CACH,CCzCO,SAAS6L,GAAiBxf,CAAAA,CAAkB/C,CAAAA,CAAsBO,EAAkC,CACzG,OAAO4B,CAAAA,CAAQ,CAAA,OAAA,EAAUY,CAAQ,CAAA,CAAA,CAAI/C,EAAQ,MAAA,CAAW,MAAA,CAAWO,CAAM,CAC3E,CAEA,eAAsBiiB,EAAAA,CACpBC,CAAAA,CACArR,CAAAA,CACA+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,EAAAA,CACjB1D,CAAAA,CAAK,eAAA,CACLA,CAAAA,CAAK,kBACL7N,CAAAA,CACA+Q,CAAAA,CACA5hB,CACF,CAAA,CACA,OAAImiB,EACK,CACL,GAAGD,CAAAA,CACH,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,CAAAA,EAAMqlB,EAAAA,CAAYrlB,CAAAA,CAAGiU,CAAAA,CAAU,OAAW7Q,CAAM,CAAC,CAAC,CAAA,CACzG,OAAOuhB,GAAgBlP,CAAQ,CACjC,CAEA,eAAsBoQ,EAAAA,CACpBjM,CAAAA,CACAkM,EAAuB,EAAA,CACvBC,CAAAA,CAAyB,GACzB5vB,CAAAA,CAAgB,EAAA,CAChBkU,EAAc,EAAA,CACd4J,CAAAA,CAAmB,EAAA,CACnB7Q,CAAAA,CACyB,CACzB,IAAMmiB,EAAO,MAAMH,EAAAA,CAA8B,mBAAoB,CACnE,IAAA,CAAAxL,EACA,YAAA,CAAAkM,CAAAA,CACA,eAAAC,CAAAA,CACA,KAAA,CAAA5vB,EACA,GAAA,CAAAkU,CAAAA,CACA,SAAA4J,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,gCAAA,EAAmC,OAAOA,CAAI,CAAA,8BAAA,EAAiC3L,CAAI,CAAA,yBAAA,CACrF,CAAA,CAGK,KACT,CAEA,eAAsBoM,GACpBpM,CAAAA,CACA7K,CAAAA,CACA+W,CAAAA,CAAuB,EAAA,CACvBC,CAAAA,CAAyB,EAAA,CACzB5vB,EAAgB,EAAA,CAChB8d,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,IAAA,CAAAxL,CAAAA,CACA,OAAA,CAAA7K,CAAAA,CACA,aAAA+W,CAAAA,CACA,cAAA,CAAAC,EACA,KAAA,CAAA5vB,CAAAA,CACA,SAAA8d,CACF,CAAA,CAAG7Q,CAAM,CAAA,CAET,OAAI,KAAA,CAAM,QAAQmiB,CAAI,CAAA,CACbE,GAAaF,CAAAA,CAAMtR,CAAAA,CAAU7Q,CAAM,CAAA,EAGxCmiB,CAAAA,EAAQ,IAAA,EACV,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,OAAA,CAAQA,CAAAA,CAAM,YAAY,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,YAAY,CAAA,CAAI,GAC5E,aAAA,CAAe,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAM,aAAa,CAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,aAAa,CAAA,CAAI,GAC/E,UAAA,CAAY,KAAA,CAAM,OAAA,CAAQA,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,CAAAA,CAAM,KAAA,CAAQ,CAAE,GAAGA,EAAM,KAAM,CAAA,CAAI,IAC5C,CAAA,CAEMuD,CAAAA,CAAuC,CAC3C,QAAA,CACA,OAAA,CACA,MAAA,CACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,MACA,SACF,CAAA,CAEA,QAAWC,CAAAA,IAAQD,CAAAA,CACbD,EAASE,CAAI,CAAA,EAAK,IAAA,GACnBF,CAAAA,CAAiBE,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,OAAS,IAAA,GACpBA,CAAAA,CAAS,MAAQ,CAAA,CAAA,CAEfA,CAAAA,CAAS,WAAA,EAAe,IAAA,GAC1BA,CAAAA,CAAS,WAAA,CAAc,GAErBA,CAAAA,CAAS,MAAA,EAAU,OACrBA,CAAAA,CAAS,MAAA,CAAS,GAEhBA,CAAAA,CAAS,WAAA,EAAe,IAAA,GAC1BA,CAAAA,CAAS,WAAA,CAAc,CAAA,CAAA,CAGpBA,EAAS,KAAA,GACZA,CAAAA,CAAS,MAAQ,CACf,WAAA,CAAa,EACb,IAAA,CAAM,KAAA,CACN,IAAA,CAAM,KAAA,CACN,WAAA,CAAa,CACf,GAGEA,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,IAAA,GACxBA,CAAAA,CAAS,SAAA,CAAY,EAAA,CAAA,CAEnBA,EAAS,oBAAA,EAAwB,IAAA,GACnCA,EAAS,oBAAA,CAAuB,WAAA,CAAA,CAE9BA,EAAS,QAAA,EAAY,IAAA,GACvBA,CAAAA,CAAS,QAAA,CAAW,WAAA,CAAA,CAGlBA,CAAAA,CAAS,YAAc,IAAA,GACzBA,CAAAA,CAAS,WAAa,KAAA,CAAA,CAGjBA,CACT,CAEA,eAAsBT,EAAAA,CACpBlM,CAAAA,CAAiB,EAAA,CACjBC,CAAAA,CAAmB,EAAA,CACnBtF,EAAmB,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,CAAAA,CAAM,CACR,IAAMa,CAAAA,CAAiBR,GAAcL,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,EAAA,CACI,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,GAA4C,gBAAA,CAAkB,CAC/E,OAAA9L,CAAAA,CACA,QAAA,CAAAC,EACA,QAAA,CAAUtF,CAAAA,EAAYqF,CACxB,CAAC,CAAA,CAED,GAAIiM,EAAM,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,EAAAA,CAAgC,eAAA,CAAiB,CAAE,IAAA,CAAAxK,EAAM,QAAA,CAAA3G,CAAS,CAAC,CAC5E,CAEA,eAAsBwS,EAAAA,CACpBC,CAAAA,CAAe,EAAA,CACfvwB,CAAAA,CAAgB,GAAA,CAChBikB,CAAAA,CACAR,EAAe,MAAA,CACf3F,CAAAA,CAAmB,GACU,CAC7B,OAAOmR,GAAkC,kBAAA,CAAoB,CAC3D,IAAA,CAAAsB,CAAAA,CACA,KAAA,CAAAvwB,CAAAA,CACA,MAAAikB,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,GAAcL,CAAI,CAClC,CAEA,eAAsBqB,EAAAA,CAAiB7X,EAAiD,CACtF,OAAOqW,EAAAA,CAAqC,wBAAA,CAA0B,CAAE,OAAA,CAAArW,CAAQ,CAAC,CACnF,CAEA,eAAsB8X,EAAAA,CAAeC,EAAmD,CACtF,OAAO1B,EAAAA,CAAqC,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,CAAAA,CACoB,CACpB,OAAOmR,EAAAA,CAAyB,eAAgB,CAAE,QAAA,CAAA3K,EAAU,QAAA,CAAAxG,CAAS,CAAC,CACxE,CC7SO,IAAKgT,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,QAAA,CAAW,WACXA,CAAAA,CAAA,iBAAA,CAAoB,oBACpBA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,OAAA,CAAU,SAAA,CAJAA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EAOZ,SAASrQ,GAAWxhB,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,OAAQA,CAAAA,CAAM,CAAC,CACjB,CAAA,CAJmB,CAAE,MAAA,CAAQ,EAAG,MAAA,CAAQ,EAAG,CAK7C,CAEO,SAASyS,GACdvE,CAAAA,CACAwE,CAAAA,CACAtN,CAAAA,CACA,CACA,IAAMuN,CAAAA,CAAanzB,GACjB2iB,EAAAA,CAAW3iB,CAAAA,CAAE,oBAAoB,CAAA,CAAE,MAAA,CACnC2iB,GAAW3iB,CAAAA,CAAE,mBAAmB,CAAA,CAAE,MAAA,CAClC2iB,EAAAA,CAAW3iB,CAAAA,CAAE,oBAAoB,CAAA,CAAE,MAAA,CAE/BozB,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,CAAUtF,IAAa,CAChC,GAAIizB,EAAY3tB,CAAC,CAAA,CACf,OAAO,CAAA,CAGT,GAAI2tB,CAAAA,CAAYjzB,CAAC,CAAA,CACf,OAAO,IAGT,IAAMozB,CAAAA,CAAKJ,EAAU1tB,CAAC,CAAA,CAChB+tB,EAAKL,CAAAA,CAAUhzB,CAAC,CAAA,CACtB,OAAIozB,CAAAA,GAAOC,CAAAA,CACFA,EAAKD,CAAAA,CAGP,CACT,EACA,iBAAA,CAAmB,CAAC9tB,EAAUtF,CAAAA,GAAa,CACzC,IAAMszB,CAAAA,CAAOhuB,CAAAA,CAAE,kBACTiuB,CAAAA,CAAOvzB,CAAAA,CAAE,kBAEf,OAAIszB,CAAAA,CAAOC,EAAa,EAAA,CACpBD,CAAAA,CAAOC,CAAAA,CAAa,CAAA,CAEjB,CACT,CAAA,CACA,MAAO,CAACjuB,CAAAA,CAAUtF,IAAa,CAC7B,IAAMszB,EAAOhuB,CAAAA,CAAE,QAAA,CACTiuB,CAAAA,CAAOvzB,CAAAA,CAAE,QAAA,CAEf,OAAIszB,EAAOC,CAAAA,CAAa,EAAA,CACpBD,EAAOC,CAAAA,CAAa,CAAA,CAEjB,CACT,CAAA,CACA,OAAA,CAAS,CAACjuB,CAAAA,CAAUtF,CAAAA,GAAa,CAC/B,GAAIizB,CAAAA,CAAY3tB,CAAC,EACf,OAAO,CAAA,CAGT,GAAI2tB,CAAAA,CAAYjzB,CAAC,EACf,OAAO,GAAA,CAGT,IAAMszB,CAAAA,CAAO,IAAA,CAAK,MAAMhuB,CAAAA,CAAE,OAAO,EAC3BiuB,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMvzB,CAAAA,CAAE,OAAO,CAAA,CAEjC,OAAIszB,CAAAA,CAAOC,CAAAA,CAAa,GACpBD,CAAAA,CAAOC,CAAAA,CAAa,EAEjB,CACT,CACF,CAAA,CAEMC,CAAAA,CAAST,CAAAA,CAAW,IAAA,CAAKI,EAAW1N,CAAK,CAAC,EAC1CgO,CAAAA,CAAcD,CAAAA,CAAO,UAAW5zB,CAAAA,EAAMszB,CAAAA,CAAStzB,CAAC,CAAC,CAAA,CACjD8zB,CAAAA,CAASF,EAAOC,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,SAAA,CACnB8J,CAAAA,CAAmB,IAAA,CACnB1P,CAAAA,CACA,CAKA,IAAM+T,CAAAA,CAAmB/T,GAAYV,CAAAA,CAAO,eAAA,CAE5C,OAAOkE,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,WAAA,CAAYiL,GAAO,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,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAOA,CAAiC,CAAC,CAAA,CAC3D,EAAC,CACL,OAAOoe,GAAgBvd,CAAO,CAChC,CAAA,CACA,OAAA,CAASuc,CAAAA,EAAW,CAAC,CAAChB,CAAAA,CACtB,MAAA,CAASxqB,GAAkB+uB,EAAAA,CAAgBvE,CAAAA,CAAOxqB,EAAM0hB,CAAK,CAAA,CAI7D,iBAAA,CAAmB,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,GAAA,CAAKrmB,CAAAA,EAAa,CAAA,EAAGA,CAAAA,CAAE,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,QAAQ,CAAA,CAAE,CACpE,EAEMwmB,CAAAA,CAAoBF,CAAAA,CAAkB,MAAA,CACzCG,CAAAA,EAAe,CAACF,CAAAA,CAAiB,IAAI,CAAA,EAAGE,CAAAA,CAAI,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAI,QAAQ,CAAA,CAAE,CACvE,CAAA,CAGA,OAAID,CAAAA,CAAkB,MAAA,CAAS,EACtB,CAAC,GAAIH,EAAqB,GAAGG,CAAiB,EAGhDH,CACT,CACF,CAAC,CACH,CAEO,SAASK,EAAAA,CACdjP,CAAAA,CACAC,EACAtF,CAAAA,CACA0P,CAAAA,CAAU,KACV,CACA,IAAMqE,CAAAA,CAAmB/T,CAAAA,EAAYV,CAAAA,CAAO,eAAA,CAE5C,OAAOkE,uBAAAA,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,CAAAA,CAAQC,CAAAA,CAAUyO,CAAgB,CAIpD,CAAC,CACH,CCvKO,SAASQ,EAAAA,CACdzf,CAAAA,CACAyQ,EAAS,OAAA,CACTrjB,CAAAA,CAAQ,GACR8d,CAAAA,CAAW,EAAA,CACX0P,EAAU,IAAA,CACV,CACA,OAAO/B,+BAAAA,CAML,CACA,QAAA,CAAUlK,EAAU,KAAA,CAAM,YAAA,CAAa3O,GAAY,EAAA,CAAIyQ,CAAAA,CAAQrjB,EAAO8d,CAAQ,CAAA,CAC9E,OAAA,CAAS,CAAC,CAAClL,CAAAA,EAAY4a,EACvB,gBAAA,CAAkB,CAChB,OAAQ,MAAA,CACR,QAAA,CAAU,OACV,WAAA,CAAa,IACf,CAAA,CAEA,OAAA,CAAS,MAAO,CAAE,UAAA9B,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,CAAAA,CAAU,MAAA,EAAU,EAAA,CACpBA,CAAAA,CAAU,UAAY,EAAA,CACtB1rB,CAAAA,CACA8d,EACA7Q,CACF,CAAA,CAEA,OAAOuhB,EAAAA,CAAgBpe,CAAAA,EAAY,EAAE,CACvC,CAAA,CAEA,iBAAmBwb,CAAAA,EAA0C,CAC3D,IAAM2E,CAAAA,CAAO3E,CAAAA,GAAWA,EAAS,MAAA,CAAS,CAAC,CAAA,CAGrC0G,CAAAA,CAAAA,CAAe1G,CAAAA,EAAU,MAAA,EAAU,KAAO5rB,CAAAA,CAEhD,GAAKsyB,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,CAAAA,CACAyQ,CAAAA,CAAS,OAAA,CACTsM,CAAAA,CAAuB,GACvBC,CAAAA,CAAyB,EAAA,CACzB5vB,EAAQ,EAAA,CACR8d,CAAAA,CAAW,GACX0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,iBAAiB3O,CAAAA,EAAY,EAAA,CAAIyQ,EAAQsM,CAAAA,CAAcC,CAAAA,CAAgB5vB,CAAAA,CAAO8d,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,EACAC,CAAAA,CACA5vB,CAAAA,CACA8d,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,CAAAA,EAASqN,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,EAAuB,CAC7D,IAAMkO,EAASrM,CAAAA,CAAK,MAAA,CAAQkH,GAAUA,CAAAA,CAAM,KAAA,EAAO,SAAS,CAAA,CACtDhE,CAAAA,CAAOlD,CAAAA,CAAK,OAAQkH,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,EAAGtF,CAAAA,GAAM,IAAI,KAAKA,CAAAA,CAAE,OAAO,EAAE,OAAA,EAAQ,CAAI,IAAI,IAAA,CAAKsF,CAAAA,CAAE,OAAO,EAAE,OAAA,EAChE,EACA,OAAO,CAAC,GAAGouB,CAAAA,CAAQ,GAAGiB,CAAS,CACjC,CAEO,SAASC,GACdpP,CAAAA,CACAvP,CAAAA,CACAlU,EAAQ,EAAA,CACR8d,CAAAA,CAAW,GACX0P,CAAAA,CAAU,IAAA,CACVsF,EAAkC,EAAC,CACnC,CACA,OAAOrH,+BAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,MAAM,WAAA,CAAYkC,CAAAA,CAAMvP,CAAAA,CAAKlU,CAAAA,CAAO8d,CAAQ,CAAA,CAChE,QAAS,MAAO,CAAE,UAAA4N,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAqD,CACvF,IAAI8lB,CAAAA,CAAe7e,CAAAA,CACfkJ,CAAAA,CAAO,eAAe,IAAA,CAAMsB,CAAAA,EAAUA,EAAM,IAAA,CAAKxK,CAAG,CAAC,CAAA,GACvD6e,CAAAA,CAAe,EAAA,CAAA,CAGjB,IAAM3iB,CAAAA,CAAW,MAAMvB,EAAQ,yBAAA,CAA2B,CACxD,KAAA4U,CAAAA,CACA,YAAA,CAAciI,EAAU,MAAA,CACxB,cAAA,CAAgBA,EAAU,QAAA,CAC1B,KAAA,CAAA1rB,EACA,GAAA,CAAK+yB,CAAAA,CACL,SAAAjV,CACF,CAAA,CAAG,OAAW,MAAA,CAAW7Q,CAAM,CAAA,CAE/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,OAAQA,CAAAA,CAAK,MAAA,CAAQ,SAAUA,CAAAA,CAAK,QAAS,CACxD,CACF,CAAC,CACH,CAEO,SAASyC,EAAAA,CACdvP,EACAkM,CAAAA,CAAuB,EAAA,CACvBC,EAAyB,EAAA,CACzB5vB,CAAAA,CAAgB,GAChBkU,CAAAA,CAAc,EAAA,CACd4J,CAAAA,CAAmB,EAAA,CACnB0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,eAAA,CAAgBkC,CAAAA,CAAMkM,EAAcC,CAAAA,CAAgB5vB,CAAAA,CAAOkU,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,IAAA,CAAKxK,CAAG,CAAC,CAAA,GACvD6e,EAAe,EAAA,CAAA,CAGjB,IAAM3iB,EAAW,MAAMsf,EAAAA,CACrBjM,EACAkM,CAAAA,CACAC,CAAAA,CACA5vB,CAAAA,CACA+yB,CAAAA,CACAjV,CAAAA,CACA7Q,CACF,EAEA,OAAOuhB,EAAAA,CAAgBpe,GAAY,EAAE,CACvC,CACF,CAAC,CACH,CCxJO,SAAS6iB,EAAAA,CACdrgB,CAAAA,CACA4Q,EACAxjB,CAAAA,CAAQ,GAAA,CACR,CACA,OAAOshB,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,QAAQ3O,CAAAA,EAAY,EAAA,CAAI5S,CAAK,CAAA,CACvD,OAAA,CAAS,SAAA,CACW,MAAM6O,CAAAA,CAAQ,gCAAA,CAAkC,CAChE+D,CAAAA,EAAY4Q,CAAAA,CACZ,EACAxjB,CACF,CAAC,GAGE,MAAA,CACE,CAAA,EACC,CAAA,CAAE,MAAA,GAAWwjB,CAAAA,EACb,CAAC,EAAE,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,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,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,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,UAAUiC,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,wBAAA,CAA0B,CAChF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CACF,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAACgI,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,EAGjE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,QAAS,CAAC,CAACoT,GAAkB,CAAC,CAACpb,CACjC,CAAC,CACH,CAEO,SAASgrB,EAAAA,CACd5P,EACApb,CAAAA,CACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,iBAAA,CAAkBiC,CAAAA,CAAgBxjB,CAAK,CAAA,CACjE,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAClI,CAAAA,EAAkB,CAACpb,CAAAA,CACtB,OAAO,CACL,IAAA,CAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,EACP,KAAA,CAAApI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,GAAc,CAE7B,CAAA,EAAGzD,EAAO,cAAc,CAAA,6CAAA,EAAgDsO,CAAS,CAAA,OAAA,EAAU1rB,CAAK,CAAA,CAAA,CAChG,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAoI,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,GAC5B,OAAO4Q,EAAAA,CAAqC2K,EAAM3rB,CAAK,CACzD,EACA,gBAAA,CAAkB,CAAA,CAClB,iBAAmB4rB,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,EAAoCpb,CAAAA,CAAe,CACvF,OAAOkZ,uBAAAA,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,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,CACF,CAAC,CACH,CAAC,CAAA,CAED,GAAI,CAACgI,EAAS,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,EACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,eAAeiC,CAAAA,CAAgBxjB,CAAK,EAC9D,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,EACP,KAAA,CAAApI,CAAAA,CACA,OAAQ,CAAA,CACR,QAAA,CAAU,KACZ,CACF,CAAA,CAIF,IAAMoQ,CAAAA,CAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,0CAAA,EAA6CsO,CAAS,UAAU1rB,CAAK,CAAA,CAAA,CAC7F,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAoI,CACF,CAAC,CACH,CACF,EAEA,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,CAAAA,CAAM3rB,CAAK,CACtD,CAAA,CACA,iBAAkB,CAAA,CAClB,gBAAA,CAAmB4rB,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,CCjFA,eAAemrB,EAAAA,CAAgBnrB,EAAgD,CAE7E,IAAMgI,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,cAAA,CAAiB,sBAAuB,CAC7E,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,2BAA2BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG9D,OAAOA,CAAAA,CAAS,MAClB,CAEO,SAASojB,EAAAA,CAAsB5gB,CAAAA,CAAmBxK,EAAe,CACtE,OAAOkZ,wBAAa,CAClB,QAAA,CAAUC,EAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAA,CACzC,OAAA,CAAS,SACH,CAACA,CAAAA,EAAY,CAACxK,CAAAA,CACT,EAAC,CAEHmrB,GAAgBnrB,CAAI,CAAA,CAE7B,QAAS,CAAC,CAACwK,GAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CAEO,SAASqrB,EAAAA,CAA6BjQ,CAAAA,CAAoCpb,EAAe,CAC9F,OAAOkZ,wBAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,aAAA,CAAciC,CAAc,EACtD,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,EACApI,CAAAA,CAAgB,EAAA,CAChB,CACA,OAAOyrB,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe3O,CAAAA,CAAU5S,CAAK,EACxD,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAAA,CAAY,CAAE,CAAA,GAAM,CACpC,GAAI,CAAC9Y,CAAAA,EAAY,CAACxK,EAChB,OAAO,CACL,KAAM,EAAC,CACP,WAAY,CACV,KAAA,CAAO,EACP,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,0CAAA,EAA6CsO,CAAS,UAAU1rB,CAAK,CAAA,CAAA,CAC7F,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAoI,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,GAC5B,OAAO4Q,EAAAA,CAAsC2K,EAAM3rB,CAAK,CAC1D,CAAA,CACA,gBAAA,CAAkB,CAAA,CAClB,gBAAA,CAAmB4rB,GAAa,CAC9B,GAAIA,EAAS,UAAA,CAAW,QAAA,CACtB,OAAOA,CAAAA,CAAS,UAAA,CAAW,MAAA,CAASA,CAAAA,CAAS,UAAA,CAAW,KAG5D,EACA,OAAA,CAAS,CAAC,CAAChZ,CAAAA,EAAY,CAAC,CAACxK,CAC3B,CAAC,CACH,CC/FO,SAASurB,GAA8BxQ,CAAAA,CAAgBC,CAAAA,CAAkBO,EAAW,KAAA,CAAO,CAChG,OAAOrC,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,eAAe4B,CAAAA,CAAQC,CAAAA,CAAUO,CAAQ,CAAA,CACnE,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA1W,CAAO,IAAM,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,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAUO,EAAW,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,EACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CACzB,CAAC,CACH,CCzBA,SAASwQ,GAAczQ,CAAAA,CAAgBC,CAAAA,CAA0B,CAC/D,IAAMyQ,CAAAA,CAAc1Q,CAAAA,EAAQ,IAAA,EAAK,CAC3B2L,CAAAA,CAAgB1L,GAAU,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,CAAAA,CAAc,OAAA,CAAQ,MAAA,CAAQ,EAAE,EAE3D,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,MAAK,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,EAAA,CAExE,OAAOxN,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,KAAA,CAAM,aAAa2B,CAAS,CAAA,CAChD,QAAS,MAAO,CAAE,MAAA,CAAAjW,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,MAAMgN,CAAAA,CAAO,cAAA,CAAiB,+BAAgC,CACnF,MAAA,CAAQ,MAAA,CACR,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,EAAS,MAAM,CAAA,CAAE,EAGvE,OAAOA,CAAAA,CAAS,MAClB,CAAA,CACA,MAAA,CAAS8jB,CAAAA,EAAiC,CACxC,GAAI,CAACA,CAAAA,EAAS,IAAA,GAAO,CAAC,CAAA,CACpB,OAAO,KAET,GAAM,CAAE,IAAA,CAAApnB,CAAAA,CAAM,KAAA,CAAAqnB,CAAAA,CAAO,KAAArG,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,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,IAAA,CAAK4B,CAAAA,CAAQC,CAAQ,CAAA,CAC/C,OAAA,CAAS,SAAY,CACnB,IAAMtT,CAAAA,CAAO,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,CAAA,CAED,GAAI,CAACM,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGjE,OAAOA,CAAAA,CAAS,IAAA,EAClB,EACA,OAAA,CAAS,CAAC,CAAC+S,CAAAA,EAAU,CAAC,CAACC,CAAAA,EAAYiR,CAAAA,CACnC,SAAA,CAAW,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,OAAA,CAEtB,OAAA,CAASA,CAAAA,CAAM,OAAA,EAAYA,EAA4C,SAAA,CACvE,IAAA,CAAA9O,CACF,CACF,CAEA,SAAS6W,EAAAA,CAAgB/H,CAAAA,CAA+B,CACtD,OAAO,CACL,GAAGA,EACH,EAAA,CAAIA,CAAAA,CAAM,IAAMA,CAAAA,CAAM,OACxB,CACF,CAEO,SAASgI,EAAAA,CACdhI,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,CAAA,CAAI,MAAA,CAE9D,OAAO,CACL,GAAGA,CAAAA,CACH,EAAA,CAAIA,EAAM,EAAA,EAAMA,CAAAA,CAAM,QAItB,OAAA,CAASA,CAAAA,CAAM,OAAA,EAAYA,CAAAA,CAA4C,SAAA,CAIvE,mBAAA,CAAqBA,EAAM,mBAAA,EAAuB,iBAAA,CAClD,qBAAsBA,CAAAA,CAAM,oBAAA,EAAwB,YACpD,mBAAA,CAAqBA,CAAAA,CAAM,mBAAA,EAAuB,WAAA,CAClD,oBAAA,CAAsBA,CAAAA,CAAM,sBAAwB,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,EACkB,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,CAAA,CAC5B,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,CAAA,CACtB,EAAC,CAGWA,CAAAA,CAAgB,OAAQnwB,CAAAA,EAAS,CAACA,EAAK,KAAA,EAAO,IAAI,CAGzE,CAEO,SAASswB,EAAAA,CACdC,CAAAA,CACAV,CAAAA,CACAhX,CAAAA,CACa,CACb,OAAI0X,CAAAA,CAAM,SAAW,CAAA,CACZ,GAGFA,CAAAA,CACJ,GAAA,CAAKvwB,CAAAA,EAAS,CACb,IAAM8vB,CAAAA,CAASS,EAAM,IAAA,CAClBv3B,CAAAA,EACCA,EAAE,MAAA,GAAWgH,CAAAA,CAAK,eAClBhH,CAAAA,CAAE,QAAA,GAAagH,EAAK,eAAA,EACpBhH,CAAAA,CAAE,SAAW6f,CACjB,CAAA,CAEA,OAAO,CACL,GAAG7Y,EACH,EAAA,CAAIA,CAAAA,CAAK,OAAA,CACT,IAAA,CAAA6Y,CAAAA,CACA,SAAA,CAAAgX,EACA,MAAA,CAAAC,CACF,CACF,CAAC,CAAA,CACA,OAAQnI,CAAAA,EAAUA,CAAAA,CAAM,SAAA,CAAU,OAAA,GAAYA,CAAAA,CAAM,OAAO,EAC3D,IAAA,CACC,CAACjpB,EAAGtF,CAAAA,GAAM,IAAI,KAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAAQ,CAAI,IAAI,KAAKsF,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,EAAC,CAClC,GAAA,CAAKA,CAAAA,CAAO,GAAA,EAAK,MAAK,EAAK,MAAA,CAC3B,UAAWA,CAAAA,CAAO,SAAA,EAAW,MAAK,CAAE,WAAA,EAAY,EAAK,MAAA,CACrD,MAAA,CAAQA,CAAAA,CAAO,QAAQ,IAAA,EAAK,CAAE,aAAY,EAAK,MAAA,CAC/C,SAAUA,CAAAA,CAAO,QAAA,EAAU,IAAA,EAAK,CAAE,WAAA,EAAY,EAAK,OACnD,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,CAAA9d,CAAM,CAAA,CACtDy1B,CAAAA,CACAxoB,CAAAA,CAC2B,CAC3B,IAAM4C,CAAAA,CAAUyN,sBAAc,mBAAA,EAAoB,CAC5C7Q,EAAM,IAAI,GAAA,CAAI,yBAAA,CAA2BoD,CAAO,CAAA,CACtDpD,CAAAA,CAAI,aAAa,GAAA,CAAI,OAAA,CAAS,OAAOzM,CAAK,CAAC,EACvCy1B,CAAAA,EACFhpB,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,CAAUgpB,CAAM,EAEvCD,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,GAAA,CAAI,WAAA,CAAaqX,CAAS,CAAA,CAEzCX,GACF1W,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAU0W,CAAM,EAEnCrF,CAAAA,EACFrR,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,CAAYqR,CAAQ,EAG3C,IAAM1N,CAAAA,CAAW,MAAM,KAAA,CAAM3D,CAAAA,CAAI,UAAS,CAAG,CAC3C,MAAA,CAAQ,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,GAAKA,CAAAA,CAAK,MAAA,GAAW,EACnC,EAAC,CAGHA,EACJ,GAAA,CAAK0zB,CAAAA,EAAQ,CACZ,IAAMlJ,CAAAA,CAAQgI,EAAAA,CAA0BkB,EAAKA,CAAAA,CAAI,IAAA,EAAQ,EAAE,CAAA,CAC3D,OAAKlJ,EAGE,CAAE,GAAGA,CAAAA,CAAO,OAAA,CAASkJ,CAAAA,CAAI,OAAQ,EAF/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,EAAK,SAAA,CAAA4P,CAAAA,CAAW,OAAAX,CAAAA,CAAQ,QAAA,CAAArF,EAAU,KAAA,CAAA9d,CAAM,CAAA,CAAI41B,CAAAA,CAEhE,OAAOnK,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,MAAM,SAAA,CAAU,CAAE,WAAAiU,CAAAA,CAAY,GAAA,CAAAthB,CAAAA,CAAK,SAAA,CAAA4P,CAAAA,CAAW,MAAA,CAAAX,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA9d,CAAM,CAAC,EAC3F,gBAAA,CAAkB,MAAA,CAElB,QAAS,CAAC,CAAE,UAAA0rB,CAAAA,CAAW,MAAA,CAAAze,CAAO,CAAA,GAAMsoB,EAAAA,CAAmBK,EAAYlK,CAAAA,CAAWze,CAAM,CAAA,CAMpF,gBAAA,CAAmB2e,CAAAA,EAA+B,CAChD,GAAI,EAAAA,CAAAA,CAAS,OAAS5rB,CAAAA,CAAAA,CAGtB,OAAO4rB,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,EACnC,CAAE,UAAA,CAAA8oB,EAAY,GAAA,CAAAthB,CAAAA,CAAK,UAAA4P,CAAAA,CAAW,MAAA,CAAAX,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA9d,CAAM,CAAA,CAAI41B,EAEhE,OAAOtU,uBAAAA,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,QAAA,CAAArF,CAAAA,CAAU,KAAA,CAAA9d,CAAM,CAAC,CAAA,CACpF,QACF,EACA,SAAA,CAAW,CAAA,CACX,QAAS,CAAC,CAAE,MAAA,CAAAiN,CAAO,CAAA,GAAMsoB,EAAAA,CAAmBK,EAAY,MAAA,CAAW3oB,CAAM,CAC3E,CAAC,CACH,CCtJA,IAAMooB,GAAqB,EAAA,CAgD3B,SAASC,GAAgB5oB,CAAAA,CAAkD,CACzE,OAAO,CACL,UAAA,CAAYA,CAAAA,CAAO,UAAA,EAAc,EAAC,CAClC,IAAKA,CAAAA,CAAO,GAAA,EAAK,MAAK,EAAK,MAAA,CAC3B,OAAQA,CAAAA,CAAO,MAAA,EAAQ,IAAA,EAAK,CAAE,WAAA,EAAY,EAAK,OAC/C,QAAA,CAAUA,CAAAA,CAAO,UAAU,IAAA,EAAK,CAAE,aAAY,EAAK,MAAA,CACnD,KAAA,CAAOA,CAAAA,CAAO,KAAA,EAAS2oB,EACzB,CACF,CAEA,eAAeS,GACb,CAAE,UAAA,CAAAN,EAAY,GAAA,CAAAthB,CAAAA,CAAK,OAAAiP,CAAAA,CAAQ,QAAA,CAAArF,EAAU,KAAA,CAAA9d,CAAM,EAC3Cy1B,CAAAA,CACAxoB,CAAAA,CAC4B,CAC5B,IAAM4C,CAAAA,CAAUyN,qBAAAA,CAAc,mBAAA,EAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,2BAAA,CAA6BoD,CAAO,CAAA,CACxDpD,CAAAA,CAAI,aAAa,GAAA,CAAI,OAAA,CAAS,MAAA,CAAOzM,CAAK,CAAC,CAAA,CACvCy1B,GACFhpB,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAUgpB,CAAM,EAEvCD,CAAAA,CAAW,OAAA,CAASd,CAAAA,EAAcjoB,CAAAA,CAAI,YAAA,CAAa,MAAA,CAAO,YAAaioB,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,GAAA,CAAI,UAAA,CAAYqR,CAAQ,CAAA,CAG3C,IAAM1N,CAAAA,CAAW,MAAM,MAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQ,KAAA,CACR,MAAA,CAAAQ,CACF,CAAC,EAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,CAAAA,CAAS,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,EAAI,IAAA,EAAQ,EAAE,EAC3D,OAAKlJ,CAAAA,CAGE,CACL,GAAGA,CAAAA,CAIH,YAAA,CAAcA,CAAAA,CAAM,YAAA,EAAgB,GACpC,KAAA,CAAOkJ,CAAAA,CAAI,MACX,OAAA,CAASA,CAAAA,CAAI,OACf,CAAA,CAVS,IAWX,CAAC,CAAA,CACA,MAAA,CAAQlJ,CAAAA,EAAoC,EAAQA,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,CAAAA,CAAQ,QAAA,CAAArF,CAAAA,CAAU,KAAA,CAAA9d,CAAM,CAAA,CAAI41B,CAAAA,CAErD,OAAOnK,+BAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,UAAA,CAAW,CAAE,UAAA,CAAAiU,CAAAA,CAAY,IAAAthB,CAAAA,CAAK,MAAA,CAAAiP,EAAQ,QAAA,CAAArF,CAAAA,CAAU,MAAA9d,CAAM,CAAC,CAAA,CACjF,gBAAA,CAAkB,MAAA,CAElB,OAAA,CAAS,CAAC,CAAE,SAAA,CAAA0rB,EAAW,MAAA,CAAAze,CAAO,IAAM6oB,EAAAA,CAAoBF,CAAAA,CAAYlK,EAAWze,CAAM,CAAA,CAIrF,iBAAmB2e,CAAAA,EAAgC,CACjD,GAAI,EAAAA,CAAAA,CAAS,OAAS5rB,CAAAA,CAAAA,CAGtB,OAAO4rB,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,GAAG,OACxC,CACF,CAAC,CACH,CCzIA,IAAMoK,EAAAA,CAA8B,CAAA,CAC9BC,GAAyB,EAAA,CAM/B,eAAeC,GACbxY,CAAAA,CACAgO,CAAAA,CAC+B,CAC/B,IAAIpI,CAAAA,CAAcoI,CAAAA,EAAW,MAAA,CACzBnI,CAAAA,CAAgBmI,CAAAA,EAAW,SAC3ByK,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,CAAAA,CAAU,IAAA,CAAOhX,CAAAA,CACVgX,CAAAA,CACR,EAED,IAAA,IAAWA,CAAAA,IAAa4B,EAAsB,CAC5C,GAAIF,GAAmB1B,CAAAA,CAAU,OAAA,GAAY0B,CAAAA,CAAiB,CAC5DA,CAAAA,CAAkB,MAAA,CAClB,QACF,CAIA,GAFAD,GAAqB,CAAA,CAEjBzB,CAAAA,CAAU,OAAO,IAAA,CAAM,CACzBpR,CAAAA,CAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,EAAU,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,CAAAA,CAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,EAAU,QAAA,CAC1B,QACF,CAEA,GAAI6B,CAAAA,CAAa,SAAW,CAAA,CAAG,CAC7BjT,CAAAA,CAAcoR,CAAAA,CAAU,MAAA,CACxBnR,CAAAA,CAAgBmR,EAAU,QAAA,CAC1B,QACF,CAEA,OAAO,CACL,QAASS,EAAAA,CAA4BoB,CAAAA,CAAc7B,CAAAA,CAAWhX,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,EAAc,CACvD,OAAO+N,gCAML,CACA,QAAA,CAAUlK,EAAU,KAAA,CAAM,WAAA,CAAY7D,CAAI,CAAA,CAC1C,gBAAA,CAAkB,MAAA,CAElB,QAAS,MAAO,CAAE,UAAAgO,CAAU,CAAA,GAAkC,CAC5D,IAAMvtB,CAAAA,CAAS,MAAM+3B,EAAAA,CAAWxY,CAAAA,CAAMgO,CAAS,EAC/C,OAAKvtB,CAAAA,CAEEA,EAAO,OAAA,CAFM,EAGtB,CAAA,CAEA,gBAAA,CAAmBytB,GAAqCA,CAAAA,GAAW,CAAC,GAAG,SACzE,CAAC,CACH,CC9HA,IAAM8K,EAAAA,CAAyB,EAAA,CAExB,SAASC,GAA0BjZ,CAAAA,CAAcxJ,CAAAA,CAAalU,EAAQ02B,EAAAA,CAAwB,CACnG,OAAOjL,+BAAAA,CAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,KAAA,CAAM,UAAA,CAAW7D,EAAMxJ,CAAG,CAAA,CAC9C,iBAAkB,MAAA,CAElB,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAjH,CAAO,CAAA,GAAM,CAC7B,GAAI,CACF,IAAM4C,CAAAA,CAAUyN,sBAAc,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,KAAA,CAAOyH,CAAG,CAAA,CAE/B,IAAM9D,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,8BAAA,EAAiCA,EAAS,MAAM,CAAA,CAAE,EAUpE,OAAA,CAPa,MAAMA,EAAS,IAAA,EAAK,EAG9B,MAAM,CAAA,CAAGpQ,CAAK,EACd,GAAA,CAAKwsB,CAAAA,EAAUgI,GAA0BhI,CAAAA,CAAO9O,CAAI,CAAC,CAAA,CACrD,MAAA,CAAQ8O,CAAAA,EAA8B,CAAA,CAAQA,CAAM,CAAA,CAEzC,KACZ,CAACjpB,CAAAA,CAAGtF,IAAM,IAAI,IAAA,CAAKA,EAAE,OAAO,CAAA,CAAE,OAAA,EAAQ,CAAI,IAAI,IAAA,CAAKsF,EAAE,OAAO,CAAA,CAAE,SAChE,CACF,OAASsC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,oCAAA,CAAsCA,CAAK,EAClD,EACT,CACF,CAAA,CAEA,gBAAA,CAAkB,IAAG,CAAA,CACvB,CAAC,CACH,CC5CO,SAAS+wB,EAAAA,CAA8BlZ,CAAAA,CAAc9K,EAAmB,CAC7E,IAAMikB,CAAAA,CAAqBjkB,CAAAA,EAAU,IAAA,EAAK,CAAE,aAAY,CAExD,OAAO6Y,gCAAqB,CAC1B,QAAA,CAAUlK,EAAU,KAAA,CAAM,cAAA,CAAe7D,CAAAA,CAAMmZ,CAAAA,EAAsB,EAAE,CAAA,CACvE,QAAS,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,sBAAc,mBAAA,EAAoB,CAC5C7Q,EAAM,IAAI,GAAA,CAAI,+BAAgCoD,CAAO,CAAA,CAC3DpD,EAAI,YAAA,CAAa,GAAA,CAAI,WAAA,CAAaiR,CAAI,CAAA,CACtCjR,CAAAA,CAAI,aAAa,GAAA,CAAI,UAAA,CAAYoqB,CAAkB,CAAA,CAEnD,IAAMzmB,EAAW,MAAM,KAAA,CAAM3D,CAAAA,CAAI,QAAA,EAAS,CAAG,CAC3C,OAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,EAAS,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,CAAA,EAAKA,CAAAA,CAAK,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,CAAGtF,CAAAA,GAAM,IAAI,IAAA,CAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,OAAA,GAAY,IAAI,IAAA,CAAKsF,EAAE,OAAO,CAAA,CAAE,SAChE,CACF,OAASsC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,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,CAAAA,CAAYhX,CAAAA,EAAM,IAAA,EAAK,EAAK,OAElC,OAAO4D,uBAAAA,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,qBAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,kCAAA,CAAoCoD,CAAO,EAC3D6kB,CAAAA,EACFjoB,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,CAAaioB,CAAS,EAE7CjoB,CAAAA,CAAI,YAAA,CAAa,IAAI,OAAA,CAASmX,CAAAA,CAAM,UAAU,CAAA,CAE9C,IAAMxT,CAAAA,CAAW,MAAM,KAAA,CAAM3D,EAAI,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,CAAA,CAK3E,OAAA,CAFa,MAAMA,CAAAA,CAAS,MAAK,EAErB,GAAA,CAAI,CAAC,CAAE,GAAA,CAAA8D,EAAK,KAAA,CAAAqb,CAAM,CAAA,IAAO,CAAE,GAAA,CAAArb,CAAAA,CAAK,MAAAqb,CAAM,CAAA,CAAE,CACtD,CAAA,MAAS1pB,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,2CAAA,CAA6CA,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,EAAY,CAExD,OAAO6Y,+BAAAA,CAAqB,CAC1B,SAAUlK,CAAAA,CAAU,KAAA,CAAM,eAAe7D,CAAAA,CAAMmZ,CAAAA,EAAsB,EAAE,CAAA,CACvE,OAAA,CAAS,CAAA,CAAQA,CAAAA,CACjB,gBAAA,CAAkB,MAAA,CAElB,QAAS,MAAO,CAAE,OAAA5pB,CAAO,CAAA,GAAM,CAC7B,GAAI,CAAC4pB,CAAAA,CACH,OAAO,EAAC,CAGV,GAAI,CACF,IAAMhnB,EAAUyN,qBAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,4BAAA,CAA8BoD,CAAO,EACzDpD,CAAAA,CAAI,YAAA,CAAa,IAAI,WAAA,CAAaiR,CAAI,EACtCjR,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,CAAYoqB,CAAkB,CAAA,CAEnD,IAAMzmB,CAAAA,CAAW,MAAM,MAAM3D,CAAAA,CAAI,QAAA,GAAY,CAC3C,MAAA,CAAQ,KAAA,CACR,MAAA,CAAAQ,CACF,CAAC,EAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsCA,CAAAA,CAAS,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,GAAA,CAAKwqB,CAAAA,EAAUgI,EAAAA,CAA0BhI,CAAAA,CAAO9O,CAAI,CAAC,CAAA,CACrD,OAAQ8O,CAAAA,EAA8B,CAAA,CAAQA,CAAM,CAAA,CAEvD,OAAIsK,CAAAA,CAAU,MAAA,GAAW,CAAA,CAChB,GAGFA,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,MAAM,yCAAA,CAA2CA,CAAK,EACxDA,CACR,CACF,EAEA,gBAAA,CAAkB,IAAG,CAAA,CACvB,CAAC,CACH,CC5DO,SAASoxB,EAAAA,CAAoCvZ,EAAc,CAChE,OAAO4D,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,oBAAA,CAAqB7D,CAAI,EACnD,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAzQ,CAAO,CAAA,GAAqC,CAC5D,GAAI,CACF,IAAM4C,CAAAA,CAAUyN,qBAAAA,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,CAAAA,CAAI,QAAA,EAAS,CAAG,CAC3C,OAAQ,KAAA,CACR,MAAA,CAAAQ,CACF,CAAC,CAAA,CAED,GAAI,CAACmD,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,2CAA2CA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAK9E,OAAA,CAFa,MAAMA,CAAAA,CAAS,IAAA,EAAK,EAErB,GAAA,CAAI,CAAC,CAAE,OAAA+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,IAAA,CACV,CACA,OAAOlM,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,MAAM,SAAA,CAAU4N,CAAAA,EAAM,QAAU,EAAA,CAAIA,CAAAA,EAAM,QAAA,EAAY,EAAE,CAAA,CAC5E,OAAA,CAAS3B,GAAW,CAAC,CAAC2B,EACtB,OAAA,CAAS,SAAYqB,GAAcrB,CAAI,CACzC,CAAC,CACH,CCsBA,SAASgI,EAAAA,CAAQtN,CAAAA,CAAwB,CACvC,OACE,CAAC,CAACA,CAAAA,EACF,OAAOA,CAAAA,EAAM,QAAA,EACb,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,OAAA,EAAQ,GAC3B,GAAA,CAAO,EAAA,CAAK,GAAK,EAAA,CACpC,CAUO,SAASC,EAAAA,CACd3kB,CAAAA,CACApB,EAKA,CACA,GAAM,CAAE,KAAA,CAAAxR,CAAAA,CAAQ,GAAI,OAAA,CAAAw3B,CAAAA,CAAU,EAAC,CAAG,QAAA,CAAAC,EAAW,CAAI,CAAA,CAAIjmB,CAAAA,EAAW,EAAC,CAEjE,OAAOia,gCAML,CACA,QAAA,CAAUlK,EAAU,QAAA,CAAS,WAAA,CAAY3O,EAAU5S,CAAK,CAAA,CACxD,gBAAA,CAAkB,CAAE,KAAA,CAAO,EAAG,EAE9B,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,IAA2C,CACrE,GAAM,CAAE,KAAA,CAAAprB,CAAM,CAAA,CAAIorB,EAEZtb,CAAAA,CAAY,MAAMvB,EAAQ,mCAAA,CAAqC,CAAC+D,EAAUtS,CAAAA,CAAON,CAAAA,CAAO,GAAGw3B,CAAO,CAAC,EAQnGr5B,CAAAA,CANqCiS,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,MAAA,CAC1BC,CAAAA,EACCA,CAAAA,CAAS,KAAA,GAAU/kB,GACnB+kB,CAAAA,CAAS,MAAA,GAAW,GACpBP,EAAAA,CAAQO,CAAAA,CAAS,SAAS,CAAA,EAAKF,CACnC,CAAA,CAEMG,CAAAA,CAAmB,EAAC,CAC1B,QAAWtiB,CAAAA,IAAOnX,CAAAA,CAAQ,CACxB,IAAMgxB,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,IAAA,CAAKzI,CAAI,EACtC,CAEA,GAAM,CAAC0I,CAAY,EAAIznB,CAAAA,CAEvB,OAAO,CACL,QAAA,CAAUynB,CAAAA,CAAeT,EAAAA,CAAQS,CAAAA,CAAa,CAAC,CAAA,CAAE,SAAS,CAAA,CAAI,CAAA,CAC9D,gBAAiBA,CAAAA,CAAeA,CAAAA,CAAa,CAAC,CAAA,CAAIv3B,CAAAA,CAClD,OAAA,CAAAs3B,CACF,CACF,CAAA,CAEA,iBAAmBhM,CAAAA,GAAqD,CACtE,MAAOA,CAAAA,CAAS,eAClB,EACF,CAAC,CACH,CCtHO,SAASkM,GACdxT,CAAAA,CACAxG,CAAAA,CACA0P,EAAU,IAAA,CACV,CACA,OAAOlM,uBAAAA,CAAa,CAClB,QAAA,CAAUC,EAAU,QAAA,CAAS,QAAA,CAAS+C,EAAUxG,CAAAA,EAAY,EAAE,EAC9D,OAAA,CAAS0P,CAAAA,EAAWlJ,CAAAA,CAAS,MAAA,CAAS,CAAA,CACtC,OAAA,CAAS,SAAYuM,EAAAA,CAAYvM,CAAAA,CAAUxG,CAAQ,CACrD,CAAC,CACH,CCkBO,SAASia,GACdnlB,CAAAA,CACA8S,CAAAA,CAA4B,OAC5BH,CAAAA,CAAW,GAAA,CACX,CACA,OAAOkG,+BAAAA,CAML,CACA,QAAA,CAAUlK,CAAAA,CAAU,OAAO,cAAA,CACzB3O,CAAAA,EAAY,GACZ8S,CAAAA,CACAH,CACF,EACA,gBAAA,CAAkB,IAAA,CAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAmG,EAAW,MAAA,CAAAze,CAAO,IAAM,CACxC,GAAI,CAAC2F,CAAAA,CACH,OAAO,CAAE,OAAA,CAAS,EAAC,CAAG,YAAa,CAAE,CAAA,CAGvC,IAAMlG,CAAAA,CAA0C,CAC9C,eAAgBkG,CAAAA,CAChB,WAAA,CAAa8S,CAAAA,CACb,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,CAAAA,CAAS,iBAAA,CAClB,WAAA,CAAasb,CAAAA,EAAatb,EAAS,WACrC,CACF,EAEA,gBAAA,CAAmBwb,CAAAA,EAAa,CAE9B,IAAMqB,CAAAA,CAAWrB,CAAAA,CAAS,WAAA,CAAc,CAAA,CACxC,OAAOqB,GAAY,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,wBAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,iBAAA,CACzB3O,GAAY,EAAA,CACZ8S,CAAAA,CACAC,CACF,CAAA,CAEA,OAAA,CAAS,SACF/S,EAIG,MAAMpD,EAAAA,CACZ,UACA,6CAAA,CACA,CACE,eAAgBoD,CAAAA,CAChB,WAAA,CAAa8S,CAAAA,CACb,WAAA,CAAAC,CACF,CACF,EAXS,EAAC,CAcZ,QAAS,CAAC,CAAC/S,EACX,SAAA,CAAW,GACb,CAAC,CACH,CC1BO,SAASqlB,EAAAA,EAA4B,CAC1C,OAAO3W,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,QAAA,CAAS,YAAW,CACxC,OAAA,CAAS,SAAY,CACnB,IAAMnR,EAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,cAAA,CAAiB,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,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,UAAW,GAAA,CAAS,GACtB,CAAC,CACH,CAGO,SAAS8nB,EAAAA,CAAcC,CAAAA,CAAiC,CAC7D,OAAO,IAAI,GAAA,CAAA,CAAKA,GAAW,EAAC,EAAG,IAAKC,CAAAA,EAAMA,CAAAA,CAAE,aAAa,CAAC,CAC5D,CCmBO,SAASC,EAAAA,CACdzlB,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,IAAM6d,CAAAA,CAAcC,2BAAe,CAE7B,CAAE,IAAA,CAAAv2B,CAAK,CAAA,CAAIie,mBAAAA,CAASsH,EAA2B3U,CAAQ,CAAC,EAE9D,OAAO+I,CAAAA,CACL,CAAC,UAAA,CAAY,QAAQ,CAAA,CACrB/I,CAAAA,CACCmJ,CAAAA,EAA8B,CAQ7B,IAAMnD,CAAAA,CAAUgQ,EAAAA,CACd0P,EAAY,YAAA,CACV/Q,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QACvC,EACA5Q,CACF,CAAA,CAEA,GAAI,CAAC4W,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,2DAAsD,CAAA,CAGxE,OAAO,CACL,CACE,iBAAA,CACA,CACE,QAAShG,CAAAA,CACT,aAAA,CAAe,GACf,UAAA,CAAY,GAIZ,qBAAA,CAAuBqW,EAAAA,CAAyB,CAC9C,2BAAA,CAA6BrQ,CAAAA,CAAQ,qBAAA,CACrC,QAASmD,CAAAA,CAAQ,OAAA,CACjB,OAAQA,CAAAA,CAAQ,MAClB,CAAC,CACH,CACF,CACF,CACF,CAAA,CACA,MAAOyc,EAAgBC,CAAAA,GAAgC,CAErDH,EAAY,YAAA,CACV/Q,CAAAA,CAA2B3U,CAAQ,CAAA,CAAE,QAAA,CACpC5Q,GAAS,CACR,GAAI,CAACA,CAAAA,CACH,OAAOA,EAGT,IAAMsT,CAAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAUtT,CAAI,CAAC,CAAA,CAC3C,OAAAsT,CAAAA,CAAI,OAAA,CAAUgU,GAAqB,CACjC,eAAA,CAAiBX,GAAsB3mB,CAAI,CAAA,CAC3C,OAAA,CAASy2B,CAAAA,CAAU,OAAA,CACnB,MAAA,CAAQA,EAAU,MACpB,CAAC,EAEMnjB,CACT,CACF,EAGA,MAAM+G,CAAAA,CAAyBhC,CAAAA,EAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,OACA,CACE,aAAA,CAAAI,EAMA,QAAA,CAAU,SAAY,CACpB,GAAK7H,CAAAA,CAGL,GAAI,CACF,MAAM0lB,CAAAA,CAAY,UAAA,CAAW,CAC3B,GAAG/Q,EAA2B3U,CAAQ,CAAA,CACtC,UAAW,CACb,CAAC,EACH,CAAA,KAAQ,CAER,CACF,CACF,CACF,CACF,CC3JO,SAAS8lB,GACdlU,CAAAA,CACAjlB,CAAAA,CACA8a,CAAAA,CACAwB,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,YAAa,CAAC,UAAA,CAAY,WAAY,QAAA,CAAU0I,CAAAA,CAAWjlB,CAAM,CAAA,CACjE,UAAA,CAAY,MAAOq5B,CAAAA,EAAe,CAChC,IAAMC,CAAAA,CAAiBxN,EAAAA,CACrB7G,EACAjlB,CACF,CAAA,CACA,MAAMkgB,CAAAA,EAAe,CAAE,aAAA,CAAcoZ,CAAc,CAAA,CACnD,IAAMC,EAAiBrZ,CAAAA,EAAe,CAAE,aACtCoZ,CAAAA,CAAe,QACjB,CAAA,CAEA,OAAA,MAAM3c,EAAAA,CACJsI,CAAAA,CACA,SACA,CACA,QAAA,CACA,CACE,QAAA,CAAUA,CAAAA,CACV,UAAWjlB,CAAAA,CACX,IAAA,CAAM,CACJ,GAAIq5B,CAAAA,GAAS,eAAA,EAAmB,CAACE,CAAAA,EAAgB,OAAA,CAC7C,CAAC,QAAQ,CAAA,CACT,EAAC,CACL,GAAIF,IAAS,eAAA,EAAmB,CAACE,GAAgB,OAAA,CAC7C,CAAC,MAAM,CAAA,CACP,EACN,CACF,CACA,CAAA,CACAze,CACF,CAAA,CAEO,CACL,GAAGye,CAAAA,CACH,OAAA,CACEF,IAAS,eAAA,CACL,CAACE,GAAgB,OAAA,CACjBA,CAAAA,EAAgB,OAAA,CACtB,OAAA,CACEF,CAAAA,GAAS,eAAA,CACL,CAACE,CAAAA,EAAgB,OAAA,CACjBA,GAAgB,OACxB,CACF,EACA,OAAA,CAAAH,CAAAA,CACA,SAAA,CAAU32B,CAAAA,CAAM,CACd6Z,CAAAA,CAAU7Z,CAAI,CAAA,CAEdyd,CAAAA,GAAiB,YAAA,CACf8B,CAAAA,CAAU,SAAS,SAAA,CAAUiD,CAAAA,CAAYjlB,CAAO,CAAA,CAChDyC,CACF,EAIIzC,CAAAA,EACFkgB,CAAAA,GAAiB,iBAAA,CACf8H,CAAAA,CAA2BhoB,CAAM,CACnC,EAEJ,CACF,CAAC,CACH,CC/DO,SAASw5B,EAAAA,CACdnU,CAAAA,CACAzB,EACAC,CAAAA,CACA4V,CAAAA,CACW,CACX,GAAI,CAACpU,CAAAA,EAAS,CAACzB,CAAAA,EAAU,CAACC,EACxB,MAAM,IAAI,MAAM,gDAAgD,CAAA,CAElE,GAAI4V,CAAAA,CAAS,IAAA,EAAUA,CAAAA,CAAS,GAAA,CAC9B,MAAM,IAAI,MAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,MAAA,CACA,CACE,KAAA,CAAApU,CAAAA,CACA,OAAAzB,CAAAA,CACA,QAAA,CAAAC,EACA,MAAA,CAAA4V,CACF,CACF,CACF,CAaO,SAASC,EAAAA,CACd9V,CAAAA,CACAC,CAAAA,CACA8V,CAAAA,CACAC,CAAAA,CACAhF,CAAAA,CACArnB,EACAgd,CAAAA,CACW,CAEX,GAAI,CAAC3G,CAAAA,EAAU,CAACC,CAAAA,EAAY+V,CAAAA,GAAmB,MAAA,EAAa,CAACrsB,CAAAA,CAC3D,MAAM,IAAI,KAAA,CAAM,mDAAmD,EAGrE,OAAO,CACL,UACA,CACE,aAAA,CAAeosB,CAAAA,CACf,eAAA,CAAiBC,CAAAA,CACjB,MAAA,CAAAhW,EACA,QAAA,CAAAC,CAAAA,CACA,MAAA+Q,CAAAA,CACA,IAAA,CAAArnB,EACA,aAAA,CAAe,IAAA,CAAK,UAAUgd,CAAY,CAC5C,CACF,CACF,CAaO,SAASsP,EAAAA,CACdjW,CAAAA,CACAC,EACAiW,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACtW,CAAAA,EAAU,CAACC,CAAAA,CACd,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,MAAA,CAAAD,CAAAA,CACA,SAAAC,CAAAA,CACA,mBAAA,CAAqBiW,EACrB,WAAA,CAAaC,CAAAA,CACb,WAAA,CAAaC,CAAAA,CACb,sBAAA,CAAwBC,CAAAA,CACxB,WAAAC,CACF,CACF,CACF,CAQO,SAASC,GAAqBvW,CAAAA,CAAgBC,CAAAA,CAA6B,CAChF,GAAI,CAACD,GAAU,CAACC,CAAAA,CACd,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAG3E,OAAO,CACL,gBAAA,CACA,CACE,MAAA,CAAAD,EACA,QAAA,CAAAC,CACF,CACF,CACF,CAUO,SAASuW,EAAAA,CACd/gB,CAAAA,CACAuK,CAAAA,CACAC,CAAAA,CACAwW,CAAAA,CAAwB,KAAA,CACb,CACX,GAAI,CAAChhB,GAAW,CAACuK,CAAAA,EAAU,CAACC,CAAAA,CAC1B,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAGpE,IAAMuI,CAAAA,CAAY,CAChB,QAAA/S,CAAAA,CACA,MAAA,CAAAuK,EACA,QAAA,CAAAC,CACF,EAEA,OAAIwW,CAAAA,GACFjO,EAAK,MAAA,CAAS,QAAA,CAAA,CAGT,CACL,aAAA,CACA,CACE,GAAI,QAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,QAAA,CAAUA,CAAI,CAAC,CAAA,CACrC,eAAgB,EAAC,CACjB,uBAAwB,CAAC/S,CAAO,CAClC,CACF,CACF,CC9JO,SAASihB,EAAAA,CACdzjB,CAAAA,CACAC,EACA3S,CAAAA,CACAiS,CAAAA,CACW,CACX,GAAI,CAACS,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,EACnB,MAAM,IAAI,MAAM,oDAAoD,CAAA,CAGtE,OAAO,CACL,UAAA,CACA,CACE,IAAA,CAAA0S,CAAAA,CACA,GAAAC,CAAAA,CACA,MAAA,CAAA3S,EACA,IAAA,CAAMiS,CAAAA,EAAQ,EAChB,CACF,CACF,CAUO,SAASmkB,EAAAA,CACd1jB,CAAAA,CACA2jB,EACAr2B,CAAAA,CACAiS,CAAAA,CACa,CACb,GAAI,CAACS,GAAQ,CAAC2jB,CAAAA,EAAgB,CAACr2B,CAAAA,CAC7B,MAAM,IAAI,MAAM,0DAA0D,CAAA,CAU5E,OANkBq2B,CAAAA,CACf,IAAA,GACA,KAAA,CAAM,QAAQ,CAAA,CACd,MAAA,CAAO,OAAO,CAAA,CAGA,IAAKC,CAAAA,EACpBH,EAAAA,CAAgBzjB,EAAM4jB,CAAAA,CAAK,IAAA,GAAQt2B,CAAAA,CAAQiS,CAAI,CACjD,CACF,CAYO,SAASskB,EAAAA,CACd7jB,CAAAA,CACAC,EACA3S,CAAAA,CACAiS,CAAAA,CACAukB,EACAC,CAAAA,CACW,CACX,GAAI,CAAC/jB,CAAAA,EAAQ,CAACC,GAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA,CAE/E,GAAIw2B,CAAAA,CAAa,EAAA,CACf,MAAM,IAAI,MAAM,sEAAsE,CAAA,CAGxF,OAAO,CACL,oBAAA,CACA,CACE,IAAA,CAAA9jB,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,MAAA,CAAA3S,CAAAA,CACA,KAAMiS,CAAAA,EAAQ,EAAA,CACd,WAAAukB,CAAAA,CACA,UAAA,CAAAC,EACA,UAAA,CAAY,EACd,CACF,CACF,CAUO,SAASC,EAAAA,CACdhkB,EACAC,CAAAA,CACA3S,CAAAA,CACAiS,EACW,CACX,GAAI,CAACS,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,6DAA6D,EAG/E,OAAO,CACL,qBAAA,CACA,CACE,IAAA,CAAA0S,CAAAA,CACA,GAAAC,CAAAA,CACA,MAAA,CAAA3S,EACA,IAAA,CAAMiS,CAAAA,EAAQ,EAChB,CACF,CACF,CAWO,SAAS0kB,EAAAA,CACdjkB,CAAAA,CACAC,EACA3S,CAAAA,CACAiS,CAAAA,CACA2kB,EACW,CACX,GAAI,CAAClkB,CAAAA,EAAQ,CAACC,GAAM,CAAC3S,CAAAA,EAAU42B,IAAc,MAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,+DAA+D,EAGjF,OAAO,CACL,uBAAA,CACA,CACE,IAAA,CAAAlkB,CAAAA,CACA,GAAAC,CAAAA,CACA,MAAA,CAAA3S,EACA,IAAA,CAAMiS,CAAAA,EAAQ,GACd,UAAA,CAAY2kB,CACd,CACF,CACF,CAQO,SAASC,GACdnkB,CAAAA,CACAkkB,CAAAA,CACW,CACX,GAAI,CAAClkB,GAAQkkB,CAAAA,GAAc,MAAA,CACzB,MAAM,IAAI,KAAA,CAAM,qEAAqE,EAGvF,OAAO,CACL,+BACA,CACE,IAAA,CAAAlkB,EACA,UAAA,CAAYkkB,CACd,CACF,CACF,CAYO,SAASE,EAAAA,CACdpkB,CAAAA,CACAC,EACA3S,CAAAA,CACAiS,CAAAA,CACA2kB,EACa,CACb,GAAI,CAAClkB,CAAAA,EAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,EAAU42B,CAAAA,GAAc,OAC3C,MAAM,IAAI,MAAM,0DAA0D,CAAA,CAG5E,OAAO,CACLD,EAAAA,CAA2BjkB,CAAAA,CAAMC,EAAI3S,CAAAA,CAAQiS,CAAAA,CAAM2kB,CAAS,CAAA,CAC5DC,EAAAA,CAAiCnkB,EAAMkkB,CAAS,CAClD,CACF,CASO,SAASG,EAAAA,CACdrkB,EACAC,CAAAA,CACA3S,CAAAA,CACW,CACX,GAAI,CAAC0S,GAAQ,CAACC,CAAAA,EAAM,CAAC3S,CAAAA,CACnB,MAAM,IAAI,KAAA,CAAM,6DAA6D,EAG/E,OAAO,CACL,sBACA,CACE,IAAA,CAAA0S,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,MAAA,CAAA3S,CACF,CACF,CACF,CAQO,SAASg3B,EAAAA,CACd9hB,EACA+hB,CAAAA,CACW,CACX,GAAI,CAAC/hB,CAAAA,EAAW,CAAC+hB,EACf,MAAM,IAAI,MAAM,2DAA2D,CAAA,CAG7E,OAAO,CACL,kBAAA,CACA,CACE,OAAA,CAAA/hB,CAAAA,CACA,cAAA,CAAgB+hB,CAClB,CACF,CACF,CASO,SAASC,EAAAA,CACdC,EACAC,CAAAA,CACAH,CAAAA,CACW,CACX,GAAI,CAACE,GAAa,CAACC,CAAAA,EAAa,CAACH,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,yBAAA,CACA,CACE,SAAA,CAAAE,CAAAA,CACA,UAAAC,CAAAA,CACA,cAAA,CAAgBH,CAClB,CACF,CACF,CAUO,SAASI,EAAAA,CACdC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACH,GAAe,CAACC,CAAAA,EAAaC,CAAAA,GAAY,MAAA,CAC5C,MAAM,IAAI,MAAM,mEAAmE,CAAA,CAErF,GAAIA,CAAAA,CAAU,CAAA,EAAKA,EAAU,GAAA,CAC3B,MAAM,IAAI,KAAA,CAAM,2EAA2E,EAG7F,OAAO,CACL,6BACA,CACE,YAAA,CAAcF,EACd,UAAA,CAAYC,CAAAA,CACZ,OAAA,CAAAC,CAAAA,CACA,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,GACd1jB,CAAAA,CACAjU,CAAAA,CACA42B,EACW,CACX,GAAI,CAAC3iB,CAAAA,EAAS,CAACjU,GAAU42B,CAAAA,GAAc,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,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,YAAA,CAAAqlB,CAAAA,CAAc,eAAAF,CAAAA,CAAgB,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,EACAC,CAAAA,CACW,CACX,GAAI,CAACzlB,CAAAA,EAAQ,CAACwlB,CAAAA,EAAcC,CAAAA,GAAU,OACpC,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,EACD,cAAA,CAAgB,GAChB,sBAAA,CAAwB,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,EACD,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAAS8X,EAAAA,CAAgB9X,CAAAA,CAAkBJ,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,uBAAwB,CAACI,CAAQ,CACnC,CACF,CACF,CAQO,SAAS+X,EAAAA,CAAc/X,EAAkBJ,CAAAA,CAA8B,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,EAAkBJ,CAAAA,CAA8B,CAC9E,GAAI,CAACI,CAAAA,EAAY,CAACJ,CAAAA,CAChB,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,EAAsB,CAC1B,aAAA,CACA,CACE,EAAA,CAAI,QAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,aAAA,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,EAEA,OAAO,CAAC0pB,EAAUC,CAAc,CAClC,CChIO,SAASC,EAAAA,CACd5jB,EACAyM,CAAAA,CACAoX,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,uBAAA,CACA,CACE,QAAA/jB,CAAAA,CACA,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,EAAU,IAAI,IAAA,CAAKnK,EAAQ,GAAG,CAAA,CACpC,GAAIkK,CAAAA,CAAU,QAAA,KAAe,cAAA,EAAkBC,CAAAA,CAAQ,QAAA,EAAS,GAAM,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,GACdlY,CAAAA,CACAmY,CAAAA,CACAN,EACW,CACX,GAAI,CAAC7X,CAAAA,EAAS,CAACmY,GAAeA,CAAAA,CAAY,MAAA,GAAW,CAAA,EAAKN,CAAAA,GAAY,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,MAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,cAAA,CAAgBE,CAAAA,CAChB,aAAcF,CAAAA,CACd,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,EACA,SAAA,CAAWM,CAAAA,CACX,QAAAC,CAAAA,CACA,QAAA,CAAAha,EACA,UAAA,CAAY,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,EAAkB+d,CAAAA,CAA8B,CACjF,GAAI,CAAC/d,CAAAA,EAAY,CAAC+d,CAAAA,CAChB,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,EAAC,CACjB,sBAAA,CAAwB,CAAC/d,CAAQ,CACnC,CACF,CACF,CAUO,SAAS2qB,EAAAA,CACd3qB,EACA+d,CAAAA,CACA/X,CAAAA,CACA9F,EACW,CACX,GAAI,CAACF,CAAAA,EAAY,CAAC+d,GAAa,CAAC/X,CAAAA,EAAW,CAAC9F,CAAAA,CAC1C,MAAM,IAAI,KAAA,CACR,CAAA,4DAAA,EAA+DF,CAAQ,eAAe+d,CAAS,CAAA,UAAA,EAAa/X,CAAO,CAAA,OAAA,EAAU9F,CAAI,EACnI,CAAA,CAGF,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,YACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CAAC,SAAA,CAAW,CAAE,SAAA,CAAA6d,CAAAA,CAAW,OAAA,CAAA/X,CAAAA,CAAS,IAAA,CAAA9F,CAAK,CAAC,CAAC,CAAA,CAC9D,eAAgB,EAAC,CACjB,uBAAwB,CAACF,CAAQ,CACnC,CACF,CACF,CAqBO,SAAS4qB,EAAAA,CACd5qB,EACA+d,CAAAA,CACAve,CAAAA,CACW,CACX,GAAI,CAACQ,CAAAA,EAAY,CAAC+d,CAAAA,EAAa,CAACve,EAC9B,MAAM,IAAI,MAAM,2DAA2D,CAAA,CAG7E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CAAC,cAAe,CAAE,SAAA,CAAAue,EAAW,KAAA,CAAAve,CAAM,CAAC,CAAC,CAAA,CAC1D,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,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,CAAAA,EAAa,CAAC/X,CAAAA,EAAW,CAACwK,GAAYsa,CAAAA,GAAQ,MAAA,CAC9D,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAKrE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,YACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CANVA,CAAAA,CAAM,UAAY,WAAA,CAMC,CAAE,SAAA,CAAA/M,CAAAA,CAAW,OAAA,CAAA/X,CAAAA,CAAS,SAAAwK,CAAS,CAAC,CAAC,CAAA,CAC/D,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAACxQ,CAAQ,CACnC,CACF,CACF,CAYO,SAAS+qB,EAAAA,CACd/qB,CAAAA,CACA+d,EACA/X,CAAAA,CACAwK,CAAAA,CACAwa,CAAAA,CACAC,CAAAA,CACW,CACX,GACE,CAACjrB,CAAAA,EACD,CAAC+d,GACD,CAAC/X,CAAAA,EACD,CAACwK,CAAAA,EACDya,CAAAA,GAAS,MAAA,CAET,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAKtE,OAAO,CACL,aAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CANVA,CAAAA,CAAO,WAAa,YAAA,CAMD,CAAE,UAAAlN,CAAAA,CAAW,OAAA,CAAA/X,EAAS,QAAA,CAAAwK,CAAAA,CAAU,MAAAwa,CAAM,CAAC,CAAC,CAAA,CACtE,cAAA,CAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CAWO,SAASkrB,GACdlrB,CAAAA,CACA+d,CAAAA,CACA/X,EACAglB,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACjrB,CAAAA,EAAY,CAAC+d,CAAAA,EAAa,CAAC/X,GAAWilB,CAAAA,GAAS,MAAA,CAClD,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAKtE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,YACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CANVA,CAAAA,CAAO,WAAa,YAAA,CAMD,CAAE,UAAAlN,CAAAA,CAAW,OAAA,CAAA/X,EAAS,KAAA,CAAAglB,CAAM,CAAC,CAAC,CAAA,CAC5D,eAAgB,EAAC,CACjB,sBAAA,CAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CAWO,SAASmrB,EAAAA,CACdnrB,CAAAA,CACA+d,EACA/X,CAAAA,CACAwK,CAAAA,CACAwa,CAAAA,CACW,CACX,GAAI,CAAChrB,GAAY,CAAC+d,CAAAA,EAAa,CAAC/X,CAAAA,EAAW,CAACwK,EAC1C,MAAM,IAAI,KAAA,CAAM,oDAAoD,CAAA,CAGtE,OAAO,CACL,aAAA,CACA,CACE,GAAI,WAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CAAC,WAAY,CAAE,SAAA,CAAAuN,EAAW,OAAA,CAAA/X,CAAAA,CAAS,SAAAwK,CAAAA,CAAU,KAAA,CAAAwa,CAAM,CAAC,CAAC,CAAA,CAC1E,cAAA,CAAgB,EAAC,CACjB,uBAAwB,CAAChrB,CAAQ,CACnC,CACF,CACF,CCvPO,IAAKorB,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,GAAA,CAAM,KAAA,CACNA,CAAAA,CAAA,KAAO,MAAA,CAFGA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IAQAC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,MAAQ,EAAA,CACRA,CAAAA,CAAA,IAAA,CAAO,GAAA,CAFGA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,EAeL,SAASC,EAAAA,CACdvmB,CAAAA,CACAwmB,EACAC,CAAAA,CACAC,CAAAA,CACAlsB,EACAmsB,CAAAA,CACW,CACX,GAAI,CAAC3mB,CAAAA,EAAS,CAACwmB,CAAAA,EAAgB,CAACC,GAAgB,CAACjsB,CAAAA,EAAcmsB,IAAY,MAAA,CACzE,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,oBAAA,CACA,CACE,KAAA,CAAA3mB,CAAAA,CACA,QAAS2mB,CAAAA,CACT,cAAA,CAAgBH,CAAAA,CAChB,cAAA,CAAgBC,CAAAA,CAChB,YAAA,CAAcC,EACd,UAAA,CAAAlsB,CACF,CACF,CACF,CAKA,SAASosB,EAAAA,CAAat/B,CAAAA,CAAeu/B,CAAAA,CAAmB,CAAA,CAAW,CACjE,OAAOv/B,EAAM,OAAA,CAAQu/B,CAAQ,CAC/B,CAqBO,SAASC,GACd9mB,CAAAA,CACAwmB,CAAAA,CACAC,EACAM,CAAAA,CACAC,CAAAA,CAA0B,GACf,CAEX,GACE,CAAChnB,CAAAA,EACD+mB,CAAAA,GAAc,QACd,CAAC,MAAA,CAAO,QAAA,CAASP,CAAY,CAAA,EAC7BA,CAAAA,EAAgB,GAChB,CAAC,MAAA,CAAO,SAASC,CAAY,CAAA,EAC7BA,GAAgB,CAAA,CAEhB,MAAM,IAAI,KAAA,CAAM,sEAAsE,CAAA,CAIxF,IAAMjsB,CAAAA,CAAa,IAAI,KAAK,IAAA,CAAK,GAAA,EAAK,CAAA,CACtCA,CAAAA,CAAW,OAAA,CAAQA,CAAAA,CAAW,OAAA,EAAQ,CAAI,EAAE,CAAA,CAC5C,IAAMysB,EAAgBzsB,CAAAA,CAAW,WAAA,GAAc,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAGrDmsB,EAAU,CACd,CAAA,EAAGK,CAAQ,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,EAAI,CAAI,GAAI,CAAA,CACvC,QAAA,GACA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAMPE,CAAAA,CACJH,IAAc,KAAA,CACV,CAAA,EAAGH,EAAAA,CAAaJ,CAAAA,CAAc,CAAC,CAAC,OAChC,CAAA,EAAGI,EAAAA,CAAaJ,EAAc,CAAC,CAAC,QAEhCW,CAAAA,CACJJ,CAAAA,GAAc,KAAA,CACV,CAAA,EAAGH,EAAAA,CAAaH,CAAAA,CAAc,CAAC,CAAC,CAAA,KAAA,CAAA,CAChC,GAAGG,EAAAA,CAAaH,CAAAA,CAAc,CAAC,CAAC,CAAA,IAAA,CAAA,CAEtC,OAAOF,EAAAA,CACLvmB,CAAAA,CACAknB,EACAC,CAAAA,CACA,KAAA,CACAF,EACAN,CACF,CACF,CAQO,SAASS,EAAAA,CAAwBpnB,CAAAA,CAAe2mB,CAAAA,CAA4B,CACjF,GAAI,CAAC3mB,CAAAA,EAAS2mB,CAAAA,GAAY,OACxB,MAAM,IAAI,MAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,oBAAA,CACA,CACE,MAAA3mB,CAAAA,CACA,OAAA,CAAS2mB,CACX,CACF,CACF,CAUO,SAASU,EAAAA,CACdpmB,CAAAA,CACAqmB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACW,CACX,GAAI,CAACvmB,GAAW,CAACqmB,CAAAA,EAAc,CAACC,CAAAA,EAAa,CAACC,EAC5C,MAAM,IAAI,MAAM,8DAA8D,CAAA,CAGhF,OAAO,CACL,sBAAA,CACA,CACE,OAAA,CAAAvmB,CAAAA,CACA,WAAA,CAAaqmB,CAAAA,CACb,UAAA,CAAYC,CAAAA,CACZ,aAAcC,CAChB,CACF,CACF,CCtKO,SAASC,GACdxmB,CAAAA,CACAjB,CAAAA,CACA0nB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAzV,CAAAA,CACW,CACX,GAAI,CAAClR,GAAW,CAAC2mB,CAAAA,CACf,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAG3E,OAAO,CACL,iBACA,CACE,OAAA,CAAA3mB,EACA,KAAA,CAAAjB,CAAAA,CACA,OAAA0nB,CAAAA,CACA,OAAA,CAAAC,EACA,QAAA,CAAUC,CAAAA,CACV,cAAezV,CACjB,CACF,CACF,CAUO,SAAS0V,GACd5mB,CAAAA,CACAkR,CAAAA,CACApB,CAAAA,CACA+Q,CAAAA,CACW,CACX,GAAI,CAAC7gB,CAAAA,EAAW8P,CAAAA,GAAwB,OACtC,MAAM,IAAI,MAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,QAAA9P,CAAAA,CACA,aAAA,CAAekR,GAAgB,EAAA,CAC/B,qBAAA,CAAuBpB,EACvB,UAAA,CAAa+Q,CAAAA,EAAc,EAC7B,CACF,CACF,CAoBO,SAASgG,EAAAA,CACd5C,EACA6C,CAAAA,CACA/tB,CAAAA,CACAguB,EACW,CACX,GAAI,CAAC9C,CAAAA,EAAW,CAAC6C,GAAkB,CAAC/tB,CAAAA,EAAQ,CAACguB,CAAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,yDAAyD,CAAA,CAG3E,IAAMhoB,CAAAA,CAAmB,CACvB,iBAAkB,CAAA,CAClB,aAAA,CAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAAChG,CAAAA,CAAK,cAAA,CAAgB,CAAC,CAAC,CACtC,EAEM0tB,CAAAA,CAAoB,CACxB,iBAAkB,CAAA,CAClB,aAAA,CAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAAC1tB,CAAAA,CAAK,eAAA,CAAiB,CAAC,CAAC,CACvC,EAEM2tB,CAAAA,CAAqB,CACzB,iBAAkB,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,QAAAkrB,CAAAA,CACA,gBAAA,CAAkB6C,EAClB,KAAA,CAAA/nB,CAAAA,CACA,MAAA,CAAA0nB,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,SAAU3tB,CAAAA,CAAK,aAAA,CACf,cAAe,EAAA,CACf,GAAA,CAAAguB,CACF,CACF,CACF,CASO,SAASC,EAAAA,CACd/C,CAAAA,CACA6C,EACA/tB,CAAAA,CACW,CACX,GAAI,CAACkrB,CAAAA,EAAW,CAAC6C,CAAAA,EAAkB,CAAC/tB,EAClC,MAAM,IAAI,MAAM,gEAAgE,CAAA,CAGlF,IAAMgG,CAAAA,CAAmB,CACvB,iBAAkB,CAAA,CAClB,aAAA,CAAe,EAAC,CAChB,SAAA,CAAW,CAAC,CAAChG,CAAAA,CAAK,cAAA,CAAgB,CAAC,CAAC,CACtC,EAEM0tB,CAAAA,CAAoB,CACxB,gBAAA,CAAkB,CAAA,CAClB,aAAA,CAAe,GACf,SAAA,CAAW,CAAC,CAAC1tB,CAAAA,CAAK,eAAA,CAAiB,CAAC,CAAC,CACvC,CAAA,CAEM2tB,CAAAA,CAAqB,CACzB,gBAAA,CAAkB,EAClB,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,OAAA,CAAAkrB,CAAAA,CACA,gBAAA,CAAkB6C,CAAAA,CAClB,MAAA/nB,CAAAA,CACA,MAAA,CAAA0nB,EACA,OAAA,CAAAC,CAAAA,CACA,SAAU3tB,CAAAA,CAAK,aAAA,CACf,aAAA,CAAe,EAAA,CACf,UAAA,CAAY,EACd,CACF,CACF,CAQO,SAASkuB,EAAAA,CAAoBhD,EAAiB8C,CAAAA,CAAwB,CAC3E,GAAI,CAAC9C,CAAAA,EAAW,CAAC8C,EACf,MAAM,IAAI,MAAM,wDAAwD,CAAA,CAG1E,OAAO,CACL,eAAA,CACA,CACE,OAAA,CAAA9C,CAAAA,CACA,IAAA8C,CAAAA,CACA,UAAA,CAAY,EACd,CACF,CACF,CAaO,SAASG,EAAAA,CACdlnB,CAAAA,CACAmnB,CAAAA,CACAC,CAAAA,CACAC,EACAV,CAAAA,CACAzV,CAAAA,CACW,CACX,GAAI,CAAClR,GAAW,CAACmnB,CAAAA,EAAkB,CAACC,CAAAA,EAAkB,CAACT,CAAAA,CACrD,MAAM,IAAI,KAAA,CAAM,kEAAkE,CAAA,CAIpF,IAAMW,EAAgBH,CAAAA,CAAe,aAAA,CAAc,SAAA,CACjD,CAAC,CAAC1T,CAAG,IAAMA,CAAAA,GAAQ2T,CACrB,EAEMG,CAAAA,CAAkB,CAAC,GAAGJ,CAAAA,CAAe,aAAa,EACpDG,CAAAA,EAAiB,CAAA,CAEnBC,EAAgBD,CAAa,CAAA,CAAI,CAACF,CAAAA,CAAgBC,CAAe,EAGjEE,CAAAA,CAAgB,IAAA,CAAK,CAACH,CAAAA,CAAgBC,CAAe,CAAC,EAGxD,IAAMG,CAAAA,CAAwB,CAC5B,GAAGL,CAAAA,CACH,cAAeI,CACjB,CAAA,CAGA,OAAAC,CAAAA,CAAW,aAAA,CAAc,IAAA,CAAK,CAAC78B,CAAAA,CAAGtF,CAAAA,GAAOsF,EAAE,CAAC,CAAA,CAAItF,EAAE,CAAC,CAAA,CAAI,CAAA,CAAI,EAAG,CAAA,CAEvD,CACL,iBACA,CACE,OAAA,CAAA2a,EACA,OAAA,CAASwnB,CAAAA,CACT,SAAUb,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,GAAkB,CAACO,CAAAA,EAAkB,CAACf,CAAAA,CACrD,MAAM,IAAI,KAAA,CAAM,mEAAmE,CAAA,CAGrF,IAAMa,CAAAA,CAAwB,CAC5B,GAAGL,CAAAA,CACH,aAAA,CAAeA,EAAe,aAAA,CAAc,MAAA,CAC1C,CAAC,CAAC1T,CAAG,CAAA,GAAMA,CAAAA,GAAQiU,CACrB,CACF,EAEA,OAAO,CACL,iBACA,CACE,OAAA,CAAA1nB,EACA,OAAA,CAASwnB,CAAAA,CACT,SAAUb,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,EACxB,MAAM,IAAI,MAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,yBAAA,CACA,CACE,mBAAoBD,CAAAA,CACpB,oBAAA,CAAsBC,EACtB,UAAA,CAAYhH,CACd,CACF,CACF,CAUO,SAASiH,EAAAA,CACdC,CAAAA,CACAH,CAAAA,CACAI,EACAnH,CAAAA,CAAoB,GACT,CACX,GAAI,CAACkH,CAAAA,EAAmB,CAACH,GAAoB,CAACI,CAAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,kEAAkE,CAAA,CAGpF,OAAO,CACL,0BAAA,CACA,CACE,gBAAA,CAAkBD,CAAAA,CAClB,kBAAA,CAAoBH,CAAAA,CACpB,oBAAqBI,CAAAA,CACrB,UAAA,CAAYnH,CACd,CACF,CACF,CAUO,SAASoH,EAAAA,CACdL,CAAAA,CACAI,CAAAA,CACAE,CAAAA,CACArH,CAAAA,CAAoB,EAAC,CACV,CACX,GAAI,CAAC+G,CAAAA,EAAoB,CAACI,CAAAA,EAAqB,CAACE,CAAAA,CAC9C,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,iBAAA,CACA,CACE,mBAAoBN,CAAAA,CACpB,mBAAA,CAAqBI,EACrB,sBAAA,CAAwBE,CAAAA,CACxB,WAAYrH,CACd,CACF,CACF,CC/WO,SAASsH,GACdtb,CAAAA,CACA7M,CAAAA,CACAiG,CAAAA,CACW,CAEX,GAAI,CAAC4G,GAAQ,CAAC7M,CAAAA,EAAW,CAAC,MAAA,CAAO,QAAA,CAASiG,CAAQ,CAAA,CAChD,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAGvE,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,mBAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAA4G,CAAAA,CACA,OAAA,CAAA7M,EACA,QAAA,CAAAiG,CACF,CAAC,CAAA,CACD,cAAA,CAAgB,CAAC4G,CAAI,CAAA,CACrB,uBAAwB,EAC1B,CACF,CACF,CAaO,SAASub,EAAAA,CAAoBvb,CAAAA,CAAc5G,EAA6B,CAC7E,GAAI,CAAC4G,CAAAA,EAAQ,CAAC,MAAA,CAAO,UAAU5G,CAAQ,CAAA,EAAKA,GAAY,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAG5E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,sBAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAA4G,CAAAA,CACA,QAAA,CAAA5G,CACF,CAAC,CAAA,CACD,eAAgB,CAAC4G,CAAI,EACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASwb,EAAAA,CACdxb,EACAtC,CAAAA,CACAC,CAAAA,CACAvE,EACW,CAEX,GAAI,CAAC4G,CAAAA,EAAQ,CAACtC,CAAAA,EAAU,CAACC,CAAAA,EAAY,CAAC,OAAO,QAAA,CAASvE,CAAQ,EAC5D,MAAM,IAAI,MAAM,mDAAmD,CAAA,CAGrE,OAAO,CACL,aAAA,CACA,CACE,GAAI,gBAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAA4G,CAAAA,CACA,MAAA,CAAAtC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,QAAA,CAAAvE,CACF,CAAC,CAAA,CACD,eAAgB,CAAC4G,CAAI,EACrB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASyb,EAAAA,CACdC,EACAC,CAAAA,CACA19B,CAAAA,CACAiS,EACW,CACX,GAAI,CAACwrB,CAAAA,EAAU,CAACC,CAAAA,EAAY,CAAC19B,CAAAA,CAC3B,MAAM,IAAI,KAAA,CAAM,yDAAyD,EAI3E,IAAM29B,CAAAA,CAAmB39B,CAAAA,CAAO,OAAA,CAAQ,UAAA,CAAY,OAAO,EAE3D,OAAO,CACL,cACA,CACE,EAAA,CAAI,wBACJ,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,MAAA,CAAAy9B,CAAAA,CACA,SAAAC,CAAAA,CACA,MAAA,CAAQC,EACR,IAAA,CAAM1rB,CAAAA,EAAQ,EAChB,CAAC,CAAA,CACD,eAAgB,CAACwrB,CAAM,EACvB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAASG,EAAAA,CACdH,CAAAA,CACApH,CAAAA,CACAr2B,CAAAA,CACAiS,CAAAA,CACa,CACb,GAAI,CAACwrB,GAAU,CAACpH,CAAAA,EAAgB,CAACr2B,CAAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,+DAA+D,CAAA,CAIjF,IAAM69B,CAAAA,CAAYxH,CAAAA,CACf,MAAK,CACL,KAAA,CAAM,QAAQ,CAAA,CACd,MAAA,CAAO,OAAO,CAAA,CAGjB,GAAIwH,CAAAA,CAAU,SAAW,CAAA,CACvB,MAAM,IAAI,KAAA,CAAM,8DAA8D,EAIhF,OAAOA,CAAAA,CAAU,IAAKvH,CAAAA,EACpBkH,EAAAA,CAAqBC,EAAQnH,CAAAA,CAAK,IAAA,GAAQt2B,CAAAA,CAAQiS,CAAI,CACxD,CACF,CAOO,SAAS6rB,EAAAA,CAA6B/c,CAAAA,CAAyB,CACpE,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,iEAAiE,CAAA,CAGnF,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAI,sBACJ,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAA,CACF,CAAC,CAAA,CACD,cAAA,CAAgB,CAACA,CAAI,CAAA,CACrB,uBAAwB,EAC1B,CACF,CACF,CAUO,SAASgd,EAAAA,CACd7uB,CAAAA,CACAxM,EACAulB,CAAAA,CACW,CACX,GAAI,CAAC/Y,CAAAA,EAAY,CAACxM,CAAAA,EAAe,CAACulB,EAChC,MAAM,IAAI,KAAA,CAAM,4DAA4D,CAAA,CAG9E,OAAO,CACL,aAAA,CACA,CACE,GAAIvlB,CAAAA,CACJ,IAAA,CAAM,KAAK,SAAA,CAAUulB,CAAI,CAAA,CACzB,cAAA,CAAgB,CAAC/Y,CAAQ,EACzB,sBAAA,CAAwB,EAC1B,CACF,CACF,CAUO,SAAS8uB,EAAAA,CACd9uB,CAAAA,CACAxM,CAAAA,CACAulB,CAAAA,CACW,CACX,GAAI,CAAC/Y,CAAAA,EAAY,CAACxM,CAAAA,EAAe,CAACulB,EAChC,MAAM,IAAI,MAAM,6DAA6D,CAAA,CAG/E,OAAO,CACL,aAAA,CACA,CACE,EAAA,CAAIvlB,CAAAA,CACJ,KAAM,IAAA,CAAK,SAAA,CAAUulB,CAAI,CAAA,CACzB,cAAA,CAAgB,GAChB,sBAAA,CAAwB,CAAC/Y,CAAQ,CACnC,CACF,CACF,CClNO,SAAS+uB,EAAAA,CACd/uB,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,UAAA,CAAY,QAAQ,EACrB/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAAkR,CAAU,CAAA,GAAM,CACjBiY,EAAAA,CAAcnpB,CAAAA,CAAWkR,CAAS,CACpC,CAAA,CACA,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,QAAA,CAAS,KAAKkX,CAAAA,CAAU,SAAS,EAC3ClX,CAAAA,CAAU,QAAA,CAAS,YAAYkX,CAAAA,CAAU,SAAS,CAAA,CAClDlX,CAAAA,CAAU,QAAA,CAAS,WAAA,CAAY3O,CAAS,CAC1C,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCxBO,SAASonB,EAAAA,CACdjvB,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,UAAA,CAAY,UAAU,EACvB/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAAkR,CAAU,IAAM,CACjBkY,EAAAA,CAAgBppB,CAAAA,CAAWkR,CAAS,CACtC,CAAA,CACA,MAAO8d,CAAAA,CAAcnJ,CAAAA,GAAc,CAEjC,MAAMpc,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,SAAA,CAAU3O,EAAW6lB,CAAAA,CAAU,SAAS,EAC3DlX,CAAAA,CAAU,QAAA,CAAS,KAAKkX,CAAAA,CAAU,SAAS,CAAA,CAC3ClX,CAAAA,CAAU,QAAA,CAAS,WAAA,CAAYkX,EAAU,SAAS,CAAA,CAClDlX,EAAU,QAAA,CAAS,WAAA,CAAY3O,CAAS,CAC1C,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,GAAiB,OAAQ,CAC5C,CACF,CC3DO,SAASqnB,GACdlvB,CAAAA,CACAxK,CAAAA,CACAyT,EACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,WAAA,CAAa,MAAOlJ,CAAQ,CAAA,CACtD,WAAY,MAAO,CAAE,OAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,CAAS,CAAA,GAAe,CACnD,GAAI,CAACxQ,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,MAAM,+CAA0C,CAAA,CAkB5D,QAdiB,MADAyY,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,6BACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,OAAA+F,CAAAA,CACA,QAAA,CAAAC,EACA,IAAA,CAAAhb,CACF,CAAC,CACH,CACF,CAAA,EACgB,MAClB,CAAA,CACA,UAAW,IAAM,CACfyT,GAAU,CACV4D,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU,CAAC,UAAA,CAAY,WAAA,CAAa7M,CAAQ,CAC9C,CAAC,EACH,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CC3CO,SAASoJ,GACdnvB,CAAAA,CACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,uBAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,WAAA,CAAa,SAAUlJ,CAAQ,CAAA,CACzD,UAAA,CAAY,MAAOovB,CAAAA,EAAuB,CACxC,GAAI,CAACpvB,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAiB5D,OAAA,CAbiB,MADAyY,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,gCACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,EAAA,CAAI4kB,CAAAA,CACJ,KAAA55B,CACF,CAAC,CACH,CACF,CAAA,EACgB,IAAA,EAClB,CAAA,CACA,SAAA,CAAW,IAAM,CACfyT,CAAAA,GACA4D,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,QAAA,CAAU,CAAC,WAAY,WAAA,CAAa7M,CAAQ,CAC9C,CAAC,EACH,EACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CCrCO,SAASsJ,EAAAA,CACdrvB,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAY,WAAA,CAAa,KAAA,CAAOlJ,CAAQ,CAAA,CACtD,UAAA,CAAY,MAAOgG,CAAAA,EAAoB,CACrC,GAAI,CAAChG,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,MAAM,+CAA0C,CAAA,CAiB5D,OAAA,CAbiB,MADAyY,CAAAA,EAAc,CAE7BzD,EAAO,cAAA,CAAiB,4BAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAAxE,EACA,IAAA,CAAAxQ,CACF,CAAC,CACH,CACF,GACgB,IAAA,EAClB,EACA,SAAA,CAAW,CAACowB,EAAO5f,CAAAA,GAAY,CAC7BiD,GAAU,CACV,IAAMqmB,CAAAA,CAAKziB,CAAAA,EAAe,CAC1ByiB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,QAAA,CAAS,SAAA,CAAU3O,CAAQ,CAAE,CAAC,CAAA,CACzEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,QAAA,CAAS,kBAAkB3O,CAAQ,CAAE,CAAC,CAAA,CACjFsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,SAAS,aAAA,CAAc3O,CAAAA,CAAWgG,CAAO,CAAE,CAAC,EACzF,CAAA,CACA,OAAA,CAAA+f,CACF,CAAC,CACH,CCpCO,SAASwJ,GACdvvB,CAAAA,CACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,uBAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,WAAA,CAAa,SAAUlJ,CAAQ,CAAA,CACzD,UAAA,CAAY,MAAOgG,CAAAA,EAAoB,CACrC,GAAI,CAAChG,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAI5D,IAAMgI,CAAAA,CAAW,MADAyQ,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,+BAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,OAAA,CAAAxE,EACA,IAAA,CAAAxQ,CACF,CAAC,CACH,CACF,CAAA,CACA,GAAI,CAACgI,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8BA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAEjE,OAAOA,EAAS,IAAA,EAClB,EACA,QAAA,CAAU,MAAOwI,GAAoB,CACnC,GAAI,CAAChG,CAAAA,CACH,OAGF,IAAMsvB,EAAKziB,CAAAA,EAAe,CACpB2iB,EAAU7gB,CAAAA,CAAU,QAAA,CAAS,UAAU3O,CAAQ,CAAA,CAC/CyvB,EAAiB9gB,CAAAA,CAAU,QAAA,CAAS,kBAAkB3O,CAAQ,CAAA,CAC9D0vB,EAAW/gB,CAAAA,CAAU,QAAA,CAAS,cAAc3O,CAAAA,CAAUgG,CAAO,CAAA,CAEnE,MAAM,OAAA,CAAQ,GAAA,CAAI,CAChBspB,CAAAA,CAAG,aAAA,CAAc,CAAE,QAAA,CAAUE,CAAQ,CAAC,CAAA,CACtCF,CAAAA,CAAG,aAAA,CAAc,CAAE,QAAA,CAAUG,CAAe,CAAC,CAAA,CAC7CH,CAAAA,CAAG,cAAc,CAAE,QAAA,CAAUI,CAAS,CAAC,CACzC,CAAC,CAAA,CAED,IAAMC,CAAAA,CAAeL,EAAG,YAAA,CAAgCE,CAAO,EAC3DG,CAAAA,EACFL,CAAAA,CAAG,aACDE,CAAAA,CACAG,CAAAA,CAAa,OAAQC,CAAAA,EAAMA,CAAAA,CAAE,UAAY5pB,CAAO,CAClD,EAGF,IAAM6pB,CAAAA,CAAgBP,EAAG,YAAA,CAAsBI,CAAQ,CAAA,CACvDJ,CAAAA,CAAG,YAAA,CAAsBI,CAAAA,CAAU,KAAK,CAAA,CAExC,IAAMI,EAAkBR,CAAAA,CAAG,cAAA,CAA+D,CACxF,QAAA,CAAUG,CACZ,CAAC,CAAA,CACKM,CAAAA,CAAmB,IAAI,IAAID,CAAe,CAAA,CAChD,OAAW,CAAC9/B,CAAAA,CAAKZ,CAAI,CAAA,GAAK0gC,CAAAA,CACpB1gC,CAAAA,EACFkgC,CAAAA,CAAG,YAAA,CAAat/B,CAAAA,CAAK,CACnB,GAAGZ,CAAAA,CACH,MAAOA,CAAAA,CAAK,KAAA,CAAM,IAAKsjB,CAAAA,GAAU,CAC/B,GAAGA,CAAAA,CACH,IAAA,CAAMA,EAAK,IAAA,CAAK,MAAA,CAAQkd,GAAMA,CAAAA,CAAE,OAAA,GAAY5pB,CAAO,CACrD,CAAA,CAAE,CACJ,CAAC,CAAA,CAIL,OAAO,CAAE,YAAA,CAAA2pB,CAAAA,CAAc,iBAAAI,CAAAA,CAAkB,aAAA,CAAAF,CAAc,CACzD,CAAA,CACA,SAAA,CAAW,CAACjK,CAAAA,CAAO5f,CAAAA,GAAY,CAC7BiD,CAAAA,EAAU,CACV,IAAMqmB,CAAAA,CAAKziB,CAAAA,GACXyiB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,QAAA,CAAS,UAAU3O,CAAQ,CAAE,CAAC,CAAA,CACzEsvB,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,QAAA,CAAS,iBAAA,CAAkB3O,CAAQ,CAAE,CAAC,EACjFsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc3O,CAAAA,CAAWgG,CAAO,CAAE,CAAC,EACzF,EACA,OAAA,CAAS,CAAC9M,EAAK8M,CAAAA,CAASgqB,CAAAA,GAAY,CAClC,IAAMV,CAAAA,CAAKziB,CAAAA,GAIX,GAHImjB,CAAAA,EAAS,cACXV,CAAAA,CAAG,YAAA,CAAa3gB,EAAU,QAAA,CAAS,SAAA,CAAU3O,CAAQ,CAAA,CAAGgwB,CAAAA,CAAQ,YAAY,EAE1EA,CAAAA,EAAS,gBAAA,CACX,OAAW,CAAChgC,CAAAA,CAAKZ,CAAI,CAAA,GAAK4gC,CAAAA,CAAQ,iBAChCV,CAAAA,CAAG,YAAA,CAAat/B,EAAKZ,CAAI,CAAA,CAGzB4gC,GAAS,aAAA,GAAkB,MAAA,EAC7BV,EAAG,YAAA,CACD3gB,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc3O,CAAAA,CAAWgG,CAAO,EACnDgqB,CAAAA,CAAQ,aACV,EAEFjK,CAAAA,CAAQ7sB,CAAG,EACb,CACF,CAAC,CACH,CCnFO,SAAS+2B,EAAAA,CACd94B,EACA+4B,CAAAA,CACwB,CACxB,IAAMt0B,CAAAA,CAAS,IAAI,GAAA,CAEnB,OAAAzE,CAAAA,CAAS,OAAA,CAAQ,CAAC,CAACnH,CAAAA,CAAKo2B,CAAM,CAAA,GAAM,CAClCxqB,EAAO,GAAA,CAAI5L,CAAAA,CAAI,UAAS,CAAGo2B,CAAM,EACnC,CAAC,CAAA,CAED8J,EAAU,OAAA,CAAQ,CAAC,CAAClgC,CAAAA,CAAKo2B,CAAM,CAAA,GAAM,CACnCxqB,CAAAA,CAAO,GAAA,CAAI5L,EAAI,QAAA,EAAS,CAAGo2B,CAAM,EACnC,CAAC,CAAA,CAEM,KAAA,CAAM,IAAA,CAAKxqB,CAAAA,CAAO,SAAS,CAAA,CAC/B,KAAK,CAAC,CAAC+iB,CAAI,CAAA,CAAG,CAACC,CAAI,CAAA,GAAMD,CAAAA,CAAK,aAAA,CAAcC,CAAI,CAAC,CAAA,CACjD,IAAI,CAAC,CAAC5uB,EAAKo2B,CAAM,CAAA,GAAM,CAACp2B,CAAAA,CAAKo2B,CAAM,CAAqB,CAC7D,CAOO,SAAS+J,EAAAA,CACdnwB,CAAAA,CACApB,EACA,CACA,GAAM,CAAE,IAAA,CAAMwxB,CAAY,CAAA,CAAI/iB,oBAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE3E,OAAOkJ,uBAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,aAAA,CAAelJ,CAAQ,EACjD,UAAA,CAAY,MAAO,CACjB,IAAA,CAAAjB,CAAAA,CACA,YAAAsxB,CAAAA,CAAc,KAAA,CACd,UAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CAAe,EAAC,CAChB,uBAAA,CAAAC,EAA0B,EAC5B,IAAe,CACb,GAAIzxB,EAAK,MAAA,GAAW,CAAA,CAClB,MAAM,IAAI,KAAA,CACR,oDACF,CAAA,CAGF,GAAI,CAACqxB,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,gEACF,CAAA,CAGF,IAAMK,CAAAA,CAAeC,CAAAA,EAAwB,CAC3C,IAAMjpB,CAAAA,CAAkB,KAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU2oB,CAAAA,CAAYM,CAAO,CAAC,CAAC,CAAA,CAKjEC,CAAAA,CAAkB,CACtB,GAH+BH,CAAAA,CAAwBE,CAAO,CAAA,EAAK,EAAC,CAIpE,GAAIF,CAAAA,CAAwBE,CAAO,IAAM,MAAA,CAAYH,CAAAA,CAAe,EACtE,CAAA,CAGMK,EAAeP,CAAAA,CACjB5oB,CAAAA,CAAK,UAAU,MAAA,CAAO,CAAC,CAACzX,CAAG,CAAA,GAAM,CAAC2gC,CAAAA,CAAgB,QAAA,CAAS3gC,EAAI,QAAA,EAAU,CAAC,CAAA,CAC1E,EAAC,CAEL,OAAAyX,CAAAA,CAAK,SAAA,CAAYwoB,GACfW,CAAAA,CACA7xB,CAAAA,CAAK,IACH,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,EACT,aAAA,CAAeowB,CAAAA,CAAY,cAC3B,KAAA,CAAOK,CAAAA,CAAY,OAAO,CAAA,CAC1B,MAAA,CAAQA,EAAY,QAAQ,CAAA,CAC5B,QAASA,CAAAA,CAAY,SAAS,CAAA,CAE9B,QAAA,CAAU1xB,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,EAAI/iB,mBAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAErE,CAAE,WAAA,CAAa+wB,CAAW,EAAIZ,EAAAA,CAAyBnwB,CAAQ,EAErE,OAAOkJ,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,kBAAmBlJ,CAAQ,CAAA,CACrD,WAAY,MAAO,CACjB,YAAAgxB,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,WAAA,CAAAZ,CACF,CAAA,GAAe,CACb,GAAI,CAACD,EACH,MAAM,IAAI,MACR,oEACF,CAAA,CAEF,IAAME,CAAAA,CAAa1wB,CAAAA,CAAW,SAAA,CAC5BI,EACAixB,CAAAA,CACA,OACF,EAEA,OAAOF,CAAAA,CAAW,CAChB,UAAA,CAAAT,CAAAA,CACA,YAAAD,CAAAA,CACA,IAAA,CAAM,CACJ,CACE,KAAA,CAAOzwB,EAAW,SAAA,CAAUI,CAAAA,CAAUgxB,EAAa,OAAO,CAAA,CAC1D,MAAA,CAAQpxB,CAAAA,CAAW,SAAA,CAAUI,CAAAA,CAAUgxB,EAAa,QAAQ,CAAA,CAC5D,QAASpxB,CAAAA,CAAW,SAAA,CAAUI,EAAUgxB,CAAAA,CAAa,SAAS,CAAA,CAC9D,QAAA,CAAUpxB,CAAAA,CAAW,SAAA,CAAUI,EAAUgxB,CAAAA,CAAa,MAAM,CAC9D,CACF,CACF,CAAC,CACH,CAAA,CACA,GAAGpyB,CACL,CAAC,CACH,CCrCO,SAASsyB,EAAAA,CACdlxB,CAAAA,CACApB,EACA6I,CAAAA,CACA,CACA,IAAMie,CAAAA,CAAcC,yBAAAA,EAAe,CAE7B,CAAE,IAAA,CAAAv2B,CAAK,EAAIie,mBAAAA,CAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE9D,OAAOkJ,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,UAAA,CAAY,gBAAA,CAAkB9Z,GAAM,IAAI,CAAA,CACtD,WAAY,MAAO,CAAE,YAAA+hC,CAAAA,CAAa,IAAA,CAAAnsB,CAAAA,CAAM,GAAA,CAAAhV,CAAI,CAAA,GAAqB,CAC/D,GAAI,CAACZ,EACH,MAAM,IAAI,MACR,oEACF,CAAA,CAGF,IAAMs9B,CAAAA,CAAU,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,CAAUt9B,EAAK,OAAO,CAAC,EAEvDs9B,CAAAA,CAAQ,aAAA,CAAgBA,CAAAA,CAAQ,aAAA,CAAc,MAAA,CAC5C,CAAC,CAAC1mB,CAAO,CAAA,GAAMA,IAAYmrB,CAC7B,CAAA,CAEA,IAAMryB,CAAAA,CAAgB,CACpB,OAAA,CAAS1P,CAAAA,CAAK,IAAA,CACd,OAAA,CAAAs9B,EACA,QAAA,CAAUt9B,CAAAA,CAAK,SACf,aAAA,CAAeA,CAAAA,CAAK,aACtB,CAAA,CAEA,GAAI4V,CAAAA,GAAS,KAAA,EAAShV,CAAAA,CACpB,OAAOoV,EAAoB,CAAC,CAAC,iBAAkBtG,CAAa,CAAC,EAAG9O,CAAG,CAAA,CAC9D,GAAIgV,CAAAA,GAAS,UAAA,CAAY,CAC9B,GAAI,CAACyC,GAAM,OAAA,EAAS,qBAAA,CAClB,MAAM,IAAI,KAAA,CAAM,qDAAgD,CAAA,CAElE,OAAOA,CAAAA,CAAK,QAAQ,qBAAA,CAClBrY,CAAAA,CAAK,KACL,CAAC,CAAC,iBAAkB0P,CAAa,CAAC,CAAA,CAClC,QACF,CACF,CAAA,YACM,CAACF,CAAAA,CAAQ,eAAiB,OAAA,CAAQ,GAAA,CAAI,WAAa,aAAA,EACrD,OAAA,CAAQ,IAAA,CAAK,sHAAsH,CAAA,CAE9HoJ,mBAAAA,CAAG,cACR,CAAC,gBAAA,CAAkBlJ,CAAa,CAAA,CAChCF,CAAAA,CAAQ,cAAgB,CAAE,QAAA,CAAUA,EAAQ,aAAc,CAAA,CAAI,EAAC,CAC/D,IAAM,CAAC,CACT,CAEJ,EACA,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,SAAA,CAAW,CAAC4d,CAAAA,CAAMrT,EAASioB,CAAAA,GAAQ,CAChCxyB,EAAQ,SAAA,GAEQ4d,CAAAA,CAAMrT,EAASioB,CAAG,CAAA,CACnC1L,CAAAA,CAAY,YAAA,CACV/Q,CAAAA,CAA2B3U,CAAQ,EAAE,QAAA,CACpC5Q,CAAAA,GACE,CACC,GAAGA,CAAAA,CACH,QAAS,CACP,GAAGA,CAAAA,EAAM,OAAA,CACT,aAAA,CACEA,CAAAA,EAAM,SAAS,aAAA,EAAe,MAAA,CAC5B,CAAC,CAAC4W,CAAO,IAAMA,CAAAA,GAAYmD,CAAAA,CAAQ,WACrC,CAAA,EAAK,EACT,CACF,CAAA,CACJ,EACF,CACF,CAAC,CACH,CC1EO,SAASkoB,EAAAA,CACdrxB,EACAxK,CAAAA,CACAoJ,CAAAA,CACA6I,CAAAA,CACA,CACA,GAAM,CAAE,KAAArY,CAAK,CAAA,CAAIie,oBAASsH,CAAAA,CAA2B3U,CAAQ,CAAC,CAAA,CAE9D,OAAOkJ,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAY,UAAA,CAAY9Z,CAAAA,EAAM,IAAI,CAAA,CAChD,UAAA,CAAY,MAAO,CAAE,WAAA,CAAA+hC,EAAa,IAAA,CAAAnsB,CAAAA,CAAM,IAAAhV,CAAAA,CAAK,KAAA,CAAAshC,CAAM,CAAA,GAAqB,CACtE,GAAI,CAACliC,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,qEACF,EAGF,IAAM0P,CAAAA,CAAgB,CACpB,kBAAA,CAAoB1P,CAAAA,CAAK,KACzB,oBAAA,CAAsB+hC,CAAAA,CACtB,UAAA,CAAY,EACd,CAAA,CAEA,GAAInsB,CAAAA,GAAS,QAAA,CAAU,CACrB,GAAI,CAACxP,EACH,MAAM,IAAI,KAAA,CAAM,6CAAwC,CAAA,CAI1D,IAAMgI,EAAW,MAFAyQ,CAAAA,GAEezD,CAAAA,CAAO,cAAA,CAAiB,8BAA+B,CACrF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,KAAA,CAAA87B,CAAAA,CACA,UAAA,CAAY,CACV,GAAGliC,CAAAA,CAAK,KAAA,CAAM,UACd,GAAGA,CAAAA,CAAK,OAAO,SAAA,CACf,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,2CAA2CA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG9E,OAAOA,CACT,CAAA,KAAO,CAAA,GAAIwH,IAAS,KAAA,EAAShV,CAAAA,CAC3B,OAAOoV,CAAAA,CACL,CAAC,CAAC,yBAAA,CAA2BtG,CAAa,CAAC,CAAA,CAC3C9O,CACF,CAAA,CACK,GAAIgV,CAAAA,GAAS,UAAA,CAAY,CAC9B,GAAI,CAACyC,GAAM,OAAA,EAAS,qBAAA,CAClB,MAAM,IAAI,KAAA,CAAM,qDAAgD,CAAA,CAElE,OAAOA,CAAAA,CAAK,QAAQ,qBAAA,CAAsBrY,CAAAA,CAAK,KAAM,CAAC,CAAC,0BAA2B0P,CAAa,CAAC,CAAA,CAAG,OAAO,CAC5G,CAAA,YACM,CAACF,CAAAA,CAAQ,eAAiB,OAAA,CAAQ,GAAA,CAAI,WAAa,aAAA,EACrD,OAAA,CAAQ,KAAK,uHAAuH,CAAA,CAE/HoJ,oBAAG,aAAA,CACR,CAAC,0BAA2BlJ,CAAa,CAAA,CACzCF,EAAQ,aAAA,CAAgB,CAAE,QAAA,CAAUA,CAAAA,CAAQ,aAAc,CAAA,CAAI,EAAC,CAC/D,IAAM,CAAC,CACT,CAAA,CAEJ,EACA,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,SAAA,CAAWA,CAAAA,CAAQ,SACrB,CAAC,CACH,CCjGO,SAAS2yB,EAAAA,CACd9pB,CAAAA,CACA+pB,CAAAA,CACS,CACT,IAAMC,CAAAA,CAAkBhqB,EAAK,SAAA,CAC1B,MAAA,CAAO,CAAC,CAACzX,CAAG,IAAM,CAACwhC,CAAAA,CAAgB,IAAI,MAAA,CAAOxhC,CAAG,CAAC,CAAC,CAAA,CACnD,OAAO,CAAC0hC,CAAAA,CAAK,EAAGtL,CAAM,CAAA,GAAMsL,EAAMtL,CAAAA,CAAQ,CAAC,EAGxCuL,CAAAA,CAAAA,CAAiBlqB,CAAAA,CAAK,eAAiB,EAAC,EAAG,MAAA,CAC/C,CAACiqB,CAAAA,CAAa,EAAGtL,CAAM,CAAA,GAAwBsL,EAAMtL,CAAAA,CACrD,CACF,EAEA,OAAQqL,CAAAA,CAAkBE,CAAAA,EAAkBlqB,CAAAA,CAAK,gBACnD,CAYO,SAASmqB,EAAAA,CACdxB,CAAAA,CACAyB,EACA,CACA,IAAML,EAAkB,IAAI,GAAA,CAAIK,EAAa,GAAA,CAAK3X,CAAAA,EAAMA,EAAE,QAAA,EAAU,CAAC,CAAA,CAE/D4X,CAAAA,CAAmBrqB,GACvBA,CAAAA,CAAK,SAAA,CAAU,IAAA,CACb,CAAC,CAACzX,CAAG,IAAoCwhC,CAAAA,CAAgB,GAAA,CAAI,OAAOxhC,CAAG,CAAC,CAC1E,CAAA,CAEIygC,CAAAA,CAAehpB,CAAAA,EAA+B,CAClD,IAAMsqB,CAAAA,CAAmB,KAAK,KAAA,CAAM,IAAA,CAAK,UAAUtqB,CAAI,CAAC,EACxD,OAAAsqB,CAAAA,CAAM,SAAA,CAAYA,CAAAA,CAAM,SAAA,CAAU,MAAA,CAChC,CAAC,CAAC/hC,CAAG,IAAM,CAACwhC,CAAAA,CAAgB,IAAIxhC,CAAAA,CAAI,QAAA,EAAU,CAChD,CAAA,CACO+hC,CACT,CAAA,CAEMC,CAAAA,CAAmBF,EAAgB1B,CAAAA,CAAY,KAAK,EAE1D,OAAO,CACL,OAAA,CAASA,CAAAA,CAAY,IAAA,CACrB,aAAA,CAAeA,EAAY,aAAA,CAC3B,KAAA,CAAO4B,EAAmBvB,CAAAA,CAAYL,CAAAA,CAAY,KAAK,CAAA,CAAI,MAAA,CAC3D,MAAA,CAAQK,CAAAA,CAAYL,CAAAA,CAAY,MAAM,EACtC,OAAA,CAASK,CAAAA,CAAYL,EAAY,OAAO,CAAA,CACxC,SAAUA,CAAAA,CAAY,QACxB,CACF,CCrCO,SAAS6B,EAAAA,CACdjyB,EACApB,CAAAA,CACA,CACA,GAAM,CAAE,IAAA,CAAMwxB,CAAY,CAAA,CAAI/iB,mBAAAA,CAASsH,EAA2B3U,CAAQ,CAAC,EAE3E,OAAOkJ,sBAAAA,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,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,2DACF,CAAA,CAGF,IAAMyB,EAAe,KAAA,CAAM,OAAA,CAAQK,CAAW,CAAA,CAAIA,CAAAA,CAAc,CAACA,CAAW,CAAA,CACtE3sB,CAAAA,CAAKqsB,GAAkBxB,CAAAA,CAAayB,CAAY,EAEtD,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,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,UAAA,CAAY,cAAc,EAC3B/I,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAiqB,CAAAA,CAAS,GAAA,CAAA8C,EAAM,YAAa,CAAA,GAAM,CACnCE,EAAAA,CAAoBhD,CAAAA,CAAS8C,CAAG,CAClC,CAAA,CACA,MAAOiC,CAAAA,CAAcnJ,CAAAA,GAAc,CACjC,MAAMpc,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,QAAA,CAAS,IAAA,CAAKkX,EAAU,OAAO,CAC3C,CAAC,EACH,CAAA,CACApe,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCtEO,SAASuqB,EAAAA,CACdpyB,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,UAAA,CAAY,0BAA0B,CAAA,CACvC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX+jB,GACEltB,CAAAA,CACAmJ,CAAAA,CAAQ,eACRA,CAAAA,CAAQ,cAAA,CACRA,EAAQ,eAAA,CACRA,CAAAA,CAAQ,OAAA,CACRA,CAAAA,CAAQ,YACV,CACF,EACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,CAAAA,EAAM,QAASI,CAAAA,CAAe,CAC3D8G,EAAU,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,UAAA,CAAY,QAAQ,CAAA,CACrB/I,CAAAA,CACCmJ,GAAY,CACXA,CAAAA,CAAQ,WACJ6jB,EAAAA,CAA4BhtB,CAAAA,CAAWmJ,EAAQ,cAAA,CAAgBA,CAAAA,CAAQ,IAAI,CAAA,CAC3E0jB,EAAAA,CAAqB7sB,CAAAA,CAAWmJ,EAAQ,cAAA,CAAgBA,CAAAA,CAAQ,KAAMA,CAAAA,CAAQ,GAAG,CACvF,CAAA,CACA,SAAY,CACV,MAAMM,CAAAA,CAAyBhC,GAAM,OAAA,CAASI,CAAAA,CAAe,CAC3D8G,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CACAyH,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC7BA,IAAMyqB,EAAAA,CAAwC,GAAA,CAAS,EAAA,CAAK,EAAA,CACtDC,EAAAA,CAAmB,IACnBC,EAAAA,CAA2B,GAAA,CAEjC,SAASC,EAAAA,CAAkBzsB,CAAAA,CAA8B,CACvD,IAAM0sB,CAAAA,CAAU7kB,CAAAA,CAAW7H,CAAAA,CAAQ,cAAc,CAAA,CAAE,OAC7CG,CAAAA,CAAW0H,CAAAA,CAAW7H,EAAQ,uBAAuB,CAAA,CAAE,OACvDE,CAAAA,CAAY2H,CAAAA,CAAW7H,EAAQ,wBAAwB,CAAA,CAAE,OACzDI,CAAAA,CAAeyH,CAAAA,CAAW7H,EAAQ,qBAAqB,CAAA,CAAE,OACzDK,CAAAA,CAAAA,CACH,MAAA,CAAOL,CAAAA,CAAQ,WAAW,CAAA,CAAI,MAAA,CAAOA,EAAQ,SAAS,CAAA,EAAK,IACxDM,CAAAA,CAAgB,IAAA,CAAK,IAAIF,CAAAA,CAAcC,CAAgB,CAAA,CAE7D,OAAOqsB,CAAAA,CAAUvsB,CAAAA,CAAWD,EAAYI,CAC1C,CAEA,SAASqsB,EAAAA,CAAe1sB,CAAAA,CAAe2sB,EAA0BC,CAAAA,CAA0B,CACzF,IAAM9K,CAAAA,CAAgB9hB,CAAAA,CAAQ,GAAA,CAE9B,QADe2sB,CAAAA,CAAmBC,CAAAA,CAAY,IAAM,EAAA,CAAK,CAAA,EACzC9K,EAAiB,GACnC,CAEA,SAAS+K,EAAAA,CAAsBC,CAAAA,CAAqC,CAClE,GAAI,MAAA,CAAO,SAASA,CAAAA,CAAa,YAAY,EAC3C,OAAOA,CAAAA,CAAa,YAAA,EAAgB,EAAA,CAGtC,GAAM,CAACC,EAAQ,GAAA,CAAKC,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAAKF,CAAAA,CAAa,wBAA0B,OAAA,EAAS,KAAA,CAAM,GAAG,CAAA,CAC7F,OAAO,MAAA,CAAOC,CAAK,CAAA,CAAI,CAAA,EAAM,OAAOA,CAAK,CAAA,GAAM,GAAK,MAAA,CAAOC,CAAK,CAAA,EAAK,EACvE,CAEA,SAASC,GACPltB,CAAAA,CACA+sB,CAAAA,CACA3M,EACQ,CACR,IAAM+M,EACJJ,CAAAA,CAAa,oBAAA,EACb,OAAOA,CAAAA,CAAa,GAAA,EAAK,eAAe,uBAAA,EAA2B,CAAC,EAEtE,GAAI,CAAC,OAAO,QAAA,CAASI,CAAW,CAAA,EAAKA,CAAAA,EAAe,CAAA,CAClD,SAGF,IAAMC,CAAAA,CAAiBX,GAAkBzsB,CAAO,CAAA,CAChD,GAAI,CAAC,MAAA,CAAO,QAAA,CAASotB,CAAc,CAAA,EAAKA,CAAAA,EAAkB,EACxD,OAAO,CAAA,CAGT,IAAMrL,CAAAA,CAAgBqL,CAAAA,CAAiB,IACjCC,CAAAA,CACJ,IAAA,CAAK,IAAA,CACFtL,CAAAA,CAAgB3B,CAAAA,CAAS,EAAA,CAAK,GAAK,EAAA,CACpCmM,EAAAA,EACCY,EAAcb,EAAAA,CACjB,CAAA,CAEIgB,EAAO/sB,EAAAA,CAAgBP,CAAO,EAC9BH,CAAAA,CAAc,IAAA,CAAK,IAAIytB,CAAAA,CAAK,YAAA,CAAcA,EAAK,QAAQ,CAAA,CAE7D,OAAI,CAAC,MAAA,CAAO,QAAA,CAASztB,CAAW,CAAA,EAAKwtB,CAAAA,CAAWxtB,EACvC,CAAA,CAGF,IAAA,CAAK,IAAIwtB,CAAAA,CAAWb,EAAAA,CAA0B,CAAC,CACxD,CAEO,SAASe,EAAAA,CACdvtB,CAAAA,CACA+sB,CAAAA,CACAH,EACAxM,CAAAA,CAAiB,GAAA,CACT,CACR,GAAI,CAAC,OAAO,QAAA,CAASwM,CAAgB,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASxM,CAAM,CAAA,CAC/D,SAGF,GAAI0M,EAAAA,CAAsBC,CAAY,CAAA,CACpC,OAAOG,GAAkBltB,CAAAA,CAAS+sB,CAAAA,CAAc3M,CAAM,CAAA,CAGxD,IAAIoN,EAAa,CAAA,CACjB,GAAI,CAEF,GADAA,CAAAA,CAAaf,EAAAA,CAAkBzsB,CAAO,CAAA,CAClC,CAAC,OAAO,QAAA,CAASwtB,CAAU,EAC7B,OAAO,CAEX,MAAQ,CACN,OAAO,CACT,CAEA,OAAOb,EAAAA,CAAea,EAAYZ,CAAAA,CAAkBxM,CAAM,CAC5D,CAEO,SAASqN,GAAYztB,CAAAA,CAA8B,CAExD,OADaO,EAAAA,CAAgBP,CAAO,CAAA,CACxB,WAAa,GAC3B,CAEO,SAAS0tB,EAAAA,CAAkBC,CAAAA,CAAe,CAC/C,GAAI,CAAC,OAAO,QAAA,CAASA,CAAK,EACxB,MAAM,IAAI,UAAU,sCAAsC,CAAA,CAE5D,GAAIA,CAAAA,CAAQ,CAAA,EAAKA,CAAAA,CAAQ,GAAA,CACvB,MAAM,IAAI,WAAW,wCAAwC,CAAA,CAG/D,QADqB,GAAA,CAAMA,CAAAA,EAET,IAAMrB,EAAAA,CAAyC,GAEnE,CAEO,SAASsB,EAAAA,CAAgB5tB,CAAAA,CAA8B,CAC5D,IAAM6tB,CAAAA,CACJ,WAAW7tB,CAAAA,CAAQ,cAAc,EACjC,UAAA,CAAWA,CAAAA,CAAQ,uBAAuB,CAAA,CAC1C,UAAA,CAAWA,CAAAA,CAAQ,wBAAwB,CAAA,CACvC8tB,CAAAA,CAAU,KAAK,KAAA,CAAM,IAAA,CAAK,KAAI,CAAI,GAAI,EAAI9tB,CAAAA,CAAQ,gBAAA,CAAiB,iBACnEL,CAAAA,CAAWkuB,CAAAA,CAAc,IAAW,CAAA,CAE1C,GAAIluB,GAAW,CAAA,CACb,OAAO,CAAA,CAGT,IAAIE,CAAAA,CACF,UAAA,CAAWG,EAAQ,gBAAA,CAAiB,YAAA,CAAa,UAAU,CAAA,CAC1D8tB,EAAUnuB,CAAAA,CAAW2sB,EAAAA,CAEpBzsB,CAAAA,CAAcF,CAAAA,GAChBE,CAAAA,CAAcF,CAAAA,CAAAA,CAEhB,IAAMouB,CAAAA,CAAmBluB,CAAAA,CAAc,IAAOF,CAAAA,CAE9C,OAAI,MAAMouB,CAAe,CAAA,CAChB,CAAA,CAGLA,CAAAA,CAAkB,GAAA,CACb,GAAA,CAEFA,CACT,CAEO,SAASC,GAAQhuB,CAAAA,CAA4B,CAElD,OADaQ,EAAAA,CAAgBR,CAAO,EACxB,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,CAAAA,CAAkB,kBAAAC,CAAAA,CAAmB,IAAA,CAAAH,EAAM,KAAA,CAAAC,CAAM,EAAI2jB,CAAAA,CAW7D,GARE,CAAC,MAAA,CAAO,QAAA,CAAS1jB,CAAgB,GACjC,CAAC,MAAA,CAAO,SAASC,CAAiB,CAAA,EAClC,CAAC,MAAA,CAAO,QAAA,CAASH,CAAI,CAAA,EACrB,CAAC,OAAO,QAAA,CAASC,CAAK,GAKpBC,CAAAA,GAAqB,CAAA,EAAKD,IAAU,CAAA,CACtC,OAAO,CAAA,CAGT,IAAM8kB,CAAAA,CAAUX,EAAAA,CAAcvtB,EAAS+sB,CAAAA,CAAcH,CAAAA,CAAkBxM,CAAM,CAAA,CAE7E,OAAK,OAAO,QAAA,CAAS8N,CAAO,CAAA,CAIpBA,CAAAA,CAAU7kB,CAAAA,CAAoBC,CAAAA,EAAqBH,EAAOC,CAAAA,CAAAA,CAHzD,CAIX,CCjKO,IAAM+kB,EAAAA,CAA0D,CAErE,IAAA,CAAM,SAAA,CACN,OAAA,CAAS,SAAA,CACT,cAAA,CAAgB,SAAA,CAChB,gBAAiB,SAAA,CACjB,oBAAA,CAAsB,UAGtB,4BAAA,CAA8B,QAAA,CAC9B,uBAAwB,QAAA,CACxB,OAAA,CAAS,SACT,uBAAA,CAAyB,QAAA,CACzB,mBAAoB,QAAA,CACpB,0BAAA,CAA4B,SAC5B,QAAA,CAAU,QAAA,CACV,sBAAuB,QAAA,CACvB,mBAAA,CAAqB,QAAA,CACrB,mBAAA,CAAqB,QAAA,CACrB,gBAAA,CAAkB,SAGlB,kBAAA,CAAoB,QAAA,CACpB,mBAAoB,QAAA,CAGpB,cAAA,CAAgB,SAChB,eAAA,CAAiB,QAAA,CACjB,aAAA,CAAe,QAAA,CACf,sBAAA,CAAwB,QAAA,CAGxB,sBAAuB,QAAA,CACvB,oBAAA,CAAsB,SACtB,eAAA,CAAiB,QAAA,CACjB,sBAAuB,QAAA,CAGvB,uBAAA,CAAyB,OAAA,CACzB,wBAAA,CAA0B,OAAA,CAC1B,eAAA,CAAiB,QACjB,aAAA,CAAe,OAAA,CACf,kBAAmB,OAKrB,EAkCO,SAASC,EAAAA,CAAuBC,CAAAA,CAAyC,CAC9E,IAAMC,CAAAA,CAASD,EAAa,CAAC,CAAA,CACvBlrB,EAAUkrB,CAAAA,CAAa,CAAC,EAE9B,GAAIC,CAAAA,GAAW,aAAA,CACb,MAAM,IAAI,KAAA,CAAM,0CAA0C,CAAA,CAI5D,IAAMC,EAAaprB,CAAAA,CAQnB,OAAIorB,EAAW,cAAA,EAAkBA,CAAAA,CAAW,cAAA,CAAe,MAAA,CAAS,CAAA,CAC3D,QAAA,EAILA,EAAW,sBAAA,EAA0BA,CAAAA,CAAW,uBAAuB,MAAA,CAAS,CAAA,CAC3E,UAKX,CA+BO,SAASC,EAAAA,CAAqBC,CAAAA,CAAuC,CAC1E,IAAMH,EAASG,CAAAA,CAAW,CAAC,EAE3B,GAAIH,CAAAA,GAAW,mBAAqBA,CAAAA,GAAW,iBAAA,CAC7C,MAAM,IAAI,KAAA,CAAM,uCAAuC,CAAA,CAIzD,OAAO,QACT,CAoBO,SAASI,GAAsBnvB,CAAAA,CAA+B,CACnE,IAAM+uB,CAAAA,CAAS/uB,CAAAA,CAAG,CAAC,EAGnB,OAAI+uB,CAAAA,GAAW,cACNF,EAAAA,CAAuB7uB,CAAE,EAI9B+uB,CAAAA,GAAW,iBAAA,EAAqBA,CAAAA,GAAW,iBAAA,CACtCE,EAAAA,CAAqBjvB,CAAE,EAIzB4uB,EAAAA,CAAwBG,CAAM,GAAK,SAC5C,CAkCO,SAASK,EAAAA,CAAqBtvB,CAAAA,CAAkC,CACrE,IAAIuvB,CAAAA,CAAmC,SAAA,CAEvC,QAAWrvB,CAAAA,IAAMF,CAAAA,CAAK,CACpB,IAAMqC,CAAAA,CAAYgtB,GAAsBnvB,CAAE,CAAA,CAG1C,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,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,YAAA,CAAc,OAAQlJ,CAAQ,CAAA,CAC5C,WAAY,CAAC,CACX,UAAAlM,CAAAA,CACA,SAAA,CAAAghC,CACF,CAAA,GAGM,CACJ,GAAI,CAAC90B,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,yDAAoD,EAGtE,IAAIY,CAAAA,CACJ,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,EACxBl0B,CAAAA,CAAahB,CAAAA,CAAW,WAAWk1B,CAAS,CAAA,CAE5Cl0B,EAAahB,CAAAA,CAAW,IAAA,CAAKk1B,CAAS,CAAA,CAGjC1vB,CAAAA,CACL,CAACtR,CAAS,CAAA,CACV8M,CACF,CACF,CACF,CAAC,CACH,CC9BO,SAASm0B,GACd/0B,CAAAA,CACAyH,CAAAA,CACAutB,EAAmD,QAAA,CACnD,CACA,OAAO9rB,sBAAAA,CAAY,CACjB,YAAa,CAAC,YAAA,CAAc,gBAAiBlJ,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,OAAA,EAAS,qBAAA,CAClB,MAAM,IAAI,KAAA,CAAM,qDAAgD,CAAA,CAGlE,OAAOA,EAAK,OAAA,CAAQ,qBAAA,CAAsBzH,EAAU,CAAClM,CAAS,CAAA,CAAGkhC,CAAO,CAC1E,CACF,CAAC,CACH,CCpBO,SAASC,EAAAA,CAA6BC,EAAc,GAAA,CAAK,CAC9D,OAAOhsB,sBAAAA,CAAY,CACjB,YAAa,CAAC,YAAA,CAAc,iBAAA,CAAmBgsB,CAAW,CAAA,CAC1D,UAAA,CAAY,MAAO,CAAE,SAAA,CAAAphC,CAAU,CAAA,GACtBkU,mBAAAA,CAAG,cAAclU,CAAAA,CAAW,CAAE,QAAA,CAAUohC,CAAY,CAAA,CAAG,IAAM,CAAC,CAAC,CAE1E,CAAC,CACH,CCRO,SAASC,EAAAA,EAAiC,CAC/C,OAAOzmB,uBAAAA,CAAa,CAClB,SAAU,CAAC,YAAA,CAAc,kBAAkB,CAAA,CAC3C,OAAA,CAAS,SACA,MAAMzS,CAAAA,CAAQ,qCAAsC,EAAE,CAEjE,CAAC,CACH,CCEO,SAASm5B,EAAAA,CACdj+B,EACAqG,CAAAA,CACA63B,CAAAA,CACU,CACV,OAAO,CACL,GAAGl+B,CAAAA,CACH,GAAIqG,CAAAA,EAAY,EAAC,CACjB,KAAA,CAAO63B,EAAK,KAAA,CACZ,IAAA,CAAMA,EAAK,IACb,CACF,CAQO,SAASC,EAAAA,CACd93B,CAAAA,CACA63B,CAAAA,CACU,CACV,OAAO,CACL,GAAI73B,CAAAA,EAAY,EAAC,CACjB,KAAA,CAAO63B,EAAK,KAAA,CACZ,IAAA,CAAMA,EAAK,IACb,CACF,CCjCO,SAASE,EAAAA,CAAev1B,EAAkBxK,CAAAA,CAA0B,CACzE,OAAO0T,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,cAAA,CAAgBlJ,CAAQ,CAAA,CAC/C,UAAA,CAAY,MAAO,CAAE,KAAA,CAAAuhB,EAAO,IAAA,CAAArnB,CAAK,CAAA,GAAuC,CACtE,GAAI,CAAC1E,EACH,MAAM,IAAI,MAAM,mCAAmC,CAAA,CAGrD,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,6BACxB,CACE,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAAhV,EACA,KAAA,CAAA+rB,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,qCAAA,EAAwCA,EAAS,MAAM,CAAA,CAAE,CAAA,CAE3E,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,SAAA,CAAUA,EAAUqoB,CAAAA,CAAW,CAC7B,IAAMH,CAAAA,CAAc7Y,CAAAA,EAAe,CAK7B2oB,CAAAA,CAAcF,EAAAA,CAAmB93B,CAAAA,CAAUqoB,CAAS,CAAA,CAG1DH,CAAAA,CAAY,aACVtK,EAAAA,CAAyBpb,CAAAA,CAAUxK,CAAI,CAAA,CAAE,QAAA,CACxCpG,GAAS,CAAComC,CAAAA,CAAa,GAAIpmC,CAAAA,EAAQ,EAAG,CACzC,CAAA,CAGAs2B,EAAY,cAAA,CACV,CAAE,QAAA,CAAU,CAAC,OAAA,CAAS,WAAA,CAAa,WAAY1lB,CAAQ,CAAE,EACxDkf,CAAAA,EACMA,CAAAA,EAEE,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAACxM,CAAAA,CAAM+iB,CAAAA,GAC9BA,IAAU,CAAA,CACN,CAAE,GAAG/iB,CAAAA,CAAM,IAAA,CAAM,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,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,eAAA,CAAiBlJ,CAAQ,EAChD,UAAA,CAAY,MAAO,CACjB,UAAA,CAAA21B,CAAAA,CACA,KAAA,CAAApU,CAAAA,CACA,IAAA,CAAArnB,CACF,IAIM,CACJ,GAAI,CAAC1E,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAGrD,IAAMgI,CAAAA,CAAW,MADAyQ,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,+BAAA,CACxB,CACE,OAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,KAAAhV,CAAAA,CACA,EAAA,CAAImgC,EACJ,KAAA,CAAApU,CAAAA,CACA,KAAArnB,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,EAGA,GAAI,CAACsD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2CA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAE9E,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,SAAA,CAAUA,CAAAA,CAAUqoB,CAAAA,CAAW,CAC7B,IAAMH,EAAc7Y,CAAAA,EAAe,CAK7B+oB,EAAeC,CAAAA,EACnBT,EAAAA,CAAoBS,EAAUr4B,CAAAA,CAAUqoB,CAAS,EAGnDH,CAAAA,CAAY,YAAA,CACVtK,GAAyBpb,CAAAA,CAAUxK,CAAI,EAAE,QAAA,CACxCpG,CAAAA,EACCA,GAAM,GAAA,CAAKymC,CAAAA,EACTA,CAAAA,CAAS,EAAA,GAAOhQ,CAAAA,CAAU,UAAA,CAAa+P,EAAYC,CAAQ,CAAA,CAAIA,CACjE,CAAA,EAAK,EACT,CAAA,CAGAnQ,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,MAAM,GAAA,CAAKxM,CAAAA,GAAU,CAClC,GAAGA,CAAAA,CACH,KAAMA,CAAAA,CAAK,IAAA,CAAK,IAAKmjB,CAAAA,EACnBA,CAAAA,CAAS,KAAOhQ,CAAAA,CAAU,UAAA,CAAa+P,EAAYC,CAAQ,CAAA,CAAIA,CACjE,CACF,CAAA,CAAE,CACJ,CAEJ,EACF,CACF,CAAC,CACH,CC/EO,SAASC,EAAAA,CACd91B,CAAAA,CACAxK,CAAAA,CACA,CACA,OAAO0T,uBAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,iBAAA,CAAmBlJ,CAAQ,CAAA,CAClD,UAAA,CAAY,MAAO,CAAE,UAAA,CAAA21B,CAAW,IAA8B,CAC5D,GAAI,CAACngC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mCAAmC,EAIrD,IAAMgI,CAAAA,CAAW,MAFAyQ,CAAAA,EAAc,CAECzD,EAAO,cAAA,CAAiB,+BAAA,CAAiC,CACvF,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CACnB,KAAAhV,CAAAA,CACA,EAAA,CAAImgC,CACN,CAAC,CAAA,CACD,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAKD,GAAI,CAACn4B,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,wCAAA,EAA2CA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAG9E,OAAOA,CACT,CAAA,CACA,SAAA,CAAUooB,EAAOC,CAAAA,CAAW,CAC1B,IAAMH,CAAAA,CAAc7Y,CAAAA,GAGpB6Y,CAAAA,CAAY,YAAA,CACVtK,GAAyBpb,CAAAA,CAAUxK,CAAI,EAAE,QAAA,CACxCpG,CAAAA,EAAS,CAAC,GAAIA,CAAAA,EAAQ,EAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAE,EAAA,CAAA4C,CAAG,CAAA,GAAMA,CAAAA,GAAO6zB,EAAU,UAAU,CAC5E,CAAA,CAGAH,CAAAA,CAAY,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,IAAKxM,CAAAA,GAAU,CAClC,GAAGA,CAAAA,CACH,IAAA,CAAMA,EAAK,IAAA,CAAK,MAAA,CAAQmjB,GAAaA,CAAAA,CAAS,EAAA,GAAOhQ,EAAU,UAAU,CAC3E,EAAE,CACJ,CAEJ,EACF,CACF,CAAC,CACH,CCxDA,eAAekQ,EAAqBv4B,CAAAA,CAAgC,CAClE,GAAI,CAACA,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAIw4B,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAY,MAAMx4B,CAAAA,CAAS,IAAA,GAC7B,CAAA,KAAQ,CACNw4B,CAAAA,CAAY,OACd,CACA,IAAM/iC,EAAQ,IAAI,KAAA,CAAM,8BAA8BuK,CAAAA,CAAS,MAAM,EAAE,CAAA,CACvE,MAAAvK,EAAM,MAAA,CAASuK,CAAAA,CAAS,OACxBvK,CAAAA,CAAM,IAAA,CAAO+iC,EACP/iC,CACR,CAGA,IAAMsC,CAAAA,CAAO,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,IAAA,CAAK,sCAAA,CAAwCA,CAAAA,CAAG,WAAA,CAAavD,CAAI,CAAA,CAClE,EACT,CACF,CAEA,eAAsB0gC,GACpBj2B,CAAAA,CACAsxB,CAAAA,CACA4E,EACAC,CAAAA,CAC+C,CAE/C,IAAM34B,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,6BAAA,CAA+B,CACrF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAE,QAAA,CAAAxK,CAAAA,CAAU,KAAA,CAAAsxB,CAAAA,CAAO,QAAA,CAAA4E,CAAAA,CAAU,cAAeC,CAAa,CAAC,CACjF,CAAC,CAAA,CAEK/mC,EAAO,MAAM2mC,CAAAA,CAA2Cv4B,CAAQ,CAAA,CACtE,OAAO,CAAE,OAAQA,CAAAA,CAAS,MAAA,CAAQ,KAAApO,CAAK,CACzC,CAEA,eAAsBgnC,EAAAA,CACpB9E,EAC+C,CAE/C,IAAM9zB,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,CAAE,MAAA8mB,CAAM,CAAC,CAChC,CAAC,CAAA,CAEKliC,CAAAA,CAAO,MAAM2mC,CAAAA,CAA2Cv4B,CAAQ,EACtE,OAAO,CAAE,OAAQA,CAAAA,CAAS,MAAA,CAAQ,IAAA,CAAApO,CAAK,CACzC,CAEA,eAAsBinC,EAAAA,CACpB7gC,CAAAA,CACA8gC,EACAC,CAAAA,CAAsB,EAAA,CACtBjxB,EAAsB,EAAA,CACP,CACf,IAAMxL,CAAAA,CAKF,CAAE,KAAAtE,CAAAA,CAAM,EAAA,CAAA8gC,CAAG,CAAA,CAEXC,CAAAA,GACFz8B,EAAO,EAAA,CAAKy8B,CAAAA,CAAAA,CAEVjxB,CAAAA,GACFxL,CAAAA,CAAO,EAAA,CAAKwL,CAAAA,CAAAA,CAId,IAAM9H,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,2BAAA,CAA6B,CACnF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU1Q,CAAM,CAC7B,CAAC,CAAA,CAED,MAAMi8B,CAAAA,CAAkBv4B,CAAQ,EAClC,CAEA,eAAsBg5B,GACpBhhC,CAAAA,CACAib,CAAAA,CACA0B,EAAuB,IAAA,CACvBU,CAAAA,CAAsB,KACM,CAC5B,IAAMzjB,EAAqF,CACzF,IAAA,CAAAoG,CACF,CAAA,CAEIib,CAAAA,GACFrhB,EAAK,MAAA,CAASqhB,CAAAA,CAAAA,CAGZ0B,CAAAA,GACF/iB,CAAAA,CAAK,KAAA,CAAQ+iB,CAAAA,CAAAA,CAGXU,IACFzjB,CAAAA,CAAK,IAAA,CAAOyjB,GAId,IAAMrV,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,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAAqCv4B,CAAQ,CACtD,CAEA,eAAsBi5B,EAAAA,CACpBjhC,CAAAA,CACAwK,EACA02B,CAAAA,CACAC,CAAAA,CACAC,EACA7uB,CAAAA,CACiC,CACjC,IAAM3Y,CAAAA,CAAO,CACX,KAAAoG,CAAAA,CACA,QAAA,CAAAwK,CAAAA,CACA,KAAA,CAAA+H,CAAAA,CACA,MAAA,CAAA2uB,EACA,aAAA,CAAAC,CAAAA,CACA,aAAAC,CACF,CAAA,CAGMp5B,EAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,8BAAA,CAAgC,CACtF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,EAA0Cv4B,CAAQ,CAC3D,CAEA,eAAsBq5B,EAAAA,CACpBrhC,EACAwK,CAAAA,CACA+H,CAAAA,CACiC,CACjC,IAAM3Y,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,SAAAwK,CAAAA,CAAU,KAAA,CAAA+H,CAAM,CAAA,CAE/BvK,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,CAA0Cv4B,CAAQ,CAC3D,CAEA,eAAsBs5B,GACpBthC,CAAAA,CACAxD,CAAAA,CACkC,CAClC,IAAM5C,CAAAA,CAAkD,CACtD,IAAA,CAAAoG,CACF,EACIxD,CAAAA,GACF5C,CAAAA,CAAK,GAAK4C,CAAAA,CAAAA,CAIZ,IAAMwL,EAAW,MADAyQ,CAAAA,GACezD,CAAAA,CAAO,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,EAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBu5B,EAAAA,CAASvhC,EAA0BqE,CAAAA,CAA+C,CACtG,IAAMzK,CAAAA,CAAO,CAAE,IAAA,CAAAoG,EAAM,GAAA,CAAAqE,CAAI,EAEnB2D,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,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CAOA,IAAMw5B,EAAAA,CAAc,sBAAA,CAEpB,eAAsBC,EAAAA,CACpBC,CAAAA,CACAnvB,CAAAA,CACA1N,EAC0B,CAC1B,IAAM88B,EAAWlpB,CAAAA,EAAc,CACzBmpB,EAAW,IAAI,QAAA,CACrBA,CAAAA,CAAS,MAAA,CAAO,MAAA,CAAQF,CAAI,EAE5B,IAAM15B,CAAAA,CAAW,MAAM25B,CAAAA,CAAS,CAAA,EAAGH,EAAW,CAAA,IAAA,EAAOjvB,CAAK,GAAI,CAC5D,MAAA,CAAQ,OACR,IAAA,CAAMqvB,CAAAA,CACN,OAAA/8B,CACF,CAAC,EAED,OAAO07B,CAAAA,CAAmCv4B,CAAQ,CACpD,CAOA,eAAsB65B,GACpBH,CAAAA,CACAl3B,CAAAA,CACAvP,EACA4J,CAAAA,CAC0B,CAC1B,IAAM88B,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBmpB,CAAAA,CAAW,IAAI,QAAA,CACrBA,EAAS,MAAA,CAAO,MAAA,CAAQF,CAAI,CAAA,CAE5B,IAAM15B,EAAW,MAAM25B,CAAAA,CAAS,CAAA,EAAG3sB,CAAAA,CAAO,SAAS,CAAA,CAAA,EAAIxK,CAAQ,CAAA,CAAA,EAAIvP,CAAS,GAAI,CAC9E,MAAA,CAAQ,OACR,IAAA,CAAM2mC,CAAAA,CACN,OAAA/8B,CACF,CAAC,EAED,OAAO07B,CAAAA,CAAmCv4B,CAAQ,CACpD,CAEA,eAAsB85B,EAAAA,CACpB9hC,CAAAA,CACA+hC,CAAAA,CACkC,CAClC,IAAMnoC,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,GAAI+hC,CAAQ,CAAA,CAE3B/5B,EAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,4BAAA,CAA8B,CACpF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,EAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBg6B,EAAAA,CACpBhiC,EACA+rB,CAAAA,CACArnB,CAAAA,CACAghB,EACAvF,CAAAA,CAC8B,CAC9B,IAAMvmB,CAAAA,CAAO,CAAE,KAAAoG,CAAAA,CAAM,KAAA,CAAA+rB,CAAAA,CAAO,IAAA,CAAArnB,CAAAA,CAAM,IAAA,CAAAghB,EAAM,IAAA,CAAAvF,CAAK,EAEvCnY,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,yBAAA,CAA2B,CACjF,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,CAAAA,CAAuCv4B,CAAQ,CACxD,CAEA,eAAsBi6B,GACpBjiC,CAAAA,CACAkiC,CAAAA,CACAnW,EACArnB,CAAAA,CACAghB,CAAAA,CACAvF,EAC8B,CAC9B,IAAMvmB,EAAO,CAAE,IAAA,CAAAoG,EAAM,EAAA,CAAIkiC,CAAAA,CAAS,KAAA,CAAAnW,CAAAA,CAAO,IAAA,CAAArnB,CAAAA,CAAM,KAAAghB,CAAAA,CAAM,IAAA,CAAAvF,CAAK,CAAA,CAEpDnY,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,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAAuCv4B,CAAQ,CACxD,CAEA,eAAsBm6B,EAAAA,CACpBniC,CAAAA,CACAkiC,EACkC,CAClC,IAAMtoC,EAAO,CAAE,IAAA,CAAAoG,EAAM,EAAA,CAAIkiC,CAAQ,EAE3Bl6B,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,CAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBo6B,EAAAA,CACpBpiC,CAAAA,CACAgb,CAAAA,CACA+Q,CAAAA,CACArnB,EACAyb,CAAAA,CACA/W,CAAAA,CACAi5B,EACAC,CAAAA,CACkC,CAClC,IAAM1oC,CAAAA,CAAgC,CACpC,KAAAoG,CAAAA,CACA,QAAA,CAAAgb,EACA,KAAA,CAAA+Q,CAAAA,CACA,KAAArnB,CAAAA,CACA,IAAA,CAAAyb,EACA,QAAA,CAAAkiB,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,CAEIl5B,CAAAA,GACFxP,EAAK,OAAA,CAAUwP,CAAAA,CAAAA,CAIjB,IAAMpB,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,4BAAA,CAA8B,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,eAAsBu6B,GACpBviC,CAAAA,CACAxD,CAAAA,CACkC,CAClC,IAAM5C,CAAAA,CAAO,CAAE,IAAA,CAAAoG,CAAAA,CAAM,GAAAxD,CAAG,CAAA,CAElBwL,EAAW,MADAyQ,CAAAA,EAAc,CACCzD,CAAAA,CAAO,cAAA,CAAiB,+BAAA,CAAiC,CACvF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,CAAA,CAED,OAAO2mC,EAA2Cv4B,CAAQ,CAC5D,CAEA,eAAsBw6B,EAAAA,CAAaxiC,CAAAA,CAA0BxD,CAAAA,CAAiC,CAC5F,IAAM5C,EAAO,CAAE,IAAA,CAAAoG,EAAM,EAAA,CAAAxD,CAAG,EAElBwL,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,6BAAA,CAA+B,CACrF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CAAC,EAED,OAAO2mC,CAAAA,CAA8Bv4B,CAAQ,CAC/C,CAEA,eAAsBy6B,EAAAA,CACpBziC,CAAAA,CACA+a,CAAAA,CACAC,EACoD,CACpD,IAAMphB,EAAO,CAAE,IAAA,CAAAoG,EAAM,MAAA,CAAA+a,CAAAA,CAAQ,QAAA,CAAAC,CAAS,CAAA,CAEhChT,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,CAA6Dv4B,CAAQ,CAC9E,CAEA,eAAsB06B,EAAAA,CACpBl4B,EACAsxB,CAAAA,CACA6G,CAAAA,CACkC,CAClC,IAAMC,CAAAA,CAAW,CACf,QAAA,CAAAp4B,CAAAA,CACA,KAAA,CAAAsxB,EACA,MAAA,CAAA6G,CACF,EAEM36B,CAAAA,CAAW,MADAyQ,GAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,oCAAA,CACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU4tB,CAAQ,CAC/B,CACF,EAEA,OAAOrC,CAAAA,CAA2Cv4B,CAAQ,CAC5D,CCjcO,SAAS66B,EAAAA,CACdr4B,CAAAA,CACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,SAAU,KAAA,CAAOlJ,CAAQ,CAAA,CAChD,UAAA,CAAY,MAAO,CACjB,MAAAuhB,CAAAA,CACA,IAAA,CAAArnB,EACA,IAAA,CAAAghB,CAAAA,CACA,KAAAvF,CACF,CAAA,GAKM,CACJ,GAAI,CAAC3V,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,EAE5D,OAAOgiC,EAAAA,CAAShiC,EAAM+rB,CAAAA,CAAOrnB,CAAAA,CAAMghB,EAAMvF,CAAI,CAC/C,EACA,SAAA,CAAYvmB,CAAAA,EAAS,CACnB6Z,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,CAAAA,EAAe,CAEtBzd,GAAM,MAAA,CACRkgC,CAAAA,CAAG,aAAa3gB,CAAAA,CAAU,KAAA,CAAM,OAAO3O,CAAQ,CAAA,CAAG5Q,CAAAA,CAAK,MAAM,CAAA,CAE7DkgC,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,CAAA,CAGrEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,eAAe3O,CAAQ,CAAE,CAAC,EAC7E,CAAA,CACA,QAAA+lB,CACF,CAAC,CACH,CCtCO,SAASuS,EAAAA,CACdt4B,CAAAA,CACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,SAAU,QAAA,CAAUlJ,CAAQ,CAAA,CACnD,UAAA,CAAY,MAAO,CACjB,QAAA03B,CAAAA,CACA,KAAA,CAAAnW,EACA,IAAA,CAAArnB,CAAAA,CACA,KAAAghB,CAAAA,CACA,IAAA,CAAAvF,CACF,CAAA,GAMM,CACJ,GAAI,CAAC3V,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,MAAM,kDAA6C,CAAA,CAE/D,OAAOiiC,EAAAA,CAAYjiC,CAAAA,CAAMkiC,EAASnW,CAAAA,CAAOrnB,CAAAA,CAAMghB,EAAMvF,CAAI,CAC3D,EACA,SAAA,CAAW,IAAM,CACf1M,CAAAA,IAAY,CACZ,IAAMqmB,EAAKziB,CAAAA,EAAe,CAC1ByiB,EAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,EACnEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,MAAM,cAAA,CAAe3O,CAAQ,CAAE,CAAC,EAC7E,CAAA,CACA,QAAA+lB,CACF,CAAC,CACH,CCjCO,SAASwS,EAAAA,CACdv4B,CAAAA,CACAxK,EACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,QAAA,CAAU,QAAA,CAAUlJ,CAAQ,EACnD,UAAA,CAAY,MAAO,CAAE,OAAA,CAAA03B,CAAQ,IAA2B,CACtD,GAAI,CAAC13B,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CAE/D,OAAOmiC,GAAYniC,CAAAA,CAAMkiC,CAAO,CAClC,CAAA,CACA,QAAA,CAAU,MAAO,CAAE,OAAA,CAAAA,CAAQ,IAAM,CAC/B,GAAI,CAAC13B,CAAAA,CACH,OAGF,IAAMsvB,CAAAA,CAAKziB,CAAAA,GACL2iB,CAAAA,CAAU7gB,CAAAA,CAAU,MAAM,MAAA,CAAO3O,CAAQ,EACzCyvB,CAAAA,CAAiB9gB,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe3O,CAAQ,CAAA,CAE9D,MAAM,OAAA,CAAQ,GAAA,CAAI,CAChBsvB,CAAAA,CAAG,aAAA,CAAc,CAAE,QAAA,CAAUE,CAAQ,CAAC,CAAA,CACtCF,CAAAA,CAAG,aAAA,CAAc,CAAE,QAAA,CAAUG,CAAe,CAAC,CAC/C,CAAC,EAED,IAAME,CAAAA,CAAeL,CAAAA,CAAG,YAAA,CAAsBE,CAAO,CAAA,CACjDG,GACFL,CAAAA,CAAG,YAAA,CACDE,EACAG,CAAAA,CAAa,MAAA,CAAQ93B,GAAMA,CAAAA,CAAE,GAAA,GAAQ6/B,CAAO,CAC9C,CAAA,CAGF,IAAM5H,CAAAA,CAAkBR,CAAAA,CAAG,eAAqD,CAC9E,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,IAAA,CAAMA,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQ7a,GAAMA,CAAAA,CAAE,GAAA,GAAQ6/B,CAAO,CACjD,CAAA,CAAE,CACJ,CAAC,CAAA,CAIL,OAAO,CAAE,YAAA,CAAA/H,EAAc,gBAAA,CAAAI,CAAiB,CAC1C,CAAA,CACA,SAAA,CAAW,IAAM,CACf9mB,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,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,KAAA,CAAM,cAAA,CAAe3O,CAAQ,CAAE,CAAC,EAC7E,CAAA,CACA,OAAA,CAAS,CAAC9G,EAAKs/B,CAAAA,CAAYxI,CAAAA,GAAY,CACrC,IAAMV,CAAAA,CAAKziB,GAAe,CAI1B,GAHImjB,GAAS,YAAA,EACXV,CAAAA,CAAG,aAAa3gB,CAAAA,CAAU,KAAA,CAAM,OAAO3O,CAAQ,CAAA,CAAGgwB,EAAQ,YAAY,CAAA,CAEpEA,CAAAA,EAAS,gBAAA,CACX,IAAA,GAAW,CAAChgC,EAAKZ,CAAI,CAAA,GAAK4gC,EAAQ,gBAAA,CAChCV,CAAAA,CAAG,aAAat/B,CAAAA,CAAKZ,CAAI,CAAA,CAG7B22B,CAAAA,GAAU7sB,CAAG,EACf,CACF,CAAC,CACH,CC3EO,SAASu/B,EAAAA,CACdz4B,CAAAA,CACAxK,CAAAA,CACAyT,CAAAA,CACA8c,EACA,CACA,OAAO7c,uBAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,WAAA,CAAa,MAAOlJ,CAAQ,CAAA,CACnD,WAAY,MAAO,CACjB,SAAAwQ,CAAAA,CACA,KAAA,CAAA+Q,EACA,IAAA,CAAArnB,CAAAA,CACA,IAAA,CAAAyb,CAAAA,CACA,OAAA,CAAA/W,CAAAA,CACA,SAAAi5B,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,GAQM,CACJ,GAAI,CAAC93B,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,MAAM,kDAA6C,CAAA,CAE/D,OAAOoiC,EAAAA,CAAYpiC,CAAAA,CAAMgb,EAAU+Q,CAAAA,CAAOrnB,CAAAA,CAAMyb,CAAAA,CAAM/W,CAAAA,CAASi5B,CAAAA,CAAUC,CAAM,CACjF,CAAA,CACA,SAAA,CAAW,IAAM,CACf7uB,CAAAA,KACA4D,CAAAA,EAAe,CAAE,kBAAkB,CACjC,QAAA,CAAU8B,EAAU,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,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,QAAS,WAAA,CAAa,QAAA,CAAUlJ,CAAQ,CAAA,CACtD,UAAA,CAAY,MAAO,CAAE,EAAA,CAAAhO,CAAG,IAAsB,CAC5C,GAAI,CAACgO,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,MAAM,qDAAgD,CAAA,CAElE,OAAOuiC,EAAAA,CAAeviC,CAAAA,CAAMxD,CAAE,CAChC,CAAA,CACA,UAAY5C,CAAAA,EAAS,CACnB6Z,CAAAA,IAAY,CACZ,IAAMqmB,CAAAA,CAAKziB,GAAe,CAEtBzd,CAAAA,CACFkgC,EAAG,YAAA,CAAa3gB,CAAAA,CAAU,MAAM,SAAA,CAAU3O,CAAQ,CAAA,CAAG5Q,CAAI,CAAA,CAEzDkgC,CAAAA,CAAG,kBAAkB,CAAE,QAAA,CAAU3gB,EAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAAE,CAAC,EAE1E,CAAA,CACA,OAAA,CAAA+lB,CACF,CAAC,CACH,CC1BO,SAAS4S,EAAAA,CACd34B,EACAxK,CAAAA,CACAyT,CAAAA,CACA8c,EACA,CACA,OAAO7c,uBAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,WAAA,CAAa,MAAA,CAAQlJ,CAAQ,CAAA,CACpD,UAAA,CAAY,MAAO,CAAE,EAAA,CAAAhO,CAAG,CAAA,GAAsB,CAC5C,GAAI,CAACgO,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,MAAM,mDAA8C,CAAA,CAEhE,OAAOwiC,EAAAA,CAAaxiC,CAAAA,CAAMxD,CAAE,CAC9B,CAAA,CACA,SAAA,CAAY5C,CAAAA,EAAS,CACnB6Z,CAAAA,KACA,IAAMqmB,CAAAA,CAAKziB,GAAe,CAEtBzd,CAAAA,CACFkgC,EAAG,YAAA,CAAa3gB,CAAAA,CAAU,MAAM,SAAA,CAAU3O,CAAQ,EAAG5Q,CAAI,CAAA,CAEzDkgC,EAAG,iBAAA,CAAkB,CAAE,SAAU3gB,CAAAA,CAAU,KAAA,CAAM,SAAA,CAAU3O,CAAQ,CAAE,CAAC,EAGxEsvB,CAAAA,CAAG,iBAAA,CAAkB,CAAE,QAAA,CAAU3gB,CAAAA,CAAU,MAAM,MAAA,CAAO3O,CAAQ,CAAE,CAAC,EACrE,CAAA,CACA,QAAA+lB,CACF,CAAC,CACH,CChBO,SAAS6S,EAAAA,CACd54B,CAAAA,CACAxK,CAAAA,CACAyT,EACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,SAAU,KAAA,CAAOlJ,CAAQ,EAChD,UAAA,CAAY,MAAO,CAAE,GAAA,CAAAnG,CAAAA,CAAK,KAAMg/B,CAAS,CAAA,GAAsC,CAC7E,IAAMC,CAAAA,CAAgBD,CAAAA,EAAYrjC,EAElC,GAAI,CAACwK,GAAY,CAAC84B,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAE5D,OAAO/B,EAAAA,CAAS+B,EAAej/B,CAAG,CACpC,EACA,SAAA,CAAW,IAAM,CACfoP,CAAAA,IAAY,CACZ4D,CAAAA,EAAe,CAAE,iBAAA,CAAkB,CACjC,SAAU8B,CAAAA,CAAU,KAAA,CAAM,OAAO3O,CAAQ,CAC3C,CAAC,EACH,CAAA,CACA,QAAA+lB,CACF,CAAC,CACH,CCtBO,SAASgT,EAAAA,CACd/4B,CAAAA,CACAxK,CAAAA,CACAyT,CAAAA,CACA8c,CAAAA,CACA,CACA,OAAO7c,sBAAAA,CAAY,CACjB,YAAa,CAAC,OAAA,CAAS,SAAU,QAAA,CAAUlJ,CAAQ,CAAA,CACnD,UAAA,CAAY,MAAO,CAAE,QAAAu3B,CAAQ,CAAA,GAA2B,CACtD,GAAI,CAACv3B,GAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kDAA6C,EAE/D,OAAO8hC,EAAAA,CAAY9hC,EAAM+hC,CAAO,CAClC,EACA,SAAA,CAAW,CAAC3R,EAAOC,CAAAA,GAAc,CAC/B5c,KAAY,CACZ,IAAMqmB,EAAKziB,CAAAA,EAAe,CACpB,CAAE,OAAA,CAAA0qB,CAAQ,CAAA,CAAI1R,CAAAA,CAGpByJ,CAAAA,CAAG,YAAA,CACD,CAAC,OAAA,CAAS,QAAA,CAAUtvB,CAAQ,CAAA,CAC3Bg5B,CAAAA,EAASA,GAAM,MAAA,CAAQC,CAAAA,EAAQA,CAAAA,CAAI,GAAA,GAAQ1B,CAAO,CACrD,EAGAjI,CAAAA,CAAG,cAAA,CACD,CAAE,QAAA,CAAU,CAAC,QAAS,QAAA,CAAU,UAAA,CAAYtvB,CAAQ,CAAE,CAAA,CACrDkf,CAAAA,EACMA,GACE,CACL,GAAGA,EACH,KAAA,CAAOA,CAAAA,CAAQ,MAAM,GAAA,CAAKxM,CAAAA,GAAU,CAClC,GAAGA,CAAAA,CACH,KAAMA,CAAAA,CAAK,IAAA,CAAK,OAAQumB,CAAAA,EAAQA,CAAAA,CAAI,MAAQ1B,CAAO,CACrD,CAAA,CAAE,CACJ,CAEJ,EACF,EACA,OAAA,CAAAxR,CACF,CAAC,CACH,CC1CO,SAASmT,EAAAA,CACdjwB,CAAAA,CACA8c,EACA,CACA,OAAO7c,uBAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,QAAA,CAAU,QAAQ,CAAA,CACzC,UAAA,CAAY,MAAO,CACjB,IAAA,CAAAguB,CAAAA,CACA,MAAAnvB,CAAAA,CACA,MAAA,CAAA1N,CACF,CAAA,GAKS48B,EAAAA,CAAYC,EAAMnvB,CAAAA,CAAO1N,CAAM,EAExC,SAAA,CAAA4O,CAAAA,CACA,QAAA8c,CACF,CAAC,CACH,CClCA,SAAS/E,EAAAA,CAAczQ,CAAAA,CAAgBC,CAAAA,CAAkB,CACvD,OAAO,CAAA,EAAA,EAAKD,CAAM,IAAIC,CAAQ,CAAA,CAChC,CAEA,SAAS2oB,EAAAA,CACP5oB,CAAAA,CACAC,CAAAA,CACA8e,CAAAA,CACmB,CAEnB,QADoBA,CAAAA,EAAMziB,CAAAA,IACP,YAAA,CACjB8B,CAAAA,CAAU,MAAM,KAAA,CAAMqS,EAAAA,CAAczQ,CAAAA,CAAQC,CAAQ,CAAC,CACvD,CACF,CAEA,SAAS4oB,GAAgBxf,CAAAA,CAAc0V,CAAAA,CAAkB,EACnCA,CAAAA,EAAMziB,CAAAA,IACd,YAAA,CACV8B,CAAAA,CAAU,MAAM,KAAA,CAAMqS,EAAAA,CAAcpH,EAAM,MAAA,CAAQA,CAAAA,CAAM,QAAQ,CAAC,CAAA,CACjEA,CACF,EACF,CAEA,SAASyf,GACP9oB,CAAAA,CACAC,CAAAA,CACA8oB,EACAhK,CAAAA,CACmB,CACnB,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACnC3P,CAAAA,CAAO8jB,EAAAA,CAAczQ,EAAQC,CAAQ,CAAA,CACrCrZ,EAAWuuB,CAAAA,CAAY,YAAA,CAAoB/W,EAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAC,CAAA,CAC5E,GAAI,CAAC/F,CAAAA,CAAU,OAEf,IAAMoiC,CAAAA,CAAUD,CAAAA,CAAQniC,CAAQ,CAAA,CAChC,OAAAuuB,EAAY,YAAA,CAAoB/W,CAAAA,CAAU,MAAM,KAAA,CAAMzR,CAAI,EAAGq8B,CAAO,CAAA,CAC7DpiC,CACT,CASiBqiC,sCAAAA,CAAAA,CAAAA,EAAV,CACE,SAASC,CAAAA,CACdlpB,EACAC,CAAAA,CACA6B,CAAAA,CACAqnB,EACApK,CAAAA,CACA,CACA+J,GACE9oB,CAAAA,CACAC,CAAAA,CACCoJ,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,aAAcvH,CAAAA,CACd,KAAA,CAAO,CACL,GAAIuH,CAAAA,CAAM,OAAS,CACjB,IAAA,CAAM,KAAA,CACN,IAAA,CAAM,KAAA,CACN,WAAA,CAAa,EACb,WAAA,CAAa,CACf,EACA,WAAA,CAAavH,CAAAA,CAAM,OACnB,WAAA,CAAauH,CAAAA,CAAM,OAAO,WAAA,EAAe,CAC3C,EACA,WAAA,CAAavH,CAAAA,CAAM,OACnB,MAAA,CAAAqnB,CAAAA,CACA,qBAAsB,MAAA,CAAOA,CAAM,CACrC,CAAA,CAAA,CACApK,CACF,EACF,CA7BOkK,CAAAA,CAAS,WAAA,CAAAC,EA+BT,SAASE,CAAAA,CACdppB,EACAC,CAAAA,CACAopB,CAAAA,CACAtK,CAAAA,CACA,CACA+J,EAAAA,CACE9oB,CAAAA,CACAC,EACCoJ,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,OAAA,CAASggB,CACX,CAAA,CAAA,CACAtK,CACF,EACF,CAfOkK,CAAAA,CAAS,kBAAA,CAAAG,EAiBT,SAASE,CAAAA,CACdtpB,EACAC,CAAAA,CACAopB,CAAAA,CACAtK,EACA,CACA+J,EAAAA,CACE9oB,EACAC,CAAAA,CACCoJ,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,SAAUggB,CACZ,CAAA,CAAA,CACAtK,CACF,EACF,CAfOkK,CAAAA,CAAS,kBAAA,CAAAK,CAAAA,CAiBT,SAASC,EACdC,CAAAA,CACAzT,CAAAA,CACAC,EACA+I,CAAAA,CACA,CACA+J,GACE/S,CAAAA,CACAC,CAAAA,CACC3M,CAAAA,GAAW,CACV,GAAGA,CAAAA,CACH,SAAUA,CAAAA,CAAM,QAAA,CAAW,EAC3B,OAAA,CAAS,CAACmgB,EAAO,GAAGngB,CAAAA,CAAM,OAAO,CACnC,CAAA,CAAA,CACA0V,CACF,EACF,CAhBOkK,CAAAA,CAAS,SAAAM,CAAAA,CAkBT,SAASE,EAAchV,CAAAA,CAAkBsK,CAAAA,CAAkB,CAChEtK,CAAAA,CAAQ,OAAA,CAASpL,GAAUwf,EAAAA,CAAgBxf,CAAAA,CAAO0V,CAAE,CAAC,EACvD,CAFOkK,CAAAA,CAAS,aAAA,CAAAQ,CAAAA,CAIT,SAASC,CAAAA,CACd1pB,CAAAA,CACAC,EACA8e,CAAAA,CACA,CAAA,CACoBA,GAAMziB,CAAAA,EAAe,EAC7B,kBAAkB,CAC5B,QAAA,CAAU8B,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAMqS,EAAAA,CAAczQ,EAAQC,CAAQ,CAAC,CACjE,CAAC,EACH,CATOgpB,CAAAA,CAAS,eAAA,CAAAS,CAAAA,CAWT,SAASC,CAAAA,CACd3pB,CAAAA,CACAC,EACA8e,CAAAA,CACmB,CACnB,OAAO6J,EAAAA,CAAkB5oB,CAAAA,CAAQC,EAAU8e,CAAE,CAC/C,CANOkK,CAAAA,CAAS,QAAA,CAAAU,KAnGDV,8BAAAA,GAAA,EAAA,CAAA,CCrCV,SAASW,EAAAA,CACdC,CAAAA,CACApoB,EACAoU,CAAAA,CACS,CACT,IAAMiU,CAAAA,CAAiBD,CAAAA,CAAY,IAAA,CAAMprC,GAAMA,CAAAA,CAAE,KAAA,GAAUgjB,CAAK,CAAA,CAChE,OAAOoU,IAAW,CAAA,CAAIiU,CAAAA,CAAiB,CAACA,CAC1C,CAyBO,SAASC,GACdt6B,CAAAA,CACA6lB,CAAAA,CACAyJ,EACM,CACN,IAAM1V,EAAQ4f,8BAAAA,CAAuB,QAAA,CAAS3T,CAAAA,CAAU,MAAA,CAAQA,CAAAA,CAAU,QAAA,CAAUyJ,CAAE,CAAA,CACtF,GACE,CAAC1V,CAAAA,EAAO,YAAA,EACRugB,GAAuBvgB,CAAAA,CAAM,YAAA,CAAc5Z,EAAU6lB,CAAAA,CAAU,MAAM,EAErE,OAEF,IAAM0U,EAAW,CACf,GAAG3gB,EAAM,YAAA,CAAa,MAAA,CAAQ5qB,CAAAA,EAAMA,CAAAA,CAAE,KAAA,GAAUgR,CAAQ,EACxD,GAAI6lB,CAAAA,CAAU,SAAW,CAAA,CAAI,CAAC,CAAE,OAAA,CAASA,CAAAA,CAAU,MAAA,CAAQ,KAAA,CAAO7lB,CAAU,CAAC,EAAI,EACnF,EACMw6B,CAAAA,CAAY5gB,CAAAA,CAAM,QAAUiM,CAAAA,CAAU,SAAA,EAAa,CAAA,CAAA,CACzD2T,8BAAAA,CAAuB,WAAA,CACrB3T,CAAAA,CAAU,OACVA,CAAAA,CAAU,QAAA,CACV0U,EACAC,CAAAA,CACAlL,CACF,EACF,CA0DO,SAASmL,GACdz6B,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,OAAA,CAAS,MAAM,CAAA,CAChB/I,CAAAA,CACA,CAAC,CAAE,MAAA,CAAAuQ,CAAAA,CAAQ,SAAAC,CAAAA,CAAU,MAAA,CAAA4V,CAAO,CAAA,GAAM,CAChCD,GAAYnmB,CAAAA,CAAWuQ,CAAAA,CAAQC,CAAAA,CAAU4V,CAAM,CACjD,CAAA,CACA,MAAO76B,CAAAA,CAAas6B,CAAAA,GAAc,CAGhCyU,EAAAA,CAAqBt6B,CAAAA,CAAU6lB,CAAS,CAAA,CAKxC,IAAM5mB,CAAAA,CAAO1T,CAAAA,EAAQ,EAAA,EAAMA,CAAAA,EAAQ,MAOnC,GANIkc,CAAAA,EAAM,SAAS,cAAA,EAAkBxI,CAAAA,EACnCwI,EAAK,OAAA,CAAQ,cAAA,CAAe,IAAKxI,CAAAA,CAAM1T,CAAAA,EAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,EAKtEkc,CAAAA,EAAM,OAAA,EAAS,iBAAA,CAAmB,CACpC,IAAMizB,CAAAA,CAAe,IAAM,CACzBjzB,CAAAA,CAAK,QAAS,iBAAA,CAAmB,CAC/BkH,EAAU,KAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,MAAM,CAAA,CAAA,EAAIA,EAAU,QAAQ,CAAA,CAAE,EACnElX,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAClC,CAAC,EACH,CAAA,CAAA,CACa6H,CAAAA,EAAiB,WACjB,OAAA,CACX,UAAA,CAAW6yB,EAAc,GAAI,CAAA,CAE7BA,IAEJ,CACF,EACAjzB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC/GO,SAAS8yB,EAAAA,CACd36B,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAS,QAAQ,CAAA,CAClB/I,EACA,CAAC,CAAE,MAAA,CAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,CAAAA,CAAU,aAAAwW,CAAa,CAAA,GAAM,CACtCD,EAAAA,CAAc/mB,CAAAA,CAAWuQ,EAAQC,CAAAA,CAAUwW,CAAAA,EAAgB,KAAK,CAClE,CAAA,CACA,MAAOz7B,EAAas6B,CAAAA,GAAc,CAEhC,IAAMjM,CAAAA,CAAQ4f,8BAAAA,CAAuB,SAAS3T,CAAAA,CAAU,MAAA,CAAQA,EAAU,QAAQ,CAAA,CAClF,GAAIjM,CAAAA,CAAO,CACT,IAAMghB,CAAAA,CAAW,IAAA,CAAK,IAAI,CAAA,CAAA,CAAIhhB,CAAAA,CAAM,OAAA,EAAW,CAAA,GAAMiM,CAAAA,CAAU,YAAA,CAAe,GAAK,CAAA,CAAE,CAAA,CACrF2T,+BAAuB,kBAAA,CAAmB3T,CAAAA,CAAU,OAAQA,CAAAA,CAAU,QAAA,CAAU+U,CAAQ,EAC1F,CAKA,IAAM37B,EAAO1T,CAAAA,EAAQ,EAAA,EAAMA,GAAQ,KAAA,CAC/Bkc,CAAAA,EAAM,SAAS,cAAA,EAAkBxI,CAAAA,EACnCwI,CAAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAKxI,EAAM1T,CAAAA,EAAQ,SAAS,EAAE,KAAA,CAAM,IAAM,CAAC,CAAC,CAAA,CAK1E,IAAMsvC,CAAAA,CAAa,IAAM,CACZhuB,CAAAA,EAAe,CACvB,kBAAkB,CACnB,QAAA,CAAU8B,EAAU,KAAA,CAAM,sBAAA,CAAuB3O,CAAS,CAC5D,CAAC,CAAA,CACGyH,GAAM,OAAA,EAAS,iBAAA,EACjBA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CAC7BkH,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,MAAM,IAAIA,CAAAA,CAAU,QAAQ,EAAE,CAAA,CACnElX,CAAAA,CAAU,MAAM,WAAA,CAAYkX,CAAAA,CAAU,MAAA,CAAQA,CAAAA,CAAU,QAAQ,CAClE,CAAC,EAEL,CAAA,CAAA,CACahe,GAAiB,OAAA,IACjB,OAAA,CACX,WAAWgzB,CAAAA,CAAY,GAAI,EAE3BA,CAAAA,GAEJ,EACApzB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCIO,SAASizB,EAAAA,CACd96B,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAS,SAAS,CAAA,CACnB/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM9E,EAA0B,EAAC,CAgBjC,GAbAA,CAAAA,CAAW,IAAA,CACTgiB,GACEld,CAAAA,CAAQ,MAAA,CACRA,CAAAA,CAAQ,QAAA,CACRA,CAAAA,CAAQ,YAAA,CACRA,EAAQ,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,UAAA,CAAAC,CAAAA,CAAa,IAAA,CACb,oBAAA,CAAAC,EAAuB,IAAA,CACvB,aAAA,CAAAmU,EAAgB,EAClB,EAAI5xB,CAAAA,CAAQ,OAAA,CAEN0d,CAAAA,CAAoB,EAAC,CAG3B,GAAIkU,EAAc,MAAA,CAAS,CAAA,CAAG,CAE5B,IAAMC,CAAAA,CAAsB,CAAC,GAAGD,CAAa,CAAA,CAAE,IAAA,CAAK,CAACpqC,CAAAA,CAAGtF,IACtDsF,CAAAA,CAAE,OAAA,CAAQ,cAActF,CAAAA,CAAE,OAAO,CACnC,CAAA,CAEAw7B,CAAAA,CAAW,KAAK,CACd,CAAA,CACA,CACE,aAAA,CAAemU,CAAAA,CAAoB,IAAI3vC,CAAAA,GAAM,CAC3C,QAASA,CAAAA,CAAE,OAAA,CACX,MAAA,CAAQA,CAAAA,CAAE,MACZ,CAAA,CAAE,CACJ,CACF,CAAC,EACH,CAEAgZ,CAAAA,CAAW,KACTmiB,EAAAA,CACErd,CAAAA,CAAQ,MAAA,CACRA,CAAAA,CAAQ,QAAA,CACRsd,CAAAA,CACAC,EACAC,CAAAA,CACAC,CAAAA,CACAC,CACF,CACF,EACF,CAEA,OAAOxiB,CACT,CAAA,CACA,MAAO9Y,CAAAA,CAAas6B,CAAAA,GAAc,CAEhC,IAAMoV,CAAAA,CAAS,CAACpV,CAAAA,CAAU,YAAA,CACpBqV,EAAeD,CAAAA,CAAS,GAAA,CAAM,IAK9Bh8B,CAAAA,CAAO1T,CAAAA,EAAQ,IAAMA,CAAAA,EAAQ,KAAA,CAMnC,GALIkc,CAAAA,EAAM,OAAA,EAAS,gBAAkBxI,CAAAA,EACnCwI,CAAAA,CAAK,OAAA,CAAQ,cAAA,CAAeyzB,CAAAA,CAAcj8B,CAAAA,CAAM1T,GAAQ,SAAS,CAAA,CAAE,MAAM,IAAM,CAAC,CAAC,CAAA,CAI/Ekc,CAAAA,EAAM,OAAA,EAAS,iBAAA,CAAmB,CACpC,IAAM0zB,EAA6B,CACjCxsB,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAChC2O,CAAAA,CAAU,eAAA,CAAgB,OAAA,CAAQ3O,CAAS,CAC7C,CAAA,CAGA,GAAI,CAACi7B,CAAAA,CAAQ,CAEXE,CAAAA,CAAoB,IAAA,CAClBxsB,EAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,YAAY,IAAIA,CAAAA,CAAU,cAAc,EAAE,CACjF,CAAA,CAMA,IAAMuV,CAAAA,CAAoBvV,CAAAA,CAAU,UAAA,EAAcA,CAAAA,CAAU,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,SAClB,OACE,KAAA,CAAM,QAAQrhB,CAAG,CAAA,EACjBA,EAAI,CAAC,CAAA,GAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,eACXA,CAAAA,CAAI,CAAC,IAAMorC,CAAAA,EACXprC,CAAAA,CAAI,CAAC,CAAA,GAAMqrC,CAEf,CACF,CAAC,EACH,CAEA,MAAM5zB,CAAAA,CAAK,QAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCzOO,SAASyzB,EAAAA,CACd1hB,EACA2hB,CAAAA,CACAC,CAAAA,CACAlM,CAAAA,CACA,CACA,IAAM5J,CAAAA,CAAc4J,GAAMziB,CAAAA,EAAe,CACnC4uB,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,GACFs2B,CAAAA,CAAY,YAAA,CAAsB1Y,CAAAA,CAAU,CAAC4M,CAAAA,CAAO,GAAGxqB,CAAI,CAAC,EAGlE,CAMO,SAASssC,EAAAA,CACdnrB,EACAC,CAAAA,CACA+qB,CAAAA,CACAC,CAAAA,CACAlM,CAAAA,CACkC,CAClC,IAAM5J,EAAc4J,CAAAA,EAAMziB,CAAAA,GACpB8uB,CAAAA,CAAY,IAAI,IAEhBF,CAAAA,CAAU/V,CAAAA,CAAY,eAAwB,CAClD,SAAA,CAAYrU,GAAU,CACpB,IAAMrhB,EAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,CAAAA,CAAI,CAAC,IAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,aAAA,EACXA,EAAI,CAAC,CAAA,GAAMurC,CAAAA,EACXvrC,CAAAA,CAAI,CAAC,CAAA,GAAMwrC,CAEf,CACF,CAAC,EAED,IAAA,GAAW,CAACxuB,EAAU5d,CAAI,CAAA,GAAKqsC,CAAAA,CACzBrsC,CAAAA,GACFusC,CAAAA,CAAU,GAAA,CAAI3uB,EAAU5d,CAAI,CAAA,CAC5Bs2B,EAAY,YAAA,CACV1Y,CAAAA,CACA5d,EAAK,MAAA,CACF0J,CAAAA,EAAMA,EAAE,MAAA,GAAWyX,CAAAA,EAAUzX,EAAE,QAAA,GAAa0X,CAC/C,CACF,CAAA,CAAA,CAIJ,OAAOmrB,CACT,CAKO,SAASC,EAAAA,CACdD,CAAAA,CACArM,CAAAA,CACA,CACA,IAAM5J,CAAAA,CAAc4J,CAAAA,EAAMziB,GAAe,CACzC,IAAA,GAAW,CAACG,CAAAA,CAAU5d,CAAI,CAAA,GAAKusC,CAAAA,CAC7BjW,CAAAA,CAAY,YAAA,CAAsB1Y,EAAU5d,CAAI,EAEpD,CAMO,SAASysC,EAAAA,CACdtrB,EACAC,CAAAA,CACAsrB,CAAAA,CACAxM,CAAAA,CACmB,CACnB,IAAM5J,CAAAA,CAAc4J,GAAMziB,CAAAA,EAAe,CACnC3P,EAAO,CAAA,EAAA,EAAKqT,CAAM,IAAIC,CAAQ,CAAA,CAAA,CAC9BurB,EAAWrW,CAAAA,CAAY,YAAA,CAAoB/W,EAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAC,CAAA,CAE5E,OAAI6+B,CAAAA,EACFrW,CAAAA,CAAY,YAAA,CAAoB/W,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAMzR,CAAI,CAAA,CAAG,CAC3D,GAAG6+B,CAAAA,CACH,GAAGD,CACL,CAAC,CAAA,CAGIC,CACT,CAKO,SAASC,EAAAA,CACdzrB,EACAC,CAAAA,CACAoJ,CAAAA,CACA0V,EACA,CACA,IAAM5J,EAAc4J,CAAAA,EAAMziB,CAAAA,EAAe,CACnC3P,CAAAA,CAAO,CAAA,EAAA,EAAKqT,CAAM,IAAIC,CAAQ,CAAA,CAAA,CACpCkV,EAAY,YAAA,CAAoB/W,CAAAA,CAAU,MAAM,KAAA,CAAMzR,CAAI,EAAG0c,CAAK,EACpE,CCvFO,SAASqiB,EAAAA,CACdj8B,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,OAAA,CAAS,eAAe,CAAA,CACzB/I,EACA,CAAC,CAAE,OAAAuQ,CAAAA,CAAQ,QAAA,CAAAC,CAAS,CAAA,GAAM,CACxBsW,EAAAA,CAAqBvW,CAAAA,CAAQC,CAAQ,CACvC,EACA,MAAOwe,CAAAA,CAAcnJ,IAAc,CAEjC,GAAIpe,GAAM,OAAA,EAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAClC,CAAA,CAGA,GAAI6lB,CAAAA,CAAU,YAAA,EAAgBA,EAAU,cAAA,CAAgB,CACtDsV,EAAoB,IAAA,CAClBxsB,CAAAA,CAAU,MAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,EAAU,YAAY,CAAA,CAAA,EAAIA,CAAAA,CAAU,cAAc,CAAA,CAAE,CACjF,EAEA,IAAMuV,CAAAA,CAAoBvV,EAAU,UAAA,EAAcA,CAAAA,CAAU,aACtDwV,CAAAA,CAAsBxV,CAAAA,CAAU,YAAA,EAAgBA,CAAAA,CAAU,cAAA,CAEhEsV,CAAAA,CAAoB,KAAK,CACvB,SAAA,CAAY9pB,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,aAAA,EACXA,EAAI,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,CACE,aAAA,CAAAI,CAAAA,CAEA,QAAA,CAAU,MAAOge,CAAAA,EAAc,CAC7B,IAAM0V,CAAAA,CAAa1V,CAAAA,CAAU,YAAcA,CAAAA,CAAU,YAAA,CAC/C2V,EAAe3V,CAAAA,CAAU,YAAA,EAAgBA,CAAAA,CAAU,cAAA,CAEzD,OAAI0V,CAAAA,EAAcC,EAOT,CAAE,SAAA,CANSE,GAChB7V,CAAAA,CAAU,MAAA,CACVA,EAAU,QAAA,CACV0V,CAAAA,CACAC,CACF,CACmB,CAAA,CAEd,EACT,CAAA,CAEA,QAAS,CAACU,CAAAA,CAAQ1D,EAAYxI,CAAAA,GAAY,CACxC,GAAM,CAAE,SAAA,CAAA2L,CAAU,EAAK3L,CAAAA,EAAgE,GACnF2L,CAAAA,EACFC,EAAAA,CAA2BD,CAAS,EAExC,CACF,CACF,CACF,CCvBO,SAASQ,GACdn8B,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,OAAA,CAAS,YAAY,CAAA,CACtB/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM9E,CAAAA,CAA0B,EAAC,CAgBjC,GAbAA,EAAW,IAAA,CACTgiB,EAAAA,CACEld,EAAQ,MAAA,CACRA,CAAAA,CAAQ,SACR,EAAA,CACAA,CAAAA,CAAQ,eACRA,CAAAA,CAAQ,KAAA,CACRA,EAAQ,IAAA,CACRA,CAAAA,CAAQ,YACV,CACF,CAAA,CAGIA,CAAAA,CAAQ,QAAS,CACnB,GAAM,CACJ,iBAAA,CAAAsd,CAAAA,CAAoB,kBACpB,UAAA,CAAAC,CAAAA,CAAa,GAAA,CACb,UAAA,CAAAC,CAAAA,CAAa,IAAA,CACb,qBAAAC,CAAAA,CAAuB,IACzB,EAAIzd,CAAAA,CAAQ,OAAA,CAEZ9E,EAAW,IAAA,CACTmiB,EAAAA,CACErd,CAAAA,CAAQ,MAAA,CACRA,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,SAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,EAEhC,CACE,SAAA,CAAYqR,GAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,CAAAA,CAAM,QAAA,CAClB,OACE,MAAM,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,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,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,CAAAA,CAAQ,MAAA,CACRA,CAAAA,CAAQ,QAAA,CACRA,EAAQ,YAAA,CACRA,CAAAA,CAAQ,eACRA,CAAAA,CAAQ,KAAA,CACRA,EAAQ,IAAA,CACRA,CAAAA,CAAQ,YACV,CACF,CAAA,CAGIA,EAAQ,OAAA,CAAS,CACnB,GAAM,CACJ,iBAAA,CAAAsd,EAAoB,iBAAA,CACpB,UAAA,CAAAC,CAAAA,CAAa,GAAA,CACb,UAAA,CAAAC,CAAAA,CAAa,KACb,oBAAA,CAAAC,CAAAA,CAAuB,KACvB,aAAA,CAAAmU,CAAAA,CAAgB,EAClB,CAAA,CAAI5xB,CAAAA,CAAQ,OAAA,CAEN0d,CAAAA,CAAoB,GAG1B,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,cAAemU,CAAAA,CAAoB,GAAA,CAAI3vC,IAAM,CAC3C,OAAA,CAASA,CAAAA,CAAE,OAAA,CACX,MAAA,CAAQA,CAAAA,CAAE,MACZ,CAAA,CAAE,CACJ,CACF,CAAC,EACH,CAEAgZ,CAAAA,CAAW,IAAA,CACTmiB,EAAAA,CACErd,CAAAA,CAAQ,MAAA,CACRA,CAAAA,CAAQ,SACRsd,CAAAA,CACAC,CAAAA,CACAC,EACAC,CAAAA,CACAC,CACF,CACF,EACF,CAEA,OAAOxiB,CACT,CAAA,CACA,MAAO2qB,EAAcnJ,CAAAA,GAAc,CAIjC,IAAM5mB,CAAAA,CAAO+vB,CAAAA,EAAS,IAAMA,CAAAA,EAAS,KAAA,CAarC,GAZIvnB,CAAAA,EAAM,OAAA,EAAS,gBAAkBxI,CAAAA,EACnCwI,CAAAA,CAAK,QAAQ,cAAA,CAAe,GAAA,CAAKxI,EAAM+vB,CAAAA,EAAS,SAAS,CAAA,CAAE,KAAA,CAAO/7B,CAAAA,EAAU,CAC1E,QAAQ,KAAA,CAAM,oDAAA,CAAsD,CAClE,YAAA,CAAc,GAAA,CACd,SAAU+7B,CAAAA,EAAS,SAAA,CACnB,aAAA,CAAe/vB,CAAAA,CACf,KAAA,CAAAhM,CACF,CAAC,EACH,CAAC,EAICwU,CAAAA,EAAM,OAAA,EAAS,kBAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CACjCxsB,CAAAA,CAAU,eAAA,CAAgB,QAAQ3O,CAAS,CAC7C,EAGAm7B,CAAAA,CAAoB,IAAA,CAClBxsB,EAAU,KAAA,CAAM,KAAA,CAAM,KAAKkX,CAAAA,CAAU,YAAY,IAAIA,CAAAA,CAAU,cAAc,EAAE,CACjF,CAAA,CAMA,IAAMuV,CAAAA,CAAoBvV,CAAAA,CAAU,UAAA,EAAcA,CAAAA,CAAU,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,SAClB,OACE,KAAA,CAAM,QAAQrhB,CAAG,CAAA,EACjBA,EAAI,CAAC,CAAA,GAAM,OAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM,eACXA,CAAAA,CAAI,CAAC,IAAMorC,CAAAA,EACXprC,CAAAA,CAAI,CAAC,CAAA,GAAMqrC,CAEf,CACF,CAAC,CAAA,CAED,MAAM5zB,CAAAA,CAAK,OAAA,CAAQ,kBAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,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,QAAA,CAAAvE,CAAS,CAAA,GAAM,CAClCoiB,GAAeruB,CAAAA,CAAWuQ,CAAAA,CAAQC,EAAUvE,CAAQ,CACtD,EACA,MAAO+iB,CAAAA,CAAcnJ,IAAc,CAE7Bpe,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CAEnC,CAAC,GAAGkH,CAAAA,CAAU,KAAA,CAAM,eAAe,CAAA,CAEnC,CAAC,GAAGA,CAAAA,CAAU,OAAO,OAAA,CAAQ3O,CAAS,CAAC,CAAA,CAEvC2O,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,CAAAA,CAAU,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAU,QAAQ,CAAA,CAAE,CACrE,CAAC,EAEL,CAAA,CACApe,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCjFA,IAAMy0B,EAAAA,CAA+B,CAAC,GAAA,CAAM,GAAA,CAAM,GAAI,CAAA,CAEhDvgC,EAAAA,CAAS5H,GAAe,IAAI,OAAA,CAASC,GAAY,UAAA,CAAWA,CAAAA,CAASD,CAAE,CAAC,CAAA,CAE9E,eAAeooC,EAAAA,CAAWhsB,CAAAA,CAAgBC,CAAAA,CAAkC,CAC1E,OAAOvU,CAAAA,CAAQ,4BAA6B,CAC1CsU,CAAAA,CACAC,CACF,CAAC,CACH,CAEA,eAAsBgsB,EAAAA,CACpBjsB,CAAAA,CACAC,EACAisB,CAAAA,CAAW,CAAA,CACX79B,EACA,CACA,IAAM89B,EAAS99B,CAAAA,EAAS,MAAA,EAAU09B,EAAAA,CAE9B9+B,CAAAA,CACJ,GAAI,CACFA,EAAW,MAAM++B,EAAAA,CAAWhsB,EAAQC,CAAQ,EAC9C,MAAY,CACVhT,CAAAA,CAAW,OACb,CAEA,GAAIA,GAAYi/B,CAAAA,EAAYC,CAAAA,CAAO,OACjC,OAGF,IAAMC,EAASD,CAAAA,CAAOD,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,GAAA,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,OAAO,QAAA,CAAS,IAC1B,EAEK,CAAE,GAAA,CAAK,GAAI,MAAA,CAAQ,EAAG,CAC/B,CAEO,SAASD,EAAAA,CACd78B,EACAk7B,CAAAA,CACAt8B,CAAAA,CACA,CACA,OAAOsK,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,WAAA,CAAagyB,CAAY,CAAA,CACvC,UAAA,CAAY,SAAY,CACtB,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mDAA8C,CAAA,CAEhE,IAAM/D,CAAAA,CAAWlpB,CAAAA,GAIX8uB,CAAAA,CAAeD,EAAAA,GACfjjC,CAAAA,CAAM+E,CAAAA,EAAS,KAAOm+B,CAAAA,CAAa,GAAA,CACnCC,EAASp+B,CAAAA,EAAS,MAAA,EAAUm+B,EAAa,MAAA,CAE/C,GAAI,CACF,MAAM5F,CAAAA,CAAS3sB,EAAO,aAAA,CAAgB,YAAA,CAAc,CAClD,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,IAAA,CAAM0wB,CAAAA,CACN,GAAA,CAAArhC,CAAAA,CACA,MAAA,CAAAmjC,EACA,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,uBAAAA,CAAa,CAClB,SAAU,CAAC,WAAA,CAAa,uBAAwBzC,CAAQ,CAAA,CACxD,OAAA,CAAS,MAAO,CAAE,MAAA,CAAA5R,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,CAAA,yBAAA,EAA4ByB,CAAQ,CAAA,CAAA,CAC5D,CAAE,OAAA5R,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,EAAAA,CAAgCjxB,CAAAA,CAA4B,CAC1E,OAAOyC,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,oBAAqBzC,CAAQ,CAAA,CACrD,QAAS,MAAO,CAAE,OAAA5R,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,yBAAyByB,CAAQ,CAAA,CAAA,CACzD,CAAE,MAAA,CAAA5R,CAAO,CACX,CAAA,CAEA,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkCA,EAAS,MAAM,CAAA,CAAE,EAGrE,IAAMpO,CAAAA,CAAQ,MAAMoO,CAAAA,CAAS,IAAA,GAGvBkU,CAAAA,CAAWtiB,CAAAA,CAAK,IAAK6C,CAAAA,EAASA,CAAAA,CAAK,OAAO,CAAA,CAC1CkrC,CAAAA,CAAmB,MAAMlhC,EAAQ,4BAAA,CAA8B,CAACyV,CAAQ,CAAC,CAAA,CAG/E,QAAS+jB,CAAAA,CAAQ,CAAA,CAAGA,CAAAA,CAAQ0H,CAAAA,CAAiB,MAAA,CAAQ1H,CAAAA,EAAAA,CAAS,CAC5D,IAAM2H,CAAAA,CAAUD,EAAiB1H,CAAK,CAAA,CAChC4H,EAAUjuC,CAAAA,CAAKqmC,CAAK,CAAA,CAGpB1N,CAAAA,CAAgB,OAAOqV,CAAAA,CAAQ,gBAAmB,QAAA,CACpDA,CAAAA,CAAQ,eACRA,CAAAA,CAAQ,cAAA,CAAe,UAAS,CAC9BE,CAAAA,CAAwB,OAAOF,CAAAA,CAAQ,uBAAA,EAA4B,SACrEA,CAAAA,CAAQ,uBAAA,CACRA,EAAQ,uBAAA,CAAwB,QAAA,GAC9BG,CAAAA,CAAyB,OAAOH,CAAAA,CAAQ,wBAAA,EAA6B,QAAA,CACvEA,CAAAA,CAAQ,yBACRA,CAAAA,CAAQ,wBAAA,CAAyB,UAAS,CACxCI,CAAAA,CAAsB,OAAOJ,CAAAA,CAAQ,qBAAA,EAA0B,QAAA,CACjEA,CAAAA,CAAQ,qBAAA,CACRA,CAAAA,CAAQ,sBAAsB,QAAA,EAAS,CAErCK,EACJ,UAAA,CAAW1V,CAAa,EACxB,UAAA,CAAWuV,CAAqB,CAAA,CAChC,UAAA,CAAWC,CAAsB,CAAA,CACjC,WAAWC,CAAmB,CAAA,CAIhCH,EAAQ,UAAA,CAAaA,CAAAA,CAAQ,GAAKI,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,EAAAA,CACd7jC,EACA8Z,CAAAA,CAAuB,EAAC,CACxBC,CAAAA,CAAoB,CAAC,UAAA,CAAY,YAAa,gBAAgB,CAAA,CAC9DC,EACA,CAEA,IAAM8pB,EAAmB,CAAC,GAAGhqB,CAAU,CAAA,CAAE,IAAA,EAAK,CACxCiqB,EAAgB,CAAC,GAAGhqB,CAAO,CAAA,CAAE,IAAA,GAEnC,OAAOlF,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,YAAa,YAAA,CAAc7U,CAAAA,CAAK8jC,EAAkBC,CAAAA,CAAe/pB,CAAS,EACrF,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAxZ,CAAO,CAAA,GAAM,CAC7B,IAAMmD,CAAAA,CAAW,MAAM,KAAA,CAAMgN,CAAAA,CAAO,eAAiB,YAAA,CAAc,CACjE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,OAAA,CAAAoJ,CAAAA,CACA,GAAA,CAAK,kBAAA,CAAmB/Z,CAAG,CAAA,CAC3B,WAAA8Z,CAAAA,CACA,UAAA,CAAYE,CACd,CAAC,CAAA,CACD,OAAAxZ,CACF,CAAC,EAED,GAAI,CAACmD,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+BA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGlE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAAC3D,CAAAA,CAEX,UAAW,CACb,CAAC,CACH,CCjCO,IAAMgkC,EAAAA,CAAiC,iBAGjCC,EAAAA,CAAgC,KAmBtC,SAASC,EAAAA,CAAmB7jC,CAAAA,CAAuB,CACxD,OAAO,kDAAA,CAAmD,IAAA,CAAKA,CAAI,CACrE,CAQO,SAAS8jC,EAAAA,CACdjD,CAAAA,CACA7gC,EACoC,CACpC,GAAI,CAAC6jC,EAAAA,CAAmB7jC,CAAI,EAC1B,OAAO6gC,CAAAA,CAGT,IAAM5jC,CAAAA,CAAW4jC,CAAAA,CAAc,KAAM1vC,CAAAA,EAAMA,CAAAA,CAAE,UAAYwyC,EAA8B,CAAA,CAEvF,OAAI1mC,CAAAA,EAAYA,CAAAA,CAAS,MAAA,GAAW,KAC3B4jC,CAAAA,CAGL5jC,CAAAA,CACK4jC,EAAc,GAAA,CAAK1vC,CAAAA,EACxBA,EAAE,OAAA,GAAYwyC,EAAAA,CACV,CAAE,GAAGxyC,CAAAA,CAAG,MAAA,CAAQ,IAA8B,CAAA,CAC9CA,CACN,EAGK,CACL,GAAG0vC,EACH,CAAE,OAAA,CAAS8C,EAAAA,CAAgC,MAAA,CAAQ,IAA8B,CACnF,CACF,CAGO,SAASI,GAAwBj4B,CAAAA,CAA0B,CAChE,OAAOA,CAAAA,GAAY63B,EACrB,CC/EA,IAAAK,EAAAA,CAAA,GAAAh6B,EAAAA,CAAAg6B,EAAAA,CAAA,iCAAAC,EAAAA,CAAA,4BAAA,CAAA,IAAAC,KCAA,IAAAF,EAAAA,CAAA,GAAAh6B,EAAAA,CAAAg6B,EAAAA,CAAA,+BAAAG,EAAAA,CAAAA,CAAAA,CCGO,SAASA,GACdr+B,CAAAA,CACA+C,CAAAA,CACAsG,EACA,CACA,OAAOqF,wBAAa,CAClB,QAAA,CAAU,CAAC,cAAA,CAAgB,YAAA,CAAc,aAAA,CAAe1O,CAAQ,CAAA,CAChE,OAAA,CAAS,SAAY,CACnB,GAAIqJ,EAIF,OAHiB,IAAIrB,oBAAG,MAAA,CAAO,CAC7B,YAAAqB,CACF,CAAC,EACe,MAAA,CAAOtG,CAAI,CAE/B,CACF,CAAC,CACH,CCjBA,IAAMu7B,EAAAA,CAAwB,CAC5B,OAAA,CAAAJ,EACF,ECAO,SAASC,EAAAA,CACdn+B,EACAqJ,CAAAA,CACA,CACA,OAAOqF,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,cAAA,CAAgB,QAAA,CAAU,eAAgB1O,CAAQ,CAAA,CAC7D,QAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACqJ,CAAAA,CACzB,QAAS,SAAY,CACnB,GAAI,CAACrJ,CAAAA,EAAY,CAACqJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,iDAAyC,EAI3D,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7B,kDAAkDjO,CAAQ,CAAA,gBAAA,CAAA,CAC1D,CACE,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,EAEMu+B,CAAAA,CACJD,EAAAA,CAAsB,QAAQ,yBAAA,CAC5Bt+B,CAAAA,CAAAA,CACC,MAAMxC,CAAAA,CAAS,IAAA,EAAK,EAAG,KACxB6L,CACF,CAAA,CACF,MAAMwD,CAAAA,EAAe,CAAE,cAAc0xB,CAAgB,CAAA,CACrD,GAAM,CAAE,WAAA,CAAAC,CAAY,EAAI3xB,CAAAA,EAAe,CAAE,aACvC0xB,CAAAA,CAAiB,QACnB,EAEA,OAAOC,CAAAA,CAAY,QAAQ,GAAA,CAAK,EAAE,CACpC,CACF,CAAC,CACH,CCnCO,SAASJ,EAAAA,CACdp+B,CAAAA,CACAqJ,CAAAA,CACA,CACA,OAAOqF,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,eAAgB,QAAA,CAAU,QAAA,CAAU1O,CAAQ,CAAA,CACvD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACqJ,CAAAA,CACzB,OAAA,CAAS,SAAY,CACnB,GAAI,CAACrJ,CAAAA,EAAY,CAACqJ,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,iDAAyC,CAAA,CAG3D,IAAMo1B,EAAoBN,EAAAA,CACxBn+B,CAAAA,CACAqJ,CACF,CAAA,CAEA,MAAMwD,GAAe,CAAE,aAAA,CAAc4xB,CAAiB,CAAA,CACtD,IAAM12B,EAAQ8E,CAAAA,EAAe,CAAE,YAAA,CAAa4xB,CAAAA,CAAkB,QAAQ,CAAA,CACtE,GAAI,CAAC12B,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,0DAAqD,CAAA,CAavE,OAAQ,KAAA,CATS,MADAkG,CAAAA,EAAc,CAE7B,gDACA,CACE,OAAA,CAAS,CACP,cAAA,CAAgB,kBAAA,CAChB,cAAe,CAAA,OAAA,EAAUlG,CAAK,CAAA,CAChC,CACF,CACF,CAAA,EACuB,MACzB,CACF,CAAC,CACH,KCrCM22B,EAAAA,CAAwB,CAC5B,QAAAR,EACF,ECHO,SAASS,EAAAA,CAA6B3+B,EAA8B,CACzE,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,eAAgB,UAAA,CAAY,OAAA,CAAS1O,CAAQ,CAAA,CACxD,KAAA,CAAO,MACP,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,IAAMxC,EAAW,MADAyQ,CAAAA,GAEf,CAAA,4CAAA,EAA+CjO,CAAQ,GACvD,CACE,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,CAWA,GARIxC,EAAS,MAAA,GAAW,GAAA,EAAA,CACJ,MAAMA,CAAAA,CAAS,IAAA,GAAO,KAAA,CAAM,KAAO,EAAC,CAAE,CAAA,GAEzC,UAAY,oBAAA,EAKzB,CAACA,EAAS,EAAA,CACZ,OAAO,IAAA,CAGT,IAAMpO,CAAAA,CAAO,MAAMoO,EAAS,IAAA,EAAK,CAEjC,OAAO,CACL,OAAA,CAAS,CACP,QAAA,CAAUpO,CAAAA,CAAK,gBAAA,CACf,OAAA,CAASA,CAAAA,CAAK,eAChB,EACA,MAAA,CAAQ,CACN,SAAUA,CAAAA,CAAK,eAAA,CACf,QAASA,CAAAA,CAAK,cAChB,CACF,CAIF,CAAA,KAAc,CAEZ,OAAO,IACT,CACF,CACF,CAAC,CACH,CCbO,SAASwvC,GAAqB,CACnC,GAAA,CAAA/kC,EACA,UAAA,CAAA8Z,CAAAA,CAAa,EAAC,CACd,OAAA,CAAAC,CAAAA,CAAU,CAAC,UAAA,CAAY,WAAA,CAAa,gBAAgB,CAAA,CACpD,QAAA,CAAAirB,EAAW,YAAA,CACX,SAAA,CAAAhrB,EACA,OAAA,CAAA+G,CAAAA,CAAU,IACZ,CAAA,CAAyB,CACvB,OAAOlM,wBAAa,CAClB,QAAA,CAAU,CAAC,cAAA,CAAgB,WAAA,CAAa7U,EAAK8Z,CAAAA,CAAYC,CAAAA,CAASirB,CAAAA,CAAUhrB,CAAS,CAAA,CACrF,OAAA,CAAS,SAAY,CAEnB,IAAMrW,EAAW,MADAyQ,CAAAA,GACe,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,UAAA,CAAA,CAAc,CACpE,OAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,QAAAoJ,CAAAA,CACA,GAAA,CAAK,kBAAA,CAAmB/Z,CAAG,CAAA,CAC3B,UAAA,CAAA8Z,EACA,QAAA,CAAAkrB,CAAAA,CAEA,GAAIhrB,CAAAA,CAAY,CAAE,WAAYA,CAAU,CAAA,CAAI,EAC9C,CAAC,CAAA,CACD,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,EAOD,GAAI,CAACrW,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,MAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGvE,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAAA,CACA,QAAS,CAAC,CAAC3D,GAAO+gB,CAAAA,CAGlB,KAAA,CAAO,CACT,CAAC,CACH,CChFO,SAASkkB,EAAAA,EAAyB,CACvC,OAAOpwB,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,kBAAA,CAAoB,OAAO,CAAA,CACtC,OAAA,CAAS,UACU,MAAMzS,CAAAA,CAAQ,sBAAuB,EAAE,GACxC,QAEpB,CAAC,CACH,CCPO,SAAS8iC,GAAyB/+B,CAAAA,CAAkB,CACzD,OAAO0O,uBAAAA,CAAa,CAClB,SAAU,CAAC,kBAAA,CAAoB,UAAW1O,CAAQ,CAAA,CAClD,QAAS,SAAA,CACQ,MAAM/D,EAAQ,yBAAA,CAA2B,CACtD,QAAA,CAAU,CAAC+D,CAAQ,CACrB,CAAC,CAAA,EACa,WAAA,CAEhB,QAAS,CAAC,CAACA,CACb,CAAC,CACH,CC6BA,IAAMg/B,EAAAA,CAA0B,CAC9B,MAAO,KAAA,CACP,WAAA,CAAa,EACb,OAAA,CAAS,CAAA,CACT,QAAS,CAAA,CACT,aAAA,CAAe,CAAA,CACf,cAAA,CAAgB,KAAA,CAChB,OAAA,CAAS,EACT,SAAA,CAAW,CACb,EAWO,SAASC,EAAAA,CAAmB,CACjC,SAAA,CAAAx4B,CAAAA,CACA,QAAAy4B,CAAAA,CACA,SAAA,CAAAprC,EACA,MAAA,CAAA3H,CAAAA,CAAS,GACX,CAAA,CAAsC,CACpC,GAAI,CAACsa,CAAAA,EAAa,CAACy4B,CAAAA,EAAS,GAAA,CAC1B,OAAOF,GAGT,GAAM,CAAE,aAAcn5B,CAAAA,CAAa,QAAA,CAAUF,CAAQ,CAAA,CAAIa,EAAAA,CAAgBC,CAAS,CAAA,CAC5E04B,CAAAA,CAAU,MAAA,CAAOD,EAAQ,GAAA,CAAIprC,CAAS,GAAG,QAAA,EAAY,CAAC,EAE5D,GAAI,EAAEqrC,CAAAA,CAAU,CAAA,CAAA,CACd,OAAO,CAAE,GAAGH,EAAAA,CAAO,KAAA,CAAO,KAAM,WAAA,CAAAn5B,CAAAA,CAAa,QAAAF,CAAQ,CAAA,CAGvD,IAAMy5B,CAAAA,CAAa,MAAA,CAAO,SAASjzC,CAAM,CAAA,EAAKA,EAAS,CAAA,CAAIA,CAAAA,CAAS,IAC9DkzC,CAAAA,CAAgBF,CAAAA,CAAUC,CAAAA,CAC1BE,CAAAA,CAAiBz5B,CAAAA,CAAcw5B,CAAAA,CAErC,OAAO,CACL,KAAA,CAAO,KACP,WAAA,CAAAx5B,CAAAA,CACA,QAAAF,CAAAA,CACA,OAAA,CAAAw5B,CAAAA,CACA,aAAA,CAAAE,CAAAA,CACA,cAAA,CAAAC,EACA,OAAA,CAASA,CAAAA,CAAiB,KAAK,IAAA,CAAKD,CAAAA,CAAgBx5B,CAAW,CAAA,CAAI,CAAA,CACnE,SAAA,CAAW,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAcs5B,CAAO,CAC7C,CACF,CC3FO,SAASI,GACdv/B,CAAAA,CACAxK,CAAAA,CACAse,EACA,CACA,OAAOpF,wBAAa,CAClB,QAAA,CAAU,CAAC,OAAA,CAAS,cAAA,CAAgBoF,CAAAA,CAAU9T,CAAQ,CAAA,CACtD,OAAA,CAAS,CAAC,CAACA,CAAAA,EAAY,CAAC,CAACxK,CAAAA,CACzB,QAAS,SAAY,CACnB,GAAI,CAACwK,CAAAA,EAAY,CAACxK,EAChB,MAAM,IAAI,MAAM,kCAA6B,CAAA,CAgB/C,OAAQ,KAAA,CAbS,MADAyY,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,wBACxB,CACE,MAAA,CAAQ,OACR,IAAA,CAAM,IAAA,CAAK,UAAU,CACnB,SAAA,CAAWsJ,EACX,IAAA,CAAAte,CACF,CAAC,CAAA,CACD,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EACuB,IAAA,EACzB,CACF,CAAC,CACH,CC5BO,SAASgqC,EAAAA,CACdx/B,CAAAA,CACAxK,CAAAA,CACAse,CAAAA,CACA9jB,CAAAA,CACA,CACA,GAAM,CAAE,WAAA,CAAayvC,CAAe,CAAA,CAAI5C,EAAAA,CACtC78B,EACA,aACF,CAAA,CAEA,OAAOkJ,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,OAAA,CAAS,MAAA,CAAQ4K,EAAU9T,CAAQ,CAAA,CACjD,WAAY,SAAY,CACtB,GAAI,CAACA,CAAAA,EAAY,CAACxK,CAAAA,CAChB,MAAM,IAAI,KAAA,CAAM,kCAA6B,EAmB/C,OAAQ,KAAA,CAfS,MADAyY,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,eAAiB,wBAAA,CACxB,CACE,OAAQ,MAAA,CACR,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,SAAA,CAAWsJ,CAAAA,CACX,IAAA,CAAAte,CAAAA,CACA,IAAAxF,CACF,CAAC,EACD,OAAA,CAAS,CACP,eAAgB,kBAClB,CACF,CACF,CAAA,EAEuB,IAAA,EACzB,EACA,SAAA,EAAY,CACVyvC,IACF,CACF,CAAC,CACH,CCrCO,SAASC,EAAAA,CAAsB1/B,EAA8B,CAClE,IAAM6R,EAAO7R,CAAAA,EAAU,OAAA,CAAQ,GAAA,CAAK,EAAE,CAAA,CACtC,OAAO0O,wBAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,MAAA,CAAOkD,CAAI,CAAA,CACtC,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,SAAY,CACnB,GAAI,CAACA,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,+CAA0C,CAAA,CAI5D,IAAMrU,CAAAA,CAAW,MADAyQ,GAAc,CAE7BzD,CAAAA,CAAO,eAAiB,qBAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,EAC9C,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,QAAA,CAAUqH,CAAK,CAAC,CACzC,CACF,CAAA,CAEA,GAAI,CAACrU,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,EAAS,MAAM,CAAA,CAAE,CAAA,CAG9D,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAAA,CACA,UAAW,GAAA,CACX,cAAA,CAAgB,IAClB,CAAC,CACH,CCbO,IAAMmiC,EAAAA,CAAqC,CAEhD,CAAE,EAAA,CAAI,SAAA,CAAW,KAAM,OAAA,CAAS,IAAA,CAAM,EAAG,OAAA,CAAS,SAAA,CAAW,KAAM,cAAe,CAAA,CAClF,CAAE,EAAA,CAAI,MAAA,CAAQ,KAAM,OAAA,CAAS,IAAA,CAAM,EAAG,OAAA,CAAS,MAAA,CAAQ,IAAA,CAAM,QAAS,CAAA,CACtE,CAAE,GAAI,SAAA,CAAW,IAAA,CAAM,QAAS,IAAA,CAAM,CAAA,CAAG,QAAS,SAAA,CAAW,IAAA,CAAM,SAAU,CAAA,CAC7E,CAAE,EAAA,CAAI,OAAQ,IAAA,CAAM,OAAA,CAAS,KAAM,EAAA,CAAI,OAAA,CAAS,OAAQ,IAAA,CAAM,mBAAoB,CAAA,CAClF,CAAE,EAAA,CAAI,QAAA,CAAU,KAAM,OAAA,CAAS,IAAA,CAAM,EAAG,OAAA,CAAS,QAAA,CAAU,KAAM,QAAS,CAAA,CAC1E,CAAE,EAAA,CAAI,MAAA,CAAQ,KAAM,OAAA,CAAS,IAAA,CAAM,EAAG,OAAA,CAAS,MAAA,CAAQ,KAAM,MAAO,CAAA,CAEpE,CAAE,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,SAAU,IAAA,CAAM,CAAA,CAAG,QAAS,MAAA,CAAQ,IAAA,CAAM,QAAS,CAAA,CACvE,CAAE,EAAA,CAAI,SAAA,CAAW,IAAA,CAAM,QAAA,CAAU,KAAM,EAAA,CAAI,OAAA,CAAS,UAAW,IAAA,CAAM,SAAU,EAC/E,CAAE,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,QAAA,CAAU,IAAA,CAAM,GAAI,OAAA,CAAS,MAAA,CAAQ,KAAM,mBAAoB,CAAA,CACnF,CAAE,EAAA,CAAI,QAAA,CAAU,KAAM,QAAA,CAAU,IAAA,CAAM,EAAG,OAAA,CAAS,QAAA,CAAU,KAAM,QAAS,CAAA,CAE3E,CAAE,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,SAAA,CAAW,IAAA,CAAM,EAAA,CAAI,QAAS,MAAA,CAAQ,IAAA,CAAM,QAAS,CAC3E,EAEO,SAASC,EAAAA,CAAqBC,CAAAA,CAAiB7tC,CAAAA,CAAY,CAChE,OAAO2tC,EAAAA,CAAc,KAAM1tB,CAAAA,EAAMA,CAAAA,CAAE,OAAS4tB,CAAAA,EAAQ5tB,CAAAA,CAAE,KAAOjgB,CAAE,CACjE,CAMO,IAAM8tC,EAAAA,CAAsB,GAAA,CACtBC,GAA0B,EC7CvC,SAASC,IAA4B,CACnC,OAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,UAAA,EAAe,WACzD,MAAA,CAAO,UAAA,EAAW,CAEpB,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAC7D,CAOA,eAAsBC,EAAAA,CACpBzqC,CAAAA,CACgC,CAEhC,IAAMgI,CAAAA,CAAW,MADAyQ,CAAAA,EAAc,CAE7BzD,CAAAA,CAAO,cAAA,CAAiB,gCAAA,CACxB,CACE,OAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,EAC9C,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,IAAA,CAAAhV,EAAM,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,CAAA,KAAQ,CAER,CACA,IAAM7N,EACHP,CAAAA,EAA+B,OAAA,EAChC,gCAAgCoO,CAAAA,CAAS,MAAM,GAC3CtE,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,CAQO,SAAS0iC,EAAAA,CACdlgC,CAAAA,CACAxK,EACA,CACA,IAAMkwB,CAAAA,CAAcC,yBAAAA,EAAe,CAC7B9T,CAAAA,CAAO7R,GAAU,OAAA,CAAQ,GAAA,CAAK,EAAE,CAAA,CAEtC,OAAOkJ,uBAAY,CACjB,WAAA,CAAa,CAAC,eAAA,CAAiB,KAAA,CAAO2I,CAAI,EAC1C,UAAA,CAAY,SAAY,CACtB,GAAI,CAACA,GAAQ,CAACrc,CAAAA,CACZ,MAAM,IAAI,KAAA,CAAM,yCAAoC,EAEtD,OAAOyqC,EAAAA,CAAuBzqC,CAAI,CACpC,CAAA,CACA,WAAY,CAENqc,CAAAA,EACF6T,EAAY,iBAAA,CAAkB,CAAE,SAAU/W,CAAAA,CAAU,MAAA,CAAO,QAAQkD,CAAI,CAAE,CAAC,EAE9E,CAAA,CACA,SAAA,EAAY,CAINA,CAAAA,EACF6T,CAAAA,CAAY,kBAAkB,CAAE,QAAA,CAAU/W,EAAU,MAAA,CAAO,MAAA,CAAOkD,CAAI,CAAE,CAAC,EAE7E,CACF,CAAC,CACH,CCrCO,SAASsuB,EAAAA,CACdngC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,WAAW,CAAA,CAC3B/I,EACA,CAAC,CAAE,UAAA+d,CAAU,CAAA,GAAM,CACjB0M,EAAAA,CAAiBzqB,CAAAA,CAAW+d,CAAS,CACvC,CAAA,CACA,MAAOiR,CAAAA,CAAcnJ,CAAAA,GAAc,CAE7Bpe,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,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,OAAQ,CAC5C,CACF,CCzBO,SAASu4B,EAAAA,CACdpgC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,cAAe,aAAa,CAAA,CAC7B/I,EACA,CAAC,CAAE,SAAA,CAAA+d,CAAU,CAAA,GAAM,CACjB2M,GAAmB1qB,CAAAA,CAAW+d,CAAS,CACzC,CAAA,CACA,MAAOiR,EAAcnJ,CAAAA,GAAc,CAE7Bpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,EAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,cAAc3O,CAAS,CAAA,CAC1C,CAAC,GAAG2O,CAAAA,CAAU,WAAA,CAAY,aAAakX,CAAAA,CAAU,SAAS,CAAC,CAAA,CAC3DlX,CAAAA,CAAU,YAAY,OAAA,CAAQ3O,CAAAA,CAAW6lB,EAAU,SAAS,CAC9D,CAAC,EAEL,CAAA,CACApe,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,MAAO,CAC3C,CACF,CCMO,SAASw4B,GACdrgC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,UAAU,CAAA,CAC1B/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAA+d,CAAAA,CAAW,OAAAxN,CAAAA,CAAQ,QAAA,CAAAC,EAAU,KAAA,CAAAwa,CAAAA,CAAO,IAAA,CAAAC,CAAK,CAAA,GAAM,CAChDF,GAAgB/qB,CAAAA,CAAW+d,CAAAA,CAAWxN,EAAQC,CAAAA,CAAUwa,CAAAA,CAAOC,CAAI,CACrE,CAAA,CACA,MAAO+D,CAAAA,CAAcnJ,CAAAA,GAAc,CAEjC,GAAIpe,CAAAA,EAAM,SAAS,iBAAA,CAAmB,CACpC,IAAM0zB,CAAAA,CAA6B,CAEjCxsB,CAAAA,CAAU,KAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,EAAU,MAAM,CAAA,CAAA,EAAIA,EAAU,QAAQ,CAAA,CAAE,EAEnE,CAAC,WAAA,CAAa,QAAA,CAAUA,CAAAA,CAAU,SAAS,CAAA,CAE3C,CACE,SAAA,CAAYxU,CAAAA,EAAe,CACzB,IAAMrhB,CAAAA,CAAMqhB,EAAM,QAAA,CAClB,OACE,KAAA,CAAM,OAAA,CAAQrhB,CAAG,CAAA,EACjBA,EAAI,CAAC,CAAA,GAAM,SACXA,CAAAA,CAAI,CAAC,IAAM,cAAA,EACXA,CAAAA,CAAI,CAAC,CAAA,GAAM61B,CAAAA,CAAU,SAEzB,CACF,CACF,EACA,MAAMpe,CAAAA,CAAK,QAAQ,iBAAA,CAAkB0zB,CAAmB,EAC1D,CACF,CAAA,CACA1zB,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,GAAiB,MAAO,CAC3C,CACF,CCpDO,SAASy4B,EAAAA,CACdviB,CAAAA,CACA/d,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,WAAYgV,CAAS,CAAA,CACrC/d,CAAAA,CACA,CAAC,CAAE,OAAA,CAAAgG,EAAS,IAAA,CAAA9F,CAAK,IAAM,CACrByqB,EAAAA,CAAe3qB,EAAW+d,CAAAA,CAAW/X,CAAAA,CAAS9F,CAAI,CACpD,CAAA,CACA,MAAO8uB,CAAAA,CAAcnJ,CAAAA,GAAc,CAGtBhZ,CAAAA,EAAe,CACvB,eACD,CAAE,QAAA,CAAU8B,CAAAA,CAAU,WAAA,CAAY,YAAA,CAAaoP,CAAS,CAAE,CAAA,CACzDib,CAAAA,EAAS,CACR,GAAI,CAACA,EAAM,OAAOA,CAAAA,CAClB,IAAMuH,CAAAA,CAAsB,CAAC,GAAIvH,EAAK,IAAA,EAAQ,EAAG,CAAA,CAC3CwH,CAAAA,CAAMD,EAAK,SAAA,CAAU,CAAC,CAAC1uB,CAAI,CAAA,GAAMA,CAAAA,GAASgU,EAAU,OAAO,CAAA,CACjE,OAAI2a,CAAAA,EAAO,CAAA,CACTD,EAAKC,CAAG,CAAA,CAAI,CAACD,CAAAA,CAAKC,CAAG,EAAE,CAAC,CAAA,CAAG3a,EAAU,IAAA,CAAM0a,CAAAA,CAAKC,CAAG,CAAA,CAAE,CAAC,CAAA,EAAK,EAAE,CAAA,CAE7DD,CAAAA,CAAK,KAAK,CAAC1a,CAAAA,CAAU,QAASA,CAAAA,CAAU,IAAA,CAAM,EAAE,CAAC,CAAA,CAE5C,CAAE,GAAGmT,CAAAA,CAAM,IAAA,CAAAuH,CAAK,CACzB,CACF,EAGI94B,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnC,CAAC,GAAGkH,CAAAA,CAAU,WAAA,CAAY,aAAaoP,CAAS,CAAC,EACjDpP,CAAAA,CAAU,WAAA,CAAY,QAAQkX,CAAAA,CAAU,OAAA,CAAS9H,CAAS,CAC5D,CAAC,EAEL,CAAA,CACAtW,CAAAA,CACA,UACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CChDO,SAAS44B,EAAAA,CACd1iB,EACA/d,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,CAAAA,CACL,CAAC,aAAA,CAAe,QAAA,CAAUgV,CAAS,CAAA,CACnC/d,CAAAA,CACCR,GAAU,CACTorB,EAAAA,CAAuB5qB,EAAW+d,CAAAA,CAAWve,CAAK,CACpD,CAAA,CACA,MAAOwvB,CAAAA,CAAcnJ,IAAc,CAGtBhZ,CAAAA,GACR,cAAA,CACD,CAAE,SAAU8B,CAAAA,CAAU,WAAA,CAAY,aAAaoP,CAAS,CAAE,EACzDib,CAAAA,EACMA,CAAAA,EACE,CAAE,GAAGA,CAAAA,CAAM,GAAInT,CAA4C,CAEtE,CAAA,CAGIpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnC,CAAC,GAAGkH,CAAAA,CAAU,WAAA,CAAY,YAAA,CAAaoP,CAAS,CAAC,CACnD,CAAC,EAEL,CAAA,CACAtW,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC3CO,SAAS64B,GACd1gC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,iBAAiB,CAAA,CACjC/I,CAAAA,CACA,CAAC,CAAE,IAAA,CAAA6R,CAAK,CAAA,GAAM,CACZ+c,GAA6B/c,CAAI,CACnC,CAAA,CACA,MAAOmd,CAAAA,CAAcnJ,CAAAA,GAAc,CAE7Bpe,CAAAA,EAAM,OAAA,EAAS,mBACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CAEnC,CAAC,GAAGkH,CAAAA,CAAU,WAAA,CAAY,aAAakX,CAAAA,CAAU,IAAI,CAAC,CAAA,CAEtD,CAAC,GAAGlX,CAAAA,CAAU,MAAA,CAAO,OAAA,CAAQ3O,CAAS,CAAC,CACzC,CAAC,EAEL,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCnEO,SAAS84B,GACd3gC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,EACL,CAAC,aAAA,CAAe,UAAU,CAAA,CAC1B/I,CAAAA,CACA,CAAC,CAAE,SAAA,CAAA+d,CAAAA,CAAW,QAAA/X,CAAAA,CAAS,QAAA,CAAAwK,EAAU,GAAA,CAAAsa,CAAI,CAAA,GAAM,CACzCD,EAAAA,CAAe7qB,CAAAA,CAAW+d,EAAW/X,CAAAA,CAASwK,CAAAA,CAAUsa,CAAG,CAC7D,CAAA,CACA,MAAOkE,CAAAA,CAASnJ,CAAAA,GAAc,CACxBpe,CAAAA,EAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnCkH,CAAAA,CAAU,MAAM,KAAA,CAAM,CAAA,EAAA,EAAKkX,EAAU,OAAO,CAAA,CAAA,EAAIA,EAAU,QAAQ,CAAA,CAAE,EACpE,CAAC,GAAGlX,EAAU,WAAA,CAAY,YAAA,CAAakX,CAAAA,CAAU,SAAS,CAAC,CAC7D,CAAC,EAEL,CAAA,CACApe,EACA,SAAA,CACA,CAAE,cAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CC9BO,SAAS+4B,EAAAA,CACd/vB,CAAAA,CACAQ,EACAjkB,CAAAA,CAAQ,GAAA,CACR8d,CAAAA,CAA+B,MAAA,CAC/B0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,YAAY,IAAA,CAAKkC,CAAAA,CAAMQ,GAAS,EAAA,CAAIjkB,CAAK,EAC7D,OAAA,CAAAwtB,CAAAA,CACA,QAAS,SAAY,CACnB,IAAMpd,CAAAA,CAAW,MAAMvB,CAAAA,CAAQ,yBAAA,CAA2B,CACtD,IAAA,CAAM,GACN,KAAA,CAAA7O,CAAAA,CACA,KAAMyjB,CAAAA,GAAS,KAAA,CAAQ,OAASA,CAAAA,CAChC,KAAA,CAAOQ,CAAAA,EAAgB,IAAA,CACvB,QAAA,CAAAnG,CACF,CAAC,CAAA,CACH,OACE1N,EACIqT,CAAAA,GAAS,KAAA,CACPrT,EAAS,IAAA,CAAK,IAAM,IAAA,CAAK,MAAA,EAAO,CAAI,EAAG,EACvCA,CAAAA,CACF,EAER,CACF,CAAC,CACH,CC3BO,SAASqjC,EAAAA,CACd7gC,CAAAA,CACA8R,EACA,CACA,OAAOpD,wBAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,WAAA,CAAY,OAAA,CAAQ3O,CAAAA,CAAW8R,CAAc,CAAA,CACjE,OAAA,CAAS,CAAC,CAAC9R,CAAAA,EAAY,CAAC,CAAC8R,CAAAA,CACzB,OAAA,CAAS,SAAY,CACnB,IAAMtU,EAAW,MAAMvB,CAAAA,CAAQ,+BAAgC,CAC3D,OAAA,CAAS+D,EACT,IAAA,CAAM8R,CACR,CAAC,CAAA,CAEH,OAAO,CACL,KAAMtU,CAAAA,EAAU,IAAA,EAAQ,QACxB,UAAA,CAAYA,CAAAA,EAAU,YAAc,KACtC,CAIF,CACF,CAAC,CACH,CCtBO,SAASsjC,GACdjvB,CAAAA,CACA3G,CAAAA,CAA+B,EAAA,CAC/B0P,CAAAA,CAAU,IAAA,CACV,CACA,OAAOlM,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,WAAA,CAAY,OAAOkD,CAAAA,CAAM3G,CAAQ,CAAA,CACrD,OAAA,CAAS0P,CAAAA,EAAW,CAAC,CAAC/I,CAAAA,CACtB,OAAA,CAAS,SAAY4L,EAAAA,CAAa5L,CAAAA,EAAQ,GAAI3G,CAAQ,CACxD,CAAC,CACH,CCFO,IAAM61B,GAAwB,IAYrC,eAAeC,GACblvB,CAAAA,CACA6L,CAAAA,CAC0B,CAM1B,OALiB,MAAM1hB,EAAQ,yBAAA,CAA2B,CACxD,UAAW6V,CAAAA,CACX,KAAA,CAAOivB,EAAAA,CACP,GAAIpjB,CAAAA,CAAO,CAAE,KAAAA,CAAK,CAAA,CAAI,EACxB,CAAC,GAC6C,EAChD,CAYO,SAASsjB,EAAAA,CAAoCnvB,CAAAA,CAAuB,CACzE,OAAOpD,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,YAAY,WAAA,CAAYmD,CAAa,CAAA,CACzD,OAAA,CAAS,SAAYkvB,EAAAA,CAAqBlvB,EAAe,IAAI,CAAA,CAC7D,UAAW,GACb,CAAC,CACH,CAOO,SAASovB,GACdpvB,CAAAA,CACA,CACA,OAAO+G,+BAAAA,CAML,CACA,SAAUlK,CAAAA,CAAU,WAAA,CAAY,oBAAoBmD,CAAa,CAAA,CACjE,gBAAA,CAAkB,IAAA,CAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAgH,CAAU,IAC1BkoB,EAAAA,CAAqBlvB,CAAAA,CAAegH,CAAS,CAAA,CAG/C,gBAAA,CAAmBE,CAAAA,EACjBA,CAAAA,EAAU,MAAA,EAAU+nB,EAAAA,CAChB/nB,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,GAAI,CAAC,GAAK,IAAA,CACtC,IAAA,CACN,SAAA,CAAW,GACb,CAAC,CACH,CCpEO,SAASmoB,GACdn7B,CAAAA,CACA5Y,CAAAA,CACA,CACA,OAAOyrB,+BAAAA,CAML,CACA,SAAUlK,CAAAA,CAAU,WAAA,CAAY,qBAAqB3I,CAAAA,CAAS5Y,CAAK,EACnE,gBAAA,CAAkB,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,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,YAAY,QAAA,EAAS,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,KAAA,CAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAG5E,OAAOA,EAAS,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,CAAAA,CAAA,MAAA,CAAS,QAAA,CACTA,CAAAA,CAAA,MAAQ,OAAA,CACRA,CAAAA,CAAA,MAAQ,OAAA,CANEA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IASCC,EAAAA,CAAoC,CAC9C,KAAA,CAAc,CACb,OAAA,CACA,KAAA,CACA,SACA,OAAA,CACA,OACF,EACC,KAAA,CAAc,CAAC,MAAW,QAAA,CAAc,OAAA,CAAa,OAAW,CAAA,CAChE,GAAA,CAAY,CAAC,SAAc,OAAA,CAAa,OAAW,CACtD,ECjBO,SAASC,GAAiB1vB,CAAAA,CAAc2vB,CAAAA,CAAgC,CAC7E,OAAI3vB,CAAAA,CAAK,WAAW,QAAQ,CAAA,EAAK2vB,IAAY,CAAA,CAAU,SAAA,CACnD3vB,EAAK,UAAA,CAAW,QAAQ,CAAA,EAAK2vB,CAAAA,GAAY,CAAA,CAAU,SAAA,CAChD,OACT,CAEO,SAASC,GAAwB,CACtC,aAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CACF,CAAA,CAIG,CACD,IAAMC,CAAAA,CACAF,CAAAA,GAAa,QAAoB,KAAA,CAEjCD,CAAAA,GAAkB,QAAgB,IAAA,CAG/B,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,QAAkD,CAAA,CAAE,QAAA,CACzDC,CACF,CAAA,CAGIG,GAAc,IAAM,CACxB,GAAIH,CAAAA,GAAa,OAAA,CAAa,OAAO,MAAA,CAErC,OAAQD,GACN,KAAK,QACH,OAAO,KAAA,CACT,KAAK,SAAA,CACH,OAAOC,IAAa,OAAA,EAAeC,CAAAA,CACrC,KAAK,SAAA,CACH,OAAOC,CACX,CACF,CAAA,GAAG,CAEGE,EAAc,CAAA,OAAA,CAAA,OAAA,CAAA,KAAoC,CAAA,CAAE,SAASJ,CAAQ,CAAA,CAE3E,OAAO,CACL,OAAA,CAAAE,CAAAA,CACA,WAAAC,CAAAA,CACA,WAAA,CAAAC,CACF,CACF,CC7CO,SAASC,EAAAA,CACdpxB,CAAAA,CACApb,EACA,CACA,OAAOkZ,wBAAa,CAClB,QAAA,CAAUC,EAAU,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,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAAhV,CAAK,CAAC,EAC7B,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,GAC6B,IAAA,EAAK,EACtB,MAbH,CAAA,CAeX,OAAA,CAAS,CAAC,CAACob,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,WAAA,CAAa,EACb,eAAA,CAAiB,GACnB,CAAC,CACH,CCzBO,SAASysC,EAAAA,CACdrxB,EACApb,CAAAA,CACAib,CAAAA,CAAyC,OACzC,CACA,OAAOoI,gCAAqB,CAC1B,QAAA,CAAUlK,CAAAA,CAAU,aAAA,CAAc,IAAA,CAAKiC,CAAAA,CAAgBH,CAAM,CAAA,CAC7D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAqI,CAAU,CAAA,GAAM,CAChC,GAAI,CAACtjB,CAAAA,CACH,OAAO,EAAC,CAEV,IAAMpG,EAAO,CACX,IAAA,CAAAoG,EACA,MAAA,CAAAib,CAAAA,CACA,KAAA,CAAOqI,CAAAA,CACP,IAAA,CAAM,MACR,EAEMtb,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,6BACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUpb,CAAI,CAC3B,CACF,CAAA,CAEA,GAAI,CAACoO,CAAAA,CAAS,GACZ,OAAO,GAGT,GAAI,CACF,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CAAA,KAAQ,CACN,OAAO,EACT,CACF,CAAA,CACA,OAAA,CAAS,CAAC,CAACoT,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,WAAA,CAAa,CAAE,KAAA,CAAO,GAAI,UAAA,CAAY,EAAG,CAAA,CACzC,gBAAA,CAAkB,GAClB,gBAAA,CAAmBwjB,CAAAA,EAAaA,IAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,EAAA,EAAM,GACvE,cAAA,CAAgB,IAClB,CAAC,CACH,KClDYkpB,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,MAAQ,QAAA,CACRA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,CAAAA,CAAA,SAAA,CAAY,aACZA,CAAAA,CAAA,SAAA,CAAY,aACZA,CAAAA,CAAA,OAAA,CAAU,UACVA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,EAAA,SAAA,CAAY,WAAA,CACZA,EAAA,WAAA,CAAc,aAAA,CACdA,EAAA,OAAA,CAAU,SAAA,CACVA,EAAA,mBAAA,CAAsB,qBAAA,CAGtBA,EAAA,eAAA,CAAkB,iBAAA,CAClBA,EAAA,eAAA,CAAkB,iBAAA,CAfRA,QAAA,EAAA,ECGL,IAAKC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAAA,CAAAA,CAAA,IAAA,CAAO,CAAA,CAAA,CAAP,OACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,GAAV,SAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAS,CAAA,CAAA,CAAT,QAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,CAAA,CAAA,CAAV,SAAA,CACAA,IAAA,OAAA,CAAU,CAAA,CAAA,CAAV,UACAA,CAAAA,CAAAA,CAAAA,CAAA,SAAA,CAAY,GAAZ,WAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,WAAA,CAAc,EAAA,CAAA,CAAd,aAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,UAAY,EAAA,CAAA,CAAZ,WAAA,CACAA,IAAA,SAAA,CAAY,EAAA,CAAA,CAAZ,YACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAA,CAAU,IAAV,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,EAAA,CAAA,CAAtB,qBAAA,CACAA,CAAAA,CAAA,YAAA,CAAe,eAdLA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,CAAA,CAiBCC,GAAmB,CAC9B,CAAA,CACA,EACA,CAAA,CACA,CAAA,CACA,CAAA,CACA,CAAA,CACA,EAAA,CACA,EAAA,CACA,GACA,EAAA,CACA,EAAA,CACA,GACA,EACF,CAAA,CAEYC,QACVA,CAAAA,CAAA,GAAA,CAAM,KAAA,CACNA,CAAAA,CAAA,MAAA,CAAS,QAAA,CACTA,EAAA,IAAA,CAAO,MAAA,CAHGA,QAAA,EAAA,EC/BL,SAASC,GACd1xB,CAAAA,CACApb,CAAAA,CACA+sC,EACA,CACA,OAAO7zB,wBAAa,CAClB,QAAA,CAAUC,EAAU,aAAA,CAAc,QAAA,CAASiC,CAAc,CAAA,CACzD,OAAA,CAAS,SAAY,CACnB,IAAI7I,CAAAA,CAAQ6I,EAAiB,MAAA,CAC7B,GAAI,CAACpb,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sBAAsB,CAAA,CAExC,IAAMgI,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,6BACxB,CACE,IAAA,CAAM,KAAK,SAAA,CAAU,CACnB,IAAA,CAAAhV,CAAAA,CACA,QAAA,CAAUob,CAAAA,CACV,MAAA7I,CACF,CAAC,EACD,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,EACA,GAAI,CAACvK,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0CA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAE7E,OAAOA,CAAAA,CAAS,IAAA,EAClB,CAAA,CACA,OAAA,CAAS,CAAC,CAACoT,CAAAA,EAAkB,CAAC,CAACpb,CAAAA,CAC/B,cAAA,CAAgB,MAChB,WAAA,CAAa,KACJ,CACL,MAAA,CAAQ,CAAA,CACR,OAAQ,KAAA,CACR,aAAA,CAAe,CAAA,CACf,YAAA,CAAc+sC,CAAAA,CAAe,GAAM,CAAC,GAAGH,EAAgB,CACzD,CAAA,CAEJ,CAAC,CACH,CC3CO,SAASI,EAAAA,EAA+B,CAC7C,OAAO9zB,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,aAAA,CAAc,aAAA,EAAc,CAChD,OAAA,CAAS,SAAY,CACnB,IAAMnR,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,4BAAA,CAA8B,CACjF,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,kCAAkCA,CAAAA,CAAS,MAAM,EAAE,CAAA,CAIrE,OADa,MAAMA,CAAAA,CAAS,IAAA,IACb,EACjB,EACA,SAAA,CAAW,IACb,CAAC,CACH,CClBO,SAASilC,EAAAA,CAA0BC,CAAAA,CAAuB,CAC/D,OAAOh0B,uBAAAA,CAAa,CAClB,QAAA,CAAUC,CAAAA,CAAU,cAAc,UAAA,EAAW,CAC7C,OAAA,CAAS,SAAY,CACnB,IAAMnR,EAAW,MAAM,KAAA,CAAMgN,EAAO,cAAA,CAAiB,yBAAA,CAA2B,CAC9E,MAAA,CAAQ,KAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CAAC,CAAA,CAED,GAAI,CAAChN,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,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,CAAAA,CACH,KAAO,CAACD,CAAAA,EAAMA,IAAOC,CAAAA,CAAK,EAAA,CAAK,CAAA,CAAIA,CAAAA,CAAK,IAC1C,CACF,CAEA,SAAS2wC,EAAAA,CAAexzC,EAAiD,CACvE,OACE,OAAOA,CAAAA,EAAS,QAAA,EAChBA,IAAS,IAAA,EACT,OAAA,GAAWA,GACX,YAAA,GAAgBA,CAAAA,EAChB,MAAM,OAAA,CAASA,CAAAA,CAAkC,KAAK,CAE1D,CAuBO,SAASyzC,EAAAA,CACd7iC,CAAAA,CACAxK,CAAAA,CACAyT,EACA8c,CAAAA,CACA,CACA,IAAML,CAAAA,CAAc7Y,CAAAA,GAEpB,OAAO3D,sBAAAA,CAAY,CACjB,WAAA,CAAa,CAAC,eAAA,CAAiB,YAAalJ,CAAQ,CAAA,CAEpD,WAAY,MAAO,CAAE,GAAAhO,CAAG,CAAA,GAAuB,CAC7C,GAAI,CAACgO,CAAAA,EAAY,CAACxK,CAAAA,CAAM,CAClB,QAAQ,GAAA,CAAI,QAAA,GAAa,cAC3B,OAAA,CAAQ,IAAA,CAAK,gEAA2D,CAAA,CAE1E,MACF,CACA,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,EAAY,aAAA,CAAc,CAAE,SAAU/W,CAAAA,CAAU,aAAA,CAAc,OAAQ,CAAC,CAAA,CAG7E,IAAMm0B,CAAAA,CAA2C,EAAC,CAG5ChT,EAAkBpK,CAAAA,CAAY,cAAA,CAAyC,CAC3E,QAAA,CAAU/W,CAAAA,CAAU,cAAc,OAAA,CAClC,SAAA,CAAY0C,GAAU,CACpB,IAAMjiB,EAAOiiB,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,KAAK,CAAC91B,CAAAA,CAAU5d,CAAI,CAAC,CAAA,CAElC,IAAM2zC,CAAAA,CAAwC,CAC5C,GAAG3zC,CAAAA,CACH,KAAA,CAAOA,CAAAA,CAAK,MAAM,GAAA,CAAKsjB,CAAAA,EACrBA,EAAK,GAAA,CAAKzgB,CAAAA,EAAS0wC,GAAqB1wC,CAAAA,CAAMD,CAAE,CAAC,CACnD,CACF,EAEA0zB,CAAAA,CAAY,YAAA,CAAa1Y,EAAU+1B,CAAW,EAChD,CACF,CAAC,CAAA,CAGD,IAAMC,CAAAA,CAAYr0B,CAAAA,CAAU,aAAA,CAAc,YAAY3O,CAAQ,CAAA,CACxDijC,EAAgBvd,CAAAA,CAAY,YAAA,CAAqBsd,CAAS,CAAA,CAChE,OAAI,OAAOC,CAAAA,EAAkB,QAAA,EAAYA,CAAAA,CAAgB,IACvDH,CAAAA,CAAa,IAAA,CAAK,CAACE,CAAAA,CAAWC,CAAa,CAAC,CAAA,CAEvCjxC,CAAAA,CAKc89B,CAAAA,CAAgB,IAAA,CAAK,CAAC,EAAGj4B,CAAC,CAAA,GACzCA,GAAG,KAAA,CAAM,IAAA,CAAM6a,GACbA,CAAAA,CAAK,IAAA,CAAMzgB,GAASA,CAAAA,CAAK,EAAA,GAAOD,GAAMC,CAAAA,CAAK,IAAA,GAAS,CAAC,CACvD,CACF,GAEEyzB,CAAAA,CAAY,YAAA,CAAasd,CAAAA,CAAWC,CAAAA,CAAgB,CAAC,CAAA,CATvDvd,EAAY,YAAA,CAAasd,CAAAA,CAAW,CAAC,CAAA,CAAA,CAelC,CAAE,aAAAF,CAAa,CACxB,CAAA,CAEA,SAAA,CAAYtlC,CAAAA,EAAa,CAEvB,IAAM0lC,CAAAA,CAAc,OAAO1lC,GAAa,QAAA,EAAYA,CAAAA,GAAa,KAC5DA,CAAAA,CAAiC,MAAA,CAClC,MAAA,CAGA,OAAO0lC,CAAAA,EAAgB,QAAA,EACzBxd,EAAY,YAAA,CACV/W,CAAAA,CAAU,cAAc,WAAA,CAAY3O,CAAQ,EAC5CkjC,CACF,CAAA,CAGFj6B,IAAYi6B,CAAW,EACzB,EAGA,OAAA,CAAS,CAACjwC,EAAOulC,CAAAA,CAAYxI,CAAAA,GAAY,CAEnCA,CAAAA,EAAS,YAAA,EACXA,CAAAA,CAAQ,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,QAAA,CAAU/W,CAAAA,CAAU,aAAA,CAAc,OACpC,CAAC,EACH,CACF,CAAC,CACH,CC7JO,SAASw0B,EAAAA,CACdnjC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,gBAAiB,eAAe,CAAA,CACjC/I,EACA,CAAC,CAAE,IAAA,CAAAwpB,CAAK,CAAA,GAAMD,EAAAA,CAAoBvpB,EAAWwpB,CAAI,CAAA,CACjD,SAAY,CACN/hB,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,EAAU,aAAA,CAAc,WAAA,CAAY3O,CAAQ,CAC9C,CAAC,EAEL,CAAA,CACAyH,CAAAA,CACA,SAAA,CACA,CAAE,aAAA,CAAeI,CAAAA,EAAiB,OAAQ,CAC5C,CACF,CCtBO,SAASu7B,GAAwBpxC,CAAAA,CAAY,CAClD,OAAO0c,uBAAAA,CAAa,CAClB,SAAU,CAAC,WAAA,CAAa,WAAY1c,CAAE,CAAA,CACtC,OAAA,CAAS,SAAY,CAEnB,IAAMqxC,GADI,MAAMpnC,CAAAA,CAAQ,+BAAgC,CAAC,CAACjK,CAAE,CAAC,CAAC,CAAA,EAC3C,CAAC,CAAA,CAGpB,OAAI,IAAI,IAAA,CAAKqxC,CAAAA,CAAS,UAAU,CAAA,CAAI,IAAI,MAAU,IAAI,IAAA,CAAKA,CAAAA,CAAS,QAAQ,CAAA,EAAK,IAAI,KACnFA,CAAAA,CAAS,MAAA,CAAS,SACT,IAAI,IAAA,CAAKA,EAAS,QAAQ,CAAA,CAAI,IAAI,IAAA,CAC3CA,CAAAA,CAAS,OAAS,SAAA,CAElBA,CAAAA,CAAS,OAAS,UAAA,CAGbA,CACT,CACF,CAAC,CACH,CCnBO,SAASC,EAAAA,EAA2B,CACzC,OAAO50B,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,MAAM,CAAA,CAC9B,OAAA,CAAS,SAAY,CASnB,IAAM60B,GARY,MAAMtnC,CAAAA,CAAQ,8BAA+B,CAC7D,KAAA,CAAO,CAAC,EAAE,CAAA,CACV,KAAA,CAAO,IACP,KAAA,CAAO,gBAAA,CACP,gBAAiB,YAAA,CACjB,MAAA,CAAQ,KACV,CAAC,CAAA,EAE0B,UACrBunC,CAAAA,CAAUD,CAAAA,CAAU,OAAQtsB,CAAAA,EAAMA,CAAAA,CAAE,SAAW,SAAS,CAAA,CAG9D,OAAO,CAAC,GAFOssB,CAAAA,CAAU,MAAA,CAAQtsB,CAAAA,EAAMA,CAAAA,CAAE,SAAW,SAAS,CAAA,CAE1C,GAAGusB,CAAO,CAC/B,CACF,CAAC,CACH,CCJO,SAASC,EAAAA,CACd1xB,EACAC,CAAAA,CACA5kB,CAAAA,CACA,CACA,OAAOyrB,+BAAAA,CAML,CACA,QAAA,CAAU,CAAC,WAAA,CAAa,QAAS9G,CAAAA,CAAYC,CAAAA,CAAO5kB,CAAK,CAAA,CACzD,gBAAA,CAAkB4kB,EAClB,cAAA,CAAgB,IAAA,CAChB,UAAW,CAAA,CAEX,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA8G,CAAU,CAAA,GAA6B,CASvD,IAAMrqB,CAAAA,CAAAA,CANY,MAAMwN,CAAAA,CAAQ,mCAAA,CAAqC,CACnE,CAAC8V,EAHgB+G,CAAAA,EAAa9G,CAGP,EACvB5kB,CAAAA,CACA,mBACF,CAAC,CAAA,EAGE,MAAA,CAAQ6pB,CAAAA,EAAMA,CAAAA,CAAE,QAAA,EAAU,WAAA,GAAgBlF,CAAU,CAAA,CACpD,GAAA,CAAKkF,IAAO,CAAE,EAAA,CAAIA,EAAE,EAAA,CAAI,KAAA,CAAOA,CAAAA,CAAE,KAAM,CAAA,CAAE,CAAA,CAEtCD,EAAc,MAAM/a,CAAAA,CAAQ,6BAA8B,CAACxN,CAAAA,CAAK,IAAK,CAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,EACpFijB,CAAAA,CAAWqF,EAAAA,CAAcC,CAAW,CAAA,CAO1C,OALgCvoB,EAAK,GAAA,CAAKxD,CAAAA,GAAO,CAC/C,GAAGA,CAAAA,CACH,YAAA,CAAcymB,EAAS,IAAA,CAAM/gB,CAAAA,EAAM1F,EAAE,KAAA,GAAU0F,CAAAA,CAAE,IAAI,CACvD,CAAA,CAAE,CAGJ,CAAA,CAEA,gBAAA,CAAmBqoB,CAAAA,EACJA,IAAWA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAC9B,KAAA,EAAS,MAE1B,CAAC,CACH,CC3DO,SAAS0qB,EAAAA,CAAiC1xB,EAAe,CAC9D,OAAOtD,wBAAa,CAClB,QAAA,CAAU,CAAC,WAAA,CAAa,OAAA,CAAS,UAAWsD,CAAK,CAAA,CACjD,QAAS,CAAC,CAACA,GAASA,CAAAA,GAAU,EAAA,CAC9B,SAAA,CAAW,EAAA,CAAK,GAAA,CAChB,OAAA,CAAS,SACH,CAACA,CAAAA,EAASA,IAAU,EAAA,CACf,KAGS,MAAM/V,CAAAA,CAAQ,kCAAA,CAAoC,CAClE,KAAA,CAAO,CAAC+V,CAAK,CAAA,CACb,KAAA,CAAO,IACP,KAAA,CAAO,mBAAA,CACP,gBAAiB,WAAA,CACjB,MAAA,CAAQ,SACV,CAAC,CAAA,EAG2B,cAAA,EAAkB,EAAC,EAAG,MAAA,CAAQ2xB,GAASA,CAAAA,CAAK,KAAA,GAAU3xB,CAAK,CAI3F,CAAC,CACH,CCmCO,SAAS4xB,GACd5jC,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,CAAAA,CAAaN,CAAO,CACrD,CAAA,CACA,MAAOt+B,CAAAA,EAAgB,CAErB,GAAI,CAIF,IAAM0T,EAAO1T,CAAAA,EAAQ,EAAA,EAAMA,CAAAA,EAAQ,KAAA,CAC/Bkc,CAAAA,EAAM,OAAA,EAAS,gBAAkBxI,CAAAA,EACnCwI,CAAAA,CAAK,QAAQ,cAAA,CAAe,GAAA,CAAKxI,EAAM1T,CAAAA,EAAQ,SAAS,EAAE,KAAA,CAAO0H,CAAAA,EAAU,CACzE,OAAA,CAAQ,KAAA,CAAM,0DAA2D,CACvE,YAAA,CAAc,IACd,QAAA,CAAU1H,CAAAA,EAAQ,SAAA,CAClB,aAAA,CAAe0T,CAAAA,CACf,KAAA,CAAAhM,CACF,CAAC,EACH,CAAC,CAAA,CAICwU,CAAAA,EAAM,SAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,EAAU,SAAA,CAAU,IAAA,GACpBA,CAAAA,CAAU,SAAA,CAAU,YAAY3O,CAAS,CAC3C,CAAC,EAEL,CAAA,MAAS/M,CAAAA,CAAO,CAEd,OAAA,CAAQ,IAAA,CAAK,uDAAwDA,CAAK,EAC5E,CACF,CAAA,CACAwU,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC1GO,SAASg8B,EAAAA,CACd7jC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,YAAa,QAAQ,CAAA,CACtB/I,EACCmJ,CAAAA,EAAY,CACX6gB,GAAsBhqB,CAAAA,CAAWmJ,CAAO,CAC1C,CAAA,CACA,SAAY,CACN1B,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,kBAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,EAAU,SAAA,CAAU,IAAA,EACtB,CAAC,EAEL,EACAlH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCpBO,SAASi8B,EAAAA,CACd9jC,CAAAA,CACA5S,CAAAA,CAAQ,EAAA,CACR,CACA,OAAOyrB,+BAAAA,CAAqB,CAC1B,SAAU,CAAC,QAAA,CAAU,sBAAuB7Y,CAAAA,CAAU5S,CAAK,CAAA,CAC3D,gBAAA,CAAkB,EAAA,CAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,CAAA,GAA6B,CAEvD,IAAMirB,CAAAA,CAAajrB,CAAAA,CAAY1rB,CAAAA,CAAQ,CAAA,CAAIA,CAAAA,CAErC7B,CAAAA,CAAS,MAAM0Q,CAAAA,CAAQ,uCAAA,CAAyC,CACpE+D,CAAAA,CACA8Y,CAAAA,EAAa,GACbirB,CACF,CAAC,EAID,OAAIjrB,CAAAA,EAAavtB,EAAO,MAAA,CAAS,CAAA,EAAKA,EAAO,CAAC,CAAA,EAAG,YAAcutB,CAAAA,CAEtDvtB,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAG6B,CAAAA,CAAQ,CAAC,EAG3B7B,CACT,CAAA,CACA,iBAAmBytB,CAAAA,EAEb,CAACA,GAAYA,CAAAA,CAAS,MAAA,CAAS5rB,CAAAA,CACjC,MAAA,CAIqB4rB,CAAAA,CAASA,CAAAA,CAAS,OAAS,CAAC,CAAA,EAC5B,UAEzB,OAAA,CAAS,CAAC,CAAChZ,CACb,CAAC,CACH,CCnCO,SAASgkC,GAAkChkC,CAAAA,CAA8B,CAC9E,OAAO0O,uBAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,sBAAuB1O,CAAQ,CAAA,CACpD,QAAS,CAAC,CAACA,EACX,OAAA,CAAS,CAAC,CAAE,MAAA,CAAA3F,CAAO,CAAA,GACjBuC,GACE,SAAA,CACA,sCAAA,CACA,CAAE,cAAA,CAAgBoD,CAAS,EAC3B,MAAA,CACA,MAAA,CACA3F,CACF,CACJ,CAAC,CACH,CCXO,SAAS4pC,GAA4CjkC,CAAAA,CAAmB,CAC7E,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,gCAAA,CAAkC1O,CAAQ,CAAA,CAC/D,OAAA,CAAS,SACFA,CAAAA,CAAAA,CACU,MAAM/D,EAAQ,kDAAA,CAAoD,CAAE,QAAS+D,CAAS,CAAC,GACxF,WAAA,CAFQ,GAIxB,OAAA,CAAS,CAAC,CAACA,CACb,CAAC,CACH,CCjBO,SAASkkC,GAAkCl+B,CAAAA,CAAiB,CACjE,OAAO0I,uBAAAA,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,CAAA,CACH,OAAS5W,CAAAA,EAASA,CAAAA,CAAK,KAAK,CAACuB,CAAAA,CAAGtF,IAAMsF,CAAAA,CAAE,SAAA,CAAYtF,EAAE,SAAS,CACjE,CAAC,CACH,CCTO,SAAS84C,EAAAA,CAAgDn+B,CAAAA,CAAiB,CAC/E,OAAO0I,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,oCAAA,CAAsC1I,CAAO,EAClE,OAAA,CAAS,IACP/J,CAAAA,CAAQ,sDAAA,CAAwD,CAC9D+J,CACF,CAAC,CAAA,CACH,MAAA,CAAS5W,GAASA,CAAAA,CAAK,IAAA,CAAK,CAACuB,CAAAA,CAAGtF,CAAAA,GAAMsF,CAAAA,CAAE,SAAA,CAAYtF,CAAAA,CAAE,SAAS,CACjE,CAAC,CACH,CCTO,SAAS+4C,GAAmCp+B,CAAAA,CAAiB,CAClE,OAAO0I,uBAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,mBAAoB1I,CAAO,CAAA,CAChD,OAAA,CAAS,IACP/J,CAAAA,CAAQ,yCAAA,CAA2C,CACjD+J,CACF,CAAC,EACH,MAAA,CAAS5W,CAAAA,EAASA,EAAK,IAAA,CAAK,CAACuB,CAAAA,CAAGtF,CAAAA,GAAMsF,CAAAA,CAAE,UAAA,CAAatF,EAAE,UAAU,CACnE,CAAC,CACH,CCTO,SAASg5C,EAAAA,CAA8Br+B,CAAAA,CAAiB,CAC7D,OAAO0I,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,iBAAA,CAAmB1I,CAAO,EAC/C,OAAA,CAAS,IACP/J,EAAQ,mCAAA,CAAqC,CAC3C+J,EACA,UACF,CAAC,CACL,CAAC,CACH,CCTO,SAASs+B,EAAAA,CAA0BzxB,EAAc,CACtD,OAAOnE,wBAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAemE,CAAI,EACxC,OAAA,CAAS,IACP5W,EAAQ,+BAAA,CAAiC,CACvC4W,CACF,CAAC,CAAA,CACH,MAAA,CAASzjB,CAAAA,EAASA,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,CAAAA,CAAQ,GAAA,CAAK,CAC1F,OAAOyrB,+BAAAA,CAML,CACA,SAAU,CAAC,QAAA,CAAU,0BAA2B7Y,CAAAA,CAAU5S,CAAK,CAAA,CAC/D,gBAAA,CAAkB,IAAA,CAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,CAAA,GAA+B,CAOzD,IAAI0rB,CAAAA,CAAAA,CANa,MAAMvoC,CAAAA,CAAQ,mCAAA,CAAqC,CAChE,KAAA,CAAO,CAAC+D,CAAAA,CAAU8Y,CAAAA,EAAa,EAAE,CAAA,CACjC,KAAA,CAAA1rB,CACF,CAAC,CAAA,CACA,KAAM0B,CAAAA,EAAWA,CAAgC,GAEH,qBAAA,EAAyB,GAG1E,OAAIgqB,CAAAA,GACF0rB,EAAcA,CAAAA,CAAY,MAAA,CAAQC,CAAAA,EAAeA,CAAAA,CAAW,EAAA,GAAO3rB,CAAS,GAGvE0rB,CACT,CAAA,CAEA,iBAAmBxrB,CAAAA,EACjBA,CAAAA,CAAS,SAAW5rB,CAAAA,CAAQ4rB,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAAE,GAAK,IACnE,CAAC,CACH,CCxCO,SAAS0rB,EAAAA,CAA0B1kC,CAAAA,CAA8B,CACtE,OAAO0O,uBAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,cAAe1O,CAAQ,CAAA,CAC5C,QAAS,CAAC,CAACA,EACX,OAAA,CAAS,SAAyC,CAChD,GAAI,CAACA,EACH,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAIpE,IAAMxC,EAAW,MADAyQ,CAAAA,GAEf,CAAA,EAAGzD,CAAAA,CAAO,cAAc,CAAA,yBAAA,EAA4BxK,CAAQ,CAAA,CAC9D,CAAA,CAEA,GAAI,CAACxC,EAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,EAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,OAAOA,CAAAA,CAAS,IAAA,EAClB,CACF,CAAC,CACH,CCrBO,SAASmnC,EAAAA,CAAqC3kC,CAAAA,CAAkB,CACrE,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,yBAAA,CAA2B1O,CAAQ,CAAA,CACxD,OAAA,CAAS,SAAY,CACnB,IAAMxC,CAAAA,CAAW,MAAM,MACrBgN,CAAAA,CAAO,cAAA,CAAiB,iCAAiCxK,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,EAAkB,CAClE,OAAO0O,wBAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,qBAAA,CAAuB1O,CAAQ,CAAA,CACpD,OAAA,CAAS,IACP/D,EAAQ,wCAAA,CAA0C,CAChD+D,CACF,CAAC,CAAA,CACH,QAAS,CAAC,CAACA,CACb,CAAC,CACH,CCsBA,SAAS6kC,EAAAA,CAAgBx4C,EAAoC,CAC3D,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAC7B,IAAMy4C,CAAAA,CAAUz4C,CAAAA,CAAM,MAAK,CAC3B,OAAOy4C,EAAQ,MAAA,CAAS,CAAA,CAAIA,EAAU,MACxC,CAGF,CAEA,SAASC,EAAAA,CAAgB14C,EAAoC,CAC3D,GAAI,OAAOA,CAAAA,EAAU,QAAA,EAAY,MAAA,CAAO,QAAA,CAASA,CAAK,CAAA,CACpD,OAAOA,CAAAA,CAGT,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAC7B,IAAMy4C,CAAAA,CAAUz4C,CAAAA,CAAM,IAAA,EAAK,CAC3B,GAAI,CAACy4C,CAAAA,CACH,OAGF,IAAME,CAAAA,CAAS,MAAA,CAAO,WAAWF,CAAO,CAAA,CACxC,GAAI,MAAA,CAAO,QAAA,CAASE,CAAM,EACxB,OAAOA,CAAAA,CAIT,IAAMt5B,CAAAA,CADYo5B,CAAAA,CAAQ,QAAQ,IAAA,CAAM,EAAE,EAClB,KAAA,CAAM,oBAAoB,EAClD,GAAIp5B,CAAAA,CAAO,CACT,IAAMvE,CAAAA,CAAS,OAAO,UAAA,CAAWuE,CAAAA,CAAM,CAAC,CAAC,CAAA,CACzC,GAAI,OAAO,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,CAAAA,CAGd,OAAO,CACL,IAAA,CAAML,GAAgB98B,CAAAA,CAAM,IAAI,GAAK,EAAA,CACrC,MAAA,CAAQ88B,GAAgB98B,CAAAA,CAAM,MAAM,GAAK,EAAA,CACzC,KAAA,CAAQ88B,GAAgB98B,CAAAA,CAAM,KAAK,GAAK,MAAA,CACxC,OAAA,CAASg9B,GAAgBh9B,CAAAA,CAAM,OAAO,CAAA,EAAK,CAAA,CAC3C,QAAA,CAAUg9B,EAAAA,CAAgBh9B,EAAM,QAAQ,CAAA,EAAK,EAC7C,QAAA,CAAU88B,EAAAA,CAAgB98B,EAAM,QAAQ,CAAA,EAAK,KAAA,CAC7C,SAAA,CAAWg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,SAAS,CAAA,EAAK,CAAA,CAC/C,QAAS88B,EAAAA,CAAgB98B,CAAAA,CAAM,OAAO,CAAA,CACtC,KAAA,CAAO88B,EAAAA,CAAgB98B,CAAAA,CAAM,KAAK,CAAA,CAClC,eAAgBg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,cAAc,CAAA,CACpD,kBAAA,CAAoBg9B,GAAgBh9B,CAAAA,CAAM,kBAAkB,EAC5D,MAAA,CAAQg9B,EAAAA,CAAgBh9B,EAAM,MAAM,CAAA,CACpC,WAAYg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,UAAU,CAAA,CAC5C,OAAA,CAASg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,OAAO,CAAA,CACtC,YAAag9B,EAAAA,CAAgBh9B,CAAAA,CAAM,WAAW,CAAA,CAC9C,MAAA,CAAQg9B,GAAgBh9B,CAAAA,CAAM,MAAM,CAAA,CACpC,UAAA,CAAYg9B,EAAAA,CAAgBh9B,CAAAA,CAAM,UAAU,CAAA,CAC5C,OAAA,CAAS88B,GAAgB98B,CAAAA,CAAM,OAAO,EACtC,OAAA,CAAUA,CAAAA,CAAM,OAAA,EAAW,EAAC,CAC5B,SAAA,CAAYA,EAAM,SAAA,EAAa,GAC/B,GAAA,CAAKg9B,EAAAA,CAAgBh9B,EAAM,GAAG,CAChC,CACF,CAEA,SAASo9B,GAAch8B,CAAAA,CAA6B,CAClD,GAAI,CAACA,CAAAA,EAAW,OAAOA,CAAAA,EAAY,QAAA,CACjC,OAAO,EAAC,CAGV,IAAMyZ,EAAa,CAACzZ,CAAO,EACrBi8B,CAAAA,CAASj8B,CAAAA,CACXi8B,EAAO,IAAA,EAAQ,OAAOA,CAAAA,CAAO,IAAA,EAAS,QAAA,EACxCxiB,CAAAA,CAAW,KAAKwiB,CAAAA,CAAO,IAA+B,EAEpDA,CAAAA,CAAO,MAAA,EAAU,OAAOA,CAAAA,CAAO,MAAA,EAAW,QAAA,EAC5CxiB,CAAAA,CAAW,IAAA,CAAKwiB,CAAAA,CAAO,MAAiC,CAAA,CAEtDA,CAAAA,CAAO,WAAa,OAAOA,CAAAA,CAAO,WAAc,QAAA,EAClDxiB,CAAAA,CAAW,KAAKwiB,CAAAA,CAAO,SAAoC,EAG7D,IAAA,IAAWtjB,CAAAA,IAAac,EAAY,CAClC,GAAI,MAAM,OAAA,CAAQd,CAAS,CAAA,CACzB,OAAOA,CAAAA,CAGT,GAAIA,GAAa,OAAOA,CAAAA,EAAc,SACpC,IAAA,IAAW9xB,CAAAA,IAAO,CAChB,SAAA,CACA,QAAA,CACA,QAAA,CACA,OAAA,CACA,WAAA,CACA,UACF,EAAG,CACD,IAAM3D,EAASy1B,CAAAA,CAAsC9xB,CAAG,EACxD,GAAI,KAAA,CAAM,OAAA,CAAQ3D,CAAK,CAAA,CACrB,OAAOA,CAEX,CAEJ,CAEA,OAAO,EACT,CAEA,SAASg5C,EAAAA,CAAgBl8B,EAAsC,CAC7D,GAAI,CAACA,CAAAA,EAAW,OAAOA,GAAY,QAAA,CACjC,OAGF,IAAMi8B,CAAAA,CAASj8B,CAAAA,CACf,OACE07B,EAAAA,CAAgBO,CAAAA,CAAO,QAAQ,GAC/BP,EAAAA,CAAgBO,CAAAA,CAAO,IAAI,CAAA,EAC3BP,EAAAA,CAAgBO,EAAO,OAAO,CAElC,CASO,SAASE,EAAAA,CACdtlC,CAAAA,CACAiT,EAAmB,KAAA,CACnBD,CAAAA,CAAuB,KACvB,CACA,OAAOtE,wBAAa,CAClB,QAAA,CAAU,CACR,QAAA,CACA,WAAA,CACA,IAAA,CACA1O,EACAgT,CAAAA,CAAc,cAAA,CAAiB,MAC/BC,CACF,CAAA,CACA,QAAS,CAAA,CAAQjT,CAAAA,CACjB,UAAW,GAAA,CACX,eAAA,CAAiB,KACjB,OAAA,CAAS,SAAwC,CAC/C,GAAI,CAACA,EACH,MAAM,IAAI,KAAA,CAAM,2CAAsC,CAAA,CAGxD,IAAMnD,EAAW,CAAA,EAAG6N,qBAAAA,CAAc,qBAAqB,CAAA,wBAAA,CAAA,CACjDlN,EAAW,MAAM,KAAA,CAAMX,CAAAA,CAAU,CACrC,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,MAAA,CAAQ,mBACR,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAE,QAAA,CAAAmD,CAAAA,CAAU,YAAAgT,CAAAA,CAAa,QAAA,CAAAC,CAAS,CAAC,CAC1D,CAAC,CAAA,CAED,GAAI,CAACzV,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,kDAA6CA,CAAAA,CAAS,MAAM,GAC9D,CAAA,CAGF,IAAM2L,CAAAA,CAAW,MAAM3L,CAAAA,CAAS,IAAA,GAC1BlF,CAAAA,CAAS6sC,EAAAA,CAAch8B,CAAO,CAAA,CACjC,GAAA,CAAKlX,GAASgzC,EAAAA,CAAWhzC,CAAI,CAAC,CAAA,CAC9B,MAAA,CAAQA,CAAAA,EAAsC,EAAQA,CAAK,CAAA,CAE3D,OAAQA,CAAAA,EAAUA,CAAAA,CAAK,QAAqB,KAAK,CAAA,CAEpD,GAAI,CAACqG,CAAAA,CAAO,MAAA,CACV,MAAM,IAAI,KAAA,CACR,4DACF,CAAA,CAGF,OAAO,CACL,QAAA,CAAU+sC,EAAAA,CAAgBl8B,CAAO,CAAA,EAAKnJ,CAAAA,CACtC,SAAU6kC,EAAAA,CACP17B,CAAAA,EAAiD,cACjDA,CAAAA,EAAiD,QACpD,GAAG,WAAA,EAAY,CACf,OAAA,CAAS7Q,CACX,CACF,CACF,CAAC,CACH,CCjOO,SAASitC,EAAAA,CAAoCvlC,CAAAA,CAAkB,CACpE,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,MAAA,CAAQ,cAAA,CAAgB1O,CAAQ,CAAA,CACrD,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,CAEMwlC,CAAAA,CAAgB,MAAMvpC,CAAAA,CAAQ,2BAA4B,EAAE,EAC/D,KAAA,CAAM,IAAG,EAAY,CAAA,CAElBwpC,CAAAA,CAAc,MAAA,CAAO,UAAA,CAAWD,CAAAA,EAAc,MAAA,EAAU,EAAE,CAAA,CAEhE,GAAI,CAACpV,CAAAA,CACH,OAAO,CACL,IAAA,CAAM,MAAA,CACN,MAAO,MAAA,CACP,KAAA,CAAO,OAAO,QAAA,CAASqV,CAAW,EAC9BA,CAAAA,CACA1S,CAAAA,CACEA,EAAa,IAAA,CAAOA,CAAAA,CAAa,KAAA,CACjC,CAAA,CACN,cAAA,CAAgB,CAClB,EAGF,IAAM2S,CAAAA,CAAgB73B,EAAWuiB,CAAAA,CAAY,OAAO,EAAE,MAAA,CAChDuV,CAAAA,CAAiB93B,CAAAA,CAAWuiB,CAAAA,CAAY,eAAe,CAAA,CAAE,OAE/D,OAAO,CACL,KAAM,MAAA,CACN,KAAA,CAAO,OACP,KAAA,CAAO,MAAA,CAAO,QAAA,CAASqV,CAAW,CAAA,CAC9BA,CAAAA,CACA1S,EACEA,CAAAA,CAAa,IAAA,CAAOA,EAAa,KAAA,CACjC,CAAA,CACN,eAAgB2S,CAAAA,CAAgBC,CAAAA,CAChC,MAAO,CACL,CACE,KAAM,SAAA,CACN,OAAA,CAASD,CACX,CAAA,CACA,CACE,KAAM,SAAA,CACN,OAAA,CAASC,CACX,CACF,CACF,CACF,CACF,CAAC,CACH,CC9DO,SAASC,EAAAA,CAAmC5lC,CAAAA,CAAkB,CACnE,OAAO0O,wBAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,KAAA,CAAO,eAAgB1O,CAAQ,CAAA,CACpD,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,QAAS,SAAY,CACnB,MAAM6M,CAAAA,EAAe,CAAE,cAAc4B,EAAAA,EAA6B,EAClE,MAAM5B,CAAAA,GAAiB,aAAA,CACrB8H,CAAAA,CAA2B3U,CAAQ,CACrC,CAAA,CAEA,IAAMowB,CAAAA,CAAcvjB,CAAAA,EAAe,CAAE,YAAA,CACnC8H,CAAAA,CAA2B3U,CAAQ,EAAE,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,cAAA,CACEh4B,CAAAA,CAAWuiB,CAAAA,CAAY,WAAW,EAAE,MAAA,CACpCviB,CAAAA,CAAWuiB,GAAa,mBAAmB,CAAA,CAAE,OAC/C,GAAA,CAAA,CAAA,CAAO2C,CAAAA,EAAc,iBAAmB,CAAA,EAAK,GAAA,EAAK,QAAQ,CAAC,CAAA,CAC3D,MAAO,CACL,CACE,KAAM,SAAA,CACN,OAAA,CAASllB,CAAAA,CAAWuiB,CAAAA,CAAY,WAAW,CAAA,CAAE,MAC/C,CAAA,CACA,CACE,KAAM,SAAA,CACN,OAAA,CAASviB,EAAWuiB,CAAAA,CAAY,mBAAmB,CAAA,CAAE,MACvD,CACF,CACF,EA1BS,CACL,IAAA,CAAM,MACN,KAAA,CAAO,aAAA,CACP,MAAAyV,CAAAA,CACA,cAAA,CAAgB,CAClB,CAsBJ,CACF,CAAC,CACH,CCjDA,SAASC,EAAAA,CAAO/S,CAAAA,CAA4B,CAU1C,IAAIgT,CAAAA,CACF,KALgBhT,CAAAA,CAAa,SAAA,CACC,KACS,IAAA,CAGK,GAAA,CAE1CgT,EAAuB,GAAA,GACzBA,CAAAA,CAAuB,GAAA,CAAA,CAGzB,IAAM71B,CAAAA,CAAuB6iB,CAAAA,CAAa,qBAAuB,GAAA,CAC3D9iB,CAAAA,CAAgB8iB,EAAa,aAAA,CAC7BiT,CAAAA,CAAoBjT,EAAa,gBAAA,CAEvC,OAAA,CACG9iB,CAAAA,CAAgB81B,CAAAA,CAAuB71B,CAAAA,CACxC81B,CAAAA,EACA,QAAQ,CAAC,CACb,CAEO,SAASC,EAAAA,CAAyCjmC,EAAkB,CACzE,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU,YAAA,CAAc,cAAA,CAAgB1O,CAAQ,CAAA,CAC3D,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,EAEA,GAAI,CAAC+yB,CAAAA,EAAgB,CAAC3C,CAAAA,CACpB,OAAO,CACL,IAAA,CAAM,IAAA,CACN,MAAO,YAAA,CACP,KAAA,CAAO,EACP,cAAA,CAAgB,CAClB,EAGF,IAAMoV,CAAAA,CAAgB,MAAMvpC,CAAAA,CAAQ,0BAAA,CAA4B,EAAE,CAAA,CAC/D,MAAM,IAAG,CAAA,CAAY,CAAA,CAElBwpC,CAAAA,CAAc,MAAA,CAAO,UAAA,CAAWD,GAAc,MAAA,EAAU,EAAE,EAC1DK,CAAAA,CAAQ,MAAA,CAAO,SAASJ,CAAW,CAAA,CACrCA,CAAAA,CACA1S,CAAAA,CAAa,IAAA,CAAOA,CAAAA,CAAa,MAE/BhL,CAAAA,CAAgBla,CAAAA,CAAWuiB,EAAY,cAAc,CAAA,CAAE,OACvD8V,CAAAA,CAAiBr4B,CAAAA,CACrBuiB,CAAAA,CAAY,wBACd,CAAA,CAAE,MAAA,CACI+V,EAAgBt4B,CAAAA,CACpBuiB,CAAAA,CAAY,uBACd,CAAA,CAAE,MAAA,CACIgW,EAAoBv4B,CAAAA,CACxBuiB,CAAAA,CAAY,qBACd,CAAA,CAAE,MAAA,CACIiW,EAA2B,IAAA,CAAK,GAAA,CAAA,CACnC,OAAOjW,CAAAA,CAAY,WAAW,EAAI,MAAA,CAAOA,CAAAA,CAAY,SAAS,CAAA,EAC7D,GAAA,CACF,CACF,EACMkW,CAAAA,CAAuB/3B,EAAAA,CAC3B6hB,EAAY,uBACd,CAAA,CAEI,EADA,IAAA,CAAK,GAAA,CAAIgW,CAAAA,CAAmBC,CAAwB,CAAA,CAGlDE,CAAAA,CAAY,CAACl4B,EAAAA,CACjB0Z,CAAAA,CACAgL,EAAa,aACf,CAAA,CAAE,QAAQ,CAAC,CAAA,CACLyT,CAAAA,CAAwB,CAACn4B,EAAAA,CAC7B63B,CAAAA,CACAnT,EAAa,aACf,CAAA,CAAE,QAAQ,CAAC,CAAA,CACL0T,EAAwB,CAACp4B,EAAAA,CAC7B83B,EACApT,CAAAA,CAAa,aACf,EAAE,OAAA,CAAQ,CAAC,EACL2T,CAAAA,CAAqB,CAACr4B,GAC1Bg4B,CAAAA,CACAtT,CAAAA,CAAa,aACf,CAAA,CAAE,OAAA,CAAQ,CAAC,EACL4T,CAAAA,CAAkB,CAACt4B,GACvBi4B,CAAAA,CACAvT,CAAAA,CAAa,aACf,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CACL6T,CAAAA,CAAe,IAAA,CAAK,IAAIL,CAAAA,CAAYG,CAAAA,CAAoB,CAAC,CAAA,CACzDG,CAAAA,CAAc,KAAK,GAAA,CAAIN,CAAAA,CAAYC,CAAAA,CAAuB,CAAC,CAAA,CAEjE,OAAO,CACL,IAAA,CAAM,IAAA,CACN,MAAO,YAAA,CACP,KAAA,CAAAX,EACA,cAAA,CAAgB,CAACe,EAAa,OAAA,CAAQ,CAAC,EACvC,GAAA,CAAKd,EAAAA,CAAO/S,CAAY,CAAA,CACxB,KAAA,CAAO,CACL,CACE,IAAA,CAAM,YAAA,CACN,OAAA,CAASwT,CACX,CAAA,CACA,CACE,IAAA,CAAM,WAAA,CACN,QAAS,CAACM,CAAAA,CAAY,QAAQ,CAAC,CACjC,CAAA,CACA,CACE,IAAA,CAAM,sBAAA,CACN,QAASL,CACX,CAAA,CACA,CACE,IAAA,CAAM,sBAAA,CACN,QAASC,CACX,CAAA,CACA,GAAIC,CAAAA,CAAqB,CAAA,CACrB,CACE,CACE,IAAA,CAAM,oBAAA,CACN,QAAS,CAACA,CAAAA,CAAmB,QAAQ,CAAC,CACxC,CACF,CAAA,CACA,GACJ,GAAIC,CAAAA,CAAkB,GAAKA,CAAAA,GAAoBD,CAAAA,CAC3C,CACE,CACE,IAAA,CAAM,iBAAA,CACN,OAAA,CAAS,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,CAAAA,CAAI,SACJA,CAAAA,CAAI,mBAAA,CACJA,EAAI,qBAAA,CACJA,CAAAA,CAAI,6BACJA,CAAAA,CAAI,kBAAA,CACJA,EAAI,uBAAA,CACJA,CAAAA,CAAI,gBACJA,CAAAA,CAAI,uBACN,EACA,eAAA,CAAiB,CACfA,EAAI,oBAAA,CACJA,CAAAA,CAAI,UAAA,CACJA,CAAAA,CAAI,mCAAA,CACJA,CAAAA,CAAI,oBACJA,CAAAA,CAAI,kBAAA,CACJA,EAAI,kBACN,CAAA,CACA,UAAW,CAACA,CAAAA,CAAI,QAAQ,CAAA,CACxB,kBAAA,CAAoB,CAClBA,EAAI,yBAAA,CACJA,CAAAA,CAAI,iBACJA,CAAAA,CAAI,mBAAA,CACJA,EAAI,0BAAA,CACJA,CAAAA,CAAI,qBAAA,CACJA,CAAAA,CAAI,qBAAA,CACJA,CAAAA,CAAI,sBACJA,CAAAA,CAAI,uBACN,EACA,OAAA,CAAS,CACPA,EAAI,aAAA,CACJA,CAAAA,CAAI,gBACJA,CAAAA,CAAI,eAAA,CACJA,EAAI,oBAAA,CACJA,CAAAA,CAAI,0BACJA,CAAAA,CAAI,gBAAA,CACJA,EAAI,YACN,CAAA,CACA,EAAA,CAAI,EACN,MC5Ca0hC,EAAAA,CAAsB,MAAA,CAAO,KACxC9iC,EAAAA,CAAM,UACR,ECFA,IAAM+iC,EAAAA,CAAkB/iC,EAAAA,CAAM,UAAA,CAKjBgjC,EAAAA,CAAwBD,EAAAA,CAExBE,GACX,MAAA,CAAO,OAAA,CAAQF,EAAe,CAAA,CAAE,MAAA,CAAO,CAACvtB,CAAAA,CAAK,CAAC5H,CAAAA,CAAM7f,CAAE,CAAA,IACpDynB,CAAAA,CAAIznB,CAAE,CAAA,CAAI6f,CAAAA,CACH4H,GACN,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,GAA4BxiB,CAAAA,CAG1C,CACA,IAAMyiB,CAAAA,CAAwC,KAAA,CAAM,QAAQziB,CAAO,CAAA,CAC/DA,CAAAA,CACA,CAACA,CAAO,CAAA,CAEN0iB,EAASD,CAAAA,CAAU,QAAA,CAAS,EAAwB,CAAA,CAEpDE,CAAAA,CAAe,MAAM,IAAA,CACzB,IAAI,GAAA,CACFF,CAAAA,CAAU,MAAA,CACPh7C,CAAAA,EAECA,GAAU,IAAA,EACVA,CAAAA,GAAW,EACf,CACF,CACF,EAEM6mB,CAAAA,CACJo0B,CAAAA,EAAUC,EAAa,MAAA,GAAW,CAAA,CAC9B,MACAA,CAAAA,CACG,GAAA,CAAKl7C,GAAUA,CAAAA,CAAM,QAAA,EAAU,CAAA,CAC/B,IAAA,EAAK,CACL,IAAA,CAAK,GAAG,CAAA,CAEXm7C,EAAe,IAAI,GAAA,CAEpBF,GACHC,CAAAA,CAAa,OAAA,CAASl7C,GAAU,CAC9B,GAAIA,CAAAA,IAASy6C,EAAAA,CAA+B,CAC1CA,EAAAA,CAA8Bz6C,CAA2B,CAAA,CAAE,OAAA,CACxD2F,GAAOw1C,CAAAA,CAAa,GAAA,CAAIx1C,CAAE,CAC7B,CAAA,CACA,MACF,CAEIm1C,EAAAA,CAAoB96C,CAAK,GAC3Bm7C,CAAAA,CAAa,GAAA,CAAIR,GAAgB36C,CAAK,CAAC,EAE3C,CAAC,CAAA,CAGH,IAAMo7C,CAAAA,CAAarjC,EAAAA,CAAkB,MAAM,IAAA,CAAKojC,CAAY,CAAC,CAAA,CAE7D,OAAO,CACL,SAAA,CAAAt0B,CAAAA,CACA,UAAA,CAAAu0B,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,EAAA,EAAM,MAAA,CAAO/Q,CAAAA,CAAY,EAAE,EAEvC,CAAC,CAAA,CAEM,CACL8Q,CAAAA,GAAQ,EAAA,CAAKA,EAAI,QAAA,EAAS,CAAI,KAC9BC,CAAAA,GAAS,EAAA,CAAKA,EAAK,QAAA,EAAS,CAAI,IAClC,CACF,CAEO,SAAS6iC,EAAAA,CACd1nC,CAAAA,CACA5S,CAAAA,CAAQ,EAAA,CACRw3B,CAAAA,CAA+B,GAC/B,CACA,GAAM,CAAE,UAAA,CAAA6iB,CAAAA,CAAY,UAAAv0B,CAAU,CAAA,CAAIk0B,EAAAA,CAA4BxiB,CAAO,CAAA,CAErE,OAAO/L,gCAAwC,CAC7C,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQ,eAAgB7Y,CAAAA,CAAU5S,CAAAA,CAAO8lB,CAAS,CAAA,CACvE,WAAA,CAAa,CAAE,MAAO,EAAC,CAAG,WAAY,EAAG,EACzC,gBAAA,CAAkB,EAAA,CAClB,iBAAkB,CAAC8F,CAAAA,CAAU2uB,IAC3B3uB,CAAAA,CAAW,EAAEA,EAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,EAAG,GAAA,EAAO,CAAA,CAAA,CAAK,CAAA,CAAI,EAAA,CAE9D,OAAA,CAAS,MAAO,CAAE,SAAA,CAAAF,CAAU,CAAA,GAAA,CACT,MAAM7c,EACrB,mCAAA,CACA,CAAC+D,CAAAA,CAAU8Y,CAAAA,CAAW1rB,CAAAA,CAAO,GAAGq6C,CAAU,CAC5C,CAAA,EAEgB,IACbxwB,CAAAA,GACE,CACC,IAAKA,CAAAA,CAAE,CAAC,CAAA,CACR,IAAA,CAAMA,CAAAA,CAAE,CAAC,EAAE,EAAA,CAAG,CAAC,EACf,SAAA,CAAWA,CAAAA,CAAE,CAAC,CAAA,CAAE,SAAA,CAChB,OAAQA,CAAAA,CAAE,CAAC,EAAE,MAAA,CACb,GAAGA,EAAE,CAAC,CAAA,CAAE,GAAG,CAAC,CACd,CAAA,CACJ,CAAA,CAEF,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA2wB,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,eAAA,CACL,KAAK,2BAAA,CAIH,OAHmB4b,EAChB5b,CAAAA,CAAsB,WACzB,EACkB,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,CAAAA,CAAY5b,EAAa,MAAM,CAAA,CAAE,SAAW,MAAA,CAErD,KAAK,0BACH,IAAME,CAAAA,CAAQ0b,CAAAA,CAAW5b,CAAAA,CAAK,MAAM,CAAA,CACpC,OAAO,CAAC,MAAM,EAAE,QAAA,CAASE,CAAAA,CAAM,MAAM,CAAA,CAEvC,KAAK,sBAAA,CAIH,OAHmB0b,CAAAA,CAChB5b,CAAAA,CAA4B,WAC/B,CAAA,CACkB,MAAA,CAAS,EAE7B,KAAK,iBAAA,CACL,KAAK,8BAAA,CACL,KAAK,aACL,KAAK,oBAAA,CACL,KAAK,oBAAA,CACL,KAAK,uBACL,KAAK,qCAAA,CACH,OAAO,KAAA,CAET,KAAK,qBAAA,CACH,OAAO,KAAA,CACT,QACE,OAAO,MACX,CACF,CAAC,CACH,CACF,EACF,CAAC,CACH,CC/JO,SAAS61C,EAAAA,CACd9nC,EACA5S,CAAAA,CAAQ,EAAA,CACRw3B,EAA+B,EAAC,CAChC,CACA,GAAM,CAAE,SAAA,CAAA1R,CAAU,CAAA,CAAIk0B,EAAAA,CAA4BxiB,CAAO,CAAA,CAEzD,OAAO/L,gCAAwC,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,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,eAAA,CACL,KAAK,2BAAA,CAIH,OAHkB4b,EACf5b,CAAAA,CAAsB,UACzB,EACiB,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,CAAAA,CAAW5b,EAAK,MAAM,CAAA,CAAE,SAAW,KAAA,CAE5C,KAAK,wBACH,OAAO4b,CAAAA,CAAY5b,CAAAA,CAAa,MAAM,CAAA,CAAE,MAAA,GAAW,MAErD,KAAK,yBAAA,CACH,IAAME,CAAAA,CAAQ0b,CAAAA,CAAW5b,EAAK,MAAM,CAAA,CACpC,OAAO,CAAC,KAAK,CAAA,CAAE,SAASE,CAAAA,CAAM,MAAM,EAEtC,KAAK,8BAAA,CACL,KAAK,YAAA,CACL,KAAK,qBACL,KAAK,oBAAA,CACL,KAAK,sBAAA,CACL,KAAK,sCACL,KAAK,cAAA,CACL,KAAK,UAAA,CACH,OAAO,KAAA,CAET,KAAK,qBAAA,CACH,OAAO,MACT,QACE,OAAO,MACX,CACF,CAAC,CACH,CACF,CAAA,CACF,CAAC,CACH,CC7DO,SAAS41C,EAAAA,CACd/nC,CAAAA,CACA5S,EAAQ,EAAA,CACRw3B,CAAAA,CAA+B,EAAC,CAChC,CACA,GAAM,CAAE,SAAA,CAAA1R,CAAU,EAAIk0B,EAAAA,CAA4BxiB,CAAO,EAEnDojB,CAAAA,CAAyB,IAAI,IACjC,KAAA,CAAM,OAAA,CAAQpjB,CAAO,CAAA,CAAIA,CAAAA,CAAU,CAACA,CAAO,CAC7C,EACMqjB,CAAAA,CACJD,CAAAA,CAAuB,GAAA,CAAI,EAAS,CAAA,EAAKA,CAAAA,CAAuB,OAAS,CAAA,CAE3E,OAAOnvB,gCAAwC,CAC7C,GAAG6uB,GAAqC1nC,CAAAA,CAAU5S,CAAAA,CAAOw3B,CAAO,CAAA,CAChE,QAAA,CAAU,CACR,SACA,YAAA,CACA,cAAA,CACA5kB,EACA5S,CAAAA,CACA8lB,CACF,EACA,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA00B,CAAAA,CAAO,UAAA,CAAAC,CAAW,CAAA,IAAO,CAClC,WAAAA,CAAAA,CACA,KAAA,CAAOD,EAAM,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,EACqB,MAAA,CAAS,CAAA,CAEhC,KAAK,sBAAA,CAIH,OAHoB4b,EACjB5b,CAAAA,CAA4B,YAC/B,CAAA,CACmB,MAAA,CAAS,CAAA,CAE9B,KAAK,sBACH,OAAO,KAAA,CACT,KAAK,UAAA,CACL,KAAK,sBACL,KAAK,oBAAA,CACH,OAAO,CAAC,OAAA,CAAS,IAAI,EAAE,QAAA,CAAS4b,CAAAA,CAAW5b,EAAK,MAAM,CAAA,CAAE,MAAM,CAAA,CAEhE,KAAK,0BACH,IAAME,CAAAA,CAAQ0b,EAAW5b,CAAAA,CAAK,MAAM,EACpC,OAAO,CAAC,QAAS,IAAI,CAAA,CAAE,QAAA,CAASE,CAAAA,CAAM,MAAM,CAAA,CAE9C,KAAK,iBAAA,CACL,KAAK,mBACL,KAAK,yBAAA,CACL,KAAK,uBAAA,CACL,KAAK,2BAAA,CACL,KAAK,iBAAA,CACL,KAAK,6BACH,OAAO,KAAA,CACT,QACE,OAAO81C,CAAAA,EAAgBD,EAAuB,GAAA,CAAI/1C,CAAAA,CAAK,IAAI,CAC/D,CACF,CAAC,CACH,CACF,CAAA,CACF,CAAC,CACH,CC5EA,SAASi2C,EAAAA,CAAW1e,EAAoB,CACtC,IAAM2e,EAAOl6C,CAAAA,EAAcA,CAAAA,CAAE,UAAS,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAA,CACvD,OAAO,GAAGu7B,CAAAA,CAAK,WAAA,EAAa,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,EAAK,QAAA,EAAS,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,EAAK,OAAA,EAAS,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,EAAK,QAAA,EAAU,CAAC,CAAA,CAAA,EAAI2e,CAAAA,CAAI3e,CAAAA,CAAK,YAAY,CAAC,IAAI2e,CAAAA,CAAI3e,CAAAA,CAAK,YAAY,CAAC,EAC7J,CAEA,SAAS4e,GAAgB5e,CAAAA,CAAYpW,CAAAA,CAAuB,CAC1D,OAAO,IAAI,KAAKoW,CAAAA,CAAK,OAAA,EAAQ,CAAIpW,CAAAA,CAAU,GAAI,CACjD,CAEO,SAASi1B,EAAAA,CAA+Bl1B,EAAgB,KAAA,CAAQ,CACrE,OAAO0F,+BAAAA,CAAqB,CAC1B,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQ,UAAW1F,CAAa,CAAA,CACrD,QAAS,MAAO,CAAE,UAAW,CAACE,CAAAA,CAAWC,CAAO,CAAE,CAAA,GAAA,CACZ,MAAMrX,EAAQ,kCAAA,CAAoC,CAACkX,EAAe+0B,EAAAA,CAAW70B,CAAS,EAAG60B,EAAAA,CAAW50B,CAAO,CAAC,CAChJ,CAAA,EAEe,IAAI,CAAC,CAAE,KAAAg1B,CAAAA,CAAM,QAAA,CAAAC,EAAU,IAAA,CAAAC,CAAK,CAAA,IAAO,CAChD,KAAA,CAAOD,CAAAA,CAAS,MAAQD,CAAAA,CAAK,KAAA,CAC7B,KAAMC,CAAAA,CAAS,IAAA,CAAOD,EAAK,IAAA,CAC3B,GAAA,CAAKC,CAAAA,CAAS,GAAA,CAAMD,CAAAA,CAAK,GAAA,CACzB,KAAMC,CAAAA,CAAS,IAAA,CAAOD,EAAK,IAAA,CAC3B,MAAA,CAAQA,EAAK,MAAA,CACb,IAAA,CAAM,IAAI,IAAA,CAAKE,CAAI,CACrB,EAAE,CAAA,CAEJ,gBAAA,CAAkB,CAChBJ,EAAAA,CAAgB,IAAI,KAAQ,IAAA,CAAK,GAAA,CAAI,IAAMj1B,CAAAA,CAAe,KAAM,CAAC,CAAA,CACjE,IAAI,IACN,CAAA,CACA,gBAAA,CAAkB,CAACs1B,CAAAA,CAAGd,CAAAA,CAAI,CAACe,CAAa,CAAA,GAAM,CAC5CN,GAAgBM,CAAAA,CAAe,IAAA,CAAK,IAAI,GAAA,CAAMv1B,CAAAA,CAAe,KAAM,CAAC,CAAA,CACpEi1B,EAAAA,CAAgBM,CAAAA,CAAev1B,CAAa,CAC9C,CACF,CAAC,CACH,CClCO,SAASw1B,EAAAA,CACd3oC,CAAAA,CACA,CACA,OAAO0O,wBAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQ,oBAAqB1O,CAAQ,CAAA,CAC1D,QAAS,IACP/D,CAAAA,CAAQ,oCAAqC,CAC3C+D,CAAAA,CACA,UACF,CAAC,CAAA,CACH,QAAS,CAAC,CAACA,CACb,CAAC,CACH,CCZO,SAAS4oC,EAAAA,CACd5oC,EACA5S,CAAAA,CAAQ,EAAA,CACR,CACA,OAAOshB,uBAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,aAAc,WAAA,CAAa1O,CAAQ,EACxD,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,OAAA,CAAS,IACP/D,EAAQ,uCAAA,CAAyC,CAC/C+D,EACA,EAAA,CACA5S,CACF,CAAC,CACL,CAAC,CACH,CCbO,SAASy7C,EAAAA,CAAoC7oC,CAAAA,CAAkB,CACpE,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAc,aAAA,CAAe1O,CAAQ,EAC1D,OAAA,CAAS,SAAA,CASC,MARS,MAAM,KAAA,CACrBwK,CAAAA,CAAO,cAAA,CAAiB,CAAA,8BAAA,EAAiCxK,CAAQ,GACjE,CACE,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CACF,CACF,CAAA,EACuB,IAAA,EAAK,EAAG,IAAA,CAEjC,MAAA,CAAS5Q,GACPA,CAAAA,CAAK,IAAA,CACH,CAACuB,CAAAA,CAAGtF,CAAAA,GACFwiB,EAAWxiB,CAAAA,CAAE,cAAc,EAAE,MAAA,CAC7BwiB,CAAAA,CAAWld,EAAE,cAAc,CAAA,CAAE,MACjC,CACJ,CAAC,CACH,CCjBO,SAASm4C,GAAyB17C,CAAAA,CAAQ,GAAA,CAAK,CACpD,OAAOshB,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,YAAA,CAActhB,CAAK,CAAA,CACxC,QAAS,IACP6O,CAAAA,CAAQ,+BAAgC,CACtC7O,CACF,CAAC,CACL,CAAC,CACH,CCVO,SAAS27C,IAAkC,CAChD,OAAOr6B,wBAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,YAAY,EACjC,OAAA,CAAS,IACPzS,EAAQ,0BAAA,CAA4B,EAAE,CAC1C,CAAC,CACH,CCFO,SAAS+sC,GACd51B,CAAAA,CACAC,CAAAA,CACAC,EACA,CACA,IAAM40B,CAAAA,CAAc1e,CAAAA,EACXA,CAAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,WAAA,CAAa,EAAE,CAAA,CAGnD,OAAO9a,wBAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,SAAA,CAAW0E,CAAAA,CAASC,EAAU,OAAA,EAAQ,CAAGC,EAAQ,OAAA,EAAS,EAC/E,OAAA,CAAS,IACPrX,EAAQ,kCAAA,CAAoC,CAC1CmX,EACA80B,CAAAA,CAAW70B,CAAS,EACpB60B,CAAAA,CAAW50B,CAAO,CACpB,CAAC,CACL,CAAC,CACH,CCtBO,SAAS21B,EAAAA,EAA8B,CAC5C,OAAOv6B,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,gBAAgB,EACrC,OAAA,CAAS,SAAY,CAEnB,IAAMuG,CAAAA,CAAS,MAAMhZ,CAAAA,CAAQ,0BAAA,CAA4B,EAAE,CAAA,CAGrDjF,CAAAA,CAAM,IAAI,IAAA,CACVkyC,CAAAA,CAAY,IAAI,IAAA,CAAKlyC,CAAAA,CAAI,SAAQ,CAAI,KAAQ,EAE7CkxC,CAAAA,CAAc1e,CAAAA,EACXA,EAAK,WAAA,EAAY,CAAE,QAAQ,WAAA,CAAa,EAAE,EAG7C2f,CAAAA,CAAa,MAAMltC,CAAAA,CAAQ,kCAAA,CAAoC,CAAC,KAAA,CAAOisC,EAAWgB,CAAS,CAAA,CAAGhB,EAAWlxC,CAAG,CAAC,CACnH,CAAA,CAeA,OAZ6B,CAC3B,KAAA,CAAO,CAACie,CAAAA,CAAM,OACd,KAAA,CAAOk0B,CAAAA,CAAU,CAAC,CAAA,CAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAOA,CAAAA,CAAU,CAAC,CAAA,CAAE,KAAK,IAAA,CAAO,CAAA,CAC5E,KAAMA,CAAAA,CAAU,CAAC,EAAIA,CAAAA,CAAU,CAAC,EAAE,QAAA,CAAS,IAAA,CAAOA,EAAU,CAAC,CAAA,CAAE,KAAK,IAAA,CAAO,CAAA,CAC3E,IAAKA,CAAAA,CAAU,CAAC,CAAA,CAAIA,CAAAA,CAAU,CAAC,CAAA,CAAE,SAAS,GAAA,CAAMA,CAAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,IAAM,CAAA,CACxE,OAAA,CAASA,CAAAA,CAAU,CAAC,CAAA,CAChB,GAAA,CAAQA,EAAU,CAAC,CAAA,CAAE,SAAS,IAAA,CAAOA,CAAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,IAAA,CAAQ,GAAA,CAAO,CAACl0B,CAAAA,CAAM,OAC7E,CAAA,CACJ,cAAA,CAAgBA,EAAM,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAC9C,YAAA,CAAcA,CAAAA,CAAM,WAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAC7C,CAGF,CACF,CAAC,CACH,CC7BO,SAASm0B,GACd71B,CAAAA,CACAC,CAAAA,CACAC,EACAC,CAAAA,CACA,CACA,OAAOhF,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,MAAA,CAAQ6E,EAAMC,CAAAA,CAAYC,CAAAA,CAAQC,CAAI,CAAA,CAC3D,OAAA,CAAS,MAAO,CAAE,MAAA,CAAArZ,CAAO,IAAM,CAC7B,IAAM88B,EAAWlpB,CAAAA,EAAc,CACzBpU,EAAM,CAAA,uCAAA,EAA0C0Z,CAAI,mCAAmCC,CAAU,CAAA,MAAA,EAASC,CAAM,CAAA,IAAA,EAAOC,CAAI,GAE3HlW,CAAAA,CAAW,MAAM25B,EAASt9B,CAAAA,CAAK,CAAE,MAAA,CAAAQ,CAAO,CAAC,CAAA,CAE/C,GAAI,CAACmD,CAAAA,CAAS,GACZ,MAAM,IAAI,MAAM,CAAA,6BAAA,EAAgCA,CAAAA,CAAS,MAAM,CAAA,CAAE,CAAA,CAGnE,OAAOA,EAAS,IAAA,EAClB,CACF,CAAC,CACH,CC7BA,SAAS0qC,EAAAA,CAAW1e,EAAY,CAC9B,OAAOA,EAAK,WAAA,EAAY,CAAE,QAAQ,WAAA,CAAa,EAAE,CACnD,CAEO,SAAS6f,GACdj8C,CAAAA,CAAQ,GAAA,CACRimB,EACAC,CAAAA,CACA,CACA,IAAM5mB,CAAAA,CAAM4mB,CAAAA,EAAW,IAAI,IAAA,CACrB5lB,CAAAA,CACJ2lB,CAAAA,EAAa,IAAI,IAAA,CAAK3mB,CAAAA,CAAI,SAAQ,CAAI,GAAA,CAAU,GAAK,GAAI,CAAA,CAE3D,OAAOgiB,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,eAAA,CAAiBthB,EAAOM,CAAAA,CAAM,OAAA,GAAWhB,CAAAA,CAAI,OAAA,EAAS,CAAA,CAC3E,OAAA,CAAS,IACPuP,EAAQ,iCAAA,CAAmC,CACzCisC,GAAWx6C,CAAK,CAAA,CAChBw6C,GAAWx7C,CAAG,CAAA,CACdU,CACF,CAAC,CACL,CAAC,CACH,CCKO,SAASk8C,EAAAA,EAA6B,CAC3C,OAAO56B,uBAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,cAAc,CAAA,CACnC,OAAA,CAAS,SAAY,CACnB,GAAI,CAEF,OADoB,MAAMzS,CAAAA,CAAQ,iCAAkC,EAAE,CAExE,CAAA,MAAShJ,CAAAA,CAAO,CACd,MAAMA,CACR,CACF,CACF,CAAC,CACH,CC/BO,SAASs2C,IAA2C,CACzD,OAAO76B,wBAAa,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,QAAA,CAAU,oBAAoB,CAAA,CAC/B/I,CAAAA,CACCmJ,GAAY,CACXmiB,EAAAA,CACEtrB,EACAmJ,CAAAA,CAAQ,YAAA,CACRA,EAAQ,YAAA,CACRA,CAAAA,CAAQ,WACRA,CAAAA,CAAQ,UAAA,CACRA,EAAQ,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,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,CCpCO,SAAS4hC,EAAAA,CACdzpC,EACAyH,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,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,QAAQ,iBAAA,CAAkB,CACnCkH,EAAU,QAAA,CAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,MAAA,CAAO,UAAA,CAAW3O,CAAS,CAAA,CACrC,CAAC,gBAAA,CAAkB,YAAA,CAAcA,CAAQ,CAAA,CACzC,CAAC,SAAU,WAAA,CAAa,IAAA,CAAMA,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,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,OAAO7D,CACT,CAEA,eAAsBs6C,GACpBn2B,CAAAA,CACAC,CAAAA,CACAC,EACAC,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,OAAO,CAAA,CAGT,IAAMzS,CAAAA,CAAWlpB,CAAAA,GACXpU,CAAAA,CAAM,CAAA,4EAAA,EAA+E+vC,CAAG,CAAA,CAAA,CACxFpsC,CAAAA,CAAW,MAAM25B,CAAAA,CAASt9B,CAAG,EAEnC,OAAA,CADa,MAAMk8B,GAA2Dv4B,CAAQ,CAAA,EAC1E,YAAYosC,CAAG,CAC7B,CAEA,eAAsBC,EAAAA,CAAqB52B,CAAAA,CAAkBlL,CAAAA,CAAgC,CAE3F,IAAMvK,EAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CACL,4BAA4ByI,CAAAA,GAAa,KAAA,CAAQ,KAAA,CAAQA,CAAQ,CAAA,CAAA,EAAIlL,CAAK,EAC9E,CAAA,CAEA,OAAOguB,GAA0Bv4B,CAAQ,CAC3C,CAEA,eAAsBssC,EAAAA,EAA2C,CAE/D,IAAMtsC,CAAAA,CAAW,MADAyQ,GAAc,CACCzD,CAAAA,CAAO,eAAiB,iCAAiC,CAAA,CACzF,OAAOurB,EAAAA,CAAiCv4B,CAAQ,CAClD,CAEA,eAAsBusC,IAAmD,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,EAA8C,CACxE,IAAMguB,EAAWlpB,CAAAA,EAAc,CACzBhR,EAAUyN,qBAAAA,CAAc,mBAAA,EAAoB,CAC5ClN,CAAAA,CAAW,MAAM25B,CAAAA,CAAS,GAAGl6B,CAAO,CAAA,uBAAA,CAAA,CAA2B,CACnE,MAAA,CAAQ,MAAA,CACR,KAAM,IAAA,CAAK,SAAA,CAAUkM,CAAO,CAAA,CAC5B,OAAA,CAAS6gC,EACX,CAAC,CAAA,CAED,GAAI,CAACxsC,CAAAA,CAAS,GACZ,MAAM,IAAI,KAAA,CACR,CAAA,6CAAA,EAA2CA,CAAAA,CAAS,MAAM,EAC5D,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,EAAAA,CACpBp5C,EACA3D,CAAAA,CAAgB,EAAA,CACkB,CAClC,IAAMg9C,CAAAA,CAAa,CACjB,OAAA,CAAS,KAAA,CACT,OAAQ,MAAA,CACR,MAAA,CAAQ,CACN,QAAA,CAAU,QAAA,CACV,MAAO,CAAE,MAAA,CAAAr5C,CAAO,CAAA,CAChB,KAAA,CAAA3D,CAAAA,CACA,OAAQ,CACV,CAAA,CACA,GAAI,CACN,CAAA,CAEM,CAACi9C,CAAAA,CAAKC,CAAI,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CACpCJ,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,KAAA,CAAO,SAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,QAAS,UAAA,CAAY,IAAK,CAAC,CAChD,CACF,EACA,EACF,EACAF,EAAAA,CACE,CACE,GAAGE,CAAAA,CACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,KAAA,CAAO,UAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,QAAS,UAAA,CAAY,KAAM,CAAC,CACjD,CACF,CAAA,CACA,EACF,CACF,CAAC,CAAA,CAEKG,CAAAA,CAAmB/nB,GACvBA,CAAAA,CAAM,IAAA,CAAK,CAAC7xB,CAAAA,CAAGtF,CAAAA,GAAM,CACnB,IAAMm/C,CAAAA,CAAO,MAAA,CAAQ75C,EAA2B,KAAA,EAAS,CAAC,EAE1D,OADc,MAAA,CAAQtF,EAA2B,KAAA,EAAS,CAAC,EAC5Cm/C,CACjB,CAAC,EACGC,CAAAA,CAAkBjoB,CAAAA,EACtBA,EAAM,IAAA,CAAK,CAAC7xB,EAAGtF,CAAAA,GAAM,CACnB,IAAMm/C,CAAAA,CAAO,MAAA,CAAQ75C,CAAAA,CAA2B,OAAS,CAAC,CAAA,CACpD+5C,EAAQ,MAAA,CAAQr/C,CAAAA,CAA2B,OAAS,CAAC,CAAA,CAC3D,OAAOm/C,CAAAA,CAAOE,CAChB,CAAC,EAEH,OAAO,CACL,IAAKH,CAAAA,CAAgBF,CAAG,EACxB,IAAA,CAAMI,CAAAA,CAAeH,CAAI,CAC3B,CACF,CAEA,eAAsBK,EAAAA,CACpB55C,CAAAA,CACA3D,EAAgB,EAAA,CACF,CACd,OAAO88C,EAAAA,CACL,CACE,QAAS,KAAA,CACT,MAAA,CAAQ,OACR,MAAA,CAAQ,CACN,SAAU,QAAA,CACV,KAAA,CAAO,gBACP,KAAA,CAAO,CAAE,MAAA,CAAAn5C,CAAO,CAAA,CAChB,KAAA,CAAA3D,EACA,MAAA,CAAQ,CAAA,CACR,QAAS,CAAC,CAAE,MAAO,WAAA,CAAa,UAAA,CAAY,IAAK,CAAC,CACpD,CAAA,CACA,GAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBw9C,EAAAA,CACpB5kC,CAAAA,CACAjV,CAAAA,CACA3D,CAAAA,CAAgB,GAAA,CACF,CACd,IAAMg9C,CAAAA,CAAa,CACjB,OAAA,CAAS,KAAA,CACT,OAAQ,MAAA,CACR,MAAA,CAAQ,CACN,QAAA,CAAU,QAAA,CACV,MAAO,CAAE,MAAA,CAAAr5C,EAAQ,OAAA,CAAAiV,CAAQ,EACzB,KAAA,CAAA5Y,CAAAA,CACA,MAAA,CAAQ,CACV,CAAA,CACA,EAAA,CAAI,CACN,CAAA,CAEM,CAACy9C,EAAQC,CAAO,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAC1CZ,EAAAA,CACE,CACE,GAAGE,EACH,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAW,MAAA,CACd,MAAO,SAAA,CACP,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,WAAA,CAAa,WAAY,IAAK,CAAC,CACpD,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,WAAA,CAAa,WAAY,IAAK,CAAC,CACpD,CACF,CAAA,CACA,EACF,CACF,CAAC,CAAA,CAEKW,CAAAA,CAAc,CAACC,EAAkBnF,CAAAA,GAAAA,CACpC,MAAA,CAAOmF,GAAY,CAAC,CAAA,CAAI,OAAOnF,CAAAA,EAAS,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAElDwE,EAA6BQ,CAAAA,CAAO,GAAA,CAAK/5B,IAAW,CACxD,EAAA,CAAIA,EAAM,IAAA,CACV,IAAA,CAAM,MACN,OAAA,CAASA,CAAAA,CAAM,QACf,MAAA,CAAQA,CAAAA,CAAM,OACd,QAAA,CAAUA,CAAAA,CAAM,SAChB,KAAA,CAAOA,CAAAA,CAAM,KAAA,CACb,KAAA,CAAOA,CAAAA,CAAM,YAAA,EAAgBi6B,EAAYj6B,CAAAA,CAAM,QAAA,CAAUA,EAAM,KAAK,CAAA,CACpE,UAAW,MAAA,CAAOA,CAAAA,CAAM,SAAA,EAAa,CAAC,CACxC,CAAA,CAAE,EAEIw5B,CAAAA,CAA8BQ,CAAAA,CAAQ,IAAKh6B,CAAAA,GAAW,CAC1D,GAAIA,CAAAA,CAAM,IAAA,CACV,IAAA,CAAM,MAAA,CACN,OAAA,CAASA,CAAAA,CAAM,QACf,MAAA,CAAQA,CAAAA,CAAM,OACd,QAAA,CAAUA,CAAAA,CAAM,SAChB,KAAA,CAAOA,CAAAA,CAAM,MACb,KAAA,CAAOi6B,CAAAA,CAAYj6B,EAAM,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,CAAAA,CAAGtF,CAAAA,GAAMA,CAAAA,CAAE,SAAA,CAAYsF,EAAE,SAAS,CACnE,CAUA,eAAsBs6C,EAAAA,CACpBl6C,EACAiV,CAAAA,CACc,CACd,GAAI,KAAA,CAAM,OAAA,CAAQjV,CAAM,GAAKA,CAAAA,CAAO,MAAA,GAAW,EAC7C,OAAO,GAGT,IAAMm6C,CAAAA,CAAc,MAAM,OAAA,CAAQn6C,CAAM,EACpC,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,MAAA,CAAQ,CACN,QAAA,CAAU,QAAA,CACV,MAAO,SAAA,CACP,KAAA,CAAO,CACL,GAAGgB,CAAAA,CACH,GAAIllC,CAAAA,CAAU,CAAE,OAAA,CAAAA,CAAQ,CAAA,CAAI,EAC9B,CACF,CAAA,CACA,GAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBmlC,EAAAA,CACpBnlC,EACAjV,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,QAAA,CAAU,QAAA,CACV,KAAA,CAAO,UAAA,CACP,MAAO,CACL,OAAA,CAASlqC,CACX,CACF,CAAA,CACA,GAAI,CACN,CAAA,CACA,EACF,CACF,CAEA,eAAsBqrC,EAAAA,CACpB/yC,CAAAA,CACc,CACd,OAAO4xC,EAAAA,CACL,CACE,OAAA,CAAS,KAAA,CACT,OAAQ,MAAA,CACR,MAAA,CAAQ,CACN,QAAA,CAAU,QAAA,CACV,MAAO,QAAA,CACP,KAAA,CAAO,CACL,MAAA,CAAQ,CAAE,GAAA,CAAK5xC,CAAO,CACxB,CACF,EACA,EAAA,CAAI,CACN,EACA,EACF,CACF,CAEA,eAAsBgzC,EAAAA,CACpBtrC,CAAAA,CACAjP,CAAAA,CACA3D,CAAAA,CACAlB,EACc,CACd,IAAMirC,EAAWlpB,CAAAA,EAAc,CACzBhR,EAAUyN,qBAAAA,CAAc,mBAAA,EAAoB,CAC5C7Q,CAAAA,CAAM,IAAI,GAAA,CAAI,sCAAuCoD,CAAO,CAAA,CAClEpD,EAAI,YAAA,CAAa,GAAA,CAAI,UAAWmG,CAAQ,CAAA,CACxCnG,EAAI,YAAA,CAAa,GAAA,CAAI,SAAU9I,CAAM,CAAA,CACrC8I,EAAI,YAAA,CAAa,GAAA,CAAI,QAASzM,CAAAA,CAAM,QAAA,EAAU,CAAA,CAC9CyM,CAAAA,CAAI,YAAA,CAAa,IAAI,QAAA,CAAU3N,CAAAA,CAAO,UAAU,CAAA,CAEhD,IAAMsR,CAAAA,CAAW,MAAM25B,CAAAA,CAASt9B,CAAAA,CAAI,QAAA,EAAS,CAAG,CAC9C,MAAA,CAAQ,KAAA,CACR,QAAS,CAAE,cAAA,CAAgB,kBAAmB,CAChD,CAAC,CAAA,CAED,GAAI,CAAC2D,CAAAA,CAAS,GACZ,MAAM,IAAI,MACR,CAAA,qDAAA,EAAmDA,CAAAA,CAAS,MAAM,CAAA,CACpE,CAAA,CAGF,OAAQ,MAAMA,CAAAA,CAAS,MACzB,CAEA,eAAsB+tC,EAAAA,CACpBx6C,CAAAA,CACAy6C,EAAW,OAAA,CACG,CACd,IAAMrU,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBhR,EAAUyN,qBAAAA,CAAc,mBAAA,GACxB7Q,CAAAA,CAAM,IAAI,IAAI,+BAAA,CAAiCoD,CAAO,CAAA,CAC5DpD,CAAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAU9I,CAAM,CAAA,CACrC8I,EAAI,YAAA,CAAa,GAAA,CAAI,WAAY2xC,CAAQ,CAAA,CAEzC,IAAMhuC,CAAAA,CAAW,MAAM25B,CAAAA,CAASt9B,EAAI,QAAA,EAAS,CAAG,CAC9C,OAAA,CAAS,CAAE,eAAgB,kBAAmB,CAChD,CAAC,CAAA,CAED,GAAI,CAAC2D,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,8CAAyCA,CAAAA,CAAS,MAAM,CAAA,CAC1D,CAAA,CAGF,OAAQ,MAAMA,EAAS,IAAA,EACzB,CAEA,eAAsBiuC,EAAAA,CACpBzrC,EAC4B,CAC5B,IAAMm3B,CAAAA,CAAWlpB,CAAAA,EAAc,CACzBhR,CAAAA,CAAUyN,sBAAc,mBAAA,EAAoB,CAC5ClN,EAAW,MAAM25B,CAAAA,CACrB,GAAGl6B,CAAO,CAAA,+BAAA,EAAkC+C,CAAQ,CAAA,OAAA,CACtD,CAAA,CAEA,GAAI,CAACxC,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CACR,gDAA2CA,CAAAA,CAAS,MAAM,EAC5D,CAAA,CAGF,OAAQ,MAAMA,CAAAA,CAAS,IAAA,EACzB,CC3VO,SAASkuC,EAAAA,CAAwC1rC,CAAAA,CAAkB,CACxE,OAAO0O,uBAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,cAAe,UAAA,CAAY1O,CAAQ,CAAA,CACxD,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SACAorC,GAAoDprC,CAAQ,CAEvE,CAAC,CACH,CCTO,SAAS2rC,EAAAA,EAAwC,CACtD,OAAOj9B,uBAAAA,CAAa,CAClB,SAAU,CAAC,QAAA,CAAU,cAAe,SAAS,CAAA,CAC7C,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SACAy8B,IAEX,CAAC,CACH,CCTO,SAASS,GAAwCtzC,CAAAA,CAAkB,CACxE,OAAOoW,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,gBAAiBpW,CAAM,CAAA,CAC3D,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SACA+yC,EAAAA,CAA6D/yC,CAAM,CAE9E,CAAC,CACH,CCTO,SAASuzC,EAAAA,CACd7rC,CAAAA,CACAjP,EACA3D,CAAAA,CAAQ,EAAA,CACR,CACA,OAAOyrB,+BAAAA,CAA8C,CACnD,QAAA,CAAU,CAAC,SAAU,aAAA,CAAe9nB,CAAAA,CAAQ,cAAA,CAAgBiP,CAAQ,CAAA,CACpE,OAAA,CAAS,CAAC,CAACjP,CAAAA,EAAU,CAAC,CAACiP,CAAAA,CACvB,iBAAkB,CAAA,CAClB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA8Y,CAAU,IAAM,CAChC,GAAI,CAAC/nB,CAAAA,EAAU,CAACiP,EACd,MAAM,IAAI,KAAA,CACR,mDACF,CAAA,CAEF,OAAOsrC,GACLtrC,CAAAA,CACAjP,CAAAA,CACA3D,EACA0rB,CACF,CACF,EACA,gBAAA,CAAkB,CAACE,EAAU8yB,CAAAA,CAAWC,CAAAA,GAAAA,CACrC/yB,GAAU,MAAA,EAAU,CAAA,IAAO5rB,EAAS2+C,CAAAA,CAA2B3+C,CAAAA,CAAQ,OAC1E,oBAAA,CAAsB,CAAC4+C,CAAAA,CAAYF,CAAAA,CAAWG,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,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe3d,CAAM,CAAA,CAC1C,UAAW,GAAA,CACX,eAAA,CAAiB,IACjB,OAAA,CAAS,SACAw6C,GAA4Cx6C,CAAAA,CAAQy6C,CAAQ,CAEvE,CAAC,CACH,CCZO,SAASW,GACdnsC,CAAAA,CACA,CACA,OAAO0O,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe,YAAa1O,CAAQ,CAAA,CACzD,UAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,OAAA,CAAS,CAAC,CAACA,EACX,OAAA,CAAS,SAAY,CACnB,GAAI,CACF,IAAM5Q,CAAAA,CAAO,MAAMq8C,EAAAA,CACjBzrC,CACF,CAAA,CACA,OAAO,OAAO,MAAA,CAAO5Q,CAAI,EAAE,MAAA,CACzB,CAAC,CAAE,aAAA,CAAAg9C,CAAc,IAAMA,CAAAA,CAAgB,CACzC,CACF,CAAA,KAAY,CACV,OAAO,EACT,CACF,CACF,CAAC,CACH,CCrBO,SAASC,GACdrmC,CAAAA,CACAjV,CAAAA,CACA,CACA,OAAO2d,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,cAAe,YAAA,CAAc1I,CAAAA,CAASjV,CAAM,CAAA,CACjE,OAAA,CAAS,SACAo6C,EAAAA,CAA+CnlC,CAAAA,CAASjV,CAAM,CAEzE,CAAC,CACH,CCRO,SAASu7C,GACdjgD,CAAAA,CACAuS,CAAAA,CAA+B,OAC/B,CACA,IAAI/P,EAAgB,CAClB,cAAA,CAAgB,EAChB,MAAA,CAAQ,EAAA,CACR,OAAQ,EACV,CAAA,CAEI+P,CAAAA,GACF/P,CAAAA,CAAO,CAAE,GAAGA,EAAM,GAAG+P,CAAQ,GAG/B,GAAM,CAAE,eAAA2tC,CAAAA,CAAgB,MAAA,CAAAt8C,CAAAA,CAAQ,MAAA,CAAAsU,CAAO,CAAA,CAAI1V,EAEvC29C,CAAAA,CAAM,EAAA,CAENv8C,IAAQu8C,CAAAA,EAAOv8C,CAAAA,CAAS,KAE5B,IAAMw8C,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAA,CAAWpgD,CAAAA,CAAM,UAAU,CAAC,EAAI,IAAA,CAAS,CAAA,CAAIA,EAC3D4vB,CAAAA,CAAM,OAAOwwB,GAAO,QAAA,CAAW,UAAA,CAAWA,CAAE,CAAA,CAAIA,CAAAA,CACtD,OAAAD,CAAAA,EAAOvwB,CAAAA,CAAI,eAAe,OAAA,CAAS,CACjC,qBAAA,CAAuBswB,CAAAA,CACvB,qBAAA,CAAuBA,CAAAA,CACvB,YAAa,IACf,CAAC,EACGhoC,CAAAA,GAAQioC,CAAAA,EAAO,IAAMjoC,CAAAA,CAAAA,CAElBioC,CACT,CCpBO,IAAME,EAAAA,CAAN,KAAsB,CAC3B,MAAA,CACA,IAAA,CACA,KAEA,SAAA,CACA,cAAA,CACA,kBACA,OAAA,CACA,KAAA,CACA,aAAA,CACA,aAAA,CACA,cAAA,CACA,QAAA,CAEA,YAAYltC,CAAAA,CAA6B,CACvC,KAAK,MAAA,CAASA,CAAAA,CAAM,OACpB,IAAA,CAAK,IAAA,CAAOA,EAAM,IAAA,EAAQ,EAAA,CAC1B,KAAK,IAAA,CAAOA,CAAAA,CAAM,MAAQ,EAAA,CAE1B,IAAA,CAAK,UAAYA,CAAAA,CAAM,SAAA,EAAa,CAAA,CACpC,IAAA,CAAK,cAAA,CAAiBA,CAAAA,CAAM,gBAAkB,KAAA,CAC9C,IAAA,CAAK,kBAAoBA,CAAAA,CAAM,iBAAA,EAAqB,MACpD,IAAA,CAAK,OAAA,CAAU,UAAA,CAAWA,CAAAA,CAAM,OAAO,CAAA,EAAK,EAC5C,IAAA,CAAK,KAAA,CAAQ,WAAWA,CAAAA,CAAM,KAAK,GAAK,CAAA,CACxC,IAAA,CAAK,aAAA,CAAgB,UAAA,CAAWA,CAAAA,CAAM,aAAa,GAAK,CAAA,CACxD,IAAA,CAAK,eAAiB,UAAA,CAAWA,CAAAA,CAAM,cAAc,CAAA,EAAK,CAAA,CAC1D,IAAA,CAAK,aAAA,CACH,IAAA,CAAK,KAAA,CAAQ,KAAK,aAAA,CAAgB,IAAA,CAAK,eACzC,IAAA,CAAK,QAAA,CAAWA,EAAM,SACxB,CAEA,cAAA,CAAiB,IACV,IAAA,CAAK,iBAAA,CAIH,KAAK,aAAA,CAAgB,CAAA,EAAK,KAAK,cAAA,CAAiB,CAAA,CAH9C,MAMX,WAAA,CAAc,IACP,IAAA,CAAK,cAAA,EAAe,CAIlB,CAAA,CAAA,EAAI8sC,GAAgB,IAAA,CAAK,KAAA,CAAO,CACrC,cAAA,CAAgB,IAAA,CAAK,SACvB,CAAC,CAAC,CAAA,GAAA,EAAMA,EAAAA,CAAgB,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,CAYX,OAAS,IACF,IAAA,CAAK,cAAA,CAIN,IAAA,CAAK,aAAA,CAAgB,IAAA,CAChB,KAAK,aAAA,CAAc,QAAA,GAGrBA,EAAAA,CAAgB,IAAA,CAAK,cAAe,CACzC,cAAA,CAAgB,IAAA,CAAK,SACvB,CAAC,CAAA,CATQ,IAYX,QAAA,CAAW,IACL,KAAK,OAAA,CAAU,IAAA,CACV,KAAK,OAAA,CAAQ,QAAA,EAAS,CAGxBA,EAAAA,CAAgB,IAAA,CAAK,OAAA,CAAS,CAAE,cAAA,CAAgB,IAAA,CAAK,SAAU,CAAC,CAE3E,ECxEO,SAASK,EAAAA,CACd3mC,EACA+sB,CAAAA,CACA6Z,CAAAA,CACA,CACA,OAAOl+B,uBAAAA,CAAa,CAClB,QAAA,CAAU,CACR,SACA,aAAA,CACA,mBAAA,CACA1I,CAAAA,CACA+sB,CAAAA,CACA6Z,CACF,CAAA,CACA,QAAS,SAAY,CACnB,GAAI,CAAC5mC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA,CAG/D,IAAM6mC,CAAAA,CAAW,MAAMzB,EAAAA,CAAoDplC,CAAO,EAE5E1N,CAAAA,CAAS,MAAM+yC,GACnBwB,CAAAA,CAAS,GAAA,CAAKC,CAAAA,EAAMA,CAAAA,CAAE,MAAM,CAC9B,EAEMC,CAAAA,CAAeha,CAAAA,CACjBA,EAAa,IAAA,CAAOA,CAAAA,CAAa,MACjC,CAAA,CACEia,CAAAA,CAAsD,MAAM,OAAA,CAChEJ,CACF,EACIA,CAAAA,CACA,GAKEK,CAAAA,CAAkBJ,CAAAA,CACrB,IAAKK,CAAAA,EAAYA,CAAAA,CAAQ,MAAM,CAAA,CAC/B,MAAA,CACEn8C,CAAAA,EACCA,IAAW,WAAA,EACX,CAACi8C,EAAgB,IAAA,CAAMG,CAAAA,EAAWA,EAAO,MAAA,GAAWp8C,CAAM,CAC9D,CAAA,CAEI6iB,CAAAA,CAA8C,CAClD,GAAGo5B,CAAAA,CACH,GAAIC,EAAgB,MAAA,CAChB,MAAM9B,GACJ,MAAA,CACA8B,CACF,CAAA,CACA,EACN,CAAA,CAEA,OAAOJ,CAAAA,CAAS,GAAA,CAAKK,GAAY,CAC/B,IAAMnlC,EAAQzP,CAAAA,CAAO,IAAA,CAAMw0C,GAAMA,CAAAA,CAAE,MAAA,GAAWI,EAAQ,MAAM,CAAA,CACxDE,EAEJ,GAAIrlC,CAAAA,EAAO,SACT,GAAI,CACFqlC,CAAAA,CAAgB,IAAA,CAAK,KAAA,CAAMrlC,CAAAA,CAAM,QAAQ,EAC3C,CAAA,KAAQ,CACNqlC,CAAAA,CAAgB,OAClB,CAGF,IAAMD,CAAAA,CAASv5B,CAAAA,CAAQ,IAAA,CAAM4R,CAAAA,EAAMA,CAAAA,CAAE,SAAW0nB,CAAAA,CAAQ,MAAM,EACxDG,CAAAA,CAAY,MAAA,CAAOF,GAAQ,SAAA,EAAa,GAAG,CAAA,CAC3CG,CAAAA,CAAgB,MAAA,CAAOJ,CAAAA,CAAQ,OAAO,CAAA,CAEtCK,CAAAA,CACJL,EAAQ,MAAA,GAAW,WAAA,CACfH,EAAeO,CAAAA,CACfD,CAAAA,GAAc,EACZ,CAAA,CACA,MAAA,CAAA,CACGA,EAAYN,CAAAA,CAAeO,CAAAA,EAAe,QAAQ,EAAE,CACvD,EAER,OAAO,IAAIZ,EAAAA,CAAgB,CACzB,MAAA,CAAQQ,CAAAA,CAAQ,OAChB,IAAA,CAAMnlC,CAAAA,EAAO,MAAQmlC,CAAAA,CAAQ,MAAA,CAC7B,KAAME,CAAAA,EAAe,IAAA,EAAQ,EAAA,CAC7B,SAAA,CAAWrlC,CAAAA,EAAO,SAAA,EAAa,EAC/B,cAAA,CAAgBA,CAAAA,EAAO,gBAAkB,KAAA,CACzC,iBAAA,CAAmBA,GAAO,iBAAA,EAAqB,KAAA,CAC/C,OAAA,CAASmlC,CAAAA,CAAQ,OAAA,CACjB,KAAA,CAAOA,EAAQ,KAAA,CACf,aAAA,CAAeA,EAAQ,aAAA,CACvB,cAAA,CAAgBA,EAAQ,cAAA,CACxB,QAAA,CAAAK,CACF,CAAC,CACH,CAAC,CACH,CAAA,CACA,QAAS,CAAC,CAACvnC,CACb,CAAC,CACH,CC5GO,SAASwnC,EAAAA,CACdxtC,EACAjP,CAAAA,CACA,CACA,OAAO2d,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,aAAA,CAAe3d,EAAQ,cAAA,CAAgBiP,CAAQ,EACpE,OAAA,CAAS,CAAC,CAACjP,CAAAA,EAAU,CAAC,CAACiP,CAAAA,CACvB,SAAA,CAAW,GAAA,CACX,gBAAiB,GAAA,CACjB,OAAA,CAAS,SAAY,CACnB,GAAI,CAACjP,CAAAA,EAAU,CAACiP,EACd,MAAM,IAAI,MACR,mDACF,CAAA,CAEF,IAAM0lB,CAAAA,CAAc7Y,CAAAA,GACd4gC,CAAAA,CAAYlI,EAAAA,CAAoCvlC,CAAQ,CAAA,CAC9D,MAAM0lB,CAAAA,CAAY,cAAc+nB,CAAS,CAAA,CACzC,IAAMC,CAAAA,CAAWhoB,CAAAA,CAAY,aAC3B+nB,CAAAA,CAAU,QACZ,CAAA,CAEME,CAAAA,CAAe,MAAMjoB,CAAAA,CAAY,gBACrCkmB,EAAAA,CAAwC,CAAC76C,CAAM,CAAC,CAClD,EAEM68C,CAAAA,CAAc,MAAMloB,CAAAA,CAAY,eAAA,CACpCgmB,EAAAA,CAAwC1rC,CAAQ,CAClD,CAAA,CAIM6tC,CAAAA,CAAa,MAAMnoB,CAAAA,CAAY,eAAA,CACnC2mB,GAAmC,MAAA,CAAWt7C,CAAM,CACtD,CAAA,CAEM+lB,CAAAA,CAAW62B,GAAc,IAAA,CAAM1iD,CAAAA,EAAMA,EAAE,MAAA,GAAW8F,CAAM,EACxDm8C,CAAAA,CAAUU,CAAAA,EAAa,IAAA,CAAM3iD,CAAAA,EAAMA,CAAAA,CAAE,MAAA,GAAW8F,CAAM,CAAA,CAGtDs8C,CAAAA,CAAY,EAFHQ,CAAAA,EAAY,IAAA,CAAM5iD,GAAMA,CAAAA,CAAE,MAAA,GAAW8F,CAAM,CAAA,EAE9B,SAAA,EAAa,GAAA,CAAA,CAEnC20C,EAAgB,UAAA,CAAWwH,CAAAA,EAAS,SAAW,GAAG,CAAA,CAClDY,EAAgB,UAAA,CAAWZ,CAAAA,EAAS,KAAA,EAAS,GAAG,CAAA,CAChDa,CAAAA,CAAmB,WAAWb,CAAAA,EAAS,cAAA,EAAkB,GAAG,CAAA,CAE5D/3C,CAAAA,CAAmC,CACvC,CAAE,IAAA,CAAM,SAAU,OAAA,CAASuwC,CAAc,EACzC,CAAE,IAAA,CAAM,SAAU,OAAA,CAASoI,CAAc,CAC3C,CAAA,CAEA,OAAIC,CAAAA,CAAmB,CAAA,EACrB54C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,WAAA,CAAa,QAAS44C,CAAiB,CAAC,EAGtD,CACL,IAAA,CAAMh9C,CAAAA,CACN,KAAA,CAAO+lB,CAAAA,EAAU,IAAA,EAAQ,GACzB,KAAA,CAAOu2B,CAAAA,GAAc,EAAI,CAAA,CAAI,MAAA,CAAOA,GAAaK,CAAAA,EAAU,KAAA,EAAS,CAAA,CAAE,CAAA,CACtE,cAAA,CAAgBhI,CAAAA,CAAgBoI,EAChC,KAAA,CAAO,QAAA,CACP,MAAA34C,CACF,CACF,CACF,CAAC,CACH,CChEO,SAAS64C,GAAsBhuC,CAAAA,CAAmByQ,CAAAA,CAAS,EAAG,CACnE,OAAO/B,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,SAAU1O,CAAAA,CAAUyQ,CAAM,EACrC,OAAA,CAAS,SAAY,CACnB,GAAI,CAACzQ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,kDAA6C,CAAA,CAG/D,IAAM6R,EAAO7R,CAAAA,CAAS,OAAA,CAAQ,IAAK,EAAE,CAAA,CAG/BiuC,CAAAA,CAAiB,MAAM,KAAA,CAAMzjC,CAAAA,CAAO,eAAiB,qBAAA,CAAuB,CAChF,OAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,QAAA,CAAUqH,CAAK,CAAC,CACzC,CAAC,CAAA,CAED,GAAI,CAACo8B,CAAAA,CAAe,EAAA,CAClB,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BA,EAAe,MAAM,CAAA,CAAE,EAGpE,IAAMC,CAAAA,CAAU,MAAMD,CAAAA,CAAe,IAAA,EAAK,CAGpCE,EAAuB,MAAM,KAAA,CACjC3jC,EAAO,cAAA,CAAiB,yBAAA,CACxB,CACE,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,EACA,IAAA,CAAM,IAAA,CAAK,UAAU,CAAE,QAAA,CAAUqH,EAAM,IAAA,CAAMpB,CAAO,CAAC,CACvD,CACF,EAEA,GAAI,CAAC09B,EAAqB,EAAA,CACxB,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuCA,CAAAA,CAAqB,MAAM,CAAA,CAAE,CAAA,CAGtF,IAAMC,CAAAA,CAAgB,MAAMD,EAAqB,IAAA,EAAK,CAEtD,OAAO,CACL,MAAA,CAAQD,CAAAA,CAAO,MAAA,CACf,OAAA,CAASA,CAAAA,CAAO,iBAChB,YAAA,CAAAE,CACF,CACF,CAAA,CACA,SAAA,CAAW,IACX,cAAA,CAAgB,IAAA,CAChB,OAAA,CAAS,CAAC,CAACpuC,CACb,CAAC,CACH,CCzDO,SAASquC,EAAAA,CAAsCruC,EAAkB,CACtE,OAAO0O,wBAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,QAAA,CAAU,eAAgB1O,CAAQ,CAAA,CACvD,SAAA,CAAW,GAAA,CACX,eAAA,CAAiB,GAAA,CACjB,QAAS,UACP,MAAM6M,GAAe,CAAE,aAAA,CAAcmhC,GAAsBhuC,CAAQ,CAAC,CAAA,CAI7D,CACL,IAAA,CAAM,QAAA,CACN,MAAO,eAAA,CACP,KAAA,CAAO,KACP,cAAA,CAAgB,EAPL6M,GAAe,CAAE,YAAA,CAC5BmhC,EAAAA,CAAsBhuC,CAAQ,CAAA,CAAE,QAClC,GAK0B,MAAA,EAAU,CAAA,CACpC,EAEJ,CAAC,CACH,CCjBO,SAASsuC,GACdtuC,CAAAA,CACAgF,CAAAA,CACA,CACA,OAAO0J,uBAAAA,CAAa,CAClB,QAAA,CAAU,CAAC,QAAA,CAAU,QAAA,CAAU,cAAA,CAAgB1O,CAAAA,CAAUgF,CAAI,CAAA,CAC7D,OAAA,CAAS,UAcO,KAAA,CAbG,MAAM,MACrB,CAAA,EAAGwF,CAAAA,CAAO,cAAc,CAAA,uBAAA,CAAA,CACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAU,CACnB,QAAA,CAAAxK,CAAAA,CACA,IAAA,CAAMgF,GAAQ,CAChB,CAAC,CACH,CACF,CAAA,EAC6B,MAAK,EACtB,GAAA,CAAI,CAAC,CAAE,OAAA,CAAAupC,EAAS,IAAA,CAAAvpC,CAAAA,CAAM,OAAAlU,CAAAA,CAAQ,EAAA,CAAAkB,EAAI,MAAA,CAAAu8B,CAAAA,CAAQ,QAAA,CAAAC,CAAAA,CAAU,IAAA,CAAAzrB,CAAK,KAAO,CAC1E,OAAA,CAAS,IAAI,IAAA,CAAKwrC,CAAO,EACzB,IAAA,CAAAvpC,CAAAA,CACA,OAAA,CAAS,CACP,CACE,MAAA,CAAQ,WAAWlU,CAAM,CAAA,CACzB,MAAO,QACT,CACF,EACA,EAAA,CAAAkB,CAAAA,CACA,IAAA,CAAMu8B,CAAAA,EAAU,MAAA,CAChB,EAAA,CAAIC,GAAY,MAAA,CAChB,IAAA,CAAMzrB,GAAQ,MAChB,CAAA,CAAE,CAEN,CAAC,CACH,CCtBO,SAASyrC,EAAAA,CACdxuC,EACA7N,CAAAA,CACAyM,CAAAA,CAAmB,CAAE,OAAA,CAAS,KAAM,EACpC,CACA,IAAM8mB,CAAAA,CAAc7Y,CAAAA,EAAe,CAC7BoG,CAAAA,CAAWrU,EAAQ,QAAA,EAAY,KAAA,CAE/B6vC,EAAa,MAAOC,CAAAA,GACpB9vC,EAAQ,OAAA,CACV,MAAM8mB,CAAAA,CAAY,UAAA,CAAWgpB,CAAE,CAAA,CAE/B,MAAMhpB,CAAAA,CAAY,aAAA,CAAcgpB,CAAE,CAAA,CAE7BhpB,CAAAA,CAAY,aAA+BgpB,CAAAA,CAAG,QAAQ,CAAA,CAAA,CAGzDC,CAAAA,CAA6B,MACjCC,CAAAA,EAC0C,CAC1C,GAAI,CAACA,GAAa37B,CAAAA,GAAa,KAAA,CAC7B,OAAO27B,CAAAA,CAGT,GAAI,CACF,IAAMC,CAAAA,CAAiB,MAAMlF,EAAAA,CAAgB12B,CAAQ,EACrD,OAAO,CACL,GAAG27B,CAAAA,CACH,KAAA,CAAOA,CAAAA,CAAU,KAAA,CAAQC,CAC3B,CACF,OAAS57C,CAAAA,CAAO,CACd,eAAQ,IAAA,CAAK,CAAA,oCAAA,EAAuCggB,CAAQ,CAAA,CAAA,CAAA,CAAKhgB,CAAK,CAAA,CAC/D27C,CACT,CACF,CAAA,CAEME,EAAiBxJ,EAAAA,CAAyBtlC,CAAAA,CAAUiT,EAAU,IAAI,CAAA,CAElE87B,EAAwB,SAAY,CACxC,GAAI,CAEF,IAAMC,CAAAA,CAAAA,CAD+B,MAAMtpB,CAAAA,CAAY,UAAA,CAAWopB,CAAc,CAAA,EACpD,OAAA,CAAQ,KACjC78C,CAAAA,EACCA,CAAAA,CAAK,OAAO,WAAA,EAAY,GAAME,EAAM,WAAA,EACxC,EAEA,GAAI,CAAC68C,EAAW,OAEhB,IAAM75C,CAAAA,CAAkD,EAAC,CAczD,GAZI65C,EAAU,MAAA,GAAW,KAAA,CAAA,EAAaA,EAAU,MAAA,GAAW,IAAA,EACzD75C,EAAM,IAAA,CAAK,CAAE,IAAA,CAAM,QAAA,CAAU,OAAA,CAAS65C,CAAAA,CAAU,MAAO,CAAC,CAAA,CAGtDA,EAAU,MAAA,GAAW,KAAA,CAAA,EAAaA,EAAU,MAAA,GAAW,IAAA,EAAQA,CAAAA,CAAU,MAAA,CAAS,CAAA,EACpF75C,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAM,SAAU,OAAA,CAAS65C,CAAAA,CAAU,MAAO,CAAC,CAAA,CAGtDA,EAAU,OAAA,GAAY,KAAA,CAAA,EAAaA,EAAU,OAAA,GAAY,IAAA,EAAQA,EAAU,OAAA,CAAU,CAAA,EACvF75C,EAAM,IAAA,CAAK,CAAE,IAAA,CAAM,SAAA,CAAW,OAAA,CAAS65C,CAAAA,CAAU,OAAQ,CAAC,CAAA,CAGxDA,EAAU,SAAA,EAAa,KAAA,CAAM,QAAQA,CAAAA,CAAU,SAAS,CAAA,CAC1D,IAAA,IAAWC,CAAAA,IAAaD,CAAAA,CAAU,UAAW,CAC3C,GAAI,CAACC,CAAAA,EAAa,OAAOA,GAAc,QAAA,CAAU,SAEjD,IAAMC,CAAAA,CAAUD,CAAAA,CAAU,OAAA,CACpB5iD,EAAQ4iD,CAAAA,CAAU,KAAA,CAExB,GAAI,OAAO5iD,CAAAA,EAAU,SAAU,CAE7B,IAAMqf,EADarf,CAAAA,CAAM,OAAA,CAAQ,KAAM,EAAE,CAAA,CAChB,MAAM,yBAAyB,CAAA,CACxD,GAAIqf,CAAAA,CAAO,CACT,IAAMyjC,CAAAA,CAAW,IAAA,CAAK,GAAA,CAAI,OAAO,UAAA,CAAWzjC,CAAAA,CAAM,CAAC,CAAC,CAAC,EAEjDwjC,CAAAA,GAAY,sBAAA,CACd/5C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,uBAAwB,OAAA,CAASg6C,CAAS,CAAC,CAAA,CACrDD,CAAAA,GAAY,sBACrB/5C,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,sBAAA,CAAwB,OAAA,CAASg6C,CAAS,CAAC,CAAA,CACrDD,IAAY,0BAAA,EACrB/5C,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAM,qBAAsB,OAAA,CAASg6C,CAAS,CAAC,EAEhE,CACF,CACF,CAGF,OAAO,CACL,IAAA,CAAMH,CAAAA,CAAU,MAAA,CAChB,KAAA,CAAOA,CAAAA,CAAU,IAAA,CACjB,MAAOA,CAAAA,CAAU,QAAA,CACjB,eAAgBA,CAAAA,CAAU,OAAA,CAC1B,IAAKA,CAAAA,CAAU,GAAA,EAAK,QAAA,EAAS,CAC7B,KAAA,CAAOA,CAAAA,CAAU,MACjB,cAAA,CAAgBA,CAAAA,CAAU,eAC1B,KAAA,CAAA75C,CACF,CACF,CAAA,KAAQ,CACN,MACF,CACF,CAAA,CAEA,OAAOuZ,wBAAa,CAClB,QAAA,CAAU,CAAC,gBAAA,CAAkB,YAAA,CAAc1O,EAAU7N,CAAAA,CAAO8gB,CAAQ,EACpE,OAAA,CAAS,SAAY,CACnB,IAAMm8B,CAAAA,CAAqB,MAAML,CAAAA,EAAsB,CAEvD,GAAIK,CAAAA,EAAsBA,CAAAA,CAAmB,KAAA,CAAQ,CAAA,CACnD,OAAOA,CAAAA,CAGT,IAAIR,CAAAA,CAEJ,GAAIz8C,IAAU,MAAA,CACZy8C,CAAAA,CAAY,MAAMH,CAAAA,CAAWlJ,EAAAA,CAAoCvlC,CAAQ,CAAC,CAAA,CAAA,KAAA,GACjE7N,CAAAA,GAAU,KACnBy8C,CAAAA,CAAY,MAAMH,EAAWxI,EAAAA,CAAyCjmC,CAAQ,CAAC,CAAA,CAAA,KAAA,GACtE7N,CAAAA,GAAU,KAAA,CACnBy8C,CAAAA,CAAY,MAAMH,CAAAA,CAAW7I,GAAmC5lC,CAAQ,CAAC,UAChE7N,CAAAA,GAAU,QAAA,CACnBy8C,EAAY,MAAMH,CAAAA,CAAWJ,GAAsCruC,CAAQ,CAAC,WAG3D,MAAM0lB,CAAAA,CAAY,gBACjCgmB,EAAAA,CAAwC1rC,CAAQ,CAClD,CAAA,EAEa,IAAA,CAAMktC,CAAAA,EAAYA,CAAAA,CAAQ,MAAA,GAAW/6C,CAAK,EACrDy8C,CAAAA,CAAY,MAAMH,EAChBjB,EAAAA,CAA0CxtC,CAAAA,CAAU7N,CAAK,CAC3D,CAAA,CAAA,KACK,CAAA,GAAIi9C,CAAAA,CAET,OAAOA,CAAAA,CAEP,MAAM,IAAI,KAAA,CACR,4CAAuCj9C,CAAK,CAAA,CAAA,CAC9C,EAMJ,GAAIi9C,CAAAA,EAAsBR,CAAAA,EAAaA,CAAAA,CAAU,KAAA,CAAQ,CAAA,CAAG,CAC1D,IAAMS,CAAAA,CAAY,MAAMV,CAAAA,CAA2BC,CAAS,EAC5D,OAAO,CACL,GAAGQ,CAAAA,CACH,KAAA,CAAOC,EAAW,KACpB,CACF,CAEA,OAAO,MAAMV,EAA2BC,CAAS,CACnD,CACF,CAAC,CACH,KC/KYU,EAAAA,CAAAA,CAAAA,CAAAA,GAEVA,CAAAA,CAAA,SAAW,UAAA,CAGXA,CAAAA,CAAA,kBAAoB,iBAAA,CACpBA,CAAAA,CAAA,mBAAA,CAAsB,iBAAA,CACtBA,CAAAA,CAAA,QAAA,CAAW,WACXA,CAAAA,CAAA,OAAA,CAAU,WACVA,CAAAA,CAAA,SAAA,CAAY,aACZA,CAAAA,CAAA,cAAA,CAAiB,iBAAA,CACjBA,CAAAA,CAAA,aAAA,CAAgB,gBAAA,CAChBA,EAAA,IAAA,CAAO,MAAA,CACPA,EAAA,OAAA,CAAU,SAAA,CAGVA,EAAA,IAAA,CAAO,MAAA,CACPA,EAAA,OAAA,CAAU,SAAA,CACVA,EAAA,KAAA,CAAQ,OAAA,CACRA,EAAA,GAAA,CAAM,KAAA,CAGNA,EAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,WAAa,YAAA,CAxBHA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,ICkCL,SAASC,EAAAA,CACdvvC,EACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,UAAU,CAAA,CACrB/I,EACCmJ,CAAAA,EAAY,CACX8d,GAAgBjnB,CAAAA,CAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,CAAAA,CAAQ,MAAA,CAAQA,CAAAA,CAAQ,IAAI,CACrE,CAAA,CACA,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,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,CCxCO,SAAS2nC,EAAAA,CACdxvC,CAAAA,CACAyH,CAAAA,CACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,gBAAgB,EAC3B/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXmlB,EAAAA,CAAqBtuB,CAAAA,CAAWmJ,EAAQ,EAAA,CAAIA,CAAAA,CAAQ,OAAQA,CAAAA,CAAQ,IAAI,CAC1E,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,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,CC2BO,SAAS4nC,EAAAA,CACdzvC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,yBAAyB,CAAA,CACpC/I,CAAAA,CACCmJ,GAAY,CACX6e,EAAAA,CACEhoB,EACAmJ,CAAAA,CAAQ,SAAA,CACRA,EAAQ,aACV,CACF,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAE5B,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,SAAS,CAAA,CAC3C,CAAC,iBAAkB,YAAA,CAAc7lB,CAAQ,EACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCvBO,SAAS6nC,GACd1vC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,4BAA4B,EACvC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXgf,EAAAA,CACEnoB,CAAAA,CACAmJ,EAAQ,SAAA,CACRA,CAAAA,CAAQ,OAAA,CACRA,CAAAA,CAAQ,QACV,CACF,EACA,MAAO6lB,CAAAA,CAASnJ,IAAc,CAE5B,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,OAAO,cAAA,CAAe3O,CAAS,EACzC2O,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,SAAS,CAC7C,CAAC,EACH,CAAA,CACApe,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCvFO,SAAS8nC,EAAAA,CAAuB3vC,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,eAAgB,UAAA,CAChB,eAAA,CAAiB,CACf,MAAA,CAAQ5P,CAAAA,CAAQ,OAChB,EAAA,CAAIA,CAAAA,CAAQ,GACZ,QAAA,CAAUA,CAAAA,CAAQ,QAAA,CAClB,IAAA,CAAMA,CAAAA,CAAQ,IAChB,CACF,CAAC,CAAA,CACD,OAAO,CAAC,CAAC,cAAe,CACtB,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,sBAAA,CAAwB,EAAC,CACzB,EAAA,CAAI,mBACJ,IAAA,CAAA+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,KAAK3O,CAAQ,CAAA,CAChC2O,EAAU,QAAA,CAAS,IAAA,CAAKkX,EAAU,EAAE,CAAA,CACpC,CAAC,gBAAA,CAAkB,YAAA,CAAc7lB,CAAQ,CAAA,CACzC,CAAC,QAAA,CAAU,YAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,EACAyH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCrCO,SAAS+nC,GACd5vC,CAAAA,CACAyH,CAAAA,CACAI,EACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,qBAAqB,EAChC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACXqe,EAAAA,CAAyBxnB,CAAAA,CAAWmJ,EAAQ,EAAA,CAAIA,CAAAA,CAAQ,OAAQA,CAAAA,CAAQ,IAAI,CAC9E,CAAA,CACA,MAAO6lB,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,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,EAAAA,CAA2BznB,CAAAA,CAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,EAAQ,MAAA,CAAQA,CAAAA,CAAQ,KAAMA,CAAAA,CAAQ,SAAS,CACnG,CAAA,CACA,MAAO6lB,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,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,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCzBO,SAASioC,EAAAA,CACd9vC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,qBAAqB,CAAA,CAChC/I,CAAAA,CACCmJ,GAAY,CACX0e,EAAAA,CAAyB7nB,EAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,EAAQ,MAAM,CAChE,CAAA,CACA,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,YAAa,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,CAAAA,CACL,CAAC,QAAA,CAAU,kBAAkB,EAC7B/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,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,CCpBO,SAASmoC,EAAAA,CAAWhwC,CAAAA,CAA8ByH,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,MAAA,CAAQA,CAAAA,CAAQ,SAAS,CACjE,EACA,SAAY,CACV,MAAMM,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,IAAA,CAAMA,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,CAAA,CAC3B/I,CAAAA,CACCmJ,CAAAA,EAAYye,EAAAA,CAAsB5nB,EAAWmJ,CAAAA,CAAQ,EAAA,CAAIA,EAAQ,MAAA,CAAQA,CAAAA,CAAQ,KAAMA,CAAAA,CAAQ,SAAS,CAAA,CACzG,SAAY,CACV,MAAMM,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,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,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnBA,IAAMqoC,EAAAA,CAAsC,GAAA,CACtCC,EAAAA,CAA4B,IAAI,GAAA,CAE/B,SAASC,EAAAA,CAAgBpwC,CAAAA,CAA8ByH,EAC5DI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,eAAe,CAAA,CAC1B/I,CAAAA,CACCmJ,GAAY,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,gBAAgB3O,CAAS,CAAA,CAC1C2O,EAAU,MAAA,CAAO,cAAA,CAAe3O,CAAS,CAAA,CACzC2O,CAAAA,CAAU,MAAA,CAAO,oBAAA,CAAqB3O,CAAS,CACjD,EAIMuwC,CAAAA,CAAgBJ,EAAAA,CAA0B,IAAIE,CAAQ,CAAA,CACxDE,IACF,YAAA,CAAaA,CAAa,CAAA,CAC1BJ,EAAAA,CAA0B,MAAA,CAAOE,CAAQ,GAG3C,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,CAAAA,CAAS,MAAA,CAAS,CAAA,EACpB,OAAA,CAAQ,MAAM,8DAAA,CAAgE,CAC5E,SAAAxwC,CAAAA,CACA,aAAA,CAAewwC,EAAS,MAAA,CACxB,QAAA,CAAAA,CACF,CAAC,EAEL,CAAA,MAASv9C,EAAO,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,CAAA,CAEtCC,EAAAA,CAA0B,GAAA,CAAIE,CAAAA,CAAUh3C,CAAK,EAC/C,CAAA,CACAoO,EACA,SAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CC7DO,SAAS4oC,EAAAA,CAAuBzwC,EAA8ByH,CAAAA,CACnEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,uBAAuB,CAAA,CAClC/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,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,KAAKkX,CAAAA,CAAU,EAAE,EACpC,CAAC,gBAAA,CAAkB,aAAc7lB,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,CCnCO,SAAS6oC,EAAAA,CAAyB1wC,CAAAA,CAA8ByH,EACrEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,yBAAyB,CAAA,CACpC/I,CAAAA,CACCmJ,CAAAA,EAAY,CACX,IAAM4P,EAAO,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,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,KAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,QAAA,CACA,CAAE,aAAA,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,EACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,IAAA,CAAK,UAAU,CAC1B,YAAA,CAAc,QAAA,CACd,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,CAAAA,CAASnJ,CAAAA,GAAc,CAC5B,MAAMpc,EAAyBhC,CAAAA,EAAM,OAAA,CAASI,EAAe,CAC3D8G,CAAAA,CAAU,SAAS,IAAA,CAAK3O,CAAQ,CAAA,CAChC2O,CAAAA,CAAU,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,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCnCO,SAAS+oC,EAAAA,CAAsB5wC,CAAAA,CAA8ByH,EAClEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,QAAA,CAAU,sBAAsB,CAAA,CACjC/I,CAAAA,CACCmJ,GAAY,CACX,IAAM4P,EAAO,IAAA,CAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,QAAA,CACd,cAAA,CAAgB,SAAA,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,cAAe,CACtB,EAAA,CAAI,mBACJ,cAAA,CAAgB,CAACnJ,CAAS,CAAA,CAC1B,sBAAA,CAAwB,GACxB,IAAA,CAAA+Y,CACF,CAAC,CAAc,CACjB,EACA,SAAY,CACV,MAAMtP,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,CCpCO,SAASgpC,EAAAA,CAAsB7wC,EAA8ByH,CAAAA,CAClEI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,SAAU,sBAAsB,CAAA,CACjC/I,EACCmJ,CAAAA,EAAY,CACX,IAAM4P,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU5P,CAAAA,CAAQ,MAAA,CAAO,GAAA,CAAKpY,IAAY,CAAE,MAAA,CAAAA,CAAO,CAAA,CAAE,CAAC,EACxE,OAAO,CAAC,CAAC,aAAA,CAAe,CACtB,EAAA,CAAI,mBACJ,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,WAAA,CAAa,IAAA,CAAMA,CAAQ,CACxC,CAAC,EACH,CAAA,CACAyH,EACA,SAAA,CACA,CAAE,cAAAI,CAAc,CAClB,CACF,CCrBO,SAASipC,EAAAA,CAAqB9wC,EAA8ByH,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,CAAAA,CAAkB,CAChB,IAAA,CAAMzf,CAAAA,CAAQ,UACd,EAAA,CAAIA,CAAAA,CAAQ,OACd,CAAA,GAEAwf,CAAAA,CAAiBxf,EAAQ,MAAA,CACzByf,CAAAA,CAAkB,CAChB,MAAA,CAAQzf,CAAAA,CAAQ,MAAA,CAChB,SAAUA,CAAAA,CAAQ,QAAA,CAClB,MAAOA,CAAAA,CAAQ,KACjB,GAGF,IAAM4P,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAC1B,YAAA,CAAc,SACd,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,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,WAAA,CAAa,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,EAAA,CAAAC,CAAAA,CAAK,EAAA,CAAI,MAAA,CAAA3S,EAAS,EAAA,CAAI,IAAA,CAAAiS,EAAO,EAAG,CAAA,CAAIoG,EAC5Cue,CAAAA,CAAYve,CAAAA,CAAQ,UAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAM,EAExD,OAAQhX,CAAAA,EACN,KAAK,MAAA,CACH,OAAQ2B,CAAAA,EACN,KAAA,UAAA,CACE,OAAO,CAACmzB,EAAAA,CAAgBzjB,EAAMC,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,CAAAA,CAAI3S,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,CAAAA,CAAMC,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,GAAsBpkB,CAAAA,CAAMC,CAAAA,CAAI3S,EAAQiS,CAAAA,CAAM2kB,CAAS,EAChE,KAAA,SAAA,CACE,OAAO,CAACc,EAAAA,CAAehlB,CAAAA,CAAM1S,CAAAA,CAAQ,KAAK,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,cAAgB3F,CAAAA,CACxB2F,CAAAA,CAAQ,YAAc1F,CAAAA,CACtB0F,CAAAA,CAAQ,SAAW,CAAA,CACnBA,CAAAA,CAAQ,SAAA,EAAa,KACvB,CAAC,CACL,CACA,MAEF,KAAK,SACH,GAAIrV,CAAAA,GAAc,YAA2BA,CAAAA,GAAc,MAAA,CACzD,OAAO,CAACw6B,EAAAA,CAAqB9qB,CAAAA,CAAMC,EAAI3S,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,CAAAA,CAAK,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,GAAcllB,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,CAAAA,CAAM,OAAA,CAAS,CAAE,MAAA,CAAQrR,EAAO,EAAA,CAAAsR,CAAAA,CAAI,SAAAunC,CAAS,CAAC,CAAC,CAAA,CACvE,KAAA,SAAA,CACE,OAAO,CAACtiB,EAAAA,CAAcllB,CAAAA,CAAM,UAAW,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,MAAA,CAAQrR,CAAAA,CAAO,IAAA,CAAMsR,CAAAA,CAAI,SAAAunC,CAAS,CAAC,CAAC,CAAA,CAClF,KAAA,OAAA,CACE,OAAO,CAACliB,EAAAA,CAAmBtlB,CAAAA,CAAM,CAACrR,CAAK,CAAC,CAAC,CAC7C,CAEA,OAAO,IACT,CAMA,SAAS8+C,EAAAA,CAA4Bn9C,CAAAA,CAA2C,CAC9E,OAAIA,CAAAA,GAAc,OAAA,CACT,UAEF,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,EAAO2B,CAAS,CAAA,CACnCkM,EACCmJ,CAAAA,EAAY,CAEX,IAAMgoC,CAAAA,CAAUJ,EAAAA,CAAoB5+C,CAAAA,CAAO2B,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,IAAA,CAAK,CAAC,gBAAA,CAAkB,YAAA,CAActwC,EAAU7N,CAAK,CAAC,EAEnEA,CAAAA,GAAU,MAAA,EACZm+C,EAAiB,IAAA,CAAK,CAAC,gBAAA,CAAkB,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,SAAU,aAAa,CAAA,CACxB/I,EACA,CAAC,CAAE,GAAAyD,CAAAA,CAAI,KAAA,CAAAwlB,CAAM,CAAA,GAAM,CACjBF,EAAAA,CAAkB/oB,EAAWyD,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,QAAA,CAAS,IAAA,CAAKkX,CAAAA,CAAU,EAAE,EACpClX,CAAAA,CAAU,eAAA,CAAgB,QAAQ3O,CAAS,CAAA,CAC3C2O,EAAU,eAAA,CAAgB,OAAA,CAAQkX,CAAAA,CAAU,EAAE,CAChD,CAAC,EACH,CAAA,CACApe,CAAAA,CACA,SACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CC0BO,SAASypC,EAAAA,CACdtxC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,YAAa,MAAM,CAAA,CACpB/I,EACA,CAAC,CAAE,QAAAyS,CAAAA,CAAS,OAAA,CAAAoX,CAAQ,CAAA,GAAM,CACxBD,GAAmB5pB,CAAAA,CAAWyS,CAAAA,CAASoX,CAAO,CAChD,CAAA,CACA,SAAY,CAEV,GAAI,CAEEpiB,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,EAAU,SAAA,CAAU,KAAA,CAAM3O,CAAQ,CACpC,CAAC,EAEL,CAAA,MAAS/M,CAAAA,CAAO,CAEd,QAAQ,IAAA,CAAK,qDAAA,CAAuDA,CAAK,EAC3E,CACF,EACAwU,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CChFO,SAAS0pC,EAAAA,CACdvxC,CAAAA,CACAyH,EACAI,CAAAA,CACA,CACA,OAAOkB,CAAAA,CACL,CAAC,WAAA,CAAa,OAAO,CAAA,CACrB/I,CAAAA,CACA,CAAC,CAAE,KAAA,CAAA+pB,CAAM,CAAA,GAAM,CACbD,EAAAA,CAAoB9pB,CAAAA,CAAW+pB,CAAK,CACtC,EACA,SAAY,CACNtiB,GAAM,OAAA,EAAS,iBAAA,EACjB,MAAMA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,CACnCkH,CAAAA,CAAU,QAAA,CAAS,KAAK3O,CAAQ,CAAA,CAChC2O,EAAU,SAAA,CAAU,KAAA,EACtB,CAAC,EAEL,EACAlH,CAAAA,CACA,QAAA,CACA,CAAE,aAAA,CAAAI,CAAc,CAClB,CACF,CCMA,SAAS2pC,GAAeC,CAAAA,CAA0B,CAChD,OAAO,CACL,KAAA,CAAOA,EAAE,YAAA,CACT,YAAA,CAAcA,CAAAA,CAAE,aAAA,CAChB,GAAA,CAAKA,CAAAA,CAAE,IACP,KAAA,CAAO,CACL,qBAAsB,CAAA,EAAA,CAAIA,CAAAA,CAAE,qBAAuB,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,CAAA,CACnE,sBAAA,CAAwB,EACxB,kBAAA,CAAoBA,CAAAA,CAAE,UACxB,CAAA,CACA,iBAAA,CAAmB,CACjB,IAAA,CAAM,CAAA,EAAGA,EAAE,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAClC,EACA,mCAAA,CAAqC,CAAA,CACrC,gBAAiBA,CAAAA,CAAE,OAAA,CACnB,WAAA,CAAaA,CAAAA,CAAE,WAAA,CACf,wBAAA,CAA0BA,EAAE,eAAA,CAC5B,IAAA,CAAMA,EAAE,IAAA,CACR,KAAA,CAAOA,EAAE,KAAA,CACT,UAAA,CAAYA,CAAAA,CAAE,UAAA,CACd,uBAAA,CAAyBA,CAAAA,CAAE,wBAC3B,UAAA,CAAYA,CAAAA,CAAE,WACd,iBAAA,CAAmBA,CAAAA,CAAE,kBACrB,wBAAA,CAA0BA,CAAAA,CAAE,wBAC9B,CACF,CAUO,SAASC,GAAiCtkD,CAAAA,CAAe,CAC9D,OAAOyrB,+BAAAA,CAML,CACA,SAAUlK,CAAAA,CAAU,SAAA,CAAU,KAAKvhB,CAAK,CAAA,CACxC,iBAAkB,CAAA,CAElB,OAAA,CAAS,MAAO,CAAE,SAAA,CAAA0rB,CAAU,CAAA,GAAA,CACR,MAAMlc,EAAAA,CACtB,OAAA,CACA,YAAA,CACA,CACE,YAAaxP,CAAAA,CACb,IAAA,CAAM0rB,CACR,CACF,CAAA,EAEgB,UAAU,GAAA,CAAI04B,EAAc,CAAA,CAG9C,gBAAA,CAAkB,CAACx4B,CAAAA,CAAU8yB,EAAWC,CAAAA,GACtC/yB,CAAAA,CAAS,SAAW5rB,CAAAA,CAAQ2+C,CAAAA,CAAgB,EAAI,MACpD,CAAC,CACH,CAuBO,SAAS4F,EAAAA,CACdl/B,EACAC,CAAAA,CACAC,CAAAA,CACA9B,EAA8B,OAAA,CAC9B+B,CAAAA,CAAuC,OACvC,CACA,OAAOlE,wBAAa,CAClB,QAAA,CAAUC,EAAU,SAAA,CAAU,MAAA,CAAO8D,EAASC,CAAAA,CAAMC,CAAAA,CAAU9B,EAAM+B,CAAS,CAAA,CAC7E,OAAA,CAAS,MAAO,CAAE,MAAA,CAAAvY,CAAO,CAAA,GACf,MAAMuC,GACZ,OAAA,CACA,kCAAA,CACA,CACE,cAAA,CAAgB6V,CAAAA,CAChB,WAAA,CAAaE,CAAAA,CACb,IAAA,CAAAD,CAAAA,CACA,KAAA7B,CAAAA,CACA,SAAA,CAAA+B,CACF,CAAA,CACA,MAAA,CACA,OACAvY,CACF,CAAA,CAEF,OAAA,CAAS,CAAC,CAACoY,CAAAA,CACX,UAAW,GACb,CAAC,CACH,CAOO,SAASm/B,GAAiCn/B,CAAAA,CAAiB,CAChE,OAAO/D,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,SAAA,CAAU,WAAW8D,CAAO,CAAA,CAChD,QAAS,SACC,MAAM7V,EAAAA,CACZ,OAAA,CACA,wCAAA,CACA,CAAE,eAAgB6V,CAAQ,CAC5B,EAEF,OAAA,CAAS,CAAC,CAACA,CAAAA,CACX,SAAA,CAAW,GACb,CAAC,CACH,KC3KYo/B,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAAA,CAAAA,CAAA,QAAU,EAAA,CAAA,CAAV,SAAA,CACAA,IAAA,KAAA,CAAQ,EAAA,CAAA,CAAR,OAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,aAAA,CAAgB,EAAA,CAAA,CAAhB,gBACAA,CAAAA,CAAAA,CAAAA,CAAA,IAAA,CAAO,KAAP,MAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,QAAU,GAAA,CAAA,CAAV,SAAA,CACAA,IAAA,IAAA,CAAO,GAAA,CAAA,CAAP,OACAA,CAAAA,CAAAA,CAAAA,CAAA,MAAA,CAAS,KAAT,QAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,WAAa,GAAA,CAAA,CAAb,YAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,QAAA,CAAW,GAAA,CAAA,CAAX,UAAA,CACAA,IAAA,SAAA,CAAY,GAAA,CAAA,CAAZ,YACAA,CAAAA,CAAAA,CAAAA,CAAA,aAAA,CAAgB,KAAhB,eAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,iBAAA,CAAoB,GAAA,CAAA,CAApB,mBAAA,CACAA,CAAAA,CAAAA,CAAAA,CAAA,OAAS,GAAA,CAAA,CAAT,QAAA,CAWAA,IAAA,MAAA,CAAS,GAAA,CAAA,CAAT,SAxBUA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,EAAA,ECiBZ,eAAsBC,EAAAA,CACpB9xC,CAAAA,CACAqJ,EACA,CACA,GAAI,CAACrJ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAiD,EAGnE,GAAI,CAACqJ,EACH,MAAM,IAAI,MAAM,uDAAkD,CAAA,CAIpE,IAAM7L,CAAAA,CAAW,MADAyQ,CAAAA,GAEfzD,CAAAA,CAAO,cAAA,CAAiB,4BACxB,CACE,MAAA,CAAQ,OACR,OAAA,CAAS,CACP,cAAA,CAAgB,kBAClB,CAAA,CACA,IAAA,CAAM,KAAK,SAAA,CAAU,CAAE,KAAMnB,CAAY,CAAC,CAC5C,CACF,CAAA,CAGM0oC,CAAAA,CAAAA,CAAev0C,CAAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,EAAK,EAAA,EAC1D,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CACZ,IAAA,GACA,WAAA,EAAY,CACTtD,EAAO,MAAMsD,CAAAA,CAAS,MAAK,CAEjC,GAAI,CAACA,CAAAA,CAAS,EAAA,CAAI,CAChB,GAAIA,CAAAA,CAAS,MAAA,GAAW,IACtB,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMtD,CAAI,CACxB,CAAA,KAAQ,CACN,OAAO,CAAE,OAAA,CAASA,EAAM,IAAA,CAAMsD,CAAAA,CAAS,MAAO,CAChD,CAKF,IAAMw0C,CAAAA,CACJ93C,CAAAA,EAAQ63C,CAAAA,CAAY,QAAA,CAAS,MAAM,CAAA,CAAI,KAAK73C,CAAAA,CAAK,KAAA,CAAM,EAAG,GAAG,CAAC,GAAK,EAAA,CACrE,MAAM,IAAI,KAAA,CACR,CAAA,+CAAA,EAA6CsD,EAAS,MAAM,CAAA,EAAGw0C,CAAM,CAAA,CACvE,CACF,CAEA,GAAI,CAACD,CAAAA,CAAY,QAAA,CAAS,MAAM,CAAA,CAC9B,MAAM,IAAI,KAAA,CACR,2DAAsDA,CAAAA,EAAe,OAAO,sBAAsBv0C,CAAAA,CAAS,MAAM,CAAA,CAAA,CACnH,CAAA,CAGF,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMtD,CAAI,CACxB,CAAA,KAAQ,CACN,MAAM,IAAI,KAAA,CACR,CAAA,4DAAA,EAA0DsD,CAAAA,CAAS,MAAM,GAC3E,CACF,CACF,CAEO,SAASy0C,EAAAA,CACdjyC,EACAqJ,CAAAA,CACAJ,CAAAA,CACA8c,EACA,CACA,GAAM,CAAE,WAAA,CAAa0Z,CAAe,EAAI7C,EAAAA,CAAgB,iBAAA,CACtD58B,EACA,gBACF,CAAA,CAEA,OAAOkJ,sBAAAA,CAAY,CACjB,UAAA,CAAY,IAAM4oC,EAAAA,CAAmB9xC,CAAAA,CAAUqJ,CAAW,CAAA,CAC1D,OAAA,CAAA0c,EACA,SAAA,CAAW,IAAM,CACf0Z,CAAAA,EAAe,CAEf5yB,CAAAA,GAAiB,YAAA,CACfmhC,EAAAA,CAAsBhuC,CAAQ,CAAA,CAAE,QAAA,CAC/B5Q,GACMA,CAAAA,EAIE,CACL,GAAGA,CAAAA,CACH,MAAA,CAAA,CACE,UAAA,CAAWA,EAAK,MAAM,CAAA,CAAI,WAAWA,CAAAA,CAAK,OAAO,GACjD,OAAA,CAAQ,CAAC,EACX,OAAA,CAAS,GACX,CAEJ,CAAA,CAEA6Z,CAAAA,KACF,CACF,CAAC,CACH,CC/GA,IAAMipC,EAAAA,CAAY,wBAAA,CACZC,EAAAA,CAAU,sBAAA,CACVC,GAAc,0BAAA,CACdC,EAAAA,CAAS,sBAKR,IAAKC,EAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,GAAA,CAAM,EAAA,CACNA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,QAAU,SAAA,CAHAA,CAAAA,CAAAA,EAAAA,EAAAA,EAAA,IAMCC,EAAAA,CAAkB,CAAA,CAIlBC,GAA0B,IAQvC,SAASC,EAAAA,CAAWpmD,CAAAA,CAAuB,CACzC,OAAOA,EAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAK,EACzC,CAMO,SAASqmD,EAAAA,CAAsBrmD,EAAuB,CAC3D,OAAOomD,GAAWpmD,CAAK,CAAA,CAAE,QAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,WAAA,EAC9C,CAEO,SAASsmD,EAAAA,CAAwBtmD,CAAAA,CAAuB,CAG7D,OAAOomD,EAAAA,CAAWpmD,CAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,WAAA,EAC9C,CAMO,SAASumD,GAAoBvmD,CAAAA,CAAyB,CAC3D,IAAMwmD,CAAAA,CAAO,IAAI,GAAA,CAEjB,OAAOxmD,CAAAA,CACJ,KAAA,CAAM,QAAQ,CAAA,CACd,GAAA,CAAKiV,GAAQA,CAAAA,CAAI,OAAA,CAAQ,MAAO,EAAE,CAAA,CAAE,aAAa,CAAA,CACjD,OAAQA,CAAAA,EACHA,CAAAA,GAAQ,IAAMuxC,CAAAA,CAAK,GAAA,CAAIvxC,CAAG,CAAA,CACrB,KAAA,EAGTuxC,CAAAA,CAAK,GAAA,CAAIvxC,CAAG,CAAA,CACL,KACR,CACL,CA0BO,SAASwxC,EAAAA,CAAiB,CAC/B,OAAAC,CAAAA,CAAS,EAAA,CACT,MAAA,CAAAxiC,CAAAA,CAAS,EAAA,CACT,IAAA,CAAAvL,EAAO,EAAA,CACP,QAAA,CAAAguC,EAAW,EAAA,CACX,IAAA,CAAA93B,EAAO,EACT,CAAA,CAAuC,CACrC,IAAM+3B,CAAAA,CAAmBF,EAAO,IAAA,EAAK,CAAE,QAAQ,MAAA,CAAQ,GAAG,EACpD7xB,CAAAA,CAAmBwxB,EAAAA,CAAsBniC,CAAM,CAAA,CAC/C2iC,CAAAA,CAAqBP,GAAwBK,CAAQ,CAAA,CACrDG,EAAiBP,EAAAA,CAAoB,KAAA,CAAM,QAAQ13B,CAAI,CAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,GAAG,CAAA,CAAIA,CAAI,CAAA,CAEhF/lB,CAAAA,CAAQ,CAAC89C,CAAgB,CAAA,CAE/B,OAAI/xB,CAAAA,EACF/rB,CAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU+rB,CAAgB,CAAA,CAAE,EAGrClc,CAAAA,EACF7P,CAAAA,CAAM,KAAK,CAAA,KAAA,EAAQ6P,CAAI,EAAE,CAAA,CAGvBkuC,CAAAA,EACF/9C,CAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY+9C,CAAkB,EAAE,CAAA,CAGzCC,CAAAA,CAAe,OAAS,CAAA,EAG1Bh+C,CAAAA,CAAM,KAAK,CAAA,IAAA,EAAOg+C,CAAAA,CAAe,KAAK,GAAG,CAAC,EAAE,CAAA,CAGvC,CAGL,EAAGh+C,CAAAA,CAAM,MAAA,CAAQi+C,GAASA,CAAAA,GAAS,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAC/C,OAAQH,CAAAA,CACR,MAAA,CAAQ/xB,EACR,IAAA,CAAAlc,CAAAA,CACA,SAAUkuC,CAAAA,CACV,IAAA,CAAMC,CACR,CACF,CAEO,IAAME,GAAN,KAAkB,CAChB,MAAgB,EAAA,CAChB,MAAA,CAAiB,GACjB,MAAA,CAAiB,EAAA,CACjB,IAAA,CAAmB,EAAA,CACnB,QAAA,CAAmB,EAAA,CACnB,KAAiB,EAAC,CAEzB,YAAYC,CAAAA,CAAgB,CAC1B,KAAK,KAAA,CAAQA,CAAAA,CACb,KAAK,MAAA,CAASA,CAAAA,CAEd,KAAK,UAAA,EAAW,CAChB,KAAK,QAAA,EAAS,CACd,KAAK,YAAA,EAAa,CAClB,IAAA,CAAK,QAAA,EAAS,CACd,IAAA,CAAK,aACP,CAEQ,KAAQC,CAAAA,EAAuB,CAErC,IAAMC,CAAAA,CAAU,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,CAASD,CAAE,CAAC,CAAA,CAC3C,OAAIC,CAAAA,CAAQ,MAAA,CAAS,EACZA,CAAAA,CAAQ,CAAC,CAAA,CAAE,CAAK,CAAA,CAAE,IAAA,GAGpB,EACT,CAAA,CAEQ,WAAa,IAAM,CACzB,KAAK,MAAA,CAAS,IAAA,CAAK,KAAKtB,EAAS,EACnC,EAEQ,QAAA,CAAW,IAAM,CACvB,IAAMltC,CAAAA,CAAO,KAAK,IAAA,CAAKmtC,EAAO,CAAA,CAC1B,MAAA,CAAO,MAAA,CAAOG,EAAU,EAAE,QAAA,CAASttC,CAAI,IACzC,IAAA,CAAK,IAAA,CAAOA,GAEhB,CAAA,CAEQ,YAAA,CAAe,IAAM,CAC3B,IAAA,CAAK,QAAA,CAAW,KAAK,IAAA,CAAKotC,EAAW,EACvC,CAAA,CAEQ,QAAA,CAAW,IAAM,CAOvB,IAAMS,CAAAA,CAAO,IAAI,GAAA,CAEjB,IAAA,CAAK,KAAO,CAAC,GAAG,KAAK,KAAA,CAAM,QAAA,CAASR,EAAM,CAAC,CAAA,CACxC,QAAS3mC,CAAAA,EAAUA,CAAAA,CAAM,CAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA,CAC1C,IAAKpK,CAAAA,EAAQA,CAAAA,CAAI,IAAA,EAAM,CAAA,CACvB,MAAA,CAAQA,GACHA,CAAAA,GAAQ,EAAA,EAAMuxC,EAAK,GAAA,CAAIvxC,CAAG,EACrB,KAAA,EAGTuxC,CAAAA,CAAK,GAAA,CAAIvxC,CAAG,CAAA,CACL,IAAA,CACR,EACL,CAAA,CAEQ,UAAA,CAAa,IAAM,CAOzB,IANA,CAAC4wC,EAAAA,CAAWC,EAAAA,CAASC,EAAAA,CAAaC,EAAM,CAAA,CAAE,OAAA,CAASvjD,GAAM,CAGvD,IAAA,CAAK,OAAS,IAAA,CAAK,MAAA,CAAO,QAAQA,CAAAA,CAAG,IAAI,EAC3C,CAAC,CAAA,CAEM,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,GAAM,EAAA,EACnC,KAAK,MAAA,CAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAM,GAAG,EAG7C,IAAA,CAAK,MAAA,CAAS,KAAK,MAAA,CAAO,IAAA,GAC5B,CACF,EC5MA,eAAsBinC,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,oBAAW,CAAA,CAAI,CAAA,CAe5B,SAASC,EAAAA,CAAkBC,CAAAA,CAAsB7gD,CAAAA,CAAuB,CAC7E,GAAM,CAAE,OAAAmM,CAAO,CAAA,CAAInM,EACb8gD,CAAAA,CAAc30C,CAAAA,GAAW,KAAOA,CAAAA,GAAW,GAAA,CAEjD,OAAIA,CAAAA,GAAW,MAAA,EAAaA,GAAU,GAAA,EAAOA,CAAAA,CAAS,KAAO,CAAC20C,CAAAA,CACrD,KAAA,CAGFD,CAAAA,CAAeH,EACxB,CC7BO,SAASK,EAAAA,CACd/hC,CAAAA,CACApB,EACAqB,CAAAA,CACAC,CAAAA,CACA8hC,EACA5hC,CAAAA,CACA,CACA,OAAO3D,uBAAAA,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,+BAAAA,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,CAAc9M,CAAAA,CAAuB,CACzD,OAAO8M,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,EAAG9M,CAAK,CACnB,CAMA,SAASynD,EAAAA,CAAY9pD,CAAAA,CAAmB,CACtC,IAAI6L,CAAAA,CAAI,KACR,IAAA,IAAS3L,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAE,OAAQE,CAAAA,EAAAA,CAC5B2L,CAAAA,CAAAA,CAAMA,GAAK,CAAA,EAAKA,CAAAA,CAAI7L,EAAE,UAAA,CAAWE,CAAC,EAAK,CAAA,CAEzC,OAAA,CAAQ2L,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,uBAAAA,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,EAAW7kB,CAAAA,CAAQ,CAAA,CAAG,CACjE,IAAM41B,CAAAA,CAAa/Q,CAAAA,CAAE,MAAK,CAE1B,OAAOvD,wBAAa,CAClB,QAAA,CAAUC,EAAU,MAAA,CAAO,OAAA,CAAQqU,EAAY51B,CAAK,CAAA,CACpD,QAAS,SAAgC,CACvC,IAAM6jB,CAAAA,CAAa,MAAMhV,EAAQ,+BAAA,CAAiC,CAChE+mB,CAAAA,CACA51B,CACF,CAAC,CAAA,CAED,OAAI6jB,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,CAAW7kB,CAAAA,CAAQ,EAAA,CAAI,CACjE,IAAM41B,CAAAA,CAAa/Q,EAAE,IAAA,EAAK,CAE1B,OAAOvD,uBAAAA,CAAa,CAClB,SAAUC,CAAAA,CAAU,MAAA,CAAO,OAAOqU,CAAAA,CAAY51B,CAAK,EACnD,OAAA,CAAS,SAAA,CACO,MAAM6O,CAAAA,CAAQ,iCAAA,CAAmC,CAC7D+mB,CAAAA,CACA51B,CAAAA,CAAQ,CACV,CAAC,CAAA,EAGE,GAAA,CAAK0/C,GAAMA,CAAAA,CAAE,IAAI,EACjB,MAAA,CAAQj7B,CAAAA,EAASA,CAAAA,GAAS,EAAA,EAAM,CAACA,CAAAA,CAAK,WAAW,OAAO,CAAC,EACzD,KAAA,CAAM,CAAA,CAAGzkB,CAAK,CAAA,CAEnB,OAAA,CAAS,CAAC,CAAC41B,CACb,CAAC,CACH,CCjBO,SAASqyB,EAAAA,CACdpjC,CAAAA,CACApB,EACAqB,CAAAA,CACAC,CAAAA,CACAE,EACAG,CAAAA,CACA,CACA,OAAOqG,+BAAAA,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,uBAAAA,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,uBAAAA,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,yBAAAA,GACd9T,CAAAA,CAAO7R,CAAAA,EAAU,QAAQ,GAAA,CAAK,EAAE,EAEtC,OAAOkJ,sBAAAA,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,uBAAAA,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,uBAAAA,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,uBAAAA,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,uBAAAA,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,uBAAAA,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,uBAAAA,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,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,uBAAAA,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,oBAAWzpC,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.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":"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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 { 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/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/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."); 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); }, }); } 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",