@indigo-labs/indigo-sdk 0.3.10 → 0.3.12

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.
@@ -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
- 'I',
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<MyContext>('Mint CDP w/ interest; non-ADA collateral', async (context: MyContext) => {
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
- collateralAssetA,
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
- collateralAssetA,
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; non-ADA collateral',
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
- collateralAssetA,
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<IndigoTestContext>('Mint CDP with expired oracle fails', async (context: IndigoTestContext) => {
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
- [iusdInitialAssetCfg()],
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
- 'iUSD',
1764
- adaAssetClass,
1765
- 12_000_000n,
1766
- 500_000n,
1890
+ iasset,
1891
+ collateralAssetA,
1892
+ initialCollateral,
1893
+ initialMint,
1767
1894
  ),
1768
1895
  );
1769
1896
 
1770
- //Await until oracle is expired
1771
- context.emulator.awaitSlot(
1772
- Number(iusdAssetInfo.collateralAssets[0].oracleParams!.expirationPeriod) /
1773
- 1000,
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
- await expectScriptFailure(
1777
- 'X',
1778
- runMintCdp(context, sysParams, 'iUSD', adaAssetClass),
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<IndigoTestContext>('Mint CDP with delisted iAsset fails', async (context: IndigoTestContext) => {
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, [iUsdInfo]] = await init(
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; non-ADA collateral', async (context: IndigoTestContext) => {
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
- collateralAssetA,
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
- collateralAssetA,
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
- collateralAssetA,
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; non-ADA collateral',
3383
+ 'CDP - Redeem CDP; ADA collateral - direct treasury payment',
3015
3384
  await runRedeemCdp(
3016
3385
  context,
3017
3386
  sysParams,
3018
3387
  iusdAssetInfo,
3019
- collateralAssetA,
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 with more decimals', async (context: IndigoTestContext) => {
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
- 5_000_000_000n,
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
- 2_000_000_000n,
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 runAndAwaitTx(
3120
- context.lucid,
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
- 1_505_000_000n,
3494
+ 15_050_000n,
3142
3495
  );
3143
3496
  });
3144
3497
 
3145
- test<IndigoTestContext>('Redeem CDP; non-ADA collateral with less decimals', async (context: IndigoTestContext) => {
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
- 1_000_000_000n,
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
- 1_000_000_000n,
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 runAndAwaitTx(
3224
- context.lucid,
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(600_000_000n);
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 by unauthorized user fails', async (context: IndigoTestContext) => {
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
- [iusdInitialAssetCfg()],
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
- const [pkh, skh] = await addrDetails(context.lucid);
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
- adaAssetClass,
3285
- 20_000_000n,
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