@stellar/stellar-sdk 16.0.1 → 16.2.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 (310) hide show
  1. package/README.md +41 -2
  2. package/dist/stellar-sdk-axios.js +5401 -3690
  3. package/dist/stellar-sdk-axios.js.map +1 -1
  4. package/dist/stellar-sdk-axios.min.js +12 -11
  5. package/dist/stellar-sdk-axios.min.js.map +1 -1
  6. package/dist/stellar-sdk.js +4850 -3681
  7. package/dist/stellar-sdk.js.map +1 -1
  8. package/dist/stellar-sdk.min.js +17 -17
  9. package/dist/stellar-sdk.min.js.map +1 -1
  10. package/lib/axios/cjs/base/auth.js +147 -30
  11. package/lib/axios/cjs/base/auth.js.map +1 -1
  12. package/lib/axios/cjs/base/index.js +113 -0
  13. package/lib/axios/cjs/base/index.js.map +1 -0
  14. package/lib/axios/cjs/base/keypair.js +39 -0
  15. package/lib/axios/cjs/base/keypair.js.map +1 -1
  16. package/lib/axios/cjs/base/scval.js +34 -0
  17. package/lib/axios/cjs/base/scval.js.map +1 -1
  18. package/lib/axios/cjs/bindings/client.js +170 -0
  19. package/lib/axios/cjs/bindings/client.js.map +1 -1
  20. package/lib/axios/cjs/bindings/config.js +1 -1
  21. package/lib/axios/cjs/bindings/generator.js +45 -16
  22. package/lib/axios/cjs/bindings/generator.js.map +1 -1
  23. package/lib/axios/cjs/bindings/types.js +151 -1
  24. package/lib/axios/cjs/bindings/types.js.map +1 -1
  25. package/lib/axios/cjs/bindings/utils.js +10 -0
  26. package/lib/axios/cjs/bindings/utils.js.map +1 -1
  27. package/lib/axios/cjs/cli/index.js +19 -22
  28. package/lib/axios/cjs/cli/index.js.map +1 -1
  29. package/lib/axios/cjs/cli/util.js +1 -20
  30. package/lib/axios/cjs/cli/util.js.map +1 -1
  31. package/lib/axios/cjs/contract/assembled_transaction.js +39 -17
  32. package/lib/axios/cjs/contract/assembled_transaction.js.map +1 -1
  33. package/lib/axios/cjs/contract/basic_node_signer.js +8 -42
  34. package/lib/axios/cjs/contract/basic_node_signer.js.map +1 -1
  35. package/lib/axios/cjs/contract/client.js +56 -3
  36. package/lib/axios/cjs/contract/client.js.map +1 -1
  37. package/lib/axios/cjs/contract/event_spec.js +164 -0
  38. package/lib/axios/cjs/contract/event_spec.js.map +1 -0
  39. package/lib/axios/cjs/contract/index.js +2 -0
  40. package/lib/axios/cjs/contract/index.js.map +1 -1
  41. package/lib/axios/cjs/contract/sent_transaction.js +0 -20
  42. package/lib/axios/cjs/contract/sent_transaction.js.map +1 -1
  43. package/lib/axios/cjs/contract/signer.js +96 -0
  44. package/lib/axios/cjs/contract/signer.js.map +1 -0
  45. package/lib/axios/cjs/contract/spec.js +107 -3
  46. package/lib/axios/cjs/contract/spec.js.map +1 -1
  47. package/lib/axios/cjs/contract/types.js.map +1 -1
  48. package/lib/axios/cjs/errors/transaction_failed.js +62 -0
  49. package/lib/axios/cjs/errors/transaction_failed.js.map +1 -0
  50. package/lib/axios/cjs/errors/wrap_http_error.js +20 -0
  51. package/lib/axios/cjs/errors/wrap_http_error.js.map +1 -0
  52. package/lib/axios/cjs/federation/server.js +15 -35
  53. package/lib/axios/cjs/federation/server.js.map +1 -1
  54. package/lib/axios/cjs/horizon/account_response.js +0 -20
  55. package/lib/axios/cjs/horizon/account_response.js.map +1 -1
  56. package/lib/axios/cjs/horizon/horizon_api.js +5 -0
  57. package/lib/axios/cjs/horizon/horizon_api.js.map +1 -1
  58. package/lib/axios/cjs/horizon/horizon_axios_client.js +1 -1
  59. package/lib/axios/cjs/horizon/server.js +20 -26
  60. package/lib/axios/cjs/horizon/server.js.map +1 -1
  61. package/lib/axios/cjs/index.js +66 -65
  62. package/lib/axios/cjs/index.js.map +1 -1
  63. package/lib/axios/cjs/rpc/api.js.map +1 -1
  64. package/lib/axios/cjs/rpc/axios.js +1 -1
  65. package/lib/axios/cjs/rpc/server.js +181 -13
  66. package/lib/axios/cjs/rpc/server.js.map +1 -1
  67. package/lib/axios/cjs/rpc/transaction.js +2 -20
  68. package/lib/axios/cjs/rpc/transaction.js.map +1 -1
  69. package/lib/axios/cjs/webauth/challenge_transaction.js +7 -22
  70. package/lib/axios/cjs/webauth/challenge_transaction.js.map +1 -1
  71. package/lib/axios/cjs/webauth/utils.js +1 -20
  72. package/lib/axios/cjs/webauth/utils.js.map +1 -1
  73. package/lib/axios/esm/base/auth.d.ts +181 -13
  74. package/lib/axios/esm/base/auth.js +146 -31
  75. package/lib/axios/esm/base/auth.js.map +1 -1
  76. package/lib/axios/esm/base/index.d.ts +2 -2
  77. package/lib/axios/esm/base/index.js +44 -0
  78. package/lib/axios/esm/base/index.js.map +1 -0
  79. package/lib/axios/esm/base/keypair.d.ts +27 -0
  80. package/lib/axios/esm/base/keypair.js +39 -0
  81. package/lib/axios/esm/base/keypair.js.map +1 -1
  82. package/lib/axios/esm/base/scval.d.ts +4 -0
  83. package/lib/axios/esm/base/scval.js +34 -0
  84. package/lib/axios/esm/base/scval.js.map +1 -1
  85. package/lib/axios/esm/bindings/client.d.ts +39 -0
  86. package/lib/axios/esm/bindings/client.js +171 -1
  87. package/lib/axios/esm/bindings/client.js.map +1 -1
  88. package/lib/axios/esm/bindings/config.js +1 -1
  89. package/lib/axios/esm/bindings/generator.d.ts +34 -0
  90. package/lib/axios/esm/bindings/generator.js +45 -16
  91. package/lib/axios/esm/bindings/generator.js.map +1 -1
  92. package/lib/axios/esm/bindings/types.d.ts +42 -0
  93. package/lib/axios/esm/bindings/types.js +153 -3
  94. package/lib/axios/esm/bindings/types.js.map +1 -1
  95. package/lib/axios/esm/bindings/utils.d.ts +10 -0
  96. package/lib/axios/esm/bindings/utils.js +9 -1
  97. package/lib/axios/esm/bindings/utils.js.map +1 -1
  98. package/lib/axios/esm/cli/index.js +19 -22
  99. package/lib/axios/esm/cli/index.js.map +1 -1
  100. package/lib/axios/esm/cli/util.d.ts +1 -1
  101. package/lib/axios/esm/cli/util.js +1 -20
  102. package/lib/axios/esm/cli/util.js.map +1 -1
  103. package/lib/axios/esm/contract/assembled_transaction.d.ts +7 -5
  104. package/lib/axios/esm/contract/assembled_transaction.js +39 -17
  105. package/lib/axios/esm/contract/assembled_transaction.js.map +1 -1
  106. package/lib/axios/esm/contract/basic_node_signer.d.ts +3 -0
  107. package/lib/axios/esm/contract/basic_node_signer.js +8 -42
  108. package/lib/axios/esm/contract/basic_node_signer.js.map +1 -1
  109. package/lib/axios/esm/contract/client.d.ts +49 -3
  110. package/lib/axios/esm/contract/client.js +56 -3
  111. package/lib/axios/esm/contract/client.js.map +1 -1
  112. package/lib/axios/esm/contract/event_spec.d.ts +78 -0
  113. package/lib/axios/esm/contract/event_spec.js +159 -0
  114. package/lib/axios/esm/contract/event_spec.js.map +1 -0
  115. package/lib/axios/esm/contract/index.d.ts +3 -0
  116. package/lib/axios/esm/contract/index.js +1 -0
  117. package/lib/axios/esm/contract/index.js.map +1 -1
  118. package/lib/axios/esm/contract/sent_transaction.js +0 -20
  119. package/lib/axios/esm/contract/sent_transaction.js.map +1 -1
  120. package/lib/axios/esm/contract/signer.d.ts +104 -0
  121. package/lib/axios/esm/contract/signer.js +91 -0
  122. package/lib/axios/esm/contract/signer.js.map +1 -0
  123. package/lib/axios/esm/contract/spec.d.ts +84 -0
  124. package/lib/axios/esm/contract/spec.js +107 -3
  125. package/lib/axios/esm/contract/spec.js.map +1 -1
  126. package/lib/axios/esm/contract/types.d.ts +25 -8
  127. package/lib/axios/esm/contract/types.js.map +1 -1
  128. package/lib/axios/esm/errors/index.d.ts +1 -0
  129. package/lib/axios/esm/errors/transaction_failed.d.ts +55 -0
  130. package/lib/axios/esm/errors/transaction_failed.js +60 -0
  131. package/lib/axios/esm/errors/transaction_failed.js.map +1 -0
  132. package/lib/axios/esm/errors/wrap_http_error.d.ts +20 -0
  133. package/lib/axios/esm/errors/wrap_http_error.js +18 -0
  134. package/lib/axios/esm/errors/wrap_http_error.js.map +1 -0
  135. package/lib/axios/esm/federation/server.js +15 -35
  136. package/lib/axios/esm/federation/server.js.map +1 -1
  137. package/lib/axios/esm/horizon/account_response.js +0 -20
  138. package/lib/axios/esm/horizon/account_response.js.map +1 -1
  139. package/lib/axios/esm/horizon/horizon_api.d.ts +12 -1
  140. package/lib/axios/esm/horizon/horizon_api.js +5 -0
  141. package/lib/axios/esm/horizon/horizon_api.js.map +1 -1
  142. package/lib/axios/esm/horizon/horizon_axios_client.js +1 -1
  143. package/lib/axios/esm/horizon/server.d.ts +10 -4
  144. package/lib/axios/esm/horizon/server.js +20 -26
  145. package/lib/axios/esm/horizon/server.js.map +1 -1
  146. package/lib/axios/esm/index.js +27 -29
  147. package/lib/axios/esm/index.js.map +1 -1
  148. package/lib/axios/esm/rpc/api.d.ts +21 -0
  149. package/lib/axios/esm/rpc/api.js.map +1 -1
  150. package/lib/axios/esm/rpc/axios.js +1 -1
  151. package/lib/axios/esm/rpc/server.d.ts +115 -3
  152. package/lib/axios/esm/rpc/server.js +181 -13
  153. package/lib/axios/esm/rpc/server.js.map +1 -1
  154. package/lib/axios/esm/rpc/transaction.js +2 -20
  155. package/lib/axios/esm/rpc/transaction.js.map +1 -1
  156. package/lib/axios/esm/webauth/challenge_transaction.js +7 -22
  157. package/lib/axios/esm/webauth/challenge_transaction.js.map +1 -1
  158. package/lib/axios/esm/webauth/utils.js +1 -20
  159. package/lib/axios/esm/webauth/utils.js.map +1 -1
  160. package/lib/cjs/base/auth.js +147 -30
  161. package/lib/cjs/base/auth.js.map +1 -1
  162. package/lib/cjs/base/index.js +113 -0
  163. package/lib/cjs/base/index.js.map +1 -0
  164. package/lib/cjs/base/keypair.js +39 -0
  165. package/lib/cjs/base/keypair.js.map +1 -1
  166. package/lib/cjs/base/scval.js +34 -0
  167. package/lib/cjs/base/scval.js.map +1 -1
  168. package/lib/cjs/bindings/client.js +170 -0
  169. package/lib/cjs/bindings/client.js.map +1 -1
  170. package/lib/cjs/bindings/config.js +1 -1
  171. package/lib/cjs/bindings/generator.js +45 -16
  172. package/lib/cjs/bindings/generator.js.map +1 -1
  173. package/lib/cjs/bindings/types.js +151 -1
  174. package/lib/cjs/bindings/types.js.map +1 -1
  175. package/lib/cjs/bindings/utils.js +10 -0
  176. package/lib/cjs/bindings/utils.js.map +1 -1
  177. package/lib/cjs/cli/index.js +19 -22
  178. package/lib/cjs/cli/index.js.map +1 -1
  179. package/lib/cjs/cli/util.js +1 -20
  180. package/lib/cjs/cli/util.js.map +1 -1
  181. package/lib/cjs/contract/assembled_transaction.js +39 -17
  182. package/lib/cjs/contract/assembled_transaction.js.map +1 -1
  183. package/lib/cjs/contract/basic_node_signer.js +8 -42
  184. package/lib/cjs/contract/basic_node_signer.js.map +1 -1
  185. package/lib/cjs/contract/client.js +56 -3
  186. package/lib/cjs/contract/client.js.map +1 -1
  187. package/lib/cjs/contract/event_spec.js +164 -0
  188. package/lib/cjs/contract/event_spec.js.map +1 -0
  189. package/lib/cjs/contract/index.js +2 -0
  190. package/lib/cjs/contract/index.js.map +1 -1
  191. package/lib/cjs/contract/sent_transaction.js +0 -20
  192. package/lib/cjs/contract/sent_transaction.js.map +1 -1
  193. package/lib/cjs/contract/signer.js +96 -0
  194. package/lib/cjs/contract/signer.js.map +1 -0
  195. package/lib/cjs/contract/spec.js +107 -3
  196. package/lib/cjs/contract/spec.js.map +1 -1
  197. package/lib/cjs/contract/types.js.map +1 -1
  198. package/lib/cjs/errors/transaction_failed.js +62 -0
  199. package/lib/cjs/errors/transaction_failed.js.map +1 -0
  200. package/lib/cjs/errors/wrap_http_error.js +20 -0
  201. package/lib/cjs/errors/wrap_http_error.js.map +1 -0
  202. package/lib/cjs/federation/server.js +15 -35
  203. package/lib/cjs/federation/server.js.map +1 -1
  204. package/lib/cjs/horizon/account_response.js +0 -20
  205. package/lib/cjs/horizon/account_response.js.map +1 -1
  206. package/lib/cjs/horizon/horizon_api.js +5 -0
  207. package/lib/cjs/horizon/horizon_api.js.map +1 -1
  208. package/lib/cjs/horizon/horizon_axios_client.js +1 -1
  209. package/lib/cjs/horizon/server.js +20 -26
  210. package/lib/cjs/horizon/server.js.map +1 -1
  211. package/lib/cjs/index.js +66 -65
  212. package/lib/cjs/index.js.map +1 -1
  213. package/lib/cjs/rpc/api.js.map +1 -1
  214. package/lib/cjs/rpc/axios.js +1 -1
  215. package/lib/cjs/rpc/server.js +181 -13
  216. package/lib/cjs/rpc/server.js.map +1 -1
  217. package/lib/cjs/rpc/transaction.js +2 -20
  218. package/lib/cjs/rpc/transaction.js.map +1 -1
  219. package/lib/cjs/webauth/challenge_transaction.js +7 -22
  220. package/lib/cjs/webauth/challenge_transaction.js.map +1 -1
  221. package/lib/cjs/webauth/utils.js +1 -20
  222. package/lib/cjs/webauth/utils.js.map +1 -1
  223. package/lib/esm/base/auth.d.ts +181 -13
  224. package/lib/esm/base/auth.js +146 -31
  225. package/lib/esm/base/auth.js.map +1 -1
  226. package/lib/esm/base/index.d.ts +2 -2
  227. package/lib/esm/base/index.js +44 -0
  228. package/lib/esm/base/index.js.map +1 -0
  229. package/lib/esm/base/keypair.d.ts +27 -0
  230. package/lib/esm/base/keypair.js +39 -0
  231. package/lib/esm/base/keypair.js.map +1 -1
  232. package/lib/esm/base/scval.d.ts +4 -0
  233. package/lib/esm/base/scval.js +34 -0
  234. package/lib/esm/base/scval.js.map +1 -1
  235. package/lib/esm/bindings/client.d.ts +39 -0
  236. package/lib/esm/bindings/client.js +171 -1
  237. package/lib/esm/bindings/client.js.map +1 -1
  238. package/lib/esm/bindings/config.js +1 -1
  239. package/lib/esm/bindings/generator.d.ts +34 -0
  240. package/lib/esm/bindings/generator.js +45 -16
  241. package/lib/esm/bindings/generator.js.map +1 -1
  242. package/lib/esm/bindings/types.d.ts +42 -0
  243. package/lib/esm/bindings/types.js +153 -3
  244. package/lib/esm/bindings/types.js.map +1 -1
  245. package/lib/esm/bindings/utils.d.ts +10 -0
  246. package/lib/esm/bindings/utils.js +9 -1
  247. package/lib/esm/bindings/utils.js.map +1 -1
  248. package/lib/esm/cli/index.js +19 -22
  249. package/lib/esm/cli/index.js.map +1 -1
  250. package/lib/esm/cli/util.d.ts +1 -1
  251. package/lib/esm/cli/util.js +1 -20
  252. package/lib/esm/cli/util.js.map +1 -1
  253. package/lib/esm/contract/assembled_transaction.d.ts +7 -5
  254. package/lib/esm/contract/assembled_transaction.js +39 -17
  255. package/lib/esm/contract/assembled_transaction.js.map +1 -1
  256. package/lib/esm/contract/basic_node_signer.d.ts +3 -0
  257. package/lib/esm/contract/basic_node_signer.js +8 -42
  258. package/lib/esm/contract/basic_node_signer.js.map +1 -1
  259. package/lib/esm/contract/client.d.ts +49 -3
  260. package/lib/esm/contract/client.js +56 -3
  261. package/lib/esm/contract/client.js.map +1 -1
  262. package/lib/esm/contract/event_spec.d.ts +78 -0
  263. package/lib/esm/contract/event_spec.js +159 -0
  264. package/lib/esm/contract/event_spec.js.map +1 -0
  265. package/lib/esm/contract/index.d.ts +3 -0
  266. package/lib/esm/contract/index.js +1 -0
  267. package/lib/esm/contract/index.js.map +1 -1
  268. package/lib/esm/contract/sent_transaction.js +0 -20
  269. package/lib/esm/contract/sent_transaction.js.map +1 -1
  270. package/lib/esm/contract/signer.d.ts +104 -0
  271. package/lib/esm/contract/signer.js +91 -0
  272. package/lib/esm/contract/signer.js.map +1 -0
  273. package/lib/esm/contract/spec.d.ts +84 -0
  274. package/lib/esm/contract/spec.js +107 -3
  275. package/lib/esm/contract/spec.js.map +1 -1
  276. package/lib/esm/contract/types.d.ts +25 -8
  277. package/lib/esm/contract/types.js.map +1 -1
  278. package/lib/esm/errors/index.d.ts +1 -0
  279. package/lib/esm/errors/transaction_failed.d.ts +55 -0
  280. package/lib/esm/errors/transaction_failed.js +60 -0
  281. package/lib/esm/errors/transaction_failed.js.map +1 -0
  282. package/lib/esm/errors/wrap_http_error.d.ts +20 -0
  283. package/lib/esm/errors/wrap_http_error.js +18 -0
  284. package/lib/esm/errors/wrap_http_error.js.map +1 -0
  285. package/lib/esm/federation/server.js +15 -35
  286. package/lib/esm/federation/server.js.map +1 -1
  287. package/lib/esm/horizon/account_response.js +0 -20
  288. package/lib/esm/horizon/account_response.js.map +1 -1
  289. package/lib/esm/horizon/horizon_api.d.ts +12 -1
  290. package/lib/esm/horizon/horizon_api.js +5 -0
  291. package/lib/esm/horizon/horizon_api.js.map +1 -1
  292. package/lib/esm/horizon/horizon_axios_client.js +1 -1
  293. package/lib/esm/horizon/server.d.ts +10 -4
  294. package/lib/esm/horizon/server.js +20 -26
  295. package/lib/esm/horizon/server.js.map +1 -1
  296. package/lib/esm/index.js +27 -29
  297. package/lib/esm/index.js.map +1 -1
  298. package/lib/esm/rpc/api.d.ts +21 -0
  299. package/lib/esm/rpc/api.js.map +1 -1
  300. package/lib/esm/rpc/axios.js +1 -1
  301. package/lib/esm/rpc/server.d.ts +115 -3
  302. package/lib/esm/rpc/server.js +181 -13
  303. package/lib/esm/rpc/server.js.map +1 -1
  304. package/lib/esm/rpc/transaction.js +2 -20
  305. package/lib/esm/rpc/transaction.js.map +1 -1
  306. package/lib/esm/webauth/challenge_transaction.js +7 -22
  307. package/lib/esm/webauth/challenge_transaction.js.map +1 -1
  308. package/lib/esm/webauth/utils.js +1 -20
  309. package/lib/esm/webauth/utils.js.map +1 -1
  310. package/package.json +35 -30
@@ -1 +1 @@
1
- {"version":3,"file":"scval.js","sources":["../../../src/base/scval.ts"],"sourcesContent":["import xdr from \"./xdr.js\";\nimport { Keypair } from \"./keypair.js\";\nimport { Address } from \"./address.js\";\nimport { Contract } from \"./contract.js\";\nimport { ScInt, XdrLargeInt, scValToBigInt } from \"./numbers/index.js\";\nimport type { ScIntType } from \"./numbers/index.js\";\n\ntype ScValIntType = ScIntType | \"i32\" | \"u32\";\ntype ScValStringType = ScValIntType | \"address\" | \"string\" | \"symbol\";\ntype ScValBytesType = \"bytes\" | \"string\" | \"symbol\";\ntype ScValType = ScValBytesType | ScValIntType | ScValStringType;\n\ntype ScValMapTypeSpec = Record<\n string,\n [(ScValType | null)?, (ScValType | null)?]\n>;\n\nexport interface NativeToScValOpts {\n type?: (ScValType | null)[] | ScValMapTypeSpec | ScValType | undefined;\n}\n\n/**\n * Attempts to convert native types into smart contract values\n * ({@link xdr.ScVal}).\n *\n * Provides conversions from smart contract XDR values ({@link xdr.ScVal}) to\n * native JavaScript types.\n *\n * The conversions are as follows:\n *\n * - `xdr.ScVal` → passthrough\n * - `null` / `undefined` → `scvVoid`\n * - `string` → `scvString` (a copy is made)\n * - `UintArray8` → `scvBytes` (a copy is made)\n * - `boolean` → `scvBool`\n *\n * - `number` / `bigint` → the smallest possible XDR integer type that will fit\n * the input value (if you want a specific type, use {@link ScInt})\n *\n * - {@link Address} or {@link Contract} → `scvAddress` (for contracts and\n * public keys)\n *\n * - `Array<T>` → `scvVec` after attempting to convert each item of type `T` to\n * an `xdr.ScVal` (recursively). note that all values must be the same type!\n *\n * - `object` → `scvMap` after attempting to convert each key and value to an\n * `xdr.ScVal` (recursively). note that there is no restriction on types\n * matching anywhere (unlike arrays)\n *\n * When passing an integer-like native value, you can also optionally specify a\n * type which will force a particular interpretation of that value.\n *\n * Note that not all type specifications are compatible with all `ScVal`s, e.g.\n * `toScVal(\"a string\", {type: \"i256\"})` will throw.\n *\n * @param val - a native (or convertible) input value to wrap\n * @param opts - an optional set of hints around the type of\n * conversion you'd like to see\n * - `type`: there is different behavior for different input\n * types for `val`:\n *\n * - when `val` is an integer-like type (i.e. number|bigint), this will be\n * forwarded to {@link ScInt} or forced to be u32/i32.\n *\n * - when `val` is an array type, this is forwarded to the recursion\n *\n * - when `val` is an object type (key-value entries), this should be an\n * object in which each key has a pair of types (to represent forced types\n * for the key and the value), where `null` (or a missing entry) indicates\n * the default interpretation(s) (refer to the examples, below)\n *\n * - when `val` is a string type, this can be 'string' or 'symbol' to force\n * a particular interpretation of `val`.\n *\n * - when `val` is a bytes-like type, this can be 'string', 'symbol', or\n * 'bytes' to force a particular interpretation\n *\n * As a simple example, `nativeToScVal(\"hello\", {type: 'symbol'})` will\n * return an `scvSymbol`, whereas without the type it would have been an\n * `scvString`.\n *\n * @throws if...\n * - there are arrays with more than one type in them\n * - there are values that do not have a sensible conversion (e.g. random XDR\n * types, custom classes)\n * - the type of the input object (or some inner value of said object) cannot\n * be determined (via `typeof`)\n * - the type you specified (via `opts.type`) is incompatible with the value\n * you passed in (`val`), e.g. `nativeToScVal(\"a string\", { type: 'i128' })`,\n * though this does not apply for types that ignore `opts` (e.g. addresses).\n * @see scValToNative\n *\n * @example\n * ```ts\n * nativeToScVal(1000); // gives ScValType === scvU64\n * nativeToScVal(1000n); // gives ScValType === scvU64\n * nativeToScVal(1n << 100n); // gives ScValType === scvU128\n * nativeToScVal(1000, { type: 'u32' }); // gives ScValType === scvU32\n * nativeToScVal(1000, { type: 'i125' }); // gives ScValType === scvI256\n * nativeToScVal(\"a string\"); // gives ScValType === scvString\n * nativeToScVal(\"a string\", { type: 'symbol' }); // gives scvSymbol\n * nativeToScVal(new Uint8Array(5)); // scvBytes\n * nativeToScVal(new Uint8Array(5), { type: 'symbol' }); // scvSymbol\n * nativeToScVal(null); // scvVoid\n * nativeToScVal(true); // scvBool\n * nativeToScVal([1, 2, 3]); // gives scvVec with each element as scvU64\n * nativeToScVal([1, 2, 3], { type: 'i128' }); // scvVec<scvI128>\n * nativeToScVal([1, '2'], { type: ['i128', 'symbol'] }); // scvVec with diff types\n * nativeToScVal([1, '2', 3], { type: ['i128', 'symbol'] });\n * // scvVec with diff types, using the default when omitted\n * nativeToScVal({ 'hello': 1, 'world': [ true, false ] }, {\n * type: {\n * 'hello': [ 'symbol', 'i128' ],\n * }\n * })\n * // gives scvMap with entries: [\n * // [ scvSymbol, scvI128 ],\n * // [ scvString, scvArray<scvBool> ]\n * // ]\n * ```\n *\n * @example\n * ```ts\n * import {\n * nativeToScVal,\n * scValToNative,\n * ScInt,\n * xdr\n * } from '@stellar/stellar-base';\n *\n * let gigaMap = {\n * bool: true,\n * void: null,\n * u32: xdr.ScVal.scvU32(1),\n * i32: xdr.ScVal.scvI32(1),\n * u64: 1n,\n * i64: -1n,\n * u128: new ScInt(1).toU128(),\n * i128: new ScInt(1).toI128(),\n * u256: new ScInt(1).toU256(),\n * i256: new ScInt(1).toI256(),\n * map: {\n * arbitrary: 1n,\n * nested: 'values',\n * etc: false\n * },\n * vec: ['same', 'type', 'list'],\n * vec: ['diff', 1, 'type', 2, 'list'],\n * };\n *\n * // then, simply:\n * let scv = nativeToScVal(gigaMap); // scv.switch() == xdr.ScValType.scvMap()\n *\n * // then...\n * someContract.call(\"method\", scv);\n *\n * // Similarly, the inverse should work:\n * scValToNative(scv) == gigaMap; // true\n * ```\n */\nexport function nativeToScVal(\n val: unknown,\n opts: NativeToScValOpts = {},\n): xdr.ScVal {\n switch (typeof val) {\n case \"object\": {\n if (val === null) {\n return xdr.ScVal.scvVoid();\n }\n\n if (val instanceof xdr.ScVal) {\n return val; // should we copy?\n }\n\n if (val instanceof Address) {\n return val.toScVal();\n }\n\n if (val instanceof Keypair) {\n return nativeToScVal(val.publicKey(), { type: \"address\" });\n }\n\n if (val instanceof Contract) {\n return val.address().toScVal();\n }\n\n if (val instanceof Uint8Array || Buffer.isBuffer(val)) {\n const copy = Buffer.from(val);\n switch ((opts?.type as string) ?? \"bytes\") {\n case \"bytes\":\n return xdr.ScVal.scvBytes(copy);\n case \"symbol\":\n return xdr.ScVal.scvSymbol(copy);\n case \"string\":\n return xdr.ScVal.scvString(copy);\n default:\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for bytes-like value`,\n );\n }\n }\n\n if (Array.isArray(val)) {\n return xdr.ScVal.scvVec(\n val.map((v: unknown, idx: number) => {\n // There may be different type specifications for each element in\n // the array, so we need to apply those accordingly.\n if (Array.isArray(opts.type)) {\n return nativeToScVal(\n v,\n // only include a `{ type: ... }` if it's present (safer than\n // `{type: undefined}`)\n {\n ...(opts.type.length > idx && {\n type: opts.type[idx] as ScValType,\n }),\n },\n );\n }\n\n // Otherwise apply a generic (or missing) type specifier on it.\n return nativeToScVal(v, opts);\n }),\n );\n }\n\n if (Object.getPrototypeOf(val) !== Object.prototype) {\n throw new TypeError(\n `cannot interpret ${\n val.constructor?.name\n } value as ScVal (${JSON.stringify(val)})`,\n );\n }\n\n const mapTypeSpec = (opts?.type ?? {}) as ScValMapTypeSpec;\n\n return xdr.ScVal.scvMap(\n Object.entries(val as Record<string, unknown>)\n // The Soroban runtime expects maps to have their keys in sorted\n // order, so let's do that here as part of the conversion to prevent\n // confusing error messages on execution.\n .sort(([key1], [key2]) => (key1 < key2 ? -1 : key1 > key2 ? 1 : 0))\n .map(([k, v]) => {\n // the type can be specified with an entry for the key and the value,\n // e.g. val = { 'hello': 1 } and opts.type = { hello: [ 'symbol',\n // 'u128' ]} or you can use `null` for the default interpretation\n const [keyType, valType] = Object.hasOwn(mapTypeSpec, k)\n ? (mapTypeSpec[k] ?? [null, null])\n : [null, null];\n const keyOpts: NativeToScValOpts = keyType ? { type: keyType } : {};\n const valOpts: NativeToScValOpts = valType ? { type: valType } : {};\n\n return new xdr.ScMapEntry({\n key: nativeToScVal(k, keyOpts),\n val: nativeToScVal(v, valOpts),\n });\n }),\n );\n }\n\n case \"number\":\n case \"bigint\": {\n const bigintVal = BigInt(val);\n switch (opts?.type) {\n case \"u32\":\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(val));\n case \"i32\":\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(val));\n\n default:\n break;\n }\n\n return new ScInt(val, { type: opts?.type as ScIntType }).toScVal();\n }\n case \"string\": {\n const optType = (opts?.type as string) ?? \"string\";\n switch (optType) {\n case \"string\":\n return xdr.ScVal.scvString(val);\n\n case \"symbol\":\n return xdr.ScVal.scvSymbol(val);\n\n case \"address\":\n return new Address(val).toScVal();\n\n case \"u32\": {\n const bigintVal = BigInt(val);\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(bigintVal));\n }\n\n case \"i32\": {\n const bigintVal = BigInt(val);\n // TODO: Update this check once xdr.Int32.MIN_VALUE in XDR is properly\n // set to negative. Check this globally.\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(bigintVal));\n }\n\n default:\n if (XdrLargeInt.isType(optType)) {\n return new XdrLargeInt(optType, val).toScVal();\n }\n\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for string value`,\n );\n }\n }\n\n case \"boolean\":\n return xdr.ScVal.scvBool(val);\n\n case \"undefined\":\n return xdr.ScVal.scvVoid();\n\n case \"function\": // FIXME: Is this too helpful?\n return nativeToScVal((val as () => unknown)());\n\n default:\n throw new TypeError(\n `failed to convert typeof ${typeof val} (${JSON.stringify(val)})`,\n );\n }\n}\n\n/**\n * Given a smart contract value, attempt to convert it to a native type.\n * Possible conversions include:\n *\n * - `void` → `null`\n * - `u32`, `i32` → `number`\n * - `u64`, `i64`, `u128`, `i128`, `u256`, `i256`, `timepoint`, `duration` →\n * `bigint`\n * - `vec` → `Array` of any of the above (via recursion)\n * - `map` → key-value object of any of the above (via recursion)\n * - `bool` → `boolean`\n * - `bytes` → `Uint8Array`\n * - `symbol` → `string`\n * - `string` → `string` IF the underlying buffer can be decoded as ascii/utf8,\n * `Uint8Array` of the raw contents in any error case\n *\n * If no viable conversion can be determined, this just \"unwraps\" the smart\n * value to return its underlying XDR value.\n *\n * @param scv - the input smart contract value\n *\n * @see nativeToScVal\n */\n\nexport function scValToNative(scv: xdr.ScVal): any {\n // we use the verbose xdr.ScValType.<type>.value form here because it's faster\n // than string comparisons and the underlying constants never need to be\n // updated\n switch (scv.switch().value) {\n case xdr.ScValType.scvVoid().value:\n return null;\n\n // these can be converted to bigints directly\n case xdr.ScValType.scvU64().value:\n case xdr.ScValType.scvI64().value:\n return (scv.value() as xdr.Int64 | xdr.Uint64).toBigInt();\n\n // these can be parsed by internal abstractions note that this can also\n // handle the above two cases, but it's not as efficient (another\n // type-check, parsing, etc.)\n case xdr.ScValType.scvU128().value:\n case xdr.ScValType.scvI128().value:\n case xdr.ScValType.scvU256().value:\n case xdr.ScValType.scvI256().value:\n return scValToBigInt(scv);\n\n case xdr.ScValType.scvVec().value:\n return (scv.vec() ?? []).map(scValToNative);\n\n case xdr.ScValType.scvAddress().value:\n return Address.fromScVal(scv).toString();\n\n case xdr.ScValType.scvMap().value:\n return Object.fromEntries(\n (scv.map() ?? []).map((entry: xdr.ScMapEntry) => [\n scValToNative(entry.key()),\n scValToNative(entry.val()),\n ]),\n );\n\n // these return the primitive type directly\n case xdr.ScValType.scvBool().value:\n case xdr.ScValType.scvU32().value:\n case xdr.ScValType.scvI32().value:\n case xdr.ScValType.scvBytes().value:\n return scv.value();\n\n // Symbols are limited to [a-zA-Z0-9_]+, so we can safely make ascii strings\n //\n // Strings, however, are \"presented\" as strings and we treat them as such\n // (in other words, string = bytes with a hint that it's text). If the user\n // encoded non-printable bytes in their string value, that's on them.\n //\n // Note that we assume a utf8 encoding (ascii-compatible). For other\n // encodings, you should probably use bytes anyway. If it cannot be decoded,\n // the raw bytes are returned.\n case xdr.ScValType.scvSymbol().value: {\n const v = scv.sym();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n case xdr.ScValType.scvString().value: {\n const v = scv.str();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n\n // these can be converted to bigint\n case xdr.ScValType.scvTimepoint().value:\n case xdr.ScValType.scvDuration().value:\n return (scv.value() as xdr.Uint64).toBigInt();\n\n case xdr.ScValType.scvError().value:\n switch (scv.error().switch().value) {\n // Distinguish errors from the user contract.\n case xdr.ScErrorType.sceContract().value:\n return { type: \"contract\", code: scv.error().contractCode() };\n default: {\n const err = scv.error();\n return {\n type: \"system\",\n code: err.code().value,\n value: err.code().name,\n };\n }\n }\n\n // in the fallthrough case, just return the underlying value directly\n default:\n return scv.value();\n }\n}\n\n/**\n * Build a sorted ScVal map from unsorted entries, sorted by key.\n *\n * @param items - the unsorted map entries\n */\nexport function scvSortedMap(items: xdr.ScMapEntry[]): xdr.ScVal {\n const sorted = Array.from(items).sort((a, b) => {\n // Both a and b are `ScMapEntry`s, so we need to sort by underlying key.\n //\n // We couldn't possibly handle every combination of keys since Soroban\n // maps don't enforce consistent types, so we do a best-effort and try\n // sorting by \"number-like\" or \"string-like.\"\n const nativeA = scValToNative(a.key()) as bigint | number | string;\n const nativeB = scValToNative(b.key()) as bigint | number | string;\n\n switch (typeof nativeA) {\n case \"number\":\n case \"bigint\":\n if (nativeA === nativeB) return 0;\n return nativeA < (nativeB as bigint | number) ? -1 : 1;\n\n default: {\n const strA = nativeA.toString();\n const strB = nativeB.toString();\n return strA < strB ? -1 : strA > strB ? 1 : 0;\n }\n }\n });\n\n return xdr.ScVal.scvMap(sorted);\n}\n\n// Inject a sortable map builder into the xdr module for backwards compatibility.\nxdr.scvSortedMap = scvSortedMap;\n"],"names":["xdr"],"mappings":";;;;;;;;;AAgKO,SAAS,aAAA,CACd,GAAA,EACA,IAAA,GAA0B,EAAC,EAChB;AACX,EAAA,QAAQ,OAAO,GAAA;AAAK,IAClB,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAOA,KAAA,CAAI,MAAM,OAAA,EAAQ;AAAA,MAC3B;AAEA,MAAA,IAAI,GAAA,YAAeA,MAAI,KAAA,EAAO;AAC5B,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,OAAO,IAAI,OAAA,EAAQ;AAAA,MACrB;AAEA,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,OAAO,cAAc,GAAA,CAAI,SAAA,IAAa,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,QAAA,OAAO,GAAA,CAAI,OAAA,EAAQ,CAAE,OAAA,EAAQ;AAAA,MAC/B;AAEA,MAAA,IAAI,GAAA,YAAe,UAAA,IAAc,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACrD,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,QAAA,QAAS,IAAA,EAAM,QAAmB,OAAA;AAAS,UACzC,KAAK,OAAA;AACH,YAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAAA,UAChC,KAAK,QAAA;AACH,YAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UACjC,KAAK,QAAA;AACH,YAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UACjC;AACE,YAAA,MAAM,IAAI,SAAA;AAAA,cACR,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,gCAAA;AAAA,aAC5C;AAAA;AACJ,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,QAAA,OAAOA,MAAI,KAAA,CAAM,MAAA;AAAA,UACf,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAY,GAAA,KAAgB;AAGnC,YAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,cAAA,OAAO,aAAA;AAAA,gBACL,CAAA;AAAA;AAAA;AAAA,gBAGA;AAAA,kBACE,GAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,GAAA,IAAO;AAAA,oBAC5B,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA;AACrB;AACF,eACF;AAAA,YACF;AAGA,YAAA,OAAO,aAAA,CAAc,GAAG,IAAI,CAAA;AAAA,UAC9B,CAAC;AAAA,SACH;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,cAAA,CAAe,GAAG,CAAA,KAAM,OAAO,SAAA,EAAW;AACnD,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,CAAA,iBAAA,EACE,IAAI,WAAA,EAAa,IACnB,oBAAoB,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAAA,SACzC;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAe,IAAA,EAAM,IAAA,IAAQ,EAAC;AAEpC,MAAA,OAAOA,MAAI,KAAA,CAAM,MAAA;AAAA,QACf,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,CAI1C,IAAA,CAAK,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,IAAI,CAAA,KAAO,OAAO,IAAA,GAAO,EAAA,GAAK,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,CAAE,CAAA,CACjE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAIf,UAAA,MAAM,CAAC,OAAA,EAAS,OAAO,IAAI,MAAA,CAAO,MAAA,CAAO,aAAa,CAAC,CAAA,GAClD,WAAA,CAAY,CAAC,KAAK,CAAC,IAAA,EAAM,IAAI,CAAA,GAC9B,CAAC,MAAM,IAAI,CAAA;AACf,UAAA,MAAM,UAA6B,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,KAAY,EAAC;AAClE,UAAA,MAAM,UAA6B,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,KAAY,EAAC;AAElE,UAAA,OAAO,IAAIA,MAAI,UAAA,CAAW;AAAA,YACxB,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,OAAO,CAAA;AAAA,YAC7B,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,OAAO;AAAA,WAC9B,CAAA;AAAA,QACH,CAAC;AAAA,OACL;AAAA,IACF;AAAA,IAEA,KAAK,QAAA;AAAA,IACL,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,KAAA;AACH,UAAA,IACE,SAAA,GAAY,MAAA,CAAOA,KAAA,CAAI,MAAA,CAAO,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,KAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EACvC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACrC,KAAK,KAAA;AACH,UAAA,IACE,SAAA,GAAY,CAAC,MAAA,CAAOA,KAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,KAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EACtC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAGnC;AAGJ,MAAA,OAAO,IAAI,MAAM,GAAA,EAAK,EAAE,MAAM,IAAA,EAAM,IAAA,EAAmB,CAAA,CAAE,OAAA,EAAQ;AAAA,IACnE;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAA,GAAW,MAAM,IAAA,IAAmB,QAAA;AAC1C,MAAA,QAAQ,OAAA;AAAS,QACf,KAAK,QAAA;AACH,UAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,SAAA,CAAU,GAAG,CAAA;AAAA,QAEhC,KAAK,QAAA;AACH,UAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,SAAA,CAAU,GAAG,CAAA;AAAA,QAEhC,KAAK,SAAA;AACH,UAAA,OAAO,IAAI,OAAA,CAAQ,GAAG,CAAA,CAAE,OAAA,EAAQ;AAAA,QAElC,KAAK,KAAA,EAAO;AACV,UAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,UAAA,IACE,SAAA,GAAY,MAAA,CAAOA,KAAA,CAAI,MAAA,CAAO,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,KAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EACvC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,QAC3C;AAAA,QAEA,KAAK,KAAA,EAAO;AACV,UAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAG5B,UAAA,IACE,SAAA,GAAY,CAAC,MAAA,CAAOA,KAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,KAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EACtC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,QAC3C;AAAA,QAEA;AACE,UAAA,IAAI,WAAA,CAAY,MAAA,CAAO,OAAO,CAAA,EAAG;AAC/B,YAAA,OAAO,IAAI,WAAA,CAAY,OAAA,EAAS,GAAG,EAAE,OAAA,EAAQ;AAAA,UAC/C;AAEA,UAAA,MAAM,IAAI,SAAA;AAAA,YACR,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,4BAAA;AAAA,WAC5C;AAAA;AACJ,IACF;AAAA,IAEA,KAAK,SAAA;AACH,MAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IAE9B,KAAK,WAAA;AACH,MAAA,OAAOA,KAAA,CAAI,MAAM,OAAA,EAAQ;AAAA,IAE3B,KAAK,UAAA;AACH,MAAA,OAAO,aAAA,CAAe,KAAuB,CAAA;AAAA,IAE/C;AACE,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,4BAA4B,OAAO,GAAG,KAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAAA,OAChE;AAAA;AAEN;AA0BO,SAAS,cAAc,GAAA,EAAqB;AAIjD,EAAA,QAAQ,GAAA,CAAI,MAAA,EAAO,CAAE,KAAA;AAAO,IAC1B,KAAKA,KAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAC3B,MAAA,OAAO,IAAA;AAAA;AAAA,IAGT,KAAKA,KAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAAA,IAC5B,KAAKA,KAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAC1B,MAAA,OAAQ,GAAA,CAAI,KAAA,EAAM,CAA6B,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA,IAK1D,KAAKA,KAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,KAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,KAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,KAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAC3B,MAAA,OAAO,cAAc,GAAG,CAAA;AAAA,IAE1B,KAAKA,KAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAC1B,MAAA,OAAA,CAAQ,IAAI,GAAA,EAAI,IAAK,EAAC,EAAG,IAAI,aAAa,CAAA;AAAA,IAE5C,KAAKA,KAAA,CAAI,SAAA,CAAU,UAAA,EAAW,CAAE,KAAA;AAC9B,MAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,IAEzC,KAAKA,KAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAC1B,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,QAAA,CACX,IAAI,GAAA,EAAI,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,KAAA,KAA0B;AAAA,UAC/C,aAAA,CAAc,KAAA,CAAM,GAAA,EAAK,CAAA;AAAA,UACzB,aAAA,CAAc,KAAA,CAAM,GAAA,EAAK;AAAA,SAC1B;AAAA,OACH;AAAA;AAAA,IAGF,KAAKA,KAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,KAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAAA,IAC5B,KAAKA,KAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAAA,IAC5B,KAAKA,KAAA,CAAI,SAAA,CAAU,QAAA,EAAS,CAAE,KAAA;AAC5B,MAAA,OAAO,IAAI,KAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWnB,KAAKA,KAAA,CAAI,SAAA,CAAU,SAAA,GAAY,KAAA,EAAO;AACpC,MAAA,MAAM,CAAA,GAAI,IAAI,GAAA,EAAI;AAClB,MAAA,IACE,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAChB,WAAA,CAAY,OAAO,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EACvC;AACA,QAAA,IAAI;AACF,UAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,CAAC,CAAA;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAI,UAAA,CAAY,CAAA,CAAsB,MAAM,CAAA;AAAA,QACrD;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAKA,KAAA,CAAI,SAAA,CAAU,SAAA,GAAY,KAAA,EAAO;AACpC,MAAA,MAAM,CAAA,GAAI,IAAI,GAAA,EAAI;AAClB,MAAA,IACE,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAChB,WAAA,CAAY,OAAO,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EACvC;AACA,QAAA,IAAI;AACF,UAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,CAAC,CAAA;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAI,UAAA,CAAY,CAAA,CAAsB,MAAM,CAAA;AAAA,QACrD;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA;AAAA,IAGA,KAAKA,KAAA,CAAI,SAAA,CAAU,YAAA,EAAa,CAAE,KAAA;AAAA,IAClC,KAAKA,KAAA,CAAI,SAAA,CAAU,WAAA,EAAY,CAAE,KAAA;AAC/B,MAAA,OAAQ,GAAA,CAAI,KAAA,EAAM,CAAiB,QAAA,EAAS;AAAA,IAE9C,KAAKA,KAAA,CAAI,SAAA,CAAU,QAAA,EAAS,CAAE,KAAA;AAC5B,MAAA,QAAQ,GAAA,CAAI,KAAA,EAAM,CAAE,MAAA,GAAS,KAAA;AAAO;AAAA,QAElC,KAAKA,KAAA,CAAI,WAAA,CAAY,WAAA,EAAY,CAAE,KAAA;AACjC,UAAA,OAAO,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,IAAI,KAAA,EAAM,CAAE,cAAa,EAAE;AAAA,QAC9D,SAAS;AACP,UAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,CAAE,KAAA;AAAA,YACjB,KAAA,EAAO,GAAA,CAAI,IAAA,EAAK,CAAE;AAAA,WACpB;AAAA,QACF;AAAA;AACF;AAAA,IAGF;AACE,MAAA,OAAO,IAAI,KAAA,EAAM;AAAA;AAEvB;AAOO,SAAS,aAAa,KAAA,EAAoC;AAC/D,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAM9C,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,GAAA,EAAK,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,GAAA,EAAK,CAAA;AAErC,IAAA,QAAQ,OAAO,OAAA;AAAS,MACtB,KAAK,QAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,IAAI,OAAA,KAAY,SAAS,OAAO,CAAA;AAChC,QAAA,OAAO,OAAA,GAAW,UAA8B,EAAA,GAAK,CAAA;AAAA,MAEvD,SAAS;AACP,QAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,EAAS;AAC9B,QAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,EAAS;AAC9B,QAAA,OAAO,IAAA,GAAO,IAAA,GAAO,EAAA,GAAK,IAAA,GAAO,OAAO,CAAA,GAAI,CAAA;AAAA,MAC9C;AAAA;AACF,EACF,CAAC,CAAA;AAED,EAAA,OAAOA,KAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAChC;AAGAA,KAAA,CAAI,YAAA,GAAe,YAAA;;;;"}
1
+ {"version":3,"file":"scval.js","sources":["../../../src/base/scval.ts"],"sourcesContent":["import xdr from \"./xdr.js\";\nimport { Keypair } from \"./keypair.js\";\nimport { Address } from \"./address.js\";\nimport { Contract } from \"./contract.js\";\nimport { ScInt, XdrLargeInt, scValToBigInt } from \"./numbers/index.js\";\nimport type { ScIntType } from \"./numbers/index.js\";\n\ntype ScValIntType = ScIntType | \"i32\" | \"u32\";\ntype ScValStringType = ScValIntType | \"address\" | \"string\" | \"symbol\";\ntype ScValBytesType = \"bytes\" | \"string\" | \"symbol\";\ntype ScValType = ScValBytesType | ScValIntType | ScValStringType;\n\ntype ScValMapTypeSpec = Record<\n string,\n [(ScValType | null)?, (ScValType | null)?]\n>;\n\nexport interface NativeToScValOpts {\n type?: (ScValType | null)[] | ScValMapTypeSpec | ScValType | undefined;\n}\n\n/**\n * Attempts to convert native types into smart contract values\n * ({@link xdr.ScVal}).\n *\n * Provides conversions from smart contract XDR values ({@link xdr.ScVal}) to\n * native JavaScript types.\n *\n * The conversions are as follows:\n *\n * - `xdr.ScVal` → passthrough\n * - `null` / `undefined` → `scvVoid`\n * - `string` → `scvString` (a copy is made)\n * - `UintArray8` → `scvBytes` (a copy is made)\n * - `boolean` → `scvBool`\n *\n * - `number` / `bigint` → the smallest possible XDR integer type that will fit\n * the input value (if you want a specific type, use {@link ScInt})\n *\n * - {@link Address} or {@link Contract} → `scvAddress` (for contracts and\n * public keys)\n *\n * - `Array<T>` → `scvVec` after attempting to convert each item of type `T` to\n * an `xdr.ScVal` (recursively). note that all values must be the same type!\n *\n * - `object` → `scvMap` after attempting to convert each key and value to an\n * `xdr.ScVal` (recursively). note that there is no restriction on types\n * matching anywhere (unlike arrays)\n *\n * When passing an integer-like native value, you can also optionally specify a\n * type which will force a particular interpretation of that value.\n *\n * Note that not all type specifications are compatible with all `ScVal`s, e.g.\n * `toScVal(\"a string\", {type: \"i256\"})` will throw.\n *\n * @param val - a native (or convertible) input value to wrap\n * @param opts - an optional set of hints around the type of\n * conversion you'd like to see\n * - `type`: there is different behavior for different input\n * types for `val`:\n *\n * - when `val` is an integer-like type (i.e. number|bigint), this will be\n * forwarded to {@link ScInt} or forced to be u32/i32.\n *\n * - when `val` is an array type, this is forwarded to the recursion\n *\n * - when `val` is an object type (key-value entries), this should be an\n * object in which each key has a pair of types (to represent forced types\n * for the key and the value), where `null` (or a missing entry) indicates\n * the default interpretation(s) (refer to the examples, below)\n *\n * - when `val` is a `Map`, this can be a `[keyType, valType]` pair applied\n * to every entry, or (when all keys are strings) the same per-key spec\n * object used for plain objects\n *\n * - when `val` is a string type, this can be 'string' or 'symbol' to force\n * a particular interpretation of `val`.\n *\n * - when `val` is a bytes-like type, this can be 'string', 'symbol', or\n * 'bytes' to force a particular interpretation\n *\n * As a simple example, `nativeToScVal(\"hello\", {type: 'symbol'})` will\n * return an `scvSymbol`, whereas without the type it would have been an\n * `scvString`.\n *\n * @throws if...\n * - there are arrays with more than one type in them\n * - there are values that do not have a sensible conversion (e.g. random XDR\n * types, custom classes)\n * - the type of the input object (or some inner value of said object) cannot\n * be determined (via `typeof`)\n * - the type you specified (via `opts.type`) is incompatible with the value\n * you passed in (`val`), e.g. `nativeToScVal(\"a string\", { type: 'i128' })`,\n * though this does not apply for types that ignore `opts` (e.g. addresses).\n * @see scValToNative\n *\n * @example\n * ```ts\n * nativeToScVal(1000); // gives ScValType === scvU64\n * nativeToScVal(1000n); // gives ScValType === scvU64\n * nativeToScVal(1n << 100n); // gives ScValType === scvU128\n * nativeToScVal(1000, { type: 'u32' }); // gives ScValType === scvU32\n * nativeToScVal(1000, { type: 'i125' }); // gives ScValType === scvI256\n * nativeToScVal(\"a string\"); // gives ScValType === scvString\n * nativeToScVal(\"a string\", { type: 'symbol' }); // gives scvSymbol\n * nativeToScVal(new Uint8Array(5)); // scvBytes\n * nativeToScVal(new Uint8Array(5), { type: 'symbol' }); // scvSymbol\n * nativeToScVal(null); // scvVoid\n * nativeToScVal(true); // scvBool\n * nativeToScVal([1, 2, 3]); // gives scvVec with each element as scvU64\n * nativeToScVal([1, 2, 3], { type: 'i128' }); // scvVec<scvI128>\n * nativeToScVal([1, '2'], { type: ['i128', 'symbol'] }); // scvVec with diff types\n * nativeToScVal([1, '2', 3], { type: ['i128', 'symbol'] });\n * // scvVec with diff types, using the default when omitted\n * nativeToScVal({ 'hello': 1, 'world': [ true, false ] }, {\n * type: {\n * 'hello': [ 'symbol', 'i128' ],\n * }\n * })\n * // gives scvMap with entries: [\n * // [ scvSymbol, scvI128 ],\n * // [ scvString, scvArray<scvBool> ]\n * // ]\n * ```\n *\n * @example\n * ```ts\n * import {\n * nativeToScVal,\n * scValToNative,\n * ScInt,\n * xdr\n * } from '@stellar/stellar-base';\n *\n * let gigaMap = {\n * bool: true,\n * void: null,\n * u32: xdr.ScVal.scvU32(1),\n * i32: xdr.ScVal.scvI32(1),\n * u64: 1n,\n * i64: -1n,\n * u128: new ScInt(1).toU128(),\n * i128: new ScInt(1).toI128(),\n * u256: new ScInt(1).toU256(),\n * i256: new ScInt(1).toI256(),\n * map: {\n * arbitrary: 1n,\n * nested: 'values',\n * etc: false\n * },\n * vec: ['same', 'type', 'list'],\n * vec: ['diff', 1, 'type', 2, 'list'],\n * };\n *\n * // then, simply:\n * let scv = nativeToScVal(gigaMap); // scv.switch() == xdr.ScValType.scvMap()\n *\n * // then...\n * someContract.call(\"method\", scv);\n *\n * // Similarly, the inverse should work:\n * scValToNative(scv) == gigaMap; // true\n * ```\n */\nexport function nativeToScVal(\n val: unknown,\n opts: NativeToScValOpts = {},\n): xdr.ScVal {\n switch (typeof val) {\n case \"object\": {\n if (val === null) {\n return xdr.ScVal.scvVoid();\n }\n\n if (val instanceof xdr.ScVal) {\n return val; // should we copy?\n }\n\n if (val instanceof Address) {\n return val.toScVal();\n }\n\n if (val instanceof Keypair) {\n return nativeToScVal(val.publicKey(), { type: \"address\" });\n }\n\n if (val instanceof Contract) {\n return val.address().toScVal();\n }\n\n if (val instanceof Uint8Array || Buffer.isBuffer(val)) {\n const copy = Buffer.from(val);\n switch ((opts?.type as string) ?? \"bytes\") {\n case \"bytes\":\n return xdr.ScVal.scvBytes(copy);\n case \"symbol\":\n return xdr.ScVal.scvSymbol(copy);\n case \"string\":\n return xdr.ScVal.scvString(copy);\n default:\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for bytes-like value`,\n );\n }\n }\n\n if (Array.isArray(val)) {\n return xdr.ScVal.scvVec(\n val.map((v: unknown, idx: number) => {\n // There may be different type specifications for each element in\n // the array, so we need to apply those accordingly.\n if (Array.isArray(opts.type)) {\n return nativeToScVal(\n v,\n // only include a `{ type: ... }` if it's present (safer than\n // `{type: undefined}`)\n {\n ...(opts.type.length > idx && {\n type: opts.type[idx] as ScValType,\n }),\n },\n );\n }\n\n // Otherwise apply a generic (or missing) type specifier on it.\n return nativeToScVal(v, opts);\n }),\n );\n }\n\n if (val instanceof Map) {\n // For Maps, `opts.type` can take two forms:\n // - a `[keyType, valType]` pair applied to every entry (keys need not\n // be strings, so a per-key spec can't address them), or\n // - a per-key spec object (like the plain-object form below), which\n // only makes sense when the Map's keys are strings.\n let uniformKeyType: ScValType | null = null;\n let uniformValType: ScValType | null = null;\n let perKeySpec: ScValMapTypeSpec | null = null;\n if (Array.isArray(opts.type)) {\n if (opts.type.length > 2) {\n throw new TypeError(\n `expected a [keyType, valType] pair for a Map, got ${JSON.stringify(opts.type)}`,\n );\n }\n [uniformKeyType = null, uniformValType = null] = opts.type;\n } else if (typeof opts.type === \"object\" && opts.type !== null) {\n perKeySpec = opts.type;\n } else if (opts.type !== undefined) {\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for a Map`,\n );\n }\n\n const entries: xdr.ScMapEntry[] = [];\n for (const [k, v] of val) {\n let keyType = uniformKeyType;\n let valType = uniformValType;\n if (\n perKeySpec &&\n typeof k === \"string\" &&\n Object.hasOwn(perKeySpec, k)\n ) {\n [keyType = null, valType = null] = perKeySpec[k] ?? [];\n }\n entries.push(\n new xdr.ScMapEntry({\n key: nativeToScVal(k, keyType ? { type: keyType } : {}),\n val: nativeToScVal(v, valType ? { type: valType } : {}),\n }),\n );\n }\n return xdr.scvSortedMap(entries);\n }\n\n if (Object.getPrototypeOf(val) !== Object.prototype) {\n throw new TypeError(\n `cannot interpret ${\n val.constructor?.name\n } value as ScVal (${JSON.stringify(val)})`,\n );\n }\n\n const mapTypeSpec = (opts?.type ?? {}) as ScValMapTypeSpec;\n\n return xdr.ScVal.scvMap(\n Object.entries(val as Record<string, unknown>)\n // The Soroban runtime expects maps to have their keys in sorted\n // order, so let's do that here as part of the conversion to prevent\n // confusing error messages on execution.\n .sort(([key1], [key2]) => (key1 < key2 ? -1 : key1 > key2 ? 1 : 0))\n .map(([k, v]) => {\n // the type can be specified with an entry for the key and the value,\n // e.g. val = { 'hello': 1 } and opts.type = { hello: [ 'symbol',\n // 'u128' ]} or you can use `null` for the default interpretation\n const [keyType, valType] = Object.hasOwn(mapTypeSpec, k)\n ? (mapTypeSpec[k] ?? [null, null])\n : [null, null];\n const keyOpts: NativeToScValOpts = keyType ? { type: keyType } : {};\n const valOpts: NativeToScValOpts = valType ? { type: valType } : {};\n\n return new xdr.ScMapEntry({\n key: nativeToScVal(k, keyOpts),\n val: nativeToScVal(v, valOpts),\n });\n }),\n );\n }\n\n case \"number\":\n case \"bigint\": {\n const bigintVal = BigInt(val);\n switch (opts?.type) {\n case \"u32\":\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(val));\n case \"i32\":\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(val));\n\n default:\n break;\n }\n\n return new ScInt(val, { type: opts?.type as ScIntType }).toScVal();\n }\n case \"string\": {\n const optType = (opts?.type as string) ?? \"string\";\n switch (optType) {\n case \"string\":\n return xdr.ScVal.scvString(val);\n\n case \"symbol\":\n return xdr.ScVal.scvSymbol(val);\n\n case \"address\":\n return new Address(val).toScVal();\n\n case \"u32\": {\n const bigintVal = BigInt(val);\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(bigintVal));\n }\n\n case \"i32\": {\n const bigintVal = BigInt(val);\n // TODO: Update this check once xdr.Int32.MIN_VALUE in XDR is properly\n // set to negative. Check this globally.\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(bigintVal));\n }\n\n default:\n if (XdrLargeInt.isType(optType)) {\n return new XdrLargeInt(optType, val).toScVal();\n }\n\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for string value`,\n );\n }\n }\n\n case \"boolean\":\n return xdr.ScVal.scvBool(val);\n\n case \"undefined\":\n return xdr.ScVal.scvVoid();\n\n case \"function\": // FIXME: Is this too helpful?\n return nativeToScVal((val as () => unknown)());\n\n default:\n throw new TypeError(\n `failed to convert typeof ${typeof val} (${JSON.stringify(val)})`,\n );\n }\n}\n\n/**\n * Given a smart contract value, attempt to convert it to a native type.\n * Possible conversions include:\n *\n * - `void` → `null`\n * - `u32`, `i32` → `number`\n * - `u64`, `i64`, `u128`, `i128`, `u256`, `i256`, `timepoint`, `duration` →\n * `bigint`\n * - `vec` → `Array` of any of the above (via recursion)\n * - `map` → key-value object of any of the above (via recursion)\n * - `bool` → `boolean`\n * - `bytes` → `Uint8Array`\n * - `symbol` → `string`\n * - `string` → `string` IF the underlying buffer can be decoded as ascii/utf8,\n * `Uint8Array` of the raw contents in any error case\n *\n * If no viable conversion can be determined, this just \"unwraps\" the smart\n * value to return its underlying XDR value.\n *\n * @param scv - the input smart contract value\n *\n * @see nativeToScVal\n */\n\nexport function scValToNative(scv: xdr.ScVal): any {\n // we use the verbose xdr.ScValType.<type>.value form here because it's faster\n // than string comparisons and the underlying constants never need to be\n // updated\n switch (scv.switch().value) {\n case xdr.ScValType.scvVoid().value:\n return null;\n\n // these can be converted to bigints directly\n case xdr.ScValType.scvU64().value:\n case xdr.ScValType.scvI64().value:\n return (scv.value() as xdr.Int64 | xdr.Uint64).toBigInt();\n\n // these can be parsed by internal abstractions note that this can also\n // handle the above two cases, but it's not as efficient (another\n // type-check, parsing, etc.)\n case xdr.ScValType.scvU128().value:\n case xdr.ScValType.scvI128().value:\n case xdr.ScValType.scvU256().value:\n case xdr.ScValType.scvI256().value:\n return scValToBigInt(scv);\n\n case xdr.ScValType.scvVec().value:\n return (scv.vec() ?? []).map(scValToNative);\n\n case xdr.ScValType.scvAddress().value:\n return Address.fromScVal(scv).toString();\n\n case xdr.ScValType.scvMap().value:\n return Object.fromEntries(\n (scv.map() ?? []).map((entry: xdr.ScMapEntry) => [\n scValToNative(entry.key()),\n scValToNative(entry.val()),\n ]),\n );\n\n // these return the primitive type directly\n case xdr.ScValType.scvBool().value:\n case xdr.ScValType.scvU32().value:\n case xdr.ScValType.scvI32().value:\n case xdr.ScValType.scvBytes().value:\n return scv.value();\n\n // Symbols are limited to [a-zA-Z0-9_]+, so we can safely make ascii strings\n //\n // Strings, however, are \"presented\" as strings and we treat them as such\n // (in other words, string = bytes with a hint that it's text). If the user\n // encoded non-printable bytes in their string value, that's on them.\n //\n // Note that we assume a utf8 encoding (ascii-compatible). For other\n // encodings, you should probably use bytes anyway. If it cannot be decoded,\n // the raw bytes are returned.\n case xdr.ScValType.scvSymbol().value: {\n const v = scv.sym();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n case xdr.ScValType.scvString().value: {\n const v = scv.str();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n\n // these can be converted to bigint\n case xdr.ScValType.scvTimepoint().value:\n case xdr.ScValType.scvDuration().value:\n return (scv.value() as xdr.Uint64).toBigInt();\n\n case xdr.ScValType.scvError().value:\n switch (scv.error().switch().value) {\n // Distinguish errors from the user contract.\n case xdr.ScErrorType.sceContract().value:\n return { type: \"contract\", code: scv.error().contractCode() };\n default: {\n const err = scv.error();\n return {\n type: \"system\",\n code: err.code().value,\n value: err.code().name,\n };\n }\n }\n\n // in the fallthrough case, just return the underlying value directly\n default:\n return scv.value();\n }\n}\n\n/**\n * Build a sorted ScVal map from unsorted entries, sorted by key.\n *\n * @param items - the unsorted map entries\n */\nexport function scvSortedMap(items: xdr.ScMapEntry[]): xdr.ScVal {\n const sorted = Array.from(items).sort((a, b) => {\n // Both a and b are `ScMapEntry`s, so we need to sort by underlying key.\n //\n // We couldn't possibly handle every combination of keys since Soroban\n // maps don't enforce consistent types, so we do a best-effort and try\n // sorting by \"number-like\" or \"string-like.\"\n const nativeA = scValToNative(a.key()) as bigint | number | string;\n const nativeB = scValToNative(b.key()) as bigint | number | string;\n\n switch (typeof nativeA) {\n case \"number\":\n case \"bigint\":\n if (nativeA === nativeB) return 0;\n return nativeA < (nativeB as bigint | number) ? -1 : 1;\n\n default: {\n const strA = nativeA.toString();\n const strB = nativeB.toString();\n return strA < strB ? -1 : strA > strB ? 1 : 0;\n }\n }\n });\n\n return xdr.ScVal.scvMap(sorted);\n}\n\n// Inject a sortable map builder into the xdr module for backwards compatibility.\nxdr.scvSortedMap = scvSortedMap;\n"],"names":["xdr"],"mappings":"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"}
@@ -4,12 +4,51 @@ import { Spec } from "../contract/index.js";
4
4
  */
5
5
  export declare class ClientGenerator {
6
6
  private spec;
7
+ private eventFilterMethodNames;
7
8
  constructor(spec: Spec);
8
9
  /**
9
10
  * Generate client class
10
11
  */
11
12
  generate(): string;
12
13
  private generateImports;
14
+ /**
15
+ * Generate the parseEvent method, which delegates to the underlying Spec
16
+ * to decode a raw event's topics/data into a typed ContractEvent.
17
+ */
18
+ private generateParseEventMethod;
19
+ private parseEventMethodName;
20
+ /**
21
+ * The `<camelCase>EventFilter` method name derived from an event name is
22
+ * not injective (e.g. "FooBar" and "foo_bar" both produce
23
+ * "fooBarEventFilter"), a contract may declare several events with the
24
+ * very same name (composed modules each emitting their own "transfer"),
25
+ * and it can just as easily collide with a generated contract function
26
+ * name (e.g. an event "transfer" plus a function "transferEventFilter").
27
+ * Since function member names are load-bearing (called directly by
28
+ * users) and event filter names are already synthetic, function names
29
+ * always win: they are reserved first, in spec-entry order. Events are
30
+ * then resolved in spec-entry order, appending the smallest integer 2 or
31
+ * greater needed to make the name unique (and reserving whatever name
32
+ * results, so later events see it too). This is deterministic for a
33
+ * given spec.
34
+ */
35
+ private resolveEventFilterMethodNames;
36
+ /**
37
+ * Compute the resolved (possibly disambiguated) filter method name for an
38
+ * event; see {@link resolveEventFilterMethodNames}.
39
+ */
40
+ private eventFilterMethodName;
41
+ /**
42
+ * The resolved (possibly disambiguated) filter method name of every event
43
+ * in the spec, in declaration order. Exposed so callers (e.g. the bindings
44
+ * generator's diagnostics) can report renames and duplicates.
45
+ */
46
+ eventFilterMethodNamesInOrder(): string[];
47
+ /**
48
+ * Generate a per-event helper that builds a topics-filter row for
49
+ * `Api.EventFilter.topics`, suitable for passing to server.getEvents.
50
+ */
51
+ private generateEventFilterMethod;
13
52
  /**
14
53
  * Generate interface method signature
15
54
  */
@@ -1,7 +1,32 @@
1
- import { generateTypeImports, formatImports, sanitizeIdentifier, parseTypeFromTypeDef, formatJSDocComment } from './utils.js';
1
+ import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/int.js';
2
+ import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/hyper.js';
3
+ import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-int.js';
4
+ import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-hyper.js';
5
+ import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/xdr-type.js';
6
+ import 'buffer';
7
+ import types from '../base/generated/curr_generated.js';
8
+ import '@noble/hashes/sha2.js';
9
+ import '../base/signing.js';
10
+ import '../base/keypair.js';
11
+ import 'base32.js';
12
+ import '../base/util/continued_fraction.js';
13
+ import '../base/util/bignumber.js';
14
+ import '../base/transaction_builder.js';
15
+ import '../base/muxed_account.js';
16
+ import '../base/scval.js';
17
+ import '../base/numbers/uint128.js';
18
+ import '../base/numbers/uint256.js';
19
+ import '../base/numbers/int128.js';
20
+ import '../base/numbers/int256.js';
21
+ import { generateTypeImports, formatImports, sanitizeIdentifier, toCamelCase, escapeStringLiteral, parseTypeFromTypeDef, formatJSDocComment } from './utils.js';
2
22
 
3
23
  class ClientGenerator {
4
24
  spec;
25
+ // event index (in declaration order) -> resolved (possibly disambiguated)
26
+ // filter method name. Keyed by index rather than raw name because a
27
+ // contract may declare several events with the same name.
28
+ // Lazily computed on first use; see resolveEventFilterMethodNames().
29
+ eventFilterMethodNames = null;
5
30
  constructor(spec) {
6
31
  this.spec = spec;
7
32
  }
@@ -22,6 +47,13 @@ class ClientGenerator {
22
47
  (entry) => `"${entry.toXDR("base64")}"`
23
48
  );
24
49
  const fromJSON = this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").map((func) => this.generateFromJSONMethod(func)).join(",");
50
+ const events = this.spec.events();
51
+ const parseEventMethodName = this.parseEventMethodName();
52
+ const eventMethods = events.length > 0 ? `
53
+ ${this.generateParseEventMethod(parseEventMethodName)}
54
+ ${events.map(
55
+ (event, eventIndex) => this.generateEventFilterMethod(event, eventIndex)
56
+ ).join("\n")}` : "";
25
57
  return `${imports}
26
58
 
27
59
  export interface Client {
@@ -40,6 +72,7 @@ export class Client extends ContractClient {
40
72
  public readonly fromJSON = {
41
73
  ${fromJSON}
42
74
  };
75
+ ${eventMethods}
43
76
  }`;
44
77
  }
45
78
  generateImports() {
@@ -51,6 +84,25 @@ export class Client extends ContractClient {
51
84
  return defs;
52
85
  })
53
86
  );
87
+ const events = this.spec.events();
88
+ if (events.length > 0) {
89
+ imports.typeFileImports.add("ContractEvent");
90
+ imports.stellarImports.add("xdr");
91
+ events.forEach((event) => {
92
+ const topicParams = event.params().filter(
93
+ (param) => param.location().value === types.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList().value
94
+ );
95
+ topicParams.forEach((param) => {
96
+ const nested = generateTypeImports([param.type()]);
97
+ nested.typeFileImports.forEach((t) => imports.typeFileImports.add(t));
98
+ nested.stellarContractImports.forEach(
99
+ (t) => imports.stellarContractImports.add(t)
100
+ );
101
+ nested.stellarImports.forEach((t) => imports.stellarImports.add(t));
102
+ imports.needsBufferImport = imports.needsBufferImport || nested.needsBufferImport;
103
+ });
104
+ });
105
+ }
54
106
  return formatImports(imports, {
55
107
  includeTypeFileImports: true,
56
108
  // Client imports types
@@ -63,6 +115,124 @@ export class Client extends ContractClient {
63
115
  ]
64
116
  });
65
117
  }
118
+ /**
119
+ * Generate the parseEvent method, which delegates to the underlying Spec
120
+ * to decode a raw event's topics/data into a typed ContractEvent.
121
+ */
122
+ generateParseEventMethod(methodName) {
123
+ return ` /**
124
+ * Parse a raw contract event (topics + data) into a typed {@link ContractEvent}.
125
+ */
126
+ ${methodName}(topics: xdr.ScVal[] | string[], data: xdr.ScVal | string): ContractEvent | undefined {
127
+ return this.spec.parseEvent(topics, data) as ContractEvent | undefined;
128
+ }`;
129
+ }
130
+ parseEventMethodName() {
131
+ const reserved = new Set(
132
+ this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").map((func) => sanitizeIdentifier(func.name().toString()))
133
+ );
134
+ let candidate = "parseEvent";
135
+ let suffix = 2;
136
+ while (reserved.has(candidate)) {
137
+ candidate = `parseEvent${suffix}`;
138
+ suffix += 1;
139
+ }
140
+ return candidate;
141
+ }
142
+ /**
143
+ * The `<camelCase>EventFilter` method name derived from an event name is
144
+ * not injective (e.g. "FooBar" and "foo_bar" both produce
145
+ * "fooBarEventFilter"), a contract may declare several events with the
146
+ * very same name (composed modules each emitting their own "transfer"),
147
+ * and it can just as easily collide with a generated contract function
148
+ * name (e.g. an event "transfer" plus a function "transferEventFilter").
149
+ * Since function member names are load-bearing (called directly by
150
+ * users) and event filter names are already synthetic, function names
151
+ * always win: they are reserved first, in spec-entry order. Events are
152
+ * then resolved in spec-entry order, appending the smallest integer 2 or
153
+ * greater needed to make the name unique (and reserving whatever name
154
+ * results, so later events see it too). This is deterministic for a
155
+ * given spec.
156
+ */
157
+ resolveEventFilterMethodNames() {
158
+ if (this.eventFilterMethodNames !== null) {
159
+ return this.eventFilterMethodNames;
160
+ }
161
+ const reserved = /* @__PURE__ */ new Set();
162
+ this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").forEach((func) => {
163
+ reserved.add(sanitizeIdentifier(func.name().toString()));
164
+ });
165
+ const resolved = /* @__PURE__ */ new Map();
166
+ this.spec.events().forEach((event, eventIndex) => {
167
+ const preferred = `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;
168
+ let candidate = preferred;
169
+ let suffix = 2;
170
+ while (reserved.has(candidate)) {
171
+ candidate = `${preferred}${suffix}`;
172
+ suffix += 1;
173
+ }
174
+ reserved.add(candidate);
175
+ resolved.set(eventIndex, candidate);
176
+ });
177
+ this.eventFilterMethodNames = resolved;
178
+ return resolved;
179
+ }
180
+ /**
181
+ * Compute the resolved (possibly disambiguated) filter method name for an
182
+ * event; see {@link resolveEventFilterMethodNames}.
183
+ */
184
+ eventFilterMethodName(event, eventIndex) {
185
+ const resolved = this.resolveEventFilterMethodNames().get(eventIndex);
186
+ if (resolved === void 0) {
187
+ return `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;
188
+ }
189
+ return resolved;
190
+ }
191
+ /**
192
+ * The resolved (possibly disambiguated) filter method name of every event
193
+ * in the spec, in declaration order. Exposed so callers (e.g. the bindings
194
+ * generator's diagnostics) can report renames and duplicates.
195
+ */
196
+ eventFilterMethodNamesInOrder() {
197
+ return this.spec.events().map(
198
+ (event, eventIndex) => this.eventFilterMethodName(event, eventIndex)
199
+ );
200
+ }
201
+ /**
202
+ * Generate a per-event helper that builds a topics-filter row for
203
+ * `Api.EventFilter.topics`, suitable for passing to server.getEvents.
204
+ */
205
+ generateEventFilterMethod(event, eventIndex) {
206
+ const rawName = event.name().toString();
207
+ const methodName = this.eventFilterMethodName(event, eventIndex);
208
+ const preferredMethodName = `${toCamelCase(sanitizeIdentifier(rawName))}EventFilter`;
209
+ const occurrence = this.spec.events().slice(0, eventIndex).filter((e) => e.name().toString() === rawName).length;
210
+ const occurrenceNote = occurrence > 0 ? ` This targets declaration ${occurrence + 1} of the "${rawName}" event in the contract spec.` : "";
211
+ const renameNote = methodName !== preferredMethodName ? ` Note: renamed from "${preferredMethodName}" to avoid a collision with another generated name.` : "";
212
+ const topicParams = event.params().filter(
213
+ (param) => param.location().value === types.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList().value
214
+ );
215
+ const fields = topicParams.map((param) => {
216
+ const rawParamName = param.name().toString();
217
+ const fieldName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName) ? rawParamName : `"${escapeStringLiteral(rawParamName)}"`;
218
+ const fieldType = parseTypeFromTypeDef(param.type(), true);
219
+ return `${fieldName}?: ${fieldType}`;
220
+ }).join("; ");
221
+ const doc = formatJSDocComment(
222
+ `Build a topics filter row for the "${rawName}" event, for use in \`Api.EventFilter.topics\` when calling \`server.getEvents\`. Omitted fields match any value.${occurrenceNote}${renameNote}`,
223
+ 2
224
+ );
225
+ const escapedName = escapeStringLiteral(rawName);
226
+ const occurrenceArg = occurrence > 0 ? `, ${occurrence}` : "";
227
+ if (topicParams.length === 0) {
228
+ return `${doc} ${methodName}(): string[] {
229
+ return this.spec.eventTopicFilter("${escapedName}"${occurrence > 0 ? `, undefined${occurrenceArg}` : ""});
230
+ }`;
231
+ }
232
+ return `${doc} ${methodName}(topicValues?: { ${fields} }): string[] {
233
+ return this.spec.eventTopicFilter("${escapedName}", topicValues${occurrenceArg});
234
+ }`;
235
+ }
66
236
  /**
67
237
  * Generate interface method signature
68
238
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../../../src/bindings/client.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n formatJSDocComment,\n formatImports,\n} from \"./utils.js\";\n\n/**\n * Generates TypeScript client class for contract methods\n */\nexport class ClientGenerator {\n private spec: Spec;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate client class\n */\n generate(): string {\n // Generate constructor method if it exists\n let deployMethod = \"\";\n try {\n const constructorFunc = this.spec.getFunc(\"__constructor\");\n deployMethod = this.generateDeployMethod(constructorFunc);\n } catch {\n // For specs without a constructor, generate a deploy method without params\n deployMethod = this.generateDeployMethod(undefined);\n }\n // Generate interface methods\n const interfaceMethods = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateInterfaceMethod(func))\n .join(\"\\n\");\n\n const imports = this.generateImports();\n\n const specEntries = this.spec.entries.map(\n (entry) => `\"${entry.toXDR(\"base64\")}\"`,\n );\n\n const fromJSON = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateFromJSONMethod(func))\n .join(\",\");\n\n return `${imports}\n\nexport interface Client {\n${interfaceMethods}\n}\n\nexport class Client extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new Spec([${specEntries.join(\", \")}]),\n options\n );\n }\n\n ${deployMethod}\n public readonly fromJSON = {\n ${fromJSON}\n };\n}`;\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.funcs().flatMap((func) => {\n const inputs = func.inputs();\n const outputs = func.outputs();\n const defs = inputs.map((input) => input.type()).concat(outputs);\n return defs;\n }),\n );\n\n return formatImports(imports, {\n includeTypeFileImports: true, // Client imports types\n additionalStellarContractImports: [\n \"Spec\",\n \"AssembledTransaction\",\n \"Client as ContractClient\",\n \"ClientOptions as ContractClientOptions\",\n \"MethodOptions\",\n ],\n });\n }\n\n /**\n * Generate interface method signature\n */\n private generateInterfaceMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const inputs = func.inputs().map((input: any) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n const docs = formatJSDocComment(func.doc().toString(), 2);\n const params = this.formatMethodParameters(inputs);\n\n return `${docs} ${name}(${params}): Promise<AssembledTransaction<${outputType}>>;`;\n }\n\n private generateFromJSONMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n\n return ` ${name} : this.txFromJSON<${outputType}>`;\n }\n /**\n * Generate deploy method\n */\n private generateDeployMethod(\n constructorFunc: xdr.ScSpecFunctionV0 | undefined,\n ): string {\n // If no constructor, generate deploy with no params\n if (!constructorFunc) {\n const params = this.formatConstructorParameters([]);\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(null, options);\n }`;\n }\n const inputs = constructorFunc.inputs().map((input) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n\n const params = this.formatConstructorParameters(inputs);\n const inputsDestructure =\n inputs.length > 0 ? `{ ${inputs.map((i) => i.name).join(\", \")} }, ` : \"\";\n\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(${inputsDestructure}options);\n }`;\n }\n\n /**\n * Format method parameters\n */\n private formatMethodParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\"options?: MethodOptions\");\n\n return params.join(\", \");\n }\n\n /**\n * Format constructor parameters\n */\n private formatConstructorParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\n 'options: MethodOptions & Omit<ContractClientOptions, \\'contractId\\'> & { wasmHash: Buffer | string; salt?: Buffer | Uint8Array; format?: \"hex\" | \"base64\"; address?: string; }',\n );\n\n return params.join(\", \");\n }\n}\n"],"names":["params"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sources":["../../../src/bindings/client.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n escapeStringLiteral,\n formatJSDocComment,\n formatImports,\n toCamelCase,\n} from \"./utils.js\";\n\n/**\n * Generates TypeScript client class for contract methods\n */\nexport class ClientGenerator {\n private spec: Spec;\n\n // event index (in declaration order) -> resolved (possibly disambiguated)\n // filter method name. Keyed by index rather than raw name because a\n // contract may declare several events with the same name.\n // Lazily computed on first use; see resolveEventFilterMethodNames().\n private eventFilterMethodNames: Map<number, string> | null = null;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate client class\n */\n generate(): string {\n // Generate constructor method if it exists\n let deployMethod = \"\";\n try {\n const constructorFunc = this.spec.getFunc(\"__constructor\");\n deployMethod = this.generateDeployMethod(constructorFunc);\n } catch {\n // For specs without a constructor, generate a deploy method without params\n deployMethod = this.generateDeployMethod(undefined);\n }\n // Generate interface methods\n const interfaceMethods = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateInterfaceMethod(func))\n .join(\"\\n\");\n\n const imports = this.generateImports();\n\n const specEntries = this.spec.entries.map(\n (entry) => `\"${entry.toXDR(\"base64\")}\"`,\n );\n\n const fromJSON = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateFromJSONMethod(func))\n .join(\",\");\n\n const events = this.spec.events();\n const parseEventMethodName = this.parseEventMethodName();\n const eventMethods =\n events.length > 0\n ? `\\n${this.generateParseEventMethod(parseEventMethodName)}\\n${events\n .map((event, eventIndex) =>\n this.generateEventFilterMethod(event, eventIndex),\n )\n .join(\"\\n\")}`\n : \"\";\n\n return `${imports}\n\nexport interface Client {\n${interfaceMethods}\n}\n\nexport class Client extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new Spec([${specEntries.join(\", \")}]),\n options\n );\n }\n\n ${deployMethod}\n public readonly fromJSON = {\n ${fromJSON}\n };\n${eventMethods}\n}`;\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.funcs().flatMap((func) => {\n const inputs = func.inputs();\n const outputs = func.outputs();\n const defs = inputs.map((input) => input.type()).concat(outputs);\n return defs;\n }),\n );\n\n const events = this.spec.events();\n if (events.length > 0) {\n // parseEvent()'s return type is the ContractEvent union\n imports.typeFileImports.add(\"ContractEvent\");\n // parseEvent()'s topics/data parameters are typed using xdr.ScVal\n imports.stellarImports.add(\"xdr\");\n // Event filter helpers reference topic-list param types only; data\n // param types appear only in types.ts\n events.forEach((event) => {\n const topicParams = event\n .params()\n .filter(\n (param) =>\n param.location().value ===\n xdr.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList()\n .value,\n );\n topicParams.forEach((param) => {\n const nested = generateTypeImports([param.type()]);\n nested.typeFileImports.forEach((t) => imports.typeFileImports.add(t));\n nested.stellarContractImports.forEach((t) =>\n imports.stellarContractImports.add(t),\n );\n nested.stellarImports.forEach((t) => imports.stellarImports.add(t));\n imports.needsBufferImport =\n imports.needsBufferImport || nested.needsBufferImport;\n });\n });\n }\n\n return formatImports(imports, {\n includeTypeFileImports: true, // Client imports types\n additionalStellarContractImports: [\n \"Spec\",\n \"AssembledTransaction\",\n \"Client as ContractClient\",\n \"ClientOptions as ContractClientOptions\",\n \"MethodOptions\",\n ],\n });\n }\n\n /**\n * Generate the parseEvent method, which delegates to the underlying Spec\n * to decode a raw event's topics/data into a typed ContractEvent.\n */\n private generateParseEventMethod(methodName: string): string {\n return ` /**\n * Parse a raw contract event (topics + data) into a typed {@link ContractEvent}.\n */\n ${methodName}(topics: xdr.ScVal[] | string[], data: xdr.ScVal | string): ContractEvent | undefined {\n return this.spec.parseEvent(topics, data) as ContractEvent | undefined;\n }`;\n }\n\n private parseEventMethodName(): string {\n const reserved = new Set(\n this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => sanitizeIdentifier(func.name().toString())),\n );\n let candidate = \"parseEvent\";\n let suffix = 2;\n while (reserved.has(candidate)) {\n candidate = `parseEvent${suffix}`;\n suffix += 1;\n }\n return candidate;\n }\n\n /**\n * The `<camelCase>EventFilter` method name derived from an event name is\n * not injective (e.g. \"FooBar\" and \"foo_bar\" both produce\n * \"fooBarEventFilter\"), a contract may declare several events with the\n * very same name (composed modules each emitting their own \"transfer\"),\n * and it can just as easily collide with a generated contract function\n * name (e.g. an event \"transfer\" plus a function \"transferEventFilter\").\n * Since function member names are load-bearing (called directly by\n * users) and event filter names are already synthetic, function names\n * always win: they are reserved first, in spec-entry order. Events are\n * then resolved in spec-entry order, appending the smallest integer 2 or\n * greater needed to make the name unique (and reserving whatever name\n * results, so later events see it too). This is deterministic for a\n * given spec.\n */\n private resolveEventFilterMethodNames(): Map<number, string> {\n if (this.eventFilterMethodNames !== null) {\n return this.eventFilterMethodNames;\n }\n\n const reserved = new Set<string>();\n\n this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .forEach((func) => {\n reserved.add(sanitizeIdentifier(func.name().toString()));\n });\n\n const resolved = new Map<number, string>();\n\n this.spec.events().forEach((event, eventIndex) => {\n const preferred = `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;\n\n let candidate = preferred;\n let suffix = 2;\n while (reserved.has(candidate)) {\n candidate = `${preferred}${suffix}`;\n suffix += 1;\n }\n\n reserved.add(candidate);\n resolved.set(eventIndex, candidate);\n });\n\n this.eventFilterMethodNames = resolved;\n return resolved;\n }\n\n /**\n * Compute the resolved (possibly disambiguated) filter method name for an\n * event; see {@link resolveEventFilterMethodNames}.\n */\n private eventFilterMethodName(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): string {\n const resolved = this.resolveEventFilterMethodNames().get(eventIndex);\n /* istanbul ignore next -- every event in the spec is reserved a name */\n if (resolved === undefined) {\n return `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;\n }\n return resolved;\n }\n\n /**\n * The resolved (possibly disambiguated) filter method name of every event\n * in the spec, in declaration order. Exposed so callers (e.g. the bindings\n * generator's diagnostics) can report renames and duplicates.\n */\n eventFilterMethodNamesInOrder(): string[] {\n return this.spec\n .events()\n .map((event, eventIndex) =>\n this.eventFilterMethodName(event, eventIndex),\n );\n }\n\n /**\n * Generate a per-event helper that builds a topics-filter row for\n * `Api.EventFilter.topics`, suitable for passing to server.getEvents.\n */\n private generateEventFilterMethod(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): string {\n const rawName = event.name().toString();\n const methodName = this.eventFilterMethodName(event, eventIndex);\n const preferredMethodName = `${toCamelCase(sanitizeIdentifier(rawName))}EventFilter`;\n // Which same-named event this is (0-based, declaration order) — needed\n // so eventTopicFilter targets the right spec when names are duplicated.\n const occurrence = this.spec\n .events()\n .slice(0, eventIndex)\n .filter((e) => e.name().toString() === rawName).length;\n const occurrenceNote =\n occurrence > 0\n ? ` This targets declaration ${occurrence + 1} of the \"${rawName}\" event in the contract spec.`\n : \"\";\n const renameNote =\n methodName !== preferredMethodName\n ? ` Note: renamed from \"${preferredMethodName}\" to avoid a collision with another generated name.`\n : \"\";\n const topicParams = event\n .params()\n .filter(\n (param) =>\n param.location().value ===\n xdr.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList()\n .value,\n );\n\n // eventTopicFilter looks values up by the raw param names, so the\n // parameter type must use them too — quoted when they aren't valid\n // identifiers.\n const fields = topicParams\n .map((param) => {\n const rawParamName = param.name().toString();\n const fieldName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName)\n ? rawParamName\n : `\"${escapeStringLiteral(rawParamName)}\"`;\n const fieldType = parseTypeFromTypeDef(param.type(), true);\n return `${fieldName}?: ${fieldType}`;\n })\n .join(\"; \");\n\n const doc = formatJSDocComment(\n `Build a topics filter row for the \"${rawName}\" event, for use in ` +\n `\\`Api.EventFilter.topics\\` when calling \\`server.getEvents\\`. ` +\n `Omitted fields match any value.${occurrenceNote}${renameNote}`,\n 2,\n );\n\n const escapedName = escapeStringLiteral(rawName);\n const occurrenceArg = occurrence > 0 ? `, ${occurrence}` : \"\";\n\n if (topicParams.length === 0) {\n return `${doc} ${methodName}(): string[] {\n return this.spec.eventTopicFilter(\"${escapedName}\"${occurrence > 0 ? `, undefined${occurrenceArg}` : \"\"});\n }`;\n }\n\n return `${doc} ${methodName}(topicValues?: { ${fields} }): string[] {\n return this.spec.eventTopicFilter(\"${escapedName}\", topicValues${occurrenceArg});\n }`;\n }\n\n /**\n * Generate interface method signature\n */\n private generateInterfaceMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const inputs = func.inputs().map((input: any) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n const docs = formatJSDocComment(func.doc().toString(), 2);\n const params = this.formatMethodParameters(inputs);\n\n return `${docs} ${name}(${params}): Promise<AssembledTransaction<${outputType}>>;`;\n }\n\n private generateFromJSONMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n\n return ` ${name} : this.txFromJSON<${outputType}>`;\n }\n /**\n * Generate deploy method\n */\n private generateDeployMethod(\n constructorFunc: xdr.ScSpecFunctionV0 | undefined,\n ): string {\n // If no constructor, generate deploy with no params\n if (!constructorFunc) {\n const params = this.formatConstructorParameters([]);\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(null, options);\n }`;\n }\n const inputs = constructorFunc.inputs().map((input) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n\n const params = this.formatConstructorParameters(inputs);\n const inputsDestructure =\n inputs.length > 0 ? `{ ${inputs.map((i) => i.name).join(\", \")} }, ` : \"\";\n\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(${inputsDestructure}options);\n }`;\n }\n\n /**\n * Format method parameters\n */\n private formatMethodParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\"options?: MethodOptions\");\n\n return params.join(\", \");\n }\n\n /**\n * Format constructor parameters\n */\n private formatConstructorParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\n 'options: MethodOptions & Omit<ContractClientOptions, \\'contractId\\'> & { wasmHash: Buffer | string; salt?: Buffer | Uint8Array; format?: \"hex\" | \"base64\"; address?: string; }',\n );\n\n return params.join(\", \");\n }\n}\n"],"names":["xdr","params"],"mappings":"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"}
@@ -26,7 +26,7 @@ class ConfigGenerator {
26
26
  build: "tsc"
27
27
  },
28
28
  dependencies: {
29
- "@stellar/stellar-sdk": `^${"16.0.1"}`,
29
+ "@stellar/stellar-sdk": `^${"16.2.0"}`,
30
30
  buffer: "6.0.3"
31
31
  },
32
32
  devDependencies: {
@@ -10,6 +10,28 @@ export type GenerateOptions = {
10
10
  */
11
11
  contractName: string;
12
12
  };
13
+ /**
14
+ * A note about an event whose generated names need the user's attention:
15
+ * either the contract declares the same event name more than once, or the
16
+ * generated names were renamed away from their preferred form to avoid a
17
+ * collision with another generated name.
18
+ */
19
+ export type EventDiagnostic = {
20
+ /** The event name exactly as declared in the contract spec */
21
+ rawName: string;
22
+ /** 0-based index of this declaration among same-named events */
23
+ occurrence: number;
24
+ /** Total number of declarations of this raw name in the spec */
25
+ declarations: number;
26
+ /** The exported interface name generated in types.ts */
27
+ interfaceName: string;
28
+ /** The filter method name generated on the Client class */
29
+ filterMethodName: string;
30
+ /** True if the interface name differs from its preferred form */
31
+ interfaceRenamed: boolean;
32
+ /** True if the filter method name differs from its preferred form */
33
+ filterMethodRenamed: boolean;
34
+ };
13
35
  /**
14
36
  * The output of the binding generation process.
15
37
  *
@@ -31,6 +53,11 @@ export type GeneratedBindings = {
31
53
  readme: string;
32
54
  /** The .gitignore file for the generated package */
33
55
  gitignore: string;
56
+ /**
57
+ * Notes about events whose generated names need attention (duplicate
58
+ * declarations or collision-driven renames); empty when there are none
59
+ */
60
+ diagnostics: EventDiagnostic[];
34
61
  };
35
62
  /**
36
63
  * Generates TypeScript bindings for Stellar smart contracts.
@@ -182,6 +209,13 @@ export declare class BindingGenerator {
182
209
  * ```
183
210
  */
184
211
  generate(options: GenerateOptions): GeneratedBindings;
212
+ /**
213
+ * Collect an {@link EventDiagnostic} for every event that a user should
214
+ * review in the generated output: duplicate declarations of the same raw
215
+ * name, and generated names renamed away from their preferred form to
216
+ * avoid a collision.
217
+ */
218
+ private eventDiagnostics;
185
219
  /**
186
220
  * Validates that required generation options are provided.
187
221
  *
@@ -1,25 +1,12 @@
1
1
  import 'buffer';
2
- import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/int.js';
3
- import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/hyper.js';
4
- import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-int.js';
5
- import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-hyper.js';
6
- import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/xdr-type.js';
7
2
  import '../base/generated/curr_generated.js';
8
- import '@noble/hashes/sha2.js';
9
- import '../base/signing.js';
10
3
  import '../base/keypair.js';
11
4
  import 'base32.js';
12
- import '../base/util/continued_fraction.js';
13
- import '../base/util/bignumber.js';
14
- import '../base/transaction_builder.js';
15
- import '../base/muxed_account.js';
5
+ import '@noble/hashes/sha2.js';
16
6
  import '../base/scval.js';
17
- import '../base/numbers/uint128.js';
18
- import '../base/numbers/uint256.js';
19
- import '../base/numbers/int128.js';
20
- import '../base/numbers/int256.js';
21
7
  import '../rpc/api.js';
22
8
  import { Spec } from '../contract/spec.js';
9
+ import { sanitizeIdentifier, toPascalCase, toCamelCase } from './utils.js';
23
10
  import { ConfigGenerator } from './config.js';
24
11
  import { TypeGenerator } from './types.js';
25
12
  import { ClientGenerator } from './client.js';
@@ -168,6 +155,7 @@ class BindingGenerator {
168
155
  const clientGenerator = new ClientGenerator(this.spec);
169
156
  const types = typeGenerator.generate();
170
157
  const client = clientGenerator.generate();
158
+ const diagnostics = this.eventDiagnostics(typeGenerator, clientGenerator);
171
159
  let index = `export { Client } from "./client.js";`;
172
160
  if (types.trim() !== "") {
173
161
  index = index.concat(`
@@ -182,9 +170,50 @@ export * from "./types.js";`);
182
170
  packageJson,
183
171
  tsConfig,
184
172
  readme,
185
- gitignore
173
+ gitignore,
174
+ diagnostics
186
175
  };
187
176
  }
177
+ /**
178
+ * Collect an {@link EventDiagnostic} for every event that a user should
179
+ * review in the generated output: duplicate declarations of the same raw
180
+ * name, and generated names renamed away from their preferred form to
181
+ * avoid a collision.
182
+ */
183
+ eventDiagnostics(typeGenerator, clientGenerator) {
184
+ const events = this.spec.events();
185
+ const interfaceNames = typeGenerator.eventInterfaceNamesInOrder();
186
+ const filterMethodNames = clientGenerator.eventFilterMethodNamesInOrder();
187
+ const declarationCounts = /* @__PURE__ */ new Map();
188
+ events.forEach((event) => {
189
+ const rawName = event.name().toString();
190
+ declarationCounts.set(rawName, (declarationCounts.get(rawName) ?? 0) + 1);
191
+ });
192
+ const occurrenceSoFar = /* @__PURE__ */ new Map();
193
+ return events.flatMap((event, eventIndex) => {
194
+ const rawName = event.name().toString();
195
+ const occurrence = occurrenceSoFar.get(rawName) ?? 0;
196
+ occurrenceSoFar.set(rawName, occurrence + 1);
197
+ const declarations = declarationCounts.get(rawName);
198
+ const sanitized = sanitizeIdentifier(rawName);
199
+ const interfaceRenamed = interfaceNames[eventIndex] !== `${toPascalCase(sanitized)}Event`;
200
+ const filterMethodRenamed = filterMethodNames[eventIndex] !== `${toCamelCase(sanitized)}EventFilter`;
201
+ if (declarations <= 1 && !interfaceRenamed && !filterMethodRenamed) {
202
+ return [];
203
+ }
204
+ return [
205
+ {
206
+ rawName,
207
+ occurrence,
208
+ declarations,
209
+ interfaceName: interfaceNames[eventIndex],
210
+ filterMethodName: filterMethodNames[eventIndex],
211
+ interfaceRenamed,
212
+ filterMethodRenamed
213
+ }
214
+ ];
215
+ });
216
+ }
188
217
  /**
189
218
  * Validates that required generation options are provided.
190
219
  *