@kasufinance/kasu-sdk 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +128 -3
  2. package/dist/bundle.cjs.js +1119 -254
  3. package/dist/bundle.esm.js +1109 -255
  4. package/dist/domain/index.d.ts +3 -2
  5. package/dist/domain/index.js +2 -2
  6. package/dist/domain/index.js.map +1 -1
  7. package/dist/domain/requests.d.ts +42 -4
  8. package/dist/domain/requests.js +20 -4
  9. package/dist/domain/requests.js.map +1 -1
  10. package/dist/domain/wallet-errors.d.ts +63 -8
  11. package/dist/domain/wallet-errors.js +115 -16
  12. package/dist/domain/wallet-errors.js.map +1 -1
  13. package/dist/facade/deposits.js +2 -1
  14. package/dist/facade/deposits.js.map +1 -1
  15. package/dist/facade/flows.d.ts +95 -0
  16. package/dist/facade/flows.js +116 -0
  17. package/dist/facade/flows.js.map +1 -0
  18. package/dist/facade/index.d.ts +3 -0
  19. package/dist/facade/index.js +3 -0
  20. package/dist/facade/index.js.map +1 -1
  21. package/dist/facade/kasu.d.ts +6 -2
  22. package/dist/facade/kasu.js +28 -3
  23. package/dist/facade/kasu.js.map +1 -1
  24. package/dist/facade/read-only.d.ts +12 -0
  25. package/dist/facade/read-only.js +13 -0
  26. package/dist/facade/read-only.js.map +1 -0
  27. package/dist/flows/deposit-flow.d.ts +301 -0
  28. package/dist/flows/deposit-flow.js +358 -0
  29. package/dist/flows/deposit-flow.js.map +1 -0
  30. package/dist/flows/flow.d.ts +72 -0
  31. package/dist/flows/flow.js +110 -0
  32. package/dist/flows/flow.js.map +1 -0
  33. package/dist/flows/index.d.ts +19 -0
  34. package/dist/flows/index.js +17 -0
  35. package/dist/flows/index.js.map +1 -0
  36. package/dist/flows/observable.d.ts +59 -0
  37. package/dist/flows/observable.js +81 -0
  38. package/dist/flows/observable.js.map +1 -0
  39. package/dist/flows/withdraw-flow.d.ts +99 -0
  40. package/dist/flows/withdraw-flow.js +83 -0
  41. package/dist/flows/withdraw-flow.js.map +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +6 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/services/DataService/data-service.js +0 -1
  46. package/dist/services/DataService/data-service.js.map +1 -1
  47. package/package.json +8 -2
  48. package/src/domain/index.ts +7 -1
  49. package/src/domain/requests.ts +57 -4
  50. package/src/domain/wallet-errors.ts +135 -18
  51. package/src/facade/deposits.ts +2 -3
  52. package/src/facade/flows.ts +172 -0
  53. package/src/facade/index.ts +8 -0
  54. package/src/facade/kasu.ts +43 -3
  55. package/src/facade/read-only.ts +13 -0
  56. package/src/flows/deposit-flow.ts +775 -0
  57. package/src/flows/flow.ts +108 -0
  58. package/src/flows/index.ts +45 -0
  59. package/src/flows/observable.ts +97 -0
  60. package/src/flows/withdraw-flow.ts +210 -0
  61. package/src/index.ts +7 -0
  62. package/src/services/DataService/data-service.ts +0 -1
  63. package/dist/domain/au-minimum.test.d.ts +0 -1
  64. package/dist/domain/au-minimum.test.js +0 -202
  65. package/dist/domain/au-minimum.test.js.map +0 -1
  66. package/dist/domain/deposit-bounds.test.d.ts +0 -1
  67. package/dist/domain/deposit-bounds.test.js +0 -135
  68. package/dist/domain/deposit-bounds.test.js.map +0 -1
  69. package/dist/domain/loan-contract.test.d.ts +0 -1
  70. package/dist/domain/loan-contract.test.js +0 -255
  71. package/dist/domain/loan-contract.test.js.map +0 -1
  72. package/dist/domain/partners.test.d.ts +0 -1
  73. package/dist/domain/partners.test.js +0 -53
  74. package/dist/domain/partners.test.js.map +0 -1
  75. package/dist/domain/pools.test.d.ts +0 -1
  76. package/dist/domain/pools.test.js +0 -184
  77. package/dist/domain/pools.test.js.map +0 -1
  78. package/dist/domain/rates.test.d.ts +0 -1
  79. package/dist/domain/rates.test.js +0 -181
  80. package/dist/domain/rates.test.js.map +0 -1
  81. package/dist/domain/requests.test.d.ts +0 -1
  82. package/dist/domain/requests.test.js +0 -470
  83. package/dist/domain/requests.test.js.map +0 -1
  84. package/dist/domain/settlement.test.d.ts +0 -1
  85. package/dist/domain/settlement.test.js +0 -152
  86. package/dist/domain/settlement.test.js.map +0 -1
  87. package/dist/domain/tranche-display-name.test.d.ts +0 -1
  88. package/dist/domain/tranche-display-name.test.js +0 -58
  89. package/dist/domain/tranche-display-name.test.js.map +0 -1
  90. package/dist/domain/tranches.test.d.ts +0 -1
  91. package/dist/domain/tranches.test.js +0 -206
  92. package/dist/domain/tranches.test.js.map +0 -1
  93. package/dist/domain/wallet-errors.test.d.ts +0 -1
  94. package/dist/domain/wallet-errors.test.js +0 -71
  95. package/dist/domain/wallet-errors.test.js.map +0 -1
  96. package/dist/facade/config.test.d.ts +0 -1
  97. package/dist/facade/config.test.js +0 -216
  98. package/dist/facade/config.test.js.map +0 -1
  99. package/dist/facade/facade.test.d.ts +0 -1
  100. package/dist/facade/facade.test.js +0 -278
  101. package/dist/facade/facade.test.js.map +0 -1
  102. package/dist/services/Locking/calculate-apy.test.d.ts +0 -1
  103. package/dist/services/Locking/calculate-apy.test.js +0 -41
  104. package/dist/services/Locking/calculate-apy.test.js.map +0 -1
  105. package/dist/tests/sample.test.d.ts +0 -1
  106. package/dist/tests/sample.test.js +0 -59
  107. package/dist/tests/sample.test.js.map +0 -1
  108. package/src/domain/au-minimum.test.ts +0 -371
  109. package/src/domain/deposit-bounds.test.ts +0 -200
  110. package/src/domain/loan-contract.test.ts +0 -343
  111. package/src/domain/partners.test.ts +0 -83
  112. package/src/domain/pools.test.ts +0 -260
  113. package/src/domain/rates.test.ts +0 -254
  114. package/src/domain/requests.test.ts +0 -653
  115. package/src/domain/settlement.test.ts +0 -198
  116. package/src/domain/tranche-display-name.test.ts +0 -96
  117. package/src/domain/tranches.test.ts +0 -300
  118. package/src/domain/wallet-errors.test.ts +0 -100
  119. package/src/facade/config.test.ts +0 -265
  120. package/src/facade/facade.test.ts +0 -374
  121. package/src/services/Locking/calculate-apy.test.ts +0 -52
  122. package/src/tests/sample.test.ts +0 -63
@@ -1 +0,0 @@
1
- {"version":3,"file":"loan-contract.test.js","sourceRoot":"","sources":["../../src/domain/loan-contract.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,53 +0,0 @@
1
- import { APXIUM, getCreditOriginator, getInstitutionalLender, INVOICEMATE, RIXON_CAPITAL, } from './partners';
2
- // Ported from kasu-ui `src/features/lending/lib/strategy-partners.test.ts`.
3
- describe('getCreditOriginator', () => {
4
- it('maps "Payment Finance (PayFi)" to InvoiceMate', () => {
5
- expect(getCreditOriginator({ poolName: 'Payment Finance (PayFi)' })).toBe(INVOICEMATE);
6
- });
7
- it('keeps Apxium receivables pools as Apxium (regression: do not match "invoice")', () => {
8
- // The bug: matching the asset class ("invoice financing") wrongly
9
- // classified Apxium receivables pools as InvoiceMate. Name-only
10
- // matching fixes it — none of these names contain payfi/payment
11
- // finance.
12
- expect(getCreditOriginator({ poolName: 'Professional Fee Funding' })).toBe(APXIUM);
13
- expect(getCreditOriginator({ poolName: 'Whole Ledger Funding' })).toBe(APXIUM);
14
- expect(getCreditOriginator({ poolName: 'Taxation Funding (Tax Pay)' })).toBe(APXIUM);
15
- });
16
- it('is case-insensitive and matches the "payfi" / "payment finance" name', () => {
17
- expect(getCreditOriginator({ poolName: 'payment finance' })).toBe(INVOICEMATE);
18
- expect(getCreditOriginator({ poolName: 'PAYFI Strategy' })).toBe(INVOICEMATE);
19
- });
20
- it('defaults to Apxium for empty / missing names', () => {
21
- expect(getCreditOriginator({ poolName: '' })).toBe(APXIUM);
22
- expect(getCreditOriginator({})).toBe(APXIUM);
23
- });
24
- });
25
- describe('getCreditOriginator — the widened PoolNameSignal', () => {
26
- it('reads the facade Strategy shape (`name`)', () => {
27
- expect(getCreditOriginator({ name: 'Payment Finance (PayFi)' })).toBe(INVOICEMATE);
28
- expect(getCreditOriginator({ name: 'Taxation Funding' })).toBe(APXIUM);
29
- expect(getCreditOriginator({ name: null })).toBe(APXIUM);
30
- });
31
- it('reads a bare string', () => {
32
- expect(getCreditOriginator('Payment Finance (PayFi)')).toBe(INVOICEMATE);
33
- expect(getCreditOriginator('Whole Ledger Funding')).toBe(APXIUM);
34
- expect(getCreditOriginator('')).toBe(APXIUM);
35
- });
36
- it('prefers poolName when an object carries both', () => {
37
- const both = { poolName: 'Taxation Funding', name: 'Payment Finance' };
38
- expect(getCreditOriginator(both)).toBe(APXIUM);
39
- });
40
- it('treats an explicitly null poolName as missing, not as a match', () => {
41
- expect(getCreditOriginator({ poolName: null })).toBe(APXIUM);
42
- expect(getCreditOriginator({ poolName: undefined })).toBe(APXIUM);
43
- });
44
- });
45
- describe('getInstitutionalLender', () => {
46
- it('gives Apxium pools Rixon Capital', () => {
47
- expect(getInstitutionalLender(APXIUM)).toBe(RIXON_CAPITAL);
48
- });
49
- it('gives InvoiceMate pools no senior lender', () => {
50
- expect(getInstitutionalLender(INVOICEMATE)).toBeNull();
51
- });
52
- });
53
- //# sourceMappingURL=partners.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"partners.test.js","sourceRoot":"","sources":["../../src/domain/partners.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,184 +0,0 @@
1
- import { maxNetRateCeiling, pickHighestYieldTranche, poolMaxApy, selectVisiblePools, } from './pools';
2
- import { netEffectiveApy } from './rates';
3
- /**
4
- * Ported from kasu-ui `select-visible-pools.test.ts` and the
5
- * `pickHighestYieldTranche` / `formatMaxNetRate` cases of
6
- * `pick-best-tranche.test.ts`. The `formatMaxNetRate` assertions are on the
7
- * ceiling NUMBER here; their rendered strings stay in kasu-ui.
8
- */
9
- function tranche(name, apy, poolCapacity, maxApy) {
10
- return { id: name, name, apy, poolCapacity, maxApy };
11
- }
12
- function pool(over) {
13
- return Object.assign({ id: 'p', poolName: 'p', isActive: true, isOversubscribed: false, tranches: [tranche('Senior', '0.09', '250000', '0.10')] }, over);
14
- }
15
- const withCapacity = () => [
16
- tranche('Senior', '0.09', '250000', '0.10'),
17
- ];
18
- const noCapacity = () => [tranche('Senior', '0.09', '0', '0.10')];
19
- /** The live performance fee on all deployments. */
20
- const FEE = 10;
21
- describe('poolMaxApy', () => {
22
- it('takes the highest usable maxApy across tranches', () => {
23
- expect(poolMaxApy(pool({
24
- tranches: [
25
- tranche('Senior', '0.09', '1', '0.10'),
26
- tranche('Junior', '0.12', '1', '0.18'),
27
- ],
28
- }))).toBe(0.18);
29
- });
30
- it('is 0 when nothing is usable', () => {
31
- expect(poolMaxApy(pool({ tranches: [] }))).toBe(0);
32
- expect(poolMaxApy(pool({ tranches: [tranche('Senior', '0.09', '1', 'x')] }))).toBe(0);
33
- });
34
- });
35
- describe('selectVisiblePools', () => {
36
- it('drops inactive pools', () => {
37
- const pools = [
38
- pool({ id: 'active', isActive: true }),
39
- pool({ id: 'inactive', isActive: false }),
40
- ];
41
- expect(selectVisiblePools(pools).map((p) => p.id)).toEqual(['active']);
42
- });
43
- it('drops oversubscribed pools', () => {
44
- const pools = [
45
- pool({ id: 'open', isOversubscribed: false }),
46
- pool({ id: 'full', isOversubscribed: true }),
47
- ];
48
- expect(selectVisiblePools(pools).map((p) => p.id)).toEqual(['open']);
49
- });
50
- it('sorts pools with capacity ahead of pools without', () => {
51
- const pools = [
52
- pool({ id: 'empty', tranches: noCapacity() }),
53
- pool({ id: 'has-cap', tranches: withCapacity() }),
54
- ];
55
- expect(selectVisiblePools(pools).map((p) => p.id)).toEqual([
56
- 'has-cap',
57
- 'empty',
58
- ]);
59
- });
60
- it('sorts by highest max APY within the same capacity bucket', () => {
61
- const pools = [
62
- pool({
63
- id: 'low',
64
- tranches: [tranche('Senior', '0.08', '250000', '0.08')],
65
- }),
66
- pool({
67
- id: 'high',
68
- tranches: [tranche('Senior', '0.15', '250000', '0.15')],
69
- }),
70
- ];
71
- expect(selectVisiblePools(pools).map((p) => p.id)).toEqual([
72
- 'high',
73
- 'low',
74
- ]);
75
- });
76
- it('does not mutate the input array', () => {
77
- const pools = [
78
- pool({ id: 'a', tranches: noCapacity() }),
79
- pool({ id: 'b', tranches: withCapacity() }),
80
- ];
81
- const before = pools.map((p) => p.id);
82
- selectVisiblePools(pools);
83
- expect(pools.map((p) => p.id)).toEqual(before);
84
- });
85
- });
86
- describe('pickHighestYieldTranche', () => {
87
- const named = (poolName, tranches) => pool({ id: poolName, poolName, tranches });
88
- it('returns null for empty / nullish input', () => {
89
- expect(pickHighestYieldTranche(undefined)).toBeNull();
90
- expect(pickHighestYieldTranche(null)).toBeNull();
91
- expect(pickHighestYieldTranche([])).toBeNull();
92
- });
93
- it('picks the highest base APY across all pools with capacity', () => {
94
- const best = pickHighestYieldTranche([
95
- named('A', [tranche('Junior', '0.12', '5000')]),
96
- named('B', [
97
- tranche('Senior', '0.18', '5000'),
98
- tranche('Mezz', '0.15', '5000'),
99
- ]),
100
- ]);
101
- expect(best === null || best === void 0 ? void 0 : best.pool.poolName).toBe('B');
102
- expect(best === null || best === void 0 ? void 0 : best.tranche.name).toBe('Senior');
103
- expect(best === null || best === void 0 ? void 0 : best.apy).toBeCloseTo(0.18);
104
- });
105
- it('skips tranches without capacity (< 1 unit)', () => {
106
- const best = pickHighestYieldTranche([
107
- named('Full', [tranche('Junior', '0.30', '0')]),
108
- named('Live', [tranche('Senior', '0.10', '2000')]),
109
- ]);
110
- expect(best === null || best === void 0 ? void 0 : best.pool.poolName).toBe('Live');
111
- expect(best === null || best === void 0 ? void 0 : best.apy).toBeCloseTo(0.1);
112
- });
113
- it('breaks APY ties toward more remaining capacity', () => {
114
- const best = pickHighestYieldTranche([
115
- named('Small', [tranche('Junior', '0.15', '1000')]),
116
- named('Big', [tranche('Junior', '0.15', '9000')]),
117
- ]);
118
- expect(best === null || best === void 0 ? void 0 : best.pool.poolName).toBe('Big');
119
- });
120
- it('ignores zero / non-finite APY values', () => {
121
- const best = pickHighestYieldTranche([
122
- named('Zero', [tranche('Junior', '0', '5000')]),
123
- named('NaN', [tranche('Junior', 'not-a-number', '5000')]),
124
- named('Real', [tranche('Junior', '0.09', '5000')]),
125
- ]);
126
- expect(best === null || best === void 0 ? void 0 : best.pool.poolName).toBe('Real');
127
- });
128
- it('reads the BASE rate, not the FTD-widened maxApy', () => {
129
- // A ceiling claim and a named tranche's rate are different statements.
130
- const best = pickHighestYieldTranche([
131
- named('A', [tranche('Junior', '0.12', '5000', '0.30')]),
132
- named('B', [tranche('Senior', '0.18', '5000', '0.18')]),
133
- ]);
134
- expect(best === null || best === void 0 ? void 0 : best.pool.poolName).toBe('B');
135
- });
136
- });
137
- describe('maxNetRateCeiling', () => {
138
- const named = (poolName, tranches) => pool({ id: poolName, poolName, tranches });
139
- it('returns the highest ceiling across all pools, net of the fee', () => {
140
- const rate = maxNetRateCeiling([
141
- named('A', [tranche('Junior', '0.12', '5000', '0.18')]),
142
- named('B', [tranche('Senior', '0.10', '5000', '0.22')]),
143
- ], FEE);
144
- // 0.22 gross → 19.60% net, the same arithmetic as everywhere else.
145
- expect(rate).toBe(netEffectiveApy(0.22, FEE));
146
- expect(rate).toBeCloseTo(0.196, 4);
147
- });
148
- it('prefers the FTD-inclusive maxApy over the base rate', () => {
149
- // The strategies card's range tops out at maxApy; an "up to" claim
150
- // quoting the base rate would contradict it on the same screen.
151
- expect(maxNetRateCeiling([named('A', [tranche('Junior', '0.10', '5000', '0.22')])], FEE)).toBe(netEffectiveApy(0.22, FEE));
152
- });
153
- it('falls back to the base rate when a tranche carries no maxApy', () => {
154
- expect(maxNetRateCeiling([named('A', [tranche('Junior', '0.22', '5000')])], FEE)).toBe(netEffectiveApy(0.22, FEE));
155
- });
156
- it('skips tranches without capacity — an unreachable rate is not a claim', () => {
157
- const rate = maxNetRateCeiling([
158
- named('Full', [tranche('Junior', '0.30', '0', '0.30')]),
159
- named('Live', [tranche('Senior', '0.10', '5000', '0.10')]),
160
- ], FEE);
161
- expect(rate).toBe(netEffectiveApy(0.1, FEE));
162
- expect(rate).toBeCloseTo(0.0896, 4);
163
- });
164
- it('returns null rather than a gross figure when the fee is out of domain', () => {
165
- const pools = [named('A', [tranche('Junior', '0.22', '5000', '0.22')])];
166
- expect(maxNetRateCeiling(pools, 1000)).toBeNull();
167
- expect(maxNetRateCeiling(pools, -1)).toBeNull();
168
- expect(maxNetRateCeiling(pools, NaN)).toBeNull();
169
- // A 100% fee leaves nothing to claim.
170
- expect(maxNetRateCeiling(pools, 100)).toBeNull();
171
- });
172
- it('returns null for empty, nullish or rate-less input', () => {
173
- expect(maxNetRateCeiling(undefined, FEE)).toBeNull();
174
- expect(maxNetRateCeiling(null, FEE)).toBeNull();
175
- expect(maxNetRateCeiling([], FEE)).toBeNull();
176
- expect(maxNetRateCeiling([named('Zero', [tranche('Junior', '0', '5000', '0')])], FEE)).toBeNull();
177
- });
178
- it('agrees with the top of the tranche range it must sit alongside', () => {
179
- // Both read maxApy through netEffectiveApy; they must not disagree.
180
- const tranches = [tranche('Senior', '0.14', '5000', '0.22')];
181
- expect(maxNetRateCeiling([named('A', tranches)], FEE)).toBe(netEffectiveApy(0.22, FEE));
182
- });
183
- });
184
- //# sourceMappingURL=pools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pools.test.js","sourceRoot":"","sources":["../../src/domain/pools.test.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,kBAAkB,GACrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;GAKG;AAEH,SAAS,OAAO,CACZ,IAAY,EACZ,GAAW,EACX,YAAoB,EACpB,MAAe;IAEf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAA4B,CAAC;AACnF,CAAC;AAED,SAAS,IAAI,CAAC,IAA2B;IACrC,OAAO,gBACH,EAAE,EAAE,GAAG,EACP,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,IAAI,EACd,gBAAgB,EAAE,KAAK,EACvB,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,IACpD,IAAI,CACiB,CAAC;AACjC,CAAC;AAED,MAAM,YAAY,GAAG,GAAkB,EAAE,CAAC;IACtC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;CAC9C,CAAC;AACF,MAAM,UAAU,GAAG,GAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjF,mDAAmD;AACnD,MAAM,GAAG,GAAG,EAAE,CAAC;AAEf,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CACF,UAAU,CACN,IAAI,CAAC;YACD,QAAQ,EAAE;gBACN,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC;gBACtC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC;aACzC;SACJ,CAAC,CACL,CACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CACF,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CACxE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC5B,MAAM,KAAK,GAAG;YACV,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;SAC5C,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG;YACV,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;SAC/C,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG;YACV,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;SACpD,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,SAAS;YACT,OAAO;SACV,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GAAG;YACV,IAAI,CAAC;gBACD,EAAE,EAAE,KAAK;gBACT,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;aAC1D,CAAC;YACF,IAAI,CAAC;gBACD,EAAE,EAAE,MAAM;gBACV,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;aAC1D,CAAC;SACL,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,MAAM;YACN,KAAK;SACR,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAG;YACV,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;SAC9C,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACrC,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,QAAuB,EAAgB,EAAE,CACtE,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE/C,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,uBAAuB,CAAC;YACjC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/C,KAAK,CAAC,GAAG,EAAE;gBACP,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC;SACL,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,uBAAuB,CAAC;YACjC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACrD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,uBAAuB,CAAC;YACjC,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,uBAAuB,CAAC;YACjC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/C,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACrD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,uEAAuE;QACvE,MAAM,IAAI,GAAG,uBAAuB,CAAC;YACjC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACvD,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SAC1D,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,QAAuB,EAAgB,EAAE,CACtE,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE/C,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,iBAAiB,CAC1B;YACI,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACvD,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SAC1D,EACD,GAAG,CACN,CAAC;QACF,mEAAmE;QACnE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC3D,mEAAmE;QACnE,gEAAgE;QAChE,MAAM,CACF,iBAAiB,CACb,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EACzD,GAAG,CACN,CACJ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACpE,MAAM,CACF,iBAAiB,CACb,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EACjD,GAAG,CACN,CACJ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC5E,MAAM,IAAI,GAAG,iBAAiB,CAC1B;YACI,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;YACvD,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SAC7D,EACD,GAAG,CACN,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC7E,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjD,sCAAsC;QACtC,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACrD,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,CACF,iBAAiB,CACb,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EACtD,GAAG,CACN,CACJ,CAAC,QAAQ,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CACvD,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAC7B,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,181 +0,0 @@
1
- import * as fc from 'fast-check';
2
- import { apyToEpochRate, epochRateToApy, EPOCHS_IN_YEAR, netEffectiveApy, } from './rates';
3
- /**
4
- * Ported from kasu-ui `src/features/lending/lib/interest-rate.test.ts`. The
5
- * `formatEffectiveRate` cases stay there — they assert copy and locale, which
6
- * this layer does not own.
7
- */
8
- /** The live performance fee on all deployments (subgraph units: 10 = ten percent). */
9
- const LIVE_FEE_PERCENT = 10;
10
- /**
11
- * Spec §9 — every distinct per-epoch rate configured on Base, read on-chain
12
- * 2026-09-01, with the NET Effective Interest Rate each must display at the
13
- * live 10% fee. This table IS the review sanity check: a correct
14
- * implementation reproduces the whole column, including the 30% crossover row
15
- * (26.30% gross nominal → 26.64% net APY) which moves UP while every other row
16
- * moves down, because the two errors in the old display — no fee deducted, and
17
- * a spurious de-compounding — pull in opposite directions and cross over near
18
- * 28%.
19
- */
20
- const GROUND_TRUTH = [
21
- { grossApy: 0.1, netPercent: 8.96 },
22
- { grossApy: 0.105, netPercent: 9.4 },
23
- { grossApy: 0.12, netPercent: 10.74 },
24
- { grossApy: 0.14, netPercent: 12.52 },
25
- { grossApy: 0.15, netPercent: 13.41 },
26
- { grossApy: 0.16, netPercent: 14.29 },
27
- { grossApy: 0.2, netPercent: 17.84 },
28
- { grossApy: 0.22, netPercent: 19.6 },
29
- { grossApy: 0.3, netPercent: 26.64 },
30
- ];
31
- describe('netEffectiveApy — spec §9 ground truth', () => {
32
- it.each(GROUND_TRUTH)('gross $grossApy at a 10% fee is $netPercent% net', ({ grossApy, netPercent }) => {
33
- expect(netEffectiveApy(grossApy, LIVE_FEE_PERCENT) * 100).toBeCloseTo(netPercent, 2);
34
- });
35
- it('reproduces the 30% crossover — the net APY is ABOVE the old gross nominal figure', () => {
36
- // Old display: 52.17857 · ((1.30)^(1/52.17857) − 1) = 26.30%. New: 26.64%.
37
- const oldGrossNominal = EPOCHS_IN_YEAR * (Math.pow(1.3, (1 / EPOCHS_IN_YEAR)) - 1);
38
- expect(oldGrossNominal * 100).toBeCloseTo(26.3, 1);
39
- expect(netEffectiveApy(0.3, LIVE_FEE_PERCENT)).toBeGreaterThan(oldGrossNominal);
40
- });
41
- });
42
- describe('netEffectiveApy — units (spec §2.3)', () => {
43
- it('reads feePercent as a PERCENTAGE: 22% gross at fee 10 is ≈19.602%', () => {
44
- expect(netEffectiveApy(0.22, 10)).toBeCloseTo(0.19602, 5);
45
- });
46
- it('does not silently accept the 0..1 fraction — 0.1 is a 0.1% fee, not 10%', () => {
47
- const wrongUnit = netEffectiveApy(0.22, 0.1);
48
- const correct = netEffectiveApy(0.22, 10);
49
- // It is a finite, in-range number (we cannot reject it — 0.1% is a
50
- // legal fee), so the guard cannot catch this. What protects us is that
51
- // it is MATERIALLY different: ~2.37pp too high, not a plausible
52
- // near-miss that could sit on screen unnoticed.
53
- expect(wrongUnit).toBeCloseTo(0.21976, 5);
54
- expect(wrongUnit - correct).toBeGreaterThan(0.02);
55
- });
56
- it('rejects the RAW subgraph integer (1000 = 10%, pre-integerToPercentage2)', () => {
57
- expect(netEffectiveApy(0.22, 1000)).toBeNaN();
58
- });
59
- it('rejects a fee outside 0..100', () => {
60
- expect(netEffectiveApy(0.22, 101)).toBeNaN();
61
- expect(netEffectiveApy(0.22, -1)).toBeNaN();
62
- expect(netEffectiveApy(0.22, NaN)).toBeNaN();
63
- expect(netEffectiveApy(0.22, Infinity)).toBeNaN();
64
- });
65
- it('accepts the domain edges', () => {
66
- expect(netEffectiveApy(0.22, 0)).toBe(0.22);
67
- // A 100% fee leaves the lender nothing — 0, not NaN: the fee is
68
- // knowable and the answer is "you earn zero", which consumers render
69
- // as "—".
70
- expect(netEffectiveApy(0.22, 100)).toBe(0);
71
- });
72
- it('returns NaN for a non-finite or negative gross APY (callers render "—")', () => {
73
- expect(netEffectiveApy(NaN, 10)).toBeNaN();
74
- expect(netEffectiveApy(Infinity, 10)).toBeNaN();
75
- expect(netEffectiveApy(-Infinity, 10)).toBeNaN();
76
- expect(netEffectiveApy(-0.01, 10)).toBeNaN();
77
- });
78
- });
79
- // The FULL in-domain range, down to and including zero and the denormals. The
80
- // invariants below are the reason `netEffectiveApy` is written with
81
- // `log1p`/`expm1`: the direct `(1 + x) ** n - 1` form breaks the `net <= gross`
82
- // invariant for tiny rates, and the property runner finds that in a few hundred
83
- // cases. Narrowing this arb would hide it.
84
- const grossApyArb = fc.double({
85
- min: 0,
86
- max: 5,
87
- noNaN: true,
88
- noDefaultInfinity: true,
89
- });
90
- const feePercentArb = fc.double({
91
- min: 0,
92
- max: 100,
93
- noNaN: true,
94
- noDefaultInfinity: true,
95
- });
96
- /**
97
- * A fee as the subgraph can actually express one: `integerToPercentage2`
98
- * divides a uint by 100, so every reachable value is a 2dp multiple of 0.01 in
99
- * 0..100. Used only for the STRICT-decrease property, which cannot hold for a
100
- * fee of 1e-300 percent — `1 − feePercent/100` rounds to exactly 1 and the net
101
- * rate is the gross one. That is arithmetic, not a defect, and no such fee
102
- * exists.
103
- */
104
- const realisticFeePercentArb = fc
105
- .integer({ min: 1, max: 10000 })
106
- .map((n) => n / 100);
107
- describe('netEffectiveApy — invariants', () => {
108
- it('never returns more than the gross APY it came from', () => {
109
- fc.assert(fc.property(grossApyArb, feePercentArb, (grossApy, feePercent) => {
110
- expect(netEffectiveApy(grossApy, feePercent)).toBeLessThanOrEqual(grossApy);
111
- }));
112
- });
113
- it('equals the gross APY EXACTLY when the fee is zero', () => {
114
- fc.assert(
115
- // Exact equality, not "close to": if the fee is ever set to zero
116
- // on-chain, the rate must be the SDK's own APY, with no float drift
117
- // from the de-compound/re-compound round trip.
118
- fc.property(grossApyArb, (grossApy) => {
119
- expect(netEffectiveApy(grossApy, 0)).toBe(grossApy);
120
- }));
121
- });
122
- it('is STRICTLY below the gross APY for any real (2dp) non-zero fee', () => {
123
- fc.assert(fc.property(grossApyArb, realisticFeePercentArb, (grossApy, feePercent) => {
124
- if (grossApy === 0)
125
- return;
126
- expect(netEffectiveApy(grossApy, feePercent)).toBeLessThan(grossApy);
127
- }));
128
- });
129
- it('decreases monotonically as the fee rises', () => {
130
- fc.assert(fc.property(grossApyArb, feePercentArb, feePercentArb, (grossApy, a, b) => {
131
- const [lo, hi] = a <= b ? [a, b] : [b, a];
132
- expect(netEffectiveApy(grossApy, hi)).toBeLessThanOrEqual(netEffectiveApy(grossApy, lo));
133
- }));
134
- });
135
- it('increases monotonically as the gross APY rises', () => {
136
- fc.assert(fc.property(grossApyArb, grossApyArb, feePercentArb, (a, b, feePercent) => {
137
- const [lo, hi] = a <= b ? [a, b] : [b, a];
138
- expect(netEffectiveApy(hi, feePercent)).toBeGreaterThanOrEqual(netEffectiveApy(lo, feePercent));
139
- }));
140
- });
141
- it('is never negative for any in-domain input', () => {
142
- fc.assert(fc.property(grossApyArb, feePercentArb, (grossApy, feePercent) => {
143
- expect(netEffectiveApy(grossApy, feePercent)).toBeGreaterThanOrEqual(0);
144
- }));
145
- });
146
- });
147
- describe('epochRateToApy / apyToEpochRate', () => {
148
- it('compounds a per-epoch rate exactly as the data service always has', () => {
149
- // The literal expression `calculateApyForTranche` carried inline.
150
- for (const r of [0, 0.001, 0.0025, 0.003, 0.005, 0.01]) {
151
- expect(epochRateToApy(r)).toBe(Math.pow((1 + r), EPOCHS_IN_YEAR) - 1);
152
- }
153
- });
154
- it('round-trips within 1e-12 for realistic per-epoch rates', () => {
155
- fc.assert(fc.property(
156
- // 0.0001..0.02 per epoch ≈ 0.5%..190% APY — wider than any
157
- // rate the platform has configured.
158
- fc.double({
159
- min: 0.0001,
160
- max: 0.02,
161
- noNaN: true,
162
- noDefaultInfinity: true,
163
- }), (r) => {
164
- expect(apyToEpochRate(epochRateToApy(r))).toBeCloseTo(r, 12);
165
- }));
166
- });
167
- it('inverts the APYs the platform actually quotes', () => {
168
- for (const apy of [0.1, 0.12, 0.14, 0.16, 0.22, 0.3]) {
169
- expect(epochRateToApy(apyToEpochRate(apy))).toBeCloseTo(apy, 12);
170
- }
171
- });
172
- it('is the same de-compounding netEffectiveApy uses at a zero-ish fee', () => {
173
- // A fee of exactly 0 short-circuits; the smallest fee that does not
174
- // must still agree with the round trip to well under a basis point.
175
- const gross = 0.22;
176
- const net = netEffectiveApy(gross, 0.01);
177
- expect(net).toBeLessThan(gross);
178
- expect(gross - net).toBeLessThan(0.0005);
179
- });
180
- });
181
- //# sourceMappingURL=rates.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rates.test.js","sourceRoot":"","sources":["../../src/domain/rates.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};