@domino-sdk/relay 1.66.0 → 1.67.0

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 (62) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/{accounts-_lNsiR2k.d.ts → accounts-C2O8mpB8.d.ts} +2 -2
  3. package/dist/{attempt-captures-BqPggxTU.d.ts → attempt-captures-ClHAoo_n.d.ts} +1 -1
  4. package/dist/authoring.d.ts +24 -23
  5. package/dist/authoring.js +17 -15
  6. package/dist/{automatic-outcomes-BzAvfcpd.d.ts → automatic-outcomes-BEnPn4Uh.d.ts} +2 -2
  7. package/dist/avatar.d.ts +1 -1
  8. package/dist/browser.d.ts +9 -9
  9. package/dist/browser.js +9 -8
  10. package/dist/{catalog-ByZMRS7I.d.ts → catalog-CbiftcxQ.d.ts} +2 -2
  11. package/dist/{chunk-5LD5DKOM.js → chunk-5DZNMLDM.js} +1 -1
  12. package/dist/{chunk-TCYDFNV4.js → chunk-5SBA6X5X.js} +1 -1
  13. package/dist/{chunk-PNVQ4RBG.js → chunk-BMJHFWVT.js} +5 -29
  14. package/dist/{chunk-7MQCQYEE.js → chunk-DSJ46QLB.js} +1 -1
  15. package/dist/{chunk-KHXCURXB.js → chunk-JK3XV2CR.js} +92 -3
  16. package/dist/{chunk-M66Y5OMJ.js → chunk-KUNPCDN6.js} +6 -6
  17. package/dist/{chunk-5DYS2OIP.js → chunk-MVQQDPQX.js} +1 -1
  18. package/dist/{chunk-CGUL4MRE.js → chunk-NRMQVK2W.js} +1 -1
  19. package/dist/{chunk-XCEGNKGH.js → chunk-P33ZAJMS.js} +56 -24
  20. package/dist/{chunk-CJDB6W6I.js → chunk-Q5QVAF7R.js} +41 -14
  21. package/dist/{chunk-5BMZZDGY.js → chunk-Q6KTTVOI.js} +1 -1
  22. package/dist/{chunk-QYHEHMCG.js → chunk-QYC3CZVD.js} +1 -1
  23. package/dist/{chunk-OWDIR7ZU.js → chunk-RDUSFUXX.js} +1 -1
  24. package/dist/{chunk-FU3W4IQN.js → chunk-RWR2LOPA.js} +2 -2
  25. package/dist/chunk-UWUS4OOV.js +59 -0
  26. package/dist/{chunk-ANVAUOJP.js → chunk-X3FMVRMM.js} +1 -1
  27. package/dist/{chunk-QZNLSK4U.js → chunk-Z2Z5DBNW.js} +6 -6
  28. package/dist/{client-Cze4lfwA.d.ts → client-CZPewB9h.d.ts} +10 -7
  29. package/dist/{dashboards-pVfclkyh.d.ts → dashboards-jGPM3AxF.d.ts} +3 -3
  30. package/dist/{deployments-Cr1tfqrr.d.ts → deployments-BVFd7ddA.d.ts} +3 -3
  31. package/dist/{identity-integration-Ci2vGKtX.d.ts → identity-integration-W1Vo3Ql9.d.ts} +10 -2
  32. package/dist/index.d.ts +10 -10
  33. package/dist/index.js +7 -7
  34. package/dist/internal.d.ts +32 -14
  35. package/dist/internal.js +29 -20
  36. package/dist/{limits-pE04y9O2.d.ts → limits-C4RzrOV4.d.ts} +1 -1
  37. package/dist/{offers-Hw2P6tcK.d.ts → offers-BpYenB9i.d.ts} +2 -2
  38. package/dist/portal-proxy.d.ts +5 -5
  39. package/dist/portal-proxy.js +11 -13
  40. package/dist/react/index.d.ts +14 -13
  41. package/dist/react/index.js +9 -8
  42. package/dist/{reward-deliveries-BCV8hznc.d.ts → reward-deliveries-BOWpMytr.d.ts} +1 -1
  43. package/dist/runtime/authoring.js +1 -1
  44. package/dist/runtime/chunks/C2MGLQXC.js +1 -0
  45. package/dist/runtime/manifest.json +3 -3
  46. package/dist/runtime/schema.js +1 -1
  47. package/dist/schema.d.ts +20 -17
  48. package/dist/schema.js +11 -7
  49. package/dist/server/index.d.ts +12 -12
  50. package/dist/server/index.js +277 -22
  51. package/dist/{sign-in-providers-BAkGjSXo.d.ts → sign-in-providers-BRYVOSlG.d.ts} +2 -2
  52. package/dist/{submission-input-ChL1aYNH.d.ts → submission-input-C152xIdn.d.ts} +2 -2
  53. package/dist/{telegram-browser-BFs4u7lC.d.ts → telegram-browser-657QqiQl.d.ts} +4 -4
  54. package/dist/telegram.d.ts +8 -8
  55. package/dist/testing.d.ts +12 -11
  56. package/dist/testing.js +14 -7
  57. package/dist/{tracker-data-Bl-qPIvZ.d.ts → tracker-data-BqY-9Vu-.d.ts} +2 -2
  58. package/dist/{transport-WE49Ta3A.d.ts → transport-CthYgZXK.d.ts} +618 -20
  59. package/dist/{wallet-B7e06v4m.d.ts → wallet-Btng186v.d.ts} +57 -26
  60. package/package.json +3 -1
  61. package/dist/chunk-UZ765UGH.js +0 -18
  62. package/dist/runtime/chunks/C5V267I7.js +0 -1
@@ -1,20 +1,20 @@
1
- export { M as ManagementTransportOptions, P as ParticipantRoute, R as REFERRAL_INTEGRATION_REWARD_ERROR, c as containsReferralIntegrationReward, i as isIntegrationParticipantPath, a as isParticipantRoute, m as managementTransport, n as nextScheduleRun, p as parseImageExtraction, b as parseImageResult, d as participantRoutePattern, e as participantRoutes, q as questConfiguration, s as sequenceCursorSchema, f as sourceDataSchema, g as sourceRoles, v as validateQuestShape } from './transport-WE49Ta3A.js';
2
- export { A as AccountVouchedBy, b as IdentityIntegration, c as IdentityIntegrationAccountVouchingInput, d as IdentityIntegrationAppSecret, I as IdentityIntegrationKey, e as IdentityKindClaim, K as KnownIdentityIntegrationEnvironment, P as ParticipantExchangeAccountResult, f as ParticipantExchangeInput, a as ParticipantExchangeResult, g as accountVouchedBySchema, i as identityIntegrationAccountVouchingInputSchema, h as identityIntegrationAppSecretSchema, j as identityIntegrationInputSchema, k as identityIntegrationKeySchema, l as identityIntegrationSchema, m as identityIntegrationSecretSchema, n as identityKindClaimSchema, p as participantExchangeAccountResultSchema, o as participantExchangeAccountsSchema, q as participantExchangeResultSchema, r as participantExchangeSchema } from './identity-integration-Ci2vGKtX.js';
3
- export { E as Extracted } from './limits-pE04y9O2.js';
1
+ export { M as ManagementTransportOptions, P as ParticipantRoute, R as REFERRAL_INTEGRATION_REWARD_ERROR, c as containsReferralIntegrationReward, i as isIntegrationParticipantPath, a as isParticipantRoute, m as managementTransport, n as nextScheduleRun, p as parseImageExtraction, b as parseImageResult, d as participantRoutePattern, e as participantRoutes, q as questConfiguration, s as sequenceCursorSchema, f as sourceDataSchema, g as sourceRoles, v as validateQuestShape } from './transport-CthYgZXK.js';
2
+ export { A as AccountVouchedBy, b as IdentityIntegration, c as IdentityIntegrationAccountVouchingInput, d as IdentityIntegrationAppSecret, I as IdentityIntegrationKey, e as IdentityKindClaim, K as KnownIdentityIntegrationEnvironment, P as ParticipantExchangeAccountResult, f as ParticipantExchangeInput, a as ParticipantExchangeResult, g as accountVouchedBySchema, h as appLoginOriginSchema, i as httpsOriginSchema, j as identityIntegrationAccountVouchingInputSchema, k as identityIntegrationAppSecretSchema, l as identityIntegrationInputSchema, m as identityIntegrationKeySchema, n as identityIntegrationSchema, o as identityIntegrationSecretSchema, p as identityKindClaimSchema, q as participantExchangeAccountResultSchema, r as participantExchangeAccountsSchema, s as participantExchangeResultSchema, t as participantExchangeSchema } from './identity-integration-W1Vo3Ql9.js';
3
+ export { E as Extracted } from './limits-C4RzrOV4.js';
4
+ export { p as evmWalletOn } from './wallet-Btng186v.js';
4
5
  import { b as RequestErrorKind } from './request-error-D_dUPLwo.js';
5
- export { b as TrackerDataBudget, s as schemaCheckedReader, c as sourceContent, t as trackerDataBatchSteps, d as trackerDataIssue, e as trackerDataIssues, f as trackerDataPathTypes, g as trackerDataRecordSteps, w as whereSchemaIssue, h as whereSettings } from './tracker-data-Bl-qPIvZ.js';
6
+ export { b as TrackerDataBudget, s as schemaCheckedReader, c as sourceContent, t as trackerDataBatchSteps, d as trackerDataIssue, e as trackerDataIssues, f as trackerDataPathTypes, g as trackerDataRecordSteps, w as whereSchemaIssue, h as whereSettings } from './tracker-data-BqY-9Vu-.js';
6
7
  export { H as HostEnvironment, h as hostEnvironmentPath, a as hostEnvironmentSchema } from './host-environment-FN4zg3hw.js';
7
- export { c as compatibleSettingKinds, d as dashboardIssue, i as isBoundSetting, n as normalizeDashboard } from './dashboards-pVfclkyh.js';
8
+ export { c as compatibleSettingKinds, d as dashboardIssue, i as isBoundSetting, n as normalizeDashboard } from './dashboards-jGPM3AxF.js';
8
9
  import 'zod';
9
- import './accounts-_lNsiR2k.js';
10
- import './wallet-B7e06v4m.js';
11
- import './reward-deliveries-BCV8hznc.js';
10
+ import './accounts-C2O8mpB8.js';
11
+ import './reward-deliveries-BOWpMytr.js';
12
12
  import './action-9Xl0StBg.js';
13
- import './automatic-outcomes-BzAvfcpd.js';
14
- import './deployments-Cr1tfqrr.js';
15
- import './offers-Hw2P6tcK.js';
16
- import './catalog-ByZMRS7I.js';
17
- import './attempt-captures-BqPggxTU.js';
13
+ import './automatic-outcomes-BEnPn4Uh.js';
14
+ import './deployments-BVFd7ddA.js';
15
+ import './offers-BpYenB9i.js';
16
+ import './catalog-CbiftcxQ.js';
17
+ import './attempt-captures-ClHAoo_n.js';
18
18
 
19
19
  /** The hosts a developer machine serves over plain HTTP: browser tests, `vite` dev and the local stack. */
20
20
  declare const loopbackHosts: readonly string[];
@@ -29,6 +29,24 @@ declare function secureOrLoopbackOrigin(url: URL, options?: {
29
29
  /** Whether `url` is an origin and nothing more: no credentials, path, query or fragment. */
30
30
  declare function bareOrigin(url: URL): boolean;
31
31
 
32
+ /**
33
+ * The one form Relay stores and compares a Solana or EVM address in, or null when it is not one:
34
+ * a 32-byte key in canonical base58, or 20 bytes of hex returned EIP-55 checksummed. Mixed-case
35
+ * hex must carry a valid checksum; one-case hex has none to check.
36
+ */
37
+ declare function canonicalWalletAddress(chain: "solana" | "eip155", address: string): string | null;
38
+ /**
39
+ * Whether `signature` is `address`'s signature over exactly `message`. Solana: base58 key and
40
+ * 64-byte base58 signature. EVM: `0x` and 130 hex digits, by an externally owned account; a
41
+ * smart-contract wallet's (ERC-1271) needs the chain and is not checked here.
42
+ */
43
+ declare function walletSignatureValid(input: {
44
+ chain: "solana" | "eip155";
45
+ address: string;
46
+ message: string;
47
+ signature: string;
48
+ }): Promise<boolean>;
49
+
32
50
  /** The management client's and the CLI's default deadline per call. */
33
51
  declare const MANAGEMENT_TIMEOUT = 30000;
34
52
  /** One call's deadline and the caller's signal, shared by every attempt and the body read. */
@@ -74,4 +92,4 @@ type Rules = {
74
92
  */
75
93
  declare function retrying<T>(life: Lifetime, rules: Rules, attempt: () => Promise<T>): Promise<T>;
76
94
 
77
- export { type AttemptFailure, type Lifetime, MANAGEMENT_TIMEOUT, bareOrigin, lifetime, loopbackHosts, retryAfter, retrying, secureOrLoopbackOrigin };
95
+ export { type AttemptFailure, type Lifetime, MANAGEMENT_TIMEOUT, bareOrigin, canonicalWalletAddress, lifetime, loopbackHosts, retryAfter, retrying, secureOrLoopbackOrigin, walletSignatureValid };
package/dist/internal.js CHANGED
@@ -1,26 +1,26 @@
1
1
  import {
2
2
  REFERRAL_INTEGRATION_REWARD_ERROR,
3
+ canonicalWalletAddress,
3
4
  containsReferralIntegrationReward,
4
5
  managementTransport,
5
6
  questConfiguration,
6
- sequenceCursorSchema
7
- } from "./chunk-KHXCURXB.js";
7
+ sequenceCursorSchema,
8
+ walletSignatureValid
9
+ } from "./chunk-JK3XV2CR.js";
8
10
  import {
9
11
  parseImageExtraction,
10
12
  parseImageResult
11
- } from "./chunk-FU3W4IQN.js";
13
+ } from "./chunk-RWR2LOPA.js";
12
14
  import {
13
15
  sourceDataSchema,
14
16
  sourceRoles,
15
17
  validateQuestShape
16
- } from "./chunk-5DYS2OIP.js";
17
- import {
18
- bareOrigin,
19
- loopbackHosts,
20
- secureOrLoopbackOrigin
21
- } from "./chunk-UZ765UGH.js";
18
+ } from "./chunk-MVQQDPQX.js";
22
19
  import {
23
20
  accountVouchedBySchema,
21
+ appLoginOriginSchema,
22
+ bareOrigin,
23
+ httpsOriginSchema,
24
24
  identityIntegrationAccountVouchingInputSchema,
25
25
  identityIntegrationAppSecretSchema,
26
26
  identityIntegrationInputSchema,
@@ -28,41 +28,45 @@ import {
28
28
  identityIntegrationSchema,
29
29
  identityIntegrationSecretSchema,
30
30
  identityKindClaimSchema,
31
+ loopbackHosts,
31
32
  nextScheduleRun,
32
33
  participantExchangeAccountResultSchema,
33
34
  participantExchangeAccountsSchema,
34
35
  participantExchangeResultSchema,
35
- participantExchangeSchema
36
- } from "./chunk-CJDB6W6I.js";
36
+ participantExchangeSchema,
37
+ secureOrLoopbackOrigin
38
+ } from "./chunk-Q5QVAF7R.js";
37
39
  import {
38
40
  isIntegrationParticipantPath,
39
41
  isParticipantRoute,
40
42
  participantRoutePattern,
41
43
  participantRoutes
42
44
  } from "./chunk-U66GUVSG.js";
43
- import "./chunk-M66Y5OMJ.js";
44
- import "./chunk-ANVAUOJP.js";
45
+ import "./chunk-KUNPCDN6.js";
46
+ import "./chunk-X3FMVRMM.js";
45
47
  import {
46
48
  dashboardIssue,
47
49
  normalizeDashboard
48
- } from "./chunk-QYHEHMCG.js";
50
+ } from "./chunk-QYC3CZVD.js";
49
51
  import "./chunk-MWMCQLCG.js";
50
52
  import {
51
53
  hostEnvironmentPath,
52
54
  hostEnvironmentSchema
53
55
  } from "./chunk-UYVJZR33.js";
54
- import "./chunk-5BMZZDGY.js";
56
+ import "./chunk-UWUS4OOV.js";
57
+ import "./chunk-Q6KTTVOI.js";
55
58
  import {
56
59
  MANAGEMENT_TIMEOUT,
57
60
  lifetime,
58
61
  retryAfter,
59
62
  retrying
60
- } from "./chunk-TCYDFNV4.js";
61
- import "./chunk-CGUL4MRE.js";
62
- import "./chunk-7MQCQYEE.js";
63
- import "./chunk-5LD5DKOM.js";
63
+ } from "./chunk-5SBA6X5X.js";
64
+ import "./chunk-NRMQVK2W.js";
65
+ import "./chunk-DSJ46QLB.js";
66
+ import "./chunk-5DZNMLDM.js";
64
67
  import {
65
68
  compatibleSettingKinds,
69
+ evmWalletOn,
66
70
  isBoundSetting,
67
71
  schemaCheckedReader,
68
72
  sourceContent,
@@ -73,18 +77,22 @@ import {
73
77
  trackerDataRecordSteps,
74
78
  whereSchemaIssue,
75
79
  whereSettings
76
- } from "./chunk-XCEGNKGH.js";
80
+ } from "./chunk-P33ZAJMS.js";
77
81
  import "./chunk-FGXLXENM.js";
78
82
  export {
79
83
  MANAGEMENT_TIMEOUT,
80
84
  REFERRAL_INTEGRATION_REWARD_ERROR,
81
85
  accountVouchedBySchema,
86
+ appLoginOriginSchema,
82
87
  bareOrigin,
88
+ canonicalWalletAddress,
83
89
  compatibleSettingKinds,
84
90
  containsReferralIntegrationReward,
85
91
  dashboardIssue,
92
+ evmWalletOn,
86
93
  hostEnvironmentPath,
87
94
  hostEnvironmentSchema,
95
+ httpsOriginSchema,
88
96
  identityIntegrationAccountVouchingInputSchema,
89
97
  identityIntegrationAppSecretSchema,
90
98
  identityIntegrationInputSchema,
@@ -123,6 +131,7 @@ export {
123
131
  trackerDataPathTypes,
124
132
  trackerDataRecordSteps,
125
133
  validateQuestShape,
134
+ walletSignatureValid,
126
135
  whereSchemaIssue,
127
136
  whereSettings
128
137
  };
@@ -1,5 +1,5 @@
1
1
  import * as z from 'zod';
2
- import { aa as PhotoResult, V as AttemptCodeSource } from './accounts-_lNsiR2k.js';
2
+ import { aa as PhotoResult, V as AttemptCodeSource } from './accounts-C2O8mpB8.js';
3
3
 
4
4
  /**
5
5
  * Quest code names an image; the platform fetches, decodes and pins it. No bytes or URLs cross the
@@ -1,6 +1,6 @@
1
1
  import * as z from 'zod';
2
- import { R as ResourceHandle } from './tracker-data-Bl-qPIvZ.js';
3
- import { Z as AuthoringIdentity } from './accounts-_lNsiR2k.js';
2
+ import { R as ResourceHandle } from './tracker-data-BqY-9Vu-.js';
3
+ import { Z as AuthoringIdentity } from './accounts-C2O8mpB8.js';
4
4
 
5
5
  declare const badgePropertiesSchema: z.ZodObject<{
6
6
  name: z.ZodString;
@@ -1,6 +1,6 @@
1
- import { M as MemberImportVouchedAccount, P as ParticipantExchangeAccountResult, a as ParticipantExchangeResult, I as IdentityIntegrationKey } from './identity-integration-Ci2vGKtX.js';
1
+ import { M as MemberImportVouchedAccount, P as ParticipantExchangeAccountResult, a as ParticipantExchangeResult, I as IdentityIntegrationKey } from './identity-integration-W1Vo3Ql9.js';
2
2
  import { R as RequestError } from './request-error-D_dUPLwo.js';
3
- import './tracker-data-Bl-qPIvZ.js';
3
+ import './tracker-data-BqY-9Vu-.js';
4
4
  import 'zod';
5
5
 
6
6
  /**
@@ -75,9 +75,9 @@ declare function inspectIntegrationKey(options: {
75
75
  /**
76
76
  * Use only in an app server route. authenticate must verify the app's own session.
77
77
  * `origin` is the app's exact HTTPS origin, or a loopback HTTP origin
78
- * (`http://localhost`, `http://127.0.0.1`, `http://[::1]`, any port) for a
79
- * local browser test. Relay registers only HTTPS origins, so a loopback origin
80
- * works only against an injected `fetch`, such as `createFakeRelay`'s.
78
+ * (`http://localhost`, `http://127.0.0.1`, `http://[::1]`, any port) for local
79
+ * development. Relay accepts a loopback origin on a Test key created for it, port
80
+ * included, or against an injected `fetch` such as `createFakeRelay`'s.
81
81
  * `authenticate` may also return `accounts` the app vouches belong to the user, which needs the
82
82
  * key's **Vouches accounts** setting; `onAccounts` receives each one's outcome, such as an account
83
83
  * another member holds.
@@ -1,29 +1,27 @@
1
- import {
2
- secureOrLoopbackOrigin
3
- } from "./chunk-UZ765UGH.js";
4
1
  import {
5
2
  identityIntegrationKeySchema,
6
3
  participantExchangeAccountsSchema,
7
- participantExchangeResultSchema
8
- } from "./chunk-CJDB6W6I.js";
4
+ participantExchangeResultSchema,
5
+ secureOrLoopbackOrigin
6
+ } from "./chunk-Q5QVAF7R.js";
9
7
  import {
10
8
  isParticipantRoute
11
9
  } from "./chunk-U66GUVSG.js";
12
- import "./chunk-M66Y5OMJ.js";
13
- import "./chunk-ANVAUOJP.js";
14
- import "./chunk-QYHEHMCG.js";
10
+ import "./chunk-KUNPCDN6.js";
11
+ import "./chunk-X3FMVRMM.js";
12
+ import "./chunk-QYC3CZVD.js";
15
13
  import "./chunk-MWMCQLCG.js";
16
14
  import {
17
15
  clientIdentity,
18
16
  retryAfter
19
- } from "./chunk-TCYDFNV4.js";
20
- import "./chunk-CGUL4MRE.js";
17
+ } from "./chunk-5SBA6X5X.js";
18
+ import "./chunk-NRMQVK2W.js";
21
19
  import {
22
20
  participantPrincipalSchema,
23
21
  sessionMember
24
- } from "./chunk-7MQCQYEE.js";
25
- import "./chunk-5LD5DKOM.js";
26
- import "./chunk-XCEGNKGH.js";
22
+ } from "./chunk-DSJ46QLB.js";
23
+ import "./chunk-5DZNMLDM.js";
24
+ import "./chunk-P33ZAJMS.js";
27
25
  import {
28
26
  RequestError,
29
27
  isRequestError
@@ -1,23 +1,23 @@
1
- import { B as Badge, c as MemberBadges, O as Offer, f as Redemption } from '../offers-Hw2P6tcK.js';
1
+ import { B as Badge, c as MemberBadges, O as Offer, f as Redemption } from '../offers-BpYenB9i.js';
2
2
  import { b as ParticipantSession, R as RelayEvent, P as ParticipantActivity, M as MemberSummary } from '../participant-activity-DXRq4s6K.js';
3
- import { g as RelayError, R as RelayClient, m as SubmissionDraft } from '../client-Cze4lfwA.js';
4
- import { P as Page, u as RewardDeliveryAction, e as CreatorAccountProvider, K as KnownConsentChannel, M as MemberConsent, n as QuestOutcomeQuery, l as QuestOutcome } from '../reward-deliveries-BCV8hznc.js';
5
- export { C as ConsentChannel, b as ConsentSource, c as ConsentState, d as CreatorAccount, f as CreatorAccounts, g as KnownConsentSource, h as KnownConsentState } from '../reward-deliveries-BCV8hznc.js';
3
+ import { g as RelayError, R as RelayClient, m as SubmissionDraft } from '../client-CZPewB9h.js';
4
+ import { P as Page, u as RewardDeliveryAction, e as CreatorAccountProvider, K as KnownConsentChannel, M as MemberConsent, n as QuestOutcomeQuery, l as QuestOutcome } from '../reward-deliveries-BOWpMytr.js';
5
+ export { C as ConsentChannel, b as ConsentSource, c as ConsentState, d as CreatorAccount, f as CreatorAccounts, g as KnownConsentSource, h as KnownConsentState } from '../reward-deliveries-BOWpMytr.js';
6
6
  import * as react from 'react';
7
7
  import { ReactNode } from 'react';
8
8
  import * as z from 'zod';
9
9
  import { z as z$1 } from 'zod';
10
- import { l as collectionViewSchema, b as QuestView } from '../catalog-ByZMRS7I.js';
11
- import { E as Entitlement, b as AttemptStatus, V as AttemptCodeSource, c as AuthProvider, J as SignInProvider, A as AccountConnection, I as SignInAccountStatus, p as LeaderboardPlacement, dN as referralSummarySchema, o as LeaderboardPage, u as PointEntry, t as PointBalances, y as PointLedgerReference, U as TieredRewardReference } from '../accounts-_lNsiR2k.js';
12
- export { S as SignInAccount, N as SignInProviderOption } from '../accounts-_lNsiR2k.js';
13
- import { c as SignInMethods, C as CosmosChains, d as SignInOption, P as ProviderSignInOption, f as SignInUnavailable, T as TelegramSignInOption, g as SignInWallet, D as DiscoveredWallet } from '../telegram-browser-BFs4u7lC.js';
14
- export { a as EmailSignInOption, O as OAuthSignInOption, b as SignInIcon, W as WalletSignInOption, t as telegramMiniAppInitData } from '../telegram-browser-BFs4u7lC.js';
15
- import { m as WalletSigner, k as WalletSignInNetwork, L as LinkedWallet, g as ProfileUpdate, f as ProfileSummary, b as ProfileCompletion, e as ProfileReferral } from '../wallet-B7e06v4m.js';
16
- export { T as TelegramAccountConnection, a as TelegramSignInMethods } from '../submission-input-ChL1aYNH.js';
17
- import '../tracker-data-Bl-qPIvZ.js';
10
+ import { l as collectionViewSchema, b as QuestView } from '../catalog-CbiftcxQ.js';
11
+ import { E as Entitlement, b as AttemptStatus, V as AttemptCodeSource, c as AuthProvider, J as SignInProvider, A as AccountConnection, I as SignInAccountStatus, p as LeaderboardPlacement, dN as referralSummarySchema, o as LeaderboardPage, u as PointEntry, t as PointBalances, y as PointLedgerReference, U as TieredRewardReference } from '../accounts-C2O8mpB8.js';
12
+ export { S as SignInAccount, N as SignInProviderOption } from '../accounts-C2O8mpB8.js';
13
+ import { c as SignInMethods, C as CosmosChains, d as SignInOption, P as ProviderSignInOption, f as SignInUnavailable, T as TelegramSignInOption, g as SignInWallet, D as DiscoveredWallet } from '../telegram-browser-657QqiQl.js';
14
+ export { a as EmailSignInOption, O as OAuthSignInOption, b as SignInIcon, W as WalletSignInOption, t as telegramMiniAppInitData } from '../telegram-browser-657QqiQl.js';
15
+ import { m as WalletSigner, k as WalletSignInNetwork, L as LinkedWallet, g as ProfileUpdate, f as ProfileSummary, b as ProfileCompletion, e as ProfileReferral } from '../wallet-Btng186v.js';
16
+ export { T as TelegramAccountConnection, a as TelegramSignInMethods } from '../submission-input-C152xIdn.js';
17
+ import '../tracker-data-BqY-9Vu-.js';
18
18
  import '../request-error-D_dUPLwo.js';
19
19
  import '../action-9Xl0StBg.js';
20
- import '../sign-in-providers-BAkGjSXo.js';
20
+ import '../sign-in-providers-BRYVOSlG.js';
21
21
 
22
22
  /**
23
23
  * A query's identity: plain JSON values, outermost group first, such as
@@ -2357,6 +2357,7 @@ declare function useWallets(): {
2357
2357
  verifiedAt: number;
2358
2358
  revision: number;
2359
2359
  signIn: boolean;
2360
+ provedOn?: `eip155:${number}` | undefined;
2360
2361
  }[];
2361
2362
  error: RelayError | null;
2362
2363
  refresh(): Promise<void>;
@@ -8,24 +8,25 @@ import {
8
8
  discoverSolanaWallets,
9
9
  readSignInMethods,
10
10
  signInOptionsFrom
11
- } from "../chunk-PNVQ4RBG.js";
11
+ } from "../chunk-BMJHFWVT.js";
12
12
  import {
13
13
  telegramMiniAppInitData
14
14
  } from "../chunk-FWLQ5XCS.js";
15
- import "../chunk-QZNLSK4U.js";
15
+ import "../chunk-Z2Z5DBNW.js";
16
16
  import {
17
17
  createRelayAction
18
18
  } from "../chunk-BQXRCJ3N.js";
19
19
  import "../chunk-2HHZV7U3.js";
20
20
  import "../chunk-UYVJZR33.js";
21
- import "../chunk-5BMZZDGY.js";
22
- import "../chunk-TCYDFNV4.js";
23
- import "../chunk-CGUL4MRE.js";
21
+ import "../chunk-UWUS4OOV.js";
22
+ import "../chunk-Q6KTTVOI.js";
23
+ import "../chunk-5SBA6X5X.js";
24
+ import "../chunk-NRMQVK2W.js";
24
25
  import {
25
26
  sessionMember
26
- } from "../chunk-7MQCQYEE.js";
27
- import "../chunk-5LD5DKOM.js";
28
- import "../chunk-XCEGNKGH.js";
27
+ } from "../chunk-DSJ46QLB.js";
28
+ import "../chunk-5DZNMLDM.js";
29
+ import "../chunk-P33ZAJMS.js";
29
30
  import {
30
31
  RelayError,
31
32
  RelayErrorCode,
@@ -1,5 +1,5 @@
1
1
  import * as z from 'zod';
2
- import { T as TrackerSkipCode, S as SkipEnrollment } from './tracker-data-Bl-qPIvZ.js';
2
+ import { T as TrackerSkipCode, S as SkipEnrollment } from './tracker-data-BqY-9Vu-.js';
3
3
 
4
4
  /**
5
5
  * The longest wording Relay stores: a checkbox label with a link to the policy fits.
@@ -1 +1 @@
1
- import{$ as de,$a as A,$c as Oe,$h as H,Aa as Ot,Ab as Q,Ad as Ge,Ba as Nt,Bb as Ae,Bd as _e,Ca as he,Cd as He,Eb as Re,Fa as Kt,Fe as Gt,Fi as bt,Ga as pe,Ge as _t,H as ne,Ha as Qt,He as Ht,I as ae,Ia as Ut,Ic as Be,Ie as nt,J as oe,Je as at,K as se,Ka as ke,L as ce,Lc as Pe,Ld as W,Le as ot,Md as I,Na as Vt,Ne as st,Oa as Wt,Pd as Z,Pe as ct,Qc as De,Qd as F,Qh as Jt,Ra as we,Rd as Je,Rh as gt,Sa as ve,Sh as ht,Ta as ye,Th as pt,Ua as be,Uc as Ie,Ud as Xe,Uh as kt,Va as Se,Vd as Ye,Vh as Xt,Wa as Ee,Wd as et,Xd as E,Xh as Yt,Y as ie,Yd as tt,Z as ue,Zh as wt,_ as Pt,_e as G,_h as vt,a as q,ab as qe,ae as C,af as R,b as P,ba as Dt,bb as Ce,bd as Ne,ca as le,cb as xe,d as re,de as Zt,df as it,ea as K,gh as ft,ke as b,ld as Ke,le as rt,lf as _,md as Qe,me as x,nf as ut,oc as U,oe as Ft,pc as Le,pd as Ue,pg as lt,pi as yt,qb as Me,qc as V,qd as Ve,rb as $e,rc as Te,ta as me,vb as ze,vf as dt,wa as fe,wb as D,wd as We,wg as mt,xa as It,ya as ge,yd as Ze,zb as je,zd as Fe}from"./chunks/C5V267I7.js";import{Cb as $,Ec as j,Kb as Y,Pd as Bt,fc as ee,ic as N,jc as te,va as X,wc as B}from"./chunks/EWU4OKSY.js";function St(e){if(!Number.isInteger(e)||e<0||e>255)throw new Error("Token decimals must be an integer from 0 to 255")}function er(e,r){St(r);let t=/^(\d+)(?:\.(\d+))?$/.exec(e.trim());if(!t)throw new Error(`Use a decimal amount such as "1.5", not "${e}"`);let[,n,a=""]=t,c=a.replace(/0+$/,"");if(c.length>r)throw new Error(`"${e}" has more than ${r} decimal places, which this token cannot hold`);return BigInt(n+c.padEnd(r,"0"))}function tr(e,r){St(r);let t=typeof e=="bigint"?e:BigInt(e),n=t<0n?"-":"",a=(t<0n?-t:t).toString().padStart(r+1,"0"),c=a.slice(0,a.length-r),i=a.slice(a.length-r).replace(/0+$/,"");return n+c+(i?"."+i:"")}function qt(e,r={}){let{trigger:t,completion:n,requires:a,performance:c,retryCooldownMs:i,completionCooldownMs:u,authorBudgets:d=[]}=e,s=t.kind==="automatic"?t.tracker:void 0,m=s?.content===!0;if(c&&!m)throw new Error("Performance requires a content quest");if(!s&&d.length)throw new Error('A budget with scope "author" counts per tracker record author: use it only on a quest with a tracker trigger');if(m){if(n.kind!=="keyed"||n.across)throw new Error("Content quests complete once per content item");if(s.beneficiary!=="author"||s.on!=="new-record")throw new Error("A content quest pays each content item's author and fires on its first observation")}if(i!==void 0&&(t.kind!=="manual"||t.actor==="staff"))throw new Error("A retry cooldown applies only to quests members submit themselves");if(u!==void 0){if(t.kind!=="manual"||t.actor==="staff")throw new Error("A completion cooldown applies only to quests members submit themselves");if(n.kind==="once")throw new Error("A completion cooldown needs a quest members can complete more than once: this one completes once per member")}if(t.kind==="automatic"&&!s){if(!r.template&&a.length===0)throw new Error("Automatic quests need at least one prerequisite");if(n.kind!=="once")throw new Error("Prerequisite-only automatic quests complete once")}}var rr=["author"],nr=["author","messageAuthor"];function Ct(e){if(!Re(e))return[];switch(e.kind){case"x-search":return Me;case"discord-messages":return rr;case"discord-reactions":return nr;case"custom":return["author",...e.accounts??[]]}}var Et=new Map;function ar(e){let r=e.kind==="discord-messages"&&e.text?"messages-text":e.kind,t=Et.get(r);return t||(t=A(r==="messages-text"?be:r==="discord-messages"?ye:Se),Et.set(r,t)),t}function xt(e){switch(e.kind){case"x-search":return;case"discord-messages":case"discord-reactions":return ar(e);case"custom":return e.data}}function zt(e,r){let t=typeof e=="object"&&e!==null&&"kind"in e&&e.kind==="tier"&&"reward"in e&&typeof e.reward=="object"&&e.reward!==null?e.reward:null;return t&&"badge"in t&&t.badge!==void 0?`Badge rewards can only be granted by quests or manually, not by ${r}`:t&&"group"in t&&t.group!==void 0?`Group membership rewards can only be granted by quests, not by ${r}`:null}function J(e,r,t,n){for(let[a,c]of r.entries()){let i=zt(c,n);i&&e.addIssue({code:"custom",message:i,path:[...t,a]})}}function Lr(e){return b("badge",q("Badge",re,e))}function Tr(e){return b("ledger",q("Point ledger",mt,e))}function Br(e){let{target:r,ledger:t,...n}=e,a=wt.parse({...n,qualifiedBy:e.qualifiedBy.key,balance:x(t)}),c=B(j(e.metrics),H.shape.target);return{key:a.key,describe:()=>a,score(i){let u=vt.parse(i);return H.parse({target:r({metrics:c.parse(u.metrics)}),baseline:r({metrics:c.parse(u.baseline)})})}}}var sr=e=>{if("timeZone"in e)throw new Error("streak() no longer takes a timeZone. Set the project timezone with calendar.timeZone in relay.json or in Console settings.");return Be.strict().parse({kind:"streak",...e})},Pr=e=>Le.brand().parse({kind:"count",count:e}),Dr=(e,r={})=>V.brand().parse({kind:"calendar",period:e,...r}),Ir=({days:e})=>V.brand().parse({kind:"rolling",durationMs:e*864e5}),Or=e=>({kind:"quest",quest:e}),cr=bt.superRefine((e,r)=>{let t=zt(e.reward,"offers");t&&r.addIssue({code:"custom",message:t,path:["reward"]})});function Nr(e){return b("offer",q("Offer",cr,e))}var ir=yt.superRefine((e,r)=>{for(let t of["inviter","invitee"])J(r,e.rewards[t],["rewards",t],"referral programs");for(let[t,n]of e.milestones.entries())J(r,n.rewards,["milestones",t,"rewards"],"referral programs")});function Kr(e){let{qualification:r,inviterGroup:t,milestones:n,bonuses:a,...c}=e,i=q("Referral",ir,{...c,qualification:r.kind==="quest"?{kind:"quest",quest:r.quest.key}:r,...t?{inviterGroup:P.parse(t.key)}:{},milestones:n?.map(({key:u,...d})=>({...d,id:C({key:u,...d})})),bonuses:a?.map(({key:u,ledger:d,quests:s,...m})=>({...m,id:C({key:u,...m}),balance:x(d),quests:s?.map(y=>y.key)}))});return b("referral",i)}function Qr(e={}){return{kind:"earned",...e}}var ur=ft.superRefine((e,r)=>{for(let[t,n]of(e.settle?.prizes??[]).entries())J(r,n.rewards,["settle","prizes",t,"rewards"],"leaderboard prizes")});function dr(e){let r=e.ties??"shared";return!e.settle||e.settle.ties===r?null:`Leaderboard${e.key?` "${e.key}"`:""} orders equal scores "${r}" in its live standings${e.ties===void 0?" (ties left out)":""} but "${e.settle.ties}" when it settles, so the ranks members see are not the ranks prizes pay. Set ties: "${e.settle.ties}" beside settle.ties to show the order prizes pay.`}function Ur(e){let{ledger:r,group:t,score:n,settle:a,...c}=e,i=a?.pool,u=q("Leaderboard",ur,{...c,...a?{settle:{...a,prizes:a.prizes??[],...i?{pool:{...i,...i.ledger===void 0?{}:{ledger:x(i.ledger)}}}:{}}}:{},balance:x(r),...t?{group:P.parse(t.key)}:{},score:n?.kind==="earned"?{...n,quests:n.quests?.map(s=>s.key)}:n}),d=dr(u);return d&&console.warn(d),b("leaderboard",u)}var Vr={provider:"x",search:e=>ze.parse({kind:"x-search",...e})};function L(e,r){let{data:t,content:n,...a}=r??{};if(n!==void 0){if(t!==void 0)throw new Error(`customSource("${e}") takes data or content, not both: a content source's records carry { body, metrics }`);if(!Mt(n.body))throw new Error(`customSource("${e}") needs a content body schema: customSource(namespace, { content: { body: z.object({ ... }), metrics: ["likes"] } })`);let c=[...n.metrics??[]];for(let i of c)$e.parse(i);return D.parse({kind:"custom",namespace:e,...a,data:A(N({body:n.body,metrics:te(Object.fromEntries(c.map(i=>[i,$().int().safe().nonnegative().optional()]))).optional()})),content:{metrics:c}})}if(!Mt(t))throw new Error(`customSource("${e}") needs a data schema: customSource(namespace, { data: z.object({ ... }) }) describes each record's data`);return D.parse({kind:"custom",namespace:e,...a,data:A(t)})}function Mt(e){return typeof e=="object"&&e!==null&&"_zod"in e}function Wr(e){return b("tracker",q("Tracker",Ae,e))}function lr(e={}){return we.parse({kind:"discord-messages",...e.text?{text:!0}:{}})}function mr(){return ve.parse({kind:"discord-reactions"})}var Zr={provider:"discord",grantRole:e=>Ee.parse({kind:"integration",provider:"discord",action:"grant-role",roleId:e}),postMessage(e){return Fe.parse({provider:"discord",action:"post-message",...e})},messages:lr,reactions:mr,roles(e={}){return I.parse({provider:"discord",resource:"role",assignable:e.assignable??!1})},channels(e={}){return I.parse({provider:"discord",resource:"channel",types:e.types??["text","announcement"],...e.postable?{postable:!0}:{}})}},Fr={postMessage(e){return Ze.parse({provider:"telegram",action:"post-message",...e})},messages(){return L(ae,{identities:["member"],data:ue})},reactions(){return L(ne,{identities:["member"],accounts:["messageAuthor"],data:ie})}},Gr={shorts(){return L(oe,{identities:["member"],content:{body:gt,metrics:ht}})}},_r={videos(){return L(se,{identities:["member"],content:{body:pt,metrics:kt}})}};function fr(e){let{chain:r,token:t}=e,n=t===void 0?null:t;if(n!==null&&typeof n!="string")throw new Error("wallet.balances() takes the token as a string");if(r==="solana"||r===K){if(n!==null&&!de.safeParse(n).success)throw new Error("wallet.balances() on Solana takes an SPL or Token-2022 mint address (base58)");return{chain:K,token:n}}if(typeof r=="string"&&me(r)){if(n!==null&&!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("wallet.balances() on an EVM chain takes an ERC-20 contract address: 0x and 40 hex digits");return{chain:r,token:n}}if(typeof r=="string"&&/^cosmos:[-_a-zA-Z0-9]{1,32}$/.test(r)){if(n===null||!le.safeParse(n).success)throw new Error("wallet.balances() on a Cosmos chain takes a bank denomination such as uatom");return{chain:r,token:n}}throw new Error('wallet.balances() reads "solana", an EVM chain such as "eip155:8453" or a Cosmos network such as "cosmos:cosmoshub-4"')}var Hr={balances(e){let r=fr(e),t=L(ce,{identities:["wallet"],data:fe});return D.parse({...t,balance:r})}},Jr=()=>({provider:"domino",resource:"point-ledger"});function p(e,r){return r}var Xr={pointLedger(e){let r={...e,kind:"point-ledger",default:e.default?P.parse(e.default.key):""};return p("point-ledger",rt.prefault(r.default).meta(r))},datetime(e){let r={...e,kind:"datetime",default:Z.parse(e.default)};return p("datetime",Z.default(r.default).meta(r))},resource(e){let r={...e,source:I.parse(e.source),kind:"resource",default:F.parse(e.default??"")};return p("resource",F.default(r.default).meta(r))},quiz(e){let r=W.parse(e.default);return p("quiz",W.default(r).meta({...e,default:r,kind:"quiz"}))},text(e){let{secret:r,...t}=e,n={...t,kind:"text",default:"default"in e?e.default:"",minLength:e.minLength??(r?0:1),maxLength:e.maxLength??2e3,multiline:e.multiline??!1,...r?{secret:r}:{}};return p("text",E(n).default(n.default).meta(n))},telegramChat(e){let r={...e,kind:"text",default:e.default??"",minLength:0,maxLength:64,multiline:!1,picker:"telegram-chat"};return p("text",X().max(r.maxLength).default(r.default).meta(r))},amount(e){if(!Xe(e.default))throw new Error(`settings.amount() takes a base-unit integer string as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:100,multiline:!1,picker:"amount"};return p("text",E(r).default(r.default).meta(r))},chain(e){if(!Ye(e.default))throw new Error(`settings.chain() takes "solana" or an EVM chain ID such as "eip155:8453" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:64,multiline:!1,picker:"chain"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},nft(e){if(!ge(e.default))throw new Error(`settings.nft() takes an NFT collection such as "eip155:1/erc721:0x\u2026" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:200,multiline:!1,picker:"nft"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},contractCall(e){if(!he(e.default))throw new Error(`settings.contractCall() takes a contract call such as "eip155:8453:0x\u2026 function stakedOf(address) view returns (uint256)" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:400,multiline:!1,picker:"contract-call"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},contractEvent(e){if(!pe(e.default))throw new Error(`settings.contractEvent() takes a contract event such as "eip155:1:0x\u2026 Transfer(address indexed from, address indexed to, uint256 value)" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:1e3,multiline:!1,picker:"contract-event"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},solanaProgram(e){if(!ke(e.default))throw new Error(`settings.solanaProgram() takes a Solana program address such as "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:32,maxLength:44,multiline:!1,picker:"solana-program"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},integer(e){return p("integer",$().int().min(e.min).max(e.max).default(e.default).meta({...e,kind:"integer"}))},boolean(e){return p("boolean",Y().default(e.default).meta({...e,kind:"boolean"}))},choice(e){return p("choice",j(e.options).default(e.default).meta({...e,kind:"choice"}))},object(e){return N(e).strict()}};function jt(e,r){let t=e.balanceChanges.find(n=>n.mint===r);return t?BigInt(t.delta):0n}function en(e,r){let t=jt(e,r);return t>0n?t.toString():"0"}function tn(e,r){let t=jt(e,r);return t<0n?(-t).toString():"0"}function rn(e,r={}){let t=e.balanceChanges.filter(a=>BigInt(a.delta)>0n),n=e.balanceChanges.filter(a=>BigInt(a.delta)<0n);return t.some(a=>(r.into===void 0||a.mint===r.into)&&n.some(c=>c.mint!==a.mint&&(r.from===void 0||c.mint===r.from)))}function nn(e,r){return e.programs.includes(r)}function an(e,r){return e.instructions?.find(t=>t.name===r)?.args??null}var on=e=>st(e.key,e.name),sn=e=>ct(e.key,e.title),cn=(e,r)=>nt.parse({kind:"points",balance:x(e),amount:r}),un={text:(e={})=>({input:"text",constraints:_e.parse(e)}),url:(e={})=>({input:"url",constraints:He.parse(e)}),photo:()=>"photo",quiz:()=>"quiz"};function dn(e){if(e?.actor&&e.input!==void 0)throw new Error('manual() cannot combine actor "staff" with input: staff-captured evidence is not supported. Use manual({ actor: "staff" }) for a staff confirmation, or manual({ input }) for evidence the participant submits.');return typeof e?.input=="object"?{kind:"manual",...e.input}:{kind:"manual",input:e?.input??"none",...e?.actor?{actor:e.actor}:{}}}var At=new WeakMap,Rt=new WeakMap;function Lt(e,r){let{tracker:t,beneficiary:n="author",on:a,where:c,enrollment:i,since:u,historical:d,content:s}=e;if(!t?.source)throw new Error(r==="automatic"?"automatic() takes no argument, or { tracker } with a tracker handle from defineTracker":"content() takes { tracker } with a tracker handle from defineTracker");let{source:m}=t;if(!je(m))throw new Error('Tracker triggers need attributable records: declare customSource(namespace, { identities: ["wallet"] }) or other identity kinds');if(s&&!Q(m))throw new Error(`content() needs a tracker whose source has content: x.search(), or customSource(namespace, { content: { body, metrics } }). Tracker "${t.key}" has none; use automatic({ tracker }) instead.`);if(u==="enrollment"&&i!=="required")throw new Error(`${r}() counts from enrollment only on a quest that requires it: add enrollment: "required"`);let y=Ct(m);if(!y.includes(n))throw new Error(m.kind==="custom"?`Tracker "${t.key}" has no "${n}" account: declare it in customSource(namespace, { accounts: ["${n}"] })`:`Tracker "${t.key}" pays ${new Intl.ListFormat("en",{type:"disjunction"}).format(y.map(w=>`"${w}"`))}, not "${n}"`);let T=Ie.parse({tracker:t.key,source:m.kind,on:s?"new-record":a??Pe(m.kind,m.kind==="custom"?m.namespace:void 0),...c?{where:c}:{},beneficiary:n,...i==="required"?{enrollment:i}:{},...u&&u!=="activation"?{since:u}:{},...d&&d!==(s?"claim":"staff")?{historical:d}:{},...s?{content:s}:{}}),o=xt(m),l=o?xe(o,T.where):null;if(l)throw new Error(l);let g={kind:"automatic",tracker:T};o&&At.set(g,o);let S=Q(m);return S&&Rt.set(g,S.metrics),g}function ln(e){return e?Lt(e,"automatic"):{kind:"automatic"}}function mn(e){if(e&&typeof e=="object"&&"source"in e&&"key"in e&&!("tracker"in e))throw new Error("content() takes { tracker }: write content({ tracker: posts }) instead of content(posts)");return Lt({...e,content:!0},"content")}function gr(e){let{key:r,cost:t,...n}=e,a={...n,id:C(e),cost:typeof t=="number"?t:{balance:x(t.ledger)}};return n.scope==="author"?Qe.parse(a):Ke.parse(a)}var fn=gr,hr=(e=[])=>e.filter(r=>r.scope==="author"),pr=(e,r={})=>({kind:"keyed",key:e,...r.across?{across:r.across}:{}}),kr=e=>{let{distinct:r,...t}=e;return{...Te.parse({kind:"progress",window:{kind:"lifetime"},...t}),distinct:r}},gn=()=>({kind:"untracked"}),hn=()=>({kind:"staff-handover"}),pn=()=>({kind:"automatic"});function kn(e){let{key:r,tiers:t,...n}=e,a=C(e),c=at.parse({id:a,...n,tiers:t.map(({key:i,...u})=>({...u,id:C({key:i,...u})}))});return b("tiered-reward",{key:c.id,tier:i=>ot.parse({kind:"tier",reward:c,tier:i})})}var wr=()=>({kind:"once"});function vr(e={}){return{kind:"accept",...e}}function yr(e){return{kind:"review",...e}}var M={accept:vr,defer:e=>({kind:"defer",...e}),progress:e=>({kind:"progress",...e}),reject:e=>({kind:"reject",...e}),review:yr};function $t(e){let r=e.kind==="reject"&&e.code!==void 0?Ne(e.code):null;if(r)throw new Error(r)}var wn={quiz(e,r={}){let t=dt.parse(e),n=Object.keys(t),a=$().int().min(1).max(n.length).parse(r.minimumCorrect??n.length);return async({input:c})=>{let i=Object.keys(c.answers).length===n.length&&n.every(d=>Object.hasOwn(c.answers,d)),u=n.filter(d=>c.answers[d]===t[d]).length;return i&&u>=a?M.accept():M.reject({reason:"Review your answers and try again."})}},photo(e){return async r=>{let t=e(r),n=await r.review.photo({image:r.input.photo,criteria:t.criteria});return n.kind==="unclear"?t.unclear==="human-review"?M.review({reason:n.reason}):M.reject({reason:n.reason}):n.kind==="pass"?M.accept():M.reject({reason:n.reason})}}},br={once:wr,keyed:pr,streak:sr,progress:kr};function Tt(e){return function(t){let n=C(t),a=[...new Set((t.integrations??[]).map(o=>Ve.parse(o.provider)))],c=a.flatMap(o=>{let l=Ue.safeParse(o);return l.success?[l.data]:[]}),i=t.trigger.kind==="automatic"&&t.trigger.tracker?.content===!0,u=t.trigger.kind==="automatic"&&t.trigger.tracker!==void 0,d=t.completion,s=typeof d=="function"?d(br):d;if(i&&s!==void 0)throw new Error("A content quest completes once per content item: remove its completion");if(!i&&s===void 0)throw new Error("A quest needs a completion, such as once(), keyed(...), streak(...) or progress(...)");let m=hr(t.budgets);if(qt({trigger:t.trigger,completion:s??{kind:"keyed"},requires:t.requires??[],authorBudgets:m,performance:t.performance?U.parse({metrics:t.performance.metrics,maxAgeMs:t.performance.maxAgeMs}):void 0,...t.retryCooldownMs===void 0?{}:{retryCooldownMs:t.retryCooldownMs},...t.completionCooldownMs===void 0?{}:{completionCooldownMs:t.completionCooldownMs}},{template:e}),t.retryCooldownMs!==void 0&&!G.safeParse(t.retryCooldownMs).success)throw new Error("retryCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(t.completionCooldownMs!==void 0&&!G.safeParse(t.completionCooldownMs).success)throw new Error("completionCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(t.performance){let o=Rt.get(t.trigger)??[],l=t.performance.metrics.filter(g=>!o.includes(g));if(l.length)throw new Error(`The tracker's source does not measure ${l.join(", ")}`)}if(t.trigger.kind==="manual"&&t.trigger.input!=="none"&&!t.evaluate)throw new Error("Evidence quests require an evaluator");let y=Object.fromEntries(Object.entries(t.settings.shape).map(([o,l])=>{let g=Je.safeParse(l.meta());if(!g.success)throw new Error(`Setting "${o}" is not a quest setting: build it with a settings builder, such as settings.integer({ label, default, min, max })`);if(g.data.kind==="text"&&g.data.secret&&g.data.default!=="")throw new Error(`Secret setting "${o}" must default to "": set its value in Console, not in source or deploy settings`);return[o,g.data]}));for(let o of De(t.trigger.kind==="automatic"?t.trigger.tracker?.where:void 0))if(!et(y[o]))throw new Error(`The tracker filter compares with setting "${o}", which is not an integer or amount setting`);function T(o){let l=t.settings.parse(o),g=tt(y,l),S=it.parse(typeof t.rewards=="function"?t.rewards({settings:l}):t.rewards),w=ee(Ge).max(3,"A quest posts at most three announcements").parse((typeof t.announcements=="function"?t.announcements({settings:l}):t.announcements)??[]),z=t.trigger.kind==="automatic"&&t.trigger.tracker!==void 0;for(let f of w){let v=We(f.text),O="segments"in v&&v.segments.some(k=>k.kind==="placeholder"&&k.name==="author");if(!z&&O)throw new Error("An announcement names {author} only on a quest with an automatic tracker trigger");if(!z&&f.replyToTriggeringMessage)throw new Error("An announcement replies to the triggering message only on a quest with an automatic tracker trigger")}let h=[...S.flatMap(f=>f.kind==="integration"?[f.provider]:[]),...w.flatMap(f=>f.provider==="discord"?["discord"]:[]),...Object.values(y).flatMap(f=>f.kind==="resource"&&f.source.provider!=="domino"?[f.source.provider]:[])];for(let f of h)if(!c.includes(f))throw new Error(`Declare the ${f} integration on this quest`);return ut.parse({quest:n,evaluatorProtocol:_,title:typeof t.title=="function"?t.title({settings:l}):t.title,presentation:t.presentation?.({settings:l})??{},fields:y,values:g,rewards:S,...w.length?{announcements:w}:{},humanReview:t.review?.({settings:l})?.enabled??!0,trigger:t.trigger,...t.performance?{performance:U.parse({metrics:t.performance.metrics,maxAgeMs:t.performance.maxAgeMs})}:{},integrations:c,...a.length>c.length?{integrationModules:a}:{},completion:s?s.kind==="progress"?{kind:s.kind,goal:s.goal,window:s.window,repeat:s.repeat}:s.kind==="streak"?s:s.kind==="keyed"&&s.across?{kind:s.kind,across:s.across}:{kind:s.kind}:{kind:"keyed"},visibility:t.visibility??"visible",profile:t.profile??{visible:!1},budgets:(t.budgets??[]).filter(f=>f.scope!=="author"),...m.length?{authorBudgets:m}:{},requires:t.requires??[],...t.campaign?{campaign:t.campaign}:{},...t.availability?{availability:t.availability}:{},...t.retryCooldownMs===void 0?{}:{retryCooldownMs:t.retryCooldownMs},...t.completionCooldownMs===void 0?{}:{completionCooldownMs:t.completionCooldownMs}})}return b("quest",{protocol:_,key:n,describe:T,async evaluate(o){let l=t.settings.parse(o.settings),g=u?Oe.parse(o.tracker):null,S=At.get(t.trigger),w=g&&S?qe(S,g.record.data):null;if(w)return R.parse({kind:"reject",reason:`The record's data does not match the data schema this quest was built with: ${w.path} ${w.reason}`});let z=g;if(o.performance){if(!t.performance)throw new Error("Quest has no performance evaluator");let v=lt.parse(o.performance),O=B(j(t.performance.metrics),$().int().safe().nonnegative()).parse(v.metrics),k=await t.performance.evaluate({settings:l,member:o.member,tracker:z,metrics:O,observedAt:v.observedAt});if(!k)throw new Error("Performance evaluator returned no decision");if(k.rewards!==void 0)throw new Error("A performance evaluator cannot select rewards. It gates the rewards content evaluation selected: return accept, review or reject with a reason only.");return $t(k),R.parse(k.kind==="accept"?{kind:"accept",rewards:v.rewards}:k.kind==="review"&&o.humanReview?{kind:"review",reason:k.reason,rewards:v.rewards}:{kind:"reject",reason:k.reason,...k.kind==="review"?{requestedReview:!0}:k.code===void 0?{}:{code:k.code}})}let h=t.evaluate?await t.evaluate({settings:l,member:o.member,input:o.input,tracker:z,eligibleAt:o.eligibleAt,calendar:o.calendar,now:o.now,review:o.review,trackers:Ce(o.trackers),wallet:o.wallet,images:o.images,...o.telegram?{telegram:o.telegram}:{},...Object.fromEntries(c.map(v=>[v,o[v]]))}):M.accept();if(!h)throw new Error("Evaluator returned no decision");if($t(h),h.kind==="review"&&!o.humanReview)return R.parse({kind:"reject",reason:h.reason,requestedReview:!0});(h.kind==="accept"||h.kind==="review")&&h.completionKey!==void 0&&s?.kind!=="keyed"&&o.diagnose?.({code:"completion-key-ignored",message:Sr(s,h.completionKey)});let f={...o,settings:l,tracker:g};return R.parse(h.kind==="accept"||h.kind==="review"?{...h,rewards:h.rewards??o.rewards,...s?.kind==="keyed"||s?.kind==="progress"?{completionKey:s.kind==="progress"?s.distinct(f):h.completionKey??s.key(f)}:{}}:h)}})}}function Sr(e,r){let t=`ignores completionKey ${JSON.stringify(r)}`;switch(e?.kind){case void 0:return`A content quest completes once per content item, under a key Relay sets, so it ${t}`;case"once":return`once() completes the quest once per member and ${t}: use keyed(...) to complete it once per key`;case"streak":return`streak(...) keys its own completions and ${t}`;case"progress":return`progress(...) keys each contribution with its distinct(...) and ${t}: derive the key in distinct(...)`}}var vn=Tt(!1),yn=Tt(!0);export{Yt as CapabilityError,ln as automatic,pn as automaticFulfillment,on as badge,_t as balanceAtLeast,fn as budget,Dr as calendar,Xt as capabilityErrorCodes,Gt as completed,mn as content,le as cosmosDenomSchema,Dt as cosmosNetworkSchema,Pr as count,L as customSource,M as decision,Lr as defineBadge,Zt as defineCampaign,Jt as defineDashboard,Br as defineEngagementReward,Ft as defineGroup,Ur as defineLeaderboard,Tr as defineLedger,Nr as defineOffer,vn as defineQuest,yn as defineQuestType,Kr as defineReferral,kn as defineTieredReward,Wr as defineTracker,Zr as discord,Qr as earned,wn as evaluators,un as evidence,tr as formatUnits,sn as groupMembership,Ht as inGroup,an as instruction,nn as invoked,he as isContractCall,pe as isContractEvent,me as isEvmChainId,ge as isNftCollection,ke as isSolanaProgram,pr as keyed,dr as leaderboardTiesWarning,Pt as limits,dn as manual,Qt as maxWalletEventLogs,Ut as maxWalletEventLookback,Wt as maxWalletTransactionLookback,Vt as maxWalletTransactions,wr as once,Nt as parseContractCall,Kt as parseContractEvent,Ot as parseContractFunction,It as parseNftCollection,er as parseUnits,Jr as pointLedgers,cn as points,kr as progress,Or as questCompleted,en as received,Ir as rolling,Xr as settings,tn as spent,hn as staffHandover,sr as streak,rn as swapped,Fr as telegram,_r as tiktok,A as trackerDataSchema,Oe as trackerTriggerContextSchema,gn as untracked,Hr as wallet,Vr as x,Gr as youtube,Bt as z};
1
+ import{$ as ue,$h as vt,Aa as he,Ad as Fe,Bb as Ae,Bd as Ge,Ca as Nt,Cb as K,Cd as _e,Da as Kt,Db as Re,Dd as He,Ea as pe,Ed as Je,Gb as Le,H as re,Ha as Qt,He as _t,Hi as St,I as ne,Ia as ke,Ie as Ht,J as ae,Ja as Ut,Je as Jt,K as oe,Ka as Vt,Kc as De,Ke as at,L as se,Le as ot,Ma as we,Nc as Pe,Nd as V,Ne as st,Od as I,Pa as Wt,Pe as ct,Qa as Zt,Rd as W,Re as it,Sc as Ie,Sd as Z,Sh as Xt,Ta as ve,Td as Xe,Th as ht,Ua as ye,Uh as pt,Va as be,Vh as kt,Wa as Se,Wc as Oe,Wd as Ye,Wh as wt,Xa as Ee,Xd as et,Xh as Yt,Y as ce,Ya as qe,Yd as tt,Z as ie,Zd as E,Zh as er,_ as Pt,_d as rt,a as q,af as F,ai as yt,b as D,ba as It,bb as A,bd as Ne,bi as _,ca as de,cb as Ce,ce as C,cf as R,d as te,db as xe,dd as Ke,ea as le,eb as Me,fe as Ft,ff as ut,ga as me,ih as gt,ma as fe,me as b,nd as Qe,ne as nt,nf as G,od as Ue,oe as x,pf as dt,qc as Q,qe as Gt,rc as Te,rd as Ve,rg as mt,ri as bt,sb as $e,sc as U,sd as We,tb as ze,tc as Be,xb as je,xf as lt,ya as ge,yb as P,yd as Ze,yg as ft,za as Ot}from"./chunks/C2MGLQXC.js";import{Cb as $,Ec as j,Kb as X,Pd as Dt,fc as Y,ic as N,jc as ee,va as J,wc as B}from"./chunks/EWU4OKSY.js";function Et(e){if(!Number.isInteger(e)||e<0||e>255)throw new Error("Token decimals must be an integer from 0 to 255")}function tr(e,r){Et(r);let t=/^(\d+)(?:\.(\d+))?$/.exec(e.trim());if(!t)throw new Error(`Use a decimal amount such as "1.5", not "${e}"`);let[,n,a=""]=t,c=a.replace(/0+$/,"");if(c.length>r)throw new Error(`"${e}" has more than ${r} decimal places, which this token cannot hold`);return BigInt(n+c.padEnd(r,"0"))}function rr(e,r){Et(r);let t=typeof e=="bigint"?e:BigInt(e),n=t<0n?"-":"",a=(t<0n?-t:t).toString().padStart(r+1,"0"),c=a.slice(0,a.length-r),i=a.slice(a.length-r).replace(/0+$/,"");return n+c+(i?"."+i:"")}function Ct(e,r={}){let{trigger:t,completion:n,requires:a,performance:c,retryCooldownMs:i,completionCooldownMs:u,authorBudgets:d=[]}=e,s=t.kind==="automatic"?t.tracker:void 0,m=s?.content===!0;if(c&&!m)throw new Error("Performance requires a content quest");if(!s&&d.length)throw new Error('A budget with scope "author" counts per tracker record author: use it only on a quest with a tracker trigger');if(m){if(n.kind!=="keyed"||n.across)throw new Error("Content quests complete once per content item");if(s.beneficiary!=="author"||s.on!=="new-record")throw new Error("A content quest pays each content item's author and fires on its first observation")}if(i!==void 0&&(t.kind!=="manual"||t.actor==="staff"))throw new Error("A retry cooldown applies only to quests members submit themselves");if(u!==void 0){if(t.kind!=="manual"||t.actor==="staff")throw new Error("A completion cooldown applies only to quests members submit themselves");if(n.kind==="once")throw new Error("A completion cooldown needs a quest members can complete more than once: this one completes once per member")}if(t.kind==="automatic"&&!s){if(!r.template&&a.length===0)throw new Error("Automatic quests need at least one prerequisite");if(n.kind!=="once")throw new Error("Prerequisite-only automatic quests complete once")}}var nr=["author"],ar=["author","messageAuthor"];function xt(e){if(!Le(e))return[];switch(e.kind){case"x-search":return $e;case"discord-messages":return nr;case"discord-reactions":return ar;case"custom":return["author",...e.accounts??[]]}}var qt=new Map;function or(e){let r=e.kind==="discord-messages"&&e.text?"messages-text":e.kind,t=qt.get(r);return t||(t=A(r==="messages-text"?Se:r==="discord-messages"?be:Ee),qt.set(r,t)),t}function Mt(e){switch(e.kind){case"x-search":return;case"discord-messages":case"discord-reactions":return or(e);case"custom":return e.data}}function jt(e,r){let t=typeof e=="object"&&e!==null&&"kind"in e&&e.kind==="tier"&&"reward"in e&&typeof e.reward=="object"&&e.reward!==null?e.reward:null;return t&&"badge"in t&&t.badge!==void 0?`Badge rewards can only be granted by quests or manually, not by ${r}`:t&&"group"in t&&t.group!==void 0?`Group membership rewards can only be granted by quests, not by ${r}`:null}function H(e,r,t,n){for(let[a,c]of r.entries()){let i=jt(c,n);i&&e.addIssue({code:"custom",message:i,path:[...t,a]})}}function Tr(e){return b("badge",q("Badge",te,e))}function Br(e){return b("ledger",q("Point ledger",ft,e))}function Dr(e){let{target:r,ledger:t,...n}=e,a=vt.parse({...n,qualifiedBy:e.qualifiedBy.key,balance:x(t)}),c=B(j(e.metrics),_.shape.target);return{key:a.key,describe:()=>a,score(i){let u=yt.parse(i);return _.parse({target:r({metrics:c.parse(u.metrics)}),baseline:r({metrics:c.parse(u.baseline)})})}}}var cr=e=>{if("timeZone"in e)throw new Error("streak() no longer takes a timeZone. Set the project timezone with calendar.timeZone in relay.json or in Console settings.");return De.strict().parse({kind:"streak",...e})},Pr=e=>Te.brand().parse({kind:"count",count:e}),Ir=(e,r={})=>U.brand().parse({kind:"calendar",period:e,...r}),Or=({days:e})=>U.brand().parse({kind:"rolling",durationMs:e*864e5}),Nr=e=>({kind:"quest",quest:e}),ir=St.superRefine((e,r)=>{let t=jt(e.reward,"offers");t&&r.addIssue({code:"custom",message:t,path:["reward"]})});function Kr(e){return b("offer",q("Offer",ir,e))}var ur=bt.superRefine((e,r)=>{for(let t of["inviter","invitee"])H(r,e.rewards[t],["rewards",t],"referral programs");for(let[t,n]of e.milestones.entries())H(r,n.rewards,["milestones",t,"rewards"],"referral programs")});function Qr(e){let{qualification:r,inviterGroup:t,milestones:n,bonuses:a,...c}=e,i=q("Referral",ur,{...c,qualification:r.kind==="quest"?{kind:"quest",quest:r.quest.key}:r,...t?{inviterGroup:D.parse(t.key)}:{},milestones:n?.map(({key:u,...d})=>({...d,id:C({key:u,...d})})),bonuses:a?.map(({key:u,ledger:d,quests:s,...m})=>({...m,id:C({key:u,...m}),balance:x(d),quests:s?.map(y=>y.key)}))});return b("referral",i)}function Ur(e={}){return{kind:"earned",...e}}var dr=gt.superRefine((e,r)=>{for(let[t,n]of(e.settle?.prizes??[]).entries())H(r,n.rewards,["settle","prizes",t,"rewards"],"leaderboard prizes")});function lr(e){let r=e.ties??"shared";return!e.settle||e.settle.ties===r?null:`Leaderboard${e.key?` "${e.key}"`:""} orders equal scores "${r}" in its live standings${e.ties===void 0?" (ties left out)":""} but "${e.settle.ties}" when it settles, so the ranks members see are not the ranks prizes pay. Set ties: "${e.settle.ties}" beside settle.ties to show the order prizes pay.`}function Vr(e){let{ledger:r,group:t,score:n,settle:a,...c}=e,i=a?.pool,u=q("Leaderboard",dr,{...c,...a?{settle:{...a,prizes:a.prizes??[],...i?{pool:{...i,...i.ledger===void 0?{}:{ledger:x(i.ledger)}}}:{}}}:{},balance:x(r),...t?{group:D.parse(t.key)}:{},score:n?.kind==="earned"?{...n,quests:n.quests?.map(s=>s.key)}:n}),d=lr(u);return d&&console.warn(d),b("leaderboard",u)}var Wr={provider:"x",search:e=>je.parse({kind:"x-search",...e})};function L(e,r){let{data:t,content:n,...a}=r??{};if(n!==void 0){if(t!==void 0)throw new Error(`customSource("${e}") takes data or content, not both: a content source's records carry { body, metrics }`);if(!$t(n.body))throw new Error(`customSource("${e}") needs a content body schema: customSource(namespace, { content: { body: z.object({ ... }), metrics: ["likes"] } })`);let c=[...n.metrics??[]];for(let i of c)ze.parse(i);return P.parse({kind:"custom",namespace:e,...a,data:A(N({body:n.body,metrics:ee(Object.fromEntries(c.map(i=>[i,$().int().safe().nonnegative().optional()]))).optional()})),content:{metrics:c}})}if(!$t(t))throw new Error(`customSource("${e}") needs a data schema: customSource(namespace, { data: z.object({ ... }) }) describes each record's data`);return P.parse({kind:"custom",namespace:e,...a,data:A(t)})}function $t(e){return typeof e=="object"&&e!==null&&"_zod"in e}function Zr(e){return b("tracker",q("Tracker",Re,e))}function mr(e={}){return ve.parse({kind:"discord-messages",...e.text?{text:!0}:{}})}function fr(){return ye.parse({kind:"discord-reactions"})}var Fr={provider:"discord",grantRole:e=>qe.parse({kind:"integration",provider:"discord",action:"grant-role",roleId:e}),postMessage(e){return Ge.parse({provider:"discord",action:"post-message",...e})},messages:mr,reactions:fr,roles(e={}){return I.parse({provider:"discord",resource:"role",assignable:e.assignable??!1})},channels(e={}){return I.parse({provider:"discord",resource:"channel",types:e.types??["text","announcement"],...e.postable?{postable:!0}:{}})}},Gr={postMessage(e){return Fe.parse({provider:"telegram",action:"post-message",...e})},messages(){return L(ne,{identities:["member"],data:ie})},reactions(){return L(re,{identities:["member"],accounts:["messageAuthor"],data:ce})}},_r={shorts(){return L(ae,{identities:["member"],content:{body:ht,metrics:pt}})}},Hr={videos(){return L(oe,{identities:["member"],content:{body:kt,metrics:wt}})}};function gr(e){let{chain:r,token:t}=e,n=t===void 0?null:t;if(n!==null&&typeof n!="string")throw new Error("wallet.balances() takes the token as a string");if(r==="solana"||typeof r=="string"&&me(r)){if(n!==null&&!ue.safeParse(n).success)throw new Error("wallet.balances() on Solana takes an SPL or Token-2022 mint address (base58)");return{chain:r==="solana"?le:r,token:n}}if(typeof r=="string"&&fe(r)){if(n!==null&&!/^0x[0-9a-fA-F]{40}$/.test(n))throw new Error("wallet.balances() on an EVM chain takes an ERC-20 contract address: 0x and 40 hex digits");return{chain:r,token:n}}if(typeof r=="string"&&/^cosmos:[-_a-zA-Z0-9]{1,32}$/.test(r)){if(n===null||!de.safeParse(n).success)throw new Error("wallet.balances() on a Cosmos chain takes a bank denomination such as uatom");return{chain:r,token:n}}throw new Error('wallet.balances() reads "solana", an EVM chain such as "eip155:8453" or a Cosmos network such as "cosmos:cosmoshub-4"')}var Jr={balances(e){let r=gr(e),t=L(se,{identities:["wallet"],data:ge});return P.parse({...t,balance:r})}},Xr=()=>({provider:"domino",resource:"point-ledger"});function p(e,r){return r}var Yr={pointLedger(e){let r={...e,kind:"point-ledger",default:e.default?D.parse(e.default.key):""};return p("point-ledger",nt.prefault(r.default).meta(r))},datetime(e){let r={...e,kind:"datetime",default:W.parse(e.default)};return p("datetime",W.default(r.default).meta(r))},resource(e){let r={...e,source:I.parse(e.source),kind:"resource",default:Z.parse(e.default??"")};return p("resource",Z.default(r.default).meta(r))},quiz(e){let r=V.parse(e.default);return p("quiz",V.default(r).meta({...e,default:r,kind:"quiz"}))},text(e){let{secret:r,...t}=e,n={...t,kind:"text",default:"default"in e?e.default:"",minLength:e.minLength??(r?0:1),maxLength:e.maxLength??2e3,multiline:e.multiline??!1,...r?{secret:r}:{}};return p("text",E(n).default(n.default).meta(n))},telegramChat(e){let r={...e,kind:"text",default:e.default??"",minLength:0,maxLength:64,multiline:!1,picker:"telegram-chat"};return p("text",J().max(r.maxLength).default(r.default).meta(r))},amount(e){if(!Ye(e.default))throw new Error(`settings.amount() takes a base-unit integer string as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:100,multiline:!1,picker:"amount"};return p("text",E(r).default(r.default).meta(r))},chain(e){if(!et(e.default))throw new Error(`settings.chain() takes "solana", a Solana cluster ID or an EVM chain ID such as "eip155:8453" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:64,multiline:!1,picker:"chain"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},nft(e){if(!he(e.default))throw new Error(`settings.nft() takes an NFT collection such as "eip155:1/erc721:0x\u2026" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:200,multiline:!1,picker:"nft"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},contractCall(e){if(!pe(e.default))throw new Error(`settings.contractCall() takes a contract call such as "eip155:8453:0x\u2026 function stakedOf(address) view returns (uint256)" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:400,multiline:!1,picker:"contract-call"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},contractEvent(e){if(!ke(e.default))throw new Error(`settings.contractEvent() takes a contract event such as "eip155:1:0x\u2026 Transfer(address indexed from, address indexed to, uint256 value)" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:1,maxLength:1e3,multiline:!1,picker:"contract-event"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},solanaProgram(e){if(!we(e.default))throw new Error(`settings.solanaProgram() takes a Solana program address such as "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" as its default, not "${e.default}"`);let r={...e,kind:"text",minLength:32,maxLength:44,multiline:!1,picker:"solana-program"};return p("text",E(r).transform(t=>t).default(r.default).meta(r))},integer(e){return p("integer",$().int().min(e.min).max(e.max).default(e.default).meta({...e,kind:"integer"}))},boolean(e){return p("boolean",X().default(e.default).meta({...e,kind:"boolean"}))},choice(e){return p("choice",j(e.options).default(e.default).meta({...e,kind:"choice"}))},object(e){return N(e).strict()}};function At(e,r){let t=e.balanceChanges.find(n=>n.mint===r);return t?BigInt(t.delta):0n}function tn(e,r){let t=At(e,r);return t>0n?t.toString():"0"}function rn(e,r){let t=At(e,r);return t<0n?(-t).toString():"0"}function nn(e,r={}){let t=e.balanceChanges.filter(a=>BigInt(a.delta)>0n),n=e.balanceChanges.filter(a=>BigInt(a.delta)<0n);return t.some(a=>(r.into===void 0||a.mint===r.into)&&n.some(c=>c.mint!==a.mint&&(r.from===void 0||c.mint===r.from)))}function an(e,r){return e.programs.includes(r)}function on(e,r){return e.instructions?.find(t=>t.name===r)?.args??null}var sn=e=>ct(e.key,e.name),cn=e=>it(e.key,e.title),un=(e,r)=>at.parse({kind:"points",balance:x(e),amount:r}),dn={text:(e={})=>({input:"text",constraints:He.parse(e)}),url:(e={})=>({input:"url",constraints:Je.parse(e)}),photo:()=>"photo",quiz:()=>"quiz"};function ln(e){if(e?.actor&&e.input!==void 0)throw new Error('manual() cannot combine actor "staff" with input: staff-captured evidence is not supported. Use manual({ actor: "staff" }) for a staff confirmation, or manual({ input }) for evidence the participant submits.');return typeof e?.input=="object"?{kind:"manual",...e.input}:{kind:"manual",input:e?.input??"none",...e?.actor?{actor:e.actor}:{}}}var Rt=new WeakMap,Lt=new WeakMap;function Tt(e,r){let{tracker:t,beneficiary:n="author",on:a,where:c,enrollment:i,since:u,historical:d,content:s}=e;if(!t?.source)throw new Error(r==="automatic"?"automatic() takes no argument, or { tracker } with a tracker handle from defineTracker":"content() takes { tracker } with a tracker handle from defineTracker");let{source:m}=t;if(!Ae(m))throw new Error('Tracker triggers need attributable records: declare customSource(namespace, { identities: ["wallet"] }) or other identity kinds');if(s&&!K(m))throw new Error(`content() needs a tracker whose source has content: x.search(), or customSource(namespace, { content: { body, metrics } }). Tracker "${t.key}" has none; use automatic({ tracker }) instead.`);if(u==="enrollment"&&i!=="required")throw new Error(`${r}() counts from enrollment only on a quest that requires it: add enrollment: "required"`);let y=xt(m);if(!y.includes(n))throw new Error(m.kind==="custom"?`Tracker "${t.key}" has no "${n}" account: declare it in customSource(namespace, { accounts: ["${n}"] })`:`Tracker "${t.key}" pays ${new Intl.ListFormat("en",{type:"disjunction"}).format(y.map(w=>`"${w}"`))}, not "${n}"`);let T=Oe.parse({tracker:t.key,source:m.kind,on:s?"new-record":a??Pe(m.kind,m.kind==="custom"?m.namespace:void 0),...c?{where:c}:{},beneficiary:n,...i==="required"?{enrollment:i}:{},...u&&u!=="activation"?{since:u}:{},...d&&d!==(s?"claim":"staff")?{historical:d}:{},...s?{content:s}:{}}),o=Mt(m),l=o?Me(o,T.where):null;if(l)throw new Error(l);let g={kind:"automatic",tracker:T};o&&Rt.set(g,o);let S=K(m);return S&&Lt.set(g,S.metrics),g}function mn(e){return e?Tt(e,"automatic"):{kind:"automatic"}}function fn(e){if(e&&typeof e=="object"&&"source"in e&&"key"in e&&!("tracker"in e))throw new Error("content() takes { tracker }: write content({ tracker: posts }) instead of content(posts)");return Tt({...e,content:!0},"content")}function hr(e){let{key:r,cost:t,...n}=e,a={...n,id:C(e),cost:typeof t=="number"?t:{balance:x(t.ledger)}};return n.scope==="author"?Ue.parse(a):Qe.parse(a)}var gn=hr,pr=(e=[])=>e.filter(r=>r.scope==="author"),kr=(e,r={})=>({kind:"keyed",key:e,...r.across?{across:r.across}:{}}),wr=e=>{let{distinct:r,...t}=e;return{...Be.parse({kind:"progress",window:{kind:"lifetime"},...t}),distinct:r}},hn=()=>({kind:"untracked"}),pn=()=>({kind:"staff-handover"}),kn=()=>({kind:"automatic"});function wn(e){let{key:r,tiers:t,...n}=e,a=C(e),c=ot.parse({id:a,...n,tiers:t.map(({key:i,...u})=>({...u,id:C({key:i,...u})}))});return b("tiered-reward",{key:c.id,tier:i=>st.parse({kind:"tier",reward:c,tier:i})})}var vr=()=>({kind:"once"});function yr(e={}){return{kind:"accept",...e}}function br(e){return{kind:"review",...e}}var M={accept:yr,defer:e=>({kind:"defer",...e}),progress:e=>({kind:"progress",...e}),reject:e=>({kind:"reject",...e}),review:br};function zt(e){let r=e.kind==="reject"&&e.code!==void 0?Ke(e.code):null;if(r)throw new Error(r)}var vn={quiz(e,r={}){let t=lt.parse(e),n=Object.keys(t),a=$().int().min(1).max(n.length).parse(r.minimumCorrect??n.length);return async({input:c})=>{let i=Object.keys(c.answers).length===n.length&&n.every(d=>Object.hasOwn(c.answers,d)),u=n.filter(d=>c.answers[d]===t[d]).length;return i&&u>=a?M.accept():M.reject({reason:"Review your answers and try again."})}},photo(e){return async r=>{let t=e(r),n=await r.review.photo({image:r.input.photo,criteria:t.criteria});return n.kind==="unclear"?t.unclear==="human-review"?M.review({reason:n.reason}):M.reject({reason:n.reason}):n.kind==="pass"?M.accept():M.reject({reason:n.reason})}}},Sr={once:vr,keyed:kr,streak:cr,progress:wr};function Bt(e){return function(t){let n=C(t),a=[...new Set((t.integrations??[]).map(o=>We.parse(o.provider)))],c=a.flatMap(o=>{let l=Ve.safeParse(o);return l.success?[l.data]:[]}),i=t.trigger.kind==="automatic"&&t.trigger.tracker?.content===!0,u=t.trigger.kind==="automatic"&&t.trigger.tracker!==void 0,d=t.completion,s=typeof d=="function"?d(Sr):d;if(i&&s!==void 0)throw new Error("A content quest completes once per content item: remove its completion");if(!i&&s===void 0)throw new Error("A quest needs a completion, such as once(), keyed(...), streak(...) or progress(...)");let m=pr(t.budgets);if(Ct({trigger:t.trigger,completion:s??{kind:"keyed"},requires:t.requires??[],authorBudgets:m,performance:t.performance?Q.parse({metrics:t.performance.metrics,maxAgeMs:t.performance.maxAgeMs}):void 0,...t.retryCooldownMs===void 0?{}:{retryCooldownMs:t.retryCooldownMs},...t.completionCooldownMs===void 0?{}:{completionCooldownMs:t.completionCooldownMs}},{template:e}),t.retryCooldownMs!==void 0&&!F.safeParse(t.retryCooldownMs).success)throw new Error("retryCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(t.completionCooldownMs!==void 0&&!F.safeParse(t.completionCooldownMs).success)throw new Error("completionCooldownMs must be whole milliseconds from 1000 (one second) to 604800000 (seven days)");if(t.performance){let o=Lt.get(t.trigger)??[],l=t.performance.metrics.filter(g=>!o.includes(g));if(l.length)throw new Error(`The tracker's source does not measure ${l.join(", ")}`)}if(t.trigger.kind==="manual"&&t.trigger.input!=="none"&&!t.evaluate)throw new Error("Evidence quests require an evaluator");let y=Object.fromEntries(Object.entries(t.settings.shape).map(([o,l])=>{let g=Xe.safeParse(l.meta());if(!g.success)throw new Error(`Setting "${o}" is not a quest setting: build it with a settings builder, such as settings.integer({ label, default, min, max })`);if(g.data.kind==="text"&&g.data.secret&&g.data.default!=="")throw new Error(`Secret setting "${o}" must default to "": set its value in Console, not in source or deploy settings`);return[o,g.data]}));for(let o of Ie(t.trigger.kind==="automatic"?t.trigger.tracker?.where:void 0))if(!tt(y[o]))throw new Error(`The tracker filter compares with setting "${o}", which is not an integer or amount setting`);function T(o){let l=t.settings.parse(o),g=rt(y,l),S=ut.parse(typeof t.rewards=="function"?t.rewards({settings:l}):t.rewards),w=Y(_e).max(3,"A quest posts at most three announcements").parse((typeof t.announcements=="function"?t.announcements({settings:l}):t.announcements)??[]),z=t.trigger.kind==="automatic"&&t.trigger.tracker!==void 0;for(let f of w){let v=Ze(f.text),O="segments"in v&&v.segments.some(k=>k.kind==="placeholder"&&k.name==="author");if(!z&&O)throw new Error("An announcement names {author} only on a quest with an automatic tracker trigger");if(!z&&f.replyToTriggeringMessage)throw new Error("An announcement replies to the triggering message only on a quest with an automatic tracker trigger")}let h=[...S.flatMap(f=>f.kind==="integration"?[f.provider]:[]),...w.flatMap(f=>f.provider==="discord"?["discord"]:[]),...Object.values(y).flatMap(f=>f.kind==="resource"&&f.source.provider!=="domino"?[f.source.provider]:[])];for(let f of h)if(!c.includes(f))throw new Error(`Declare the ${f} integration on this quest`);return dt.parse({quest:n,evaluatorProtocol:G,title:typeof t.title=="function"?t.title({settings:l}):t.title,presentation:t.presentation?.({settings:l})??{},fields:y,values:g,rewards:S,...w.length?{announcements:w}:{},humanReview:t.review?.({settings:l})?.enabled??!0,trigger:t.trigger,...t.performance?{performance:Q.parse({metrics:t.performance.metrics,maxAgeMs:t.performance.maxAgeMs})}:{},integrations:c,...a.length>c.length?{integrationModules:a}:{},completion:s?s.kind==="progress"?{kind:s.kind,goal:s.goal,window:s.window,repeat:s.repeat}:s.kind==="streak"?s:s.kind==="keyed"&&s.across?{kind:s.kind,across:s.across}:{kind:s.kind}:{kind:"keyed"},visibility:t.visibility??"visible",profile:t.profile??{visible:!1},budgets:(t.budgets??[]).filter(f=>f.scope!=="author"),...m.length?{authorBudgets:m}:{},requires:t.requires??[],...t.campaign?{campaign:t.campaign}:{},...t.availability?{availability:t.availability}:{},...t.retryCooldownMs===void 0?{}:{retryCooldownMs:t.retryCooldownMs},...t.completionCooldownMs===void 0?{}:{completionCooldownMs:t.completionCooldownMs}})}return b("quest",{protocol:G,key:n,describe:T,async evaluate(o){let l=t.settings.parse(o.settings),g=u?Ne.parse(o.tracker):null,S=Rt.get(t.trigger),w=g&&S?Ce(S,g.record.data):null;if(w)return R.parse({kind:"reject",reason:`The record's data does not match the data schema this quest was built with: ${w.path} ${w.reason}`});let z=g;if(o.performance){if(!t.performance)throw new Error("Quest has no performance evaluator");let v=mt.parse(o.performance),O=B(j(t.performance.metrics),$().int().safe().nonnegative()).parse(v.metrics),k=await t.performance.evaluate({settings:l,member:o.member,tracker:z,metrics:O,observedAt:v.observedAt});if(!k)throw new Error("Performance evaluator returned no decision");if(k.rewards!==void 0)throw new Error("A performance evaluator cannot select rewards. It gates the rewards content evaluation selected: return accept, review or reject with a reason only.");return zt(k),R.parse(k.kind==="accept"?{kind:"accept",rewards:v.rewards}:k.kind==="review"&&o.humanReview?{kind:"review",reason:k.reason,rewards:v.rewards}:{kind:"reject",reason:k.reason,...k.kind==="review"?{requestedReview:!0}:k.code===void 0?{}:{code:k.code}})}let h=t.evaluate?await t.evaluate({settings:l,member:o.member,input:o.input,tracker:z,eligibleAt:o.eligibleAt,calendar:o.calendar,now:o.now,review:o.review,trackers:xe(o.trackers),wallet:o.wallet,images:o.images,...o.telegram?{telegram:o.telegram}:{},...Object.fromEntries(c.map(v=>[v,o[v]]))}):M.accept();if(!h)throw new Error("Evaluator returned no decision");if(zt(h),h.kind==="review"&&!o.humanReview)return R.parse({kind:"reject",reason:h.reason,requestedReview:!0});(h.kind==="accept"||h.kind==="review")&&h.completionKey!==void 0&&s?.kind!=="keyed"&&o.diagnose?.({code:"completion-key-ignored",message:Er(s,h.completionKey)});let f={...o,settings:l,tracker:g};return R.parse(h.kind==="accept"||h.kind==="review"?{...h,rewards:h.rewards??o.rewards,...s?.kind==="keyed"||s?.kind==="progress"?{completionKey:s.kind==="progress"?s.distinct(f):h.completionKey??s.key(f)}:{}}:h)}})}}function Er(e,r){let t=`ignores completionKey ${JSON.stringify(r)}`;switch(e?.kind){case void 0:return`A content quest completes once per content item, under a key Relay sets, so it ${t}`;case"once":return`once() completes the quest once per member and ${t}: use keyed(...) to complete it once per key`;case"streak":return`streak(...) keys its own completions and ${t}`;case"progress":return`progress(...) keys each contribution with its distinct(...) and ${t}: derive the key in distinct(...)`}}var yn=Bt(!1),bn=Bt(!0);export{er as CapabilityError,mn as automatic,kn as automaticFulfillment,sn as badge,Ht as balanceAtLeast,gn as budget,Ir as calendar,Yt as capabilityErrorCodes,_t as completed,fn as content,de as cosmosDenomSchema,It as cosmosNetworkSchema,Pr as count,L as customSource,M as decision,Tr as defineBadge,Ft as defineCampaign,Xt as defineDashboard,Dr as defineEngagementReward,Gt as defineGroup,Vr as defineLeaderboard,Br as defineLedger,Kr as defineOffer,yn as defineQuest,bn as defineQuestType,Qr as defineReferral,wn as defineTieredReward,Zr as defineTracker,Fr as discord,Ur as earned,vn as evaluators,dn as evidence,rr as formatUnits,cn as groupMembership,Jt as inGroup,on as instruction,an as invoked,pe as isContractCall,ke as isContractEvent,fe as isEvmChainId,he as isNftCollection,we as isSolanaProgram,kr as keyed,lr as leaderboardTiesWarning,Pt as limits,ln as manual,Ut as maxWalletEventLogs,Vt as maxWalletEventLookback,Zt as maxWalletTransactionLookback,Wt as maxWalletTransactions,vr as once,Kt as parseContractCall,Qt as parseContractEvent,Nt as parseContractFunction,Ot as parseNftCollection,tr as parseUnits,Xr as pointLedgers,un as points,wr as progress,Nr as questCompleted,tn as received,Or as rolling,Yr as settings,rn as spent,pn as staffHandover,cr as streak,nn as swapped,Gr as telegram,Hr as tiktok,A as trackerDataSchema,Ne as trackerTriggerContextSchema,hn as untracked,Jr as wallet,Wr as x,_r as youtube,Dt as z};