@helios-lang/effect 0.3.0 → 0.4.33

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 (176) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/dist/Cardano/Ledger/AssetClass.js +6 -1
  3. package/dist/Cardano/Ledger/AssetClass.js.map +1 -1
  4. package/dist/Cardano/Ledger/Assets.js +85 -3
  5. package/dist/Cardano/Ledger/Assets.js.map +1 -1
  6. package/dist/Cardano/Ledger/Credential.js +1 -1
  7. package/dist/Cardano/Ledger/Credential.js.map +1 -1
  8. package/dist/Cardano/Ledger/DCert.js +2 -1
  9. package/dist/Cardano/Ledger/DCert.js.map +1 -1
  10. package/dist/Cardano/Ledger/DatumHash.js +2 -2
  11. package/dist/Cardano/Ledger/DatumHash.js.map +1 -1
  12. package/dist/Cardano/Ledger/MintingPolicy.js +2 -0
  13. package/dist/Cardano/Ledger/MintingPolicy.js.map +1 -1
  14. package/dist/Cardano/Ledger/NativeScript.js +2 -1
  15. package/dist/Cardano/Ledger/NativeScript.js.map +1 -1
  16. package/dist/Cardano/Ledger/PubKey.js +1 -1
  17. package/dist/Cardano/Ledger/PubKey.js.map +1 -1
  18. package/dist/Cardano/Ledger/PubKeyHash.js +1 -1
  19. package/dist/Cardano/Ledger/PubKeyHash.js.map +1 -1
  20. package/dist/Cardano/Ledger/Redeemer.js +1 -1
  21. package/dist/Cardano/Ledger/Redeemer.js.map +1 -1
  22. package/dist/Cardano/Ledger/RewardAddress.js +6 -0
  23. package/dist/Cardano/Ledger/RewardAddress.js.map +1 -1
  24. package/dist/Cardano/Ledger/Signature.js +1 -0
  25. package/dist/Cardano/Ledger/Signature.js.map +1 -1
  26. package/dist/Cardano/Ledger/Tx.js +223 -24
  27. package/dist/Cardano/Ledger/Tx.js.map +1 -1
  28. package/dist/Cardano/Ledger/TxOutput.js +12 -6
  29. package/dist/Cardano/Ledger/TxOutput.js.map +1 -1
  30. package/dist/Cardano/Ledger/TxOutputDatum.js +36 -34
  31. package/dist/Cardano/Ledger/TxOutputDatum.js.map +1 -1
  32. package/dist/Cardano/Ledger/UTxO.js +1 -1
  33. package/dist/Cardano/Ledger/UTxO.js.map +1 -1
  34. package/dist/Cardano/Ledger/UTxORef.js +1 -0
  35. package/dist/Cardano/Ledger/UTxORef.js.map +1 -1
  36. package/dist/Cardano/Ledger/ValidatorHash.js +1 -1
  37. package/dist/Cardano/Ledger/ValidatorHash.js.map +1 -1
  38. package/dist/Cardano/Network/AssetMetadata.js +11 -0
  39. package/dist/Cardano/Network/AssetMetadata.js.map +1 -0
  40. package/dist/Cardano/Network/IsMainnet.js +1 -1
  41. package/dist/Cardano/Network/IsMainnet.js.map +1 -1
  42. package/dist/Cardano/Network/Params.js +105 -1
  43. package/dist/Cardano/Network/Params.js.map +1 -1
  44. package/dist/Cardano/Network/Submit.js +15 -0
  45. package/dist/Cardano/Network/Submit.js.map +1 -0
  46. package/dist/Cardano/Network/UTxO.js +2 -2
  47. package/dist/Cardano/Network/UTxO.js.map +1 -1
  48. package/dist/Cardano/Network/UTxOsAt.js +3 -2
  49. package/dist/Cardano/Network/UTxOsAt.js.map +1 -1
  50. package/dist/Cardano/Network/errors.js +16 -3
  51. package/dist/Cardano/Network/errors.js.map +1 -1
  52. package/dist/Cardano/Network/index.js +2 -0
  53. package/dist/Cardano/Network/index.js.map +1 -1
  54. package/dist/Cardano/ScriptContext.js +264 -0
  55. package/dist/Cardano/ScriptContext.js.map +1 -0
  56. package/dist/Cardano/TxBuilder.js +88 -42
  57. package/dist/Cardano/TxBuilder.js.map +1 -1
  58. package/dist/Cardano/Uplc/Builtins.js +293 -32
  59. package/dist/Cardano/Uplc/Builtins.js.map +1 -1
  60. package/dist/Cardano/Uplc/Cek.js +6 -5
  61. package/dist/Cardano/Uplc/Cek.js.map +1 -1
  62. package/dist/Cardano/Uplc/Cost.js +257 -1
  63. package/dist/Cardano/Uplc/Cost.js.map +1 -1
  64. package/dist/Cardano/Uplc/Data.js +22 -8
  65. package/dist/Cardano/Uplc/Data.js.map +1 -1
  66. package/dist/Cardano/Uplc/Script.js +52 -10
  67. package/dist/Cardano/Uplc/Script.js.map +1 -1
  68. package/dist/Cardano/Uplc/Term.js +14 -0
  69. package/dist/Cardano/Uplc/Term.js.map +1 -1
  70. package/dist/Cardano/Uplc/index.js +2 -1
  71. package/dist/Cardano/Uplc/index.js.map +1 -1
  72. package/dist/Cardano/Wallet.js +4 -1
  73. package/dist/Cardano/Wallet.js.map +1 -1
  74. package/dist/Cardano/index.js +4 -3
  75. package/dist/Cardano/index.js.map +1 -1
  76. package/dist/Codecs/Base32.js +4 -1
  77. package/dist/Codecs/Base32.js.map +1 -1
  78. package/dist/Codecs/BigEndian.js +1 -1
  79. package/dist/Codecs/BigEndian.js.map +1 -1
  80. package/dist/Codecs/Bytes.js +1 -1
  81. package/dist/Codecs/Bytes.js.map +1 -1
  82. package/dist/Codecs/LittleEndian.js +1 -1
  83. package/dist/Codecs/LittleEndian.js.map +1 -1
  84. package/dist/Codecs/Utf8.js +1 -1
  85. package/dist/Codecs/Utf8.js.map +1 -1
  86. package/dist/Crypto/Bip32.js +5 -2
  87. package/dist/Crypto/Bip32.js.map +1 -1
  88. package/dist/Crypto/Curve.js +1 -0
  89. package/dist/Crypto/Curve.js.map +1 -1
  90. package/dist/Crypto/Ed25519.js +2 -1
  91. package/dist/Crypto/Ed25519.js.map +1 -1
  92. package/dist/Crypto/EdDSA.js +2 -1
  93. package/dist/Crypto/EdDSA.js.map +1 -1
  94. package/dist/Crypto/Sha3_256.js +1 -0
  95. package/dist/Crypto/Sha3_256.js.map +1 -1
  96. package/dist/Crypto/index.js +2 -0
  97. package/dist/Crypto/index.js.map +1 -1
  98. package/dist/index.js +3 -3
  99. package/dist/index.js.map +1 -1
  100. package/package.json +2 -1
  101. package/types/Cardano/Ledger/AssetClass.d.ts +6 -1
  102. package/types/Cardano/Ledger/AssetClass.d.ts.map +1 -1
  103. package/types/Cardano/Ledger/Assets.d.ts +14 -2
  104. package/types/Cardano/Ledger/Assets.d.ts.map +1 -1
  105. package/types/Cardano/Ledger/Credential.d.ts +1 -1
  106. package/types/Cardano/Ledger/Credential.d.ts.map +1 -1
  107. package/types/Cardano/Ledger/DatumHash.d.ts +2 -2
  108. package/types/Cardano/Ledger/DatumHash.d.ts.map +1 -1
  109. package/types/Cardano/Ledger/MintingPolicy.d.ts +1 -0
  110. package/types/Cardano/Ledger/MintingPolicy.d.ts.map +1 -1
  111. package/types/Cardano/Ledger/PubKey.d.ts +2 -2
  112. package/types/Cardano/Ledger/PubKey.d.ts.map +1 -1
  113. package/types/Cardano/Ledger/PubKeyHash.d.ts +2 -2
  114. package/types/Cardano/Ledger/PubKeyHash.d.ts.map +1 -1
  115. package/types/Cardano/Ledger/Redeemer.d.ts +1 -1
  116. package/types/Cardano/Ledger/Redeemer.d.ts.map +1 -1
  117. package/types/Cardano/Ledger/RewardAddress.d.ts.map +1 -1
  118. package/types/Cardano/Ledger/Signature.d.ts +1 -1
  119. package/types/Cardano/Ledger/Signature.d.ts.map +1 -1
  120. package/types/Cardano/Ledger/Tx.d.ts +22 -241
  121. package/types/Cardano/Ledger/Tx.d.ts.map +1 -1
  122. package/types/Cardano/Ledger/TxOutput.d.ts +95 -105
  123. package/types/Cardano/Ledger/TxOutput.d.ts.map +1 -1
  124. package/types/Cardano/Ledger/TxOutputDatum.d.ts +69 -68
  125. package/types/Cardano/Ledger/TxOutputDatum.d.ts.map +1 -1
  126. package/types/Cardano/Ledger/UTxO.d.ts +272 -322
  127. package/types/Cardano/Ledger/UTxO.d.ts.map +1 -1
  128. package/types/Cardano/Ledger/ValidatorHash.d.ts +2 -2
  129. package/types/Cardano/Ledger/ValidatorHash.d.ts.map +1 -1
  130. package/types/Cardano/Network/AssetMetadata.d.ts +15 -0
  131. package/types/Cardano/Network/AssetMetadata.d.ts.map +1 -0
  132. package/types/Cardano/Network/IsMainnet.d.ts +1 -1
  133. package/types/Cardano/Network/Params.d.ts +9 -1
  134. package/types/Cardano/Network/Params.d.ts.map +1 -1
  135. package/types/Cardano/Network/Submit.d.ts +18 -0
  136. package/types/Cardano/Network/Submit.d.ts.map +1 -0
  137. package/types/Cardano/Network/UTxO.d.ts +1 -1
  138. package/types/Cardano/Network/UTxO.d.ts.map +1 -1
  139. package/types/Cardano/Network/UTxOsAt.d.ts +2 -2
  140. package/types/Cardano/Network/UTxOsAt.d.ts.map +1 -1
  141. package/types/Cardano/Network/errors.d.ts +22 -2
  142. package/types/Cardano/Network/errors.d.ts.map +1 -1
  143. package/types/Cardano/Network/index.d.ts +2 -0
  144. package/types/Cardano/Network/index.d.ts.map +1 -1
  145. package/types/Cardano/ScriptContext.d.ts +1340 -0
  146. package/types/Cardano/ScriptContext.d.ts.map +1 -0
  147. package/types/Cardano/TxBuilder.d.ts +7 -5
  148. package/types/Cardano/TxBuilder.d.ts.map +1 -1
  149. package/types/Cardano/Uplc/Builtins.d.ts.map +1 -1
  150. package/types/Cardano/Uplc/Cek.d.ts.map +1 -1
  151. package/types/Cardano/Uplc/Cost.d.ts +1 -0
  152. package/types/Cardano/Uplc/Cost.d.ts.map +1 -1
  153. package/types/Cardano/Uplc/Data.d.ts.map +1 -1
  154. package/types/Cardano/Uplc/Script.d.ts +5 -3
  155. package/types/Cardano/Uplc/Script.d.ts.map +1 -1
  156. package/types/Cardano/Uplc/Term.d.ts +3 -0
  157. package/types/Cardano/Uplc/Term.d.ts.map +1 -1
  158. package/types/Cardano/Uplc/index.d.ts +2 -1
  159. package/types/Cardano/Uplc/index.d.ts.map +1 -1
  160. package/types/Cardano/Wallet.d.ts +18 -23
  161. package/types/Cardano/Wallet.d.ts.map +1 -1
  162. package/types/Cardano/index.d.ts +4 -3
  163. package/types/Cardano/index.d.ts.map +1 -1
  164. package/types/Codecs/Base32.d.ts +4 -1
  165. package/types/Codecs/Base32.d.ts.map +1 -1
  166. package/types/Crypto/Bip32.d.ts +5 -3
  167. package/types/Crypto/Bip32.d.ts.map +1 -1
  168. package/types/Crypto/EdDSA.d.ts +1 -1
  169. package/types/Crypto/EdDSA.d.ts.map +1 -1
  170. package/types/Crypto/index.d.ts +2 -0
  171. package/types/Crypto/index.d.ts.map +1 -1
  172. package/types/index.d.ts +3 -3
  173. package/types/index.d.ts.map +1 -1
  174. package/bun.lock +0 -60
  175. package/tsconfig.build.json +0 -14
  176. package/tsconfig.json +0 -38
@@ -0,0 +1,264 @@
1
+ import { Context, Effect, Option, ParseResult, Schema } from "effect";
2
+ import { FromUplcData as DatumHashFromUplcData, hash as hashDatum } from "./Ledger/DatumHash.js";
3
+ import { FromUplcData as MintingPolicyFromUplcData } from "./Ledger/MintingPolicy.js";
4
+ import { FromUplcData as AssetsFromUplcData, nonAdaPolicies } from "./Ledger/Assets.js";
5
+ import { FromUplcData as DCertFromUplcData } from "./Ledger/DCert.js";
6
+ import { FromUplcData as PubKeyHashFromUplcData } from "./Ledger/PubKeyHash.js";
7
+ import { Redeemer } from "./Ledger/Redeemer.js";
8
+ import { FromUplcData as RewardAddressFromUplcData } from "./Ledger/RewardAddress.js";
9
+ import { hash as hashTx, inputDatum } from "./Ledger/Tx.js";
10
+ import { FromUplcData as TxHashFromUplcData, FromUplcDataV3 as TxHashFromUplcDataV3 } from "./Ledger/TxHash.js";
11
+ import { FromUplcData as TxOutputFromUplcData } from "./Ledger/TxOutput.js";
12
+ import { FromUplcData as UTxOFromUplcData, FromUplcDataV3 as UTxOFromUplcDataV3 } from "./Ledger/UTxO.js";
13
+ import { FromUplcData as UTxORefFromUplcData, FromUplcDataV3 as UTxORefFromUplcDataV3 } from "./Ledger/UTxORef.js";
14
+ import * as Params from "./Network/Params.js";
15
+ import * as Data from "./Uplc/Data.js";
16
+ import * as Value from "./Uplc/Value.js";
17
+ export const makeArgs = (version, tx, redeemerIndex) => Effect.gen(function* () {
18
+ switch (version) {
19
+ case 1:
20
+ throw new Error("ScriptContext for UPLC v1 not supported");
21
+ case 2:
22
+ return yield* makeArgsV2(tx, redeemerIndex);
23
+ case 3:
24
+ return yield* makeArgsV3(tx, redeemerIndex);
25
+ }
26
+ });
27
+ const LovelaceFromData = Schema.transform(AssetsFromUplcData(false), Schema.BigIntFromSelf, {
28
+ strict: true,
29
+ decode: (assets) => assets[""],
30
+ encode: (fee) => ({ "": fee })
31
+ });
32
+ /**
33
+ * in V2, 0 lovelace is prepended
34
+ */
35
+ const MintedAssetsV2 = Schema.transform(AssetsFromUplcData(true), Schema.typeSchema(AssetsFromUplcData(true)), {
36
+ strict: true,
37
+ decode: (assets) => assets,
38
+ encode: (assets) => ({ "": 0n, ...assets })
39
+ });
40
+ const ValiditySlotRange = Schema.transformOrFail(Data.TimeRange, Schema.Struct({
41
+ firstValidSlot: Schema.optional(Schema.Int),
42
+ lastValidSlot: Schema.optional(Schema.Int)
43
+ }), {
44
+ strict: true,
45
+ decode: (tr) => Effect.zip(Number.isFinite(tr.start)
46
+ ? Params.timeToSlot(tr.start)
47
+ : Effect.succeed(undefined), Number.isFinite(tr.end)
48
+ ? Params.timeToSlot(tr.end)
49
+ : Effect.succeed(undefined)).pipe(Effect.map(([firstValidSlot, lastValidSlot]) => ({
50
+ firstValidSlot,
51
+ lastValidSlot
52
+ }))),
53
+ encode: (tr) => Effect.zip(tr.firstValidSlot === undefined
54
+ ? Effect.succeed(Number.NEGATIVE_INFINITY)
55
+ : Params.slotToTime(tr.firstValidSlot), tr.lastValidSlot === undefined
56
+ ? Effect.succeed(Number.POSITIVE_INFINITY)
57
+ : Params.slotToTime(tr.lastValidSlot)).pipe(Effect.map(([start, end]) => ({ start, end })))
58
+ });
59
+ const TxInfoV2 = Data.EnumVariant(0, {
60
+ inputs: Data.Array(UTxOFromUplcData),
61
+ refInputs: Data.Array(UTxOFromUplcData),
62
+ outputs: Data.Array(TxOutputFromUplcData),
63
+ fee: LovelaceFromData,
64
+ minted: MintedAssetsV2,
65
+ dcerts: Data.Array(DCertFromUplcData),
66
+ withdrawals: Data.PairArray(RewardAddressFromUplcData, Data.BigInt),
67
+ validityTimeRange: ValiditySlotRange,
68
+ signers: Data.Array(PubKeyHashFromUplcData),
69
+ redeemers: Data.PairArray(Data.Data, Data.Data),
70
+ datums: Data.PairArray(DatumHashFromUplcData, Data.Data),
71
+ txHash: Data.EnumVariant(0, { hash: TxHashFromUplcData })
72
+ });
73
+ /**
74
+ * Only use for testing!
75
+ */
76
+ export const TxInfoV3 = Data.EnumVariant(0, {
77
+ inputs: Data.Array(UTxOFromUplcDataV3),
78
+ refInputs: Data.Array(UTxOFromUplcDataV3),
79
+ outputs: Data.Array(TxOutputFromUplcData),
80
+ fee: LovelaceFromData,
81
+ minted: AssetsFromUplcData(true),
82
+ dcerts: Data.Array(DCertFromUplcData),
83
+ withdrawals: Data.PairArray(RewardAddressFromUplcData, Data.BigInt),
84
+ validityTimeRange: ValiditySlotRange,
85
+ signers: Data.Array(PubKeyHashFromUplcData),
86
+ redeemers: Data.PairArray(Data.Data, Data.Data),
87
+ datums: Data.PairArray(DatumHashFromUplcData, Data.Data),
88
+ txHash: TxHashFromUplcDataV3,
89
+ votes: Data.PairArray(Data.Data, Data.Data), // TODO
90
+ proposalProcedures: Data.Array(Data.Data), // TODO
91
+ currentTreasuryAmount: Data.Option(Data.Data), // TODO
92
+ treasuryDonation: Data.Option(Data.Data) // TODO
93
+ });
94
+ /**
95
+ * Exported for testing
96
+ */
97
+ export class CurrentTx extends Context.Tag("Cardano.Uplc.ScriptContext.CurrentTx")() {
98
+ }
99
+ /**
100
+ * Uses same tags as Redeemer to make encoding easy
101
+ */
102
+ const PurposeV2 = Schema.transformOrFail(Data.Enum({
103
+ Minting: {
104
+ policy: MintingPolicyFromUplcData
105
+ },
106
+ Spending: {
107
+ ref: UTxORefFromUplcData
108
+ },
109
+ Rewarding: {
110
+ address: RewardAddressFromUplcData
111
+ },
112
+ Certifying: {
113
+ dcert: DCertFromUplcData
114
+ }
115
+ }), Schema.typeSchema(Redeemer), {
116
+ strict: true,
117
+ decode: (purpose, _, ast) => ParseResult.fail(new ParseResult.Forbidden(ast, purpose, "Can't decode purpose into redeemer.")),
118
+ encode: (redeemer) => CurrentTx.pipe(Effect.map((tx) => {
119
+ switch (redeemer._tag) {
120
+ case "Minting":
121
+ return {
122
+ _tag: "Minting",
123
+ policy: nonAdaPolicies(tx.body.minted)[redeemer.policyIndex]
124
+ };
125
+ case "Spending":
126
+ return {
127
+ _tag: "Spending",
128
+ ref: tx.body.inputs[redeemer.inputIndex].ref
129
+ };
130
+ case "Rewarding":
131
+ return {
132
+ _tag: "Rewarding",
133
+ address: tx.body.withdrawals[redeemer.withdrawalIndex][0]
134
+ };
135
+ case "Certifying":
136
+ return {
137
+ _tag: "Certifying",
138
+ dcert: tx.body.dcerts[redeemer.dcertIndex]
139
+ };
140
+ }
141
+ }))
142
+ });
143
+ /**
144
+ * TODO: add voting and proposing redeemers
145
+ *
146
+ * Only exported for testing
147
+ */
148
+ export const PurposeV3 = Schema.transformOrFail(Data.Enum({
149
+ Minting: {
150
+ policy: MintingPolicyFromUplcData
151
+ },
152
+ Spending: {
153
+ ref: UTxORefFromUplcDataV3,
154
+ datum: Data.Option(Data.Data)
155
+ },
156
+ Rewarding: {
157
+ address: RewardAddressFromUplcData
158
+ },
159
+ Certifying: {
160
+ dcert: DCertFromUplcData
161
+ }
162
+ }), Schema.typeSchema(Redeemer), {
163
+ strict: true,
164
+ decode: (purpose, _, ast) => ParseResult.fail(new ParseResult.Forbidden(ast, purpose, "Can't decode purpose into redeemer.")),
165
+ encode: (redeemer) => CurrentTx.pipe(Effect.map((tx) => {
166
+ switch (redeemer._tag) {
167
+ case "Minting":
168
+ return {
169
+ _tag: "Minting",
170
+ policy: nonAdaPolicies(tx.body.minted)[redeemer.policyIndex]
171
+ };
172
+ case "Spending": {
173
+ return {
174
+ _tag: "Spending",
175
+ ref: tx.body.inputs[redeemer.inputIndex].ref,
176
+ datum: Option.fromNullable(inputDatum(redeemer.inputIndex)(tx))
177
+ };
178
+ }
179
+ case "Rewarding":
180
+ return {
181
+ _tag: "Rewarding",
182
+ address: tx.body.withdrawals[redeemer.withdrawalIndex][0]
183
+ };
184
+ case "Certifying":
185
+ return {
186
+ _tag: "Certifying",
187
+ dcert: tx.body.dcerts[redeemer.dcertIndex]
188
+ };
189
+ }
190
+ }))
191
+ });
192
+ const makeArgsV2 = (tx, redeemerIndex) => Effect.gen(function* () {
193
+ const redeemer = tx.witnesses.redeemers[redeemerIndex];
194
+ const purposes = yield* Effect.all(tx.witnesses.redeemers.map((r) => Schema.encode(PurposeV2)(r))).pipe(Effect.provideService(CurrentTx, tx));
195
+ const purpose = purposes[redeemerIndex];
196
+ const txInfo = yield* Schema.encode(TxInfoV2)({
197
+ inputs: tx.body.inputs,
198
+ refInputs: tx.body.refInputs,
199
+ outputs: tx.body.outputs,
200
+ fee: tx.body.fee,
201
+ minted: tx.body.minted,
202
+ dcerts: tx.body.dcerts,
203
+ withdrawals: tx.body.withdrawals,
204
+ validityTimeRange: {
205
+ firstValidSlot: tx.body.firstValidSlot,
206
+ lastValidSlot: tx.body.lastValidSlot
207
+ },
208
+ signers: tx.body.signers,
209
+ redeemers: tx.witnesses.redeemers.map((r, i) => [purposes[i], r.data]),
210
+ datums: tx.witnesses.datums.map((d) => [hashDatum(d), d]),
211
+ txHash: { hash: hashTx(tx) }
212
+ });
213
+ const scriptContext = Data.makeConstrData(0, [txInfo, purpose]);
214
+ switch (redeemer._tag) {
215
+ case "Certifying":
216
+ case "Minting":
217
+ case "Rewarding":
218
+ return [
219
+ { data: redeemer.data },
220
+ { data: scriptContext }
221
+ ];
222
+ case "Spending": {
223
+ const datum = inputDatum(redeemer.inputIndex)(tx);
224
+ if (datum === undefined) {
225
+ throw new Error(`No datum found for input ${redeemer.inputIndex}`);
226
+ }
227
+ return [
228
+ { data: datum },
229
+ { data: redeemer.data },
230
+ { data: scriptContext }
231
+ ];
232
+ }
233
+ }
234
+ });
235
+ const makeArgsV3 = (tx, redeemerIndex) => Effect.gen(function* () {
236
+ const redeemer = tx.witnesses.redeemers[redeemerIndex];
237
+ const purposes = yield* Effect.all(tx.witnesses.redeemers.map((r) => Schema.encode(PurposeV3)(r))).pipe(Effect.provideService(CurrentTx, tx));
238
+ const purpose = purposes[redeemerIndex];
239
+ const txInfo = yield* Schema.encode(TxInfoV3)({
240
+ inputs: tx.body.inputs,
241
+ refInputs: tx.body.refInputs,
242
+ outputs: tx.body.outputs,
243
+ fee: tx.body.fee,
244
+ minted: tx.body.minted,
245
+ dcerts: tx.body.dcerts,
246
+ withdrawals: tx.body.withdrawals,
247
+ validityTimeRange: {
248
+ firstValidSlot: tx.body.firstValidSlot,
249
+ lastValidSlot: tx.body.lastValidSlot
250
+ },
251
+ signers: tx.body.signers,
252
+ redeemers: tx.witnesses.redeemers.map((r, i) => [purposes[i], r.data]),
253
+ datums: tx.witnesses.datums.map((d) => [hashDatum(d), d]),
254
+ txHash: hashTx(tx),
255
+ votes: [],
256
+ proposalProcedures: [],
257
+ currentTreasuryAmount: Option.none(),
258
+ treasuryDonation: Option.none()
259
+ });
260
+ return [
261
+ { data: Data.makeConstrData(0, [txInfo, redeemer.data, purpose]) }
262
+ ];
263
+ });
264
+ //# sourceMappingURL=ScriptContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScriptContext.js","sourceRoot":"","sources":["../../src/Cardano/ScriptContext.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import { Console, Context, Data, Effect } from "effect";
2
+ import { Bytes } from "../Codecs/index.js";
2
3
  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";
4
+ import { Address, AssetClass, Assets, Credential, DatumHash, DCert, MintingPolicy, NativeScript, PubKeyHash, Redeemer, RewardAddress, Tx, TxOutput, UTxO, UTxORef, ValidatorHash } from "./Ledger/index.js";
5
+ import * as Network from "./Network/index.js";
6
+ import * as ScriptContext from "./ScriptContext.js";
7
+ import * as Uplc from "./Uplc/index.js";
6
8
  import { Balancing as BalancingWallet } from "./Wallet.js";
7
9
  export class UTxOAlreadyAdded extends Data.TaggedError("Cardano.TxBuilder.UTxOAlreadyAdded") {
8
10
  constructor(ref) {
@@ -192,7 +194,7 @@ export const mint = (assets, redeemer = undefined) => (b) => Effect.gen(function
192
194
  if (!hasUplcScript(b, hash)) {
193
195
  return yield* Effect.fail(new MissingScript(hash));
194
196
  }
195
- addMintingRedeemer(b, policy, redeemer);
197
+ b = yield* addMintingRedeemer(b, policy, redeemer);
196
198
  }
197
199
  else {
198
200
  if (!hasNativeScript(b, hash)) {
@@ -257,7 +259,7 @@ export const spend = (utxos, redeemer = undefined) => (b) => Effect.gen(function
257
259
  if (!datum && !hasDatumlessScript(b, spendingCred.hash)) {
258
260
  return yield* Effect.fail(new MissingDatum());
259
261
  }
260
- if (datum && datum._tag == "Hash") {
262
+ if (datum && "hash" in datum) {
261
263
  // provide datum through service
262
264
  const getDatum = yield* GetDatum;
263
265
  const datumData = yield* getDatum(datum.hash);
@@ -609,6 +611,7 @@ export const build = (options = {}) => (b) => Effect.gen(function* () {
609
611
  * Calculate the validity time range slots
610
612
  */
611
613
  const { firstValidSlot, lastValidSlot } = yield* buildValidityTimeRange;
614
+ yield* Console.log(`Built validatity slots: ${firstValidSlot}:${lastValidSlot}`);
612
615
  /**
613
616
  * Make sure the outputs contain enough lovelace
614
617
  */
@@ -661,10 +664,17 @@ export const build = (options = {}) => (b) => Effect.gen(function* () {
661
664
  isValid: false,
662
665
  metadata
663
666
  };
667
+ yield* Console.log("validating outputs...");
668
+ for (const output of outputs) {
669
+ yield* Console.log(`Output lovelace: ${output.assets[""]?.toString()}`);
670
+ }
671
+ yield* Tx.validateOutputs(true)(tx);
672
+ yield* Console.log(`Initialized tx`);
664
673
  /**
665
674
  * The redeemer indices depend on some tx body fields, so are initialized after the init tx is created
666
675
  */
667
676
  tx = yield* buildRedeemersWithoutCost(tx);
677
+ yield* Console.log(`Built redeemers without cost`);
668
678
  /**
669
679
  * Now in a loop the transaction is updated:
670
680
  * - fee is set to min fee
@@ -676,12 +686,19 @@ export const build = (options = {}) => (b) => Effect.gen(function* () {
676
686
  * The loop continues as long as the tx.fee field is smaller than the min required field.
677
687
  * We know that this loop will run at least once because initially tx.fee=0n, ensuring the tx is balanced
678
688
  */
689
+ yield* Console.log(`Start loop`);
679
690
  while (tx.body.fee < (yield* Tx.minFee(tx))) {
691
+ yield* Console.log(`Updating fee`);
680
692
  tx = yield* updateFee(tx);
693
+ yield* Console.log(`Updated fee`);
681
694
  tx = yield* balanceTx(tx);
695
+ yield* Console.log(`Balanced tx`);
682
696
  tx = yield* buildRedeemersWithCost(tx);
697
+ yield* Console.log(`Built redeemers with cost`);
683
698
  tx = yield* updateScriptDataHash(tx);
699
+ yield* Console.log(`Updated script hash`);
684
700
  }
701
+ yield* Console.log(`End loop`);
685
702
  /**
686
703
  * Sign using balancing wallet
687
704
  */
@@ -726,18 +743,29 @@ const buildNonChangeOutputs = Effect.gen(function* () {
726
743
  const b = yield* CurrentTxBuilder;
727
744
  const outputs = b.outputs.slice();
728
745
  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] = {
746
+ let output = outputs[i];
747
+ let lovelace = yield* TxOutput.minLovelace(output);
748
+ // iterate, because including lovelace value requires more lovelace itself
749
+ while (lovelace > (output.assets[""] ?? 0n)) {
750
+ yield* Console.log(`Updated output ${i} to contain ${lovelace} lovelace (${"" in output.assets ? `contained only ${output.assets[""]} before` : `didn't contain any lovelace before`})`);
751
+ output = {
733
752
  ...output,
734
753
  assets: {
735
754
  ...output.assets,
736
755
  "": lovelace
737
756
  }
738
757
  };
758
+ outputs[i] = output;
759
+ lovelace = yield* TxOutput.minLovelace(output);
739
760
  }
740
761
  }
762
+ // sort all assets
763
+ for (let i = 0; i < outputs.length; i++) {
764
+ outputs[i] = {
765
+ ...outputs[i],
766
+ assets: Assets.sort()(outputs[i].assets)
767
+ };
768
+ }
741
769
  return outputs;
742
770
  });
743
771
  const selectCollateralInputs = Effect.gen(function* () {
@@ -802,6 +830,7 @@ const buildRedeemersWithCost = (tx) => Effect.gen(function* () {
802
830
  * Rebuild the redeemers to make sure the indices point to the correct policy/input/withdrawal/dcert
803
831
  */
804
832
  tx = yield* buildRedeemersWithoutCost(tx);
833
+ yield* Console.log("rebuilt redeemers without cost");
805
834
  /**
806
835
  * Now calculate the cost of each redeemer
807
836
  */
@@ -842,11 +871,26 @@ const redeemerValidatorHash = (redeemer) => {
842
871
  }
843
872
  };
844
873
  const profileRedeemer = (b, tx) => (vh, redeemerIndex) => Effect.gen(function* () {
874
+ yield* Console.log(`Profiling redeemer of ${vh}`);
845
875
  const script = getUplcScript(b, vh);
846
- const args = yield* Uplc.ScriptContext.makeArgs(script.version, tx, redeemerIndex);
876
+ const args = yield* ScriptContext.makeArgs(script.version, tx, redeemerIndex);
847
877
  const costModel = yield* Network.Params.costModel(script.version);
878
+ yield* Console.log(`Evaluating script`);
848
879
  const profile = yield* Uplc.Script.eval(script, args, costModel);
880
+ yield* Console.log(`Done evaluating script`);
849
881
  if (profile.value._tag == "Left") {
882
+ yield* Console.log(profile.value.left);
883
+ yield* Console.error(`Script evaluation failed`);
884
+ yield* Console.log(`Script cborHex: ${Bytes.toHex(script.root)}`);
885
+ for (const arg of args) {
886
+ if (Uplc.Value.isData(arg)) {
887
+ yield* Console.log(Bytes.toHex(Uplc.Data.encode(arg.data)));
888
+ }
889
+ else {
890
+ yield* Console.log(arg);
891
+ }
892
+ }
893
+ yield* Console.log(``);
850
894
  // TODO: return a RuntimeError with nice stack trace
851
895
  return yield* Effect.fail(new Error(profile.value.left.error));
852
896
  }
@@ -880,21 +924,35 @@ const selectCoinsForBalancing = CoinSelection.smallestFirst({
880
924
  allowSelectingUninvolvedAssets: true
881
925
  });
882
926
  const balanceTx = (tx) => Effect.gen(function* () {
927
+ yield* Console.log("Balancing tx...");
928
+ const balancingWallet = yield* BalancingWallet;
929
+ const changeAddress = yield* balancingWallet.changeAddress;
930
+ const spareUTxOs = yield* balancingWallet.utxos;
931
+ /**
932
+ * Lookup or create the change output (TODO: support multiple change outputs?)
933
+ */
934
+ let changeOutput = tx.body.outputs.find((output) => output.address == changeAddress &&
935
+ output.datum === undefined &&
936
+ output.refScript === undefined);
937
+ const nonChangeOutputs = tx.body.outputs.filter((output) => output != changeOutput);
938
+ /**
939
+ * Create the change output if no change output was found
940
+ */
941
+ if (changeOutput === undefined) {
942
+ changeOutput = {
943
+ address: changeAddress,
944
+ assets: {}
945
+ };
946
+ }
883
947
  const inputAssets = UTxO.sumAssets(...tx.body.inputs);
884
- const outputAssets = Assets.sum(...tx.body.outputs.map((output) => output.assets));
948
+ // don't count the changeOutput!
949
+ const outputAssets = Assets.sum(...nonChangeOutputs.map((output) => output.assets));
885
950
  const feeAssets = { "": tx.body.fee };
886
951
  const mintedAssets = tx.body.minted;
952
+ yield* Console.log("Summing assets...");
887
953
  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
954
  const selectAndAddInputs = (amount) => Effect.gen(function* () {
955
+ yield* Console.log("Selecting coins...");
898
956
  const extraInputs = yield* selectCoinsForBalancing(UTxO.difference(spareUTxOs ?? [], tx.body.inputs.concat(tx.body.refInputs)), amount);
899
957
  net = Assets.add(net, UTxO.sumAssets(...extraInputs));
900
958
  tx = {
@@ -912,38 +970,26 @@ const balanceTx = (tx) => Effect.gen(function* () {
912
970
  yield* selectAndAddInputs(Assets.negate(Assets.filterNegative(net)));
913
971
  }
914
972
  /**
915
- * Handle the unlikely event that the tx is already balanced with the extraInputs
973
+ * `net` must be positive at this point
916
974
  */
917
- if (Assets.isEmpty(net)) {
918
- return tx;
975
+ if (!Assets.isEmpty(Assets.filterNegative(net))) {
976
+ throw new Error("net not positive");
919
977
  }
920
978
  if (Address.isValidator(changeAddress)) {
921
979
  throw new Error("can't send change to validator");
922
980
  }
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
- }
981
+ changeOutput = {
982
+ ...changeOutput,
983
+ assets: Assets.sort()(net)
984
+ };
985
+ net = {};
940
986
  const minLovelace = yield* TxOutput.minLovelace(changeOutput);
941
987
  let diff = minLovelace - (changeOutput.assets[""] ?? 0n);
942
988
  while (diff > 0n) {
943
- yield* selectAndAddInputs({ "": diff });
989
+ yield* selectAndAddInputs(Assets.add({ "": diff }, Assets.negate(Assets.filterNegative(changeOutput.assets))));
944
990
  changeOutput = {
945
991
  ...changeOutput,
946
- assets: Assets.add(changeOutput.assets, Assets.filterPositive(net))
992
+ assets: Assets.sort()(Assets.add(changeOutput.assets, net))
947
993
  };
948
994
  net = {};
949
995
  diff =