@keetanetwork/anchor 0.0.68 → 0.0.70

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,"file":"chaining.js","sourceRoot":"","sources":["../../src/lib/chaining.ts"],"names":[],"mappings":"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","sourcesContent":["import type { lib as KeetaNetLib } from '@keetanetwork/keetanet-client';\nimport { KeetaNet } from \"../client/index.js\";\nimport type { AnchorTokenLocationMetadata, AssetLocationLike, AssetTransferInstructions, AssetWithRails, FiatPushRails, MovableAssetSearchCanonical, PickChainLocation, Rail, RailOrRailWithExtendedDetails, RecipientResolved, SimulatedAssetTransferInstructions } from \"../services/asset-movement/common.js\";\nimport { convertAssetLocationToString, convertAssetSearchInputToCanonical, isChainLocation, toAssetLocation } from \"../services/asset-movement/common.js\";\nimport type { Resolver } from \"./index.js\";\nimport { getDefaultResolver } from '../config.js';\nimport type { ISOCurrencyCode } from '@keetanetwork/currency-info';\nimport { Currency } from '@keetanetwork/currency-info';\nimport type { Account, GenericAccount, TokenAddress } from '@keetanetwork/keetanet-client/lib/account.js';\nimport { isAssetLocationLike } from '../services/asset-movement/lib/location.generated.js';\nimport type { ToValuizable } from './resolver.js';\nimport { isFiatRail, isMovableAssetSearchCanonical, isRail } from '../services/asset-movement/common.generated.js';\nimport { assertNever } from './utils/never.js';\nimport KeetaFXAnchorClient from '../services/fx/client.js';\nimport type { KeetaAssetMovementAnchorProvider } from '../services/asset-movement/client.js';\nimport KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';\nimport type { ExternalChainAsset } from './asset.js';\nimport { isExternalChainAsset } from './asset.js';\nimport type { Logger } from './log/index.js';\nimport type { BlockHash } from '@keetanetwork/keetanet-client/lib/block/index.js';\nimport type { AnchorMetadataLegalField } from './metadata.types.js';\n\ntype FXQuoteOrEstimate = NonNullable<Awaited<ReturnType<KeetaFXAnchorClient['getQuotesOrEstimates']>>>[number];\ntype AssetMovementProvider = NonNullable<Awaited<ReturnType<KeetaAssetMovementAnchorClient['getProvidersForTransfer']>>>[number];\ntype AssetMovementTransfer = Awaited<ReturnType<AssetMovementProvider['initiateTransfer']>>;\ntype FXExchange = Awaited<ReturnType<FXQuoteOrEstimate['createExchange']>>;\n\ninterface ChainStepResolutionBase<Type extends 'fx' | 'assetMovement' | 'keetaSend'> {\n\ttype: Type;\n\tvalueIn: bigint;\n\tvalueOut: bigint;\n\tstep: Type extends 'keetaSend' ? null : Extract<GraphNodeLike, { type: Type }>;\n}\n\ninterface ChainStepResolutionFX extends ChainStepResolutionBase<'fx'> {\n\ttype: 'fx';\n\tresult: FXQuoteOrEstimate;\n};\n\ntype SendingToType = 'SELF' | 'NEXT_STEP' | 'FINAL_DESTINATION';\n\ninterface ChainStepResolutionAssetMovement extends ChainStepResolutionBase<'assetMovement'> {\n\tusingInstruction: AssetTransferInstructions;\n\tsendingTo: SendingToType;\n\ttransfer: AssetMovementTransfer;\n};\n\ninterface ChainStepResolutionKeetaSend extends ChainStepResolutionBase<'keetaSend'> {\n\tusingInstruction: Extract<AssetTransferInstructions, { type: 'KEETA_SEND' }>;\n};\n\nexport type Disclaimer = Exclude<AnchorMetadataLegalField['disclaimers'], undefined>[number];\ntype ProviderDisclaimers = {\n\tproviderID: string;\n\tdisclaimers: Disclaimer[];\n}\ntype PlanDisclaimers = ProviderDisclaimers[];\n\nexport type ChainStepResolution = ChainStepResolutionFX | ChainStepResolutionAssetMovement | ChainStepResolutionKeetaSend;\n\ntype AnchorChainingPathComputedPlan = {\n\tsteps: ChainStepResolution[];\n\ttotalValueIn: bigint;\n\ttotalValueOut: bigint;\n};\n\ntype ExecutedStepFX = {\n\ttype: 'fx';\n\tplan: ChainStepResolutionFX;\n\texchange: FXExchange;\n};\n\ntype ExecutedStepAssetMovement = {\n\ttype: 'assetMovement';\n\tplan: ChainStepResolutionAssetMovement;\n};\n\ntype ExecutedStepKeetaSend = {\n\ttype: 'keetaSend';\n\tplan: ChainStepResolutionKeetaSend;\n};\n\n\nexport type ExecutedStep = ExecutedStepFX | ExecutedStepAssetMovement | ExecutedStepKeetaSend;\n\nexport type AnchorChainingPathExecuteResult = {\n\tsteps: ExecutedStep[];\n};\n\nexport type AnchorChainingPathExecuteOptions = {\n\trequireSendAuth?: boolean;\n};\n\nexport type AnchorChainingPathState =\n\t| { status: 'idle' }\n\t| { status: 'executing'; completedSteps: ExecutedStep[]; currentStepIndex: number }\n\t| { status: 'completed'; result: AnchorChainingPathExecuteResult }\n\t| { status: 'failed'; error: Error; completedSteps: ExecutedStep[]; failedAtStepIndex: number };\n\ninterface StepNeededActionEventPayloadBase<ActionType, ActionPayload, CompletedPayload extends readonly unknown[] = []> {\n\ttype: ActionType;\n\n\tmarkCompleted: (...args: CompletedPayload) => void;\n\tmarkFailed: (error?: unknown) => void;\n\n\taction: ActionPayload;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventAssetMovement extends StepNeededActionEventPayloadBase<'assetMovementUserExecutionRequired', { assetMovementTransfer: AssetMovementTransfer; }, []> {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventKeetaSend extends StepNeededActionEventPayloadBase<'keetaSendAuthRequired', {\n\tsendToAddress: GenericAccount;\n\tvalue: bigint;\n\ttoken: TokenAddress;\n\texternal?: string;\n}, [ { sent: boolean | BlockHash; }]> {}\n\ntype StepNeededActionEventPayload = StepNeededActionEventKeetaSend | StepNeededActionEventAssetMovement;\n\ntype AnchorChainingPathEventMap = {\n\tstateChange: [state: AnchorChainingPathState];\n\tstepExecuted: [step: ExecutedStep, index: number];\n\tcompleted: [result: AnchorChainingPathExecuteResult];\n\tfailed: [error: Error, completedSteps: ExecutedStep[], failedAtStepIndex: number];\n\tstepNeedsAction: [StepNeededActionEventPayload];\n}\n\ninterface AnchorChainingAssetAndLocation<AssetType extends AnchorChainingAsset = AnchorChainingAsset, Location extends AssetLocationLike = AssetLocationLike> {\n\tasset: AssetType;\n\tlocation: Location;\n\trail: Rail;\n\tvalue?: bigint;\n\n}\n\ninterface AnchorChainingDestination extends AnchorChainingAssetAndLocation {\n\trecipient: RecipientResolved;\n}\n\ninterface AnchorChainingPathInput {\n\tsource: AnchorChainingAssetAndLocation;\n\tdestination: AnchorChainingDestination;\n}\n\nexport interface AnchorChainingConfig {\n\tclient: KeetaNet.UserClient;\n\tresolver?: Resolver;\n\tsigner?: InstanceType<typeof KeetaNetLib.Account>;\n\taccount?: InstanceType<typeof KeetaNetLib.Account>;\n\tlogger?: Logger;\n}\n\ninterface BaseGraphNodeLike<Type extends 'fx' | 'assetMovement', AssetType extends AnchorChainingAsset> {\n\ttype: Type;\n\tproviderID: string;\n\n\tfrom: AnchorChainingAssetAndLocation<AssetType>;\n\tto: AnchorChainingAssetAndLocation<AssetType>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface FXGraphNode extends BaseGraphNodeLike<'fx', Exclude<AnchorChainingAsset, ExternalChainAsset>> {}\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface AssetMovementGraphNode extends BaseGraphNodeLike<'assetMovement', AnchorChainingAsset> {}\nexport type GraphNodeLike = FXGraphNode | AssetMovementGraphNode;\n\ntype KeetaLocationLike = Extract<AssetLocationLike, `chain:keeta:${bigint}`> | PickChainLocation<'keeta'>;\ninterface KeetaSendStepLike {\n\ttype: 'keetaSend';\n\n\tproviderID?: null;\n\n\tfrom: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n\tto: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n}\n\nexport type AnchorChainingStepLike = GraphNodeLike | KeetaSendStepLike;\n\nexport type AnchorChainingAsset = TokenAddress | ISOCurrencyCode | ExternalChainAsset;\n\nfunction areBothTokenAndEqual(a: string | TokenAddress, b: string | TokenAddress): boolean {\n\ttry {\n\t\tconst aParsed = KeetaNet.lib.Account.toAccount(a);\n\t\tconst bParsed = KeetaNet.lib.Account.toAccount(b);\n\n\t\tif (!aParsed.isToken() || !bParsed.isToken()) {\n\t\t\treturn(false);\n\t\t}\n\n\n\t\treturn(aParsed.comparePublicKey(bParsed));\n\t} catch {\n\t\treturn(false);\n\t}\n}\n\nfunction isAnchorChainingAssetEqual(a: AnchorChainingAsset, b: AnchorChainingAsset): boolean {\n\tif (typeof a === 'string' && typeof b === 'string' && a === b) {\n\t\treturn(true);\n\t} else if (areBothTokenAndEqual(a, b)) {\n\t\treturn(true);\n\t} else {\n\t\treturn(false);\n\t}\n}\n\nfunction nodeSideSupports(side: AnchorChainingAssetAndLocation, required: AnchorChainingAssetAndLocation): boolean {\n\tif (side.rail !== required.rail) {\n\t\treturn(false);\n\t}\n\n\tif (convertAssetLocationToString(side.location) !== convertAssetLocationToString(required.location)) {\n\t\treturn(false);\n\t}\n\n\tif (!isAnchorChainingAssetEqual(side.asset, required.asset)) {\n\t\treturn(false);\n\t}\n\n\treturn(true);\n}\n\n/**\n * Returns true for nodes that keep assets on Keeta: FX nodes, plus\n * asset-movement nodes whose from and to share the same Keeta chain location\n * (custodial FX anchors that don't actually move funds off-chain).\n */\nfunction isFXLikeNode(node: GraphNodeLike): boolean {\n\tif (node.type === 'fx') {\n\t\treturn(true);\n\t}\n\tconst fromStr = convertAssetLocationToString(node.from.location);\n\tconst toStr = convertAssetLocationToString(node.to.location);\n\treturn(fromStr === toStr && fromStr.startsWith('chain:keeta:'));\n}\n\ninterface AssetMovementResolvedRails {\n\tcommon: Rail[];\n\tinbound: Rail[];\n\toutbound: Rail[];\n}\n\nexport type AnchorChainingListAssetsSideFilter = {\n\tlocation?: AssetLocationLike | undefined;\n\tasset?: AnchorChainingAsset | undefined;\n\trail?: Rail | undefined;\n};\n\ntype AnchorChainingListAssetsShared = {\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport type AnchorChainingListAssetsFilter =\n\t| ({ from: AnchorChainingListAssetsSideFilter; to?: never } & AnchorChainingListAssetsShared)\n\t| ({ to: AnchorChainingListAssetsSideFilter; from?: never } & AnchorChainingListAssetsShared)\n\t| ({ from?: never; to?: never } & AnchorChainingListAssetsShared);\n\nexport type AnchorChainingResolveAssetsFilter = {\n\tfrom?: AnchorChainingListAssetsSideFilter;\n\tto?: AnchorChainingListAssetsSideFilter;\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport interface AnchorChainingResolveAssetsResult {\n\tfrom: AnchorChainingAssetInfo[];\n\tto: AnchorChainingAssetInfo[];\n}\n\nexport interface AnchorChainingAssetInfo {\n\tasset: AnchorChainingAsset;\n\tlocation: AssetLocationLike;\n\trails: {\n\t\tinbound: Rail[];\n\t\toutbound: Rail[];\n\t};\n\n\tdistance: {\n\t\tpathLength: number;\n\t} | null;\n}\n\ntype AnchorChainingAssetInfoWithMetadata = AnchorChainingAssetInfo & {\n\tmetadata?: AnchorTokenLocationMetadata;\n}\n\ninterface AnchorChainingResolveAssetsWithMetadataResult {\n\tfrom: AnchorChainingAssetInfoWithMetadata[];\n\tto: AnchorChainingAssetInfoWithMetadata[];\n}\n\ntype AnchorChainingWithMetadataOptions = {\n\tproviderID?: string;\n};\n\ntype GetAccountForActionPayload = {\n\ttype: 'assetMovement';\n\tproviderMethod: 'initiateTransfer';\n\tprovider?: AssetMovementProvider;\n} | {\n\ttype: 'fx';\n\tproviderMethod: 'getAccountForAction';\n}\n\ntype AccountLike = InstanceType<typeof KeetaNetLib.Account> | undefined | ((providerMethodPayload: GetAccountForActionPayload) => Promise<Account> | Account);\ninterface AnchorChainingAccountOverrides {\n\taccount?: AccountLike;\n\tsigner?: AccountLike;\n}\n\nclass AnchorGraph {\n\tclient: KeetaNet.UserClient;\n\tresolver: Resolver;\n\tlogger?: Logger | undefined;\n\n\treadonly assetMovementClient: KeetaAssetMovementAnchorClient;\n\treadonly fxClient: KeetaFXAnchorClient;\n\treadonly #assetMovementProviderCache = new Map<string, AssetMovementProvider | null>();\n\treadonly #assetNameCache = new Map<MovableAssetSearchCanonical, ISOCurrencyCode | TokenAddress | ExternalChainAsset>();\n\t#graphNodePromise: Promise<GraphNodeLike[]> | null = null;\n\n\tconstructor(args: { client: KeetaNet.UserClient; resolver: Resolver; logger?: Logger | undefined; }) {\n\t\tthis.resolver = args.resolver;\n\t\tthis.client = args.client;\n\t\tthis.logger = args.logger;\n\t\tthis.assetMovementClient = new KeetaAssetMovementAnchorClient(this.client, {\n\t\t\tresolver: this.resolver,\n\t\t\t...(this.logger ? { logger: this.logger } : {})\n\t\t});\n\t\tthis.fxClient = new KeetaFXAnchorClient(this.client, {\n\t\t\tresolver: this.resolver,\n\t\t\t...(this.logger ? { logger: this.logger } : {})\n\t\t});\n\t}\n\n\t#assetLocationKey = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }) => {\n\t\treturn(`${convertAssetSearchInputToCanonical(side.asset)}@${convertAssetLocationToString(side.location)}`);\n\t};\n\n\tasync getAssetMovementProviderById(providerID: string): Promise<AssetMovementProvider | null> {\n\t\tlet provider: KeetaAssetMovementAnchorProvider | undefined | null = this.#assetMovementProviderCache.get(providerID);\n\t\tif (provider === undefined) {\n\t\t\tprovider = await this.assetMovementClient.getProviderByID(providerID);\n\t\t}\n\n\t\tthis.#assetMovementProviderCache.set(providerID, provider);\n\n\t\treturn(provider);\n\t}\n\n\tasync getAssetMovementProvidersForAsset(asset: AnchorChainingAsset, location: AssetLocationLike): Promise<null | { [providerID: string]: { provider: AssetMovementProvider; }}> {\n\t\tlet retval: null | { [providerID: string]: { provider: AssetMovementProvider; }} = null;\n\n\t\tfor (const node of await this.computeGraphNodes()) {\n\t\t\tif (node.type !== 'assetMovement') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const side of [ node.from, node.to ] as const) {\n\t\t\t\tif (!isAnchorChainingAssetEqual(side.asset, asset) || convertAssetLocationToString(side.location) !== convertAssetLocationToString(location)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!retval) {\n\t\t\t\t\tretval = {};\n\t\t\t\t}\n\n\t\t\t\tif (!retval[node.providerID]) {\n\t\t\t\t\tconst provider = await this.getAssetMovementProviderById(node.providerID);\n\t\t\t\t\tif (!provider) {\n\t\t\t\t\t\tthis.logger?.debug('AnchorGraph::getAssetMovementProvidersForAsset', `No provider found for providerID ${node.providerID}, although provider was previously known to exist in the graph nodes`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tretval[node.providerID] = { provider };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync #computeFXNodes() {\n\t\tconst fxServices = await this.resolver.lookup('fx', {});\n\n\t\tif (!fxServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst networkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\tconst providerLookupResult = await Promise.all(Object.entries(fxServices).map(async ([ providerID, service ]) => {\n\t\t\tconst fromEntries = await service.from('array');\n\n\t\t\tif (!fromEntries) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodes = await Promise.all(fromEntries.map(async function(fromEntry) {\n\t\t\t\tconst pathNodesResult: GraphNodeLike[] = [];\n\n\t\t\t\tconst parsedEntry = await fromEntry('object');\n\n\t\t\t\tconst [ fromCodes, toCodes ] = await Promise.all([\n\t\t\t\t\tparsedEntry.currencyCodes('array'),\n\t\t\t\t\tparsedEntry.to('array')\n\t\t\t\t]);\n\n\t\t\t\tfor (const from of fromCodes) {\n\t\t\t\t\tconst fromResolved = await from('string');\n\t\t\t\t\tif (!fromResolved) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fromAccount = KeetaNet.lib.Account.fromPublicKeyString(fromResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\tfor (const to of toCodes) {\n\t\t\t\t\t\tconst toResolved = await to('string');\n\t\t\t\t\t\tif (!toResolved) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst toAccount = KeetaNet.lib.Account.fromPublicKeyString(toResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\t\tif (fromAccount.comparePublicKey(toAccount)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpathNodesResult.push({\n\t\t\t\t\t\t\ttype: 'fx',\n\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\tfrom: { asset: fromAccount, location: networkLocation, rail: 'KEETA_SEND' },\n\t\t\t\t\t\t\tto: { asset: toAccount, location: networkLocation, rail: 'KEETA_SEND' }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(pathNodesResult);\n\t\t\t}));\n\n\t\t\treturn(pathNodes.flat());\n\t\t}));\n\n\t\treturn(providerLookupResult.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync #resolveAssetName(name: MovableAssetSearchCanonical): Promise<ISOCurrencyCode | TokenAddress | ExternalChainAsset> {\n\t\tif (KeetaNet.lib.Account.isInstance(name) && name.isToken()) {\n\t\t\treturn(name);\n\t\t}\n\n\t\tif (typeof name === 'string') {\n\t\t\ttry {\n\t\t\t\treturn(KeetaNet.lib.Account.fromPublicKeyString(name).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN));\n\t\t\t} catch {\n\t\t\t\t/* ignore error and continue with other resolution methods */\n\t\t\t}\n\t\t}\n\n\t\tlet found = this.#assetNameCache.get(name);\n\t\tif (found) {\n\t\t\treturn(found);\n\t\t}\n\n\t\tif (isExternalChainAsset(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isCurrencyCode(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isISOCurrencyNumber(name)) {\n\t\t\tfound = new Currency(name).code;\n\t\t} else {\n\t\t\tconst lookupRet = await this.resolver.lookupToken(name);\n\t\t\tif (lookupRet) {\n\t\t\t\tfound = KeetaNet.lib.Account.toAccount(lookupRet.token);\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tthrow(new Error(`Unable to resolve asset name: ${name}`));\n\t\t}\n\n\t\tthis.#assetNameCache.set(name, found);\n\n\t\treturn(found);\n\t}\n\n\tasync #computeAssetRails(assetInput: ToValuizable<RailOrRailWithExtendedDetails>): Promise<{ rail: Rail }> {\n\t\ttry {\n\t\t\tconst railResolved = await assetInput('string');\n\n\t\t\tif (!isRail(railResolved)) {\n\t\t\t\tthrow(new Error(`Invalid rail format: ${railResolved}`));\n\t\t\t}\n\n\t\t\treturn({ rail: railResolved });\n\t\t} catch {\n\t\t\t/* ignore error */\n\t\t}\n\n\t\tconst extendedDetailsResolved = await assetInput('object');\n\n\t\tif (!extendedDetailsResolved || typeof extendedDetailsResolved !== 'object' || Array.isArray(extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, expected string or object with extended details`));\n\t\t}\n\n\t\tif (!('rail' in extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, missing 'rail' field in extended details`));\n\t\t}\n\n\t\tconst railResolved = await extendedDetailsResolved.rail?.('string');\n\n\t\tif (!isRail(railResolved)) {\n\t\t\tthrow(new Error(`Invalid rail format in extended details: ${railResolved}`));\n\t\t}\n\n\t\treturn({ rail: railResolved });\n\t}\n\n\tasync #computeAssetMovementPairSide(pairSideInput: ToValuizable<AssetWithRails>): Promise<{ rails: AssetMovementResolvedRails; location: AssetLocationLike; id: AnchorChainingAsset; }> {\n\t\tconst pairSideResolved = await pairSideInput('object');\n\n\t\tlet location: AssetLocationLike;\n\t\tif (pairSideResolved.location) {\n\t\t\tconst locationRaw = await pairSideResolved.location('string');\n\t\t\tif (!isAssetLocationLike(locationRaw)) {\n\t\t\t\tthrow(new Error(`Invalid location format: ${locationRaw}`));\n\t\t\t}\n\n\t\t\tlocation = locationRaw;\n\t\t} else {\n\t\t\tlocation = `chain:keeta:${this.client.network}`;\n\t\t}\n\n\t\tconst railsResolved = await pairSideResolved.rails('object');\n\n\t\tconst rails: AssetMovementResolvedRails = {\n\t\t\tcommon: await Promise.all((await railsResolved.common?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? []),\n\t\t\tinbound: await Promise.all((await railsResolved.inbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? []),\n\t\t\toutbound: await Promise.all((await railsResolved.outbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn((await this.#computeAssetRails(commonInput)).rail);\n\t\t\t}) ?? [])\n\t\t};\n\n\t\tconst id = await pairSideResolved.id('string');\n\t\tif (!isMovableAssetSearchCanonical(id)) {\n\t\t\tthrow(new Error(`Invalid asset id format: ${id}`));\n\t\t}\n\n\t\treturn({\n\t\t\trails: rails,\n\t\t\tlocation: location,\n\t\t\tid: await this.#resolveAssetName(id)\n\t\t});\n\t}\n\n\tasync #computeAssetMovementNodes() {\n\t\tconst assetMovementServices = await this.resolver.lookup('assetMovement', {});\n\n\t\tif (!assetMovementServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst providerResults = await Promise.all(Object.entries(assetMovementServices).map(async ([ providerID, service ]) => {\n\t\t\tconst supportedAssetsEntries = await service.supportedAssets('array');\n\n\t\t\tif (!supportedAssetsEntries) {\n\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `No supported assets found for provider ${providerID}`);\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodesResult = await Promise.all(supportedAssetsEntries.map(async (assetEntry): Promise<GraphNodeLike[]> => {\n\t\t\t\tconst parsedEntry = await assetEntry('object');\n\n\t\t\t\tconst pathsResolved = await parsedEntry.paths('array');\n\t\t\t\tconst pathPromises = await Promise.allSettled(pathsResolved.map(async (pathResolvedInput): Promise<GraphNodeLike[]> => {\n\t\t\t\t\tconst pathResolved = await pathResolvedInput('object');\n\n\t\t\t\t\tconst pairResolved = await pathResolved.pair('array');\n\n\t\t\t\t\tconst [ fromResolved, toResolved ] = await Promise.all([\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[0]),\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[1])\n\t\t\t\t\t]);\n\n\t\t\t\t\tconst pathNodes: GraphNodeLike[] = [];\n\t\t\t\t\tfor (const [ src, dest ] of [\n\t\t\t\t\t\t[ fromResolved, toResolved ],\n\t\t\t\t\t\t[ toResolved, fromResolved ]\n\t\t\t\t\t] as const) {\n\t\t\t\t\t\tfor (const inboundRail of [ ...(src.rails.common ?? []), ...(src.rails.inbound ?? []) ]) {\n\t\t\t\t\t\t\tfor (const outboundRail of [ ...(dest.rails.common ?? []), ...(dest.rails.outbound ?? []) ]) {\n\t\t\t\t\t\t\t\tpathNodes.push({\n\t\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\t\t\tfrom: { asset: src.id, location: src.location, rail: inboundRail },\n\t\t\t\t\t\t\t\t\tto: { asset: dest.id, location: dest.location, rail: outboundRail }\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(pathNodes);\n\t\t\t\t}));\n\n\t\t\t\tconst allPaths = [];\n\n\t\t\t\tfor (const resolved of pathPromises) {\n\t\t\t\t\tif (resolved.status === 'rejected') {\n\t\t\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `error fetching nodes for ... TODO`, resolved.reason);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tallPaths.push(...resolved.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(allPaths);\n\t\t\t}));\n\n\t\t\treturn(pathNodesResult.flat());\n\t\t}));\n\n\t\treturn(providerResults.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync computeGraphNodes(): Promise<GraphNodeLike[]> {\n\t\tif (this.#graphNodePromise === null) {\n\t\t\tthis.#graphNodePromise = (async () => {\n\t\t\t\tconst receivedNodes = await Promise.all([\n\t\t\t\t\tthis.#computeFXNodes(),\n\t\t\t\t\tthis.#computeAssetMovementNodes()\n\t\t\t\t]);\n\n\t\t\t\treturn(receivedNodes.flat());\n\t\t\t})();\n\t\t}\n\n\t\treturn(await this.#graphNodePromise);\n\t}\n\n\tasync findPaths(input: AnchorChainingPathInput): Promise<GraphNodeLike[][]> {\n\t\tconst graph = await this.computeGraphNodes();\n\n\t\tconst nodesWithNext: { node: GraphNodeLike, next: number[] }[] = graph.map(function(node) {\n\t\t\treturn({ node, next: [] });\n\t\t});\n\n\t\tfor (const node of nodesWithNext) {\n\t\t\tfor (let secondNodeIdx = 0; secondNodeIdx < nodesWithNext.length; secondNodeIdx++) {\n\t\t\t\tconst nodeJ = nodesWithNext[secondNodeIdx];\n\t\t\t\tif (!nodeJ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// We can ignore chaining one fx anchor to itself\n\t\t\t\tif (node.node.type === 'fx') {\n\t\t\t\t\tif (node.node.type === nodeJ.node.type && node.node.providerID === nodeJ.node.providerID) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeSideSupports(node.node.to, nodeJ.node.from)) {\n\t\t\t\t\tnode.next.push(secondNodeIdx);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst paths: GraphNodeLike[][] = [];\n\n\t\tfunction getAssetLocationString(input: GraphNodeLike['to'], includeRail = false) {\n\t\t\tlet railStr = '';\n\t\t\tif (includeRail) {\n\t\t\t\trailStr = `#${input.rail}`;\n\t\t\t}\n\t\t\treturn(`${convertAssetSearchInputToCanonical(input.asset)}@${convertAssetLocationToString(input.location)}${railStr}`)\n\t\t}\n\n\t\tfunction dfs(\n\t\t\tcurrentIndex: number,\n\t\t\ttarget: AnchorChainingAssetAndLocation,\n\t\t\tvisitedAssets = new Set<string>(),\n\t\t\tpath: GraphNodeLike[] = []\n\t\t) {\n\t\t\tconst cur = nodesWithNext[currentIndex];\n\n\t\t\tif (!cur) {\n\t\t\t\tthrow(new Error(`Invalid node index: ${currentIndex}`));\n\t\t\t}\n\n\t\t\tconst assetLocationStr = getAssetLocationString(cur.node.from, true);\n\t\t\tif (visitedAssets.has(assetLocationStr)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvisitedAssets.add(assetLocationStr);\n\n\t\t\tconst newPath = [ ...path, cur.node ];\n\n\t\t\tif (nodeSideSupports(cur.node.to, target)) {\n\t\t\t\tpaths.push(newPath);\n\t\t\t}\n\n\t\t\tfor (const nextIndex of nodesWithNext[currentIndex]?.next ?? []) {\n\t\t\t\tdfs(nextIndex, target, visitedAssets, newPath);\n\t\t\t}\n\n\t\t\tvisitedAssets.delete(assetLocationStr);\n\t\t}\n\n\t\tfor (let index = 0; index < nodesWithNext.length; index++) {\n\t\t\tconst node = nodesWithNext[index];\n\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nodeSideSupports(node.node.from, input.source)) {\n\t\t\t\tdfs(index, input.destination);\n\t\t\t}\n\t\t}\n\n\t\treturn(paths);\n\t}\n\n\tasync resolveAssets(filter: AnchorChainingResolveAssetsFilter = {}): Promise<AnchorChainingResolveAssetsResult> {\n\t\tconst { from: fromFilterInput, to: toFilterInput, maxStepCount, onlyAllowFXLike } = filter;\n\n\t\tconst keetaNetworkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\t// When onlyAllowFXLike, default omitted locations to the Keeta network location\n\t\tconst fromFilter = (onlyAllowFXLike && fromFilterInput !== undefined && fromFilterInput.location === undefined)\n\t\t\t? { ...fromFilterInput, location: keetaNetworkLocation }\n\t\t\t: fromFilterInput;\n\t\tconst toFilter = (onlyAllowFXLike && toFilterInput !== undefined && toFilterInput.location === undefined)\n\t\t\t? { ...toFilterInput, location: keetaNetworkLocation }\n\t\t\t: toFilterInput;\n\n\t\tconst nodes = await this.computeGraphNodes();\n\n\t\t// Build forward (next) and backward (prev) adjacency in a single pass.\n\t\tconst nodesWithAdj: { node: GraphNodeLike; next: number[]; prev: number[] }[] = nodes.map(node => ({ node, next: [], prev: [] }));\n\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\tfor (let j = 0; j < nodesWithAdj.length; j++) {\n\t\t\t\tconst ni = nodesWithAdj[i];\n\t\t\t\tconst nj = nodesWithAdj[j];\n\t\t\t\tif (!ni || !nj) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during adjacency construction: ${i} or ${j}`));\n\t\t\t\t}\n\t\t\t\tif (ni.node.type === 'fx' && nj.node.type === 'fx' && ni.node.providerID === nj.node.providerID) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (nodeSideSupports(ni.node.to, nj.node.from)) {\n\t\t\t\t\tni.next.push(j);\n\t\t\t\t\tnj.prev.push(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst sideMatchesFilter = (\n\t\t\tside: GraphNodeLike['from' | 'to'],\n\t\t\tf: AnchorChainingListAssetsSideFilter\n\t\t): boolean => {\n\t\t\tif (f.location !== undefined && convertAssetLocationToString(side.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(side.asset, f.asset)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.rail !== undefined && side.rail !== f.rail) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\treturn(true);\n\t\t};\n\n\t\t// Separate reachable sets and distance maps for backward (from) and forward (to) traversals.\n\t\tconst fromReachable = new Set<string>();\n\t\tconst fromDistances = new Map<string, number>();\n\t\tconst toReachable = new Set<string>();\n\t\tconst toDistances = new Map<string, number>();\n\n\t\tconst makeMarkFn = (reachable: Set<string>, distances: Map<string, number>) =>\n\t\t\t(side: GraphNodeLike['from' | 'to'], depth?: number) => {\n\t\t\t\tconst key = this.#assetLocationKey(side);\n\t\t\t\treachable.add(key);\n\t\t\t\tif (depth !== undefined) {\n\t\t\t\t\tconst existing = distances.get(key);\n\t\t\t\t\tif (existing === undefined || depth < existing) {\n\t\t\t\t\t\tdistances.set(key, depth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\tconst markFromReachable = makeMarkFn(fromReachable, fromDistances);\n\t\tconst markToReachable = makeMarkFn(toReachable, toDistances);\n\n\t\tconst bfs = (\n\t\t\tstartCondition: (item: (typeof nodesWithAdj)[number]) => boolean,\n\t\t\tadjacency: 'next' | 'prev',\n\t\t\tmarkSide: 'from' | 'to',\n\t\t\tmarkFn: (side: GraphNodeLike['from' | 'to'], depth: number) => void\n\t\t) => {\n\t\t\tconst nodeVisited = new Set<number>();\n\t\t\tconst queue: { nodeIdx: number; depth: number }[] = [];\n\t\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\t\tconst item = nodesWithAdj[i];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS initialization: ${i}`));\n\t\t\t\t}\n\t\t\t\tif (startCondition(item) && !nodeVisited.has(i)) {\n\t\t\t\t\tnodeVisited.add(i);\n\t\t\t\t\tqueue.push({ nodeIdx: i, depth: 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (queue.length > 0) {\n\t\t\t\tconst queueItem = queue.shift();\n\t\t\t\tif (!queueItem) {\n\t\t\t\t\tthrow(new Error(`Unexpected empty queue during BFS processing`));\n\t\t\t\t}\n\t\t\t\tconst { nodeIdx, depth } = queueItem;\n\t\t\t\tconst item = nodesWithAdj[nodeIdx];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS processing: ${nodeIdx}`));\n\t\t\t\t}\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(item.node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tmarkFn(item.node[markSide], depth);\n\t\t\t\tif (maxStepCount === undefined || depth < maxStepCount) {\n\t\t\t\t\tfor (const neighborIdx of item[adjacency]) {\n\t\t\t\t\t\tif (!nodeVisited.has(neighborIdx)) {\n\t\t\t\t\t\t\tnodeVisited.add(neighborIdx);\n\t\t\t\t\t\t\tqueue.push({ nodeIdx: neighborIdx, depth: depth + 1 });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (fromFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.from, fromFilter), 'next', 'to', markToReachable);\n\t\t}\n\t\tif (toFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.to, toFilter), 'prev', 'from', markFromReachable);\n\t\t}\n\t\tif (!fromFilter && !toFilter) {\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (!onlyAllowFXLike || isFXLikeNode(node)) {\n\t\t\t\t\tmarkFromReachable(node.from);\n\t\t\t\t\tmarkFromReachable(node.to);\n\t\t\t\t\tmarkToReachable(node.from);\n\t\t\t\t\tmarkToReachable(node.to);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Second pass: build result maps by collecting inbound/outbound rails for every reachable\n\t\t// (asset, location) pair from ALL graph nodes, not just those on the traversal path.\n\t\tconst buildResultMap = (\n\t\t\treachable: Set<string>,\n\t\t\tdistances: Map<string, number>\n\t\t): Map<string, AnchorChainingAssetInfo> => {\n\t\t\tconst resultMap = new Map<string, AnchorChainingAssetInfo>();\n\t\t\tconst getOrCreate = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }): AnchorChainingAssetInfo => {\n\t\t\t\tconst key = this.#assetLocationKey(side);\n\t\t\t\tlet resultObj = resultMap.get(key);\n\t\t\t\tif (!resultObj) {\n\t\t\t\t\tconst distanceValue = distances.get(key);\n\n\t\t\t\t\tresultObj = {\n\t\t\t\t\t\tasset: side.asset,\n\t\t\t\t\t\tlocation: side.location,\n\t\t\t\t\t\trails: { inbound: [], outbound: [] },\n\t\t\t\t\t\tdistance: distanceValue !== undefined ? { pathLength: distanceValue } : null\n\t\t\t\t\t};\n\n\t\t\t\t\tresultMap.set(key, resultObj);\n\t\t\t\t}\n\t\t\t\treturn(resultObj);\n\t\t\t};\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (reachable.has(this.#assetLocationKey(node.to))) {\n\t\t\t\t\tconst entry = getOrCreate(node.to);\n\t\t\t\t\tif (!entry.rails.inbound.includes(node.to.rail)) {\n\t\t\t\t\t\tentry.rails.inbound.push(node.to.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (reachable.has(this.#assetLocationKey(node.from))) {\n\t\t\t\t\tconst entry = getOrCreate(node.from);\n\t\t\t\t\tif (!entry.rails.outbound.includes(node.from.rail)) {\n\t\t\t\t\t\tentry.rails.outbound.push(node.from.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn(resultMap);\n\t\t};\n\n\t\tconst fromResultMap = buildResultMap(fromReachable, fromDistances);\n\t\tconst toResultMap = buildResultMap(toReachable, toDistances);\n\n\t\t// When onlyAllowFXLike, exclude the filter asset from the result set so that\n\t\t// \"what can USDC be swapped to?\" doesn't include USDC itself via a round-trip.\n\t\tif (onlyAllowFXLike) {\n\t\t\tif (fromFilter?.asset !== undefined) {\n\t\t\t\ttoResultMap.delete(this.#assetLocationKey({ asset: fromFilter.asset, location: fromFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t\tif (toFilter?.asset !== undefined) {\n\t\t\t\tfromResultMap.delete(this.#assetLocationKey({ asset: toFilter.asset, location: toFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t}\n\n\t\tconst filterMap = (\n\t\t\tmap: Map<string, AnchorChainingAssetInfo>,\n\t\t\tf: AnchorChainingListAssetsSideFilter,\n\t\t\trailSide: 'inbound' | 'outbound'\n\t\t): AnchorChainingAssetInfo[] =>\n\t\t\tArray.from(map.values()).filter(info => {\n\t\t\t\tif (f.location !== undefined && convertAssetLocationToString(info.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(info.asset, f.asset)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.rail !== undefined && !info.rails[railSide].includes(f.rail)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\treturn(true);\n\t\t\t});\n\n\t\tconst fromAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(fromResultMap, fromFilter, 'outbound')\n\t\t\t: Array.from(fromResultMap.values());\n\t\tconst toAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(toResultMap, toFilter, 'inbound')\n\t\t\t: Array.from(toResultMap.values());\n\n\t\treturn({ from: fromAssets, to: toAssets });\n\t}\n\n\tasync listAssets(filter: AnchorChainingListAssetsFilter = {}): Promise<AnchorChainingAssetInfo[]> {\n\t\tconst result = await this.resolveAssets(filter);\n\n\t\tif (filter.from) {\n\t\t\treturn(result.to);\n\t\t} else if (filter.to) {\n\t\t\treturn(result.from);\n\t\t} else {\n\t\t\treturn(result.to);\n\t\t}\n\t}\n\n\tasync #attachMetadata(assetInfo: AnchorChainingAssetInfo, options?: AnchorChainingWithMetadataOptions): Promise<AnchorChainingAssetInfoWithMetadata> {\n\t\tif (!isExternalChainAsset(assetInfo.asset)) {\n\t\t\treturn(assetInfo);\n\t\t}\n\n\t\tconst providers = await this.getAssetMovementProvidersForAsset(assetInfo.asset, assetInfo.location);\n\t\tif (!providers) {\n\t\t\treturn(assetInfo);\n\t\t}\n\n\t\tif (options?.providerID) {\n\t\t\tconst found = providers[options.providerID];\n\t\t\tif (!found) {\n\t\t\t\treturn(assetInfo);\n\t\t\t}\n\n\t\t\tconst metadata = found.provider.getAssetMetadataForLocation(assetInfo.location, assetInfo.asset);\n\t\t\tif (!metadata) {\n\t\t\t\treturn(assetInfo);\n\t\t\t}\n\n\t\t\treturn({\n\t\t\t\t...assetInfo,\n\t\t\t\tmetadata\n\t\t\t});\n\t\t}\n\n\t\tfor (const { provider } of Object.values(providers)) {\n\t\t\tconst metadata = provider.getAssetMetadataForLocation(assetInfo.location, assetInfo.asset);\n\t\t\tif (!metadata) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn({\n\t\t\t\t...assetInfo,\n\t\t\t\tmetadata\n\t\t\t});\n\t\t}\n\n\t\treturn(assetInfo)\n\t}\n\n\tasync resolveAssetsWithMetadata(\n\t\tfilter: AnchorChainingResolveAssetsFilter = {},\n\t\toptions?: AnchorChainingWithMetadataOptions\n\t): Promise<AnchorChainingResolveAssetsWithMetadataResult> {\n\t\tconst result = await this.resolveAssets(filter);\n\n\t\tconst [from, to] = await Promise.all([\n\t\t\tPromise.all(result.from.map((info) => this.#attachMetadata(info, options))),\n\t\t\tPromise.all(result.to.map((info) => this.#attachMetadata(info, options)))\n\t\t]);\n\n\t\treturn({ from, to });\n\t}\n\n\tasync listAssetsWithMetadata(\n\t\tfilter: AnchorChainingListAssetsFilter = {},\n\t\toptions?: AnchorChainingWithMetadataOptions\n\t): Promise<AnchorChainingAssetInfoWithMetadata[]> {\n\t\tconst result = await this.resolveAssetsWithMetadata(filter, options);\n\n\t\tif (filter.from) {\n\t\t\treturn(result.to);\n\t\t} else if (filter.to) {\n\t\t\treturn(result.from);\n\t\t} else {\n\t\t\treturn(result.to);\n\t\t}\n\t}\n}\n\nexport interface ComputePlanOptions {\n\toverrides?: AnchorChainingAccountOverrides;\n}\n\nexport class AnchorChainingPath {\n\treadonly request: AnchorChainingPathInput;\n\treadonly path: AnchorChainingStepLike[];\n\treadonly parent: AnchorChaining;\n\n\tconstructor(input: {\n\t\trequest: AnchorChainingPathInput;\n\t\tpath: AnchorChainingStepLike[];\n\t\tparent: AnchorChaining;\n\t}) {\n\t\tthis.request = input.request;\n\t\tthis.path = input.path;\n\t\tthis.parent = input.parent;\n\t}\n\n\tget logger(): Logger | undefined {\n\t\treturn(this.parent['logger']);\n\t}\n\n\tprotected async getAccountLike(action: GetAccountForActionPayload, override?: AccountLike): Promise<InstanceType<typeof KeetaNetLib.Account>> {\n\t\tlet found: InstanceType<typeof KeetaNetLib.Account> | undefined = undefined;\n\n\t\tif (this.parent['client'].account.isAccount()) {\n\t\t\tfound = this.parent['client'].account;\n\t\t} else if (this.parent['client'].signer !== null) {\n\t\t\tfound = this.parent['client'].signer;\n\t\t}\n\n\t\tif (override) {\n\t\t\tif (typeof override === 'function') {\n\t\t\t\tfound = await override(action);\n\t\t\t} else {\n\t\t\t\tfound = override;\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tthrow(new Error(`Could not get account for ${action.type} action ${action.providerMethod}`));\n\t\t}\n\n\t\treturn(found);\n\t}\n\n\tprotected async getAccountsForAction(action: GetAccountForActionPayload, overrides?: AnchorChainingAccountOverrides): Promise<{ account: InstanceType<typeof KeetaNetLib.Account>; signer: InstanceType<typeof KeetaNetLib.Account> }> {\n\t\tconst [signer, account] = await Promise.all([\n\t\t\tthis.getAccountLike(action, overrides?.signer),\n\t\t\tthis.getAccountLike(action, overrides?.account)\n\t\t]);\n\n\t\treturn({ signer, account });\n\t}\n\n\tasync getProviderLegalDisclaimers(): Promise<PlanDisclaimers | null> {\n\t\tconst legalDisclaimerPromises: { key: string; promise: () => Promise<ProviderDisclaimers | null> }[] = [];\n\n\t\tfor (const step of this.path) {\n\t\t\tif (step.type === 'keetaSend') {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst key = `${step.type}:${step.providerID}`;\n\t\t\tif (legalDisclaimerPromises.find(entry => entry.key === key)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst promise = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet disclaimers: ProviderDisclaimers['disclaimers'] | null | undefined = null;\n\t\t\t\t\tif (step.type === 'assetMovement') {\n\t\t\t\t\t\tconst provider = await this.parent.graph.getAssetMovementProviderById(step.providerID);\n\t\t\t\t\t\tdisclaimers = provider?.getLegalDisclaimers();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdisclaimers = await this.parent.graph.fxClient.getLegalDisclaimersById(step.providerID);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!disclaimers) {\n\t\t\t\t\t\treturn(null);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn({ providerID: step.providerID, disclaimers });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger?.debug(`AnchorChainingPath::getProviderLegalDisclaimers`, `Error getting provider disclaimers for providerId: ${step.providerID}`, error);\n\t\t\t\t\tthrow(error)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlegalDisclaimerPromises.push({ key, promise });\n\t\t}\n\n\t\ttry {\n\t\t\tconst disclaimersOrNull = await Promise.all(legalDisclaimerPromises.map((entry) => entry.promise()));\n\t\t\tconst disclaimers = disclaimersOrNull.filter((entry) => entry !== null);\n\t\t\treturn(disclaimers);\n\t\t} catch (error) {\n\t\t\tthis.logger?.debug(`AnchorChainingPath::getProviderLegalDisclaimers`, 'Error getting legal disclaimers for path', error);\n\t\t\treturn(null);\n\t\t}\n\t}\n}\n\nexport class AnchorChainingPlan extends AnchorChainingPath {\n\t#_plan: AnchorChainingPathComputedPlan | null = null;\n\n\t#state: AnchorChainingPathState = { status: 'idle' };\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t#listeners = new Map<string, Set<((...args: any[]) => void)>>();\n\t#options: ComputePlanOptions | undefined = undefined;\n\n\tprivate constructor(path: AnchorChainingPath, options?: ComputePlanOptions) {\n\t\tsuper({ ...path });\n\t\tthis.#options = options;\n\t}\n\n\tget plan(): AnchorChainingPathComputedPlan {\n\t\tif (!this.#_plan) {\n\t\t\tthrow(new Error(`Steps have not been computed yet`));\n\t\t}\n\n\t\treturn(this.#_plan);\n\t}\n\n\tasync #computePlan() {\n\t\tif (this.#_plan) {\n\t\t\tthrow(new Error(`Steps have already been computed`));\n\t\t}\n\n\t\tconst sharedClientOptions = {\n\t\t\tresolver: this.parent['resolver'],\n\t\t\t...(this.parent['logger'] ? { logger: this.parent['logger'] } : {})\n\t\t} as const;\n\n\t\tconst fxClient = new KeetaFXAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tconst assetMovementClient = new KeetaAssetMovementAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tlet affinityAndAmount: { affinity: 'to' | 'from'; amount: bigint } | undefined = undefined;\n\n\t\tif (this.request.source.value !== undefined && this.request.destination.value !== undefined) {\n\t\t\tthrow(new Error('Must have source.value or destination.value but not both'));\n\t\t} else if (this.request.source.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'from',\n\t\t\t\tamount: this.request.source.value\n\t\t\t}\n\t\t} else if (this.request.destination.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'to',\n\t\t\t\tamount: this.request.destination.value\n\t\t\t}\n\t\t} else {\n\t\t\tthrow(new Error('Must have source.value or destination.value'));\n\t\t}\n\n\t\tconst { affinity } = affinityAndAmount\n\n\t\tconst findInstruction = <R extends AssetTransferInstructions['type']>(allInstructions: AssetTransferInstructions[], type: R): Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\tconst found = allInstructions.find((instr): instr is Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\t\treturn(instr.type === type);\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tthrow(new Error(`Expected to find instruction of type ${type} in next step's instructions`));\n\t\t\t}\n\n\t\t\treturn(found);\n\t\t};\n\n\t\tconst stepPromises: Promise<ChainStepResolution>[] = [];\n\t\tconst resolvingSteps = new Set<number>();\n\t\tconst resolveStep = async (index: number): Promise<ChainStepResolution> => {\n\t\t\tconst step = this.path[index];\n\n\t\t\tif (!step) {\n\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t}\n\n\t\t\tlet promise: Promise<ChainStepResolution> | undefined = stepPromises[index];\n\n\t\t\tif (!promise) {\n\t\t\t\tresolvingSteps.add(index);\n\n\t\t\t\tpromise = (async (): Promise<ChainStepResolution> => {\n\t\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\t\tlet amount;\n\n\t\t\t\t\t\tif (affinity === 'from') {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tamount = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (affinity === 'to') {\n\t\t\t\t\t\t\tif (index === (this.path.length - 1)) {\n\t\t\t\t\t\t\t\t// XXX:TODO Move this to destination\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst next = await resolveStep(index + 1);\n\t\t\t\t\t\t\t\tamount = next.valueIn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst fxAccountOptions = await this.getAccountsForAction({\n\t\t\t\t\t\t\ttype: 'fx',\n\t\t\t\t\t\t\tproviderMethod: 'getAccountForAction'\n\t\t\t\t\t\t}, this.#options?.overrides);\n\n\t\t\t\t\t\tconst quotesOrEstimates = await fxClient.getQuotesOrEstimates(\n\t\t\t\t\t\t\t{ from: step.from.asset, to: step.to.asset, amount, affinity },\n\t\t\t\t\t\t\tfxAccountOptions,\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!quotesOrEstimates?.[0] || quotesOrEstimates.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get FX quote/estimate for provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = quotesOrEstimates[0];\n\n\t\t\t\t\t\tconst convertedAmount = result.isQuote ? result.quote.convertedAmount : result.estimate.convertedAmount;\n\n\t\t\t\t\t\tlet valueIn;\n\t\t\t\t\t\tlet valueOut;\n\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tvalueOut = amount;\n\t\t\t\t\t\t\tvalueIn = convertedAmount;\n\t\t\t\t\t\t} else if (affinity === 'from') {\n\t\t\t\t\t\t\tvalueOut = convertedAmount;\n\t\t\t\t\t\t\tvalueIn = amount;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({ type: 'fx', step, valueIn, valueOut, result });\n\t\t\t\t\t} else if (step.type === 'assetMovement') {\n\t\t\t\t\t\tlet recipient: (() => Promise<RecipientResolved | GenericAccount>) | (RecipientResolved | GenericAccount);\n\t\t\t\t\t\tlet sendingToType: SendingToType;\n\t\t\t\t\t\tif (index === this.path.length - 1) {\n\t\t\t\t\t\t\trecipient = this.request.destination.recipient;\n\t\t\t\t\t\t\tsendingToType = 'FINAL_DESTINATION';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsendingToType = 'NEXT_STEP';\n\n\t\t\t\t\t\t\tconst nextPathStep = this.path[index + 1];\n\n\t\t\t\t\t\t\tif (!nextPathStep) {\n\t\t\t\t\t\t\t\tthrow(new Error(`Expected next step at index ${index + 1} for asset movement step at index ${index}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (nextPathStep.from.location === `chain:keeta:${this.parent['client'].network}`) {\n\t\t\t\t\t\t\t\tconst { account } = await this.getAccountsForAction({\n\t\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\t\tproviderMethod: 'initiateTransfer'\n\t\t\t\t\t\t\t\t}, this.#options?.overrides);\n\n\t\t\t\t\t\t\t\t// Store funds in-transit in the account instead of forwarding directly to provider.\n\t\t\t\t\t\t\t\trecipient = account;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\trecipient = async (): Promise<RecipientResolved | GenericAccount> => {\n\t\t\t\t\t\t\t\t\tconst nextStep = await resolveStep(index + 1);\n\n\t\t\t\t\t\t\t\t\tif (nextStep.type === 'assetMovement' || nextStep.type === 'keetaSend') {\n\t\t\t\t\t\t\t\t\t\tif (nextStep.usingInstruction.type !== step.to.rail) {\n\t\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Next step's usingInstruction type ${nextStep.usingInstruction.type} does not match expected ${step.to.rail} for recipient resolution`));\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst foundInstruction = nextStep.usingInstruction;\n\n\t\t\t\t\t\t\t\t\t\tconst isFiatPushRailFoundInstruction = (input: AssetTransferInstructions | SimulatedAssetTransferInstructions): input is Extract<AssetTransferInstructions, { type: FiatPushRails; }> => {\n\t\t\t\t\t\t\t\t\t\t\treturn(isFiatRail(input.type));\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (foundInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to KEETA_SEND step, as this implies multiple keeta locations in the path which is not currently supported`));\n\t\t\t\t\t\t\t\t\t\t} else if (isFiatPushRailFoundInstruction(foundInstruction)) {\n\t\t\t\t\t\t\t\t\t\t\tif (foundInstruction.depositMessage) {\n\t\t\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Deposit message outbound is not currently supported for chaining`));\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn(foundInstruction.account);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Unsupported rail for chaining: ${step.to.rail}`));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else if (nextStep.type === 'fx') {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to fx step, as fx step does not have recipient information`));\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tassertNever(nextStep);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst assetPair = { from: step.from.asset, to: step.to.asset };\n\n\t\t\t\t\t\tconst providers = await assetMovementClient.getProvidersForTransfer(\n\t\t\t\t\t\t\t{ asset: assetPair, from: step.from.location, to: step.to.location },\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!providers?.[0] || providers.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get asset movement provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet depositValue;\n\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tthrow(new Error(`Chaining with affinity 'to' is not currently supported for asset movement steps, as it requires looking up transfer quotes/estimates which is not currently implemented`));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tdepositValue = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tdepositValue = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst { signer } = await this.getAccountsForAction({\n\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\tproviderMethod: 'initiateTransfer',\n\t\t\t\t\t\t\tprovider: providers[0]\n\t\t\t\t\t\t}, this.#options?.overrides);\n\n\t\t\t\t\t\tconst transfer = await providers[0].initiateTransfer({\n\t\t\t\t\t\t\taccount: signer,\n\t\t\t\t\t\t\tasset: assetPair,\n\t\t\t\t\t\t\tfrom: { location: step.from.location },\n\t\t\t\t\t\t\tto: {\n\t\t\t\t\t\t\t\tlocation: step.to.location,\n\t\t\t\t\t\t\t\trecipient: await (async () => {\n\t\t\t\t\t\t\t\t\tlet recipientResolved;\n\n\t\t\t\t\t\t\t\t\tif (typeof recipient === 'function') {\n\t\t\t\t\t\t\t\t\t\trecipientResolved = await recipient();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\trecipientResolved = recipient;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (KeetaNet.lib.Account.isInstance(recipientResolved)) {\n\t\t\t\t\t\t\t\t\t\treturn(recipientResolved.publicKeyString.get());\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\treturn(recipientResolved);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvalue: depositValue\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst usingInstruction = findInstruction(transfer.instructions, step.from.rail);\n\n\t\t\t\t\t\tlet totalReceiveAmount: string | undefined = usingInstruction.totalReceiveAmount;\n\t\t\t\t\t\tif (totalReceiveAmount === undefined && 'value' in usingInstruction) {\n\t\t\t\t\t\t\ttotalReceiveAmount = usingInstruction.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (totalReceiveAmount === undefined) {\n\t\t\t\t\t\t\tthrow(new Error(`totalReceiveAmount must be defined for chaining`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\tstep,\n\t\t\t\t\t\t\tvalueIn: depositValue,\n\t\t\t\t\t\t\tusingInstruction: usingInstruction,\n\t\t\t\t\t\t\ttransfer: transfer,\n\t\t\t\t\t\t\tsendingTo: sendingToType,\n\t\t\t\t\t\t\tvalueOut: BigInt(totalReceiveAmount)\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\tif (this.path.length !== 1) {\n\t\t\t\t\t\t\tthrow(new Error(`Direct same-location/same-asset send steps must be the only step in the path`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!KeetaNet.lib.Account.isInstance(step.from.asset) || !KeetaNet.lib.Account.isInstance(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected assets to be token accounts for KEETA_SEND rail`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!step.from.asset.comparePublicKey(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`For KEETA_SEND step, from and to asset must be the same account`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet keetaRecipientDestination = null;\n\t\t\t\t\t\tif (KeetaNet.lib.Account.isInstance(this.request.destination.recipient)) {\n\t\t\t\t\t\t\tkeetaRecipientDestination = this.request.destination.recipient;\n\t\t\t\t\t\t} else if (typeof this.request.destination.recipient === 'string') {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tkeetaRecipientDestination = KeetaNet.lib.Account.fromPublicKeyString(this.request.destination.recipient);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t/* ignore errors */\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!keetaRecipientDestination) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected destination recipient to be a public key string for KEETA_SEND step`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'keetaSend',\n\t\t\t\t\t\t\tstep: null,\n\t\t\t\t\t\t\tvalueIn: affinityAndAmount.amount,\n\t\t\t\t\t\t\tvalueOut: affinityAndAmount.amount,\n\t\t\t\t\t\t\tusingInstruction: {\n\t\t\t\t\t\t\t\ttype: 'KEETA_SEND',\n\t\t\t\t\t\t\t\ttokenAddress: step.to.asset.publicKeyString.get(),\n\t\t\t\t\t\t\t\tsendToAddress: keetaRecipientDestination.publicKeyString.get(),\n\t\t\t\t\t\t\t\ttotalReceiveAmount: affinityAndAmount.amount.toString(),\n\t\t\t\t\t\t\t\tlocation: `chain:keeta:${this.parent['client'].network}`,\n\t\t\t\t\t\t\t\tvalue: String(affinityAndAmount.amount),\n\t\t\t\t\t\t\t\tassetFee: '0'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\tpromise.then(() => resolvingSteps.delete(index), () => resolvingSteps.delete(index));\n\t\t\t\tstepPromises[index] = promise;\n\t\t\t} else if (resolvingSteps.has(index)) {\n\t\t\t\tthrow(new Error(`Cyclic dependency detected in resolveStep: step ${index} is already being resolved`));\n\t\t\t}\n\n\t\t\treturn(await promise);\n\t\t}\n\n\t\tconst steps = [];\n\t\tfor (let index = 0; index < this.path.length; index++) {\n\t\t\tsteps.push(await resolveStep(index));\n\t\t}\n\n\t\t// Direct same-location/same-asset send: no provider steps needed.\n\t\tif (steps.length === 0) {\n\t\t\treturn({\n\t\t\t\tsteps: [],\n\t\t\t\ttotalValueIn: affinityAndAmount.amount,\n\t\t\t\ttotalValueOut: affinityAndAmount.amount\n\t\t\t});\n\t\t}\n\n\t\tconst firstStep = steps[0];\n\t\tconst lastStep = steps[steps.length - 1];\n\n\t\tif (!firstStep || !lastStep) {\n\t\t\tthrow(new Error(`Steps array is empty`));\n\t\t}\n\n\t\tif (affinity === 'from') {\n\t\t\tif (firstStep.valueIn !== this.request.source.value) {\n\t\t\t\tthrow(new Error(`Computed valueIn for first step ${firstStep.valueIn} does not match request source value ${this.request.source.value}`));\n\t\t\t}\n\t\t} else if (affinity === 'to') {\n\t\t\tif (lastStep.valueOut !== this.request.destination.value) {\n\t\t\t\tthrow(new Error(`Computed valueOut for last step ${lastStep.valueOut} does not match requested destination value ${this.request.destination.value}`));\n\t\t\t}\n\t\t}\n\n\t\tif (lastStep.valueOut <= 0n) {\n\t\t\tthrow(new Error(`Computed valueOut for last step must be greater than 0, got ${lastStep.valueOut}`));\n\t\t}\n\n\t\treturn({\n\t\t\tsteps,\n\t\t\ttotalValueIn: firstStep.valueIn,\n\t\t\ttotalValueOut: lastStep.valueOut\n\t\t});\n\t}\n\n\tstatic async create(path: AnchorChainingPath, options?: ComputePlanOptions): Promise<AnchorChainingPlan> {\n\t\tconst instance = new this(path, options);\n\t\tinstance.#_plan = await instance.#computePlan();\n\t\treturn(instance);\n\t}\n\n\tget state(): AnchorChainingPathState {\n\t\treturn(this.#state);\n\t}\n\n\ton<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tlet listenerSet = this.#listeners.get(event);\n\t\tif (!listenerSet) {\n\t\t\tlistenerSet = new Set();\n\t\t\tthis.#listeners.set(event, listenerSet);\n\t\t}\n\t\tlistenerSet.add(listener);\n\t}\n\n\toff<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tthis.#listeners.get(event)?.delete(listener);\n\t}\n\n\t#setState(state: AnchorChainingPathState): void {\n\t\tthis.#state = state;\n\t\tthis.#emit('stateChange', state);\n\t}\n\n\tget logger(): Logger | undefined {\n\t\treturn(this.parent['logger']);\n\t}\n\n\t#emit<E extends keyof AnchorChainingPathEventMap>(event: E, ...args: AnchorChainingPathEventMap[E]): { sendCount: number; } {\n\t\tlet sendCount = 0;\n\n\t\tfor (const listener of (this.#listeners.get(event) ?? [])) {\n\t\t\ttry {\n\t\t\t\tlistener(...args);\n\t\t\t\tsendCount++;\n\t\t\t} catch (err) {\n\t\t\t\tthis.logger?.debug(`AnchorChainingPath::emit`, `Error in listener for event '${event}'`, err);\n\t\t\t}\n\t\t}\n\n\t\treturn({ sendCount });\n\t}\n\n\tasync #awaitStepCompletion<\n\t\tType extends StepNeededActionEventPayload['type'],\n\t\tRet extends Parameters<Extract<StepNeededActionEventPayload, { action: { type: Type }}>['markCompleted']>\n\t>(step: Pick<Extract<StepNeededActionEventPayload, { type: Type }>, 'action' | 'type'>): Promise<Ret> {\n\t\tlet didComplete = false;\n\n\t\tfunction assertDidNotComplete() {\n\t\t\tif (didComplete) {\n\t\t\t\tthrow(new Error(`Step was already marked as completed or failed`));\n\t\t\t}\n\n\t\t\tdidComplete = true;\n\t\t}\n\n\t\tlet resolveFn: undefined | StepNeededActionEventPayload['markCompleted'];\n\t\tlet rejectFn: undefined | StepNeededActionEventPayload['markFailed'];\n\n\t\tconst promise = new Promise<Ret>(function(resolve, reject) {\n\t\t\tresolveFn = (...args: Ret) => {\n\t\t\t\tassertDidNotComplete();\n\t\t\t\tresolve(args);\n\t\t\t};\n\n\t\t\trejectFn = (error) => {\n\t\t\t\tassertDidNotComplete();\n\n\t\t\t\tlet usingErr = error;\n\t\t\t\tif (!usingErr) {\n\t\t\t\t\tusingErr = new Error(`Step marked as failed without error`);\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n\t\t\t\treject(usingErr);\n\t\t\t}\n\t\t});\n\n\t\tif (!resolveFn || !rejectFn) {\n\t\t\tthrow(new Error(`Failed to create step completion promise`));\n\t\t}\n\n\t\t// Typescript Cannot infer the correct payload type for the stepNeedsAction event, so we have to assert it here. We ensure type safety by constraining the step parameter to the correct action type, which guarantees that the payload will match the expected structure for that action type.\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst { sendCount } = this.#emit('stepNeedsAction', {\n\t\t\t...step,\n\t\t\tmarkCompleted: resolveFn,\n\t\t\tmarkFailed: rejectFn\n\t\t} as Extract<StepNeededActionEventPayload, { action: { type: Type }}>);\n\n\t\tif (sendCount === 0) {\n\t\t\tthrow(new Error(`No listeners for stepNeedsAction event, but a step (actionType=${step.type}) is awaiting completion`));\n\t\t}\n\n\t\treturn(await promise);\n\t}\n\n\tasync #authorizedSend(options: Pick<AnchorChainingPathExecuteOptions, 'requireSendAuth'> | undefined, sendToAddress: string | GenericAccount, value: bigint, token: TokenAddress | string, external?: string): Promise<void> {\n\t\tif (options?.requireSendAuth) {\n\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\ttype: 'keetaSendAuthRequired',\n\t\t\t\taction: {\n\t\t\t\t\tsendToAddress: KeetaNet.lib.Account.toAccount(sendToAddress),\n\t\t\t\t\tvalue,\n\t\t\t\t\ttoken: KeetaNet.lib.Account.toAccount(token).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t...(external !== undefined ? { external } : {})\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst { account } = await this.getAccountsForAction({ type: 'assetMovement', providerMethod: 'initiateTransfer' }, this.#options?.overrides);\n\t\tawait this.parent['client'].send(sendToAddress, value, token, external, { account });\n\t}\n\n\tasync #pollTransferStatus(\n\t\ttransfer: AssetMovementTransfer,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number }\n\t): Promise<Awaited<ReturnType<AssetMovementTransfer['getTransferStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tconst status = await transfer.getTransferStatus();\n\t\t\tif (status.transaction.status === 'COMPLETE') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for transfer ${transfer.transferId} to complete`));\n\t\t\t}\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync #pollExchangeStatus(\n\t\texchange: FXExchange,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number }\n\t): Promise<Awaited<ReturnType<FXExchange['getExchangeStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tconst status = await exchange.getExchangeStatus();\n\t\t\tif (status.status === 'completed') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (status.status === 'failed') {\n\t\t\t\tthrow(new Error(`FX exchange ${exchange.exchange.exchangeID} failed`));\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for FX exchange ${exchange.exchange.exchangeID} to complete`));\n\t\t\t}\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync execute(options?: { requireSendAuth?: boolean }): Promise<AnchorChainingPathExecuteResult> {\n\t\tif (this.#state.status !== 'idle') {\n\t\t\tthrow(new Error(`Cannot execute: path is already in state \"${this.#state.status}\"`));\n\t\t}\n\n\t\tconst executedSteps: ExecutedStep[] = [];\n\t\tthis.#setState({ status: 'executing', completedSteps: [], currentStepIndex: 0 });\n\n\t\t// Actual output value from each completed step, used for equality checking.\n\t\tlet prevActualValueOut: bigint | null = null;\n\n\t\tlet index = 0;\n\t\ttry {\n\t\t\tfor (index = 0; index < this.plan.steps.length; index++) {\n\t\t\t\tconst onStepCompleted = (step: ExecutedStep) => {\n\t\t\t\t\texecutedSteps.push(step);\n\t\t\t\t\tthis.#emit('stepExecuted', step, index);\n\t\t\t\t}\n\n\t\t\t\tthis.#setState({ status: 'executing', completedSteps: [...executedSteps], currentStepIndex: index });\n\n\t\t\t\tconst step = this.plan.steps[index];\n\n\t\t\t\tif (!step) {\n\t\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t\t}\n\n\t\t\t\t// Verify the actual output from the previous step matches the expected\n\t\t\t\t// input for this step. A mismatch indicates a provider delivered a\n\t\t\t\t// different amount than was negotiated in computeSteps.\n\t\t\t\tif (index > 0 && prevActualValueOut !== null) {\n\t\t\t\t\tif (prevActualValueOut !== step.valueIn) {\n\t\t\t\t\t\tthrow(new Error(\n\t\t\t\t\t\t\t`Value mismatch at step ${index}: ` +\n\t\t\t\t\t\t\t`expected ${step.valueIn} but previous step produced ${prevActualValueOut}`\n\t\t\t\t\t\t));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\tconst exchange = await step.result.createExchange();\n\t\t\t\t\tawait this.#pollExchangeStatus(exchange);\n\t\t\t\t\tprevActualValueOut = step.valueOut;\n\t\t\t\t\tonStepCompleted({ type: 'fx', plan: step, exchange });\n\t\t\t\t} else if (step.type === 'assetMovement' || step.type === 'keetaSend') {\n\t\t\t\t\tif (step.usingInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\tawait this.#authorizedSend(\n\t\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\tstep.usingInstruction.sendToAddress,\n\t\t\t\t\t\t\tBigInt(step.usingInstruction.value),\n\t\t\t\t\t\t\tKeetaNet.lib.Account.fromPublicKeyString(step.usingInstruction.tokenAddress).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t\t\tstep.usingInstruction.external\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (index === 0) {\n\t\t\t\t\t\tif (step.type !== 'assetMovement') {\n\t\t\t\t\t\t\tthrow(new Error(`Unexpected asset movement step at index ${index} for user-initiated transfer`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\t\t\t\ttype: 'assetMovementUserExecutionRequired',\n\t\t\t\t\t\t\taction: {\n\t\t\t\t\t\t\t\tassetMovementTransfer: step.transfer\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new Error(`Unsupported instruction type ${step.usingInstruction.type} for user-initiated transfer at step ${index}`));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (step.type === 'assetMovement') {\n\t\t\t\t\t\tconst status = await this.#pollTransferStatus(step.transfer);\n\t\t\t\t\t\tprevActualValueOut = BigInt(status.transaction.to.value);\n\t\t\t\t\t\tonStepCompleted({ type: 'assetMovement', plan: step });\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\t// For a direct Keeta send, we don't have a transfer object to poll, so we optimistically assume it completes successfully after the authorized send. We could optionally add a polling mechanism here if the underlying client provides a way to check the status of a Keeta transfer.\n\t\t\t\t\t\tprevActualValueOut = step.valueIn;\n\t\t\t\t\t\tonStepCompleted({ type: 'keetaSend', plan: step });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tassertNever(step);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Direct same-location/same-asset send: the loop ran zero iterations,\n\t\t\t// so just publish the on-chain transfer directly.\n\t\t\tif (this.path.length === 0) {\n\t\t\t\tconst sendValue = this.request.source.value ?? this.request.destination.value;\n\t\t\t\tif (!sendValue) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a value for source or destination`));\n\t\t\t\t}\n\n\t\t\t\tif (!KeetaNet.lib.Account.isInstance(this.request.source.asset)) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a Keeta token address as the source asset`));\n\t\t\t\t}\n\t\t\t\tconst recipient = this.request.destination.recipient;\n\t\t\t\tif (typeof recipient !== 'string') {\n\t\t\t\t\tthrow(new Error(`Direct Keeta send requires a crypto address as the recipient`));\n\t\t\t\t}\n\t\t\t\tawait this.#authorizedSend(options, recipient, sendValue, this.request.source.asset);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\tthis.#setState({ status: 'failed', error, completedSteps: [...executedSteps], failedAtStepIndex: index });\n\t\t\tthis.#emit('failed', error, [...executedSteps], index);\n\t\t\tthrow(error);\n\t\t}\n\n\t\tconst result: AnchorChainingPathExecuteResult = { steps: executedSteps };\n\t\tthis.#setState({ status: 'completed', result });\n\t\tthis.#emit('completed', result);\n\t\treturn(result);\n\t}\n}\n\ntype AnchorChainingFullPlanResult = (({ success: true; plan: AnchorChainingPlan; } | { success: false; error: unknown; }) & { path: AnchorChainingPath; });\n\nexport class AnchorChaining {\n\tprivate client: KeetaNet.UserClient;\n\tprivate resolver: Resolver;\n\treadonly graph: AnchorGraph;\n\tprivate logger?: Logger;\n\n\tconstructor(config: AnchorChainingConfig) {\n\t\tthis.client = config.client;\n\t\tif (config.resolver) {\n\t\t\tthis.resolver = config.resolver;\n\t\t} else {\n\t\t\tthis.resolver = getDefaultResolver(config.client);\n\t\t}\n\t\tthis.graph = new AnchorGraph({ resolver: this.resolver, client: this.client, logger: config.logger });\n\t\tif (config.logger !== undefined) {\n\t\t\tthis.logger = config.logger;\n\t\t}\n\t}\n\n\tasync getPaths(input: AnchorChainingPathInput): Promise<AnchorChainingPath[] | null> {\n\t\t// Direct send: same Keeta location, same asset, same rail no providers needed.\n\t\tconst sourceLocation = toAssetLocation(input.source.location);\n\t\tconst destinationLocation = toAssetLocation(input.destination.location);\n\n\t\tlet foundPaths: AnchorChainingStepLike[][] | null = null;\n\n\t\tif (\n\t\t\tinput.source.rail === 'KEETA_SEND' &&\n\t\t\tinput.destination.rail === 'KEETA_SEND' &&\n\t\t\tconvertAssetLocationToString(sourceLocation) === convertAssetLocationToString(destinationLocation) &&\n\t\t\tisChainLocation(sourceLocation, 'keeta') &&\n\t\t\tisChainLocation(destinationLocation, 'keeta') &&\n\t\t\tisAnchorChainingAssetEqual(input.source.asset, input.destination.asset)\n\t\t) {\n\t\t\tconst fromTo = {\n\t\t\t\tasset: input.source.asset,\n\t\t\t\tlocation: sourceLocation,\n\t\t\t\trail: 'KEETA_SEND'\n\t\t\t} as const;\n\n\t\t\tfoundPaths = [\n\t\t\t\t[{ type: 'keetaSend', from: fromTo, to: fromTo }]\n\t\t\t];\n\t\t} else {\n\t\t\tfoundPaths = await this.graph.findPaths(input);\n\t\t}\n\n\t\tif (foundPaths.length === 0) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst retval: AnchorChainingPath[] = [];\n\n\t\tfor (const path of foundPaths) {\n\t\t\tretval.push(new AnchorChainingPath({ request: input, path, parent: this }));\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync getPlans(input: AnchorChainingPathInput, options?: ComputePlanOptions & { includeAllOutput?: false }): Promise<AnchorChainingPlan[] | null>;\n\tasync getPlans(input: AnchorChainingPathInput, options: ComputePlanOptions & { includeAllOutput: true }): Promise<AnchorChainingFullPlanResult[] | null>;\n\tasync getPlans(input: AnchorChainingPathInput, options?: ComputePlanOptions & { includeAllOutput?: boolean }): Promise<(AnchorChainingPlan | AnchorChainingFullPlanResult)[] | null> {\n\t\tconst paths = await this.getPaths(input);\n\n\t\tif (!paths) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst result = await Promise.allSettled(paths.map(async function(path) {\n\t\t\treturn(await AnchorChainingPlan.create(path, options));\n\t\t}));\n\n\t\tconst ret: (AnchorChainingPlan | AnchorChainingFullPlanResult)[] = [];\n\n\t\tfor (let i = 0; i < paths.length; i++) {\n\t\t\tconst path = paths[i];\n\t\t\tconst plan = result[i];\n\n\t\t\tif (!path || !plan) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (options?.includeAllOutput) {\n\t\t\t\tif (plan.status === 'rejected') {\n\t\t\t\t\tret.push({ success: false, error: plan.reason, path });\n\t\t\t\t} else {\n\t\t\t\t\tret.push({ success: true, plan: plan.value, path });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (plan.status === 'rejected') {\n\t\t\t\t\tthis.logger?.debug(`AnchorChaining::getPlans`, `Error computing plan for a path:`, plan.reason);\n\t\t\t\t} else {\n\t\t\t\t\tret.push(plan.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn(ret);\n\t}\n}\n"]}
1
+ {"version":3,"file":"chaining.js","sourceRoot":"","sources":["../../src/lib/chaining.ts"],"names":[],"mappings":"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","sourcesContent":["import type { lib as KeetaNetLib } from '@keetanetwork/keetanet-client';\nimport { KeetaNet } from \"../client/index.js\";\nimport type { AnchorTokenLocationMetadata, AssetLocationLike, AssetTransferInstructions, AssetWithRails, FiatPushRails, KeetaAssetMovementTransaction, KeetaPersistentForwardingAddressDetails, MovableAssetSearchCanonical, PickChainLocation, Rail, RailOrRailWithExtendedDetails, RecipientResolved, SimulatedAssetTransferInstructions } from \"../services/asset-movement/common.js\";\nimport { convertAssetLocationToString, convertAssetSearchInputToCanonical, isChainLocation, toAssetLocation } from \"../services/asset-movement/common.js\";\nimport type { Resolver } from \"./index.js\";\nimport { getDefaultResolver } from '../config.js';\nimport type { ISOCurrencyCode } from '@keetanetwork/currency-info';\nimport { Currency } from '@keetanetwork/currency-info';\nimport type { Account, GenericAccount, TokenAddress } from '@keetanetwork/keetanet-client/lib/account.js';\nimport { isAssetLocationLike } from '../services/asset-movement/lib/location.generated.js';\nimport type { ToValuizable } from './resolver.js';\nimport { isFiatRail, isMovableAssetSearchCanonical, isRail } from '../services/asset-movement/common.generated.js';\nimport { assertNever } from './utils/never.js';\nimport KeetaFXAnchorClient from '../services/fx/client.js';\nimport type { KeetaAssetMovementAnchorProvider } from '../services/asset-movement/client.js';\nimport KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';\nimport type { ExternalChainAsset } from './asset.js';\nimport { isExternalChainAsset } from './asset.js';\nimport type { Logger } from './log/index.js';\nimport type { BlockHash } from '@keetanetwork/keetanet-client/lib/block/index.js';\nimport type { AnchorMetadataLegalField } from './metadata.types.js';\n\ntype FXQuoteOrEstimate = NonNullable<Awaited<ReturnType<KeetaFXAnchorClient['getQuotesOrEstimates']>>>[number];\ntype AssetMovementProvider = NonNullable<Awaited<ReturnType<KeetaAssetMovementAnchorClient['getProvidersForTransfer']>>>[number];\ntype AssetMovementTransfer = Awaited<ReturnType<AssetMovementProvider['initiateTransfer']>>;\ntype FXExchange = Awaited<ReturnType<FXQuoteOrEstimate['createExchange']>>;\n\ninterface ChainStepResolutionBase<Type extends 'fx' | 'assetMovement' | 'keetaSend' | 'forwarded'> {\n\ttype: Type;\n\tvalueIn: bigint;\n\tvalueOut: bigint;\n\tstep: Type extends 'keetaSend' ? null : (\n\t\tType extends 'forwarded' ? AssetMovementGraphNode : Extract<GraphNodeLike, { type: Type }>\n\t);\n}\n\ninterface ChainStepResolutionFX extends ChainStepResolutionBase<'fx'> {\n\ttype: 'fx';\n\tresult: FXQuoteOrEstimate;\n};\n\ntype SendingToType = 'SELF' | 'NEXT_STEP' | 'FINAL_DESTINATION';\n\ninterface ChainStepResolutionAssetMovement extends ChainStepResolutionBase<'assetMovement'> {\n\tusingInstruction: AssetTransferInstructions;\n\tsendingTo: SendingToType;\n\ttransfer: AssetMovementTransfer;\n};\n\ninterface ChainStepResolutionKeetaSend extends ChainStepResolutionBase<'keetaSend'> {\n\tusingInstruction: Extract<AssetTransferInstructions, { type: 'KEETA_SEND' }>;\n};\n\ninterface ChainStepResolutionForwarded extends ChainStepResolutionBase<'forwarded'> {\n\tpersistentAddress: KeetaPersistentForwardingAddressDetails;\n\tprovider: AssetMovementProvider;\n};\n\nexport type Disclaimer = Exclude<AnchorMetadataLegalField['disclaimers'], undefined>[number];\ntype ProviderDisclaimers = {\n\tproviderID: string;\n\tdisclaimers: Disclaimer[];\n}\ntype PlanDisclaimers = ProviderDisclaimers[];\n\nexport type ChainStepResolution = ChainStepResolutionFX | ChainStepResolutionAssetMovement | ChainStepResolutionKeetaSend | ChainStepResolutionForwarded;\n\ntype AnchorChainingPathComputedPlan = {\n\tsteps: ChainStepResolution[];\n\ttotalValueIn: bigint;\n\ttotalValueOut: bigint;\n};\n\ntype ExecutedStepFX = {\n\ttype: 'fx';\n\tplan: ChainStepResolutionFX;\n\texchange: FXExchange;\n};\n\ntype ExecutedStepAssetMovement = {\n\ttype: 'assetMovement';\n\tplan: ChainStepResolutionAssetMovement;\n};\n\ntype ExecutedStepKeetaSend = {\n\ttype: 'keetaSend';\n\tplan: ChainStepResolutionKeetaSend;\n};\n\ntype ExecutedStepForwarded = {\n\ttype: 'forwarded';\n\tplan: ChainStepResolutionForwarded;\n\tobservedTransaction: KeetaAssetMovementTransaction;\n};\n\n\nexport type ExecutedStep = ExecutedStepFX | ExecutedStepAssetMovement | ExecutedStepKeetaSend | ExecutedStepForwarded;\n\nexport type AnchorChainingPathExecuteResult = {\n\tsteps: ExecutedStep[];\n};\n\nexport type AnchorChainingPathExecuteOptions = {\n\trequireSendAuth?: boolean;\n};\n\nexport type AnchorChainingPathState =\n\t| { status: 'idle' }\n\t| { status: 'executing'; completedSteps: ExecutedStep[]; currentStepIndex: number }\n\t| { status: 'completed'; result: AnchorChainingPathExecuteResult }\n\t| { status: 'failed'; error: Error; completedSteps: ExecutedStep[]; failedAtStepIndex: number };\n\ninterface StepNeededActionEventPayloadBase<ActionType, ActionPayload, CompletedPayload extends readonly unknown[] = []> {\n\ttype: ActionType;\n\n\tmarkCompleted: (...args: CompletedPayload) => void;\n\tmarkFailed: (error?: unknown) => void;\n\n\taction: ActionPayload;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventAssetMovement extends StepNeededActionEventPayloadBase<'assetMovementUserExecutionRequired', { assetMovementTransfer: AssetMovementTransfer; }, []> {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface StepNeededActionEventKeetaSend extends StepNeededActionEventPayloadBase<'keetaSendAuthRequired', {\n\tsendToAddress: GenericAccount;\n\tvalue: bigint;\n\ttoken: TokenAddress;\n\texternal?: string;\n}, [ { sent: boolean | BlockHash; }]> {}\n\ntype StepNeededActionEventPayload = StepNeededActionEventKeetaSend | StepNeededActionEventAssetMovement;\n\ntype AnchorChainingPathEventMap = {\n\tstateChange: [state: AnchorChainingPathState];\n\tstepExecuted: [step: ExecutedStep, index: number];\n\tcompleted: [result: AnchorChainingPathExecuteResult];\n\tfailed: [error: Error, completedSteps: ExecutedStep[], failedAtStepIndex: number];\n\tstepNeedsAction: [StepNeededActionEventPayload];\n}\n\ninterface RailSupportedOperations {\n\tcreatePersistentForwarding?: boolean;\n\tinitiateTransfer?: boolean;\n}\n\ninterface RailWithSupportedOperations {\n\trail: Rail;\n\tsupportedOperations?: RailSupportedOperations;\n}\n\ninterface AnchorChainingAssetAndLocation<AssetType extends AnchorChainingAsset = AnchorChainingAsset, Location extends AssetLocationLike = AssetLocationLike> {\n\tasset: AssetType;\n\tlocation: Location;\n\trail: Rail;\n\tsupportedOperations?: RailSupportedOperations;\n\tvalue?: bigint;\n\n}\n\ninterface AnchorChainingDestination extends AnchorChainingAssetAndLocation {\n\trecipient: RecipientResolved;\n}\n\ninterface AnchorChainingPathInput {\n\tsource: AnchorChainingAssetAndLocation;\n\tdestination: AnchorChainingDestination;\n}\n\nexport interface AnchorChainingConfig {\n\tclient: KeetaNet.UserClient;\n\tresolver?: Resolver;\n\tsigner?: InstanceType<typeof KeetaNetLib.Account>;\n\taccount?: InstanceType<typeof KeetaNetLib.Account>;\n\tlogger?: Logger;\n}\n\ninterface BaseGraphNodeLike<Type extends 'fx' | 'assetMovement', AssetType extends AnchorChainingAsset> {\n\ttype: Type;\n\tproviderID: string;\n\n\tfrom: AnchorChainingAssetAndLocation<AssetType>;\n\tto: AnchorChainingAssetAndLocation<AssetType>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface FXGraphNode extends BaseGraphNodeLike<'fx', Exclude<AnchorChainingAsset, ExternalChainAsset>> {}\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface AssetMovementGraphNode extends BaseGraphNodeLike<'assetMovement', AnchorChainingAsset> {}\nexport type GraphNodeLike = FXGraphNode | AssetMovementGraphNode;\n\ntype KeetaLocationLike = Extract<AssetLocationLike, `chain:keeta:${bigint}`> | PickChainLocation<'keeta'>;\ninterface KeetaSendStepLike {\n\ttype: 'keetaSend';\n\n\tproviderID?: null;\n\n\tfrom: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n\tto: AnchorChainingAssetAndLocation<AnchorChainingAsset, KeetaLocationLike>;\n}\n\nexport type AnchorChainingStepLike = GraphNodeLike | KeetaSendStepLike;\n\nexport type AnchorChainingAsset = TokenAddress | ISOCurrencyCode | ExternalChainAsset;\n\nfunction areBothTokenAndEqual(a: string | TokenAddress, b: string | TokenAddress): boolean {\n\ttry {\n\t\tconst aParsed = KeetaNet.lib.Account.toAccount(a);\n\t\tconst bParsed = KeetaNet.lib.Account.toAccount(b);\n\n\t\tif (!aParsed.isToken() || !bParsed.isToken()) {\n\t\t\treturn(false);\n\t\t}\n\n\n\t\treturn(aParsed.comparePublicKey(bParsed));\n\t} catch {\n\t\treturn(false);\n\t}\n}\n\nfunction isAnchorChainingAssetEqual(a: AnchorChainingAsset, b: AnchorChainingAsset): boolean {\n\tif (typeof a === 'string' && typeof b === 'string' && a === b) {\n\t\treturn(true);\n\t} else if (areBothTokenAndEqual(a, b)) {\n\t\treturn(true);\n\t} else {\n\t\treturn(false);\n\t}\n}\n\nfunction nodeSideSupports(side: AnchorChainingAssetAndLocation, required: AnchorChainingAssetAndLocation): boolean {\n\tif (side.rail !== required.rail) {\n\t\treturn(false);\n\t}\n\n\tif (convertAssetLocationToString(side.location) !== convertAssetLocationToString(required.location)) {\n\t\treturn(false);\n\t}\n\n\tif (!isAnchorChainingAssetEqual(side.asset, required.asset)) {\n\t\treturn(false);\n\t}\n\n\treturn(true);\n}\n\n/**\n * Returns true for nodes that keep assets on Keeta: FX nodes, plus\n * asset-movement nodes whose from and to share the same Keeta chain location\n * (custodial FX anchors that don't actually move funds off-chain).\n */\nfunction isFXLikeNode(node: GraphNodeLike): boolean {\n\tif (node.type === 'fx') {\n\t\treturn(true);\n\t}\n\tconst fromStr = convertAssetLocationToString(node.from.location);\n\tconst toStr = convertAssetLocationToString(node.to.location);\n\treturn(fromStr === toStr && fromStr.startsWith('chain:keeta:'));\n}\n\ninterface AssetMovementResolvedRails {\n\tcommon: RailWithSupportedOperations[];\n\tinbound: RailWithSupportedOperations[];\n\toutbound: RailWithSupportedOperations[];\n}\n\nexport type AnchorChainingListAssetsSideFilter = {\n\tlocation?: AssetLocationLike | undefined;\n\tasset?: AnchorChainingAsset | undefined;\n\trail?: Rail | undefined;\n};\n\ntype AnchorChainingListAssetsShared = {\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport type AnchorChainingListAssetsFilter =\n\t| ({ from: AnchorChainingListAssetsSideFilter; to?: never } & AnchorChainingListAssetsShared)\n\t| ({ to: AnchorChainingListAssetsSideFilter; from?: never } & AnchorChainingListAssetsShared)\n\t| ({ from?: never; to?: never } & AnchorChainingListAssetsShared);\n\nexport type AnchorChainingResolveAssetsFilter = {\n\tfrom?: AnchorChainingListAssetsSideFilter;\n\tto?: AnchorChainingListAssetsSideFilter;\n\tmaxStepCount?: number;\n\tonlyAllowFXLike?: boolean;\n};\n\nexport interface AnchorChainingResolveAssetsResult {\n\tfrom: AnchorChainingAssetInfo[];\n\tto: AnchorChainingAssetInfo[];\n}\n\nexport interface AnchorChainingAssetInfo {\n\tasset: AnchorChainingAsset;\n\tlocation: AssetLocationLike;\n\trails: {\n\t\tinbound: Rail[];\n\t\toutbound: Rail[];\n\t};\n\n\tdistance: {\n\t\tpathLength: number;\n\t} | null;\n}\n\ntype AnchorChainingAssetInfoWithMetadata = AnchorChainingAssetInfo & {\n\tmetadata?: AnchorTokenLocationMetadata;\n}\n\ninterface AnchorChainingResolveAssetsWithMetadataResult {\n\tfrom: AnchorChainingAssetInfoWithMetadata[];\n\tto: AnchorChainingAssetInfoWithMetadata[];\n}\n\ntype AnchorChainingWithMetadataOptions = {\n\tproviderID?: string;\n};\n\ntype GetAccountForActionPayload = {\n\ttype: 'assetMovement';\n\tproviderMethod: 'initiateTransfer';\n\tprovider?: AssetMovementProvider;\n} | {\n\ttype: 'fx';\n\tproviderMethod: 'getAccountForAction';\n}\n\ntype AccountLike = InstanceType<typeof KeetaNetLib.Account> | undefined | ((providerMethodPayload: GetAccountForActionPayload) => Promise<Account> | Account);\ninterface AnchorChainingAccountOverrides {\n\taccount?: AccountLike;\n\tsigner?: AccountLike;\n}\n\nclass AnchorGraph {\n\tclient: KeetaNet.UserClient;\n\tresolver: Resolver;\n\tlogger?: Logger | undefined;\n\n\treadonly assetMovementClient: KeetaAssetMovementAnchorClient;\n\treadonly fxClient: KeetaFXAnchorClient;\n\treadonly #assetMovementProviderCache = new Map<string, AssetMovementProvider | null>();\n\treadonly #assetNameCache = new Map<MovableAssetSearchCanonical, ISOCurrencyCode | TokenAddress | ExternalChainAsset>();\n\t#graphNodePromise: Promise<GraphNodeLike[]> | null = null;\n\n\tconstructor(args: { client: KeetaNet.UserClient; resolver: Resolver; logger?: Logger | undefined; }) {\n\t\tthis.resolver = args.resolver;\n\t\tthis.client = args.client;\n\t\tthis.logger = args.logger;\n\t\tthis.assetMovementClient = new KeetaAssetMovementAnchorClient(this.client, {\n\t\t\tresolver: this.resolver,\n\t\t\t...(this.logger ? { logger: this.logger } : {})\n\t\t});\n\t\tthis.fxClient = new KeetaFXAnchorClient(this.client, {\n\t\t\tresolver: this.resolver,\n\t\t\t...(this.logger ? { logger: this.logger } : {})\n\t\t});\n\t}\n\n\t#assetLocationKey = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }) => {\n\t\treturn(`${convertAssetSearchInputToCanonical(side.asset)}@${convertAssetLocationToString(side.location)}`);\n\t};\n\n\tasync getAssetMovementProviderById(providerID: string): Promise<AssetMovementProvider | null> {\n\t\tlet provider: KeetaAssetMovementAnchorProvider | undefined | null = this.#assetMovementProviderCache.get(providerID);\n\t\tif (provider === undefined) {\n\t\t\tprovider = await this.assetMovementClient.getProviderByID(providerID);\n\t\t}\n\n\t\tthis.#assetMovementProviderCache.set(providerID, provider);\n\n\t\treturn(provider);\n\t}\n\n\tasync getAssetMovementProvidersForAsset(asset: AnchorChainingAsset, location: AssetLocationLike): Promise<null | { [providerID: string]: { provider: AssetMovementProvider; }}> {\n\t\tlet retval: null | { [providerID: string]: { provider: AssetMovementProvider; }} = null;\n\n\t\tfor (const node of await this.computeGraphNodes()) {\n\t\t\tif (node.type !== 'assetMovement') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const side of [ node.from, node.to ] as const) {\n\t\t\t\tif (!isAnchorChainingAssetEqual(side.asset, asset) || convertAssetLocationToString(side.location) !== convertAssetLocationToString(location)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!retval) {\n\t\t\t\t\tretval = {};\n\t\t\t\t}\n\n\t\t\t\tif (!retval[node.providerID]) {\n\t\t\t\t\tconst provider = await this.getAssetMovementProviderById(node.providerID);\n\t\t\t\t\tif (!provider) {\n\t\t\t\t\t\tthis.logger?.debug('AnchorGraph::getAssetMovementProvidersForAsset', `No provider found for providerID ${node.providerID}, although provider was previously known to exist in the graph nodes`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tretval[node.providerID] = { provider };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync #computeFXNodes() {\n\t\tconst fxServices = await this.resolver.lookup('fx', {});\n\n\t\tif (!fxServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst networkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\tconst providerLookupResult = await Promise.all(Object.entries(fxServices).map(async ([ providerID, service ]) => {\n\t\t\tconst fromEntries = await service.from('array');\n\n\t\t\tif (!fromEntries) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst operations = await service.operations('object');\n\t\t\tif (!operations.createExchange) {\n\t\t\t\tthis.logger?.debug('AnchorGraph::computeFXNodes', `FX service ${providerID} does not support createExchange operation, skipping`);\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodes = await Promise.all(fromEntries.map(async function(fromEntry) {\n\t\t\t\tconst pathNodesResult: GraphNodeLike[] = [];\n\n\t\t\t\tconst parsedEntry = await fromEntry('object');\n\n\t\t\t\tconst [ fromCodes, toCodes ] = await Promise.all([\n\t\t\t\t\tparsedEntry.currencyCodes('array'),\n\t\t\t\t\tparsedEntry.to('array')\n\t\t\t\t]);\n\n\t\t\t\tfor (const from of fromCodes) {\n\t\t\t\t\tconst fromResolved = await from('string');\n\t\t\t\t\tif (!fromResolved) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fromAccount = KeetaNet.lib.Account.fromPublicKeyString(fromResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\tfor (const to of toCodes) {\n\t\t\t\t\t\tconst toResolved = await to('string');\n\t\t\t\t\t\tif (!toResolved) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst toAccount = KeetaNet.lib.Account.fromPublicKeyString(toResolved).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN);\n\n\t\t\t\t\t\tif (fromAccount.comparePublicKey(toAccount)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpathNodesResult.push({\n\t\t\t\t\t\t\ttype: 'fx',\n\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\tfrom: { asset: fromAccount, location: networkLocation, rail: 'KEETA_SEND' },\n\t\t\t\t\t\t\tto: { asset: toAccount, location: networkLocation, rail: 'KEETA_SEND' }\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(pathNodesResult);\n\t\t\t}));\n\n\t\t\treturn(pathNodes.flat());\n\t\t}));\n\n\t\treturn(providerLookupResult.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync #resolveAssetName(name: MovableAssetSearchCanonical): Promise<ISOCurrencyCode | TokenAddress | ExternalChainAsset> {\n\t\tif (KeetaNet.lib.Account.isInstance(name) && name.isToken()) {\n\t\t\treturn(name);\n\t\t}\n\n\t\tif (typeof name === 'string') {\n\t\t\ttry {\n\t\t\t\treturn(KeetaNet.lib.Account.fromPublicKeyString(name).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN));\n\t\t\t} catch {\n\t\t\t\t/* ignore error and continue with other resolution methods */\n\t\t\t}\n\t\t}\n\n\t\tlet found = this.#assetNameCache.get(name);\n\t\tif (found) {\n\t\t\treturn(found);\n\t\t}\n\n\t\tif (isExternalChainAsset(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isCurrencyCode(name)) {\n\t\t\tfound = name;\n\t\t} else if (Currency.isISOCurrencyNumber(name)) {\n\t\t\tfound = new Currency(name).code;\n\t\t} else {\n\t\t\tconst lookupRet = await this.resolver.lookupToken(name);\n\t\t\tif (lookupRet) {\n\t\t\t\tfound = KeetaNet.lib.Account.toAccount(lookupRet.token);\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tthrow(new Error(`Unable to resolve asset name: ${name}`));\n\t\t}\n\n\t\tthis.#assetNameCache.set(name, found);\n\n\t\treturn(found);\n\t}\n\n\tasync #computeAssetRails(assetInput: ToValuizable<RailOrRailWithExtendedDetails>): Promise<RailWithSupportedOperations> {\n\t\ttry {\n\t\t\tconst railResolved = await assetInput('string');\n\n\t\t\tif (!isRail(railResolved)) {\n\t\t\t\tthrow(new Error(`Invalid rail format: ${railResolved}`));\n\t\t\t}\n\n\t\t\treturn({ rail: railResolved });\n\t\t} catch {\n\t\t\t/* ignore error */\n\t\t}\n\n\t\tconst extendedDetailsResolved = await assetInput('object');\n\n\t\tif (!extendedDetailsResolved || typeof extendedDetailsResolved !== 'object' || Array.isArray(extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, expected string or object with extended details`));\n\t\t}\n\n\t\tif (!('rail' in extendedDetailsResolved)) {\n\t\t\tthrow(new Error(`Invalid asset format, missing 'rail' field in extended details`));\n\t\t}\n\n\t\tconst railResolved = await extendedDetailsResolved.rail?.('string');\n\n\t\tif (!isRail(railResolved)) {\n\t\t\tthrow(new Error(`Invalid rail format in extended details: ${railResolved}`));\n\t\t}\n\n\t\tlet supportedOperations: RailSupportedOperations | undefined;\n\t\tif ('supportedOperations' in extendedDetailsResolved && extendedDetailsResolved.supportedOperations) {\n\t\t\tconst opsResolved = await extendedDetailsResolved.supportedOperations('object');\n\t\t\tif (opsResolved && typeof opsResolved === 'object' && !Array.isArray(opsResolved)) {\n\t\t\t\tconst parsed: RailSupportedOperations = {};\n\t\t\t\tif ('createPersistentForwarding' in opsResolved && opsResolved.createPersistentForwarding) {\n\t\t\t\t\tconst val = await opsResolved.createPersistentForwarding('boolean');\n\t\t\t\t\tif (typeof val === 'boolean') {\n\t\t\t\t\t\tparsed.createPersistentForwarding = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ('initiateTransfer' in opsResolved && opsResolved.initiateTransfer) {\n\t\t\t\t\tconst val = await opsResolved.initiateTransfer('boolean');\n\t\t\t\t\tif (typeof val === 'boolean') {\n\t\t\t\t\t\tparsed.initiateTransfer = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Object.keys(parsed).length > 0) {\n\t\t\t\t\tsupportedOperations = parsed;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst result: RailWithSupportedOperations = { rail: railResolved };\n\t\tif (supportedOperations) {\n\t\t\tresult.supportedOperations = supportedOperations;\n\t\t}\n\n\t\treturn(result);\n\t}\n\n\tasync #computeAssetMovementPairSide(pairSideInput: ToValuizable<AssetWithRails>): Promise<{ rails: AssetMovementResolvedRails; location: AssetLocationLike; id: AnchorChainingAsset; }> {\n\t\tconst pairSideResolved = await pairSideInput('object');\n\n\t\tlet location: AssetLocationLike;\n\t\tif (pairSideResolved.location) {\n\t\t\tconst locationRaw = await pairSideResolved.location('string');\n\t\t\tif (!isAssetLocationLike(locationRaw)) {\n\t\t\t\tthrow(new Error(`Invalid location format: ${locationRaw}`));\n\t\t\t}\n\n\t\t\tlocation = locationRaw;\n\t\t} else {\n\t\t\tlocation = `chain:keeta:${this.client.network}`;\n\t\t}\n\n\t\tconst railsResolved = await pairSideResolved.rails('object');\n\n\t\tconst rails: AssetMovementResolvedRails = {\n\t\t\tcommon: await Promise.all((await railsResolved.common?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn(await this.#computeAssetRails(commonInput));\n\t\t\t}) ?? []),\n\t\t\tinbound: await Promise.all((await railsResolved.inbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn(await this.#computeAssetRails(commonInput));\n\t\t\t}) ?? []),\n\t\t\toutbound: await Promise.all((await railsResolved.outbound?.('array'))?.map(async (commonInput) => {\n\t\t\t\treturn(await this.#computeAssetRails(commonInput));\n\t\t\t}) ?? [])\n\t\t};\n\n\t\tconst id = await pairSideResolved.id('string');\n\t\tif (!isMovableAssetSearchCanonical(id)) {\n\t\t\tthrow(new Error(`Invalid asset id format: ${id}`));\n\t\t}\n\n\t\treturn({\n\t\t\trails: rails,\n\t\t\tlocation: location,\n\t\t\tid: await this.#resolveAssetName(id)\n\t\t});\n\t}\n\n\tasync #computeAssetMovementNodes() {\n\t\tconst assetMovementServices = await this.resolver.lookup('assetMovement', {});\n\n\t\tif (!assetMovementServices) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst providerResults = await Promise.all(Object.entries(assetMovementServices).map(async ([ providerID, service ]) => {\n\t\t\tconst supportedOperationsMetadata = await service.operations('object');\n\n\t\t\tconst supportedAssetsEntries = await service.supportedAssets('array');\n\n\t\t\tif (!supportedAssetsEntries) {\n\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `No supported assets found for provider ${providerID}`);\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst pathNodesResult = await Promise.all(supportedAssetsEntries.map(async (assetEntry): Promise<GraphNodeLike[]> => {\n\t\t\t\tconst parsedEntry = await assetEntry('object');\n\n\t\t\t\tconst pathsResolved = await parsedEntry.paths('array');\n\t\t\t\tconst pathPromises = await Promise.allSettled(pathsResolved.map(async (pathResolvedInput): Promise<GraphNodeLike[]> => {\n\t\t\t\t\tconst pathResolved = await pathResolvedInput('object');\n\n\t\t\t\t\tconst pairResolved = await pathResolved.pair('array');\n\n\t\t\t\t\tconst [ fromResolved, toResolved ] = await Promise.all([\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[0]),\n\t\t\t\t\t\tthis.#computeAssetMovementPairSide(pairResolved[1])\n\t\t\t\t\t]);\n\n\t\t\t\t\tfunction getProviderSupportedOperationsForRail(railSpecific?: RailSupportedOperations): RailSupportedOperations {\n\t\t\t\t\t\tconst retval: RailSupportedOperations = {\n\t\t\t\t\t\t\tcreatePersistentForwarding: supportedOperationsMetadata.createPersistentForwarding !== undefined,\n\t\t\t\t\t\t\tinitiateTransfer: supportedOperationsMetadata.initiateTransfer !== undefined\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (railSpecific) {\n\t\t\t\t\t\t\tretval.createPersistentForwarding = railSpecific.createPersistentForwarding ?? false;\n\t\t\t\t\t\t\tretval.initiateTransfer = railSpecific.initiateTransfer ?? false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn(retval);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst pathNodes: GraphNodeLike[] = [];\n\t\t\t\t\tfor (const [ src, dest ] of [\n\t\t\t\t\t\t[ fromResolved, toResolved ],\n\t\t\t\t\t\t[ toResolved, fromResolved ]\n\t\t\t\t\t] as const) {\n\t\t\t\t\t\tfor (const inboundRail of [ ...(src.rails.common ?? []), ...(src.rails.inbound ?? []) ]) {\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * Drop edges whose source rail explicitly cannot\n\t\t\t\t\t\t\t * initiate a transfer and also cannot create a\n\t\t\t\t\t\t\t * persistent forwarding address.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tconst inboundSupportedOperations = getProviderSupportedOperationsForRail(inboundRail.supportedOperations);\n\t\t\t\t\t\t\tif (inboundSupportedOperations.initiateTransfer === false && inboundSupportedOperations.createPersistentForwarding === false) {\n\t\t\t\t\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `Skipping ${providerID} edge from ${convertAssetLocationToString(src.location)} via rail ${inboundRail.rail}: neither initiateTransfer nor createPersistentForwarding supported`);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfor (const outboundRail of [ ...(dest.rails.common ?? []), ...(dest.rails.outbound ?? []) ]) {\n\t\t\t\t\t\t\t\tpathNodes.push({\n\t\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\t\tproviderID: providerID,\n\t\t\t\t\t\t\t\t\tfrom: {\n\t\t\t\t\t\t\t\t\t\tasset: src.id,\n\t\t\t\t\t\t\t\t\t\tlocation: src.location,\n\t\t\t\t\t\t\t\t\t\trail: inboundRail.rail,\n\t\t\t\t\t\t\t\t\t\tsupportedOperations: getProviderSupportedOperationsForRail(inboundRail.supportedOperations)\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tto: {\n\t\t\t\t\t\t\t\t\t\tasset: dest.id,\n\t\t\t\t\t\t\t\t\t\tlocation: dest.location,\n\t\t\t\t\t\t\t\t\t\trail: outboundRail.rail,\n\t\t\t\t\t\t\t\t\t\tsupportedOperations: getProviderSupportedOperationsForRail(outboundRail.supportedOperations)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(pathNodes);\n\t\t\t\t}));\n\n\t\t\t\tconst allPaths = [];\n\n\t\t\t\tfor (const resolved of pathPromises) {\n\t\t\t\t\tif (resolved.status === 'rejected') {\n\t\t\t\t\t\tthis.logger?.debug('AnchorGraph::computeAssetMovementNodes', `error fetching nodes for ... TODO`, resolved.reason);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tallPaths.push(...resolved.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(allPaths);\n\t\t\t}));\n\n\t\t\treturn(pathNodesResult.flat());\n\t\t}));\n\n\t\treturn(providerResults.flat().filter((node): node is GraphNodeLike => !!node));\n\t}\n\n\tasync computeGraphNodes(): Promise<GraphNodeLike[]> {\n\t\tif (this.#graphNodePromise === null) {\n\t\t\tthis.#graphNodePromise = (async () => {\n\t\t\t\tconst receivedNodes = await Promise.all([\n\t\t\t\t\tthis.#computeFXNodes(),\n\t\t\t\t\tthis.#computeAssetMovementNodes()\n\t\t\t\t]);\n\n\t\t\t\treturn(receivedNodes.flat());\n\t\t\t})();\n\t\t}\n\n\t\treturn(await this.#graphNodePromise);\n\t}\n\n\tasync findPaths(input: AnchorChainingPathInput): Promise<GraphNodeLike[][]> {\n\t\tconst graph = await this.computeGraphNodes();\n\n\t\tconst nodesWithNext: { node: GraphNodeLike, next: number[] }[] = graph.map(function(node) {\n\t\t\treturn({ node, next: [] });\n\t\t});\n\n\t\tfor (const node of nodesWithNext) {\n\t\t\tfor (let secondNodeIdx = 0; secondNodeIdx < nodesWithNext.length; secondNodeIdx++) {\n\t\t\t\tconst nodeJ = nodesWithNext[secondNodeIdx];\n\t\t\t\tif (!nodeJ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// We can ignore chaining one fx anchor to itself\n\t\t\t\tif (node.node.type === 'fx') {\n\t\t\t\t\tif (node.node.type === nodeJ.node.type && node.node.providerID === nodeJ.node.providerID) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeSideSupports(node.node.to, nodeJ.node.from)) {\n\t\t\t\t\tnode.next.push(secondNodeIdx);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst paths: GraphNodeLike[][] = [];\n\n\t\tfunction getAssetLocationString(input: GraphNodeLike['to'], includeRail = false) {\n\t\t\tlet railStr = '';\n\t\t\tif (includeRail) {\n\t\t\t\trailStr = `#${input.rail}`;\n\t\t\t}\n\t\t\treturn(`${convertAssetSearchInputToCanonical(input.asset)}@${convertAssetLocationToString(input.location)}${railStr}`)\n\t\t}\n\n\t\tfunction dfs(\n\t\t\tcurrentIndex: number,\n\t\t\ttarget: AnchorChainingAssetAndLocation,\n\t\t\tvisitedAssets = new Set<string>(),\n\t\t\tpath: GraphNodeLike[] = []\n\t\t) {\n\t\t\tconst cur = nodesWithNext[currentIndex];\n\n\t\t\tif (!cur) {\n\t\t\t\tthrow(new Error(`Invalid node index: ${currentIndex}`));\n\t\t\t}\n\n\t\t\tconst assetLocationStr = getAssetLocationString(cur.node.from, true);\n\t\t\tif (visitedAssets.has(assetLocationStr)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvisitedAssets.add(assetLocationStr);\n\n\t\t\tconst newPath = [ ...path, cur.node ];\n\n\t\t\tif (nodeSideSupports(cur.node.to, target)) {\n\t\t\t\tpaths.push(newPath);\n\t\t\t}\n\n\t\t\tfor (const nextIndex of nodesWithNext[currentIndex]?.next ?? []) {\n\t\t\t\tdfs(nextIndex, target, visitedAssets, newPath);\n\t\t\t}\n\n\t\t\tvisitedAssets.delete(assetLocationStr);\n\t\t}\n\n\t\tfor (let index = 0; index < nodesWithNext.length; index++) {\n\t\t\tconst node = nodesWithNext[index];\n\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nodeSideSupports(node.node.from, input.source)) {\n\t\t\t\tdfs(index, input.destination);\n\t\t\t}\n\t\t}\n\n\t\treturn(paths);\n\t}\n\n\tasync resolveAssets(filter: AnchorChainingResolveAssetsFilter = {}): Promise<AnchorChainingResolveAssetsResult> {\n\t\tconst { from: fromFilterInput, to: toFilterInput, maxStepCount, onlyAllowFXLike } = filter;\n\n\t\tconst keetaNetworkLocation = `chain:keeta:${this.client.network}` satisfies AssetLocationLike;\n\n\t\t// When onlyAllowFXLike, default omitted locations to the Keeta network location\n\t\tconst fromFilter = (onlyAllowFXLike && fromFilterInput !== undefined && fromFilterInput.location === undefined)\n\t\t\t? { ...fromFilterInput, location: keetaNetworkLocation }\n\t\t\t: fromFilterInput;\n\t\tconst toFilter = (onlyAllowFXLike && toFilterInput !== undefined && toFilterInput.location === undefined)\n\t\t\t? { ...toFilterInput, location: keetaNetworkLocation }\n\t\t\t: toFilterInput;\n\n\t\tconst nodes = await this.computeGraphNodes();\n\n\t\t// Build forward (next) and backward (prev) adjacency in a single pass.\n\t\tconst nodesWithAdj: { node: GraphNodeLike; next: number[]; prev: number[] }[] = nodes.map(node => ({ node, next: [], prev: [] }));\n\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\tfor (let j = 0; j < nodesWithAdj.length; j++) {\n\t\t\t\tconst ni = nodesWithAdj[i];\n\t\t\t\tconst nj = nodesWithAdj[j];\n\t\t\t\tif (!ni || !nj) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during adjacency construction: ${i} or ${j}`));\n\t\t\t\t}\n\t\t\t\tif (ni.node.type === 'fx' && nj.node.type === 'fx' && ni.node.providerID === nj.node.providerID) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (nodeSideSupports(ni.node.to, nj.node.from)) {\n\t\t\t\t\tni.next.push(j);\n\t\t\t\t\tnj.prev.push(i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst sideMatchesFilter = (\n\t\t\tside: GraphNodeLike['from' | 'to'],\n\t\t\tf: AnchorChainingListAssetsSideFilter\n\t\t): boolean => {\n\t\t\tif (f.location !== undefined && convertAssetLocationToString(side.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(side.asset, f.asset)) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\tif (f.rail !== undefined && side.rail !== f.rail) {\n\t\t\t\treturn(false);\n\t\t\t}\n\t\t\treturn(true);\n\t\t};\n\n\t\t// Separate reachable sets and distance maps for backward (from) and forward (to) traversals.\n\t\tconst fromReachable = new Set<string>();\n\t\tconst fromDistances = new Map<string, number>();\n\t\tconst toReachable = new Set<string>();\n\t\tconst toDistances = new Map<string, number>();\n\n\t\tconst makeMarkFn = (reachable: Set<string>, distances: Map<string, number>) =>\n\t\t\t(side: GraphNodeLike['from' | 'to'], depth?: number) => {\n\t\t\t\tconst key = this.#assetLocationKey(side);\n\t\t\t\treachable.add(key);\n\t\t\t\tif (depth !== undefined) {\n\t\t\t\t\tconst existing = distances.get(key);\n\t\t\t\t\tif (existing === undefined || depth < existing) {\n\t\t\t\t\t\tdistances.set(key, depth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\tconst markFromReachable = makeMarkFn(fromReachable, fromDistances);\n\t\tconst markToReachable = makeMarkFn(toReachable, toDistances);\n\n\t\tconst bfs = (\n\t\t\tstartCondition: (item: (typeof nodesWithAdj)[number]) => boolean,\n\t\t\tadjacency: 'next' | 'prev',\n\t\t\tmarkSide: 'from' | 'to',\n\t\t\tmarkFn: (side: GraphNodeLike['from' | 'to'], depth: number) => void\n\t\t) => {\n\t\t\tconst nodeVisited = new Set<number>();\n\t\t\tconst queue: { nodeIdx: number; depth: number }[] = [];\n\t\t\tfor (let i = 0; i < nodesWithAdj.length; i++) {\n\t\t\t\tconst item = nodesWithAdj[i];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS initialization: ${i}`));\n\t\t\t\t}\n\t\t\t\tif (startCondition(item) && !nodeVisited.has(i)) {\n\t\t\t\t\tnodeVisited.add(i);\n\t\t\t\t\tqueue.push({ nodeIdx: i, depth: 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (queue.length > 0) {\n\t\t\t\tconst queueItem = queue.shift();\n\t\t\t\tif (!queueItem) {\n\t\t\t\t\tthrow(new Error(`Unexpected empty queue during BFS processing`));\n\t\t\t\t}\n\t\t\t\tconst { nodeIdx, depth } = queueItem;\n\t\t\t\tconst item = nodesWithAdj[nodeIdx];\n\t\t\t\tif (!item) {\n\t\t\t\t\tthrow(new Error(`Invalid node index during BFS processing: ${nodeIdx}`));\n\t\t\t\t}\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(item.node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tmarkFn(item.node[markSide], depth);\n\t\t\t\tif (maxStepCount === undefined || depth < maxStepCount) {\n\t\t\t\t\tfor (const neighborIdx of item[adjacency]) {\n\t\t\t\t\t\tif (!nodeVisited.has(neighborIdx)) {\n\t\t\t\t\t\t\tnodeVisited.add(neighborIdx);\n\t\t\t\t\t\t\tqueue.push({ nodeIdx: neighborIdx, depth: depth + 1 });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (fromFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.from, fromFilter), 'next', 'to', markToReachable);\n\t\t}\n\t\tif (toFilter) {\n\t\t\tbfs(item => sideMatchesFilter(item.node.to, toFilter), 'prev', 'from', markFromReachable);\n\t\t}\n\t\tif (!fromFilter && !toFilter) {\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (!onlyAllowFXLike || isFXLikeNode(node)) {\n\t\t\t\t\tmarkFromReachable(node.from);\n\t\t\t\t\tmarkFromReachable(node.to);\n\t\t\t\t\tmarkToReachable(node.from);\n\t\t\t\t\tmarkToReachable(node.to);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Second pass: build result maps by collecting inbound/outbound rails for every reachable\n\t\t// (asset, location) pair from ALL graph nodes, not just those on the traversal path.\n\t\tconst buildResultMap = (\n\t\t\treachable: Set<string>,\n\t\t\tdistances: Map<string, number>\n\t\t): Map<string, AnchorChainingAssetInfo> => {\n\t\t\tconst resultMap = new Map<string, AnchorChainingAssetInfo>();\n\t\t\tconst getOrCreate = (side: { asset: AnchorChainingAsset; location: AssetLocationLike }): AnchorChainingAssetInfo => {\n\t\t\t\tconst key = this.#assetLocationKey(side);\n\t\t\t\tlet resultObj = resultMap.get(key);\n\t\t\t\tif (!resultObj) {\n\t\t\t\t\tconst distanceValue = distances.get(key);\n\n\t\t\t\t\tresultObj = {\n\t\t\t\t\t\tasset: side.asset,\n\t\t\t\t\t\tlocation: side.location,\n\t\t\t\t\t\trails: { inbound: [], outbound: [] },\n\t\t\t\t\t\tdistance: distanceValue !== undefined ? { pathLength: distanceValue } : null\n\t\t\t\t\t};\n\n\t\t\t\t\tresultMap.set(key, resultObj);\n\t\t\t\t}\n\t\t\t\treturn(resultObj);\n\t\t\t};\n\t\t\tfor (const { node } of nodesWithAdj) {\n\t\t\t\tif (onlyAllowFXLike && !isFXLikeNode(node)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (reachable.has(this.#assetLocationKey(node.to))) {\n\t\t\t\t\tconst entry = getOrCreate(node.to);\n\t\t\t\t\tif (!entry.rails.inbound.includes(node.to.rail)) {\n\t\t\t\t\t\tentry.rails.inbound.push(node.to.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (reachable.has(this.#assetLocationKey(node.from))) {\n\t\t\t\t\tconst entry = getOrCreate(node.from);\n\t\t\t\t\tif (!entry.rails.outbound.includes(node.from.rail)) {\n\t\t\t\t\t\tentry.rails.outbound.push(node.from.rail);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn(resultMap);\n\t\t};\n\n\t\tconst fromResultMap = buildResultMap(fromReachable, fromDistances);\n\t\tconst toResultMap = buildResultMap(toReachable, toDistances);\n\n\t\t// When onlyAllowFXLike, exclude the filter asset from the result set so that\n\t\t// \"what can USDC be swapped to?\" doesn't include USDC itself via a round-trip.\n\t\tif (onlyAllowFXLike) {\n\t\t\tif (fromFilter?.asset !== undefined) {\n\t\t\t\ttoResultMap.delete(this.#assetLocationKey({ asset: fromFilter.asset, location: fromFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t\tif (toFilter?.asset !== undefined) {\n\t\t\t\tfromResultMap.delete(this.#assetLocationKey({ asset: toFilter.asset, location: toFilter.location ?? keetaNetworkLocation }));\n\t\t\t}\n\t\t}\n\n\t\tconst filterMap = (\n\t\t\tmap: Map<string, AnchorChainingAssetInfo>,\n\t\t\tf: AnchorChainingListAssetsSideFilter,\n\t\t\trailSide: 'inbound' | 'outbound'\n\t\t): AnchorChainingAssetInfo[] =>\n\t\t\tArray.from(map.values()).filter(info => {\n\t\t\t\tif (f.location !== undefined && convertAssetLocationToString(info.location) !== convertAssetLocationToString(f.location)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.asset !== undefined && !isAnchorChainingAssetEqual(info.asset, f.asset)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\tif (f.rail !== undefined && !info.rails[railSide].includes(f.rail)) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t\treturn(true);\n\t\t\t});\n\n\t\tconst fromAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(fromResultMap, fromFilter, 'outbound')\n\t\t\t: Array.from(fromResultMap.values());\n\t\tconst toAssets = (fromFilter !== undefined && toFilter !== undefined)\n\t\t\t? filterMap(toResultMap, toFilter, 'inbound')\n\t\t\t: Array.from(toResultMap.values());\n\n\t\treturn({ from: fromAssets, to: toAssets });\n\t}\n\n\tasync listAssets(filter: AnchorChainingListAssetsFilter = {}): Promise<AnchorChainingAssetInfo[]> {\n\t\tconst result = await this.resolveAssets(filter);\n\n\t\tif (filter.from) {\n\t\t\treturn(result.to);\n\t\t} else if (filter.to) {\n\t\t\treturn(result.from);\n\t\t} else {\n\t\t\treturn(result.to);\n\t\t}\n\t}\n\n\tasync getExternalAssetMetadata(\n\t\tasset: AnchorChainingAssetInfo['asset'],\n\t\tlocation: AnchorChainingAssetInfo['location'],\n\t\tproviderID?: string\n\t): Promise<AnchorTokenLocationMetadata | undefined> {\n\t\tif (!isExternalChainAsset(asset)) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst providers = await this.getAssetMovementProvidersForAsset(asset, location);\n\t\tif (!providers) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tif (providerID) {\n\t\t\tconst found = providers[providerID];\n\t\t\tif (!found) {\n\t\t\t\treturn(undefined);\n\t\t\t}\n\t\t\treturn(found.provider.getAssetMetadataForLocation(location, asset) ?? undefined);\n\t\t}\n\n\t\tfor (const { provider } of Object.values(providers)) {\n\t\t\tconst metadata = provider.getAssetMetadataForLocation(location, asset);\n\t\t\tif (metadata) {\n\t\t\t\treturn(metadata);\n\t\t\t}\n\t\t}\n\n\t\treturn(undefined);\n\t}\n\n\tasync #attachMetadata(\n\t\tassetInfo: AnchorChainingAssetInfo,\n\t\toptions?: AnchorChainingWithMetadataOptions\n\t): Promise<AnchorChainingAssetInfoWithMetadata> {\n\t\tconst metadata = await this.getExternalAssetMetadata(assetInfo.asset, assetInfo.location, options?.providerID);\n\t\tif (!metadata) {\n\t\t\treturn(assetInfo);\n\t\t}\n\t\treturn({ ...assetInfo, metadata });\n\t}\n\n\tasync resolveAssetsWithMetadata(\n\t\tfilter: AnchorChainingResolveAssetsFilter = {},\n\t\toptions?: AnchorChainingWithMetadataOptions\n\t): Promise<AnchorChainingResolveAssetsWithMetadataResult> {\n\t\tconst result = await this.resolveAssets(filter);\n\n\t\tconst [from, to] = await Promise.all([\n\t\t\tPromise.all(result.from.map((info) => this.#attachMetadata(info, options))),\n\t\t\tPromise.all(result.to.map((info) => this.#attachMetadata(info, options)))\n\t\t]);\n\n\t\treturn({ from, to });\n\t}\n\n\tasync listAssetsWithMetadata(\n\t\tfilter: AnchorChainingListAssetsFilter = {},\n\t\toptions?: AnchorChainingWithMetadataOptions\n\t): Promise<AnchorChainingAssetInfoWithMetadata[]> {\n\t\tconst result = await this.resolveAssetsWithMetadata(filter, options);\n\n\t\tif (filter.from) {\n\t\t\treturn(result.to);\n\t\t} else if (filter.to) {\n\t\t\treturn(result.from);\n\t\t} else {\n\t\t\treturn(result.to);\n\t\t}\n\t}\n}\n\nexport interface ComputePlanOptions {\n\toverrides?: AnchorChainingAccountOverrides;\n\t/**\n\t * Limit the number of plans to calculate, defaults to 3\n\t */\n\tlimit?: number;\n}\n\nexport class AnchorChainingPath {\n\treadonly request: AnchorChainingPathInput;\n\treadonly path: AnchorChainingStepLike[];\n\treadonly parent: AnchorChaining;\n\n\tconstructor(input: {\n\t\trequest: AnchorChainingPathInput;\n\t\tpath: AnchorChainingStepLike[];\n\t\tparent: AnchorChaining;\n\t}) {\n\t\tthis.request = input.request;\n\t\tthis.path = input.path;\n\t\tthis.parent = input.parent;\n\t}\n\n\tget logger(): Logger | undefined {\n\t\treturn(this.parent['logger']);\n\t}\n\n\tprotected async getAccountLike(action: GetAccountForActionPayload, override?: AccountLike): Promise<InstanceType<typeof KeetaNetLib.Account>> {\n\t\tlet found: InstanceType<typeof KeetaNetLib.Account> | undefined = undefined;\n\n\t\tif (this.parent['client'].account.isAccount()) {\n\t\t\tfound = this.parent['client'].account;\n\t\t} else if (this.parent['client'].signer !== null) {\n\t\t\tfound = this.parent['client'].signer;\n\t\t}\n\n\t\tif (override) {\n\t\t\tif (typeof override === 'function') {\n\t\t\t\tfound = await override(action);\n\t\t\t} else {\n\t\t\t\tfound = override;\n\t\t\t}\n\t\t}\n\n\t\tif (!found) {\n\t\t\tthrow(new Error(`Could not get account for ${action.type} action ${action.providerMethod}`));\n\t\t}\n\n\t\treturn(found);\n\t}\n\n\tprotected async getAccountsForAction(action: GetAccountForActionPayload, overrides?: AnchorChainingAccountOverrides): Promise<{ account: InstanceType<typeof KeetaNetLib.Account>; signer: InstanceType<typeof KeetaNetLib.Account> }> {\n\t\tconst [signer, account] = await Promise.all([\n\t\t\tthis.getAccountLike(action, overrides?.signer),\n\t\t\tthis.getAccountLike(action, overrides?.account)\n\t\t]);\n\n\t\treturn({ signer, account });\n\t}\n\n\tasync getProviderLegalDisclaimers(): Promise<PlanDisclaimers | null> {\n\t\tconst legalDisclaimerPromises: { key: string; promise: () => Promise<ProviderDisclaimers | null> }[] = [];\n\n\t\tfor (const step of this.path) {\n\t\t\tif (step.type === 'keetaSend') {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst key = `${step.type}:${step.providerID}`;\n\t\t\tif (legalDisclaimerPromises.find(entry => entry.key === key)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst promise = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet disclaimers: ProviderDisclaimers['disclaimers'] | null | undefined = null;\n\t\t\t\t\tif (step.type === 'assetMovement') {\n\t\t\t\t\t\tconst provider = await this.parent.graph.getAssetMovementProviderById(step.providerID);\n\t\t\t\t\t\tdisclaimers = provider?.getLegalDisclaimers();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdisclaimers = await this.parent.graph.fxClient.getLegalDisclaimersById(step.providerID);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!disclaimers) {\n\t\t\t\t\t\treturn(null);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn({ providerID: step.providerID, disclaimers });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger?.debug(`AnchorChainingPath::getProviderLegalDisclaimers`, `Error getting provider disclaimers for providerId: ${step.providerID}`, error);\n\t\t\t\t\tthrow(error)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlegalDisclaimerPromises.push({ key, promise });\n\t\t}\n\n\t\ttry {\n\t\t\tconst disclaimersOrNull = await Promise.all(legalDisclaimerPromises.map((entry) => entry.promise()));\n\t\t\tconst disclaimers = disclaimersOrNull.filter((entry) => entry !== null);\n\t\t\treturn(disclaimers);\n\t\t} catch (error) {\n\t\t\tthis.logger?.debug(`AnchorChainingPath::getProviderLegalDisclaimers`, 'Error getting legal disclaimers for path', error);\n\t\t\treturn(null);\n\t\t}\n\t}\n}\n\nexport class AnchorChainingPlan extends AnchorChainingPath {\n\t#_plan: AnchorChainingPathComputedPlan | null = null;\n\n\t#state: AnchorChainingPathState = { status: 'idle' };\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t#listeners = new Map<string, Set<((...args: any[]) => void)>>();\n\t#options: ComputePlanOptions | undefined = undefined;\n\n\tprivate constructor(path: AnchorChainingPath, options?: ComputePlanOptions) {\n\t\tsuper({ ...path });\n\t\tthis.#options = options;\n\t}\n\n\tget plan(): AnchorChainingPathComputedPlan {\n\t\tif (!this.#_plan) {\n\t\t\tthrow(new Error(`Steps have not been computed yet`));\n\t\t}\n\n\t\treturn(this.#_plan);\n\t}\n\n\tasync #computePlan() {\n\t\tif (this.#_plan) {\n\t\t\tthrow(new Error(`Steps have already been computed`));\n\t\t}\n\n\t\tconst sharedClientOptions = {\n\t\t\tresolver: this.parent['resolver'],\n\t\t\t...(this.parent['logger'] ? { logger: this.parent['logger'] } : {})\n\t\t} as const;\n\n\t\tconst fxClient = new KeetaFXAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tconst assetMovementClient = new KeetaAssetMovementAnchorClient(this.parent['client'], sharedClientOptions);\n\n\t\tlet affinityAndAmount: { affinity: 'to' | 'from'; amount: bigint } | undefined = undefined;\n\n\t\tif (this.request.source.value !== undefined && this.request.destination.value !== undefined) {\n\t\t\tthrow(new Error('Must have source.value or destination.value but not both'));\n\t\t} else if (this.request.source.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'from',\n\t\t\t\tamount: this.request.source.value\n\t\t\t}\n\t\t} else if (this.request.destination.value !== undefined) {\n\t\t\taffinityAndAmount = {\n\t\t\t\taffinity: 'to',\n\t\t\t\tamount: this.request.destination.value\n\t\t\t}\n\t\t} else {\n\t\t\tthrow(new Error('Must have source.value or destination.value'));\n\t\t}\n\n\t\tconst { affinity } = affinityAndAmount\n\n\t\tconst findInstruction = <R extends AssetTransferInstructions['type']>(allInstructions: AssetTransferInstructions[], type: R): Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\tconst found = allInstructions.find((instr): instr is Extract<AssetTransferInstructions, { type: R }> => {\n\t\t\t\treturn(instr.type === type);\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tthrow(new Error(`Expected to find instruction of type ${type} in next step's instructions`));\n\t\t\t}\n\n\t\t\treturn(found);\n\t\t};\n\n\t\t/**\n\t\t * Resolve persistent forwarding addresses for path steps whose source rail\n\t\t * cannot accept an initiated transfer.\n\t\t */\n\t\ttype ForwardedStepInfo = { provider: AssetMovementProvider; persistentAddress: KeetaPersistentForwardingAddressDetails };\n\t\tconst forwardedSteps = new Map<number, ForwardedStepInfo>();\n\t\tfor (let scanIndex = 0; scanIndex < this.path.length; scanIndex++) {\n\t\t\tconst scanStep = this.path[scanIndex];\n\t\t\tif (!scanStep || scanStep.type !== 'assetMovement') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * PFR is selected in two cases:\n\t\t\t * (a) the source rail explicitly cannot accept a managed transfer.\n\t\t\t * (b) the prior step is also an asset-movement step (AMP -> AMP\n\t\t\t * transition) and the source rail supports PFR.\n\t\t\t */\n\t\t\tconst priorStep = scanIndex > 0 ? this.path[scanIndex - 1] : null;\n\t\t\tconst isAmpToAmpTransition = priorStep?.type === 'assetMovement';\n\t\t\tconst pfrSupported = scanStep.from.supportedOperations?.createPersistentForwarding === true;\n\t\t\tconst initiateForbidden = scanStep.from.supportedOperations?.initiateTransfer === false;\n\n\t\t\tconst shouldUsePFR = initiateForbidden || (isAmpToAmpTransition && pfrSupported);\n\t\t\tif (!shouldUsePFR) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!pfrSupported) {\n\t\t\t\tthrow(new Error(`Asset movement provider ${scanStep.providerID} source rail ${scanStep.from.rail} at ${convertAssetLocationToString(scanStep.from.location)} declares initiateTransfer:false but does not support createPersistentForwarding`));\n\t\t\t}\n\n\t\t\tif (scanIndex !== this.path.length - 1) {\n\t\t\t\tthrow(new Error(`Persistent-forwarding (PersistentForwardingRelay-only) asset movement steps are currently only supported as the last step in a chain (step ${scanIndex} of ${this.path.length})`));\n\t\t\t}\n\n\t\t\tconst destinationAddress = this.request.destination.recipient;\n\t\t\tif (typeof destinationAddress !== 'string') {\n\t\t\t\tthrow(new Error(`Persistent-forwarding step at index ${scanIndex} requires the chain's destination recipient to be a resolved address string`));\n\t\t\t}\n\n\t\t\tconst forwardedAssetPair = { from: scanStep.from.asset, to: scanStep.to.asset };\n\t\t\tconst forwardedProviders = await assetMovementClient.getProvidersForTransfer(\n\t\t\t\t{ asset: forwardedAssetPair, from: scanStep.from.location, to: scanStep.to.location },\n\t\t\t\t{ providerIDs: [ scanStep.providerID ] }\n\t\t\t);\n\t\t\tif (!forwardedProviders?.[0] || forwardedProviders.length === 0) {\n\t\t\t\tthrow(new Error(`Could not get asset movement provider ${scanStep.providerID} for persistent-forwarding step at index ${scanIndex}`));\n\t\t\t}\n\n\t\t\tconst forwardedProvider = forwardedProviders[0];\n\t\t\tif (!await forwardedProvider.isOperationSupported('createPersistentForwarding')) {\n\t\t\t\tthrow(new Error(`Asset movement provider ${scanStep.providerID} does not support createPersistentForwarding, but the source rail ${scanStep.from.rail} at ${convertAssetLocationToString(scanStep.from.location)} requires it (initiateTransfer is unsupported)`));\n\t\t\t}\n\t\t\tif (!await forwardedProvider.isOperationSupported('simulateTransfer')) {\n\t\t\t\tthrow(new Error(`Asset movement provider ${scanStep.providerID} does not support simulateTransfer, which is required to compute valueOut for a persistent-forwarding step at ${convertAssetLocationToString(scanStep.from.location)}`));\n\t\t\t}\n\n\t\t\tconst { signer: forwardedSigner } = await this.getAccountsForAction({\n\t\t\t\ttype: 'assetMovement',\n\t\t\t\tproviderMethod: 'initiateTransfer',\n\t\t\t\tprovider: forwardedProvider\n\t\t\t}, this.#options?.overrides);\n\n\t\t\tlet persistentAddress: KeetaPersistentForwardingAddressDetails | undefined;\n\t\t\tif (await forwardedProvider.isOperationSupported('listPersistentForwarding')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existing = await forwardedProvider.listForwardingAddresses({\n\t\t\t\t\t\taccount: forwardedSigner,\n\t\t\t\t\t\tsearch: [{\n\t\t\t\t\t\t\tsourceLocation: scanStep.from.location,\n\t\t\t\t\t\t\tdestinationLocation: scanStep.to.location,\n\t\t\t\t\t\t\tasset: scanStep.from.asset,\n\t\t\t\t\t\t\tdestinationAddress\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Filter to the exact address this step requires.\n\t\t\t\t\t */\n\t\t\t\t\tconst sourceLocationString = convertAssetLocationToString(scanStep.from.location);\n\t\t\t\t\tconst destLocationString = convertAssetLocationToString(scanStep.to.location);\n\t\t\t\t\tconst match = existing.addresses.find(addr => {\n\t\t\t\t\t\tif (addr.destinationAddress !== destinationAddress) {\n\t\t\t\t\t\t\treturn(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!addr.sourceLocation || convertAssetLocationToString(addr.sourceLocation) !== sourceLocationString) {\n\t\t\t\t\t\t\treturn(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!addr.destinationLocation || convertAssetLocationToString(addr.destinationLocation) !== destLocationString) {\n\t\t\t\t\t\t\treturn(false);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn(true);\n\t\t\t\t\t});\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tpersistentAddress = match;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger?.debug('AnchorChainingPlan::computePlan', `listForwardingAddresses lookup failed for step ${scanIndex}, will create a new address`, error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!persistentAddress) {\n\t\t\t\tpersistentAddress = await forwardedProvider.createPersistentForwardingAddress({\n\t\t\t\t\taccount: forwardedSigner,\n\t\t\t\t\tsourceLocation: scanStep.from.location,\n\t\t\t\t\tdestinationLocation: scanStep.to.location,\n\t\t\t\t\tdestinationAddress,\n\t\t\t\t\tasset: forwardedAssetPair\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (typeof persistentAddress.address !== 'string') {\n\t\t\t\tthrow(new Error(`Persistent forwarding address for step ${scanIndex} is not a resolved string (got ${typeof persistentAddress.address})`));\n\t\t\t}\n\n\t\t\tforwardedSteps.set(scanIndex, { provider: forwardedProvider, persistentAddress });\n\t\t}\n\n\t\tconst stepPromises: Promise<ChainStepResolution>[] = [];\n\t\tconst resolvingSteps = new Set<number>();\n\t\tconst precomputedValueOuts = new Map<number, bigint>();\n\t\tconst resolveStep = async (index: number): Promise<ChainStepResolution> => {\n\t\t\tconst step = this.path[index];\n\n\t\t\tif (!step) {\n\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Detect cycles\n\t\t\t */\n\t\t\tif (resolvingSteps.has(index)) {\n\t\t\t\tthrow(new Error(`Cyclic dependency detected in resolveStep: step ${index} is already being resolved`));\n\t\t\t}\n\n\t\t\tlet promise: Promise<ChainStepResolution> | undefined = stepPromises[index];\n\n\t\t\tif (!promise) {\n\t\t\t\tresolvingSteps.add(index);\n\n\t\t\t\tpromise = (async (): Promise<ChainStepResolution> => {\n\t\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\t\tlet amount;\n\n\t\t\t\t\t\tif (affinity === 'from') {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tamount = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (affinity === 'to') {\n\t\t\t\t\t\t\tif (index === (this.path.length - 1)) {\n\t\t\t\t\t\t\t\t// XXX:TODO Move this to destination\n\t\t\t\t\t\t\t\tamount = affinityAndAmount.amount;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst next = await resolveStep(index + 1);\n\t\t\t\t\t\t\t\tamount = next.valueIn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst fxAccountOptions = await this.getAccountsForAction({\n\t\t\t\t\t\t\ttype: 'fx',\n\t\t\t\t\t\t\tproviderMethod: 'getAccountForAction'\n\t\t\t\t\t\t}, this.#options?.overrides);\n\n\t\t\t\t\t\tconst quotesOrEstimates = await fxClient.getQuotesOrEstimates(\n\t\t\t\t\t\t\t{ from: step.from.asset, to: step.to.asset, amount, affinity },\n\t\t\t\t\t\t\tfxAccountOptions,\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!quotesOrEstimates?.[0] || quotesOrEstimates.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get FX quote/estimate for provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = quotesOrEstimates[0];\n\n\t\t\t\t\t\tif (!result.isQuote && result.estimate.canPerformExchange === false) {\n\t\t\t\t\t\t\tthrow(new Error(`FX estimate from provider ${step.providerID} indicates exchange cannot be performed`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst convertedAmount = result.isQuote ? result.quote.convertedAmount : result.estimate.convertedAmount;\n\n\t\t\t\t\t\tlet valueIn;\n\t\t\t\t\t\tlet valueOut;\n\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tvalueOut = amount;\n\t\t\t\t\t\t\tvalueIn = convertedAmount;\n\t\t\t\t\t\t} else if (affinity === 'from') {\n\t\t\t\t\t\t\tvalueOut = convertedAmount;\n\t\t\t\t\t\t\tvalueIn = amount;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tassertNever(affinity);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({ type: 'fx', step, valueIn, valueOut, result });\n\t\t\t\t\t} else if (step.type === 'assetMovement') {\n\t\t\t\t\t\tif (affinity === 'to') {\n\t\t\t\t\t\t\tthrow(new Error(`Chaining with affinity 'to' is not currently supported for asset movement steps, as it requires looking up transfer quotes/estimates which is not currently implemented`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet depositValue: bigint;\n\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\tdepositValue = affinityAndAmount.amount;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst precomputedPrev = precomputedValueOuts.get(index - 1);\n\t\t\t\t\t\t\tif (precomputedPrev !== undefined) {\n\t\t\t\t\t\t\t\tdepositValue = precomputedPrev;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst previous = await resolveStep(index - 1);\n\t\t\t\t\t\t\t\tdepositValue = previous.valueOut;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst assetPair = { from: step.from.asset, to: step.to.asset };\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Forwarded step: prior step deposits into a pre-resolved persistent address.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst forwardedInfo = forwardedSteps.get(index);\n\t\t\t\t\t\tif (forwardedInfo) {\n\t\t\t\t\t\t\tconst { provider: forwardedProvider, persistentAddress } = forwardedInfo;\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * Best-effort plan-time valueOut: simulateTransfer if available,\n\t\t\t\t\t\t\t * otherwise assume no rail fee.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tlet estimatedValueOut = depositValue;\n\t\t\t\t\t\t\tif (await forwardedProvider.isOperationSupported('simulateTransfer')) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst { signer: forwardedSigner } = await this.getAccountsForAction({\n\t\t\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\t\t\tproviderMethod: 'initiateTransfer',\n\t\t\t\t\t\t\t\t\t\tprovider: forwardedProvider\n\t\t\t\t\t\t\t\t\t}, this.#options?.overrides);\n\t\t\t\t\t\t\t\t\tconst simulated = await forwardedProvider.simulateTransfer({\n\t\t\t\t\t\t\t\t\t\taccount: forwardedSigner,\n\t\t\t\t\t\t\t\t\t\tasset: assetPair,\n\t\t\t\t\t\t\t\t\t\tfrom: { location: step.from.location },\n\t\t\t\t\t\t\t\t\t\tto: { location: step.to.location },\n\t\t\t\t\t\t\t\t\t\tvalue: depositValue\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tconst simulatedInstruction = simulated.instructions.find((instr): instr is Extract<SimulatedAssetTransferInstructions, { type: typeof step.from.rail }> => instr.type === step.from.rail);\n\t\t\t\t\t\t\t\t\tlet simulatedTotalReceive: string | undefined;\n\t\t\t\t\t\t\t\t\tif (simulatedInstruction) {\n\t\t\t\t\t\t\t\t\t\tsimulatedTotalReceive = simulatedInstruction.totalReceiveAmount;\n\t\t\t\t\t\t\t\t\t\tif (simulatedTotalReceive === undefined && 'value' in simulatedInstruction) {\n\t\t\t\t\t\t\t\t\t\t\tsimulatedTotalReceive = simulatedInstruction.value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (simulatedTotalReceive !== undefined) {\n\t\t\t\t\t\t\t\t\t\testimatedValueOut = BigInt(simulatedTotalReceive);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\tthis.logger?.debug('AnchorChainingPlan::resolveStep', `simulateTransfer for forwarded step ${index} valueOut estimation failed; falling back to depositValue`, error);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\t\ttype: 'forwarded',\n\t\t\t\t\t\t\t\tstep,\n\t\t\t\t\t\t\t\tvalueIn: depositValue,\n\t\t\t\t\t\t\t\tvalueOut: estimatedValueOut,\n\t\t\t\t\t\t\t\tpersistentAddress,\n\t\t\t\t\t\t\t\tprovider: forwardedProvider\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst providers = await assetMovementClient.getProvidersForTransfer(\n\t\t\t\t\t\t\t{ asset: assetPair, from: step.from.location, to: step.to.location },\n\t\t\t\t\t\t\t{ providerIDs: [ step.providerID ] }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!providers?.[0] || providers.length === 0) {\n\t\t\t\t\t\t\tthrow(new Error(`Could not get asset movement provider ${step.providerID}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst provider = providers[0];\n\n\t\t\t\t\t\tconst { signer } = await this.getAccountsForAction({\n\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\tproviderMethod: 'initiateTransfer',\n\t\t\t\t\t\t\tprovider\n\t\t\t\t\t\t}, this.#options?.overrides);\n\n\t\t\t\t\t\tlet resolvedRecipient: RecipientResolved | GenericAccount;\n\t\t\t\t\t\tlet sendingToType: SendingToType;\n\n\t\t\t\t\t\tif (index === this.path.length - 1) {\n\t\t\t\t\t\t\tresolvedRecipient = this.request.destination.recipient;\n\t\t\t\t\t\t\tsendingToType = 'FINAL_DESTINATION';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsendingToType = 'NEXT_STEP';\n\n\t\t\t\t\t\t\tconst nextPathStep = this.path[index + 1];\n\n\t\t\t\t\t\t\tif (!nextPathStep) {\n\t\t\t\t\t\t\t\tthrow(new Error(`Expected next step at index ${index + 1} for asset movement step at index ${index}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * Next step is forwarded: recipient is its persistent address,\n\t\t\t\t\t\t\t * no need to resolve the next step's instructions.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tconst nextForwardedInfo = forwardedSteps.get(index + 1);\n\t\t\t\t\t\t\tif (nextForwardedInfo) {\n\t\t\t\t\t\t\t\tconst pfiAddress = nextForwardedInfo.persistentAddress.address;\n\t\t\t\t\t\t\t\tif (typeof pfiAddress !== 'string') {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Persistent forwarding address for next step ${index + 1} is not a resolved string`));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tresolvedRecipient = pfiAddress;\n\t\t\t\t\t\t\t} else if (nextPathStep.from.location === `chain:keeta:${this.parent['client'].network}`) {\n\t\t\t\t\t\t\t\tconst { account } = await this.getAccountsForAction({\n\t\t\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\t\t\tproviderMethod: 'initiateTransfer'\n\t\t\t\t\t\t\t\t}, this.#options?.overrides);\n\n\t\t\t\t\t\t\t\t// Store funds in-transit in the account instead of forwarding directly to provider.\n\t\t\t\t\t\t\t\tresolvedRecipient = account;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * If the provider does not support simulateTransfer,\n\t\t\t\t\t\t\t\t * we cannot chain to this step.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tif (!await provider.isOperationSupported('simulateTransfer')) {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Asset movement provider ${step.providerID} does not support simulateTransfer, which is required for chaining at non-keeta intermediate location ${convertAssetLocationToString(nextPathStep.from.location)}`));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst simulated = await provider.simulateTransfer({\n\t\t\t\t\t\t\t\t\taccount: signer,\n\t\t\t\t\t\t\t\t\tasset: assetPair,\n\t\t\t\t\t\t\t\t\tfrom: { location: step.from.location },\n\t\t\t\t\t\t\t\t\tto: { location: step.to.location },\n\t\t\t\t\t\t\t\t\tvalue: depositValue\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tconst simulatedInstruction = simulated.instructions.find((instr): instr is Extract<SimulatedAssetTransferInstructions, { type: typeof step.from.rail }> => instr.type === step.from.rail);\n\t\t\t\t\t\t\t\tif (!simulatedInstruction) {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Simulated transfer for step ${index} did not return an instruction matching rail ${step.from.rail}`));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlet simulatedTotalReceive: string | undefined = simulatedInstruction.totalReceiveAmount;\n\t\t\t\t\t\t\t\tif (simulatedTotalReceive === undefined && 'value' in simulatedInstruction) {\n\t\t\t\t\t\t\t\t\tsimulatedTotalReceive = simulatedInstruction.value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (simulatedTotalReceive === undefined) {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`totalReceiveAmount must be defined for simulated transfer when chaining`));\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tprecomputedValueOuts.set(index, BigInt(simulatedTotalReceive));\n\n\t\t\t\t\t\t\t\tconst nextStep = await resolveStep(index + 1);\n\n\t\t\t\t\t\t\t\tif (nextStep.type === 'assetMovement' || nextStep.type === 'keetaSend') {\n\t\t\t\t\t\t\t\t\tif (nextStep.usingInstruction.type !== step.to.rail) {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Next step's usingInstruction type ${nextStep.usingInstruction.type} does not match expected ${step.to.rail} for recipient resolution`));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst foundInstruction = nextStep.usingInstruction;\n\n\t\t\t\t\t\t\t\t\tconst isFiatPushRailFoundInstruction = (input: AssetTransferInstructions | SimulatedAssetTransferInstructions): input is Extract<AssetTransferInstructions, { type: FiatPushRails; }> => {\n\t\t\t\t\t\t\t\t\t\treturn(isFiatRail(input.type));\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (foundInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to KEETA_SEND step, as this implies multiple keeta locations in the path which is not currently supported`));\n\t\t\t\t\t\t\t\t\t} else if (isFiatPushRailFoundInstruction(foundInstruction)) {\n\t\t\t\t\t\t\t\t\t\tif (foundInstruction.depositMessage) {\n\t\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Deposit message outbound is not currently supported for chaining`));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tresolvedRecipient = foundInstruction.account;\n\t\t\t\t\t\t\t\t\t} else if (foundInstruction.type === 'EVM_SEND') {\n\t\t\t\t\t\t\t\t\t\tresolvedRecipient = foundInstruction.sendToAddress;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthrow(new Error(`Unsupported rail for chaining: ${step.to.rail}`));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (nextStep.type === 'fx') {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Cannot currently chain from asset movement to fx step, as fx step does not have recipient information`));\n\t\t\t\t\t\t\t\t} else if (nextStep.type === 'forwarded') {\n\t\t\t\t\t\t\t\t\tthrow(new Error(`Internal invariant violation: forwarded step at index ${index + 1} reached simulate-cycle-break path; expected nextForwardedInfo branch to have handled it`));\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tassertNever(nextStep);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst recipientString = KeetaNet.lib.Account.isInstance(resolvedRecipient)\n\t\t\t\t\t\t\t? resolvedRecipient.publicKeyString.get()\n\t\t\t\t\t\t\t: resolvedRecipient;\n\n\t\t\t\t\t\tconst transfer = await provider.initiateTransfer({\n\t\t\t\t\t\t\taccount: signer,\n\t\t\t\t\t\t\tasset: assetPair,\n\t\t\t\t\t\t\tfrom: { location: step.from.location },\n\t\t\t\t\t\t\tto: {\n\t\t\t\t\t\t\t\tlocation: step.to.location,\n\t\t\t\t\t\t\t\trecipient: recipientString\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvalue: depositValue\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst usingInstruction = findInstruction(transfer.instructions, step.from.rail);\n\n\t\t\t\t\t\tlet totalReceiveAmount: string | undefined = usingInstruction.totalReceiveAmount;\n\t\t\t\t\t\tif (totalReceiveAmount === undefined && 'value' in usingInstruction) {\n\t\t\t\t\t\t\ttotalReceiveAmount = usingInstruction.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (totalReceiveAmount === undefined) {\n\t\t\t\t\t\t\tthrow(new Error(`totalReceiveAmount must be defined for chaining`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst actualValueOut = BigInt(totalReceiveAmount);\n\n\t\t\t\t\t\t// If we simulated to break a cycle, the next step's initiateTransfer was\n\t\t\t\t\t\t// keyed off the simulated valueOut; a mismatch here means the next step\n\t\t\t\t\t\t// is now misaligned, so fail at plan-time instead of letting execute() catch it.\n\t\t\t\t\t\tconst simulatedValueOut = precomputedValueOuts.get(index);\n\t\t\t\t\t\tif (simulatedValueOut !== undefined && simulatedValueOut !== actualValueOut) {\n\t\t\t\t\t\t\tthrow(new Error(`Simulated valueOut ${simulatedValueOut} for step ${index} does not match actual ${actualValueOut} from initiateTransfer`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'assetMovement',\n\t\t\t\t\t\t\tstep,\n\t\t\t\t\t\t\tvalueIn: depositValue,\n\t\t\t\t\t\t\tusingInstruction: usingInstruction,\n\t\t\t\t\t\t\ttransfer: transfer,\n\t\t\t\t\t\t\tsendingTo: sendingToType,\n\t\t\t\t\t\t\tvalueOut: actualValueOut\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\tif (this.path.length !== 1) {\n\t\t\t\t\t\t\tthrow(new Error(`Direct same-location/same-asset send steps must be the only step in the path`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!KeetaNet.lib.Account.isInstance(step.from.asset) || !KeetaNet.lib.Account.isInstance(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected assets to be token accounts for KEETA_SEND rail`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!step.from.asset.comparePublicKey(step.to.asset)) {\n\t\t\t\t\t\t\tthrow(new Error(`For KEETA_SEND step, from and to asset must be the same account`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet keetaRecipientDestination = null;\n\t\t\t\t\t\tif (KeetaNet.lib.Account.isInstance(this.request.destination.recipient)) {\n\t\t\t\t\t\t\tkeetaRecipientDestination = this.request.destination.recipient;\n\t\t\t\t\t\t} else if (typeof this.request.destination.recipient === 'string') {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tkeetaRecipientDestination = KeetaNet.lib.Account.fromPublicKeyString(this.request.destination.recipient);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t/* ignore errors */\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!keetaRecipientDestination) {\n\t\t\t\t\t\t\tthrow(new Error(`Expected destination recipient to be a public key string for KEETA_SEND step`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\ttype: 'keetaSend',\n\t\t\t\t\t\t\tstep: null,\n\t\t\t\t\t\t\tvalueIn: affinityAndAmount.amount,\n\t\t\t\t\t\t\tvalueOut: affinityAndAmount.amount,\n\t\t\t\t\t\t\tusingInstruction: {\n\t\t\t\t\t\t\t\ttype: 'KEETA_SEND',\n\t\t\t\t\t\t\t\ttokenAddress: step.to.asset.publicKeyString.get(),\n\t\t\t\t\t\t\t\tsendToAddress: keetaRecipientDestination.publicKeyString.get(),\n\t\t\t\t\t\t\t\ttotalReceiveAmount: affinityAndAmount.amount.toString(),\n\t\t\t\t\t\t\t\tlocation: `chain:keeta:${this.parent['client'].network}`,\n\t\t\t\t\t\t\t\tvalue: String(affinityAndAmount.amount),\n\t\t\t\t\t\t\t\tassetFee: '0'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\tpromise.then(() => resolvingSteps.delete(index), () => resolvingSteps.delete(index));\n\t\t\t\tstepPromises[index] = promise;\n\t\t\t}\n\n\t\t\treturn(await promise);\n\t\t}\n\n\t\tconst steps = [];\n\t\tfor (let index = 0; index < this.path.length; index++) {\n\t\t\tsteps.push(await resolveStep(index));\n\t\t}\n\n\t\t// Direct same-location/same-asset send: no provider steps needed.\n\t\tif (steps.length === 0) {\n\t\t\treturn({\n\t\t\t\tsteps: [],\n\t\t\t\ttotalValueIn: affinityAndAmount.amount,\n\t\t\t\ttotalValueOut: affinityAndAmount.amount\n\t\t\t});\n\t\t}\n\n\t\tconst firstStep = steps[0];\n\t\tconst lastStep = steps[steps.length - 1];\n\n\t\tif (!firstStep || !lastStep) {\n\t\t\tthrow(new Error(`Steps array is empty`));\n\t\t}\n\n\t\tif (affinity === 'from') {\n\t\t\tif (firstStep.valueIn !== this.request.source.value) {\n\t\t\t\tthrow(new Error(`Computed valueIn for first step ${firstStep.valueIn} does not match request source value ${this.request.source.value}`));\n\t\t\t}\n\t\t} else if (affinity === 'to') {\n\t\t\tif (lastStep.valueOut !== this.request.destination.value) {\n\t\t\t\tthrow(new Error(`Computed valueOut for last step ${lastStep.valueOut} does not match requested destination value ${this.request.destination.value}`));\n\t\t\t}\n\t\t}\n\n\t\tif (lastStep.valueOut <= 0n) {\n\t\t\tthrow(new Error(`Computed valueOut for last step must be greater than 0, got ${lastStep.valueOut}`));\n\t\t}\n\n\t\treturn({\n\t\t\tsteps,\n\t\t\ttotalValueIn: firstStep.valueIn,\n\t\t\ttotalValueOut: lastStep.valueOut\n\t\t});\n\t}\n\n\tstatic async create(path: AnchorChainingPath, options?: ComputePlanOptions): Promise<AnchorChainingPlan> {\n\t\tconst instance = new this(path, options);\n\t\tinstance.#_plan = await instance.#computePlan();\n\t\treturn(instance);\n\t}\n\n\tget state(): AnchorChainingPathState {\n\t\treturn(this.#state);\n\t}\n\n\ton<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tlet listenerSet = this.#listeners.get(event);\n\t\tif (!listenerSet) {\n\t\t\tlistenerSet = new Set();\n\t\t\tthis.#listeners.set(event, listenerSet);\n\t\t}\n\t\tlistenerSet.add(listener);\n\t}\n\n\toff<E extends keyof AnchorChainingPathEventMap>(event: E, listener: (...args: AnchorChainingPathEventMap[E]) => void): void {\n\t\tthis.#listeners.get(event)?.delete(listener);\n\t}\n\n\t#setState(state: AnchorChainingPathState): void {\n\t\tthis.#state = state;\n\t\tthis.#emit('stateChange', state);\n\t}\n\n\tget logger(): Logger | undefined {\n\t\treturn(this.parent['logger']);\n\t}\n\n\t#emit<E extends keyof AnchorChainingPathEventMap>(event: E, ...args: AnchorChainingPathEventMap[E]): { sendCount: number; } {\n\t\tlet sendCount = 0;\n\n\t\tfor (const listener of (this.#listeners.get(event) ?? [])) {\n\t\t\ttry {\n\t\t\t\tlistener(...args);\n\t\t\t\tsendCount++;\n\t\t\t} catch (err) {\n\t\t\t\tthis.logger?.debug(`AnchorChainingPath::emit`, `Error in listener for event '${event}'`, err);\n\t\t\t}\n\t\t}\n\n\t\treturn({ sendCount });\n\t}\n\n\tasync #awaitStepCompletion<\n\t\tType extends StepNeededActionEventPayload['type'],\n\t\tRet extends Parameters<Extract<StepNeededActionEventPayload, { action: { type: Type }}>['markCompleted']>\n\t>(step: Pick<Extract<StepNeededActionEventPayload, { type: Type }>, 'action' | 'type'>): Promise<Ret> {\n\t\tlet didComplete = false;\n\n\t\tfunction assertDidNotComplete() {\n\t\t\tif (didComplete) {\n\t\t\t\tthrow(new Error(`Step was already marked as completed or failed`));\n\t\t\t}\n\n\t\t\tdidComplete = true;\n\t\t}\n\n\t\tlet resolveFn: undefined | StepNeededActionEventPayload['markCompleted'];\n\t\tlet rejectFn: undefined | StepNeededActionEventPayload['markFailed'];\n\n\t\tconst promise = new Promise<Ret>(function(resolve, reject) {\n\t\t\tresolveFn = (...args: Ret) => {\n\t\t\t\tassertDidNotComplete();\n\t\t\t\tresolve(args);\n\t\t\t};\n\n\t\t\trejectFn = (error) => {\n\t\t\t\tassertDidNotComplete();\n\n\t\t\t\tlet usingErr = error;\n\t\t\t\tif (!usingErr) {\n\t\t\t\t\tusingErr = new Error(`Step marked as failed without error`);\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n\t\t\t\treject(usingErr);\n\t\t\t}\n\t\t});\n\n\t\tif (!resolveFn || !rejectFn) {\n\t\t\tthrow(new Error(`Failed to create step completion promise`));\n\t\t}\n\n\t\t// Typescript Cannot infer the correct payload type for the stepNeedsAction event, so we have to assert it here. We ensure type safety by constraining the step parameter to the correct action type, which guarantees that the payload will match the expected structure for that action type.\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst { sendCount } = this.#emit('stepNeedsAction', {\n\t\t\t...step,\n\t\t\tmarkCompleted: resolveFn,\n\t\t\tmarkFailed: rejectFn\n\t\t} as Extract<StepNeededActionEventPayload, { action: { type: Type }}>);\n\n\t\tif (sendCount === 0) {\n\t\t\tthrow(new Error(`No listeners for stepNeedsAction event, but a step (actionType=${step.type}) is awaiting completion`));\n\t\t}\n\n\t\treturn(await promise);\n\t}\n\n\tasync #authorizedSend(options: Pick<AnchorChainingPathExecuteOptions, 'requireSendAuth'> | undefined, sendToAddress: string | GenericAccount, value: bigint, token: TokenAddress | string, external?: string): Promise<void> {\n\t\tif (options?.requireSendAuth) {\n\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\ttype: 'keetaSendAuthRequired',\n\t\t\t\taction: {\n\t\t\t\t\tsendToAddress: KeetaNet.lib.Account.toAccount(sendToAddress),\n\t\t\t\t\tvalue,\n\t\t\t\t\ttoken: KeetaNet.lib.Account.toAccount(token).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t...(external !== undefined ? { external } : {})\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst { account } = await this.getAccountsForAction({ type: 'assetMovement', providerMethod: 'initiateTransfer' }, this.#options?.overrides);\n\t\tawait this.parent['client'].send(sendToAddress, value, token, external, { account });\n\t}\n\n\tasync #pollTransferStatus(\n\t\ttransfer: AssetMovementTransfer,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number; abortSignal?: AbortSignal; }\n\t): Promise<Awaited<ReturnType<AssetMovementTransfer['getTransferStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tif (options?.abortSignal?.aborted) {\n\t\t\t\tthrow(new Error(`Aborted while waiting for transfer ${transfer.transferId} to complete`));\n\t\t\t}\n\n\t\t\tconst status = await transfer.getTransferStatus();\n\t\t\tif (status.transaction.status === 'COMPLETE') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for transfer ${transfer.transferId} to complete`));\n\t\t\t}\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\t/**\n\t * Wait for the forwarded transfer the bridge creates after observing the\n\t * prior step's withdraw deposit in the persistent-forwarding address.\n\t */\n\tasync #pollForwardedTransaction(\n\t\tstep: ChainStepResolutionForwarded,\n\t\tsourceTransaction: { location: AssetLocationLike; transaction: { id: string }},\n\t\toptions?: { intervalMs?: number; timeoutMs?: number; abortSignal?: AbortSignal; }\n\t): Promise<KeetaAssetMovementTransaction> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\tconst { provider, persistentAddress } = step;\n\t\tconst pfiAddress = persistentAddress.address;\n\t\tif (typeof pfiAddress !== 'string') {\n\t\t\tthrow(new Error(`Persistent forwarding address must be a resolved string`));\n\t\t}\n\n\t\tconst { account } = await this.getAccountsForAction({\n\t\t\ttype: 'assetMovement',\n\t\t\tproviderMethod: 'initiateTransfer',\n\t\t\tprovider\n\t\t}, this.#options?.overrides);\n\n\t\twhile (true) {\n\t\t\tif (options?.abortSignal?.aborted) {\n\t\t\t\tthrow(new Error(`Aborted while waiting for forwarded transaction at ${pfiAddress} correlated to source tx ${sourceTransaction.transaction.id}`));\n\t\t\t}\n\n\t\t\tlet transactions: KeetaAssetMovementTransaction[] = [];\n\t\t\ttry {\n\t\t\t\tconst response = await provider.listTransactions({\n\t\t\t\t\taccount,\n\t\t\t\t\tpersistentAddresses: [{\n\t\t\t\t\t\tlocation: step.step.from.location,\n\t\t\t\t\t\tpersistentAddress: pfiAddress\n\t\t\t\t\t}],\n\t\t\t\t\ttransactions: [ sourceTransaction ]\n\t\t\t\t});\n\n\t\t\t\ttransactions = response.transactions;\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger?.debug('AnchorChainingPlan::pollForwardedTransaction', `listTransactions failed for PersistentForwardingRelay address ${pfiAddress}`, error);\n\t\t\t}\n\n\t\t\tconst candidate = transactions.find(tx => tx.status === 'COMPLETE');\n\t\t\tif (candidate) {\n\t\t\t\treturn(candidate);\n\t\t\t}\n\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for persistent-forwarding transaction at ${pfiAddress} correlated to source tx ${sourceTransaction.transaction.id}`));\n\t\t\t}\n\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync #pollExchangeStatus(\n\t\texchange: FXExchange,\n\t\toptions?: { intervalMs?: number; timeoutMs?: number; abortSignal?: AbortSignal; }\n\t): Promise<Awaited<ReturnType<FXExchange['getExchangeStatus']>>> {\n\t\tconst intervalMs = options?.intervalMs ?? 2000;\n\t\tconst timeoutMs = options?.timeoutMs ?? 300_000;\n\t\tconst deadline = Date.now() + timeoutMs;\n\n\t\twhile (true) {\n\t\t\tif (options?.abortSignal?.aborted) {\n\t\t\t\tthrow(new Error(`Aborted while waiting for FX exchange ${exchange.exchange.exchangeID} to complete`));\n\t\t\t}\n\n\t\t\tconst status = await exchange.getExchangeStatus();\n\t\t\tif (status.status === 'completed') {\n\t\t\t\treturn(status);\n\t\t\t}\n\t\t\tif (status.status === 'failed') {\n\t\t\t\tthrow(new Error(`FX exchange ${exchange.exchange.exchangeID} failed`));\n\t\t\t}\n\t\t\tif (Date.now() >= deadline) {\n\t\t\t\tthrow(new Error(`Timed out waiting for FX exchange ${exchange.exchange.exchangeID} to complete`));\n\t\t\t}\n\n\t\t\tawait KeetaNet.lib.Utils.Helper.asleep(intervalMs);\n\t\t}\n\t}\n\n\tasync execute(options?: { requireSendAuth?: boolean; abortSignal?: AbortSignal; }): Promise<AnchorChainingPathExecuteResult> {\n\t\tif (this.#state.status !== 'idle') {\n\t\t\tthrow(new Error(`Cannot execute: path is already in state \"${this.#state.status}\"`));\n\t\t}\n\n\t\tconst executedSteps: ExecutedStep[] = [];\n\t\tthis.#setState({ status: 'executing', completedSteps: [], currentStepIndex: 0 });\n\n\t\t/*\n\t\t * Actual output value from each completed step, used for equality checking.\n\t\t */\n\t\tlet prevActualValueOut: bigint | null = null;\n\n\t\t/**\n\t\t * Source-tx anchor for the next forwarded step's poll. Populated only\n\t\t * when the prior step is an asset-movement transfer that produced a\n\t\t * withdraw transaction on its destination chain; reset for any step\n\t\t * type that cannot deposit into a persistent-forwarding address.\n\t\t */\n\t\tlet prevWithdrawTx: { location: AssetLocationLike; transaction: { id: string }} | null = null;\n\n\t\tlet index = 0;\n\t\ttry {\n\t\t\tfor (index = 0; index < this.plan.steps.length; index++) {\n\t\t\t\tif (options?.abortSignal?.aborted) {\n\t\t\t\t\tthrow(new Error(`Execution aborted`));\n\t\t\t\t}\n\n\t\t\t\tconst onStepCompleted = (step: ExecutedStep) => {\n\t\t\t\t\texecutedSteps.push(step);\n\t\t\t\t\tthis.#emit('stepExecuted', step, index);\n\t\t\t\t}\n\n\t\t\t\tthis.#setState({ status: 'executing', completedSteps: [...executedSteps], currentStepIndex: index });\n\n\t\t\t\tconst step = this.plan.steps[index];\n\n\t\t\t\tif (!step) {\n\t\t\t\t\tthrow(new Error(`Step ${index} is not defined`));\n\t\t\t\t}\n\n\t\t\t\t// Verify the actual output from the previous step matches the expected\n\t\t\t\t// input for this step. A mismatch indicates a provider delivered a\n\t\t\t\t// different amount than was negotiated in computeSteps.\n\t\t\t\tif (index > 0 && prevActualValueOut !== null) {\n\t\t\t\t\tif (prevActualValueOut !== step.valueIn) {\n\t\t\t\t\t\tif (prevActualValueOut < step.valueIn) {\n\t\t\t\t\t\t\tthrow(new Error(`Execution failed at step ${index} due to value mismatch: expected at least ${step.valueIn} but previous step produced ${prevActualValueOut}`));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.logger?.debug(`AnchorChainingPlan::execute`, `Value mismatch at step ${index} is non-critical since previous step produced more (${prevActualValueOut}) than expected (${step.valueIn}), proceeding with execution`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (step.type === 'fx') {\n\t\t\t\t\tconst exchange = await step.result.createExchange();\n\t\t\t\t\tawait this.#pollExchangeStatus(exchange);\n\t\t\t\t\tprevActualValueOut = step.valueOut;\n\t\t\t\t\tprevWithdrawTx = null;\n\t\t\t\t\tonStepCompleted({ type: 'fx', plan: step, exchange });\n\t\t\t\t} else if (step.type === 'forwarded') {\n\t\t\t\t\tif (!prevWithdrawTx) {\n\t\t\t\t\t\tthrow(new Error(`Forwarded step at index ${index} requires the prior step to produce a withdraw transaction on its destination chain`));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst observed = await this.#pollForwardedTransaction(step, prevWithdrawTx, {\n\t\t\t\t\t\t...(options?.abortSignal ? { abortSignal: options.abortSignal } : {})\n\t\t\t\t\t});\n\t\t\t\t\tprevActualValueOut = BigInt(observed.to.value);\n\t\t\t\t\tprevWithdrawTx = null;\n\t\t\t\t\tonStepCompleted({ type: 'forwarded', plan: step, observedTransaction: observed });\n\t\t\t\t} else if (step.type === 'assetMovement' || step.type === 'keetaSend') {\n\t\t\t\t\tif (step.usingInstruction.type === 'KEETA_SEND') {\n\t\t\t\t\t\tawait this.#authorizedSend(\n\t\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\tstep.usingInstruction.sendToAddress,\n\t\t\t\t\t\t\tBigInt(step.usingInstruction.value),\n\t\t\t\t\t\t\tKeetaNet.lib.Account.fromPublicKeyString(step.usingInstruction.tokenAddress).assertKeyType(KeetaNet.lib.Account.AccountKeyAlgorithm.TOKEN),\n\t\t\t\t\t\t\tstep.usingInstruction.external\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (index === 0) {\n\t\t\t\t\t\tif (step.type !== 'assetMovement') {\n\t\t\t\t\t\t\tthrow(new Error(`Unexpected asset movement step at index ${index} for user-initiated transfer`));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait this.#awaitStepCompletion({\n\t\t\t\t\t\t\ttype: 'assetMovementUserExecutionRequired',\n\t\t\t\t\t\t\taction: {\n\t\t\t\t\t\t\t\tassetMovementTransfer: step.transfer\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (step.usingInstruction.type === 'EVM_SEND') {\n\t\t\t\t\t\t/* For EVM Sends for now we assume the last step sent to this address */\n\t\t\t\t\t\tthis.logger?.debug(`AnchorChainingPlan::execute`, `Executing EVM_SEND instruction for step ${index} by sending to address ${step.usingInstruction.sendToAddress} with value ${step.usingInstruction.value} and token ${step.usingInstruction.tokenAddress}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new Error(`Unsupported instruction type ${step.usingInstruction.type} for user-initiated transfer at step ${index}`));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (step.type === 'assetMovement') {\n\t\t\t\t\t\tconst status = await this.#pollTransferStatus(step.transfer, {\n\t\t\t\t\t\t\t...(options?.abortSignal ? { abortSignal: options.abortSignal } : {})\n\t\t\t\t\t\t});\n\t\t\t\t\t\tprevActualValueOut = BigInt(status.transaction.to.value);\n\t\t\t\t\t\tconst withdraw = status.transaction.to.transactions.withdraw;\n\t\t\t\t\t\tif (withdraw) {\n\t\t\t\t\t\t\tprevWithdrawTx = {\n\t\t\t\t\t\t\t\tlocation: step.step.to.location,\n\t\t\t\t\t\t\t\ttransaction: { id: withdraw.id }\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprevWithdrawTx = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonStepCompleted({ type: 'assetMovement', plan: step });\n\t\t\t\t\t} else if (step.type === 'keetaSend') {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Direct Keeta send: optimistically treat as completed since\n\t\t\t\t\t\t * there is no provider transfer to poll. Cannot feed a forwarded\n\t\t\t\t\t\t * step because it does not produce a bridge withdraw.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tprevActualValueOut = step.valueIn;\n\t\t\t\t\t\tprevWithdrawTx = null;\n\t\t\t\t\t\tonStepCompleted({ type: 'keetaSend', plan: step });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(step);\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tassertNever(step);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Direct same-location/same-asset send: the loop ran zero iterations,\n\t\t\t// so just publish the on-chain transfer directly.\n\t\t\tif (this.path.length === 0) {\n\t\t\t\tconst sendValue = this.request.source.value ?? this.request.destination.value;\n\t\t\t\tif (!sendValue) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a value for source or destination`));\n\t\t\t\t}\n\n\t\t\t\tif (!KeetaNet.lib.Account.isInstance(this.request.source.asset)) {\n\t\t\t\t\tthrow(new Error(`Direct send requires a Keeta token address as the source asset`));\n\t\t\t\t}\n\t\t\t\tconst recipient = this.request.destination.recipient;\n\t\t\t\tif (typeof recipient !== 'string') {\n\t\t\t\t\tthrow(new Error(`Direct Keeta send requires a crypto address as the recipient`));\n\t\t\t\t}\n\t\t\t\tawait this.#authorizedSend(options, recipient, sendValue, this.request.source.asset);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\tthis.#setState({ status: 'failed', error, completedSteps: [...executedSteps], failedAtStepIndex: index });\n\t\t\tthis.#emit('failed', error, [...executedSteps], index);\n\t\t\tthrow(error);\n\t\t}\n\n\t\tconst result: AnchorChainingPathExecuteResult = { steps: executedSteps };\n\t\tthis.#setState({ status: 'completed', result });\n\t\tthis.#emit('completed', result);\n\t\treturn(result);\n\t}\n}\n\ntype AnchorChainingFullPlanResult = (({ success: true; plan: AnchorChainingPlan; } | { success: false; error: unknown; }) & { path: AnchorChainingPath; });\n\nexport class AnchorChaining {\n\tprivate client: KeetaNet.UserClient;\n\tprivate resolver: Resolver;\n\treadonly graph: AnchorGraph;\n\tprivate logger?: Logger;\n\n\tconstructor(config: AnchorChainingConfig) {\n\t\tthis.client = config.client;\n\t\tif (config.resolver) {\n\t\t\tthis.resolver = config.resolver;\n\t\t} else {\n\t\t\tthis.resolver = getDefaultResolver(config.client);\n\t\t}\n\t\tthis.graph = new AnchorGraph({ resolver: this.resolver, client: this.client, logger: config.logger });\n\t\tif (config.logger !== undefined) {\n\t\t\tthis.logger = config.logger;\n\t\t}\n\t}\n\n\tasync getPaths(input: AnchorChainingPathInput): Promise<AnchorChainingPath[] | null> {\n\t\t// Direct send: same Keeta location, same asset, same rail no providers needed.\n\t\tconst sourceLocation = toAssetLocation(input.source.location);\n\t\tconst destinationLocation = toAssetLocation(input.destination.location);\n\n\t\tlet foundPaths: AnchorChainingStepLike[][] | null = null;\n\n\t\tif (\n\t\t\tinput.source.rail === 'KEETA_SEND' &&\n\t\t\tinput.destination.rail === 'KEETA_SEND' &&\n\t\t\tconvertAssetLocationToString(sourceLocation) === convertAssetLocationToString(destinationLocation) &&\n\t\t\tisChainLocation(sourceLocation, 'keeta') &&\n\t\t\tisChainLocation(destinationLocation, 'keeta') &&\n\t\t\tisAnchorChainingAssetEqual(input.source.asset, input.destination.asset)\n\t\t) {\n\t\t\tconst fromTo = {\n\t\t\t\tasset: input.source.asset,\n\t\t\t\tlocation: sourceLocation,\n\t\t\t\trail: 'KEETA_SEND'\n\t\t\t} as const;\n\n\t\t\tfoundPaths = [\n\t\t\t\t[{ type: 'keetaSend', from: fromTo, to: fromTo }]\n\t\t\t];\n\t\t} else {\n\t\t\tfoundPaths = await this.graph.findPaths(input);\n\t\t}\n\n\t\t// Filter out paths with non-chain steps in intermediate positions\n\t\tfoundPaths = foundPaths?.filter(path => {\n\t\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\t\tconst item = path[i];\n\t\t\t\tif (!item) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst toLocation = toAssetLocation(item.to.location);\n\t\t\t\tif (toLocation.type !== 'chain' && i < path.length - 1) {\n\t\t\t\t\treturn(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(true);\n\t\t});\n\n\t\tif (foundPaths.length === 0) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst retval: AnchorChainingPath[] = [];\n\n\t\tfor (const path of foundPaths) {\n\t\t\tretval.push(new AnchorChainingPath({ request: input, path, parent: this }));\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync getPlans(input: AnchorChainingPathInput, options?: ComputePlanOptions & { includeAllOutput?: false }): Promise<AnchorChainingPlan[] | null>;\n\tasync getPlans(input: AnchorChainingPathInput, options: ComputePlanOptions & { includeAllOutput: true }): Promise<AnchorChainingFullPlanResult[] | null>;\n\tasync getPlans(input: AnchorChainingPathInput, options?: ComputePlanOptions & { includeAllOutput?: boolean }): Promise<(AnchorChainingPlan | AnchorChainingFullPlanResult)[] | null> {\n\t\tconst paths = await this.getPaths(input);\n\n\t\tif (!paths) {\n\t\t\treturn(null);\n\t\t}\n\n\t\tconst limit = options?.limit ?? 3;\n\n\t\tconst sortedPaths = paths.sort((a, b) => a.path.length - b.path.length);\n\n\t\tlet successCount = 0;\n\t\tlet lowestStepsSuccessCount = Infinity;\n\t\tlet lastAttemptedPathIdx = -1;\n\n\t\tconst maxAttemptLoops = 3;\n\t\tlet currentAttemptLoop = 0;\n\n\t\tconst allOutput: PromiseSettledResult<AnchorChainingPlan>[] = [];\n\n\t\twhile (successCount < limit && lastAttemptedPathIdx < sortedPaths.length - 1 && currentAttemptLoop < maxAttemptLoops) {\n\t\t\tcurrentAttemptLoop++;\n\n\t\t\tconst pathsToTry = sortedPaths.slice(lastAttemptedPathIdx + 1, lastAttemptedPathIdx + 1 + (limit - successCount));\n\n\t\t\tif (pathsToTry.length === 0 || !pathsToTry[0]) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (pathsToTry[0].path.length > lowestStepsSuccessCount) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst currentTry = await Promise.allSettled(pathsToTry.map(async function(path) {\n\t\t\t\treturn(await AnchorChainingPlan.create(path, options));\n\t\t\t}));\n\n\t\t\tallOutput.push(...currentTry);\n\n\t\t\tfor (let i = 0; i < currentTry.length; i++) {\n\t\t\t\tconst result = currentTry[i];\n\t\t\t\tconst path = pathsToTry[i];\n\n\t\t\t\tif (!result || !path) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (result.status === 'fulfilled') {\n\t\t\t\t\tsuccessCount++;\n\t\t\t\t\tif (path && path.path.length < lowestStepsSuccessCount) {\n\t\t\t\t\t\tlowestStepsSuccessCount = path.path.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlastAttemptedPathIdx += pathsToTry.length;\n\t\t}\n\n\t\tconst ret: (AnchorChainingPlan | AnchorChainingFullPlanResult)[] = [];\n\n\t\tfor (let i = 0; i < allOutput.length; i++) {\n\t\t\tconst path = sortedPaths[i];\n\t\t\tconst plan = allOutput[i];\n\n\t\t\tif (!path || !plan) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (options?.includeAllOutput) {\n\t\t\t\tif (plan.status === 'rejected') {\n\t\t\t\t\tret.push({ success: false, error: plan.reason, path });\n\t\t\t\t} else {\n\t\t\t\t\tret.push({ success: true, plan: plan.value, path });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (plan.status === 'rejected') {\n\t\t\t\t\tthis.logger?.debug(`AnchorChaining::getPlans`, `Error computing plan for a path:`, plan.reason);\n\t\t\t\t} else {\n\t\t\t\t\tret.push(plan.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn(ret);\n\t}\n}\n"]}