@argonprotocol/mainchain 1.3.11 → 1.3.13

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/WageProtector.ts","../src/TxSubmitter.ts","../src/utils.ts","../src/keyringUtils.ts","../src/header.ts","../src/Vault.ts","../src/convert.ts","../src/BitcoinLocks.ts","../src/PriceIndex.ts","../src/index.ts"],"names":["BN","BigNumber","ExtrinsicError","ROUND_FLOOR"],"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","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';\n\nexport function logExtrinsicResult(result: ISubmittableResult) {\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\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;\n const 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-call\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(() => null);\n this.finalizedPromise.catch(() => null);\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 } 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 async function gettersToObject<T>(obj: T): Promise<T> {\n if (obj === null || obj === undefined || typeof obj !== 'object') return obj;\n\n const keys = [];\n\n for (const key in obj) {\n keys.push(key);\n }\n\n if (Symbol.iterator in obj) {\n const iterableToArray = [];\n // @ts-expect-error - it should iterate by virtue of Symbol.iterator\n for (const item of obj) {\n iterableToArray.push(await gettersToObject(item));\n }\n return iterableToArray as T;\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 as T;\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","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 { ArgonClient, Header } from './index';\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","import {\n ArgonClient,\n type ArgonPrimitivesVault,\n FIXED_U128_DECIMALS,\n formatArgons,\n fromFixedNumber,\n ITxProgressCallback,\n KeyringPair,\n PERMILL_DECIMALS,\n toFixedNumber,\n TxSubmitter,\n} from './index';\nimport BigNumber, * as BN from 'bignumber.js';\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 = fromFixedNumber(\n vault.securitizationRatio.toBigInt(),\n FIXED_U128_DECIMALS,\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: fromFixedNumber(\n vault.terms.bitcoinAnnualPercentRate.toBigInt(),\n FIXED_U128_DECIMALS,\n ),\n bitcoinBaseFee: vault.terms.bitcoinBaseFee.toBigInt(),\n treasuryProfitSharing: fromFixedNumber(\n vault.terms.treasuryProfitSharing.toBigInt(),\n PERMILL_DECIMALS,\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: fromFixedNumber(\n terms.bitcoinAnnualPercentRate.toBigInt(),\n FIXED_U128_DECIMALS,\n ),\n bitcoinBaseFee: terms.bitcoinBaseFee.toBigInt(),\n treasuryProfitSharing: fromFixedNumber(\n vault.terms.treasuryProfitSharing.toBigInt(),\n PERMILL_DECIMALS,\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 treasury 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 treasuryProfitSharing: 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 const vaultParams = {\n terms: {\n // convert to fixed u128\n bitcoinAnnualPercentRate: toFixedNumber(annualPercentRate, FIXED_U128_DECIMALS),\n bitcoinBaseFee: BigInt(baseFee),\n treasuryProfitSharing: toFixedNumber(args.treasuryProfitSharing, PERMILL_DECIMALS),\n },\n securitizationRatio: toFixedNumber(securitizationRatio, FIXED_U128_DECIMALS),\n securitization: BigInt(securitization),\n bitcoinXpubkey: xpubBytes,\n };\n const 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 treasuryProfitSharing: BigNumber;\n}\n","import BigNumber from 'bignumber.js';\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 fromFixedNumber(value: bigint, decimals: number = FIXED_U128_DECIMALS): BigNumber {\n const factor = new BigNumber(10).pow(decimals);\n const bn = new BigNumber(value.toString());\n return bn.div(factor);\n}\n\nexport const FIXED_U128_DECIMALS = 18;\nexport const PERMILL_DECIMALS = 6;\n","import {\n type ArgonClient,\n type ArgonPrimitivesBitcoinBitcoinNetwork,\n formatArgons,\n ITxProgressCallback,\n type KeyringPair,\n MICROGONS_PER_ARGON,\n TxSubmitter,\n Vault,\n} from './index';\nimport { GenericEvent } from '@polkadot/types';\nimport { TxResult } from './TxSubmitter';\nimport { u8aToHex } from '@polkadot/util';\nimport { ApiDecoration } from '@polkadot/api/types';\nimport { PriceIndex } from './PriceIndex';\n\nexport const SATS_PER_BTC = 100_000_000n;\n\nexport class BitcoinLocks {\n constructor(readonly client: ArgonClient) {}\n\n async getUtxoIdFromEvents(events: GenericEvent[]) {\n for (const event of events) {\n if (this.client.events.bitcoinLocks.BitcoinLockCreated.is(event)) {\n return event.data.utxoId.toNumber();\n }\n }\n return undefined;\n }\n\n async getMarketRate(priceIndex: PriceIndex, satoshis: number | bigint): Promise<bigint> {\n return priceIndex.getBtcMicrogonPrice(satoshis);\n }\n\n async getRedemptionRate(\n priceIndex: PriceIndex,\n details: { satoshis: bigint; peggedPrice?: bigint },\n ): Promise<bigint> {\n const { satoshis, peggedPrice } = details;\n // scale inputs\n const satsPerArgon = Number(SATS_PER_BTC) / MICROGONS_PER_ARGON;\n let price = Number(priceIndex.btcUsdPrice);\n price = (price / satsPerArgon) * Number(satoshis);\n\n if (peggedPrice !== undefined && peggedPrice < price) {\n price = Number(peggedPrice);\n }\n\n const r = Number(priceIndex.rValue);\n\n let multiplier: number;\n\n if (r >= 1) {\n // Case 1: no penalty\n multiplier = 1;\n } else if (r >= 0.9) {\n // Case 2: quadratic curve\n // Formula: 20r² - 38r + 19\n multiplier = 20 * (r * r) - 38 * r + 19;\n } else if (r >= 0.01) {\n // Case 3: rational linear formula\n // Formula: (0.5618r + 0.3944) / r\n multiplier = (0.5618 * r + 0.3944) / r;\n } else {\n // Case 4: extreme deviation\n // Formula: (1 / r) * (0.576r + 0.4)\n multiplier = (1 / r) * (0.576 * r + 0.4);\n }\n\n return BigInt(Math.floor(price * multiplier));\n }\n\n async getMarketRateApi(satoshis: bigint): Promise<bigint> {\n const client = 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 getRedemptionRateApi(satoshis: bigint): Promise<bigint> {\n const client = 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 = this.client;\n const bitcoinNetwork = await client.query.bitcoinUtxos.bitcoinNetwork();\n return {\n lockReleaseCosignDeadlineFrames:\n client.consts.bitcoinLocks.lockReleaseCosignDeadlineFrames.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 return await this.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 clientAtHeight - Optional client at the 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 clientAtHeight?: ApiDecoration<'promise'>,\n ): Promise<{ txid: string; vout: number; bitcoinTxid: string } | undefined> {\n const client = clientAtHeight ?? this.client;\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 clientAtHeight?: ApiDecoration<'promise'>,\n ): Promise<IReleaseRequestDetails | undefined> {\n const client = clientAtHeight ?? this.client;\n const requestMaybe = await client.query.bitcoinLocks.lockReleaseRequestsByUtxoId(utxoId);\n if (!requestMaybe.isSome) {\n return undefined;\n }\n const request = requestMaybe.unwrap();\n return {\n toScriptPubkey: request.toScriptPubkey.toHex(),\n bitcoinNetworkFee: request.bitcoinNetworkFee.toBigInt(),\n dueFrame: request.cosignDueFrame.toNumber(),\n vaultId: request.vaultId.toNumber(),\n redemptionPrice: request.redemptionPrice.toBigInt(),\n };\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 = 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 utxoRaw = await this.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 peggedPrice = utxo.peggedPrice.toBigInt();\n const liquidityPromised = utxo.liquidityPromised.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 securityFees = utxo.securityFees.toBigInt();\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 peggedPrice,\n liquidityPromised,\n ownerAccount,\n satoshis,\n vaultPubkey,\n vaultClaimPubkey,\n ownerPubkey,\n vaultXpubSources,\n vaultClaimHeight,\n openClaimHeight,\n createdAtHeight,\n securityFees,\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 = 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 = 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 = 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 pendingMint = await this.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 priceIndex: PriceIndex;\n ownerBitcoinPubkey: Uint8Array;\n satoshis: bigint;\n argonKeyring: KeyringPair;\n reducedBalanceBy?: bigint;\n tip?: bigint;\n }) {\n const { vault, priceIndex, argonKeyring, satoshis, tip = 0n, ownerBitcoinPubkey } = args;\n const client = 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(priceIndex, satoshis);\n const isVaultOwner = argonKeyring.address === vault.operatorAccountId;\n const securityFee = isVaultOwner ? 0n : 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 getBitcoinLockFromTxResult(txResult: TxResult): Promise<{\n lock: IBitcoinLock;\n createdAtHeight: number;\n txResult: TxResult;\n }> {\n const client = this.client;\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 };\n }\n\n async initializeLock(args: {\n vault: Vault;\n priceIndex: PriceIndex;\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 = 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\n const { lock, createdAtHeight } = await this.getBitcoinLockFromTxResult(txResult);\n return {\n lock,\n createdAtHeight,\n txResult,\n securityFee,\n };\n }\n\n async requiredSatoshisForArgonLiquidity(\n priceIndex: PriceIndex,\n argonAmount: bigint,\n ): 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 = priceIndex.getBtcMicrogonPrice(SATS_PER_BTC);\n return (argonAmount * SATS_PER_BTC) / marketRatePerBitcoin;\n }\n\n async requestRelease(args: {\n lock: IBitcoinLock;\n priceIndex: PriceIndex;\n releaseRequest: IReleaseRequest;\n argonKeyring: KeyringPair;\n tip?: bigint;\n txProgressCallback?: ITxProgressCallback;\n }): Promise<{ blockHash: Uint8Array; blockHeight: number }> {\n const client = this.client;\n const {\n lock,\n priceIndex,\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 const redemptionPrice = await this.getRedemptionRate(priceIndex, lock);\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(\n priceIndex: PriceIndex,\n lock: { satoshis: bigint; peggedPrice: bigint },\n ): Promise<bigint> {\n return await this.getRedemptionRate(priceIndex, lock);\n }\n\n async getRatchetPrice(\n lock: IBitcoinLock,\n priceIndex: PriceIndex,\n vault: Vault,\n ): Promise<{ burnAmount: bigint; ratchetingFee: bigint; marketRate: bigint }> {\n const { createdAtHeight, vaultClaimHeight, peggedPrice, satoshis } = lock;\n const client = this.client;\n const marketRate = await this.getMarketRate(priceIndex, BigInt(satoshis));\n\n let ratchetingFee = vault.terms.bitcoinBaseFee;\n let burnAmount = 0n;\n // ratchet up\n if (marketRate > peggedPrice) {\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(priceIndex, lock);\n }\n\n return {\n ratchetingFee,\n burnAmount,\n marketRate,\n };\n }\n\n async ratchet(args: {\n lock: IBitcoinLock;\n priceIndex: PriceIndex;\n argonKeyring: KeyringPair;\n tip?: bigint;\n vault: Vault;\n txProgressCallback?: ITxProgressCallback;\n }): Promise<{\n securityFee: bigint;\n txFee: bigint;\n newPeggedPrice: bigint;\n liquidityPromised: bigint;\n pendingMint: bigint;\n burned: bigint;\n blockHeight: number;\n bitcoinBlockHeight: number;\n }> {\n const { lock, priceIndex, argonKeyring, tip = 0n, vault, txProgressCallback } = args;\n const client = this.client;\n\n const ratchetPrice = await this.getRatchetPrice(lock, priceIndex, 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 {\n amountBurned,\n liquidityPromised: liquidityPromisedRaw,\n newPeggedPrice,\n originalPeggedPrice,\n } = ratchetEvent.data;\n const liquidityPromised = liquidityPromisedRaw.toBigInt();\n let mintAmount = liquidityPromised;\n if (liquidityPromised > originalPeggedPrice.toBigInt()) {\n mintAmount -= originalPeggedPrice.toBigInt();\n }\n return {\n txFee: submission.finalFee ?? 0n,\n securityFee: ratchetPrice.ratchetingFee,\n pendingMint: mintAmount,\n liquidityPromised,\n newPeggedPrice: newPeggedPrice.toBigInt(),\n burned: amountBurned.toBigInt(),\n blockHeight,\n bitcoinBlockHeight,\n };\n }\n}\n\nexport interface IBitcoinLockConfig {\n lockReleaseCosignDeadlineFrames: 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 dueFrame: number;\n vaultId: number;\n redemptionPrice: bigint;\n}\n\nexport interface IBitcoinLock {\n utxoId: number;\n p2wshScriptHashHex: string;\n vaultId: number;\n peggedPrice: bigint;\n liquidityPromised: bigint;\n ownerAccount: string;\n satoshis: bigint;\n vaultPubkey: string;\n securityFees: bigint;\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 {\n ArgonClient,\n FIXED_U128_DECIMALS,\n fromFixedNumber,\n MICROGONS_PER_ARGON,\n SATS_PER_BTC,\n} from './index';\nimport BigNumber from 'bignumber.js';\n\nexport class PriceIndex {\n btcUsdPrice?: BigNumber;\n argonotUsdPrice?: BigNumber;\n argonUsdPrice?: BigNumber;\n argonUsdTargetPrice?: BigNumber;\n argonTimeWeightedAverageLiquidity?: BigNumber;\n lastUpdatedTick?: number;\n\n async load(client: ArgonClient): Promise<this> {\n const current = await client.query.priceIndex.current();\n if (!current.isSome) {\n this.argonUsdPrice = undefined;\n this.argonotUsdPrice = undefined;\n this.btcUsdPrice = undefined;\n this.argonUsdTargetPrice = undefined;\n this.argonTimeWeightedAverageLiquidity = undefined;\n this.lastUpdatedTick = undefined;\n return this;\n }\n const value = current.unwrap();\n\n this.btcUsdPrice = fromFixedNumber(value.btcUsdPrice.toBigInt(), FIXED_U128_DECIMALS);\n this.argonotUsdPrice = fromFixedNumber(value.argonotUsdPrice.toBigInt(), FIXED_U128_DECIMALS);\n this.argonUsdPrice = fromFixedNumber(value.argonUsdPrice.toBigInt(), FIXED_U128_DECIMALS);\n this.argonUsdTargetPrice = fromFixedNumber(\n value.argonUsdTargetPrice.toBigInt(),\n FIXED_U128_DECIMALS,\n );\n this.argonTimeWeightedAverageLiquidity = fromFixedNumber(\n value.argonTimeWeightedAverageLiquidity.toBigInt(),\n FIXED_U128_DECIMALS,\n );\n this.lastUpdatedTick = value.tick.toNumber();\n return this;\n }\n\n getBtcMicrogonPrice(satoshis: bigint | number): bigint {\n if (this.btcUsdPrice === undefined || this.argonUsdPrice === undefined) {\n throw new Error('PriceIndex not loaded');\n }\n\n const satoshiCents = this.btcUsdPrice.multipliedBy(satoshis).dividedBy(SATS_PER_BTC);\n\n const microgons = satoshiCents.multipliedBy(MICROGONS_PER_ARGON).dividedBy(this.argonUsdPrice);\n return BigInt(microgons.integerValue(BigNumber.ROUND_DOWN).toString());\n }\n\n get rValue(): BigNumber {\n if (this.argonUsdTargetPrice === undefined || this.argonUsdPrice === undefined) {\n throw new Error('PriceIndex not loaded');\n }\n return this.argonUsdPrice.div(this.argonUsdTargetPrice);\n }\n\n get argonCpi(): BigNumber {\n if (this.argonUsdTargetPrice === undefined || this.argonUsdPrice === undefined) {\n throw new Error('PriceIndex not loaded');\n }\n const ratio = this.argonUsdTargetPrice.div(this.argonUsdPrice);\n return ratio.minus(1);\n }\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';\nimport type { ApiDecoration, ApiOptions } from '@polkadot/api/types';\n\nexport type { SubmittableExtrinsic } from '@polkadot/api/promise/types';\nexport { ApiDecoration };\nexport { WageProtector } from './WageProtector';\nexport { TxSubmitter, TxResult, ITxProgressCallback } from './TxSubmitter';\nexport * from './utils';\nexport * from './keyringUtils';\nexport * from './header';\nexport * from './Vault';\nexport * from './convert';\nexport * from './BitcoinLocks';\nexport * from './PriceIndex';\nexport { Keyring, KeyringPair, KeyringPair$Json, KeypairType, mnemonicGenerate, decodeAddress };\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 type SignedBlock,\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 * @param options Additional options for the API\n * @returns The client\n */\nexport async function getClient(host: string, options?: ApiOptions): 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, ...(options ?? {}) });\n}\n"]}
1
+ {"version":3,"sources":["../src/WageProtector.ts","../src/utils.ts","../src/TxResult.ts","../src/TxSubmitter.ts","../src/keyringUtils.ts","../src/header.ts","../src/Vault.ts","../src/convert.ts","../src/BitcoinLocks.ts","../src/PriceIndex.ts","../src/index.ts"],"names":["BN","BigNumber","ROUND_FLOOR"],"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","import BigNumber, * as BN from 'bignumber.js';\nimport type { ArgonClient } 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 async function gettersToObject<T>(obj: T): Promise<T> {\n if (obj === null || obj === undefined || typeof obj !== 'object') return obj;\n\n const keys = [];\n\n for (const key in obj) {\n keys.push(key);\n }\n\n if (Symbol.iterator in obj) {\n const iterableToArray = [];\n // @ts-expect-error - it should iterate by virtue of Symbol.iterator\n for (const item of obj) {\n iterableToArray.push(await gettersToObject(item));\n }\n return iterableToArray as T;\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 as T;\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 public readonly txFee: bigint = 0n,\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 txFee?: bigint,\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, txFee);\n }\n return new ExtrinsicError(error.toString(), undefined, batchInterruptedIndex, txFee);\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","import { ArgonClient, GenericEvent, SpRuntimeDispatchError } from './index';\nimport { dispatchErrorToExtrinsicError, ExtrinsicError } from './utils';\nimport type { ISubmittableResult } from '@polkadot/types/types/extrinsic';\nimport { DispatchError } from '@polkadot/types/interfaces';\n\nexport type ITxProgressCallback = (progressToInBlock: number, result?: TxResult) => void;\n\nexport class TxResult {\n #isBroadcast = false;\n #submissionError?: Error;\n\n set isBroadcast(value: boolean) {\n this.#isBroadcast = value;\n this.updateProgress();\n }\n\n get isBroadcast(): boolean {\n return this.#isBroadcast;\n }\n\n set submissionError(value: Error) {\n if (value) {\n this.#submissionError = value;\n this.finalizedReject(value);\n this.inBlockReject(value);\n this.updateProgress();\n }\n }\n\n get submissionError(): Error | undefined {\n return this.#submissionError;\n }\n\n public waitForFinalizedBlock: Promise<Uint8Array>;\n public waitForInFirstBlock: Promise<Uint8Array>;\n public events: GenericEvent[] = [];\n\n public extrinsicError: ExtrinsicError | Error | undefined;\n public extrinsicIndex: number | undefined;\n\n public txProgressCallback?: ITxProgressCallback;\n /**\n * The index of the batch that was interrupted, if any.\n */\n public batchInterruptedIndex?: number;\n public blockHash?: Uint8Array;\n public blockNumber?: number;\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 txProgress = 0;\n public isFinalized = false;\n\n protected finalizedResolve!: (block: Uint8Array) => void;\n protected finalizedReject!: (error: ExtrinsicError | Error) => void;\n protected inBlockResolve!: (block: Uint8Array) => void;\n protected inBlockReject!: (error: ExtrinsicError | Error) => void;\n\n constructor(\n protected readonly client: ArgonClient,\n public extrinsic: {\n signedHash: string;\n method: any;\n submittedTime: Date;\n submittedAtBlockNumber: number;\n accountAddress: string;\n },\n ) {\n this.waitForFinalizedBlock = new Promise((resolve, reject) => {\n this.finalizedResolve = resolve;\n this.finalizedReject = reject;\n });\n this.waitForInFirstBlock = new Promise((resolve, reject) => {\n this.inBlockResolve = resolve;\n this.inBlockReject = reject;\n });\n // drown reject\n this.waitForFinalizedBlock.catch(() => null);\n this.waitForInFirstBlock.catch(() => null);\n }\n\n public async setSeenInBlock(block: {\n blockHash: Uint8Array;\n blockNumber?: number;\n extrinsicIndex: number;\n events: GenericEvent[];\n }): Promise<void> {\n const { blockHash, blockNumber, events } = block;\n if (blockHash !== this.blockHash) {\n this.parseEvents(events);\n this.blockHash = blockHash;\n this.blockNumber =\n blockNumber ??\n (await this.client.rpc.chain.getHeader(blockHash).then(h => h.number.toNumber()));\n this.extrinsicIndex = block.extrinsicIndex;\n this.updateProgress();\n if (this.extrinsicError) {\n this.inBlockReject(this.extrinsicError);\n } else {\n this.inBlockResolve(blockHash);\n }\n }\n }\n\n public setFinalized() {\n this.isFinalized = true;\n this.updateProgress();\n\n let error = this.extrinsicError ?? this.submissionError;\n if (!error && !this.blockHash) {\n error = new Error('Cannot finalize transaction before it is included in a block');\n }\n\n if (error) {\n this.finalizedReject(error);\n this.inBlockReject(error);\n } else {\n this.finalizedResolve(this.blockHash!);\n this.inBlockResolve(this.blockHash!);\n }\n }\n\n public onSubscriptionResult(result: ISubmittableResult) {\n const { events, status, isFinalized, txIndex } = result;\n const extrinsicEvents = events.map(x => x.event);\n\n if (status.isBroadcast) {\n this.isBroadcast = true;\n if (result.internalError) this.submissionError = result.internalError;\n }\n if (status.isInBlock) {\n void this.setSeenInBlock({\n blockHash: Uint8Array.from(status.asInBlock),\n events: extrinsicEvents,\n extrinsicIndex: txIndex!,\n });\n }\n if (isFinalized) {\n this.setFinalized();\n }\n }\n\n private updateProgress() {\n if (this.isFinalized || this.submissionError) {\n this.txProgress = 100;\n } else if (this.blockNumber) {\n const elapsedBlocks = this.blockNumber - this.extrinsic.submittedAtBlockNumber;\n const FINALIZATION_BLOCKS = 5;\n const remainingPercent = Math.max(0, FINALIZATION_BLOCKS - elapsedBlocks) * 20;\n const percent = 100 - remainingPercent;\n this.txProgress = Math.min(percent, 99);\n } else if (this.extrinsic.submittedAtBlockNumber) {\n this.txProgress = 10;\n }\n this.txProgressCallback?.(this.txProgress);\n }\n\n private parseEvents(events: GenericEvent[]) {\n let encounteredError: SpRuntimeDispatchError | undefined;\n for (const event of events) {\n if (this.client.events.system.ExtrinsicFailed.is(event)) {\n const { dispatchError } = event.data;\n encounteredError ??= dispatchError;\n }\n if (this.client.events.utility.BatchInterrupted.is(event)) {\n const { index, error } = event.data;\n this.batchInterruptedIndex = index.toNumber();\n encounteredError = error;\n }\n if (this.client.events.transactionPayment.TransactionFeePaid.is(event)) {\n const { actualFee, tip } = event.data;\n this.finalFee = actualFee.toBigInt();\n this.finalFeeTip = tip.toBigInt();\n }\n }\n if (encounteredError) {\n this.extrinsicError = dispatchErrorToExtrinsicError(\n this.client,\n encounteredError as unknown as DispatchError,\n this.batchInterruptedIndex,\n this.finalFee,\n );\n } else {\n this.extrinsicError = undefined;\n }\n this.events = events;\n }\n}\n","import { ArgonClient, KeyringPair, waitForLoad } from './index';\nimport type { SubmittableExtrinsic } from '@polkadot/api/promise/types';\nimport type { SignerOptions } from '@polkadot/api/types';\nimport { ITxProgressCallback, TxResult } from './TxResult';\n\nexport type ISubmittableOptions = Partial<SignerOptions> & {\n tip?: bigint;\n logResults?: boolean;\n useLatestNonce?: boolean;\n txProgressCallback?: ITxProgressCallback;\n disableAutomaticTxTracking?: boolean;\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(options: ISubmittableOptions = {}): Promise<TxResult> {\n const { useLatestNonce, ...apiOptions } = options;\n await waitForLoad();\n const blockHeight = await this.client.rpc.chain.getHeader().then(h => h.number.toNumber());\n if (options.logResults) {\n this.logRequest();\n }\n if (useLatestNonce && !apiOptions.nonce) {\n apiOptions.nonce = await this.client.rpc.system.accountNextIndex(this.pair.address);\n }\n\n const signedTx = await this.tx.signAsync(this.pair, apiOptions);\n const txHash = signedTx.hash.toHex();\n const result = new TxResult(this.client, {\n signedHash: txHash,\n method: signedTx.method.toHuman(),\n accountAddress: this.pair.address,\n submittedTime: new Date(),\n submittedAtBlockNumber: blockHeight,\n });\n if (options.disableAutomaticTxTracking !== true) {\n await signedTx.send(result.onSubscriptionResult.bind(result));\n } else {\n try {\n await signedTx.send();\n result.isBroadcast = true;\n } catch (error) {\n result.submissionError = error as Error;\n }\n }\n return result;\n }\n\n private logRequest() {\n let toHuman = (this.tx.toHuman() as any).method;\n const 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-call\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 console.log('Submitting transaction from %s:', this.pair.address, ...args);\n }\n}\n\nfunction formatCall(call: any): string {\n return `${call.section}.${call.method}`;\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 { ArgonClient, Header } from './index';\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","import {\n ArgonClient,\n type ArgonPrimitivesVault,\n FIXED_U128_DECIMALS,\n formatArgons,\n fromFixedNumber,\n ITxProgressCallback,\n KeyringPair,\n PERMILL_DECIMALS,\n toFixedNumber,\n TxSubmitter,\n} from './index';\nimport BigNumber, * as BN from 'bignumber.js';\nimport bs58check from 'bs58check';\nimport { hexToU8a } from '@polkadot/util';\nimport { TxResult } from './TxResult';\nimport { ISubmittableOptions } 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 = fromFixedNumber(\n vault.securitizationRatio.toBigInt(),\n FIXED_U128_DECIMALS,\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: fromFixedNumber(\n vault.terms.bitcoinAnnualPercentRate.toBigInt(),\n FIXED_U128_DECIMALS,\n ),\n bitcoinBaseFee: vault.terms.bitcoinBaseFee.toBigInt(),\n treasuryProfitSharing: fromFixedNumber(\n vault.terms.treasuryProfitSharing.toBigInt(),\n PERMILL_DECIMALS,\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: fromFixedNumber(\n terms.bitcoinAnnualPercentRate.toBigInt(),\n FIXED_U128_DECIMALS,\n ),\n bitcoinBaseFee: terms.bitcoinBaseFee.toBigInt(),\n treasuryProfitSharing: fromFixedNumber(\n vault.terms.treasuryProfitSharing.toBigInt(),\n PERMILL_DECIMALS,\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 treasury 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 treasuryProfitSharing: number;\n doNotExceedBalance?: bigint;\n } & ISubmittableOptions,\n config: { tickDurationMillis?: number } = {},\n ): Promise<{ getVault(): Promise<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 const vaultParams = {\n terms: {\n // convert to fixed u128\n bitcoinAnnualPercentRate: toFixedNumber(annualPercentRate, FIXED_U128_DECIMALS),\n bitcoinBaseFee: BigInt(baseFee),\n treasuryProfitSharing: toFixedNumber(args.treasuryProfitSharing, PERMILL_DECIMALS),\n },\n securitizationRatio: toFixedNumber(securitizationRatio, FIXED_U128_DECIMALS),\n securitization: BigInt(securitization),\n bitcoinXpubkey: xpubBytes,\n };\n const 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 ...args,\n useLatestNonce: true,\n });\n const tickDuration =\n config.tickDurationMillis ??\n (await client.query.ticks.genesisTicker().then(x => x.tickDurationMillis.toNumber()))!;\n\n async function getVault(): Promise<Vault> {\n await result.waitForFinalizedBlock;\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 return new Vault(vaultId, rawVault.unwrap(), tickDuration);\n }\n return { getVault, txResult: result };\n }\n}\n\nexport interface ITerms {\n readonly bitcoinAnnualPercentRate: BigNumber;\n readonly bitcoinBaseFee: bigint;\n readonly treasuryProfitSharing: BigNumber;\n}\n","import BigNumber from 'bignumber.js';\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 fromFixedNumber(value: bigint, decimals: number = FIXED_U128_DECIMALS): BigNumber {\n const factor = new BigNumber(10).pow(decimals);\n const bn = new BigNumber(value.toString());\n return bn.div(factor);\n}\n\nexport const FIXED_U128_DECIMALS = 18;\nexport const PERMILL_DECIMALS = 6;\n","import {\n type ArgonClient,\n type ArgonPrimitivesBitcoinBitcoinNetwork,\n formatArgons,\n type KeyringPair,\n MICROGONS_PER_ARGON,\n TxSubmitter,\n Vault,\n} from './index';\nimport { GenericEvent } from '@polkadot/types';\nimport { ISubmittableOptions } from './TxSubmitter';\nimport { TxResult } from './TxResult';\nimport { u8aToHex } from '@polkadot/util';\nimport { ApiDecoration } from '@polkadot/api/types';\nimport { PriceIndex } from './PriceIndex';\n\nexport const SATS_PER_BTC = 100_000_000n;\n\nexport class BitcoinLocks {\n constructor(readonly client: ArgonClient) {}\n\n async getUtxoIdFromEvents(events: GenericEvent[]) {\n for (const event of events) {\n if (this.client.events.bitcoinLocks.BitcoinLockCreated.is(event)) {\n return event.data.utxoId.toNumber();\n }\n }\n return undefined;\n }\n\n async getMarketRate(priceIndex: PriceIndex, satoshis: number | bigint): Promise<bigint> {\n return priceIndex.getBtcMicrogonPrice(satoshis);\n }\n\n async getRedemptionRate(\n priceIndex: PriceIndex,\n details: { satoshis: bigint; peggedPrice?: bigint },\n ): Promise<bigint> {\n const { satoshis, peggedPrice } = details;\n // scale inputs\n const satsPerArgon = Number(SATS_PER_BTC) / MICROGONS_PER_ARGON;\n let price = Number(priceIndex.btcUsdPrice);\n price = (price / satsPerArgon) * Number(satoshis);\n\n if (peggedPrice !== undefined && peggedPrice < price) {\n price = Number(peggedPrice);\n }\n\n const r = Number(priceIndex.rValue);\n\n let multiplier: number;\n\n if (r >= 1) {\n // Case 1: no penalty\n multiplier = 1;\n } else if (r >= 0.9) {\n // Case 2: quadratic curve\n // Formula: 20r² - 38r + 19\n multiplier = 20 * (r * r) - 38 * r + 19;\n } else if (r >= 0.01) {\n // Case 3: rational linear formula\n // Formula: (0.5618r + 0.3944) / r\n multiplier = (0.5618 * r + 0.3944) / r;\n } else {\n // Case 4: extreme deviation\n // Formula: (1 / r) * (0.576r + 0.4)\n multiplier = (1 / r) * (0.576 * r + 0.4);\n }\n\n return BigInt(Math.floor(price * multiplier));\n }\n\n async getMarketRateApi(satoshis: bigint): Promise<bigint> {\n const client = 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 getRedemptionRateApi(satoshis: bigint): Promise<bigint> {\n const client = 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 = this.client;\n const bitcoinNetwork = await client.query.bitcoinUtxos.bitcoinNetwork();\n return {\n lockReleaseCosignDeadlineFrames:\n client.consts.bitcoinLocks.lockReleaseCosignDeadlineFrames.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 return await this.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 clientAtHeight - Optional client at the 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 clientAtHeight?: ApiDecoration<'promise'>,\n ): Promise<{ txid: string; vout: number; bitcoinTxid: string } | undefined> {\n const client = clientAtHeight ?? this.client;\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 clientAtHeight?: ApiDecoration<'promise'>,\n ): Promise<IReleaseRequestDetails | undefined> {\n const client = clientAtHeight ?? this.client;\n const requestMaybe = await client.query.bitcoinLocks.lockReleaseRequestsByUtxoId(utxoId);\n if (!requestMaybe.isSome) {\n return undefined;\n }\n const request = requestMaybe.unwrap();\n return {\n toScriptPubkey: request.toScriptPubkey.toHex(),\n bitcoinNetworkFee: request.bitcoinNetworkFee.toBigInt(),\n dueFrame: request.cosignDueFrame.toNumber(),\n vaultId: request.vaultId.toNumber(),\n redemptionPrice: request.redemptionPrice.toBigInt(),\n };\n }\n\n async submitVaultSignature(\n args: {\n utxoId: number;\n vaultSignature: Uint8Array;\n argonKeyring: KeyringPair;\n } & ISubmittableOptions,\n ): Promise<TxResult> {\n const { utxoId, vaultSignature, argonKeyring, txProgressCallback } = args;\n const client = 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(args);\n }\n\n async getBitcoinLock(utxoId: number): Promise<IBitcoinLock | undefined> {\n const utxoRaw = await this.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 peggedPrice = utxo.peggedPrice.toBigInt();\n const liquidityPromised = utxo.liquidityPromised.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 securityFees = utxo.securityFees.toBigInt();\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 peggedPrice,\n liquidityPromised,\n ownerAccount,\n satoshis,\n vaultPubkey,\n vaultClaimPubkey,\n ownerPubkey,\n vaultXpubSources,\n vaultClaimHeight,\n openClaimHeight,\n createdAtHeight,\n securityFees,\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 = 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 = 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 = 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 pendingMint = await this.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 priceIndex: PriceIndex;\n ownerBitcoinPubkey: Uint8Array;\n satoshis: bigint;\n argonKeyring: KeyringPair;\n reducedBalanceBy?: bigint;\n tip?: bigint;\n }) {\n const { vault, priceIndex, argonKeyring, satoshis, tip = 0n, ownerBitcoinPubkey } = args;\n const client = 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(priceIndex, satoshis);\n const isVaultOwner = argonKeyring.address === vault.operatorAccountId;\n const securityFee = isVaultOwner ? 0n : 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 return { tx, securityFee, txFee, canAfford, availableBalance, txFeePlusTip: txFee + tip };\n }\n\n async getBitcoinLockFromTxResult(txResult: TxResult): Promise<{\n lock: IBitcoinLock;\n createdAtHeight: number;\n txResult: TxResult;\n }> {\n await txResult.waitForFinalizedBlock;\n const blockHeight = txResult.blockNumber!;\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 };\n }\n\n async initializeLock(\n args: {\n vault: Vault;\n priceIndex: PriceIndex;\n ownerBitcoinPubkey: Uint8Array;\n argonKeyring: KeyringPair;\n satoshis: bigint;\n } & ISubmittableOptions,\n ): Promise<{\n getLock(): Promise<{ lock: IBitcoinLock; createdAtHeight: number }>;\n txResult: TxResult;\n securityFee: bigint;\n }> {\n const { argonKeyring } = args;\n const client = this.client;\n\n const { tx, securityFee, canAfford, txFeePlusTip } = await this.createInitializeLockTx(args);\n if (!canAfford) {\n throw new Error(\n `Insufficient funds to initialize bitcoin lock. Required security fee: ${formatArgons(securityFee)}, Tx fee plus tip: ${formatArgons(txFeePlusTip)}`,\n );\n }\n const submitter = new TxSubmitter(client, tx, argonKeyring);\n const txResult = await submitter.submit({ logResults: true, ...args });\n\n return {\n getLock: () => this.getBitcoinLockFromTxResult(txResult),\n txResult,\n securityFee,\n };\n }\n\n async requiredSatoshisForArgonLiquidity(\n priceIndex: PriceIndex,\n argonAmount: bigint,\n ): 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 = priceIndex.getBtcMicrogonPrice(SATS_PER_BTC);\n return (argonAmount * SATS_PER_BTC) / marketRatePerBitcoin;\n }\n\n async requestRelease(\n args: {\n lock: IBitcoinLock;\n priceIndex: PriceIndex;\n releaseRequest: IReleaseRequest;\n argonKeyring: KeyringPair;\n } & ISubmittableOptions,\n ): Promise<TxResult> {\n const client = this.client;\n const {\n lock,\n priceIndex,\n releaseRequest: { bitcoinNetworkFee, toScriptPubkey },\n argonKeyring,\n tip = 0n,\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 const redemptionPrice = await this.getRedemptionRate(priceIndex, lock);\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 + canAfford.txFee + tip)}`,\n );\n }\n return submitter.submit({\n logResults: true,\n ...args,\n });\n }\n\n async releasePrice(\n priceIndex: PriceIndex,\n lock: { satoshis: bigint; peggedPrice: bigint },\n ): Promise<bigint> {\n return await this.getRedemptionRate(priceIndex, lock);\n }\n\n async getRatchetPrice(\n lock: IBitcoinLock,\n priceIndex: PriceIndex,\n vault: Vault,\n ): Promise<{ burnAmount: bigint; ratchetingFee: bigint; marketRate: bigint }> {\n const { createdAtHeight, vaultClaimHeight, peggedPrice, satoshis } = lock;\n const client = this.client;\n const marketRate = await this.getMarketRate(priceIndex, BigInt(satoshis));\n\n let ratchetingFee = vault.terms.bitcoinBaseFee;\n let burnAmount = 0n;\n // ratchet up\n if (marketRate > peggedPrice) {\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(priceIndex, lock);\n }\n\n return {\n ratchetingFee,\n burnAmount,\n marketRate,\n };\n }\n\n async ratchet(\n args: {\n lock: IBitcoinLock;\n priceIndex: PriceIndex;\n argonKeyring: KeyringPair;\n vault: Vault;\n } & ISubmittableOptions,\n ): Promise<{\n txResult: TxResult;\n getRatchetResult: () => Promise<{\n securityFee: bigint;\n txFee: bigint;\n newPeggedPrice: bigint;\n liquidityPromised: bigint;\n pendingMint: bigint;\n burned: bigint;\n blockHeight: number;\n bitcoinBlockHeight: number;\n }>;\n }> {\n const { lock, priceIndex, argonKeyring, tip = 0n, vault, txProgressCallback } = args;\n const client = this.client;\n\n const ratchetPrice = await this.getRatchetPrice(lock, priceIndex, 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 txResult = await txSubmitter.submit(args);\n const getRatchetResult = async () => {\n const blockHash = await txResult.waitForFinalizedBlock;\n const ratchetEvent = txResult.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 api = await client.at(blockHash);\n const bitcoinBlockHeight = await api.query.bitcoinUtxos\n .confirmedBitcoinBlockTip()\n .then(x => x.unwrap().blockHeight.toNumber());\n const {\n amountBurned,\n liquidityPromised: liquidityPromisedRaw,\n newPeggedPrice,\n originalPeggedPrice,\n securityFee,\n } = ratchetEvent.data;\n const liquidityPromised = liquidityPromisedRaw.toBigInt();\n let mintAmount = liquidityPromised;\n if (liquidityPromised > originalPeggedPrice.toBigInt()) {\n mintAmount -= originalPeggedPrice.toBigInt();\n }\n return {\n txFee: txResult.finalFee ?? 0n,\n blockHeight: txResult.blockNumber!,\n bitcoinBlockHeight,\n pendingMint: mintAmount,\n liquidityPromised,\n newPeggedPrice: newPeggedPrice.toBigInt(),\n burned: amountBurned.toBigInt(),\n securityFee: securityFee.toBigInt(),\n };\n };\n return {\n txResult,\n getRatchetResult,\n };\n }\n}\n\nexport interface IBitcoinLockConfig {\n lockReleaseCosignDeadlineFrames: 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 dueFrame: number;\n vaultId: number;\n redemptionPrice: bigint;\n}\n\nexport interface IBitcoinLock {\n utxoId: number;\n p2wshScriptHashHex: string;\n vaultId: number;\n peggedPrice: bigint;\n liquidityPromised: bigint;\n ownerAccount: string;\n satoshis: bigint;\n vaultPubkey: string;\n securityFees: bigint;\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 {\n ArgonClient,\n FIXED_U128_DECIMALS,\n fromFixedNumber,\n MICROGONS_PER_ARGON,\n SATS_PER_BTC,\n} from './index';\nimport BigNumber from 'bignumber.js';\n\nexport class PriceIndex {\n btcUsdPrice?: BigNumber;\n argonotUsdPrice?: BigNumber;\n argonUsdPrice?: BigNumber;\n argonUsdTargetPrice?: BigNumber;\n argonTimeWeightedAverageLiquidity?: BigNumber;\n lastUpdatedTick?: number;\n\n async load(client: ArgonClient): Promise<this> {\n const current = await client.query.priceIndex.current();\n if (!current.isSome) {\n this.argonUsdPrice = undefined;\n this.argonotUsdPrice = undefined;\n this.btcUsdPrice = undefined;\n this.argonUsdTargetPrice = undefined;\n this.argonTimeWeightedAverageLiquidity = undefined;\n this.lastUpdatedTick = undefined;\n return this;\n }\n const value = current.unwrap();\n\n this.btcUsdPrice = fromFixedNumber(value.btcUsdPrice.toBigInt(), FIXED_U128_DECIMALS);\n this.argonotUsdPrice = fromFixedNumber(value.argonotUsdPrice.toBigInt(), FIXED_U128_DECIMALS);\n this.argonUsdPrice = fromFixedNumber(value.argonUsdPrice.toBigInt(), FIXED_U128_DECIMALS);\n this.argonUsdTargetPrice = fromFixedNumber(\n value.argonUsdTargetPrice.toBigInt(),\n FIXED_U128_DECIMALS,\n );\n this.argonTimeWeightedAverageLiquidity = fromFixedNumber(\n value.argonTimeWeightedAverageLiquidity.toBigInt(),\n FIXED_U128_DECIMALS,\n );\n this.lastUpdatedTick = value.tick.toNumber();\n return this;\n }\n\n getBtcMicrogonPrice(satoshis: bigint | number): bigint {\n if (this.btcUsdPrice === undefined || this.argonUsdPrice === undefined) {\n throw new Error('PriceIndex not loaded');\n }\n\n const satoshiCents = this.btcUsdPrice.multipliedBy(satoshis).dividedBy(SATS_PER_BTC);\n\n const microgons = satoshiCents.multipliedBy(MICROGONS_PER_ARGON).dividedBy(this.argonUsdPrice);\n return BigInt(microgons.integerValue(BigNumber.ROUND_DOWN).toString());\n }\n\n get rValue(): BigNumber {\n if (this.argonUsdTargetPrice === undefined || this.argonUsdPrice === undefined) {\n throw new Error('PriceIndex not loaded');\n }\n return this.argonUsdPrice.div(this.argonUsdTargetPrice);\n }\n\n get argonCpi(): BigNumber {\n if (this.argonUsdTargetPrice === undefined || this.argonUsdPrice === undefined) {\n throw new Error('PriceIndex not loaded');\n }\n const ratio = this.argonUsdTargetPrice.div(this.argonUsdPrice);\n return ratio.minus(1);\n }\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';\nimport type { ApiDecoration, ApiOptions } from '@polkadot/api/types';\n\nexport type { SubmittableExtrinsic } from '@polkadot/api/promise/types';\nexport { ApiDecoration };\nexport { WageProtector } from './WageProtector';\nexport { TxSubmitter, ISubmittableOptions } from './TxSubmitter';\nexport { TxResult, ITxProgressCallback } from './TxResult';\nexport * from './utils';\nexport * from './keyringUtils';\nexport * from './header';\nexport * from './Vault';\nexport * from './convert';\nexport * from './BitcoinLocks';\nexport * from './PriceIndex';\nexport { Keyring, KeyringPair, KeyringPair$Json, KeypairType, mnemonicGenerate, decodeAddress };\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 type SignedBlock,\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 * @param options Additional options for the API\n * @returns The client\n */\nexport async function getClient(host: string, options?: ApiOptions): 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, ...(options ?? {}) });\n}\n"]}