@helios-lang/effect 0.1.15 → 0.3.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 (399) hide show
  1. package/dist/Cardano/CoinSelection.js +130 -0
  2. package/dist/Cardano/CoinSelection.js.map +1 -0
  3. package/dist/{Ledger → Cardano/Ledger}/Address.js +31 -21
  4. package/dist/Cardano/Ledger/Address.js.map +1 -0
  5. package/dist/{Ledger → Cardano/Ledger}/AssetClass.js +16 -11
  6. package/dist/Cardano/Ledger/AssetClass.js.map +1 -0
  7. package/dist/Cardano/Ledger/Assets.js +235 -0
  8. package/dist/Cardano/Ledger/Assets.js.map +1 -0
  9. package/dist/Cardano/Ledger/Credential.js +53 -0
  10. package/dist/Cardano/Ledger/Credential.js.map +1 -0
  11. package/dist/Cardano/Ledger/DCert.js +117 -0
  12. package/dist/Cardano/Ledger/DCert.js.map +1 -0
  13. package/dist/Cardano/Ledger/DatumHash.js +25 -0
  14. package/dist/Cardano/Ledger/DatumHash.js.map +1 -0
  15. package/dist/Cardano/Ledger/MintingPolicy.js +40 -0
  16. package/dist/Cardano/Ledger/MintingPolicy.js.map +1 -0
  17. package/dist/Cardano/Ledger/NativeScript.js +140 -0
  18. package/dist/Cardano/Ledger/NativeScript.js.map +1 -0
  19. package/dist/Cardano/Ledger/PubKey.js +24 -0
  20. package/dist/Cardano/Ledger/PubKey.js.map +1 -0
  21. package/dist/{Ledger → Cardano/Ledger}/PubKeyHash.js +5 -5
  22. package/dist/Cardano/Ledger/PubKeyHash.js.map +1 -0
  23. package/dist/Cardano/Ledger/Redeemer.js +155 -0
  24. package/dist/Cardano/Ledger/Redeemer.js.map +1 -0
  25. package/dist/Cardano/Ledger/RewardAddress.js +93 -0
  26. package/dist/Cardano/Ledger/RewardAddress.js.map +1 -0
  27. package/dist/Cardano/Ledger/Signature.js +23 -0
  28. package/dist/Cardano/Ledger/Signature.js.map +1 -0
  29. package/dist/Cardano/Ledger/Tx.js +498 -0
  30. package/dist/Cardano/Ledger/Tx.js.map +1 -0
  31. package/dist/Cardano/Ledger/TxHash.js +38 -0
  32. package/dist/Cardano/Ledger/TxHash.js.map +1 -0
  33. package/dist/Cardano/Ledger/TxOutput.js +167 -0
  34. package/dist/Cardano/Ledger/TxOutput.js.map +1 -0
  35. package/dist/{Ledger → Cardano/Ledger}/TxOutputDatum.js +44 -8
  36. package/dist/Cardano/Ledger/TxOutputDatum.js.map +1 -0
  37. package/dist/Cardano/Ledger/UTxO.js +100 -0
  38. package/dist/Cardano/Ledger/UTxO.js.map +1 -0
  39. package/dist/{Ledger → Cardano/Ledger}/UTxORef.js +28 -6
  40. package/dist/Cardano/Ledger/UTxORef.js.map +1 -0
  41. package/dist/{Ledger → Cardano/Ledger}/ValidatorHash.js +5 -5
  42. package/dist/Cardano/Ledger/ValidatorHash.js.map +1 -0
  43. package/dist/{Ledger → Cardano/Ledger}/index.js +6 -0
  44. package/dist/Cardano/Ledger/index.js.map +1 -0
  45. package/dist/Cardano/Network/IsMainnet.js.map +1 -0
  46. package/dist/{Network → Cardano/Network}/Params.js +27 -3
  47. package/dist/Cardano/Network/Params.js.map +1 -0
  48. package/dist/Cardano/Network/UTxO.js +20 -0
  49. package/dist/Cardano/Network/UTxO.js.map +1 -0
  50. package/dist/Cardano/Network/UTxOsAt.js +4 -0
  51. package/dist/Cardano/Network/UTxOsAt.js.map +1 -0
  52. package/dist/Cardano/Network/errors.js +33 -0
  53. package/dist/Cardano/Network/errors.js.map +1 -0
  54. package/dist/{Network → Cardano/Network}/index.js +1 -0
  55. package/dist/Cardano/Network/index.js.map +1 -0
  56. package/dist/Cardano/TxBuilder.js +963 -0
  57. package/dist/Cardano/TxBuilder.js.map +1 -0
  58. package/dist/Cardano/Uplc/Builtins.js +1820 -0
  59. package/dist/Cardano/Uplc/Builtins.js.map +1 -0
  60. package/dist/Cardano/Uplc/Cek.js +716 -0
  61. package/dist/Cardano/Uplc/Cek.js.map +1 -0
  62. package/dist/Cardano/Uplc/Cost.js +956 -0
  63. package/dist/Cardano/Uplc/Cost.js.map +1 -0
  64. package/dist/{Uplc → Cardano/Uplc}/Data.js +143 -22
  65. package/dist/Cardano/Uplc/Data.js.map +1 -0
  66. package/dist/Cardano/Uplc/Script.js +118 -0
  67. package/dist/Cardano/Uplc/Script.js.map +1 -0
  68. package/dist/Cardano/Uplc/ScriptContext.js +259 -0
  69. package/dist/Cardano/Uplc/ScriptContext.js.map +1 -0
  70. package/dist/Cardano/Uplc/Term.js +384 -0
  71. package/dist/Cardano/Uplc/Term.js.map +1 -0
  72. package/dist/Cardano/Uplc/Type.js +131 -0
  73. package/dist/Cardano/Uplc/Type.js.map +1 -0
  74. package/dist/Cardano/Uplc/Value.js +315 -0
  75. package/dist/Cardano/Uplc/Value.js.map +1 -0
  76. package/dist/Cardano/Uplc/index.js +7 -0
  77. package/dist/Cardano/Uplc/index.js.map +1 -0
  78. package/dist/Cardano/Wallet.js +48 -0
  79. package/dist/Cardano/Wallet.js.map +1 -0
  80. package/dist/Cardano/index.js +7 -0
  81. package/dist/Cardano/index.js.map +1 -0
  82. package/dist/{internal → Codecs}/Base32.js +2 -2
  83. package/dist/Codecs/Base32.js.map +1 -0
  84. package/dist/{Bech32.js → Codecs/Bech32.js} +2 -2
  85. package/dist/Codecs/Bech32.js.map +1 -0
  86. package/dist/Codecs/BigEndian.js.map +1 -0
  87. package/dist/Codecs/Bits.js.map +1 -0
  88. package/dist/{internal → Codecs}/Bytes.js +23 -12
  89. package/dist/Codecs/Bytes.js.map +1 -0
  90. package/dist/{Cbor.js → Codecs/Cbor.js} +559 -328
  91. package/dist/Codecs/Cbor.js.map +1 -0
  92. package/dist/{internal → Codecs}/Flat.js +16 -0
  93. package/dist/Codecs/Flat.js.map +1 -0
  94. package/dist/Codecs/Float.js.map +1 -0
  95. package/dist/Codecs/LittleEndian.js +31 -0
  96. package/dist/Codecs/LittleEndian.js.map +1 -0
  97. package/dist/Codecs/Uint64.js +89 -0
  98. package/dist/Codecs/Uint64.js.map +1 -0
  99. package/dist/{internal → Codecs}/Utf8.js +7 -2
  100. package/dist/Codecs/Utf8.js.map +1 -0
  101. package/dist/Codecs/ZigZag.js +26 -0
  102. package/dist/Codecs/ZigZag.js.map +1 -0
  103. package/dist/Codecs/index.js +8 -0
  104. package/dist/Codecs/index.js.map +1 -0
  105. package/dist/Crypto/Bip32.js +131 -0
  106. package/dist/Crypto/Bip32.js.map +1 -0
  107. package/dist/Crypto/Bip39.js +2176 -0
  108. package/dist/Crypto/Bip39.js.map +1 -0
  109. package/dist/Crypto/Blake2b.js +156 -0
  110. package/dist/Crypto/Blake2b.js.map +1 -0
  111. package/dist/Crypto/Curve.js +92 -0
  112. package/dist/Crypto/Curve.js.map +1 -0
  113. package/dist/Crypto/Ed25519.js +323 -0
  114. package/dist/Crypto/Ed25519.js.map +1 -0
  115. package/dist/Crypto/EdDSA.js +222 -0
  116. package/dist/Crypto/EdDSA.js.map +1 -0
  117. package/dist/Crypto/Field.js +323 -0
  118. package/dist/Crypto/Field.js.map +1 -0
  119. package/dist/Crypto/Hmac.js +51 -0
  120. package/dist/Crypto/Hmac.js.map +1 -0
  121. package/dist/Crypto/Keccak.js +167 -0
  122. package/dist/Crypto/Keccak.js.map +1 -0
  123. package/dist/Crypto/Pbkdf2.js +45 -0
  124. package/dist/Crypto/Pbkdf2.js.map +1 -0
  125. package/dist/Crypto/Sha2_256.js +200 -0
  126. package/dist/Crypto/Sha2_256.js.map +1 -0
  127. package/dist/Crypto/Sha2_512.js +264 -0
  128. package/dist/Crypto/Sha2_512.js.map +1 -0
  129. package/dist/Crypto/Sha3_256.js +10 -0
  130. package/dist/Crypto/Sha3_256.js.map +1 -0
  131. package/dist/Crypto/errors.js +9 -0
  132. package/dist/Crypto/errors.js.map +1 -0
  133. package/dist/Crypto/index.js +12 -0
  134. package/dist/Crypto/index.js.map +1 -0
  135. package/dist/index.js +3 -5
  136. package/dist/index.js.map +1 -1
  137. package/package.json +24 -6
  138. package/tsconfig.build.json +1 -1
  139. package/types/Cardano/CoinSelection.d.ts +26 -0
  140. package/types/Cardano/CoinSelection.d.ts.map +1 -0
  141. package/types/{Ledger → Cardano/Ledger}/Address.d.ts +8 -7
  142. package/types/Cardano/Ledger/Address.d.ts.map +1 -0
  143. package/types/{Ledger → Cardano/Ledger}/AssetClass.d.ts +2 -2
  144. package/types/Cardano/Ledger/AssetClass.d.ts.map +1 -0
  145. package/types/Cardano/Ledger/Assets.d.ts +114 -0
  146. package/types/Cardano/Ledger/Assets.d.ts.map +1 -0
  147. package/types/{Ledger → Cardano/Ledger}/Credential.d.ts +10 -4
  148. package/types/Cardano/Ledger/Credential.d.ts.map +1 -0
  149. package/types/Cardano/Ledger/DCert.d.ts +40 -0
  150. package/types/Cardano/Ledger/DCert.d.ts.map +1 -0
  151. package/types/{Ledger → Cardano/Ledger}/DatumHash.d.ts +6 -5
  152. package/types/Cardano/Ledger/DatumHash.d.ts.map +1 -0
  153. package/types/{Ledger → Cardano/Ledger}/MintingPolicy.d.ts +11 -8
  154. package/types/Cardano/Ledger/MintingPolicy.d.ts.map +1 -0
  155. package/types/Cardano/Ledger/NativeScript.d.ts +105 -0
  156. package/types/Cardano/Ledger/NativeScript.d.ts.map +1 -0
  157. package/types/Cardano/Ledger/PubKey.d.ts +45 -0
  158. package/types/Cardano/Ledger/PubKey.d.ts.map +1 -0
  159. package/types/{Ledger → Cardano/Ledger}/PubKeyHash.d.ts +5 -5
  160. package/types/Cardano/Ledger/PubKeyHash.d.ts.map +1 -0
  161. package/types/Cardano/Ledger/Redeemer.d.ts +303 -0
  162. package/types/Cardano/Ledger/Redeemer.d.ts.map +1 -0
  163. package/types/Cardano/Ledger/RewardAddress.d.ts +60 -0
  164. package/types/Cardano/Ledger/RewardAddress.d.ts.map +1 -0
  165. package/types/Cardano/Ledger/Signature.d.ts +13 -0
  166. package/types/Cardano/Ledger/Signature.d.ts.map +1 -0
  167. package/types/Cardano/Ledger/Tx.d.ts +375 -0
  168. package/types/Cardano/Ledger/Tx.d.ts.map +1 -0
  169. package/types/{Ledger → Cardano/Ledger}/TxHash.d.ts +35 -5
  170. package/types/Cardano/Ledger/TxHash.d.ts.map +1 -0
  171. package/types/Cardano/Ledger/TxOutput.d.ts +438 -0
  172. package/types/Cardano/Ledger/TxOutput.d.ts.map +1 -0
  173. package/types/Cardano/Ledger/TxOutputDatum.d.ts +98 -0
  174. package/types/Cardano/Ledger/TxOutputDatum.d.ts.map +1 -0
  175. package/types/Cardano/Ledger/UTxO.d.ts +1420 -0
  176. package/types/Cardano/Ledger/UTxO.d.ts.map +1 -0
  177. package/types/Cardano/Ledger/UTxORef.d.ts +222 -0
  178. package/types/Cardano/Ledger/UTxORef.d.ts.map +1 -0
  179. package/types/{Ledger → Cardano/Ledger}/ValidatorHash.d.ts +5 -5
  180. package/types/Cardano/Ledger/ValidatorHash.d.ts.map +1 -0
  181. package/types/{Ledger → Cardano/Ledger}/index.d.ts +6 -0
  182. package/types/Cardano/Ledger/index.d.ts.map +1 -0
  183. package/types/Cardano/Network/IsMainnet.d.ts.map +1 -0
  184. package/types/{Network → Cardano/Network}/Params.d.ts +32 -4
  185. package/types/Cardano/Network/Params.d.ts.map +1 -0
  186. package/types/Cardano/Network/UTxO.d.ts +15 -0
  187. package/types/Cardano/Network/UTxO.d.ts.map +1 -0
  188. package/types/Cardano/Network/UTxOsAt.d.ts +9 -0
  189. package/types/Cardano/Network/UTxOsAt.d.ts.map +1 -0
  190. package/types/Cardano/Network/errors.d.ts +39 -0
  191. package/types/Cardano/Network/errors.d.ts.map +1 -0
  192. package/types/{Network → Cardano/Network}/index.d.ts +1 -0
  193. package/types/Cardano/Network/index.d.ts.map +1 -0
  194. package/types/Cardano/TxBuilder.d.ts +232 -0
  195. package/types/Cardano/TxBuilder.d.ts.map +1 -0
  196. package/types/Cardano/Uplc/Builtins.d.ts +163 -0
  197. package/types/Cardano/Uplc/Builtins.d.ts.map +1 -0
  198. package/types/Cardano/Uplc/Cek.d.ts +165 -0
  199. package/types/Cardano/Uplc/Cek.d.ts.map +1 -0
  200. package/types/Cardano/Uplc/Cost.d.ts +93 -0
  201. package/types/Cardano/Uplc/Cost.d.ts.map +1 -0
  202. package/types/{Uplc → Cardano/Uplc}/Data.d.ts +149 -15
  203. package/types/Cardano/Uplc/Data.d.ts.map +1 -0
  204. package/types/Cardano/Uplc/Script.d.ts +87 -0
  205. package/types/Cardano/Uplc/Script.d.ts.map +1 -0
  206. package/types/Cardano/Uplc/ScriptContext.d.ts +21 -0
  207. package/types/Cardano/Uplc/ScriptContext.d.ts.map +1 -0
  208. package/types/Cardano/Uplc/Term.d.ts +454 -0
  209. package/types/Cardano/Uplc/Term.d.ts.map +1 -0
  210. package/types/Cardano/Uplc/Type.d.ts +29 -0
  211. package/types/Cardano/Uplc/Type.d.ts.map +1 -0
  212. package/types/Cardano/Uplc/Value.d.ts +152 -0
  213. package/types/Cardano/Uplc/Value.d.ts.map +1 -0
  214. package/types/Cardano/Uplc/index.d.ts +7 -0
  215. package/types/Cardano/Uplc/index.d.ts.map +1 -0
  216. package/types/Cardano/Wallet.d.ts +73 -0
  217. package/types/Cardano/Wallet.d.ts.map +1 -0
  218. package/types/Cardano/index.d.ts +7 -0
  219. package/types/Cardano/index.d.ts.map +1 -0
  220. package/types/Codecs/Base32.d.ts.map +1 -0
  221. package/types/Codecs/Bech32.d.ts.map +1 -0
  222. package/types/Codecs/BigEndian.d.ts.map +1 -0
  223. package/types/Codecs/Bits.d.ts.map +1 -0
  224. package/types/{internal → Codecs}/Bytes.d.ts +7 -6
  225. package/types/Codecs/Bytes.d.ts.map +1 -0
  226. package/types/{Cbor.d.ts → Codecs/Cbor.d.ts} +77 -55
  227. package/types/Codecs/Cbor.d.ts.map +1 -0
  228. package/types/{internal → Codecs}/Flat.d.ts +2 -0
  229. package/types/Codecs/Flat.d.ts.map +1 -0
  230. package/types/Codecs/Float.d.ts.map +1 -0
  231. package/types/Codecs/LittleEndian.d.ts +19 -0
  232. package/types/Codecs/LittleEndian.d.ts.map +1 -0
  233. package/types/Codecs/Uint64.d.ts +16 -0
  234. package/types/Codecs/Uint64.d.ts.map +1 -0
  235. package/types/{internal → Codecs}/Utf8.d.ts +2 -2
  236. package/types/Codecs/Utf8.d.ts.map +1 -0
  237. package/types/Codecs/ZigZag.d.ts +3 -0
  238. package/types/Codecs/ZigZag.d.ts.map +1 -0
  239. package/types/Codecs/index.d.ts +8 -0
  240. package/types/Codecs/index.d.ts.map +1 -0
  241. package/types/Crypto/Bip32.d.ts +29 -0
  242. package/types/Crypto/Bip32.d.ts.map +1 -0
  243. package/types/Crypto/Bip39.d.ts +43 -0
  244. package/types/Crypto/Bip39.d.ts.map +1 -0
  245. package/types/Crypto/Blake2b.d.ts +16 -0
  246. package/types/Crypto/Blake2b.d.ts.map +1 -0
  247. package/types/Crypto/Curve.d.ts +161 -0
  248. package/types/Crypto/Curve.d.ts.map +1 -0
  249. package/types/Crypto/Ed25519.d.ts +155 -0
  250. package/types/Crypto/Ed25519.d.ts.map +1 -0
  251. package/types/Crypto/EdDSA.d.ts +159 -0
  252. package/types/Crypto/EdDSA.d.ts.map +1 -0
  253. package/types/Crypto/Field.d.ts +273 -0
  254. package/types/Crypto/Field.d.ts.map +1 -0
  255. package/types/Crypto/Hmac.d.ts +20 -0
  256. package/types/Crypto/Hmac.d.ts.map +1 -0
  257. package/types/Crypto/Keccak.d.ts +16 -0
  258. package/types/Crypto/Keccak.d.ts.map +1 -0
  259. package/types/Crypto/Pbkdf2.d.ts +15 -0
  260. package/types/Crypto/Pbkdf2.d.ts.map +1 -0
  261. package/types/Crypto/Sha2_256.d.ts +36 -0
  262. package/types/Crypto/Sha2_256.d.ts.map +1 -0
  263. package/types/Crypto/Sha2_512.d.ts +31 -0
  264. package/types/Crypto/Sha2_512.d.ts.map +1 -0
  265. package/types/Crypto/Sha3_256.d.ts +8 -0
  266. package/types/Crypto/Sha3_256.d.ts.map +1 -0
  267. package/types/Crypto/errors.d.ts +10 -0
  268. package/types/Crypto/errors.d.ts.map +1 -0
  269. package/types/Crypto/index.d.ts +12 -0
  270. package/types/Crypto/index.d.ts.map +1 -0
  271. package/types/index.d.ts +3 -5
  272. package/types/index.d.ts.map +1 -1
  273. package/dist/Address.js +0 -13
  274. package/dist/Address.js.map +0 -1
  275. package/dist/Bech32.js.map +0 -1
  276. package/dist/Cbor.js.map +0 -1
  277. package/dist/Ledger/Address.js.map +0 -1
  278. package/dist/Ledger/AssetClass.js.map +0 -1
  279. package/dist/Ledger/Assets.js +0 -120
  280. package/dist/Ledger/Assets.js.map +0 -1
  281. package/dist/Ledger/Credential.js +0 -17
  282. package/dist/Ledger/Credential.js.map +0 -1
  283. package/dist/Ledger/DatumHash.js +0 -21
  284. package/dist/Ledger/DatumHash.js.map +0 -1
  285. package/dist/Ledger/IsMainnet.js +0 -4
  286. package/dist/Ledger/IsMainnet.js.map +0 -1
  287. package/dist/Ledger/MintingPolicy.js +0 -45
  288. package/dist/Ledger/MintingPolicy.js.map +0 -1
  289. package/dist/Ledger/NetworkParams.js +0 -40
  290. package/dist/Ledger/NetworkParams.js.map +0 -1
  291. package/dist/Ledger/PubKeyHash.js.map +0 -1
  292. package/dist/Ledger/TxHash.js +0 -23
  293. package/dist/Ledger/TxHash.js.map +0 -1
  294. package/dist/Ledger/TxId.js +0 -23
  295. package/dist/Ledger/TxId.js.map +0 -1
  296. package/dist/Ledger/TxInput.js +0 -51
  297. package/dist/Ledger/TxInput.js.map +0 -1
  298. package/dist/Ledger/TxOutput.js +0 -118
  299. package/dist/Ledger/TxOutput.js.map +0 -1
  300. package/dist/Ledger/TxOutputDatum.js.map +0 -1
  301. package/dist/Ledger/TxOutputId.js +0 -55
  302. package/dist/Ledger/TxOutputId.js.map +0 -1
  303. package/dist/Ledger/UTxO.js +0 -43
  304. package/dist/Ledger/UTxO.js.map +0 -1
  305. package/dist/Ledger/UTxORef.js.map +0 -1
  306. package/dist/Ledger/ValidatorHash.js.map +0 -1
  307. package/dist/Ledger/index.js.map +0 -1
  308. package/dist/Network/IsMainnet.js.map +0 -1
  309. package/dist/Network/Params.js.map +0 -1
  310. package/dist/Network/UTxOsAt.js +0 -4
  311. package/dist/Network/UTxOsAt.js.map +0 -1
  312. package/dist/Network/errors.js +0 -16
  313. package/dist/Network/errors.js.map +0 -1
  314. package/dist/Network/index.js.map +0 -1
  315. package/dist/Uplc/Cek.js +0 -3
  316. package/dist/Uplc/Cek.js.map +0 -1
  317. package/dist/Uplc/Data.js.map +0 -1
  318. package/dist/Uplc/DataSchema.js +0 -118
  319. package/dist/Uplc/DataSchema.js.map +0 -1
  320. package/dist/Uplc/Primitive.js +0 -23
  321. package/dist/Uplc/Primitive.js.map +0 -1
  322. package/dist/Uplc/index.js +0 -3
  323. package/dist/Uplc/index.js.map +0 -1
  324. package/dist/internal/Base32.js.map +0 -1
  325. package/dist/internal/BigEndian.js.map +0 -1
  326. package/dist/internal/Bits.js.map +0 -1
  327. package/dist/internal/Bytes.js.map +0 -1
  328. package/dist/internal/Flat.js.map +0 -1
  329. package/dist/internal/Float.js.map +0 -1
  330. package/dist/internal/Utf8.js.map +0 -1
  331. package/tsconfig.build.tsbuildinfo +0 -1
  332. package/tsconfig.check.tsbuildinfo +0 -1
  333. package/tsconfig.tsbuildinfo +0 -1
  334. package/types/Address.d.ts +0 -5
  335. package/types/Address.d.ts.map +0 -1
  336. package/types/Bech32.d.ts.map +0 -1
  337. package/types/Cbor.d.ts.map +0 -1
  338. package/types/Ledger/Address.d.ts.map +0 -1
  339. package/types/Ledger/AssetClass.d.ts.map +0 -1
  340. package/types/Ledger/Assets.d.ts +0 -70
  341. package/types/Ledger/Assets.d.ts.map +0 -1
  342. package/types/Ledger/Credential.d.ts.map +0 -1
  343. package/types/Ledger/DatumHash.d.ts.map +0 -1
  344. package/types/Ledger/IsMainnet.d.ts +0 -6
  345. package/types/Ledger/IsMainnet.d.ts.map +0 -1
  346. package/types/Ledger/MintingPolicy.d.ts.map +0 -1
  347. package/types/Ledger/NetworkParams.d.ts +0 -40
  348. package/types/Ledger/NetworkParams.d.ts.map +0 -1
  349. package/types/Ledger/PubKeyHash.d.ts.map +0 -1
  350. package/types/Ledger/TxHash.d.ts.map +0 -1
  351. package/types/Ledger/TxId.d.ts +0 -70
  352. package/types/Ledger/TxId.d.ts.map +0 -1
  353. package/types/Ledger/TxInput.d.ts +0 -55
  354. package/types/Ledger/TxInput.d.ts.map +0 -1
  355. package/types/Ledger/TxOutput.d.ts +0 -63
  356. package/types/Ledger/TxOutput.d.ts.map +0 -1
  357. package/types/Ledger/TxOutputDatum.d.ts +0 -41
  358. package/types/Ledger/TxOutputDatum.d.ts.map +0 -1
  359. package/types/Ledger/TxOutputId.d.ts +0 -133
  360. package/types/Ledger/TxOutputId.d.ts.map +0 -1
  361. package/types/Ledger/UTxO.d.ts +0 -55
  362. package/types/Ledger/UTxO.d.ts.map +0 -1
  363. package/types/Ledger/UTxORef.d.ts +0 -133
  364. package/types/Ledger/UTxORef.d.ts.map +0 -1
  365. package/types/Ledger/ValidatorHash.d.ts.map +0 -1
  366. package/types/Ledger/index.d.ts.map +0 -1
  367. package/types/Network/IsMainnet.d.ts.map +0 -1
  368. package/types/Network/Params.d.ts.map +0 -1
  369. package/types/Network/UTxOsAt.d.ts +0 -9
  370. package/types/Network/UTxOsAt.d.ts.map +0 -1
  371. package/types/Network/errors.d.ts +0 -18
  372. package/types/Network/errors.d.ts.map +0 -1
  373. package/types/Network/index.d.ts.map +0 -1
  374. package/types/Uplc/Cek.d.ts +0 -72
  375. package/types/Uplc/Cek.d.ts.map +0 -1
  376. package/types/Uplc/Data.d.ts.map +0 -1
  377. package/types/Uplc/DataSchema.d.ts +0 -227
  378. package/types/Uplc/DataSchema.d.ts.map +0 -1
  379. package/types/Uplc/Primitive.d.ts +0 -26
  380. package/types/Uplc/Primitive.d.ts.map +0 -1
  381. package/types/Uplc/index.d.ts +0 -3
  382. package/types/Uplc/index.d.ts.map +0 -1
  383. package/types/internal/Base32.d.ts.map +0 -1
  384. package/types/internal/BigEndian.d.ts.map +0 -1
  385. package/types/internal/Bits.d.ts.map +0 -1
  386. package/types/internal/Bytes.d.ts.map +0 -1
  387. package/types/internal/Flat.d.ts.map +0 -1
  388. package/types/internal/Float.d.ts.map +0 -1
  389. package/types/internal/Utf8.d.ts.map +0 -1
  390. /package/dist/{Network → Cardano/Network}/IsMainnet.js +0 -0
  391. /package/dist/{internal → Codecs}/BigEndian.js +0 -0
  392. /package/dist/{internal → Codecs}/Bits.js +0 -0
  393. /package/dist/{internal → Codecs}/Float.js +0 -0
  394. /package/types/{Network → Cardano/Network}/IsMainnet.d.ts +0 -0
  395. /package/types/{internal → Codecs}/Base32.d.ts +0 -0
  396. /package/types/{Bech32.d.ts → Codecs/Bech32.d.ts} +0 -0
  397. /package/types/{internal → Codecs}/BigEndian.d.ts +0 -0
  398. /package/types/{internal → Codecs}/Bits.d.ts +0 -0
  399. /package/types/{internal → Codecs}/Float.d.ts +0 -0
@@ -0,0 +1,963 @@
1
+ import { Console, Context, Data, Effect } from "effect";
2
+ import * as CoinSelection from "./CoinSelection.js";
3
+ import { Address, Assets, DCert, MintingPolicy, NativeScript, RewardAddress, Tx, TxOutput, UTxO } from "./Ledger";
4
+ import * as Network from "./Network";
5
+ import * as Uplc from "./Uplc";
6
+ import { Balancing as BalancingWallet } from "./Wallet.js";
7
+ export class UTxOAlreadyAdded extends Data.TaggedError("Cardano.TxBuilder.UTxOAlreadyAdded") {
8
+ constructor(ref) {
9
+ super({ ref, message: `UTxO ${ref} already added to Tx` });
10
+ }
11
+ }
12
+ export class MissingDatum extends Data.TaggedError("Cardano.TxBuilder.MissingDatum") {
13
+ constructor() {
14
+ super({ message: "Datum missing" });
15
+ }
16
+ }
17
+ export class MissingRedeemer extends Data.TaggedError("Cardano.TxBuilder.MissingRedeemer") {
18
+ constructor() {
19
+ super({ message: "Redeemer missing" });
20
+ }
21
+ }
22
+ export class RedundantRedeemer extends Data.TaggedError("Cardano.TxBuilder.RedundantRedeemer") {
23
+ constructor() {
24
+ super({
25
+ message: "Redeemer is redundant (input not locked by uplc script)"
26
+ });
27
+ }
28
+ }
29
+ export class RedeemerAlreadyAdded extends Data.TaggedError("Cardano.TxBuilder.RedeemerAlreadyAdded") {
30
+ constructor() {
31
+ super({ message: "Redeemer already added" });
32
+ }
33
+ }
34
+ export class MissingScript extends Data.TaggedError("Cardano.TxBuilder.MissingScript") {
35
+ constructor(hash) {
36
+ super({ message: `Script missing for ${hash}` });
37
+ }
38
+ }
39
+ export class DatumNotFound extends Data.TaggedError("Cardano.TxBuilder.DatumNotFound") {
40
+ constructor(hash, cause) {
41
+ super({ message: `Datum for ${hash} not found (${cause})` });
42
+ }
43
+ }
44
+ export class ColleteralNotAvailable extends Data.TaggedError("Cardano.TxBuilder.CollateralNotAvailable") {
45
+ constructor() {
46
+ super({
47
+ message: `Colleteral not available (grabbing colleteral utxos from existing inputs or spare utxos still needs to be implemented)`
48
+ });
49
+ }
50
+ }
51
+ export class GetDatum extends Context.Tag("Cardano.TxBuilder.GetDatum")() {
52
+ }
53
+ const empty = {
54
+ datums: [],
55
+ dcerts: [],
56
+ inputs: [],
57
+ metadata: {},
58
+ minted: {},
59
+ outputs: [],
60
+ refInputs: [],
61
+ mintingRedeemers: [],
62
+ spendingRedeemers: [],
63
+ rewardingRedeemers: [],
64
+ certifyingRedeemers: [],
65
+ nativeScripts: [],
66
+ v1Scripts: [],
67
+ v2Scripts: [],
68
+ v3Scripts: [],
69
+ v2RefScripts: [],
70
+ v3RefScripts: [],
71
+ signers: [],
72
+ validFrom: undefined,
73
+ validTo: undefined,
74
+ withdrawals: []
75
+ };
76
+ export const start = Effect.succeed(empty);
77
+ /**
78
+ * Automatically discards duplicates
79
+ */
80
+ export const attachScript = (script) => (b) => {
81
+ if ("version" in script) {
82
+ if (Uplc.Script.isVersion(1)(script)) {
83
+ return addV1Script(b, script);
84
+ }
85
+ else if (Uplc.Script.isVersion(2)(script)) {
86
+ return addV2Script(b, script);
87
+ }
88
+ else if (Uplc.Script.isVersion(3)(script)) {
89
+ return addV3Script(b, script);
90
+ }
91
+ else {
92
+ throw new Error(`unhandled script version ${script.version}`);
93
+ }
94
+ }
95
+ else {
96
+ const hash = NativeScript.hash(script);
97
+ if (hasNativeScript(b, hash)) {
98
+ return b;
99
+ }
100
+ // assign result before returning so that return type is TxBuilder
101
+ b = {
102
+ ...b,
103
+ nativeScripts: [...b.nativeScripts, { script, hash }]
104
+ };
105
+ return b;
106
+ }
107
+ };
108
+ export const attachScriptEffect = (script) => Effect.map(attachScript(script));
109
+ export const delegate = (credential, poolId, redeemer = undefined) => (b) => Effect.gen(function* () {
110
+ const dcert = {
111
+ _tag: "Delegation",
112
+ credential,
113
+ poolId
114
+ };
115
+ b = addDCert(b, dcert);
116
+ if (credential._tag == "Validator") {
117
+ if (redeemer) {
118
+ if (hasNativeScript(b, credential.hash)) {
119
+ return yield* Effect.fail(new RedundantRedeemer());
120
+ }
121
+ if (!hasUplcScript(b, credential.hash)) {
122
+ return yield* Effect.fail(new MissingScript(credential.hash));
123
+ }
124
+ b = yield* addCertifyingRedeemer(b, dcert, redeemer);
125
+ }
126
+ else {
127
+ if (!hasNativeScript(b, credential.hash)) {
128
+ return yield* Effect.fail(new MissingRedeemer());
129
+ }
130
+ }
131
+ }
132
+ else if (redeemer) {
133
+ return yield* Effect.fail(new RedundantRedeemer());
134
+ }
135
+ return b;
136
+ });
137
+ export const delegateEffect = (credential, poolId, redeemer = undefined) => Effect.flatMap(delegate(credential, poolId, redeemer));
138
+ export const deregister = (credential, redeemer = undefined) => (b) => Effect.gen(function* () {
139
+ const dcert = {
140
+ _tag: "Deregistration",
141
+ credential
142
+ };
143
+ b = addDCert(b, dcert);
144
+ if (credential._tag == "Validator") {
145
+ if (redeemer) {
146
+ if (hasNativeScript(b, credential.hash)) {
147
+ return yield* Effect.fail(new RedundantRedeemer());
148
+ }
149
+ if (!hasUplcScript(b, credential.hash)) {
150
+ return yield* Effect.fail(new MissingScript(credential.hash));
151
+ }
152
+ b = yield* addCertifyingRedeemer(b, dcert, redeemer);
153
+ }
154
+ else {
155
+ if (!hasNativeScript(b, credential.hash)) {
156
+ return yield* Effect.fail(new MissingRedeemer());
157
+ }
158
+ }
159
+ }
160
+ else if (redeemer) {
161
+ return yield* Effect.fail(new RedundantRedeemer());
162
+ }
163
+ return b;
164
+ });
165
+ export const deregisterEffect = (credential, redeemer = undefined) => Effect.flatMap(deregister(credential, redeemer));
166
+ export const metadata = (mdata) => (b) => {
167
+ // assign result before returning so that return type is TxBuilder
168
+ b = {
169
+ ...b,
170
+ metadata: { ...b.metadata, ...mdata }
171
+ };
172
+ return b;
173
+ };
174
+ export const metadataEffect = (mdata) => Effect.map(metadata(mdata));
175
+ /**
176
+ * Filters out ADA
177
+ * Entries in assets can be negative for burning
178
+ */
179
+ export const mint = (assets, redeemer = undefined) => (b) => Effect.gen(function* () {
180
+ const policies = Assets.nonAdaPolicies(assets);
181
+ for (const policy of policies) {
182
+ // assign result before returning so that return type is TxBuilder
183
+ b = {
184
+ ...b,
185
+ minted: Assets.add(b.minted, Assets.filterByPolicy(policy)(assets))
186
+ };
187
+ const hash = MintingPolicy.hash(policy);
188
+ if (redeemer) {
189
+ if (hasNativeScript(b, hash)) {
190
+ return yield* Effect.fail(new RedundantRedeemer());
191
+ }
192
+ if (!hasUplcScript(b, hash)) {
193
+ return yield* Effect.fail(new MissingScript(hash));
194
+ }
195
+ addMintingRedeemer(b, policy, redeemer);
196
+ }
197
+ else {
198
+ if (!hasNativeScript(b, hash)) {
199
+ return yield* Effect.fail(new MissingRedeemer());
200
+ }
201
+ }
202
+ }
203
+ return b;
204
+ });
205
+ export const mintEffect = (assets, redeemer = undefined) => Effect.flatMap(mint(assets, redeemer));
206
+ export const pay = (...outputs) => (b) => Effect.gen(function* () {
207
+ for (const output of outputs) {
208
+ b = yield* addOutput(b, output);
209
+ }
210
+ return b;
211
+ });
212
+ export const payEffect = (...outputs) => Effect.flatMap(pay(...outputs));
213
+ export const refer = (...utxos) => (b) => Effect.gen(function* () {
214
+ for (const utxo of utxos) {
215
+ b = yield* addRefInput(b, utxo);
216
+ const refScript = utxo.output.refScript;
217
+ switch (refScript?.version) {
218
+ case 2:
219
+ b = addV2RefScript(b, refScript);
220
+ break;
221
+ case 3:
222
+ b = addV3RefScript(b, refScript);
223
+ break;
224
+ }
225
+ }
226
+ return b;
227
+ });
228
+ export const referEffect = (...utxos) => Effect.flatMap(refer(...utxos));
229
+ export const register = (credential) => (b) => {
230
+ b = addDCert(b, {
231
+ _tag: "Registration",
232
+ credential
233
+ });
234
+ return b;
235
+ };
236
+ export const registerEffect = (credential) => Effect.map(register(credential));
237
+ export const sign = (...signers) => (b) => {
238
+ for (const signer of signers) {
239
+ b = addSigner(b, signer);
240
+ }
241
+ return b;
242
+ };
243
+ export const signEffect = (...signers) => Effect.map(sign(...signers));
244
+ export const spend = (utxos, redeemer = undefined) => (b) => Effect.gen(function* () {
245
+ for (const utxo of Array.isArray(utxos) ? utxos : [utxos]) {
246
+ b = yield* addInput(b, utxo);
247
+ const spendingCred = Address.spendingCredential(utxo.output.address);
248
+ if (redeemer) {
249
+ if (spendingCred._tag != "Validator") {
250
+ return yield* Effect.fail(new RedundantRedeemer());
251
+ }
252
+ if (!hasUplcScript(b, spendingCred.hash)) {
253
+ return yield* Effect.fail(new MissingScript(spendingCred.hash));
254
+ }
255
+ b = yield* addSpendingRedeemer(b, utxo, redeemer);
256
+ const datum = utxo.output.datum;
257
+ if (!datum && !hasDatumlessScript(b, spendingCred.hash)) {
258
+ return yield* Effect.fail(new MissingDatum());
259
+ }
260
+ if (datum && datum._tag == "Hash") {
261
+ // provide datum through service
262
+ const getDatum = yield* GetDatum;
263
+ const datumData = yield* getDatum(datum.hash);
264
+ b = addDatum(b, datumData);
265
+ }
266
+ }
267
+ else if (spendingCred._tag == "Validator") {
268
+ if (!hasNativeScript(b, spendingCred.hash)) {
269
+ return yield* Effect.fail(new MissingRedeemer());
270
+ }
271
+ }
272
+ }
273
+ return b;
274
+ });
275
+ export const spendEffect = (utxos, redeemer = undefined) => Effect.flatMap(spend(utxos, redeemer));
276
+ export const validFromSlot = (slot) => (b) => {
277
+ // assign result before returning so that return type is TxBuilder
278
+ b = {
279
+ ...b,
280
+ validFrom: { slot }
281
+ };
282
+ return b;
283
+ };
284
+ export const validFromSlotEffect = (slot) => Effect.map(validFromSlot(slot));
285
+ /**
286
+ * @param time
287
+ * Milliseconds since 1970
288
+ */
289
+ export const validFromTime = (time) => (b) => {
290
+ // assign result before returning so that return type is TxBuilder
291
+ b = {
292
+ ...b,
293
+ validFrom: { time }
294
+ };
295
+ return b;
296
+ };
297
+ export const validFromTimeEffect = (time) => Effect.map(validFromTime(time));
298
+ export const validToSlot = (slot) => (b) => {
299
+ // assign result before returning so that return type is TxBuilder
300
+ b = {
301
+ ...b,
302
+ validTo: { slot }
303
+ };
304
+ return b;
305
+ };
306
+ export const validToSlotEffect = (slot) => Effect.map(validToSlot(slot));
307
+ /**
308
+ * @param time
309
+ * Milliseconds since 1970
310
+ */
311
+ export const validToTime = (time) => (b) => {
312
+ // assign result before returning so that return type is TxBuilder
313
+ b = {
314
+ ...b,
315
+ validTo: { time }
316
+ };
317
+ return b;
318
+ };
319
+ export const validToTimeEffect = (time) => Effect.map(validToTime(time));
320
+ export const withdraw = (rewardAddress, lovelace, redeemer = undefined) => (b) => Effect.gen(function* () {
321
+ const i = b.withdrawals.findIndex((w) => w.address == rewardAddress);
322
+ if (redeemer) {
323
+ if (RewardAddress.credential(rewardAddress)._tag != "Validator") {
324
+ throw new Error("can't withdraw using redeemer from non-Validator rewards address");
325
+ }
326
+ b = yield* addRewardingRedeemer(b, rewardAddress, redeemer);
327
+ }
328
+ const withdrawals = b.withdrawals.slice();
329
+ if (i == -1) {
330
+ withdrawals.push({ address: rewardAddress, lovelace: BigInt(lovelace) });
331
+ }
332
+ else {
333
+ withdrawals[i] = {
334
+ address: rewardAddress,
335
+ lovelace: BigInt(lovelace) + withdrawals[i].lovelace
336
+ };
337
+ }
338
+ withdrawals.sort(({ address: a }, { address: b }) => RewardAddress.compare(a, b));
339
+ // assign result before returning so that return type is TxBuilder
340
+ b = {
341
+ ...b,
342
+ withdrawals
343
+ };
344
+ return b;
345
+ });
346
+ export const withdrawEffect = (rewardAddress, lovelace, redeemer = undefined) => Effect.flatMap(withdraw(rewardAddress, lovelace, redeemer));
347
+ function addDatum(b, data) {
348
+ if (hasDatum(b, data)) {
349
+ return b;
350
+ }
351
+ // assign result before returning so that return type is TxBuilder
352
+ b = {
353
+ ...b,
354
+ datums: [...b.datums, data]
355
+ };
356
+ return b;
357
+ }
358
+ function hasDatum(b, data) {
359
+ return b.datums.some((d) => Uplc.Data.equals(d, data));
360
+ }
361
+ function addDCert(b, dcert) {
362
+ // assign result before returning so that return type is TxBuilder
363
+ b = {
364
+ ...b,
365
+ dcerts: [...b.dcerts, dcert]
366
+ };
367
+ if (dcert._tag == "Delegation" || dcert._tag == "Deregistration") {
368
+ if (dcert.credential._tag == "PubKey") {
369
+ b = addSigner(b, dcert.credential.hash);
370
+ }
371
+ }
372
+ return b;
373
+ }
374
+ const addInput = (b, input) => Effect.gen(function* () {
375
+ yield* Assets.assertAllPositive(input.output.assets);
376
+ if (hasInput(b, input.ref)) {
377
+ return yield* Effect.fail(new UTxOAlreadyAdded(input.ref));
378
+ }
379
+ if (hasRefInput(b, input.ref)) {
380
+ return yield* Effect.fail(new UTxOAlreadyAdded(input.ref));
381
+ }
382
+ // assign result before returning so that return type is TxBuilder
383
+ b = {
384
+ ...b,
385
+ inputs: UTxO.append(b.inputs, input)
386
+ };
387
+ return b;
388
+ });
389
+ function hasInput(b, ref) {
390
+ return b.inputs.some((utxo) => utxo.ref == ref);
391
+ }
392
+ const addRefInput = (b, refInput) => Effect.gen(function* () {
393
+ yield* Assets.assertAllPositive(refInput.output.assets);
394
+ if (b.inputs.some((utxo) => utxo.ref == refInput.ref)) {
395
+ return yield* Effect.fail(new UTxOAlreadyAdded(refInput.ref));
396
+ }
397
+ if (b.refInputs.some((utxo) => utxo.ref == refInput.ref)) {
398
+ return yield* Effect.fail(new UTxOAlreadyAdded(refInput.ref));
399
+ }
400
+ // assign result before returning so that return type is TxBuilder
401
+ b = {
402
+ ...b,
403
+ refInputs: UTxO.append(b.refInputs, refInput)
404
+ };
405
+ return b;
406
+ });
407
+ function hasRefInput(b, ref) {
408
+ return b.refInputs.some((utxo) => utxo.ref == ref);
409
+ }
410
+ const addOutput = (b, output) => Effect.gen(function* () {
411
+ yield* Assets.assertAllPositive(output.assets);
412
+ const outputCred = Address.spendingCredential(output.address);
413
+ if (outputCred._tag == "Validator" && output.datum === undefined) {
414
+ yield* Console.warn("TxOutput is sent to validator but doesn't have a datum");
415
+ }
416
+ // assign result before returning so that return type is TxBuilder
417
+ b = {
418
+ ...b,
419
+ outputs: [...b.outputs, output]
420
+ };
421
+ return b;
422
+ });
423
+ function addCertifyingRedeemer(b, dcert, redeemer) {
424
+ if (hasCertifyingRedeemer(b, dcert)) {
425
+ return Effect.fail(new RedeemerAlreadyAdded());
426
+ }
427
+ b = {
428
+ ...b,
429
+ certifyingRedeemers: [...b.certifyingRedeemers, { dcert, redeemer }]
430
+ };
431
+ return Effect.succeed(b);
432
+ }
433
+ function hasCertifyingRedeemer(b, dcert) {
434
+ return b.dcerts.some((d) => DCert.equals(d, dcert));
435
+ }
436
+ function addMintingRedeemer(b, policy, redeemer) {
437
+ if (hasMintingRedeemer(b, policy)) {
438
+ return Effect.fail(new RedeemerAlreadyAdded());
439
+ }
440
+ // assign result before returning so that return type is TxBuilder
441
+ b = {
442
+ ...b,
443
+ mintingRedeemers: [...b.mintingRedeemers, { policy, redeemer }]
444
+ };
445
+ return Effect.succeed(b);
446
+ }
447
+ function hasMintingRedeemer(b, policy) {
448
+ return b.mintingRedeemers.some((r) => r.policy == policy);
449
+ }
450
+ function addRewardingRedeemer(b, addr, redeemer) {
451
+ if (hasRewardingRedeemer(b, addr)) {
452
+ return Effect.fail(new RedeemerAlreadyAdded());
453
+ }
454
+ // assign result before returning so that return type is TxBuilder
455
+ b = {
456
+ ...b,
457
+ rewardingRedeemers: [...b.rewardingRedeemers, { addr, redeemer }]
458
+ };
459
+ return Effect.succeed(b);
460
+ }
461
+ function hasRewardingRedeemer(b, addr) {
462
+ return b.rewardingRedeemers.some((r) => r.addr == addr);
463
+ }
464
+ function addSpendingRedeemer(b, utxo, redeemer) {
465
+ if (hasSpendingRedeemer(b, utxo)) {
466
+ return Effect.fail(new RedeemerAlreadyAdded());
467
+ }
468
+ // assign result before returning so that return type is TxBuilder
469
+ b = {
470
+ ...b,
471
+ spendingRedeemers: [...b.spendingRedeemers, { utxo, redeemer }]
472
+ };
473
+ return Effect.succeed(b);
474
+ }
475
+ function hasSpendingRedeemer(b, utxo) {
476
+ return b.spendingRedeemers.some((r) => r.utxo.ref == utxo.ref);
477
+ }
478
+ function hasRedeemers(b) {
479
+ return (b.certifyingRedeemers.length > 0 ||
480
+ b.mintingRedeemers.length > 0 ||
481
+ b.rewardingRedeemers.length > 0 ||
482
+ b.spendingRedeemers.length > 0);
483
+ }
484
+ function addV1Script(b, script) {
485
+ const hash = Uplc.Script.hash(script);
486
+ if (hasV1Script(b, hash)) {
487
+ return b;
488
+ }
489
+ // assign result before returning so that return type is TxBuilder
490
+ b = {
491
+ ...b,
492
+ v1Scripts: [...b.v1Scripts, { script, hash }]
493
+ };
494
+ return b;
495
+ }
496
+ function hasV1Script(b, hash) {
497
+ return b.v1Scripts.some((s) => s.hash == hash);
498
+ }
499
+ function addV2Script(b, script) {
500
+ const hash = Uplc.Script.hash(script);
501
+ if (hasV2Script(b, hash)) {
502
+ return b;
503
+ }
504
+ // assign result before returning so that return type is TxBuilder
505
+ b = {
506
+ ...b,
507
+ v2Scripts: [...b.v2Scripts, { script, hash }]
508
+ };
509
+ return b;
510
+ }
511
+ function hasV2Script(b, hash) {
512
+ return b.v2Scripts.some((s) => s.hash == hash);
513
+ }
514
+ function addV3Script(b, script) {
515
+ const hash = Uplc.Script.hash(script);
516
+ if (hasV3Script(b, hash)) {
517
+ return b;
518
+ }
519
+ // assign result before returning so that return type is TxBuilder
520
+ b = {
521
+ ...b,
522
+ v3Scripts: [...b.v3Scripts, { script, hash }]
523
+ };
524
+ return b;
525
+ }
526
+ function hasV3Script(b, hash) {
527
+ return b.v3Scripts.some((s) => s.hash == hash);
528
+ }
529
+ function addV2RefScript(b, script) {
530
+ const hash = Uplc.Script.hash(script);
531
+ if (hasV2RefScript(b, hash)) {
532
+ return b;
533
+ }
534
+ // assign result before returning so that return type is TxBuilder
535
+ b = {
536
+ ...b,
537
+ v2RefScripts: [...b.v2RefScripts, { hash, script }]
538
+ };
539
+ return b;
540
+ }
541
+ function hasV2RefScript(b, hash) {
542
+ return b.v2RefScripts.some((s) => s.hash == hash);
543
+ }
544
+ function addV3RefScript(b, script) {
545
+ const hash = Uplc.Script.hash(script);
546
+ if (hasV3RefScript(b, hash)) {
547
+ return b;
548
+ }
549
+ // assign result before returning so that return type is TxBuilder
550
+ b = {
551
+ ...b,
552
+ v3RefScripts: [...b.v3RefScripts, { hash, script }]
553
+ };
554
+ return b;
555
+ }
556
+ function hasV3RefScript(b, hash) {
557
+ return b.v3RefScripts.some((s) => s.hash == hash);
558
+ }
559
+ function hasDatumlessScript(b, hash) {
560
+ return (hasNativeScript(b, hash) || hasV3Script(b, hash) || hasV3RefScript(b, hash));
561
+ }
562
+ function hasNativeScript(b, hash) {
563
+ return b.nativeScripts.some((s) => s.hash == hash);
564
+ }
565
+ function hasUplcScript(b, hash) {
566
+ return (hasV1Script(b, hash) ||
567
+ hasV2Script(b, hash) ||
568
+ hasV3Script(b, hash) ||
569
+ hasV2RefScript(b, hash) ||
570
+ hasV3RefScript(b, hash));
571
+ }
572
+ function allUplcScripts(b) {
573
+ return []
574
+ .concat(b.v1Scripts)
575
+ .concat(b.v2Scripts)
576
+ .concat(b.v3Scripts)
577
+ .concat(b.v2RefScripts)
578
+ .concat(b.v3RefScripts);
579
+ }
580
+ function getUplcScript(b, hash) {
581
+ const script = allUplcScripts(b).find((s) => s.hash == hash);
582
+ if (!script) {
583
+ throw new Error(`script with hash '${hash}' not found during redeemer building stage`);
584
+ }
585
+ return script.script;
586
+ }
587
+ function addSigner(b, signer) {
588
+ if (hasSigner(b, signer)) {
589
+ return b;
590
+ }
591
+ // assign result before returning so that return type is TxBuilder
592
+ b = {
593
+ ...b,
594
+ signers: [...b.signers, signer]
595
+ };
596
+ return b;
597
+ }
598
+ function hasSigner(b, signer) {
599
+ return b.signers.includes(signer);
600
+ }
601
+ class CurrentTxBuilder extends Context.Tag("Cardano.TxBuilder.CurrentTxBuilder")() {
602
+ }
603
+ export const build = (options = {}) => (b) => Effect.gen(function* () {
604
+ /**
605
+ * Calculate the metadata hash
606
+ */
607
+ const { metadata, metadataHash } = yield* buildMetadata;
608
+ /**
609
+ * Calculate the validity time range slots
610
+ */
611
+ const { firstValidSlot, lastValidSlot } = yield* buildValidityTimeRange;
612
+ /**
613
+ * Make sure the outputs contain enough lovelace
614
+ */
615
+ const outputs = yield* buildNonChangeOutputs;
616
+ /**
617
+ * Simple select a collateral input from the params if smart
618
+ */
619
+ const collateralInputs = yield* selectCollateralInputs;
620
+ /**
621
+ * Create an unbalanced tx. In this tx a few fields are not yet final:
622
+ * - inputs
623
+ * - outputs
624
+ * - fee
625
+ * - scriptDataHash
626
+ * - redeemers
627
+ */
628
+ let tx = {
629
+ body: {
630
+ inputs: b.inputs,
631
+ outputs,
632
+ fee: 0n,
633
+ firstValidSlot,
634
+ lastValidSlot,
635
+ dcerts: b.dcerts,
636
+ scriptDataHash: hasRedeemers(b)
637
+ ? new Array(32).fill(0)
638
+ : undefined,
639
+ withdrawals: b.withdrawals.map((w) => [w.address, w.lovelace]),
640
+ minted: b.minted,
641
+ refInputs: b.refInputs,
642
+ totalCollateral: 0n,
643
+ collateral: collateralInputs,
644
+ signers: b.signers,
645
+ collateralReturn: undefined, // TODO
646
+ metadataHash,
647
+ encoding: options.bodyEncoding
648
+ },
649
+ witnesses: {
650
+ signatures: [],
651
+ datums: b.datums,
652
+ redeemers: [],
653
+ nativeScripts: b.nativeScripts.map((s) => s.script),
654
+ v1Scripts: b.v1Scripts.map((s) => s.script),
655
+ v2Scripts: b.v2Scripts.map((s) => s.script),
656
+ v3Scripts: b.v3Scripts.map((s) => s.script),
657
+ v2RefScripts: b.v2RefScripts.map((s) => s.script),
658
+ v3RefScripts: b.v3RefScripts.map((s) => s.script),
659
+ encoding: options.witnessesEncoding
660
+ },
661
+ isValid: false,
662
+ metadata
663
+ };
664
+ /**
665
+ * The redeemer indices depend on some tx body fields, so are initialized after the init tx is created
666
+ */
667
+ tx = yield* buildRedeemersWithoutCost(tx);
668
+ /**
669
+ * Now in a loop the transaction is updated:
670
+ * - fee is set to min fee
671
+ * - the tx is balanced, grabbing inputs from the spareUTxOs and creating a change UTxO if there wasn't already a change UTxO
672
+ * - any lazy redeemer data is built (usually depends on order of inputs/outputs etc.)
673
+ * - the cost of each redeemer is calculated
674
+ * - the scriptDataHash is updated
675
+ *
676
+ * The loop continues as long as the tx.fee field is smaller than the min required field.
677
+ * We know that this loop will run at least once because initially tx.fee=0n, ensuring the tx is balanced
678
+ */
679
+ while (tx.body.fee < (yield* Tx.minFee(tx))) {
680
+ tx = yield* updateFee(tx);
681
+ tx = yield* balanceTx(tx);
682
+ tx = yield* buildRedeemersWithCost(tx);
683
+ tx = yield* updateScriptDataHash(tx);
684
+ }
685
+ /**
686
+ * Sign using balancing wallet
687
+ */
688
+ tx = {
689
+ ...tx,
690
+ witnesses: {
691
+ ...tx.witnesses,
692
+ signatures: [
693
+ ...tx.witnesses.signatures,
694
+ ...(yield* (yield* BalancingWallet).signTx(tx))
695
+ ]
696
+ }
697
+ };
698
+ return tx;
699
+ }).pipe(Effect.provideService(CurrentTxBuilder, b));
700
+ const buildMetadata = CurrentTxBuilder.pipe(Effect.map((b) => {
701
+ if (b.metadata !== undefined) {
702
+ return { metadata: b.metadata, metadataHash: Tx.hashMetadata(b.metadata) };
703
+ }
704
+ else {
705
+ return { metadata: undefined, metadataHash: undefined };
706
+ }
707
+ }));
708
+ const buildValidityTimeRange = CurrentTxBuilder.pipe(Effect.flatMap((b) => {
709
+ const calcSlot = (slotOrTime) => {
710
+ if (slotOrTime === undefined) {
711
+ return Effect.succeed(undefined);
712
+ }
713
+ else if ("time" in slotOrTime) {
714
+ return Network.Params.timeToSlot(slotOrTime.time);
715
+ }
716
+ else {
717
+ return Effect.succeed(slotOrTime.slot);
718
+ }
719
+ };
720
+ return Effect.zip(calcSlot(b.validFrom), calcSlot(b.validTo)).pipe(Effect.map(([firstValidSlot, lastValidSlot]) => ({
721
+ firstValidSlot,
722
+ lastValidSlot
723
+ })));
724
+ }));
725
+ const buildNonChangeOutputs = Effect.gen(function* () {
726
+ const b = yield* CurrentTxBuilder;
727
+ const outputs = b.outputs.slice();
728
+ for (let i = 0; i < outputs.length; i++) {
729
+ const output = outputs[i];
730
+ const lovelace = yield* TxOutput.minLovelace(output);
731
+ if (lovelace > output.assets[""]) {
732
+ outputs[i] = {
733
+ ...output,
734
+ assets: {
735
+ ...output.assets,
736
+ "": lovelace
737
+ }
738
+ };
739
+ }
740
+ }
741
+ return outputs;
742
+ });
743
+ const selectCollateralInputs = Effect.gen(function* () {
744
+ const b = yield* CurrentTxBuilder;
745
+ if (!hasRedeemers(b)) {
746
+ return [];
747
+ }
748
+ else {
749
+ const params = yield* Network.Params.params;
750
+ const ref = params.collateralUTXO;
751
+ if (!ref) {
752
+ return yield* Effect.fail(new ColleteralNotAvailable());
753
+ }
754
+ return [yield* (yield* Network.UTxO)(ref)];
755
+ }
756
+ });
757
+ const buildRedeemersWithoutCost = (tx) => CurrentTxBuilder.pipe(Effect.map((b) => {
758
+ const redeemers = b.mintingRedeemers
759
+ .map((r) => ({
760
+ _tag: "Minting",
761
+ policyIndex: Assets.nonAdaPolicies(tx.body.minted).indexOf(r.policy),
762
+ data: typeof r.redeemer == "function" ? r.redeemer(tx) : r.redeemer,
763
+ cost: { cpu: 0n, mem: 0n }
764
+ }))
765
+ .concat(b.spendingRedeemers.map((r) => ({
766
+ _tag: "Spending",
767
+ inputIndex: tx.body.inputs.map((u) => u.ref).indexOf(r.utxo.ref),
768
+ data: typeof r.redeemer == "function" ? r.redeemer(tx) : r.redeemer,
769
+ cost: { cpu: 0n, mem: 0n }
770
+ })))
771
+ .concat(b.rewardingRedeemers.map((r) => ({
772
+ _tag: "Rewarding",
773
+ withdrawalIndex: tx.body.withdrawals
774
+ .map((w) => w[0])
775
+ .indexOf(r.addr),
776
+ data: typeof r.redeemer == "function" ? r.redeemer(tx) : r.redeemer,
777
+ cost: { cpu: 0n, mem: 0n }
778
+ })))
779
+ .concat(b.certifyingRedeemers.map((r) => ({
780
+ _tag: "Certifying",
781
+ dcertIndex: tx.body.dcerts.findIndex((dcert) => DCert.equals(dcert, r.dcert)),
782
+ data: typeof r.redeemer == "function" ? r.redeemer(tx) : r.redeemer,
783
+ cost: { cpu: 0n, mem: 0n }
784
+ })));
785
+ // assign result before returning so that return type is Tx
786
+ tx = {
787
+ ...tx,
788
+ witnesses: {
789
+ ...tx.witnesses,
790
+ redeemers
791
+ }
792
+ };
793
+ return tx;
794
+ }));
795
+ const redeemerInfos = (b) => b.mintingRedeemers
796
+ .concat(b.spendingRedeemers)
797
+ .concat(b.rewardingRedeemers)
798
+ .concat(b.certifyingRedeemers);
799
+ const buildRedeemersWithCost = (tx) => Effect.gen(function* () {
800
+ const b = yield* CurrentTxBuilder;
801
+ /**
802
+ * Rebuild the redeemers to make sure the indices point to the correct policy/input/withdrawal/dcert
803
+ */
804
+ tx = yield* buildRedeemersWithoutCost(tx);
805
+ /**
806
+ * Now calculate the cost of each redeemer
807
+ */
808
+ const costs = yield* Effect.all(redeemerInfos(b).map(redeemerValidatorHash).map(profileRedeemer(b, tx)));
809
+ // assign result before returning so that return type is Tx
810
+ tx = {
811
+ ...tx,
812
+ witnesses: {
813
+ ...tx.witnesses,
814
+ redeemers: tx.witnesses.redeemers.map((r, i) => ({
815
+ ...r,
816
+ cost: costs[i]
817
+ }))
818
+ }
819
+ };
820
+ return tx;
821
+ });
822
+ const redeemerValidatorHash = (redeemer) => {
823
+ if ("policy" in redeemer) {
824
+ return MintingPolicy.hash(redeemer.policy);
825
+ }
826
+ else if ("utxo" in redeemer) {
827
+ const cred = Address.spendingCredential(redeemer.utxo.output.address);
828
+ if (cred._tag != "Validator") {
829
+ throw new Error("unexpected pubkey address for utxo being spent by redeemer");
830
+ }
831
+ return cred.hash;
832
+ }
833
+ else if ("addr" in redeemer) {
834
+ const cred = RewardAddress.credential(redeemer.addr);
835
+ if (cred._tag != "Validator") {
836
+ throw new Error("unexpected pubkey rewardaddress for redeemer withdrawal");
837
+ }
838
+ return cred.hash;
839
+ }
840
+ else {
841
+ return DCert.validatorHash(redeemer.dcert);
842
+ }
843
+ };
844
+ const profileRedeemer = (b, tx) => (vh, redeemerIndex) => Effect.gen(function* () {
845
+ const script = getUplcScript(b, vh);
846
+ const args = yield* Uplc.ScriptContext.makeArgs(script.version, tx, redeemerIndex);
847
+ const costModel = yield* Network.Params.costModel(script.version);
848
+ const profile = yield* Uplc.Script.eval(script, args, costModel);
849
+ if (profile.value._tag == "Left") {
850
+ // TODO: return a RuntimeError with nice stack trace
851
+ return yield* Effect.fail(new Error(profile.value.left.error));
852
+ }
853
+ return profile.cost;
854
+ });
855
+ const updateScriptDataHash = (tx) => Effect.gen(function* () {
856
+ const scriptDataHash = yield* Tx.scriptDataHash(tx);
857
+ // assign result before returning so that return type is Tx
858
+ tx = {
859
+ ...tx,
860
+ body: {
861
+ ...tx.body,
862
+ scriptDataHash
863
+ }
864
+ };
865
+ return tx;
866
+ });
867
+ const updateFee = (tx) => Effect.gen(function* () {
868
+ const fee = yield* Tx.minFee(tx);
869
+ // assign result before returning so that return type is Tx
870
+ tx = {
871
+ ...tx,
872
+ body: {
873
+ ...tx.body,
874
+ fee
875
+ }
876
+ };
877
+ return tx;
878
+ });
879
+ const selectCoinsForBalancing = CoinSelection.smallestFirst({
880
+ allowSelectingUninvolvedAssets: true
881
+ });
882
+ const balanceTx = (tx) => Effect.gen(function* () {
883
+ const inputAssets = UTxO.sumAssets(...tx.body.inputs);
884
+ const outputAssets = Assets.sum(...tx.body.outputs.map((output) => output.assets));
885
+ const feeAssets = { "": tx.body.fee };
886
+ const mintedAssets = tx.body.minted;
887
+ let net = Assets.sum(inputAssets, mintedAssets, Assets.negate(outputAssets), Assets.negate(feeAssets));
888
+ /**
889
+ * Return if already balanced
890
+ */
891
+ if (Assets.isEmpty(net)) {
892
+ return tx;
893
+ }
894
+ const balancingWallet = yield* BalancingWallet;
895
+ const changeAddress = yield* balancingWallet.changeAddress;
896
+ const spareUTxOs = yield* balancingWallet.utxos;
897
+ const selectAndAddInputs = (amount) => Effect.gen(function* () {
898
+ const extraInputs = yield* selectCoinsForBalancing(UTxO.difference(spareUTxOs ?? [], tx.body.inputs.concat(tx.body.refInputs)), amount);
899
+ net = Assets.add(net, UTxO.sumAssets(...extraInputs));
900
+ tx = {
901
+ ...tx,
902
+ body: {
903
+ ...tx.body,
904
+ inputs: UTxO.append(tx.body.inputs, ...extraInputs)
905
+ }
906
+ };
907
+ });
908
+ /**
909
+ * Any negative assets must be added on the input side by using the spareUTxOs
910
+ */
911
+ if (!Assets.isEmpty(Assets.filterNegative(net))) {
912
+ yield* selectAndAddInputs(Assets.negate(Assets.filterNegative(net)));
913
+ }
914
+ /**
915
+ * Handle the unlikely event that the tx is already balanced with the extraInputs
916
+ */
917
+ if (Assets.isEmpty(net)) {
918
+ return tx;
919
+ }
920
+ if (Address.isValidator(changeAddress)) {
921
+ throw new Error("can't send change to validator");
922
+ }
923
+ /**
924
+ * Lookup or create the change output (TODO: support multiple change outputs?)
925
+ */
926
+ let changeOutput = tx.body.outputs.find((output) => output.address == changeAddress &&
927
+ output.datum === undefined &&
928
+ output.refScript === undefined);
929
+ const nonChangeOutputs = tx.body.outputs.filter((output) => output != changeOutput);
930
+ /**
931
+ * Create the change output if no change output was found
932
+ */
933
+ if (changeOutput === undefined) {
934
+ changeOutput = {
935
+ address: changeAddress,
936
+ assets: Assets.filterPositive(net)
937
+ };
938
+ net = {};
939
+ }
940
+ const minLovelace = yield* TxOutput.minLovelace(changeOutput);
941
+ let diff = minLovelace - (changeOutput.assets[""] ?? 0n);
942
+ while (diff > 0n) {
943
+ yield* selectAndAddInputs({ "": diff });
944
+ changeOutput = {
945
+ ...changeOutput,
946
+ assets: Assets.add(changeOutput.assets, Assets.filterPositive(net))
947
+ };
948
+ net = {};
949
+ diff =
950
+ (yield* TxOutput.minLovelace(changeOutput)) -
951
+ (changeOutput.assets[""] ?? 0n);
952
+ }
953
+ // assign result before returning so that return type is Tx
954
+ tx = {
955
+ ...tx,
956
+ body: {
957
+ ...tx.body,
958
+ outputs: [...nonChangeOutputs, changeOutput]
959
+ }
960
+ };
961
+ return tx;
962
+ });
963
+ //# sourceMappingURL=TxBuilder.js.map