@ecency/sdk 2.3.15 → 2.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/{hive-DfGQ3XAe.d.ts → hive-fkgMnAQs.d.ts} +21 -1
- package/dist/browser/hive.d.ts +1 -1
- package/dist/browser/hive.js +2 -2
- package/dist/browser/hive.js.map +1 -1
- package/dist/browser/index.d.ts +10 -2
- package/dist/browser/index.js +3 -3
- package/dist/browser/index.js.map +1 -1
- package/dist/node/hive.cjs +2 -2
- package/dist/node/hive.cjs.map +1 -1
- package/dist/node/hive.mjs +2 -2
- package/dist/node/hive.mjs.map +1 -1
- package/dist/node/index.cjs +3 -3
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.mjs +3 -3
- package/dist/node/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/node/hive.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hive-tx/Transaction.ts","../../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/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"],"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","setNodes","nodes","validNodes","n","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","RPCError","rpcError","NodeError","node","rateLimitMs","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","e","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","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","api","durationMs","now","existing","retryAfterMs","blockNum","recent","apiFail","best","healthy","unhealthy","fastest","ordered","d","probe","min","lat","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","recordError","tracker","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","retryAfter","cooldownMs","jitterDelay","callRPC","retry","triedInRound","lastError","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","v","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"],"mappings":"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","file":"hive.mjs","sourcesContent":["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 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","/**\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://hapi.ecency.com',\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://techcoderx.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 * 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/**\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 */\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = [\n ...new Set(\n nodes\n .map((n) => n.trim())\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n if (!validNodes.length) return\n config.nodes = validNodes\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// ── 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 rateLimitMs: number\n constructor(node: string, message: string, rateLimitMs = 0) {\n super(message)\n this.node = node\n this.rateLimitMs = rateLimitMs\n }\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 /** 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/**\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/** 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 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 }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 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 this.recordLatency(h, durationMs)\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): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs)\n }\n\n /** Fold a latency sample into the node's EWMA (warmup + usability bookkeeping). */\n private recordLatency(h: NodeHealth, durationMs: number): 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.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\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\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 recordRateLimit(node: string, retryAfterMs = 10_000): void {\n const h = this.getOrCreate(node)\n h.rateLimitedUntil = Date.now() + retryAfterMs\n h.consecutiveFailures++\n h.lastFailureTime = Date.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\nconst rpcHealthTracker = new NodeHealthTracker()\n// Exported for the co-located spec only (asserting the call sites' effect on health).\n// Not re-exported by hive-tx/index.ts, so it is NOT part of the package's public API.\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\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.rateLimitMs > 0) {\n tracker.recordRateLimit(node, e.rateLimitMs)\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 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' },\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 const retryAfter = res.headers.get('Retry-After')\n const cooldownMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 10_000\n throw new NodeError(url, `HTTP 429 Rate Limited`, cooldownMs)\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// ── 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)\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 = config.timeout,\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 const api = apiOf(method)\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 // 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 const callStart = Date.now()\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart)\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)\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: config.retry)\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 = config.timeout,\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 // 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 // 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 const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\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 })\n if (response.status === 404) {\n throw new Error('HTTP 404 - Hint: can happen on wrong params')\n }\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After')\n const cooldownMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 10_000\n restHealthTracker.recordRateLimit(node, cooldownMs)\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)\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)\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 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hive-tx/Transaction.ts","../../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/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"],"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","setNodes","nodes","validNodes","n","setUserAgent","ua","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","rateLimitMs","PRE_CONNECTION_ERRORS","BROWSER_NETWORK_ERRORS","flattenErrorText","e","parts","cause","depth","isBroadcastSafeToRetry","text","code","msg","isNodeLevelRPCError","apiOf","method","dot","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","api","durationMs","now","existing","retryAfterMs","blockNum","recent","apiFail","best","healthy","unhealthy","fastest","ordered","d","probe","min","lat","threshold","cand","candTouch","touch","rpcHealthTracker","restHealthTracker","recordError","tracker","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","retryAfter","cooldownMs","jitterDelay","callRPC","retry","triedInRound","lastError","attempt","orderedNodes","callStart","callRPCBroadcast","triedNodes","apiMethods","callREST","endpoint","apiNodes","alreadyRecorded","baseUrl","path","paramObj","processedPathParams","v","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"],"mappings":"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","file":"hive.mjs","sourcesContent":["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 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","/**\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://hapi.ecency.com',\n 'https://api.hive.blog',\n 'https://rpc.mahdiyari.info',\n 'https://techcoderx.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/**\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 */\nexport const setNodes = (nodes: string[]): void => {\n const validNodes = [\n ...new Set(\n nodes\n .map((n) => n.trim())\n .filter((n) => n.length > 0 && /^https?:\\/\\/.+/.test(n))\n )\n ]\n if (!validNodes.length) return\n config.nodes = validNodes\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","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 rateLimitMs: number\n constructor(node: string, message: string, rateLimitMs = 0) {\n super(message)\n this.node = node\n this.rateLimitMs = rateLimitMs\n }\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 /** 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/**\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/** 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 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 }\n this.health.set(node, h)\n }\n return h\n }\n\n recordSuccess(node: string, api?: string, durationMs?: number): void {\n const h = this.getOrCreate(node)\n h.consecutiveFailures = 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 this.recordLatency(h, durationMs)\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): void {\n if (!Number.isFinite(durationMs) || durationMs < LATENCY_SLOW_FAILURE_MS) return\n this.recordLatency(this.getOrCreate(node), durationMs)\n }\n\n /** Fold a latency sample into the node's EWMA (warmup + usability bookkeeping). */\n private recordLatency(h: NodeHealth, durationMs: number): 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.\n if (h.latencyUpdatedAt > 0 && now - h.latencyUpdatedAt > LATENCY_MAX_AGE_MS) {\n h.ewmaLatencyMs = undefined\n h.latencySampleCount = 0\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\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 recordRateLimit(node: string, retryAfterMs = 10_000): void {\n const h = this.getOrCreate(node)\n h.rateLimitedUntil = Date.now() + retryAfterMs\n h.consecutiveFailures++\n h.lastFailureTime = Date.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\nconst rpcHealthTracker = new NodeHealthTracker()\n// Exported for the co-located spec only (asserting the call sites' effect on health).\n// Not re-exported by hive-tx/index.ts, so it is NOT part of the package's public API.\n// @internal\nexport const restHealthTracker = new NodeHealthTracker()\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.rateLimitMs > 0) {\n tracker.recordRateLimit(node, e.rateLimitMs)\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 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 const retryAfter = res.headers.get('Retry-After')\n const cooldownMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 10_000\n throw new NodeError(url, `HTTP 429 Rate Limited`, cooldownMs)\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// ── 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)\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 = config.timeout,\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 const api = apiOf(method)\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 // 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 const callStart = Date.now()\n try {\n const res = await jsonRPCCall(node, method, params, timeout, false, signal)\n rpcHealthTracker.recordSuccess(node, api, Date.now() - callStart)\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)\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: config.retry)\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 = config.timeout,\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 // 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 // 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 const { signal: tSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeout)\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 const retryAfter = response.headers.get('Retry-After')\n const cooldownMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 10_000\n restHealthTracker.recordRateLimit(node, cooldownMs)\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)\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)\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 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"]}
|