@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.
- package/.vscode/settings.json +3 -0
- package/dist/Cardano/Ledger/AssetClass.js +6 -1
- package/dist/Cardano/Ledger/AssetClass.js.map +1 -1
- package/dist/Cardano/Ledger/Assets.js +85 -3
- package/dist/Cardano/Ledger/Assets.js.map +1 -1
- package/dist/Cardano/Ledger/Credential.js +1 -1
- package/dist/Cardano/Ledger/Credential.js.map +1 -1
- package/dist/Cardano/Ledger/DCert.js +2 -1
- package/dist/Cardano/Ledger/DCert.js.map +1 -1
- package/dist/Cardano/Ledger/DatumHash.js +2 -2
- package/dist/Cardano/Ledger/DatumHash.js.map +1 -1
- package/dist/Cardano/Ledger/MintingPolicy.js +2 -0
- package/dist/Cardano/Ledger/MintingPolicy.js.map +1 -1
- package/dist/Cardano/Ledger/NativeScript.js +2 -1
- package/dist/Cardano/Ledger/NativeScript.js.map +1 -1
- package/dist/Cardano/Ledger/PubKey.js +1 -1
- package/dist/Cardano/Ledger/PubKey.js.map +1 -1
- package/dist/Cardano/Ledger/PubKeyHash.js +1 -1
- package/dist/Cardano/Ledger/PubKeyHash.js.map +1 -1
- package/dist/Cardano/Ledger/Redeemer.js +1 -1
- package/dist/Cardano/Ledger/Redeemer.js.map +1 -1
- package/dist/Cardano/Ledger/RewardAddress.js +6 -0
- package/dist/Cardano/Ledger/RewardAddress.js.map +1 -1
- package/dist/Cardano/Ledger/Signature.js +1 -0
- package/dist/Cardano/Ledger/Signature.js.map +1 -1
- package/dist/Cardano/Ledger/Tx.js +223 -24
- package/dist/Cardano/Ledger/Tx.js.map +1 -1
- package/dist/Cardano/Ledger/TxOutput.js +12 -6
- package/dist/Cardano/Ledger/TxOutput.js.map +1 -1
- package/dist/Cardano/Ledger/TxOutputDatum.js +36 -34
- package/dist/Cardano/Ledger/TxOutputDatum.js.map +1 -1
- package/dist/Cardano/Ledger/UTxO.js +1 -1
- package/dist/Cardano/Ledger/UTxO.js.map +1 -1
- package/dist/Cardano/Ledger/UTxORef.js +1 -0
- package/dist/Cardano/Ledger/UTxORef.js.map +1 -1
- package/dist/Cardano/Ledger/ValidatorHash.js +1 -1
- package/dist/Cardano/Ledger/ValidatorHash.js.map +1 -1
- package/dist/Cardano/Network/AssetMetadata.js +11 -0
- package/dist/Cardano/Network/AssetMetadata.js.map +1 -0
- package/dist/Cardano/Network/IsMainnet.js +1 -1
- package/dist/Cardano/Network/IsMainnet.js.map +1 -1
- package/dist/Cardano/Network/Params.js +105 -1
- package/dist/Cardano/Network/Params.js.map +1 -1
- package/dist/Cardano/Network/Submit.js +15 -0
- package/dist/Cardano/Network/Submit.js.map +1 -0
- package/dist/Cardano/Network/UTxO.js +2 -2
- package/dist/Cardano/Network/UTxO.js.map +1 -1
- package/dist/Cardano/Network/UTxOsAt.js +3 -2
- package/dist/Cardano/Network/UTxOsAt.js.map +1 -1
- package/dist/Cardano/Network/errors.js +16 -3
- package/dist/Cardano/Network/errors.js.map +1 -1
- package/dist/Cardano/Network/index.js +2 -0
- package/dist/Cardano/Network/index.js.map +1 -1
- package/dist/Cardano/ScriptContext.js +264 -0
- package/dist/Cardano/ScriptContext.js.map +1 -0
- package/dist/Cardano/TxBuilder.js +88 -42
- package/dist/Cardano/TxBuilder.js.map +1 -1
- package/dist/Cardano/Uplc/Builtins.js +293 -32
- package/dist/Cardano/Uplc/Builtins.js.map +1 -1
- package/dist/Cardano/Uplc/Cek.js +6 -5
- package/dist/Cardano/Uplc/Cek.js.map +1 -1
- package/dist/Cardano/Uplc/Cost.js +257 -1
- package/dist/Cardano/Uplc/Cost.js.map +1 -1
- package/dist/Cardano/Uplc/Data.js +22 -8
- package/dist/Cardano/Uplc/Data.js.map +1 -1
- package/dist/Cardano/Uplc/Script.js +52 -10
- package/dist/Cardano/Uplc/Script.js.map +1 -1
- package/dist/Cardano/Uplc/Term.js +14 -0
- package/dist/Cardano/Uplc/Term.js.map +1 -1
- package/dist/Cardano/Uplc/index.js +2 -1
- package/dist/Cardano/Uplc/index.js.map +1 -1
- package/dist/Cardano/Wallet.js +4 -1
- package/dist/Cardano/Wallet.js.map +1 -1
- package/dist/Cardano/index.js +4 -3
- package/dist/Cardano/index.js.map +1 -1
- package/dist/Codecs/Base32.js +4 -1
- package/dist/Codecs/Base32.js.map +1 -1
- package/dist/Codecs/BigEndian.js +1 -1
- package/dist/Codecs/BigEndian.js.map +1 -1
- package/dist/Codecs/Bytes.js +1 -1
- package/dist/Codecs/Bytes.js.map +1 -1
- package/dist/Codecs/LittleEndian.js +1 -1
- package/dist/Codecs/LittleEndian.js.map +1 -1
- package/dist/Codecs/Utf8.js +1 -1
- package/dist/Codecs/Utf8.js.map +1 -1
- package/dist/Crypto/Bip32.js +5 -2
- package/dist/Crypto/Bip32.js.map +1 -1
- package/dist/Crypto/Curve.js +1 -0
- package/dist/Crypto/Curve.js.map +1 -1
- package/dist/Crypto/Ed25519.js +2 -1
- package/dist/Crypto/Ed25519.js.map +1 -1
- package/dist/Crypto/EdDSA.js +2 -1
- package/dist/Crypto/EdDSA.js.map +1 -1
- package/dist/Crypto/Sha3_256.js +1 -0
- package/dist/Crypto/Sha3_256.js.map +1 -1
- package/dist/Crypto/index.js +2 -0
- package/dist/Crypto/index.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/types/Cardano/Ledger/AssetClass.d.ts +6 -1
- package/types/Cardano/Ledger/AssetClass.d.ts.map +1 -1
- package/types/Cardano/Ledger/Assets.d.ts +14 -2
- package/types/Cardano/Ledger/Assets.d.ts.map +1 -1
- package/types/Cardano/Ledger/Credential.d.ts +1 -1
- package/types/Cardano/Ledger/Credential.d.ts.map +1 -1
- package/types/Cardano/Ledger/DatumHash.d.ts +2 -2
- package/types/Cardano/Ledger/DatumHash.d.ts.map +1 -1
- package/types/Cardano/Ledger/MintingPolicy.d.ts +1 -0
- package/types/Cardano/Ledger/MintingPolicy.d.ts.map +1 -1
- package/types/Cardano/Ledger/PubKey.d.ts +2 -2
- package/types/Cardano/Ledger/PubKey.d.ts.map +1 -1
- package/types/Cardano/Ledger/PubKeyHash.d.ts +2 -2
- package/types/Cardano/Ledger/PubKeyHash.d.ts.map +1 -1
- package/types/Cardano/Ledger/Redeemer.d.ts +1 -1
- package/types/Cardano/Ledger/Redeemer.d.ts.map +1 -1
- package/types/Cardano/Ledger/RewardAddress.d.ts.map +1 -1
- package/types/Cardano/Ledger/Signature.d.ts +1 -1
- package/types/Cardano/Ledger/Signature.d.ts.map +1 -1
- package/types/Cardano/Ledger/Tx.d.ts +22 -241
- package/types/Cardano/Ledger/Tx.d.ts.map +1 -1
- package/types/Cardano/Ledger/TxOutput.d.ts +95 -105
- package/types/Cardano/Ledger/TxOutput.d.ts.map +1 -1
- package/types/Cardano/Ledger/TxOutputDatum.d.ts +69 -68
- package/types/Cardano/Ledger/TxOutputDatum.d.ts.map +1 -1
- package/types/Cardano/Ledger/UTxO.d.ts +272 -322
- package/types/Cardano/Ledger/UTxO.d.ts.map +1 -1
- package/types/Cardano/Ledger/ValidatorHash.d.ts +2 -2
- package/types/Cardano/Ledger/ValidatorHash.d.ts.map +1 -1
- package/types/Cardano/Network/AssetMetadata.d.ts +15 -0
- package/types/Cardano/Network/AssetMetadata.d.ts.map +1 -0
- package/types/Cardano/Network/IsMainnet.d.ts +1 -1
- package/types/Cardano/Network/Params.d.ts +9 -1
- package/types/Cardano/Network/Params.d.ts.map +1 -1
- package/types/Cardano/Network/Submit.d.ts +18 -0
- package/types/Cardano/Network/Submit.d.ts.map +1 -0
- package/types/Cardano/Network/UTxO.d.ts +1 -1
- package/types/Cardano/Network/UTxO.d.ts.map +1 -1
- package/types/Cardano/Network/UTxOsAt.d.ts +2 -2
- package/types/Cardano/Network/UTxOsAt.d.ts.map +1 -1
- package/types/Cardano/Network/errors.d.ts +22 -2
- package/types/Cardano/Network/errors.d.ts.map +1 -1
- package/types/Cardano/Network/index.d.ts +2 -0
- package/types/Cardano/Network/index.d.ts.map +1 -1
- package/types/Cardano/ScriptContext.d.ts +1340 -0
- package/types/Cardano/ScriptContext.d.ts.map +1 -0
- package/types/Cardano/TxBuilder.d.ts +7 -5
- package/types/Cardano/TxBuilder.d.ts.map +1 -1
- package/types/Cardano/Uplc/Builtins.d.ts.map +1 -1
- package/types/Cardano/Uplc/Cek.d.ts.map +1 -1
- package/types/Cardano/Uplc/Cost.d.ts +1 -0
- package/types/Cardano/Uplc/Cost.d.ts.map +1 -1
- package/types/Cardano/Uplc/Data.d.ts.map +1 -1
- package/types/Cardano/Uplc/Script.d.ts +5 -3
- package/types/Cardano/Uplc/Script.d.ts.map +1 -1
- package/types/Cardano/Uplc/Term.d.ts +3 -0
- package/types/Cardano/Uplc/Term.d.ts.map +1 -1
- package/types/Cardano/Uplc/index.d.ts +2 -1
- package/types/Cardano/Uplc/index.d.ts.map +1 -1
- package/types/Cardano/Wallet.d.ts +18 -23
- package/types/Cardano/Wallet.d.ts.map +1 -1
- package/types/Cardano/index.d.ts +4 -3
- package/types/Cardano/index.d.ts.map +1 -1
- package/types/Codecs/Base32.d.ts +4 -1
- package/types/Codecs/Base32.d.ts.map +1 -1
- package/types/Crypto/Bip32.d.ts +5 -3
- package/types/Crypto/Bip32.d.ts.map +1 -1
- package/types/Crypto/EdDSA.d.ts +1 -1
- package/types/Crypto/EdDSA.d.ts.map +1 -1
- package/types/Crypto/index.d.ts +2 -0
- package/types/Crypto/index.d.ts.map +1 -1
- package/types/index.d.ts +3 -3
- package/types/index.d.ts.map +1 -1
- package/bun.lock +0 -60
- package/tsconfig.build.json +0 -14
- 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
|
|
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 &&
|
|
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
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
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*
|
|
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
|
-
|
|
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
|
-
*
|
|
973
|
+
* `net` must be positive at this point
|
|
916
974
|
*/
|
|
917
|
-
if (Assets.isEmpty(net)) {
|
|
918
|
-
|
|
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
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
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,
|
|
992
|
+
assets: Assets.sort()(Assets.add(changeOutput.assets, net))
|
|
947
993
|
};
|
|
948
994
|
net = {};
|
|
949
995
|
diff =
|