@argonprotocol/mainchain 1.3.3 → 1.3.5
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/browser/index.d.ts +18 -10
- package/browser/index.js +58 -47
- package/browser/index.js.map +1 -1
- package/lib/{chunk-UZCZ347U.js → chunk-2J7IEVVC.js} +3 -3
- package/lib/chunk-2J7IEVVC.js.map +1 -0
- package/lib/{chunk-IQ3TNLS7.cjs → chunk-BP7Y2NWQ.cjs} +52 -52
- package/lib/{chunk-IQ3TNLS7.cjs.map → chunk-BP7Y2NWQ.cjs.map} +1 -1
- package/lib/{chunk-FCT7GMFN.js → chunk-GZ2TLGCG.js} +64 -53
- package/lib/{chunk-FCT7GMFN.js.map → chunk-GZ2TLGCG.js.map} +1 -1
- package/lib/{chunk-OFYVHBKG.cjs → chunk-P5WWWRSU.cjs} +119 -108
- package/lib/chunk-P5WWWRSU.cjs.map +1 -0
- package/lib/cli.cjs +6 -6
- package/lib/cli.js +2 -2
- package/lib/clis/index.cjs +3 -3
- package/lib/clis/index.js +2 -2
- package/lib/index.cjs +4 -2
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +18 -10
- package/lib/index.d.ts +18 -10
- package/lib/index.js +3 -1
- package/package.json +2 -2
- package/lib/chunk-OFYVHBKG.cjs.map +0 -1
- package/lib/chunk-UZCZ347U.js.map +0 -1
package/browser/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/WageProtector.ts","../src/config.ts","../src/TxSubmitter.ts","../src/utils.ts","../src/AccountRegistry.ts","../src/BlockWatch.ts","../src/FrameCalculator.ts","../src/AccountMiners.ts","../src/Accountset.ts","../src/MiningBids.ts","../src/Vault.ts","../src/VaultMonitor.ts","../src/CohortBidder.ts","../src/BidPool.ts","../src/BitcoinLocks.ts","../src/keyringUtils.ts","../src/index.ts"],"names":["BN","BigNumber","ExtrinsicError","config","ROUND_FLOOR","hexToU8a","result","printTable","maxWidth","u8aToHex"],"mappings":"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","file":"index.js","sourcesContent":["import { ArgonClient } from './index';\n\nexport interface IArgonCpiSnapshot {\n // The target price of the argon as a fixed point number (18 decimals)\n argonUsdTargetPrice: bigint;\n // The current price of the argon as a fixed point number (18 decimals)\n argonUsdPrice: bigint;\n // The block hash in which the cpi was finalized\n finalizedBlock: Uint8Array;\n tick: bigint;\n}\n\n/**\n * The WageProtector class is used to protect wages from inflation by using the current Argon Price Index to adjust the\n * baseAmount to current conditions. This ensures that the wage is always stable and does not lose or gain value based on\n * demand for the argon or fiat monetary supply changes.\n */\nexport class WageProtector {\n constructor(public latestCpi: IArgonCpiSnapshot) {}\n\n /**\n * Converts the base wage to the current wage using the latest CPI snapshot\n *\n * @param baseWage The base wage to convert\n * @returns The protected wage\n */\n public getProtectedWage(baseWage: bigint): bigint {\n return (baseWage * this.latestCpi.argonUsdTargetPrice) / this.latestCpi.argonUsdPrice;\n }\n\n /**\n * Subscribes to the current CPI and calls the callback function whenever the CPI changes\n * @param client The ArgonClient to use\n * @param callback The callback function to call when the CPI changes\n * @returns An object with an unsubscribe function that can be called to stop the subscription\n */\n public static async subscribe(\n client: ArgonClient,\n callback: (cpi: WageProtector) => void,\n ): Promise<{\n unsubscribe: () => void;\n }> {\n const unsubscribe = await client.query.priceIndex.current(async cpi => {\n if (cpi.isNone) {\n return;\n }\n const finalizedBlock = await client.rpc.chain.getFinalizedHead();\n\n callback(\n new WageProtector({\n argonUsdTargetPrice: cpi.value.argonUsdTargetPrice.toBigInt(),\n argonUsdPrice: cpi.value.argonUsdPrice.toBigInt(),\n finalizedBlock: new Uint8Array(finalizedBlock),\n tick: cpi.value.tick.toBigInt(),\n }),\n );\n });\n return { unsubscribe };\n }\n\n /**\n * Creates a new WageProtector instance by subscribing to the current CPI and waiting for the first value\n * @param client The ArgonClient to use\n */\n public static async create(client: ArgonClient): Promise<WageProtector> {\n return new Promise<WageProtector>(async (resolve, reject) => {\n try {\n const { unsubscribe } = await WageProtector.subscribe(client, x => {\n resolve(x);\n unsubscribe();\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n","export interface ArgonClientConfig {\n debug?: boolean;\n keysVersion?: number;\n keysMnemonic?: string;\n subaccountRange?: string;\n}\n\nlet config: ArgonClientConfig = {};\n\n// Safe environment variable access that works in both Node.js and browser\nfunction getEnvVar(key: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key];\n }\n return undefined;\n}\n\nexport function setConfig(newConfig: ArgonClientConfig): void {\n config = { ...config, ...newConfig };\n}\n\nexport function getConfig(): ArgonClientConfig {\n return {\n debug: config.debug ?? getEnvVar('DEBUG') === 'true',\n keysVersion:\n config.keysVersion ??\n (getEnvVar('KEYS_VERSION') ? parseInt(getEnvVar('KEYS_VERSION')!) : undefined),\n keysMnemonic: config.keysMnemonic ?? getEnvVar('KEYS_MNEMONIC'),\n subaccountRange: config.subaccountRange ?? getEnvVar('SUBACCOUNT_RANGE') ?? '0-9',\n };\n}\n","import type { ISubmittableResult } from '@polkadot/types/types/extrinsic';\nimport {\n ArgonClient,\n dispatchErrorToExtrinsicError,\n ExtrinsicError,\n GenericEvent,\n KeyringPair,\n waitForLoad,\n} from './index';\nimport type { SubmittableExtrinsic } from '@polkadot/api/promise/types';\nimport type { SignerOptions } from '@polkadot/api/types';\nimport { getConfig } from './config';\n\nexport function logExtrinsicResult(result: ISubmittableResult) {\n if (getConfig().debug) {\n const json = result.status.toJSON() as any;\n const status = Object.keys(json)[0];\n console.debug('Transaction update: \"%s\"', status, json[status]);\n }\n}\n\nexport class TxSubmitter {\n constructor(\n public readonly client: ArgonClient,\n public tx: SubmittableExtrinsic,\n public pair: KeyringPair,\n ) {}\n\n public async feeEstimate(tip?: bigint): Promise<bigint> {\n const { partialFee } = await this.tx.paymentInfo(this.pair, { tip });\n return partialFee.toBigInt();\n }\n\n public async canAfford(\n options: {\n tip?: bigint;\n unavailableBalance?: bigint;\n includeExistentialDeposit?: boolean;\n } = {},\n ): Promise<{ canAfford: boolean; availableBalance: bigint; txFee: bigint }> {\n const { tip, unavailableBalance } = options;\n const account = await this.client.query.system.account(this.pair.address);\n let availableBalance = account.data.free.toBigInt();\n if (unavailableBalance) {\n availableBalance -= unavailableBalance;\n }\n const existentialDeposit = options.includeExistentialDeposit\n ? this.client.consts.balances.existentialDeposit.toBigInt()\n : 0n;\n const fees = await this.feeEstimate(tip);\n const totalCharge = fees + (tip ?? 0n);\n const canAfford = availableBalance > totalCharge + existentialDeposit;\n return { canAfford, availableBalance, txFee: fees };\n }\n\n public async submit(\n options: Partial<SignerOptions> & {\n logResults?: boolean;\n waitForBlock?: boolean;\n useLatestNonce?: boolean;\n onResultCallback?: (result: ISubmittableResult) => void;\n } = {},\n ): Promise<TxResult> {\n const { logResults, waitForBlock, useLatestNonce, ...apiOptions } = options;\n await waitForLoad();\n const result = new TxResult(this.client, logResults);\n result.onResultCallback = options.onResultCallback;\n let toHuman = (this.tx.toHuman() as any).method as any;\n let txString = [];\n let api = formatCall(toHuman);\n const args: any[] = [];\n if (api === 'proxy.proxy') {\n toHuman = toHuman.args.call;\n txString.push('Proxy');\n api = formatCall(toHuman);\n }\n if (api.startsWith('utility.batch')) {\n const calls = toHuman.args.calls.map(formatCall).join(', ');\n txString.push(`Batch[${calls}]`);\n } else {\n txString.push(api);\n args.push(toHuman.args);\n }\n args.unshift(txString.join('->'));\n if (useLatestNonce && !apiOptions.nonce) {\n apiOptions.nonce = await this.client.rpc.system.accountNextIndex(this.pair.address);\n }\n\n console.log('Submitting transaction from %s:', this.pair.address, ...args);\n await this.tx.signAndSend(this.pair, apiOptions, result.onResult.bind(result));\n if (waitForBlock) {\n await result.inBlockPromise;\n }\n return result;\n }\n}\n\nfunction formatCall(call: any): string {\n return `${call.section}.${call.method}`;\n}\n\nexport class TxResult {\n public inBlockPromise: Promise<Uint8Array>;\n public finalizedPromise: Promise<Uint8Array>;\n public status?: ISubmittableResult['status'];\n public readonly events: GenericEvent[] = [];\n\n /**\n * The index of the batch that was interrupted, if any.\n */\n public batchInterruptedIndex?: number;\n public includedInBlock?: Uint8Array;\n /**\n * The final fee paid for the transaction, including the fee tip.\n */\n public finalFee?: bigint;\n /**\n * The fee tip paid for the transaction.\n */\n public finalFeeTip?: bigint;\n\n public onResultCallback?: (result: ISubmittableResult) => void;\n\n private inBlockResolve!: (blockHash: Uint8Array) => void;\n private inBlockReject!: (error: ExtrinsicError) => void;\n private finalizedResolve!: (blockHash: Uint8Array) => void;\n private finalizedReject!: (error: ExtrinsicError) => void;\n\n constructor(\n private readonly client: ArgonClient,\n private shouldLog: boolean = false,\n ) {\n this.inBlockPromise = new Promise((resolve, reject) => {\n this.inBlockResolve = resolve;\n this.inBlockReject = reject;\n });\n this.finalizedPromise = new Promise((resolve, reject) => {\n this.finalizedResolve = resolve;\n this.finalizedReject = reject;\n });\n // drown unhandled\n this.inBlockPromise.catch(() => {});\n this.finalizedPromise.catch(() => {});\n }\n\n public onResult(result: ISubmittableResult) {\n this.status = result.status;\n if (this.shouldLog) {\n logExtrinsicResult(result);\n }\n const { events, status, dispatchError, isFinalized } = result;\n if (status.isInBlock) {\n this.includedInBlock = new Uint8Array(status.asInBlock);\n let encounteredError = dispatchError;\n let batchErrorIndex: number | undefined;\n for (const event of events) {\n this.events.push(event.event);\n if (this.client.events.utility.BatchInterrupted.is(event.event)) {\n batchErrorIndex = event.event.data[0].toNumber();\n this.batchInterruptedIndex = batchErrorIndex;\n encounteredError = event.event.data[1] as any;\n }\n if (this.client.events.transactionPayment.TransactionFeePaid.is(event.event)) {\n const [_who, actualFee, tip] = event.event.data;\n this.finalFee = actualFee.toBigInt();\n this.finalFeeTip = tip.toBigInt();\n }\n }\n\n if (encounteredError) {\n const error = dispatchErrorToExtrinsicError(this.client, encounteredError, batchErrorIndex);\n this.reject(error);\n } else {\n this.inBlockResolve(new Uint8Array(status.asInBlock));\n }\n }\n if (isFinalized) {\n this.finalizedResolve(status.asFinalized);\n }\n this.onResultCallback?.(result);\n }\n\n private reject(error: ExtrinsicError) {\n this.inBlockReject(error);\n this.finalizedReject(error);\n }\n}\n","import BigNumber, * as BN from 'bignumber.js';\nimport type { ArgonClient, GenericEvent } from './index';\nimport type { DispatchError } from '@polkadot/types/interfaces';\nimport { EventRecord } from '@polkadot/types/interfaces/system';\nimport { hexToU8a } from '@polkadot/util';\n\nconst { ROUND_FLOOR } = BN;\n\nexport const MICROGONS_PER_ARGON = 1_000_000;\n\nexport function formatArgons(x: bigint | number): string {\n if (x === undefined || x === null) return 'na';\n const isNegative = x < 0;\n let format = BigNumber(x.toString()).abs().div(MICROGONS_PER_ARGON).toFormat(2, ROUND_FLOOR);\n if (format.endsWith('.00')) {\n format = format.slice(0, -3);\n }\n return `${isNegative ? '-' : ''}₳${format}`;\n}\n\nexport function formatPercent(x: BigNumber | undefined): string {\n if (!x) return 'na';\n return `${x.times(100).decimalPlaces(3)}%`;\n}\n\ntype NonNullableProps<T> = {\n [K in keyof T]-?: Exclude<T[K], undefined | null>;\n};\n\nexport function filterUndefined<T extends Record<string, any>>(\n obj: Partial<T>,\n): NonNullableProps<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value !== undefined && value !== null),\n ) as NonNullableProps<T>;\n}\n\nexport async function gettersToObject<T>(obj: T): Promise<T> {\n if (obj === null || obj === undefined || typeof obj !== 'object') return obj;\n\n const keys = [];\n // eslint-disable-next-line guard-for-in\n for (const key in obj) {\n keys.push(key);\n }\n\n if (Symbol.iterator in obj) {\n const iterableToArray = [];\n // @ts-ignore\n for (const item of obj) {\n iterableToArray.push(await gettersToObject(item));\n }\n return iterableToArray as any;\n }\n\n const result = {} as any;\n for (const key of keys) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n // Skip functions\n if (descriptor && typeof descriptor.value === 'function') {\n continue;\n }\n const value = descriptor && descriptor.get ? descriptor.get.call(obj) : obj[key as keyof T];\n if (typeof value === 'function') continue;\n\n result[key] = await gettersToObject(value);\n }\n return result;\n}\n\nexport function toFixedNumber(\n value: string | number | BigNumber, // accept string to avoid early precision loss\n decimals: number,\n): bigint {\n const factor = new BigNumber(10).pow(decimals);\n const bn = new BigNumber(value);\n // truncate toward 0; use ROUND_FLOOR if you really need floor for positives\n const int = bn.times(factor).integerValue(BigNumber.ROUND_DOWN);\n return BigInt(int.toFixed(0));\n}\n\nexport function convertNumberToFixedU128(value: number): bigint {\n return toFixedNumber(value, 18);\n}\n\nexport function convertFixedU128ToBigNumber(fixedU128: bigint): BigNumber {\n const decimalFactor = new BigNumber(10).pow(new BigNumber(18)); // Fixed point precision (18 decimals)\n const rawValue = new BigNumber(fixedU128.toString()); // Parse the u128 string value into BN\n // Convert the value to fixed-point\n return rawValue.div(decimalFactor);\n}\n\nexport function convertPermillToBigNumber(permill: bigint): BigNumber {\n const decimalFactor = new BigNumber(1_000_000);\n const rawValue = new BigNumber(permill.toString()); // Parse the u128 string value into BN\n // Convert the value to fixed-point\n return rawValue.div(decimalFactor);\n}\n\nexport function convertNumberToPermill(value: number): bigint {\n return toFixedNumber(value, 6);\n}\n\nexport function eventDataToJson(event: GenericEvent): any {\n const obj = {} as any;\n event.data.forEach((data, index) => {\n const name = event.data.names?.[index];\n obj[name ?? `${index}`] = data.toJSON();\n });\n return obj;\n}\n\nexport function dispatchErrorToString(client: ArgonClient, error: DispatchError) {\n let message = error.toString();\n if (error.isModule) {\n const decoded = client.registry.findMetaError(error.asModule);\n const { docs, name, section } = decoded;\n message = `${section}.${name}: ${docs.join(' ')}`;\n }\n return message;\n}\n\n// ExtrinsicError\nexport class ExtrinsicError extends Error {\n constructor(\n public readonly errorCode: string,\n public readonly details?: string,\n public readonly batchInterruptedIndex?: number,\n ) {\n super(errorCode);\n }\n\n public override toString() {\n if (this.batchInterruptedIndex !== undefined) {\n return `${this.errorCode} ${this.details ?? ''} (Batch interrupted at index ${this.batchInterruptedIndex})`;\n }\n return `${this.errorCode} ${this.details ?? ''}`;\n }\n}\n\nexport function dispatchErrorToExtrinsicError(\n client: ArgonClient,\n error: DispatchError,\n batchInterruptedIndex?: number,\n) {\n if (error.isModule) {\n const decoded = client.registry.findMetaError(error.asModule);\n const { docs, name, section } = decoded;\n return new ExtrinsicError(`${section}.${name}`, docs.join(' '), batchInterruptedIndex);\n }\n return new ExtrinsicError(error.toString(), undefined, batchInterruptedIndex);\n}\n\n/**\n * Check for an extrinsic success event in the given events. Helpful to validate the result of an extrinsic inclusion in a block (it will be included even if it fails)\n * @param events The events to check\n * @param client The client to use\n * @returns A promise that resolves if the extrinsic was successful, and rejects if it failed\n */\nexport function checkForExtrinsicSuccess(\n events: EventRecord[],\n client: ArgonClient,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n for (const { event } of events) {\n if (client.events.system.ExtrinsicSuccess.is(event)) {\n resolve();\n } else if (client.events.system.ExtrinsicFailed.is(event)) {\n // extract the data for this event\n const [dispatchError] = event.data;\n let errorInfo = dispatchError.toString();\n\n if (dispatchError.isModule) {\n const decoded = client.registry.findMetaError(dispatchError.asModule);\n errorInfo = `${decoded.section}.${decoded.name}`;\n }\n\n reject(new Error(`${event.section}.${event.method}:: ExtrinsicFailed:: ${errorInfo}`));\n }\n }\n });\n}\n\n/**\n * JSON with support for BigInt in JSON.stringify and JSON.parse\n */\nexport class JsonExt {\n public static stringify(obj: any, space?: number): string {\n return JSON.stringify(\n obj,\n (_, v) => {\n if (typeof v === 'bigint') {\n return `${v}n`; // Append 'n' to indicate BigInt\n }\n // convert Uint8Array objects to a JSON representation\n if (v instanceof Uint8Array) {\n return {\n type: 'Buffer',\n data: Array.from(v), // Convert Uint8Array to an array of numbers\n };\n }\n return v;\n },\n space,\n );\n }\n\n public static parse<T = any>(str: string): T {\n return JSON.parse(str, (_, v) => {\n if (typeof v === 'string' && v.match(/^\\d+n$/)) {\n return BigInt(v.slice(0, -1));\n }\n // rehydrate Uint8Array objects\n if (typeof v === 'object' && v !== null && v.type === 'Buffer' && Array.isArray(v.data)) {\n return hexToU8a(v.data);\n }\n return v;\n });\n }\n}\n\nexport function createNanoEvents<Events extends EventsMap = DefaultEvents>(): TypedEmitter<Events> {\n return new TypedEmitter<Events>();\n}\n\nexport class TypedEmitter<Events extends EventsMap = DefaultEvents> {\n private events: Partial<{ [E in keyof Events]: Events[E][] }> = {};\n\n emit<K extends keyof Events>(this: this, event: K, ...args: Parameters<Events[K]>): void {\n for (const cb of this.events[event] || []) {\n cb(...args);\n }\n }\n\n on<K extends keyof Events>(this: this, event: K, cb: Events[K]): () => void {\n (this.events[event] ||= []).push(cb);\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i);\n };\n }\n}\n\ninterface EventsMap {\n [event: string]: any;\n}\n\ninterface DefaultEvents extends EventsMap {\n [event: string]: (...args: any) => void;\n}\n","export class AccountRegistry {\n public namedAccounts: Map<string, string> = new Map();\n public me: string = 'me';\n\n constructor(name?: string) {\n if (name) {\n this.me = name;\n }\n }\n\n public getName(address: string): string | undefined {\n return this.namedAccounts.get(address);\n }\n\n public register(address: string, name: string): void {\n this.namedAccounts.set(address, name);\n }\n\n public static factory: (name?: string) => AccountRegistry = name => new AccountRegistry(name);\n}\n","import { type ArgonClient, type GenericEvent } from './index';\nimport type { Header, SignedBlock } from '@polkadot/types/interfaces';\nimport { eventDataToJson, formatArgons } from './utils';\nimport { createNanoEvents } from './utils';\n\nexport type BlockWatchEvents = {\n block: (\n header: Header,\n digests: { tick: number; author: string },\n events: GenericEvent[],\n ) => void;\n 'vaults-updated': (header: Header, vaultIds: Set<number>) => void;\n 'bitcoin-verified': (\n header: Header,\n lockedBitcoin: { utxoId: number; vaultId: number; lockPrice: bigint },\n ) => void;\n 'mining-bid': (header: Header, bid: { amount: bigint; accountId: string }) => void;\n 'mining-bid-ousted': (\n header: Header,\n bid: {\n preservedArgonotHold: boolean;\n accountId: string;\n },\n ) => void;\n event: (header: Header, event: GenericEvent) => void;\n};\n\nexport function getTickFromHeader(client: ArgonClient, header: Header): number | undefined {\n for (const x of header.digest.logs) {\n if (x.isPreRuntime) {\n const [engineId, data] = x.asPreRuntime;\n if (engineId.toString() === 'aura') {\n return client.createType('u64', data).toNumber();\n }\n }\n }\n return undefined;\n}\n\nexport function getAuthorFromHeader(client: ArgonClient, header: Header): string | undefined {\n for (const x of header.digest.logs) {\n if (x.isPreRuntime) {\n const [engineId, data] = x.asPreRuntime;\n if (engineId.toString() === 'pow_') {\n return client.createType('AccountId32', data).toHuman();\n }\n }\n }\n return undefined;\n}\n\nexport class BlockWatch {\n public readonly events = createNanoEvents<BlockWatchEvents>();\n public readonly locksById: {\n [utxoId: number]: {\n vaultId: number;\n lockPrice: bigint;\n };\n } = {};\n private unsubscribe?: () => void;\n\n constructor(\n private readonly mainchain: Promise<ArgonClient>,\n private options: {\n finalizedBlocks?: boolean;\n shouldLog?: boolean;\n } = {},\n ) {\n this.options.shouldLog ??= true;\n this.options.finalizedBlocks ??= false;\n }\n\n public stop() {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = undefined;\n }\n }\n\n public async start() {\n await this.watchBlocks();\n }\n\n private async watchBlocks() {\n const client = await this.mainchain;\n const onBlock = async (header: Header) => {\n try {\n await this.processBlock(header);\n } catch (e) {\n console.error('Error processing block', e);\n }\n };\n if (this.options.finalizedBlocks) {\n this.unsubscribe = await client.rpc.chain.subscribeFinalizedHeads(onBlock);\n } else {\n this.unsubscribe = await client.rpc.chain.subscribeNewHeads(onBlock);\n }\n }\n\n private async processBlock(header: Header) {\n const client = await this.mainchain;\n\n if (this.options.shouldLog) {\n console.log(`-------------------------------------\nBLOCK #${header.number}, ${header.hash.toHuman()}`);\n }\n const blockHash = header.hash;\n const api = await client.at(blockHash);\n const isBlockVote = await api.query.blockSeal.isBlockFromVoteSeal();\n if (!isBlockVote) {\n console.warn('> Compute reactivated!');\n }\n const events = await api.query.system.events();\n const reloadVaults = new Set<number>();\n let block: SignedBlock | undefined = undefined;\n\n for (const { event, phase } of events) {\n const data = eventDataToJson(event);\n if (data.vaultId) {\n const vaultId = data.vaultId as number;\n reloadVaults.add(vaultId);\n }\n\n let logEvent = false;\n\n if (event.section === 'liquidityPools') {\n if (client.events.liquidityPools.BidPoolDistributed.is(event)) {\n const { bidPoolBurned, bidPoolDistributed } = event.data;\n data.burned = formatArgons(bidPoolBurned.toBigInt());\n data.distributed = formatArgons(bidPoolDistributed.toBigInt());\n logEvent = true;\n } else if (client.events.liquidityPools.NextBidPoolCapitalLocked.is(event)) {\n const { totalActivatedCapital } = event.data;\n data.totalActivatedCapital = formatArgons(totalActivatedCapital.toBigInt());\n logEvent = true;\n }\n } else if (event.section === 'bitcoinLocks') {\n if (client.events.bitcoinLocks.BitcoinLockCreated.is(event)) {\n const { lockPrice, utxoId, accountId, vaultId } = event.data;\n this.locksById[utxoId.toNumber()] = {\n vaultId: vaultId.toNumber(),\n lockPrice: lockPrice.toBigInt(),\n };\n data.lockPrice = formatArgons(lockPrice.toBigInt());\n data.accountId = accountId.toHuman();\n reloadVaults.add(vaultId.toNumber());\n }\n logEvent = true;\n } else if (event.section === 'mint') {\n logEvent = true;\n if (client.events.mint.MiningMint.is(event)) {\n const { amount } = event.data;\n data.amount = formatArgons(amount.toBigInt());\n }\n } else if (event.section === 'miningSlot') {\n logEvent = true;\n if (client.events.miningSlot.SlotBidderAdded.is(event)) {\n data.amount = formatArgons(event.data.bidAmount.toBigInt());\n this.events.emit('mining-bid', header, {\n amount: event.data.bidAmount.toBigInt(),\n accountId: event.data.accountId.toString(),\n });\n } else if (client.events.miningSlot.SlotBidderDropped.is(event)) {\n this.events.emit('mining-bid-ousted', header, {\n accountId: event.data.accountId.toString(),\n preservedArgonotHold: event.data.preservedArgonotHold.toPrimitive(),\n });\n }\n } else if (event.section === 'bitcoinUtxos') {\n logEvent = true;\n if (client.events.bitcoinUtxos.UtxoVerified.is(event)) {\n const { utxoId } = event.data;\n const details = await this.getBitcoinLockDetails(utxoId.toNumber(), blockHash);\n this.events.emit('bitcoin-verified', header, {\n utxoId: utxoId.toNumber(),\n vaultId: details.vaultId,\n lockPrice: details.lockPrice,\n });\n\n data.lockPrice = formatArgons(details.lockPrice);\n reloadVaults.add(details.vaultId);\n }\n } else if (event.section === 'system') {\n if (client.events.system.ExtrinsicFailed.is(event)) {\n const { dispatchError } = event.data;\n if (dispatchError.isModule) {\n const decoded = api.registry.findMetaError(dispatchError.asModule);\n const { name, section } = decoded;\n block ??= await client.rpc.chain.getBlock(header.hash);\n const extrinsicIndex = phase.asApplyExtrinsic.toNumber();\n const ext = block!.block.extrinsics[extrinsicIndex];\n // translate dispatchInfo into readable tx\n if (this.options.shouldLog) {\n console.log(\n `> [Failed Tx] ${section}.${name} -> ${ext.method.section}.${ext.method.method} (nonce=${ext.nonce})`,\n (ext.toHuman() as any)?.method?.args,\n );\n }\n } else {\n // Other, CannotLookup, BadOrigin, no extra info\n if (this.options.shouldLog) {\n console.log(`x [Failed Tx] ${dispatchError.toJSON()}`);\n }\n }\n }\n }\n if (this.options.shouldLog && logEvent) {\n console.log(`> ${event.section}.${event.method}`, data);\n }\n this.events.emit('event', header, event);\n }\n if (reloadVaults.size) this.events.emit('vaults-updated', header, reloadVaults);\n\n const tick = getTickFromHeader(client, header)!;\n const author = getAuthorFromHeader(client, header)!;\n\n this.events.emit(\n 'block',\n header,\n { tick, author },\n events.map(x => x.event),\n );\n }\n\n private async getBitcoinLockDetails(\n utxoId: number,\n blockHash: Uint8Array,\n ): Promise<{ vaultId: number; lockPrice: bigint }> {\n const client = await this.mainchain;\n const api = await client.at(blockHash);\n if (!this.locksById[utxoId]) {\n const lock = await api.query.bitcoinLocks.locksByUtxoId(utxoId);\n this.locksById[utxoId] = {\n vaultId: lock.value.vaultId.toNumber(),\n lockPrice: lock.value.lockPrice.toBigInt(),\n };\n }\n return this.locksById[utxoId];\n }\n}\n","import { type ArgonClient, getTickFromHeader, type Header } from './index';\n\n/**\n * A frame starts with the bidding start time (noon EDT), and ends the next day at noon EDT. Frame 0 was the first day of\n * bidding, and frame 1 began once the first miners were selected. This occurred on February 24th, 2025 at 12pm EDT.\n *\n * This class calculates fromeId from ticks.\n */\nexport class FrameCalculator {\n private miningConfig:\n | { ticksBetweenSlots: number; slotBiddingStartAfterTicks: number }\n | undefined;\n private genesisTick: number | undefined;\n\n async getForTick(client: ArgonClient, tick: number) {\n const { ticksBetweenFrames, biddingStartTick } = await this.getConfig(client);\n\n const ticksSinceMiningStart = tick - biddingStartTick;\n\n return Math.floor(ticksSinceMiningStart / ticksBetweenFrames);\n }\n\n async getTickRangeForFrame(client: ArgonClient, frameId: number): Promise<[number, number]> {\n const { ticksBetweenFrames, biddingStartTick } = await this.getConfig(client);\n\n const startingTick = biddingStartTick + Math.floor(frameId * ticksBetweenFrames);\n const endingTick = startingTick + ticksBetweenFrames - 1;\n\n return [startingTick, endingTick];\n }\n\n async getForHeader(client: ArgonClient, header: Header) {\n if (header.number.toNumber() === 0) return 0;\n const tick = getTickFromHeader(client, header);\n if (tick === undefined) return undefined;\n return this.getForTick(client, tick);\n }\n\n private async getConfig(client: ArgonClient) {\n this.miningConfig ??= await client.query.miningSlot.miningConfig().then(x => ({\n ticksBetweenSlots: x.ticksBetweenSlots.toNumber(),\n slotBiddingStartAfterTicks: x.slotBiddingStartAfterTicks.toNumber(),\n }));\n this.genesisTick ??= await client.query.ticks\n .genesisTick()\n .then((x: { toNumber: () => number }) => x.toNumber());\n const config = this.miningConfig!;\n const genesisTick = this.genesisTick!;\n return {\n ticksBetweenFrames: config.ticksBetweenSlots,\n slotBiddingStartAfterTicks: config.slotBiddingStartAfterTicks,\n genesisTick,\n biddingStartTick: genesisTick + config.slotBiddingStartAfterTicks,\n };\n }\n}\n","import { Accountset, IMiningIndex, ISubaccountMiner } from './Accountset';\nimport { Header } from '@polkadot/types/interfaces/runtime';\nimport { GenericEvent } from '@polkadot/types';\nimport { BlockWatch } from './BlockWatch';\nimport { FrameCalculator } from './FrameCalculator';\nimport { createNanoEvents } from './utils';\n\nexport class AccountMiners {\n public events = createNanoEvents<{\n mined: (\n header: Header,\n earnings: {\n author: string;\n argons: bigint;\n argonots: bigint;\n forCohortWithStartingFrameId: number;\n duringFrameId: number;\n },\n ) => void;\n minted: (\n header: Header,\n minted: {\n accountId: string;\n argons: bigint;\n forCohortWithStartingFrameId: number;\n duringFrameId: number;\n },\n ) => void;\n }>();\n\n public frameCalculator: FrameCalculator;\n\n private trackedAccountsByAddress: {\n [address: string]: {\n startingFrameId: number;\n subaccountIndex: number;\n };\n } = {};\n\n constructor(\n private accountset: Accountset,\n registeredMiners: (ISubaccountMiner & { seat: IMiningIndex })[],\n private options: { shouldLog: boolean } = { shouldLog: false },\n ) {\n this.frameCalculator = new FrameCalculator();\n for (const miner of registeredMiners) {\n this.trackedAccountsByAddress[miner.address] = {\n startingFrameId: miner.seat.startingFrameId,\n subaccountIndex: miner.subaccountIndex,\n };\n }\n }\n\n public async watch(): Promise<BlockWatch> {\n const blockWatch = new BlockWatch(this.accountset.client, {\n shouldLog: this.options.shouldLog,\n });\n blockWatch.events.on('block', this.onBlock.bind(this));\n await blockWatch.start();\n return blockWatch;\n }\n\n public async onBlock(\n header: Header,\n digests: { author: string; tick: number },\n events: GenericEvent[],\n ) {\n const { author, tick } = digests;\n if (author) {\n const voteAuthor = this.trackedAccountsByAddress[author];\n if (voteAuthor && this.options.shouldLog) {\n console.log('> Our vote author', this.accountset.accountRegistry.getName(author));\n }\n } else {\n console.warn('> No vote author found');\n }\n const client = await this.accountset.client;\n const currentFrameId = await this.frameCalculator.getForTick(client, tick);\n let newMiners: { frameId: number; addresses: string[] } | undefined;\n const dataByCohort: {\n duringFrameId: number;\n [cohortStartingFrameId: number]: {\n argonsMinted: bigint;\n argonsMined: bigint;\n argonotsMined: bigint;\n };\n } = { duringFrameId: currentFrameId };\n for (const event of events) {\n if (client.events.miningSlot.NewMiners.is(event)) {\n newMiners = {\n frameId: event.data.frameId.toNumber(),\n addresses: event.data.newMiners.map(x => x.accountId.toHuman()),\n };\n }\n if (client.events.blockRewards.RewardCreated.is(event)) {\n const { rewards } = event.data;\n for (const reward of rewards) {\n const { argons, ownership } = reward;\n\n const entry = this.trackedAccountsByAddress[author];\n if (entry) {\n dataByCohort[entry.startingFrameId] ??= {\n argonsMinted: 0n,\n argonsMined: 0n,\n argonotsMined: 0n,\n };\n dataByCohort[entry.startingFrameId].argonotsMined += ownership.toBigInt();\n dataByCohort[entry.startingFrameId].argonsMined += argons.toBigInt();\n this.events.emit('mined', header, {\n author,\n argons: argons.toBigInt(),\n argonots: ownership.toBigInt(),\n forCohortWithStartingFrameId: entry.startingFrameId,\n duringFrameId: currentFrameId,\n });\n }\n }\n }\n if (client.events.mint.MiningMint.is(event)) {\n const { perMiner } = event.data;\n const amountPerMiner = perMiner.toBigInt();\n if (amountPerMiner > 0n) {\n for (const [address, info] of Object.entries(this.trackedAccountsByAddress)) {\n const { startingFrameId } = info;\n dataByCohort[startingFrameId] ??= {\n argonsMinted: 0n,\n argonsMined: 0n,\n argonotsMined: 0n,\n };\n dataByCohort[startingFrameId].argonsMinted += amountPerMiner;\n this.events.emit('minted', header, {\n accountId: address,\n argons: amountPerMiner,\n forCohortWithStartingFrameId: startingFrameId,\n duringFrameId: currentFrameId,\n });\n }\n }\n }\n }\n if (newMiners) {\n this.newCohortMiners(newMiners.frameId, newMiners.addresses);\n }\n return dataByCohort;\n }\n\n private newCohortMiners(frameId: number, addresses: string[]) {\n for (const [address, info] of Object.entries(this.trackedAccountsByAddress)) {\n if (info.startingFrameId === frameId - 10) {\n delete this.trackedAccountsByAddress[address];\n }\n }\n for (const address of addresses) {\n const entry = this.accountset.subAccountsByAddress[address];\n if (entry) {\n this.trackedAccountsByAddress[address] = {\n startingFrameId: frameId,\n subaccountIndex: entry.index,\n };\n }\n }\n }\n\n public static async loadAt(\n accountset: Accountset,\n options: {\n blockHash?: Uint8Array;\n shouldLog?: boolean;\n } = {},\n ) {\n const seats = await accountset.miningSeats(options.blockHash);\n const registered = seats.filter(x => x.seat !== undefined);\n return new AccountMiners(accountset, registered as any, {\n shouldLog: options.shouldLog ?? false,\n });\n }\n}\n","import { type ArgonClient, getClient, Keyring, type KeyringPair } from './index';\nimport { dispatchErrorToString, formatArgons } from './utils';\nimport { logExtrinsicResult, TxSubmitter } from './TxSubmitter';\nimport { AccountRegistry } from './AccountRegistry';\nimport { SubmittableExtrinsic } from '@polkadot/api/promise/types';\nimport { AccountMiners } from './AccountMiners';\nimport { ApiDecoration } from '@polkadot/api/types';\nimport { getConfig } from './config';\nimport { u8aToHex } from '@polkadot/util';\n\nexport type SubaccountRange = readonly number[];\n\nexport type IAddressNames = Map<string, string>;\n\nexport interface ISubaccountMiner {\n address: string;\n subaccountIndex: number;\n seat?: IMiningIndex;\n isLastDay: boolean;\n}\n\nexport interface IMiningIndex {\n startingFrameId: number;\n index: number;\n bidAmount: bigint;\n}\n\nexport class Accountset {\n public txSubmitterPair: KeyringPair;\n public isProxy = false;\n public seedAddress: string;\n public subAccountsByAddress: {\n [address: string]: { index: number; pair?: KeyringPair };\n } = {};\n public accountRegistry: AccountRegistry;\n public readonly client: Promise<ArgonClient>;\n\n public get addresses(): string[] {\n return [this.seedAddress, ...Object.keys(this.subAccountsByAddress)];\n }\n\n public get namedAccounts(): IAddressNames {\n return this.accountRegistry.namedAccounts;\n }\n\n private readonly sessionKeyMnemonic: string | undefined;\n\n constructor(\n options: {\n client: Promise<ArgonClient>;\n accountRegistry?: AccountRegistry;\n subaccountRange?: SubaccountRange;\n sessionKeyMnemonic?: string;\n name?: string;\n } & (\n | { seedAccount: KeyringPair }\n | {\n seedAddress: string;\n isProxy: true;\n txSubmitter: KeyringPair;\n }\n ),\n ) {\n if ('seedAccount' in options) {\n this.txSubmitterPair = options.seedAccount;\n this.seedAddress = options.seedAccount.address;\n this.isProxy = false;\n } else {\n this.isProxy = options.isProxy;\n this.txSubmitterPair = options.txSubmitter;\n this.seedAddress = options.seedAddress;\n }\n this.sessionKeyMnemonic = options.sessionKeyMnemonic;\n this.accountRegistry = options.accountRegistry ?? AccountRegistry.factory(options.name);\n this.client = options.client;\n const defaultRange = options.subaccountRange ?? getDefaultSubaccountRange();\n this.accountRegistry.register(this.seedAddress, `${this.accountRegistry.me}//seed`);\n for (const i of defaultRange) {\n const pair = this.txSubmitterPair.derive(`//${i}`);\n this.subAccountsByAddress[pair.address] = { pair, index: i };\n this.accountRegistry.register(pair.address, `${this.accountRegistry.me}//${i}`);\n }\n }\n\n public async submitterBalance(blockHash?: Uint8Array): Promise<bigint> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const accountData = await api.query.system.account(this.txSubmitterPair.address);\n\n return accountData.data.free.toBigInt();\n }\n\n public async balance(blockHash?: Uint8Array): Promise<bigint> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const accountData = await api.query.system.account(this.seedAddress);\n\n return accountData.data.free.toBigInt();\n }\n\n public async totalArgonsAt(\n blockHash?: Uint8Array,\n ): Promise<{ address: string; amount: bigint; index: number }[]> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const addresses = this.addresses;\n const results = await api.query.system.account.multi(addresses);\n return results.map((account, i) => {\n const address = addresses[i];\n return {\n address,\n amount: account.data.free.toBigInt(),\n index: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async totalArgonotsAt(\n blockHash?: Uint8Array,\n ): Promise<{ address: string; amount: bigint; index: number }[]> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const addresses = this.addresses;\n const results = await api.query.ownership.account.multi(addresses);\n return results.map((account, i) => {\n const address = addresses[i];\n return {\n address,\n amount: account.free.toBigInt(),\n index: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async getAvailableMinerAccounts(\n maxSeats: number,\n ): Promise<{ index: number; isRebid: boolean; address: string }[]> {\n const miningSeats = await this.miningSeats();\n const subaccountRange = [];\n for (const seat of miningSeats) {\n if (seat.hasWinningBid) {\n continue;\n }\n if (seat.isLastDay || seat.seat === undefined) {\n subaccountRange.push({\n index: seat.subaccountIndex,\n isRebid: seat.seat !== undefined,\n address: seat.address,\n });\n if (subaccountRange.length >= maxSeats) {\n break;\n }\n }\n }\n return subaccountRange;\n }\n\n public async loadRegisteredMiners(api: ApiDecoration<'promise'>): Promise<ISubaccountMiner[]> {\n const addresses = Object.keys(this.subAccountsByAddress);\n const rawIndices = await api.query.miningSlot.accountIndexLookup.multi(addresses);\n const frameIds = [\n ...new Set(\n rawIndices\n .map(x => (x.isNone ? undefined : x.value[0].toNumber()))\n .filter(x => x !== undefined),\n ),\n ];\n const bidAmountsByFrame: { [frameId: number]: bigint[] } = {};\n if (frameIds.length) {\n console.log('Looking up cohorts for frames', frameIds);\n const cohorts = await api.query.miningSlot.minersByCohort.multi(frameIds);\n for (let i = 0; i < frameIds.length; i++) {\n const cohort = cohorts[i];\n const frameId = frameIds[i]!;\n bidAmountsByFrame[frameId] = cohort.map(x => x.bid.toBigInt());\n }\n }\n const addressToMiningIndex: { [address: string]: IMiningIndex } = {};\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n if (rawIndices[i].isNone) continue;\n const [frameIdRaw, indexRaw] = rawIndices[i].value;\n const frameId = frameIdRaw.toNumber();\n const index = indexRaw.toNumber();\n const bidAmount = bidAmountsByFrame[frameId]?.[index];\n addressToMiningIndex[address] = {\n startingFrameId: frameId,\n index,\n bidAmount: bidAmount ?? 0n,\n };\n }\n const nextFrameId = await api.query.miningSlot.nextFrameId();\n\n return addresses.map(address => {\n const cohort = addressToMiningIndex[address];\n let isLastDay = false;\n if (cohort !== undefined) {\n isLastDay = nextFrameId.toNumber() - cohort.startingFrameId === 10;\n }\n return {\n address,\n seat: cohort,\n isLastDay,\n subaccountIndex: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async miningSeats(blockHash?: Uint8Array): Promise<\n (ISubaccountMiner & {\n hasWinningBid: boolean;\n bidAmount?: bigint;\n })[]\n > {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const miners = await this.loadRegisteredMiners(api);\n\n const nextCohort = await api.query.miningSlot.bidsForNextSlotCohort();\n\n return miners.map(miner => {\n const bid = nextCohort.find(x => x.accountId.toHuman() === miner.address);\n return {\n ...miner,\n hasWinningBid: !!bid,\n bidAmount: bid?.bid.toBigInt() ?? miner.seat?.bidAmount ?? 0n,\n };\n });\n }\n\n public async bids(\n blockHash?: Uint8Array,\n ): Promise<{ address: string; bidPlace?: number; index: number; bidAmount: bigint }[]> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const addresses = Object.keys(this.subAccountsByAddress);\n const nextCohort = await api.query.miningSlot.bidsForNextSlotCohort();\n\n const registrationsByAddress = Object.fromEntries(\n nextCohort.map((x, i) => [x.accountId.toHuman(), { ...x, index: i }]),\n );\n\n return addresses.map(address => {\n const entry = registrationsByAddress[address];\n\n return {\n address,\n bidPlace: entry?.index,\n bidAmount: entry?.bid?.toBigInt(),\n index: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async consolidate(\n subaccounts?: SubaccountRange,\n ): Promise<{ index: number; inBlock?: string; failedError?: Error }[]> {\n const client = await this.client;\n const accounts = this.getAccountsInRange(subaccounts);\n const results: { index: number; inBlock?: string; failedError?: Error }[] = [];\n await Promise.allSettled(\n accounts.map(({ pair, index }) => {\n if (!pair) {\n results.push({\n index,\n failedError: new Error(`No keypair for //${index}`),\n });\n return Promise.resolve();\n }\n return new Promise<void>(resolve => {\n client.tx.utility\n .batchAll([\n client.tx.balances.transferAll(this.seedAddress, true),\n client.tx.ownership.transferAll(this.seedAddress, true),\n ])\n .signAndSend(pair, cb => {\n logExtrinsicResult(cb);\n if (cb.dispatchError) {\n const error = dispatchErrorToString(client, cb.dispatchError);\n\n results.push({\n index,\n failedError: new Error(`Error consolidating //${index}: ${error}`),\n });\n resolve();\n }\n if (cb.isInBlock) {\n results.push({ index, inBlock: cb.status.asInBlock.toHex() });\n resolve();\n }\n })\n .catch(e => {\n results.push({ index, failedError: e });\n resolve();\n });\n });\n }),\n );\n return results;\n }\n\n public status(opts: {\n argons: Awaited<ReturnType<Accountset['totalArgonsAt']>>;\n argonots: Awaited<ReturnType<Accountset['totalArgonotsAt']>>;\n seats: Awaited<ReturnType<Accountset['miningSeats']>>;\n bids: Awaited<ReturnType<Accountset['bids']>>;\n accountSubset?: ReturnType<Accountset['getAccountsInRange']>;\n }): IAccountStatus[] {\n const { argons, argonots, accountSubset, bids, seats } = opts;\n const accounts: IAccountStatus[] = [\n {\n index: 'main',\n address: this.seedAddress,\n argons: formatArgons(argons.find(x => x.address === this.seedAddress)?.amount ?? 0n),\n argonots: formatArgons(argonots.find(x => x.address === this.seedAddress)?.amount ?? 0n),\n },\n ];\n for (const [address, { index }] of Object.entries(this.subAccountsByAddress)) {\n const argonAmount = argons.find(x => x.address === address)?.amount ?? 0n;\n const argonotAmount = argonots.find(x => x.address === address)?.amount ?? 0n;\n const bid = bids.find(x => x.address === address);\n const seat = seats.find(x => x.address === address)?.seat;\n const entry: IAccountStatus = {\n index: ` //${index}`,\n address,\n argons: formatArgons(argonAmount),\n argonots: formatArgons(argonotAmount),\n seat,\n bidPlace: bid?.bidPlace,\n bidAmount: bid?.bidAmount ?? 0n,\n };\n if (accountSubset) {\n entry.isWorkingOn = accountSubset.some(x => x.address === address);\n }\n accounts.push(entry);\n }\n return accounts;\n }\n\n public async registerKeys(url: string) {\n const client = await getClient(url.replace('ws:', 'http:'));\n const keys = this.keys();\n for (const [name, key] of Object.entries(keys)) {\n console.log('Registering key', name, key.publicKey);\n const result = await client.rpc.author.insertKey(name, key.privateKey, key.publicKey);\n // verify keys\n const saved = await client.rpc.author.hasKey(key.publicKey, name);\n if (!saved) {\n console.error('Failed to register key', name, key.publicKey);\n throw new Error(`Failed to register ${name} key ${key.publicKey}`);\n }\n console.log(`Registered ${name} key`, result.toHuman());\n }\n await client.disconnect();\n }\n\n public keys(keysVersion?: number): {\n gran: { privateKey: string; publicKey: string; rawPublicKey: Uint8Array };\n seal: { privateKey: string; publicKey: string; rawPublicKey: Uint8Array };\n } {\n const config = getConfig();\n let version = keysVersion ?? config.keysVersion ?? 0;\n const seedMnemonic = this.sessionKeyMnemonic ?? config.keysMnemonic;\n if (!seedMnemonic) {\n throw new Error('KEYS_MNEMONIC environment variable not set. Cannot derive keys.');\n }\n const blockSealKey = `${seedMnemonic}//block-seal//${version}`;\n const granKey = `${seedMnemonic}//grandpa//${version}`;\n const blockSealAccount = new Keyring().createFromUri(blockSealKey, {\n type: 'ed25519',\n });\n const grandpaAccount = new Keyring().createFromUri(granKey, {\n type: 'ed25519',\n });\n return {\n seal: {\n privateKey: blockSealKey,\n publicKey: u8aToHex(blockSealAccount.publicKey),\n rawPublicKey: blockSealAccount.publicKey,\n },\n gran: {\n privateKey: granKey,\n publicKey: u8aToHex(grandpaAccount.publicKey),\n rawPublicKey: grandpaAccount.publicKey,\n },\n };\n }\n\n public async tx(tx: SubmittableExtrinsic): Promise<TxSubmitter> {\n const client = await this.client;\n return new TxSubmitter(client, tx, this.txSubmitterPair);\n }\n\n /**\n * Create but don't submit a mining bid transaction.\n * @param options\n */\n public async createMiningBidTx(options: {\n subaccounts: { address: string }[];\n bidAmount: bigint;\n }) {\n const client = await this.client;\n const { bidAmount, subaccounts } = options;\n\n const batch = client.tx.utility.batch(\n subaccounts.map(x => {\n const keys = this.keys();\n return client.tx.miningSlot.bid(\n bidAmount,\n {\n grandpa: keys.gran.rawPublicKey,\n blockSealAuthority: keys.seal.rawPublicKey,\n },\n x.address,\n );\n }),\n );\n\n let tx = batch;\n if (this.isProxy) {\n tx = client.tx.proxy.proxy(this.seedAddress, 'MiningBid', batch);\n }\n return new TxSubmitter(client, tx, this.txSubmitterPair);\n }\n\n /**\n * Create a mining bid. This will create a bid for each account in the given range from the seed account as funding.\n */\n public async createMiningBids(options: {\n subaccountRange?: SubaccountRange;\n bidAmount: bigint;\n tip?: bigint;\n }): Promise<{\n finalFee?: bigint;\n blockHash?: Uint8Array;\n bidError?: Error;\n successfulBids?: number;\n }> {\n const accounts = this.getAccountsInRange(options.subaccountRange);\n const client = await this.client;\n const submitter = await this.createMiningBidTx({\n ...options,\n subaccounts: accounts,\n });\n const { tip = 0n } = options;\n const txFee = await submitter.feeEstimate(tip);\n\n let minBalance = options.bidAmount * BigInt(accounts.length);\n let totalFees = tip + 1n + txFee;\n const seedBalance = await client.query.system\n .account(this.seedAddress)\n .then(x => x.data.free.toBigInt());\n if (!this.isProxy) {\n minBalance += totalFees;\n }\n if (seedBalance < minBalance) {\n throw new Error(\n `Insufficient balance to create mining bids. Seed account has ${formatArgons(\n seedBalance,\n )} but needs ${formatArgons(minBalance)}`,\n );\n }\n if (this.isProxy) {\n const { canAfford, availableBalance } = await submitter.canAfford({\n tip,\n });\n if (!canAfford) {\n throw new Error(\n `Insufficient balance to pay proxy fees. Proxy account has ${formatArgons(\n availableBalance,\n )} but needs ${formatArgons(totalFees)}`,\n );\n }\n }\n\n console.log('Creating bids', {\n perSeatBid: options.bidAmount,\n subaccounts: options.subaccountRange,\n txFee,\n });\n\n const txResult = await submitter.submit({\n tip,\n useLatestNonce: true,\n });\n\n const bidError = await txResult.inBlockPromise.then(() => undefined).catch((x: Error) => x);\n return {\n finalFee: txResult.finalFee,\n bidError,\n blockHash: txResult.includedInBlock,\n successfulBids:\n txResult.batchInterruptedIndex !== undefined\n ? txResult.batchInterruptedIndex\n : accounts.length,\n };\n }\n\n public getAccountsInRange(range?: SubaccountRange): IAccountAndKey[] {\n const entries = new Set(range ?? getDefaultSubaccountRange());\n return Object.entries(this.subAccountsByAddress)\n .filter(([_, account]) => {\n return entries.has(account.index);\n })\n .map(([address, { pair, index }]) => ({ pair, index, address }));\n }\n\n public async watchBlocks(shouldLog: boolean = false): Promise<AccountMiners> {\n const accountMiners = await AccountMiners.loadAt(this, { shouldLog });\n await accountMiners.watch();\n return accountMiners;\n }\n}\n\nexport function getDefaultSubaccountRange(): number[] {\n try {\n const config = getConfig();\n return parseSubaccountRange(config.subaccountRange ?? '0-9')!;\n } catch {\n console.error(\n 'Failed to parse SUBACCOUNT_RANGE configuration. Defaulting to 0-9. Please check the format of the subaccountRange config value.',\n );\n return Array.from({ length: 10 }, (_, i) => i);\n }\n}\n\nexport function parseSubaccountRange(range?: string): number[] | undefined {\n if (!range) {\n return undefined;\n }\n const indices = [];\n for (const entry of range.split(',')) {\n if (entry.includes('-')) {\n const [start, end] = entry.split('-').map(x => parseInt(x, 10));\n for (let i = start; i <= end; i++) {\n indices.push(i);\n }\n continue;\n }\n\n const record = parseInt(entry.trim(), 10);\n if (Number.isNaN(record) || !Number.isInteger(record)) {\n throw new Error(`Invalid range entry: ${entry}`);\n }\n if (Number.isInteger(record)) {\n indices.push(record);\n }\n }\n return indices;\n}\n\nexport type IAccountAndKey = {\n pair?: KeyringPair;\n index: number;\n address: string;\n};\n\ninterface IAccountStatus {\n index: string;\n address: string;\n argons: string;\n argonots: string;\n seat?: IMiningIndex;\n bidPlace?: number;\n bidAmount?: bigint;\n isWorkingOn?: boolean;\n}\n","import {\n type ArgonClient,\n type ArgonPrimitivesBlockSealMiningRegistration,\n formatArgons,\n type Bool,\n type u64,\n} from './index';\nimport { printTable } from 'console-table-printer';\nimport type { IAddressNames } from './Accountset';\n\nexport class MiningBids {\n public nextCohort: {\n accountId: string;\n isOurs: string;\n bidAmount: bigint;\n }[] = [];\n\n constructor(\n readonly client: Promise<ArgonClient>,\n private shouldLog = true,\n ) {}\n\n public async maxCohortSize(): Promise<number> {\n const client = await this.client;\n return client.query.miningSlot.nextCohortSize().then(x => x.toNumber());\n }\n\n public async onCohortChange(options: {\n onBiddingStart?: (cohortStartingFrameId: number) => Promise<void>;\n onBiddingEnd?: (cohortStartingFrameId: number) => Promise<void>;\n }): Promise<{ unsubscribe: () => void }> {\n const { onBiddingStart, onBiddingEnd } = options;\n const client = await this.client;\n let openCohortStartingFrameId = 0;\n const unsubscribe = await client.queryMulti<[Bool, u64]>(\n [\n client.query.miningSlot.isNextSlotBiddingOpen as any,\n client.query.miningSlot.nextFrameId as any,\n ],\n async ([isBiddingOpen, rawNextCohortStartingFrameId]) => {\n const nextFrameId = rawNextCohortStartingFrameId.toNumber();\n\n if (isBiddingOpen.isTrue) {\n if (openCohortStartingFrameId !== 0) {\n await onBiddingEnd?.(openCohortStartingFrameId);\n }\n openCohortStartingFrameId = nextFrameId;\n await onBiddingStart?.(nextFrameId);\n } else {\n await onBiddingEnd?.(nextFrameId);\n openCohortStartingFrameId = 0;\n }\n },\n );\n return { unsubscribe };\n }\n\n public async watch(\n accountNames: IAddressNames,\n blockHash?: Uint8Array,\n printFn?: (blockNumber: number) => void,\n ): Promise<{ unsubscribe: () => void }> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const unsubscribe = await api.query.miningSlot.bidsForNextSlotCohort(async next => {\n this.nextCohort = await Promise.all(next.map(x => this.toBid(accountNames, x)));\n if (!this.shouldLog) return;\n console.clear();\n const block = await client.query.system.number();\n if (!printFn) {\n console.log('At block', block.toNumber());\n this.print();\n } else {\n printFn(block.toNumber());\n }\n });\n return { unsubscribe };\n }\n\n public async loadAt(accountNames: IAddressNames, blockHash?: Uint8Array): Promise<void> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const nextCohort = await api.query.miningSlot.bidsForNextSlotCohort();\n this.nextCohort = await Promise.all(nextCohort.map(x => this.toBid(accountNames, x)));\n }\n\n private async toBid(\n accountNames: IAddressNames,\n bid: ArgonPrimitivesBlockSealMiningRegistration,\n ): Promise<MiningBids['nextCohort'][0]> {\n return {\n accountId: bid.accountId.toString(),\n isOurs: accountNames.get(bid.accountId.toString()) ?? 'n',\n bidAmount: bid.bid.toBigInt(),\n };\n }\n\n public print() {\n const bids = this.nextCohort.map(bid => {\n return {\n account: bid.accountId,\n isOurs: bid.isOurs,\n bidAmount: formatArgons(bid.bidAmount),\n };\n });\n if (bids.length) {\n console.log('\\n\\nMining Bids:');\n printTable(bids);\n }\n }\n}\n","import {\n ArgonClient,\n type ArgonPrimitivesVault,\n formatArgons,\n KeyringPair,\n toFixedNumber,\n TxSubmitter,\n} from './index';\nimport BigNumber, * as BN from 'bignumber.js';\nimport { convertFixedU128ToBigNumber, convertPermillToBigNumber } from './utils';\nimport bs58check from 'bs58check';\nimport { hexToU8a } from '@polkadot/util';\nimport { TxResult } from './TxSubmitter';\nimport { ExtrinsicStatus } from '@polkadot/types/interfaces';\n\nconst { ROUND_FLOOR } = BN;\n\nexport class Vault {\n public securitization!: bigint;\n public securitizationRatio!: BigNumber;\n public argonsLocked!: bigint;\n public argonsPendingActivation!: bigint;\n public argonsScheduledForRelease: Map<number, bigint> = new Map();\n public terms!: ITerms;\n public operatorAccountId!: string;\n public isClosed!: boolean;\n public vaultId: number;\n public pendingTerms?: ITerms;\n public pendingTermsChangeTick?: number;\n public openedDate: Date;\n public openedTick: number;\n\n constructor(\n id: number,\n vault: ArgonPrimitivesVault,\n private tickDuration: number,\n ) {\n this.vaultId = id;\n this.load(vault);\n this.openedTick = vault.openedTick.toNumber();\n this.openedDate = new Date(this.openedTick * this.tickDuration);\n }\n\n public load(vault: ArgonPrimitivesVault) {\n this.securitization = vault.securitization.toBigInt();\n this.securitizationRatio = convertFixedU128ToBigNumber(vault.securitizationRatio.toBigInt());\n this.argonsLocked = vault.argonsLocked.toBigInt();\n this.argonsPendingActivation = vault.argonsPendingActivation.toBigInt();\n if (vault.argonsScheduledForRelease.size > 0) {\n this.argonsScheduledForRelease.clear();\n for (const [tick, amount] of vault.argonsScheduledForRelease.entries()) {\n this.argonsScheduledForRelease.set(tick.toNumber(), amount.toBigInt());\n }\n }\n this.terms = {\n bitcoinAnnualPercentRate: convertFixedU128ToBigNumber(\n vault.terms.bitcoinAnnualPercentRate.toBigInt(),\n ),\n bitcoinBaseFee: vault.terms.bitcoinBaseFee.toBigInt(),\n liquidityPoolProfitSharing: convertPermillToBigNumber(\n vault.terms.liquidityPoolProfitSharing.toBigInt(),\n ),\n };\n\n this.operatorAccountId = vault.operatorAccountId.toString();\n this.isClosed = vault.isClosed.valueOf();\n if (vault.pendingTerms.isSome) {\n const [tickApply, terms] = vault.pendingTerms.value;\n this.pendingTermsChangeTick = tickApply.toNumber();\n this.pendingTerms = {\n bitcoinAnnualPercentRate: convertFixedU128ToBigNumber(\n terms.bitcoinAnnualPercentRate.toBigInt(),\n ),\n bitcoinBaseFee: terms.bitcoinBaseFee.toBigInt(),\n liquidityPoolProfitSharing: convertPermillToBigNumber(\n vault.terms.liquidityPoolProfitSharing.toBigInt(),\n ),\n };\n }\n }\n\n public availableBitcoinSpace(): bigint {\n const recoverySecuritization = this.recoverySecuritization();\n const reLockable = this.getRelockCapacity();\n return this.securitization - recoverySecuritization - this.argonsLocked + reLockable;\n }\n\n public getRelockCapacity(): bigint {\n return [...this.argonsScheduledForRelease.values()].reduce((acc, val) => acc + val, 0n);\n }\n\n public recoverySecuritization(): bigint {\n const reserved = new BigNumber(1).div(this.securitizationRatio);\n return (\n this.securitization -\n BigInt(reserved.multipliedBy(this.securitization.toString()).toFixed(0, ROUND_FLOOR))\n );\n }\n\n public minimumSecuritization(): bigint {\n return BigInt(\n this.securitizationRatio\n .multipliedBy(this.argonsLocked.toString())\n .decimalPlaces(0, BigNumber.ROUND_CEIL)\n .toString(),\n );\n }\n\n public activatedSecuritization(): bigint {\n const activated = this.argonsLocked - this.argonsPendingActivation;\n let maxRatio = this.securitizationRatio;\n if (this.securitizationRatio.toNumber() > 2) {\n maxRatio = BigNumber(2);\n }\n return BigInt(maxRatio.multipliedBy(activated.toString()).toFixed(0, ROUND_FLOOR));\n }\n\n /**\n * Returns the amount of Argons available to match per liquidity pool\n */\n public activatedSecuritizationPerSlot(): bigint {\n const activated = this.activatedSecuritization();\n return activated / 10n;\n }\n\n public calculateBitcoinFee(amount: bigint): bigint {\n const fee = this.terms.bitcoinAnnualPercentRate\n .multipliedBy(Number(amount))\n .integerValue(BigNumber.ROUND_CEIL);\n return BigInt(fee.toString()) + this.terms.bitcoinBaseFee;\n }\n\n public static async get(\n client: ArgonClient,\n vaultId: number,\n tickDurationMillis?: number,\n ): Promise<Vault> {\n const rawVault = await client.query.vaults.vaultsById(vaultId);\n if (rawVault.isNone) {\n throw new Error(`Vault with id ${vaultId} not found`);\n }\n const tickDuration =\n tickDurationMillis ??\n (await client.query.ticks.genesisTicker().then(x => x.tickDurationMillis.toNumber()))!;\n return new Vault(vaultId, rawVault.unwrap(), tickDuration);\n }\n\n public static async create(\n client: ArgonClient,\n keypair: KeyringPair,\n args: {\n securitization: bigint | number;\n securitizationRatio: number;\n annualPercentRate: number;\n baseFee: bigint | number;\n bitcoinXpub: string;\n liquidityPoolProfitSharing: number;\n tip?: bigint;\n doNotExceedBalance?: bigint;\n progressCallback?: (progressPct: number, status: ExtrinsicStatus) => void;\n },\n config: { tickDurationMillis?: number } = {},\n ): Promise<{ vault: Vault; txResult: TxResult }> {\n const {\n securitization,\n securitizationRatio,\n annualPercentRate,\n baseFee,\n bitcoinXpub,\n tip,\n doNotExceedBalance,\n progressCallback,\n } = args;\n let xpubBytes = hexToU8a(bitcoinXpub);\n if (xpubBytes.length !== 78) {\n if (\n bitcoinXpub.startsWith('xpub') ||\n bitcoinXpub.startsWith('tpub') ||\n bitcoinXpub.startsWith('zpub')\n ) {\n const bytes = bs58check.decode(bitcoinXpub);\n if (bytes.length !== 78) {\n throw new Error('Invalid Bitcoin xpub key length, must be 78 bytes');\n }\n xpubBytes = bytes;\n }\n }\n let vaultParams = {\n terms: {\n // convert to fixed u128\n bitcoinAnnualPercentRate: toFixedNumber(annualPercentRate, 18),\n bitcoinBaseFee: BigInt(baseFee),\n liquidityPoolProfitSharing: toFixedNumber(args.liquidityPoolProfitSharing, 6),\n },\n securitizationRatio: toFixedNumber(securitizationRatio, 18),\n securitization: BigInt(securitization),\n bitcoinXpubkey: xpubBytes,\n };\n let tx = new TxSubmitter(client, client.tx.vaults.create(vaultParams), keypair);\n if (doNotExceedBalance) {\n const finalTip = tip ?? 0n;\n let txFee = await tx.feeEstimate(finalTip);\n while (txFee + finalTip + vaultParams.securitization > doNotExceedBalance) {\n vaultParams.securitization = doNotExceedBalance - txFee - finalTip;\n tx.tx = client.tx.vaults.create(vaultParams);\n txFee = await tx.feeEstimate(finalTip);\n }\n }\n const canAfford = await tx.canAfford({ tip, unavailableBalance: BigInt(securitization) });\n if (!canAfford.canAfford) {\n throw new Error(\n `Insufficient balance to create vault. Required: ${formatArgons(securitization)}, Available: ${formatArgons(canAfford.availableBalance)}`,\n );\n }\n\n const result = await tx.submit({\n tip,\n useLatestNonce: true,\n waitForBlock: true,\n onResultCallback(result) {\n let percent = 0;\n if (\n result.status.isInvalid ||\n result.status.isDropped ||\n result.status.isUsurped ||\n result.status.isRetracted\n ) {\n percent = 1;\n } else if (result.status.isReady) {\n percent = 0;\n } else if (result.status.isBroadcast) {\n percent = 0.5;\n } else if (result.status.isInBlock) {\n percent = 1;\n } else if (result.status.isFinalized) {\n percent = 1.1;\n }\n progressCallback?.(percent, result.status);\n },\n });\n await result.inBlockPromise;\n let vaultId: number | undefined;\n for (const event of result.events) {\n if (client.events.vaults.VaultCreated.is(event)) {\n vaultId = event.data.vaultId.toNumber();\n break;\n }\n }\n if (vaultId === undefined) {\n throw new Error('Vault creation failed, no VaultCreated event found');\n }\n const rawVault = await client.query.vaults.vaultsById(vaultId);\n if (rawVault.isNone) {\n throw new Error('Vault creation failed, vault not found');\n }\n const tickDuration =\n config.tickDurationMillis ??\n (await client.query.ticks.genesisTicker().then(x => x.tickDurationMillis.toNumber()))!;\n const vault = new Vault(vaultId, rawVault.unwrap(), tickDuration);\n return { vault, txResult: result };\n }\n}\n\nexport interface ITerms {\n readonly bitcoinAnnualPercentRate: BigNumber;\n readonly bitcoinBaseFee: bigint;\n readonly liquidityPoolProfitSharing: BigNumber;\n}\n\nexport interface IBondedArgons {\n readonly allocated: bigint;\n readonly reserved: bigint;\n}\n","import {\n type ArgonClient,\n type ArgonPrimitivesVault,\n Option,\n Vault,\n BlockWatch,\n MiningBids,\n Accountset,\n formatArgons,\n formatPercent,\n} from './index';\nimport { printTable } from 'console-table-printer';\nimport { createNanoEvents } from './utils';\n\nexport class VaultMonitor {\n public events = createNanoEvents<{\n 'bitcoin-space-above': (vaultId: number, amount: bigint) => void;\n 'liquidity-pool-space-above': (vaultId: number, amount: bigint) => void;\n }>();\n public readonly vaultsById: { [id: number]: Vault } = {};\n public readonly blockWatch: BlockWatch;\n public readonly mainchain: Promise<ArgonClient>;\n public activatedCapitalByVault: { [vaultId: number]: bigint } = {};\n private lastPrintedBids: Uint8Array | undefined;\n private readonly miningBids: MiningBids;\n private tickDuration: number = 0;\n private vaultOnlyWatchMode: boolean = false;\n private shouldLog: boolean = true;\n\n constructor(\n readonly accountset: Accountset,\n readonly alerts: WatchAlerts = {},\n readonly options: {\n vaultOnlyWatchMode?: boolean;\n shouldLog?: boolean;\n } = {},\n ) {\n this.mainchain = accountset.client;\n if (options.vaultOnlyWatchMode !== undefined) {\n this.vaultOnlyWatchMode = options.vaultOnlyWatchMode;\n }\n if (options.shouldLog !== undefined) {\n this.shouldLog = options.shouldLog;\n }\n this.miningBids = new MiningBids(this.mainchain, this.shouldLog);\n this.blockWatch = new BlockWatch(this.mainchain, {\n shouldLog: this.shouldLog,\n });\n this.blockWatch.events.on('vaults-updated', (header, vaultIds) =>\n this.onVaultsUpdated(header.hash, vaultIds),\n );\n this.blockWatch.events.on('mining-bid', async (header, _bid) => {\n await this.miningBids.loadAt(this.accountset.namedAccounts, header.hash);\n this.printBids(header.hash);\n });\n this.blockWatch.events.on('mining-bid-ousted', async header => {\n await this.miningBids.loadAt(this.accountset.namedAccounts, header.hash);\n this.printBids(header.hash);\n });\n }\n\n public stop() {\n this.blockWatch.stop();\n }\n\n public async monitor(justPrint = false) {\n const client = await this.mainchain;\n\n this.tickDuration = (await client.query.ticks.genesisTicker()).tickDurationMillis.toNumber();\n const blockHeader = await client.rpc.chain.getHeader();\n const blockHash = new Uint8Array(blockHeader.hash);\n console.log(\n `${justPrint ? 'Run' : 'Started'} at block ${blockHeader.number} - ${blockHeader.hash.toHuman()}`,\n );\n\n await this.miningBids.loadAt(this.accountset.namedAccounts, blockHash);\n const vaults = await client.query.vaults.vaultsById.entries();\n for (const [storageKey, rawVault] of vaults) {\n const vaultId = storageKey.args[0].toNumber();\n this.updateVault(vaultId, rawVault);\n }\n\n await client.query.liquidityPools.capitalRaising(x => {\n this.activatedCapitalByVault = {};\n for (const entry of x) {\n const vaultId = entry.vaultId.toNumber();\n this.activatedCapitalByVault[vaultId] = entry.activatedCapital.toBigInt();\n }\n for (const [vaultId, vault] of Object.entries(this.vaultsById)) {\n const id = Number(vaultId);\n this.activatedCapitalByVault[id] ??= 0n;\n this.checkMiningBondAlerts(id, vault);\n }\n });\n this.printVaults();\n if (!this.vaultOnlyWatchMode && this.shouldLog) {\n this.miningBids.print();\n }\n\n if (!justPrint) await this.blockWatch.start();\n }\n\n public printVaults() {\n if (!this.shouldLog) return;\n const vaults = [];\n for (const [vaultId, vault] of Object.entries(this.vaultsById)) {\n vaults.push({\n id: vaultId,\n btcSpace: `${formatArgons(vault.availableBitcoinSpace())} (${formatArgons(vault.argonsPendingActivation)} pending)`,\n btcDeal: `${formatArgons(vault.terms.bitcoinBaseFee)} + ${formatPercent(vault.terms.bitcoinAnnualPercentRate)}`,\n securitization: `${formatArgons(vault.securitization)} at ${vault.securitizationRatio.toFormat(1)}x`,\n securActivated: `${formatArgons(vault.activatedSecuritizationPerSlot())}/slot`,\n liquidPoolDeal: `${formatPercent(vault.terms.liquidityPoolProfitSharing)} sharing`,\n operator: `${this.accountset.namedAccounts.has(vault.operatorAccountId) ? ` (${this.accountset.namedAccounts.get(vault.operatorAccountId)})` : vault.operatorAccountId}`,\n state: vault.isClosed ? 'closed' : vault.openedDate < new Date() ? 'open' : 'pending',\n });\n }\n if (vaults.length) {\n if (this.vaultOnlyWatchMode) {\n console.clear();\n }\n console.log('\\n\\nVaults:');\n printTable(vaults);\n }\n }\n\n private async recheckAfterActive(vaultId: number) {\n const activationDate = this.vaultsById[vaultId].openedDate;\n if (this.shouldLog) {\n console.log(`Waiting for vault ${vaultId} to activate ${activationDate}`);\n }\n await new Promise(resolve => setTimeout(resolve, activationDate.getTime() - Date.now()));\n const client = await this.mainchain;\n let isReady = false;\n while (!isReady) {\n const rawVault = await client.query.vaults.vaultsById(vaultId);\n if (!rawVault.isSome) return;\n const vault = new Vault(vaultId, rawVault.value, this.tickDuration);\n this.vaultsById[vaultId] = vault;\n if (vault.isClosed) return;\n if (vault.openedDate < new Date()) {\n isReady = true;\n break;\n }\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n this.checkAlerts(vaultId, this.vaultsById[vaultId]);\n }\n\n private async onVaultsUpdated(blockHash: Uint8Array, vaultIds: Set<number>) {\n await this.reloadVaultsAt([...vaultIds], blockHash).catch(err => {\n console.error(`Failed to reload vault ${[...vaultIds]} at block ${blockHash}:`, err);\n });\n this.printVaults();\n }\n\n private async reloadVaultsAt(vaultIds: number[], blockHash: Uint8Array) {\n const client = await this.mainchain;\n const api = await client.at(blockHash);\n const vaults = await api.query.vaults.vaultsById.multi(vaultIds);\n for (let i = 0; i < vaultIds.length; i += 1) {\n this.updateVault(vaultIds[i], vaults[i]);\n }\n }\n\n private updateVault(vaultId: number, rawVault: Option<ArgonPrimitivesVault>) {\n if (rawVault.isNone) return;\n const vault = new Vault(vaultId, rawVault.value, this.tickDuration);\n this.vaultsById[vaultId] = vault;\n if (vault.openedDate > new Date()) {\n void this.recheckAfterActive(vaultId);\n } else {\n this.checkAlerts(vaultId, vault);\n }\n }\n\n private checkAlerts(vaultId: number, vault: Vault) {\n if (this.alerts.bitcoinSpaceAvailable !== undefined) {\n const availableBitcoinSpace = vault.availableBitcoinSpace();\n if (availableBitcoinSpace >= this.alerts.bitcoinSpaceAvailable) {\n console.warn(\n `Vault ${vaultId} has available bitcoins above ${formatArgons(this.alerts.bitcoinSpaceAvailable)}`,\n );\n this.events.emit('bitcoin-space-above', vaultId, availableBitcoinSpace);\n }\n }\n }\n\n private checkMiningBondAlerts(vaultId: number, vault: Vault) {\n if (this.alerts.liquidityPoolSpaceAvailable === undefined) return;\n\n const activatedSecuritization = vault.activatedSecuritizationPerSlot();\n const capitalization = this.activatedCapitalByVault[vaultId] ?? 0n;\n const available = activatedSecuritization - capitalization;\n if (available >= this.alerts.liquidityPoolSpaceAvailable) {\n this.events.emit('liquidity-pool-space-above', vaultId, available);\n }\n }\n\n private printBids(blockHash: Uint8Array) {\n if (!this.shouldLog) return;\n if (this.lastPrintedBids === blockHash) return;\n this.miningBids.print();\n this.lastPrintedBids = blockHash;\n }\n}\n\nexport type WatchAlerts = {\n /**\n * Alert when a vault has available space for bitcoins to move in greater than or equal to this amount\n */\n bitcoinSpaceAvailable?: bigint;\n /**\n * Liquidity pool space available\n */\n liquidityPoolSpaceAvailable?: bigint;\n};\n","import type { Accountset } from './Accountset';\nimport {\n ArgonClient,\n type ArgonPrimitivesBlockSealMiningRegistration,\n ExtrinsicError,\n} from './index';\nimport { formatArgons } from './utils';\nimport { Bool, Compact, u128, u64, Vec } from '@polkadot/types-codec';\nimport { AccountId } from '@polkadot/types/interfaces/runtime';\n\nexport class CohortBidder {\n public get client(): Promise<ArgonClient> {\n return this.accountset.client;\n }\n\n public txFees = 0n;\n public winningBids: { address: string; bid: bigint }[] = [];\n\n private unsubscribe?: () => void;\n private pendingRequest: Promise<any> | undefined;\n private retryTimeout?: NodeJS.Timeout;\n private isStopped = false;\n private needsRebid = false;\n private lastBidTime = 0;\n\n private millisPerTick?: number;\n private minIncrement = 10_000n;\n private nextCohortSize?: number;\n private lastBidBlockNumber: number = 0;\n\n private readonly myAddresses = new Set<string>();\n\n constructor(\n public accountset: Accountset,\n public cohortStartingFrameId: number,\n public subaccounts: { index: number; isRebid: boolean; address: string }[],\n public options: {\n minBid: bigint;\n maxBid: bigint;\n maxBudget: bigint;\n bidIncrement: bigint;\n bidDelay: number;\n tipPerTransaction?: bigint;\n },\n ) {\n this.subaccounts.forEach(x => {\n this.myAddresses.add(x.address);\n });\n }\n\n public async start() {\n console.log(`Starting cohort ${this.cohortStartingFrameId} bidder`, {\n maxBid: formatArgons(this.options.maxBid),\n minBid: formatArgons(this.options.minBid),\n bidIncrement: formatArgons(this.options.bidIncrement),\n maxBudget: formatArgons(this.options.maxBudget),\n bidDelay: this.options.bidDelay,\n subaccounts: this.subaccounts,\n });\n\n const client = await this.client;\n\n this.minIncrement = client.consts.miningSlot.bidIncrements.toBigInt();\n\n this.nextCohortSize = await client.query.miningSlot.nextCohortSize().then(x => x.toNumber());\n if (this.subaccounts.length > this.nextCohortSize) {\n console.info(\n `Cohort size ${this.nextCohortSize} is less than provided subaccounts ${this.subaccounts.length}.`,\n );\n this.subaccounts.length = this.nextCohortSize;\n }\n this.millisPerTick = await client.query.ticks\n .genesisTicker()\n .then(x => x.tickDurationMillis.toNumber());\n\n this.unsubscribe = await client.queryMulti<\n [Vec<ArgonPrimitivesBlockSealMiningRegistration>, u64]\n >(\n [\n client.query.miningSlot.bidsForNextSlotCohort as any,\n client.query.miningSlot.nextFrameId as any,\n ],\n async ([bids, nextFrameId]) => {\n if (nextFrameId.toNumber() === this.cohortStartingFrameId) {\n await this.checkWinningBids(bids);\n }\n },\n );\n }\n\n public async stop(): Promise<CohortBidder['winningBids']> {\n if (this.isStopped) return this.winningBids;\n this.isStopped = true;\n console.log('Stopping bidder for cohort', this.cohortStartingFrameId);\n clearTimeout(this.retryTimeout);\n if (this.unsubscribe) {\n this.unsubscribe();\n }\n const client = await this.client;\n const [nextFrameId, isBiddingOpen] = await client.queryMulti<[u64, Bool]>([\n client.query.miningSlot.nextFrameId as any,\n client.query.miningSlot.isNextSlotBiddingOpen,\n ]);\n if (nextFrameId.toNumber() === this.cohortStartingFrameId && isBiddingOpen.isTrue) {\n console.log('Bidding is still open, waiting for it to close');\n await new Promise<void>(async resolve => {\n const unsub = await client.query.miningSlot.isNextSlotBiddingOpen(isOpen => {\n if (isOpen.isFalse) {\n unsub();\n resolve();\n }\n });\n });\n }\n // wait for any pending request to finish updating stats\n void (await this.pendingRequest);\n\n // go back to last block with this cohort\n let header = await client.rpc.chain.getHeader();\n let api = await client.at(header.hash);\n while (true) {\n const cohortStartingFrameId = await api.query.miningSlot.nextFrameId();\n if (cohortStartingFrameId.toNumber() === this.cohortStartingFrameId) {\n break;\n }\n header = await client.rpc.chain.getHeader(header.parentHash);\n api = await client.at(header.hash);\n }\n const bids = await api.query.miningSlot.bidsForNextSlotCohort();\n\n this.updateSeatsWon(bids);\n console.log('Bidder stopped', {\n cohortStartingFrameId: this.cohortStartingFrameId,\n blockNumber: header.number.toNumber(),\n bids: this.winningBids,\n });\n\n return this.winningBids;\n }\n\n private async checkWinningBids(bids: ArgonPrimitivesBlockSealMiningRegistration[]) {\n if (this.isStopped) return;\n clearTimeout(this.retryTimeout);\n\n this.updateSeatsWon(bids);\n const winningBids = this.winningBids.length;\n this.needsRebid = winningBids < this.subaccounts.length;\n\n const client = await this.client;\n const bestBlock = await client.rpc.chain.getBlockHash();\n const api = await client.at(bestBlock);\n const blockNumber = await api.query.system.number().then(x => x.toNumber());\n\n if (this.lastBidBlockNumber >= blockNumber) return;\n if (this.pendingRequest) return;\n\n const ticksSinceLastBid = Math.floor((Date.now() - this.lastBidTime) / this.millisPerTick!);\n if (ticksSinceLastBid < this.options.bidDelay && this.needsRebid) {\n this.retryTimeout = setTimeout(() => void this.checkCurrentSeats(), this.millisPerTick!);\n return;\n }\n if (!this.needsRebid) return;\n\n console.log(\n 'Checking bids for cohort',\n this.cohortStartingFrameId,\n this.subaccounts.map(x => x.index),\n );\n\n const winningAddresses = new Set(bids.map(x => x.accountId.toHuman()));\n let lowestBid = -this.options.bidIncrement;\n if (bids.length) {\n for (let i = bids.length - 1; i >= 0; i--) {\n // find the lowest bid that is not us\n if (!this.myAddresses.has(bids[i].accountId.toHuman())) {\n lowestBid = bids.at(i)!.bid.toBigInt();\n break;\n }\n }\n }\n\n // 1. determine next bid based on current bids and settings\n let nextBid = lowestBid + this.options.bidIncrement;\n if (nextBid < this.options.minBid) {\n nextBid = this.options.minBid;\n }\n if (nextBid > this.options.maxBid) {\n nextBid = this.options.maxBid;\n }\n\n const fakeTx = await this.accountset.createMiningBidTx({\n subaccounts: this.subaccounts,\n bidAmount: nextBid,\n });\n let availableBalanceForBids = await api.query.system\n .account(this.accountset.txSubmitterPair.address)\n .then(x => x.data.free.toBigInt());\n\n // add our current balance used to the budget\n for (const bid of bids) {\n if (this.myAddresses.has(bid.accountId.toHuman())) {\n availableBalanceForBids += bid.bid.toBigInt();\n }\n }\n const tip = this.options.tipPerTransaction ?? 0n;\n const feeEstimate = await fakeTx.feeEstimate(tip);\n const feePlusTip = feeEstimate + tip;\n\n let budgetForSeats = this.options.maxBudget - feePlusTip;\n if (budgetForSeats > availableBalanceForBids) {\n budgetForSeats = availableBalanceForBids - feePlusTip;\n }\n if (nextBid < lowestBid) {\n console.log(\n `Can't bid ${formatArgons(nextBid)}. Current lowest bid is ${formatArgons(lowestBid)}.`,\n );\n return;\n }\n\n if (nextBid - lowestBid < Number(this.minIncrement)) {\n console.log(\n `Can't make any more bids for ${this.cohortStartingFrameId} with given constraints.`,\n {\n lowestCurrentBid: formatArgons(lowestBid),\n nextAttemptedBid: formatArgons(nextBid),\n maxBid: formatArgons(this.options.maxBid),\n },\n );\n return;\n }\n\n const seatsInBudget =\n nextBid === 0n ? this.subaccounts.length : Number(budgetForSeats / nextBid);\n\n let accountsToUse = [...this.subaccounts];\n // 3. if we have more seats than we can afford, we need to remove some\n if (accountsToUse.length > seatsInBudget) {\n // Sort accounts by winning bids first, then rebids, then by index\n accountsToUse.sort((a, b) => {\n const isWinningA = winningAddresses.has(a.address);\n const isWinningB = winningAddresses.has(b.address);\n if (isWinningA && !isWinningB) return -1;\n if (!isWinningA && isWinningB) return 1;\n\n if (a.isRebid && !b.isRebid) return -1;\n if (!a.isRebid && b.isRebid) return 1;\n return a.index - b.index;\n });\n // only keep the number of accounts we can afford\n accountsToUse.length = seatsInBudget;\n }\n if (accountsToUse.length > winningBids) {\n this.pendingRequest = this.bid(nextBid, accountsToUse);\n }\n this.needsRebid = false;\n }\n\n private async bid(bidPerSeat: bigint, subaccounts: { address: string }[]) {\n const prevLastBidTime = this.lastBidTime;\n try {\n this.lastBidTime = Date.now();\n const submitter = await this.accountset.createMiningBidTx({\n subaccounts,\n bidAmount: bidPerSeat,\n });\n const tip = this.options.tipPerTransaction ?? 0n;\n const txResult = await submitter.submit({\n tip,\n useLatestNonce: true,\n });\n\n const bidError = await txResult.inBlockPromise\n .then(() => undefined)\n .catch((x: ExtrinsicError) => x);\n let blockNumber: number | undefined;\n if (txResult.includedInBlock) {\n const client = await this.client;\n const api = await client.at(txResult.includedInBlock);\n blockNumber = await api.query.system.number().then(x => x.toNumber());\n }\n\n const successfulBids = txResult.batchInterruptedIndex ?? subaccounts.length;\n\n this.txFees += txResult.finalFee ?? 0n;\n if (blockNumber !== undefined) {\n this.lastBidBlockNumber = Math.max(blockNumber, this.lastBidBlockNumber);\n }\n\n console.log('Done creating bids for cohort', {\n successfulBids,\n bidPerSeat,\n blockNumber,\n });\n if (bidError) throw bidError;\n } catch (err) {\n this.lastBidTime = prevLastBidTime;\n console.error(`Error bidding for cohort ${this.cohortStartingFrameId}:`, err);\n clearTimeout(this.retryTimeout);\n this.retryTimeout = setTimeout(() => void this.checkCurrentSeats(), 1000);\n } finally {\n this.pendingRequest = undefined;\n }\n\n if (this.needsRebid) {\n this.needsRebid = false;\n await this.checkCurrentSeats();\n }\n }\n\n private updateSeatsWon(next: { accountId: AccountId; bid: u128 | Compact<u128> }[]): void {\n this.winningBids.length = 0;\n for (const x of next) {\n const bid = x.bid.toBigInt();\n const address = x.accountId.toHuman();\n if (this.myAddresses.has(address)) {\n this.winningBids.push({ address, bid });\n }\n }\n }\n\n private async checkCurrentSeats() {\n const client = await this.client;\n const bids = await client.query.miningSlot.bidsForNextSlotCohort();\n await this.checkWinningBids(bids);\n }\n}\n","import { convertPermillToBigNumber, filterUndefined, formatArgons, formatPercent } from './utils';\nimport { Table } from 'console-table-printer';\nimport BigNumber from 'bignumber.js';\nimport { BlockWatch } from './BlockWatch';\nimport {\n type ArgonClient,\n type ArgonPrimitivesBlockSealMiningRegistration,\n type KeyringPair,\n type PalletLiquidityPoolsLiquidityPool,\n type PalletLiquidityPoolsLiquidityPoolCapital,\n type u32,\n type u64,\n type Vec,\n} from './index';\nimport { Vault } from './Vault';\nimport { TxResult, TxSubmitter } from './TxSubmitter';\nimport { AccountRegistry } from './AccountRegistry';\n\nconst EMPTY_TABLE = {\n headerBottom: { left: ' ', mid: ' ', other: '─', right: ' ' },\n headerTop: { left: ' ', mid: ' ', other: ' ', right: ' ' },\n rowSeparator: { left: ' ', mid: ' ', other: ' ', right: ' ' },\n tableBottom: { left: ' ', mid: ' ', other: ' ', right: ' ' },\n vertical: ' ',\n};\n\ninterface IContributor {\n address: string;\n amount: bigint;\n}\n\ninterface IVaultMiningBondFund {\n activatedCapital: bigint;\n contributors?: IContributor[];\n vaultSharingPercent?: BigNumber;\n earnings?: bigint;\n}\n\nexport class BidPool {\n public bidPoolAmount: bigint = 0n;\n public nextFrameId: number = 1;\n public poolVaultCapitalByFrame: {\n [frameId: number]: {\n [vaultId: number]: IVaultMiningBondFund;\n };\n } = {};\n\n private vaultSecuritization: {\n vaultId: number;\n activatedSecuritization: bigint;\n bitcoinSpace: bigint;\n vaultSharingPercent: BigNumber;\n }[] = [];\n private printTimeout?: NodeJS.Timeout;\n private blockWatch: BlockWatch;\n private vaultsById: { [id: number]: Vault } = {};\n private tickDuration?: number;\n private lastDistributedFrameId?: number;\n\n private FrameSubscriptions: { [frameId: number]: () => void } = {};\n\n constructor(\n readonly client: Promise<ArgonClient>,\n readonly keypair: KeyringPair,\n readonly accountRegistry: AccountRegistry = AccountRegistry.factory(),\n ) {\n this.blockWatch = new BlockWatch(client, { shouldLog: false });\n }\n\n private async onVaultsUpdated(blockHash: Uint8Array, vaultIdSet: Set<number>) {\n const client = await this.client;\n\n this.tickDuration ??= (await client.query.ticks.genesisTicker()).tickDurationMillis.toNumber();\n const api = await client.at(blockHash);\n const vaultIds = [...vaultIdSet];\n const rawVaults = await api.query.vaults.vaultsById.multi(vaultIds);\n for (let i = 0; i < vaultIds.length; i += 1) {\n const rawVault = rawVaults[i];\n if (rawVault.isNone) continue;\n const vaultId = vaultIds[i];\n this.vaultsById[vaultId] = new Vault(vaultId, rawVault.unwrap(), this.tickDuration);\n }\n\n const vaults = Object.entries(this.vaultsById);\n const newSecuritization: BidPool['vaultSecuritization'] = [];\n for (const [vaultId, vault] of vaults) {\n const amount = vault.activatedSecuritizationPerSlot();\n newSecuritization.push({\n vaultId: Number(vaultId),\n bitcoinSpace: vault.availableBitcoinSpace(),\n activatedSecuritization: amount,\n vaultSharingPercent: vault.terms.liquidityPoolProfitSharing,\n });\n }\n newSecuritization.sort((a, b) => {\n const diff2 = b.activatedSecuritization - a.activatedSecuritization;\n if (diff2 !== 0n) return Number(diff2);\n return a.vaultId - b.vaultId;\n });\n this.vaultSecuritization = newSecuritization;\n this.printDebounce();\n }\n\n public async getBidPool(): Promise<bigint> {\n const client = await this.client;\n const balanceBytes = await client.rpc.state.call('MiningSlotApi_bid_pool', '');\n const balance = client.createType('U128', balanceBytes);\n return balance.toBigInt();\n }\n\n public async loadAt(blockHash?: Uint8Array) {\n const client = await this.client;\n blockHash ??= new Uint8Array((await client.rpc.chain.getHeader()).hash);\n const api = await client.at(blockHash);\n const rawVaultIds = await api.query.vaults.vaultsById.keys();\n const vaultIds = rawVaultIds.map(x => x.args[0].toNumber());\n this.bidPoolAmount = await this.getBidPool();\n this.nextFrameId = (await api.query.miningSlot.nextFrameId()).toNumber();\n\n const contributors = await api.query.liquidityPools.vaultPoolsByFrame.entries();\n for (const [frameId, funds] of contributors) {\n const FrameIdNumber = frameId.args[0].toNumber();\n this.loadFrameData(FrameIdNumber, funds);\n }\n for (const entrant of await api.query.liquidityPools.capitalActive()) {\n this.setVaultFrameData(entrant.frameId.toNumber(), entrant.vaultId.toNumber(), {\n activatedCapital: entrant.activatedCapital.toBigInt(),\n });\n }\n for (const entrant of await api.query.liquidityPools.capitalRaising()) {\n this.setVaultFrameData(entrant.frameId.toNumber(), entrant.vaultId.toNumber(), {\n activatedCapital: entrant.activatedCapital.toBigInt(),\n });\n }\n await this.onVaultsUpdated(blockHash, new Set(vaultIds));\n this.print();\n }\n\n public async watch(): Promise<{ unsubscribe: () => void }> {\n await this.loadAt();\n await this.blockWatch.start();\n this.blockWatch.events.on('vaults-updated', (b, v) => this.onVaultsUpdated(b.hash, v));\n const api = await this.client;\n this.blockWatch.events.on('event', async (_, event) => {\n if (api.events.liquidityPools.BidPoolDistributed.is(event)) {\n const { frameId: rawFrameId } = event.data;\n this.lastDistributedFrameId = rawFrameId.toNumber();\n this.bidPoolAmount = await this.getBidPool();\n\n this.FrameSubscriptions[rawFrameId.toNumber()]?.();\n const entrant = await api.query.liquidityPools.vaultPoolsByFrame(rawFrameId);\n this.loadFrameData(rawFrameId.toNumber(), entrant);\n this.printDebounce();\n }\n if (api.events.liquidityPools.NextBidPoolCapitalLocked.is(event)) {\n const { frameId } = event.data;\n\n for (let inc = 0; inc < 2; inc++) {\n const id = frameId.toNumber() + inc;\n if (!this.FrameSubscriptions[id]) {\n this.FrameSubscriptions[id] = await api.query.liquidityPools.vaultPoolsByFrame(\n id,\n async entrant => {\n this.loadFrameData(id, entrant);\n this.printDebounce();\n },\n );\n }\n }\n }\n });\n\n const unsubscribe = await api.queryMulti<\n [\n Vec<ArgonPrimitivesBlockSealMiningRegistration>,\n u64,\n Vec<PalletLiquidityPoolsLiquidityPoolCapital>,\n Vec<PalletLiquidityPoolsLiquidityPoolCapital>,\n ]\n >(\n [\n api.query.miningSlot.bidsForNextSlotCohort as any,\n api.query.miningSlot.nextFrameId as any,\n api.query.liquidityPools.capitalActive as any,\n api.query.liquidityPools.capitalRaising as any,\n ],\n async ([_bids, nextFrameId, openVaultBidPoolCapital, nextPoolCapital]) => {\n this.bidPoolAmount = await this.getBidPool();\n this.nextFrameId = nextFrameId.toNumber();\n for (const entrant of [...openVaultBidPoolCapital, ...nextPoolCapital]) {\n this.setVaultFrameData(entrant.frameId.toNumber(), entrant.vaultId.toNumber(), {\n activatedCapital: entrant.activatedCapital.toBigInt(),\n });\n }\n this.printDebounce();\n },\n );\n\n return { unsubscribe };\n }\n\n public async bondArgons(\n vaultId: number,\n amount: bigint,\n options?: { tip: bigint },\n ): Promise<TxResult> {\n const client = await this.client;\n\n const tx = client.tx.liquidityPools.bondArgons(vaultId, amount);\n const txSubmitter = new TxSubmitter(client, tx, this.keypair);\n const affordability = await txSubmitter.canAfford({\n tip: options?.tip,\n unavailableBalance: amount,\n });\n\n if (!affordability.canAfford) {\n console.warn('Insufficient balance to bond argons to liquidity pool', {\n ...affordability,\n argonsNeeded: amount,\n });\n throw new Error('Insufficient balance to bond argons to liquidity pool');\n }\n\n const result = await txSubmitter.submit({\n tip: options?.tip,\n useLatestNonce: true,\n });\n await result.inBlockPromise;\n return result;\n }\n\n public printDebounce() {\n if (this.printTimeout) {\n clearTimeout(this.printTimeout);\n }\n this.printTimeout = setTimeout(() => {\n this.print();\n }, 100);\n }\n\n public getOperatorName(vaultId: number): string {\n const vault = this.vaultsById[vaultId];\n return this.accountRegistry.getName(vault.operatorAccountId) ?? vault.operatorAccountId;\n }\n\n public print() {\n console.clear();\n const lastDistributedFrameId = this.lastDistributedFrameId;\n const distributedFrame = this.poolVaultCapitalByFrame[this.lastDistributedFrameId ?? -1] ?? {};\n if (Object.keys(distributedFrame).length > 0) {\n console.log(`\\n\\nDistributed (Frame ${lastDistributedFrameId})`);\n\n const rows = [];\n let maxWidth = 0;\n for (const [key, entry] of Object.entries(distributedFrame)) {\n const { table, width } = this.createBondCapitalTable(\n entry.earnings ?? 0n,\n entry.contributors ?? [],\n `Earnings (shared = ${formatPercent(entry.vaultSharingPercent)})`,\n );\n if (width > maxWidth) {\n maxWidth = width;\n }\n rows.push({\n Vault: key,\n Who: this.getOperatorName(Number(key)),\n Balances: table,\n });\n }\n new Table({\n columns: [\n { name: 'Vault', alignment: 'left' },\n { name: 'Who', alignment: 'left' },\n {\n name: 'Balances',\n title: 'Contributor Balances',\n alignment: 'center',\n minLen: maxWidth,\n },\n ],\n rows,\n }).printTable();\n }\n console.log(\n `\\n\\nActive Bid Pool: ${formatArgons(this.bidPoolAmount)} (Frame ${this.nextFrameId})`,\n );\n const Frame = this.poolVaultCapitalByFrame[this.nextFrameId];\n if (Object.keys(Frame ?? {}).length > 0) {\n const rows = [];\n let maxWidth = 0;\n for (const [key, entry] of Object.entries(Frame)) {\n const { table, width } = this.createBondCapitalTable(\n entry.activatedCapital,\n entry.contributors ?? [],\n );\n if (width > maxWidth) {\n maxWidth = width;\n }\n rows.push({\n Vault: key,\n Who: this.getOperatorName(Number(key)),\n 'Pool Capital': table,\n });\n }\n new Table({\n columns: [\n { name: 'Vault', alignment: 'left' },\n { name: 'Who', alignment: 'left' },\n { name: 'Pool Capital', alignment: 'left', minLen: maxWidth },\n ],\n rows,\n }).printTable();\n }\n\n const raisingFunds = this.poolVaultCapitalByFrame[this.nextFrameId + 1] ?? [];\n let maxWidth = 0;\n const nextCapital = [];\n for (const x of this.vaultSecuritization) {\n const entry = raisingFunds[x.vaultId] ?? {};\n const { table, width } = this.createBondCapitalTable(\n x.activatedSecuritization,\n entry.contributors ?? [],\n );\n if (width > maxWidth) {\n maxWidth = width;\n }\n nextCapital.push({\n Vault: x.vaultId,\n Owner: this.getOperatorName(x.vaultId),\n 'Bitcoin Space': formatArgons(x.bitcoinSpace),\n 'Activated Securitization': `${formatArgons(x.activatedSecuritization)} / slot`,\n 'Liquidity Pool': `${formatPercent(x.vaultSharingPercent)} profit sharing${table}`,\n });\n }\n if (nextCapital.length) {\n console.log(`\\n\\nRaising Funds (Frame ${this.nextFrameId + 1}):`);\n new Table({\n columns: [\n { name: 'Vault', alignment: 'left' },\n { name: 'Owner', alignment: 'left' },\n { name: 'Bitcoin Space', alignment: 'right' },\n { name: 'Activated Securitization', alignment: 'right' },\n { name: 'Liquidity Pool', alignment: 'left', minLen: maxWidth },\n ],\n rows: nextCapital,\n }).printTable();\n }\n }\n\n private setVaultFrameData(frameId: number, vaultId: number, data: Partial<IVaultMiningBondFund>) {\n this.poolVaultCapitalByFrame ??= {};\n this.poolVaultCapitalByFrame[frameId] ??= {};\n this.poolVaultCapitalByFrame[frameId][vaultId] ??= {\n activatedCapital:\n data.activatedCapital ?? data.contributors?.reduce((a, b) => a + b.amount, 0n) ?? 0n,\n };\n\n Object.assign(this.poolVaultCapitalByFrame[frameId][vaultId], filterUndefined(data));\n }\n\n private createBondCapitalTable(total: bigint, contributors: IContributor[], title = 'Total') {\n const table = new Table({\n style: EMPTY_TABLE,\n columns: [\n { name: 'who', title: title, minLen: 10, alignment: 'right' },\n {\n name: 'amount',\n title: formatArgons(total),\n minLen: 7,\n alignment: 'left',\n },\n ],\n });\n for (const x of contributors) {\n table.addRow({\n who: this.accountRegistry.getName(x.address) ?? x.address,\n amount: formatArgons(x.amount),\n });\n }\n const str = table.render();\n const width = str.indexOf('\\n');\n return { table: str, width };\n }\n\n private loadFrameData(\n frameId: number,\n vaultFunds: Iterable<[u32, PalletLiquidityPoolsLiquidityPool]>,\n ): void {\n for (const [vaultId, fund] of vaultFunds) {\n const vaultIdNumber = vaultId.toNumber();\n const contributors = fund.contributorBalances.map(([a, b]) => ({\n address: a.toHuman(),\n amount: b.toBigInt(),\n }));\n if (fund.distributedProfits.isSome) {\n if (frameId > (this.lastDistributedFrameId ?? 0)) {\n this.lastDistributedFrameId = frameId;\n }\n }\n this.setVaultFrameData(frameId, vaultIdNumber, {\n earnings: fund.distributedProfits.isSome\n ? fund.distributedProfits.unwrap().toBigInt()\n : undefined,\n vaultSharingPercent: convertPermillToBigNumber(fund.vaultSharingPercent.toBigInt()),\n contributors,\n });\n }\n }\n}\n","import {\n Accountset,\n type ArgonClient,\n type ArgonPrimitivesBitcoinBitcoinNetwork,\n type KeyringPair,\n TxSubmitter,\n VaultMonitor,\n} from './index';\nimport { formatArgons } from './utils';\nimport { Vault } from './Vault';\nimport { GenericEvent } from '@polkadot/types';\nimport { TxResult } from './TxSubmitter';\nimport { hexToU8a, u8aToHex } from '@polkadot/util';\n\nexport const SATS_PER_BTC = 100_000_000n;\n\nexport class BitcoinLocks {\n constructor(readonly client: Promise<ArgonClient>) {}\n\n async getUtxoIdFromEvents(events: GenericEvent[]) {\n const client = await this.client;\n for (const event of events) {\n if (client.events.bitcoinLocks.BitcoinLockCreated.is(event)) {\n return event.data.utxoId.toNumber();\n }\n }\n return undefined;\n }\n\n async getMarketRate(satoshis: bigint): Promise<bigint> {\n const client = await this.client;\n const sats = client.createType('U64', satoshis.toString());\n const marketRate = await client.rpc.state.call('BitcoinApis_market_rate', sats.toHex(true));\n const rate = client.createType('Option<U128>', marketRate);\n if (!rate.isSome) {\n throw new Error('Market rate not available');\n }\n return rate.value.toBigInt();\n }\n\n async getRedemptionRate(satoshis: bigint): Promise<bigint> {\n const client = await this.client;\n const sats = client.createType('U64', satoshis.toString());\n const marketRate = await client.rpc.state.call('BitcoinApis_redemption_rate', sats.toHex(true));\n const rate = client.createType('Option<U128>', marketRate);\n if (!rate.isSome) {\n throw new Error('Redemption rate not available');\n }\n return rate.value.toBigInt();\n }\n\n async getConfig(): Promise<IBitcoinLockConfig> {\n const client = await this.client;\n const bitcoinNetwork = await client.query.bitcoinUtxos.bitcoinNetwork();\n return {\n releaseExpirationBlocks:\n client.consts.bitcoinLocks.lockReleaseCosignDeadlineBlocks.toNumber(),\n tickDurationMillis: await client.query.ticks\n .genesisTicker()\n .then(x => x.tickDurationMillis.toNumber()),\n bitcoinNetwork,\n };\n }\n\n async getBitcoinConfirmedBlockHeight(): Promise<number> {\n const client = await this.client;\n return await client.query.bitcoinUtxos\n .confirmedBitcoinBlockTip()\n .then(x => x.value?.blockHeight.toNumber() ?? 0);\n }\n\n /**\n * Gets the UTXO reference by ID.\n * @param utxoId - The UTXO ID to look up.\n * @param atHeight - Optional block height to query the UTXO reference at a specific point in time.\n * @return An object containing the transaction ID and output index, or undefined if not found.\n * @return.txid - The Bitcoin transaction ID of the UTXO.\n * @return.vout - The output index of the UTXO in the transaction.\n * @return.bitcoinTxid - The Bitcoin transaction ID of the UTXO formatted in little endian\n */\n async getUtxoRef(\n utxoId: number,\n atHeight?: number,\n ): Promise<{ txid: string; vout: number; bitcoinTxid: string } | undefined> {\n let client = await this.client;\n if (atHeight !== undefined) {\n const blockHash = await client.rpc.chain.getBlockHash(atHeight);\n client = (await client.at(blockHash)) as ArgonClient;\n }\n const refRaw = await client.query.bitcoinUtxos.utxoIdToRef(utxoId);\n if (!refRaw) {\n return;\n }\n const ref = refRaw.unwrap();\n\n const txid = u8aToHex(ref.txid);\n const bitcoinTxid = u8aToHex(ref.txid.reverse());\n const vout = ref.outputIndex.toNumber();\n return { txid, vout, bitcoinTxid };\n }\n\n async getReleaseRequest(\n utxoId: number,\n atHeight?: number,\n ): Promise<IReleaseRequestDetails | undefined> {\n let client = await this.client;\n if (atHeight !== undefined) {\n const blockHash = await client.rpc.chain.getBlockHash(atHeight);\n client = (await client.at(blockHash)) as ArgonClient;\n }\n const locksPendingRelease = await client.query.bitcoinLocks.locksPendingReleaseByUtxoId();\n\n for (const [id, request] of locksPendingRelease.entries()) {\n if (id.toNumber() === utxoId) {\n return {\n toScriptPubkey: request.toScriptPubkey.toHex(),\n bitcoinNetworkFee: request.bitcoinNetworkFee.toBigInt(),\n dueBlockHeight: request.cosignDueBlock.toNumber(),\n vaultId: request.vaultId.toNumber(),\n redemptionPrice: request.redemptionPrice.toBigInt(),\n };\n }\n }\n return undefined;\n }\n\n async submitVaultSignature(args: {\n utxoId: number;\n vaultSignature: Uint8Array;\n argonKeyring: KeyringPair;\n }): Promise<TxResult> {\n const { utxoId, vaultSignature, argonKeyring } = args;\n const client = await this.client;\n if (!vaultSignature || vaultSignature.byteLength < 70 || vaultSignature.byteLength > 73) {\n throw new Error(\n `Invalid vault signature length: ${vaultSignature.byteLength}. Must be 70-73 bytes.`,\n );\n }\n const signature = u8aToHex(vaultSignature);\n const tx = client.tx.bitcoinLocks.cosignRelease(utxoId, signature);\n const submitter = new TxSubmitter(client, tx, argonKeyring);\n\n return await submitter.submit();\n }\n\n async getBitcoinLock(utxoId: number): Promise<IBitcoinLock | undefined> {\n const client = await this.client;\n const utxoRaw = await client.query.bitcoinLocks.locksByUtxoId(utxoId);\n if (!utxoRaw.isSome) {\n return;\n }\n const utxo = utxoRaw.unwrap();\n const p2shBytesPrefix = '0020';\n const wscriptHash = utxo.utxoScriptPubkey.asP2wsh.wscriptHash.toHex().replace('0x', '');\n const p2wshScriptHashHex = `0x${p2shBytesPrefix}${wscriptHash}`;\n const vaultId = utxo.vaultId.toNumber();\n const lockPrice = utxo.lockPrice.toBigInt();\n const ownerAccount = utxo.ownerAccount.toHuman();\n const satoshis = utxo.satoshis.toBigInt();\n const vaultPubkey = utxo.vaultPubkey.toHex();\n const vaultClaimPubkey = utxo.vaultClaimPubkey.toHex();\n const ownerPubkey = utxo.ownerPubkey.toHex();\n const [fingerprint, cosign_hd_index, claim_hd_index] = utxo.vaultXpubSources;\n const vaultXpubSources = {\n parentFingerprint: new Uint8Array(fingerprint),\n cosignHdIndex: cosign_hd_index.toNumber(),\n claimHdIndex: claim_hd_index.toNumber(),\n };\n\n const vaultClaimHeight = utxo.vaultClaimHeight.toNumber();\n const openClaimHeight = utxo.openClaimHeight.toNumber();\n const createdAtHeight = utxo.createdAtHeight.toNumber();\n const isVerified = utxo.isVerified.toJSON();\n const isRejectedNeedsRelease = utxo.isRejectedNeedsRelease.toJSON();\n const fundHoldExtensionsByBitcoinExpirationHeight = Object.fromEntries(\n [...utxo.fundHoldExtensions.entries()].map(([x, y]) => [x.toNumber(), y.toBigInt()]),\n );\n\n return {\n utxoId,\n p2wshScriptHashHex,\n vaultId,\n lockPrice,\n ownerAccount,\n satoshis,\n vaultPubkey,\n vaultClaimPubkey,\n ownerPubkey,\n vaultXpubSources,\n vaultClaimHeight,\n openClaimHeight,\n createdAtHeight,\n isVerified,\n isRejectedNeedsRelease,\n fundHoldExtensionsByBitcoinExpirationHeight,\n };\n }\n\n /**\n * Finds the cosign signature for a vault lock by UTXO ID. Optionally waits for the signature\n * @param utxoId - The UTXO ID of the bitcoin lock\n * @param waitForSignatureMillis - Optional timeout in milliseconds to wait for the signature. If -1, waits indefinitely.\n */\n async findVaultCosignSignature(\n utxoId: number,\n waitForSignatureMillis?: number,\n ): Promise<{ blockHeight: number; signature: Uint8Array } | undefined> {\n const client = await this.client;\n const releaseHeight = await client.query.bitcoinLocks.lockReleaseCosignHeightById(utxoId);\n if (releaseHeight.isSome) {\n const releaseHeightValue = releaseHeight.unwrap().toNumber();\n const signature = await this.getVaultCosignSignature(utxoId, releaseHeightValue);\n if (signature) {\n return { blockHeight: releaseHeightValue, signature };\n }\n }\n\n if (!waitForSignatureMillis) {\n return undefined;\n }\n\n return await new Promise(async (resolve, reject) => {\n let timeout: NodeJS.Timeout | undefined;\n const unsub = await client.rpc.chain.subscribeNewHeads(header => {\n const atHeight = header.number.toNumber();\n this.getVaultCosignSignature(utxoId, atHeight)\n .then(signature => {\n if (signature) {\n unsub?.();\n clearTimeout(timeout);\n resolve({ signature, blockHeight: atHeight });\n }\n })\n .catch(err => {\n console.error(`Error checking for cosign signature at height ${atHeight}:`, err);\n });\n });\n if (waitForSignatureMillis !== -1) {\n timeout = setTimeout(() => {\n unsub?.();\n reject(new Error(`Timeout waiting for cosign signature for UTXO ID ${utxoId}`));\n }, waitForSignatureMillis);\n }\n });\n }\n\n async blockHashAtHeight(atHeight: number): Promise<string | undefined> {\n const client = await this.client;\n\n for (let i = 0; i < 10; i++) {\n const currentHeight = await client.query.system.number().then(x => x.toNumber());\n if (atHeight > currentHeight) {\n console.warn(\n `Requested block height ${atHeight} is greater than current height ${currentHeight}. Retrying...`,\n );\n await new Promise(resolve => setTimeout(resolve, 1000)); // wait 1 second before retrying\n continue;\n }\n const hash = await client.rpc.chain.getBlockHash(atHeight).then(x => x.toHex());\n if (hash === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n console.warn(`Block hash not found for height ${atHeight}. Retrying...`);\n await new Promise(resolve => setTimeout(resolve, 1000)); // wait 1 second before retrying\n continue;\n }\n return hash;\n }\n return undefined;\n }\n\n async getVaultCosignSignature(utxoId: number, atHeight: number): Promise<Uint8Array | undefined> {\n const client = await this.client;\n\n const blockHash = await this.blockHashAtHeight(atHeight);\n if (!blockHash) {\n console.warn(`Block hash not found for height ${atHeight}`);\n return undefined;\n }\n\n const blockEvents = await client.at(blockHash).then(api => api.query.system.events());\n for (const event of blockEvents) {\n if (client.events.bitcoinLocks.BitcoinUtxoCosigned.is(event.event)) {\n const { utxoId: id, signature } = event.event.data;\n if (id.toNumber() === utxoId) {\n return new Uint8Array(signature);\n }\n }\n }\n return undefined;\n }\n\n async findPendingMints(utxoId: number): Promise<bigint[]> {\n const client = await this.client;\n const pendingMint = await client.query.mint.pendingMintUtxos();\n const mintsPending: bigint[] = [];\n for (const [utxoIdRaw, _accountId, mintAmountRaw] of pendingMint) {\n if (utxoIdRaw.toNumber() === utxoId) {\n mintsPending.push(mintAmountRaw.toBigInt());\n }\n }\n return mintsPending;\n }\n\n async createInitializeLockTx(args: {\n vault: Vault;\n ownerBitcoinPubkey: Uint8Array;\n satoshis: bigint;\n argonKeyring: KeyringPair;\n reducedBalanceBy?: bigint;\n tip?: bigint;\n }) {\n const { vault, argonKeyring, satoshis, tip = 0n, ownerBitcoinPubkey } = args;\n const client = await this.client;\n if (ownerBitcoinPubkey.length !== 33) {\n throw new Error(\n `Invalid Bitcoin key length: ${ownerBitcoinPubkey.length}. Must be a compressed pukey (33 bytes).`,\n );\n }\n\n const tx = client.tx.bitcoinLocks.initialize(vault.vaultId, satoshis, ownerBitcoinPubkey);\n const submitter = new TxSubmitter(\n client,\n client.tx.bitcoinLocks.initialize(vault.vaultId, satoshis, ownerBitcoinPubkey),\n argonKeyring,\n );\n const marketPrice = await this.getMarketRate(BigInt(satoshis));\n const securityFee = vault.calculateBitcoinFee(marketPrice);\n\n const { canAfford, availableBalance, txFee } = await submitter.canAfford({\n tip,\n unavailableBalance: securityFee + (args.reducedBalanceBy ?? 0n),\n includeExistentialDeposit: true,\n });\n if (!canAfford) {\n throw new Error(\n `Insufficient funds to initialize lock. Available: ${formatArgons(availableBalance)}, Required: ${satoshis}`,\n );\n }\n return { tx, securityFee, txFee };\n }\n\n async initializeLock(args: {\n vault: Vault;\n ownerBitcoinPubkey: Uint8Array;\n argonKeyring: KeyringPair;\n satoshis: bigint;\n tip?: bigint;\n }): Promise<{\n lock: IBitcoinLock;\n createdAtHeight: number;\n txResult: TxResult;\n securityFee: bigint;\n }> {\n const { argonKeyring, tip = 0n } = args;\n const client = await this.client;\n\n const { tx, securityFee } = await this.createInitializeLockTx(args);\n const submitter = new TxSubmitter(client, tx, argonKeyring);\n const txResult = await submitter.submit({ waitForBlock: true, logResults: true, tip });\n const blockHash = await txResult.inBlockPromise;\n const blockHeight = await client\n .at(blockHash)\n .then(x => x.query.system.number())\n .then(x => x.toNumber());\n const utxoId = (await this.getUtxoIdFromEvents(txResult.events)) ?? 0;\n if (utxoId === 0) {\n throw new Error('Bitcoin lock creation failed, no UTXO ID found in transaction events');\n }\n const lock = await this.getBitcoinLock(utxoId);\n if (!lock) {\n throw new Error(`Lock with ID ${utxoId} not found after initialization`);\n }\n return { lock, createdAtHeight: blockHeight, txResult, securityFee };\n }\n\n async requiredSatoshisForArgonLiquidity(argonAmount: bigint): Promise<bigint> {\n /**\n * If 1_000_000 microgons are available, and the market rate is 100 microgons per satoshi, then\n * 1_000_000 / 100 = 10_000 satoshis needed\n */\n const marketRatePerBitcoin = await this.getMarketRate(SATS_PER_BTC);\n return (argonAmount * SATS_PER_BTC) / marketRatePerBitcoin;\n }\n\n async requestRelease(args: {\n lock: IBitcoinLock;\n releaseRequest: IReleaseRequest;\n argonKeyring: KeyringPair;\n tip?: bigint;\n }): Promise<{ blockHash: Uint8Array; blockHeight: number }> {\n const client = await this.client;\n const {\n lock,\n releaseRequest: { bitcoinNetworkFee, toScriptPubkey },\n argonKeyring,\n tip,\n } = args;\n\n if (!toScriptPubkey.startsWith('0x')) {\n throw new Error('toScriptPubkey must be a hex string starting with 0x');\n }\n\n const submitter = new TxSubmitter(\n client,\n client.tx.bitcoinLocks.requestRelease(lock.utxoId, toScriptPubkey, bitcoinNetworkFee),\n argonKeyring,\n );\n\n let redemptionPrice = await this.getRedemptionRate(lock.satoshis);\n if (redemptionPrice > lock.lockPrice) {\n redemptionPrice = lock.lockPrice;\n }\n\n const canAfford = await submitter.canAfford({\n tip,\n unavailableBalance: BigInt(redemptionPrice),\n });\n\n if (!canAfford.canAfford) {\n throw new Error(\n `Insufficient funds to release lock. Available: ${formatArgons(canAfford.availableBalance)}, Required: ${formatArgons(redemptionPrice)}`,\n );\n }\n const txResult = await submitter.submit({ waitForBlock: true, logResults: true, tip });\n const blockHash = await txResult.inBlockPromise;\n const blockHeight = await client\n .at(blockHash)\n .then(x => x.query.system.number())\n .then(x => x.toNumber());\n return {\n blockHash,\n blockHeight,\n };\n }\n\n async releasePrice(satoshis: bigint, lockPrice: bigint): Promise<bigint> {\n const client = await this.client;\n const redemptionRate = await this.getRedemptionRate(satoshis);\n if (redemptionRate > lockPrice) {\n return redemptionRate;\n }\n return lockPrice;\n }\n\n async getRatchetPrice(\n lock: IBitcoinLock,\n vault: Vault,\n ): Promise<{ burnAmount: bigint; ratchetingFee: bigint; marketRate: bigint }> {\n const { createdAtHeight, vaultClaimHeight, lockPrice, satoshis } = lock;\n const client = await this.client;\n const marketRate = await this.getMarketRate(BigInt(satoshis));\n\n let ratchetingFee = vault.terms.bitcoinBaseFee;\n let burnAmount = 0n;\n // ratchet up\n if (marketRate > lockPrice) {\n const lockFee = vault.calculateBitcoinFee(marketRate);\n const currentBitcoinHeight = await client.query.bitcoinUtxos\n .confirmedBitcoinBlockTip()\n .then(x => x.unwrap().blockHeight.toNumber());\n const blockLength = vaultClaimHeight - createdAtHeight;\n const elapsed = (currentBitcoinHeight - createdAtHeight) / blockLength;\n const remainingDuration = 1 - elapsed;\n ratchetingFee = BigInt(remainingDuration * Number(lockFee));\n } else {\n burnAmount = await this.releasePrice(lock.satoshis, lockPrice);\n }\n\n return {\n ratchetingFee,\n burnAmount,\n marketRate,\n };\n }\n\n async ratchet(args: {\n lock: IBitcoinLock;\n argonKeyring: KeyringPair;\n tip?: bigint;\n vault: Vault;\n }): Promise<{\n securityFee: bigint;\n txFee: bigint;\n newLockPrice: bigint;\n pendingMint: bigint;\n burned: bigint;\n blockHeight: number;\n bitcoinBlockHeight: number;\n }> {\n const { lock, argonKeyring, tip = 0n, vault } = args;\n const client = await this.client;\n\n const ratchetPrice = await this.getRatchetPrice(lock, vault);\n const txSubmitter = new TxSubmitter(\n client,\n client.tx.bitcoinLocks.ratchet(lock.utxoId),\n argonKeyring,\n );\n const canAfford = await txSubmitter.canAfford({\n tip,\n unavailableBalance: BigInt(ratchetPrice.burnAmount + ratchetPrice.ratchetingFee),\n });\n if (!canAfford.canAfford) {\n throw new Error(\n `Insufficient funds to ratchet lock. Available: ${formatArgons(canAfford.availableBalance)}, Required: ${formatArgons(\n ratchetPrice.burnAmount + ratchetPrice.ratchetingFee,\n )}`,\n );\n }\n\n const submission = await txSubmitter.submit({\n waitForBlock: true,\n tip,\n });\n const ratchetEvent = submission.events.find(x =>\n client.events.bitcoinLocks.BitcoinLockRatcheted.is(x),\n );\n if (!ratchetEvent) {\n throw new Error(`Ratchet event not found in transaction events`);\n }\n const blockHash = await submission.inBlockPromise;\n const api = await client.at(blockHash);\n const blockHeight = await api.query.system.number().then(x => x.toNumber());\n const bitcoinBlockHeight = await api.query.bitcoinUtxos\n .confirmedBitcoinBlockTip()\n .then(x => x.unwrap().blockHeight.toNumber());\n const { amountBurned, newLockPrice, originalLockPrice } = ratchetEvent.data;\n let mintAmount = newLockPrice.toBigInt();\n if (newLockPrice > originalLockPrice) {\n mintAmount -= originalLockPrice.toBigInt();\n }\n return {\n txFee: submission.finalFee ?? 0n,\n securityFee: ratchetPrice.ratchetingFee,\n pendingMint: mintAmount,\n newLockPrice: newLockPrice.toBigInt(),\n burned: amountBurned.toBigInt(),\n blockHeight,\n bitcoinBlockHeight,\n };\n }\n\n static async waitForSpace(\n accountset: Accountset,\n options: {\n argonAmount: bigint;\n bitcoinXpub: string;\n maxLockFee?: bigint;\n tip?: bigint;\n satoshiWiggleRoomForDynamicPrice?: bigint;\n },\n ): Promise<{\n satoshis: bigint;\n argons: bigint;\n vaultId: number;\n txFee: bigint;\n securityFee: bigint;\n utxoId: number;\n finalizedPromise: Promise<Uint8Array>;\n }> {\n const { argonAmount, bitcoinXpub, maxLockFee, tip = 0n } = options;\n const vaults = new VaultMonitor(accountset, {\n bitcoinSpaceAvailable: argonAmount,\n });\n const bitcoinXpubBuffer = hexToU8a(bitcoinXpub);\n\n return new Promise(async (resolve, reject) => {\n vaults.events.on('bitcoin-space-above', async (vaultId, amount) => {\n const vault = vaults.vaultsById[vaultId];\n const fee = vault.calculateBitcoinFee(amount);\n console.log(\n `Vault ${vaultId} has ${formatArgons(amount)} argons available for bitcoin. Lock fee is ${formatArgons(fee)}`,\n );\n if (maxLockFee !== undefined && fee > maxLockFee) {\n console.log(\n `Skipping vault ${vaultId} due to high lock fee: ${formatArgons(maxLockFee)}`,\n );\n return;\n }\n\n try {\n const bitcoinLock = new BitcoinLocks(accountset.client);\n let satoshis = await bitcoinLock.requiredSatoshisForArgonLiquidity(amount);\n satoshis -= options.satoshiWiggleRoomForDynamicPrice ?? 500n;\n const { txResult, lock, securityFee } = await bitcoinLock.initializeLock({\n vault,\n satoshis,\n argonKeyring: accountset.txSubmitterPair,\n ownerBitcoinPubkey: bitcoinXpubBuffer,\n tip,\n });\n\n resolve({\n satoshis,\n argons: argonAmount,\n vaultId,\n securityFee,\n txFee: txResult.finalFee!,\n finalizedPromise: txResult.finalizedPromise,\n utxoId: lock.utxoId,\n });\n } catch (err) {\n console.error('Error submitting bitcoin lock tx:', err);\n reject(err);\n } finally {\n vaults.stop();\n }\n });\n await vaults.monitor();\n });\n }\n}\n\nexport interface IBitcoinLockConfig {\n releaseExpirationBlocks: number;\n tickDurationMillis: number;\n bitcoinNetwork: ArgonPrimitivesBitcoinBitcoinNetwork;\n}\nexport interface IReleaseRequest {\n toScriptPubkey: string;\n bitcoinNetworkFee: bigint;\n}\n\nexport interface IReleaseRequestDetails extends IReleaseRequest {\n dueBlockHeight: number;\n vaultId: number;\n redemptionPrice: bigint;\n}\n\nexport interface IBitcoinLock {\n utxoId: number;\n p2wshScriptHashHex: string;\n vaultId: number;\n lockPrice: bigint;\n ownerAccount: string;\n satoshis: bigint;\n vaultPubkey: string;\n vaultClaimPubkey: string;\n ownerPubkey: string;\n vaultXpubSources: {\n parentFingerprint: Uint8Array;\n cosignHdIndex: number;\n claimHdIndex: number;\n };\n vaultClaimHeight: number;\n openClaimHeight: number;\n createdAtHeight: number;\n isVerified: boolean;\n isRejectedNeedsRelease: boolean;\n fundHoldExtensionsByBitcoinExpirationHeight: Record<number, bigint>;\n}\n","import { Keyring, KeyringPair, mnemonicGenerate } from './index';\n\nexport function keyringFromSuri(\n suri: string,\n cryptoType: 'sr25519' | 'ed25519' = 'sr25519',\n): KeyringPair {\n return new Keyring({ type: cryptoType }).createFromUri(suri);\n}\n\nexport function createKeyringPair(opts: { cryptoType?: 'sr25519' | 'ed25519' }): KeyringPair {\n const { cryptoType } = opts;\n const seed = mnemonicGenerate();\n return keyringFromSuri(seed, cryptoType);\n}\n","import './interfaces/augment-api';\nimport './interfaces/augment-types';\nimport './interfaces/types-lookup';\nimport type { KeyringPair, KeyringPair$Json } from '@polkadot/keyring/types';\nimport { ApiPromise, HttpProvider, Keyring, WsProvider } from '@polkadot/api';\nimport { cryptoWaitReady, decodeAddress, mnemonicGenerate } from '@polkadot/util-crypto';\nimport type { InterfaceTypes } from '@polkadot/types/types/registry';\nimport type { KeypairType } from '@polkadot/util-crypto/types';\nimport type { ProviderInterface } from '@polkadot/rpc-provider/types';\n\nexport { WageProtector } from './WageProtector';\nexport { TxSubmitter } from './TxSubmitter';\nexport { Accountset, type ISubaccountMiner, type IMiningIndex } from './Accountset';\nexport { MiningBids } from './MiningBids';\nexport { AccountMiners } from './AccountMiners';\nexport { FrameCalculator } from './FrameCalculator';\nexport { BlockWatch, getAuthorFromHeader, getTickFromHeader } from './BlockWatch';\nexport * from './utils';\nexport { AccountRegistry } from './AccountRegistry';\nexport { Vault } from './Vault';\nexport { VaultMonitor } from './VaultMonitor';\nexport { CohortBidder } from './CohortBidder';\nexport { BidPool } from './BidPool';\nexport * from './BitcoinLocks';\nexport * from './keyringUtils';\nexport { Keyring, KeyringPair, KeyringPair$Json, KeypairType, mnemonicGenerate, decodeAddress };\nexport { setConfig, getConfig, type ArgonClientConfig } from './config';\n\nexport { u8aToHex, hexToU8a, u8aEq } from '@polkadot/util';\n\nexport * from '@polkadot/types/lookup';\nexport { GenericEvent, GenericBlock, GenericAddress } from '@polkadot/types/generic';\nexport {\n BTreeMap,\n Bytes,\n Compact,\n Enum,\n Null,\n Option,\n Result,\n Bool,\n Tuple,\n Range,\n Struct,\n Text,\n U256,\n U8aFixed,\n Vec,\n bool,\n i128,\n u128,\n u16,\n u32,\n u64,\n u8,\n} from '@polkadot/types-codec';\nexport { type ITuple, type Codec } from '@polkadot/types-codec/types';\nexport {\n type AccountId32,\n type Call,\n type H160,\n type H256,\n type MultiAddress,\n type Permill,\n type AccountId,\n type Header,\n type Block,\n} from '@polkadot/types/interfaces/runtime';\nexport type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';\nexport { type BlockHash } from '@polkadot/types/interfaces/chain';\nexport { InterfaceTypes as interfaces };\n\nexport type ArgonClient = ApiPromise;\n\n/**\n * Wait for the crypto library to be ready (requires wasm, which needs async loading in commonjs)\n */\nexport async function waitForLoad(): Promise<void> {\n await cryptoWaitReady();\n}\n\n/**\n * Get a client for the given host\n * @param host The host to connect to\n * @returns The client\n */\nexport async function getClient(host: string): Promise<ArgonClient> {\n let provider: ProviderInterface;\n if (host.startsWith('http')) {\n provider = new HttpProvider(host);\n } else {\n provider = new WsProvider(host);\n }\n return await ApiPromise.create({ provider, noInitWarn: true });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/WageProtector.ts","../src/config.ts","../src/TxSubmitter.ts","../src/utils.ts","../src/AccountRegistry.ts","../src/BlockWatch.ts","../src/FrameCalculator.ts","../src/AccountMiners.ts","../src/Accountset.ts","../src/MiningBids.ts","../src/Vault.ts","../src/VaultMonitor.ts","../src/CohortBidder.ts","../src/BidPool.ts","../src/BitcoinLocks.ts","../src/keyringUtils.ts","../src/index.ts"],"names":["BN","BigNumber","ExtrinsicError","config","ROUND_FLOOR","printTable","maxWidth","u8aToHex","hexToU8a"],"mappings":"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","file":"index.js","sourcesContent":["import { ArgonClient } from './index';\n\nexport interface IArgonCpiSnapshot {\n // The target price of the argon as a fixed point number (18 decimals)\n argonUsdTargetPrice: bigint;\n // The current price of the argon as a fixed point number (18 decimals)\n argonUsdPrice: bigint;\n // The block hash in which the cpi was finalized\n finalizedBlock: Uint8Array;\n tick: bigint;\n}\n\n/**\n * The WageProtector class is used to protect wages from inflation by using the current Argon Price Index to adjust the\n * baseAmount to current conditions. This ensures that the wage is always stable and does not lose or gain value based on\n * demand for the argon or fiat monetary supply changes.\n */\nexport class WageProtector {\n constructor(public latestCpi: IArgonCpiSnapshot) {}\n\n /**\n * Converts the base wage to the current wage using the latest CPI snapshot\n *\n * @param baseWage The base wage to convert\n * @returns The protected wage\n */\n public getProtectedWage(baseWage: bigint): bigint {\n return (baseWage * this.latestCpi.argonUsdTargetPrice) / this.latestCpi.argonUsdPrice;\n }\n\n /**\n * Subscribes to the current CPI and calls the callback function whenever the CPI changes\n * @param client The ArgonClient to use\n * @param callback The callback function to call when the CPI changes\n * @returns An object with an unsubscribe function that can be called to stop the subscription\n */\n public static async subscribe(\n client: ArgonClient,\n callback: (cpi: WageProtector) => void,\n ): Promise<{\n unsubscribe: () => void;\n }> {\n const unsubscribe = await client.query.priceIndex.current(async cpi => {\n if (cpi.isNone) {\n return;\n }\n const finalizedBlock = await client.rpc.chain.getFinalizedHead();\n\n callback(\n new WageProtector({\n argonUsdTargetPrice: cpi.value.argonUsdTargetPrice.toBigInt(),\n argonUsdPrice: cpi.value.argonUsdPrice.toBigInt(),\n finalizedBlock: new Uint8Array(finalizedBlock),\n tick: cpi.value.tick.toBigInt(),\n }),\n );\n });\n return { unsubscribe };\n }\n\n /**\n * Creates a new WageProtector instance by subscribing to the current CPI and waiting for the first value\n * @param client The ArgonClient to use\n */\n public static async create(client: ArgonClient): Promise<WageProtector> {\n return new Promise<WageProtector>(async (resolve, reject) => {\n try {\n const { unsubscribe } = await WageProtector.subscribe(client, x => {\n resolve(x);\n unsubscribe();\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n","export interface ArgonClientConfig {\n debug?: boolean;\n keysVersion?: number;\n keysMnemonic?: string;\n subaccountRange?: string;\n}\n\nlet config: ArgonClientConfig = {};\n\n// Safe environment variable access that works in both Node.js and browser\nfunction getEnvVar(key: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key];\n }\n return undefined;\n}\n\nexport function setConfig(newConfig: ArgonClientConfig): void {\n config = { ...config, ...newConfig };\n}\n\nexport function getConfig(): ArgonClientConfig {\n return {\n debug: config.debug ?? getEnvVar('DEBUG') === 'true',\n keysVersion:\n config.keysVersion ??\n (getEnvVar('KEYS_VERSION') ? parseInt(getEnvVar('KEYS_VERSION')!) : undefined),\n keysMnemonic: config.keysMnemonic ?? getEnvVar('KEYS_MNEMONIC'),\n subaccountRange: config.subaccountRange ?? getEnvVar('SUBACCOUNT_RANGE') ?? '0-9',\n };\n}\n","import type { ISubmittableResult } from '@polkadot/types/types/extrinsic';\nimport {\n ArgonClient,\n dispatchErrorToExtrinsicError,\n ExtrinsicError,\n GenericEvent,\n KeyringPair,\n waitForLoad,\n} from './index';\nimport type { SubmittableExtrinsic } from '@polkadot/api/promise/types';\nimport type { SignerOptions } from '@polkadot/api/types';\nimport { getConfig } from './config';\n\nexport function logExtrinsicResult(result: ISubmittableResult) {\n if (getConfig().debug) {\n const json = result.status.toJSON() as any;\n const status = Object.keys(json)[0];\n console.debug('Transaction update: \"%s\"', status, json[status]);\n }\n}\n\nexport class TxSubmitter {\n constructor(\n public readonly client: ArgonClient,\n public tx: SubmittableExtrinsic,\n public pair: KeyringPair,\n ) {}\n\n public async feeEstimate(tip?: bigint): Promise<bigint> {\n const { partialFee } = await this.tx.paymentInfo(this.pair, { tip });\n return partialFee.toBigInt();\n }\n\n public async canAfford(\n options: {\n tip?: bigint;\n unavailableBalance?: bigint;\n includeExistentialDeposit?: boolean;\n } = {},\n ): Promise<{ canAfford: boolean; availableBalance: bigint; txFee: bigint }> {\n const { tip, unavailableBalance } = options;\n const account = await this.client.query.system.account(this.pair.address);\n let availableBalance = account.data.free.toBigInt();\n const userBalance = availableBalance;\n if (unavailableBalance) {\n availableBalance -= unavailableBalance;\n }\n const existentialDeposit = options.includeExistentialDeposit\n ? this.client.consts.balances.existentialDeposit.toBigInt()\n : 0n;\n const fees = await this.feeEstimate(tip);\n const totalCharge = fees + (tip ?? 0n);\n const canAfford = availableBalance >= totalCharge + existentialDeposit;\n return { canAfford, availableBalance: userBalance, txFee: fees };\n }\n\n public async submit(\n options: Partial<SignerOptions> & {\n logResults?: boolean;\n waitForBlock?: boolean;\n useLatestNonce?: boolean;\n txProgressCallback?: ITxProgressCallback;\n } = {},\n ): Promise<TxResult> {\n const { logResults, waitForBlock, useLatestNonce, ...apiOptions } = options;\n await waitForLoad();\n const result = new TxResult(this.client, logResults);\n result.txProgressCallback = options.txProgressCallback;\n let toHuman = (this.tx.toHuman() as any).method as any;\n let txString = [];\n let api = formatCall(toHuman);\n const args: any[] = [];\n if (api === 'proxy.proxy') {\n toHuman = toHuman.args.call;\n txString.push('Proxy');\n api = formatCall(toHuman);\n }\n if (api.startsWith('utility.batch')) {\n const calls = toHuman.args.calls.map(formatCall).join(', ');\n txString.push(`Batch[${calls}]`);\n } else {\n txString.push(api);\n args.push(toHuman.args);\n }\n args.unshift(txString.join('->'));\n if (useLatestNonce && !apiOptions.nonce) {\n apiOptions.nonce = await this.client.rpc.system.accountNextIndex(this.pair.address);\n }\n\n console.log('Submitting transaction from %s:', this.pair.address, ...args);\n await this.tx.signAndSend(this.pair, apiOptions, result.onResult.bind(result));\n if (waitForBlock) {\n await result.inBlockPromise;\n }\n return result;\n }\n}\n\nfunction formatCall(call: any): string {\n return `${call.section}.${call.method}`;\n}\n\nexport type ITxProgressCallback = (progressToInBlock: number, result: TxResult) => void;\nexport class TxResult {\n public inBlockPromise: Promise<Uint8Array>;\n public finalizedPromise: Promise<Uint8Array>;\n public status?: ISubmittableResult['status'];\n public readonly events: GenericEvent[] = [];\n\n /**\n * The index of the batch that was interrupted, if any.\n */\n public batchInterruptedIndex?: number;\n public includedInBlock?: Uint8Array;\n /**\n * The final fee paid for the transaction, including the fee tip.\n */\n public finalFee?: bigint;\n /**\n * The fee tip paid for the transaction.\n */\n public finalFeeTip?: bigint;\n\n public txProgressCallback?: ITxProgressCallback;\n\n private inBlockResolve!: (blockHash: Uint8Array) => void;\n private inBlockReject!: (error: ExtrinsicError) => void;\n private finalizedResolve!: (blockHash: Uint8Array) => void;\n private finalizedReject!: (error: ExtrinsicError) => void;\n\n constructor(\n private readonly client: ArgonClient,\n private shouldLog: boolean = false,\n ) {\n this.inBlockPromise = new Promise((resolve, reject) => {\n this.inBlockResolve = resolve;\n this.inBlockReject = reject;\n });\n this.finalizedPromise = new Promise((resolve, reject) => {\n this.finalizedResolve = resolve;\n this.finalizedReject = reject;\n });\n // drown unhandled\n this.inBlockPromise.catch(() => {});\n this.finalizedPromise.catch(() => {});\n }\n\n public onResult(result: ISubmittableResult) {\n this.status = result.status;\n if (this.shouldLog) {\n logExtrinsicResult(result);\n }\n const { events, status, dispatchError, isFinalized } = result;\n if (status.isInBlock) {\n this.includedInBlock = new Uint8Array(status.asInBlock);\n let encounteredError = dispatchError;\n let batchErrorIndex: number | undefined;\n for (const event of events) {\n this.events.push(event.event);\n if (this.client.events.utility.BatchInterrupted.is(event.event)) {\n batchErrorIndex = event.event.data[0].toNumber();\n this.batchInterruptedIndex = batchErrorIndex;\n encounteredError = event.event.data[1] as any;\n }\n if (this.client.events.transactionPayment.TransactionFeePaid.is(event.event)) {\n const [_who, actualFee, tip] = event.event.data;\n this.finalFee = actualFee.toBigInt();\n this.finalFeeTip = tip.toBigInt();\n }\n }\n\n if (encounteredError) {\n const error = dispatchErrorToExtrinsicError(this.client, encounteredError, batchErrorIndex);\n this.reject(error);\n } else {\n this.inBlockResolve(new Uint8Array(status.asInBlock));\n }\n }\n if (isFinalized) {\n this.finalizedResolve(status.asFinalized);\n }\n if (this.txProgressCallback) {\n let percent = 0;\n if (result.status.isBroadcast) {\n percent = 50;\n } else if (result.status.isInBlock) {\n percent = 100;\n }\n this.txProgressCallback(percent, this);\n }\n }\n\n private reject(error: ExtrinsicError) {\n this.inBlockReject(error);\n this.finalizedReject(error);\n }\n}\n","import BigNumber, * as BN from 'bignumber.js';\nimport type { ArgonClient, GenericEvent } from './index';\nimport type { DispatchError } from '@polkadot/types/interfaces';\nimport { EventRecord } from '@polkadot/types/interfaces/system';\n\nconst { ROUND_FLOOR } = BN;\n\nexport const MICROGONS_PER_ARGON = 1_000_000;\n\nexport function formatArgons(microgons: bigint | number): string {\n if (microgons === undefined || microgons === null) return 'na';\n const isNegative = microgons < 0;\n let format = BigNumber(microgons.toString())\n .abs()\n .div(MICROGONS_PER_ARGON)\n .toFormat(2, ROUND_FLOOR);\n if (format.endsWith('.00')) {\n format = format.slice(0, -3);\n }\n return `${isNegative ? '-' : ''}₳${format}`;\n}\n\nexport function formatPercent(x: BigNumber | undefined): string {\n if (!x) return 'na';\n return `${x.times(100).decimalPlaces(3)}%`;\n}\n\ntype NonNullableProps<T> = {\n [K in keyof T]-?: Exclude<T[K], undefined | null>;\n};\n\nexport function filterUndefined<T extends Record<string, any>>(\n obj: Partial<T>,\n): NonNullableProps<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, value]) => value !== undefined && value !== null),\n ) as NonNullableProps<T>;\n}\n\nexport async function gettersToObject<T>(obj: T): Promise<T> {\n if (obj === null || obj === undefined || typeof obj !== 'object') return obj;\n\n const keys = [];\n // eslint-disable-next-line guard-for-in\n for (const key in obj) {\n keys.push(key);\n }\n\n if (Symbol.iterator in obj) {\n const iterableToArray = [];\n // @ts-ignore\n for (const item of obj) {\n iterableToArray.push(await gettersToObject(item));\n }\n return iterableToArray as any;\n }\n\n const result = {} as any;\n for (const key of keys) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n // Skip functions\n if (descriptor && typeof descriptor.value === 'function') {\n continue;\n }\n const value = descriptor && descriptor.get ? descriptor.get.call(obj) : obj[key as keyof T];\n if (typeof value === 'function') continue;\n\n result[key] = await gettersToObject(value);\n }\n return result;\n}\n\nexport function toFixedNumber(\n value: string | number | BigNumber, // accept string to avoid early precision loss\n decimals: number,\n): bigint {\n const factor = new BigNumber(10).pow(decimals);\n const bn = new BigNumber(value);\n // truncate toward 0; use ROUND_FLOOR if you really need floor for positives\n const int = bn.times(factor).integerValue(BigNumber.ROUND_DOWN);\n return BigInt(int.toFixed(0));\n}\n\nexport function convertNumberToFixedU128(value: number): bigint {\n return toFixedNumber(value, 18);\n}\n\nexport function convertFixedU128ToBigNumber(fixedU128: bigint): BigNumber {\n const decimalFactor = new BigNumber(10).pow(new BigNumber(18)); // Fixed point precision (18 decimals)\n const rawValue = new BigNumber(fixedU128.toString()); // Parse the u128 string value into BN\n // Convert the value to fixed-point\n return rawValue.div(decimalFactor);\n}\n\nexport function convertPermillToBigNumber(permill: bigint): BigNumber {\n const decimalFactor = new BigNumber(1_000_000);\n const rawValue = new BigNumber(permill.toString()); // Parse the u128 string value into BN\n // Convert the value to fixed-point\n return rawValue.div(decimalFactor);\n}\n\nexport function convertNumberToPermill(value: number): bigint {\n return toFixedNumber(value, 6);\n}\n\nexport function eventDataToJson(event: GenericEvent): any {\n const obj = {} as any;\n event.data.forEach((data, index) => {\n const name = event.data.names?.[index];\n obj[name ?? `${index}`] = data.toJSON();\n });\n return obj;\n}\n\nexport function dispatchErrorToString(client: ArgonClient, error: DispatchError) {\n let message = error.toString();\n if (error.isModule) {\n const decoded = client.registry.findMetaError(error.asModule);\n const { docs, name, section } = decoded;\n message = `${section}.${name}: ${docs.join(' ')}`;\n }\n return message;\n}\n\n// ExtrinsicError\nexport class ExtrinsicError extends Error {\n constructor(\n public readonly errorCode: string,\n public readonly details?: string,\n public readonly batchInterruptedIndex?: number,\n ) {\n super(errorCode);\n }\n\n public override toString() {\n if (this.batchInterruptedIndex !== undefined) {\n return `${this.errorCode} ${this.details ?? ''} (Batch interrupted at index ${this.batchInterruptedIndex})`;\n }\n return `${this.errorCode} ${this.details ?? ''}`;\n }\n}\n\nexport function dispatchErrorToExtrinsicError(\n client: ArgonClient,\n error: DispatchError,\n batchInterruptedIndex?: number,\n) {\n if (error.isModule) {\n const decoded = client.registry.findMetaError(error.asModule);\n const { docs, name, section } = decoded;\n return new ExtrinsicError(`${section}.${name}`, docs.join(' '), batchInterruptedIndex);\n }\n return new ExtrinsicError(error.toString(), undefined, batchInterruptedIndex);\n}\n\n/**\n * Check for an extrinsic success event in the given events. Helpful to validate the result of an extrinsic inclusion in a block (it will be included even if it fails)\n * @param events The events to check\n * @param client The client to use\n * @returns A promise that resolves if the extrinsic was successful, and rejects if it failed\n */\nexport function checkForExtrinsicSuccess(\n events: EventRecord[],\n client: ArgonClient,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n for (const { event } of events) {\n if (client.events.system.ExtrinsicSuccess.is(event)) {\n resolve();\n } else if (client.events.system.ExtrinsicFailed.is(event)) {\n // extract the data for this event\n const [dispatchError] = event.data;\n let errorInfo = dispatchError.toString();\n\n if (dispatchError.isModule) {\n const decoded = client.registry.findMetaError(dispatchError.asModule);\n errorInfo = `${decoded.section}.${decoded.name}`;\n }\n\n reject(new Error(`${event.section}.${event.method}:: ExtrinsicFailed:: ${errorInfo}`));\n }\n }\n });\n}\n\n/**\n * JSON with support for BigInt in JSON.stringify and JSON.parse\n */\nexport class JsonExt {\n public static stringify(obj: any, space?: number): string {\n return JSON.stringify(\n obj,\n (_, v) => {\n if (typeof v === 'bigint') {\n return `${v}n`; // Append 'n' to indicate BigInt\n }\n // convert Uint8Array objects to a JSON representation\n if (v instanceof Uint8Array) {\n return {\n type: 'Buffer',\n data: Array.from(v), // Convert Uint8Array to an array of numbers\n };\n }\n return v;\n },\n space,\n );\n }\n\n public static parse<T = any>(str: string): T {\n return JSON.parse(str, (_, v) => {\n if (typeof v === 'string' && v.match(/^\\d+n$/)) {\n return BigInt(v.slice(0, -1));\n }\n // rehydrate Uint8Array objects\n if (typeof v === 'object' && v !== null && v.type === 'Buffer' && Array.isArray(v.data)) {\n return Uint8Array.from(v.data);\n }\n return v;\n });\n }\n}\n\nexport function createNanoEvents<Events extends EventsMap = DefaultEvents>(): TypedEmitter<Events> {\n return new TypedEmitter<Events>();\n}\n\nexport class TypedEmitter<Events extends EventsMap = DefaultEvents> {\n private events: Partial<{ [E in keyof Events]: Events[E][] }> = {};\n\n emit<K extends keyof Events>(this: this, event: K, ...args: Parameters<Events[K]>): void {\n for (const cb of this.events[event] || []) {\n cb(...args);\n }\n }\n\n on<K extends keyof Events>(this: this, event: K, cb: Events[K]): () => void {\n (this.events[event] ||= []).push(cb);\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i);\n };\n }\n}\n\ninterface EventsMap {\n [event: string]: any;\n}\n\ninterface DefaultEvents extends EventsMap {\n [event: string]: (...args: any) => void;\n}\n","export class AccountRegistry {\n public namedAccounts: Map<string, string> = new Map();\n public me: string = 'me';\n\n constructor(name?: string) {\n if (name) {\n this.me = name;\n }\n }\n\n public getName(address: string): string | undefined {\n return this.namedAccounts.get(address);\n }\n\n public register(address: string, name: string): void {\n this.namedAccounts.set(address, name);\n }\n\n public static factory: (name?: string) => AccountRegistry = name => new AccountRegistry(name);\n}\n","import { type ArgonClient, type GenericEvent } from './index';\nimport type { Header, SignedBlock } from '@polkadot/types/interfaces';\nimport { eventDataToJson, formatArgons } from './utils';\nimport { createNanoEvents } from './utils';\n\nexport type BlockWatchEvents = {\n block: (\n header: Header,\n digests: { tick: number; author: string },\n events: GenericEvent[],\n ) => void;\n 'vaults-updated': (header: Header, vaultIds: Set<number>) => void;\n 'bitcoin-verified': (\n header: Header,\n lockedBitcoin: { utxoId: number; vaultId: number; lockPrice: bigint },\n ) => void;\n 'mining-bid': (header: Header, bid: { amount: bigint; accountId: string }) => void;\n 'mining-bid-ousted': (\n header: Header,\n bid: {\n preservedArgonotHold: boolean;\n accountId: string;\n },\n ) => void;\n event: (header: Header, event: GenericEvent) => void;\n};\n\nexport function getTickFromHeader(client: ArgonClient, header: Header): number | undefined {\n for (const x of header.digest.logs) {\n if (x.isPreRuntime) {\n const [engineId, data] = x.asPreRuntime;\n if (engineId.toString() === 'aura') {\n return client.createType('u64', data).toNumber();\n }\n }\n }\n return undefined;\n}\n\nexport function getAuthorFromHeader(client: ArgonClient, header: Header): string | undefined {\n for (const x of header.digest.logs) {\n if (x.isPreRuntime) {\n const [engineId, data] = x.asPreRuntime;\n if (engineId.toString() === 'pow_') {\n return client.createType('AccountId32', data).toHuman();\n }\n }\n }\n return undefined;\n}\n\nexport class BlockWatch {\n public readonly events = createNanoEvents<BlockWatchEvents>();\n public readonly locksById: {\n [utxoId: number]: {\n vaultId: number;\n lockPrice: bigint;\n };\n } = {};\n private unsubscribe?: () => void;\n\n constructor(\n private readonly mainchain: Promise<ArgonClient>,\n private options: {\n finalizedBlocks?: boolean;\n shouldLog?: boolean;\n } = {},\n ) {\n this.options.shouldLog ??= true;\n this.options.finalizedBlocks ??= false;\n }\n\n public stop() {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = undefined;\n }\n }\n\n public async start() {\n await this.watchBlocks();\n }\n\n private async watchBlocks() {\n const client = await this.mainchain;\n const onBlock = async (header: Header) => {\n try {\n await this.processBlock(header);\n } catch (e) {\n console.error('Error processing block', e);\n }\n };\n if (this.options.finalizedBlocks) {\n this.unsubscribe = await client.rpc.chain.subscribeFinalizedHeads(onBlock);\n } else {\n this.unsubscribe = await client.rpc.chain.subscribeNewHeads(onBlock);\n }\n }\n\n private async processBlock(header: Header) {\n const client = await this.mainchain;\n\n if (this.options.shouldLog) {\n console.log(`-------------------------------------\nBLOCK #${header.number}, ${header.hash.toHuman()}`);\n }\n const blockHash = header.hash;\n const api = await client.at(blockHash);\n const isBlockVote = await api.query.blockSeal.isBlockFromVoteSeal();\n if (!isBlockVote) {\n console.warn('> Compute reactivated!');\n }\n const events = await api.query.system.events();\n const reloadVaults = new Set<number>();\n let block: SignedBlock | undefined = undefined;\n\n for (const { event, phase } of events) {\n const data = eventDataToJson(event);\n if (data.vaultId) {\n const vaultId = data.vaultId as number;\n reloadVaults.add(vaultId);\n }\n\n let logEvent = false;\n\n if (event.section === 'liquidityPools') {\n if (client.events.liquidityPools.BidPoolDistributed.is(event)) {\n const { bidPoolBurned, bidPoolDistributed } = event.data;\n data.burned = formatArgons(bidPoolBurned.toBigInt());\n data.distributed = formatArgons(bidPoolDistributed.toBigInt());\n logEvent = true;\n } else if (client.events.liquidityPools.NextBidPoolCapitalLocked.is(event)) {\n const { totalActivatedCapital } = event.data;\n data.totalActivatedCapital = formatArgons(totalActivatedCapital.toBigInt());\n logEvent = true;\n }\n } else if (event.section === 'bitcoinLocks') {\n if (client.events.bitcoinLocks.BitcoinLockCreated.is(event)) {\n const { lockPrice, utxoId, accountId, vaultId } = event.data;\n this.locksById[utxoId.toNumber()] = {\n vaultId: vaultId.toNumber(),\n lockPrice: lockPrice.toBigInt(),\n };\n data.lockPrice = formatArgons(lockPrice.toBigInt());\n data.accountId = accountId.toHuman();\n reloadVaults.add(vaultId.toNumber());\n }\n logEvent = true;\n } else if (event.section === 'mint') {\n logEvent = true;\n if (client.events.mint.MiningMint.is(event)) {\n const { amount } = event.data;\n data.amount = formatArgons(amount.toBigInt());\n }\n } else if (event.section === 'miningSlot') {\n logEvent = true;\n if (client.events.miningSlot.SlotBidderAdded.is(event)) {\n data.amount = formatArgons(event.data.bidAmount.toBigInt());\n this.events.emit('mining-bid', header, {\n amount: event.data.bidAmount.toBigInt(),\n accountId: event.data.accountId.toString(),\n });\n } else if (client.events.miningSlot.SlotBidderDropped.is(event)) {\n this.events.emit('mining-bid-ousted', header, {\n accountId: event.data.accountId.toString(),\n preservedArgonotHold: event.data.preservedArgonotHold.toPrimitive(),\n });\n }\n } else if (event.section === 'bitcoinUtxos') {\n logEvent = true;\n if (client.events.bitcoinUtxos.UtxoVerified.is(event)) {\n const { utxoId } = event.data;\n const details = await this.getBitcoinLockDetails(utxoId.toNumber(), blockHash);\n this.events.emit('bitcoin-verified', header, {\n utxoId: utxoId.toNumber(),\n vaultId: details.vaultId,\n lockPrice: details.lockPrice,\n });\n\n data.lockPrice = formatArgons(details.lockPrice);\n reloadVaults.add(details.vaultId);\n }\n } else if (event.section === 'system') {\n if (client.events.system.ExtrinsicFailed.is(event)) {\n const { dispatchError } = event.data;\n if (dispatchError.isModule) {\n const decoded = api.registry.findMetaError(dispatchError.asModule);\n const { name, section } = decoded;\n block ??= await client.rpc.chain.getBlock(header.hash);\n const extrinsicIndex = phase.asApplyExtrinsic.toNumber();\n const ext = block!.block.extrinsics[extrinsicIndex];\n // translate dispatchInfo into readable tx\n if (this.options.shouldLog) {\n console.log(\n `> [Failed Tx] ${section}.${name} -> ${ext.method.section}.${ext.method.method} (nonce=${ext.nonce})`,\n (ext.toHuman() as any)?.method?.args,\n );\n }\n } else {\n // Other, CannotLookup, BadOrigin, no extra info\n if (this.options.shouldLog) {\n console.log(`x [Failed Tx] ${dispatchError.toJSON()}`);\n }\n }\n }\n }\n if (this.options.shouldLog && logEvent) {\n console.log(`> ${event.section}.${event.method}`, data);\n }\n this.events.emit('event', header, event);\n }\n if (reloadVaults.size) this.events.emit('vaults-updated', header, reloadVaults);\n\n const tick = getTickFromHeader(client, header)!;\n const author = getAuthorFromHeader(client, header)!;\n\n this.events.emit(\n 'block',\n header,\n { tick, author },\n events.map(x => x.event),\n );\n }\n\n private async getBitcoinLockDetails(\n utxoId: number,\n blockHash: Uint8Array,\n ): Promise<{ vaultId: number; lockPrice: bigint }> {\n const client = await this.mainchain;\n const api = await client.at(blockHash);\n if (!this.locksById[utxoId]) {\n const lock = await api.query.bitcoinLocks.locksByUtxoId(utxoId);\n this.locksById[utxoId] = {\n vaultId: lock.value.vaultId.toNumber(),\n lockPrice: lock.value.lockPrice.toBigInt(),\n };\n }\n return this.locksById[utxoId];\n }\n}\n","import { type ArgonClient, getTickFromHeader, type Header } from './index';\n\n/**\n * A frame starts with the bidding start time (noon EDT), and ends the next day at noon EDT. Frame 0 was the first day of\n * bidding, and frame 1 began once the first miners were selected. This occurred on February 24th, 2025 at 12pm EDT.\n *\n * This class calculates fromeId from ticks.\n */\nexport class FrameCalculator {\n private miningConfig:\n | { ticksBetweenSlots: number; slotBiddingStartAfterTicks: number }\n | undefined;\n private genesisTick: number | undefined;\n\n async getForTick(client: ArgonClient, tick: number) {\n const { ticksBetweenFrames, biddingStartTick } = await this.getConfig(client);\n\n const ticksSinceMiningStart = tick - biddingStartTick;\n\n return Math.floor(ticksSinceMiningStart / ticksBetweenFrames);\n }\n\n async getTickRangeForFrame(client: ArgonClient, frameId: number): Promise<[number, number]> {\n const { ticksBetweenFrames, biddingStartTick } = await this.getConfig(client);\n\n const startingTick = biddingStartTick + Math.floor(frameId * ticksBetweenFrames);\n const endingTick = startingTick + ticksBetweenFrames - 1;\n\n return [startingTick, endingTick];\n }\n\n async getForHeader(client: ArgonClient, header: Header) {\n if (header.number.toNumber() === 0) return 0;\n const tick = getTickFromHeader(client, header);\n if (tick === undefined) return undefined;\n return this.getForTick(client, tick);\n }\n\n private async getConfig(client: ArgonClient) {\n this.miningConfig ??= await client.query.miningSlot.miningConfig().then(x => ({\n ticksBetweenSlots: x.ticksBetweenSlots.toNumber(),\n slotBiddingStartAfterTicks: x.slotBiddingStartAfterTicks.toNumber(),\n }));\n this.genesisTick ??= await client.query.ticks\n .genesisTick()\n .then((x: { toNumber: () => number }) => x.toNumber());\n const config = this.miningConfig!;\n const genesisTick = this.genesisTick!;\n return {\n ticksBetweenFrames: config.ticksBetweenSlots,\n slotBiddingStartAfterTicks: config.slotBiddingStartAfterTicks,\n genesisTick,\n biddingStartTick: genesisTick + config.slotBiddingStartAfterTicks,\n };\n }\n}\n","import { Accountset, IMiningIndex, ISubaccountMiner } from './Accountset';\nimport { Header } from '@polkadot/types/interfaces/runtime';\nimport { GenericEvent } from '@polkadot/types';\nimport { BlockWatch } from './BlockWatch';\nimport { FrameCalculator } from './FrameCalculator';\nimport { createNanoEvents } from './utils';\n\nexport class AccountMiners {\n public events = createNanoEvents<{\n mined: (\n header: Header,\n earnings: {\n author: string;\n argons: bigint;\n argonots: bigint;\n forCohortWithStartingFrameId: number;\n duringFrameId: number;\n },\n ) => void;\n minted: (\n header: Header,\n minted: {\n accountId: string;\n argons: bigint;\n forCohortWithStartingFrameId: number;\n duringFrameId: number;\n },\n ) => void;\n }>();\n\n public frameCalculator: FrameCalculator;\n\n private trackedAccountsByAddress: {\n [address: string]: {\n startingFrameId: number;\n subaccountIndex: number;\n };\n } = {};\n\n constructor(\n private accountset: Accountset,\n registeredMiners: (ISubaccountMiner & { seat: IMiningIndex })[],\n private options: { shouldLog: boolean } = { shouldLog: false },\n ) {\n this.frameCalculator = new FrameCalculator();\n for (const miner of registeredMiners) {\n this.trackedAccountsByAddress[miner.address] = {\n startingFrameId: miner.seat.startingFrameId,\n subaccountIndex: miner.subaccountIndex,\n };\n }\n }\n\n public async watch(): Promise<BlockWatch> {\n const blockWatch = new BlockWatch(this.accountset.client, {\n shouldLog: this.options.shouldLog,\n });\n blockWatch.events.on('block', this.onBlock.bind(this));\n await blockWatch.start();\n return blockWatch;\n }\n\n public async onBlock(\n header: Header,\n digests: { author: string; tick: number },\n events: GenericEvent[],\n ) {\n const { author, tick } = digests;\n if (author) {\n const voteAuthor = this.trackedAccountsByAddress[author];\n if (voteAuthor && this.options.shouldLog) {\n console.log('> Our vote author', this.accountset.accountRegistry.getName(author));\n }\n } else {\n console.warn('> No vote author found');\n }\n const client = await this.accountset.client;\n const currentFrameId = await this.frameCalculator.getForTick(client, tick);\n let newMiners: { frameId: number; addresses: string[] } | undefined;\n const dataByCohort: {\n duringFrameId: number;\n [cohortStartingFrameId: number]: {\n argonsMinted: bigint;\n argonsMined: bigint;\n argonotsMined: bigint;\n };\n } = { duringFrameId: currentFrameId };\n for (const event of events) {\n if (client.events.miningSlot.NewMiners.is(event)) {\n newMiners = {\n frameId: event.data.frameId.toNumber(),\n addresses: event.data.newMiners.map(x => x.accountId.toHuman()),\n };\n }\n if (client.events.blockRewards.RewardCreated.is(event)) {\n const { rewards } = event.data;\n for (const reward of rewards) {\n const { argons, ownership } = reward;\n\n const entry = this.trackedAccountsByAddress[author];\n if (entry) {\n dataByCohort[entry.startingFrameId] ??= {\n argonsMinted: 0n,\n argonsMined: 0n,\n argonotsMined: 0n,\n };\n dataByCohort[entry.startingFrameId].argonotsMined += ownership.toBigInt();\n dataByCohort[entry.startingFrameId].argonsMined += argons.toBigInt();\n this.events.emit('mined', header, {\n author,\n argons: argons.toBigInt(),\n argonots: ownership.toBigInt(),\n forCohortWithStartingFrameId: entry.startingFrameId,\n duringFrameId: currentFrameId,\n });\n }\n }\n }\n if (client.events.mint.MiningMint.is(event)) {\n const { perMiner } = event.data;\n const amountPerMiner = perMiner.toBigInt();\n if (amountPerMiner > 0n) {\n for (const [address, info] of Object.entries(this.trackedAccountsByAddress)) {\n const { startingFrameId } = info;\n dataByCohort[startingFrameId] ??= {\n argonsMinted: 0n,\n argonsMined: 0n,\n argonotsMined: 0n,\n };\n dataByCohort[startingFrameId].argonsMinted += amountPerMiner;\n this.events.emit('minted', header, {\n accountId: address,\n argons: amountPerMiner,\n forCohortWithStartingFrameId: startingFrameId,\n duringFrameId: currentFrameId,\n });\n }\n }\n }\n }\n if (newMiners) {\n this.newCohortMiners(newMiners.frameId, newMiners.addresses);\n }\n return dataByCohort;\n }\n\n private newCohortMiners(frameId: number, addresses: string[]) {\n for (const [address, info] of Object.entries(this.trackedAccountsByAddress)) {\n if (info.startingFrameId === frameId - 10) {\n delete this.trackedAccountsByAddress[address];\n }\n }\n for (const address of addresses) {\n const entry = this.accountset.subAccountsByAddress[address];\n if (entry) {\n this.trackedAccountsByAddress[address] = {\n startingFrameId: frameId,\n subaccountIndex: entry.index,\n };\n }\n }\n }\n\n public static async loadAt(\n accountset: Accountset,\n options: {\n blockHash?: Uint8Array;\n shouldLog?: boolean;\n } = {},\n ) {\n const seats = await accountset.miningSeats(options.blockHash);\n const registered = seats.filter(x => x.seat !== undefined);\n return new AccountMiners(accountset, registered as any, {\n shouldLog: options.shouldLog ?? false,\n });\n }\n}\n","import { type ArgonClient, getClient, Keyring, type KeyringPair } from './index';\nimport { dispatchErrorToString, formatArgons } from './utils';\nimport { logExtrinsicResult, TxSubmitter } from './TxSubmitter';\nimport { AccountRegistry } from './AccountRegistry';\nimport { SubmittableExtrinsic } from '@polkadot/api/promise/types';\nimport { AccountMiners } from './AccountMiners';\nimport { ApiDecoration } from '@polkadot/api/types';\nimport { getConfig } from './config';\nimport { u8aToHex } from '@polkadot/util';\n\nexport type SubaccountRange = readonly number[];\n\nexport type IAddressNames = Map<string, string>;\n\nexport interface ISubaccountMiner {\n address: string;\n subaccountIndex: number;\n seat?: IMiningIndex;\n isLastDay: boolean;\n}\n\nexport interface IMiningIndex {\n startingFrameId: number;\n index: number;\n bidAmount: bigint;\n}\n\nexport class Accountset {\n public txSubmitterPair: KeyringPair;\n public isProxy = false;\n public seedAddress: string;\n public subAccountsByAddress: {\n [address: string]: { index: number; pair?: KeyringPair };\n } = {};\n public accountRegistry: AccountRegistry;\n public readonly client: Promise<ArgonClient>;\n\n public get addresses(): string[] {\n return [this.seedAddress, ...Object.keys(this.subAccountsByAddress)];\n }\n\n public get namedAccounts(): IAddressNames {\n return this.accountRegistry.namedAccounts;\n }\n\n private readonly sessionKeyMnemonic: string | undefined;\n\n constructor(\n options: {\n client: Promise<ArgonClient>;\n accountRegistry?: AccountRegistry;\n subaccountRange?: SubaccountRange;\n sessionKeyMnemonic?: string;\n name?: string;\n } & (\n | { seedAccount: KeyringPair }\n | {\n seedAddress: string;\n isProxy: true;\n txSubmitter: KeyringPair;\n }\n ),\n ) {\n if ('seedAccount' in options) {\n this.txSubmitterPair = options.seedAccount;\n this.seedAddress = options.seedAccount.address;\n this.isProxy = false;\n } else {\n this.isProxy = options.isProxy;\n this.txSubmitterPair = options.txSubmitter;\n this.seedAddress = options.seedAddress;\n }\n this.sessionKeyMnemonic = options.sessionKeyMnemonic;\n this.accountRegistry = options.accountRegistry ?? AccountRegistry.factory(options.name);\n this.client = options.client;\n const defaultRange = options.subaccountRange ?? getDefaultSubaccountRange();\n this.accountRegistry.register(this.seedAddress, `${this.accountRegistry.me}//seed`);\n for (const i of defaultRange) {\n const pair = this.txSubmitterPair.derive(`//${i}`);\n this.subAccountsByAddress[pair.address] = { pair, index: i };\n this.accountRegistry.register(pair.address, `${this.accountRegistry.me}//${i}`);\n }\n }\n\n public async submitterBalance(blockHash?: Uint8Array): Promise<bigint> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const accountData = await api.query.system.account(this.txSubmitterPair.address);\n\n return accountData.data.free.toBigInt();\n }\n\n public async balance(blockHash?: Uint8Array): Promise<bigint> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const accountData = await api.query.system.account(this.seedAddress);\n\n return accountData.data.free.toBigInt();\n }\n\n public async totalArgonsAt(\n blockHash?: Uint8Array,\n ): Promise<{ address: string; amount: bigint; index: number }[]> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const addresses = this.addresses;\n const results = await api.query.system.account.multi(addresses);\n return results.map((account, i) => {\n const address = addresses[i];\n return {\n address,\n amount: account.data.free.toBigInt(),\n index: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async totalArgonotsAt(\n blockHash?: Uint8Array,\n ): Promise<{ address: string; amount: bigint; index: number }[]> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const addresses = this.addresses;\n const results = await api.query.ownership.account.multi(addresses);\n return results.map((account, i) => {\n const address = addresses[i];\n return {\n address,\n amount: account.free.toBigInt(),\n index: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async getAvailableMinerAccounts(\n maxSeats: number,\n ): Promise<{ index: number; isRebid: boolean; address: string }[]> {\n const miningSeats = await this.miningSeats();\n const subaccountRange = [];\n for (const seat of miningSeats) {\n if (seat.hasWinningBid) {\n continue;\n }\n if (seat.isLastDay || seat.seat === undefined) {\n subaccountRange.push({\n index: seat.subaccountIndex,\n isRebid: seat.seat !== undefined,\n address: seat.address,\n });\n if (subaccountRange.length >= maxSeats) {\n break;\n }\n }\n }\n return subaccountRange;\n }\n\n public async loadRegisteredMiners(api: ApiDecoration<'promise'>): Promise<ISubaccountMiner[]> {\n const addresses = Object.keys(this.subAccountsByAddress);\n const rawIndices = await api.query.miningSlot.accountIndexLookup.multi(addresses);\n const frameIds = [\n ...new Set(\n rawIndices\n .map(x => (x.isNone ? undefined : x.value[0].toNumber()))\n .filter(x => x !== undefined),\n ),\n ];\n const bidAmountsByFrame: { [frameId: number]: bigint[] } = {};\n if (frameIds.length) {\n console.log('Looking up cohorts for frames', frameIds);\n const cohorts = await api.query.miningSlot.minersByCohort.multi(frameIds);\n for (let i = 0; i < frameIds.length; i++) {\n const cohort = cohorts[i];\n const frameId = frameIds[i]!;\n bidAmountsByFrame[frameId] = cohort.map(x => x.bid.toBigInt());\n }\n }\n const addressToMiningIndex: { [address: string]: IMiningIndex } = {};\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n if (rawIndices[i].isNone) continue;\n const [frameIdRaw, indexRaw] = rawIndices[i].value;\n const frameId = frameIdRaw.toNumber();\n const index = indexRaw.toNumber();\n const bidAmount = bidAmountsByFrame[frameId]?.[index];\n addressToMiningIndex[address] = {\n startingFrameId: frameId,\n index,\n bidAmount: bidAmount ?? 0n,\n };\n }\n const nextFrameId = await api.query.miningSlot.nextFrameId();\n\n return addresses.map(address => {\n const cohort = addressToMiningIndex[address];\n let isLastDay = false;\n if (cohort !== undefined) {\n isLastDay = nextFrameId.toNumber() - cohort.startingFrameId === 10;\n }\n return {\n address,\n seat: cohort,\n isLastDay,\n subaccountIndex: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async miningSeats(blockHash?: Uint8Array): Promise<\n (ISubaccountMiner & {\n hasWinningBid: boolean;\n bidAmount?: bigint;\n })[]\n > {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const miners = await this.loadRegisteredMiners(api);\n\n const nextCohort = await api.query.miningSlot.bidsForNextSlotCohort();\n\n return miners.map(miner => {\n const bid = nextCohort.find(x => x.accountId.toHuman() === miner.address);\n return {\n ...miner,\n hasWinningBid: !!bid,\n bidAmount: bid?.bid.toBigInt() ?? miner.seat?.bidAmount ?? 0n,\n };\n });\n }\n\n public async bids(\n blockHash?: Uint8Array,\n ): Promise<{ address: string; bidPlace?: number; index: number; bidAmount: bigint }[]> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const addresses = Object.keys(this.subAccountsByAddress);\n const nextCohort = await api.query.miningSlot.bidsForNextSlotCohort();\n\n const registrationsByAddress = Object.fromEntries(\n nextCohort.map((x, i) => [x.accountId.toHuman(), { ...x, index: i }]),\n );\n\n return addresses.map(address => {\n const entry = registrationsByAddress[address];\n\n return {\n address,\n bidPlace: entry?.index,\n bidAmount: entry?.bid?.toBigInt(),\n index: this.subAccountsByAddress[address]?.index ?? Number.NaN,\n };\n });\n }\n\n public async consolidate(\n subaccounts?: SubaccountRange,\n ): Promise<{ index: number; inBlock?: string; failedError?: Error }[]> {\n const client = await this.client;\n const accounts = this.getAccountsInRange(subaccounts);\n const results: { index: number; inBlock?: string; failedError?: Error }[] = [];\n await Promise.allSettled(\n accounts.map(({ pair, index }) => {\n if (!pair) {\n results.push({\n index,\n failedError: new Error(`No keypair for //${index}`),\n });\n return Promise.resolve();\n }\n return new Promise<void>(resolve => {\n client.tx.utility\n .batchAll([\n client.tx.balances.transferAll(this.seedAddress, true),\n client.tx.ownership.transferAll(this.seedAddress, true),\n ])\n .signAndSend(pair, cb => {\n logExtrinsicResult(cb);\n if (cb.dispatchError) {\n const error = dispatchErrorToString(client, cb.dispatchError);\n\n results.push({\n index,\n failedError: new Error(`Error consolidating //${index}: ${error}`),\n });\n resolve();\n }\n if (cb.isInBlock) {\n results.push({ index, inBlock: cb.status.asInBlock.toHex() });\n resolve();\n }\n })\n .catch(e => {\n results.push({ index, failedError: e });\n resolve();\n });\n });\n }),\n );\n return results;\n }\n\n public status(opts: {\n argons: Awaited<ReturnType<Accountset['totalArgonsAt']>>;\n argonots: Awaited<ReturnType<Accountset['totalArgonotsAt']>>;\n seats: Awaited<ReturnType<Accountset['miningSeats']>>;\n bids: Awaited<ReturnType<Accountset['bids']>>;\n accountSubset?: ReturnType<Accountset['getAccountsInRange']>;\n }): IAccountStatus[] {\n const { argons, argonots, accountSubset, bids, seats } = opts;\n const accounts: IAccountStatus[] = [\n {\n index: 'main',\n address: this.seedAddress,\n argons: formatArgons(argons.find(x => x.address === this.seedAddress)?.amount ?? 0n),\n argonots: formatArgons(argonots.find(x => x.address === this.seedAddress)?.amount ?? 0n),\n },\n ];\n for (const [address, { index }] of Object.entries(this.subAccountsByAddress)) {\n const argonAmount = argons.find(x => x.address === address)?.amount ?? 0n;\n const argonotAmount = argonots.find(x => x.address === address)?.amount ?? 0n;\n const bid = bids.find(x => x.address === address);\n const seat = seats.find(x => x.address === address)?.seat;\n const entry: IAccountStatus = {\n index: ` //${index}`,\n address,\n argons: formatArgons(argonAmount),\n argonots: formatArgons(argonotAmount),\n seat,\n bidPlace: bid?.bidPlace,\n bidAmount: bid?.bidAmount ?? 0n,\n };\n if (accountSubset) {\n entry.isWorkingOn = accountSubset.some(x => x.address === address);\n }\n accounts.push(entry);\n }\n return accounts;\n }\n\n public async registerKeys(url: string) {\n const client = await getClient(url.replace('ws:', 'http:'));\n const keys = this.keys();\n for (const [name, key] of Object.entries(keys)) {\n console.log('Registering key', name, key.publicKey);\n const result = await client.rpc.author.insertKey(name, key.privateKey, key.publicKey);\n // verify keys\n const saved = await client.rpc.author.hasKey(key.publicKey, name);\n if (!saved) {\n console.error('Failed to register key', name, key.publicKey);\n throw new Error(`Failed to register ${name} key ${key.publicKey}`);\n }\n console.log(`Registered ${name} key`, result.toHuman());\n }\n await client.disconnect();\n }\n\n public keys(keysVersion?: number): {\n gran: { privateKey: string; publicKey: string; rawPublicKey: Uint8Array };\n seal: { privateKey: string; publicKey: string; rawPublicKey: Uint8Array };\n } {\n const config = getConfig();\n let version = keysVersion ?? config.keysVersion ?? 0;\n const seedMnemonic = this.sessionKeyMnemonic ?? config.keysMnemonic;\n if (!seedMnemonic) {\n throw new Error('KEYS_MNEMONIC environment variable not set. Cannot derive keys.');\n }\n const blockSealKey = `${seedMnemonic}//block-seal//${version}`;\n const granKey = `${seedMnemonic}//grandpa//${version}`;\n const blockSealAccount = new Keyring().createFromUri(blockSealKey, {\n type: 'ed25519',\n });\n const grandpaAccount = new Keyring().createFromUri(granKey, {\n type: 'ed25519',\n });\n return {\n seal: {\n privateKey: blockSealKey,\n publicKey: u8aToHex(blockSealAccount.publicKey),\n rawPublicKey: blockSealAccount.publicKey,\n },\n gran: {\n privateKey: granKey,\n publicKey: u8aToHex(grandpaAccount.publicKey),\n rawPublicKey: grandpaAccount.publicKey,\n },\n };\n }\n\n public async tx(tx: SubmittableExtrinsic): Promise<TxSubmitter> {\n const client = await this.client;\n return new TxSubmitter(client, tx, this.txSubmitterPair);\n }\n\n /**\n * Create but don't submit a mining bid transaction.\n * @param options\n */\n public async createMiningBidTx(options: {\n subaccounts: { address: string }[];\n bidAmount: bigint;\n }) {\n const client = await this.client;\n const { bidAmount, subaccounts } = options;\n\n const batch = client.tx.utility.batch(\n subaccounts.map(x => {\n const keys = this.keys();\n return client.tx.miningSlot.bid(\n bidAmount,\n {\n grandpa: keys.gran.rawPublicKey,\n blockSealAuthority: keys.seal.rawPublicKey,\n },\n x.address,\n );\n }),\n );\n\n let tx = batch;\n if (this.isProxy) {\n tx = client.tx.proxy.proxy(this.seedAddress, 'MiningBid', batch);\n }\n return new TxSubmitter(client, tx, this.txSubmitterPair);\n }\n\n /**\n * Create a mining bid. This will create a bid for each account in the given range from the seed account as funding.\n */\n public async createMiningBids(options: {\n subaccountRange?: SubaccountRange;\n bidAmount: bigint;\n tip?: bigint;\n }): Promise<{\n finalFee?: bigint;\n blockHash?: Uint8Array;\n bidError?: Error;\n successfulBids?: number;\n }> {\n const accounts = this.getAccountsInRange(options.subaccountRange);\n const client = await this.client;\n const submitter = await this.createMiningBidTx({\n ...options,\n subaccounts: accounts,\n });\n const { tip = 0n } = options;\n const txFee = await submitter.feeEstimate(tip);\n\n let minBalance = options.bidAmount * BigInt(accounts.length);\n let totalFees = tip + 1n + txFee;\n const seedBalance = await client.query.system\n .account(this.seedAddress)\n .then(x => x.data.free.toBigInt());\n if (!this.isProxy) {\n minBalance += totalFees;\n }\n if (seedBalance < minBalance) {\n throw new Error(\n `Insufficient balance to create mining bids. Seed account has ${formatArgons(\n seedBalance,\n )} but needs ${formatArgons(minBalance)}`,\n );\n }\n if (this.isProxy) {\n const { canAfford, availableBalance } = await submitter.canAfford({\n tip,\n });\n if (!canAfford) {\n throw new Error(\n `Insufficient balance to pay proxy fees. Proxy account has ${formatArgons(\n availableBalance,\n )} but needs ${formatArgons(totalFees)}`,\n );\n }\n }\n\n console.log('Creating bids', {\n perSeatBid: options.bidAmount,\n subaccounts: options.subaccountRange,\n txFee,\n });\n\n const txResult = await submitter.submit({\n tip,\n useLatestNonce: true,\n });\n\n const bidError = await txResult.inBlockPromise.then(() => undefined).catch((x: Error) => x);\n return {\n finalFee: txResult.finalFee,\n bidError,\n blockHash: txResult.includedInBlock,\n successfulBids:\n txResult.batchInterruptedIndex !== undefined\n ? txResult.batchInterruptedIndex\n : accounts.length,\n };\n }\n\n public getAccountsInRange(range?: SubaccountRange): IAccountAndKey[] {\n const entries = new Set(range ?? getDefaultSubaccountRange());\n return Object.entries(this.subAccountsByAddress)\n .filter(([_, account]) => {\n return entries.has(account.index);\n })\n .map(([address, { pair, index }]) => ({ pair, index, address }));\n }\n\n public async watchBlocks(shouldLog: boolean = false): Promise<AccountMiners> {\n const accountMiners = await AccountMiners.loadAt(this, { shouldLog });\n await accountMiners.watch();\n return accountMiners;\n }\n}\n\nexport function getDefaultSubaccountRange(): number[] {\n try {\n const config = getConfig();\n return parseSubaccountRange(config.subaccountRange ?? '0-9')!;\n } catch {\n console.error(\n 'Failed to parse SUBACCOUNT_RANGE configuration. Defaulting to 0-9. Please check the format of the subaccountRange config value.',\n );\n return Array.from({ length: 10 }, (_, i) => i);\n }\n}\n\nexport function parseSubaccountRange(range?: string): number[] | undefined {\n if (!range) {\n return undefined;\n }\n const indices = [];\n for (const entry of range.split(',')) {\n if (entry.includes('-')) {\n const [start, end] = entry.split('-').map(x => parseInt(x, 10));\n for (let i = start; i <= end; i++) {\n indices.push(i);\n }\n continue;\n }\n\n const record = parseInt(entry.trim(), 10);\n if (Number.isNaN(record) || !Number.isInteger(record)) {\n throw new Error(`Invalid range entry: ${entry}`);\n }\n if (Number.isInteger(record)) {\n indices.push(record);\n }\n }\n return indices;\n}\n\nexport type IAccountAndKey = {\n pair?: KeyringPair;\n index: number;\n address: string;\n};\n\ninterface IAccountStatus {\n index: string;\n address: string;\n argons: string;\n argonots: string;\n seat?: IMiningIndex;\n bidPlace?: number;\n bidAmount?: bigint;\n isWorkingOn?: boolean;\n}\n","import {\n type ArgonClient,\n type ArgonPrimitivesBlockSealMiningRegistration,\n formatArgons,\n type Bool,\n type u64,\n} from './index';\nimport { printTable } from 'console-table-printer';\nimport type { IAddressNames } from './Accountset';\n\nexport class MiningBids {\n public nextCohort: {\n accountId: string;\n isOurs: string;\n bidAmount: bigint;\n }[] = [];\n\n constructor(\n readonly client: Promise<ArgonClient>,\n private shouldLog = true,\n ) {}\n\n public async maxCohortSize(): Promise<number> {\n const client = await this.client;\n return client.query.miningSlot.nextCohortSize().then(x => x.toNumber());\n }\n\n public async onCohortChange(options: {\n onBiddingStart?: (cohortStartingFrameId: number) => Promise<void>;\n onBiddingEnd?: (cohortStartingFrameId: number) => Promise<void>;\n }): Promise<{ unsubscribe: () => void }> {\n const { onBiddingStart, onBiddingEnd } = options;\n const client = await this.client;\n let openCohortStartingFrameId = 0;\n const unsubscribe = await client.queryMulti<[Bool, u64]>(\n [\n client.query.miningSlot.isNextSlotBiddingOpen as any,\n client.query.miningSlot.nextFrameId as any,\n ],\n async ([isBiddingOpen, rawNextCohortStartingFrameId]) => {\n const nextFrameId = rawNextCohortStartingFrameId.toNumber();\n\n if (isBiddingOpen.isTrue) {\n if (openCohortStartingFrameId !== 0) {\n await onBiddingEnd?.(openCohortStartingFrameId);\n }\n openCohortStartingFrameId = nextFrameId;\n await onBiddingStart?.(nextFrameId);\n } else {\n await onBiddingEnd?.(nextFrameId);\n openCohortStartingFrameId = 0;\n }\n },\n );\n return { unsubscribe };\n }\n\n public async watch(\n accountNames: IAddressNames,\n blockHash?: Uint8Array,\n printFn?: (blockNumber: number) => void,\n ): Promise<{ unsubscribe: () => void }> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const unsubscribe = await api.query.miningSlot.bidsForNextSlotCohort(async next => {\n this.nextCohort = await Promise.all(next.map(x => this.toBid(accountNames, x)));\n if (!this.shouldLog) return;\n console.clear();\n const block = await client.query.system.number();\n if (!printFn) {\n console.log('At block', block.toNumber());\n this.print();\n } else {\n printFn(block.toNumber());\n }\n });\n return { unsubscribe };\n }\n\n public async loadAt(accountNames: IAddressNames, blockHash?: Uint8Array): Promise<void> {\n const client = await this.client;\n const api = blockHash ? await client.at(blockHash) : client;\n const nextCohort = await api.query.miningSlot.bidsForNextSlotCohort();\n this.nextCohort = await Promise.all(nextCohort.map(x => this.toBid(accountNames, x)));\n }\n\n private async toBid(\n accountNames: IAddressNames,\n bid: ArgonPrimitivesBlockSealMiningRegistration,\n ): Promise<MiningBids['nextCohort'][0]> {\n return {\n accountId: bid.accountId.toString(),\n isOurs: accountNames.get(bid.accountId.toString()) ?? 'n',\n bidAmount: bid.bid.toBigInt(),\n };\n }\n\n public print() {\n const bids = this.nextCohort.map(bid => {\n return {\n account: bid.accountId,\n isOurs: bid.isOurs,\n bidAmount: formatArgons(bid.bidAmount),\n };\n });\n if (bids.length) {\n console.log('\\n\\nMining Bids:');\n printTable(bids);\n }\n }\n}\n","import {\n ArgonClient,\n type ArgonPrimitivesVault,\n formatArgons,\n ITxProgressCallback,\n KeyringPair,\n toFixedNumber,\n TxSubmitter,\n} from './index';\nimport BigNumber, * as BN from 'bignumber.js';\nimport { convertFixedU128ToBigNumber, convertPermillToBigNumber } from './utils';\nimport bs58check from 'bs58check';\nimport { hexToU8a } from '@polkadot/util';\nimport { TxResult } from './TxSubmitter';\n\nconst { ROUND_FLOOR } = BN;\n\nexport class Vault {\n public securitization!: bigint;\n public argonsLocked!: bigint;\n public argonsPendingActivation!: bigint;\n public argonsScheduledForRelease: Map<number, bigint>;\n public terms!: ITerms;\n public operatorAccountId!: string;\n public isClosed!: boolean;\n public vaultId: number;\n public pendingTerms?: ITerms;\n public pendingTermsChangeTick?: number;\n public openedDate: Date;\n public openedTick: number;\n public securitizationRatio!: number;\n\n constructor(\n id: number,\n vault: ArgonPrimitivesVault,\n public tickDuration: number,\n ) {\n this.vaultId = id;\n this.openedTick = vault.openedTick.toNumber();\n this.openedDate = new Date(this.openedTick * this.tickDuration);\n this.argonsScheduledForRelease = new Map();\n this.load(vault);\n }\n\n public load(vault: ArgonPrimitivesVault) {\n this.securitization = vault.securitization.toBigInt();\n this.securitizationRatio = convertFixedU128ToBigNumber(\n vault.securitizationRatio.toBigInt(),\n ).toNumber();\n this.argonsLocked = vault.argonsLocked.toBigInt();\n this.argonsPendingActivation = vault.argonsPendingActivation.toBigInt();\n if (vault.argonsScheduledForRelease.size > 0) {\n this.argonsScheduledForRelease.clear();\n for (const [tick, amount] of vault.argonsScheduledForRelease.entries()) {\n this.argonsScheduledForRelease.set(tick.toNumber(), amount.toBigInt());\n }\n }\n this.terms = {\n bitcoinAnnualPercentRate: convertFixedU128ToBigNumber(\n vault.terms.bitcoinAnnualPercentRate.toBigInt(),\n ),\n bitcoinBaseFee: vault.terms.bitcoinBaseFee.toBigInt(),\n liquidityPoolProfitSharing: convertPermillToBigNumber(\n vault.terms.liquidityPoolProfitSharing.toBigInt(),\n ),\n };\n\n this.operatorAccountId = vault.operatorAccountId.toString();\n this.isClosed = vault.isClosed.valueOf();\n if (vault.pendingTerms.isSome) {\n const [tickApply, terms] = vault.pendingTerms.value;\n this.pendingTermsChangeTick = tickApply.toNumber();\n this.pendingTerms = {\n bitcoinAnnualPercentRate: convertFixedU128ToBigNumber(\n terms.bitcoinAnnualPercentRate.toBigInt(),\n ),\n bitcoinBaseFee: terms.bitcoinBaseFee.toBigInt(),\n liquidityPoolProfitSharing: convertPermillToBigNumber(\n vault.terms.liquidityPoolProfitSharing.toBigInt(),\n ),\n };\n }\n }\n\n public availableBitcoinSpace(): bigint {\n const recoverySecuritization = this.recoverySecuritization();\n const reLockable = this.getRelockCapacity();\n return this.securitization - recoverySecuritization - this.argonsLocked + reLockable;\n }\n\n public getRelockCapacity(): bigint {\n return [...this.argonsScheduledForRelease.values()].reduce((acc, val) => acc + val, 0n);\n }\n\n public securitizationRatioBN(): BigNumber {\n return new BigNumber(this.securitizationRatio);\n }\n\n public recoverySecuritization(): bigint {\n const reserved = new BigNumber(1).div(this.securitizationRatioBN());\n return (\n this.securitization -\n BigInt(reserved.multipliedBy(this.securitization.toString()).toFixed(0, ROUND_FLOOR))\n );\n }\n\n public minimumSecuritization(): bigint {\n return BigInt(\n this.securitizationRatioBN()\n .multipliedBy(this.argonsLocked.toString())\n .decimalPlaces(0, BigNumber.ROUND_CEIL)\n .toString(),\n );\n }\n\n public activatedSecuritization(): bigint {\n const activated = this.argonsLocked - this.argonsPendingActivation;\n const maxRatio = BigNumber(Math.min(this.securitizationRatio, 2));\n\n return BigInt(maxRatio.multipliedBy(activated.toString()).toFixed(0, ROUND_FLOOR));\n }\n\n /**\n * Returns the amount of Argons available to match per liquidity pool\n */\n public activatedSecuritizationPerSlot(): bigint {\n const activated = this.activatedSecuritization();\n return activated / 10n;\n }\n\n public calculateBitcoinFee(amount: bigint): bigint {\n const fee = this.terms.bitcoinAnnualPercentRate\n .multipliedBy(Number(amount))\n .integerValue(BigNumber.ROUND_CEIL);\n return BigInt(fee.toString()) + this.terms.bitcoinBaseFee;\n }\n\n public static async get(\n client: ArgonClient,\n vaultId: number,\n tickDurationMillis?: number,\n ): Promise<Vault> {\n const rawVault = await client.query.vaults.vaultsById(vaultId);\n if (rawVault.isNone) {\n throw new Error(`Vault with id ${vaultId} not found`);\n }\n const tickDuration =\n tickDurationMillis ??\n (await client.query.ticks.genesisTicker().then(x => x.tickDurationMillis.toNumber()))!;\n return new Vault(vaultId, rawVault.unwrap(), tickDuration);\n }\n\n public static async create(\n client: ArgonClient,\n keypair: KeyringPair,\n args: {\n securitization: bigint | number;\n securitizationRatio: number;\n annualPercentRate: number;\n baseFee: bigint | number;\n bitcoinXpub: string;\n liquidityPoolProfitSharing: number;\n tip?: bigint;\n doNotExceedBalance?: bigint;\n txProgressCallback?: ITxProgressCallback;\n },\n config: { tickDurationMillis?: number } = {},\n ): Promise<{ vault: Vault; txResult: TxResult }> {\n const {\n securitization,\n securitizationRatio,\n annualPercentRate,\n baseFee,\n bitcoinXpub,\n tip,\n doNotExceedBalance,\n txProgressCallback,\n } = args;\n let xpubBytes = hexToU8a(bitcoinXpub);\n if (xpubBytes.length !== 78) {\n if (\n bitcoinXpub.startsWith('xpub') ||\n bitcoinXpub.startsWith('tpub') ||\n bitcoinXpub.startsWith('zpub')\n ) {\n const bytes = bs58check.decode(bitcoinXpub);\n if (bytes.length !== 78) {\n throw new Error('Invalid Bitcoin xpub key length, must be 78 bytes');\n }\n xpubBytes = bytes;\n }\n }\n let vaultParams = {\n terms: {\n // convert to fixed u128\n bitcoinAnnualPercentRate: toFixedNumber(annualPercentRate, 18),\n bitcoinBaseFee: BigInt(baseFee),\n liquidityPoolProfitSharing: toFixedNumber(args.liquidityPoolProfitSharing, 6),\n },\n securitizationRatio: toFixedNumber(securitizationRatio, 18),\n securitization: BigInt(securitization),\n bitcoinXpubkey: xpubBytes,\n };\n let tx = new TxSubmitter(client, client.tx.vaults.create(vaultParams), keypair);\n if (doNotExceedBalance) {\n const finalTip = tip ?? 0n;\n let txFee = await tx.feeEstimate(finalTip);\n while (txFee + finalTip + vaultParams.securitization > doNotExceedBalance) {\n vaultParams.securitization = doNotExceedBalance - txFee - finalTip;\n tx.tx = client.tx.vaults.create(vaultParams);\n txFee = await tx.feeEstimate(finalTip);\n }\n }\n const canAfford = await tx.canAfford({ tip, unavailableBalance: BigInt(securitization) });\n if (!canAfford.canAfford) {\n throw new Error(\n `Insufficient balance to create vault. Required: ${formatArgons(securitization)}, Available: ${formatArgons(canAfford.availableBalance)}`,\n );\n }\n\n const result = await tx.submit({\n tip,\n useLatestNonce: true,\n waitForBlock: true,\n txProgressCallback,\n });\n await result.inBlockPromise;\n let vaultId: number | undefined;\n for (const event of result.events) {\n if (client.events.vaults.VaultCreated.is(event)) {\n vaultId = event.data.vaultId.toNumber();\n break;\n }\n }\n if (vaultId === undefined) {\n throw new Error('Vault creation failed, no VaultCreated event found');\n }\n const rawVault = await client.query.vaults.vaultsById(vaultId);\n if (rawVault.isNone) {\n throw new Error('Vault creation failed, vault not found');\n }\n const tickDuration =\n config.tickDurationMillis ??\n (await client.query.ticks.genesisTicker().then(x => x.tickDurationMillis.toNumber()))!;\n const vault = new Vault(vaultId, rawVault.unwrap(), tickDuration);\n return { vault, txResult: result };\n }\n}\n\nexport interface ITerms {\n readonly bitcoinAnnualPercentRate: BigNumber;\n readonly bitcoinBaseFee: bigint;\n readonly liquidityPoolProfitSharing: BigNumber;\n}\n\nexport interface IBondedArgons {\n readonly allocated: bigint;\n readonly reserved: bigint;\n}\n","import {\n type ArgonClient,\n type ArgonPrimitivesVault,\n Option,\n Vault,\n BlockWatch,\n MiningBids,\n Accountset,\n formatArgons,\n formatPercent,\n} from './index';\nimport { printTable } from 'console-table-printer';\nimport { createNanoEvents } from './utils';\n\nexport class VaultMonitor {\n public events = createNanoEvents<{\n 'bitcoin-space-above': (vaultId: number, amount: bigint) => void;\n 'liquidity-pool-space-above': (vaultId: number, amount: bigint) => void;\n }>();\n public readonly vaultsById: { [id: number]: Vault } = {};\n public readonly blockWatch: BlockWatch;\n public readonly mainchain: Promise<ArgonClient>;\n public activatedCapitalByVault: { [vaultId: number]: bigint } = {};\n private lastPrintedBids: Uint8Array | undefined;\n private readonly miningBids: MiningBids;\n private tickDuration: number = 0;\n private vaultOnlyWatchMode: boolean = false;\n private shouldLog: boolean = true;\n\n constructor(\n readonly accountset: Accountset,\n readonly alerts: WatchAlerts = {},\n readonly options: {\n vaultOnlyWatchMode?: boolean;\n shouldLog?: boolean;\n } = {},\n ) {\n this.mainchain = accountset.client;\n if (options.vaultOnlyWatchMode !== undefined) {\n this.vaultOnlyWatchMode = options.vaultOnlyWatchMode;\n }\n if (options.shouldLog !== undefined) {\n this.shouldLog = options.shouldLog;\n }\n this.miningBids = new MiningBids(this.mainchain, this.shouldLog);\n this.blockWatch = new BlockWatch(this.mainchain, {\n shouldLog: this.shouldLog,\n });\n this.blockWatch.events.on('vaults-updated', (header, vaultIds) =>\n this.onVaultsUpdated(header.hash, vaultIds),\n );\n this.blockWatch.events.on('mining-bid', async (header, _bid) => {\n await this.miningBids.loadAt(this.accountset.namedAccounts, header.hash);\n this.printBids(header.hash);\n });\n this.blockWatch.events.on('mining-bid-ousted', async header => {\n await this.miningBids.loadAt(this.accountset.namedAccounts, header.hash);\n this.printBids(header.hash);\n });\n }\n\n public stop() {\n this.blockWatch.stop();\n }\n\n public async monitor(justPrint = false) {\n const client = await this.mainchain;\n\n this.tickDuration = (await client.query.ticks.genesisTicker()).tickDurationMillis.toNumber();\n const blockHeader = await client.rpc.chain.getHeader();\n const blockHash = new Uint8Array(blockHeader.hash);\n console.log(\n `${justPrint ? 'Run' : 'Started'} at block ${blockHeader.number} - ${blockHeader.hash.toHuman()}`,\n );\n\n await this.miningBids.loadAt(this.accountset.namedAccounts, blockHash);\n const vaults = await client.query.vaults.vaultsById.entries();\n for (const [storageKey, rawVault] of vaults) {\n const vaultId = storageKey.args[0].toNumber();\n this.updateVault(vaultId, rawVault);\n }\n\n await client.query.liquidityPools.capitalRaising(x => {\n this.activatedCapitalByVault = {};\n for (const entry of x) {\n const vaultId = entry.vaultId.toNumber();\n this.activatedCapitalByVault[vaultId] = entry.activatedCapital.toBigInt();\n }\n for (const [vaultId, vault] of Object.entries(this.vaultsById)) {\n const id = Number(vaultId);\n this.activatedCapitalByVault[id] ??= 0n;\n this.checkMiningBondAlerts(id, vault);\n }\n });\n this.printVaults();\n if (!this.vaultOnlyWatchMode && this.shouldLog) {\n this.miningBids.print();\n }\n\n if (!justPrint) await this.blockWatch.start();\n }\n\n public printVaults() {\n if (!this.shouldLog) return;\n const vaults = [];\n for (const [vaultId, vault] of Object.entries(this.vaultsById)) {\n vaults.push({\n id: vaultId,\n btcSpace: `${formatArgons(vault.availableBitcoinSpace())} (${formatArgons(vault.argonsPendingActivation)} pending)`,\n btcDeal: `${formatArgons(vault.terms.bitcoinBaseFee)} + ${formatPercent(vault.terms.bitcoinAnnualPercentRate)}`,\n securitization: `${formatArgons(vault.securitization)} at ${vault.securitizationRatio}x`,\n securActivated: `${formatArgons(vault.activatedSecuritizationPerSlot())}/slot`,\n liquidPoolDeal: `${formatPercent(vault.terms.liquidityPoolProfitSharing)} sharing`,\n operator: `${this.accountset.namedAccounts.has(vault.operatorAccountId) ? ` (${this.accountset.namedAccounts.get(vault.operatorAccountId)})` : vault.operatorAccountId}`,\n state: vault.isClosed ? 'closed' : vault.openedDate < new Date() ? 'open' : 'pending',\n });\n }\n if (vaults.length) {\n if (this.vaultOnlyWatchMode) {\n console.clear();\n }\n console.log('\\n\\nVaults:');\n printTable(vaults);\n }\n }\n\n private async recheckAfterActive(vaultId: number) {\n const activationDate = this.vaultsById[vaultId].openedDate;\n if (this.shouldLog) {\n console.log(`Waiting for vault ${vaultId} to activate ${activationDate}`);\n }\n await new Promise(resolve => setTimeout(resolve, activationDate.getTime() - Date.now()));\n const client = await this.mainchain;\n let isReady = false;\n while (!isReady) {\n const rawVault = await client.query.vaults.vaultsById(vaultId);\n if (!rawVault.isSome) return;\n const vault = new Vault(vaultId, rawVault.value, this.tickDuration);\n this.vaultsById[vaultId] = vault;\n if (vault.isClosed) return;\n if (vault.openedDate < new Date()) {\n isReady = true;\n break;\n }\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n this.checkAlerts(vaultId, this.vaultsById[vaultId]);\n }\n\n private async onVaultsUpdated(blockHash: Uint8Array, vaultIds: Set<number>) {\n await this.reloadVaultsAt([...vaultIds], blockHash).catch(err => {\n console.error(`Failed to reload vault ${[...vaultIds]} at block ${blockHash}:`, err);\n });\n this.printVaults();\n }\n\n private async reloadVaultsAt(vaultIds: number[], blockHash: Uint8Array) {\n const client = await this.mainchain;\n const api = await client.at(blockHash);\n const vaults = await api.query.vaults.vaultsById.multi(vaultIds);\n for (let i = 0; i < vaultIds.length; i += 1) {\n this.updateVault(vaultIds[i], vaults[i]);\n }\n }\n\n private updateVault(vaultId: number, rawVault: Option<ArgonPrimitivesVault>) {\n if (rawVault.isNone) return;\n const vault = new Vault(vaultId, rawVault.value, this.tickDuration);\n this.vaultsById[vaultId] = vault;\n if (vault.openedDate > new Date()) {\n void this.recheckAfterActive(vaultId);\n } else {\n this.checkAlerts(vaultId, vault);\n }\n }\n\n private checkAlerts(vaultId: number, vault: Vault) {\n if (this.alerts.bitcoinSpaceAvailable !== undefined) {\n const availableBitcoinSpace = vault.availableBitcoinSpace();\n if (availableBitcoinSpace >= this.alerts.bitcoinSpaceAvailable) {\n console.warn(\n `Vault ${vaultId} has available bitcoins above ${formatArgons(this.alerts.bitcoinSpaceAvailable)}`,\n );\n this.events.emit('bitcoin-space-above', vaultId, availableBitcoinSpace);\n }\n }\n }\n\n private checkMiningBondAlerts(vaultId: number, vault: Vault) {\n if (this.alerts.liquidityPoolSpaceAvailable === undefined) return;\n\n const activatedSecuritization = vault.activatedSecuritizationPerSlot();\n const capitalization = this.activatedCapitalByVault[vaultId] ?? 0n;\n const available = activatedSecuritization - capitalization;\n if (available >= this.alerts.liquidityPoolSpaceAvailable) {\n this.events.emit('liquidity-pool-space-above', vaultId, available);\n }\n }\n\n private printBids(blockHash: Uint8Array) {\n if (!this.shouldLog) return;\n if (this.lastPrintedBids === blockHash) return;\n this.miningBids.print();\n this.lastPrintedBids = blockHash;\n }\n}\n\nexport type WatchAlerts = {\n /**\n * Alert when a vault has available space for bitcoins to move in greater than or equal to this amount\n */\n bitcoinSpaceAvailable?: bigint;\n /**\n * Liquidity pool space available\n */\n liquidityPoolSpaceAvailable?: bigint;\n};\n","import type { Accountset } from './Accountset';\nimport {\n ArgonClient,\n type ArgonPrimitivesBlockSealMiningRegistration,\n ExtrinsicError,\n} from './index';\nimport { formatArgons } from './utils';\nimport { Bool, Compact, u128, u64, Vec } from '@polkadot/types-codec';\nimport { AccountId } from '@polkadot/types/interfaces/runtime';\n\nexport class CohortBidder {\n public get client(): Promise<ArgonClient> {\n return this.accountset.client;\n }\n\n public txFees = 0n;\n public winningBids: { address: string; bid: bigint }[] = [];\n\n private unsubscribe?: () => void;\n private pendingRequest: Promise<any> | undefined;\n private retryTimeout?: NodeJS.Timeout;\n private isStopped = false;\n private needsRebid = false;\n private lastBidTime = 0;\n\n private millisPerTick?: number;\n private minIncrement = 10_000n;\n private nextCohortSize?: number;\n private lastBidBlockNumber: number = 0;\n\n private readonly myAddresses = new Set<string>();\n\n constructor(\n public accountset: Accountset,\n public cohortStartingFrameId: number,\n public subaccounts: { index: number; isRebid: boolean; address: string }[],\n public options: {\n minBid: bigint;\n maxBid: bigint;\n maxBudget: bigint;\n bidIncrement: bigint;\n bidDelay: number;\n tipPerTransaction?: bigint;\n },\n ) {\n this.subaccounts.forEach(x => {\n this.myAddresses.add(x.address);\n });\n }\n\n public async start() {\n console.log(`Starting cohort ${this.cohortStartingFrameId} bidder`, {\n maxBid: formatArgons(this.options.maxBid),\n minBid: formatArgons(this.options.minBid),\n bidIncrement: formatArgons(this.options.bidIncrement),\n maxBudget: formatArgons(this.options.maxBudget),\n bidDelay: this.options.bidDelay,\n subaccounts: this.subaccounts,\n });\n\n const client = await this.client;\n\n this.minIncrement = client.consts.miningSlot.bidIncrements.toBigInt();\n\n this.nextCohortSize = await client.query.miningSlot.nextCohortSize().then(x => x.toNumber());\n if (this.subaccounts.length > this.nextCohortSize) {\n console.info(\n `Cohort size ${this.nextCohortSize} is less than provided subaccounts ${this.subaccounts.length}.`,\n );\n this.subaccounts.length = this.nextCohortSize;\n }\n this.millisPerTick = await client.query.ticks\n .genesisTicker()\n .then(x => x.tickDurationMillis.toNumber());\n\n this.unsubscribe = await client.queryMulti<\n [Vec<ArgonPrimitivesBlockSealMiningRegistration>, u64]\n >(\n [\n client.query.miningSlot.bidsForNextSlotCohort as any,\n client.query.miningSlot.nextFrameId as any,\n ],\n async ([bids, nextFrameId]) => {\n if (nextFrameId.toNumber() === this.cohortStartingFrameId) {\n await this.checkWinningBids(bids);\n }\n },\n );\n }\n\n public async stop(): Promise<CohortBidder['winningBids']> {\n if (this.isStopped) return this.winningBids;\n this.isStopped = true;\n console.log('Stopping bidder for cohort', this.cohortStartingFrameId);\n clearTimeout(this.retryTimeout);\n if (this.unsubscribe) {\n this.unsubscribe();\n }\n const client = await this.client;\n const [nextFrameId, isBiddingOpen] = await client.queryMulti<[u64, Bool]>([\n client.query.miningSlot.nextFrameId as any,\n client.query.miningSlot.isNextSlotBiddingOpen,\n ]);\n if (nextFrameId.toNumber() === this.cohortStartingFrameId && isBiddingOpen.isTrue) {\n console.log('Bidding is still open, waiting for it to close');\n await new Promise<void>(async resolve => {\n const unsub = await client.query.miningSlot.isNextSlotBiddingOpen(isOpen => {\n if (isOpen.isFalse) {\n unsub();\n resolve();\n }\n });\n });\n }\n // wait for any pending request to finish updating stats\n void (await this.pendingRequest);\n\n // go back to last block with this cohort\n let header = await client.rpc.chain.getHeader();\n let api = await client.at(header.hash);\n while (true) {\n const cohortStartingFrameId = await api.query.miningSlot.nextFrameId();\n if (cohortStartingFrameId.toNumber() === this.cohortStartingFrameId) {\n break;\n }\n header = await client.rpc.chain.getHeader(header.parentHash);\n api = await client.at(header.hash);\n }\n const bids = await api.query.miningSlot.bidsForNextSlotCohort();\n\n this.updateSeatsWon(bids);\n console.log('Bidder stopped', {\n cohortStartingFrameId: this.cohortStartingFrameId,\n blockNumber: header.number.toNumber(),\n bids: this.winningBids,\n });\n\n return this.winningBids;\n }\n\n private async checkWinningBids(bids: ArgonPrimitivesBlockSealMiningRegistration[]) {\n if (this.isStopped) return;\n clearTimeout(this.retryTimeout);\n\n this.updateSeatsWon(bids);\n const winningBids = this.winningBids.length;\n this.needsRebid = winningBids < this.subaccounts.length;\n\n const client = await this.client;\n const bestBlock = await client.rpc.chain.getBlockHash();\n const api = await client.at(bestBlock);\n const blockNumber = await api.query.system.number().then(x => x.toNumber());\n\n if (this.lastBidBlockNumber >= blockNumber) return;\n if (this.pendingRequest) return;\n\n const ticksSinceLastBid = Math.floor((Date.now() - this.lastBidTime) / this.millisPerTick!);\n if (ticksSinceLastBid < this.options.bidDelay && this.needsRebid) {\n this.retryTimeout = setTimeout(() => void this.checkCurrentSeats(), this.millisPerTick!);\n return;\n }\n if (!this.needsRebid) return;\n\n console.log(\n 'Checking bids for cohort',\n this.cohortStartingFrameId,\n this.subaccounts.map(x => x.index),\n );\n\n const winningAddresses = new Set(bids.map(x => x.accountId.toHuman()));\n let lowestBid = -this.options.bidIncrement;\n if (bids.length) {\n for (let i = bids.length - 1; i >= 0; i--) {\n // find the lowest bid that is not us\n if (!this.myAddresses.has(bids[i].accountId.toHuman())) {\n lowestBid = bids.at(i)!.bid.toBigInt();\n break;\n }\n }\n }\n\n // 1. determine next bid based on current bids and settings\n let nextBid = lowestBid + this.options.bidIncrement;\n if (nextBid < this.options.minBid) {\n nextBid = this.options.minBid;\n }\n if (nextBid > this.options.maxBid) {\n nextBid = this.options.maxBid;\n }\n\n const fakeTx = await this.accountset.createMiningBidTx({\n subaccounts: this.subaccounts,\n bidAmount: nextBid,\n });\n let availableBalanceForBids = await api.query.system\n .account(this.accountset.txSubmitterPair.address)\n .then(x => x.data.free.toBigInt());\n\n // add our current balance used to the budget\n for (const bid of bids) {\n if (this.myAddresses.has(bid.accountId.toHuman())) {\n availableBalanceForBids += bid.bid.toBigInt();\n }\n }\n const tip = this.options.tipPerTransaction ?? 0n;\n const feeEstimate = await fakeTx.feeEstimate(tip);\n const feePlusTip = feeEstimate + tip;\n\n let budgetForSeats = this.options.maxBudget - feePlusTip;\n if (budgetForSeats > availableBalanceForBids) {\n budgetForSeats = availableBalanceForBids - feePlusTip;\n }\n if (nextBid < lowestBid) {\n console.log(\n `Can't bid ${formatArgons(nextBid)}. Current lowest bid is ${formatArgons(lowestBid)}.`,\n );\n return;\n }\n\n if (nextBid - lowestBid < Number(this.minIncrement)) {\n console.log(\n `Can't make any more bids for ${this.cohortStartingFrameId} with given constraints.`,\n {\n lowestCurrentBid: formatArgons(lowestBid),\n nextAttemptedBid: formatArgons(nextBid),\n maxBid: formatArgons(this.options.maxBid),\n },\n );\n return;\n }\n\n const seatsInBudget =\n nextBid === 0n ? this.subaccounts.length : Number(budgetForSeats / nextBid);\n\n let accountsToUse = [...this.subaccounts];\n // 3. if we have more seats than we can afford, we need to remove some\n if (accountsToUse.length > seatsInBudget) {\n // Sort accounts by winning bids first, then rebids, then by index\n accountsToUse.sort((a, b) => {\n const isWinningA = winningAddresses.has(a.address);\n const isWinningB = winningAddresses.has(b.address);\n if (isWinningA && !isWinningB) return -1;\n if (!isWinningA && isWinningB) return 1;\n\n if (a.isRebid && !b.isRebid) return -1;\n if (!a.isRebid && b.isRebid) return 1;\n return a.index - b.index;\n });\n // only keep the number of accounts we can afford\n accountsToUse.length = seatsInBudget;\n }\n if (accountsToUse.length > winningBids) {\n this.pendingRequest = this.bid(nextBid, accountsToUse);\n }\n this.needsRebid = false;\n }\n\n private async bid(bidPerSeat: bigint, subaccounts: { address: string }[]) {\n const prevLastBidTime = this.lastBidTime;\n try {\n this.lastBidTime = Date.now();\n const submitter = await this.accountset.createMiningBidTx({\n subaccounts,\n bidAmount: bidPerSeat,\n });\n const tip = this.options.tipPerTransaction ?? 0n;\n const txResult = await submitter.submit({\n tip,\n useLatestNonce: true,\n });\n\n const bidError = await txResult.inBlockPromise\n .then(() => undefined)\n .catch((x: ExtrinsicError) => x);\n let blockNumber: number | undefined;\n if (txResult.includedInBlock) {\n const client = await this.client;\n const api = await client.at(txResult.includedInBlock);\n blockNumber = await api.query.system.number().then(x => x.toNumber());\n }\n\n const successfulBids = txResult.batchInterruptedIndex ?? subaccounts.length;\n\n this.txFees += txResult.finalFee ?? 0n;\n if (blockNumber !== undefined) {\n this.lastBidBlockNumber = Math.max(blockNumber, this.lastBidBlockNumber);\n }\n\n console.log('Done creating bids for cohort', {\n successfulBids,\n bidPerSeat,\n blockNumber,\n });\n if (bidError) throw bidError;\n } catch (err) {\n this.lastBidTime = prevLastBidTime;\n console.error(`Error bidding for cohort ${this.cohortStartingFrameId}:`, err);\n clearTimeout(this.retryTimeout);\n this.retryTimeout = setTimeout(() => void this.checkCurrentSeats(), 1000);\n } finally {\n this.pendingRequest = undefined;\n }\n\n if (this.needsRebid) {\n this.needsRebid = false;\n await this.checkCurrentSeats();\n }\n }\n\n private updateSeatsWon(next: { accountId: AccountId; bid: u128 | Compact<u128> }[]): void {\n this.winningBids.length = 0;\n for (const x of next) {\n const bid = x.bid.toBigInt();\n const address = x.accountId.toHuman();\n if (this.myAddresses.has(address)) {\n this.winningBids.push({ address, bid });\n }\n }\n }\n\n private async checkCurrentSeats() {\n const client = await this.client;\n const bids = await client.query.miningSlot.bidsForNextSlotCohort();\n await this.checkWinningBids(bids);\n }\n}\n","import { convertPermillToBigNumber, filterUndefined, formatArgons, formatPercent } from './utils';\nimport { Table } from 'console-table-printer';\nimport BigNumber from 'bignumber.js';\nimport { BlockWatch } from './BlockWatch';\nimport {\n type ArgonClient,\n type ArgonPrimitivesBlockSealMiningRegistration,\n type KeyringPair,\n type PalletLiquidityPoolsLiquidityPool,\n type PalletLiquidityPoolsLiquidityPoolCapital,\n type u32,\n type u64,\n type Vec,\n} from './index';\nimport { Vault } from './Vault';\nimport { TxResult, TxSubmitter } from './TxSubmitter';\nimport { AccountRegistry } from './AccountRegistry';\n\nconst EMPTY_TABLE = {\n headerBottom: { left: ' ', mid: ' ', other: '─', right: ' ' },\n headerTop: { left: ' ', mid: ' ', other: ' ', right: ' ' },\n rowSeparator: { left: ' ', mid: ' ', other: ' ', right: ' ' },\n tableBottom: { left: ' ', mid: ' ', other: ' ', right: ' ' },\n vertical: ' ',\n};\n\ninterface IContributor {\n address: string;\n amount: bigint;\n}\n\ninterface IVaultMiningBondFund {\n activatedCapital: bigint;\n contributors?: IContributor[];\n vaultSharingPercent?: BigNumber;\n earnings?: bigint;\n}\n\nexport class BidPool {\n public bidPoolAmount: bigint = 0n;\n public nextFrameId: number = 1;\n public poolVaultCapitalByFrame: {\n [frameId: number]: {\n [vaultId: number]: IVaultMiningBondFund;\n };\n } = {};\n\n private vaultSecuritization: {\n vaultId: number;\n activatedSecuritization: bigint;\n bitcoinSpace: bigint;\n vaultSharingPercent: BigNumber;\n }[] = [];\n private printTimeout?: NodeJS.Timeout;\n private blockWatch: BlockWatch;\n private vaultsById: { [id: number]: Vault } = {};\n private tickDuration?: number;\n private lastDistributedFrameId?: number;\n\n private FrameSubscriptions: { [frameId: number]: () => void } = {};\n\n constructor(\n readonly client: Promise<ArgonClient>,\n readonly keypair: KeyringPair,\n readonly accountRegistry: AccountRegistry = AccountRegistry.factory(),\n ) {\n this.blockWatch = new BlockWatch(client, { shouldLog: false });\n }\n\n private async onVaultsUpdated(blockHash: Uint8Array, vaultIdSet: Set<number>) {\n const client = await this.client;\n\n this.tickDuration ??= (await client.query.ticks.genesisTicker()).tickDurationMillis.toNumber();\n const api = await client.at(blockHash);\n const vaultIds = [...vaultIdSet];\n const rawVaults = await api.query.vaults.vaultsById.multi(vaultIds);\n for (let i = 0; i < vaultIds.length; i += 1) {\n const rawVault = rawVaults[i];\n if (rawVault.isNone) continue;\n const vaultId = vaultIds[i];\n this.vaultsById[vaultId] = new Vault(vaultId, rawVault.unwrap(), this.tickDuration);\n }\n\n const vaults = Object.entries(this.vaultsById);\n const newSecuritization: BidPool['vaultSecuritization'] = [];\n for (const [vaultId, vault] of vaults) {\n const amount = vault.activatedSecuritizationPerSlot();\n newSecuritization.push({\n vaultId: Number(vaultId),\n bitcoinSpace: vault.availableBitcoinSpace(),\n activatedSecuritization: amount,\n vaultSharingPercent: vault.terms.liquidityPoolProfitSharing,\n });\n }\n newSecuritization.sort((a, b) => {\n const diff2 = b.activatedSecuritization - a.activatedSecuritization;\n if (diff2 !== 0n) return Number(diff2);\n return a.vaultId - b.vaultId;\n });\n this.vaultSecuritization = newSecuritization;\n this.printDebounce();\n }\n\n public async getBidPool(): Promise<bigint> {\n const client = await this.client;\n const balanceBytes = await client.rpc.state.call('MiningSlotApi_bid_pool', '');\n const balance = client.createType('U128', balanceBytes);\n return balance.toBigInt();\n }\n\n public async loadAt(blockHash?: Uint8Array) {\n const client = await this.client;\n blockHash ??= new Uint8Array((await client.rpc.chain.getHeader()).hash);\n const api = await client.at(blockHash);\n const rawVaultIds = await api.query.vaults.vaultsById.keys();\n const vaultIds = rawVaultIds.map(x => x.args[0].toNumber());\n this.bidPoolAmount = await this.getBidPool();\n this.nextFrameId = (await api.query.miningSlot.nextFrameId()).toNumber();\n\n const contributors = await api.query.liquidityPools.vaultPoolsByFrame.entries();\n for (const [frameId, funds] of contributors) {\n const FrameIdNumber = frameId.args[0].toNumber();\n this.loadFrameData(FrameIdNumber, funds);\n }\n for (const entrant of await api.query.liquidityPools.capitalActive()) {\n this.setVaultFrameData(entrant.frameId.toNumber(), entrant.vaultId.toNumber(), {\n activatedCapital: entrant.activatedCapital.toBigInt(),\n });\n }\n for (const entrant of await api.query.liquidityPools.capitalRaising()) {\n this.setVaultFrameData(entrant.frameId.toNumber(), entrant.vaultId.toNumber(), {\n activatedCapital: entrant.activatedCapital.toBigInt(),\n });\n }\n await this.onVaultsUpdated(blockHash, new Set(vaultIds));\n this.print();\n }\n\n public async watch(): Promise<{ unsubscribe: () => void }> {\n await this.loadAt();\n await this.blockWatch.start();\n this.blockWatch.events.on('vaults-updated', (b, v) => this.onVaultsUpdated(b.hash, v));\n const api = await this.client;\n this.blockWatch.events.on('event', async (_, event) => {\n if (api.events.liquidityPools.BidPoolDistributed.is(event)) {\n const { frameId: rawFrameId } = event.data;\n this.lastDistributedFrameId = rawFrameId.toNumber();\n this.bidPoolAmount = await this.getBidPool();\n\n this.FrameSubscriptions[rawFrameId.toNumber()]?.();\n const entrant = await api.query.liquidityPools.vaultPoolsByFrame(rawFrameId);\n this.loadFrameData(rawFrameId.toNumber(), entrant);\n this.printDebounce();\n }\n if (api.events.liquidityPools.NextBidPoolCapitalLocked.is(event)) {\n const { frameId } = event.data;\n\n for (let inc = 0; inc < 2; inc++) {\n const id = frameId.toNumber() + inc;\n if (!this.FrameSubscriptions[id]) {\n this.FrameSubscriptions[id] = await api.query.liquidityPools.vaultPoolsByFrame(\n id,\n async entrant => {\n this.loadFrameData(id, entrant);\n this.printDebounce();\n },\n );\n }\n }\n }\n });\n\n const unsubscribe = await api.queryMulti<\n [\n Vec<ArgonPrimitivesBlockSealMiningRegistration>,\n u64,\n Vec<PalletLiquidityPoolsLiquidityPoolCapital>,\n Vec<PalletLiquidityPoolsLiquidityPoolCapital>,\n ]\n >(\n [\n api.query.miningSlot.bidsForNextSlotCohort as any,\n api.query.miningSlot.nextFrameId as any,\n api.query.liquidityPools.capitalActive as any,\n api.query.liquidityPools.capitalRaising as any,\n ],\n async ([_bids, nextFrameId, openVaultBidPoolCapital, nextPoolCapital]) => {\n this.bidPoolAmount = await this.getBidPool();\n this.nextFrameId = nextFrameId.toNumber();\n for (const entrant of [...openVaultBidPoolCapital, ...nextPoolCapital]) {\n this.setVaultFrameData(entrant.frameId.toNumber(), entrant.vaultId.toNumber(), {\n activatedCapital: entrant.activatedCapital.toBigInt(),\n });\n }\n this.printDebounce();\n },\n );\n\n return { unsubscribe };\n }\n\n public async bondArgons(\n vaultId: number,\n amount: bigint,\n options?: { tip: bigint },\n ): Promise<TxResult> {\n const client = await this.client;\n\n const tx = client.tx.liquidityPools.bondArgons(vaultId, amount);\n const txSubmitter = new TxSubmitter(client, tx, this.keypair);\n const affordability = await txSubmitter.canAfford({\n tip: options?.tip,\n unavailableBalance: amount,\n });\n\n if (!affordability.canAfford) {\n console.warn('Insufficient balance to bond argons to liquidity pool', {\n ...affordability,\n argonsNeeded: amount,\n });\n throw new Error('Insufficient balance to bond argons to liquidity pool');\n }\n\n const result = await txSubmitter.submit({\n tip: options?.tip,\n useLatestNonce: true,\n });\n await result.inBlockPromise;\n return result;\n }\n\n public printDebounce() {\n if (this.printTimeout) {\n clearTimeout(this.printTimeout);\n }\n this.printTimeout = setTimeout(() => {\n this.print();\n }, 100);\n }\n\n public getOperatorName(vaultId: number): string {\n const vault = this.vaultsById[vaultId];\n return this.accountRegistry.getName(vault.operatorAccountId) ?? vault.operatorAccountId;\n }\n\n public print() {\n console.clear();\n const lastDistributedFrameId = this.lastDistributedFrameId;\n const distributedFrame = this.poolVaultCapitalByFrame[this.lastDistributedFrameId ?? -1] ?? {};\n if (Object.keys(distributedFrame).length > 0) {\n console.log(`\\n\\nDistributed (Frame ${lastDistributedFrameId})`);\n\n const rows = [];\n let maxWidth = 0;\n for (const [key, entry] of Object.entries(distributedFrame)) {\n const { table, width } = this.createBondCapitalTable(\n entry.earnings ?? 0n,\n entry.contributors ?? [],\n `Earnings (shared = ${formatPercent(entry.vaultSharingPercent)})`,\n );\n if (width > maxWidth) {\n maxWidth = width;\n }\n rows.push({\n Vault: key,\n Who: this.getOperatorName(Number(key)),\n Balances: table,\n });\n }\n new Table({\n columns: [\n { name: 'Vault', alignment: 'left' },\n { name: 'Who', alignment: 'left' },\n {\n name: 'Balances',\n title: 'Contributor Balances',\n alignment: 'center',\n minLen: maxWidth,\n },\n ],\n rows,\n }).printTable();\n }\n console.log(\n `\\n\\nActive Bid Pool: ${formatArgons(this.bidPoolAmount)} (Frame ${this.nextFrameId})`,\n );\n const Frame = this.poolVaultCapitalByFrame[this.nextFrameId];\n if (Object.keys(Frame ?? {}).length > 0) {\n const rows = [];\n let maxWidth = 0;\n for (const [key, entry] of Object.entries(Frame)) {\n const { table, width } = this.createBondCapitalTable(\n entry.activatedCapital,\n entry.contributors ?? [],\n );\n if (width > maxWidth) {\n maxWidth = width;\n }\n rows.push({\n Vault: key,\n Who: this.getOperatorName(Number(key)),\n 'Pool Capital': table,\n });\n }\n new Table({\n columns: [\n { name: 'Vault', alignment: 'left' },\n { name: 'Who', alignment: 'left' },\n { name: 'Pool Capital', alignment: 'left', minLen: maxWidth },\n ],\n rows,\n }).printTable();\n }\n\n const raisingFunds = this.poolVaultCapitalByFrame[this.nextFrameId + 1] ?? [];\n let maxWidth = 0;\n const nextCapital = [];\n for (const x of this.vaultSecuritization) {\n const entry = raisingFunds[x.vaultId] ?? {};\n const { table, width } = this.createBondCapitalTable(\n x.activatedSecuritization,\n entry.contributors ?? [],\n );\n if (width > maxWidth) {\n maxWidth = width;\n }\n nextCapital.push({\n Vault: x.vaultId,\n Owner: this.getOperatorName(x.vaultId),\n 'Bitcoin Space': formatArgons(x.bitcoinSpace),\n 'Activated Securitization': `${formatArgons(x.activatedSecuritization)} / slot`,\n 'Liquidity Pool': `${formatPercent(x.vaultSharingPercent)} profit sharing${table}`,\n });\n }\n if (nextCapital.length) {\n console.log(`\\n\\nRaising Funds (Frame ${this.nextFrameId + 1}):`);\n new Table({\n columns: [\n { name: 'Vault', alignment: 'left' },\n { name: 'Owner', alignment: 'left' },\n { name: 'Bitcoin Space', alignment: 'right' },\n { name: 'Activated Securitization', alignment: 'right' },\n { name: 'Liquidity Pool', alignment: 'left', minLen: maxWidth },\n ],\n rows: nextCapital,\n }).printTable();\n }\n }\n\n private setVaultFrameData(frameId: number, vaultId: number, data: Partial<IVaultMiningBondFund>) {\n this.poolVaultCapitalByFrame ??= {};\n this.poolVaultCapitalByFrame[frameId] ??= {};\n this.poolVaultCapitalByFrame[frameId][vaultId] ??= {\n activatedCapital:\n data.activatedCapital ?? data.contributors?.reduce((a, b) => a + b.amount, 0n) ?? 0n,\n };\n\n Object.assign(this.poolVaultCapitalByFrame[frameId][vaultId], filterUndefined(data));\n }\n\n private createBondCapitalTable(total: bigint, contributors: IContributor[], title = 'Total') {\n const table = new Table({\n style: EMPTY_TABLE,\n columns: [\n { name: 'who', title: title, minLen: 10, alignment: 'right' },\n {\n name: 'amount',\n title: formatArgons(total),\n minLen: 7,\n alignment: 'left',\n },\n ],\n });\n for (const x of contributors) {\n table.addRow({\n who: this.accountRegistry.getName(x.address) ?? x.address,\n amount: formatArgons(x.amount),\n });\n }\n const str = table.render();\n const width = str.indexOf('\\n');\n return { table: str, width };\n }\n\n private loadFrameData(\n frameId: number,\n vaultFunds: Iterable<[u32, PalletLiquidityPoolsLiquidityPool]>,\n ): void {\n for (const [vaultId, fund] of vaultFunds) {\n const vaultIdNumber = vaultId.toNumber();\n const contributors = fund.contributorBalances.map(([a, b]) => ({\n address: a.toHuman(),\n amount: b.toBigInt(),\n }));\n if (fund.distributedProfits.isSome) {\n if (frameId > (this.lastDistributedFrameId ?? 0)) {\n this.lastDistributedFrameId = frameId;\n }\n }\n this.setVaultFrameData(frameId, vaultIdNumber, {\n earnings: fund.distributedProfits.isSome\n ? fund.distributedProfits.unwrap().toBigInt()\n : undefined,\n vaultSharingPercent: convertPermillToBigNumber(fund.vaultSharingPercent.toBigInt()),\n contributors,\n });\n }\n }\n}\n","import {\n Accountset,\n type ArgonClient,\n type ArgonPrimitivesBitcoinBitcoinNetwork,\n ITxProgressCallback,\n type KeyringPair,\n TxSubmitter,\n VaultMonitor,\n} from './index';\nimport { formatArgons } from './utils';\nimport { Vault } from './Vault';\nimport { GenericEvent } from '@polkadot/types';\nimport { TxResult } from './TxSubmitter';\nimport { hexToU8a, u8aToHex } from '@polkadot/util';\n\nexport const SATS_PER_BTC = 100_000_000n;\n\nexport class BitcoinLocks {\n constructor(readonly client: Promise<ArgonClient>) {}\n\n async getUtxoIdFromEvents(events: GenericEvent[]) {\n const client = await this.client;\n for (const event of events) {\n if (client.events.bitcoinLocks.BitcoinLockCreated.is(event)) {\n return event.data.utxoId.toNumber();\n }\n }\n return undefined;\n }\n\n async getMarketRate(satoshis: bigint): Promise<bigint> {\n const client = await this.client;\n const sats = client.createType('U64', satoshis.toString());\n const marketRate = await client.rpc.state.call('BitcoinApis_market_rate', sats.toHex(true));\n const rate = client.createType('Option<U128>', marketRate);\n if (!rate.isSome) {\n throw new Error('Market rate not available');\n }\n return rate.value.toBigInt();\n }\n\n async getRedemptionRate(satoshis: bigint): Promise<bigint> {\n const client = await this.client;\n const sats = client.createType('U64', satoshis.toString());\n const marketRate = await client.rpc.state.call('BitcoinApis_redemption_rate', sats.toHex(true));\n const rate = client.createType('Option<U128>', marketRate);\n if (!rate.isSome) {\n throw new Error('Redemption rate not available');\n }\n return rate.value.toBigInt();\n }\n\n async getConfig(): Promise<IBitcoinLockConfig> {\n const client = await this.client;\n const bitcoinNetwork = await client.query.bitcoinUtxos.bitcoinNetwork();\n return {\n releaseExpirationBlocks:\n client.consts.bitcoinLocks.lockReleaseCosignDeadlineBlocks.toNumber(),\n pendingConfirmationExpirationBlocks:\n client.consts.bitcoinUtxos.maxPendingConfirmationBlocks.toNumber(),\n tickDurationMillis: await client.query.ticks\n .genesisTicker()\n .then(x => x.tickDurationMillis.toNumber()),\n bitcoinNetwork,\n };\n }\n\n async getBitcoinConfirmedBlockHeight(): Promise<number> {\n const client = await this.client;\n return await client.query.bitcoinUtxos\n .confirmedBitcoinBlockTip()\n .then(x => x.value?.blockHeight.toNumber() ?? 0);\n }\n\n /**\n * Gets the UTXO reference by ID.\n * @param utxoId - The UTXO ID to look up.\n * @param atHeight - Optional block height to query the UTXO reference at a specific point in time.\n * @return An object containing the transaction ID and output index, or undefined if not found.\n * @return.txid - The Bitcoin transaction ID of the UTXO.\n * @return.vout - The output index of the UTXO in the transaction.\n * @return.bitcoinTxid - The Bitcoin transaction ID of the UTXO formatted in little endian\n */\n async getUtxoRef(\n utxoId: number,\n atHeight?: number,\n ): Promise<{ txid: string; vout: number; bitcoinTxid: string } | undefined> {\n let client = await this.client;\n if (atHeight !== undefined) {\n const blockHash = await client.rpc.chain.getBlockHash(atHeight);\n client = (await client.at(blockHash)) as ArgonClient;\n }\n const refRaw = await client.query.bitcoinUtxos.utxoIdToRef(utxoId);\n if (!refRaw) {\n return;\n }\n const ref = refRaw.unwrap();\n\n const txid = u8aToHex(ref.txid);\n const bitcoinTxid = u8aToHex(ref.txid.reverse());\n const vout = ref.outputIndex.toNumber();\n return { txid, vout, bitcoinTxid };\n }\n\n async getReleaseRequest(\n utxoId: number,\n atHeight?: number,\n ): Promise<IReleaseRequestDetails | undefined> {\n let client = await this.client;\n if (atHeight !== undefined) {\n const blockHash = await client.rpc.chain.getBlockHash(atHeight);\n client = (await client.at(blockHash)) as ArgonClient;\n }\n const locksPendingRelease = await client.query.bitcoinLocks.locksPendingReleaseByUtxoId();\n\n for (const [id, request] of locksPendingRelease.entries()) {\n if (id.toNumber() === utxoId) {\n return {\n toScriptPubkey: request.toScriptPubkey.toHex(),\n bitcoinNetworkFee: request.bitcoinNetworkFee.toBigInt(),\n dueBlockHeight: request.cosignDueBlock.toNumber(),\n vaultId: request.vaultId.toNumber(),\n redemptionPrice: request.redemptionPrice.toBigInt(),\n };\n }\n }\n return undefined;\n }\n\n async submitVaultSignature(args: {\n utxoId: number;\n vaultSignature: Uint8Array;\n argonKeyring: KeyringPair;\n txProgressCallback?: ITxProgressCallback;\n }): Promise<TxResult> {\n const { utxoId, vaultSignature, argonKeyring, txProgressCallback } = args;\n const client = await this.client;\n if (!vaultSignature || vaultSignature.byteLength < 70 || vaultSignature.byteLength > 73) {\n throw new Error(\n `Invalid vault signature length: ${vaultSignature.byteLength}. Must be 70-73 bytes.`,\n );\n }\n const signature = u8aToHex(vaultSignature);\n const tx = client.tx.bitcoinLocks.cosignRelease(utxoId, signature);\n const submitter = new TxSubmitter(client, tx, argonKeyring);\n\n return await submitter.submit({ txProgressCallback });\n }\n\n async getBitcoinLock(utxoId: number): Promise<IBitcoinLock | undefined> {\n const client = await this.client;\n const utxoRaw = await client.query.bitcoinLocks.locksByUtxoId(utxoId);\n if (!utxoRaw.isSome) {\n return;\n }\n const utxo = utxoRaw.unwrap();\n const p2shBytesPrefix = '0020';\n const wscriptHash = utxo.utxoScriptPubkey.asP2wsh.wscriptHash.toHex().replace('0x', '');\n const p2wshScriptHashHex = `0x${p2shBytesPrefix}${wscriptHash}`;\n const vaultId = utxo.vaultId.toNumber();\n const lockPrice = utxo.lockPrice.toBigInt();\n const ownerAccount = utxo.ownerAccount.toHuman();\n const satoshis = utxo.satoshis.toBigInt();\n const vaultPubkey = utxo.vaultPubkey.toHex();\n const vaultClaimPubkey = utxo.vaultClaimPubkey.toHex();\n const ownerPubkey = utxo.ownerPubkey.toHex();\n const [fingerprint, cosign_hd_index, claim_hd_index] = utxo.vaultXpubSources;\n const vaultXpubSources = {\n parentFingerprint: new Uint8Array(fingerprint),\n cosignHdIndex: cosign_hd_index.toNumber(),\n claimHdIndex: claim_hd_index.toNumber(),\n };\n\n const vaultClaimHeight = utxo.vaultClaimHeight.toNumber();\n const openClaimHeight = utxo.openClaimHeight.toNumber();\n const createdAtHeight = utxo.createdAtHeight.toNumber();\n const isVerified = utxo.isVerified.toJSON();\n const isRejectedNeedsRelease = utxo.isRejectedNeedsRelease.toJSON();\n const fundHoldExtensionsByBitcoinExpirationHeight = Object.fromEntries(\n [...utxo.fundHoldExtensions.entries()].map(([x, y]) => [x.toNumber(), y.toBigInt()]),\n );\n\n return {\n utxoId,\n p2wshScriptHashHex,\n vaultId,\n lockPrice,\n ownerAccount,\n satoshis,\n vaultPubkey,\n vaultClaimPubkey,\n ownerPubkey,\n vaultXpubSources,\n vaultClaimHeight,\n openClaimHeight,\n createdAtHeight,\n isVerified,\n isRejectedNeedsRelease,\n fundHoldExtensionsByBitcoinExpirationHeight,\n };\n }\n\n /**\n * Finds the cosign signature for a vault lock by UTXO ID. Optionally waits for the signature\n * @param utxoId - The UTXO ID of the bitcoin lock\n * @param waitForSignatureMillis - Optional timeout in milliseconds to wait for the signature. If -1, waits indefinitely.\n */\n async findVaultCosignSignature(\n utxoId: number,\n waitForSignatureMillis?: number,\n ): Promise<{ blockHeight: number; signature: Uint8Array } | undefined> {\n const client = await this.client;\n const releaseHeight = await client.query.bitcoinLocks.lockReleaseCosignHeightById(utxoId);\n if (releaseHeight.isSome) {\n const releaseHeightValue = releaseHeight.unwrap().toNumber();\n const signature = await this.getVaultCosignSignature(utxoId, releaseHeightValue);\n if (signature) {\n return { blockHeight: releaseHeightValue, signature };\n }\n }\n\n if (!waitForSignatureMillis) {\n return undefined;\n }\n\n return await new Promise(async (resolve, reject) => {\n let timeout: NodeJS.Timeout | undefined;\n const unsub = await client.rpc.chain.subscribeNewHeads(header => {\n const atHeight = header.number.toNumber();\n this.getVaultCosignSignature(utxoId, atHeight)\n .then(signature => {\n if (signature) {\n unsub?.();\n clearTimeout(timeout);\n resolve({ signature, blockHeight: atHeight });\n }\n })\n .catch(err => {\n console.error(`Error checking for cosign signature at height ${atHeight}:`, err);\n });\n });\n if (waitForSignatureMillis !== -1) {\n timeout = setTimeout(() => {\n unsub?.();\n reject(new Error(`Timeout waiting for cosign signature for UTXO ID ${utxoId}`));\n }, waitForSignatureMillis);\n }\n });\n }\n\n async blockHashAtHeight(atHeight: number): Promise<string | undefined> {\n const client = await this.client;\n\n for (let i = 0; i < 10; i++) {\n const currentHeight = await client.query.system.number().then(x => x.toNumber());\n if (atHeight > currentHeight) {\n console.warn(\n `Requested block height ${atHeight} is greater than current height ${currentHeight}. Retrying...`,\n );\n await new Promise(resolve => setTimeout(resolve, 1000)); // wait 1 second before retrying\n continue;\n }\n const hash = await client.rpc.chain.getBlockHash(atHeight).then(x => x.toHex());\n if (hash === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n console.warn(`Block hash not found for height ${atHeight}. Retrying...`);\n await new Promise(resolve => setTimeout(resolve, 1000)); // wait 1 second before retrying\n continue;\n }\n return hash;\n }\n return undefined;\n }\n\n async getVaultCosignSignature(utxoId: number, atHeight: number): Promise<Uint8Array | undefined> {\n const client = await this.client;\n\n const blockHash = await this.blockHashAtHeight(atHeight);\n if (!blockHash) {\n console.warn(`Block hash not found for height ${atHeight}`);\n return undefined;\n }\n\n const blockEvents = await client.at(blockHash).then(api => api.query.system.events());\n for (const event of blockEvents) {\n if (client.events.bitcoinLocks.BitcoinUtxoCosigned.is(event.event)) {\n const { utxoId: id, signature } = event.event.data;\n if (id.toNumber() === utxoId) {\n return new Uint8Array(signature);\n }\n }\n }\n return undefined;\n }\n\n async findPendingMints(utxoId: number): Promise<bigint[]> {\n const client = await this.client;\n const pendingMint = await client.query.mint.pendingMintUtxos();\n const mintsPending: bigint[] = [];\n for (const [utxoIdRaw, _accountId, mintAmountRaw] of pendingMint) {\n if (utxoIdRaw.toNumber() === utxoId) {\n mintsPending.push(mintAmountRaw.toBigInt());\n }\n }\n return mintsPending;\n }\n\n async createInitializeLockTx(args: {\n vault: Vault;\n ownerBitcoinPubkey: Uint8Array;\n satoshis: bigint;\n argonKeyring: KeyringPair;\n reducedBalanceBy?: bigint;\n tip?: bigint;\n }) {\n const { vault, argonKeyring, satoshis, tip = 0n, ownerBitcoinPubkey } = args;\n const client = await this.client;\n if (ownerBitcoinPubkey.length !== 33) {\n throw new Error(\n `Invalid Bitcoin key length: ${ownerBitcoinPubkey.length}. Must be a compressed pukey (33 bytes).`,\n );\n }\n\n const tx = client.tx.bitcoinLocks.initialize(vault.vaultId, satoshis, ownerBitcoinPubkey);\n const submitter = new TxSubmitter(\n client,\n client.tx.bitcoinLocks.initialize(vault.vaultId, satoshis, ownerBitcoinPubkey),\n argonKeyring,\n );\n const marketPrice = await this.getMarketRate(BigInt(satoshis));\n const securityFee = vault.calculateBitcoinFee(marketPrice);\n\n const { canAfford, availableBalance, txFee } = await submitter.canAfford({\n tip,\n unavailableBalance: securityFee + (args.reducedBalanceBy ?? 0n),\n includeExistentialDeposit: true,\n });\n if (!canAfford) {\n throw new Error(\n `Insufficient funds to initialize lock. Available: ${formatArgons(availableBalance)}, Required: ${satoshis}`,\n );\n }\n return { tx, securityFee, txFee };\n }\n\n async initializeLock(args: {\n vault: Vault;\n ownerBitcoinPubkey: Uint8Array;\n argonKeyring: KeyringPair;\n satoshis: bigint;\n tip?: bigint;\n txProgressCallback?: ITxProgressCallback;\n }): Promise<{\n lock: IBitcoinLock;\n createdAtHeight: number;\n txResult: TxResult;\n securityFee: bigint;\n }> {\n const { argonKeyring, tip = 0n, txProgressCallback } = args;\n const client = await this.client;\n\n const { tx, securityFee } = await this.createInitializeLockTx(args);\n const submitter = new TxSubmitter(client, tx, argonKeyring);\n const txResult = await submitter.submit({\n waitForBlock: true,\n logResults: true,\n tip,\n txProgressCallback,\n });\n const blockHash = await txResult.inBlockPromise;\n const blockHeight = await client\n .at(blockHash)\n .then(x => x.query.system.number())\n .then(x => x.toNumber());\n const utxoId = (await this.getUtxoIdFromEvents(txResult.events)) ?? 0;\n if (utxoId === 0) {\n throw new Error('Bitcoin lock creation failed, no UTXO ID found in transaction events');\n }\n const lock = await this.getBitcoinLock(utxoId);\n if (!lock) {\n throw new Error(`Lock with ID ${utxoId} not found after initialization`);\n }\n return { lock, createdAtHeight: blockHeight, txResult, securityFee };\n }\n\n async requiredSatoshisForArgonLiquidity(argonAmount: bigint): Promise<bigint> {\n /**\n * If 1_000_000 microgons are available, and the market rate is 100 microgons per satoshi, then\n * 1_000_000 / 100 = 10_000 satoshis needed\n */\n const marketRatePerBitcoin = await this.getMarketRate(SATS_PER_BTC);\n return (argonAmount * SATS_PER_BTC) / marketRatePerBitcoin;\n }\n\n async requestRelease(args: {\n lock: IBitcoinLock;\n releaseRequest: IReleaseRequest;\n argonKeyring: KeyringPair;\n tip?: bigint;\n txProgressCallback?: ITxProgressCallback;\n }): Promise<{ blockHash: Uint8Array; blockHeight: number }> {\n const client = await this.client;\n const {\n lock,\n releaseRequest: { bitcoinNetworkFee, toScriptPubkey },\n argonKeyring,\n tip,\n txProgressCallback,\n } = args;\n\n if (!toScriptPubkey.startsWith('0x')) {\n throw new Error('toScriptPubkey must be a hex string starting with 0x');\n }\n\n const submitter = new TxSubmitter(\n client,\n client.tx.bitcoinLocks.requestRelease(lock.utxoId, toScriptPubkey, bitcoinNetworkFee),\n argonKeyring,\n );\n\n let redemptionPrice = await this.getRedemptionRate(lock.satoshis);\n if (redemptionPrice > lock.lockPrice) {\n redemptionPrice = lock.lockPrice;\n }\n\n const canAfford = await submitter.canAfford({\n tip,\n unavailableBalance: BigInt(redemptionPrice),\n });\n\n if (!canAfford.canAfford) {\n throw new Error(\n `Insufficient funds to release lock. Available: ${formatArgons(canAfford.availableBalance)}, Required: ${formatArgons(redemptionPrice)}`,\n );\n }\n const txResult = await submitter.submit({\n waitForBlock: true,\n logResults: true,\n tip,\n txProgressCallback,\n });\n const blockHash = await txResult.inBlockPromise;\n const blockHeight = await client\n .at(blockHash)\n .then(x => x.query.system.number())\n .then(x => x.toNumber());\n return {\n blockHash,\n blockHeight,\n };\n }\n\n async releasePrice(satoshis: bigint, lockPrice: bigint): Promise<bigint> {\n const client = await this.client;\n const redemptionRate = await this.getRedemptionRate(satoshis);\n if (redemptionRate > lockPrice) {\n return redemptionRate;\n }\n return lockPrice;\n }\n\n async getRatchetPrice(\n lock: IBitcoinLock,\n vault: Vault,\n ): Promise<{ burnAmount: bigint; ratchetingFee: bigint; marketRate: bigint }> {\n const { createdAtHeight, vaultClaimHeight, lockPrice, satoshis } = lock;\n const client = await this.client;\n const marketRate = await this.getMarketRate(BigInt(satoshis));\n\n let ratchetingFee = vault.terms.bitcoinBaseFee;\n let burnAmount = 0n;\n // ratchet up\n if (marketRate > lockPrice) {\n const lockFee = vault.calculateBitcoinFee(marketRate);\n const currentBitcoinHeight = await client.query.bitcoinUtxos\n .confirmedBitcoinBlockTip()\n .then(x => x.unwrap().blockHeight.toNumber());\n const blockLength = vaultClaimHeight - createdAtHeight;\n const elapsed = (currentBitcoinHeight - createdAtHeight) / blockLength;\n const remainingDuration = 1 - elapsed;\n ratchetingFee = BigInt(remainingDuration * Number(lockFee));\n } else {\n burnAmount = await this.releasePrice(lock.satoshis, lockPrice);\n }\n\n return {\n ratchetingFee,\n burnAmount,\n marketRate,\n };\n }\n\n async ratchet(args: {\n lock: IBitcoinLock;\n argonKeyring: KeyringPair;\n tip?: bigint;\n vault: Vault;\n txProgressCallback?: ITxProgressCallback;\n }): Promise<{\n securityFee: bigint;\n txFee: bigint;\n newLockPrice: bigint;\n pendingMint: bigint;\n burned: bigint;\n blockHeight: number;\n bitcoinBlockHeight: number;\n }> {\n const { lock, argonKeyring, tip = 0n, vault, txProgressCallback } = args;\n const client = await this.client;\n\n const ratchetPrice = await this.getRatchetPrice(lock, vault);\n const txSubmitter = new TxSubmitter(\n client,\n client.tx.bitcoinLocks.ratchet(lock.utxoId),\n argonKeyring,\n );\n const canAfford = await txSubmitter.canAfford({\n tip,\n unavailableBalance: BigInt(ratchetPrice.burnAmount + ratchetPrice.ratchetingFee),\n });\n if (!canAfford.canAfford) {\n throw new Error(\n `Insufficient funds to ratchet lock. Available: ${formatArgons(canAfford.availableBalance)}, Required: ${formatArgons(\n ratchetPrice.burnAmount + ratchetPrice.ratchetingFee,\n )}`,\n );\n }\n\n const submission = await txSubmitter.submit({\n waitForBlock: true,\n tip,\n txProgressCallback,\n });\n const ratchetEvent = submission.events.find(x =>\n client.events.bitcoinLocks.BitcoinLockRatcheted.is(x),\n );\n if (!ratchetEvent) {\n throw new Error(`Ratchet event not found in transaction events`);\n }\n const blockHash = await submission.inBlockPromise;\n const api = await client.at(blockHash);\n const blockHeight = await api.query.system.number().then(x => x.toNumber());\n const bitcoinBlockHeight = await api.query.bitcoinUtxos\n .confirmedBitcoinBlockTip()\n .then(x => x.unwrap().blockHeight.toNumber());\n const { amountBurned, newLockPrice, originalLockPrice } = ratchetEvent.data;\n let mintAmount = newLockPrice.toBigInt();\n if (newLockPrice > originalLockPrice) {\n mintAmount -= originalLockPrice.toBigInt();\n }\n return {\n txFee: submission.finalFee ?? 0n,\n securityFee: ratchetPrice.ratchetingFee,\n pendingMint: mintAmount,\n newLockPrice: newLockPrice.toBigInt(),\n burned: amountBurned.toBigInt(),\n blockHeight,\n bitcoinBlockHeight,\n };\n }\n\n static async waitForSpace(\n accountset: Accountset,\n options: {\n argonAmount: bigint;\n bitcoinXpub: string;\n maxLockFee?: bigint;\n tip?: bigint;\n satoshiWiggleRoomForDynamicPrice?: bigint;\n },\n ): Promise<{\n satoshis: bigint;\n argons: bigint;\n vaultId: number;\n txFee: bigint;\n securityFee: bigint;\n utxoId: number;\n finalizedPromise: Promise<Uint8Array>;\n }> {\n const { argonAmount, bitcoinXpub, maxLockFee, tip = 0n } = options;\n const vaults = new VaultMonitor(accountset, {\n bitcoinSpaceAvailable: argonAmount,\n });\n const bitcoinXpubBuffer = hexToU8a(bitcoinXpub);\n\n return new Promise(async (resolve, reject) => {\n vaults.events.on('bitcoin-space-above', async (vaultId, amount) => {\n const vault = vaults.vaultsById[vaultId];\n const fee = vault.calculateBitcoinFee(amount);\n console.log(\n `Vault ${vaultId} has ${formatArgons(amount)} argons available for bitcoin. Lock fee is ${formatArgons(fee)}`,\n );\n if (maxLockFee !== undefined && fee > maxLockFee) {\n console.log(\n `Skipping vault ${vaultId} due to high lock fee: ${formatArgons(maxLockFee)}`,\n );\n return;\n }\n\n try {\n const bitcoinLock = new BitcoinLocks(accountset.client);\n let satoshis = await bitcoinLock.requiredSatoshisForArgonLiquidity(amount);\n satoshis -= options.satoshiWiggleRoomForDynamicPrice ?? 500n;\n const { txResult, lock, securityFee } = await bitcoinLock.initializeLock({\n vault,\n satoshis,\n argonKeyring: accountset.txSubmitterPair,\n ownerBitcoinPubkey: bitcoinXpubBuffer,\n tip,\n });\n\n resolve({\n satoshis,\n argons: argonAmount,\n vaultId,\n securityFee,\n txFee: txResult.finalFee!,\n finalizedPromise: txResult.finalizedPromise,\n utxoId: lock.utxoId,\n });\n } catch (err) {\n console.error('Error submitting bitcoin lock tx:', err);\n reject(err);\n } finally {\n vaults.stop();\n }\n });\n await vaults.monitor();\n });\n }\n}\n\nexport interface IBitcoinLockConfig {\n releaseExpirationBlocks: number;\n pendingConfirmationExpirationBlocks: number;\n tickDurationMillis: number;\n bitcoinNetwork: ArgonPrimitivesBitcoinBitcoinNetwork;\n}\nexport interface IReleaseRequest {\n toScriptPubkey: string;\n bitcoinNetworkFee: bigint;\n}\n\nexport interface IReleaseRequestDetails extends IReleaseRequest {\n dueBlockHeight: number;\n vaultId: number;\n redemptionPrice: bigint;\n}\n\nexport interface IBitcoinLock {\n utxoId: number;\n p2wshScriptHashHex: string;\n vaultId: number;\n lockPrice: bigint;\n ownerAccount: string;\n satoshis: bigint;\n vaultPubkey: string;\n vaultClaimPubkey: string;\n ownerPubkey: string;\n vaultXpubSources: {\n parentFingerprint: Uint8Array;\n cosignHdIndex: number;\n claimHdIndex: number;\n };\n vaultClaimHeight: number;\n openClaimHeight: number;\n createdAtHeight: number;\n isVerified: boolean;\n isRejectedNeedsRelease: boolean;\n fundHoldExtensionsByBitcoinExpirationHeight: Record<number, bigint>;\n}\n","import { Keyring, KeyringPair, mnemonicGenerate } from './index';\n\nexport function keyringFromSuri(\n suri: string,\n cryptoType: 'sr25519' | 'ed25519' = 'sr25519',\n): KeyringPair {\n return new Keyring({ type: cryptoType }).createFromUri(suri);\n}\n\nexport function createKeyringPair(opts: { cryptoType?: 'sr25519' | 'ed25519' }): KeyringPair {\n const { cryptoType } = opts;\n const seed = mnemonicGenerate();\n return keyringFromSuri(seed, cryptoType);\n}\n","import './interfaces/augment-api';\nimport './interfaces/augment-types';\nimport './interfaces/types-lookup';\nimport type { KeyringPair, KeyringPair$Json } from '@polkadot/keyring/types';\nimport { ApiPromise, HttpProvider, Keyring, WsProvider } from '@polkadot/api';\nimport { cryptoWaitReady, decodeAddress, mnemonicGenerate } from '@polkadot/util-crypto';\nimport type { InterfaceTypes } from '@polkadot/types/types/registry';\nimport type { KeypairType } from '@polkadot/util-crypto/types';\nimport type { ProviderInterface } from '@polkadot/rpc-provider/types';\n\nexport { WageProtector } from './WageProtector';\nexport { TxSubmitter, TxResult, ITxProgressCallback } from './TxSubmitter';\nexport { Accountset, type ISubaccountMiner, type IMiningIndex } from './Accountset';\nexport { MiningBids } from './MiningBids';\nexport { AccountMiners } from './AccountMiners';\nexport { FrameCalculator } from './FrameCalculator';\nexport { BlockWatch, getAuthorFromHeader, getTickFromHeader } from './BlockWatch';\nexport * from './utils';\nexport { AccountRegistry } from './AccountRegistry';\nexport { Vault } from './Vault';\nexport { VaultMonitor } from './VaultMonitor';\nexport { CohortBidder } from './CohortBidder';\nexport { BidPool } from './BidPool';\nexport * from './BitcoinLocks';\nexport * from './keyringUtils';\nexport { Keyring, KeyringPair, KeyringPair$Json, KeypairType, mnemonicGenerate, decodeAddress };\nexport { setConfig, getConfig, type ArgonClientConfig } from './config';\n\nexport { u8aToHex, hexToU8a, u8aEq } from '@polkadot/util';\n\nexport * from '@polkadot/types/lookup';\nexport { GenericEvent, GenericBlock, GenericAddress } from '@polkadot/types/generic';\nexport {\n BTreeMap,\n Bytes,\n Compact,\n Enum,\n Null,\n Option,\n Result,\n Bool,\n Tuple,\n Range,\n Struct,\n Text,\n U256,\n U8aFixed,\n Vec,\n bool,\n i128,\n u128,\n u16,\n u32,\n u64,\n u8,\n} from '@polkadot/types-codec';\nexport type {\n ISubmittableResult,\n IExtrinsic,\n SignerResult,\n Signer,\n ISignerPayload,\n} from '@polkadot/types/types/extrinsic';\nexport { type ITuple, type Codec } from '@polkadot/types-codec/types';\nexport {\n type AccountId32,\n type Call,\n type H160,\n type H256,\n type MultiAddress,\n type Permill,\n type AccountId,\n type Header,\n type Block,\n} from '@polkadot/types/interfaces/runtime';\nexport type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';\nexport { type BlockHash } from '@polkadot/types/interfaces/chain';\nexport { InterfaceTypes as interfaces };\n\nexport type ArgonClient = ApiPromise;\n\n/**\n * Wait for the crypto library to be ready (requires wasm, which needs async loading in commonjs)\n */\nexport async function waitForLoad(): Promise<void> {\n await cryptoWaitReady();\n}\n\n/**\n * Get a client for the given host\n * @param host The host to connect to\n * @returns The client\n */\nexport async function getClient(host: string): Promise<ArgonClient> {\n let provider: ProviderInterface;\n if (host.startsWith('http')) {\n provider = new HttpProvider(host);\n } else {\n provider = new WsProvider(host);\n }\n return await ApiPromise.create({ provider, noInitWarn: true });\n}\n"]}
|