@ghostlytools/cli 1.3.1 → 1.3.2

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.
Files changed (60) hide show
  1. package/dist/assets/{api-TiB5QSG9.js → api-SYPJgFRU.js} +2 -2
  2. package/dist/assets/{api-Dq2QXQDk.js → api-aup3Amud.js} +9 -9
  3. package/dist/assets/{api-Dq2QXQDk.js.map → api-aup3Amud.js.map} +1 -1
  4. package/dist/assets/{apiKit-CA2x5GJF.js → apiKit-DYkVEs6r.js} +25 -29
  5. package/dist/assets/apiKit-DYkVEs6r.js.map +1 -0
  6. package/dist/assets/{apps-C-T8jeji.js → apps-DcZKu29s.js} +1 -1
  7. package/dist/assets/{apps-BxV9i_Y4.js → apps-Rbk2HHXb.js} +2 -2
  8. package/dist/assets/{apps-BxV9i_Y4.js.map → apps-Rbk2HHXb.js.map} +1 -1
  9. package/dist/assets/{arkade-C_qDmHnm.js → arkade-CuWlNnCz.js} +4 -4
  10. package/dist/assets/arkade-CuWlNnCz.js.map +1 -0
  11. package/dist/assets/{backup-CnMN2oUK.js → backup-CJWLDHuS.js} +4 -4
  12. package/dist/assets/{backup-CnMN2oUK.js.map → backup-CJWLDHuS.js.map} +1 -1
  13. package/dist/assets/{backup-Bugnn3Ue.js → backup-CSMw2GHv.js} +1 -1
  14. package/dist/assets/bark_ffi_wasm_bg-EY2uc0Bx.js.map +1 -1
  15. package/dist/assets/buttons-CGRqZ7z0.js +2 -0
  16. package/dist/assets/{buttons-CvNBzh2S.js → buttons-QEnAGWoC.js} +3 -3
  17. package/dist/assets/{buttons-CvNBzh2S.js.map → buttons-QEnAGWoC.js.map} +1 -1
  18. package/dist/assets/{envelope-WjingYSc.js → envelope-K27mzoyu.js} +2 -2
  19. package/dist/assets/{envelope-WjingYSc.js.map → envelope-K27mzoyu.js.map} +1 -1
  20. package/dist/assets/fedimint_client_wasm_bg-BtHHlFpp.js.map +1 -1
  21. package/dist/assets/{groupFiles-IEUW3DQz.js → groupFiles-DHTrTA4I.js} +43 -16
  22. package/dist/assets/groupFiles-DHTrTA4I.js.map +1 -0
  23. package/dist/assets/{host-CWt-jtqz.js → host-C7hA-Za7.js} +102 -34
  24. package/dist/assets/host-C7hA-Za7.js.map +1 -0
  25. package/dist/assets/{hyperdhtRelay-CPYwSLLS.js → hyperdhtRelay-BVoWY2ua.js} +2 -2
  26. package/dist/assets/{hyperdhtRelay-CPYwSLLS.js.map → hyperdhtRelay-BVoWY2ua.js.map} +1 -1
  27. package/dist/assets/{irohWeb-4oChIOIp.js → irohWeb-BJPk9bMn.js} +2 -2
  28. package/dist/assets/{irohWeb-4oChIOIp.js.map → irohWeb-BJPk9bMn.js.map} +1 -1
  29. package/dist/assets/{main-DbqcdShN.js → main-DC8cUkDx.js} +14 -14
  30. package/dist/assets/{main-DbqcdShN.js.map → main-DC8cUkDx.js.map} +1 -1
  31. package/dist/assets/{mainline-ZkiOnevs.js → mainline-CxbxpoU4.js} +2 -2
  32. package/dist/assets/{mainline-ZkiOnevs.js.map → mainline-CxbxpoU4.js.map} +1 -1
  33. package/dist/assets/{networkReason-CetKkTPo.js → networkReason-D42iNuUB.js} +2 -2
  34. package/dist/assets/{networkReason-CetKkTPo.js.map → networkReason-D42iNuUB.js.map} +1 -1
  35. package/dist/assets/{nwc-CgkqyvsE.js → nwc-Cm4sYgLv.js} +3 -3
  36. package/dist/assets/{nwc-CgkqyvsE.js.map → nwc-Cm4sYgLv.js.map} +1 -1
  37. package/dist/assets/{nwcProvider-4eVz_8HP.js → nwcProvider-0D7vdPDd.js} +2 -2
  38. package/dist/assets/{nwcProvider-4eVz_8HP.js.map → nwcProvider-0D7vdPDd.js.map} +1 -1
  39. package/dist/assets/{registry-OBJBnHVQ.js → registry-CLolR0kM.js} +1 -1
  40. package/dist/assets/{registry-DlAKO0Fy.js → registry-CVdSZW5l.js} +3 -3
  41. package/dist/assets/{registry-DlAKO0Fy.js.map → registry-CVdSZW5l.js.map} +1 -1
  42. package/dist/assets/{resolve-CouHhCpJ.js → resolve-BnlEajYz.js} +2 -2
  43. package/dist/assets/{resolve-CouHhCpJ.js.map → resolve-BnlEajYz.js.map} +1 -1
  44. package/dist/assets/{server-Ss0gJ-nw.js → server-CJNEKxzE.js} +112 -33
  45. package/dist/assets/server-CJNEKxzE.js.map +1 -0
  46. package/dist/assets/{src-DDzSERyc.js → src-yMUQvdyL.js} +157 -141
  47. package/dist/assets/src-yMUQvdyL.js.map +1 -0
  48. package/dist/assets/{turnRefs-B87dtrHM.js → turnRefs-B2a8to9q.js} +2 -2
  49. package/dist/assets/{turnRefs-B87dtrHM.js.map → turnRefs-B2a8to9q.js.map} +1 -1
  50. package/dist/assets/{usdt-Fj8CQO2z.js → usdt-DesFeDiG.js} +3 -3
  51. package/dist/assets/{usdt-Fj8CQO2z.js.map → usdt-DesFeDiG.js.map} +1 -1
  52. package/dist/ghostly.mjs +1 -1
  53. package/package.json +1 -1
  54. package/dist/assets/apiKit-CA2x5GJF.js.map +0 -1
  55. package/dist/assets/arkade-C_qDmHnm.js.map +0 -1
  56. package/dist/assets/buttons-Bj7Vf7Pn.js +0 -2
  57. package/dist/assets/groupFiles-IEUW3DQz.js.map +0 -1
  58. package/dist/assets/host-CWt-jtqz.js.map +0 -1
  59. package/dist/assets/server-Ss0gJ-nw.js.map +0 -1
  60. package/dist/assets/src-DDzSERyc.js.map +0 -1
@@ -1,16 +1,16 @@
1
1
  import { n as traceJoin } from "./joinTrace-CjRDFy85.js";
2
- import { $c as budgetRetryMs, $i as PeerProofs, $o as HTTP_SERVICE_PROTO, $r as deviceWakeRequest, $s as enrollCancelFrame, $t as didDhtFromPublicKey, A as CommunitySession, Aa as COMMUNITY_REACTION_FRAME, Ao as DirectPathWatch, Ar as rankHubs, As as handoffStreamKey, B as knockRecords, Ba as wireReaction, Bc as signTurnPacket, Bn as isFederationId, Bo as LIMITS, Bs as readHandoffVerified, C as sha256Paced, Ca as EDIT_BUFFER_MS, Cc as deviceEchoNonce, Co as GROUP_MEMBER_CAP, Cr as freshHubs, Cs as handoffEphemeral, D as openGroupTyping, Da as parseLinkPreview, Dc as newDeviceSetSecret, Do as rosterHas, Dr as mergeLobby, Ds as handoffPakeFrame, E as groupTypingEpoch, Ea as dhtEditId, Ec as devicePingFrame, Eo as commitHash, Er as mergeBeacon, Es as handoffOfferFrame, Et as normalizeAtprotoHandle, Fa as queueReaction, Fc as TURN_LAST_SEQUENCE, Fn as decodeBolt11, Fo as presenceSeenAt, Fr as ChatFiles, Fs as readHandoffDone, G as groupWakeFrame, Gc as turnStatedVerifier, Gn as LIVENESS_PING_MS, Gr as PIN_LIMITS, Gs as setAckFrame, H as readKnocks, Ha as readReply, Hc as turnInstance, Hi as IDENTITY_REVOCATION_LABEL, Hn as parseFedimintRequestPayload, Ho as encodeControl, I as decodeGroupEntryLink, Ia as reactionEmoji, Ic as TURN_MAX, Ii as CapsExchange, In as ENDPOINT, Io as GhostlyHttpError, Ir as FILE_LIMITS, Is as readHandoffHave, J as GROUP_LIMITS, Jc as RelayTransport, Ji as identityStatement, Jn as pairedMessageFrame, Jr as pinIsNewer, Js as verifySetUpdate, K as groupWakes, Kc as turnVerifierMark, Ki as emptyIdentityLedger, Kn as PAIRED_FRAME_TOO_LARGE, Kr as mayPin, Ks as setUpdateFrame, L as encodeGroupEntryLink, La as reactionIsNewer, Lc as firstDeviceSetSecret, Li as DHT_TEXT_CAPABILITY, Ln as cashuRequestPayload, Lo as formatLocalTarget, Lr as transferEnded, Ls as readHandoffHello, M as communityHasFrame, Ma as REACTION_LIMITS, Mc as TURN_SETTLE_MS, Mo as DHT_POLL_INTERVALS, Mr as readBeaconHead, Ms as newHandoffId, N as decodeCommunityLink, Na as ReactionWindow, Nc as classifyTurnRead, Nr as readLobby, Ns as readHandoffAck, O as sealGroupTyping, Oa as forwardedAgain, Oc as seedSigner, Oo as verifyCommitSignature, Or as newerHead, Os as handoffReleaseFrame, P as encodeCommunityLink, Pa as nextReactionNumber, Pc as turnPutSummary, Po as RELAY_POLL_INTERVALS, Pr as shouldBeHub, Ps as readHandoffCancel, Q as frameBytes, Qc as traceLink, Qi as lastSharedWithMe, Qo as emptyLinkRecords, Qr as WakeLimiter, Qt as didDhtDocument, R as entryParams, Ra as readReaction, Rc as nextTurnPosition, Ri as capsDescriptors, Rn as fedimintRequestPayload, Ro as parseLocalTarget, Rr as transferStalled, Rs as readHandoffPake, S as readAppBundleAsync, Sa as parseVideoMeta, Sc as deviceEchoFrame, Sn as isBitcoinAddress, So as readCanonicalJson, Sr as doorHubs, Ss as handoffDigest, T as GroupTypingBoard, Ta as RateWindow, Tc as deviceLinkPairing, To as MEMBER_KEY, Tr as lobbyRecords, Ts as handoffManifestFrames, Tt as isAtprotoDid, Ua as replySnippet, Uc as turnKeys, Un as GhostLink, Ur as typingActivity, V as mergeKnocks, Va as pairedReplyAuthor, Vc as signTurnRelease, Vn as parseCashuRequestPayload, Vo as decodeControl, Vr as TypingSender, Vs as sealHandoffPiece, W as GroupWakeLimiter, Wa as BUTTON_ID, Wc as turnName, Wi as IdentityExchange, Wn as INVITE_TAKEN, Wo as RTC_CONFIG, Ws as readSetUpdate, X as GROUP_READ_NOTE, Xc as normalizeRelayUrl, Xi as receivedIdentityStatus, Xn as engineText, Xo as parseCallSignal, Xr as readPin, Ya as STATUS_CARD_LIMITS, Yc as currentRelays, Yi as newIdentityBinding, Yn as engineError, Yr as pinNumberHolds, Z as GroupSession, Zi as revokesIdentity, Zn as GROUP_FILE_LIMITS, Zr as WAKE_CALL_INTERVAL_MS, _c as inviteOwnership, _i as HoldKeys, _l as randomBytes, _n as walletNetworkOf, _r as meshHubs, _s as handoffBusyFrame, a as planAppUpdate, ac as enrollProofFrame, ai as vapidKeysMatch, an as EVM_TEST_CHAINS, ao as heardTime, as as HANDOFF_HAVE, at as groupName, b as pacer, ba as parseVoiceMeta, bc as ENROLL_CAPABILITY, bi as newMailbox, bl as utf8Decode, bn as sparkAddressKind, bo as canonicalJson, br as beaconKeys, bs as handoffContextProof, ca as peekDhtMailbox, cc as verifyEnrollProof, ci as isAppVersion, cl as createIdentity, cn as SEPOLIA_TEST_USDT, cr as CarriedTransport, cs as HANDOFF_PAKE, d as APP_BUNDLE_LIMITS, da as parseImageMeta, dc as readDeviceInvite, di as EDIT_CAPABILITY, dl as publicKeyFromZ32, dn as USDT_PUBLIC_RPC, do as appRef, ds as HANDOFF_TIMINGS, ea as emptyProofLedger, ec as enrollCancelReason, ei as newWakeToken, el as isDiscoveryBudgetError, en as encodeDidDhtDeactivated, eo as checkStatusCard, es as LEGACY_SERVICES, f as APP_BUNDLE_MAGIC, fc as OwnInviteError, fi as STATUS_CARD_CAPABILITY, fl as verify, fn as WALLET_NETWORKS, fs as HANDOFF_VERIFIED, g as appViewOf, gi as HOLD_LIMITS, gl as fromBase64Url, gn as validatePaymentTarget, go as readAppRevocation, gr as mayBeHub, gs as handoffAttemptSucceeded, h as appDigest, ha as sanitizeMime, hc as encodeInviteCode, hi as HOLD_DATED_BACK_MS, hl as bytesEqual, hn as formatPaymentAmount, ho as isAppRef, hr as MESH_HUBS, hs as handoffAttemptFailed, i as checkAppBeforeRun, ic as enrollHelloFrame, ii as checkPushEndpoint, il as createRelayPayload, in as ETHEREUM_USDT, io as claimedTime, ir as readGroupFileMeta, is as HANDOFF_DONE, it as mentionsMember, j as GROUP_READ_NOTE_COMMUNITY, ja as GROUP_REACTION_FRAME, jc as TURN_RAISE_READ_TIMEOUT_MS, jr as readBeacon, js as handoffVersions, k as COMMUNITY_LIMITS, ka as readForwarded, kc as webCryptoSigner, ko as edgeParams, kr as pickHubs, ks as handoffRetryAfter, l as readAppStoreSteps, la as DHT_FILE_CAPABILITY, lc as createDeviceInvite, li as APPS_CAPABILITY, ll as identityFromSeed, lo as APP_STATEMENT_LIMITS, ls as HANDOFF_PIECE_BYTES, ma as sanitizeFileName, mc as decodeInviteCode, mi as HOLD_CAPABILITY, ml as sanitizeAvatar, mn as assertWholeSats, mo as isAppKey, mr as readGroupSignal, ms as handoffAttemptAllowed, n as appStoreDecision, na as TRANSPORTS, nc as enrollDoneFrame, ni as relayRequest, nl as PacketTooLargeError, no as statusCardText, nr as groupFileFallback, ns as HANDOFF_ACK, nt as carryMentions, o as APP_STORE_LIMITS, oc as readEnrollGrant, on as ONCHAIN_PROVIDER, oo as receivedTimestamp, os as HANDOFF_HELLO, p as APP_ICON_PATH, pa as formatFileSize, pc as createChatInvite, pi as UPGRADE_CAPABILITY, pn as assertTokenUnits, po as isAppHash, pr as groupSignalFrame, ps as filePartName, q as parseGroupWakeFrame, qc as DEFAULT_RELAYS, qi as identityRevocationValue, qn as pairedMessageFits, qr as nextPinNumber, qs as signTombstone, r as appUpdateDecision, ra as automaticTransport, rc as enrollGrantFrame, ri as wakeRequest, rn as signDidDhtPacket, ro as arrivalKey, rs as HANDOFF_CANCEL, rt as parseCommunityEdit, sa as DHT_MESSAGE_TTL, sc as readEnrollHello, si as chatAppId, sn as PaymentPreflightError, so as shownTime, ss as HANDOFF_OFFER, t as appRevocationFor, ta as validExternalKey, tc as enrollDigits, ti as parseWakeFrame, tl as withRequestOptions, tn as encodeDidDhtPacket, to as sameButtonText, ts as serviceIdFromName, tt as GROUP_EDIT_TEXT_BYTES, ua as dhtFileId, uc as deviceInviteJoinerParams, ui as BUTTONS_CAPABILITY, ul as identityFromSeedB64, un as TEST_USDT_FAUCET_AMOUNT, uo as appFingerprint, us as HANDOFF_REQUEST, vi as HoldRefusedError, vl as toBase64Url, vn as SPARK_NETWORKS, vr as pickMeshHubs, vs as handoffCancelFrame, wa as EDIT_RATE_WINDOW_MS, wc as deviceKeyZ32, wn as isPubkyKey, wr as lobbyKeys, ws as handoffHelloFrame, xc as HANDOFF_CAPABILITY, xi as readManifest, xl as utf8Encode, xn as sparkInvoiceDetails, xr as beaconRecords, xs as handoffDataFrame, y as isAppUrl, ya as fileMessageText, yc as DEVICES_CAPABILITY, yi as isHoldUrl, yl as toZ32, yn as SPARK_PROVIDER, yr as COMMUNITY_TOPOLOGY, ys as handoffContext, z as knockIdentity, za as validReactionNumber, zc as readTurnPacket, zi as dialDescriptors, zn as findEndpoint, zo as webLocalFetch, zs as readHandoffTurnFrame } from "./src-DDzSERyc.js";
2
+ import { $c as normalizeRelayUrl, $i as lastSharedWithMe, $o as parseCallSignal, $r as WakeLimiter, $t as didDhtFromPublicKey, A as CommunitySession, Aa as readForwarded, Ac as newDeviceSetSecret, Ao as rosterHas, Ar as pickHubs, As as handoffPakeFrame, B as knockRecords, Ba as validReactionNumber, Bc as firstDeviceSetSecret, Bi as dialDescriptors, Bn as findEndpoint, Bo as formatLocalTarget, Bs as readHandoffHello, C as sha256Paced, Cc as ENROLL_CAPABILITY, Cl as utf8Decode, Cn as isBitcoinAddress, Co as readCanonicalJson, Cr as doorHubs, Cs as handoffContextProof, D as openGroupTyping, Da as dhtEditId, Dc as deviceKeyZ32, Do as commitHash, Dr as mergeBeacon, Ds as handoffHelloFrame, E as groupTypingEpoch, Ea as RateWindow, Ec as deviceEchoNonce, Eo as MEMBER_KEY, Er as lobbyRecords, Es as handoffEphemeral, Et as normalizeAtprotoHandle, Fa as nextReactionNumber, Fc as TURN_SETTLE_MS, Fo as DHT_POLL_INTERVALS, Fr as shouldBeHub, Fs as newHandoffId, G as groupWakeFrame, Ga as BUTTON_ID, Gc as turnInstance, Gi as IdentityExchange, Gn as INVITE_TAKEN, Go as encodeControl, H as readKnocks, Ha as pairedReplyAuthor, Hc as readTurnPacket, Hn as parseCashuRequestPayload, Ho as webLocalFetch, Hr as TypingSender, Hs as readHandoffTurnFrame, I as decodeGroupEntryLink, Ia as queueReaction, Ic as classifyTurnRead, In as decodeBolt11, Ir as ChatFiles, Is as readHandoffAck, J as GROUP_LIMITS, Jc as turnStatedVerifier, Ji as identityRevocationValue, Jn as pairedMessageFits, Jr as nextPinNumber, Js as setAckFrame, K as groupWakes, Kc as turnKeys, Kn as LIVENESS_PING_MS, Kr as PIN_LIMITS, L as encodeGroupEntryLink, La as reactionEmoji, Lc as turnPutSummary, Li as CapsExchange, Ln as ENDPOINT, Lo as RELAY_POLL_INTERVALS, Lr as FILE_LIMITS, Ls as readHandoffCancel, M as communityHasFrame, Ma as GROUP_REACTION_FRAME, Mc as webCryptoSigner, Mo as edgeParams, Mr as readBeacon, Ms as handoffRetryAfter, N as decodeCommunityLink, Na as REACTION_LIMITS, No as DirectPathWatch, Nr as readBeaconHead, Ns as handoffStreamKey, O as sealGroupTyping, Oa as parseLinkPreview, Oc as deviceLinkPairing, Oo as parseGroupCommit, Or as mergeLobby, Os as handoffManifestFrames, P as encodeCommunityLink, Pa as ReactionWindow, Pc as TURN_RAISE_READ_TIMEOUT_MS, Pr as readLobby, Ps as handoffVersions, Q as frameBytes, Qc as currentRelays, Qi as revokesIdentity, Qn as GROUP_FILE_LIMITS, Qr as WAKE_CALL_INTERVAL_MS, Qt as didDhtDocument, R as entryParams, Ra as reactionIsNewer, Rc as TURN_LAST_SEQUENCE, Ri as DHT_TEXT_CAPABILITY, Rn as cashuRequestPayload, Ro as presenceSeenAt, Rr as transferEnded, Rs as readHandoffDone, S as readAppBundleAsync, Sa as parseImageMeta, Sc as DEVICES_CAPABILITY, Si as readManifest, Sl as toZ32, Sn as sparkInvoiceDetails, Sr as beaconRecords, Ss as handoffContext, T as GroupTypingBoard, Ta as EDIT_RATE_WINDOW_MS, Tc as deviceEchoFrame, Tn as isPubkyKey, Tr as lobbyKeys, Ts as handoffDigest, Tt as isAtprotoDid, Ua as readReply, Uc as signTurnPacket, Ui as IDENTITY_REVOCATION_LABEL, Un as parseFedimintRequestPayload, Uo as LIMITS, Us as readHandoffVerified, V as mergeKnocks, Va as wireReaction, Vc as nextTurnPosition, Vn as isFederationId, Vo as parseLocalTarget, Vs as readHandoffPake, W as GroupWakeLimiter, Wa as replySnippet, Wc as signTurnRelease, Wn as GhostLink, Wo as decodeControl, Wr as typingActivity, Ws as sealHandoffPiece, X as GROUP_READ_NOTE, Xa as STATUS_CARD_LIMITS, Xc as DEFAULT_RELAYS, Xi as newIdentityBinding, Xn as engineError, Xr as pinNumberHolds, Xs as signTombstone, Yc as turnVerifierMark, Yi as identityStatement, Yn as pairedMessageFrame, Yr as pinIsNewer, Ys as setUpdateFrame, Z as GroupSession, Zc as RelayTransport, Zi as receivedIdentityStatus, Zn as engineText, Zr as readPin, Zs as verifySetUpdate, _c as decodeInviteCode, _i as HOLD_LIMITS, _l as sanitizeAvatar, _n as validatePaymentTarget, _o as readAppRevocation, _r as mayBeHub, _s as handoffAttemptAllowed, a as planAppUpdate, ac as enrollDoneFrame, ai as checkPushEndpoint, al as PacketTooLargeError, an as EVM_TEST_CHAINS, ao as claimedTime, ar as readGroupFileMeta, as as HANDOFF_ACK, at as groupName, b as pacer, bc as inviteOwnership, bi as isHoldUrl, bl as randomBytes, bn as SPARK_PROVIDER, br as COMMUNITY_TOPOLOGY, bs as handoffBusyFrame, ca as DHT_MESSAGE_TTL, cc as enrollProofFrame, ci as chatAppId, cn as SEPOLIA_TEST_USDT, co as shownTime, cs as HANDOFF_HAVE, d as APP_BUNDLE_LIMITS, da as dhtFileId, dc as verifyEnrollProof, di as BUTTONS_CAPABILITY, dl as createIdentity, dn as USDT_PUBLIC_RPC, do as appFingerprint, ds as HANDOFF_PAKE, ea as PeerProofs, ei as deviceWakeRequest, en as encodeDidDhtDeactivated, f as APP_BUNDLE_MAGIC, fa as formatFileSize, fc as createDeviceInvite, fi as EDIT_CAPABILITY, fl as identityFromSeed, fn as WALLET_NETWORKS, fo as appRef, fs as HANDOFF_PIECE_BYTES, g as appViewOf, gc as createChatInvite, gi as HOLD_DATED_BACK_MS, gn as formatPaymentAmount, go as isAppRef, gr as MESH_HUBS, gs as filePartName, h as appDigest, hc as OwnInviteError, hi as HOLD_CAPABILITY, hl as verify, hn as assertWholeSats, ho as isAppKey, hr as readGroupSignal, hs as HANDOFF_VERIFIED, i as checkAppBeforeRun, ia as automaticTransport, ic as enrollDigits, ii as wakeRequest, il as withRequestOptions, in as ETHEREUM_USDT, io as arrivalKey, is as serviceIdFromName, it as mentionsMember, j as GROUP_READ_NOTE_COMMUNITY, ja as COMMUNITY_REACTION_FRAME, jc as seedSigner, jo as verifyCommitSignature, jr as rankHubs, js as handoffReleaseFrame, k as COMMUNITY_LIMITS, ka as forwardedAgain, kc as devicePingFrame, ko as rosterAdmin, kr as newerHead, ks as handoffOfferFrame, l as readAppStoreSteps, la as peekDhtMailbox, lc as readEnrollGrant, li as isAppVersion, lr as CarriedTransport, ls as HANDOFF_HELLO, ma as sanitizeMime, mc as readDeviceInvite, mi as UPGRADE_CAPABILITY, ml as publicKeyFromZ32, mn as assertTokenUnits, mo as isAppHash, mr as groupSignalFrame, ms as HANDOFF_TIMINGS, n as appStoreDecision, na as validExternalKey, nc as enrollCancelFrame, ni as parseWakeFrame, nl as budgetRetryMs, no as sameButtonText, ns as HTTP_SERVICE_PROTO, nt as carryMentions, o as APP_STORE_LIMITS, oc as enrollGrantFrame, oi as vapidKeysMatch, on as ONCHAIN_PROVIDER, oo as heardTime, os as HANDOFF_CANCEL, p as APP_ICON_PATH, pa as sanitizeFileName, pc as deviceInviteJoinerParams, pi as STATUS_CARD_CAPABILITY, pl as identityFromSeedB64, pn as arkAddressPrefix, ps as HANDOFF_REQUEST, q as parseGroupWakeFrame, qc as turnName, qi as emptyIdentityLedger, qn as PAIRED_FRAME_TOO_LARGE, qo as RTC_CONFIG, qr as mayPin, qs as readSetUpdate, r as appUpdateDecision, ra as TRANSPORTS, rc as enrollCancelReason, ri as relayRequest, rl as isDiscoveryBudgetError, rn as signDidDhtPacket, ro as statusCardText, rr as groupFileFallback, rs as LEGACY_SERVICES, rt as parseCommunityEdit, sc as enrollHelloFrame, sl as createRelayPayload, sn as PaymentPreflightError, so as receivedTimestamp, ss as HANDOFF_DONE, t as appRevocationFor, ta as emptyProofLedger, ti as newWakeToken, tl as traceLink, tn as encodeDidDhtPacket, to as checkStatusCard, ts as emptyLinkRecords, tt as GROUP_EDIT_TEXT_BYTES, ua as DHT_FILE_CAPABILITY, uc as readEnrollHello, ui as APPS_CAPABILITY, un as TEST_USDT_FAUCET_AMOUNT, uo as APP_STATEMENT_LIMITS, us as HANDOFF_OFFER, va as fileMessageText, vc as encodeInviteCode, vi as HoldKeys, vl as bytesEqual, vn as walletNetworkOf, vr as meshHubs, vs as handoffAttemptFailed, wa as EDIT_BUFFER_MS, wc as HANDOFF_CAPABILITY, wl as utf8Encode, wo as GROUP_MEMBER_CAP, wr as freshHubs, ws as handoffDataFrame, xa as parseVideoMeta, xi as newMailbox, xl as toBase64Url, xn as sparkAddressKind, xo as canonicalJson, xr as beaconKeys, xs as handoffCancelFrame, y as isAppUrl, ya as parseVoiceMeta, yi as HoldRefusedError, yl as fromBase64Url, yn as SPARK_NETWORKS, yr as pickMeshHubs, ys as handoffAttemptSucceeded, z as knockIdentity, za as readReaction, zc as TURN_MAX, zi as capsDescriptors, zn as fedimintRequestPayload, zo as GhostlyHttpError, zr as transferStalled, zs as readHandoffHave } from "./src-yMUQvdyL.js";
3
3
  import { i as SourceUnreachableError, n as PROVIDER_PLATFORMS, o as isNothingSpentError, r as SourceConfigError, t as NothingSpentError, u as redact } from "./types-C4_KafL_.js";
4
4
  import { t as bitcoindRpc } from "./bitcoindProvider-DGw3xBSa.js";
5
- import { t as nwc } from "./nwcProvider-4eVz_8HP.js";
5
+ import { t as nwc } from "./nwcProvider-0D7vdPDd.js";
6
6
  import { a as clearProfileStores, c as fileStore, d as profileOpenFailure, f as store, i as STORES$1, l as newestWalletTx, m as wrap, n as APP_STORAGE_SCOPE_INDEX, o as databaseName, p as transact, r as CARD_INDEX, s as deleteDatabase, t as APP_STORAGE_CHAT_INDEX, u as openDb } from "./idb-B5L8wuOm.js";
7
- import { a as sealSeed, i as newDeviceKey, o as unsealSeed, r as intentRepository } from "./networkReason-CetKkTPo.js";
8
- import { $ as setSingleWriterGate, A as LightningCards, B as breezDatabaseInUse, C as FileAppender, D as streamStored, E as storedSize, F as ProviderSources, G as ModeChanged, H as dropBreezDatabase, I as sourceKey, J as networkLabel, K as ModeGate, L as CASHU_MINT_SOURCE, M as isRecoveryPhrase, N as normalizePhrase, P as lightningPaying, Q as setAwayWallets, R as cashuMint, S as WALLET_TYPES, T as removeStored, U as iceServerProblem, V as breezDatabasesFor, W as iceServerSetting, X as refuseAway, Y as awayFrom, Z as requireTurn, _ as crossNetwork, a as storedGroupFiles, b as walletInstances, c as receivedPairedReply, d as paymentAlias, f as paymentWireId, g as createTiming, h as createFailure, i as groupOfFile, j as cardsKey, k as CASHU_CARD, l as replyRef, m as assertConfirmedReal, n as groupFileId, o as groupReply, p as WALLET_NAMES, q as WrongNetworkError, r as groupFileText, s as pairedWireReply, t as GroupFileDesk, u as replyTo, v as paymentNetwork, w as readStored$1, y as paymentNetworksOf, z as breezDatabase } from "./groupFiles-IEUW3DQz.js";
9
- import { i as fedimintDatabase, n as createIrohWebEndpoint, o as loadFedimintSdk, r as irohRelayProblem, t as DEFAULT_IROH_RELAYS } from "./irohWeb-4oChIOIp.js";
7
+ import { a as sealSeed, i as newDeviceKey, o as unsealSeed, r as intentRepository } from "./networkReason-D42iNuUB.js";
8
+ import { $ as setSingleWriterGate, A as LightningCards, B as breezDatabaseInUse, C as FileAppender, D as streamStored, E as storedSize, F as ProviderSources, G as ModeChanged, H as dropBreezDatabase, I as sourceKey, J as networkLabel, K as ModeGate, L as CASHU_MINT_SOURCE, M as isRecoveryPhrase, N as normalizePhrase, P as lightningPaying, Q as setAwayWallets, R as cashuMint, S as WALLET_TYPES, T as removeStored, U as iceServerProblem, V as breezDatabasesFor, W as iceServerSetting, X as refuseAway, Y as awayFrom, Z as requireTurn, _ as crossNetwork, a as storedGroupFiles, b as walletInstances, c as receivedPairedReply, d as paymentAlias, f as paymentWireId, g as createTiming, h as createFailure, i as groupOfFile, j as cardsKey, k as CASHU_CARD, l as replyRef, m as assertConfirmedReal, n as groupFileId, o as groupReply, p as WALLET_NAMES, q as WrongNetworkError, r as groupFileText, s as pairedWireReply, t as GroupFileDesk, u as replyTo, v as paymentNetwork, w as readStored$1, y as paymentNetworksOf, z as breezDatabase } from "./groupFiles-DHTrTA4I.js";
9
+ import { i as fedimintDatabase, n as createIrohWebEndpoint, o as loadFedimintSdk, r as irohRelayProblem, t as DEFAULT_IROH_RELAYS } from "./irohWeb-BJPk9bMn.js";
10
10
  import { c as isTestMint, d as paysItsOwnInvoices, l as isWorthlessMint, n as DEFAULT_MINTS, o as fakesLightning, r as TEST_MINT, t as BITCOIN_INVOICE_ON_TESTNET, u as mintNetwork } from "./mints-BrlY773j.js";
11
- import { _ as reserveAdapterIds, f as setOwnDidSource, g as registeredOnchainProviders, h as registeredLightningProviders, l as chosenResolver, n as resolveAtprotoDid, p as onAdaptersChanged, t as assertPublicServer, v as boundedIdentityFetch, y as verifyIdentity } from "./resolve-CouHhCpJ.js";
11
+ import { _ as reserveAdapterIds, f as setOwnDidSource, g as registeredOnchainProviders, h as registeredLightningProviders, l as chosenResolver, n as resolveAtprotoDid, p as onAdaptersChanged, t as assertPublicServer, v as boundedIdentityFetch, y as verifyIdentity } from "./resolve-BnlEajYz.js";
12
12
  import { c as fileSpace, f as FILE_BYTES_STEP, o as fileBytes, r as blobDigest, s as fileBytesOf, u as removeFileBytes } from "./fileBytes-Di7VZtmU.js";
13
- import { n as MAX_BACKUP_BYTES, t as BACKUP_MEDIA_TYPE } from "./envelope-WjingYSc.js";
13
+ import { n as MAX_BACKUP_BYTES, t as BACKUP_MEDIA_TYPE } from "./envelope-K27mzoyu.js";
14
14
  import { t as hyperdhtRelayProblem } from "./hyperdhtRelay-BT_wRxab.js";
15
15
  import { hkdf } from "@noble/hashes/hkdf.js";
16
16
  import { sha256 } from "@noble/hashes/sha2.js";
@@ -199,7 +199,7 @@ function viewNews(before, after) {
199
199
  //#endregion
200
200
  //#region ../browser/src/engine/paymentAdapters/usdtWallet.ts
201
201
  /** The Ethereum libraries, a large part of the app: loaded once a USDT wallet is made, opened or restored, not with the engine. */
202
- var loadUsdt = () => import("./usdt-Fj8CQO2z.js");
202
+ var loadUsdt = () => import("./usdt-DesFeDiG.js");
203
203
  /** Every new profile starts with this wallet: an address to receive on, nothing to set up. */
204
204
  var DEFAULT_USDT = {
205
205
  network: "ethereum",
@@ -648,7 +648,7 @@ async function restoreArkDatabase(walletId, snapshot) {
648
648
  //#endregion
649
649
  //#region ../browser/src/engine/paymentAdapters/arkWallet.ts
650
650
  /** The Ark SDK, a large part of the app: loaded once an Ark wallet is made, opened or restored, not with the engine. */
651
- var loadArkade = () => import("./arkade-C_qDmHnm.js");
651
+ var loadArkade = () => import("./arkade-CuWlNnCz.js");
652
652
  /** How long a Testnet wallet about to make way for another waits for its server to say what it holds. */
653
653
  var RETIRE_READ_MS = 1e4;
654
654
  /** Every new profile starts with this wallet: nothing to set up before receiving. */
@@ -664,7 +664,7 @@ var checkProviders = (network, ...urls) => {
664
664
  provider,
665
665
  asset: "BTC",
666
666
  unit: "sat",
667
- address: "configuration",
667
+ address: `${arkAddressPrefix(network)}configuration`,
668
668
  expiresAt: Date.now() + 6e4
669
669
  });
670
670
  };
@@ -1253,7 +1253,7 @@ var BarkAdapter = class BarkAdapter {
1253
1253
  provider,
1254
1254
  asset: "BTC",
1255
1255
  unit: "sat",
1256
- address: "configuration",
1256
+ address: `${barkAddressPrefix(config.network)}configuration`,
1257
1257
  expiresAt: Date.now() + 6e4
1258
1258
  });
1259
1259
  }
@@ -6714,7 +6714,7 @@ var registry;
6714
6714
  var loading$1;
6715
6715
  var listeners = /* @__PURE__ */ new Set();
6716
6716
  function loadIdentityProviders() {
6717
- return loading$1 ??= import("./registry-OBJBnHVQ.js").then((m) => {
6717
+ return loading$1 ??= import("./registry-CLolR0kM.js").then((m) => {
6718
6718
  registry = m;
6719
6719
  for (const listener of listeners) listener();
6720
6720
  return m;
@@ -9895,7 +9895,8 @@ async function copyForForward(sourceId, target) {
9895
9895
  const source = await fileStore.get(sourceId);
9896
9896
  if (!source?.metadata) throw new Error("The file is not on this device any more");
9897
9897
  const size = storedSize(source);
9898
- if (source.direction === "in" && source.wire3 && source.wire3.state !== "done" || await bytesHere(source) !== size) throw new Error("The file has not arrived yet");
9898
+ const checked = source.wire3 ? source.wire3.state === "done" : !source.group || source.transfer?.state === "done";
9899
+ if (source.direction === "in" && !checked || await bytesHere(source) !== size) throw new Error("The file has not arrived yet");
9899
9900
  const { file, linkId, wireId, timestamp } = target;
9900
9901
  const metadata = {
9901
9902
  name: file.name,
@@ -10372,6 +10373,10 @@ var Apps = class {
10372
10373
  /** What each `ref\0scope` holds, read once from its counter row and kept in step by the writes here. */
10373
10374
  usage = /* @__PURE__ */ new Map();
10374
10375
  queues = /* @__PURE__ */ new Map();
10376
+ /** The keys read of each `ref\0scope` running, and the one every call made while it runs shares after it. */
10377
+ keyReads = /* @__PURE__ */ new Map();
10378
+ /** Uninstalls begun per reference, for this engine's life: a storage write that waited its turn across one is refused. */
10379
+ uninstalls = /* @__PURE__ */ new Map();
10375
10380
  timer = null;
10376
10381
  /** Drops what `staged` holds past `STAGED.ms`, set while it holds anything: a closed install screen sends no call. */
10377
10382
  sweep = null;
@@ -11659,6 +11664,8 @@ var Apps = class {
11659
11664
  STORES$1.appStorage,
11660
11665
  ...builtIn ? [STORES$1.settings] : []
11661
11666
  ], "readwrite");
11667
+ this.uninstalls.set(ref, (this.uninstalls.get(ref) ?? 0) + 1);
11668
+ this.held.delete(ref);
11662
11669
  tx.objectStore(STORES$1.apps).delete(ref);
11663
11670
  tx.objectStore(STORES$1.appStorage).delete(rowsOf(ref));
11664
11671
  if (builtIn) markBuiltIns(tx.objectStore(STORES$1.settings), (marks) => {
@@ -11737,6 +11744,7 @@ var Apps = class {
11737
11744
  * it, so the app can make room.
11738
11745
  */
11739
11746
  async storageSet({ ref, scope, key, value, digest }) {
11747
+ const uninstalls = this.uninstalls.get(ref);
11740
11748
  const app = await this.runningOrFail(ref, digest);
11741
11749
  const where = this.scopeOf(scope), name = this.keyOf(key);
11742
11750
  let text;
@@ -11767,6 +11775,10 @@ var Apps = class {
11767
11775
  this.usage.delete(`${app.ref}\0${where}`);
11768
11776
  fail("bad-scope", "Not a chat of this profile");
11769
11777
  }
11778
+ if (this.uninstalls.get(app.ref) !== uninstalls) {
11779
+ this.usage.delete(`${app.ref}\0${where}`);
11780
+ fail("not-installed", "This app is not installed");
11781
+ }
11770
11782
  writing.put({
11771
11783
  ref: app.ref,
11772
11784
  scope: where,
@@ -11806,7 +11818,28 @@ var Apps = class {
11806
11818
  }
11807
11819
  async storageKeys({ ref, scope, digest }) {
11808
11820
  const app = await this.runningOrFail(ref, digest);
11809
- return (await wrap((await store(STORES$1.appStorage, "readonly")).getAllKeys(keysOf(app.ref, this.scopeOf(scope))))).map((k) => k[2]);
11821
+ const where = this.scopeOf(scope);
11822
+ return this.keysOnce(`${app.ref}\0${where}`, async () => {
11823
+ return (await wrap((await store(STORES$1.appStorage, "readonly")).getAllKeys(keysOf(app.ref, where)))).map((k) => k[2]);
11824
+ });
11825
+ }
11826
+ /**
11827
+ * One read of a scope's keys at a time. Every call made while one runs shares the single read that starts after it, so
11828
+ * it still sees each write done before it was made: 50 calls a second on a full scope held the profile's database,
11829
+ * a chat message's write waited 17 s behind them.
11830
+ */
11831
+ keysOnce(id, read) {
11832
+ const waiting = this.keyReads.get(id);
11833
+ if (waiting) return waiting.next ??= waiting.running.then(() => this.keysStart(id, read), () => this.keysStart(id, read));
11834
+ return this.keysStart(id, read);
11835
+ }
11836
+ keysStart(id, read) {
11837
+ const slot = { running: read() };
11838
+ this.keyReads.set(id, slot);
11839
+ slot.running.catch(() => {}).then(() => {
11840
+ if (this.keyReads.get(id) === slot && !slot.next) this.keyReads.delete(id);
11841
+ });
11842
+ return slot.running;
11810
11843
  }
11811
11844
  /** An app's storage in every scope, as export files (WISP 1200 § Where installed apps live), offered before an uninstall. */
11812
11845
  async exportData({ ref }) {
@@ -24483,6 +24516,11 @@ var ACCEPT_AGAINS = 5;
24483
24516
  var REWELCOME_MS = ACCEPT_AGAIN_MS / 2;
24484
24517
  /** Invitee side: the invitations one contact chat may have waiting here at a time. More are answered as declined. */
24485
24518
  var MAX_INVITATIONS_PER_CHAT = 4;
24519
+ /** Invitee side, removed and invited again: the chat that let me into the group I kept, if it is its admin's. */
24520
+ var keptAdminChat = (kept) => {
24521
+ const admin = kept?.state && rosterAdmin(kept.state.chain[kept.state.chain.length - 1].m);
24522
+ return admin ? kept.contacts?.[admin] : void 0;
24523
+ };
24486
24524
  /** What an invitation says of its group, kept as a claim within what a group can be: an epoch from 0, a roster of 1 to the most a group holds. */
24487
24525
  function invitationClaims(frame) {
24488
24526
  const e = Number.isSafeInteger(frame.e) ? frame.e : 0, n = Number.isSafeInteger(frame.n) ? frame.n : 1;
@@ -25026,7 +25064,7 @@ var Groups = class {
25026
25064
  const previous = group.previous;
25027
25065
  if (!previous) return this.forget(group.id, false);
25028
25066
  if (owed) previous.declined = owed;
25029
- else delete previous.declined;
25067
+ else if (previous.declined?.linkId === group.invitation?.linkId) delete previous.declined;
25030
25068
  this.acceptSaid.delete(group.id);
25031
25069
  this.stored.set(group.id, previous);
25032
25070
  if (previous.state) this.attach(previous.state);
@@ -25902,7 +25940,7 @@ var Groups = class {
25902
25940
  return;
25903
25941
  }
25904
25942
  if (existing?.state && existing.state.status === "active") {
25905
- if (this.sessions.get(g)?.admin === frame.admin) this.host.sendOnLink(linkId, {
25943
+ if (this.sessions.get(g)?.admin === frame.admin && existing.contacts?.[frame.admin] === linkId) this.host.sendOnLink(linkId, {
25906
25944
  t: "group-decline",
25907
25945
  g
25908
25946
  });
@@ -25910,7 +25948,7 @@ var Groups = class {
25910
25948
  }
25911
25949
  if (existing?.invitation?.seedB64 && (existing.invitation.linkId !== linkId || existing.invitation.admin !== frame.admin)) return;
25912
25950
  if (existing?.left && (existing.left.admin !== frame.admin || existing.contacts?.[existing.left.admin] !== linkId)) return;
25913
- if (existing?.invitation && !existing.state && existing.invitation.linkId !== linkId && !existing.invitation.genesis && !existing.invitation.takenBack) return;
25951
+ if (existing?.invitation && !existing.state && existing.invitation.linkId !== linkId && !(existing.invitation.genesis && linkId === keptAdminChat(existing.previous)) && !existing.invitation.takenBack) return;
25914
25952
  if ([...this.stored.values()].filter((x) => x.invitation && !x.invitation.takenBack).length >= 32) return;
25915
25953
  if (!(existing?.invitation && !existing.invitation.takenBack && existing.invitation.linkId === linkId) && [...this.stored.values()].filter((x) => x.invitation?.linkId === linkId && !x.invitation.takenBack).length >= MAX_INVITATIONS_PER_CHAT) {
25916
25954
  try {
@@ -26044,10 +26082,12 @@ var Groups = class {
26044
26082
  const group = this.stored.get(g);
26045
26083
  if (!group?.invitation?.seedB64 || group.invitation.linkId !== linkId || !Array.isArray(frame.commits)) return;
26046
26084
  if (group.invitation.pieces.reduce((n, p) => n + p.commits.length, 0) + frame.commits.length > 1024) return;
26085
+ const commits = frame.commits.map(parseGroupCommit);
26086
+ if (commits.some((c) => !c || c.g !== g)) return;
26047
26087
  group.invitation.pieces.push({
26048
26088
  t: "group-chain",
26049
26089
  g,
26050
- commits: frame.commits
26090
+ commits
26051
26091
  });
26052
26092
  return;
26053
26093
  }
@@ -32410,6 +32450,11 @@ var PaymentDesk = class {
32410
32450
  return;
32411
32451
  }
32412
32452
  }
32453
+ if (target && request.network && request.network !== walletNetworkOf(target.network)) {
32454
+ if (!federations) return;
32455
+ federations = void 0;
32456
+ target = void 0;
32457
+ }
32413
32458
  const network = request.network ?? paymentNetwork({
32414
32459
  target,
32415
32460
  mints: parseCashuRequestPayload(findEndpoint(request.endpoints, ENDPOINT.cashu) ?? ""),
@@ -32422,8 +32467,10 @@ var PaymentDesk = class {
32422
32467
  }
32423
32468
  const allowed = (method) => (held ? !!link?.paymentEnabled(method) : !!link?.allowsPayment(method)) && this.accepts(linkId, method, network);
32424
32469
  const bolt11 = allowed("lightning") ? findEndpoint(request.endpoints, ENDPOINT.bolt11) : void 0;
32425
- const chain = bolt11 ? decodeBolt11(bolt11)?.network : void 0;
32426
- const invoice = bolt11 && !(network === "mainnet" && chain && chain !== "bitcoin") ? bolt11 : void 0;
32470
+ const decoded = bolt11 ? decodeBolt11(bolt11) : null;
32471
+ const chain = decoded?.network;
32472
+ const sameTarget = !(target?.method === "bitcoin" || target?.method === "arkade" || target?.method === "bark") || chain === "bitcoin" === (walletNetworkOf(target.network) === "mainnet");
32473
+ const invoice = bolt11 && decoded?.amountSat === amount && sameTarget && !(network === "mainnet" && chain && chain !== "bitcoin") ? bolt11 : void 0;
32427
32474
  const mints = allowed("cashu") ? parseCashuRequestPayload(findEndpoint(request.endpoints, ENDPOINT.cashu) ?? "").filter((mint) => mintNetwork(mint) === network) : [];
32428
32475
  if (!target && !invoice && !mints.length && !federations) return;
32429
32476
  await this.save({
@@ -32518,6 +32565,14 @@ var PaymentDesk = class {
32518
32565
  return;
32519
32566
  }
32520
32567
  const inspected = this.wallet.inspect?.(payment.endpoint[1]);
32568
+ if (payment.endpoint[0] === ENDPOINT.cashu && inspected !== void 0 && inspected?.kind !== "token") {
32569
+ link.sendPaymentResult({
32570
+ id: payment.id,
32571
+ ok: false,
32572
+ error: "That is not a valid ecash token"
32573
+ });
32574
+ return;
32575
+ }
32521
32576
  if (inspected?.kind === "token" && !this.accepts(linkId, "cashu", mintNetwork(inspected.mint))) {
32522
32577
  link.sendPaymentResult({
32523
32578
  id: payment.id,
@@ -33506,7 +33561,7 @@ var PaymentDesk = class {
33506
33561
  /**
33507
33562
  * Notes from the contact. Redeemed only when they are of a federation we joined and this chat allows Fedimint;
33508
33563
  * otherwise refused unredeemed, and the contact takes them back. Written down (with the notes) before redeeming:
33509
- * an interrupted redeem is finished from the journal, never lost.
33564
+ * an interrupted redeem is finished from the journal, never lost. The chat says it once the federation answered.
33510
33565
  */
33511
33566
  async receiveFedimint(linkId, payment) {
33512
33567
  const link = this.host.getLink(linkId);
@@ -33579,6 +33634,16 @@ var PaymentDesk = class {
33579
33634
  await refuse(`${networkLabel(walletNetworkOf(network))} Fedimint is off in this chat`);
33580
33635
  return;
33581
33636
  }
33637
+ const digest = digestHex(notes.trim());
33638
+ const before = [...this.payments.values()].find((p) => p.notesDigest === digest && p.direction === "in" && p.kind === "payment");
33639
+ if (before) {
33640
+ link.sendPaymentResult({
33641
+ id: payment.id,
33642
+ ok: false,
33643
+ error: before.state === "failed" ? before.error ?? "These notes were already redeemed" : "These notes were already received"
33644
+ });
33645
+ return;
33646
+ }
33582
33647
  await this.save({
33583
33648
  id: payment.id,
33584
33649
  linkId,
@@ -33591,16 +33656,8 @@ var PaymentDesk = class {
33591
33656
  createdAt: payment.timestamp,
33592
33657
  requestId: payment.requestId,
33593
33658
  federation: found.federation,
33594
- token: notes
33595
- });
33596
- await this.host.storeMessage({
33597
- linkId,
33598
- id: `peer_${payment.timestamp}`,
33599
- text: `⚡ ${amount.toLocaleString()} ${network === "bitcoin" ? "sats" : "test sats"} on Fedimint`,
33600
- sender: "peer",
33601
- timestamp: payment.timestamp,
33602
- via: "datalink",
33603
- paymentId: payment.id
33659
+ token: notes,
33660
+ notesDigest: digest
33604
33661
  });
33605
33662
  await this.finishRedeem(this.payments.get(payment.id));
33606
33663
  }
@@ -33648,8 +33705,30 @@ var PaymentDesk = class {
33648
33705
  ok: false,
33649
33706
  error: "These notes were already redeemed"
33650
33707
  });
33708
+ try {
33709
+ await this.host.storeMessage({
33710
+ linkId: payment.linkId,
33711
+ id: `peer_${payment.createdAt}_refused`,
33712
+ text: "Could not receive Fedimint ecash: These notes were already redeemed",
33713
+ sender: "peer",
33714
+ timestamp: payment.createdAt,
33715
+ via: "datalink"
33716
+ });
33717
+ } catch {}
33651
33718
  return;
33652
33719
  }
33720
+ if (state) {
33721
+ const test = fedimint.federation(payment.federation)?.network !== "bitcoin";
33722
+ await this.host.storeMessage({
33723
+ linkId: payment.linkId,
33724
+ id: `peer_${payment.createdAt}`,
33725
+ text: `⚡ ${payment.amount.toLocaleString()} ${test ? "test sats" : "sats"} on Fedimint`,
33726
+ sender: "peer",
33727
+ timestamp: payment.createdAt,
33728
+ via: "datalink",
33729
+ paymentId: id
33730
+ });
33731
+ }
33653
33732
  if (state !== "done") return;
33654
33733
  await this.save({
33655
33734
  ...this.current(payment),
@@ -42703,7 +42782,7 @@ var GhostlyNode = class GhostlyNode {
42703
42782
  get nativeFactories() {
42704
42783
  const relay = this.relaysHyperdht ? this.hyperdhtRelay : "";
42705
42784
  return {
42706
- ...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-CPYwSLLS.js")).createRelayedHyperEndpoint(seedB64, relay) } : {},
42785
+ ...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-BVoWY2ua.js")).createRelayedHyperEndpoint(seedB64, relay) } : {},
42707
42786
  ...this.options.nativeTransports,
42708
42787
  ...this.ownIrohRelays ? { "iroh/1": (seedB64) => this.options.nativeTransports["iroh/1"](seedB64, this.settings.irohRelays?.length ? { relays: [...this.settings.irohRelays] } : {}) } : {},
42709
42788
  ...this.options.irohWeb ? { "iroh/1": (seedB64) => createIrohWebEndpoint(seedB64, { relays: this.irohRelays }) } : {}
@@ -43552,4 +43631,4 @@ function signalKind(signal) {
43552
43631
  //#endregion
43553
43632
  export { EngineServer };
43554
43633
 
43555
- //# sourceMappingURL=server-Ss0gJ-nw.js.map
43634
+ //# sourceMappingURL=server-CJNEKxzE.js.map