{"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/mutations/use-generate-image.ts","../../src/modules/ai/mutations/use-ai-assist.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/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/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/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","OUR_NODE_BIAS_MS","OUR_NODE_DEMOTE_RATIO","OUR_NODE_HOSTS","isOurNode","NodeHealthTracker","h","durationMs","profileKey","now","p","elapsedMs","existing","retryAfterMs","hasHeader","cooldown","blockNum","recent","apiFail","best","healthy","unhealthy","fastest","ordered","d","probe","min","lat","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","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","CONFIG","QueryClient","ConfigManager","setQueryClient","client","setPrivateApiHost","host","getValidatedBaseUrl","setPollsApiHost","setImageHost","setHiveNodes","userAgent","analyzeRedosRisk","unboundedRange","match","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","observer","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","useGenerateImage","makeIdempotencyKey","useAiAssist","getAccountFullQueryOptions","bridgeProfile","profile","parseProfileMetadata","stats","follow_stats","reputationValue","DENIED_KEYS","isPlainObject","proto","deepMerge","srcVal","tgtVal","sanitizeTokens","meta","rest","safeMeta","postingJsonMetadata","extractAccountProfile","parsePostingMetadataRoot","buildPostingJsonMetadata","existingPostingJsonMetadata","root","existingProfile","mergedProfile","buildProfileMetadata","profileTokens","_ignoredVersion","profileRest","metadata","parseAccounts","rawAccounts","x","jsonMetadata","getAccountsQueryOptions","getFollowCountQueryOptions","getFollowersQueryOptions","getFollowingQueryOptions","getMutedUsersQueryOptions","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","oldData","newData","optimisticEntries","fetchedPermlinks","missingOptimistic","opt","getDiscussionQueryOptions","getAccountPostsInfiniteQueryOptions","hasNextPage","getAccountPostsQueryOptions","getPostsRankedInfiniteQueryOptions","_options","sanitizedTag","pinnedEntries","nonPinnedEntries","combined","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","useVote","newVotes","newPayout","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","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","getCommunitySubscribersQueryOptions","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","fallback","getHiveEngineOrderBook","baseParams","buy","sell","sortByPriceDesc","left","sortByPriceAsc","right","getHiveEngineTradeHistory","getHiveEngineOpenOrders","buyRaw","sellRaw","formatTotal","quantity","getHiveEngineMetrics","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","balance","tokenMetadata","metric","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","useClaimPoints","searchQueryOptions","scroll_id","getControversialRisingInfiniteQueryOptions","sinceDate","search","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","getBoostPlusPricesQueryOptions","getRcDelegationPricesQueryOptions","getRcDelegationActiveQueryOptions","responseData","getPromotePriceQueryOptions","getBoostPlusAccountPricesQueryOptions","useBoostPlus","useRcDelegation","hsTokenRenew","BAD_ACTORS_URL","getBadActorsQueryOptions","POLLS_PROTOCOL_VERSION","PollPreferredInterpretation","mapMetaChoicesToPollChoices","metaChoices","choice","normalizePoll","raw","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 <dcode@dcode.io>\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<ByteBuffer | ArrayBuffer | Uint8Array | number[]>,\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<Record<APIMethods, string[]>>,\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<Record<APIMethods, string[]>>\n): void => {\n  if (!map || typeof map !== 'object') return\n  const next: Partial<Record<APIMethods, string[]>> = { ...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<ResilienceOptions>): 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<string, ReturnType<typeof OperationDataSerializer>> = {}\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<void> => {\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<string, string> {\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: `<delay-seconds>` (e.g. \"120\") and `<http-date>`. 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  apiFailures: Map<string, { count: number; cooldownUntil: number; lastFailureTime: number }>\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<string, { ewmaMs: number; sampleCount: number; updatedAt: number }>\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 (the hapi-from-US 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/** Our-node additive tolerance (ms): our own unlimited node (no public rate limit via\n *  fleet IP whitelist) is forgiven up to this much extra latency, so it keeps its slot\n *  when it's merely a little slower than a public peer. ~700ms covers the normal\n *  EU/SIN advantage envelope. */\nconst OUR_NODE_BIAS_MS = 700\n/** Hard ceiling on the bias: once our node is this many× the fastest proven peer, the\n *  forgiveness is dropped and it ranks on raw latency. Guarantees our node CAN be\n *  demoted when it's genuinely slow (US 6–20s) instead of being pinned #1 forever. */\nconst OUR_NODE_DEMOTE_RATIO = 2.5\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  OUR_NODE_BIAS_MS,\n  OUR_NODE_DEMOTE_RATIO\n})\n\n/** Hosts we operate (no public rate limit). Biased so the fleet prefers its own\n *  unlimited node where it is fast, and only steps off it when it is genuinely slow.\n *  Matched by hostname so a path/trailing-slash can't defeat it. */\nconst OUR_NODE_HOSTS = new Set(['hapi.ecency.com', 'api.ecency.com'])\nfunction isOurNode(node: string): boolean {\n  try {\n    return OUR_NODE_HOSTS.has(new URL(node).hostname)\n  } catch {\n    return false\n  }\n}\n\n/** @internal Exported for testing only. */\nexport class NodeHealthTracker {\n  private health = new Map<string, NodeHealth>()\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.\n      h.apiFailures.delete(api)\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: { count: number; cooldownUntil: number; lastFailureTime: number } =\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   * 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    const fastest = this.fastestUsableLatency(healthy, now)\n    // Every score in THIS pass is computed against the same `fastest` and falls back\n    // to config index on ties → a total, transitive order with no memo (so no\n    // stale-denominator inversions).\n    const ordered = healthy\n      .map((node, i) => ({ node, i, score: this.scoreNode(node, fastest, 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  /** Fastest usable EWMA among the given nodes; Infinity if none is profiled yet. */\n  private fastestUsableLatency(nodes: string[], now: number): number {\n    let min = Infinity\n    for (const n of nodes) {\n      const h = this.health.get(n)\n      if (this.isLatencyUsable(h, now)) min = Math.min(min, h!.ewmaLatencyMs!)\n    }\n    return min\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). Our own node is\n   * forgiven OUR_NODE_BIAS_MS of extra latency — bounded by OUR_NODE_DEMOTE_RATIO so it\n   * is genuinely demoted when slow rather than pinned #1.\n   */\n  private scoreNode(node: string, fastest: number, now: number): number {\n    const h = this.health.get(node)\n    if (!this.isLatencyUsable(h, now)) return LATENCY_UNPROVEN_PRIOR_MS\n    const lat = h!.ewmaLatencyMs!\n    if (isOurNode(node)) {\n      const overCeiling =\n        fastest > 0 && fastest !== Infinity && lat > OUR_NODE_DEMOTE_RATIO * fastest\n      if (overCeiling) return lat // demoted: raw latency, no forgiveness\n      return Math.max(lat - OUR_NODE_BIAS_MS, 0)\n    }\n    return lat\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<void> {\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<T>(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}): Promise<T> {\n  const {\n    method,\n    params,\n    api,\n    primary,\n    hedgePool,\n    callerTimeout,\n    explicitTimeout,\n    deadlineAt,\n    externalSignal,\n    onHedgeFired\n  } = opts\n  return new Promise<T>((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<typeof setTimeout> | 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          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 * @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 <T = any>(\n  method: string,\n  params: any[] | object = [],\n  timeout?: number,\n  retry = config.retry,\n  signal?: AbortSignal\n): Promise<T> => {\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<string>()\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<T>({\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        })\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      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 <T = any>(\n  method: string,\n  params: any[] | object = [],\n  timeout = config.broadcastTimeout,\n  signal?: AbortSignal\n): Promise<T> => {\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<string>()\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<APIMethods, string> = {\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<string, any>,\n  timeout?: number,\n  retry = config.retry,\n  signal?: AbortSignal\n): Promise<any> {\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<string>()\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<string, any>)\n    const processedPathParams = new Set<string>()\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. hapi) 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. hapi 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 <T = any>(\n  method: string,\n  params: any[] | object = [],\n  quorum = 2,\n  signal?: AbortSignal\n): Promise<T> => {\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<any>[] = []\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<string, any[]>()\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<O extends OperationName>(\n    operationName: O,\n    operationBody: OperationBody<O>\n  ): Promise<void> {\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<BroadcastResult> {\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<TransactionStatus> {\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 = <number>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: <any>[]\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<TransactionConfirmation> {\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<OperationName>\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<BroadcastResult> {\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<OperationName>\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 } 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<TransactionConfirmation | BroadcastResult> {\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<TransactionConfirmation | BroadcastResult> {\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<string, Error> = 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<T>(\n  mutationKey: MutationKey = [],\n  username: string | undefined,\n  operations: (payload: T) => Operation[],\n  onSuccess: UseMutationOptions<unknown, Error, T>[\"onSuccess\"] = () => {},\n  auth?: AuthContextV2,\n  authority: AuthorityLevel = 'posting',\n  options?: {\n    onMutate?: UseMutationOptions<unknown, Error, T>[\"onMutate\"];\n    onError?: UseMutationOptions<unknown, Error, T>[\"onError\"];\n    onSettled?: UseMutationOptions<unknown, Error, T>[\"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      // New: Try auth methods in fallback chain (if enabled)\n      if (auth?.enableFallback !== false && auth?.adapter) {\n        return broadcastWithFallback(username, ops, auth, authority, broadcastMode);\n      }\n\n      // Legacy behavior: try methods in fixed order (backward compatible)\n      if (auth?.broadcast) {\n        return 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 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    },\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<T>(\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<void> {\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\nexport const CONFIG = {\n  privateApiHost: \"https://ecency.com\",\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  queryClient: new QueryClient(),\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   * 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   * 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<Record<APIMethods, string[]>>) {\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<ResilienceOptions>) {\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\nexport function makeQueryClient() {\n  // Cache creates one single instance per request in a server side\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<T>(queryKey: QueryKey) {\n    const queryClient = getQueryClient();\n    return queryClient.getQueryData<T>(queryKey);\n  }\n\n  export function getInfiniteQueryData<T>(queryKey: QueryKey) {\n    const queryClient = getQueryClient();\n    return queryClient.getQueryData<InfiniteData<T>>(queryKey);\n  }\n\n  export async function prefetchQuery<T>(options: UseQueryOptions<T>) {\n    const queryClient = getQueryClient();\n    await queryClient.prefetchQuery(options);\n    return getQueryData<T>(options.queryKey);\n  }\n\n  export async function prefetchInfiniteQuery<T, P>(\n    options: UseInfiniteQueryOptions<\n      T,\n      Error,\n      InfiniteData<T>,\n      QueryKey,\n      P\n    >\n  ) {\n    const queryClient = getQueryClient();\n    await queryClient.prefetchInfiniteQuery(options);\n    return getInfiniteQueryData<T>(options.queryKey);\n  }\n\n  export function generateClientServerQuery<T>(options: UseQueryOptions<T>) {\n    return {\n      prefetch: () => prefetchQuery(options),\n      getData: () => getQueryData<T>(options.queryKey),\n      useClientQuery: () => useQuery(options),\n      fetchAndGet: () => getQueryClient().fetchQuery(options),\n    };\n  }\n\n  export function generateClientServerInfiniteQuery<T, P>(\n    options: UseInfiniteQueryOptions<\n      T,\n      Error,\n      InfiniteData<T>,\n      QueryKey,\n      P\n    >\n  ) {\n    return {\n      prefetch: () => prefetchInfiniteQuery(options),\n      getData: () => getInfiniteQueryData<T>(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<T>(response: any): response is WrappedResponse<T> {\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<T>(\n  response: T[] | WrappedResponse<T>,\n  limit: number\n): WrappedResponse<T> {\n  if (isWrappedResponse<T>(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<DynamicProps> => {\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<RewardFund>,\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, target: string) =>\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    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  // 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    _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 { 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}\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<AiGenerationResponse> => {\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          }),\n        }\n      );\n\n      if (!response.ok) {\n        const body = await response.text();\n        let parsed: Record<string, unknown> = {};\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      return (await response.json()) as AiGenerationResponse;\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<AiAssistResponse> => {\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<string, unknown> = {};\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 { 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<FullAccount, \"follow_stats\" | \"reputation\" | \"profile\">;\n\n/** Minimal shape read from `bridge.get_profile` (hivemind social profile): it carries\n *  both the reputation score and the follower/following counts. */\ninterface BridgeProfile {\n  reputation?: number;\n  stats?: { followers?: number; following?: number };\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<RawAccount[]>(\n          \"condenser_api.get_accounts\",\n          [[username]],\n          undefined,\n          undefined,\n          signal\n        ),\n        callRPC<BridgeProfile>(\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      const profile = parseProfileMetadata(response[0].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: response[0].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: response[0].name,\n        owner: response[0].owner,\n        active: response[0].active,\n        posting: response[0].posting,\n        memo_key: response[0].memo_key,\n        post_count: response[0].post_count,\n        created: response[0].created,\n        posting_json_metadata: response[0].posting_json_metadata,\n        last_vote_time: response[0].last_vote_time,\n        last_post: response[0].last_post,\n        json_metadata: response[0].json_metadata,\n        reward_hive_balance: response[0].reward_hive_balance,\n        reward_hbd_balance: response[0].reward_hbd_balance,\n        reward_vesting_hive: response[0].reward_vesting_hive,\n        reward_vesting_balance: response[0].reward_vesting_balance,\n        balance: response[0].balance,\n        hbd_balance: response[0].hbd_balance,\n        savings_balance: response[0].savings_balance,\n        savings_hbd_balance: response[0].savings_hbd_balance,\n        savings_hbd_last_interest_payment:\n          response[0].savings_hbd_last_interest_payment,\n        savings_hbd_seconds_last_update:\n          response[0].savings_hbd_seconds_last_update,\n        savings_hbd_seconds: response[0].savings_hbd_seconds,\n        next_vesting_withdrawal: response[0].next_vesting_withdrawal,\n        pending_claimed_accounts: response[0].pending_claimed_accounts,\n        vesting_shares: response[0].vesting_shares,\n        delegated_vesting_shares: response[0].delegated_vesting_shares,\n        received_vesting_shares: response[0].received_vesting_shares,\n        vesting_withdraw_rate: response[0].vesting_withdraw_rate,\n        to_withdraw: response[0].to_withdraw,\n        withdrawn: response[0].withdrawn,\n        witness_votes: response[0].witness_votes,\n        proxy: response[0].proxy,\n        recovery_account: response[0].recovery_account,\n        proxied_vsf_votes: response[0].proxied_vsf_votes,\n        voting_manabar: response[0].voting_manabar,\n        voting_power: response[0].voting_power,\n        downvote_manabar: response[0].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<string, unknown> {\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<T extends Record<string, unknown>>(target: T, source: Record<string, unknown>): T {\n  const result = { ...target } as Record<string, unknown>;\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<AccountProfile> | 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<FullAccount, \"posting_json_metadata\"> | null\n): AccountProfile {\n  return parseProfileMetadata(data?.posting_json_metadata);\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<string, unknown> {\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<AccountProfile> | 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<string, unknown>,\n    profileRest as Record<string, unknown>,\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<FullAccount[]> => {\n      const response = (await callRPC(\"condenser_api.get_accounts\", [usernames])) 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<AccountFollowStats>,\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<Follow[]>,\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<Follow[]>,\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/**\n * Get list of users that an account has muted\n *\n * @param username - The account username\n * @param limit - Maximum number of results (default: 100)\n */\nexport function getMutedUsersQueryOptions(username: string | undefined, limit = 100) {\n  return queryOptions({\n    queryKey: QueryKeys.accounts.mutedUsers(username!),\n    queryFn: async () => {\n      const response = (await callRPC(\"condenser_api.get_following\", [\n        username,\n        \"\",\n        \"ignore\",\n        limit,\n      ])) as Follow[];\n\n      return response.map((user) => user.following);\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<string[]>,\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<AccountProfile[\"tokens\"]>[number];\n\nexport type WalletMetadataCandidate = Partial<AccountProfileToken> & {\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<CheckUsernameWalletsPendingResponse>({\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<string, unknown> =\n              walletItem.meta && typeof walletItem.meta === \"object\"\n                ? { ...(walletItem.meta as Record<string, unknown>) }\n                : {};\n\n            const sanitizedMeta: Record<string, unknown> = {};\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,\n  target: string\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      return (await callRPC(\"bridge.get_relationship_between_accounts\", [reference, target])) 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<AccountBookmark>(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<AccountFavorite>(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<GetRecoveriesEmailResponse[]>;\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<AccountReputation[]> => {\n      if (!query) {\n        return [];\n      }\n\n      return callRPC(\"condenser_api.get_account_reputations\", [query, limit]) as Promise<AccountReputation[]>;\n    },\n  });\n}\n","import { 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<OperationGroup, number[]> = {\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<string, unknown>;\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<string, unknown>): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\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<TxPageRaw, Error, TxPageRaw, (string | number)[], TxCursor>({\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<string, string | number> = {\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<string[]>;\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<ReferralItem[]>;\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 { 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<FriendsPage, Error, FriendsPage, (string | number)[], FriendsPageParam>({\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<FriendSearchResult[]> => {\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<Fragment[]>;\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<Fragment>(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<T extends any>(\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<Vote[]>;\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<Entry> =>\n      callRPC(\"condenser_api.get_content\", [\n        author,\n        permlink,\n      ]) as Promise<Entry>,\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<Entry[]> =>\n      callRPC(\"condenser_api.get_content_replies\", {\n        author,\n        permlink,\n      }) as Promise<Entry[]>,\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<Entry | null>;\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<Entry | null> {\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<string, unknown> | unknown[];\n\nexport function bridgeApiCall<T>(endpoint: string, params: BridgeParams, signal?: AbortSignal): Promise<T> {\n  return callRPC(`bridge.${endpoint}`, params, undefined, undefined, signal) as Promise<T>;\n}\n\nexport async function resolvePost(\n  post: Entry,\n  observer: string,\n  num?: number,\n  signal?: AbortSignal\n): Promise<Entry> {\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<Entry[]> {\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<Entry[] | null> {\n  const resp = await bridgeApiCall<Entry[] | null>(\"get_ranked_posts\", {\n    sort,\n    start_author,\n    start_permlink,\n    limit,\n    tag,\n    observer,\n  }, signal);\n\n  if (resp) {\n    return resolvePosts(resp, observer, signal);\n  }\n\n  return resp;\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<Entry[] | null> {\n  if (CONFIG.dmcaAccounts.includes(account)) {\n    return [];\n  }\n\n  const resp = await bridgeApiCall<Entry[] | null>(\"get_account_posts\", {\n    sort,\n    account,\n    start_author,\n    start_permlink,\n    limit,\n    observer,\n  }, signal);\n\n  if (resp) {\n    return resolvePosts(resp, observer, signal);\n  }\n\n  return resp;\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<Entry | undefined> {\n  const resp = await bridgeApiCall<Entry | null>(\"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<Entry | null> {\n  const resp = await bridgeApiCall<Entry | null>(\"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<Record<string, Entry> | null> {\n  const resp = await bridgeApiCall<Record<string, Entry> | null>(\"get_discussion\", {\n    author,\n    permlink,\n    observer: observer || author,\n  });\n\n  if (resp) {\n    const validatedResp: Record<string, Entry> = {};\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<Community | null> {\n  return bridgeApiCall<Community | null>(\"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<Community[] | null> {\n  return bridgeApiCall<Community[] | null>(\"list_communities\", {\n    last,\n    limit,\n    query,\n    sort,\n    observer,\n  });\n}\n\nexport async function normalizePost(post: unknown): Promise<Entry | null> {\n  const resp = await bridgeApiCall<Entry | null>(\"normalize_post\", { post });\n  return resp ? validateEntry(resp) : resp;\n}\n\nexport async function getSubscriptions(account: string): Promise<Subscription[] | null> {\n  return bridgeApiCall<Subscription[] | null>(\"list_all_subscriptions\", { account });\n}\n\nexport async function getSubscribers(community: string): Promise<Subscription[] | null> {\n  return bridgeApiCall<Subscription[] | null>(\"list_subscribers\", { community });\n}\n\nexport async function getRelationshipBetweenAccounts(\n  follower: string,\n  following: string\n): Promise<AccountRelationship | null> {\n  return bridgeApiCall<AccountRelationship | null>(\"get_relationship_between_accounts\", [\n    follower,\n    following,\n  ]);\n}\n\nexport async function getProfiles(\n  accounts: string[],\n  observer?: string\n): Promise<Profile[]> {\n  return bridgeApiCall<Profile[]>(\"get_profiles\", { accounts, observer });\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 { 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  return queryOptions({\n    queryKey: QueryKeys.posts.discussions(entry?.author, entry?.permlink, order, observer || entry?.author),\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: observer || entry.author,\n      });\n\n      const results = response\n        ? Array.from(Object.values(response as Record<string, Entry>))\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  return queryOptions({\n    queryKey: QueryKeys.posts.discussion(author, permlink, observer || author),\n    enabled: enabled && !!author && !!permlink,\n    queryFn: async () =>\n      getDiscussion(author, permlink, observer) as Promise<Record<string, Entry> | null>,\n  });\n}\n","import { QueryKeys } from \"@/modules/core\";\nimport { 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<Page, Error, Page, (string | number)[], PageParam>({\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 { 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  hasNextPage: boolean;\n};\n\ninterface GetPostsRankedOptions {\n  resolvePosts?: boolean;\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<Entry[], Error, Entry[], (string | number)[], PageParam>({\n    queryKey: QueryKeys.posts.postsRanked(sort, tag, limit, observer),\n    queryFn: async ({ pageParam, signal }: { pageParam: PageParam; signal: AbortSignal }) => {\n      if (!pageParam.hasNextPage) {\n        return [];\n      }\n\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      const data = response as Entry[];\n\n      // Capture pinned entries BEFORE the in-place created-date sort: the\n      // bridge surfaces them at the head of the response in the community\n      // moderators' chosen order, which the sort would scatter by age.\n      // Keep EVERY pin — the previous post-sort find() kept a single pin and\n      // silently dropped the rest, so multi-pin communities never displayed\n      // their other pinned posts on any page. Pins only occur on the first\n      // page (cursor pages return none), so this is a no-op elsewhere.\n      const pinnedEntries = data.filter((s) => s.stats?.is_pinned);\n\n      // Sort by created date unless it's \"hot\"\n      const sorted =\n        sort === \"hot\"\n          ? data\n          : data.sort(\n              (a, b) =>\n                new Date(b.created).getTime() - new Date(a.created).getTime()\n            );\n\n      const nonPinnedEntries = sorted.filter((s) => !s.stats?.is_pinned);\n\n      const combined = [...pinnedEntries, ...nonPinnedEntries];\n      return filterDmcaEntry(combined);\n    },\n    enabled,\n    initialPageParam: {\n      author: undefined,\n      permlink: undefined,\n      hasNextPage: true,\n    } as PageParam,\n    getNextPageParam: (lastPage: Entry[]) => {\n      const last = lastPage?.[lastPage.length - 1];\n      return {\n        author: last?.author,\n        permlink: last?.permlink,\n        hasNextPage: (lastPage?.length ?? 0) > 0,\n      };\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<Schedule[]>;\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<Schedule>(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<Draft[]>;\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<Draft>(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<UserImage[]> {\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<UserImage[]>;\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<UserImage>(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<CommentHistory>;\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<CommentHistory>;\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\nexport function getPostTipsQueryOptions(author: string, permlink: string, isEnabled = true) {\n  return queryOptions({\n    queryKey: QueryKeys.posts.tips(author, permlink),\n    queryFn: async () => {\n      const response = await fetch(CONFIG.privateApiHost + \"/private-api/post-tips\", {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify({\n          author,\n          permlink,\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<PostTipsResponse>;\n    },\n    enabled: !!author && !!permlink && isEnabled,\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<Entry[]> {\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<WavesFeedEntry[]> {\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<ShortsFeedEntry[]> {\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 { 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<ThreadsResult | null> {\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<WavesPage, Error, WavesPage, string[], WavesCursor>({\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<WaveTrendingTag[]> => {\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<WaveTrendingAuthor[]> => {\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<Entry | null>,\n  });\n}\n","import { 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<F>(\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    VoteHistoryPage,\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<Profile[]>,\n  });\n}\n","import { 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    BalanceHistoryPage,\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<string, string | number> = {\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. The list changes slowly, so it stays fresh for ~5 minutes.\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<ProMembersResponse>;\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<string> {\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} from \"../utils/profile-metadata\";\n\ninterface Payload {\n  profile: Partial<AccountProfile>;\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<Payload>) => {\n      // Prefer the freshest cached snapshot. onMutate has just refetched the\n      // account from chain, so this reflects the current on-chain profile\n      // rather than a possibly stale/unloaded render-time value.\n      const account =\n        queryClient.getQueryData<FullAccount>(\n          getAccountFullQueryOptions(username).queryKey\n        ) ?? data;\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<Payload>) => {\n      // Optimistic cache update\n      queryClient.setQueryData<FullAccount>(\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<AccountRelationship> | 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<AccountRelationship>;\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<string, any>\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<string, string>,\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<string, any>\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<string, any> | 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<FollowPayload>(\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<UnfollowPayload>(\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<AccountFavorite[]>(listKey);\n      if (previousList) {\n        qc.setQueryData<AccountFavorite[]>(\n          listKey,\n          previousList.filter((f) => f.account !== account)\n        );\n      }\n\n      const previousCheck = qc.getQueryData<boolean>(checkKey);\n      qc.setQueryData<boolean>(checkKey, false);\n\n      const infiniteQueries = qc.getQueriesData<InfiniteData<WrappedResponse<AccountFavorite>>>({\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<Record<keyof Keys, string[]>>; // 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<string, number>();\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<unknown, Error, Payload>,\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<unknown, Error, Payload>,\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<unknown, Error, CommonPayload>,\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<FullAccount>(\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<unknown, Error, CommonPayload>,\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        return fetchApi(CONFIG.privateApiHost + \"/private-api/recoveries-add\", {\n          method: \"POST\",\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      } 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<string>\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<unknown, Error, Payload>,\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<ClaimAccountPayload>(\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<GrantPostingPermissionPayload>(\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<CreateAccountPayload>(\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<string, AuthorityLevel> = {\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<Fragment> | 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      return response.json() as Promise<Fragment>;\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<Fragment[]>(\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<InfiniteData<WrappedResponse<Fragment>>>(\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      return response.json() as Promise<Fragment>;\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<Fragment[]>(\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<InfiniteData<WrappedResponse<Fragment>>>(\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      return 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    onSuccess(_data, variables) {\n      const queryClient = getQueryClient();\n\n      // Update regular query cache\n      queryClient.setQueryData<Fragment[]>(\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<InfiniteData<WrappedResponse<Fragment>>>(\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<T>(response: Response): Promise<T> {\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<ApiResponse<Record<string, unknown>>> {\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<Record<string, unknown>>(response);\n  return { status: response.status, data };\n}\n\nexport async function subscribeEmail(\n  email: string\n): Promise<ApiResponse<Record<string, unknown>>> {\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<Record<string, unknown>>(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<void> {\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<ApiNotification[]> {\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<ApiNotification[]>(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<ApiNotificationSetting> {\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<ApiNotificationSetting>(response);\n}\n\nexport async function getNotificationSetting(\n  code: string | undefined,\n  username: string,\n  token: string\n): Promise<ApiNotificationSetting> {\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<ApiNotificationSetting>(response);\n}\n\nexport async function markNotifications(\n  code: string | undefined,\n  id?: string\n): Promise<Record<string, unknown>> {\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<Record<string, unknown>>(response);\n}\n\nexport async function addImage(code: string | undefined, url: string): Promise<Record<string, unknown>> {\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<Record<string, unknown>>(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<Record<string, unknown>> {\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<Record<string, unknown>>(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<Record<string, unknown>> {\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<Record<string, unknown>>(response);\n}\n\nexport async function addSchedule(\n  code: string | undefined,\n  permlink: string,\n  title: string,\n  body: string,\n  meta: Record<string, unknown>,\n  options: Record<string, unknown> | null,\n  schedule: string,\n  reblog: boolean\n): Promise<Record<string, unknown>> {\n  const data: Record<string, unknown> = {\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<Record<string, unknown>>(response);\n}\n\nexport async function deleteSchedule(\n  code: string | undefined,\n  id: string\n): Promise<Record<string, unknown>> {\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<Record<string, unknown>>(response);\n}\n\nexport async function moveSchedule(code: string | undefined, id: string): Promise<Schedule[]> {\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<Schedule[]>(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<Record<string, unknown>> {\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<Record<string, unknown>>(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<Draft[]>(listKey);\n      if (previousList) {\n        qc.setQueryData<Draft[]>(\n          listKey,\n          previousList.filter((d) => d._id !== draftId)\n        );\n      }\n\n      const infiniteQueries = qc.getQueriesData<InfiniteData<WrappedResponse<Draft>>>({\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<string, unknown>;\n      options: Record<string, unknown> | 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<UserImage[]>(\n        [\"posts\", \"images\", username],\n        (prev) => prev?.filter((img) => img._id !== imageId)\n      );\n\n      // Optimistic removal from infinite cache pages\n      qc.setQueriesData<InfiniteData<WrappedResponse<UserImage>>>(\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<Entry>(\n    QueryKeys.posts.entry(makeEntryPath(author, permlink))\n  );\n}\n\nfunction setEntryInCache(entry: Entry, qc?: QueryClient) {\n  const queryClient = qc ?? getQueryClient();\n  queryClient.setQueryData<Entry>(\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<Entry>(QueryKeys.posts.entry(path));\n  if (!existing) return undefined;\n\n  const updated = updater(existing);\n  queryClient.setQueryData<Entry>(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 { EntriesCacheManagement } from \"../cache/entries-cache-management\";\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 * 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<VotePayload>(\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\n      const entry = EntriesCacheManagement.getEntry(variables.author, variables.permlink);\n      if (entry?.active_votes) {\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        );\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(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<ReblogPayload>(\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<string, any>;\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<CommentPayload>(\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<Entry[]>({\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<Entry[]>(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<readonly unknown[], Entry[]> {\n  const queryClient = qc ?? getQueryClient();\n  const snapshots = new Map<readonly unknown[], Entry[]>();\n\n  const queries = queryClient.getQueriesData<Entry[]>({\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<Entry[]>(\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<readonly unknown[], Entry[]>,\n  qc?: QueryClient\n) {\n  const queryClient = qc ?? getQueryClient();\n  for (const [queryKey, data] of snapshots) {\n    queryClient.setQueryData<Entry[]>(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<Entry>,\n  qc?: QueryClient\n): Entry | undefined {\n  const queryClient = qc ?? getQueryClient();\n  const path = `/@${author}/${permlink}`;\n  const previous = queryClient.getQueryData<Entry>(QueryKeys.posts.entry(path));\n\n  if (previous) {\n    queryClient.setQueryData<Entry>(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<Entry>(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<DeleteCommentPayload>(\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<readonly unknown[], Entry[]> }) ?? {};\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<string, any>;\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.<br><br>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<CrossPostPayload>(\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<string, any>;\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<UpdateReplyPayload>(\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<PromotePayload>(\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<Entry> {\n  return callRPC(\"condenser_api.get_content\", [\n    author,\n    permlink,\n  ]) as Promise<Entry>;\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<LeaderBoardItem[]>;\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        curator.efficiency = curator.vests / 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<PageStatsResponse>;\n    },\n    enabled: !!url,\n    // Analytics data should always be fresh - users expect current stats when changing range\n    staleTime: 0,\n  });\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\";\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<RCAccount[]> => {\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.<i18nKey>.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<StreakFreezeBuyResult> {\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<SubscribeCommunityPayload>(\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<UnsubscribeCommunityPayload>(\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<MutePostPayload>(\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<SetCommunityRolePayload>(\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<Community>(\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<UpdateCommunityPayload>(\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<Community>(\n        { queryKey: QueryKeys.communities.singlePrefix(community) },\n        (prev) => {\n          if (!prev) return prev;\n          return { ...prev, ...(variables as unknown as Partial<Community>) };\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<CommunityRewardsRegisterPayload>(\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<PinPostPayload>(\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<Community | null>,\n  });\n}\n","import { queryOptions } from \"@tanstack/react-query\";\nimport { QueryKeys } from \"@/modules/core\";\nimport { Subscription } from \"../types\";\nimport { callRPC } from \"@/modules/core/hive-tx\";\n\n/**\n * Get list of subscribers for a community\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 () => {\n      const response = await callRPC(\"bridge.list_subscribers\", {\n        community: communityName,\n      });\n      return (response as Subscription[] | null) ?? [];\n    },\n    staleTime: 60000,\n  });\n}\n","import { 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<NotifPage, Error, NotifPage, (string | number)[], NotifCursor>({\n    queryKey: QueryKeys.communities.accountNotifications(account, limit),\n    initialPageParam: null as NotifCursor,\n\n    queryFn: async ({ pageParam }: { pageParam: NotifCursor }) => {\n      try {\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      } catch {\n        return [];\n      }\n    },\n\n    getNextPageParam: (lastPage: NotifPage): NotifCursor =>\n      lastPage?.length > 0 ? 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<RewardedCommunity[]>;\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<string, string[]> = {\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<Array<string>>;\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}\n","export enum NotifyTypes {\n  VOTE = 1,\n  MENTION = 2,\n  FOLLOW = 3,\n  COMMENT = 4,\n  RE_BLOG = 5,\n  TRANSFERS = 6,\n  FAVORITES = 13,\n  BOOKMARKS = 15,\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.FAVORITES,\n  NotifyTypes.BOOKMARKS,\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<ApiNotificationSetting>;\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<NotificationPage>;\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        throw new Error(\"[SDK][Notifications] – missing auth for markNotifications\");\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      // 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<InfiniteNotificationData>({\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<number>(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<SetLastReadPayload>(\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 { 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<ProposalVoteRow[], Error, ProposalVoteRow[], (string | number)[], Cursor>({\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<ProposalVotePayload>(\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<ProposalCreatePayload>(\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<AccountDelegations>,\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<ConversionRequest[]>,\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<CollateralizedConversionRequest[]>,\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<SavingsWithdrawRequest[]>,\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<WithdrawRoute[]>,\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<OpenOrdersData[]>,\n    select: (data) => data.sort((a, b) => a.orderid - b.orderid),\n    enabled: !!user,\n  });\n}\n","import { 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<RcPage, Error, RcPage, (string | number)[], RcCursor>({\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<IncomingRcResponse> => {\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<IncomingRcResponse>;\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<RecurrentTransfer[]>,\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<string, unknown>;\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<string, unknown>;\n  if (record.data && typeof record.data === \"object\") {\n    containers.push(record.data as Record<string, unknown>);\n  }\n  if (record.result && typeof record.result === \"object\") {\n    containers.push(record.result as Record<string, unknown>);\n  }\n  if (record.portfolio && typeof record.portfolio === \"object\") {\n    containers.push(record.portfolio as Record<string, unknown>);\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<string, unknown>)[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<string, unknown>;\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<PortfolioResponse> => {\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<string, unknown> | undefined)?.fiatCurrency ??\n          (payload as Record<string, unknown> | 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<DynamicProps>(\n        getDynamicPropsQueryOptions().queryKey\n      );\n      const accountData = getQueryClient().getQueryData<FullAccount>(\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<FullAccount>(\n        getAccountFullQueryOptions(username).queryKey\n      );\n      const dynamicProps = getQueryClient().getQueryData<DynamicProps>(\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<DynamicProps>(\n        getDynamicPropsQueryOptions().queryKey\n      );\n      const accountData = getQueryClient().getQueryData<FullAccount>(\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<number, HiveOperationName> =\n  Object.entries(operationOrders).reduce((acc, [name, id]) => {\n    acc[id] = name as HiveOperationName;\n    return acc;\n  }, {} as Record<number, HiveOperationName>);\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<number>();\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<HiveTransaction[]>({\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<HiveTransaction[]>({\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<string>(\n    Array.isArray(filters) ? filters : [filters]\n  );\n  const hasAllFilter =\n    userSelectedOperations.has(\"\" as any) || userSelectedOperations.size === 0;\n\n  return infiniteQueryOptions<HiveTransaction[]>({\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<WithdrawRoute[]>,\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<DelegatedVestingShare[]>,\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<OrdersData>,\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<MarketStatistics>,\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<MarketCandlestickDataItem[]>,\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<MarketData>;\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<OrdersDataItem[]>,\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<LimitOrderCreatePayload>(\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<LimitOrderCancelPayload>(\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<T>(response: Response): Promise<T> {\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<MarketData> {\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<MarketData>(response);\n}\n\nexport async function getCurrencyRate(cur: string): Promise<number> {\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<string, number> }>(response);\n  return data.hive_dollar[cur];\n}\n\nexport async function getCurrencyTokenRate(currency: string, token: string): Promise<number> {\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<number>(response);\n}\n\nexport async function getCurrencyRates(): Promise<CurrencyRates> {\n  const fetchApi = getBoundFetch();\n  const response = await fetchApi(CONFIG.privateApiHost + \"/private-api/market-data/latest\");\n  return parseJsonResponse<CurrencyRates>(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<T>(payload: Record<string, unknown>): Promise<T> {\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<T>(\n  payload: Record<string, unknown>,\n  fallback: T\n): Promise<T> {\n  try {\n    return await engineRpc<T>(payload);\n  } catch (e) {\n    return fallback;\n  }\n}\n\nexport async function getHiveEngineOrderBook<T = EngineOrderBookEntry>(\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<T[]>(\n      {\n        ...baseParams,\n        params: {\n          ...baseParams.params,\n          table: \"buyBook\",\n          indexes: [{ index: \"price\", descending: true }],\n        },\n      },\n      []\n    ),\n    engineRpcSafe<T[]>(\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<T = Record<string, unknown>>(\n  symbol: string,\n  limit: number = 50\n): Promise<T[]> {\n  return engineRpcSafe<T[]>(\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<T = HiveEngineOpenOrder>(\n  account: string,\n  symbol: string,\n  limit: number = 100\n): Promise<T[]> {\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<EngineOrderBookEntry[]>(\n      {\n        ...baseParams,\n        params: {\n          ...baseParams.params,\n          table: \"buyBook\",\n          indexes: [{ index: \"timestamp\", descending: true }],\n        },\n      },\n      []\n    ),\n    engineRpcSafe<EngineOrderBookEntry[]>(\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\nexport async function getHiveEngineMetrics<T = Record<string, unknown>>(\n  symbol?: string,\n  account?: string\n): Promise<T[]> {\n  return engineRpcSafe<T[]>(\n    {\n      jsonrpc: \"2.0\",\n      method: \"find\",\n      params: {\n        contract: \"market\",\n        table: \"metrics\",\n        query: {\n          ...(symbol ? { symbol } : {}),\n          ...(account ? { account } : {}),\n        },\n      },\n      id: 1,\n    },\n    []\n  );\n}\n\nexport async function getHiveEngineTokensMarket<T = Record<string, unknown>>(\n  account?: string,\n  symbol?: string\n): Promise<T[]> {\n  return getHiveEngineMetrics<T>(symbol, account);\n}\n\nexport async function getHiveEngineTokensBalances<T = Record<string, unknown>>(\n  username: string\n): Promise<T[]> {\n  return engineRpcSafe<T[]>(\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<T = Record<string, unknown>>(\n  tokens: string[]\n): Promise<T[]> {\n  return engineRpcSafe<T[]>(\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<T = Record<string, unknown>>(\n  username: string,\n  symbol: string,\n  limit: number,\n  offset: number\n): Promise<T[]> {\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<T = Record<string, unknown>>(\n  symbol: string,\n  interval = \"daily\"\n): Promise<T[]> {\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<T = Record<string, unknown>>(\n  username: string\n): Promise<Record<string, T>> {\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<string, T>;\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<HiveEngineTokenBalance>(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<HiveEngineMarketResponse>();\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<HiveEngineTokenMetadataResponse>(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<HiveEngineTransaction[]>({\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<HiveEngineTransaction>(\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<HiveEngineMetric>(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<HiveEngineTokenStatus>(\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\n) {\n  return queryOptions({\n    queryKey: [\"assets\", \"hive-engine\", \"all-tokens\", account, symbol] as const,\n    queryFn: async () => {\n      return getHiveEngineTokensMarket<HiveEngineTokenInfo>(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 { getHiveEngineTokensBalances, getHiveEngineTokensMetadata } 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<HiveEngineTokenBalance>(account);\n\n      const tokens = await getHiveEngineTokensMetadata<Token>(\n        balances.map((t) => t.symbol)\n      );\n\n      const pricePerHive = dynamicProps\n        ? dynamicProps.base / dynamicProps.quote\n        : 0;\n      const metrics: ReadonlyArray<HiveEngineTokenInfo> = Array.isArray(\n        allTokens\n      )\n        ? allTokens\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 { getHiveEngineTokensMarketQueryOptions } from \"./get-hive-engine-tokens-market-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<GeneralAssetInfo>(\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      const marketList = await queryClient.ensureQueryData(\n        getHiveEngineTokensMarketQueryOptions()\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<GeneralAssetInfo>(qo.queryKey);\n  };\n\n  const convertPriceToUserCurrency = async (\n    assetInfo: GeneralAssetInfo | undefined\n  ): Promise<GeneralAssetInfo | undefined> => {\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<TransferPayload>(\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<TransferPointPayload>(\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<DelegateVestingSharesPayload>(\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<SetWithdrawVestingRoutePayload>(\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<TransferEngineTokenPayload>(\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<TransferToSavingsPayload>(\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<TransferFromSavingsPayload>(\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<TransferToVestingPayload>(\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<WithdrawVestingPayload>(\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<ConvertPayload>(\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<ClaimInterestPayload>(\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<string, ReturnType<typeof setTimeout>>();\n\nexport function useClaimRewards(username: string | undefined, auth?: AuthContextV2,\n  broadcastMode?: BroadcastMode\n) {\n  return useBroadcastMutation<ClaimRewardsPayload>(\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<DelegateEngineTokenPayload>(\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<UndelegateEngineTokenPayload>(\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<StakeEngineTokenPayload>(\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<UnstakeEngineTokenPayload>(\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<ClaimEngineRewardsPayload>(\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<EngineMarketOrderPayload>(\n    [\"wallet\", \"engine-market-order\"],\n    username,\n    (payload) => {\n      let contractPayload: Record<string, string>;\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<WalletOperationPayload>(\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<DelegateRcPayload>(\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<WitnessVotePayload>(\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<WitnessProxyPayload>(\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 { 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<WitnessPage, Error, WitnessPage, (string | number)[], WitnessCursor>({\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","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\nexport function useClaimPoints(\n  username: string | undefined,\n  accessToken: string | undefined,\n  onSuccess?: () => void,\n  onError?: Parameters<typeof useMutation>[\"0\"][\"onError\"]\n) {\n  const { mutateAsync: recordActivity } = EcencyAnalytics.useRecordActivity(\n    username,\n    \"points-claimed\"\n  );\n\n  return useMutation({\n    mutationFn: async () => {\n      if (!username) {\n        throw new Error(\n          \"[SDK][Points][Claim] – username wasn't provided\"\n        );\n      }\n\n      if (!accessToken) {\n        throw new Error(\n          \"[SDK][Points][Claim] – access token wasn't found\"\n        );\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      if (!response.ok) {\n        const body = await response.text();\n        if (response.status === 406) {\n          try {\n            return JSON.parse(body);\n          } catch {\n            return { message: body, code: response.status };\n          }\n        }\n        throw new Error(\n          `[SDK][Points][Claim] – failed with status ${response.status}${body ? `: ${body}` : \"\"}`\n        );\n      }\n\n      return response.json();\n    },\n    onError,\n    onSuccess: () => {\n      recordActivity();\n\n      getQueryClient().setQueryData<Points>(\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","import { infiniteQueryOptions, queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, INTERNAL_API_TIMEOUT_MS, withTimeoutSignal, QueryKeys } from \"@/modules/core\";\nimport { SearchResponse } from \"../types/search-response\";\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        },\n        body: JSON.stringify(data),\n        signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n      });\n\n      if (!response.ok) {\n        throw new Error(`Search failed: ${response.status}`);\n      }\n\n      return response.json() as Promise<SearchResponse>;\n    },\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<SearchResponse, Error, SearchResponse, (string | number)[], PageParam>({\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        },\n        body: JSON.stringify(data),\n        signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n      });\n\n      if (!response.ok) {\n        throw new Error(`Search failed: ${response.status}`);\n      }\n\n      return response.json() as Promise<SearchResponse>;\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  });\n}\n","import { CONFIG, INTERNAL_API_TIMEOUT_MS, getBoundFetch, withTimeoutSignal } from \"@/modules/core\";\nimport { SearchResponse } from \"./types/search-response\";\n\ntype RequestError = Error & { status?: number; data?: unknown };\n\nasync function parseJsonResponse<T>(response: Response): Promise<T> {\n  const parseBody = async (): Promise<unknown> => {\n    try {\n      return await response.json();\n    } catch {\n      try {\n        return await response.text();\n      } catch {\n        return undefined;\n      }\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) {\n    throw new Error(\"Response body was empty or invalid JSON\");\n  }\n\n  return data as T;\n}\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<SearchResponse> {\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    },\n    body: JSON.stringify(data),\n    signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n  });\n\n  return parseJsonResponse<SearchResponse>(response);\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<SearchResponse> {\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    },\n    body: JSON.stringify(params),\n    signal: withTimeoutSignal(timeoutMs, signal),\n  });\n\n  return parseJsonResponse<SearchResponse>(response);\n}\n\nexport async function searchPath(q: string, signal?: AbortSignal): Promise<string[]> {\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    },\n    body: JSON.stringify({ q }),\n    signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n  });\n\n  const data = await parseJsonResponse<string[]>(response);\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<string>();\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<Profile[]> => {\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<string[]> => {\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\";\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        },\n        body: JSON.stringify(payload),\n        signal: withTimeoutSignal(INTERNAL_API_TIMEOUT_MS, signal),\n      });\n\n      if (!response.ok) {\n        throw new Error(`Search failed: ${response.status}`);\n      }\n\n      return response.json() as Promise<SearchResponse>;\n    },\n    initialPageParam: undefined as string | undefined,\n    getNextPageParam: (lastPage: SearchResponse) => lastPage?.scroll_id,\n    enabled: !!q,\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        },\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 } 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<RcDelegationActive | null> => {\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<BoostPlusAccountPrice | null> => {\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<BoostPlusPayload>(\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<RcDelegationPayload>(\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<HsTokenRenewResponse> {\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    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 { queryOptions } from \"@tanstack/react-query\";\nimport { CONFIG, QueryKeys } from \"@/modules/core\";\nimport { getBoundFetch } from \"@/modules/core/utils\";\nimport type { Poll, PollChoice, PollVoter, PollStats } from \"../types\";\n\nfunction normalizePoll(raw: Record<string, unknown>): Poll {\n  const pollChoices = (raw.poll_choices as Record<string, unknown>[] | undefined) ?? [];\n  const pollVoters = (raw.poll_voters as Record<string, unknown>[] | undefined) ?? [];\n  const rawStats = raw.poll_stats as Record<string, unknown> | undefined;\n\n  const choices: PollChoice[] = pollChoices.map((c) => {\n    const votes = c.votes as Record<string, unknown> | 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    gcTime: 30 * 60 * 1000,\n    queryFn: async (): Promise<Poll> => {\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<PollVotePayload>(\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"]}