@indigo-labs/indigo-sdk 0.3.10 → 0.3.11
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/dist/index.d.mts +47 -10
- package/dist/index.d.ts +47 -10
- package/dist/index.js +139 -59
- package/dist/index.mjs +145 -65
- package/package.json +1 -1
- package/src/contracts/cdp/transactions.ts +32 -8
- package/src/contracts/gov/helpers.ts +58 -0
- package/src/contracts/gov/transactions.ts +31 -0
- package/src/contracts/iasset/helpers.ts +2 -0
- package/src/contracts/staking/transactions.ts +3 -0
- package/src/contracts/treasury/transactions.ts +58 -36
- package/src/contracts/treasury/types-new.ts +1 -1
- package/src/validators/cdp-creator-validator.ts +1 -1
- package/src/validators/cdp-redeem-validator.ts +1 -1
- package/src/validators/cdp-validator.ts +1 -1
- package/src/validators/collector-validator.ts +1 -1
- package/src/validators/execute-validator.ts +1 -1
- package/src/validators/governance-validator.ts +1 -1
- package/src/validators/interest-collection-validator.ts +1 -1
- package/src/validators/interest-oracle-validator.ts +1 -1
- package/src/validators/poll-manager-validator.ts +1 -1
- package/src/validators/poll-shard-validator.ts +1 -1
- package/src/validators/stability-pool-validator.ts +1 -1
- package/src/validators/stableswap-validator.ts +1 -1
- package/src/validators/staking-validator.ts +1 -1
- package/src/validators/treasury-validator.ts +1 -1
- package/tests/cdp/actions.ts +87 -6
- package/tests/cdp/cdp.test.ts +949 -94
- package/tests/gov/gov.test.ts +864 -1
- package/tests/queries/treasury-queries.ts +6 -1
- package/tests/stability-pool.test.ts +251 -25
package/tests/cdp/cdp.test.ts
CHANGED
|
@@ -205,6 +205,65 @@ describe('CDP', () => {
|
|
|
205
205
|
{ min: 199, max: 200 },
|
|
206
206
|
);
|
|
207
207
|
});
|
|
208
|
+
test<MyContext>('Open CDP; ADA collateral - direct treasury payment', async (context: MyContext) => {
|
|
209
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
210
|
+
|
|
211
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
212
|
+
context.lucid,
|
|
213
|
+
[iusdInitialAssetCfg()],
|
|
214
|
+
context.emulator.slot,
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
218
|
+
|
|
219
|
+
const [_, addedValueInTreasury] = await getValueChangeAtAddressAfterAction(
|
|
220
|
+
context.lucid,
|
|
221
|
+
mkTreasuryAddr(context.lucid, sysParams),
|
|
222
|
+
async () =>
|
|
223
|
+
benchmarkAndAwaitTx(
|
|
224
|
+
'CDP - Open CDP; ADA collateral - direct treasury payment',
|
|
225
|
+
await runOpenCdp(
|
|
226
|
+
context,
|
|
227
|
+
sysParams,
|
|
228
|
+
'iUSD',
|
|
229
|
+
adaAssetClass,
|
|
230
|
+
10_000_000n,
|
|
231
|
+
5_000_000n,
|
|
232
|
+
undefined,
|
|
233
|
+
// Direct treasury payment.
|
|
234
|
+
true,
|
|
235
|
+
),
|
|
236
|
+
context.lucid,
|
|
237
|
+
context.emulator,
|
|
238
|
+
),
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
const cdp = await findOwnCdp(
|
|
242
|
+
context.lucid,
|
|
243
|
+
sysParams.validatorHashes.cdpHash,
|
|
244
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
const iAssetAc = {
|
|
248
|
+
currencySymbol: fromHex(
|
|
249
|
+
sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
|
|
250
|
+
),
|
|
251
|
+
tokenName: fromHex(fromText(iusdAssetInfo.iassetTokenNameAscii)),
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
assert(
|
|
255
|
+
// A 0.5% of 5,000,000 minted iAsset go to treasury.
|
|
256
|
+
assetClassValueOf(addedValueInTreasury, iAssetAc) == 25_000n &&
|
|
257
|
+
// Extra ADA had to be paid to cover the minimum.
|
|
258
|
+
lovelacesAmt(addedValueInTreasury) > 1_000_000n,
|
|
259
|
+
'Unexpected value received by the treasury',
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
assertValueInRange(
|
|
263
|
+
await findCdpCR(context.lucid, sysParams, cdp, context.emulator.slot),
|
|
264
|
+
{ min: 199, max: 200 },
|
|
265
|
+
);
|
|
266
|
+
});
|
|
208
267
|
test<MyContext>('Open CDP; non-ADA collateral asset', async (context: MyContext) => {
|
|
209
268
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
210
269
|
|
|
@@ -266,6 +325,69 @@ describe('CDP', () => {
|
|
|
266
325
|
);
|
|
267
326
|
});
|
|
268
327
|
|
|
328
|
+
test<MyContext>('Open CDP; non-ADA collateral asset - direct treasury payment', async (context: MyContext) => {
|
|
329
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
330
|
+
|
|
331
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
332
|
+
context.lucid,
|
|
333
|
+
[
|
|
334
|
+
{
|
|
335
|
+
...iusdInitialAssetCfg(),
|
|
336
|
+
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
context.emulator.slot,
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
const [_, addedValueInTreasury] = await getValueChangeAtAddressAfterAction(
|
|
343
|
+
context.lucid,
|
|
344
|
+
mkTreasuryAddr(context.lucid, sysParams),
|
|
345
|
+
async () =>
|
|
346
|
+
benchmarkAndAwaitTx(
|
|
347
|
+
'CDP - Open CDP; non-ADA collateral - direct treasury payment',
|
|
348
|
+
await runOpenCdp(
|
|
349
|
+
context,
|
|
350
|
+
sysParams,
|
|
351
|
+
'iUSD',
|
|
352
|
+
collateralAssetA,
|
|
353
|
+
10_000_000n,
|
|
354
|
+
5_000_000n,
|
|
355
|
+
undefined,
|
|
356
|
+
// Direct treasury payment.
|
|
357
|
+
true,
|
|
358
|
+
),
|
|
359
|
+
context.lucid,
|
|
360
|
+
context.emulator,
|
|
361
|
+
),
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
const cdp = await findOwnCdp(
|
|
365
|
+
context.lucid,
|
|
366
|
+
sysParams.validatorHashes.cdpHash,
|
|
367
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
const iAssetAc = {
|
|
371
|
+
currencySymbol: fromHex(
|
|
372
|
+
sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
|
|
373
|
+
),
|
|
374
|
+
tokenName: fromHex(fromText(iusdAssetInfo.iassetTokenNameAscii)),
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
assert(
|
|
378
|
+
// A 0.5% of 5,000,000 minted iAsset go to treasury.
|
|
379
|
+
assetClassValueOf(addedValueInTreasury, iAssetAc) == 25_000n &&
|
|
380
|
+
// Extra ADA had to be paid to cover the minimum.
|
|
381
|
+
lovelacesAmt(addedValueInTreasury) > 1_000_000n,
|
|
382
|
+
'Unexpected value received by the treasury',
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
assertValueInRange(
|
|
386
|
+
await findCdpCR(context.lucid, sysParams, cdp, context.emulator.slot),
|
|
387
|
+
{ min: 199, max: 200 },
|
|
388
|
+
);
|
|
389
|
+
});
|
|
390
|
+
|
|
269
391
|
// This tests opening a CDP with a collateral asset with 8 decimals, such as xBTC.
|
|
270
392
|
test<MyContext>('Open CDP; non-ADA collateral asset with more decimals', async (context: MyContext) => {
|
|
271
393
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
@@ -1046,7 +1168,7 @@ describe('CDP', () => {
|
|
|
1046
1168
|
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
1047
1169
|
|
|
1048
1170
|
await expectScriptFailure(
|
|
1049
|
-
'
|
|
1171
|
+
'H',
|
|
1050
1172
|
runTestAdjustCdpDelisted(
|
|
1051
1173
|
context,
|
|
1052
1174
|
sysParams,
|
|
@@ -1603,7 +1725,7 @@ describe('CDP', () => {
|
|
|
1603
1725
|
iusdInitialAssetCfg().debtMintingFeeRatio,
|
|
1604
1726
|
rationalFromInt(debtAdjustment),
|
|
1605
1727
|
),
|
|
1606
|
-
),
|
|
1728
|
+
) && lovelacesAmt(treasuryValChange) < 700_000n,
|
|
1607
1729
|
'Unexpected value received by the treasury',
|
|
1608
1730
|
);
|
|
1609
1731
|
|
|
@@ -1619,16 +1741,12 @@ describe('CDP', () => {
|
|
|
1619
1741
|
expect(lovelacesAmt(cdpAfterAction.utxo.assets)).toBe(initialCollateral);
|
|
1620
1742
|
});
|
|
1621
1743
|
|
|
1622
|
-
test<
|
|
1744
|
+
test<IndigoTestContext>('Mint CDP w/ interest; ADA collateral - direct treasury payment', async (context: IndigoTestContext) => {
|
|
1623
1745
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
1746
|
+
|
|
1624
1747
|
const [sysParams, [iusdAssetInfo]] = await init(
|
|
1625
1748
|
context.lucid,
|
|
1626
|
-
[
|
|
1627
|
-
{
|
|
1628
|
-
...iusdInitialAssetCfg(),
|
|
1629
|
-
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
1630
|
-
},
|
|
1631
|
-
],
|
|
1749
|
+
[iusdInitialAssetCfg()],
|
|
1632
1750
|
context.emulator.slot,
|
|
1633
1751
|
);
|
|
1634
1752
|
|
|
@@ -1643,7 +1761,7 @@ describe('CDP', () => {
|
|
|
1643
1761
|
context,
|
|
1644
1762
|
sysParams,
|
|
1645
1763
|
iasset,
|
|
1646
|
-
|
|
1764
|
+
adaAssetClass,
|
|
1647
1765
|
initialCollateral,
|
|
1648
1766
|
initialMint,
|
|
1649
1767
|
),
|
|
@@ -1655,7 +1773,7 @@ describe('CDP', () => {
|
|
|
1655
1773
|
context,
|
|
1656
1774
|
sysParams,
|
|
1657
1775
|
iusdAssetInfo,
|
|
1658
|
-
|
|
1776
|
+
adaAssetClass,
|
|
1659
1777
|
rationalFromInt(1n),
|
|
1660
1778
|
);
|
|
1661
1779
|
|
|
@@ -1691,13 +1809,15 @@ describe('CDP', () => {
|
|
|
1691
1809
|
],
|
|
1692
1810
|
async () =>
|
|
1693
1811
|
benchmarkAndAwaitTx(
|
|
1694
|
-
'CDP - Mint CDP w/ interest;
|
|
1812
|
+
'CDP - Mint CDP w/ interest; ADA collateral - direct treasury payment',
|
|
1695
1813
|
await runMintCdp(
|
|
1696
1814
|
context,
|
|
1697
1815
|
sysParams,
|
|
1698
1816
|
'iUSD',
|
|
1699
|
-
|
|
1817
|
+
adaAssetClass,
|
|
1700
1818
|
debtAdjustment,
|
|
1819
|
+
undefined,
|
|
1820
|
+
true,
|
|
1701
1821
|
),
|
|
1702
1822
|
context.lucid,
|
|
1703
1823
|
context.emulator,
|
|
@@ -1728,7 +1848,7 @@ describe('CDP', () => {
|
|
|
1728
1848
|
iusdInitialAssetCfg().debtMintingFeeRatio,
|
|
1729
1849
|
rationalFromInt(debtAdjustment),
|
|
1730
1850
|
),
|
|
1731
|
-
),
|
|
1851
|
+
) && lovelacesAmt(treasuryValChange) > 1_000_000n,
|
|
1732
1852
|
'Unexpected value received by the treasury',
|
|
1733
1853
|
);
|
|
1734
1854
|
|
|
@@ -1741,47 +1861,301 @@ describe('CDP', () => {
|
|
|
1741
1861
|
expect(cdpAfterAction.datum.mintedAmt).toBe(
|
|
1742
1862
|
initialMint + 100_000n + interestPaid,
|
|
1743
1863
|
);
|
|
1744
|
-
expect(
|
|
1745
|
-
assetClassValueOf(cdpAfterAction.utxo.assets, collateralAssetA),
|
|
1746
|
-
).toBe(initialCollateral);
|
|
1864
|
+
expect(lovelacesAmt(cdpAfterAction.utxo.assets)).toBe(initialCollateral);
|
|
1747
1865
|
});
|
|
1748
1866
|
|
|
1749
|
-
test<
|
|
1867
|
+
test<MyContext>('Mint CDP w/ interest; non-ADA collateral', async (context: MyContext) => {
|
|
1750
1868
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
1751
1869
|
const [sysParams, [iusdAssetInfo]] = await init(
|
|
1752
1870
|
context.lucid,
|
|
1753
|
-
[
|
|
1871
|
+
[
|
|
1872
|
+
{
|
|
1873
|
+
...iusdInitialAssetCfg(),
|
|
1874
|
+
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
1875
|
+
},
|
|
1876
|
+
],
|
|
1754
1877
|
context.emulator.slot,
|
|
1755
1878
|
);
|
|
1756
1879
|
|
|
1757
1880
|
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
1881
|
+
const iasset = 'iUSD';
|
|
1882
|
+
const initialCollateral = 12_000_000n;
|
|
1883
|
+
const initialMint = 500_000n;
|
|
1884
|
+
|
|
1758
1885
|
await runAndAwaitTx(
|
|
1759
1886
|
context.lucid,
|
|
1760
1887
|
runOpenCdp(
|
|
1761
1888
|
context,
|
|
1762
1889
|
sysParams,
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1890
|
+
iasset,
|
|
1891
|
+
collateralAssetA,
|
|
1892
|
+
initialCollateral,
|
|
1893
|
+
initialMint,
|
|
1767
1894
|
),
|
|
1768
1895
|
);
|
|
1769
1896
|
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1897
|
+
context.emulator.awaitSlot(60500);
|
|
1898
|
+
|
|
1899
|
+
await runFeedPriceToOracle(
|
|
1900
|
+
context,
|
|
1901
|
+
sysParams,
|
|
1902
|
+
iusdAssetInfo,
|
|
1903
|
+
collateralAssetA,
|
|
1904
|
+
rationalFromInt(1n),
|
|
1774
1905
|
);
|
|
1775
1906
|
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1907
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
1908
|
+
|
|
1909
|
+
const debtAdjustment = 100_000n;
|
|
1910
|
+
|
|
1911
|
+
const [pkh, skh] = await addrDetails(context.lucid);
|
|
1912
|
+
|
|
1913
|
+
const cdpBeforeAction = await findCdp(
|
|
1914
|
+
context.lucid,
|
|
1915
|
+
sysParams.validatorHashes.cdpHash,
|
|
1916
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
1917
|
+
pkh.hash,
|
|
1918
|
+
skh,
|
|
1919
|
+
);
|
|
1920
|
+
|
|
1921
|
+
const cdpOwedInterest = await calculateCdpInterest(
|
|
1922
|
+
cdpBeforeAction.datum,
|
|
1923
|
+
context,
|
|
1924
|
+
sysParams,
|
|
1925
|
+
);
|
|
1926
|
+
|
|
1927
|
+
const [__, [interestCollectorValChange, treasuryValChange]] =
|
|
1928
|
+
await getValueChangeAtAddressesAfterAction(
|
|
1929
|
+
context.lucid,
|
|
1930
|
+
[
|
|
1931
|
+
createScriptAddress(
|
|
1932
|
+
context.lucid.config().network!,
|
|
1933
|
+
sysParams.validatorHashes.interestCollectionHash,
|
|
1934
|
+
),
|
|
1935
|
+
mkTreasuryAddr(context.lucid, sysParams),
|
|
1936
|
+
],
|
|
1937
|
+
async () =>
|
|
1938
|
+
benchmarkAndAwaitTx(
|
|
1939
|
+
'CDP - Mint CDP w/ interest; non-ADA collateral',
|
|
1940
|
+
await runMintCdp(
|
|
1941
|
+
context,
|
|
1942
|
+
sysParams,
|
|
1943
|
+
'iUSD',
|
|
1944
|
+
collateralAssetA,
|
|
1945
|
+
debtAdjustment,
|
|
1946
|
+
),
|
|
1947
|
+
context.lucid,
|
|
1948
|
+
context.emulator,
|
|
1949
|
+
),
|
|
1950
|
+
);
|
|
1951
|
+
|
|
1952
|
+
const iAssetAc = {
|
|
1953
|
+
currencySymbol: fromHex(
|
|
1954
|
+
sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
|
|
1955
|
+
),
|
|
1956
|
+
tokenName: fromHex(fromText(iusdAssetInfo.iassetTokenNameAscii)),
|
|
1957
|
+
};
|
|
1958
|
+
|
|
1959
|
+
const interestPaid = assetClassValueOf(
|
|
1960
|
+
interestCollectorValChange,
|
|
1961
|
+
iAssetAc,
|
|
1962
|
+
);
|
|
1963
|
+
|
|
1964
|
+
assert(
|
|
1965
|
+
interestPaid > 0 && interestPaid == cdpOwedInterest,
|
|
1966
|
+
'Expected interest paid to collector',
|
|
1967
|
+
);
|
|
1968
|
+
|
|
1969
|
+
assert(
|
|
1970
|
+
assetClassValueOf(treasuryValChange, iAssetAc) ==
|
|
1971
|
+
rationalFloor(
|
|
1972
|
+
rationalMul(
|
|
1973
|
+
iusdInitialAssetCfg().debtMintingFeeRatio,
|
|
1974
|
+
rationalFromInt(debtAdjustment),
|
|
1975
|
+
),
|
|
1976
|
+
) && lovelacesAmt(treasuryValChange) < 700_000n,
|
|
1977
|
+
'Unexpected value received by the treasury',
|
|
1978
|
+
);
|
|
1979
|
+
|
|
1980
|
+
const cdpAfterAction = await findOwnCdp(
|
|
1981
|
+
context.lucid,
|
|
1982
|
+
sysParams.validatorHashes.cdpHash,
|
|
1983
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
1984
|
+
);
|
|
1985
|
+
|
|
1986
|
+
expect(cdpAfterAction.datum.mintedAmt).toBe(
|
|
1987
|
+
initialMint + 100_000n + interestPaid,
|
|
1779
1988
|
);
|
|
1989
|
+
expect(
|
|
1990
|
+
assetClassValueOf(cdpAfterAction.utxo.assets, collateralAssetA),
|
|
1991
|
+
).toBe(initialCollateral);
|
|
1780
1992
|
});
|
|
1781
1993
|
|
|
1782
|
-
test<
|
|
1994
|
+
test<MyContext>('Mint CDP w/ interest; non-ADA collateral - direct treasury payment', async (context: MyContext) => {
|
|
1783
1995
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
1784
|
-
const [sysParams, [
|
|
1996
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
1997
|
+
context.lucid,
|
|
1998
|
+
[
|
|
1999
|
+
{
|
|
2000
|
+
...iusdInitialAssetCfg(),
|
|
2001
|
+
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
2002
|
+
},
|
|
2003
|
+
],
|
|
2004
|
+
context.emulator.slot,
|
|
2005
|
+
);
|
|
2006
|
+
|
|
2007
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
2008
|
+
const iasset = 'iUSD';
|
|
2009
|
+
const initialCollateral = 12_000_000n;
|
|
2010
|
+
const initialMint = 500_000n;
|
|
2011
|
+
|
|
2012
|
+
await runAndAwaitTx(
|
|
2013
|
+
context.lucid,
|
|
2014
|
+
runOpenCdp(
|
|
2015
|
+
context,
|
|
2016
|
+
sysParams,
|
|
2017
|
+
iasset,
|
|
2018
|
+
collateralAssetA,
|
|
2019
|
+
initialCollateral,
|
|
2020
|
+
initialMint,
|
|
2021
|
+
),
|
|
2022
|
+
);
|
|
2023
|
+
|
|
2024
|
+
context.emulator.awaitSlot(60500);
|
|
2025
|
+
|
|
2026
|
+
await runFeedPriceToOracle(
|
|
2027
|
+
context,
|
|
2028
|
+
sysParams,
|
|
2029
|
+
iusdAssetInfo,
|
|
2030
|
+
collateralAssetA,
|
|
2031
|
+
rationalFromInt(1n),
|
|
2032
|
+
);
|
|
2033
|
+
|
|
2034
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
2035
|
+
|
|
2036
|
+
const debtAdjustment = 100_000n;
|
|
2037
|
+
|
|
2038
|
+
const [pkh, skh] = await addrDetails(context.lucid);
|
|
2039
|
+
|
|
2040
|
+
const cdpBeforeAction = await findCdp(
|
|
2041
|
+
context.lucid,
|
|
2042
|
+
sysParams.validatorHashes.cdpHash,
|
|
2043
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
2044
|
+
pkh.hash,
|
|
2045
|
+
skh,
|
|
2046
|
+
);
|
|
2047
|
+
|
|
2048
|
+
const cdpOwedInterest = await calculateCdpInterest(
|
|
2049
|
+
cdpBeforeAction.datum,
|
|
2050
|
+
context,
|
|
2051
|
+
sysParams,
|
|
2052
|
+
);
|
|
2053
|
+
|
|
2054
|
+
const [__, [interestCollectorValChange, treasuryValChange]] =
|
|
2055
|
+
await getValueChangeAtAddressesAfterAction(
|
|
2056
|
+
context.lucid,
|
|
2057
|
+
[
|
|
2058
|
+
createScriptAddress(
|
|
2059
|
+
context.lucid.config().network!,
|
|
2060
|
+
sysParams.validatorHashes.interestCollectionHash,
|
|
2061
|
+
),
|
|
2062
|
+
mkTreasuryAddr(context.lucid, sysParams),
|
|
2063
|
+
],
|
|
2064
|
+
async () =>
|
|
2065
|
+
benchmarkAndAwaitTx(
|
|
2066
|
+
'CDP - Mint CDP w/ interest; non-ADA collateral - direct treasury payment',
|
|
2067
|
+
await runMintCdp(
|
|
2068
|
+
context,
|
|
2069
|
+
sysParams,
|
|
2070
|
+
'iUSD',
|
|
2071
|
+
collateralAssetA,
|
|
2072
|
+
debtAdjustment,
|
|
2073
|
+
undefined,
|
|
2074
|
+
true,
|
|
2075
|
+
),
|
|
2076
|
+
context.lucid,
|
|
2077
|
+
context.emulator,
|
|
2078
|
+
),
|
|
2079
|
+
);
|
|
2080
|
+
|
|
2081
|
+
const iAssetAc = {
|
|
2082
|
+
currencySymbol: fromHex(
|
|
2083
|
+
sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
|
|
2084
|
+
),
|
|
2085
|
+
tokenName: fromHex(fromText(iusdAssetInfo.iassetTokenNameAscii)),
|
|
2086
|
+
};
|
|
2087
|
+
|
|
2088
|
+
const interestPaid = assetClassValueOf(
|
|
2089
|
+
interestCollectorValChange,
|
|
2090
|
+
iAssetAc,
|
|
2091
|
+
);
|
|
2092
|
+
|
|
2093
|
+
assert(
|
|
2094
|
+
interestPaid > 0 && interestPaid == cdpOwedInterest,
|
|
2095
|
+
'Expected interest paid to collector',
|
|
2096
|
+
);
|
|
2097
|
+
|
|
2098
|
+
assert(
|
|
2099
|
+
assetClassValueOf(treasuryValChange, iAssetAc) ==
|
|
2100
|
+
rationalFloor(
|
|
2101
|
+
rationalMul(
|
|
2102
|
+
iusdInitialAssetCfg().debtMintingFeeRatio,
|
|
2103
|
+
rationalFromInt(debtAdjustment),
|
|
2104
|
+
),
|
|
2105
|
+
) && lovelacesAmt(treasuryValChange) > 1_000_000n,
|
|
2106
|
+
'Unexpected value received by the treasury',
|
|
2107
|
+
);
|
|
2108
|
+
|
|
2109
|
+
const cdpAfterAction = await findOwnCdp(
|
|
2110
|
+
context.lucid,
|
|
2111
|
+
sysParams.validatorHashes.cdpHash,
|
|
2112
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
2113
|
+
);
|
|
2114
|
+
|
|
2115
|
+
expect(cdpAfterAction.datum.mintedAmt).toBe(
|
|
2116
|
+
initialMint + 100_000n + interestPaid,
|
|
2117
|
+
);
|
|
2118
|
+
expect(
|
|
2119
|
+
assetClassValueOf(cdpAfterAction.utxo.assets, collateralAssetA),
|
|
2120
|
+
).toBe(initialCollateral);
|
|
2121
|
+
});
|
|
2122
|
+
|
|
2123
|
+
test<IndigoTestContext>('Mint CDP with expired oracle fails', async (context: IndigoTestContext) => {
|
|
2124
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
2125
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
2126
|
+
context.lucid,
|
|
2127
|
+
[iusdInitialAssetCfg()],
|
|
2128
|
+
context.emulator.slot,
|
|
2129
|
+
);
|
|
2130
|
+
|
|
2131
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
2132
|
+
await runAndAwaitTx(
|
|
2133
|
+
context.lucid,
|
|
2134
|
+
runOpenCdp(
|
|
2135
|
+
context,
|
|
2136
|
+
sysParams,
|
|
2137
|
+
'iUSD',
|
|
2138
|
+
adaAssetClass,
|
|
2139
|
+
12_000_000n,
|
|
2140
|
+
500_000n,
|
|
2141
|
+
),
|
|
2142
|
+
);
|
|
2143
|
+
|
|
2144
|
+
//Await until oracle is expired
|
|
2145
|
+
context.emulator.awaitSlot(
|
|
2146
|
+
Number(iusdAssetInfo.collateralAssets[0].oracleParams!.expirationPeriod) /
|
|
2147
|
+
1000,
|
|
2148
|
+
);
|
|
2149
|
+
|
|
2150
|
+
await expectScriptFailure(
|
|
2151
|
+
'X',
|
|
2152
|
+
runMintCdp(context, sysParams, 'iUSD', adaAssetClass),
|
|
2153
|
+
);
|
|
2154
|
+
});
|
|
2155
|
+
|
|
2156
|
+
test<IndigoTestContext>('Mint CDP with delisted iAsset fails', async (context: IndigoTestContext) => {
|
|
2157
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
2158
|
+
const [sysParams, [iUsdInfo]] = await init(
|
|
1785
2159
|
context.lucid,
|
|
1786
2160
|
[
|
|
1787
2161
|
{
|
|
@@ -2939,17 +3313,12 @@ describe('CDP', () => {
|
|
|
2939
3313
|
);
|
|
2940
3314
|
});
|
|
2941
3315
|
|
|
2942
|
-
test<IndigoTestContext>('Redeem CDP;
|
|
3316
|
+
test<IndigoTestContext>('Redeem CDP; ADA collateral - direct treasury payment', async (context: IndigoTestContext) => {
|
|
2943
3317
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
2944
3318
|
|
|
2945
3319
|
const [sysParams, [iusdAssetInfo]] = await init(
|
|
2946
3320
|
context.lucid,
|
|
2947
|
-
[
|
|
2948
|
-
{
|
|
2949
|
-
...iusdInitialAssetCfg(),
|
|
2950
|
-
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
2951
|
-
},
|
|
2952
|
-
],
|
|
3321
|
+
[iusdInitialAssetCfg()],
|
|
2953
3322
|
context.emulator.slot,
|
|
2954
3323
|
() => [],
|
|
2955
3324
|
{
|
|
@@ -2977,7 +3346,7 @@ describe('CDP', () => {
|
|
|
2977
3346
|
context,
|
|
2978
3347
|
sysParams,
|
|
2979
3348
|
'iUSD',
|
|
2980
|
-
|
|
3349
|
+
adaAssetClass,
|
|
2981
3350
|
50_000_000n,
|
|
2982
3351
|
10_000_000n,
|
|
2983
3352
|
),
|
|
@@ -2992,7 +3361,7 @@ describe('CDP', () => {
|
|
|
2992
3361
|
context,
|
|
2993
3362
|
sysParams,
|
|
2994
3363
|
'iUSD',
|
|
2995
|
-
|
|
3364
|
+
adaAssetClass,
|
|
2996
3365
|
20_000_000n,
|
|
2997
3366
|
10_000_000n,
|
|
2998
3367
|
),
|
|
@@ -3003,7 +3372,7 @@ describe('CDP', () => {
|
|
|
3003
3372
|
context,
|
|
3004
3373
|
sysParams,
|
|
3005
3374
|
iusdAssetInfo,
|
|
3006
|
-
|
|
3375
|
+
adaAssetClass,
|
|
3007
3376
|
{ numerator: 125n, denominator: 100n },
|
|
3008
3377
|
);
|
|
3009
3378
|
|
|
@@ -3011,34 +3380,23 @@ describe('CDP', () => {
|
|
|
3011
3380
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3012
3381
|
|
|
3013
3382
|
await benchmarkAndAwaitTx(
|
|
3014
|
-
'CDP - Redeem CDP;
|
|
3383
|
+
'CDP - Redeem CDP; ADA collateral - direct treasury payment',
|
|
3015
3384
|
await runRedeemCdp(
|
|
3016
3385
|
context,
|
|
3017
3386
|
sysParams,
|
|
3018
3387
|
iusdAssetInfo,
|
|
3019
|
-
|
|
3388
|
+
adaAssetClass,
|
|
3020
3389
|
pkh.hash,
|
|
3021
3390
|
skh,
|
|
3391
|
+
// Direct treasury payment
|
|
3392
|
+
true,
|
|
3022
3393
|
),
|
|
3023
3394
|
context.lucid,
|
|
3024
3395
|
context.emulator,
|
|
3025
3396
|
);
|
|
3026
|
-
|
|
3027
|
-
const cdp = await findCdp(
|
|
3028
|
-
context.lucid,
|
|
3029
|
-
sysParams.validatorHashes.cdpHash,
|
|
3030
|
-
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
3031
|
-
pkh.hash,
|
|
3032
|
-
skh,
|
|
3033
|
-
);
|
|
3034
|
-
|
|
3035
|
-
expect(cdp.datum.mintedAmt).toBe(6_000_000n);
|
|
3036
|
-
expect(assetClassValueOf(cdp.utxo.assets, collateralAssetA)).toBe(
|
|
3037
|
-
15_050_000n,
|
|
3038
|
-
);
|
|
3039
3397
|
});
|
|
3040
3398
|
|
|
3041
|
-
test<IndigoTestContext>('Redeem CDP; non-ADA collateral
|
|
3399
|
+
test<IndigoTestContext>('Redeem CDP; non-ADA collateral', async (context: IndigoTestContext) => {
|
|
3042
3400
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3043
3401
|
|
|
3044
3402
|
const [sysParams, [iusdAssetInfo]] = await init(
|
|
@@ -3046,14 +3404,7 @@ describe('CDP', () => {
|
|
|
3046
3404
|
[
|
|
3047
3405
|
{
|
|
3048
3406
|
...iusdInitialAssetCfg(),
|
|
3049
|
-
collateralAssets: [
|
|
3050
|
-
mkBaseCollateralAsset(
|
|
3051
|
-
collateralAssetA,
|
|
3052
|
-
0n,
|
|
3053
|
-
rationalFromInt(1n),
|
|
3054
|
-
2n,
|
|
3055
|
-
),
|
|
3056
|
-
],
|
|
3407
|
+
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
3057
3408
|
},
|
|
3058
3409
|
],
|
|
3059
3410
|
context.emulator.slot,
|
|
@@ -3084,7 +3435,7 @@ describe('CDP', () => {
|
|
|
3084
3435
|
sysParams,
|
|
3085
3436
|
'iUSD',
|
|
3086
3437
|
collateralAssetA,
|
|
3087
|
-
|
|
3438
|
+
50_000_000n,
|
|
3088
3439
|
10_000_000n,
|
|
3089
3440
|
),
|
|
3090
3441
|
);
|
|
@@ -3099,7 +3450,7 @@ describe('CDP', () => {
|
|
|
3099
3450
|
sysParams,
|
|
3100
3451
|
'iUSD',
|
|
3101
3452
|
collateralAssetA,
|
|
3102
|
-
|
|
3453
|
+
20_000_000n,
|
|
3103
3454
|
10_000_000n,
|
|
3104
3455
|
),
|
|
3105
3456
|
);
|
|
@@ -3116,9 +3467,9 @@ describe('CDP', () => {
|
|
|
3116
3467
|
// Let admin do the redemption (i.e. not the CDP's owner)
|
|
3117
3468
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3118
3469
|
|
|
3119
|
-
await
|
|
3120
|
-
|
|
3121
|
-
runRedeemCdp(
|
|
3470
|
+
await benchmarkAndAwaitTx(
|
|
3471
|
+
'CDP - Redeem CDP; non-ADA collateral',
|
|
3472
|
+
await runRedeemCdp(
|
|
3122
3473
|
context,
|
|
3123
3474
|
sysParams,
|
|
3124
3475
|
iusdAssetInfo,
|
|
@@ -3126,6 +3477,8 @@ describe('CDP', () => {
|
|
|
3126
3477
|
pkh.hash,
|
|
3127
3478
|
skh,
|
|
3128
3479
|
),
|
|
3480
|
+
context.lucid,
|
|
3481
|
+
context.emulator,
|
|
3129
3482
|
);
|
|
3130
3483
|
|
|
3131
3484
|
const cdp = await findCdp(
|
|
@@ -3138,11 +3491,11 @@ describe('CDP', () => {
|
|
|
3138
3491
|
|
|
3139
3492
|
expect(cdp.datum.mintedAmt).toBe(6_000_000n);
|
|
3140
3493
|
expect(assetClassValueOf(cdp.utxo.assets, collateralAssetA)).toBe(
|
|
3141
|
-
|
|
3494
|
+
15_050_000n,
|
|
3142
3495
|
);
|
|
3143
3496
|
});
|
|
3144
3497
|
|
|
3145
|
-
test<IndigoTestContext>('Redeem CDP; non-ADA collateral
|
|
3498
|
+
test<IndigoTestContext>('Redeem CDP; non-ADA collateral - direct treasury payment', async (context: IndigoTestContext) => {
|
|
3146
3499
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3147
3500
|
|
|
3148
3501
|
const [sysParams, [iusdAssetInfo]] = await init(
|
|
@@ -3150,14 +3503,7 @@ describe('CDP', () => {
|
|
|
3150
3503
|
[
|
|
3151
3504
|
{
|
|
3152
3505
|
...iusdInitialAssetCfg(),
|
|
3153
|
-
collateralAssets: [
|
|
3154
|
-
mkBaseCollateralAsset(
|
|
3155
|
-
collateralAssetA,
|
|
3156
|
-
0n,
|
|
3157
|
-
rationalFromInt(1n),
|
|
3158
|
-
-2n,
|
|
3159
|
-
),
|
|
3160
|
-
],
|
|
3506
|
+
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
3161
3507
|
},
|
|
3162
3508
|
],
|
|
3163
3509
|
context.emulator.slot,
|
|
@@ -3189,7 +3535,7 @@ describe('CDP', () => {
|
|
|
3189
3535
|
'iUSD',
|
|
3190
3536
|
collateralAssetA,
|
|
3191
3537
|
50_000_000n,
|
|
3192
|
-
|
|
3538
|
+
10_000_000n,
|
|
3193
3539
|
),
|
|
3194
3540
|
);
|
|
3195
3541
|
|
|
@@ -3204,7 +3550,7 @@ describe('CDP', () => {
|
|
|
3204
3550
|
'iUSD',
|
|
3205
3551
|
collateralAssetA,
|
|
3206
3552
|
20_000_000n,
|
|
3207
|
-
|
|
3553
|
+
10_000_000n,
|
|
3208
3554
|
),
|
|
3209
3555
|
);
|
|
3210
3556
|
|
|
@@ -3220,16 +3566,20 @@ describe('CDP', () => {
|
|
|
3220
3566
|
// Let admin do the redemption (i.e. not the CDP's owner)
|
|
3221
3567
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3222
3568
|
|
|
3223
|
-
await
|
|
3224
|
-
|
|
3225
|
-
runRedeemCdp(
|
|
3569
|
+
await benchmarkAndAwaitTx(
|
|
3570
|
+
'CDP - Redeem CDP; non-ADA collateral - direct treasury payment',
|
|
3571
|
+
await runRedeemCdp(
|
|
3226
3572
|
context,
|
|
3227
3573
|
sysParams,
|
|
3228
3574
|
iusdAssetInfo,
|
|
3229
3575
|
collateralAssetA,
|
|
3230
3576
|
pkh.hash,
|
|
3231
3577
|
skh,
|
|
3578
|
+
// Direct treasury payment
|
|
3579
|
+
true,
|
|
3232
3580
|
),
|
|
3581
|
+
context.lucid,
|
|
3582
|
+
context.emulator,
|
|
3233
3583
|
);
|
|
3234
3584
|
|
|
3235
3585
|
const cdp = await findCdp(
|
|
@@ -3240,18 +3590,30 @@ describe('CDP', () => {
|
|
|
3240
3590
|
skh,
|
|
3241
3591
|
);
|
|
3242
3592
|
|
|
3243
|
-
expect(cdp.datum.mintedAmt).toBe(
|
|
3593
|
+
expect(cdp.datum.mintedAmt).toBe(6_000_000n);
|
|
3244
3594
|
expect(assetClassValueOf(cdp.utxo.assets, collateralAssetA)).toBe(
|
|
3245
3595
|
15_050_000n,
|
|
3246
3596
|
);
|
|
3247
3597
|
});
|
|
3248
3598
|
|
|
3249
|
-
test<IndigoTestContext>('Redeem CDP
|
|
3599
|
+
test<IndigoTestContext>('Redeem CDP; non-ADA collateral with more decimals', async (context: IndigoTestContext) => {
|
|
3250
3600
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3251
3601
|
|
|
3252
3602
|
const [sysParams, [iusdAssetInfo]] = await init(
|
|
3253
3603
|
context.lucid,
|
|
3254
|
-
[
|
|
3604
|
+
[
|
|
3605
|
+
{
|
|
3606
|
+
...iusdInitialAssetCfg(),
|
|
3607
|
+
collateralAssets: [
|
|
3608
|
+
mkBaseCollateralAsset(
|
|
3609
|
+
collateralAssetA,
|
|
3610
|
+
0n,
|
|
3611
|
+
rationalFromInt(1n),
|
|
3612
|
+
2n,
|
|
3613
|
+
),
|
|
3614
|
+
],
|
|
3615
|
+
},
|
|
3616
|
+
],
|
|
3255
3617
|
context.emulator.slot,
|
|
3256
3618
|
() => [],
|
|
3257
3619
|
{
|
|
@@ -3272,17 +3634,213 @@ describe('CDP', () => {
|
|
|
3272
3634
|
),
|
|
3273
3635
|
);
|
|
3274
3636
|
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
// Create redeemed CDP from Admin wallet
|
|
3637
|
+
// Add iAssets to admin's wallet
|
|
3278
3638
|
await runAndAwaitTx(
|
|
3279
3639
|
context.lucid,
|
|
3280
3640
|
runOpenCdp(
|
|
3281
3641
|
context,
|
|
3282
3642
|
sysParams,
|
|
3283
3643
|
'iUSD',
|
|
3284
|
-
|
|
3285
|
-
|
|
3644
|
+
collateralAssetA,
|
|
3645
|
+
5_000_000_000n,
|
|
3646
|
+
10_000_000n,
|
|
3647
|
+
),
|
|
3648
|
+
);
|
|
3649
|
+
|
|
3650
|
+
// Create redeemed CDP from user wallet
|
|
3651
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
3652
|
+
const [pkh, skh] = await addrDetails(context.lucid);
|
|
3653
|
+
await runAndAwaitTx(
|
|
3654
|
+
context.lucid,
|
|
3655
|
+
runOpenCdp(
|
|
3656
|
+
context,
|
|
3657
|
+
sysParams,
|
|
3658
|
+
'iUSD',
|
|
3659
|
+
collateralAssetA,
|
|
3660
|
+
2_000_000_000n,
|
|
3661
|
+
10_000_000n,
|
|
3662
|
+
),
|
|
3663
|
+
);
|
|
3664
|
+
|
|
3665
|
+
// Feed price oracle
|
|
3666
|
+
await runFeedPriceToOracle(
|
|
3667
|
+
context,
|
|
3668
|
+
sysParams,
|
|
3669
|
+
iusdAssetInfo,
|
|
3670
|
+
collateralAssetA,
|
|
3671
|
+
{ numerator: 125n, denominator: 100n },
|
|
3672
|
+
);
|
|
3673
|
+
|
|
3674
|
+
// Let admin do the redemption (i.e. not the CDP's owner)
|
|
3675
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3676
|
+
|
|
3677
|
+
await runAndAwaitTx(
|
|
3678
|
+
context.lucid,
|
|
3679
|
+
runRedeemCdp(
|
|
3680
|
+
context,
|
|
3681
|
+
sysParams,
|
|
3682
|
+
iusdAssetInfo,
|
|
3683
|
+
collateralAssetA,
|
|
3684
|
+
pkh.hash,
|
|
3685
|
+
skh,
|
|
3686
|
+
),
|
|
3687
|
+
);
|
|
3688
|
+
|
|
3689
|
+
const cdp = await findCdp(
|
|
3690
|
+
context.lucid,
|
|
3691
|
+
sysParams.validatorHashes.cdpHash,
|
|
3692
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
3693
|
+
pkh.hash,
|
|
3694
|
+
skh,
|
|
3695
|
+
);
|
|
3696
|
+
|
|
3697
|
+
expect(cdp.datum.mintedAmt).toBe(6_000_000n);
|
|
3698
|
+
expect(assetClassValueOf(cdp.utxo.assets, collateralAssetA)).toBe(
|
|
3699
|
+
1_505_000_000n,
|
|
3700
|
+
);
|
|
3701
|
+
});
|
|
3702
|
+
|
|
3703
|
+
test<IndigoTestContext>('Redeem CDP; non-ADA collateral with less decimals', async (context: IndigoTestContext) => {
|
|
3704
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3705
|
+
|
|
3706
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
3707
|
+
context.lucid,
|
|
3708
|
+
[
|
|
3709
|
+
{
|
|
3710
|
+
...iusdInitialAssetCfg(),
|
|
3711
|
+
collateralAssets: [
|
|
3712
|
+
mkBaseCollateralAsset(
|
|
3713
|
+
collateralAssetA,
|
|
3714
|
+
0n,
|
|
3715
|
+
rationalFromInt(1n),
|
|
3716
|
+
-2n,
|
|
3717
|
+
),
|
|
3718
|
+
],
|
|
3719
|
+
},
|
|
3720
|
+
],
|
|
3721
|
+
context.emulator.slot,
|
|
3722
|
+
() => [],
|
|
3723
|
+
{
|
|
3724
|
+
cdpRedemptionRequiredSignature: fromHex(
|
|
3725
|
+
paymentCredentialOf(context.users.admin.address).hash,
|
|
3726
|
+
),
|
|
3727
|
+
},
|
|
3728
|
+
);
|
|
3729
|
+
|
|
3730
|
+
await runAndAwaitTx(
|
|
3731
|
+
context.lucid,
|
|
3732
|
+
feedInterestOracle(
|
|
3733
|
+
iusdAssetInfo.collateralAssets[0].interestOracleParams,
|
|
3734
|
+
0n,
|
|
3735
|
+
context.lucid,
|
|
3736
|
+
context.emulator.slot,
|
|
3737
|
+
iusdAssetInfo.collateralAssets[0].interestOracleNft,
|
|
3738
|
+
),
|
|
3739
|
+
);
|
|
3740
|
+
|
|
3741
|
+
// Add iAssets to admin's wallet
|
|
3742
|
+
await runAndAwaitTx(
|
|
3743
|
+
context.lucid,
|
|
3744
|
+
runOpenCdp(
|
|
3745
|
+
context,
|
|
3746
|
+
sysParams,
|
|
3747
|
+
'iUSD',
|
|
3748
|
+
collateralAssetA,
|
|
3749
|
+
50_000_000n,
|
|
3750
|
+
1_000_000_000n,
|
|
3751
|
+
),
|
|
3752
|
+
);
|
|
3753
|
+
|
|
3754
|
+
// Create redeemed CDP from user wallet
|
|
3755
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
3756
|
+
const [pkh, skh] = await addrDetails(context.lucid);
|
|
3757
|
+
await runAndAwaitTx(
|
|
3758
|
+
context.lucid,
|
|
3759
|
+
runOpenCdp(
|
|
3760
|
+
context,
|
|
3761
|
+
sysParams,
|
|
3762
|
+
'iUSD',
|
|
3763
|
+
collateralAssetA,
|
|
3764
|
+
20_000_000n,
|
|
3765
|
+
1_000_000_000n,
|
|
3766
|
+
),
|
|
3767
|
+
);
|
|
3768
|
+
|
|
3769
|
+
// Feed price oracle
|
|
3770
|
+
await runFeedPriceToOracle(
|
|
3771
|
+
context,
|
|
3772
|
+
sysParams,
|
|
3773
|
+
iusdAssetInfo,
|
|
3774
|
+
collateralAssetA,
|
|
3775
|
+
{ numerator: 125n, denominator: 100n },
|
|
3776
|
+
);
|
|
3777
|
+
|
|
3778
|
+
// Let admin do the redemption (i.e. not the CDP's owner)
|
|
3779
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3780
|
+
|
|
3781
|
+
await runAndAwaitTx(
|
|
3782
|
+
context.lucid,
|
|
3783
|
+
runRedeemCdp(
|
|
3784
|
+
context,
|
|
3785
|
+
sysParams,
|
|
3786
|
+
iusdAssetInfo,
|
|
3787
|
+
collateralAssetA,
|
|
3788
|
+
pkh.hash,
|
|
3789
|
+
skh,
|
|
3790
|
+
),
|
|
3791
|
+
);
|
|
3792
|
+
|
|
3793
|
+
const cdp = await findCdp(
|
|
3794
|
+
context.lucid,
|
|
3795
|
+
sysParams.validatorHashes.cdpHash,
|
|
3796
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
3797
|
+
pkh.hash,
|
|
3798
|
+
skh,
|
|
3799
|
+
);
|
|
3800
|
+
|
|
3801
|
+
expect(cdp.datum.mintedAmt).toBe(600_000_000n);
|
|
3802
|
+
expect(assetClassValueOf(cdp.utxo.assets, collateralAssetA)).toBe(
|
|
3803
|
+
15_050_000n,
|
|
3804
|
+
);
|
|
3805
|
+
});
|
|
3806
|
+
|
|
3807
|
+
test<IndigoTestContext>('Redeem CDP by unauthorized user fails', async (context: IndigoTestContext) => {
|
|
3808
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
3809
|
+
|
|
3810
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
3811
|
+
context.lucid,
|
|
3812
|
+
[iusdInitialAssetCfg()],
|
|
3813
|
+
context.emulator.slot,
|
|
3814
|
+
() => [],
|
|
3815
|
+
{
|
|
3816
|
+
cdpRedemptionRequiredSignature: fromHex(
|
|
3817
|
+
paymentCredentialOf(context.users.admin.address).hash,
|
|
3818
|
+
),
|
|
3819
|
+
},
|
|
3820
|
+
);
|
|
3821
|
+
|
|
3822
|
+
await runAndAwaitTx(
|
|
3823
|
+
context.lucid,
|
|
3824
|
+
feedInterestOracle(
|
|
3825
|
+
iusdAssetInfo.collateralAssets[0].interestOracleParams,
|
|
3826
|
+
0n,
|
|
3827
|
+
context.lucid,
|
|
3828
|
+
context.emulator.slot,
|
|
3829
|
+
iusdAssetInfo.collateralAssets[0].interestOracleNft,
|
|
3830
|
+
),
|
|
3831
|
+
);
|
|
3832
|
+
|
|
3833
|
+
const [pkh, skh] = await addrDetails(context.lucid);
|
|
3834
|
+
|
|
3835
|
+
// Create redeemed CDP from Admin wallet
|
|
3836
|
+
await runAndAwaitTx(
|
|
3837
|
+
context.lucid,
|
|
3838
|
+
runOpenCdp(
|
|
3839
|
+
context,
|
|
3840
|
+
sysParams,
|
|
3841
|
+
'iUSD',
|
|
3842
|
+
adaAssetClass,
|
|
3843
|
+
20_000_000n,
|
|
3286
3844
|
10_000_000n,
|
|
3287
3845
|
),
|
|
3288
3846
|
);
|
|
@@ -5252,6 +5810,152 @@ describe('CDP', () => {
|
|
|
5252
5810
|
}
|
|
5253
5811
|
});
|
|
5254
5812
|
|
|
5813
|
+
test<MyContext>('Liquidate CDP; ADA collateral - direct treasury payment', async (context: MyContext) => {
|
|
5814
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
5815
|
+
|
|
5816
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
5817
|
+
context.lucid,
|
|
5818
|
+
[iusdInitialAssetCfg()],
|
|
5819
|
+
context.emulator.slot,
|
|
5820
|
+
);
|
|
5821
|
+
|
|
5822
|
+
// Open CDP
|
|
5823
|
+
// This is the position that will get liquidated.
|
|
5824
|
+
await runAndAwaitTx(
|
|
5825
|
+
context.lucid,
|
|
5826
|
+
runOpenCdp(
|
|
5827
|
+
context,
|
|
5828
|
+
sysParams,
|
|
5829
|
+
'iUSD',
|
|
5830
|
+
adaAssetClass,
|
|
5831
|
+
10_000_000n,
|
|
5832
|
+
5_000_000n,
|
|
5833
|
+
),
|
|
5834
|
+
);
|
|
5835
|
+
|
|
5836
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
5837
|
+
|
|
5838
|
+
// Create Stability Pool account
|
|
5839
|
+
await runAndAwaitTx(
|
|
5840
|
+
context.lucid,
|
|
5841
|
+
runOpenCdpAndCreateSPAccount(
|
|
5842
|
+
context,
|
|
5843
|
+
sysParams,
|
|
5844
|
+
'iUSD',
|
|
5845
|
+
adaAssetClass,
|
|
5846
|
+
10_000_000n,
|
|
5847
|
+
),
|
|
5848
|
+
);
|
|
5849
|
+
|
|
5850
|
+
// Process the create account request
|
|
5851
|
+
await runAndAwaitTx(
|
|
5852
|
+
context.lucid,
|
|
5853
|
+
runProcessSpRequest(
|
|
5854
|
+
context,
|
|
5855
|
+
sysParams,
|
|
5856
|
+
'iUSD',
|
|
5857
|
+
paymentCredentialOf(context.users.user.address).hash,
|
|
5858
|
+
),
|
|
5859
|
+
);
|
|
5860
|
+
|
|
5861
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
5862
|
+
|
|
5863
|
+
await runFeedPriceToOracle(
|
|
5864
|
+
context,
|
|
5865
|
+
sysParams,
|
|
5866
|
+
iusdAssetInfo,
|
|
5867
|
+
adaAssetClass,
|
|
5868
|
+
{ numerator: 18n, denominator: 10n },
|
|
5869
|
+
);
|
|
5870
|
+
|
|
5871
|
+
// Validate that CDP CR is in Liquidation Range
|
|
5872
|
+
{
|
|
5873
|
+
const [pkh, skh] = await addrDetails(context.lucid);
|
|
5874
|
+
const cdp = await findCdp(
|
|
5875
|
+
context.lucid,
|
|
5876
|
+
sysParams.validatorHashes.cdpHash,
|
|
5877
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
5878
|
+
pkh.hash,
|
|
5879
|
+
skh,
|
|
5880
|
+
);
|
|
5881
|
+
|
|
5882
|
+
assertValueInRange(
|
|
5883
|
+
await findCdpCR(context.lucid, sysParams, cdp, context.emulator.slot),
|
|
5884
|
+
{ min: 111, max: 112 },
|
|
5885
|
+
);
|
|
5886
|
+
}
|
|
5887
|
+
|
|
5888
|
+
// We want user to do the freeze of admin's CDP
|
|
5889
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
5890
|
+
|
|
5891
|
+
await runAndAwaitTx(
|
|
5892
|
+
context.lucid,
|
|
5893
|
+
runFreezeCdp(
|
|
5894
|
+
context,
|
|
5895
|
+
sysParams,
|
|
5896
|
+
'iUSD',
|
|
5897
|
+
adaAssetClass,
|
|
5898
|
+
paymentCredentialOf(context.users.admin.address).hash,
|
|
5899
|
+
stakeCredentialOf(context.users.admin.address),
|
|
5900
|
+
),
|
|
5901
|
+
);
|
|
5902
|
+
|
|
5903
|
+
{
|
|
5904
|
+
const frozenCdp = matchSingle(
|
|
5905
|
+
await findFrozenCDPs(
|
|
5906
|
+
context.lucid,
|
|
5907
|
+
sysParams.validatorHashes.cdpHash,
|
|
5908
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
5909
|
+
iusdAssetInfo.iassetTokenNameAscii,
|
|
5910
|
+
),
|
|
5911
|
+
(_) => new Error('Expected only single frozen CDP'),
|
|
5912
|
+
);
|
|
5913
|
+
|
|
5914
|
+
const orefs = await findAllNecessaryOrefs(
|
|
5915
|
+
context.lucid,
|
|
5916
|
+
sysParams,
|
|
5917
|
+
iusdAssetInfo.iassetTokenNameAscii,
|
|
5918
|
+
adaAssetClass,
|
|
5919
|
+
);
|
|
5920
|
+
|
|
5921
|
+
await benchmarkAndAwaitTx(
|
|
5922
|
+
'CDP - Liquidate CDP; ADA collateral - direct treasury payment',
|
|
5923
|
+
await liquidateCdp(
|
|
5924
|
+
frozenCdp.utxo,
|
|
5925
|
+
orefs.stabilityPoolUtxo,
|
|
5926
|
+
orefs.interestCollectorUtxo,
|
|
5927
|
+
// Direct treasury payment
|
|
5928
|
+
undefined,
|
|
5929
|
+
sysParams,
|
|
5930
|
+
context.lucid,
|
|
5931
|
+
),
|
|
5932
|
+
context.lucid,
|
|
5933
|
+
context.emulator,
|
|
5934
|
+
);
|
|
5935
|
+
}
|
|
5936
|
+
|
|
5937
|
+
// Validate that stability pool iassets amount is 4,999,985
|
|
5938
|
+
// (5,000,000 used to burn principal and 15 used to pay interest).
|
|
5939
|
+
{
|
|
5940
|
+
const orefs = await findAllNecessaryOrefs(
|
|
5941
|
+
context.lucid,
|
|
5942
|
+
sysParams,
|
|
5943
|
+
iusdAssetInfo.iassetTokenNameAscii,
|
|
5944
|
+
adaAssetClass,
|
|
5945
|
+
);
|
|
5946
|
+
|
|
5947
|
+
expect(
|
|
5948
|
+
assetClassValueOf(orefs.stabilityPoolUtxo.assets, {
|
|
5949
|
+
currencySymbol: fromHex(
|
|
5950
|
+
sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
|
|
5951
|
+
),
|
|
5952
|
+
tokenName: fromHex(fromText(iusdAssetInfo.iassetTokenNameAscii)),
|
|
5953
|
+
}) === 4_999_985n,
|
|
5954
|
+
'Expected different stability pool iassets amount',
|
|
5955
|
+
).toBeTruthy();
|
|
5956
|
+
}
|
|
5957
|
+
});
|
|
5958
|
+
|
|
5255
5959
|
test<MyContext>('Liquidate CDP; non-ADA collateral', async (context: MyContext) => {
|
|
5256
5960
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
5257
5961
|
|
|
@@ -5402,6 +6106,157 @@ describe('CDP', () => {
|
|
|
5402
6106
|
}
|
|
5403
6107
|
});
|
|
5404
6108
|
|
|
6109
|
+
test<MyContext>('Liquidate CDP; non-ADA collateral - direct treasury payment', async (context: MyContext) => {
|
|
6110
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
6111
|
+
|
|
6112
|
+
const [sysParams, [iusdAssetInfo]] = await init(
|
|
6113
|
+
context.lucid,
|
|
6114
|
+
[
|
|
6115
|
+
{
|
|
6116
|
+
...iusdInitialAssetCfg(),
|
|
6117
|
+
collateralAssets: [mkBaseCollateralAsset(collateralAssetA)],
|
|
6118
|
+
},
|
|
6119
|
+
],
|
|
6120
|
+
context.emulator.slot,
|
|
6121
|
+
);
|
|
6122
|
+
|
|
6123
|
+
// Open CDP
|
|
6124
|
+
// This is the position that will get liquidated.
|
|
6125
|
+
await runAndAwaitTx(
|
|
6126
|
+
context.lucid,
|
|
6127
|
+
runOpenCdp(
|
|
6128
|
+
context,
|
|
6129
|
+
sysParams,
|
|
6130
|
+
'iUSD',
|
|
6131
|
+
collateralAssetA,
|
|
6132
|
+
10_000_000n,
|
|
6133
|
+
5_000_000n,
|
|
6134
|
+
),
|
|
6135
|
+
);
|
|
6136
|
+
|
|
6137
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
6138
|
+
|
|
6139
|
+
// Create Stability Pool account
|
|
6140
|
+
await runAndAwaitTx(
|
|
6141
|
+
context.lucid,
|
|
6142
|
+
runOpenCdpAndCreateSPAccount(
|
|
6143
|
+
context,
|
|
6144
|
+
sysParams,
|
|
6145
|
+
'iUSD',
|
|
6146
|
+
collateralAssetA,
|
|
6147
|
+
10_000_000n,
|
|
6148
|
+
),
|
|
6149
|
+
);
|
|
6150
|
+
|
|
6151
|
+
// Process the create account request
|
|
6152
|
+
await runAndAwaitTx(
|
|
6153
|
+
context.lucid,
|
|
6154
|
+
runProcessSpRequest(
|
|
6155
|
+
context,
|
|
6156
|
+
sysParams,
|
|
6157
|
+
'iUSD',
|
|
6158
|
+
paymentCredentialOf(context.users.user.address).hash,
|
|
6159
|
+
),
|
|
6160
|
+
);
|
|
6161
|
+
|
|
6162
|
+
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
6163
|
+
|
|
6164
|
+
await runFeedPriceToOracle(
|
|
6165
|
+
context,
|
|
6166
|
+
sysParams,
|
|
6167
|
+
iusdAssetInfo,
|
|
6168
|
+
collateralAssetA,
|
|
6169
|
+
{ numerator: 18n, denominator: 10n },
|
|
6170
|
+
);
|
|
6171
|
+
|
|
6172
|
+
// Validate that CDP CR is in Liquidation Range
|
|
6173
|
+
{
|
|
6174
|
+
const [pkh, skh] = await addrDetails(context.lucid);
|
|
6175
|
+
const cdp = await findCdp(
|
|
6176
|
+
context.lucid,
|
|
6177
|
+
sysParams.validatorHashes.cdpHash,
|
|
6178
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
6179
|
+
pkh.hash,
|
|
6180
|
+
skh,
|
|
6181
|
+
);
|
|
6182
|
+
|
|
6183
|
+
assertValueInRange(
|
|
6184
|
+
await findCdpCR(context.lucid, sysParams, cdp, context.emulator.slot),
|
|
6185
|
+
{ min: 111, max: 112 },
|
|
6186
|
+
);
|
|
6187
|
+
}
|
|
6188
|
+
|
|
6189
|
+
// We want user to do the freeze of admin's CDP
|
|
6190
|
+
context.lucid.selectWallet.fromSeed(context.users.user.seedPhrase);
|
|
6191
|
+
|
|
6192
|
+
await runAndAwaitTx(
|
|
6193
|
+
context.lucid,
|
|
6194
|
+
runFreezeCdp(
|
|
6195
|
+
context,
|
|
6196
|
+
sysParams,
|
|
6197
|
+
'iUSD',
|
|
6198
|
+
collateralAssetA,
|
|
6199
|
+
paymentCredentialOf(context.users.admin.address).hash,
|
|
6200
|
+
stakeCredentialOf(context.users.admin.address),
|
|
6201
|
+
),
|
|
6202
|
+
);
|
|
6203
|
+
|
|
6204
|
+
{
|
|
6205
|
+
const frozenCdp = matchSingle(
|
|
6206
|
+
await findFrozenCDPs(
|
|
6207
|
+
context.lucid,
|
|
6208
|
+
sysParams.validatorHashes.cdpHash,
|
|
6209
|
+
fromSystemParamsAsset(sysParams.cdpParams.cdpAuthToken),
|
|
6210
|
+
iusdAssetInfo.iassetTokenNameAscii,
|
|
6211
|
+
),
|
|
6212
|
+
(_) => new Error('Expected only single frozen CDP'),
|
|
6213
|
+
);
|
|
6214
|
+
|
|
6215
|
+
const orefs = await findAllNecessaryOrefs(
|
|
6216
|
+
context.lucid,
|
|
6217
|
+
sysParams,
|
|
6218
|
+
iusdAssetInfo.iassetTokenNameAscii,
|
|
6219
|
+
collateralAssetA,
|
|
6220
|
+
);
|
|
6221
|
+
|
|
6222
|
+
await benchmarkAndAwaitTx(
|
|
6223
|
+
'CDP - Liquidate CDP; non ADA collateral - direct treasury payment',
|
|
6224
|
+
await liquidateCdp(
|
|
6225
|
+
frozenCdp.utxo,
|
|
6226
|
+
orefs.stabilityPoolUtxo,
|
|
6227
|
+
orefs.interestCollectorUtxo,
|
|
6228
|
+
// Direct treasury payment
|
|
6229
|
+
undefined,
|
|
6230
|
+
sysParams,
|
|
6231
|
+
context.lucid,
|
|
6232
|
+
),
|
|
6233
|
+
context.lucid,
|
|
6234
|
+
context.emulator,
|
|
6235
|
+
);
|
|
6236
|
+
}
|
|
6237
|
+
|
|
6238
|
+
// Validate that stability pool iassets amount is 4,999,985
|
|
6239
|
+
// (5,000,000 used to burn principal and 15 used to pay interest).
|
|
6240
|
+
{
|
|
6241
|
+
const orefs = await findAllNecessaryOrefs(
|
|
6242
|
+
context.lucid,
|
|
6243
|
+
sysParams,
|
|
6244
|
+
iusdAssetInfo.iassetTokenNameAscii,
|
|
6245
|
+
collateralAssetA,
|
|
6246
|
+
);
|
|
6247
|
+
|
|
6248
|
+
expect(
|
|
6249
|
+
assetClassValueOf(orefs.stabilityPoolUtxo.assets, {
|
|
6250
|
+
currencySymbol: fromHex(
|
|
6251
|
+
sysParams.cdpParams.cdpAssetSymbol.unCurrencySymbol,
|
|
6252
|
+
),
|
|
6253
|
+
tokenName: fromHex(fromText(iusdAssetInfo.iassetTokenNameAscii)),
|
|
6254
|
+
}) === 4_999_985n,
|
|
6255
|
+
'Expected different stability pool iassets amount',
|
|
6256
|
+
).toBeTruthy();
|
|
6257
|
+
}
|
|
6258
|
+
});
|
|
6259
|
+
|
|
5405
6260
|
test<IndigoTestContext>('Partially liquidate CDP; ADA collateral', async (context: IndigoTestContext) => {
|
|
5406
6261
|
context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase);
|
|
5407
6262
|
|