@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.
- package/README.md +127 -80
- package/dist/aptos/hasher.d.ts.map +1 -1
- package/dist/aptos/hasher.js +7 -6
- package/dist/aptos/hasher.js.map +1 -1
- package/dist/aptos/index.d.ts +7 -2
- package/dist/aptos/index.d.ts.map +1 -1
- package/dist/aptos/index.js +29 -20
- package/dist/aptos/index.js.map +1 -1
- package/dist/aptos/logs.d.ts +5 -3
- package/dist/aptos/logs.d.ts.map +1 -1
- package/dist/aptos/logs.js +64 -27
- package/dist/aptos/logs.js.map +1 -1
- package/dist/aptos/token.d.ts.map +1 -1
- package/dist/aptos/token.js +2 -1
- package/dist/aptos/token.js.map +1 -1
- package/dist/aptos/types.js +6 -6
- package/dist/aptos/types.js.map +1 -1
- package/dist/chain.d.ts +36 -11
- package/dist/chain.d.ts.map +1 -1
- package/dist/chain.js +34 -2
- package/dist/chain.js.map +1 -1
- package/dist/commits.d.ts +2 -3
- package/dist/commits.d.ts.map +1 -1
- package/dist/commits.js +19 -8
- package/dist/commits.js.map +1 -1
- package/dist/errors/CCIPError.d.ts +48 -0
- package/dist/errors/CCIPError.d.ts.map +1 -0
- package/dist/errors/CCIPError.js +65 -0
- package/dist/errors/CCIPError.js.map +1 -0
- package/dist/errors/codes.d.ts +120 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +156 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/index.d.ts +26 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +51 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/recovery.d.ts +6 -0
- package/dist/errors/recovery.d.ts.map +1 -0
- package/dist/errors/recovery.js +118 -0
- package/dist/errors/recovery.js.map +1 -0
- package/dist/errors/specialized.d.ts +637 -0
- package/dist/errors/specialized.d.ts.map +1 -0
- package/dist/errors/specialized.js +1298 -0
- package/dist/errors/specialized.js.map +1 -0
- package/dist/errors/utils.d.ts +11 -0
- package/dist/errors/utils.d.ts.map +1 -0
- package/dist/errors/utils.js +61 -0
- package/dist/errors/utils.js.map +1 -0
- package/dist/evm/abi/CommitStore_1_5.js +1 -1
- package/dist/evm/abi/LockReleaseTokenPool_1_5.js +1 -1
- package/dist/evm/abi/OffRamp_1_5.js +1 -1
- package/dist/evm/abi/OnRamp_1_5.js +1 -1
- package/dist/evm/abi/PriceRegistry_1_2.d.ts +443 -0
- package/dist/evm/abi/PriceRegistry_1_2.d.ts.map +1 -0
- package/dist/evm/abi/PriceRegistry_1_2.js +439 -0
- package/dist/evm/abi/PriceRegistry_1_2.js.map +1 -0
- package/dist/evm/const.d.ts +1 -0
- package/dist/evm/const.d.ts.map +1 -1
- package/dist/evm/const.js +2 -0
- package/dist/evm/const.js.map +1 -1
- package/dist/evm/hasher.d.ts.map +1 -1
- package/dist/evm/hasher.js +7 -6
- package/dist/evm/hasher.js.map +1 -1
- package/dist/evm/index.d.ts +9 -13
- package/dist/evm/index.d.ts.map +1 -1
- package/dist/evm/index.js +85 -68
- package/dist/evm/index.js.map +1 -1
- package/dist/evm/logs.d.ts.map +1 -1
- package/dist/evm/logs.js +47 -16
- package/dist/evm/logs.js.map +1 -1
- package/dist/evm/messages.d.ts +7 -6
- package/dist/evm/messages.d.ts.map +1 -1
- package/dist/evm/offchain.js +1 -1
- package/dist/evm/offchain.js.map +1 -1
- package/dist/evm/types.d.ts +10 -0
- package/dist/evm/types.d.ts.map +1 -0
- package/dist/evm/types.js +2 -0
- package/dist/evm/types.js.map +1 -0
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +9 -5
- package/dist/execution.js.map +1 -1
- package/dist/extra-args.d.ts.map +1 -1
- package/dist/extra-args.js +4 -3
- package/dist/extra-args.js.map +1 -1
- package/dist/gas.d.ts.map +1 -1
- package/dist/gas.js +3 -2
- package/dist/gas.js.map +1 -1
- package/dist/hasher/hasher.d.ts.map +1 -1
- package/dist/hasher/hasher.js +2 -1
- package/dist/hasher/hasher.js.map +1 -1
- package/dist/hasher/merklemulti.d.ts.map +1 -1
- package/dist/hasher/merklemulti.js +9 -8
- package/dist/hasher/merklemulti.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/offchain.d.ts.map +1 -1
- package/dist/offchain.js +5 -8
- package/dist/offchain.js.map +1 -1
- package/dist/requests.d.ts +1 -1
- package/dist/requests.d.ts.map +1 -1
- package/dist/requests.js +37 -43
- package/dist/requests.js.map +1 -1
- package/dist/selectors.d.ts.map +1 -1
- package/dist/selectors.js +22 -0
- package/dist/selectors.js.map +1 -1
- package/dist/solana/cleanup.d.ts +2 -2
- package/dist/solana/cleanup.d.ts.map +1 -1
- package/dist/solana/cleanup.js +2 -3
- package/dist/solana/cleanup.js.map +1 -1
- package/dist/solana/exec.d.ts.map +1 -1
- package/dist/solana/exec.js +12 -12
- package/dist/solana/exec.js.map +1 -1
- package/dist/solana/hasher.d.ts.map +1 -1
- package/dist/solana/hasher.js +6 -5
- package/dist/solana/hasher.js.map +1 -1
- package/dist/solana/index.d.ts +30 -13
- package/dist/solana/index.d.ts.map +1 -1
- package/dist/solana/index.js +96 -143
- package/dist/solana/index.js.map +1 -1
- package/dist/solana/logs.d.ts +15 -0
- package/dist/solana/logs.d.ts.map +1 -0
- package/dist/solana/logs.js +106 -0
- package/dist/solana/logs.js.map +1 -0
- package/dist/solana/offchain.d.ts.map +1 -1
- package/dist/solana/offchain.js +6 -5
- package/dist/solana/offchain.js.map +1 -1
- package/dist/solana/patchBorsh.d.ts.map +1 -1
- package/dist/solana/patchBorsh.js +3 -2
- package/dist/solana/patchBorsh.js.map +1 -1
- package/dist/solana/send.d.ts.map +1 -1
- package/dist/solana/send.js +8 -7
- package/dist/solana/send.js.map +1 -1
- package/dist/solana/utils.d.ts +7 -8
- package/dist/solana/utils.d.ts.map +1 -1
- package/dist/solana/utils.js +23 -11
- package/dist/solana/utils.js.map +1 -1
- package/dist/sui/discovery.d.ts +18 -0
- package/dist/sui/discovery.d.ts.map +1 -0
- package/dist/sui/discovery.js +116 -0
- package/dist/sui/discovery.js.map +1 -0
- package/dist/sui/events.d.ts +36 -0
- package/dist/sui/events.d.ts.map +1 -0
- package/dist/sui/events.js +179 -0
- package/dist/sui/events.js.map +1 -0
- package/dist/sui/hasher.d.ts.map +1 -1
- package/dist/sui/hasher.js +6 -5
- package/dist/sui/hasher.js.map +1 -1
- package/dist/sui/index.d.ts +69 -41
- package/dist/sui/index.d.ts.map +1 -1
- package/dist/sui/index.js +402 -65
- package/dist/sui/index.js.map +1 -1
- package/dist/sui/manuallyExec/encoder.d.ts +8 -0
- package/dist/sui/manuallyExec/encoder.d.ts.map +1 -0
- package/dist/sui/manuallyExec/encoder.js +76 -0
- package/dist/sui/manuallyExec/encoder.js.map +1 -0
- package/dist/sui/manuallyExec/index.d.ts +37 -0
- package/dist/sui/manuallyExec/index.d.ts.map +1 -0
- package/dist/sui/manuallyExec/index.js +81 -0
- package/dist/sui/manuallyExec/index.js.map +1 -0
- package/dist/sui/objects.d.ts +46 -0
- package/dist/sui/objects.d.ts.map +1 -0
- package/dist/sui/objects.js +259 -0
- package/dist/sui/objects.js.map +1 -0
- package/dist/ton/bindings/offramp.d.ts +48 -0
- package/dist/ton/bindings/offramp.d.ts.map +1 -0
- package/dist/ton/bindings/offramp.js +63 -0
- package/dist/ton/bindings/offramp.js.map +1 -0
- package/dist/ton/bindings/onramp.d.ts +40 -0
- package/dist/ton/bindings/onramp.d.ts.map +1 -0
- package/dist/ton/bindings/onramp.js +51 -0
- package/dist/ton/bindings/onramp.js.map +1 -0
- package/dist/ton/bindings/router.d.ts +47 -0
- package/dist/ton/bindings/router.d.ts.map +1 -0
- package/dist/ton/bindings/router.js +51 -0
- package/dist/ton/bindings/router.js.map +1 -0
- package/dist/ton/exec.d.ts +18 -0
- package/dist/ton/exec.d.ts.map +1 -0
- package/dist/ton/exec.js +28 -0
- package/dist/ton/exec.js.map +1 -0
- package/dist/ton/hasher.d.ts +27 -0
- package/dist/ton/hasher.d.ts.map +1 -0
- package/dist/ton/hasher.js +134 -0
- package/dist/ton/hasher.js.map +1 -0
- package/dist/ton/index.d.ts +247 -0
- package/dist/ton/index.d.ts.map +1 -0
- package/dist/ton/index.js +781 -0
- package/dist/ton/index.js.map +1 -0
- package/dist/ton/logs.d.ts +26 -0
- package/dist/ton/logs.d.ts.map +1 -0
- package/dist/ton/logs.js +126 -0
- package/dist/ton/logs.js.map +1 -0
- package/dist/ton/types.d.ts +37 -0
- package/dist/ton/types.d.ts.map +1 -0
- package/dist/ton/types.js +92 -0
- package/dist/ton/types.js.map +1 -0
- package/dist/ton/utils.d.ts +67 -0
- package/dist/ton/utils.d.ts.map +1 -0
- package/dist/ton/utils.js +425 -0
- package/dist/ton/utils.js.map +1 -0
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +52 -17
- package/dist/utils.js.map +1 -1
- package/package.json +12 -10
- package/src/aptos/hasher.ts +10 -6
- package/src/aptos/index.ts +50 -31
- package/src/aptos/logs.ts +85 -29
- package/src/aptos/token.ts +5 -1
- package/src/aptos/types.ts +6 -6
- package/src/chain.ts +83 -12
- package/src/commits.ts +23 -11
- package/src/errors/CCIPError.ts +86 -0
- package/src/errors/codes.ts +179 -0
- package/src/errors/index.ts +175 -0
- package/src/errors/recovery.ts +170 -0
- package/src/errors/specialized.ts +1655 -0
- package/src/errors/utils.ts +73 -0
- package/src/evm/abi/CommitStore_1_5.ts +1 -1
- package/src/evm/abi/LockReleaseTokenPool_1_5.ts +1 -1
- package/src/evm/abi/OffRamp_1_5.ts +1 -1
- package/src/evm/abi/OnRamp_1_5.ts +1 -1
- package/src/evm/abi/PriceRegistry_1_2.ts +438 -0
- package/src/evm/const.ts +2 -0
- package/src/evm/hasher.ts +7 -6
- package/src/evm/index.ts +104 -86
- package/src/evm/logs.ts +64 -16
- package/src/evm/messages.ts +14 -14
- package/src/evm/offchain.ts +1 -1
- package/src/evm/types.ts +11 -0
- package/src/execution.ts +13 -9
- package/src/extra-args.ts +4 -3
- package/src/gas.ts +10 -3
- package/src/hasher/hasher.ts +2 -1
- package/src/hasher/merklemulti.ts +18 -8
- package/src/index.ts +14 -2
- package/src/offchain.ts +10 -14
- package/src/requests.ts +51 -53
- package/src/selectors.ts +23 -0
- package/src/solana/cleanup.ts +2 -4
- package/src/solana/exec.ts +13 -13
- package/src/solana/hasher.ts +9 -5
- package/src/solana/index.ts +126 -200
- package/src/solana/logs.ts +155 -0
- package/src/solana/offchain.ts +10 -7
- package/src/solana/patchBorsh.ts +3 -2
- package/src/solana/send.ts +14 -7
- package/src/solana/utils.ts +31 -17
- package/src/sui/discovery.ts +163 -0
- package/src/sui/events.ts +328 -0
- package/src/sui/hasher.ts +6 -5
- package/src/sui/index.ts +528 -80
- package/src/sui/manuallyExec/encoder.ts +88 -0
- package/src/sui/manuallyExec/index.ts +137 -0
- package/src/sui/objects.ts +358 -0
- package/src/ton/bindings/offramp.ts +96 -0
- package/src/ton/bindings/onramp.ts +72 -0
- package/src/ton/bindings/router.ts +65 -0
- package/src/ton/exec.ts +44 -0
- package/src/ton/hasher.ts +184 -0
- package/src/ton/index.ts +989 -0
- package/src/ton/logs.ts +157 -0
- package/src/ton/types.ts +143 -0
- package/src/ton/utils.ts +514 -0
- package/src/types.ts +6 -2
- package/src/utils.ts +58 -23
- 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
|
|
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
|
|
53
|
+
throw new CCIPExtraArgsInvalidError('Sui', message.extraArgs)
|
|
53
54
|
;({ tokenReceiver, gasLimit } = parsedArgs)
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
const innerHash = concat([
|
|
57
|
-
encodeNumber(message.
|
|
58
|
+
encodeNumber(message.messageId),
|
|
58
59
|
zeroPadValue(message.receiver, 32),
|
|
59
|
-
encodeNumber(message.
|
|
60
|
+
encodeNumber(message.sequenceNumber),
|
|
60
61
|
encodeNumber(gasLimit),
|
|
61
62
|
zeroPadValue(tokenReceiver, 32),
|
|
62
|
-
encodeNumber(message.
|
|
63
|
+
encodeNumber(message.nonce),
|
|
63
64
|
])
|
|
64
65
|
|
|
65
66
|
const tokenHash = concat([
|