@evaafi/sdk 0.7.0 → 0.9.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/dist/api/feeds.d.ts +30 -0
  2. package/dist/api/feeds.js +73 -0
  3. package/dist/api/liquidation.js +1 -1
  4. package/dist/api/math.js +1 -1
  5. package/dist/api/parser.d.ts +4 -2
  6. package/dist/api/parser.js +39 -18
  7. package/dist/api/parsers/AbstractOracleParser.d.ts +11 -0
  8. package/dist/api/parsers/AbstractOracleParser.js +9 -0
  9. package/dist/api/parsers/ClassicOracleParser.d.ts +10 -0
  10. package/dist/api/parsers/ClassicOracleParser.js +16 -0
  11. package/dist/api/parsers/PythOracleParser.d.ts +17 -0
  12. package/dist/api/parsers/PythOracleParser.js +22 -0
  13. package/dist/api/parsers/index.d.ts +3 -0
  14. package/dist/api/parsers/index.js +19 -0
  15. package/dist/api/prices.d.ts +6 -6
  16. package/dist/api/prices.js +37 -46
  17. package/dist/api/pyth.d.ts +16 -0
  18. package/dist/api/pyth.js +35 -0
  19. package/dist/constants/assets/assetId.d.ts +22 -0
  20. package/dist/constants/assets/assetId.js +29 -0
  21. package/dist/constants/assets/index.d.ts +3 -0
  22. package/dist/constants/assets/index.js +19 -0
  23. package/dist/constants/assets/mainnet.d.ts +19 -0
  24. package/dist/constants/assets/mainnet.js +114 -0
  25. package/dist/constants/assets/testnet.d.ts +14 -0
  26. package/dist/constants/assets/testnet.js +54 -0
  27. package/dist/constants/general/index.d.ts +65 -0
  28. package/dist/constants/general/index.js +93 -0
  29. package/dist/constants/general/mainnet.d.ts +24 -0
  30. package/dist/constants/general/mainnet.js +53 -0
  31. package/dist/constants/general/testnet.d.ts +12 -0
  32. package/dist/constants/general/testnet.js +15 -0
  33. package/dist/constants/general.d.ts +2 -2
  34. package/dist/constants/general.js +4 -4
  35. package/dist/constants/index.d.ts +3 -0
  36. package/dist/constants/index.js +19 -0
  37. package/dist/constants/pools/index.d.ts +2 -0
  38. package/dist/constants/pools/index.js +18 -0
  39. package/dist/constants/pools/mainnet.d.ts +14 -0
  40. package/dist/constants/pools/mainnet.js +145 -0
  41. package/dist/constants/pools/testnet.d.ts +9 -0
  42. package/dist/constants/pools/testnet.js +57 -0
  43. package/dist/constants/pools.js +7 -7
  44. package/dist/contracts/AbstractMaster.d.ts +185 -0
  45. package/dist/contracts/AbstractMaster.js +179 -0
  46. package/dist/contracts/ClassicMaster.d.ts +34 -0
  47. package/dist/contracts/ClassicMaster.js +87 -0
  48. package/dist/contracts/PythMaster.d.ts +61 -0
  49. package/dist/contracts/PythMaster.js +179 -0
  50. package/dist/contracts/UserContract.d.ts +1 -7
  51. package/dist/contracts/UserContract.js +1 -19
  52. package/dist/contracts/index.d.ts +5 -0
  53. package/dist/contracts/index.js +21 -0
  54. package/dist/index.d.ts +14 -14
  55. package/dist/index.js +20 -60
  56. package/dist/prices/Oracle.interface.d.ts +9 -0
  57. package/dist/prices/Oracle.interface.js +2 -0
  58. package/dist/prices/Prices.d.ts +5 -3
  59. package/dist/prices/Prices.js +13 -3
  60. package/dist/prices/PricesCollector.d.ts +17 -7
  61. package/dist/prices/PricesCollector.js +67 -51
  62. package/dist/prices/PythCollector.d.ts +22 -0
  63. package/dist/prices/PythCollector.js +217 -0
  64. package/dist/prices/Types.d.ts +17 -1
  65. package/dist/prices/Types.js +8 -1
  66. package/dist/prices/index.d.ts +4 -3
  67. package/dist/prices/index.js +4 -3
  68. package/dist/prices/sources/Backend.d.ts +5 -4
  69. package/dist/prices/sources/Backend.js +16 -13
  70. package/dist/prices/sources/Icp.d.ts +2 -1
  71. package/dist/prices/sources/Icp.js +12 -9
  72. package/dist/prices/sources/PriceSource.d.ts +7 -6
  73. package/dist/prices/utils.d.ts +10 -8
  74. package/dist/prices/utils.js +32 -46
  75. package/dist/types/Master.d.ts +10 -30
  76. package/dist/types/Master.js +3 -0
  77. package/dist/utils/userJettonWallet.js +0 -8
  78. package/dist/utils/utils.d.ts +8 -1
  79. package/dist/utils/utils.js +31 -2
  80. package/package.json +3 -2
  81. package/src/api/feeds.ts +90 -0
  82. package/src/api/liquidation.ts +1 -1
  83. package/src/api/math.ts +1 -1
  84. package/src/api/parser.ts +100 -38
  85. package/src/api/parsers/AbstractOracleParser.ts +16 -0
  86. package/src/api/parsers/ClassicOracleParser.ts +20 -0
  87. package/src/api/parsers/PythOracleParser.ts +34 -0
  88. package/src/api/parsers/index.ts +3 -0
  89. package/src/api/prices.ts +32 -41
  90. package/src/constants/assets/assetId.ts +30 -0
  91. package/src/constants/assets/index.ts +3 -0
  92. package/src/constants/{assets.ts → assets/mainnet.ts} +3 -96
  93. package/src/constants/assets/testnet.ts +74 -0
  94. package/src/constants/general/index.ts +91 -0
  95. package/src/constants/{general.ts → general/mainnet.ts} +48 -72
  96. package/src/constants/general/testnet.ts +25 -0
  97. package/src/constants/index.ts +3 -0
  98. package/src/constants/pools/index.ts +2 -0
  99. package/src/constants/pools/mainnet.ts +218 -0
  100. package/src/constants/pools/testnet.ts +75 -0
  101. package/src/contracts/AbstractMaster.ts +450 -0
  102. package/src/contracts/ClassicMaster.ts +149 -0
  103. package/src/contracts/PythMaster.ts +313 -0
  104. package/src/contracts/UserContract.ts +7 -28
  105. package/src/contracts/index.ts +7 -0
  106. package/src/index.ts +18 -85
  107. package/src/prices/Oracle.interface.ts +18 -0
  108. package/src/prices/Prices.ts +17 -4
  109. package/src/prices/PricesCollector.ts +91 -68
  110. package/src/prices/PythCollector.ts +294 -0
  111. package/src/prices/Types.ts +28 -6
  112. package/src/prices/index.ts +4 -3
  113. package/src/prices/sources/Backend.ts +21 -19
  114. package/src/prices/sources/Icp.ts +13 -10
  115. package/src/prices/sources/PriceSource.ts +6 -5
  116. package/src/prices/utils.ts +65 -68
  117. package/src/types/Master.ts +29 -52
  118. package/src/types/User.ts +15 -7
  119. package/src/utils/userJettonWallet.ts +0 -8
  120. package/src/utils/utils.ts +41 -2
  121. package/src/constants/pools.ts +0 -177
  122. package/src/contracts/MasterContract.ts +0 -410
@@ -1,177 +0,0 @@
1
- import { Address } from '@ton/core';
2
- import { PoolConfig } from '../types/Master';
3
- import { EvaaRewardsConfig } from '../types/MasterRewards';
4
- import {
5
- CATI_MAINNET,
6
- DOGS_MAINNET,
7
- EUSDT_TESTNET,
8
- JUSDC_MAINNET,
9
- JUSDT_MAINNET,
10
- NOT_MAINNET,
11
- PT_tsUSDe_01Sep2025_MAINNET,
12
- STON_MAINNET,
13
- STTON_MAINNET,
14
- TGBTC_TESTNET,
15
- TON_MAINNET,
16
- TON_STORM_MAINNET,
17
- TON_TESTNET,
18
- TONUSDT_DEDUST_MAINNET,
19
- TONUSDT_STONFI_MAINNET,
20
- TSTON_MAINNET,
21
- TSUSDE_MAINNET,
22
- USDE_MAINNET,
23
- USDT_MAINNET,
24
- USDT_STORM_MAINNET,
25
- } from './assets';
26
- import {
27
- EVAA_ALTS_MAINNET,
28
- EVAA_ALTS_MAINNET_VERSION,
29
- EVAA_ETHENA_MAINNET,
30
- EVAA_ETHENA_VERSION,
31
- EVAA_LP_MAINNET,
32
- EVAA_LP_MAINNET_VERSION,
33
- EVAA_MASTER_MAINNET,
34
- EVAA_MASTER_TESTNET,
35
- EVAA_REWARDS_MASTER_CODE_MAINNET,
36
- EVAA_REWARDS_MASTER_CODE_TESTNET,
37
- EVAA_REWARDS_MASTER_TESTNET,
38
- EVAA_REWARDS_USER_CODE_MAINNET,
39
- EVAA_REWARDS_USER_CODE_TESTNET,
40
- EVAA_STABLE_MAINNET,
41
- EVAA_TON_REWARDS_MASTER_MAINNET,
42
- EVAA_USDT_REWARDS_MASTER_MAINNET,
43
- LENDING_CODE,
44
- MAINNET_VERSION,
45
- MASTER_CONSTANTS,
46
- ORACLES_ALTS,
47
- ORACLES_LP,
48
- ORACLES_MAINNET,
49
- ORACLES_TESTNET,
50
- STABLE_VERSION,
51
- TESTNET_VERSION,
52
- } from './general';
53
-
54
- export const MAINNET_POOL_CONFIG: PoolConfig = {
55
- masterAddress: EVAA_MASTER_MAINNET,
56
- masterVersion: MAINNET_VERSION,
57
- masterConstants: MASTER_CONSTANTS,
58
- oracles: ORACLES_MAINNET,
59
- minimalOracles: 3,
60
- poolAssetsConfig: [
61
- TON_MAINNET,
62
- JUSDT_MAINNET,
63
- JUSDC_MAINNET,
64
- STTON_MAINNET,
65
- TSTON_MAINNET,
66
- USDT_MAINNET,
67
- USDE_MAINNET,
68
- TSUSDE_MAINNET,
69
- // UTON_MAINNET // announce xdddd fake announce
70
- ],
71
- lendingCode: LENDING_CODE,
72
- };
73
-
74
- export const MAINNET_STABLE_POOL_CONFIG: PoolConfig = {
75
- masterAddress: EVAA_STABLE_MAINNET,
76
- masterVersion: STABLE_VERSION,
77
- masterConstants: MASTER_CONSTANTS,
78
- oracles: ORACLES_MAINNET,
79
- minimalOracles: 3,
80
- poolAssetsConfig: [
81
- USDT_MAINNET,
82
- USDE_MAINNET,
83
- TSUSDE_MAINNET,
84
- PT_tsUSDe_01Sep2025_MAINNET
85
- ],
86
- lendingCode: LENDING_CODE,
87
- };
88
-
89
- export const MAINNET_TEST_ETHENA_POOL_CONFIG: PoolConfig = {
90
- masterAddress: EVAA_ETHENA_MAINNET,
91
- masterVersion: EVAA_ETHENA_VERSION,
92
- masterConstants: MASTER_CONSTANTS,
93
- oracles: ORACLES_MAINNET,
94
- minimalOracles: 3,
95
- poolAssetsConfig: [
96
- TON_MAINNET,
97
- USDE_MAINNET,
98
- ],
99
- lendingCode: LENDING_CODE,
100
- };
101
-
102
- export const TESTNET_POOL_CONFIG: PoolConfig = {
103
- masterAddress: EVAA_MASTER_TESTNET,
104
- masterVersion: TESTNET_VERSION,
105
- masterConstants: MASTER_CONSTANTS,
106
- oracles: ORACLES_TESTNET,
107
- minimalOracles: 3,
108
- poolAssetsConfig: [TON_TESTNET, TGBTC_TESTNET],
109
- lendingCode: LENDING_CODE,
110
- };
111
-
112
- export const MAINNET_LP_POOL_CONFIG: PoolConfig = {
113
- masterAddress: EVAA_LP_MAINNET,
114
- masterVersion: EVAA_LP_MAINNET_VERSION,
115
- masterConstants: MASTER_CONSTANTS,
116
- oracles: ORACLES_LP,
117
- minimalOracles: 3,
118
- poolAssetsConfig: [TON_MAINNET, USDT_MAINNET, TONUSDT_DEDUST_MAINNET, TON_STORM_MAINNET, USDT_STORM_MAINNET, TONUSDT_STONFI_MAINNET],
119
- lendingCode: LENDING_CODE,
120
- };
121
-
122
- export const MAINNET_ALTS_POOL_CONFIG: PoolConfig = {
123
- masterAddress: EVAA_ALTS_MAINNET,
124
- masterVersion: EVAA_ALTS_MAINNET_VERSION,
125
- masterConstants: MASTER_CONSTANTS,
126
- oracles: ORACLES_ALTS,
127
- minimalOracles: 3,
128
- poolAssetsConfig: [TON_MAINNET, USDT_MAINNET, CATI_MAINNET, NOT_MAINNET, DOGS_MAINNET/*, STON_MAINNET announce*/],
129
- lendingCode: LENDING_CODE,
130
- };
131
-
132
- export const TESTNET_MASTER_REWARD_CONFIG: EvaaRewardsConfig = {
133
- adminAddress: EVAA_REWARDS_MASTER_TESTNET,
134
- evaaMasterAddress: new Address(0, Buffer.alloc(32, 0)),
135
- rewardMasterCode: EVAA_REWARDS_MASTER_CODE_TESTNET,
136
- rewardUserCode: EVAA_REWARDS_USER_CODE_TESTNET,
137
- asset: TON_TESTNET,
138
- availableReward: 0,
139
- publicKey: Buffer.from('c38be45e033419b49cd22c97fbd23610fbc851a931208f8b4a1817dd11cb63ac', 'hex'), // adminAddress publicKey
140
- };
141
-
142
- export const TESTNET_MASTER_EUSDT_REWARD_CONFIG: EvaaRewardsConfig = {
143
- adminAddress: EVAA_REWARDS_MASTER_TESTNET,
144
- evaaMasterAddress: new Address(0, Buffer.alloc(32, 0)),
145
- rewardMasterCode: EVAA_REWARDS_MASTER_CODE_TESTNET,
146
- rewardUserCode: EVAA_REWARDS_USER_CODE_TESTNET,
147
- asset: EUSDT_TESTNET,
148
- availableReward: 0,
149
- publicKey: Buffer.from('c38be45e033419b49cd22c97fbd23610fbc851a931208f8b4a1817dd11cb63ac', 'hex'), // adminAddress publicKey
150
- };
151
-
152
- export const MAINNET_MASTER_TON_REWARD_CONFIG: EvaaRewardsConfig = {
153
- adminAddress: EVAA_TON_REWARDS_MASTER_MAINNET,
154
- evaaMasterAddress: new Address(0, Buffer.alloc(32, 0)),
155
- rewardMasterCode: EVAA_REWARDS_MASTER_CODE_MAINNET,
156
- rewardUserCode: EVAA_REWARDS_USER_CODE_MAINNET,
157
- asset: TON_MAINNET,
158
- availableReward: 0,
159
- publicKey: Buffer.from('bfe9a30221db4dff4c17e55d985e0b13a8f597bbb28002f311dc4429dad1ca95', 'hex'), // adminAddress publicKey
160
- };
161
-
162
- export const MAINNET_MASTER_USDT_REWARD_CONFIG: EvaaRewardsConfig = {
163
- adminAddress: EVAA_USDT_REWARDS_MASTER_MAINNET,
164
- evaaMasterAddress: new Address(0, Buffer.alloc(32, 0)),
165
- rewardMasterCode: EVAA_REWARDS_MASTER_CODE_MAINNET,
166
- rewardUserCode: EVAA_REWARDS_USER_CODE_MAINNET,
167
- asset: USDT_MAINNET,
168
- availableReward: 0,
169
- publicKey: Buffer.from('9813725d6cead1c9bbc0e24b21d4fc62a7fa8ac4bb01b6758df30169a71dba67', 'hex'), // adminAddress publicKey
170
- };
171
-
172
- export const ALL_MAINNET_POOLS: PoolConfig[] = [
173
- MAINNET_POOL_CONFIG,
174
- MAINNET_LP_POOL_CONFIG,
175
- MAINNET_ALTS_POOL_CONFIG,
176
- MAINNET_STABLE_POOL_CONFIG,
177
- ];
@@ -1,410 +0,0 @@
1
- import {
2
- Address,
3
- beginCell,
4
- Cell,
5
- Contract,
6
- ContractProvider,
7
- OpenedContract,
8
- Sender,
9
- SendMode,
10
- storeStateInit,
11
- toNano,
12
- } from '@ton/core';
13
- import {
14
- FEES,
15
- OPCODES,
16
- } from '../constants/general';
17
- import { Maybe } from '@ton/core/dist/utils/maybe';
18
- import { EvaaUser } from './UserContract';
19
- import { parseMasterData } from '../api/parser';
20
- import { MasterData, PoolAssetConfig, PoolConfig} from '../types/Master';
21
- import { JettonWallet } from './JettonWallet';
22
- import { getUserJettonWallet } from '../utils/userJettonWallet';
23
- import { DefaultPriceSourcesConfig, getPrices, isTonAsset, isTonAssetId, MAINNET_POOL_CONFIG, PricesCollector, PriceSourcesConfig } from '..';
24
-
25
- /**
26
- * Parameters for the Evaa contract
27
- * @property testnet - true for testnet, false for mainnet
28
- * @property debug - true to enable debug mode (optional)
29
- */
30
- export type EvaaParameters = {
31
- poolConfig: PoolConfig;
32
- debug?: boolean;
33
- };
34
-
35
- /**
36
- * Base parameters for supply
37
- * @property queryID - unique query ID
38
- * @property includeUserCode - true to include user code for update (needed when user contract code version is outdated)
39
- * @property amount - amount to supply
40
- * @property userAddress - user address
41
- * @property asset
42
- */
43
- export type SupplyParameters = {
44
- asset: PoolAssetConfig
45
- queryID: bigint;
46
- includeUserCode: boolean;
47
- amount: bigint;
48
- userAddress: Address;
49
- responseAddress?: Address;
50
- forwardAmount?: bigint;
51
- amountToTransfer: bigint;
52
- payload: Cell;
53
- };
54
-
55
- /**
56
- * Parameters for the withdraw message
57
- * @property queryID - unique query ID
58
- * * @property assetID - asset ID
59
- * @property assetID - asset ID
60
- * @property amount - amount to withdraw
61
- * @property userAddress - user address
62
- * @property includeUserCode - true to include user code for update (needed when user contract code version is outdated)
63
- * @property priceData - price data cell. Can be obtained from the getPrices function
64
- */
65
- export type WithdrawParameters = {
66
- queryID: bigint;
67
- amount: bigint;
68
- userAddress: Address;
69
- includeUserCode: boolean;
70
- asset: PoolAssetConfig
71
- priceData: Cell;
72
- amountToTransfer: bigint;
73
- payload: Cell;
74
- };
75
-
76
- /**
77
- * Base data for liquidation. Can be obtained from the user contract liquidationParameters getter
78
- * @property borrowerAddress - borrower address (user address that is being liquidated)
79
- * @property loanAsset - loan asset ID
80
- * @property collateralAsset - collateral asset ID
81
- * @property minCollateralAmount - minimal amount to receive from the liquidation
82
- * @property liquidationAmount - amount to liquidate
83
- * @property tonLiquidation - true if the loan asset is TON
84
- */
85
- export type LiquidationBaseData = {
86
- borrowerAddress: Address;
87
- loanAsset: bigint;
88
- collateralAsset: bigint;
89
- minCollateralAmount: bigint;
90
- liquidationAmount: bigint;
91
- tonLiquidation: boolean;
92
- forwardAmount?: bigint;
93
- };
94
-
95
- /**
96
- * Base parameters for liquidation
97
- * @property queryID - unique query ID
98
- * @property liquidatorAddress - liquidator address, where and collateral will be sent
99
- * @property includeUserCode - true to include user code for update (needed when user contract code version is outdated)
100
- * @property priceData - price data cell. Can be obtained from the getPrices function
101
- */
102
- export type LiquidationParameters = LiquidationBaseData & {
103
- asset: PoolAssetConfig;
104
- queryID: bigint;
105
- liquidatorAddress: Address;
106
- responseAddress: Address;
107
- includeUserCode: boolean;
108
- priceData: Cell;
109
- payload: Cell;
110
- payloadForwardAmount: bigint;
111
- };
112
-
113
- /**
114
- * Evaa master contract wrapper
115
- */
116
- export class Evaa implements Contract {
117
- readonly address: Address;
118
- private _poolConfig: PoolConfig;
119
- private readonly debug?: boolean;
120
- private _data?: MasterData;
121
- private lastSync = 0;
122
-
123
- /**
124
- * Create Evaa contract wrapper
125
- * @param parameters Evaa contract parameters
126
- */
127
- constructor(parameters?: EvaaParameters) {
128
- this._poolConfig = parameters?.poolConfig ?? MAINNET_POOL_CONFIG;
129
- this.address = this._poolConfig.masterAddress;
130
- this.debug = parameters?.debug;
131
- }
132
-
133
- /**
134
- * Returns pool config
135
- */
136
- get poolConfig(): PoolConfig {
137
- return this._poolConfig;
138
- }
139
-
140
- /**
141
- * Create supply message
142
- * @returns supply message as a cell
143
- */
144
- createSupplyMessage(parameters: SupplyParameters): Cell {
145
- if (!isTonAsset(parameters.asset)) {
146
- return beginCell()
147
- .storeUint(OPCODES.JETTON_TRANSFER, 32)
148
- .storeUint(parameters.queryID, 64)
149
- .storeCoins(parameters.amount)
150
- .storeAddress(this.address)
151
- .storeAddress(parameters.responseAddress ?? parameters.userAddress)
152
- .storeBit(0)
153
- .storeCoins(parameters.forwardAmount ?? FEES.SUPPLY_JETTON_FWD)
154
- .storeBit(1)
155
- .storeRef(
156
- beginCell()
157
- .storeUint(OPCODES.SUPPLY, 32)
158
- .storeInt(parameters.includeUserCode ? -1 : 0, 2)
159
- .storeAddress(parameters.userAddress)
160
- .storeUint(parameters.amountToTransfer, 64)
161
- .storeRef(parameters.payload)
162
- .endCell(),
163
- )
164
- .endCell();
165
- } else {
166
- return beginCell()
167
- .storeUint(OPCODES.SUPPLY, 32)
168
- .storeUint(parameters.queryID, 64)
169
- .storeInt(parameters.includeUserCode ? -1 : 0, 2)
170
- .storeUint(parameters.amount, 64)
171
- .storeAddress(parameters.userAddress)
172
- .storeUint(parameters.amountToTransfer, 64)
173
- .storeRef(parameters.payload)
174
- .endCell();
175
- }
176
- }
177
-
178
- /**
179
- * Create withdraw message
180
- * @returns withdraw message as a cell
181
- */
182
- createWithdrawMessage(parameters: WithdrawParameters): Cell {
183
- return beginCell()
184
- .storeUint(OPCODES.WITHDRAW, 32)
185
- .storeUint(parameters.queryID, 64)
186
- .storeUint(parameters.asset.assetId, 256)
187
- .storeUint(parameters.amount, 64)
188
- .storeAddress(parameters.userAddress)
189
- .storeInt(parameters.includeUserCode ? -1 : 0, 2)
190
- .storeUint(parameters.amountToTransfer, 64)
191
- .storeRef(parameters.payload)
192
- .storeRef(parameters.priceData)
193
- .endCell();
194
- }
195
-
196
- /**
197
- * Create liquidation message
198
- * @returns liquidation message as a cell
199
- */
200
- createLiquidationMessage(parameters: LiquidationParameters): Cell {
201
- if (!isTonAsset(parameters.asset)) {
202
- return beginCell()
203
- .storeUint(OPCODES.JETTON_TRANSFER, 32)
204
- .storeUint(parameters.queryID, 64)
205
- .storeCoins(parameters.liquidationAmount)
206
- .storeAddress(this.address)
207
- .storeAddress(parameters.responseAddress ?? parameters.liquidatorAddress)
208
- .storeBit(0)
209
- .storeCoins(parameters.forwardAmount ?? FEES.LIQUIDATION_JETTON_FWD)
210
- .storeBit(1)
211
- .storeRef(
212
- beginCell()
213
- .storeUint(OPCODES.LIQUIDATE, 32)
214
- .storeAddress(parameters.borrowerAddress)
215
- .storeAddress(parameters.liquidatorAddress)
216
- .storeUint(parameters.collateralAsset, 256)
217
- .storeUint(parameters.minCollateralAmount, 64)
218
- .storeInt(parameters.includeUserCode ? -1 : 0, 2)
219
- // do not need liquidationAmount in case of jetton liquidation because
220
- // the exact amount of transferred jettons for liquidation is known
221
- .storeUint(0, 64)
222
- .storeRef(beginCell()
223
- .storeUint(parameters.payloadForwardAmount ?? 0, 64)
224
- .storeRef(parameters.payload)
225
- .endCell())
226
- .storeRef(parameters.priceData)
227
- .endCell(),
228
- )
229
- .endCell();
230
- } else {
231
- return beginCell()
232
- .storeUint(OPCODES.LIQUIDATE, 32)
233
- .storeUint(parameters.queryID, 64)
234
- .storeAddress(parameters.borrowerAddress)
235
- .storeAddress(parameters.liquidatorAddress)
236
- .storeUint(parameters.collateralAsset, 256)
237
- .storeUint(parameters.minCollateralAmount, 64)
238
- .storeInt(parameters.includeUserCode ? -1 : 0, 2)
239
- .storeUint(parameters.liquidationAmount, 64)
240
- .storeRef(beginCell()
241
- .storeUint(parameters.payloadForwardAmount ?? 0, 64)
242
- .storeRef(parameters.payload)
243
- .endCell())
244
- .storeRef(parameters.priceData)
245
- .endCell();
246
- }
247
- }
248
-
249
- /**
250
- * Calculate user contract address
251
- * @param userAddress
252
- * @returns user contract address
253
- */
254
- calculateUserSCAddr(userAddress: Address, lendingCode: Cell): Address {
255
- const lendingData = beginCell()
256
- .storeAddress(this.address)
257
- .storeAddress(userAddress)
258
- .storeUint(0, 8)
259
- .storeBit(0)
260
- .endCell();
261
-
262
- const stateInit = beginCell()
263
- .store(
264
- storeStateInit({
265
- code: lendingCode,
266
- data: lendingData,
267
- }),
268
- )
269
- .endCell();
270
- return new Address(0, stateInit.hash());
271
- }
272
-
273
- /**
274
- * Open user contract wrapper
275
- * @param userAddress
276
- * @returns user contract
277
- */
278
- openUserContract(userAddress: Address): EvaaUser {
279
- return EvaaUser.createFromAddress(this.calculateUserSCAddr(userAddress, this._poolConfig.lendingCode), this._poolConfig);
280
- }
281
-
282
- getOpenedUserContract(provider: ContractProvider, userAddress: Address): OpenedContract<EvaaUser> {
283
- return provider.open(this.openUserContract(userAddress));
284
- }
285
-
286
- /**
287
- * Get master contract data
288
- */
289
- get data(): Maybe<MasterData> {
290
- return this._data;
291
- }
292
-
293
- async sendSupply(
294
- provider: ContractProvider,
295
- via: Sender,
296
- value: bigint,
297
- parameters: SupplyParameters,
298
- ) {
299
- const message = this.createSupplyMessage(parameters);
300
-
301
- if (!isTonAsset(parameters.asset)) {
302
- if (!via.address) {
303
- throw Error('Via address is required for jetton supply');
304
- }
305
-
306
- const jettonWallet = provider.open(
307
- JettonWallet.createFromAddress(getUserJettonWallet(via.address, parameters.asset)),
308
- );
309
- await jettonWallet.sendTransfer(via, value, message);
310
- } else {
311
- await provider.internal(via, {
312
- value,
313
- sendMode: SendMode.PAY_GAS_SEPARATELY + SendMode.IGNORE_ERRORS,
314
- body: message,
315
- });
316
-
317
- }
318
- }
319
-
320
- async sendWithdraw(provider: ContractProvider, via: Sender, value: bigint, parameters: WithdrawParameters) {
321
- const message = this.createWithdrawMessage(parameters);
322
-
323
- await provider.internal(via, {
324
- value,
325
- sendMode: SendMode.PAY_GAS_SEPARATELY + SendMode.IGNORE_ERRORS,
326
- body: message,
327
- });
328
- }
329
-
330
- async sendLiquidation(
331
- provider: ContractProvider,
332
- via: Sender,
333
- value: bigint,
334
- parameters: LiquidationParameters,
335
- ) {
336
- const message = this.createLiquidationMessage(parameters);
337
-
338
- if (!isTonAssetId(parameters.loanAsset)) {
339
- if (!via.address) {
340
- throw Error('Via address is required for jetton liquidation');
341
- }
342
-
343
- const jettonWallet = provider.open(
344
- JettonWallet.createFromAddress(getUserJettonWallet(via.address, parameters.asset)),
345
- );
346
- await jettonWallet.sendTransfer(via, value, message);
347
- } else {
348
- await provider.internal(via, {
349
- value,
350
- sendMode: SendMode.PAY_GAS_SEPARATELY + SendMode.IGNORE_ERRORS,
351
- body: message,
352
- });
353
- }
354
- }
355
-
356
- /**
357
- * Open user contract wrapper
358
- * @param forwardPayload - payload that will be forwarded to the address which requested the data
359
- */
360
- async sendOnchainGetter(
361
- provider: ContractProvider,
362
- via: Sender,
363
- value: bigint,
364
- queryID: bigint,
365
- forwardPayload: Cell,
366
- ) {
367
- await provider.internal(via, {
368
- value,
369
- sendMode: SendMode.PAY_GAS_SEPARATELY + SendMode.IGNORE_ERRORS,
370
- body: beginCell()
371
- .storeUint(OPCODES.ONCHAIN_GETTER, 32)
372
- .storeUint(queryID, 64)
373
- .storeRef(forwardPayload)
374
- .endCell(),
375
- });
376
- }
377
-
378
- /**
379
- * Sync master contract data
380
- */
381
- async getSync(provider: ContractProvider) {
382
- const state = (await provider.getState()).state;
383
- if (state.type === 'active') {
384
- this._data = parseMasterData(state.data!.toString('base64'), this._poolConfig.poolAssetsConfig, this._poolConfig.masterConstants);
385
- if (this._data.upgradeConfig.masterCodeVersion !== this._poolConfig.masterVersion) {
386
- throw Error(
387
- `Outdated SDK pool version. It supports only master code version ${this._poolConfig.masterVersion}, but the current master code version is ${this._data.upgradeConfig.masterCodeVersion}`,
388
- );
389
- }
390
- this.lastSync = Math.floor(Date.now() / 1000);
391
- } else {
392
- throw Error('Master contract is not active');
393
- }
394
- }
395
-
396
- /**
397
- * @deprecated Use PriceCollector (createPriceCollector) istead of getPrices
398
- */
399
- async getPrices(provider: ContractProvider, endpoints?: string[]) {
400
- if ((endpoints?.length ?? 0) > 0) {
401
- return await getPrices(endpoints, this._poolConfig);
402
- } else {
403
- return await getPrices(undefined, this._poolConfig);
404
- }
405
- }
406
-
407
- createPriceCollector(priceSourcesConfig: PriceSourcesConfig = DefaultPriceSourcesConfig) : PricesCollector {
408
- return new PricesCollector(this._poolConfig, priceSourcesConfig);
409
- }
410
- }