@sentio/sdk 2.0.0-rc.14 → 2.0.0-rc.16

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 (199) hide show
  1. package/lib/aptos/api.d.ts +5 -0
  2. package/lib/aptos/api.js +21 -0
  3. package/lib/aptos/api.js.map +1 -0
  4. package/lib/aptos/aptos-plugin.d.ts +14 -0
  5. package/lib/aptos/aptos-plugin.js +146 -0
  6. package/lib/aptos/aptos-plugin.js.map +1 -0
  7. package/lib/aptos/aptos-processor.d.ts +72 -0
  8. package/lib/aptos/aptos-processor.js +201 -0
  9. package/lib/aptos/aptos-processor.js.map +1 -0
  10. package/lib/aptos/builtin/0x1.d.ts +2140 -0
  11. package/lib/aptos/builtin/0x1.js +2727 -0
  12. package/lib/aptos/builtin/0x1.js.map +1 -0
  13. package/lib/aptos/builtin/0x3.d.ts +573 -0
  14. package/lib/aptos/builtin/0x3.js +496 -0
  15. package/lib/aptos/builtin/0x3.js.map +1 -0
  16. package/lib/aptos/builtin/index.d.ts +2 -0
  17. package/lib/aptos/builtin/index.js +6 -0
  18. package/lib/aptos/builtin/index.js.map +1 -0
  19. package/lib/aptos/codegen/codegen.d.ts +23 -0
  20. package/lib/aptos/codegen/codegen.js +388 -0
  21. package/lib/aptos/codegen/codegen.js.map +1 -0
  22. package/lib/aptos/codegen/index.d.ts +1 -0
  23. package/lib/aptos/codegen/index.js +2 -0
  24. package/lib/aptos/codegen/index.js.map +1 -0
  25. package/lib/aptos/codegen/typegen.d.ts +18 -0
  26. package/lib/aptos/codegen/typegen.js +145 -0
  27. package/lib/aptos/codegen/typegen.js.map +1 -0
  28. package/lib/aptos/codegen/typegen.test.d.ts +1 -0
  29. package/lib/aptos/codegen/typegen.test.js.map +1 -0
  30. package/lib/aptos/context.d.ts +21 -0
  31. package/lib/aptos/context.js +59 -0
  32. package/lib/aptos/context.js.map +1 -0
  33. package/lib/aptos/index.d.ts +9 -0
  34. package/lib/aptos/index.js +8 -0
  35. package/lib/aptos/index.js.map +1 -0
  36. package/lib/aptos/models.d.ts +37 -0
  37. package/lib/aptos/models.js +2 -0
  38. package/lib/aptos/models.js.map +1 -0
  39. package/lib/aptos/move-coder.d.ts +22 -0
  40. package/lib/aptos/move-coder.js +164 -0
  41. package/lib/aptos/move-coder.js.map +1 -0
  42. package/lib/aptos/move-types.d.ts +10 -0
  43. package/lib/aptos/move-types.js +2 -0
  44. package/lib/aptos/move-types.js.map +1 -0
  45. package/lib/aptos/network.d.ts +11 -0
  46. package/lib/aptos/network.js +27 -0
  47. package/lib/aptos/network.js.map +1 -0
  48. package/lib/aptos/run-codegen.d.ts +1 -0
  49. package/lib/aptos/run-codegen.js +12 -0
  50. package/lib/aptos/run-codegen.js.map +1 -0
  51. package/lib/aptos/tests/aptos.test.d.ts +1 -0
  52. package/lib/aptos/tests/aptos.test.js.map +1 -0
  53. package/lib/aptos/tests/souffl3.d.ts +1 -0
  54. package/lib/aptos/tests/souffl3.js +44 -0
  55. package/lib/aptos/tests/souffl3.js.map +1 -0
  56. package/lib/aptos/tests/types/index.d.ts +3 -0
  57. package/lib/aptos/tests/types/index.js +7 -0
  58. package/lib/aptos/tests/types/index.js.map +1 -0
  59. package/lib/aptos/tests/types/reserved.d.ts +445 -0
  60. package/lib/aptos/tests/types/reserved.js +301 -0
  61. package/lib/aptos/tests/types/reserved.js.map +1 -0
  62. package/lib/aptos/tests/types/soffl3.d.ts +1065 -0
  63. package/lib/aptos/tests/types/soffl3.js +548 -0
  64. package/lib/aptos/tests/types/soffl3.js.map +1 -0
  65. package/lib/aptos/tests/types/souffle.d.ts +440 -0
  66. package/lib/aptos/tests/types/souffle.js +295 -0
  67. package/lib/aptos/tests/types/souffle.js.map +1 -0
  68. package/lib/aptos/types.d.ts +9 -0
  69. package/lib/aptos/types.js +130 -0
  70. package/lib/aptos/types.js.map +1 -0
  71. package/lib/aptos/types.test.d.ts +1 -0
  72. package/lib/aptos/types.test.js.map +1 -0
  73. package/lib/aptos/utils.d.ts +7 -0
  74. package/lib/aptos/utils.js +20 -0
  75. package/lib/aptos/utils.js.map +1 -0
  76. package/lib/{utils/chain.d.ts → chain.d.ts} +0 -0
  77. package/lib/{utils/chain.js → chain.js} +0 -0
  78. package/lib/chain.js.map +1 -0
  79. package/lib/core/context.js +1 -1
  80. package/lib/core/context.js.map +1 -1
  81. package/lib/core/sui-plugin.js +1 -1
  82. package/lib/core/sui-plugin.js.map +1 -1
  83. package/lib/index.d.ts +1 -1
  84. package/lib/index.js +1 -1
  85. package/lib/index.js.map +1 -1
  86. package/lib/solana/builtin/index.d.ts +1 -0
  87. package/lib/solana/builtin/index.js +2 -0
  88. package/lib/solana/builtin/index.js.map +1 -0
  89. package/lib/solana/builtin/spl-token-processor.d.ts +39 -0
  90. package/lib/solana/builtin/spl-token-processor.js +254 -0
  91. package/lib/solana/builtin/spl-token-processor.js.map +1 -0
  92. package/lib/solana/builtin/types.d.ts +427 -0
  93. package/lib/solana/builtin/types.js +200 -0
  94. package/lib/solana/builtin/types.js.map +1 -0
  95. package/lib/solana/codegen/codegen.d.ts +1 -0
  96. package/lib/solana/codegen/codegen.js +122 -0
  97. package/lib/solana/codegen/codegen.js.map +1 -0
  98. package/lib/solana/codegen/index.d.ts +1 -0
  99. package/lib/solana/codegen/index.js +2 -0
  100. package/lib/solana/codegen/index.js.map +1 -0
  101. package/lib/solana/index.d.ts +4 -0
  102. package/lib/solana/index.js +5 -0
  103. package/lib/solana/index.js.map +1 -0
  104. package/lib/solana/run-codegen.d.ts +2 -0
  105. package/lib/solana/run-codegen.js +12 -0
  106. package/lib/solana/run-codegen.js.map +1 -0
  107. package/lib/solana/solana-context.d.ts +9 -0
  108. package/lib/solana/solana-context.js +28 -0
  109. package/lib/solana/solana-context.js.map +1 -0
  110. package/lib/solana/solana-options.d.ts +10 -0
  111. package/lib/solana/solana-options.js +10 -0
  112. package/lib/solana/solana-options.js.map +1 -0
  113. package/lib/solana/solana-plugin.d.ts +9 -0
  114. package/lib/solana/solana-plugin.js +87 -0
  115. package/lib/solana/solana-plugin.js.map +1 -0
  116. package/lib/solana/solana-processor.d.ts +43 -0
  117. package/lib/solana/solana-processor.js +72 -0
  118. package/lib/solana/solana-processor.js.map +1 -0
  119. package/lib/solana/tests/solana.test.d.ts +1 -0
  120. package/lib/solana/tests/solana.test.js.map +1 -0
  121. package/lib/solana/tests/types/basic_1.d.ts +26 -0
  122. package/lib/solana/tests/types/basic_1.js +63 -0
  123. package/lib/solana/tests/types/basic_1.js.map +1 -0
  124. package/lib/solana/tests/types/basic_1_processor.d.ts +21 -0
  125. package/lib/solana/tests/types/basic_1_processor.js +35 -0
  126. package/lib/solana/tests/types/basic_1_processor.js.map +1 -0
  127. package/lib/solana/tests/types/token_bridge.d.ts +29 -0
  128. package/lib/solana/tests/types/token_bridge.js +938 -0
  129. package/lib/solana/tests/types/token_bridge.js.map +1 -0
  130. package/lib/solana/tests/types/token_bridge_processor.d.ts +212 -0
  131. package/lib/solana/tests/types/token_bridge_processor.js +134 -0
  132. package/lib/solana/tests/types/token_bridge_processor.js.map +1 -0
  133. package/lib/solana/tests/wormhole-token-bridge.d.ts +15 -0
  134. package/lib/solana/tests/wormhole-token-bridge.js +79 -0
  135. package/lib/solana/tests/wormhole-token-bridge.js.map +1 -0
  136. package/lib/testing/test-processor-server.js +1 -1
  137. package/lib/testing/test-processor-server.js.map +1 -1
  138. package/lib/testing/test-provider.js +1 -1
  139. package/lib/testing/test-provider.js.map +1 -1
  140. package/lib/utils/index.d.ts +0 -1
  141. package/lib/utils/index.js +0 -1
  142. package/lib/utils/index.js.map +1 -1
  143. package/package.json +33 -11
  144. package/src/aptos/abis/0x1.json +9205 -0
  145. package/src/aptos/abis/0x3.json +1515 -0
  146. package/src/aptos/api.ts +23 -0
  147. package/src/aptos/aptos-plugin.ts +183 -0
  148. package/src/aptos/aptos-processor.ts +331 -0
  149. package/src/aptos/builtin/0x1.ts +4911 -0
  150. package/src/aptos/builtin/0x3.ts +1092 -0
  151. package/src/aptos/builtin/index.ts +5 -0
  152. package/src/aptos/codegen/codegen.ts +470 -0
  153. package/src/aptos/codegen/index.ts +1 -0
  154. package/src/aptos/codegen/tsconfig.json +8 -0
  155. package/src/aptos/codegen/typegen.ts +165 -0
  156. package/src/aptos/context.ts +72 -0
  157. package/src/aptos/index.ts +10 -0
  158. package/src/aptos/models.ts +47 -0
  159. package/src/aptos/move-coder.ts +201 -0
  160. package/src/aptos/move-types.ts +11 -0
  161. package/src/aptos/network.ts +29 -0
  162. package/src/aptos/run-codegen.ts +13 -0
  163. package/src/aptos/tests/abis/reserved.json +402 -0
  164. package/src/aptos/tests/abis/soffl3.json +1411 -0
  165. package/src/aptos/tests/abis/souffle.json +389 -0
  166. package/src/aptos/tests/souffl3.ts +57 -0
  167. package/src/aptos/tests/types/index.ts +6 -0
  168. package/src/aptos/tests/types/reserved.ts +881 -0
  169. package/src/aptos/tests/types/soffl3.ts +1820 -0
  170. package/src/aptos/tests/types/souffle.ts +880 -0
  171. package/src/aptos/types.ts +149 -0
  172. package/src/aptos/utils.ts +26 -0
  173. package/src/{utils/chain.ts → chain.ts} +0 -0
  174. package/src/core/context.ts +1 -1
  175. package/src/core/sui-plugin.ts +1 -1
  176. package/src/index.ts +1 -1
  177. package/src/solana/builtin/index.ts +1 -0
  178. package/src/solana/builtin/spl-token-processor.ts +298 -0
  179. package/src/solana/builtin/types.ts +279 -0
  180. package/src/solana/codegen/codegen.ts +140 -0
  181. package/src/solana/codegen/index.ts +1 -0
  182. package/src/solana/codegen/tsconfig.json +8 -0
  183. package/src/solana/index.ts +4 -0
  184. package/src/solana/run-codegen.ts +13 -0
  185. package/src/solana/solana-context.ts +30 -0
  186. package/src/solana/solana-options.ts +11 -0
  187. package/src/solana/solana-plugin.ts +103 -0
  188. package/src/solana/solana-processor.ts +102 -0
  189. package/src/solana/tests/abis/basic_1.json +62 -0
  190. package/src/solana/tests/abis/token_bridge.json +937 -0
  191. package/src/solana/tests/types/basic_1.ts +62 -0
  192. package/src/solana/tests/types/basic_1_processor.ts +42 -0
  193. package/src/solana/tests/types/token_bridge.ts +937 -0
  194. package/src/solana/tests/types/token_bridge_processor.ts +150 -0
  195. package/src/solana/tests/wormhole-token-bridge.ts +96 -0
  196. package/src/testing/test-processor-server.ts +1 -1
  197. package/src/testing/test-provider.ts +1 -1
  198. package/src/utils/index.ts +0 -1
  199. package/lib/utils/chain.js.map +0 -1
@@ -0,0 +1,279 @@
1
+ /* eslint-disable @typescript-eslint/no-redeclare */
2
+ // copy from https://github.com/solana-labs/solana/blob/master/explorer/src/components/instruction/token/types.ts
3
+
4
+ import {
5
+ enums,
6
+ type,
7
+ Infer,
8
+ number,
9
+ string,
10
+ optional,
11
+ array,
12
+ nullable,
13
+ union,
14
+ coerce,
15
+ instance,
16
+ } from "superstruct";
17
+
18
+ // Replace with string
19
+ export const PublicKeyFromString = coerce(
20
+ instance(String),
21
+ string(),
22
+ (value) => (value)
23
+ );
24
+
25
+ export type TokenAmountUi = Infer<typeof TokenAmountUi>;
26
+ export type MintTo = Infer<typeof MintTo>;
27
+ export type Burn = Infer<typeof Burn>;
28
+ export type InitializeMint = Infer<typeof InitializeMint>;
29
+ export type InitializeAccount = Infer<typeof InitializeAccount>;
30
+ export type InitializeAccount2 = Infer<typeof InitializeAccount2>;
31
+ export type InitializeAccount3 = Infer<typeof InitializeAccount3>;
32
+ export type InitializeMultisig = Infer<typeof InitializeMultisig>;
33
+
34
+ export const TokenAmountUi = type({
35
+ amount: string(),
36
+ decimals: number(),
37
+ uiAmountString: string(),
38
+ });
39
+
40
+ const InitializeMint = type({
41
+ mint: PublicKeyFromString,
42
+ decimals: number(),
43
+ mintAuthority: PublicKeyFromString,
44
+ rentSysvar: PublicKeyFromString,
45
+ freezeAuthority: optional(PublicKeyFromString),
46
+ });
47
+
48
+ const InitializeAccount = type({
49
+ account: PublicKeyFromString,
50
+ mint: PublicKeyFromString,
51
+ owner: PublicKeyFromString,
52
+ rentSysvar: PublicKeyFromString,
53
+ });
54
+
55
+ const InitializeAccount2 = type({
56
+ account: PublicKeyFromString,
57
+ mint: PublicKeyFromString,
58
+ rentSysvar: PublicKeyFromString,
59
+ owner: PublicKeyFromString,
60
+ });
61
+
62
+ const InitializeAccount3 = type({
63
+ account: PublicKeyFromString,
64
+ mint: PublicKeyFromString,
65
+ owner: PublicKeyFromString,
66
+ });
67
+
68
+ const InitializeMultisig = type({
69
+ multisig: PublicKeyFromString,
70
+ rentSysvar: PublicKeyFromString,
71
+ signers: array(PublicKeyFromString),
72
+ m: number(),
73
+ });
74
+
75
+ export type Transfer = Infer<typeof Transfer>;
76
+ export const Transfer = type({
77
+ source: PublicKeyFromString,
78
+ destination: PublicKeyFromString,
79
+ amount: union([string(), number()]),
80
+ authority: optional(PublicKeyFromString),
81
+ multisigAuthority: optional(PublicKeyFromString),
82
+ signers: optional(array(PublicKeyFromString)),
83
+ });
84
+
85
+ export type Approve = Infer<typeof Approve>;
86
+ const Approve = type({
87
+ source: PublicKeyFromString,
88
+ delegate: PublicKeyFromString,
89
+ amount: union([string(), number()]),
90
+ owner: optional(PublicKeyFromString),
91
+ multisigOwner: optional(PublicKeyFromString),
92
+ signers: optional(array(PublicKeyFromString)),
93
+ });
94
+
95
+ export type Revoke = Infer<typeof Revoke>;
96
+ const Revoke = type({
97
+ source: PublicKeyFromString,
98
+ owner: optional(PublicKeyFromString),
99
+ multisigOwner: optional(PublicKeyFromString),
100
+ signers: optional(array(PublicKeyFromString)),
101
+ });
102
+
103
+ const AuthorityType = enums([
104
+ "mintTokens",
105
+ "freezeAccount",
106
+ "accountOwner",
107
+ "closeAccount",
108
+ ]);
109
+
110
+ export type SetAuthority = Infer<typeof SetAuthority>;
111
+ const SetAuthority = type({
112
+ mint: optional(PublicKeyFromString),
113
+ account: optional(PublicKeyFromString),
114
+ authorityType: AuthorityType,
115
+ newAuthority: nullable(PublicKeyFromString),
116
+ authority: optional(PublicKeyFromString),
117
+ multisigAuthority: optional(PublicKeyFromString),
118
+ signers: optional(array(PublicKeyFromString)),
119
+ });
120
+
121
+ const MintTo = type({
122
+ mint: PublicKeyFromString,
123
+ account: PublicKeyFromString,
124
+ amount: union([string(), number()]),
125
+ mintAuthority: optional(PublicKeyFromString),
126
+ multisigMintAuthority: optional(PublicKeyFromString),
127
+ signers: optional(array(PublicKeyFromString)),
128
+ });
129
+
130
+ const Burn = type({
131
+ account: PublicKeyFromString,
132
+ mint: PublicKeyFromString,
133
+ amount: union([string(), number()]),
134
+ authority: optional(PublicKeyFromString),
135
+ multisigAuthority: optional(PublicKeyFromString),
136
+ signers: optional(array(PublicKeyFromString)),
137
+ });
138
+
139
+ const CloseAccount = type({
140
+ account: PublicKeyFromString,
141
+ destination: PublicKeyFromString,
142
+ owner: optional(PublicKeyFromString),
143
+ multisigOwner: optional(PublicKeyFromString),
144
+ signers: optional(array(PublicKeyFromString)),
145
+ });
146
+ export type CloseAccount = Infer<typeof CloseAccount>;
147
+
148
+ export type FreezeAccount = Infer<typeof FreezeAccount>;
149
+ const FreezeAccount = type({
150
+ account: PublicKeyFromString,
151
+ mint: PublicKeyFromString,
152
+ freezeAuthority: optional(PublicKeyFromString),
153
+ multisigFreezeAuthority: optional(PublicKeyFromString),
154
+ signers: optional(array(PublicKeyFromString)),
155
+ });
156
+
157
+ export type ThawAccount = Infer<typeof ThawAccount>;
158
+ const ThawAccount = type({
159
+ account: PublicKeyFromString,
160
+ mint: PublicKeyFromString,
161
+ freezeAuthority: optional(PublicKeyFromString),
162
+ multisigFreezeAuthority: optional(PublicKeyFromString),
163
+ signers: optional(array(PublicKeyFromString)),
164
+ });
165
+
166
+ export type TransferChecked = Infer<typeof TransferChecked>;
167
+ export const TransferChecked = type({
168
+ source: PublicKeyFromString,
169
+ mint: PublicKeyFromString,
170
+ destination: PublicKeyFromString,
171
+ authority: optional(PublicKeyFromString),
172
+ multisigAuthority: optional(PublicKeyFromString),
173
+ signers: optional(array(PublicKeyFromString)),
174
+ tokenAmount: TokenAmountUi,
175
+ });
176
+
177
+ export type ApproveChecked = Infer<typeof ApproveChecked>;
178
+ const ApproveChecked = type({
179
+ source: PublicKeyFromString,
180
+ mint: PublicKeyFromString,
181
+ delegate: PublicKeyFromString,
182
+ owner: optional(PublicKeyFromString),
183
+ multisigOwner: optional(PublicKeyFromString),
184
+ signers: optional(array(PublicKeyFromString)),
185
+ tokenAmount: TokenAmountUi,
186
+ });
187
+
188
+ export type MintToChecked = Infer<typeof MintToChecked>;
189
+ const MintToChecked = type({
190
+ account: PublicKeyFromString,
191
+ mint: PublicKeyFromString,
192
+ mintAuthority: optional(PublicKeyFromString),
193
+ multisigMintAuthority: optional(PublicKeyFromString),
194
+ signers: optional(array(PublicKeyFromString)),
195
+ tokenAmount: TokenAmountUi,
196
+ });
197
+
198
+ export type BurnChecked = Infer<typeof BurnChecked>;
199
+ const BurnChecked = type({
200
+ account: PublicKeyFromString,
201
+ mint: PublicKeyFromString,
202
+ authority: optional(PublicKeyFromString),
203
+ multisigAuthority: optional(PublicKeyFromString),
204
+ signers: optional(array(PublicKeyFromString)),
205
+ tokenAmount: TokenAmountUi,
206
+ });
207
+
208
+ export type SyncNative = Infer<typeof BurnChecked>;
209
+ const SyncNative = type({
210
+ account: PublicKeyFromString,
211
+ });
212
+
213
+ export type GetAccountDataSize = Infer<typeof GetAccountDataSize>;
214
+ const GetAccountDataSize = type({
215
+ mint: PublicKeyFromString,
216
+ extensionTypes: optional(array(string())),
217
+ });
218
+
219
+ export type InitializeImmutableOwner = Infer<typeof InitializeImmutableOwner>;
220
+ const InitializeImmutableOwner = type({
221
+ account: PublicKeyFromString,
222
+ });
223
+
224
+ export type AmountToUiAmount = Infer<typeof AmountToUiAmount>;
225
+ const AmountToUiAmount = type({
226
+ mint: PublicKeyFromString,
227
+ amount: union([string(), number()]),
228
+ });
229
+
230
+ export type UiAmountToAmount = Infer<typeof UiAmountToAmount>;
231
+ const UiAmountToAmount = type({
232
+ mint: PublicKeyFromString,
233
+ uiAmount: string(),
234
+ });
235
+
236
+ export type InitializeMintCloseAuthority = Infer<typeof InitializeMintCloseAuthority>;
237
+ const InitializeMintCloseAuthority = type({
238
+ mint: PublicKeyFromString,
239
+ newAuthority: PublicKeyFromString,
240
+ });
241
+
242
+ export type TransferFeeExtension = Infer<typeof TransferFeeExtension>;
243
+ const TransferFeeExtension = type({
244
+ mint: PublicKeyFromString,
245
+ transferFeeConfigAuthority: PublicKeyFromString,
246
+ withdrawWitheldAuthority: PublicKeyFromString,
247
+ transferFeeBasisPoints: number(),
248
+ maximumFee: number(),
249
+ });
250
+
251
+ export type DefaultAccountStateExtension = Infer<typeof DefaultAccountStateExtension>;
252
+ const DefaultAccountStateExtension = type({
253
+ mint: PublicKeyFromString,
254
+ accountState: string(),
255
+ freezeAuthority: optional(PublicKeyFromString),
256
+ });
257
+
258
+ export type Reallocate = Infer<typeof Reallocate>;
259
+ const Reallocate = type({
260
+ account: PublicKeyFromString,
261
+ payer: PublicKeyFromString,
262
+ systemProgram: PublicKeyFromString,
263
+ extensionTypes: array(string()),
264
+ });
265
+
266
+ export type MemoTransferExtension = Infer<typeof MemoTransferExtension>;
267
+ const MemoTransferExtension = type({
268
+ account: PublicKeyFromString,
269
+ owner: optional(PublicKeyFromString),
270
+ multisigOwner: optional(PublicKeyFromString),
271
+ signers: optional(array(PublicKeyFromString)),
272
+ });
273
+
274
+ export type CreateNativeMint = Infer<typeof CreateNativeMint>;
275
+ const CreateNativeMint = type({
276
+ payer: PublicKeyFromString,
277
+ nativeMint: PublicKeyFromString,
278
+ systemProgram: PublicKeyFromString,
279
+ });
@@ -0,0 +1,140 @@
1
+ import path from 'path'
2
+ import fs from 'fs'
3
+ import chalk from 'chalk'
4
+ import { Idl } from '@project-serum/anchor'
5
+ import { IdlAccountItem, IdlField, IdlInstruction, IdlType } from '@project-serum/anchor/dist/cjs/idl.js'
6
+
7
+ export function codeGenSolanaProcessor(abisDir: string, targetPath = path.join('src', 'types', 'solana')) {
8
+ if (!fs.existsSync(abisDir)) {
9
+ return
10
+ }
11
+
12
+ const abisFiles = fs.readdirSync(abisDir)
13
+
14
+ if (abisFiles.length > 0) {
15
+ console.log(chalk.green('Generated Types for Solana'))
16
+ }
17
+
18
+ for (const file of abisFiles) {
19
+ if (path.extname(file) === '.json') {
20
+ if (!fs.existsSync(targetPath)) {
21
+ fs.mkdirSync(targetPath, { recursive: true })
22
+ }
23
+ const idlContent = fs.readFileSync(path.join(abisDir, file), 'utf-8')
24
+ const idlObj = JSON.parse(idlContent)
25
+ const idlName = idlObj.name
26
+ const idlFile = path.join(targetPath, idlName + '.ts')
27
+ fs.writeFileSync(idlFile, `export const ${idlName}_idl = ${idlContent}`)
28
+ fs.writeFileSync(path.join(targetPath, `${idlName}_processor.ts`), codeGenSolanaIdlProcessor(idlObj))
29
+ }
30
+ }
31
+ }
32
+
33
+ function codeGenSolanaIdlProcessor(idlObj: Idl): string {
34
+ const idlName = idlObj.name
35
+ const idlNamePascalCase = toPascalCase(idlName)
36
+ const instructions: any[] = idlObj.instructions
37
+ return `import { BorshInstructionCoder, Instruction, Idl } from '@project-serum/anchor'
38
+ import { SolanaBaseProcessor, SolanaContext, SolanaBindOptions } from "@sentio/sdk/solana"
39
+ import { ${idlName}_idl } from "./${idlName}.js"
40
+ import { PublicKey } from '@solana/web3.js'
41
+
42
+ export class ${idlNamePascalCase}Processor extends SolanaBaseProcessor {
43
+ static DEFAULT_OPTIONS = {
44
+ name: '${idlNamePascalCase}',
45
+ instructionCoder: new BorshInstructionCoder(${idlName}_idl as Idl)
46
+ }
47
+
48
+ static bind(options: SolanaBindOptions): ${idlNamePascalCase}Processor {
49
+ return new ${idlNamePascalCase}Processor( { ...${idlNamePascalCase}Processor.DEFAULT_OPTIONS, ...options })
50
+ }
51
+
52
+ ${instructions.map((ins) => codeGenSolanaInstruction(idlNamePascalCase, ins)).join('')}
53
+ }
54
+ `
55
+ }
56
+
57
+ function codeGenSolanaInstruction(idlName: string, ins: IdlInstruction): string {
58
+ const instructionName = ins.name
59
+
60
+ const argsType = codeGenInstructionArgsType(ins.args)
61
+ const accountType = codeGenAccountType(ins.accounts)
62
+
63
+ return `
64
+ on${
65
+ instructionName.charAt(0).toUpperCase() + instructionName.slice(1)
66
+ }(handler: (args: ${argsType}, accounts: ${accountType}, ctx: SolanaContext) => void): ${idlName}Processor {
67
+ this.onInstruction('${instructionName}', (ins: Instruction, ctx, accounts: string[]) => {
68
+ const origin = ins.data as any
69
+ if (origin) {
70
+ const data = ${codeGenInstructionArgs(ins.args)}
71
+ const accountData = ${codeGenAccountTypeArgs(ins.accounts)}
72
+ handler(data, accountData, ctx)
73
+ }
74
+ })
75
+ return this
76
+ }
77
+ `
78
+ }
79
+
80
+ function codeGenInstructionArgs(args: IdlField[]): string {
81
+ return `{ ${args.map((arg) => codeGenInstructionArg(arg.name, arg.type)).join(', ')} }`
82
+ }
83
+
84
+ function codeGenInstructionArg(name: string, type: IdlType): string {
85
+ const mType = mapType(type)
86
+ if (mType === 'bigint') {
87
+ return `${name}: BigInt(origin.${name}.toString())`
88
+ }
89
+ return `${name}: origin.${name} as ${mType}`
90
+ }
91
+
92
+ function codeGenInstructionArgsType(args: IdlField[]): string {
93
+ return `{ ${args.map((arg) => arg.name + ': ' + mapType(arg.type)).join(', ')} }`
94
+ }
95
+
96
+ function codeGenAccountType(args: IdlAccountItem[]): string {
97
+ return `{ ${args.map((arg) => arg.name + ': string').join(', ')} }`
98
+ }
99
+
100
+ function codeGenAccountTypeArgs(args: IdlAccountItem[]): string {
101
+ return `{ ${args.map((arg, idx) => `${arg.name}: accounts[${idx}]`).join(', ')} }`
102
+ }
103
+
104
+ // Reference: https://github.com/coral-xyz/anchor/blob/93332766f13e86efbe77c9986722731742317ede/ts/src/program/namespace/types.ts#L104
105
+ function mapType(tpe: IdlType): string {
106
+ // TODO handle complex type
107
+ switch (tpe) {
108
+ case 'publicKey':
109
+ return 'PublicKey'
110
+ case 'bool':
111
+ return 'boolean'
112
+ case 'string':
113
+ return 'string'
114
+ case 'u8':
115
+ case 'i8':
116
+ case 'u16':
117
+ case 'i16':
118
+ case 'u32':
119
+ case 'i32':
120
+ case 'f32':
121
+ case 'f64':
122
+ return 'number'
123
+ case 'u64':
124
+ case 'i64':
125
+ case 'u128':
126
+ case 'i128':
127
+ return 'bigint'
128
+ default:
129
+ return 'any'
130
+ }
131
+ }
132
+
133
+ function toPascalCase(str: string) {
134
+ return `${str}`
135
+ .toLowerCase()
136
+ .replace(new RegExp(/[-_]+/, 'g'), ' ')
137
+ .replace(new RegExp(/[^\w\s]/, 'g'), '')
138
+ .replace(new RegExp(/\s+(.)(\w*)/, 'g'), ($1, $2, $3) => `${$2.toUpperCase() + $3}`)
139
+ .replace(new RegExp(/\w/), (s) => s.toUpperCase())
140
+ }
@@ -0,0 +1 @@
1
+ export * from './codegen.js'
@@ -0,0 +1,8 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "..",
4
+ "outDir": "../../../lib"
5
+ },
6
+ "extends": "@sentio/sdk-solana/tsconfig.json",
7
+ "include": ["./"]
8
+ }
@@ -0,0 +1,4 @@
1
+ export * from './solana-plugin.js'
2
+ export * from './solana-context.js'
3
+ export * from './solana-processor.js'
4
+ export * from './solana-options.js'
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+
3
+ import path from 'path'
4
+ import { codeGenSolanaProcessor } from './codegen/codegen.js'
5
+
6
+ if (process.argv.length > 3) {
7
+ const abisDir = process.argv[2]
8
+ const targetDir = process.argv[3]
9
+ codeGenSolanaProcessor(abisDir, targetDir)
10
+ } else {
11
+ console.error('Not enough argument')
12
+ process.exit(1)
13
+ }
@@ -0,0 +1,30 @@
1
+ import { normalizeLabels, Labels, BaseContext, RecordMetaData, CHAIN_IDS } from '@sentio/sdk'
2
+
3
+ export class SolanaContext extends BaseContext {
4
+ network: string
5
+ address: string
6
+ programName: string
7
+ blockNumber: bigint
8
+
9
+ constructor(programName: string, network: string, address: string, slot: bigint) {
10
+ super()
11
+ this.network = network || CHAIN_IDS.SOLANA_MAINNET
12
+ this.programName = programName
13
+ this.address = address
14
+ this.blockNumber = slot
15
+ }
16
+
17
+ getMetaData(name: string, labels: Labels): RecordMetaData {
18
+ return {
19
+ address: this.address,
20
+ contractName: this.programName,
21
+ blockNumber: this.blockNumber,
22
+ transactionIndex: 0,
23
+ transactionHash: '', // TODO add
24
+ logIndex: 0,
25
+ chainId: this.network,
26
+ name: name,
27
+ labels: normalizeLabels(labels),
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,11 @@
1
+ import { InstructionCoder } from './solana-processor.js'
2
+
3
+ export class SolanaBindOptions {
4
+ address: string
5
+ network?: string
6
+ name?: string
7
+ startBlock?: bigint | number
8
+ endBlock?: bigint | number
9
+ processInnerInstruction?: boolean
10
+ instructionCoder?: InstructionCoder
11
+ }
@@ -0,0 +1,103 @@
1
+ import { errorString, mergeProcessResults, Plugin, PluginManager, USER_PROCESSOR } from '@sentio/runtime'
2
+ import { ContractConfig, DataBinding, HandlerType, ProcessConfigResponse, ProcessResult } from '@sentio/protos'
3
+
4
+ import { ServerError, Status } from 'nice-grpc'
5
+
6
+ import { SolanaProcessorState } from './solana-processor.js'
7
+ import { Instruction as SolInstruction } from '@project-serum/anchor'
8
+
9
+ export class SolanaPlugin extends Plugin {
10
+ name: string = 'SolanaPlugin'
11
+
12
+ async configure(config: ProcessConfigResponse) {
13
+ // Part 2, prepare solana constractors
14
+ for (const solanaProcessor of SolanaProcessorState.INSTANCE.getValues()) {
15
+ const contractConfig: ContractConfig = {
16
+ transactionConfig: [],
17
+ processorType: USER_PROCESSOR,
18
+ contract: {
19
+ name: solanaProcessor.contractName,
20
+ chainId: solanaProcessor.network,
21
+ address: solanaProcessor.address,
22
+ abi: '',
23
+ },
24
+ logConfigs: [],
25
+ traceConfigs: [],
26
+ intervalConfigs: [],
27
+ startBlock: solanaProcessor.config.startSlot,
28
+ endBlock: 0n,
29
+ instructionConfig: {
30
+ innerInstruction: solanaProcessor.processInnerInstruction,
31
+ parsedInstruction: solanaProcessor.fromParsedInstruction !== null,
32
+ rawDataInstruction: solanaProcessor.decodeInstruction !== null,
33
+ },
34
+ aptosEventConfigs: [],
35
+ aptosCallConfigs: [],
36
+ }
37
+ config.contractConfigs.push(contractConfig)
38
+ }
39
+ }
40
+
41
+ supportedHandlers = [HandlerType.SOL_INSTRUCTION]
42
+
43
+ processBinding(request: DataBinding): Promise<ProcessResult> {
44
+ switch (request.handlerType) {
45
+ case HandlerType.SOL_INSTRUCTION:
46
+ return this.processSolInstruction(request)
47
+ default:
48
+ throw new ServerError(Status.INVALID_ARGUMENT, 'No handle type registered ' + request.handlerType)
49
+ }
50
+ }
51
+
52
+ async processSolInstruction(request: DataBinding): Promise<ProcessResult> {
53
+ if (!request.data) {
54
+ throw new ServerError(Status.INVALID_ARGUMENT, 'instruction data cannot be empty')
55
+ }
56
+ if (!request.data.solInstruction) {
57
+ throw new ServerError(Status.INVALID_ARGUMENT, 'instruction data cannot be empty')
58
+ }
59
+
60
+ const instruction = request.data.solInstruction
61
+ const promises: Promise<ProcessResult>[] = []
62
+
63
+ // Only have instruction handlers for solana processors
64
+ for (const processor of SolanaProcessorState.INSTANCE.getValues()) {
65
+ if (processor.address === instruction.programAccountId) {
66
+ let parsedInstruction: SolInstruction | null = null
67
+
68
+ try {
69
+ if (instruction.parsed) {
70
+ parsedInstruction = processor.getParsedInstruction(instruction.parsed as { type: string; info: any })
71
+ } else if (instruction.instructionData) {
72
+ parsedInstruction = processor.getParsedInstruction(instruction.instructionData)
73
+ }
74
+ } catch (e) {
75
+ throw new ServerError(
76
+ Status.INTERNAL,
77
+ 'Failed to decode instruction: ' + JSON.stringify(instruction) + errorString(e)
78
+ )
79
+ }
80
+ if (parsedInstruction == null) {
81
+ continue
82
+ }
83
+ const insHandler = processor.getInstructionHandler(parsedInstruction)
84
+ if (insHandler == null) {
85
+ continue
86
+ }
87
+ const res = processor
88
+ .handleInstruction(parsedInstruction, instruction.accounts, insHandler, instruction.slot)
89
+ .catch((e) => {
90
+ throw new ServerError(
91
+ Status.INTERNAL,
92
+ 'Error processing instruction: ' + JSON.stringify(instruction) + '\n' + errorString(e)
93
+ )
94
+ })
95
+
96
+ promises.push(res)
97
+ }
98
+ }
99
+ return mergeProcessResults(await Promise.all(promises))
100
+ }
101
+ }
102
+
103
+ PluginManager.INSTANCE.register(new SolanaPlugin())
@@ -0,0 +1,102 @@
1
+ import { ProcessResult } from '@sentio/protos'
2
+ import { SolanaContext } from './solana-context.js'
3
+ import { Instruction } from '@project-serum/anchor'
4
+ import { SolanaBindOptions } from './solana-options.js'
5
+ import { ListStateStorage } from '@sentio/runtime'
6
+ import { CHAIN_IDS } from '@sentio/sdk'
7
+
8
+ type IndexConfigure = {
9
+ startSlot: bigint
10
+ endSlot?: bigint
11
+ }
12
+
13
+ export interface InstructionCoder {
14
+ decode(ix: Buffer | string, encoding?: 'hex' | 'base58'): Instruction | null
15
+ }
16
+
17
+ export type SolanaInstructionHandler = (instruction: Instruction, ctx: SolanaContext, accounts?: string[]) => void
18
+
19
+ export class SolanaProcessorState extends ListStateStorage<SolanaBaseProcessor> {
20
+ static INSTANCE: SolanaProcessorState = new SolanaProcessorState()
21
+ }
22
+
23
+ export class SolanaBaseProcessor {
24
+ public instructionHandlerMap: Map<string, SolanaInstructionHandler> = new Map()
25
+ address: string
26
+ endpoint: string
27
+ contractName: string
28
+ network: string
29
+ processInnerInstruction: boolean
30
+ config: IndexConfigure = { startSlot: 0n }
31
+ instructionCoder: InstructionCoder
32
+
33
+ decodeInstruction(rawInstruction: string): Instruction | null {
34
+ if (this.instructionCoder) {
35
+ return this.instructionCoder.decode(rawInstruction, 'base58')
36
+ }
37
+ return null
38
+ }
39
+
40
+ fromParsedInstruction: (instruction: { type: string; info: any }) => Instruction | null
41
+
42
+ constructor(options: SolanaBindOptions) {
43
+ this.address = options.address
44
+ this.contractName = options.name || ''
45
+ this.processInnerInstruction = options.processInnerInstruction || false
46
+ this.network = options.network || CHAIN_IDS.SOLANA_MAINNET
47
+ if (options.instructionCoder) {
48
+ this.instructionCoder = options.instructionCoder
49
+ }
50
+ if (options.startBlock) {
51
+ this.startSlot(options.startBlock)
52
+ }
53
+ if (options.endBlock) {
54
+ this.endBlock(options.endBlock)
55
+ }
56
+ this.endpoint = options.network || 'https://api.mainnet-beta.solana.com'
57
+
58
+ SolanaProcessorState.INSTANCE.addValue(this)
59
+ }
60
+
61
+ public onInstruction(instructionName: string, handler: SolanaInstructionHandler) {
62
+ this.instructionHandlerMap.set(instructionName, handler)
63
+ return this
64
+ }
65
+
66
+ public getParsedInstruction(ins: string | { type: string; info: any }): Instruction | null {
67
+ if (ins) {
68
+ if ((ins as { type: string; info: any }).info) {
69
+ return this.fromParsedInstruction ? this.fromParsedInstruction(ins as { type: string; info: any }) : null
70
+ }
71
+ if (this.decodeInstruction != null) {
72
+ return this.decodeInstruction(ins as string)
73
+ }
74
+ }
75
+ return null
76
+ }
77
+
78
+ public getInstructionHandler(parsedInstruction: Instruction): SolanaInstructionHandler | undefined {
79
+ return this.instructionHandlerMap.get(parsedInstruction.name)
80
+ }
81
+
82
+ public async handleInstruction(
83
+ parsedInstruction: Instruction,
84
+ accounts: string[],
85
+ handler: SolanaInstructionHandler,
86
+ slot: bigint
87
+ ): Promise<ProcessResult> {
88
+ const ctx = new SolanaContext(this.contractName, this.network, this.address, slot)
89
+ await handler(parsedInstruction, ctx, accounts)
90
+ return ctx.getProcessResult()
91
+ }
92
+
93
+ public startSlot(startSlot: bigint | number) {
94
+ this.config.startSlot = BigInt(startSlot)
95
+ return this
96
+ }
97
+
98
+ public endBlock(endBlock: bigint | number) {
99
+ this.config.endSlot = BigInt(endBlock)
100
+ return this
101
+ }
102
+ }