@kynesyslabs/demosdk 4.0.12 → 4.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/build/abstraction/Identities.d.ts +65 -21
  2. package/build/abstraction/Identities.js +51 -50
  3. package/build/abstraction/Identities.js.map +1 -1
  4. package/build/bridge/nativeBridge.d.ts +3 -1
  5. package/build/bridge/nativeBridge.js +4 -3
  6. package/build/bridge/nativeBridge.js.map +1 -1
  7. package/build/contracts/ContractDeployer.js +5 -2
  8. package/build/contracts/ContractDeployer.js.map +1 -1
  9. package/build/contracts/ContractInteractor.js +4 -1
  10. package/build/contracts/ContractInteractor.js.map +1 -1
  11. package/build/d402/client/D402Client.d.ts +3 -1
  12. package/build/d402/client/D402Client.js +4 -3
  13. package/build/d402/client/D402Client.js.map +1 -1
  14. package/build/escrow/EscrowTransaction.d.ts +7 -2
  15. package/build/escrow/EscrowTransaction.js +9 -8
  16. package/build/escrow/EscrowTransaction.js.map +1 -1
  17. package/build/l2ps/anchor/anchor.d.ts +1 -0
  18. package/build/l2ps/anchor/anchor.js +4 -3
  19. package/build/l2ps/anchor/anchor.js.map +1 -1
  20. package/build/l2ps/binding/binding.d.ts +3 -1
  21. package/build/l2ps/binding/binding.js +3 -2
  22. package/build/l2ps/binding/binding.js.map +1 -1
  23. package/build/tlsnotary/TLSNotaryService.d.ts +2 -0
  24. package/build/tlsnotary/TLSNotaryService.js +11 -10
  25. package/build/tlsnotary/TLSNotaryService.js.map +1 -1
  26. package/build/types/blockchain/GCREdit.d.ts +0 -30
  27. package/build/types/blockchain/Transaction.d.ts +7 -0
  28. package/build/types/blockchain/Transaction.js.map +1 -1
  29. package/build/types/blockchain/rawTransaction.d.ts +2 -7
  30. package/build/types/web2/index.d.ts +1 -0
  31. package/build/utils/index.d.ts +2 -0
  32. package/build/utils/index.js +12 -0
  33. package/build/utils/index.js.map +1 -1
  34. package/build/websdk/DemosTokens.d.ts +42 -14
  35. package/build/websdk/DemosTokens.js +35 -30
  36. package/build/websdk/DemosTokens.js.map +1 -1
  37. package/build/websdk/DemosTransactions.d.ts +29 -11
  38. package/build/websdk/DemosTransactions.js +30 -29
  39. package/build/websdk/DemosTransactions.js.map +1 -1
  40. package/build/websdk/Web2Calls.js +3 -2
  41. package/build/websdk/Web2Calls.js.map +1 -1
  42. package/build/websdk/demosclass.d.ts +177 -33
  43. package/build/websdk/demosclass.js +102 -13
  44. package/build/websdk/demosclass.js.map +1 -1
  45. package/build/websdk/index.d.ts +1 -0
  46. package/build/websdk/index.js +3 -0
  47. package/build/websdk/index.js.map +1 -1
  48. package/build/websdk/programmatic/ProgrammaticTx.d.ts +118 -0
  49. package/build/websdk/programmatic/ProgrammaticTx.js +56 -0
  50. package/build/websdk/programmatic/ProgrammaticTx.js.map +1 -0
  51. package/build/websdk/programmatic/attest.d.ts +396 -0
  52. package/build/websdk/programmatic/attest.js +418 -0
  53. package/build/websdk/programmatic/attest.js.map +1 -0
  54. package/build/websdk/programmatic/bridge.d.ts +36 -0
  55. package/build/websdk/programmatic/bridge.js +37 -0
  56. package/build/websdk/programmatic/bridge.js.map +1 -0
  57. package/build/websdk/programmatic/context.d.ts +26 -0
  58. package/build/websdk/programmatic/context.js +9 -0
  59. package/build/websdk/programmatic/context.js.map +1 -0
  60. package/build/websdk/programmatic/contracts.d.ts +79 -0
  61. package/build/websdk/programmatic/contracts.js +81 -0
  62. package/build/websdk/programmatic/contracts.js.map +1 -0
  63. package/build/websdk/programmatic/d402.d.ts +33 -0
  64. package/build/websdk/programmatic/d402.js +35 -0
  65. package/build/websdk/programmatic/d402.js.map +1 -0
  66. package/build/websdk/programmatic/demoswork.d.ts +37 -0
  67. package/build/websdk/programmatic/demoswork.js +38 -0
  68. package/build/websdk/programmatic/demoswork.js.map +1 -0
  69. package/build/websdk/programmatic/errors.d.ts +20 -0
  70. package/build/websdk/programmatic/errors.js +24 -0
  71. package/build/websdk/programmatic/errors.js.map +1 -0
  72. package/build/websdk/programmatic/escrow.d.ts +75 -0
  73. package/build/websdk/programmatic/escrow.js +74 -0
  74. package/build/websdk/programmatic/escrow.js.map +1 -0
  75. package/build/websdk/programmatic/governance.d.ts +59 -0
  76. package/build/websdk/programmatic/governance.js +48 -0
  77. package/build/websdk/programmatic/governance.js.map +1 -0
  78. package/build/websdk/programmatic/index.d.ts +30 -0
  79. package/build/websdk/programmatic/index.js +31 -0
  80. package/build/websdk/programmatic/index.js.map +1 -0
  81. package/build/websdk/programmatic/ipfs.d.ts +74 -0
  82. package/build/websdk/programmatic/ipfs.js +106 -0
  83. package/build/websdk/programmatic/ipfs.js.map +1 -0
  84. package/build/websdk/programmatic/pay.d.ts +36 -0
  85. package/build/websdk/programmatic/pay.js +37 -0
  86. package/build/websdk/programmatic/pay.js.map +1 -0
  87. package/build/websdk/programmatic/runner.d.ts +30 -0
  88. package/build/websdk/programmatic/runner.js +188 -0
  89. package/build/websdk/programmatic/runner.js.map +1 -0
  90. package/build/websdk/programmatic/storage.d.ts +49 -0
  91. package/build/websdk/programmatic/storage.js +51 -0
  92. package/build/websdk/programmatic/storage.js.map +1 -0
  93. package/build/websdk/programmatic/tokens.d.ts +155 -0
  94. package/build/websdk/programmatic/tokens.js +171 -0
  95. package/build/websdk/programmatic/tokens.js.map +1 -0
  96. package/build/websdk/programmatic/types.d.ts +96 -0
  97. package/build/websdk/programmatic/types.js +8 -0
  98. package/build/websdk/programmatic/types.js.map +1 -0
  99. package/build/websdk/programmatic/validator.d.ts +63 -0
  100. package/build/websdk/programmatic/validator.js +68 -0
  101. package/build/websdk/programmatic/validator.js.map +1 -0
  102. package/build/websdk/programmatic/xm.d.ts +36 -0
  103. package/build/websdk/programmatic/xm.js +37 -0
  104. package/build/websdk/programmatic/xm.js.map +1 -0
  105. package/package.json +1 -1
@@ -0,0 +1,418 @@
1
+ // Import the class directly (not via the @/abstraction barrel) to avoid
2
+ // pulling the coin-finder/provider surface into the websdk bundle and to
3
+ // narrow the websdk↔abstraction module cycle.
4
+ import { Identities } from "../../abstraction/Identities.js";
5
+ /**
6
+ * Identity-attestation transactions as one-call programmatic transactions.
7
+ *
8
+ * Groups the web2 identity proofs (GitHub, Twitter/X, Discord, Telegram,
9
+ * domain) and their removal into a single namespace. Each builder collapses
10
+ * the classic `infer → confirm → broadcast` flow into one call that
11
+ * auto-broadcasts within the configured fee ceiling: the `Identities.*`
12
+ * builders sign + confirm internally and return an already-confirmed
13
+ * `RPCResponseWithValidityData`, which the shared runner (via `ctx.run`)
14
+ * detects and forwards straight to broadcast without re-confirming.
15
+ *
16
+ * Also exposes {@link dahr}, the DAHR web2-proxy attestation. Unlike the
17
+ * identity builders, DAHR does its own sign + confirm + broadcast lifecycle
18
+ * server-side, so it bypasses `ctx.run` entirely and does not honour
19
+ * {@link ProgrammaticTxOptions}.
20
+ */
21
+ export function createAttestNamespace(ctx) {
22
+ const identities = new Identities();
23
+ return {
24
+ /**
25
+ * Link a GitHub identity to the connected wallet, end to end.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * await demos.run.attest.github(
30
+ * "https://gist.github.com/user/abc123",
31
+ * )
32
+ * ```
33
+ *
34
+ * @param proof - The GitHub gist/raw proof URL.
35
+ * @param referralCode - Optional referral code for incentive points.
36
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
37
+ */
38
+ github: (proof, referralCode, opts) => ctx.run(() => identities.addGithubIdentity(ctx.demos, proof, referralCode, { nonce: opts?.nonce }), opts),
39
+ /**
40
+ * Link a Twitter/X identity to the connected wallet, end to end.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * await demos.run.attest.twitter("https://x.com/user/status/123")
45
+ * ```
46
+ *
47
+ * @param proof - The tweet proof URL.
48
+ * @param referralCode - Optional referral code for incentive points.
49
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
50
+ */
51
+ twitter: (proof, referralCode, opts) => ctx.run(() => identities.addTwitterIdentity(ctx.demos, proof, referralCode, { nonce: opts?.nonce }), opts),
52
+ /**
53
+ * Link a Discord identity to the connected wallet, end to end.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * await demos.run.attest.discord(
58
+ * "https://discord.com/channels/guild/chan/msg",
59
+ * )
60
+ * ```
61
+ *
62
+ * @param proof - The Discord message proof URL.
63
+ * @param referralCode - Optional referral code for incentive points.
64
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
65
+ */
66
+ discord: (proof, referralCode, opts) => ctx.run(() => identities.addDiscordIdentity(ctx.demos, proof, referralCode, { nonce: opts?.nonce }), opts),
67
+ /**
68
+ * Link a Telegram identity to the connected wallet, end to end.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * await demos.run.attest.telegram(signedAttestation)
73
+ * ```
74
+ *
75
+ * @param attestation - The signed Telegram bot attestation.
76
+ * @param referralCode - Optional referral code for incentive points.
77
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
78
+ */
79
+ telegram: (attestation, referralCode, opts) => ctx.run(() => identities.addTelegramIdentity(ctx.demos, attestation, referralCode, { nonce: opts?.nonce }), opts),
80
+ /**
81
+ * Link a domain identity (CCI) to the connected wallet, end to end.
82
+ *
83
+ * Requires the proof payload from
84
+ * `Identities.createDomainProofPayload` to already be hosted at
85
+ * `https://<host>/.well-known/demos-cci.txt`.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * await demos.run.attest.domain("example.com")
90
+ * ```
91
+ *
92
+ * @param hostname - The domain being claimed (e.g. "example.com"). A
93
+ * full URL is also accepted; only the host is used.
94
+ * @param referralCode - Optional referral code for incentive points.
95
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
96
+ */
97
+ domain: (hostname, referralCode, opts) => ctx.run(() => identities.addDomainIdentity(ctx.demos, hostname, referralCode, { nonce: opts?.nonce }), opts),
98
+ /**
99
+ * Remove a web2 identity from the connected wallet, end to end.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * await demos.run.attest.removeWeb2({
104
+ * context: "github",
105
+ * username: "octocat",
106
+ * })
107
+ * ```
108
+ *
109
+ * @param payload - The identity to unlink (`context` + `username`).
110
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
111
+ */
112
+ removeWeb2: (payload, opts) => ctx.run(() => identities.removeWeb2Identity(ctx.demos, payload, {
113
+ nonce: opts?.nonce,
114
+ }), opts),
115
+ /**
116
+ * Link a crosschain (XM) identity from a signature, end to end.
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * await demos.run.attest.xm({
121
+ * chain: "eth",
122
+ * subchain: "mainnet",
123
+ * targetAddress: "0x...",
124
+ * signature: "0x...",
125
+ * })
126
+ * ```
127
+ *
128
+ * @param payload - The signature-inference payload identifying the
129
+ * crosschain address to link.
130
+ * @param referralCode - Optional referral code for incentive points.
131
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
132
+ */
133
+ xm: (payload, referralCode, opts) => ctx.run(() => identities.inferXmIdentity(ctx.demos, payload, referralCode, { nonce: opts?.nonce }), opts),
134
+ /**
135
+ * Remove a crosschain (XM) identity from the connected wallet, end to
136
+ * end.
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * await demos.run.attest.removeXm({
141
+ * chain: "eth",
142
+ * subchain: "mainnet",
143
+ * targetAddress: "0x...",
144
+ * })
145
+ * ```
146
+ *
147
+ * @param payload - The crosschain identity to unlink.
148
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
149
+ */
150
+ removeXm: (payload, opts) => ctx.run(() => identities.removeXmIdentity(ctx.demos, payload, {
151
+ nonce: opts?.nonce,
152
+ }), opts),
153
+ /**
154
+ * Bind post-quantum (PQC) identities to the connected wallet, end to
155
+ * end.
156
+ *
157
+ * Generates the requested PQC keypairs, signs each address with the
158
+ * wallet's ed25519 key, and links them on the GCR.
159
+ *
160
+ * @example
161
+ * ```ts
162
+ * // Bind every supported PQC algorithm:
163
+ * await demos.run.attest.pqc()
164
+ * // Or a specific subset:
165
+ * await demos.run.attest.pqc(["ml-dsa-65"])
166
+ * ```
167
+ *
168
+ * @param algorithms - The PQC algorithms to bind, or `"all"` (default)
169
+ * to bind every supported algorithm.
170
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
171
+ */
172
+ pqc: (algorithms = "all", opts) => ctx.run(() => identities.bindPqcIdentity(ctx.demos, algorithms, {
173
+ nonce: opts?.nonce,
174
+ }), opts),
175
+ /**
176
+ * Remove post-quantum (PQC) identities from the connected wallet, end
177
+ * to end.
178
+ *
179
+ * @example
180
+ * ```ts
181
+ * await demos.run.attest.removePqc()
182
+ * ```
183
+ *
184
+ * @param algorithms - The PQC algorithms to remove, or `"all"`
185
+ * (default) to remove every supported algorithm.
186
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
187
+ */
188
+ removePqc: (algorithms = "all", opts) => ctx.run(() => identities.removePqcIdentity(ctx.demos, algorithms, {
189
+ nonce: opts?.nonce,
190
+ }), opts),
191
+ /**
192
+ * Link an Unstoppable Domain identity to the connected wallet, end to
193
+ * end.
194
+ *
195
+ * The signing address must be the owner or an authorized address in the
196
+ * supplied {@link UnifiedDomainResolution} (resolve it first via
197
+ * `Identities.resolveUDDomain`), and must have signed the challenge.
198
+ *
199
+ * @example
200
+ * ```ts
201
+ * const resolution = await demos.abstraction.identities.resolveUDDomain(
202
+ * demos,
203
+ * "brad.crypto",
204
+ * )
205
+ * await demos.run.attest.ud(
206
+ * signingAddress,
207
+ * signature,
208
+ * challenge,
209
+ * resolution,
210
+ * )
211
+ * ```
212
+ *
213
+ * @param signingAddress - The address used to sign the challenge (owner
214
+ * or authorized on the domain).
215
+ * @param signature - The signature over the challenge message.
216
+ * @param challenge - The challenge message that was signed.
217
+ * @param resolutionData - The resolved domain data (owner, network,
218
+ * registry type, authorized addresses).
219
+ * @param referralCode - Optional referral code for incentive points.
220
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
221
+ */
222
+ ud: (signingAddress, signature, challenge, resolutionData, referralCode, opts) => ctx.run(() => identities.addUnstoppableDomainIdentity(ctx.demos, signingAddress, signature, challenge, resolutionData, referralCode, { nonce: opts?.nonce }), opts),
223
+ /**
224
+ * Remove an Unstoppable Domain identity from the connected wallet, end
225
+ * to end.
226
+ *
227
+ * @example
228
+ * ```ts
229
+ * await demos.run.attest.removeUd("brad.crypto")
230
+ * ```
231
+ *
232
+ * @param domain - The UD domain to unlink (e.g. "brad.crypto").
233
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
234
+ */
235
+ removeUd: (domain, opts) => ctx.run(() => identities.removeUnstoppableDomainIdentity(ctx.demos, domain, { nonce: opts?.nonce }), opts),
236
+ /**
237
+ * Link a Nomis wallet identity to the connected wallet, end to end.
238
+ *
239
+ * @example
240
+ * ```ts
241
+ * await demos.run.attest.nomis({
242
+ * walletAddress: "0x...",
243
+ * chain: "evm",
244
+ * subchain: "mainnet",
245
+ * score: 42,
246
+ * })
247
+ * ```
248
+ *
249
+ * @param payload - The Nomis wallet identity data to link.
250
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
251
+ */
252
+ nomis: (payload, opts) => ctx.run(() => identities.addNomisIdentity(ctx.demos, payload, {
253
+ nonce: opts?.nonce,
254
+ }), opts),
255
+ /**
256
+ * Remove a Nomis wallet identity from the connected wallet, end to end.
257
+ *
258
+ * @example
259
+ * ```ts
260
+ * await demos.run.attest.removeNomis({
261
+ * walletAddress: "0x...",
262
+ * chain: "evm",
263
+ * subchain: "mainnet",
264
+ * })
265
+ * ```
266
+ *
267
+ * @param payload - The Nomis wallet identity data identifying the
268
+ * identity to remove.
269
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
270
+ */
271
+ removeNomis: (payload, opts) => ctx.run(() => identities.removeNomisIdentity(ctx.demos, payload, {
272
+ nonce: opts?.nonce,
273
+ }), opts),
274
+ /**
275
+ * Link a Human Passport identity to the connected wallet, end to end.
276
+ *
277
+ * @example
278
+ * ```ts
279
+ * await demos.run.attest.humanpassport({
280
+ * address: "0x...",
281
+ * verificationMethod: "api",
282
+ * })
283
+ * ```
284
+ *
285
+ * @param payload - The Human Passport identity data to link.
286
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
287
+ */
288
+ humanpassport: (payload, opts) => ctx.run(() => identities.addHumanPassportIdentity(ctx.demos, payload, {
289
+ nonce: opts?.nonce,
290
+ }), opts),
291
+ /**
292
+ * Remove a Human Passport identity from the connected wallet, end to
293
+ * end.
294
+ *
295
+ * @example
296
+ * ```ts
297
+ * await demos.run.attest.removeHumanpassport("0x...")
298
+ * ```
299
+ *
300
+ * @param address - The EVM address of the Human Passport identity to
301
+ * remove.
302
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
303
+ */
304
+ removeHumanpassport: (address, opts) => ctx.run(() => identities.removeHumanPassportIdentity(ctx.demos, address, {
305
+ nonce: opts?.nonce,
306
+ }), opts),
307
+ /**
308
+ * Link an Ethos wallet identity to the connected wallet, end to end.
309
+ *
310
+ * @example
311
+ * ```ts
312
+ * await demos.run.attest.ethos({
313
+ * chain: "evm",
314
+ * subchain: "mainnet",
315
+ * address: "0x...",
316
+ * score: 1600,
317
+ * lastSyncedAt: new Date().toISOString(),
318
+ * })
319
+ * ```
320
+ *
321
+ * @param payload - The Ethos wallet identity data to link.
322
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
323
+ */
324
+ ethos: (payload, opts) => ctx.run(() => identities.addEthosIdentity(ctx.demos, payload, {
325
+ nonce: opts?.nonce,
326
+ }), opts),
327
+ /**
328
+ * Remove an Ethos wallet identity from the connected wallet, end to
329
+ * end.
330
+ *
331
+ * @example
332
+ * ```ts
333
+ * await demos.run.attest.removeEthos({
334
+ * chain: "evm",
335
+ * subchain: "mainnet",
336
+ * address: "0x...",
337
+ * })
338
+ * ```
339
+ *
340
+ * @param payload - The identifying data (chain, subchain, address) for
341
+ * the Ethos identity to remove.
342
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
343
+ */
344
+ removeEthos: (payload, opts) => ctx.run(() => identities.removeEthosIdentity(ctx.demos, payload, {
345
+ nonce: opts?.nonce,
346
+ }), opts),
347
+ /**
348
+ * Link a web2 identity via a TLSNotary attestation, end to end.
349
+ *
350
+ * The proof and its associated fields come from a TLSNotary
351
+ * presentation over the platform's API (GitHub, Discord, or Telegram).
352
+ *
353
+ * @example
354
+ * ```ts
355
+ * await demos.run.attest.tlsn(
356
+ * "github",
357
+ * presentation,
358
+ * recvHash,
359
+ * proofRanges,
360
+ * revealedRecv,
361
+ * "octocat",
362
+ * 583231,
363
+ * )
364
+ * ```
365
+ *
366
+ * @param context - The platform context ("github", "discord", or
367
+ * "telegram").
368
+ * @param proof - The TLSNotary presentation.
369
+ * @param recvHash - The hash of the proven received transcript.
370
+ * @param proofRanges - The revealed byte ranges of the transcript.
371
+ * @param revealedRecv - The revealed received transcript bytes.
372
+ * @param username - The username from the proven response.
373
+ * @param userId - The user id from the proven response.
374
+ * @param referralCode - Optional referral code for incentive points.
375
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
376
+ */
377
+ tlsn: (context, proof, recvHash, proofRanges, revealedRecv, username, userId, referralCode, opts) => ctx.run(() => identities.addWeb2IdentityViaTLSN(ctx.demos, context, proof, recvHash, proofRanges, revealedRecv, username, userId, referralCode, { nonce: opts?.nonce }), opts),
378
+ /**
379
+ * Remove a web2 identity that was added via TLSNotary, end to end.
380
+ *
381
+ * @example
382
+ * ```ts
383
+ * await demos.run.attest.removeTlsn("github", "octocat")
384
+ * ```
385
+ *
386
+ * @param context - The platform context ("github", "discord", or
387
+ * "telegram").
388
+ * @param username - The username to remove.
389
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
390
+ */
391
+ removeTlsn: (context, username, opts) => ctx.run(() => identities.removeWeb2IdentityViaTLSN(ctx.demos, context, username, { nonce: opts?.nonce }), opts),
392
+ /**
393
+ * Run a DAHR web2-proxy attestation.
394
+ *
395
+ * Unlike the identity builders above, DAHR does not go through
396
+ * `ctx.run`: the web2 proxy performs its own sign + confirm +
397
+ * broadcast lifecycle server-side. As a result
398
+ * {@link ProgrammaticTxOptions} (e.g. `maxFee`, `confirm`) do not
399
+ * apply here — there is no local confirm/broadcast stage to govern.
400
+ *
401
+ * @example
402
+ * ```ts
403
+ * const result = await demos.run.attest.dahr({
404
+ * url: "https://api.example.com/me",
405
+ * method: "GET",
406
+ * })
407
+ * ```
408
+ *
409
+ * @param params - The proxy request parameters (url, method, options).
410
+ * @returns The web2 proxy result, including the attested response.
411
+ */
412
+ dahr: async (params) => {
413
+ const proxy = await ctx.demos.web2.createDahr();
414
+ return proxy.startProxy(params);
415
+ },
416
+ };
417
+ }
418
+ //# sourceMappingURL=attest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attest.js","sourceRoot":"","sources":["../../../../src/websdk/programmatic/attest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { BridgeOperationCompiled } from "../../bridge/nativeBridgeTypes";
2
+ import type { ProgrammaticContext } from "./context";
3
+ import type { ProgrammaticTxOptions, ProgrammaticTxResult } from "./types";
4
+ /**
5
+ * Native bridge operations as one-call programmatic transactions.
6
+ *
7
+ * The native bridge is a two-step flow: first an RPC (`generateOperation` →
8
+ * node) produces a {@link BridgeOperationCompiled}, then that compiled
9
+ * operation is turned into a signed `nativeBridge` transaction. Compiling is a
10
+ * round-trip to the node and stays with the caller; this namespace exposes only
11
+ * the transaction step, collapsing `generateOperationTx → confirm → broadcast`
12
+ * into a single call that auto-broadcasts within the configured fee ceiling.
13
+ */
14
+ export declare function createBridgeNamespace(ctx: ProgrammaticContext): {
15
+ /**
16
+ * Submit a compiled bridge operation as a `nativeBridge` transaction,
17
+ * end to end.
18
+ *
19
+ * `NativeBridgeMethods.generateOperationTx` signs the transaction
20
+ * (deriving nonce from the Demos instance); the shared runner then
21
+ * confirms it and (in `"auto"` mode) broadcasts it within the fee cap.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * // `compiled` comes back from the node's nativeBridge RPC:
26
+ * await demos.run.bridge.submit(compiled)
27
+ * // build + confirm only, broadcast later yourself:
28
+ * const r = await demos.run.bridge.submit(compiled, { confirm: "manual" })
29
+ * await demos.broadcast(r.validityData)
30
+ * ```
31
+ *
32
+ * @param compiled - The compiled bridge operation returned by the RPC.
33
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
34
+ */
35
+ submit: (compiled: BridgeOperationCompiled, opts?: ProgrammaticTxOptions) => Promise<ProgrammaticTxResult>;
36
+ };
@@ -0,0 +1,37 @@
1
+ import { NativeBridgeMethods } from "../../bridge/index.js";
2
+ /**
3
+ * Native bridge operations as one-call programmatic transactions.
4
+ *
5
+ * The native bridge is a two-step flow: first an RPC (`generateOperation` →
6
+ * node) produces a {@link BridgeOperationCompiled}, then that compiled
7
+ * operation is turned into a signed `nativeBridge` transaction. Compiling is a
8
+ * round-trip to the node and stays with the caller; this namespace exposes only
9
+ * the transaction step, collapsing `generateOperationTx → confirm → broadcast`
10
+ * into a single call that auto-broadcasts within the configured fee ceiling.
11
+ */
12
+ export function createBridgeNamespace(ctx) {
13
+ return {
14
+ /**
15
+ * Submit a compiled bridge operation as a `nativeBridge` transaction,
16
+ * end to end.
17
+ *
18
+ * `NativeBridgeMethods.generateOperationTx` signs the transaction
19
+ * (deriving nonce from the Demos instance); the shared runner then
20
+ * confirms it and (in `"auto"` mode) broadcasts it within the fee cap.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * // `compiled` comes back from the node's nativeBridge RPC:
25
+ * await demos.run.bridge.submit(compiled)
26
+ * // build + confirm only, broadcast later yourself:
27
+ * const r = await demos.run.bridge.submit(compiled, { confirm: "manual" })
28
+ * await demos.broadcast(r.validityData)
29
+ * ```
30
+ *
31
+ * @param compiled - The compiled bridge operation returned by the RPC.
32
+ * @param opts - Fee ceiling / confirmation strategy / wait behaviour.
33
+ */
34
+ submit: (compiled, opts) => ctx.run(() => NativeBridgeMethods.generateOperationTx(compiled, ctx.demos, { nonce: opts?.nonce }), opts),
35
+ };
36
+ }
37
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../../src/websdk/programmatic/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAK9C;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAwB;IAC1D,OAAO;QACH;;;;;;;;;;;;;;;;;;;WAmBG;QACH,MAAM,EAAE,CACJ,QAAiC,EACjC,IAA4B,EACC,EAAE,CAC/B,GAAG,CAAC,GAAG,CACH,GAAG,EAAE,CACD,mBAAmB,CAAC,mBAAmB,CACnC,QAAQ,EACR,GAAG,CAAC,KAAK,EACT,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CACzB,EACL,IAAI,CACP;KACR,CAAA;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Demos } from "../demosclass";
2
+ import type { ProgrammaticTxOptions, ProgrammaticTxResult, TxSource } from "./types";
3
+ /**
4
+ * Shared context handed to every programmatic-tx sub-namespace factory.
5
+ *
6
+ * Sub-namespaces (`pay`, `attest`, `tokens`, …) never call `confirm`/
7
+ * `broadcast` directly — they build/sign their transaction and pass it to
8
+ * `ctx.run(...)`, which routes through the single shared runner so fee-cap
9
+ * policy, confirmation strategy and result shape stay uniform.
10
+ */
11
+ export interface ProgrammaticContext {
12
+ /** The connected Demos instance. */
13
+ readonly demos: Demos;
14
+ /**
15
+ * Run a transaction through the shared confirm → broadcast pipeline.
16
+ *
17
+ * @param source - A signed/unsigned tx, an already-confirmed
18
+ * validityData, or (preferred) a thunk that builds one.
19
+ * Passing a thunk defers the build so errors surface
20
+ * through the same call.
21
+ * @param opts - Fee ceiling, confirmation strategy and wait behaviour.
22
+ */
23
+ run(source: TxSource, opts?: ProgrammaticTxOptions): Promise<ProgrammaticTxResult>;
24
+ }
25
+ /** Build a {@link ProgrammaticContext} bound to a Demos instance. */
26
+ export declare function createProgrammaticContext(demos: Demos): ProgrammaticContext;
@@ -0,0 +1,9 @@
1
+ import { runProgrammaticTx } from "./runner.js";
2
+ /** Build a {@link ProgrammaticContext} bound to a Demos instance. */
3
+ export function createProgrammaticContext(demos) {
4
+ return {
5
+ demos,
6
+ run: (source, opts) => runProgrammaticTx(demos, source, opts),
7
+ };
8
+ }
9
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/websdk/programmatic/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAiC5C,qEAAqE;AACrE,MAAM,UAAU,yBAAyB,CAAC,KAAY;IAClD,OAAO;QACH,KAAK;QACL,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;KAChE,CAAA;AACL,CAAC"}
@@ -0,0 +1,79 @@
1
+ import type { ContractInstance } from "../../contracts/ContractInstance";
2
+ import type { ContractABI, ContractCallOptions, ContractCallResult, ContractDeployOptions } from "../../contracts/types/ContractABI";
3
+ import type { ProgrammaticContext } from "./context";
4
+ /**
5
+ * Smart-contract operations exposed under `demos.run.contracts`.
6
+ *
7
+ * IMPORTANT — these do NOT go through the shared fee-cap runner. Unlike the
8
+ * other `demos.run.*` namespaces, contract deploy/call are **RPC-native**:
9
+ * they execute directly over `demos.rpcCall` and return the contract's own
10
+ * result types (`ContractInstance`, `ContractCallResult`, gas `bigint`),
11
+ * never a {@link ProgrammaticTxResult}. There is no separate
12
+ * `confirm → broadcast` stage here, so {@link ProgrammaticTxOptions}
13
+ * (`maxFee`, `confirm`, `wait`) do not apply.
14
+ *
15
+ * NOTE: like `ipfs.*` and `d402.pay`, the smart-contract path is **not
16
+ * enabled on production nodes yet** — these methods are wired and typed but
17
+ * cannot be exercised end-to-end until the network turns the feature on.
18
+ *
19
+ * The namespace is a thin, uniform surface over {@link DemosContracts};
20
+ * instantiate-free access for callers who want everything under
21
+ * `demos.run.*`.
22
+ */
23
+ export declare function createContractsNamespace(ctx: ProgrammaticContext): {
24
+ /**
25
+ * Deploy a smart contract from source. Requires a connected wallet.
26
+ *
27
+ * RPC-native (not fee-capped). Returns the deployed
28
+ * {@link ContractInstance}, not a `ProgrammaticTxResult`.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * const c = await demos.run.contracts.deploy(source, [arg1, arg2])
33
+ * await demos.run.contracts.call(c.address, "transfer", [to, 100])
34
+ * ```
35
+ *
36
+ * @param source - Contract source code.
37
+ * @param constructorArgs - Constructor arguments (default `[]`).
38
+ * @param options - Deploy options (gas, etc.).
39
+ */
40
+ deploy: (source: string, constructorArgs?: unknown[], options?: ContractDeployOptions) => Promise<ContractInstance>;
41
+ /**
42
+ * Get a handle to an already-deployed contract. Read-only; no tx.
43
+ *
44
+ * @param address - The contract address.
45
+ * @param abi - Optional ABI to type the instance.
46
+ */
47
+ at: <T = unknown>(address: string, abi?: ContractABI) => Promise<ContractInstance<T>>;
48
+ /**
49
+ * Call a method on an existing contract by address.
50
+ *
51
+ * RPC-native (not fee-capped). Returns the raw
52
+ * {@link ContractCallResult}, not a `ProgrammaticTxResult`.
53
+ *
54
+ * @param contractAddress - Target contract address.
55
+ * @param method - Method name to invoke.
56
+ * @param args - Method arguments (default `[]`).
57
+ * @param options - Call options (gas, etc.).
58
+ */
59
+ call: <T = unknown>(contractAddress: string, method: string, args?: unknown[], options?: ContractCallOptions) => Promise<ContractCallResult<T>>;
60
+ /**
61
+ * Deploy a contract from a named template.
62
+ *
63
+ * @param templateName - Registered template name.
64
+ * @param params - Template parameters.
65
+ */
66
+ deployTemplate: (templateName: string, params?: Record<string, unknown>) => Promise<ContractInstance>;
67
+ /**
68
+ * Estimate gas for a contract call. Read-only; no tx.
69
+ *
70
+ * @param contractAddress - Target contract address.
71
+ * @param method - Method name.
72
+ * @param args - Method arguments (default `[]`).
73
+ */
74
+ estimateGas: (contractAddress: string, method: string, args?: unknown[]) => Promise<bigint>;
75
+ /** Start a batch of deploy/call operations (see {@link DemosContracts.batch}). */
76
+ batch: () => import("../../contracts").BatchBuilder;
77
+ /** List the available contract template names. */
78
+ getAvailableTemplates: () => string[];
79
+ };