@arkiv-network/sdk 0.7.0 → 0.8.0-dev.1

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 (210) hide show
  1. package/README.md +29 -16
  2. package/dist/attr/index.cjs +34 -0
  3. package/dist/attr/index.d.cts +2 -0
  4. package/dist/attr/index.d.ts +2 -0
  5. package/dist/attr/index.js +3 -0
  6. package/dist/attr-BDZ-APg5.js +809 -0
  7. package/dist/attr-BDZ-APg5.js.map +1 -0
  8. package/dist/attr-BvxHN99W.cjs +1029 -0
  9. package/dist/chains/index.cjs +2 -3
  10. package/dist/chains/index.d.cts +39 -77
  11. package/dist/chains/index.d.cts.map +1 -1
  12. package/dist/chains/index.d.ts +22 -60
  13. package/dist/chains/index.d.ts.map +1 -1
  14. package/dist/chains/index.js +2 -2
  15. package/dist/chains-BJrZs6sG.js +57 -0
  16. package/dist/chains-BJrZs6sG.js.map +1 -0
  17. package/dist/chains-BYRTTipa.cjs +73 -0
  18. package/dist/changeOwnership-B7bEgla4.d.cts +509 -0
  19. package/dist/changeOwnership-B7bEgla4.d.cts.map +1 -0
  20. package/dist/changeOwnership-DwgtdSFc.d.ts +509 -0
  21. package/dist/changeOwnership-DwgtdSFc.d.ts.map +1 -0
  22. package/dist/entity/index.cjs +19 -0
  23. package/dist/entity/index.d.cts +4 -0
  24. package/dist/entity/index.d.ts +4 -0
  25. package/dist/entity/index.js +6 -0
  26. package/dist/entity-B0t6sN7F.cjs +71 -0
  27. package/dist/entity-BIp_df9u.js +67 -0
  28. package/dist/entity-BIp_df9u.js.map +1 -0
  29. package/dist/entity-CFhbAv0R.js +70 -0
  30. package/dist/entity-CFhbAv0R.js.map +1 -0
  31. package/dist/entity-wfBnZd91.cjs +98 -0
  32. package/dist/errors-D-eJkGVc.cjs +56 -0
  33. package/dist/errors-DGB8AgT2.js +33 -0
  34. package/dist/errors-DGB8AgT2.js.map +1 -0
  35. package/dist/expiry-BUYIXTGb.cjs +135 -0
  36. package/dist/expiry-BxOlvVWC.d.ts +79 -0
  37. package/dist/expiry-BxOlvVWC.d.ts.map +1 -0
  38. package/dist/expiry-DGRzrSan.js +95 -0
  39. package/dist/expiry-DGRzrSan.js.map +1 -0
  40. package/dist/expiry-DRV29F1r.d.cts +79 -0
  41. package/dist/expiry-DRV29F1r.d.cts.map +1 -0
  42. package/dist/flags-0Vl5rrHq.d.cts +41 -0
  43. package/dist/flags-0Vl5rrHq.d.cts.map +1 -0
  44. package/dist/flags-Ct8k0gpB.cjs +43 -0
  45. package/dist/flags-ZtlvOIIk.js +33 -0
  46. package/dist/flags-ZtlvOIIk.js.map +1 -0
  47. package/dist/flags-wmcMoAnN.d.ts +41 -0
  48. package/dist/flags-wmcMoAnN.d.ts.map +1 -0
  49. package/dist/index-Cgw1u5aY.d.cts +278 -0
  50. package/dist/index-Cgw1u5aY.d.cts.map +1 -0
  51. package/dist/index-ClgIuxJ8.d.ts +159 -0
  52. package/dist/index-ClgIuxJ8.d.ts.map +1 -0
  53. package/dist/index-D0CmtiWT.d.cts +159 -0
  54. package/dist/index-D0CmtiWT.d.cts.map +1 -0
  55. package/dist/index-D8LZt-3J.d.cts +417 -0
  56. package/dist/index-D8LZt-3J.d.cts.map +1 -0
  57. package/dist/index-DVYFaXNV.d.ts +417 -0
  58. package/dist/index-DVYFaXNV.d.ts.map +1 -0
  59. package/dist/index-VCqgn29D.d.ts +278 -0
  60. package/dist/index-VCqgn29D.d.ts.map +1 -0
  61. package/dist/index.cjs +675 -357
  62. package/dist/index.d.cts +251 -203
  63. package/dist/index.d.cts.map +1 -1
  64. package/dist/index.d.ts +251 -203
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +626 -355
  67. package/dist/index.js.map +1 -1
  68. package/dist/payload-Bnw1hrvb.cjs +83 -0
  69. package/dist/payload-CIxSn_DW.js +67 -0
  70. package/dist/payload-CIxSn_DW.js.map +1 -0
  71. package/dist/payload-Dgx3PQeK.d.ts +94 -0
  72. package/dist/payload-Dgx3PQeK.d.ts.map +1 -0
  73. package/dist/payload-P0nWyjLg.d.cts +94 -0
  74. package/dist/payload-P0nWyjLg.d.cts.map +1 -0
  75. package/dist/query/index.cjs +24 -149
  76. package/dist/query/index.d.cts +5 -3
  77. package/dist/query/index.d.ts +5 -3
  78. package/dist/query/index.js +6 -137
  79. package/dist/queryBuilder-BXDvX1K_.cjs +1123 -0
  80. package/dist/queryBuilder-CbLL4pG5.js +963 -0
  81. package/dist/queryBuilder-CbLL4pG5.js.map +1 -0
  82. package/dist/selection-BvK6yX0g.d.cts +433 -0
  83. package/dist/selection-BvK6yX0g.d.cts.map +1 -0
  84. package/dist/selection-fpmI3ADQ.d.ts +433 -0
  85. package/dist/selection-fpmI3ADQ.d.ts.map +1 -0
  86. package/dist/types/index.cjs +4 -1
  87. package/dist/types/index.d.cts +7 -2
  88. package/dist/types/index.d.ts +7 -2
  89. package/dist/types/index.js +4 -1
  90. package/dist/utils/index.cjs +4 -17
  91. package/dist/utils/index.d.cts +3 -17
  92. package/dist/utils/index.d.ts +3 -17
  93. package/dist/utils/index.js +4 -18
  94. package/package.json +26 -5
  95. package/src/actions/public/getEntity.ts +27 -43
  96. package/src/actions/public/getEntityNonce.ts +30 -0
  97. package/src/actions/public/predictEntityKeys.test.ts +143 -0
  98. package/src/actions/public/predictEntityKeys.ts +138 -0
  99. package/src/actions/public/query.ts +33 -69
  100. package/src/actions/public/watchEntityEvents.test.ts +414 -0
  101. package/src/actions/public/watchEntityEvents.ts +225 -0
  102. package/src/actions/wallet/changeOwnership.ts +8 -8
  103. package/src/actions/wallet/createEntity.ts +104 -26
  104. package/src/actions/wallet/deleteEntity.ts +2 -3
  105. package/src/actions/wallet/extendEntity.ts +39 -16
  106. package/src/actions/wallet/mutateEntities.test.ts +76 -0
  107. package/src/actions/wallet/mutateEntities.ts +29 -74
  108. package/src/actions/wallet/patchEntity.ts +90 -0
  109. package/src/attr/attributes.test.ts +120 -0
  110. package/src/attr/attributes.ts +190 -0
  111. package/src/attr/codec.test.ts +162 -0
  112. package/src/attr/codec.ts +220 -0
  113. package/src/attr/decimal.ts +86 -0
  114. package/src/attr/errors.ts +145 -0
  115. package/src/attr/index.ts +50 -0
  116. package/src/attr/names.ts +106 -0
  117. package/src/attr/types.ts +150 -0
  118. package/src/attr/values.test.ts +271 -0
  119. package/src/attr/values.ts +502 -0
  120. package/src/chains/cheesecake.ts +22 -0
  121. package/src/chains/index.ts +1 -2
  122. package/src/clients/createPublicClient.test.ts +3 -5
  123. package/src/clients/createPublicClient.ts +5 -4
  124. package/src/clients/createWalletClient.test.ts +2 -2
  125. package/src/clients/createWalletClient.ts +13 -7
  126. package/src/clients/decorators/arkivPublic.ts +160 -139
  127. package/src/clients/decorators/arkivWallet.ts +91 -95
  128. package/src/consts.ts +2 -1
  129. package/src/entity/create.test.ts +184 -0
  130. package/src/entity/errors.ts +38 -0
  131. package/src/entity/events.ts +16 -0
  132. package/src/entity/expiry.test.ts +195 -0
  133. package/src/entity/expiry.ts +181 -0
  134. package/src/entity/flags.ts +65 -0
  135. package/src/entity/index.ts +14 -0
  136. package/src/entity/key.ts +68 -0
  137. package/src/entity/operations.ts +134 -0
  138. package/src/entity/params.ts +15 -0
  139. package/src/errors.ts +33 -28
  140. package/src/index.ts +6 -0
  141. package/src/query/engine.ts +59 -134
  142. package/src/query/errors.ts +151 -0
  143. package/src/query/expression.test.ts +286 -0
  144. package/src/query/expression.ts +493 -0
  145. package/src/query/index.ts +40 -4
  146. package/src/query/injection.test.ts +151 -0
  147. package/src/query/queryBuilder.test.ts +322 -637
  148. package/src/query/queryBuilder.ts +126 -359
  149. package/src/query/queryResult.ts +54 -51
  150. package/src/query/selection.test.ts +48 -98
  151. package/src/query/selection.ts +77 -65
  152. package/src/types/entity.test.ts +44 -155
  153. package/src/types/entity.ts +62 -44
  154. package/src/types/events.ts +64 -23
  155. package/src/types/index.ts +20 -16
  156. package/src/types/rpcSchema.ts +70 -33
  157. package/src/utils/arkivTransactions.test.ts +681 -38
  158. package/src/utils/arkivTransactions.ts +249 -104
  159. package/src/utils/chains.test.ts +21 -24
  160. package/src/utils/compression.ts +1 -1
  161. package/src/utils/entities.test.ts +62 -0
  162. package/src/utils/entities.ts +111 -29
  163. package/src/utils/expirationTime.ts +114 -10
  164. package/src/utils/logger.ts +2 -2
  165. package/src/utils/payload.ts +4 -2
  166. package/src/utils/revert.test.ts +99 -0
  167. package/src/utils/revert.ts +145 -0
  168. package/dist/chains-BifaY04V.cjs +0 -108
  169. package/dist/chains-CrtkVbBh.js +0 -86
  170. package/dist/chains-CrtkVbBh.js.map +0 -1
  171. package/dist/consts-AUoL-v42.cjs +0 -18
  172. package/dist/consts-BV4PR-de.js +0 -7
  173. package/dist/consts-BV4PR-de.js.map +0 -1
  174. package/dist/entity-B6g_EPm1.d.cts +0 -382
  175. package/dist/entity-B6g_EPm1.d.cts.map +0 -1
  176. package/dist/entity-qoLMAuuk.d.ts +0 -382
  177. package/dist/entity-qoLMAuuk.d.ts.map +0 -1
  178. package/dist/index-DdspxNAA.d.ts +0 -481
  179. package/dist/index-DdspxNAA.d.ts.map +0 -1
  180. package/dist/index-Ds9dwqb5.d.cts +0 -481
  181. package/dist/index-Ds9dwqb5.d.cts.map +0 -1
  182. package/dist/payload-B2kFJyah.d.ts +0 -6
  183. package/dist/payload-B2kFJyah.d.ts.map +0 -1
  184. package/dist/payload-CJN8fTvX.d.cts +0 -6
  185. package/dist/payload-CJN8fTvX.d.cts.map +0 -1
  186. package/dist/payload-Claf2jUO.js +0 -13
  187. package/dist/payload-Claf2jUO.js.map +0 -1
  188. package/dist/payload-DpA5PA-w.cjs +0 -23
  189. package/dist/query/index.js.map +0 -1
  190. package/dist/queryBuilder-D2uwP9jI.js +0 -704
  191. package/dist/queryBuilder-D2uwP9jI.js.map +0 -1
  192. package/dist/queryBuilder-UW2MCaX4.cjs +0 -792
  193. package/dist/utils/index.d.cts.map +0 -1
  194. package/dist/utils/index.d.ts.map +0 -1
  195. package/dist/utils/index.js.map +0 -1
  196. package/src/actions/public/buildQuery.ts +0 -10
  197. package/src/actions/public/subscribeEntityEvents.ts +0 -119
  198. package/src/actions/wallet/updateEntity.ts +0 -60
  199. package/src/chains/braga.ts +0 -26
  200. package/src/chains/kaolin.ts +0 -29
  201. package/src/query/engine.test.ts +0 -526
  202. package/src/query/predicate.test.ts +0 -461
  203. package/src/query/predicate.ts +0 -144
  204. package/src/query/queryResult.test.ts +0 -270
  205. package/src/query/selectQueryBuilder.test.ts +0 -210
  206. package/src/types/attributes.ts +0 -16
  207. package/src/utils/validation.test.ts +0 -60
  208. package/src/utils/validation.ts +0 -32
  209. /package/dist/{types-H-TSmRpm.js → types-Bx1EKe0v.js} +0 -0
  210. /package/dist/{types-o3zWarRp.cjs → types-CKPddlfS.cjs} +0 -0
@@ -1,19 +1,22 @@
1
- import type { Account, Chain, Client, Hex, PublicActions, Transport } from "viem"
1
+ import type { Account, Address, Chain, Client, Hex, PublicActions, Transport } from "viem"
2
2
  import { getBlockTiming } from "../../actions/public/getBlockTiming"
3
3
  import { getEntity } from "../../actions/public/getEntity"
4
4
  import { getEntityCount } from "../../actions/public/getEntityCount"
5
+ import { getEntityNonce } from "../../actions/public/getEntityNonce"
6
+ import {
7
+ type PredictEntityKeysParameters,
8
+ type PredictEntityKeysReturnType,
9
+ predictEntityKeys,
10
+ } from "../../actions/public/predictEntityKeys"
5
11
  import { type QueryOptions, type QueryReturnType, query } from "../../actions/public/query"
6
- import { subscribeEntityEvents } from "../../actions/public/subscribeEntityEvents"
7
- import { QueryBuilder, SelectQueryBuilder } from "../../query/queryBuilder"
12
+ import {
13
+ type WatchEntityEventsParameters,
14
+ watchEntityEvents,
15
+ } from "../../actions/public/watchEntityEvents"
16
+ import type { Expression } from "../../query/expression"
17
+ import { SelectQueryBuilder } from "../../query/queryBuilder"
8
18
  import type { EntitySelection, FullEntity, ProjectedEntity, SelectArg } from "../../query/selection"
9
19
  import type { Entity } from "../../types/entity"
10
- import type {
11
- OnEntityCreatedEvent,
12
- OnEntityDeletedEvent,
13
- OnEntityExpiredEvent,
14
- OnEntityExpiresInExtendedEvent,
15
- OnEntityUpdatedEvent,
16
- } from "../../types/events"
17
20
 
18
21
  export type PublicArkivActions<
19
22
  transport extends Transport = Transport,
@@ -38,23 +41,28 @@ export type PublicArkivActions<
38
41
  * - Docs: https://docs.arkiv.network/ts-sdk/actions/public/getEntity
39
42
  *
40
43
  * @param key - The entity key (hex string)
41
- * @returns The entity with the given key. {@link Entity}
44
+ * @returns The entity with the given key, with every field populated. {@link FullEntity}
42
45
  *
43
46
  * @example
44
- * import { createPublicClient, http } from 'arkiv'
45
- * import { braga } from 'arkiv/chains'
47
+ * import { createPublicClient } from "@arkiv-network/sdk"
48
+ * import { cheesecake } from "@arkiv-network/sdk/chains"
49
+ * import { http } from "viem"
46
50
  *
47
51
  * const client = createPublicClient({
48
- * chain: braga,
52
+ * chain: cheesecake,
49
53
  * transport: http(),
50
54
  * })
51
- * const entity = await client.getEntity("0x123")
52
- * // {
53
- * // key: "0x123",
54
- * // value: "0x123",
55
+ * const entity = await client.getEntity(entityKey)
56
+ * // Entity {
57
+ * // key: "0x9f2c…",
58
+ * // owner: "0xabc…",
59
+ * // contentType: "application/json",
60
+ * // payload: Uint8Array, // entity.toJson() / entity.toText() decode it
61
+ * // attributes: { category: { type: "str", value: "docs" } },
62
+ * // expiresAt: 1_297_000n,
55
63
  * // }
56
64
  */
57
- getEntity: (key: Hex) => Promise<Entity>
65
+ getEntity: (key: Hex) => Promise<FullEntity>
58
66
 
59
67
  /**
60
68
  * Returns a SelectQueryBuilder for building and executing queries — the recommended way to
@@ -70,12 +78,13 @@ export type PublicArkivActions<
70
78
  * @returns A SelectQueryBuilder instance for building and executing queries. {@link SelectQueryBuilder}
71
79
  *
72
80
  * @example
73
- * import { createPublicClient, http } from 'arkiv'
74
- * import { braga } from 'arkiv/chains'
75
- * import { eq } from 'arkiv/query'
81
+ * import { createPublicClient } from "@arkiv-network/sdk"
82
+ * import { cheesecake } from "@arkiv-network/sdk/chains"
83
+ * import { eq } from "@arkiv-network/sdk/query"
84
+ * import { http } from "viem"
76
85
  *
77
86
  * const client = createPublicClient({
78
- * chain: braga,
87
+ * chain: cheesecake,
79
88
  * transport: http(),
80
89
  * })
81
90
  * // select everything
@@ -83,7 +92,7 @@ export type PublicArkivActions<
83
92
  * await client.select("*").where(eq("category", "docs")).fetch()
84
93
  * // only the key
85
94
  * await client.select({ key: true }).where(eq("category", "docs")).fetch()
86
- * // select specific fields — result typed { owner: Hex; attributes: Attribute[] }
95
+ * // select specific fields — result typed { owner: Hex; attributes: Attributes }
87
96
  * await client.select({ owner: true, attributes: true }).fetch()
88
97
  * // a single field — result typed { owner: Hex }
89
98
  * await client.select({ owner: true }).fetch()
@@ -95,9 +104,11 @@ export type PublicArkivActions<
95
104
  * Pick the entity fields to return. Set the ones you want to `true` (at least one is required);
96
105
  * the result is typed to exactly those fields, so reading anything else is a compile error.
97
106
  *
98
- * Available fields: `key`, `owner`, `creator`, `contentType`, `payload`, `attributes`,
99
- * `expiresAtBlock`, `createdAtBlock`, `lastModifiedAtBlock`, `transactionIndexInBlock`,
100
- * `operationIndexInTransaction`.
107
+ * Available fields: `key`, `owner`, `creator`, `createdAt`, `updatedAt`, `expiresAt`,
108
+ * `creationFlags`, `contentType`, `payload`, `attributeSchema` and `attributes`.
109
+ *
110
+ * `attributes` also takes a map of names, to fetch only those:
111
+ * `select({ key: true, attributes: { projectId: true } })`.
101
112
  *
102
113
  * Pass the selection inline so its fields stay literal `true`. A selection stored in a `let`/
103
114
  * `const` variable widens to `boolean` and the result type can no longer be narrowed — annotate
@@ -105,7 +116,8 @@ export type PublicArkivActions<
105
116
  *
106
117
  * @example
107
118
  * client.select({ owner: true, attributes: true }) // entities typed { owner, attributes }
108
- * client.select({ key: true, payload: true }) // includes payload → toText()/toJson() too
119
+ * client.select({ key: true, payload: true }) // includes payload → toText()/toJson() too
120
+ * client.select({ key: true, attributeSchema: true }) // what shape is the data?
109
121
  */
110
122
  <const S extends EntitySelection>(selection: S): SelectQueryBuilder<ProjectedEntity<S>>
111
123
  /**
@@ -116,90 +128,133 @@ export type PublicArkivActions<
116
128
  }
117
129
 
118
130
  /**
119
- * Returns a QueryBuilder instance for building and executing queries.
120
- * The QueryBuilder object follows the Builder pattern, allowing you to chain methods to build a query and then execute it.
121
- *
122
- * - Docs: https://docs.arkiv.network/ts-sdk/actions/public/query
131
+ * Runs one query and returns one page, with no builder in between.
123
132
  *
124
- * @deprecated Use {@link select} instead. `buildQuery()` returns only the entity `key` unless
125
- * you remember to opt in to data with `withAttributes()`/`withMetadata()`/`withPayload()`, which
126
- * is an easy mistake. `select()` makes the selection explicit. This method remains for backwards
127
- * compatibility and will be removed in a future release.
133
+ * Use {@link select} for anything typed — this returns full {@link Entity} objects whatever the
134
+ * selection, and takes a raw string as an escape hatch for a query built elsewhere. A raw string
135
+ * goes to the node exactly as written, with none of the name, type or operator checks the
136
+ * expression combinators apply.
128
137
  *
129
- * @returns A QueryBuilder instance for building and executing queries. {@link QueryBuilder}
138
+ * @param query - An {@link Expression}, or the raw query string.
139
+ * @param queryOptions - Selection, page size, cursor and block. {@link QueryOptions}
140
+ * @returns One page of entities. {@link QueryReturnType}
130
141
  *
131
142
  * @example
132
- * import { createPublicClient, http } from 'arkiv'
133
- * import { braga } from 'arkiv/chains'
143
+ * import { createPublicClient } from "@arkiv-network/sdk"
144
+ * import { cheesecake } from "@arkiv-network/sdk/chains"
145
+ * import { and, eq, gte } from "@arkiv-network/sdk/query"
146
+ * import { i32 } from "@arkiv-network/sdk/attr"
147
+ * import { http } from "viem"
134
148
  *
135
149
  * const client = createPublicClient({
136
- * chain: braga,
150
+ * chain: cheesecake,
137
151
  * transport: http(),
138
152
  * })
139
- * const query = client.buildQuery()
140
- * const entities = await query.where("key", "=", "value").ownedBy("0x123").fetch()
153
+ * const page = await client.query(and(eq("category", "docs"), gte("level", i32(10))), {
154
+ * select: { key: true, attributes: true },
155
+ * limit: 100,
156
+ * })
157
+ * // { entities: [Entity], cursor: "b64:…", blockNumber: 32223n }
141
158
  *
159
+ * // The raw form, unchecked:
160
+ * await client.query("category = str('docs') AND level >= i32(10)")
142
161
  */
143
- buildQuery: () => QueryBuilder
162
+ query: (query: Expression | string, queryOptions?: QueryOptions) => Promise<QueryReturnType>
144
163
 
145
164
  /**
146
- * Returns a QueryResult instance for fetching the results of a raw query.
147
- * If no query options are provided, all payload is included, but no metadata (like owner, expiredAt, etc.) and attributes.
148
- * @param query - The raw query string
149
- * @param queryOptions - The optional query options - {@link QueryOptions}
150
- * @returns A QueryReturnType instance - {@link QueryReturnType}
165
+ * Returns the total number of entities on the chain.
166
+ * @returns The number of entities currently stored
151
167
  *
152
168
  * @example
153
- * import { createPublicClient, http } from 'arkiv'
154
- * import { braga } from 'arkiv/chains'
169
+ * import { createPublicClient } from "@arkiv-network/sdk"
170
+ * import { cheesecake } from "@arkiv-network/sdk/chains"
171
+ * import { http } from "viem"
155
172
  *
156
173
  * const client = createPublicClient({
157
- * chain: braga,
174
+ * chain: cheesecake,
158
175
  * transport: http(),
159
176
  * })
160
- * const queryResult = client.query('key = value && $owner = 0x123')
161
- * // queryResult = { entities: [{ key: "0x123", value: "0x123" }], cursor: undefined, blockNumber: undefined }
162
- * const queryResultWithOptions = client.query('key = value && $owner = 0x123', {
163
- * includeData: {
164
- * attributes: false,
165
- * payload: true,
166
- * metadata: true,
167
- * },
168
- * resultsPerPage: 10,
169
- * cursor: undefined,
170
- * atBlock: undefined,
171
- * })
172
- * // queryResultWithOptions = { entities: [{ key: "0x123", value: "0x123" }], cursor: "...", blockNumber: 32223n }
177
+ * const entityCount = await client.getEntityCount()
178
+ * // entityCount = 0
173
179
  */
174
- query: (query: string, queryOptions?: QueryOptions) => Promise<QueryReturnType>
180
+ getEntityCount: () => Promise<number>
175
181
 
176
182
  /**
177
- * Returns the number of entities in the DBChain.
178
- * @returns The number of entities in the DBChain
183
+ * Returns how many entities an account has created — its entity-minting nonce.
184
+ *
185
+ * Not the account's transaction nonce: the engine keeps its own counter per creator and mixes it
186
+ * into every key it mints, which is why two identical creates from one account never collide.
187
+ *
188
+ * @param owner - The account whose nonce to read.
189
+ * @returns The nonce the account's next create will use.
179
190
  *
180
191
  * @example
181
- * import { createPublicClient, http } from 'arkiv'
182
- * import { braga } from 'arkiv/chains'
192
+ * import { createPublicClient } from "@arkiv-network/sdk"
193
+ * import { cheesecake } from "@arkiv-network/sdk/chains"
194
+ * import { http } from "viem"
183
195
  *
184
196
  * const client = createPublicClient({
185
- * chain: braga,
197
+ * chain: cheesecake,
186
198
  * transport: http(),
187
199
  * })
188
- * const entityCount = await client.getEntityCount()
189
- * // entityCount = 0
200
+ * const nonce = await client.getEntityNonce("0xabc…")
201
+ * // 7n — the next entity this account creates is its eighth
190
202
  */
191
- getEntityCount: () => Promise<number>
203
+ getEntityNonce: (owner: Address) => Promise<bigint>
204
+
205
+ /**
206
+ * Works out the keys an account's next creates will be given, before sending them.
207
+ *
208
+ * The engine derives a key from the chain, the registry, the owner, the owner's nonce and a
209
+ * salt — everything but the nonce is known to the caller, and the nonce is read here. This is
210
+ * what lets a batch reference an entity it is about to mint.
211
+ *
212
+ * Each key arrives paired with the salt that mints it, because a create defaults to a *random*
213
+ * salt: a predicted key only holds if the create carries the salt it was predicted with. And the
214
+ * prediction holds only while nothing else from this owner is in flight — for a key you can rely
215
+ * on unconditionally, read it back from the create instead.
216
+ *
217
+ * A literal `count` comes back as a fixed-length tuple, so the pairs destructure into names.
218
+ *
219
+ * @param parameters - Owner, and either a count or the salts. {@link PredictEntityKeysParameters}
220
+ * @returns One `{ key, salt }` pair per create, in batch order.
221
+ * {@link PredictEntityKeysReturnType}
222
+ *
223
+ * @example A batch whose second entity points at its first.
224
+ * import { key } from "@arkiv-network/sdk/attr"
225
+ *
226
+ * const [parent, child] = await client.predictEntityKeys({ owner: account.address, count: 2 })
227
+ * await wallet.mutateEntities({
228
+ * creates: [
229
+ * { payload, contentType, expires, salt: parent.salt },
230
+ * {
231
+ * payload,
232
+ * contentType,
233
+ * expires,
234
+ * salt: child.salt,
235
+ * attributes: { parent: key(parent.key) },
236
+ * },
237
+ * ],
238
+ * })
239
+ */
240
+ predictEntityKeys: <
241
+ const TCount extends number = number,
242
+ const TSalts extends readonly bigint[] | undefined = undefined,
243
+ >(
244
+ parameters: PredictEntityKeysParameters<TCount, TSalts>,
245
+ ) => Promise<PredictEntityKeysReturnType<TCount, TSalts>>
192
246
 
193
247
  /**
194
248
  * Returns the current block timing.
195
249
  * @returns The current block timing. {@link GetBlockTimingReturnType}
196
250
  *
197
251
  * @example
198
- * import { createPublicClient, http } from 'arkiv'
199
- * import { braga } from 'arkiv/chains'
252
+ * import { createPublicClient } from "@arkiv-network/sdk"
253
+ * import { cheesecake } from "@arkiv-network/sdk/chains"
254
+ * import { http } from "viem"
200
255
  *
201
256
  * const client = createPublicClient({
202
- * chain: braga,
257
+ * chain: cheesecake,
203
258
  * transport: http(),
204
259
  * })
205
260
  * const blockTiming = await client.getBlockTiming()
@@ -216,43 +271,32 @@ export type PublicArkivActions<
216
271
  }>
217
272
 
218
273
  /**
219
- * Subscribes to entity events.
220
- * Takes an object with event handlers: {onError, onEntityCreated, onEntityUpdated, onEntityDeleted, onEntityExpiresInExtended}
221
- * @param pollingInterval - The polling interval in milliseconds
222
- * @param fromBlock - The block number to start from
223
- * @returns A function to unsubscribe from the events
274
+ * Watches entity events, calling the handlers you pass as they arrive.
275
+ *
276
+ * All five are decoded from logs — `onEntityCreated`, `onEntityPatched`, `onExpiryExtended`,
277
+ * `onOwnershipTransferred`, `onEntityDeleted` — and each carries the block, transaction and log
278
+ * index it came from, which is the order the operations were applied in. `onEvent` receives all
279
+ * of them, whatever their type.
280
+ *
281
+ * @param parameters - Handlers and options, all optional. {@link WatchEntityEventsParameters}
282
+ * @returns A function that stops the watcher.
224
283
  *
225
284
  * @example
226
- * import { createPublicClient, http } from 'arkiv'
227
- * import { braga } from 'arkiv/chains'
285
+ * import { createPublicClient } from "@arkiv-network/sdk"
286
+ * import { cheesecake } from "@arkiv-network/sdk/chains"
287
+ * import { http } from "viem"
228
288
  *
229
289
  * const client = createPublicClient({
230
- * chain: braga,
290
+ * chain: cheesecake,
231
291
  * transport: http(),
232
292
  * })
233
- * const unsubscribe = await client.subscribeEntityEvents({
234
- * onError: (error) => console.error("subscribeEntityEvents error", error),
293
+ * const unwatch = client.watchEntityEvents({
294
+ * onEntityCreated: ({ entityKey, expiresAt }) => console.log(entityKey, "until", expiresAt),
295
+ * onError: (error) => console.error("watchEntityEvents error", error),
235
296
  * })
236
- * unsubscribe() // unsubscribe from the events
297
+ * unwatch() // stop watching
237
298
  */
238
- subscribeEntityEvents: (
239
- {
240
- onError,
241
- onEntityCreated,
242
- onEntityUpdated,
243
- onEntityDeleted,
244
- onEntityExpiresInExtended,
245
- }: {
246
- onError?: (error: Error) => void
247
- onEntityCreated?: (event: OnEntityCreatedEvent) => void
248
- onEntityUpdated?: (event: OnEntityUpdatedEvent) => void
249
- onEntityDeleted?: (event: OnEntityDeletedEvent) => void
250
- onEntityExpired?: (event: OnEntityExpiredEvent) => void
251
- onEntityExpiresInExtended?: (event: OnEntityExpiresInExtendedEvent) => void
252
- },
253
- pollingInterval?: number,
254
- fromBlock?: bigint,
255
- ) => Promise<() => void>
299
+ watchEntityEvents: (parameters: WatchEntityEventsParameters) => () => void
256
300
  }
257
301
 
258
302
  export function publicArkivActions<
@@ -262,42 +306,19 @@ export function publicArkivActions<
262
306
  >(client: Client<transport, chain, account>) {
263
307
  return {
264
308
  getEntity: (key: Hex) => getEntity(client, key),
265
- query: (rawQuery: string, queryOptions?: QueryOptions) => query(client, rawQuery, queryOptions),
266
- buildQuery: () => new QueryBuilder(client),
309
+ query: (rawQuery: Expression | string, queryOptions?: QueryOptions) =>
310
+ query(client, rawQuery, queryOptions),
267
311
  select: (selection?: SelectArg) => new SelectQueryBuilder(client, selection),
268
312
  getBlockTiming: () => getBlockTiming(client),
269
313
  getEntityCount: () => getEntityCount(client),
270
- subscribeEntityEvents: (
271
- {
272
- onError,
273
- onEntityCreated,
274
- onEntityUpdated,
275
- onEntityDeleted,
276
- onEntityExpired,
277
- onEntityExpiresInExtended,
278
- }: {
279
- onError?: (error: Error) => void
280
- onEntityCreated?: (event: OnEntityCreatedEvent) => void
281
- onEntityUpdated?: (event: OnEntityUpdatedEvent) => void
282
- onEntityDeleted?: (event: OnEntityDeletedEvent) => void
283
- onEntityExpired?: (event: OnEntityExpiredEvent) => void
284
- onEntityExpiresInExtended?: (event: OnEntityExpiresInExtendedEvent) => void
285
- },
286
- pollingInterval?: number,
287
- fromBlock?: bigint,
288
- ) =>
289
- subscribeEntityEvents(
290
- client,
291
- {
292
- onError,
293
- onEntityCreated,
294
- onEntityUpdated,
295
- onEntityDeleted,
296
- onEntityExpired,
297
- onEntityExpiresInExtended,
298
- },
299
- pollingInterval,
300
- fromBlock,
301
- ),
314
+ getEntityNonce: (owner: Address) => getEntityNonce(client, owner),
315
+ predictEntityKeys: <
316
+ const TCount extends number = number,
317
+ const TSalts extends readonly bigint[] | undefined = undefined,
318
+ >(
319
+ parameters: PredictEntityKeysParameters<TCount, TSalts>,
320
+ ) => predictEntityKeys(client, parameters),
321
+ watchEntityEvents: (parameters: WatchEntityEventsParameters) =>
322
+ watchEntityEvents(client, parameters),
302
323
  }
303
324
  }