@arkade-os/swap 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
- import { ProvisionedKey, ProvisionedClaimSecret, asset, RelativeTimelock, IWallet, arkade, RestIndexerProvider, Transaction, IContractManager, OnchainProvider, PaymentRail, VHTLC, Identity, ActivityResolver } from '@arkade-os/sdk';
2
- import { S as SwapSecretsProjection, R as RfqSwapRecord, A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry, b as RefundArkProvider, c as RefundIndexer, L as LockupVtxo, d as RfqSwap, e as ArkadeRefundResult, f as LockupSpendIndexer, g as RfqSwapState } from './repository-DaK1RzRq.cjs';
3
- export { h as AssetSwapStatus, i as AvailableRfqSwapManagerCallbacks, B as BTC_ASSET_ID, I as InMemoryAssetSwapRepository, j as LightningReceiveSwap, k as LightningSendSwap, l as LockupFate, m as LockupNeedsRecoveryError, n as LockupParams, o as LockupSpend, O as OnchainSendAction, p as OnchainSendSwap, P as PersistableRfqSwap, q as PreimageBlockedReason, r as PreimageNotRecoverableError, s as REFUND_MTP_LAG_SECONDS, t as RFQ_RESOLVED_STATES, u as RFQ_SWAP_RETENTION_SECONDS, v as RFQ_SWAP_TERMINAL_STATES, w as RefundOutcome, x as RfqRestoreFailure, y as RfqRestoreOptions, z as RfqRestoreResult, C as RfqSwapActionName, D as RfqSwapLockup, E as RfqSwapManager, F as RfqSwapManagerCallbacks, G as RfqSwapManagerConfig, H as RfqSwapManagerDeps, J as RfqSwapManagerEvents, K as RfqSwapOrigin, N as RfqSwapOriginRequired, Q as RfqSwapOutcome, T as RfqSwapRecordStore, U as SwapContractRegistry, V as addAssetSwap, W as awaitRfqResolution, X as createRfqSwapRecord, Y as findLockupVtxos, Z as getAssetSwaps, _ as getAssetSwapsOrThrow, $ as isRfqSwapTerminal, a0 as isRfqTerminal, a1 as nextOnchainAction, a2 as preimageForSwapRecord, a3 as pushRefundWithoutReceiver, a4 as readLockupFate, a5 as rebuildRfqSwap, a6 as refundIfUnresolved, a7 as rfqSwapOriginOf, a8 as shouldRetainRfqSwap, a9 as swapSecretsToRecord, aa as updateAssetSwap, ab as updateAssetSwapBestEffort, ac as updateRfqSwapRecord } from './repository-DaK1RzRq.cjs';
1
+ import { ProvisionedKey, ProvisionedClaimSecret, asset, RelativeTimelock, IWallet, arkade, RestIndexerProvider, Transaction, IContractManager, OnchainProvider, PaymentRail, Asset, VHTLC, Identity, ActivityResolver } from '@arkade-os/sdk';
2
+ import { S as SwapSecretsProjection, R as RfqSwapRecord, A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry, b as RefundArkProvider, c as RefundIndexer, L as LockupVtxo, d as RfqSwap, e as ArkadeRefundResult, f as LockupSpendIndexer, g as RfqSwapState } from './repository-Vfx65uF1.cjs';
3
+ export { h as AssetSwapStatus, i as AvailableRfqSwapManagerCallbacks, B as BTC_ASSET_ID, I as InMemoryAssetSwapRepository, j as LightningReceiveSwap, k as LightningSendSwap, l as LockupFate, m as LockupNeedsRecoveryError, n as LockupParams, o as LockupSpend, O as OnchainSendAction, p as OnchainSendSwap, P as PersistableRfqSwap, q as PreimageBlockedReason, r as PreimageNotRecoverableError, s as REFUND_MTP_LAG_SECONDS, t as RFQ_RESOLVED_STATES, u as RFQ_SWAP_RETENTION_SECONDS, v as RFQ_SWAP_TERMINAL_STATES, w as RefundOutcome, x as RfqRestoreFailure, y as RfqRestoreOptions, z as RfqRestoreResult, C as RfqSwapActionName, D as RfqSwapLockup, E as RfqSwapManager, F as RfqSwapManagerCallbacks, G as RfqSwapManagerConfig, H as RfqSwapManagerDeps, J as RfqSwapManagerEvents, K as RfqSwapOrigin, N as RfqSwapOriginRequired, Q as RfqSwapOutcome, T as RfqSwapRecordStore, U as SwapContractRegistry, V as addAssetSwap, W as awaitRfqResolution, X as createRfqSwapRecord, Y as findLockupVtxos, Z as getAssetSwaps, _ as getAssetSwapsOrThrow, $ as isRfqSwapTerminal, a0 as isRfqTerminal, a1 as nextOnchainAction, a2 as preimageForSwapRecord, a3 as pushRefundWithoutReceiver, a4 as readLockupFate, a5 as rebuildRfqSwap, a6 as refundIfUnresolved, a7 as rfqSwapOriginOf, a8 as shouldRetainRfqSwap, a9 as swapSecretsToRecord, aa as updateAssetSwap, ab as updateAssetSwapBestEffort, ac as updateRfqSwapRecord } from './repository-Vfx65uF1.cjs';
4
4
  import { Network, LocalCardInput, DiscoveredMarket, Side, OfferPlan } from '@arkade-os/solver-discovery';
5
- import { O as OnchainNetwork, a as OnchainHtlc, b as OnchainHtlcParams, C as ChainSource, R as RfqTransport, r as requestOnchainSend, I as InvoiceFacts, c as requestLightningSend } from './rfq-DzsmhXX3.cjs';
6
- export { A as ARKADE_ASSET, d as ARKADE_BTC, e as AddressMismatch, f as ChainUtxo, H as HtlcUtxo, L as LIGHTNING_BTC, g as LIGHTNING_RECEIVE_PAIR, h as LIGHTNING_SEND_PAIR, i as LOCKTIME_THRESHOLD, j as LightningReceiveTreeParams, k as LightningSendTreeParams, M as MAX_MIN_CONFIRMATIONS, l as MIN_CLAIM_WINDOW_SECONDS, m as MIN_HEADROOM_SECONDS, n as ONCHAIN_BTC, o as ONCHAIN_CLAIM_MARGIN_SECONDS, p as ONCHAIN_DUST_SATS, q as ONCHAIN_ORDER_MARGIN_SECONDS, s as ONCHAIN_RECEIVE_PAIR, t as ONCHAIN_SECONDS_PER_BLOCK, u as ONCHAIN_SEND_PAIR, v as OnchainHtlcPhase, w as RFQ_TERMINAL_STATES, x as RelaySocket, y as RfqQuote, z as RfqRefusalReason, B as RfqStatus, S as SOLO_REFUND_HEADROOM_SECONDS, D as SwapRefusal, E as arkadeAssetLeg, F as arkadeSwapRequest, G as assertFundable, J as assertReceivable, K as awaitOnchainFill, N as buildHtlcClaim, P as buildHtlcRefund, Q as claimOnchainFill, T as classifyOnchainHtlc, U as deriveLightningReceive, V as deriveOnchainReceive, W as deriveOnchainSend, X as extractPreimage, Y as httpTransport, Z as l1ScriptForAddress, _ as lightningReceiveRequest, $ as lightningSendRequest, a0 as lightningSendVtxoScript, a1 as newPreimage, a2 as newRfqId, a3 as offerTermsFromQuote, a4 as onchainHtlcScript, a5 as onchainReceiveRequest, a6 as onchainSendRequest, a7 as paymentHashOf, a8 as receiveVtxoScript, a9 as relayTransport, aa as requestLightningReceive, ab as requestOnchainReceive, ac as rfqPair, ad as unilateralClaimDelay, ae as unilateralRefundDelay, af as unilateralRefundWithoutReceiverDelay, ag as verifyLockupAddress, ah as verifyReceiveInvoice } from './rfq-DzsmhXX3.cjs';
5
+ import { O as OnchainNetwork, a as OnchainHtlc, b as OnchainHtlcParams, C as ChainSource, R as RfqTransport, r as requestOnchainSend, I as InvoiceFacts, c as requestLightningSend } from './rfq-CYfKvAPp.cjs';
6
+ export { A as ARKADE_ASSET, d as ARKADE_BTC, e as AddressMismatch, f as ChainUtxo, H as HtlcUtxo, L as LIGHTNING_BTC, g as LIGHTNING_RECEIVE_PAIR, h as LIGHTNING_SEND_PAIR, i as LOCKTIME_THRESHOLD, j as LightningReceiveTreeParams, k as LightningSendTreeParams, M as MAX_MIN_CONFIRMATIONS, l as MIN_CLAIM_WINDOW_SECONDS, m as MIN_HEADROOM_SECONDS, n as ONCHAIN_BTC, o as ONCHAIN_CLAIM_MARGIN_SECONDS, p as ONCHAIN_DUST_SATS, q as ONCHAIN_ORDER_MARGIN_SECONDS, s as ONCHAIN_RECEIVE_PAIR, t as ONCHAIN_SECONDS_PER_BLOCK, u as ONCHAIN_SEND_PAIR, v as OnchainHtlcPhase, w as RFQ_TERMINAL_STATES, x as RelaySocket, y as RfqQuote, z as RfqRefusalReason, B as RfqStatus, S as SOLO_REFUND_HEADROOM_SECONDS, D as SwapRefusal, E as arkadeAssetLeg, F as arkadeSwapRequest, G as assertFundable, J as assertReceivable, K as awaitOnchainFill, N as buildHtlcClaim, P as buildHtlcRefund, Q as claimOnchainFill, T as classifyOnchainHtlc, U as deriveLightningReceive, V as deriveOnchainReceive, W as deriveOnchainSend, X as extractPreimage, Y as httpTransport, Z as l1ScriptForAddress, _ as lightningReceiveRequest, $ as lightningSendRequest, a0 as lightningSendVtxoScript, a1 as newPreimage, a2 as newRfqId, a3 as offerTermsFromQuote, a4 as onchainHtlcScript, a5 as onchainReceiveRequest, a6 as onchainSendRequest, a7 as paymentHashOf, a8 as receiveVtxoScript, a9 as relayTransport, aa as requestLightningReceive, ab as requestOnchainReceive, ac as rfqPair, ad as unilateralClaimDelay, ae as unilateralRefundDelay, af as unilateralRefundWithoutReceiverDelay, ag as verifyLockupAddress, ah as verifyReceiveInvoice } from './rfq-CYfKvAPp.cjs';
7
7
 
8
8
  /**
9
9
  * Which wallet key signs this leg. Stored at `profile.signer`.
@@ -776,6 +776,60 @@ interface SolverLightningRailDeps {
776
776
  declare const solverLightningRendezvous: (markets: DiscoveredMarket[], amountSats: number, fallbackEmulatorPubkey?: Uint8Array) => SolverRendezvous | undefined;
777
777
  declare function solverLightningRail(deps: SolverLightningRailDeps): PaymentRail;
778
778
 
779
+ /**
780
+ * `cross-asset` — pay an asset the wallet does not hold, by swapping into it
781
+ * first. Both legs are quotable up front, so they price into one `RouteQuote`
782
+ * and the router needs no multi-hop primitive.
783
+ *
784
+ * BTC -> asset only: `createOffer` refuses anything but BTC<->asset, and
785
+ * keying `findMarket` on BTC is what enforces that.
786
+ */
787
+
788
+ declare const CROSS_ASSET_RAIL = "cross-asset";
789
+ /**
790
+ * Recovery branches on this. `filled` means the payout is NOT yet broadcast;
791
+ * `paying` means it WAS and the outcome is unknown — resolve that against
792
+ * chain state, never by resending. Persisting only afterwards would leave a
793
+ * crash between send and persist looking exactly like `filled`.
794
+ */
795
+ type CrossAssetPhase = "quoted" | "filled" | "paying" | "settled";
796
+ interface CrossAssetSwap {
797
+ phase: CrossAssetPhase;
798
+ offerHex: string;
799
+ address: string;
800
+ swapPkScript: Uint8Array;
801
+ depositSats: number;
802
+ asset: Asset;
803
+ payTo: string;
804
+ plan: OfferPlan;
805
+ /** The payout, once `settled` — the receipt a `paying` record looks for. */
806
+ txid?: string;
807
+ }
808
+ interface CrossAssetRailDeps {
809
+ arkServerUrl: string;
810
+ /** Called by `available()` and again by `quote()`; pass the caching
811
+ * `discoverMarkets`, not a bare registry fetch. */
812
+ discover(): Promise<DiscoveredMarket[]>;
813
+ quote(market: DiscoveredMarket, give: Side, wantAmount: bigint): Promise<OfferPlan>;
814
+ btcBalance(): Promise<bigint>;
815
+ dust(): Promise<bigint>;
816
+ /** Before every irreversible step and once after the last. See
817
+ * {@link CrossAssetPhase}. Keyed by `offerHex`. */
818
+ persist(swap: CrossAssetSwap): Promise<void>;
819
+ /** Resolve once a filler has delivered the asset to this wallet.
820
+ *
821
+ * OPEN QUESTION for review: is an injected promise the right seam, or
822
+ * should the rail take a `watchOfferSwaps` handle? No deadline is applied
823
+ * here, and resolving on a timeout rather than rejecting would make the
824
+ * rail pay from whatever the wallet then holds. */
825
+ awaitFill(swap: CrossAssetSwap): Promise<void>;
826
+ carrierSats?: number;
827
+ emulatorPubkey?: string;
828
+ }
829
+ /** Rank after `ark-asset`, which pays from a balance already held. Both match,
830
+ * so `options()` can offer "pay from your USDX" beside "buy USDX and pay". */
831
+ declare function crossAssetRail(deps: CrossAssetRailDeps): PaymentRail;
832
+
779
833
  interface SealedClaimPacket {
780
834
  /** `ephPub(33) ‖ nonce(12) ‖ ciphertext`, base64 — wire-ready. This is
781
835
  * the whole packet: the RFQ request's `claim_packet` field carries
@@ -799,6 +853,77 @@ interface ClaimPacketInput {
799
853
  */
800
854
  declare function sealClaimPacket(input: ClaimPacketInput): Promise<SealedClaimPacket>;
801
855
 
856
+ /**
857
+ * `retryable` is the point of the type: a 400 says the packet does not bind to
858
+ * this address at this daemon — wrong key, script or taptree — and retrying
859
+ * changes none of them. Only a full registry (429) and a transport fault (5xx,
860
+ * or `status` 0 for a throwing `fetch`) are worth trying again.
861
+ */
862
+ declare class CovclaimdRevealError extends Error {
863
+ readonly name = "CovclaimdRevealError";
864
+ readonly status: number;
865
+ readonly detail: string;
866
+ readonly retryable: boolean;
867
+ constructor(what: string, status: number, detail: string);
868
+ }
869
+ interface CovclaimdInfo {
870
+ /** 33-byte compressed — feeds {@link sealClaimPacket} unchanged. */
871
+ covclaimdPubkey: Uint8Array;
872
+ /** Compressed hex — feeds `requestLightningReceive`'s `emulatorPubkey`. */
873
+ emulatorPubkey: string;
874
+ }
875
+ /** The four fields `POST /v1/reveal` takes. */
876
+ interface RevealParams {
877
+ /** The funded lockup's Arkade address, bech32m. */
878
+ swapAddress: string;
879
+ /** `sealClaimPacket(...).ciphertext`, base64. */
880
+ ciphertext: string;
881
+ /** The covenant's `enforcePayTo` ArkadeScript, base64. */
882
+ arkadeScript: string;
883
+ /** The lockup's serialized taptree, hex. */
884
+ taptree: string;
885
+ }
886
+ interface CovclaimdClient {
887
+ info(): Promise<CovclaimdInfo>;
888
+ reveal(params: RevealParams): Promise<void>;
889
+ }
890
+ /** `fetchImpl` is injectable, matching `httpTransport` in `rfq.ts`. */
891
+ declare const covclaimdClient: (baseUrl: string, options?: {
892
+ fetchImpl?: typeof fetch;
893
+ timeoutMs?: number;
894
+ /** Opt out of the TLS requirement — a private network you trust. */
895
+ allowInsecureHttp?: boolean;
896
+ }) => CovclaimdClient;
897
+ /**
898
+ * The two wire fields that are functions of the covenant alone.
899
+ *
900
+ * A client-derived `arkadeScript` can differ from the funder's only if the
901
+ * covenants differ: the script is tweaked into the non-interactive claim leaf's
902
+ * co-signer key, so a different one is a different leaf, root, and lockup
903
+ * address — already covered by the address check made before funding.
904
+ */
905
+ declare function revealFieldsFromScript(script: InstanceType<typeof VHTLC.ScriptV2>): {
906
+ arkadeScript: string;
907
+ taptree: string;
908
+ };
909
+ /**
910
+ * Seal `P` to the daemon `client` speaks to and register it there, so covclaimd
911
+ * claims the lockup once the solver funds it and the trader can go offline.
912
+ *
913
+ * Registration EXPIRES — covclaimd drops it 15 minutes after the last reveal —
914
+ * and re-revealing refreshes rather than duplicates it, so a caller waiting on
915
+ * a slow funding should reveal again, not once. The two gates below name a
916
+ * cause covclaimd would otherwise report as an opaque 400.
917
+ */
918
+ declare function revealClaimPacket(client: CovclaimdClient, input: {
919
+ script: InstanceType<typeof VHTLC.ScriptV2>;
920
+ address: string;
921
+ /** `P`, 32 bytes, from the swap's `secrets`. */
922
+ preimage: Uint8Array;
923
+ }): Promise<{
924
+ ciphertext: string;
925
+ }>;
926
+
802
927
  /** The Ark surface the claim push needs — the same seam the refund push uses. */
803
928
  type ClaimArkProvider = RefundArkProvider;
804
929
  /**
@@ -1133,4 +1258,4 @@ interface RfqSwapActivityDeps {
1133
1258
  */
1134
1259
  declare function rfqSwapActivityInputs(deps: RfqSwapActivityDeps): Promise<SwapActivityInput[]>;
1135
1260
 
1136
- export { ArkadeRefundResult, type ArkadeRefunderDeps, AssetSwap, AssetSwapRepository, ChainSource, type ClaimArkProvider, type ClaimPacketInput, type DiscoverMarketsOptions, IndexedDbAssetSwapRepository, InvoiceFacts, type LightningReceiveProfile, type LightningSendProfile, LockupAmountMismatchError, LockupContractMissing, type LockupContractReader, type LockupContractWriter, LockupRegistrationFailed, LockupSpendIndexer, LockupVtxo, MarketsCacheEntry, OFFER_PACKET_TYPE, type Offer, type OfferContractRetirer, type OfferSwapWatcher, OnchainHtlc, OnchainHtlcParams, OnchainNetwork, type OnchainSendProfile, type PlanError, QUOTE_OPTIONS, RefundArkProvider, type RefundBlockedReason, RefundIndexer, RefundNotLocallyPossibleError, type RestoreIndexer, type RfqClaimSecretProjection, type RfqHashlockProjection, type RfqSignerProjection, RfqSwap, type RfqSwapActivityDeps, RfqSwapRecord, RfqSwapState, RfqTransport, SOLVER_LIGHTNING_RAIL, SOLVER_ONCHAIN_RAIL, SWAP_LOCKUP_CONTRACT_KIND, SWAP_LOCKUP_CONTRACT_LABEL, SWAP_LOCKUP_CONTRACT_TYPE, type SealedClaimPacket, type SolverLightningRailDeps, type SolverLightningSend, type SolverOnchainRailDeps, type SolverOnchainSend, type SolverRendezvous, type SpendKind, type SwapActivityInput, SwapSecretsProjection, type Tx, type WatchOfferSwapsParams, arkadeRefunder, awaitLockupFunding, cancelOffer, chainSourceFrom, claimReceiveLockup, classifyDepositSpend, classifySpend, createOffer, decodeOffer, discoverMarkets, encodeOffer, findMarket, lockupContractParams, makeCachedFeedFetch, offerVtxoScript, onchainSendProfile, pushClaim, registerLockupContract, requestLightningSend, requestOnchainSend, restoreAssetSwaps, retireSettledOfferContracts, rfqClaimSecretOf, rfqSecretsProfile, rfqSignerOf, rfqSwapActivityInputs, sealClaimPacket, senderIdentityForSwapRecord, solverLightningRail, solverLightningRendezvous, solverOnchainRail, solverOnchainRendezvous, solverRendezvous, spendTxidsOf, spendUpdate, swapActivityResolver, swapPrograms, validatePlan, watchOfferSwaps };
1261
+ export { ArkadeRefundResult, type ArkadeRefunderDeps, AssetSwap, AssetSwapRepository, CROSS_ASSET_RAIL, ChainSource, type ClaimArkProvider, type ClaimPacketInput, type CovclaimdClient, type CovclaimdInfo, CovclaimdRevealError, type CrossAssetPhase, type CrossAssetRailDeps, type CrossAssetSwap, type DiscoverMarketsOptions, IndexedDbAssetSwapRepository, InvoiceFacts, type LightningReceiveProfile, type LightningSendProfile, LockupAmountMismatchError, LockupContractMissing, type LockupContractReader, type LockupContractWriter, LockupRegistrationFailed, LockupSpendIndexer, LockupVtxo, MarketsCacheEntry, OFFER_PACKET_TYPE, type Offer, type OfferContractRetirer, type OfferSwapWatcher, OnchainHtlc, OnchainHtlcParams, OnchainNetwork, type OnchainSendProfile, type PlanError, QUOTE_OPTIONS, RefundArkProvider, type RefundBlockedReason, RefundIndexer, RefundNotLocallyPossibleError, type RestoreIndexer, type RevealParams, type RfqClaimSecretProjection, type RfqHashlockProjection, type RfqSignerProjection, RfqSwap, type RfqSwapActivityDeps, RfqSwapRecord, RfqSwapState, RfqTransport, SOLVER_LIGHTNING_RAIL, SOLVER_ONCHAIN_RAIL, SWAP_LOCKUP_CONTRACT_KIND, SWAP_LOCKUP_CONTRACT_LABEL, SWAP_LOCKUP_CONTRACT_TYPE, type SealedClaimPacket, type SolverLightningRailDeps, type SolverLightningSend, type SolverOnchainRailDeps, type SolverOnchainSend, type SolverRendezvous, type SpendKind, type SwapActivityInput, SwapSecretsProjection, type Tx, type WatchOfferSwapsParams, arkadeRefunder, awaitLockupFunding, cancelOffer, chainSourceFrom, claimReceiveLockup, classifyDepositSpend, classifySpend, covclaimdClient, createOffer, crossAssetRail, decodeOffer, discoverMarkets, encodeOffer, findMarket, lockupContractParams, makeCachedFeedFetch, offerVtxoScript, onchainSendProfile, pushClaim, registerLockupContract, requestLightningSend, requestOnchainSend, restoreAssetSwaps, retireSettledOfferContracts, revealClaimPacket, revealFieldsFromScript, rfqClaimSecretOf, rfqSecretsProfile, rfqSignerOf, rfqSwapActivityInputs, sealClaimPacket, senderIdentityForSwapRecord, solverLightningRail, solverLightningRendezvous, solverOnchainRail, solverOnchainRendezvous, solverRendezvous, spendTxidsOf, spendUpdate, swapActivityResolver, swapPrograms, validatePlan, watchOfferSwaps };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { ProvisionedKey, ProvisionedClaimSecret, asset, RelativeTimelock, IWallet, arkade, RestIndexerProvider, Transaction, IContractManager, OnchainProvider, PaymentRail, VHTLC, Identity, ActivityResolver } from '@arkade-os/sdk';
2
- import { S as SwapSecretsProjection, R as RfqSwapRecord, A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry, b as RefundArkProvider, c as RefundIndexer, L as LockupVtxo, d as RfqSwap, e as ArkadeRefundResult, f as LockupSpendIndexer, g as RfqSwapState } from './repository-DlLvj_y6.js';
3
- export { h as AssetSwapStatus, i as AvailableRfqSwapManagerCallbacks, B as BTC_ASSET_ID, I as InMemoryAssetSwapRepository, j as LightningReceiveSwap, k as LightningSendSwap, l as LockupFate, m as LockupNeedsRecoveryError, n as LockupParams, o as LockupSpend, O as OnchainSendAction, p as OnchainSendSwap, P as PersistableRfqSwap, q as PreimageBlockedReason, r as PreimageNotRecoverableError, s as REFUND_MTP_LAG_SECONDS, t as RFQ_RESOLVED_STATES, u as RFQ_SWAP_RETENTION_SECONDS, v as RFQ_SWAP_TERMINAL_STATES, w as RefundOutcome, x as RfqRestoreFailure, y as RfqRestoreOptions, z as RfqRestoreResult, C as RfqSwapActionName, D as RfqSwapLockup, E as RfqSwapManager, F as RfqSwapManagerCallbacks, G as RfqSwapManagerConfig, H as RfqSwapManagerDeps, J as RfqSwapManagerEvents, K as RfqSwapOrigin, N as RfqSwapOriginRequired, Q as RfqSwapOutcome, T as RfqSwapRecordStore, U as SwapContractRegistry, V as addAssetSwap, W as awaitRfqResolution, X as createRfqSwapRecord, Y as findLockupVtxos, Z as getAssetSwaps, _ as getAssetSwapsOrThrow, $ as isRfqSwapTerminal, a0 as isRfqTerminal, a1 as nextOnchainAction, a2 as preimageForSwapRecord, a3 as pushRefundWithoutReceiver, a4 as readLockupFate, a5 as rebuildRfqSwap, a6 as refundIfUnresolved, a7 as rfqSwapOriginOf, a8 as shouldRetainRfqSwap, a9 as swapSecretsToRecord, aa as updateAssetSwap, ab as updateAssetSwapBestEffort, ac as updateRfqSwapRecord } from './repository-DlLvj_y6.js';
1
+ import { ProvisionedKey, ProvisionedClaimSecret, asset, RelativeTimelock, IWallet, arkade, RestIndexerProvider, Transaction, IContractManager, OnchainProvider, PaymentRail, Asset, VHTLC, Identity, ActivityResolver } from '@arkade-os/sdk';
2
+ import { S as SwapSecretsProjection, R as RfqSwapRecord, A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry, b as RefundArkProvider, c as RefundIndexer, L as LockupVtxo, d as RfqSwap, e as ArkadeRefundResult, f as LockupSpendIndexer, g as RfqSwapState } from './repository-D5JoeqwB.js';
3
+ export { h as AssetSwapStatus, i as AvailableRfqSwapManagerCallbacks, B as BTC_ASSET_ID, I as InMemoryAssetSwapRepository, j as LightningReceiveSwap, k as LightningSendSwap, l as LockupFate, m as LockupNeedsRecoveryError, n as LockupParams, o as LockupSpend, O as OnchainSendAction, p as OnchainSendSwap, P as PersistableRfqSwap, q as PreimageBlockedReason, r as PreimageNotRecoverableError, s as REFUND_MTP_LAG_SECONDS, t as RFQ_RESOLVED_STATES, u as RFQ_SWAP_RETENTION_SECONDS, v as RFQ_SWAP_TERMINAL_STATES, w as RefundOutcome, x as RfqRestoreFailure, y as RfqRestoreOptions, z as RfqRestoreResult, C as RfqSwapActionName, D as RfqSwapLockup, E as RfqSwapManager, F as RfqSwapManagerCallbacks, G as RfqSwapManagerConfig, H as RfqSwapManagerDeps, J as RfqSwapManagerEvents, K as RfqSwapOrigin, N as RfqSwapOriginRequired, Q as RfqSwapOutcome, T as RfqSwapRecordStore, U as SwapContractRegistry, V as addAssetSwap, W as awaitRfqResolution, X as createRfqSwapRecord, Y as findLockupVtxos, Z as getAssetSwaps, _ as getAssetSwapsOrThrow, $ as isRfqSwapTerminal, a0 as isRfqTerminal, a1 as nextOnchainAction, a2 as preimageForSwapRecord, a3 as pushRefundWithoutReceiver, a4 as readLockupFate, a5 as rebuildRfqSwap, a6 as refundIfUnresolved, a7 as rfqSwapOriginOf, a8 as shouldRetainRfqSwap, a9 as swapSecretsToRecord, aa as updateAssetSwap, ab as updateAssetSwapBestEffort, ac as updateRfqSwapRecord } from './repository-D5JoeqwB.js';
4
4
  import { Network, LocalCardInput, DiscoveredMarket, Side, OfferPlan } from '@arkade-os/solver-discovery';
5
- import { O as OnchainNetwork, a as OnchainHtlc, b as OnchainHtlcParams, C as ChainSource, R as RfqTransport, r as requestOnchainSend, I as InvoiceFacts, c as requestLightningSend } from './rfq-DzsmhXX3.js';
6
- export { A as ARKADE_ASSET, d as ARKADE_BTC, e as AddressMismatch, f as ChainUtxo, H as HtlcUtxo, L as LIGHTNING_BTC, g as LIGHTNING_RECEIVE_PAIR, h as LIGHTNING_SEND_PAIR, i as LOCKTIME_THRESHOLD, j as LightningReceiveTreeParams, k as LightningSendTreeParams, M as MAX_MIN_CONFIRMATIONS, l as MIN_CLAIM_WINDOW_SECONDS, m as MIN_HEADROOM_SECONDS, n as ONCHAIN_BTC, o as ONCHAIN_CLAIM_MARGIN_SECONDS, p as ONCHAIN_DUST_SATS, q as ONCHAIN_ORDER_MARGIN_SECONDS, s as ONCHAIN_RECEIVE_PAIR, t as ONCHAIN_SECONDS_PER_BLOCK, u as ONCHAIN_SEND_PAIR, v as OnchainHtlcPhase, w as RFQ_TERMINAL_STATES, x as RelaySocket, y as RfqQuote, z as RfqRefusalReason, B as RfqStatus, S as SOLO_REFUND_HEADROOM_SECONDS, D as SwapRefusal, E as arkadeAssetLeg, F as arkadeSwapRequest, G as assertFundable, J as assertReceivable, K as awaitOnchainFill, N as buildHtlcClaim, P as buildHtlcRefund, Q as claimOnchainFill, T as classifyOnchainHtlc, U as deriveLightningReceive, V as deriveOnchainReceive, W as deriveOnchainSend, X as extractPreimage, Y as httpTransport, Z as l1ScriptForAddress, _ as lightningReceiveRequest, $ as lightningSendRequest, a0 as lightningSendVtxoScript, a1 as newPreimage, a2 as newRfqId, a3 as offerTermsFromQuote, a4 as onchainHtlcScript, a5 as onchainReceiveRequest, a6 as onchainSendRequest, a7 as paymentHashOf, a8 as receiveVtxoScript, a9 as relayTransport, aa as requestLightningReceive, ab as requestOnchainReceive, ac as rfqPair, ad as unilateralClaimDelay, ae as unilateralRefundDelay, af as unilateralRefundWithoutReceiverDelay, ag as verifyLockupAddress, ah as verifyReceiveInvoice } from './rfq-DzsmhXX3.js';
5
+ import { O as OnchainNetwork, a as OnchainHtlc, b as OnchainHtlcParams, C as ChainSource, R as RfqTransport, r as requestOnchainSend, I as InvoiceFacts, c as requestLightningSend } from './rfq-CYfKvAPp.js';
6
+ export { A as ARKADE_ASSET, d as ARKADE_BTC, e as AddressMismatch, f as ChainUtxo, H as HtlcUtxo, L as LIGHTNING_BTC, g as LIGHTNING_RECEIVE_PAIR, h as LIGHTNING_SEND_PAIR, i as LOCKTIME_THRESHOLD, j as LightningReceiveTreeParams, k as LightningSendTreeParams, M as MAX_MIN_CONFIRMATIONS, l as MIN_CLAIM_WINDOW_SECONDS, m as MIN_HEADROOM_SECONDS, n as ONCHAIN_BTC, o as ONCHAIN_CLAIM_MARGIN_SECONDS, p as ONCHAIN_DUST_SATS, q as ONCHAIN_ORDER_MARGIN_SECONDS, s as ONCHAIN_RECEIVE_PAIR, t as ONCHAIN_SECONDS_PER_BLOCK, u as ONCHAIN_SEND_PAIR, v as OnchainHtlcPhase, w as RFQ_TERMINAL_STATES, x as RelaySocket, y as RfqQuote, z as RfqRefusalReason, B as RfqStatus, S as SOLO_REFUND_HEADROOM_SECONDS, D as SwapRefusal, E as arkadeAssetLeg, F as arkadeSwapRequest, G as assertFundable, J as assertReceivable, K as awaitOnchainFill, N as buildHtlcClaim, P as buildHtlcRefund, Q as claimOnchainFill, T as classifyOnchainHtlc, U as deriveLightningReceive, V as deriveOnchainReceive, W as deriveOnchainSend, X as extractPreimage, Y as httpTransport, Z as l1ScriptForAddress, _ as lightningReceiveRequest, $ as lightningSendRequest, a0 as lightningSendVtxoScript, a1 as newPreimage, a2 as newRfqId, a3 as offerTermsFromQuote, a4 as onchainHtlcScript, a5 as onchainReceiveRequest, a6 as onchainSendRequest, a7 as paymentHashOf, a8 as receiveVtxoScript, a9 as relayTransport, aa as requestLightningReceive, ab as requestOnchainReceive, ac as rfqPair, ad as unilateralClaimDelay, ae as unilateralRefundDelay, af as unilateralRefundWithoutReceiverDelay, ag as verifyLockupAddress, ah as verifyReceiveInvoice } from './rfq-CYfKvAPp.js';
7
7
 
8
8
  /**
9
9
  * Which wallet key signs this leg. Stored at `profile.signer`.
@@ -776,6 +776,60 @@ interface SolverLightningRailDeps {
776
776
  declare const solverLightningRendezvous: (markets: DiscoveredMarket[], amountSats: number, fallbackEmulatorPubkey?: Uint8Array) => SolverRendezvous | undefined;
777
777
  declare function solverLightningRail(deps: SolverLightningRailDeps): PaymentRail;
778
778
 
779
+ /**
780
+ * `cross-asset` — pay an asset the wallet does not hold, by swapping into it
781
+ * first. Both legs are quotable up front, so they price into one `RouteQuote`
782
+ * and the router needs no multi-hop primitive.
783
+ *
784
+ * BTC -> asset only: `createOffer` refuses anything but BTC<->asset, and
785
+ * keying `findMarket` on BTC is what enforces that.
786
+ */
787
+
788
+ declare const CROSS_ASSET_RAIL = "cross-asset";
789
+ /**
790
+ * Recovery branches on this. `filled` means the payout is NOT yet broadcast;
791
+ * `paying` means it WAS and the outcome is unknown — resolve that against
792
+ * chain state, never by resending. Persisting only afterwards would leave a
793
+ * crash between send and persist looking exactly like `filled`.
794
+ */
795
+ type CrossAssetPhase = "quoted" | "filled" | "paying" | "settled";
796
+ interface CrossAssetSwap {
797
+ phase: CrossAssetPhase;
798
+ offerHex: string;
799
+ address: string;
800
+ swapPkScript: Uint8Array;
801
+ depositSats: number;
802
+ asset: Asset;
803
+ payTo: string;
804
+ plan: OfferPlan;
805
+ /** The payout, once `settled` — the receipt a `paying` record looks for. */
806
+ txid?: string;
807
+ }
808
+ interface CrossAssetRailDeps {
809
+ arkServerUrl: string;
810
+ /** Called by `available()` and again by `quote()`; pass the caching
811
+ * `discoverMarkets`, not a bare registry fetch. */
812
+ discover(): Promise<DiscoveredMarket[]>;
813
+ quote(market: DiscoveredMarket, give: Side, wantAmount: bigint): Promise<OfferPlan>;
814
+ btcBalance(): Promise<bigint>;
815
+ dust(): Promise<bigint>;
816
+ /** Before every irreversible step and once after the last. See
817
+ * {@link CrossAssetPhase}. Keyed by `offerHex`. */
818
+ persist(swap: CrossAssetSwap): Promise<void>;
819
+ /** Resolve once a filler has delivered the asset to this wallet.
820
+ *
821
+ * OPEN QUESTION for review: is an injected promise the right seam, or
822
+ * should the rail take a `watchOfferSwaps` handle? No deadline is applied
823
+ * here, and resolving on a timeout rather than rejecting would make the
824
+ * rail pay from whatever the wallet then holds. */
825
+ awaitFill(swap: CrossAssetSwap): Promise<void>;
826
+ carrierSats?: number;
827
+ emulatorPubkey?: string;
828
+ }
829
+ /** Rank after `ark-asset`, which pays from a balance already held. Both match,
830
+ * so `options()` can offer "pay from your USDX" beside "buy USDX and pay". */
831
+ declare function crossAssetRail(deps: CrossAssetRailDeps): PaymentRail;
832
+
779
833
  interface SealedClaimPacket {
780
834
  /** `ephPub(33) ‖ nonce(12) ‖ ciphertext`, base64 — wire-ready. This is
781
835
  * the whole packet: the RFQ request's `claim_packet` field carries
@@ -799,6 +853,77 @@ interface ClaimPacketInput {
799
853
  */
800
854
  declare function sealClaimPacket(input: ClaimPacketInput): Promise<SealedClaimPacket>;
801
855
 
856
+ /**
857
+ * `retryable` is the point of the type: a 400 says the packet does not bind to
858
+ * this address at this daemon — wrong key, script or taptree — and retrying
859
+ * changes none of them. Only a full registry (429) and a transport fault (5xx,
860
+ * or `status` 0 for a throwing `fetch`) are worth trying again.
861
+ */
862
+ declare class CovclaimdRevealError extends Error {
863
+ readonly name = "CovclaimdRevealError";
864
+ readonly status: number;
865
+ readonly detail: string;
866
+ readonly retryable: boolean;
867
+ constructor(what: string, status: number, detail: string);
868
+ }
869
+ interface CovclaimdInfo {
870
+ /** 33-byte compressed — feeds {@link sealClaimPacket} unchanged. */
871
+ covclaimdPubkey: Uint8Array;
872
+ /** Compressed hex — feeds `requestLightningReceive`'s `emulatorPubkey`. */
873
+ emulatorPubkey: string;
874
+ }
875
+ /** The four fields `POST /v1/reveal` takes. */
876
+ interface RevealParams {
877
+ /** The funded lockup's Arkade address, bech32m. */
878
+ swapAddress: string;
879
+ /** `sealClaimPacket(...).ciphertext`, base64. */
880
+ ciphertext: string;
881
+ /** The covenant's `enforcePayTo` ArkadeScript, base64. */
882
+ arkadeScript: string;
883
+ /** The lockup's serialized taptree, hex. */
884
+ taptree: string;
885
+ }
886
+ interface CovclaimdClient {
887
+ info(): Promise<CovclaimdInfo>;
888
+ reveal(params: RevealParams): Promise<void>;
889
+ }
890
+ /** `fetchImpl` is injectable, matching `httpTransport` in `rfq.ts`. */
891
+ declare const covclaimdClient: (baseUrl: string, options?: {
892
+ fetchImpl?: typeof fetch;
893
+ timeoutMs?: number;
894
+ /** Opt out of the TLS requirement — a private network you trust. */
895
+ allowInsecureHttp?: boolean;
896
+ }) => CovclaimdClient;
897
+ /**
898
+ * The two wire fields that are functions of the covenant alone.
899
+ *
900
+ * A client-derived `arkadeScript` can differ from the funder's only if the
901
+ * covenants differ: the script is tweaked into the non-interactive claim leaf's
902
+ * co-signer key, so a different one is a different leaf, root, and lockup
903
+ * address — already covered by the address check made before funding.
904
+ */
905
+ declare function revealFieldsFromScript(script: InstanceType<typeof VHTLC.ScriptV2>): {
906
+ arkadeScript: string;
907
+ taptree: string;
908
+ };
909
+ /**
910
+ * Seal `P` to the daemon `client` speaks to and register it there, so covclaimd
911
+ * claims the lockup once the solver funds it and the trader can go offline.
912
+ *
913
+ * Registration EXPIRES — covclaimd drops it 15 minutes after the last reveal —
914
+ * and re-revealing refreshes rather than duplicates it, so a caller waiting on
915
+ * a slow funding should reveal again, not once. The two gates below name a
916
+ * cause covclaimd would otherwise report as an opaque 400.
917
+ */
918
+ declare function revealClaimPacket(client: CovclaimdClient, input: {
919
+ script: InstanceType<typeof VHTLC.ScriptV2>;
920
+ address: string;
921
+ /** `P`, 32 bytes, from the swap's `secrets`. */
922
+ preimage: Uint8Array;
923
+ }): Promise<{
924
+ ciphertext: string;
925
+ }>;
926
+
802
927
  /** The Ark surface the claim push needs — the same seam the refund push uses. */
803
928
  type ClaimArkProvider = RefundArkProvider;
804
929
  /**
@@ -1133,4 +1258,4 @@ interface RfqSwapActivityDeps {
1133
1258
  */
1134
1259
  declare function rfqSwapActivityInputs(deps: RfqSwapActivityDeps): Promise<SwapActivityInput[]>;
1135
1260
 
1136
- export { ArkadeRefundResult, type ArkadeRefunderDeps, AssetSwap, AssetSwapRepository, ChainSource, type ClaimArkProvider, type ClaimPacketInput, type DiscoverMarketsOptions, IndexedDbAssetSwapRepository, InvoiceFacts, type LightningReceiveProfile, type LightningSendProfile, LockupAmountMismatchError, LockupContractMissing, type LockupContractReader, type LockupContractWriter, LockupRegistrationFailed, LockupSpendIndexer, LockupVtxo, MarketsCacheEntry, OFFER_PACKET_TYPE, type Offer, type OfferContractRetirer, type OfferSwapWatcher, OnchainHtlc, OnchainHtlcParams, OnchainNetwork, type OnchainSendProfile, type PlanError, QUOTE_OPTIONS, RefundArkProvider, type RefundBlockedReason, RefundIndexer, RefundNotLocallyPossibleError, type RestoreIndexer, type RfqClaimSecretProjection, type RfqHashlockProjection, type RfqSignerProjection, RfqSwap, type RfqSwapActivityDeps, RfqSwapRecord, RfqSwapState, RfqTransport, SOLVER_LIGHTNING_RAIL, SOLVER_ONCHAIN_RAIL, SWAP_LOCKUP_CONTRACT_KIND, SWAP_LOCKUP_CONTRACT_LABEL, SWAP_LOCKUP_CONTRACT_TYPE, type SealedClaimPacket, type SolverLightningRailDeps, type SolverLightningSend, type SolverOnchainRailDeps, type SolverOnchainSend, type SolverRendezvous, type SpendKind, type SwapActivityInput, SwapSecretsProjection, type Tx, type WatchOfferSwapsParams, arkadeRefunder, awaitLockupFunding, cancelOffer, chainSourceFrom, claimReceiveLockup, classifyDepositSpend, classifySpend, createOffer, decodeOffer, discoverMarkets, encodeOffer, findMarket, lockupContractParams, makeCachedFeedFetch, offerVtxoScript, onchainSendProfile, pushClaim, registerLockupContract, requestLightningSend, requestOnchainSend, restoreAssetSwaps, retireSettledOfferContracts, rfqClaimSecretOf, rfqSecretsProfile, rfqSignerOf, rfqSwapActivityInputs, sealClaimPacket, senderIdentityForSwapRecord, solverLightningRail, solverLightningRendezvous, solverOnchainRail, solverOnchainRendezvous, solverRendezvous, spendTxidsOf, spendUpdate, swapActivityResolver, swapPrograms, validatePlan, watchOfferSwaps };
1261
+ export { ArkadeRefundResult, type ArkadeRefunderDeps, AssetSwap, AssetSwapRepository, CROSS_ASSET_RAIL, ChainSource, type ClaimArkProvider, type ClaimPacketInput, type CovclaimdClient, type CovclaimdInfo, CovclaimdRevealError, type CrossAssetPhase, type CrossAssetRailDeps, type CrossAssetSwap, type DiscoverMarketsOptions, IndexedDbAssetSwapRepository, InvoiceFacts, type LightningReceiveProfile, type LightningSendProfile, LockupAmountMismatchError, LockupContractMissing, type LockupContractReader, type LockupContractWriter, LockupRegistrationFailed, LockupSpendIndexer, LockupVtxo, MarketsCacheEntry, OFFER_PACKET_TYPE, type Offer, type OfferContractRetirer, type OfferSwapWatcher, OnchainHtlc, OnchainHtlcParams, OnchainNetwork, type OnchainSendProfile, type PlanError, QUOTE_OPTIONS, RefundArkProvider, type RefundBlockedReason, RefundIndexer, RefundNotLocallyPossibleError, type RestoreIndexer, type RevealParams, type RfqClaimSecretProjection, type RfqHashlockProjection, type RfqSignerProjection, RfqSwap, type RfqSwapActivityDeps, RfqSwapRecord, RfqSwapState, RfqTransport, SOLVER_LIGHTNING_RAIL, SOLVER_ONCHAIN_RAIL, SWAP_LOCKUP_CONTRACT_KIND, SWAP_LOCKUP_CONTRACT_LABEL, SWAP_LOCKUP_CONTRACT_TYPE, type SealedClaimPacket, type SolverLightningRailDeps, type SolverLightningSend, type SolverOnchainRailDeps, type SolverOnchainSend, type SolverRendezvous, type SpendKind, type SwapActivityInput, SwapSecretsProjection, type Tx, type WatchOfferSwapsParams, arkadeRefunder, awaitLockupFunding, cancelOffer, chainSourceFrom, claimReceiveLockup, classifyDepositSpend, classifySpend, covclaimdClient, createOffer, crossAssetRail, decodeOffer, discoverMarkets, encodeOffer, findMarket, lockupContractParams, makeCachedFeedFetch, offerVtxoScript, onchainSendProfile, pushClaim, registerLockupContract, requestLightningSend, requestOnchainSend, restoreAssetSwaps, retireSettledOfferContracts, revealClaimPacket, revealFieldsFromScript, rfqClaimSecretOf, rfqSecretsProfile, rfqSignerOf, rfqSwapActivityInputs, sealClaimPacket, senderIdentityForSwapRecord, solverLightningRail, solverLightningRendezvous, solverOnchainRail, solverOnchainRendezvous, solverRendezvous, spendTxidsOf, spendUpdate, swapActivityResolver, swapPrograms, validatePlan, watchOfferSwaps };