@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.
- package/CHANGELOG.md +29 -0
- package/dist/{accounts-_lNsiR2k.d.ts → accounts-C2O8mpB8.d.ts} +2 -2
- package/dist/{attempt-captures-BqPggxTU.d.ts → attempt-captures-ClHAoo_n.d.ts} +1 -1
- package/dist/authoring.d.ts +24 -23
- package/dist/authoring.js +17 -15
- package/dist/{automatic-outcomes-BzAvfcpd.d.ts → automatic-outcomes-BEnPn4Uh.d.ts} +2 -2
- package/dist/avatar.d.ts +1 -1
- package/dist/browser.d.ts +9 -9
- package/dist/browser.js +9 -8
- package/dist/{catalog-ByZMRS7I.d.ts → catalog-CbiftcxQ.d.ts} +2 -2
- package/dist/{chunk-5LD5DKOM.js → chunk-5DZNMLDM.js} +1 -1
- package/dist/{chunk-TCYDFNV4.js → chunk-5SBA6X5X.js} +1 -1
- package/dist/{chunk-PNVQ4RBG.js → chunk-BMJHFWVT.js} +5 -29
- package/dist/{chunk-7MQCQYEE.js → chunk-DSJ46QLB.js} +1 -1
- package/dist/{chunk-KHXCURXB.js → chunk-JK3XV2CR.js} +92 -3
- package/dist/{chunk-M66Y5OMJ.js → chunk-KUNPCDN6.js} +6 -6
- package/dist/{chunk-5DYS2OIP.js → chunk-MVQQDPQX.js} +1 -1
- package/dist/{chunk-CGUL4MRE.js → chunk-NRMQVK2W.js} +1 -1
- package/dist/{chunk-XCEGNKGH.js → chunk-P33ZAJMS.js} +56 -24
- package/dist/{chunk-CJDB6W6I.js → chunk-Q5QVAF7R.js} +41 -14
- package/dist/{chunk-5BMZZDGY.js → chunk-Q6KTTVOI.js} +1 -1
- package/dist/{chunk-QYHEHMCG.js → chunk-QYC3CZVD.js} +1 -1
- package/dist/{chunk-OWDIR7ZU.js → chunk-RDUSFUXX.js} +1 -1
- package/dist/{chunk-FU3W4IQN.js → chunk-RWR2LOPA.js} +2 -2
- package/dist/chunk-UWUS4OOV.js +59 -0
- package/dist/{chunk-ANVAUOJP.js → chunk-X3FMVRMM.js} +1 -1
- package/dist/{chunk-QZNLSK4U.js → chunk-Z2Z5DBNW.js} +6 -6
- package/dist/{client-Cze4lfwA.d.ts → client-CZPewB9h.d.ts} +10 -7
- package/dist/{dashboards-pVfclkyh.d.ts → dashboards-jGPM3AxF.d.ts} +3 -3
- package/dist/{deployments-Cr1tfqrr.d.ts → deployments-BVFd7ddA.d.ts} +3 -3
- package/dist/{identity-integration-Ci2vGKtX.d.ts → identity-integration-W1Vo3Ql9.d.ts} +10 -2
- package/dist/index.d.ts +10 -10
- package/dist/index.js +7 -7
- package/dist/internal.d.ts +32 -14
- package/dist/internal.js +29 -20
- package/dist/{limits-pE04y9O2.d.ts → limits-C4RzrOV4.d.ts} +1 -1
- package/dist/{offers-Hw2P6tcK.d.ts → offers-BpYenB9i.d.ts} +2 -2
- package/dist/portal-proxy.d.ts +5 -5
- package/dist/portal-proxy.js +11 -13
- package/dist/react/index.d.ts +14 -13
- package/dist/react/index.js +9 -8
- package/dist/{reward-deliveries-BCV8hznc.d.ts → reward-deliveries-BOWpMytr.d.ts} +1 -1
- package/dist/runtime/authoring.js +1 -1
- package/dist/runtime/chunks/C2MGLQXC.js +1 -0
- package/dist/runtime/manifest.json +3 -3
- package/dist/runtime/schema.js +1 -1
- package/dist/schema.d.ts +20 -17
- package/dist/schema.js +11 -7
- package/dist/server/index.d.ts +12 -12
- package/dist/server/index.js +277 -22
- package/dist/{sign-in-providers-BAkGjSXo.d.ts → sign-in-providers-BRYVOSlG.d.ts} +2 -2
- package/dist/{submission-input-ChL1aYNH.d.ts → submission-input-C152xIdn.d.ts} +2 -2
- package/dist/{telegram-browser-BFs4u7lC.d.ts → telegram-browser-657QqiQl.d.ts} +4 -4
- package/dist/telegram.d.ts +8 -8
- package/dist/testing.d.ts +12 -11
- package/dist/testing.js +14 -7
- package/dist/{tracker-data-Bl-qPIvZ.d.ts → tracker-data-BqY-9Vu-.d.ts} +2 -2
- package/dist/{transport-WE49Ta3A.d.ts → transport-CthYgZXK.d.ts} +618 -20
- package/dist/{wallet-B7e06v4m.d.ts → wallet-Btng186v.d.ts} +57 -26
- package/package.json +3 -1
- package/dist/chunk-UZ765UGH.js +0 -18
- package/dist/runtime/chunks/C5V267I7.js +0 -1
package/dist/internal.d.ts
CHANGED
|
@@ -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-
|
|
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,
|
|
3
|
-
export { E as Extracted } from './limits-
|
|
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-
|
|
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-
|
|
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-
|
|
10
|
-
import './
|
|
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-
|
|
14
|
-
import './deployments-
|
|
15
|
-
import './offers-
|
|
16
|
-
import './catalog-
|
|
17
|
-
import './attempt-captures-
|
|
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
|
-
|
|
7
|
+
sequenceCursorSchema,
|
|
8
|
+
walletSignatureValid
|
|
9
|
+
} from "./chunk-JK3XV2CR.js";
|
|
8
10
|
import {
|
|
9
11
|
parseImageExtraction,
|
|
10
12
|
parseImageResult
|
|
11
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-RWR2LOPA.js";
|
|
12
14
|
import {
|
|
13
15
|
sourceDataSchema,
|
|
14
16
|
sourceRoles,
|
|
15
17
|
validateQuestShape
|
|
16
|
-
} from "./chunk-
|
|
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
|
-
|
|
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-
|
|
44
|
-
import "./chunk-
|
|
45
|
+
import "./chunk-KUNPCDN6.js";
|
|
46
|
+
import "./chunk-X3FMVRMM.js";
|
|
45
47
|
import {
|
|
46
48
|
dashboardIssue,
|
|
47
49
|
normalizeDashboard
|
|
48
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
61
|
-
import "./chunk-
|
|
62
|
-
import "./chunk-
|
|
63
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
3
|
-
import { Z as AuthoringIdentity } from './accounts-
|
|
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;
|
package/dist/portal-proxy.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { M as MemberImportVouchedAccount, P as ParticipantExchangeAccountResult, a as ParticipantExchangeResult, I as IdentityIntegrationKey } from './identity-integration-
|
|
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-
|
|
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
|
|
79
|
-
*
|
|
80
|
-
*
|
|
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.
|
package/dist/portal-proxy.js
CHANGED
|
@@ -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
|
-
|
|
4
|
+
participantExchangeResultSchema,
|
|
5
|
+
secureOrLoopbackOrigin
|
|
6
|
+
} from "./chunk-Q5QVAF7R.js";
|
|
9
7
|
import {
|
|
10
8
|
isParticipantRoute
|
|
11
9
|
} from "./chunk-U66GUVSG.js";
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
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-
|
|
20
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-5SBA6X5X.js";
|
|
18
|
+
import "./chunk-NRMQVK2W.js";
|
|
21
19
|
import {
|
|
22
20
|
participantPrincipalSchema,
|
|
23
21
|
sessionMember
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
22
|
+
} from "./chunk-DSJ46QLB.js";
|
|
23
|
+
import "./chunk-5DZNMLDM.js";
|
|
24
|
+
import "./chunk-P33ZAJMS.js";
|
|
27
25
|
import {
|
|
28
26
|
RequestError,
|
|
29
27
|
isRequestError
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
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-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-
|
|
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-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-
|
|
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-
|
|
12
|
-
export { S as SignInAccount, N as SignInProviderOption } from '../accounts-
|
|
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-
|
|
14
|
-
export { a as EmailSignInOption, O as OAuthSignInOption, b as SignInIcon, W as WalletSignInOption, t as telegramMiniAppInitData } from '../telegram-browser-
|
|
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-
|
|
16
|
-
export { T as TelegramAccountConnection, a as TelegramSignInMethods } from '../submission-input-
|
|
17
|
-
import '../tracker-data-
|
|
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-
|
|
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>;
|
package/dist/react/index.js
CHANGED
|
@@ -8,24 +8,25 @@ import {
|
|
|
8
8
|
discoverSolanaWallets,
|
|
9
9
|
readSignInMethods,
|
|
10
10
|
signInOptionsFrom
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-BMJHFWVT.js";
|
|
12
12
|
import {
|
|
13
13
|
telegramMiniAppInitData
|
|
14
14
|
} from "../chunk-FWLQ5XCS.js";
|
|
15
|
-
import "../chunk-
|
|
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-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
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-
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
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-
|
|
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};
|