@chainlink/ccip-sdk 0.91.0 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +127 -80
  2. package/dist/aptos/hasher.d.ts.map +1 -1
  3. package/dist/aptos/hasher.js +7 -6
  4. package/dist/aptos/hasher.js.map +1 -1
  5. package/dist/aptos/index.d.ts +7 -2
  6. package/dist/aptos/index.d.ts.map +1 -1
  7. package/dist/aptos/index.js +29 -20
  8. package/dist/aptos/index.js.map +1 -1
  9. package/dist/aptos/logs.d.ts +5 -3
  10. package/dist/aptos/logs.d.ts.map +1 -1
  11. package/dist/aptos/logs.js +64 -27
  12. package/dist/aptos/logs.js.map +1 -1
  13. package/dist/aptos/token.d.ts.map +1 -1
  14. package/dist/aptos/token.js +2 -1
  15. package/dist/aptos/token.js.map +1 -1
  16. package/dist/aptos/types.js +6 -6
  17. package/dist/aptos/types.js.map +1 -1
  18. package/dist/chain.d.ts +36 -11
  19. package/dist/chain.d.ts.map +1 -1
  20. package/dist/chain.js +34 -2
  21. package/dist/chain.js.map +1 -1
  22. package/dist/commits.d.ts +2 -3
  23. package/dist/commits.d.ts.map +1 -1
  24. package/dist/commits.js +19 -8
  25. package/dist/commits.js.map +1 -1
  26. package/dist/errors/CCIPError.d.ts +48 -0
  27. package/dist/errors/CCIPError.d.ts.map +1 -0
  28. package/dist/errors/CCIPError.js +65 -0
  29. package/dist/errors/CCIPError.js.map +1 -0
  30. package/dist/errors/codes.d.ts +120 -0
  31. package/dist/errors/codes.d.ts.map +1 -0
  32. package/dist/errors/codes.js +156 -0
  33. package/dist/errors/codes.js.map +1 -0
  34. package/dist/errors/index.d.ts +26 -0
  35. package/dist/errors/index.d.ts.map +1 -0
  36. package/dist/errors/index.js +51 -0
  37. package/dist/errors/index.js.map +1 -0
  38. package/dist/errors/recovery.d.ts +6 -0
  39. package/dist/errors/recovery.d.ts.map +1 -0
  40. package/dist/errors/recovery.js +118 -0
  41. package/dist/errors/recovery.js.map +1 -0
  42. package/dist/errors/specialized.d.ts +637 -0
  43. package/dist/errors/specialized.d.ts.map +1 -0
  44. package/dist/errors/specialized.js +1298 -0
  45. package/dist/errors/specialized.js.map +1 -0
  46. package/dist/errors/utils.d.ts +11 -0
  47. package/dist/errors/utils.d.ts.map +1 -0
  48. package/dist/errors/utils.js +61 -0
  49. package/dist/errors/utils.js.map +1 -0
  50. package/dist/evm/abi/CommitStore_1_5.js +1 -1
  51. package/dist/evm/abi/LockReleaseTokenPool_1_5.js +1 -1
  52. package/dist/evm/abi/OffRamp_1_5.js +1 -1
  53. package/dist/evm/abi/OnRamp_1_5.js +1 -1
  54. package/dist/evm/abi/PriceRegistry_1_2.d.ts +443 -0
  55. package/dist/evm/abi/PriceRegistry_1_2.d.ts.map +1 -0
  56. package/dist/evm/abi/PriceRegistry_1_2.js +439 -0
  57. package/dist/evm/abi/PriceRegistry_1_2.js.map +1 -0
  58. package/dist/evm/const.d.ts +1 -0
  59. package/dist/evm/const.d.ts.map +1 -1
  60. package/dist/evm/const.js +2 -0
  61. package/dist/evm/const.js.map +1 -1
  62. package/dist/evm/hasher.d.ts.map +1 -1
  63. package/dist/evm/hasher.js +7 -6
  64. package/dist/evm/hasher.js.map +1 -1
  65. package/dist/evm/index.d.ts +9 -13
  66. package/dist/evm/index.d.ts.map +1 -1
  67. package/dist/evm/index.js +85 -68
  68. package/dist/evm/index.js.map +1 -1
  69. package/dist/evm/logs.d.ts.map +1 -1
  70. package/dist/evm/logs.js +47 -16
  71. package/dist/evm/logs.js.map +1 -1
  72. package/dist/evm/messages.d.ts +7 -6
  73. package/dist/evm/messages.d.ts.map +1 -1
  74. package/dist/evm/offchain.js +1 -1
  75. package/dist/evm/offchain.js.map +1 -1
  76. package/dist/evm/types.d.ts +10 -0
  77. package/dist/evm/types.d.ts.map +1 -0
  78. package/dist/evm/types.js +2 -0
  79. package/dist/evm/types.js.map +1 -0
  80. package/dist/execution.d.ts.map +1 -1
  81. package/dist/execution.js +9 -5
  82. package/dist/execution.js.map +1 -1
  83. package/dist/extra-args.d.ts.map +1 -1
  84. package/dist/extra-args.js +4 -3
  85. package/dist/extra-args.js.map +1 -1
  86. package/dist/gas.d.ts.map +1 -1
  87. package/dist/gas.js +3 -2
  88. package/dist/gas.js.map +1 -1
  89. package/dist/hasher/hasher.d.ts.map +1 -1
  90. package/dist/hasher/hasher.js +2 -1
  91. package/dist/hasher/hasher.js.map +1 -1
  92. package/dist/hasher/merklemulti.d.ts.map +1 -1
  93. package/dist/hasher/merklemulti.js +9 -8
  94. package/dist/hasher/merklemulti.js.map +1 -1
  95. package/dist/index.d.ts +5 -2
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +6 -2
  98. package/dist/index.js.map +1 -1
  99. package/dist/offchain.d.ts.map +1 -1
  100. package/dist/offchain.js +5 -8
  101. package/dist/offchain.js.map +1 -1
  102. package/dist/requests.d.ts +1 -1
  103. package/dist/requests.d.ts.map +1 -1
  104. package/dist/requests.js +37 -43
  105. package/dist/requests.js.map +1 -1
  106. package/dist/selectors.d.ts.map +1 -1
  107. package/dist/selectors.js +22 -0
  108. package/dist/selectors.js.map +1 -1
  109. package/dist/solana/cleanup.d.ts +2 -2
  110. package/dist/solana/cleanup.d.ts.map +1 -1
  111. package/dist/solana/cleanup.js +2 -3
  112. package/dist/solana/cleanup.js.map +1 -1
  113. package/dist/solana/exec.d.ts.map +1 -1
  114. package/dist/solana/exec.js +12 -12
  115. package/dist/solana/exec.js.map +1 -1
  116. package/dist/solana/hasher.d.ts.map +1 -1
  117. package/dist/solana/hasher.js +6 -5
  118. package/dist/solana/hasher.js.map +1 -1
  119. package/dist/solana/index.d.ts +30 -13
  120. package/dist/solana/index.d.ts.map +1 -1
  121. package/dist/solana/index.js +96 -143
  122. package/dist/solana/index.js.map +1 -1
  123. package/dist/solana/logs.d.ts +15 -0
  124. package/dist/solana/logs.d.ts.map +1 -0
  125. package/dist/solana/logs.js +106 -0
  126. package/dist/solana/logs.js.map +1 -0
  127. package/dist/solana/offchain.d.ts.map +1 -1
  128. package/dist/solana/offchain.js +6 -5
  129. package/dist/solana/offchain.js.map +1 -1
  130. package/dist/solana/patchBorsh.d.ts.map +1 -1
  131. package/dist/solana/patchBorsh.js +3 -2
  132. package/dist/solana/patchBorsh.js.map +1 -1
  133. package/dist/solana/send.d.ts.map +1 -1
  134. package/dist/solana/send.js +8 -7
  135. package/dist/solana/send.js.map +1 -1
  136. package/dist/solana/utils.d.ts +7 -8
  137. package/dist/solana/utils.d.ts.map +1 -1
  138. package/dist/solana/utils.js +23 -11
  139. package/dist/solana/utils.js.map +1 -1
  140. package/dist/sui/discovery.d.ts +18 -0
  141. package/dist/sui/discovery.d.ts.map +1 -0
  142. package/dist/sui/discovery.js +116 -0
  143. package/dist/sui/discovery.js.map +1 -0
  144. package/dist/sui/events.d.ts +36 -0
  145. package/dist/sui/events.d.ts.map +1 -0
  146. package/dist/sui/events.js +179 -0
  147. package/dist/sui/events.js.map +1 -0
  148. package/dist/sui/hasher.d.ts.map +1 -1
  149. package/dist/sui/hasher.js +6 -5
  150. package/dist/sui/hasher.js.map +1 -1
  151. package/dist/sui/index.d.ts +69 -41
  152. package/dist/sui/index.d.ts.map +1 -1
  153. package/dist/sui/index.js +402 -65
  154. package/dist/sui/index.js.map +1 -1
  155. package/dist/sui/manuallyExec/encoder.d.ts +8 -0
  156. package/dist/sui/manuallyExec/encoder.d.ts.map +1 -0
  157. package/dist/sui/manuallyExec/encoder.js +76 -0
  158. package/dist/sui/manuallyExec/encoder.js.map +1 -0
  159. package/dist/sui/manuallyExec/index.d.ts +37 -0
  160. package/dist/sui/manuallyExec/index.d.ts.map +1 -0
  161. package/dist/sui/manuallyExec/index.js +81 -0
  162. package/dist/sui/manuallyExec/index.js.map +1 -0
  163. package/dist/sui/objects.d.ts +46 -0
  164. package/dist/sui/objects.d.ts.map +1 -0
  165. package/dist/sui/objects.js +259 -0
  166. package/dist/sui/objects.js.map +1 -0
  167. package/dist/ton/bindings/offramp.d.ts +48 -0
  168. package/dist/ton/bindings/offramp.d.ts.map +1 -0
  169. package/dist/ton/bindings/offramp.js +63 -0
  170. package/dist/ton/bindings/offramp.js.map +1 -0
  171. package/dist/ton/bindings/onramp.d.ts +40 -0
  172. package/dist/ton/bindings/onramp.d.ts.map +1 -0
  173. package/dist/ton/bindings/onramp.js +51 -0
  174. package/dist/ton/bindings/onramp.js.map +1 -0
  175. package/dist/ton/bindings/router.d.ts +47 -0
  176. package/dist/ton/bindings/router.d.ts.map +1 -0
  177. package/dist/ton/bindings/router.js +51 -0
  178. package/dist/ton/bindings/router.js.map +1 -0
  179. package/dist/ton/exec.d.ts +18 -0
  180. package/dist/ton/exec.d.ts.map +1 -0
  181. package/dist/ton/exec.js +28 -0
  182. package/dist/ton/exec.js.map +1 -0
  183. package/dist/ton/hasher.d.ts +27 -0
  184. package/dist/ton/hasher.d.ts.map +1 -0
  185. package/dist/ton/hasher.js +134 -0
  186. package/dist/ton/hasher.js.map +1 -0
  187. package/dist/ton/index.d.ts +247 -0
  188. package/dist/ton/index.d.ts.map +1 -0
  189. package/dist/ton/index.js +781 -0
  190. package/dist/ton/index.js.map +1 -0
  191. package/dist/ton/logs.d.ts +26 -0
  192. package/dist/ton/logs.d.ts.map +1 -0
  193. package/dist/ton/logs.js +126 -0
  194. package/dist/ton/logs.js.map +1 -0
  195. package/dist/ton/types.d.ts +37 -0
  196. package/dist/ton/types.d.ts.map +1 -0
  197. package/dist/ton/types.js +92 -0
  198. package/dist/ton/types.js.map +1 -0
  199. package/dist/ton/utils.d.ts +67 -0
  200. package/dist/ton/utils.d.ts.map +1 -0
  201. package/dist/ton/utils.js +425 -0
  202. package/dist/ton/utils.js.map +1 -0
  203. package/dist/types.d.ts +4 -2
  204. package/dist/types.d.ts.map +1 -1
  205. package/dist/types.js +1 -0
  206. package/dist/types.js.map +1 -1
  207. package/dist/utils.d.ts +10 -0
  208. package/dist/utils.d.ts.map +1 -1
  209. package/dist/utils.js +52 -17
  210. package/dist/utils.js.map +1 -1
  211. package/package.json +12 -10
  212. package/src/aptos/hasher.ts +10 -6
  213. package/src/aptos/index.ts +50 -31
  214. package/src/aptos/logs.ts +85 -29
  215. package/src/aptos/token.ts +5 -1
  216. package/src/aptos/types.ts +6 -6
  217. package/src/chain.ts +83 -12
  218. package/src/commits.ts +23 -11
  219. package/src/errors/CCIPError.ts +86 -0
  220. package/src/errors/codes.ts +179 -0
  221. package/src/errors/index.ts +175 -0
  222. package/src/errors/recovery.ts +170 -0
  223. package/src/errors/specialized.ts +1655 -0
  224. package/src/errors/utils.ts +73 -0
  225. package/src/evm/abi/CommitStore_1_5.ts +1 -1
  226. package/src/evm/abi/LockReleaseTokenPool_1_5.ts +1 -1
  227. package/src/evm/abi/OffRamp_1_5.ts +1 -1
  228. package/src/evm/abi/OnRamp_1_5.ts +1 -1
  229. package/src/evm/abi/PriceRegistry_1_2.ts +438 -0
  230. package/src/evm/const.ts +2 -0
  231. package/src/evm/hasher.ts +7 -6
  232. package/src/evm/index.ts +104 -86
  233. package/src/evm/logs.ts +64 -16
  234. package/src/evm/messages.ts +14 -14
  235. package/src/evm/offchain.ts +1 -1
  236. package/src/evm/types.ts +11 -0
  237. package/src/execution.ts +13 -9
  238. package/src/extra-args.ts +4 -3
  239. package/src/gas.ts +10 -3
  240. package/src/hasher/hasher.ts +2 -1
  241. package/src/hasher/merklemulti.ts +18 -8
  242. package/src/index.ts +14 -2
  243. package/src/offchain.ts +10 -14
  244. package/src/requests.ts +51 -53
  245. package/src/selectors.ts +23 -0
  246. package/src/solana/cleanup.ts +2 -4
  247. package/src/solana/exec.ts +13 -13
  248. package/src/solana/hasher.ts +9 -5
  249. package/src/solana/index.ts +126 -200
  250. package/src/solana/logs.ts +155 -0
  251. package/src/solana/offchain.ts +10 -7
  252. package/src/solana/patchBorsh.ts +3 -2
  253. package/src/solana/send.ts +14 -7
  254. package/src/solana/utils.ts +31 -17
  255. package/src/sui/discovery.ts +163 -0
  256. package/src/sui/events.ts +328 -0
  257. package/src/sui/hasher.ts +6 -5
  258. package/src/sui/index.ts +528 -80
  259. package/src/sui/manuallyExec/encoder.ts +88 -0
  260. package/src/sui/manuallyExec/index.ts +137 -0
  261. package/src/sui/objects.ts +358 -0
  262. package/src/ton/bindings/offramp.ts +96 -0
  263. package/src/ton/bindings/onramp.ts +72 -0
  264. package/src/ton/bindings/router.ts +65 -0
  265. package/src/ton/exec.ts +44 -0
  266. package/src/ton/hasher.ts +184 -0
  267. package/src/ton/index.ts +989 -0
  268. package/src/ton/logs.ts +157 -0
  269. package/src/ton/types.ts +143 -0
  270. package/src/ton/utils.ts +514 -0
  271. package/src/types.ts +6 -2
  272. package/src/utils.ts +58 -23
  273. package/tsconfig.json +2 -1
@@ -0,0 +1,328 @@
1
+ import type { SuiClient, SuiEventFilter } from '@mysten/sui/client'
2
+ import type { SuiGraphQLClient } from '@mysten/sui/graphql'
3
+
4
+ import { CCIPDataFormatUnsupportedError } from '../errors/index.ts'
5
+
6
+ /**
7
+ * Commit event data structure from Sui blockchain.
8
+ */
9
+ export type CommitEvent = {
10
+ unblessed_merkle_roots: {
11
+ max_seq_nr: string
12
+ merkle_root: string
13
+ min_seq_nr: string
14
+ on_ramp_address: string
15
+ source_chain_selector: string
16
+ }[]
17
+ }
18
+
19
+ async function getTransactionDigestsInTimeRange(
20
+ client: SuiClient,
21
+ startTime: Date,
22
+ endTime: Date,
23
+ ): Promise<{ firstDigest: string; lastDigest: string } | null> {
24
+ const filter: SuiEventFilter = {
25
+ TimeRange: {
26
+ startTime: startTime.getTime().toString(),
27
+ endTime: endTime.getTime().toString(),
28
+ },
29
+ }
30
+
31
+ // Get first event (ascending order)
32
+ const firstEvents = await client.queryEvents({
33
+ query: filter,
34
+ limit: 1,
35
+ order: 'ascending',
36
+ })
37
+
38
+ if (!firstEvents.data || firstEvents.data.length === 0) {
39
+ return null
40
+ }
41
+
42
+ const firstDigest = firstEvents.data[0].id.txDigest
43
+
44
+ // Get last event (descending order)
45
+ const lastEvents = await client.queryEvents({
46
+ query: filter,
47
+ limit: 1,
48
+ order: 'descending',
49
+ })
50
+
51
+ const lastDigest = lastEvents.data[0].id.txDigest
52
+
53
+ return { firstDigest, lastDigest }
54
+ }
55
+
56
+ type TransactionCheckpointResponse = {
57
+ first: {
58
+ digest: string
59
+ effects: {
60
+ checkpoint: {
61
+ sequenceNumber: string
62
+ }
63
+ }
64
+ } | null
65
+ last: {
66
+ digest: string
67
+ effects: {
68
+ checkpoint: {
69
+ sequenceNumber: string
70
+ }
71
+ }
72
+ } | null
73
+ }
74
+
75
+ type LatestCheckpointResponse = {
76
+ checkpoints: {
77
+ nodes: Array<{
78
+ sequenceNumber: string
79
+ }>
80
+ }
81
+ }
82
+
83
+ async function getCheckpointsFromTransactions(
84
+ graphqlClient: SuiGraphQLClient,
85
+ firstDigest: string,
86
+ lastDigest: string,
87
+ ): Promise<{ startCheckpoint: number; endCheckpoint: number }> {
88
+ const query = `
89
+ query GetTransactionCheckpoints($firstDigest: String!, $lastDigest: String!) {
90
+ first: transaction(digest: $firstDigest) {
91
+ digest
92
+ effects {
93
+ checkpoint {
94
+ sequenceNumber
95
+ }
96
+ }
97
+ }
98
+ last: transaction(digest: $lastDigest) {
99
+ digest
100
+ effects {
101
+ checkpoint {
102
+ sequenceNumber
103
+ }
104
+ }
105
+ }
106
+ }
107
+ `
108
+
109
+ const result = await graphqlClient.query<TransactionCheckpointResponse>({
110
+ query,
111
+ variables: {
112
+ firstDigest,
113
+ lastDigest,
114
+ },
115
+ })
116
+
117
+ if (result.errors) {
118
+ throw new CCIPDataFormatUnsupportedError(
119
+ `Error fetching transaction checkpoints: ${JSON.stringify(result.errors, null, 2)}`,
120
+ )
121
+ }
122
+
123
+ if (!result.data?.first) {
124
+ throw new CCIPDataFormatUnsupportedError('First transaction not found in GraphQL response')
125
+ }
126
+
127
+ const startCheckpoint = parseInt(result.data.first.effects.checkpoint.sequenceNumber)
128
+
129
+ // If the last transaction is not found (too recent), use current checkpoint
130
+ let endCheckpoint: number
131
+ if (!result.data.last) {
132
+ const latestCheckpointQuery = `
133
+ query GetLatestCheckpoint {
134
+ checkpoints(last: 1) {
135
+ nodes {
136
+ sequenceNumber
137
+ }
138
+ }
139
+ }
140
+ `
141
+ const latestResult = await graphqlClient.query<LatestCheckpointResponse>({
142
+ query: latestCheckpointQuery,
143
+ variables: {},
144
+ })
145
+ if (!latestResult.data) {
146
+ throw new CCIPDataFormatUnsupportedError('Failed to fetch latest checkpoint')
147
+ }
148
+ endCheckpoint = parseInt(latestResult.data.checkpoints.nodes[0].sequenceNumber)
149
+ } else {
150
+ endCheckpoint = parseInt(result.data.last.effects.checkpoint.sequenceNumber)
151
+ }
152
+
153
+ return { startCheckpoint, endCheckpoint }
154
+ }
155
+
156
+ type EventNode<T = unknown> = {
157
+ timestamp: string
158
+ contents: {
159
+ json: T
160
+ }
161
+ transaction?: {
162
+ effects: {
163
+ checkpoint: {
164
+ sequenceNumber: number
165
+ }
166
+ }
167
+ digest: string
168
+ }
169
+ }
170
+
171
+ type GraphQLEventNode = {
172
+ sender: {
173
+ address: string
174
+ }
175
+ timestamp: string
176
+ contents?: {
177
+ json: unknown
178
+ }
179
+ transaction?: {
180
+ effects: {
181
+ checkpoint: {
182
+ sequenceNumber: number
183
+ }
184
+ }
185
+ digest: string
186
+ }
187
+ }
188
+
189
+ type EventsQueryResponse = {
190
+ events: {
191
+ nodes: GraphQLEventNode[]
192
+ pageInfo: {
193
+ hasNextPage: boolean
194
+ endCursor: string | null
195
+ }
196
+ }
197
+ }
198
+
199
+ async function fetchEventsWithCheckpointRange<T>(
200
+ graphqlClient: SuiGraphQLClient,
201
+ type: string,
202
+ startCheckpoint: number,
203
+ endCheckpoint: number,
204
+ ): Promise<EventNode<T>[]> {
205
+ const allEvents: EventNode<T>[] = []
206
+ let cursor: string | undefined = undefined
207
+ let hasNextPage = true
208
+
209
+ while (hasNextPage) {
210
+ const query = `
211
+ query FetchEvents($type: String!, $after: String, $afterCheckpoint: UInt53!, $beforeCheckpoint: UInt53!) {
212
+ events(
213
+ filter: {
214
+ type: $type
215
+ afterCheckpoint: $afterCheckpoint
216
+ beforeCheckpoint: $beforeCheckpoint
217
+ }
218
+ after: $after
219
+ first: 50
220
+ ) {
221
+ nodes {
222
+ sender {
223
+ address
224
+ }
225
+ timestamp
226
+ contents {
227
+ json
228
+ }
229
+ transaction {
230
+ effects {
231
+ checkpoint {
232
+ sequenceNumber
233
+ }
234
+ }
235
+ digest
236
+ }
237
+ }
238
+ pageInfo {
239
+ hasNextPage
240
+ endCursor
241
+ }
242
+ }
243
+ }
244
+ `
245
+
246
+ const result: { data?: EventsQueryResponse; errors?: unknown } =
247
+ await graphqlClient.query<EventsQueryResponse>({
248
+ query,
249
+ variables: {
250
+ type,
251
+ after: cursor,
252
+ afterCheckpoint: startCheckpoint,
253
+ beforeCheckpoint: endCheckpoint + 1, // beforeCheckpoint is exclusive
254
+ },
255
+ })
256
+
257
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
258
+ if (result.errors) {
259
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
260
+ throw new CCIPDataFormatUnsupportedError(
261
+ `GraphQL errors: ${JSON.stringify(result.errors, null, 2)}`,
262
+ )
263
+ }
264
+
265
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
266
+ if (!result.data) {
267
+ throw new CCIPDataFormatUnsupportedError('No data returned from GraphQL query')
268
+ }
269
+
270
+ const {
271
+ nodes,
272
+ pageInfo,
273
+ }: { nodes: GraphQLEventNode[]; pageInfo: { hasNextPage: boolean; endCursor: string | null } } =
274
+ result.data.events
275
+
276
+ for (const node of nodes) {
277
+ allEvents.push({
278
+ timestamp: node.timestamp,
279
+ contents: {
280
+ json: (node.contents?.json || node) as T,
281
+ },
282
+ transaction: node.transaction,
283
+ })
284
+ }
285
+
286
+ hasNextPage = pageInfo.hasNextPage
287
+ cursor = pageInfo.endCursor ?? undefined
288
+
289
+ if (!hasNextPage) {
290
+ break
291
+ }
292
+ }
293
+
294
+ return allEvents
295
+ }
296
+
297
+ /**
298
+ * Sui RPC does not support querying events by time range and event type
299
+ * Sui GraphQL does not support querying events by time range directly, but does with checkpoints
300
+ * This function combines both to get events of a specific type within a time range
301
+ */
302
+ export async function getSuiEventsInTimeRange<T>(
303
+ client: SuiClient,
304
+ graphqlClient: SuiGraphQLClient,
305
+ type: string,
306
+ startTime: Date,
307
+ endTime: Date,
308
+ ): Promise<EventNode<T>[]> {
309
+ const digests = await getTransactionDigestsInTimeRange(client, startTime, endTime)
310
+ if (!digests) {
311
+ return []
312
+ }
313
+
314
+ const checkpoints = await getCheckpointsFromTransactions(
315
+ graphqlClient,
316
+ digests.firstDigest,
317
+ digests.lastDigest,
318
+ )
319
+
320
+ const events = await fetchEventsWithCheckpointRange<T>(
321
+ graphqlClient,
322
+ type,
323
+ checkpoints.startCheckpoint,
324
+ checkpoints.endCheckpoint,
325
+ )
326
+
327
+ return events
328
+ }
package/src/sui/hasher.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { concat, id, keccak256, zeroPadValue } from 'ethers'
2
2
 
3
3
  import { encodeNumber, encodeRawBytes } from '../aptos/utils.ts'
4
+ import { CCIPExtraArgsInvalidError, CCIPSuiHasherVersionUnsupportedError } from '../errors/index.ts'
4
5
  import { decodeExtraArgs } from '../extra-args.ts'
5
6
  import { type LeafHasher, LEAF_DOMAIN_SEPARATOR } from '../hasher/common.ts'
6
7
  import { type CCIPMessage, type CCIPMessage_V1_6, CCIPVersion } from '../types.ts'
@@ -29,7 +30,7 @@ export function getSuiLeafHasher<V extends CCIPVersion = CCIPVersion>({
29
30
  return ((message: CCIPMessage<typeof CCIPVersion.V1_6>): string =>
30
31
  hashV16SuiMessage(message, metadataHash)) as LeafHasher<V>
31
32
  default:
32
- throw new Error(`Unsupported hasher version for Sui: ${version as string}`)
33
+ throw new CCIPSuiHasherVersionUnsupportedError(version as string)
33
34
  }
34
35
  }
35
36
 
@@ -49,17 +50,17 @@ export function hashV16SuiMessage(
49
50
  } else {
50
51
  const parsedArgs = decodeExtraArgs(message.extraArgs)
51
52
  if (!parsedArgs || parsedArgs._tag !== 'SuiExtraArgsV1')
52
- throw new Error('Invalid extraArgs for Sui message, must be SUIExtraArgsV1')
53
+ throw new CCIPExtraArgsInvalidError('Sui', message.extraArgs)
53
54
  ;({ tokenReceiver, gasLimit } = parsedArgs)
54
55
  }
55
56
 
56
57
  const innerHash = concat([
57
- encodeNumber(message.header.messageId),
58
+ encodeNumber(message.messageId),
58
59
  zeroPadValue(message.receiver, 32),
59
- encodeNumber(message.header.sequenceNumber),
60
+ encodeNumber(message.sequenceNumber),
60
61
  encodeNumber(gasLimit),
61
62
  zeroPadValue(tokenReceiver, 32),
62
- encodeNumber(message.header.nonce),
63
+ encodeNumber(message.nonce),
63
64
  ])
64
65
 
65
66
  const tokenHash = concat([