@indigo-labs/indigo-sdk 0.1.21 → 0.1.23
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/.github/workflows/ci.yml +3 -8
- package/.github/workflows/test.yml +44 -0
- package/dist/index.d.mts +670 -1291
- package/dist/index.d.ts +670 -1291
- package/dist/index.js +2240 -4669
- package/dist/index.mjs +2221 -4618
- package/eslint.config.mjs +1 -7
- package/package.json +4 -9
- package/src/contracts/cdp.ts +746 -0
- package/src/contracts/collector.ts +98 -0
- package/src/contracts/gov.ts +1 -0
- package/src/contracts/interest-oracle.ts +149 -0
- package/src/contracts/{lrp/transactions.ts → lrp.ts} +14 -14
- package/src/contracts/{one-shot/transactions.ts → one-shot.ts} +3 -3
- package/src/contracts/stability-pool.ts +690 -0
- package/src/contracts/staking.ts +348 -0
- package/src/contracts/treasury.ts +112 -0
- package/src/helpers/asset-helpers.ts +63 -0
- package/src/{utils → helpers}/helper-txs.ts +0 -1
- package/src/{utils/utils.ts → helpers/helpers.ts} +10 -0
- package/src/{contracts/interest-oracle/helpers.ts → helpers/interest-oracle.ts} +9 -37
- package/src/{contracts/stability-pool/helpers.ts → helpers/stability-pool-helpers.ts} +6 -110
- package/src/helpers/staking-helpers.ts +94 -0
- package/src/helpers/time-helpers.ts +4 -0
- package/src/{utils → helpers}/value-helpers.ts +0 -10
- package/src/index.ts +33 -38
- package/src/{validators → scripts}/cdp-creator-validator.ts +50 -4
- package/src/{validators → scripts}/cdp-validator.ts +5 -3
- package/src/{validators → scripts}/collector-validator.ts +3 -2
- package/src/scripts/execute-validator.ts +52 -0
- package/src/{validators/governance-validator.ts → scripts/gov-validator.ts} +40 -3
- package/src/{validators → scripts}/interest-oracle-validator.ts +20 -4
- package/src/scripts/lrp-validator.ts +40 -0
- package/src/{contracts/one-shot/scripts.ts → scripts/one-shot-policy.ts} +1 -1
- package/src/scripts/poll-manager-validator.ts +52 -0
- package/src/{validators → scripts}/poll-shard-validator.ts +43 -3
- package/src/{contracts/price-oracle/scripts.ts → scripts/price-oracle-validator.ts} +4 -1
- package/src/{validators → scripts}/stability-pool-validator.ts +57 -4
- package/src/{validators → scripts}/staking-validator.ts +3 -2
- package/src/{validators → scripts}/treasury-validator.ts +3 -2
- package/src/{validators → scripts}/version-record-policy.ts +23 -4
- package/src/{validators/execute-validator.ts → scripts/version-registry.ts} +11 -3
- package/src/types/generic.ts +60 -78
- package/src/{contracts/cdp-creator/types.ts → types/indigo/cdp-creator.ts} +4 -6
- package/src/types/indigo/cdp.ts +88 -0
- package/src/types/indigo/execute.ts +21 -0
- package/src/types/indigo/gov.ts +51 -0
- package/src/{contracts/interest-oracle/types.ts → types/indigo/interest-oracle.ts} +1 -1
- package/src/{contracts/lrp/types.ts → types/indigo/lrp.ts} +2 -2
- package/src/types/indigo/poll-manager.ts +21 -0
- package/src/types/indigo/poll-shard.ts +16 -0
- package/src/{contracts/price-oracle/types.ts → types/indigo/price-oracle.ts} +4 -16
- package/src/types/indigo/stability-pool.ts +233 -0
- package/src/types/indigo/staking.ts +99 -0
- package/src/{contracts/version-registry/types.ts → types/indigo/version-record.ts} +1 -1
- package/src/types/on-chain-decimal.ts +0 -22
- package/src/types/system-params.ts +11 -22
- package/tests/datums.test.ts +108 -125
- package/tests/endpoints/initialize.ts +338 -240
- package/tests/hash-checks.test.ts +21 -26
- package/tests/indigo-test-helpers.ts +55 -1
- package/tests/initialize.test.ts +5 -10
- package/tests/interest-calculations.test.ts +18 -18
- package/tests/interest-oracle.test.ts +18 -20
- package/tests/lrp.test.ts +65 -191
- package/tests/queries/governance-queries.ts +16 -19
- package/tests/queries/iasset-queries.ts +23 -46
- package/tests/queries/interest-oracle-queries.ts +6 -3
- package/tests/queries/lrp-queries.ts +2 -2
- package/tests/queries/price-oracle-queries.ts +22 -5
- package/tests/queries/stability-pool-queries.ts +8 -10
- package/tests/queries/staking-queries.ts +19 -28
- package/tests/stability-pool.test.ts +71 -186
- package/tests/staking.test.ts +23 -30
- package/tests/test-helpers.ts +2 -11
- package/tsconfig.json +1 -3
- package/vitest.config.ts +1 -1
- package/src/contracts/cdp/helpers.ts +0 -167
- package/src/contracts/cdp/scripts.ts +0 -33
- package/src/contracts/cdp/transactions.ts +0 -1310
- package/src/contracts/cdp/types.ts +0 -161
- package/src/contracts/cdp-creator/scripts.ts +0 -39
- package/src/contracts/collector/scripts.ts +0 -32
- package/src/contracts/collector/transactions.ts +0 -44
- package/src/contracts/execute/scripts.ts +0 -48
- package/src/contracts/execute/types.ts +0 -57
- package/src/contracts/gov/helpers.ts +0 -157
- package/src/contracts/gov/scripts.ts +0 -34
- package/src/contracts/gov/transactions.ts +0 -1224
- package/src/contracts/gov/types-new.ts +0 -115
- package/src/contracts/gov/types.ts +0 -89
- package/src/contracts/interest-oracle/scripts.ts +0 -18
- package/src/contracts/interest-oracle/transactions.ts +0 -149
- package/src/contracts/lrp/scripts.ts +0 -27
- package/src/contracts/poll/helpers.ts +0 -55
- package/src/contracts/poll/scripts.ts +0 -72
- package/src/contracts/poll/types-poll-manager.ts +0 -38
- package/src/contracts/poll/types-poll-shard.ts +0 -38
- package/src/contracts/poll/types-poll.ts +0 -88
- package/src/contracts/price-oracle/transactions.ts +0 -112
- package/src/contracts/stability-pool/scripts.ts +0 -46
- package/src/contracts/stability-pool/transactions.ts +0 -660
- package/src/contracts/stability-pool/types-new.ts +0 -208
- package/src/contracts/stability-pool/types.ts +0 -42
- package/src/contracts/staking/helpers.ts +0 -116
- package/src/contracts/staking/scripts.ts +0 -41
- package/src/contracts/staking/transactions.ts +0 -268
- package/src/contracts/staking/types-new.ts +0 -81
- package/src/contracts/staking/types.ts +0 -41
- package/src/contracts/treasury/scripts.ts +0 -37
- package/src/contracts/treasury/transactions.ts +0 -44
- package/src/contracts/treasury/types.ts +0 -55
- package/src/contracts/version-registry/scripts.ts +0 -29
- package/src/contracts/version-registry/types-new.ts +0 -19
- package/src/contracts/vesting/helpers.ts +0 -267
- package/src/types/evolution-schema-options.ts +0 -16
- package/src/utils/bigint-utils.ts +0 -7
- package/src/utils/time-helpers.ts +0 -4
- package/src/validators/lrp-validator.ts +0 -7
- package/src/validators/poll-manager-validator.ts +0 -7
- package/src/validators/version-registry-validator.ts +0 -7
- package/tests/cdp.test.ts +0 -1565
- package/tests/gov.test.ts +0 -1874
- package/tests/mock/assets-mock.ts +0 -59
- package/tests/queries/cdp-queries.ts +0 -144
- package/tests/queries/collector-queries.ts +0 -26
- package/tests/queries/execute-queries.ts +0 -46
- package/tests/queries/poll-queries.ts +0 -97
- package/tests/queries/treasury-queries.ts +0 -19
- package/tests/utils/asserts.ts +0 -13
- package/tests/utils/index.ts +0 -50
- /package/src/{utils → helpers}/indigo-helpers.ts +0 -0
- /package/src/{utils → helpers}/lucid-utils.ts +0 -0
- /package/src/{contracts/price-oracle/helpers.ts → helpers/price-oracle-helpers.ts} +0 -0
- /package/src/{contracts/one-shot/types.ts → types/one-shot.ts} +0 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Address,
|
|
3
|
+
applyParamsToScript,
|
|
4
|
+
Constr,
|
|
5
|
+
Data,
|
|
6
|
+
fromText,
|
|
7
|
+
LucidEvolution,
|
|
8
|
+
OutRef,
|
|
9
|
+
SpendingValidator,
|
|
10
|
+
TxBuilder,
|
|
11
|
+
UTxO,
|
|
12
|
+
validatorToAddress,
|
|
13
|
+
validatorToScriptHash,
|
|
14
|
+
} from '@lucid-evolution/lucid';
|
|
15
|
+
import {
|
|
16
|
+
ScriptReferences,
|
|
17
|
+
StakingParams,
|
|
18
|
+
SystemParams,
|
|
19
|
+
} from '../types/system-params';
|
|
20
|
+
import { addrDetails, scriptRef } from '../helpers/lucid-utils';
|
|
21
|
+
import { _stakingValidator } from '../scripts/staking-validator';
|
|
22
|
+
import {
|
|
23
|
+
serialiseStakingDatum,
|
|
24
|
+
StakingManagerContent,
|
|
25
|
+
StakingPositionContent,
|
|
26
|
+
} from '../types/indigo/staking';
|
|
27
|
+
import { StakingHelpers } from '../helpers/staking-helpers';
|
|
28
|
+
|
|
29
|
+
export class StakingContract {
|
|
30
|
+
static async openPosition(
|
|
31
|
+
amount: bigint,
|
|
32
|
+
params: SystemParams,
|
|
33
|
+
lucid: LucidEvolution,
|
|
34
|
+
stakingManagerRef?: OutRef,
|
|
35
|
+
): Promise<TxBuilder> {
|
|
36
|
+
const [pkh, _] = await addrDetails(lucid);
|
|
37
|
+
|
|
38
|
+
const stakingManagerOut = stakingManagerRef
|
|
39
|
+
? await StakingHelpers.findStakingManagerByOutRef(
|
|
40
|
+
stakingManagerRef,
|
|
41
|
+
lucid,
|
|
42
|
+
)
|
|
43
|
+
: await StakingHelpers.findStakingManager(params, lucid);
|
|
44
|
+
const stakingScriptRef = await StakingContract.scriptRef(
|
|
45
|
+
params.scriptReferences,
|
|
46
|
+
lucid,
|
|
47
|
+
);
|
|
48
|
+
const stakingTokenScriptRefUtxo =
|
|
49
|
+
await StakingContract.stakingTokenScriptRef(
|
|
50
|
+
params.scriptReferences,
|
|
51
|
+
lucid,
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const newStakingManagerDatum: StakingManagerContent = {
|
|
55
|
+
totalStake: stakingManagerOut.datum.totalStake + amount,
|
|
56
|
+
managerSnapshot: {
|
|
57
|
+
snapshotAda: stakingManagerOut.datum.managerSnapshot.snapshotAda,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const stakingPositionDatum: StakingPositionContent = {
|
|
62
|
+
owner: pkh.hash,
|
|
63
|
+
lockedAmount: new Map([]),
|
|
64
|
+
positionSnapshot: {
|
|
65
|
+
snapshotAda: stakingManagerOut.datum.managerSnapshot.snapshotAda,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const stakingToken =
|
|
70
|
+
params.stakingParams.stakingToken[0].unCurrencySymbol +
|
|
71
|
+
fromText(params.stakingParams.stakingToken[1].unTokenName);
|
|
72
|
+
const indyToken =
|
|
73
|
+
params.stakingParams.indyToken[0].unCurrencySymbol +
|
|
74
|
+
fromText(params.stakingParams.indyToken[1].unTokenName);
|
|
75
|
+
return lucid
|
|
76
|
+
.newTx()
|
|
77
|
+
.collectFrom([stakingManagerOut.utxo], Data.to(new Constr(0, [pkh.hash])))
|
|
78
|
+
.readFrom([stakingScriptRef])
|
|
79
|
+
.pay.ToContract(
|
|
80
|
+
stakingManagerOut.utxo.address,
|
|
81
|
+
{
|
|
82
|
+
kind: 'inline',
|
|
83
|
+
value: serialiseStakingDatum({
|
|
84
|
+
StakingManager: { content: newStakingManagerDatum },
|
|
85
|
+
}),
|
|
86
|
+
},
|
|
87
|
+
stakingManagerOut.utxo.assets,
|
|
88
|
+
)
|
|
89
|
+
.readFrom([stakingTokenScriptRefUtxo])
|
|
90
|
+
.mintAssets(
|
|
91
|
+
{
|
|
92
|
+
[stakingToken]: 1n,
|
|
93
|
+
},
|
|
94
|
+
Data.void(),
|
|
95
|
+
)
|
|
96
|
+
.pay.ToContract(
|
|
97
|
+
StakingContract.address(params.stakingParams, lucid),
|
|
98
|
+
{
|
|
99
|
+
kind: 'inline',
|
|
100
|
+
value: serialiseStakingDatum({
|
|
101
|
+
StakingPosition: { content: stakingPositionDatum },
|
|
102
|
+
}),
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
[stakingToken]: 1n,
|
|
106
|
+
[indyToken]: amount,
|
|
107
|
+
},
|
|
108
|
+
)
|
|
109
|
+
.addSignerKey(pkh.hash);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static async adjustPosition(
|
|
113
|
+
stakingPositionRef: OutRef,
|
|
114
|
+
amount: bigint,
|
|
115
|
+
params: SystemParams,
|
|
116
|
+
lucid: LucidEvolution,
|
|
117
|
+
stakingManagerRef?: OutRef,
|
|
118
|
+
): Promise<TxBuilder> {
|
|
119
|
+
const [pkh, _] = await addrDetails(lucid);
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
|
|
122
|
+
const stakingPositionOut = await StakingHelpers.findStakingPositionByOutRef(
|
|
123
|
+
stakingPositionRef,
|
|
124
|
+
lucid,
|
|
125
|
+
);
|
|
126
|
+
const stakingManagerOut = stakingManagerRef
|
|
127
|
+
? await StakingHelpers.findStakingManagerByOutRef(
|
|
128
|
+
stakingManagerRef,
|
|
129
|
+
lucid,
|
|
130
|
+
)
|
|
131
|
+
: await StakingHelpers.findStakingManager(params, lucid);
|
|
132
|
+
|
|
133
|
+
const stakingScriptRef = await StakingContract.scriptRef(
|
|
134
|
+
params.scriptReferences,
|
|
135
|
+
lucid,
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const stakingToken =
|
|
139
|
+
params.stakingParams.stakingToken[0].unCurrencySymbol +
|
|
140
|
+
fromText(params.stakingParams.stakingToken[1].unTokenName);
|
|
141
|
+
const stakingManagerToken =
|
|
142
|
+
params.stakingParams.stakingManagerNFT[0].unCurrencySymbol +
|
|
143
|
+
fromText(params.stakingParams.stakingManagerNFT[1].unTokenName);
|
|
144
|
+
const indyToken =
|
|
145
|
+
params.stakingParams.indyToken[0].unCurrencySymbol +
|
|
146
|
+
fromText(params.stakingParams.indyToken[1].unTokenName);
|
|
147
|
+
|
|
148
|
+
const existingIndyAmount = stakingPositionOut.utxo.assets[indyToken] ?? 0n;
|
|
149
|
+
const currentSnapshotAda =
|
|
150
|
+
stakingManagerOut.datum.managerSnapshot.snapshotAda;
|
|
151
|
+
const oldSnapshotAda =
|
|
152
|
+
stakingPositionOut.datum.positionSnapshot.snapshotAda;
|
|
153
|
+
const adaReward =
|
|
154
|
+
((currentSnapshotAda - oldSnapshotAda) * existingIndyAmount) /
|
|
155
|
+
(1000000n * 1000000n);
|
|
156
|
+
|
|
157
|
+
const newLockedAmount = new Map<bigint, [bigint, bigint]>();
|
|
158
|
+
for (const [key, value] of stakingPositionOut.datum.lockedAmount) {
|
|
159
|
+
if (value[1] > now) {
|
|
160
|
+
newLockedAmount.set(key, [value[0], value[1]]);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return lucid
|
|
164
|
+
.newTx()
|
|
165
|
+
.validFrom(Date.now())
|
|
166
|
+
.readFrom([stakingScriptRef])
|
|
167
|
+
.collectFrom([stakingPositionOut.utxo], Data.to(new Constr(3, [amount])))
|
|
168
|
+
.collectFrom([stakingManagerOut.utxo], Data.to(new Constr(1, [])))
|
|
169
|
+
.pay.ToContract(
|
|
170
|
+
stakingManagerOut.utxo.address,
|
|
171
|
+
{
|
|
172
|
+
kind: 'inline',
|
|
173
|
+
value: serialiseStakingDatum({
|
|
174
|
+
StakingManager: {
|
|
175
|
+
content: {
|
|
176
|
+
...stakingManagerOut.datum,
|
|
177
|
+
totalStake: stakingManagerOut.datum.totalStake + amount,
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
}),
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
lovelace: stakingManagerOut.utxo.assets.lovelace - adaReward,
|
|
184
|
+
[stakingManagerToken]: 1n,
|
|
185
|
+
},
|
|
186
|
+
)
|
|
187
|
+
.pay.ToContract(
|
|
188
|
+
stakingPositionOut.utxo.address,
|
|
189
|
+
{
|
|
190
|
+
kind: 'inline',
|
|
191
|
+
value: serialiseStakingDatum({
|
|
192
|
+
StakingPosition: {
|
|
193
|
+
content: {
|
|
194
|
+
...stakingPositionOut.datum,
|
|
195
|
+
lockedAmount: newLockedAmount,
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
}),
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
[stakingToken]: 1n,
|
|
202
|
+
[indyToken]: stakingPositionOut.utxo.assets[indyToken] + amount,
|
|
203
|
+
},
|
|
204
|
+
)
|
|
205
|
+
.addSignerKey(pkh.hash);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
static async closePosition(
|
|
209
|
+
stakingPositionRef: OutRef,
|
|
210
|
+
params: SystemParams,
|
|
211
|
+
lucid: LucidEvolution,
|
|
212
|
+
stakingManagerRef?: OutRef,
|
|
213
|
+
): Promise<TxBuilder> {
|
|
214
|
+
const [pkh, _] = await addrDetails(lucid);
|
|
215
|
+
|
|
216
|
+
const stakingPositionOut = await StakingHelpers.findStakingPositionByOutRef(
|
|
217
|
+
stakingPositionRef,
|
|
218
|
+
lucid,
|
|
219
|
+
);
|
|
220
|
+
const stakingManagerOut = stakingManagerRef
|
|
221
|
+
? await StakingHelpers.findStakingManagerByOutRef(
|
|
222
|
+
stakingManagerRef,
|
|
223
|
+
lucid,
|
|
224
|
+
)
|
|
225
|
+
: await StakingHelpers.findStakingManager(params, lucid);
|
|
226
|
+
|
|
227
|
+
const stakingScriptRef = await StakingContract.scriptRef(
|
|
228
|
+
params.scriptReferences,
|
|
229
|
+
lucid,
|
|
230
|
+
);
|
|
231
|
+
const stakingTokenScriptRefUtxo =
|
|
232
|
+
await StakingContract.stakingTokenScriptRef(
|
|
233
|
+
params.scriptReferences,
|
|
234
|
+
lucid,
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
const stakingToken =
|
|
238
|
+
params.stakingParams.stakingToken[0].unCurrencySymbol +
|
|
239
|
+
fromText(params.stakingParams.stakingToken[1].unTokenName);
|
|
240
|
+
const stakingManagerToken =
|
|
241
|
+
params.stakingParams.stakingManagerNFT[0].unCurrencySymbol +
|
|
242
|
+
fromText(params.stakingParams.stakingManagerNFT[1].unTokenName);
|
|
243
|
+
const indyToken =
|
|
244
|
+
params.stakingParams.indyToken[0].unCurrencySymbol +
|
|
245
|
+
fromText(params.stakingParams.indyToken[1].unTokenName);
|
|
246
|
+
|
|
247
|
+
const existingIndyAmount = stakingPositionOut.utxo.assets[indyToken] ?? 0n;
|
|
248
|
+
const currentSnapshotAda =
|
|
249
|
+
stakingManagerOut.datum.managerSnapshot.snapshotAda;
|
|
250
|
+
const oldSnapshotAda =
|
|
251
|
+
stakingPositionOut.datum.positionSnapshot.snapshotAda;
|
|
252
|
+
const adaReward =
|
|
253
|
+
((currentSnapshotAda - oldSnapshotAda) * existingIndyAmount) /
|
|
254
|
+
(1000000n * 1000000n);
|
|
255
|
+
|
|
256
|
+
return lucid
|
|
257
|
+
.newTx()
|
|
258
|
+
.validFrom(Date.now())
|
|
259
|
+
.readFrom([stakingScriptRef])
|
|
260
|
+
.readFrom([stakingTokenScriptRefUtxo])
|
|
261
|
+
.collectFrom([stakingPositionOut.utxo], Data.to(new Constr(4, [])))
|
|
262
|
+
.collectFrom([stakingManagerOut.utxo], Data.to(new Constr(1, [])))
|
|
263
|
+
.pay.ToContract(
|
|
264
|
+
stakingManagerOut.utxo.address,
|
|
265
|
+
{
|
|
266
|
+
kind: 'inline',
|
|
267
|
+
value: serialiseStakingDatum({
|
|
268
|
+
StakingManager: {
|
|
269
|
+
content: {
|
|
270
|
+
...stakingManagerOut.datum,
|
|
271
|
+
totalStake:
|
|
272
|
+
stakingManagerOut.datum.totalStake - existingIndyAmount,
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
}),
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
lovelace: stakingManagerOut.utxo.assets.lovelace - adaReward,
|
|
279
|
+
[stakingManagerToken]: 1n,
|
|
280
|
+
},
|
|
281
|
+
)
|
|
282
|
+
.mintAssets(
|
|
283
|
+
{
|
|
284
|
+
[stakingToken]: -1n,
|
|
285
|
+
},
|
|
286
|
+
Data.void(),
|
|
287
|
+
)
|
|
288
|
+
.addSignerKey(pkh.hash);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Staking Validator
|
|
292
|
+
static validator(params: StakingParams): SpendingValidator {
|
|
293
|
+
return {
|
|
294
|
+
type: 'PlutusV2',
|
|
295
|
+
script: applyParamsToScript(_stakingValidator.cborHex, [
|
|
296
|
+
new Constr(0, [
|
|
297
|
+
new Constr(0, [
|
|
298
|
+
params.stakingManagerNFT[0].unCurrencySymbol,
|
|
299
|
+
fromText(params.stakingManagerNFT[1].unTokenName),
|
|
300
|
+
]),
|
|
301
|
+
new Constr(0, [
|
|
302
|
+
params.stakingToken[0].unCurrencySymbol,
|
|
303
|
+
fromText(params.stakingToken[1].unTokenName),
|
|
304
|
+
]),
|
|
305
|
+
new Constr(0, [
|
|
306
|
+
params.indyToken[0].unCurrencySymbol,
|
|
307
|
+
fromText(params.indyToken[1].unTokenName),
|
|
308
|
+
]),
|
|
309
|
+
new Constr(0, [
|
|
310
|
+
params.pollToken[0].unCurrencySymbol,
|
|
311
|
+
fromText(params.pollToken[1].unTokenName),
|
|
312
|
+
]),
|
|
313
|
+
new Constr(0, [
|
|
314
|
+
params.versionRecordToken[0].unCurrencySymbol,
|
|
315
|
+
fromText(params.versionRecordToken[1].unTokenName),
|
|
316
|
+
]),
|
|
317
|
+
params.collectorValHash,
|
|
318
|
+
]),
|
|
319
|
+
]),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
static validatorHash(params: StakingParams): string {
|
|
324
|
+
return validatorToScriptHash(StakingContract.validator(params));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
static address(params: StakingParams, lucid: LucidEvolution): Address {
|
|
328
|
+
const network = lucid.config().network;
|
|
329
|
+
if (!network) {
|
|
330
|
+
throw new Error('Network configuration is undefined');
|
|
331
|
+
}
|
|
332
|
+
return validatorToAddress(network, StakingContract.validator(params));
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
static async scriptRef(
|
|
336
|
+
params: ScriptReferences,
|
|
337
|
+
lucid: LucidEvolution,
|
|
338
|
+
): Promise<UTxO> {
|
|
339
|
+
return scriptRef(params.stakingValidatorRef, lucid);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
static async stakingTokenScriptRef(
|
|
343
|
+
params: ScriptReferences,
|
|
344
|
+
lucid: LucidEvolution,
|
|
345
|
+
): Promise<UTxO> {
|
|
346
|
+
return scriptRef(params.authTokenPolicies.stakingTokenRef, lucid);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Address,
|
|
3
|
+
applyParamsToScript,
|
|
4
|
+
Constr,
|
|
5
|
+
Data,
|
|
6
|
+
fromText,
|
|
7
|
+
LucidEvolution,
|
|
8
|
+
OutRef,
|
|
9
|
+
SpendingValidator,
|
|
10
|
+
TxBuilder,
|
|
11
|
+
UTxO,
|
|
12
|
+
validatorToAddress,
|
|
13
|
+
validatorToScriptHash,
|
|
14
|
+
} from '@lucid-evolution/lucid';
|
|
15
|
+
import { _treasuryValidator } from '../scripts/treasury-validator';
|
|
16
|
+
import {
|
|
17
|
+
ScriptReferences,
|
|
18
|
+
SystemParams,
|
|
19
|
+
TreasuryParams,
|
|
20
|
+
} from '../types/system-params';
|
|
21
|
+
import { scriptRef } from '../helpers/lucid-utils';
|
|
22
|
+
import { getRandomElement } from '../helpers/helpers';
|
|
23
|
+
|
|
24
|
+
export class TreasuryContract {
|
|
25
|
+
static async feeTx(
|
|
26
|
+
fee: bigint,
|
|
27
|
+
lucid: LucidEvolution,
|
|
28
|
+
params: SystemParams,
|
|
29
|
+
tx: TxBuilder,
|
|
30
|
+
treasuryRef?: OutRef,
|
|
31
|
+
): Promise<void> {
|
|
32
|
+
const treasuryUtxo: UTxO = treasuryRef
|
|
33
|
+
? getRandomElement(await lucid.utxosByOutRef([treasuryRef]))
|
|
34
|
+
: getRandomElement(
|
|
35
|
+
await lucid.utxosAt(
|
|
36
|
+
TreasuryContract.address(params.treasuryParams, lucid),
|
|
37
|
+
),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const treasuryScriptRefUtxo = await TreasuryContract.scriptRef(
|
|
41
|
+
params.scriptReferences,
|
|
42
|
+
lucid,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
tx.collectFrom([treasuryUtxo], Data.to(new Constr(4, [])))
|
|
46
|
+
.pay.ToContract(
|
|
47
|
+
treasuryUtxo.address,
|
|
48
|
+
{ kind: 'inline', value: treasuryUtxo.datum || '' },
|
|
49
|
+
{
|
|
50
|
+
...treasuryUtxo.assets,
|
|
51
|
+
lovelace: treasuryUtxo.assets['lovelace'] + fee,
|
|
52
|
+
},
|
|
53
|
+
)
|
|
54
|
+
.readFrom([treasuryScriptRefUtxo]);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// treasury Validator
|
|
58
|
+
static validator(params: TreasuryParams): SpendingValidator {
|
|
59
|
+
return {
|
|
60
|
+
type: 'PlutusV2',
|
|
61
|
+
script: applyParamsToScript(_treasuryValidator.cborHex, [
|
|
62
|
+
new Constr(0, [
|
|
63
|
+
new Constr(0, [
|
|
64
|
+
params.upgradeToken[0].unCurrencySymbol,
|
|
65
|
+
fromText(params.upgradeToken[1].unTokenName),
|
|
66
|
+
]),
|
|
67
|
+
new Constr(0, [
|
|
68
|
+
params.versionRecordToken[0].unCurrencySymbol,
|
|
69
|
+
fromText(params.versionRecordToken[1].unTokenName),
|
|
70
|
+
]),
|
|
71
|
+
params.treasuryUtxosStakeCredential
|
|
72
|
+
? new Constr(0, [
|
|
73
|
+
new Constr(0, [
|
|
74
|
+
new Constr(1, [
|
|
75
|
+
params.treasuryUtxosStakeCredential.contents.contents,
|
|
76
|
+
]),
|
|
77
|
+
]),
|
|
78
|
+
])
|
|
79
|
+
: new Constr(1, []),
|
|
80
|
+
]),
|
|
81
|
+
]),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static validatorHash(params: TreasuryParams): string {
|
|
86
|
+
return validatorToScriptHash(TreasuryContract.validator(params));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static address(params: TreasuryParams, lucid: LucidEvolution): Address {
|
|
90
|
+
const network = lucid.config().network;
|
|
91
|
+
if (!network) {
|
|
92
|
+
throw new Error('Network configuration is undefined');
|
|
93
|
+
}
|
|
94
|
+
return validatorToAddress(
|
|
95
|
+
network,
|
|
96
|
+
TreasuryContract.validator(params),
|
|
97
|
+
params.treasuryUtxosStakeCredential
|
|
98
|
+
? {
|
|
99
|
+
type: 'Script',
|
|
100
|
+
hash: params.treasuryUtxosStakeCredential.contents.contents,
|
|
101
|
+
}
|
|
102
|
+
: undefined,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
static async scriptRef(
|
|
107
|
+
params: ScriptReferences,
|
|
108
|
+
lucid: LucidEvolution,
|
|
109
|
+
): Promise<UTxO> {
|
|
110
|
+
return scriptRef(params.treasuryValidatorRef, lucid);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { fromText, LucidEvolution, OutRef, UTxO } from '@lucid-evolution/lucid';
|
|
2
|
+
import { CDPContract } from '../contracts/cdp';
|
|
3
|
+
import { SystemParams } from '../types/system-params';
|
|
4
|
+
import { IAssetContent, parseIAssetDatum } from '../types/indigo/cdp';
|
|
5
|
+
|
|
6
|
+
export type IAssetOutput = { utxo: UTxO; datum: IAssetContent };
|
|
7
|
+
|
|
8
|
+
export class IAssetHelpers {
|
|
9
|
+
static async findIAssetByRef(
|
|
10
|
+
outRef: OutRef,
|
|
11
|
+
lucid: LucidEvolution,
|
|
12
|
+
): Promise<IAssetOutput> {
|
|
13
|
+
return lucid
|
|
14
|
+
.utxosByOutRef([outRef])
|
|
15
|
+
.then((utxos) =>
|
|
16
|
+
utxos
|
|
17
|
+
.map((utxo) => {
|
|
18
|
+
if (!utxo.datum) return undefined;
|
|
19
|
+
const datum = parseIAssetDatum(utxo.datum);
|
|
20
|
+
return { utxo, datum };
|
|
21
|
+
})
|
|
22
|
+
.find((utxo) => utxo !== undefined),
|
|
23
|
+
)
|
|
24
|
+
.then((result) => {
|
|
25
|
+
if (!result)
|
|
26
|
+
throw new Error('Unable to locate IAsset by output reference.');
|
|
27
|
+
return result;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static async findIAssetByName(
|
|
32
|
+
assetName: string,
|
|
33
|
+
params: SystemParams,
|
|
34
|
+
lucid: LucidEvolution,
|
|
35
|
+
): Promise<IAssetOutput> {
|
|
36
|
+
console.log(
|
|
37
|
+
CDPContract.address(params.cdpParams, lucid),
|
|
38
|
+
params.cdpParams.iAssetAuthToken[0].unCurrencySymbol +
|
|
39
|
+
fromText(params.cdpParams.iAssetAuthToken[1].unTokenName),
|
|
40
|
+
);
|
|
41
|
+
return lucid
|
|
42
|
+
.utxosAtWithUnit(
|
|
43
|
+
CDPContract.address(params.cdpParams, lucid),
|
|
44
|
+
params.cdpParams.iAssetAuthToken[0].unCurrencySymbol +
|
|
45
|
+
fromText(params.cdpParams.iAssetAuthToken[1].unTokenName),
|
|
46
|
+
)
|
|
47
|
+
.then((utxos) => {
|
|
48
|
+
console.log('iasset utxos', utxos);
|
|
49
|
+
return utxos
|
|
50
|
+
.map((utxo) => {
|
|
51
|
+
if (!utxo.datum) return undefined;
|
|
52
|
+
const datum = parseIAssetDatum(utxo.datum);
|
|
53
|
+
if (datum.assetName !== fromText(assetName)) return undefined;
|
|
54
|
+
return { utxo, datum };
|
|
55
|
+
})
|
|
56
|
+
.find((utxo) => utxo !== undefined);
|
|
57
|
+
})
|
|
58
|
+
.then((result) => {
|
|
59
|
+
if (!result) throw new Error('Unable to locate IAsset by name.');
|
|
60
|
+
return result;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
import { alwaysFailValidator } from '../scripts/always-fail-validator';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* TODO: remove this, it should be part of the testsuite only
|
|
12
11
|
* Uses an always fail validator for the destination address.
|
|
13
12
|
*/
|
|
14
13
|
export async function runCreateScriptRefTx(
|
|
@@ -14,6 +14,16 @@ export function matchSingle<T>(xs: T[], mkErr: (xs: T[]) => Error): T {
|
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
export function calculateFeeFromPercentage(
|
|
18
|
+
percent: bigint,
|
|
19
|
+
amount: bigint,
|
|
20
|
+
): bigint {
|
|
21
|
+
if (amount <= 0n) return 0n;
|
|
22
|
+
const a = (amount * percent) / 1_000_000n;
|
|
23
|
+
const b = BigInt(100_000_000);
|
|
24
|
+
return (a * 1_000_000n) / b;
|
|
25
|
+
}
|
|
26
|
+
|
|
17
27
|
export function loadSystemParamsFromFile(file: string): SystemParams {
|
|
18
28
|
return JSON.parse(fs.readFileSync(file, 'utf-8')) as SystemParams;
|
|
19
29
|
}
|
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import { InterestOracleDatum } from '
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
OCD_DECIMAL_UNIT,
|
|
5
|
-
ocdAdd,
|
|
6
|
-
ocdCeil,
|
|
7
|
-
ocdMul,
|
|
8
|
-
OnChainDecimal,
|
|
9
|
-
} from '../../types/on-chain-decimal';
|
|
1
|
+
import { InterestOracleDatum } from '../types/indigo/interest-oracle';
|
|
2
|
+
import { oneYear } from '../helpers/time-helpers';
|
|
10
3
|
|
|
11
4
|
const unitaryInterestPrecision = 1_000_000_000_000_000_000n;
|
|
5
|
+
const decimalUnit = 1_000_000n;
|
|
12
6
|
|
|
13
7
|
export function calculateUnitaryInterest(
|
|
14
8
|
timePeriod: bigint,
|
|
@@ -16,8 +10,8 @@ export function calculateUnitaryInterest(
|
|
|
16
10
|
): bigint {
|
|
17
11
|
return (
|
|
18
12
|
(timePeriod * interestRate * unitaryInterestPrecision) /
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
oneYear /
|
|
14
|
+
decimalUnit
|
|
21
15
|
);
|
|
22
16
|
}
|
|
23
17
|
|
|
@@ -47,8 +41,8 @@ export function calculateAccruedInterest(
|
|
|
47
41
|
((now - interestOracleDatum.lastUpdated) *
|
|
48
42
|
interestOracleDatum.interestRate.getOnChainInt *
|
|
49
43
|
mintedAmount) /
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
oneYear /
|
|
45
|
+
decimalUnit;
|
|
52
46
|
|
|
53
47
|
return interestFromPreviousRates + lastRateInterest;
|
|
54
48
|
} else {
|
|
@@ -56,30 +50,8 @@ export function calculateAccruedInterest(
|
|
|
56
50
|
((now - interestLastSettled) *
|
|
57
51
|
interestOracleDatum.interestRate.getOnChainInt *
|
|
58
52
|
mintedAmount) /
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
oneYear /
|
|
54
|
+
decimalUnit
|
|
61
55
|
);
|
|
62
56
|
}
|
|
63
57
|
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Calculate the amount of interest needed to achieve 100% collateral ratio.
|
|
67
|
-
*/
|
|
68
|
-
export function computeInterestLovelacesFor100PercentCR(
|
|
69
|
-
collateral: bigint,
|
|
70
|
-
mintedAmt: bigint,
|
|
71
|
-
price: OnChainDecimal,
|
|
72
|
-
): bigint {
|
|
73
|
-
const amt = ocdCeil(
|
|
74
|
-
ocdAdd(
|
|
75
|
-
{ getOnChainInt: collateral * OCD_DECIMAL_UNIT },
|
|
76
|
-
ocdMul({ getOnChainInt: -mintedAmt * OCD_DECIMAL_UNIT }, price),
|
|
77
|
-
),
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
if (amt <= 0) {
|
|
81
|
-
return 0n;
|
|
82
|
-
} else {
|
|
83
|
-
return amt;
|
|
84
|
-
}
|
|
85
|
-
}
|