@domino-sdk/relay 1.67.0 → 1.68.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.
- package/CHANGELOG.md +43 -0
- package/dist/{accounts-C2O8mpB8.d.ts → accounts-DnpKoJCo.d.ts} +210 -3
- package/dist/{attempt-captures-ClHAoo_n.d.ts → attempt-captures-DMNFMYFb.d.ts} +9 -1
- package/dist/authoring.d.ts +349 -38
- package/dist/authoring.js +125 -18
- package/dist/{automatic-outcomes-BEnPn4Uh.d.ts → automatic-outcomes-CQ3vpiQl.d.ts} +2 -2
- package/dist/avatar.d.ts +1 -1
- package/dist/browser.d.ts +10 -9
- package/dist/browser.js +12 -13
- package/dist/{catalog-CbiftcxQ.d.ts → catalog-BLGie8Lh.d.ts} +60 -2
- package/dist/chunk-4JSPMFO2.js +427 -0
- package/dist/{chunk-5DZNMLDM.js → chunk-55WJVFWC.js} +2 -2
- package/dist/{chunk-Q5QVAF7R.js → chunk-5AKD4ZF3.js} +37 -25
- package/dist/{chunk-DSJ46QLB.js → chunk-6UBFSMCM.js} +1 -1
- package/dist/{chunk-P33ZAJMS.js → chunk-6YTSRWRB.js} +1199 -677
- package/dist/{chunk-RDUSFUXX.js → chunk-75KF633N.js} +9 -1
- package/dist/{chunk-Q6KTTVOI.js → chunk-7YSVZA7A.js} +1 -1
- package/dist/{chunk-BMJHFWVT.js → chunk-CZ7NQ7W7.js} +10 -43
- package/dist/{chunk-X3FMVRMM.js → chunk-DDJN2T5A.js} +1 -1
- package/dist/{chunk-KUNPCDN6.js → chunk-DNPDR4Z7.js} +16 -9
- package/dist/{chunk-RWR2LOPA.js → chunk-EXZVWQOQ.js} +2 -2
- package/dist/{chunk-MVQQDPQX.js → chunk-HXTKI34N.js} +14 -2
- package/dist/{chunk-FGXLXENM.js → chunk-IW46TW3A.js} +21 -1
- package/dist/{chunk-5SBA6X5X.js → chunk-KKHENO57.js} +2 -2
- package/dist/{chunk-U66GUVSG.js → chunk-LZXDYSUH.js} +2 -0
- package/dist/{chunk-QYC3CZVD.js → chunk-MEUAJIVO.js} +2 -2
- package/dist/{chunk-BQXRCJ3N.js → chunk-P4TPW4SY.js} +1 -1
- package/dist/{chunk-NRMQVK2W.js → chunk-R3MNZKNJ.js} +1 -1
- package/dist/{chunk-Z2Z5DBNW.js → chunk-SD74HD75.js} +45 -9
- package/dist/{chunk-JK3XV2CR.js → chunk-TYZFVL73.js} +50 -8
- package/dist/chunk-VAGGGB6B.js +87 -0
- package/dist/{chunk-2HHZV7U3.js → chunk-VRZZB7CQ.js} +1 -1
- package/dist/{client-CZPewB9h.d.ts → client-BMif22WQ.d.ts} +133 -7
- package/dist/{dashboards-jGPM3AxF.d.ts → dashboards-DMk-vL1q.d.ts} +4 -4
- package/dist/{deployments-BVFd7ddA.d.ts → deployments-BCr418BX.d.ts} +582 -173
- package/dist/{identity-integration-W1Vo3Ql9.d.ts → identity-integration-r76xaAax.d.ts} +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.js +10 -10
- package/dist/internal.d.ts +137 -14
- package/dist/internal.js +240 -19
- package/dist/{limits-C4RzrOV4.d.ts → limits-ByVRQePO.d.ts} +6 -1
- package/dist/{offers-BpYenB9i.d.ts → offers-xcPbYaEv.d.ts} +2 -2
- package/dist/portal-proxy.d.ts +2 -2
- package/dist/portal-proxy.js +11 -11
- package/dist/react/index.d.ts +37 -15
- package/dist/react/index.js +12 -13
- package/dist/{reward-deliveries-BOWpMytr.d.ts → reward-deliveries-0VvT6LMj.d.ts} +1 -1
- package/dist/runtime/authoring.js +1 -1
- package/dist/runtime/chunks/2UDZ6TPL.js +1 -0
- package/dist/runtime/manifest.json +3 -3
- package/dist/runtime/schema.js +1 -1
- package/dist/schema.d.ts +398 -104
- package/dist/schema.js +62 -8
- package/dist/server/index.d.ts +12 -12
- package/dist/server/index.js +2046 -886
- package/dist/{sign-in-providers-BRYVOSlG.d.ts → sign-in-providers-C5_753DZ.d.ts} +2 -2
- package/dist/solana.d.ts +171 -0
- package/dist/solana.js +364 -0
- package/dist/{submission-input-C152xIdn.d.ts → submission-input-CaL8drIh.d.ts} +2 -2
- package/dist/{telegram-browser-657QqiQl.d.ts → telegram-browser-DLtHPRBI.d.ts} +6 -108
- package/dist/telegram.d.ts +8 -8
- package/dist/telegram.js +2 -2
- package/dist/testing.d.ts +85 -13
- package/dist/testing.js +101 -11
- package/dist/{tracker-data-BqY-9Vu-.d.ts → tracker-data-CAK942sx.d.ts} +298 -1
- package/dist/{transport-CthYgZXK.d.ts → transport-CkidqTOk.d.ts} +5250 -1226
- package/dist/{wallet-Btng186v.d.ts → wallet-DQtJelQQ.d.ts} +367 -13
- package/dist/wallet-browser-dpmr22Xv.d.ts +106 -0
- package/package.json +16 -1
- package/dist/chunk-UWUS4OOV.js +0 -59
- package/dist/chunk-UYVJZR33.js +0 -34
- package/dist/runtime/chunks/C2MGLQXC.js +0 -1
package/dist/portal-proxy.js
CHANGED
|
@@ -3,29 +3,29 @@ import {
|
|
|
3
3
|
participantExchangeAccountsSchema,
|
|
4
4
|
participantExchangeResultSchema,
|
|
5
5
|
secureOrLoopbackOrigin
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-5AKD4ZF3.js";
|
|
7
7
|
import {
|
|
8
8
|
isParticipantRoute
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-LZXDYSUH.js";
|
|
10
|
+
import "./chunk-DNPDR4Z7.js";
|
|
11
|
+
import "./chunk-DDJN2T5A.js";
|
|
12
|
+
import "./chunk-MEUAJIVO.js";
|
|
13
13
|
import "./chunk-MWMCQLCG.js";
|
|
14
14
|
import {
|
|
15
15
|
clientIdentity,
|
|
16
16
|
retryAfter
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-KKHENO57.js";
|
|
18
|
+
import "./chunk-R3MNZKNJ.js";
|
|
19
19
|
import {
|
|
20
20
|
participantPrincipalSchema,
|
|
21
21
|
sessionMember
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
22
|
+
} from "./chunk-6UBFSMCM.js";
|
|
23
|
+
import "./chunk-55WJVFWC.js";
|
|
24
|
+
import "./chunk-6YTSRWRB.js";
|
|
25
25
|
import {
|
|
26
26
|
RequestError,
|
|
27
27
|
isRequestError
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-IW46TW3A.js";
|
|
29
29
|
|
|
30
30
|
// src/portal-proxy.ts
|
|
31
31
|
import * as z from "zod";
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import { B as Badge, c as MemberBadges, O as Offer, f as Redemption } from '../offers-
|
|
1
|
+
import { B as Badge, c as MemberBadges, O as Offer, f as Redemption } from '../offers-xcPbYaEv.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-
|
|
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-
|
|
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-
|
|
3
|
+
import { g as RelayError, R as RelayClient, m as SubmissionDraft } from '../client-BMif22WQ.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-0VvT6LMj.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-0VvT6LMj.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-
|
|
11
|
-
import { E as Entitlement, b as AttemptStatus,
|
|
12
|
-
export { S as SignInAccount, N as SignInProviderOption } from '../accounts-
|
|
13
|
-
import {
|
|
14
|
-
export {
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
import { l as collectionViewSchema, b as QuestView } from '../catalog-BLGie8Lh.js';
|
|
11
|
+
import { E as Entitlement, b as AttemptStatus, W as AttemptCodeSource, c as AuthProvider, J as SignInProvider, A as AccountConnection, I as SignInAccountStatus, p as LeaderboardPlacement, dW as referralSummarySchema, o as LeaderboardPage, u as PointEntry, t as PointBalances, y as PointLedgerReference, U as TieredRewardReference } from '../accounts-DnpKoJCo.js';
|
|
12
|
+
export { S as SignInAccount, N as SignInProviderOption } from '../accounts-DnpKoJCo.js';
|
|
13
|
+
import { b as SignInMethods, c as SignInOption, P as ProviderSignInOption, e as SignInUnavailable, T as TelegramSignInOption } from '../telegram-browser-DLtHPRBI.js';
|
|
14
|
+
export { E as EmailSignInOption, O as OAuthSignInOption, a as SignInIcon, W as WalletSignInOption, t as telegramMiniAppInitData } from '../telegram-browser-DLtHPRBI.js';
|
|
15
|
+
import { o as WalletSigner, m as WalletSignInNetwork, L as LinkedWallet, l as WalletProofKind, h as ProfileUpdate, g as ProfileSummary, b as ProfileCompletion, f as ProfileReferral } from '../wallet-DQtJelQQ.js';
|
|
16
|
+
import { C as CosmosChains, S as SignInWallet, D as DiscoveredWallet } from '../wallet-browser-dpmr22Xv.js';
|
|
17
|
+
export { T as TelegramAccountConnection, a as TelegramSignInMethods } from '../submission-input-CaL8drIh.js';
|
|
18
|
+
import '../tracker-data-CAK942sx.js';
|
|
18
19
|
import '../request-error-D_dUPLwo.js';
|
|
19
20
|
import '../action-9Xl0StBg.js';
|
|
20
|
-
import '../sign-in-providers-
|
|
21
|
+
import '../sign-in-providers-C5_753DZ.js';
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* A query's identity: plain JSON values, outermost group first, such as
|
|
@@ -1000,7 +1001,7 @@ declare function useQuest(observed: QuestView): {
|
|
|
1000
1001
|
})[];
|
|
1001
1002
|
} | {
|
|
1002
1003
|
kind: "blocked";
|
|
1003
|
-
reason: "paused" | "outside-window" | "
|
|
1004
|
+
reason: "paused" | "outside-window" | "enrollment-required" | "budget-exhausted" | "connection-required" | "wallet-required";
|
|
1004
1005
|
window?: "quest" | "tracker" | undefined;
|
|
1005
1006
|
resetsAt?: number | undefined;
|
|
1006
1007
|
} | {
|
|
@@ -1165,6 +1166,13 @@ declare function useQuest(observed: QuestView): {
|
|
|
1165
1166
|
release?: string | undefined;
|
|
1166
1167
|
} | undefined;
|
|
1167
1168
|
codeSource?: AttemptCodeSource | null | undefined;
|
|
1169
|
+
action?: {
|
|
1170
|
+
kind: (string & {}) | "solana-transaction";
|
|
1171
|
+
chain: string;
|
|
1172
|
+
signature: string;
|
|
1173
|
+
wallet: string;
|
|
1174
|
+
reference: string | null;
|
|
1175
|
+
} | null | undefined;
|
|
1168
1176
|
} | null;
|
|
1169
1177
|
release: string;
|
|
1170
1178
|
interaction: "url" | "text" | "staff" | "claim" | "automatic" | "quiz" | "photo";
|
|
@@ -1446,7 +1454,7 @@ declare function useQuestAction(observed: QuestView): {
|
|
|
1446
1454
|
})[];
|
|
1447
1455
|
} | {
|
|
1448
1456
|
kind: "blocked";
|
|
1449
|
-
reason: "paused" | "outside-window" | "
|
|
1457
|
+
reason: "paused" | "outside-window" | "enrollment-required" | "budget-exhausted" | "connection-required" | "wallet-required";
|
|
1450
1458
|
window?: "quest" | "tracker" | undefined;
|
|
1451
1459
|
resetsAt?: number | undefined;
|
|
1452
1460
|
} | {
|
|
@@ -1611,6 +1619,13 @@ declare function useQuestAction(observed: QuestView): {
|
|
|
1611
1619
|
release?: string | undefined;
|
|
1612
1620
|
} | undefined;
|
|
1613
1621
|
codeSource?: AttemptCodeSource | null | undefined;
|
|
1622
|
+
action?: {
|
|
1623
|
+
kind: (string & {}) | "solana-transaction";
|
|
1624
|
+
chain: string;
|
|
1625
|
+
signature: string;
|
|
1626
|
+
wallet: string;
|
|
1627
|
+
reference: string | null;
|
|
1628
|
+
} | null | undefined;
|
|
1614
1629
|
} | null;
|
|
1615
1630
|
release: string;
|
|
1616
1631
|
interaction: "url" | "text" | "staff" | "claim" | "automatic" | "quiz" | "photo";
|
|
@@ -2358,6 +2373,8 @@ declare function useWallets(): {
|
|
|
2358
2373
|
revision: number;
|
|
2359
2374
|
signIn: boolean;
|
|
2360
2375
|
provedOn?: `eip155:${number}` | undefined;
|
|
2376
|
+
provedBy?: WalletProofKind | undefined;
|
|
2377
|
+
proofTransaction?: string | undefined;
|
|
2361
2378
|
}[];
|
|
2362
2379
|
error: RelayError | null;
|
|
2363
2380
|
refresh(): Promise<void>;
|
|
@@ -2483,6 +2500,11 @@ declare function useMyProfile(): {
|
|
|
2483
2500
|
givenName: string | null;
|
|
2484
2501
|
imageUrl: string | null;
|
|
2485
2502
|
}[];
|
|
2503
|
+
nameSource?: string | null | undefined;
|
|
2504
|
+
nameOptions?: {
|
|
2505
|
+
source: string;
|
|
2506
|
+
name: string;
|
|
2507
|
+
}[] | undefined;
|
|
2486
2508
|
};
|
|
2487
2509
|
error: RelayError | null;
|
|
2488
2510
|
refresh(): Promise<void>;
|
package/dist/react/index.js
CHANGED
|
@@ -8,25 +8,24 @@ import {
|
|
|
8
8
|
discoverSolanaWallets,
|
|
9
9
|
readSignInMethods,
|
|
10
10
|
signInOptionsFrom
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-CZ7NQ7W7.js";
|
|
12
12
|
import {
|
|
13
13
|
telegramMiniAppInitData
|
|
14
14
|
} from "../chunk-FWLQ5XCS.js";
|
|
15
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-SD74HD75.js";
|
|
16
16
|
import {
|
|
17
17
|
createRelayAction
|
|
18
|
-
} from "../chunk-
|
|
19
|
-
import "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-NRMQVK2W.js";
|
|
18
|
+
} from "../chunk-P4TPW4SY.js";
|
|
19
|
+
import "../chunk-VRZZB7CQ.js";
|
|
20
|
+
import "../chunk-VAGGGB6B.js";
|
|
21
|
+
import "../chunk-7YSVZA7A.js";
|
|
22
|
+
import "../chunk-KKHENO57.js";
|
|
23
|
+
import "../chunk-R3MNZKNJ.js";
|
|
25
24
|
import {
|
|
26
25
|
sessionMember
|
|
27
|
-
} from "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-
|
|
26
|
+
} from "../chunk-6UBFSMCM.js";
|
|
27
|
+
import "../chunk-55WJVFWC.js";
|
|
28
|
+
import "../chunk-6YTSRWRB.js";
|
|
30
29
|
import {
|
|
31
30
|
RelayError,
|
|
32
31
|
RelayErrorCode,
|
|
@@ -34,7 +33,7 @@ import {
|
|
|
34
33
|
clientError,
|
|
35
34
|
isRelayError,
|
|
36
35
|
isRequestError
|
|
37
|
-
} from "../chunk-
|
|
36
|
+
} from "../chunk-IW46TW3A.js";
|
|
38
37
|
|
|
39
38
|
// src/react/context.ts
|
|
40
39
|
import { createContext, useContext } from "react";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as z from 'zod';
|
|
2
|
-
import { T as TrackerSkipCode, S as SkipEnrollment } from './tracker-data-
|
|
2
|
+
import { T as TrackerSkipCode, S as SkipEnrollment } from './tracker-data-CAK942sx.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 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};
|
|
1
|
+
import{$ as ge,$d as ot,Ai as dr,Bd as He,Bf as J,Ci as mr,De as $,Df as B,Ei as zt,Fa as ve,Fi as Rt,Ga as ye,Ge as or,Gf as yt,Gi as X,H as se,Ha as Jt,Hb as Pe,I as ce,Ia as V,Ib as Be,J as ie,K as ue,Ka as be,L as le,La as Yt,Ld as Je,M as de,Ma as Xt,Mb as De,Md as Ye,Mh as Ct,N as me,Na as Se,Ne as y,O as fe,Ob as Ie,Oc as F,Oe as gt,Of as Y,Pb as Ne,Pc as Ze,Pd as Xe,Pe as A,Qa as er,Qb as M,Qc as Q,Qd as et,Qf as bt,Ra as Ee,Rc as Ve,Re as sr,Sa as tr,Sg as Et,Ta as rr,Tb as Oe,Ub as W,Va as qe,Vb as Ke,Wd as tt,Wi as jt,Ya as ar,Yb as Ue,Yd as rt,Yf as St,Za as nr,Zd as at,Zg as qt,_d as nt,a as x,aa as he,ae as st,b as I,ba as _t,ca as pe,d as oe,ea as Ht,eb as Ce,fa as we,gb as xe,gd as We,gf as cr,ha as N,hb as Me,hf as ir,ib as $e,if as ur,ja as Z,jb as Ae,jd as Fe,je as G,jf as ht,kb as ze,ke as ct,kf as pt,kj as Tt,lb as Re,le as it,mf as wt,ne as O,od as Qe,of as kt,pa as ke,qb as P,qe as _,qf as vt,rb as je,re as H,sb as Te,sd as Ge,se as ut,tb as Le,ve as lt,vi as lr,we as dt,wi as xt,xe as mt,xi as Mt,ye as S,yi as $t,zd as _e,ze as ft,zi as At}from"./chunks/2UDZ6TPL.js";import{Cb as j,Ec as L,Kb as re,Pd as Gt,fc as ae,ic as U,jc as ne,va as te,wc as D}from"./chunks/EWU4OKSY.js";function Lt(e){if(!Number.isInteger(e)||e<0||e>255)throw new Error("Token decimals must be an integer from 0 to 255")}function fr(e,r){Lt(r);let t=/^(\d+)(?:\.(\d+))?$/.exec(e.trim());if(!t)throw new Error(`Use a decimal amount such as "1.5", not "${e}"`);let[,a,n=""]=t,s=n.replace(/0+$/,"");if(s.length>r)throw new Error(`"${e}" has more than ${r} decimal places, which this token cannot hold`);return BigInt(a+s.padEnd(r,"0"))}function gr(e,r){Lt(r);let t=typeof e=="bigint"?e:BigInt(e),a=t<0n?"-":"",n=(t<0n?-t:t).toString().padStart(r+1,"0"),s=n.slice(0,n.length-r),c=n.slice(n.length-r).replace(/0+$/,"");return a+s+(c?"."+c:"")}function Bt(e,r={}){let{trigger:t,completion:a,requires:n,performance:s,retryCooldownMs:c,completionCooldownMs:u,authorBudgets:l=[],stations:i}=e,d=t.kind==="automatic"?t.tracker:void 0,k=d?.content===!0;if(s&&!k)throw new Error("Performance requires a content quest");if(!d&&l.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(k){if(a.kind!=="keyed"||a.across)throw new Error("Content quests complete once per content item");if(d.beneficiary!=="author"||d.on!=="new-record")throw new Error("A content quest pays each content item's author and fires on its first observation")}if(c!==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(a.kind==="once")throw new Error("A completion cooldown needs a quest members can complete more than once: this one completes once per member")}if(i&&r.template)throw new Error("Reusable quest types cannot declare check-in stations: declare them on a quest written in code");if(i&&!ct(t))throw new Error("Stations are for quests a signed Solana transaction completes: a member-submitted manual() quest without input");if(t.kind==="automatic"&&!d){if(!r.template&&n.length===0)throw new Error("Automatic quests need at least one prerequisite");if(a.kind!=="once")throw new Error("Prerequisite-only automatic quests complete once")}}var hr=["author"],pr=["author","messageAuthor"];function Dt(e){if(!Ue(e))return[];switch(e.kind){case"x-search":return Pe;case"discord-messages":return hr;case"discord-reactions":return pr;case"custom":return["author",...e.accounts??[]]}}var Pt=new Map;function wr(e){let r=e.kind==="discord-messages"&&e.text?"messages-text":e.kind,t=Pt.get(r);return t||(t=P(r==="messages-text"?Ae:r==="discord-messages"?$e:ze),Pt.set(r,t)),t}function It(e){switch(e.kind){case"x-search":return;case"discord-messages":case"discord-reactions":return wr(e);case"custom":return e.data}}function Kt(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 ee(e,r,t,a){for(let[n,s]of r.entries()){let c=Kt(s,a);c&&e.addIssue({code:"custom",message:c,path:[...t,n]})}}function Qr(e){return y("badge",x("Badge",oe,e))}function Gr(e){return y("ledger",x("Point ledger",qt,e))}function _r(e){let{target:r,ledger:t,...a}=e,n=zt.parse({...a,qualifiedBy:e.qualifiedBy.key,balance:A(t)}),s=D(L(e.metrics),X.shape.target);return{key:n.key,describe:()=>n,score(c){let u=Rt.parse(c);return X.parse({target:r({metrics:s.parse(u.metrics)}),baseline:r({metrics:s.parse(u.baseline)})})}}}var vr=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 We.strict().parse({kind:"streak",...e})},Hr=e=>Ze.brand().parse({kind:"count",count:e}),Jr=(e,r={})=>Q.brand().parse({kind:"calendar",period:e,...r}),Yr=({days:e})=>Q.brand().parse({kind:"rolling",durationMs:e*864e5}),Xr=e=>({kind:"quest",quest:e}),yr=Tt.superRefine((e,r)=>{let t=Kt(e.reward,"offers");t&&r.addIssue({code:"custom",message:t,path:["reward"]})});function ea(e){return y("offer",x("Offer",yr,e))}var br=jt.superRefine((e,r)=>{for(let t of["inviter","invitee"])ee(r,e.rewards[t],["rewards",t],"referral programs");for(let[t,a]of e.milestones.entries())ee(r,a.rewards,["milestones",t,"rewards"],"referral programs")});function ta(e){let{qualification:r,inviterGroup:t,milestones:a,bonuses:n,...s}=e,c=x("Referral",br,{...s,qualification:r.kind==="quest"?{kind:"quest",quest:r.quest.key}:r,...t?{inviterGroup:I.parse(t.key)}:{},milestones:a?.map(({key:u,...l})=>({...l,id:$({key:u,...l})})),bonuses:n?.map(({key:u,ledger:l,quests:i,...d})=>({...d,id:$({key:u,...d}),balance:A(l),quests:i?.map(k=>k.key)}))});return y("referral",c)}function ra(e={}){return{kind:"earned",...e}}var Sr=Ct.superRefine((e,r)=>{for(let[t,a]of(e.settle?.prizes??[]).entries())ee(r,a.rewards,["settle","prizes",t,"rewards"],"leaderboard prizes")});function Er(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 aa(e){let{ledger:r,group:t,score:a,settle:n,...s}=e,c=n?.pool,u=x("Leaderboard",Sr,{...s,...n?{settle:{...n,prizes:n.prizes??[],...c?{pool:{...c,...c.ledger===void 0?{}:{ledger:A(c.ledger)}}}:{}}}:{},balance:A(r),...t?{group:I.parse(t.key)}:{},score:a?.kind==="earned"?{...a,quests:a.quests?.map(i=>i.key)}:a}),l=Er(u);return l&&console.warn(l),y("leaderboard",u)}var na={provider:"x",search:e=>Ne.parse({kind:"x-search",...e})};function E(e,r){let{data:t,content:a,...n}=r??{};if(a!==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(!Nt(a.body))throw new Error(`customSource("${e}") needs a content body schema: customSource(namespace, { content: { body: z.object({ ... }), metrics: ["likes"] } })`);let s=[...a.metrics??[]];for(let c of s)Be.parse(c);return M.parse({kind:"custom",namespace:e,...n,data:P(U({body:a.body,metrics:ne(Object.fromEntries(s.map(c=>[c,j().int().safe().nonnegative().optional()]))).optional()})),content:{metrics:s}})}if(!Nt(t))throw new Error(`customSource("${e}") needs a data schema: customSource(namespace, { data: z.object({ ... }) }) describes each record's data`);return M.parse({kind:"custom",namespace:e,...n,data:P(t)})}function Nt(e){return typeof e=="object"&&e!==null&&"_zod"in e}function oa(e){return y("tracker",x("Tracker",Ke,e))}function qr(e={}){return xe.parse({kind:"discord-messages",...e.text?{text:!0}:{}})}function Cr(){return Me.parse({kind:"discord-reactions"})}var sa={provider:"discord",grantRole:e=>Re.parse({kind:"integration",provider:"discord",action:"grant-role",roleId:e}),postMessage(e){return at.parse({provider:"discord",action:"post-message",...e})},messages:qr,reactions:Cr,roles(e={}){return O.parse({provider:"discord",resource:"role",assignable:e.assignable??!1})},channels(e={}){return O.parse({provider:"discord",resource:"channel",types:e.types??["text","announcement"],...e.postable?{postable:!0}:{}})}},ca={postMessage(e){return rt.parse({provider:"telegram",action:"post-message",...e})},messages(){return E(ce,{identities:["member"],data:he})},reactions(){return E(se,{identities:["member"],accounts:["messageAuthor"],data:ge})}},ia={shorts(){return E(ie,{identities:["member"],content:{body:xt,metrics:Mt}})}},ua={videos(){return E(ue,{identities:["member"],content:{body:$t,metrics:At}})}};function xr(e){let{chain:r,token:t}=e,a=t===void 0?null:t;if(a!==null&&typeof a!="string")throw new Error("wallet.balances() takes the token as a string");if(r==="solana"||typeof r=="string"&&Z(r)){if(a!==null&&!pe.safeParse(a).success)throw new Error("wallet.balances() on Solana takes an SPL or Token-2022 mint address (base58)");return{chain:r==="solana"?N:r,token:a}}if(typeof r=="string"&&ke(r)){if(a!==null&&!/^0x[0-9a-fA-F]{40}$/.test(a))throw new Error("wallet.balances() on an EVM chain takes an ERC-20 contract address: 0x and 40 hex digits");return{chain:r,token:a}}if(typeof r=="string"&&/^cosmos:[-_a-zA-Z0-9]{1,32}$/.test(r)){if(a===null||!we.safeParse(a).success)throw new Error("wallet.balances() on a Cosmos chain takes a bank denomination such as uatom");return{chain:r,token:a}}throw new Error('wallet.balances() reads "solana", an EVM chain such as "eip155:8453" or a Cosmos network such as "cosmos:cosmoshub-4"')}function Mr(e){let{chain:r="solana",program:t,instruction:a,mint:n,minAmount:s,signer:c="wallet"}=e;if(r!=="solana"&&!(typeof r=="string"&&Z(r)))throw new Error('wallet.programActivity() reads "solana" (mainnet) or Solana devnet, solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1');if(c!=="wallet"&&c!=="any")throw new Error('wallet.programActivity() takes signer "wallet" or "any"');let u=De.safeParse({chain:r==="solana"?N:r,program:t,instruction:a??null,mint:n??null,minAmount:s??null,anySigner:c==="any"});if(!u.success){let l=u.error.issues[0];throw new Error(`wallet.programActivity()${l.path.length?` ${l.path.join(".")}`:""}: ${l.message}`)}return u.data}var la={balances(e){let r=xr(e),t=E(le,{identities:["wallet"],data:ve});return M.parse({...t,balance:r})},programActivity(e){let r=Mr(e),t=E(de,{identities:["wallet"],data:ye});return M.parse({...t,activity:r})},nfts(e){let{collection:r}=e;if(typeof r!="string"||!V(r))throw new Error('wallet.nfts() takes an NFT collection such as "eip155:1/erc721:0x\u2026", "eip155:8453/erc1155:0x\u2026/1" or "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/nft:<collection mint>"');let t=E(me,{identities:["wallet"],data:be}),a={collection:r};return M.parse({...t,nfts:a})},stake(e={}){let{chain:r="solana",voteAccount:t}=e,a=Ie.safeParse({chain:r==="solana"?N:r,voteAccount:t??null});if(!a.success)throw new Error(`wallet.stake() ${a.error.issues[0].path.join(".")}: ${a.error.issues[0].message}`);let n=E(fe,{identities:["wallet"],data:Ce});return M.parse({...n,stake:a.data})}},da=()=>({provider:"domino",resource:"point-ledger"});function p(e,r){return r}var ma={pointLedger(e){let r={...e,kind:"point-ledger",default:e.default?I.parse(e.default.key):""};return p("point-ledger",gt.prefault(r.default).meta(r))},datetime(e){let r={...e,kind:"datetime",default:_.parse(e.default)};return p("datetime",_.default(r.default).meta(r))},resource(e){let r={...e,source:O.parse(e.source),kind:"resource",default:H.parse(e.default??"")};return p("resource",H.default(r.default).meta(r))},quiz(e){let r=G.parse(e.default);return p("quiz",G.default(r).meta({...e,default:r,kind:"quiz"}))},text(e){let{secret:r,...t}=e,a={...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",S(a).default(a.default).meta(a))},telegramChat(e){let r={...e,kind:"text",default:e.default??"",minLength:0,maxLength:64,multiline:!1,picker:"telegram-chat"};return p("text",te().max(r.maxLength).default(r.default).meta(r))},amount(e){if(!lt(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",S(r).default(r.default).meta(r))},chain(e){if(!dt(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",S(r).transform(t=>t).default(r.default).meta(r))},nft(e){if(!V(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",S(r).transform(t=>t).default(r.default).meta(r))},contractCall(e){if(!Se(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",S(r).transform(t=>t).default(r.default).meta(r))},contractEvent(e){if(!Ee(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",S(r).transform(t=>t).default(r.default).meta(r))},solanaProgram(e){if(!qe(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",S(r).transform(t=>t).default(r.default).meta(r))},integer(e){return p("integer",j().int().min(e.min).max(e.max).default(e.default).meta({...e,kind:"integer"}))},boolean(e){return p("boolean",re().default(e.default).meta({...e,kind:"boolean"}))},choice(e){return p("choice",L(e.options).default(e.default).meta({...e,kind:"choice"}))},object(e){return U(e).strict()}};function Ut(e,r){let t=e.balanceChanges.find(a=>a.mint===r);return t?BigInt(t.delta):0n}function ga(e,r){let t=Ut(e,r);return t>0n?t.toString():"0"}function ha(e,r){let t=Ut(e,r);return t<0n?(-t).toString():"0"}function pa(e,r={}){let t=e.balanceChanges.filter(n=>BigInt(n.delta)>0n),a=e.balanceChanges.filter(n=>BigInt(n.delta)<0n);return t.some(n=>(r.into===void 0||n.mint===r.into)&&a.some(s=>s.mint!==n.mint&&(r.from===void 0||s.mint===r.from)))}function wa(e,r){return e.programs.includes(r)}function ka(e,r){return e.instructions?.find(t=>t.name===r)?.args??null}var va=e=>kt(e.key,e.name),ya=e=>vt(e.key,e.title),ba=(e,r)=>ht.parse({kind:"points",balance:A(e),amount:r}),Sa={text:(e={})=>({input:"text",constraints:ot.parse(e)}),url:(e={})=>({input:"url",constraints:st.parse(e)}),photo:()=>"photo",quiz:()=>"quiz"};function Ea(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 Zt=new WeakMap,Vt=new WeakMap;function Wt(e,r){let{tracker:t,beneficiary:a="author",on:n,where:s,enrollment:c,since:u,historical:l,content:i}=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:d}=t;if(!Oe(d))throw new Error('Tracker triggers need attributable records: declare customSource(namespace, { identities: ["wallet"] }) or other identity kinds');if(i&&!W(d))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"&&c!=="required")throw new Error(`${r}() counts from enrollment only on a quest that requires it: add enrollment: "required"`);let k=Dt(d);if(!k.includes(a))throw new Error(d.kind==="custom"?`Tracker "${t.key}" has no "${a}" account: declare it in customSource(namespace, { accounts: ["${a}"] })`:`Tracker "${t.key}" pays ${new Intl.ListFormat("en",{type:"disjunction"}).format(k.map(C=>`"${C}"`))}, not "${a}"`);let q=Ge.parse({tracker:t.key,source:d.kind,on:i?"new-record":n??Fe(d.kind,d.kind==="custom"?d.namespace:void 0),...s?{where:s}:{},beneficiary:a,...c==="required"?{enrollment:c}:{},...u&&u!=="activation"?{since:u}:{},...l&&l!==(i?"claim":"staff")?{historical:l}:{},...i?{content:i}:{}}),R=It(d),o=R?Le(R,q.where):null;if(o)throw new Error(o);let m={kind:"automatic",tracker:q};R&&Zt.set(m,R);let g=W(d);return g&&Vt.set(m,g.metrics),m}function qa(e){return e?Wt(e,"automatic"):{kind:"automatic"}}function Ca(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 Wt({...e,content:!0},"content")}function $r(e){let{key:r,cost:t,...a}=e,n={...a,id:$(e),cost:typeof t=="number"?t:{balance:A(t.ledger)}};return a.scope==="author"?Ye.parse(n):Je.parse(n)}var xa=$r,Ar=(e=[])=>e.filter(r=>r.scope==="author"),Ft=(e,r={})=>({kind:"keyed",key:e,...r.across?{across:r.across}:{}}),zr=()=>Ft(e=>{let r=e.action?.reference;if(!r)throw new Error("perStation() completes from a signed transaction whose memo names a station");return r}),Rr=e=>{let{distinct:r,...t}=e;return{...Ve.parse({kind:"progress",window:{kind:"lifetime"},...t}),distinct:r}},Ma=()=>({kind:"untracked"}),$a=()=>({kind:"staff-handover"}),Aa=()=>({kind:"automatic"});function za(e){let{key:r,tiers:t,...a}=e,n=$(e),s=pt.parse({id:n,...a,tiers:t.map(({key:c,...u})=>({...u,id:$({key:c,...u})}))});return y("tiered-reward",{key:s.id,tier:c=>wt.parse({kind:"tier",reward:s,tier:c})})}var jr=()=>({kind:"once"});function Tr(e={}){return{kind:"accept",...e}}function Lr(e){return{kind:"review",...e}}var z={accept:Tr,defer:e=>({kind:"defer",...e}),progress:e=>({kind:"progress",...e}),reject:e=>({kind:"reject",...e}),review:Lr};function Ot(e){let r=e.kind==="reject"&&e.code!==void 0?He(e.code):null;if(r)throw new Error(r)}var Ra={quiz(e,r={}){let t=St.parse(e),a=Object.keys(t),n=j().int().min(1).max(a.length).parse(r.minimumCorrect??a.length);return async({input:s})=>{let c=Object.keys(s.answers).length===a.length&&a.every(l=>Object.hasOwn(s.answers,l)),u=a.filter(l=>s.answers[l]===t[l]).length;return c&&u>=n?z.accept():z.reject({reason:"Review your answers and try again."})}},photo(e){return async r=>{let t=e(r),a=await r.review.photo({image:r.input.photo,criteria:t.criteria});return a.kind==="unclear"?t.unclear==="human-review"?z.review({reason:a.reason}):z.reject({reason:a.reason}):a.kind==="pass"?z.accept():z.reject({reason:a.reason})}}},Pr={once:jr,keyed:Ft,streak:vr,progress:Rr,perStation:zr};function Qt(e){return function(t){let a=$(t),n=[...new Set((t.integrations??[]).map(o=>et.parse(o.provider)))],s=n.flatMap(o=>{let m=Xe.safeParse(o);return m.success?[m.data]:[]}),c=t.trigger.kind==="automatic"&&t.trigger.tracker?.content===!0,u=t.trigger.kind==="automatic"&&t.trigger.tracker!==void 0,l=t.completion,i=typeof l=="function"?l(Pr):l;if(c&&i!==void 0)throw new Error("A content quest completes once per content item: remove its completion");if(!c&&i===void 0)throw new Error("A quest needs a completion, such as once(), keyed(...), streak(...) or progress(...)");let d=Ar(t.budgets),k=t.stations?it.parse(t.stations):void 0;if(Bt({trigger:t.trigger,completion:i??{kind:"keyed"},requires:t.requires??[],authorBudgets:d,performance:t.performance?F.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},...k?{stations:k}:{}},{template:e}),t.retryCooldownMs!==void 0&&!J.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&&!J.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=Vt.get(t.trigger)??[],m=t.performance.metrics.filter(g=>!o.includes(g));if(m.length)throw new Error(`The tracker's source does not measure ${m.join(", ")}`)}if(t.trigger.kind==="manual"&&t.trigger.input!=="none"&&!t.evaluate)throw new Error("Evidence quests require an evaluator");let q=Object.fromEntries(Object.entries(t.settings.shape).map(([o,m])=>{let g=ut.safeParse(m.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 Qe(t.trigger.kind==="automatic"?t.trigger.tracker?.where:void 0))if(!mt(q[o]))throw new Error(`The tracker filter compares with setting "${o}", which is not an integer or amount setting`);function R(o){let m=t.settings.parse(o),g=ft(q,m),C=yt.parse(typeof t.rewards=="function"?t.rewards({settings:m}):t.rewards),b=ae(nt).max(3,"A quest posts at most three announcements").parse((typeof t.announcements=="function"?t.announcements({settings:m}):t.announcements)??[]),T=t.trigger.kind==="automatic"&&t.trigger.tracker!==void 0;for(let f of b){let v=tt(f.text),K="segments"in v&&v.segments.some(w=>w.kind==="placeholder"&&w.name==="author");if(!T&&K)throw new Error("An announcement names {author} only on a quest with an automatic tracker trigger");if(!T&&f.replyToTriggeringMessage)throw new Error("An announcement replies to the triggering message only on a quest with an automatic tracker trigger")}let h=[...C.flatMap(f=>f.kind==="integration"?[f.provider]:[]),...b.flatMap(f=>f.provider==="discord"?["discord"]:[]),...Object.values(q).flatMap(f=>f.kind==="resource"&&f.source.provider!=="domino"?[f.source.provider]:[])];for(let f of h)if(!s.includes(f))throw new Error(`Declare the ${f} integration on this quest`);return bt.parse({quest:a,evaluatorProtocol:Y,title:typeof t.title=="function"?t.title({settings:m}):t.title,presentation:t.presentation?.({settings:m})??{},fields:q,values:g,rewards:C,...b.length?{announcements:b}:{},humanReview:t.review?.({settings:m})?.enabled??!0,trigger:t.trigger,...t.performance?{performance:F.parse({metrics:t.performance.metrics,maxAgeMs:t.performance.maxAgeMs})}:{},integrations:s,...n.length>s.length?{integrationModules:n}:{},completion:i?i.kind==="progress"?{kind:i.kind,goal:i.goal,window:i.window,repeat:i.repeat}:i.kind==="streak"?i:i.kind==="keyed"&&i.across?{kind:i.kind,across:i.across}:{kind:i.kind}:{kind:"keyed"},visibility:t.visibility??"visible",profile:t.profile??{visible:!1},budgets:(t.budgets??[]).filter(f=>f.scope!=="author"),...d.length?{authorBudgets:d}:{},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},...k?{stations:k}:{}})}return y("quest",{protocol:Y,key:a,describe:R,async evaluate(o){let m=t.settings.parse(o.settings),g=u?_e.parse(o.tracker):null,C=Zt.get(t.trigger),b=g&&C?je(C,g.record.data):null;if(b)return B.parse({kind:"reject",reason:`The record's data does not match the data schema this quest was built with: ${b.path} ${b.reason}`});let T=g;if(o.performance){if(!t.performance)throw new Error("Quest has no performance evaluator");let v=Et.parse(o.performance),K=D(L(t.performance.metrics),j().int().safe().nonnegative()).parse(v.metrics),w=await t.performance.evaluate({settings:m,member:o.member,tracker:T,metrics:K,observedAt:v.observedAt});if(!w)throw new Error("Performance evaluator returned no decision");if(w.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 Ot(w),B.parse(w.kind==="accept"?{kind:"accept",rewards:v.rewards}:w.kind==="review"&&o.humanReview?{kind:"review",reason:w.reason,rewards:v.rewards}:{kind:"reject",reason:w.reason,...w.kind==="review"?{requestedReview:!0}:w.code===void 0?{}:{code:w.code}})}let h=t.evaluate?await t.evaluate({settings:m,member:o.member,input:o.input,tracker:T,action:o.action??null,eligibleAt:o.eligibleAt,calendar:o.calendar,now:o.now,review:o.review,trackers:Te(o.trackers),wallet:o.wallet,images:o.images,...o.telegram?{telegram:o.telegram}:{},...Object.fromEntries(s.map(v=>[v,o[v]]))}):z.accept();if(!h)throw new Error("Evaluator returned no decision");if(Ot(h),h.kind==="review"&&!o.humanReview)return B.parse({kind:"reject",reason:h.reason,requestedReview:!0});(h.kind==="accept"||h.kind==="review")&&h.completionKey!==void 0&&i?.kind!=="keyed"&&o.diagnose?.({code:"completion-key-ignored",message:Br(i,h.completionKey)});let f={...o,settings:m,tracker:g,action:o.action??null};return B.parse(h.kind==="accept"||h.kind==="review"?{...h,rewards:h.rewards??o.rewards,...i?.kind==="keyed"||i?.kind==="progress"?{completionKey:i.kind==="progress"?i.distinct(f):h.completionKey??i.key(f)}:{}}:h)}})}}function Br(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 ja=Qt(!1),Ta=Qt(!0);export{mr as CapabilityError,qa as automatic,Aa as automaticFulfillment,va as badge,ir as balanceAtLeast,xa as budget,Jr as calendar,dr as capabilityErrorCodes,cr as completed,Ca as content,we as cosmosDenomSchema,Ht as cosmosNetworkSchema,Hr as count,E as customSource,z as decision,Qr as defineBadge,or as defineCampaign,lr as defineDashboard,_r as defineEngagementReward,sr as defineGroup,aa as defineLeaderboard,Gr as defineLedger,ea as defineOffer,ja as defineQuest,Ta as defineQuestType,ta as defineReferral,za as defineTieredReward,oa as defineTracker,sa as discord,ra as earned,Ra as evaluators,Sa as evidence,gr as formatUnits,ya as groupMembership,ur as inGroup,ka as instruction,wa as invoked,Se as isContractCall,Ee as isContractEvent,ke as isEvmChainId,V as isNftCollection,qe as isSolanaProgram,Ft as keyed,Er as leaderboardTiesWarning,_t as limits,Ea as manual,tr as maxWalletEventLogs,rr as maxWalletEventLookback,nr as maxWalletTransactionLookback,ar as maxWalletTransactions,jr as once,Xt as parseContractCall,er as parseContractEvent,Yt as parseContractFunction,Jt as parseNftCollection,fr as parseUnits,zr as perStation,da as pointLedgers,ba as points,Rr as progress,Xr as questCompleted,ga as received,Yr as rolling,ma as settings,ha as spent,$a as staffHandover,vr as streak,pa as swapped,ca as telegram,ua as tiktok,P as trackerDataSchema,_e as trackerTriggerContextSchema,Ma as untracked,la as wallet,na as x,ia as youtube,Gt as z};
|