@evaafi/sdk 0.9.0 → 0.9.2-a

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 (129) hide show
  1. package/dist/api/feeds.d.ts +15 -24
  2. package/dist/api/feeds.js +22 -49
  3. package/dist/api/math.d.ts +1 -1
  4. package/dist/api/math.js +55 -38
  5. package/dist/api/parser.d.ts +2 -2
  6. package/dist/api/parser.js +3 -3
  7. package/dist/api/parsers/PythOracleParser.d.ts +3 -2
  8. package/dist/api/parsers/PythOracleParser.js +2 -1
  9. package/dist/api/prices.js +2 -1
  10. package/dist/constants/assets/assetId.d.ts +3 -1
  11. package/dist/constants/assets/assetId.js +5 -1
  12. package/dist/constants/assets/mainnet.d.ts +2 -0
  13. package/dist/constants/assets/mainnet.js +13 -1
  14. package/dist/constants/general/index.d.ts +25 -11
  15. package/dist/constants/general/index.js +15 -1
  16. package/dist/constants/general/mainnet.d.ts +2 -1
  17. package/dist/constants/general/mainnet.js +3 -2
  18. package/dist/constants/pools/mainnet.d.ts +4 -0
  19. package/dist/constants/pools/mainnet.js +45 -28
  20. package/dist/constants/pools/testnet.js +14 -6
  21. package/dist/contracts/AbstractMaster.d.ts +239 -127
  22. package/dist/contracts/AbstractMaster.js +101 -16
  23. package/dist/contracts/ClassicMaster.d.ts +12 -12
  24. package/dist/contracts/PythMaster.d.ts +40 -24
  25. package/dist/contracts/PythMaster.js +61 -76
  26. package/dist/contracts/PythOracle.d.ts +15 -0
  27. package/dist/contracts/PythOracle.js +19 -0
  28. package/dist/contracts/index.d.ts +1 -0
  29. package/dist/contracts/index.js +1 -0
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/{prices → oracles}/Types.d.ts +0 -4
  33. package/dist/oracles/collectors/AbstractCollector.d.ts +10 -0
  34. package/dist/oracles/collectors/AbstractCollector.js +6 -0
  35. package/dist/oracles/collectors/ClassicCollector.d.ts +22 -0
  36. package/dist/oracles/collectors/ClassicCollector.js +192 -0
  37. package/dist/oracles/collectors/PythCollector.d.ts +27 -0
  38. package/dist/oracles/collectors/PythCollector.js +266 -0
  39. package/dist/oracles/collectors/index.d.ts +3 -0
  40. package/dist/oracles/collectors/index.js +19 -0
  41. package/dist/{prices → oracles}/index.d.ts +2 -3
  42. package/dist/{prices → oracles}/index.js +2 -3
  43. package/dist/oracles/prices/AbstractPrices.d.ts +33 -0
  44. package/dist/oracles/prices/AbstractPrices.js +40 -0
  45. package/dist/oracles/prices/ClassicPrices.d.ts +19 -0
  46. package/dist/oracles/prices/ClassicPrices.js +48 -0
  47. package/dist/oracles/prices/PythPrices.d.ts +17 -0
  48. package/dist/oracles/prices/PythPrices.js +32 -0
  49. package/dist/oracles/prices/index.d.ts +3 -0
  50. package/dist/oracles/prices/index.js +19 -0
  51. package/dist/{prices → oracles}/sources/Backend.js +11 -8
  52. package/dist/{prices → oracles}/sources/Icp.js +10 -6
  53. package/dist/{prices → oracles}/utils.d.ts +6 -1
  54. package/dist/{prices → oracles}/utils.js +10 -1
  55. package/dist/types/Master.d.ts +4 -5
  56. package/dist/utils/fivaUtils.d.ts +2 -0
  57. package/dist/utils/fivaUtils.js +19 -0
  58. package/dist/utils/userJettonWallet.js +15 -1
  59. package/dist/utils/utils.d.ts +1 -1
  60. package/dist/utils/utils.js +4 -2
  61. package/package.json +1 -1
  62. package/src/api/feeds.ts +24 -60
  63. package/src/api/math.ts +118 -90
  64. package/src/api/parser.ts +5 -5
  65. package/src/api/parsers/PythOracleParser.ts +6 -2
  66. package/src/api/prices.ts +2 -1
  67. package/src/constants/assets/assetId.ts +7 -1
  68. package/src/constants/assets/mainnet.ts +24 -0
  69. package/src/constants/general/index.ts +16 -1
  70. package/src/constants/general/mainnet.ts +2 -1
  71. package/src/constants/pools/mainnet.ts +42 -38
  72. package/src/constants/pools/testnet.ts +17 -8
  73. package/src/contracts/AbstractMaster.ts +272 -144
  74. package/src/contracts/ClassicMaster.ts +12 -12
  75. package/src/contracts/PythMaster.ts +130 -123
  76. package/src/contracts/PythOracle.ts +20 -0
  77. package/src/contracts/index.ts +2 -0
  78. package/src/index.ts +1 -1
  79. package/src/{prices → oracles}/Types.ts +0 -5
  80. package/src/oracles/collectors/AbstractCollector.ts +22 -0
  81. package/src/oracles/collectors/ClassicCollector.ts +263 -0
  82. package/src/oracles/collectors/PythCollector.ts +372 -0
  83. package/src/oracles/collectors/index.ts +3 -0
  84. package/src/{prices → oracles}/index.ts +2 -3
  85. package/src/oracles/prices/AbstractPrices.ts +59 -0
  86. package/src/oracles/prices/ClassicPrices.ts +52 -0
  87. package/src/oracles/prices/PythPrices.ts +40 -0
  88. package/src/oracles/prices/index.ts +3 -0
  89. package/src/{prices → oracles}/sources/Backend.ts +12 -11
  90. package/src/{prices → oracles}/sources/Icp.ts +10 -9
  91. package/src/{prices → oracles}/utils.ts +12 -1
  92. package/src/types/Master.ts +4 -6
  93. package/src/utils/fivaUtils.ts +19 -0
  94. package/src/utils/userJettonWallet.ts +18 -1
  95. package/src/utils/utils.ts +4 -2
  96. package/dist/api/pyth.d.ts +0 -16
  97. package/dist/api/pyth.js +0 -35
  98. package/dist/constants/assets.d.ts +0 -48
  99. package/dist/constants/assets.js +0 -176
  100. package/dist/constants/general.d.ts +0 -67
  101. package/dist/constants/general.js +0 -75
  102. package/dist/constants/pools.d.ts +0 -13
  103. package/dist/constants/pools.js +0 -120
  104. package/dist/contracts/MasterContract.d.ts +0 -156
  105. package/dist/contracts/MasterContract.js +0 -260
  106. package/dist/prices/Oracle.interface.d.ts +0 -9
  107. package/dist/prices/Oracle.interface.js +0 -2
  108. package/dist/prices/Prices.d.ts +0 -11
  109. package/dist/prices/Prices.js +0 -53
  110. package/dist/prices/PricesCollector.d.ts +0 -22
  111. package/dist/prices/PricesCollector.js +0 -146
  112. package/dist/prices/PythCollector.d.ts +0 -22
  113. package/dist/prices/PythCollector.js +0 -217
  114. package/src/prices/Oracle.interface.ts +0 -18
  115. package/src/prices/Prices.ts +0 -45
  116. package/src/prices/PricesCollector.ts +0 -169
  117. package/src/prices/PythCollector.ts +0 -294
  118. /package/dist/{prices → oracles}/Types.js +0 -0
  119. /package/dist/{prices → oracles}/constants.d.ts +0 -0
  120. /package/dist/{prices → oracles}/constants.js +0 -0
  121. /package/dist/{prices → oracles}/sources/Backend.d.ts +0 -0
  122. /package/dist/{prices → oracles}/sources/Icp.d.ts +0 -0
  123. /package/dist/{prices → oracles}/sources/PriceSource.d.ts +0 -0
  124. /package/dist/{prices → oracles}/sources/PriceSource.js +0 -0
  125. /package/dist/{prices → oracles}/sources/index.d.ts +0 -0
  126. /package/dist/{prices → oracles}/sources/index.js +0 -0
  127. /package/src/{prices → oracles}/constants.ts +0 -0
  128. /package/src/{prices → oracles}/sources/PriceSource.ts +0 -0
  129. /package/src/{prices → oracles}/sources/index.ts +0 -0
@@ -6,151 +6,184 @@ import { ExtendedAssetsConfig, ExtendedAssetsData, PoolAssetConfig, PoolConfig,
6
6
  import { ClassicLiquidationOperationParameters, ClassicLiquidationParameters, ClassicSupplyWithdrawParameters, ClassicWithdrawParameters } from './ClassicMaster';
7
7
  import { PythLiquidationOperationParameters, PythLiquidationParameters, PythSupplyWithdrawParameters, PythWithdrawParameters } from './PythMaster';
8
8
  import { EvaaUser } from './UserContract';
9
- type JettonParams = {
10
- queryID: bigint;
11
- amount?: bigint;
12
- liquidationAmount?: bigint;
13
- supplyAmount?: bigint;
14
- responseAddress?: Address;
15
- userAddress?: Address;
16
- liquidatorAddress?: Address;
17
- forwardAmount?: bigint;
18
- destinationAddress?: Address;
19
- };
9
+ export interface JettonParams {
10
+ readonly queryID: bigint;
11
+ readonly amount?: bigint;
12
+ readonly liquidationAmount?: bigint;
13
+ readonly supplyAmount?: bigint;
14
+ readonly responseAddress?: Address;
15
+ readonly userAddress?: Address;
16
+ readonly liquidatorAddress?: Address;
17
+ readonly forwardAmount?: bigint;
18
+ readonly destinationAddress?: Address;
19
+ }
20
+ type RequireAtLeastOne<T, K extends keyof T> = T & {
21
+ [P in K]: Required<T>[P];
22
+ }[K];
23
+ export type ValidJettonParams = RequireAtLeastOne<JettonParams, 'amount' | 'liquidationAmount' | 'supplyAmount'>;
20
24
  /**
21
- * Parameters for the Evaa contract
22
- * @property testnet - true for testnet, false for mainnet
23
- * @property debug - true to enable debug mode (optional)
25
+ * Parameters for initializing an Evaa contract instance
26
+ * @interface EvaaParameters
24
27
  */
25
- export type EvaaParameters = {
26
- poolConfig: PoolConfig;
27
- debug?: boolean;
28
- };
28
+ export interface EvaaParameters {
29
+ /** Pool configuration containing contract addresses and settings */
30
+ readonly poolConfig: PoolConfig;
31
+ /** Optional debug mode flag for development purposes */
32
+ readonly debug?: boolean;
33
+ }
29
34
  /**
30
- * Base parameters for supply
31
- * @property queryID - unique query ID
32
- * @property includeUserCode - true to include user code for update (needed when user contract code version is outdated)
33
- * @property amount - amount to supply
34
- * @property userAddress - user address
35
- * @property asset
35
+ * Parameters for supply operations
36
+ * @interface SupplyParameters
36
37
  */
37
- export type SupplyParameters = {
38
- asset: PoolAssetConfig;
39
- queryID: bigint;
40
- includeUserCode: boolean;
41
- amount: bigint;
42
- userAddress: Address;
43
- responseAddress?: Address;
44
- forwardAmount?: bigint;
45
- payload: Cell;
46
- subaccountId?: number;
47
- returnRepayRemainingsFlag?: boolean;
48
- customPayloadRecipient?: Address;
49
- customPayloadSaturationFlag?: boolean;
50
- };
38
+ export interface SupplyParameters {
39
+ /** Asset configuration for the supply operation */
40
+ readonly asset: PoolAssetConfig;
41
+ /** Unique identifier for this operation */
42
+ readonly queryID: bigint;
43
+ /** Whether to include user contract code update */
44
+ readonly includeUserCode: boolean;
45
+ /** Amount to supply (must be positive) */
46
+ readonly amount: bigint;
47
+ /** Address of the user performing the supply */
48
+ readonly userAddress: Address;
49
+ /** Optional address for operation response */
50
+ readonly responseAddress?: Address;
51
+ /** Optional forward amount for transaction fees */
52
+ readonly forwardAmount?: bigint;
53
+ /** Operation payload cell */
54
+ readonly payload: Cell;
55
+ /** Optional subaccount identifier (0-255) */
56
+ readonly subaccountId?: number;
57
+ /** Whether to return repay remainings */
58
+ readonly returnRepayRemainingsFlag?: boolean;
59
+ /** Optional custom payload recipient address */
60
+ readonly customPayloadRecipient?: Address;
61
+ /** Whether to saturate custom payload */
62
+ readonly customPayloadSaturationFlag?: boolean;
63
+ }
51
64
  /**
52
- * Parameters for the withdraw message
53
- * @property queryID - unique query ID
54
- * @property asset - asset config
55
- * @property amount - amount to withdraw
56
- * @property userAddress - user address
57
- * @property includeUserCode - true to include user code for update (needed when user contract code version is outdated)
65
+ * Parameters for withdraw operations
66
+ * @interface WithdrawParameters
58
67
  */
59
- export type WithdrawParameters = {
60
- queryID: bigint;
61
- amount: bigint;
62
- userAddress: Address;
63
- includeUserCode: boolean;
64
- asset: PoolAssetConfig;
65
- payload: Cell;
66
- subaccountId?: number;
67
- forwardAmount?: bigint;
68
- amountToTransfer: bigint;
69
- customPayloadSaturationFlag: boolean;
70
- returnRepayRemainingsFlag: boolean;
71
- };
68
+ export interface WithdrawParameters {
69
+ /** Unique identifier for this operation */
70
+ readonly queryID: bigint;
71
+ /** Amount to withdraw (must be positive) */
72
+ readonly amount: bigint;
73
+ /** Address of the user performing the withdrawal */
74
+ readonly userAddress: Address;
75
+ /** Whether to include user contract code update */
76
+ readonly includeUserCode: boolean;
77
+ /** Asset configuration for the withdrawal */
78
+ readonly asset: PoolAssetConfig;
79
+ /** Operation payload cell */
80
+ readonly payload: Cell;
81
+ /** Optional subaccount identifier (0-255) */
82
+ readonly subaccountId?: number;
83
+ /** Optional forward amount for transaction fees */
84
+ readonly forwardAmount?: bigint;
85
+ /** Actual amount to transfer after calculations */
86
+ readonly amountToTransfer: bigint;
87
+ /** Whether to saturate custom payload */
88
+ readonly customPayloadSaturationFlag: boolean;
89
+ /** Whether to return repay remainings */
90
+ readonly returnRepayRemainingsFlag: boolean;
91
+ }
72
92
  /**
73
93
  * Parameters for liquidation inner operations
74
94
  * @interface LiquidationInnerParameters
75
95
  */
76
- export type LiquidationInnerParameters = {
96
+ export interface LiquidationInnerParameters {
77
97
  /** Liquidation operation payload cell */
78
- payload: Cell;
79
- subaccountId: number;
80
- customPayloadRecipient: Address;
81
- customPayloadSaturationFlag: boolean;
82
- };
98
+ readonly payload: Cell;
99
+ /** Subaccount identifier for the operation */
100
+ readonly subaccountId: number;
101
+ /** Address to receive custom payload */
102
+ readonly customPayloadRecipient: Address;
103
+ /** Whether to saturate the custom payload */
104
+ readonly customPayloadSaturationFlag: boolean;
105
+ }
83
106
  /**
84
- * Base data for liquidation. Can be obtained from the user contract liquidationParameters getter
85
- * @property loanAsset - loan asset ID
86
- * @property queryID - unique query ID
87
- * @property liquidatorAddress - liquidator address, where and collateral will be sent
107
+ * Base parameters for liquidation operations
108
+ * @interface LiquidationParameters
109
+ * @description Can be obtained from the user contract liquidationParameters getter
88
110
  */
89
- export type LiquidationParameters = {
90
- loanAsset: bigint;
91
- queryID: bigint;
92
- liquidatorAddress: Address;
93
- };
111
+ export interface LiquidationParameters {
112
+ /** Asset ID of the loan being liquidated */
113
+ readonly loanAsset: bigint;
114
+ /** Unique identifier for this operation */
115
+ readonly queryID: bigint;
116
+ /** Address where collateral will be sent upon liquidation */
117
+ readonly liquidatorAddress: Address;
118
+ }
94
119
  /**
95
- * @property asset - asset config
96
- * @property borrowerAddress - borrower address (user address that is being liquidated)
97
- * @property collateralAsset - collateral asset ID
98
- * @property minCollateralAmount - minimal amount to receive from the liquidation
99
- * @property liquidationAmount - amount to liquidate
100
- * @property includeUserCode - true to include user code for update (needed when user contract code version is outdated)
120
+ * Parameters for building liquidation operations
121
+ * @interface LiquidationOperationBuilderParameters
101
122
  */
102
- export type LiquidationOperationBuilderParameters = {
103
- asset: PoolAssetConfig;
104
- borrowerAddress: Address;
105
- collateralAsset: bigint;
106
- minCollateralAmount: bigint;
107
- liquidationAmount: bigint;
108
- includeUserCode: boolean;
109
- };
110
- export type SupplyWithdrawParameters = {
111
- queryID: bigint;
112
- supplyAmount: bigint;
113
- supplyAsset: PoolAssetConfig;
114
- withdrawAmount: bigint;
115
- withdrawAsset: PoolAssetConfig;
116
- withdrawRecipient: Address;
117
- includeUserCode: boolean;
118
- tonForRepayRemainings?: bigint;
119
- payload: Cell;
120
- subaccountId?: number;
121
- returnRepayRemainingsFlag?: boolean;
122
- customPayloadSaturationFlag?: boolean;
123
- forwardAmount?: bigint;
124
- responseAddress?: Address;
125
- };
126
- export type BaseMasterConfig = {
127
- ifActive: number;
128
- admin: Address;
129
- tokenKeys: Cell | null;
130
- supervisor: Address | null;
131
- };
123
+ export interface LiquidationOperationBuilderParameters {
124
+ /** Asset configuration for the liquidation */
125
+ readonly asset: PoolAssetConfig;
126
+ /** Address of the borrower being liquidated */
127
+ readonly borrowerAddress: Address;
128
+ /** Asset ID of the collateral to be seized */
129
+ readonly collateralAsset: bigint;
130
+ /** Minimum collateral amount expected from liquidation */
131
+ readonly minCollateralAmount: bigint;
132
+ /** Amount of debt to liquidate */
133
+ readonly liquidationAmount: bigint;
134
+ /** Whether to include user contract code update */
135
+ readonly includeUserCode: boolean;
136
+ }
137
+ export interface SupplyWithdrawParameters {
138
+ readonly queryID: bigint;
139
+ readonly supplyAmount: bigint;
140
+ readonly supplyAsset: PoolAssetConfig;
141
+ readonly withdrawAmount: bigint;
142
+ readonly withdrawAsset: PoolAssetConfig;
143
+ readonly withdrawRecipient: Address;
144
+ readonly includeUserCode: boolean;
145
+ readonly tonForRepayRemainings?: bigint;
146
+ readonly payload: Cell;
147
+ readonly subaccountId?: number;
148
+ readonly returnRepayRemainingsFlag?: boolean;
149
+ readonly customPayloadSaturationFlag?: boolean;
150
+ readonly forwardAmount?: bigint;
151
+ readonly responseAddress?: Address;
152
+ }
153
+ export interface BaseMasterConfig {
154
+ readonly ifActive: number;
155
+ readonly admin: Address;
156
+ readonly tokenKeys: Cell | null;
157
+ readonly supervisor: Address | null;
158
+ }
132
159
  export type OracleInfo = PythOracleInfo | ClassicOracleInfo;
133
- export type MasterConfig<T extends OracleInfo> = BaseMasterConfig & {
134
- oraclesInfo: T;
135
- };
136
- export type BaseMasterData = {
137
- meta: string;
138
- upgradeConfig: UpgradeConfig;
139
- assetsConfig: ExtendedAssetsConfig;
140
- assetsData: ExtendedAssetsData;
141
- assetsReserves: Dictionary<bigint, bigint>;
142
- apy: {
143
- supply: Dictionary<bigint, number>;
144
- borrow: Dictionary<bigint, number>;
160
+ export interface MasterConfig<T extends OracleInfo> extends BaseMasterConfig {
161
+ readonly oraclesInfo: T;
162
+ }
163
+ export interface BaseMasterData {
164
+ readonly meta: string;
165
+ readonly upgradeConfig: UpgradeConfig;
166
+ readonly assetsConfig: ExtendedAssetsConfig;
167
+ readonly assetsData: ExtendedAssetsData;
168
+ readonly assetsReserves: Dictionary<bigint, bigint>;
169
+ readonly apy: {
170
+ readonly supply: Dictionary<bigint, number>;
171
+ readonly borrow: Dictionary<bigint, number>;
145
172
  };
146
- };
147
- export type MasterData<T extends MasterConfig<OracleInfo>> = BaseMasterData & {
148
- masterConfig: T;
149
- };
173
+ }
174
+ export interface MasterData<T extends MasterConfig<OracleInfo>> extends BaseMasterData {
175
+ readonly masterConfig: T;
176
+ }
150
177
  /**
151
- * Abstract EVAA Master base that encapsulates shared logic and structure.
152
- * Concrete implementations (Classic/Pyth) should override message creation for
153
- * withdraw/liquidation and supply-withdraw wrapping.
178
+ * Abstract base class for EVAA Master contracts
179
+ *
180
+ * This class provides shared functionality for both Classic and Pyth master implementations,
181
+ * including message creation, validation, and transaction handling. Concrete implementations
182
+ * must override oracle-specific methods for withdraw/liquidation operations.
183
+ *
184
+ * @template T - Master data type extending MasterData with specific oracle configuration
185
+ * @abstract
186
+ * @implements {Contract}
154
187
  */
155
188
  export declare abstract class AbstractEvaaMaster<T extends MasterData<MasterConfig<OracleInfo>>> implements Contract {
156
189
  readonly address: Address;
@@ -158,14 +191,79 @@ export declare abstract class AbstractEvaaMaster<T extends MasterData<MasterConf
158
191
  protected readonly debug?: boolean;
159
192
  protected _data?: T;
160
193
  protected lastSync: number;
194
+ /**
195
+ * Initialize the abstract master contract
196
+ * @param parameters - Configuration parameters for the Evaa master
197
+ */
161
198
  constructor(parameters: EvaaParameters);
199
+ /**
200
+ * Get the current pool configuration
201
+ * @returns {PoolConfig} The pool configuration object
202
+ */
162
203
  get poolConfig(): PoolConfig;
204
+ /**
205
+ * Get the synchronized master data
206
+ * @returns {T | undefined} Master data if available, undefined otherwise
207
+ */
163
208
  get data(): T | undefined;
209
+ /**
210
+ * Validates jetton parameters ensuring at least one amount field is provided
211
+ * @private
212
+ * @static
213
+ * @param parameters - Jetton parameters to validate
214
+ * @returns {ValidJettonParams} Validated parameters
215
+ * @throws {Error} When no amount fields are provided
216
+ */
217
+ private static validateJettonParams;
218
+ /**
219
+ * Creates a jetton transfer message with the provided parameters
220
+ * @protected
221
+ * @param parameters - Jetton transfer parameters
222
+ * @param defaultFees - Default fee amount for the operation
223
+ * @param message - Operation message cell to include
224
+ * @returns {Cell} Complete jetton transfer message cell
225
+ * @throws {Error} When validation fails or required addresses are missing
226
+ */
164
227
  protected createJettonTransferMessage(parameters: JettonParams, defaultFees: bigint, message: Cell): Cell;
228
+ /**
229
+ * Builds general data payload for supply-withdraw operations
230
+ * @abstract
231
+ * @param parameters - Supply-withdraw parameters (oracle-specific)
232
+ * @returns {Cell} General data payload cell
233
+ */
165
234
  abstract buildGeneralDataPayload(parameters: PythSupplyWithdrawParameters | ClassicSupplyWithdrawParameters): Cell;
166
235
  protected buildSupplyWithdrawOperationPayload(parameters: PythSupplyWithdrawParameters | ClassicSupplyWithdrawParameters): Cell;
236
+ /**
237
+ * Validates supply operation parameters
238
+ * @private
239
+ * @static
240
+ * @param parameters - Supply parameters to validate
241
+ * @throws {Error} When amount is invalid or subaccount ID is out of range
242
+ */
243
+ private static validateSupplyParameters;
244
+ /**
245
+ * Creates a supply operation message
246
+ * @param parameters - Supply operation parameters
247
+ * @returns {Cell} Complete supply message cell
248
+ * @throws {Error} When validation fails
249
+ */
167
250
  createSupplyMessage(parameters: SupplyParameters): Cell;
251
+ /**
252
+ * Creates a supply-withdraw operation message
253
+ * @abstract
254
+ * @param parameters - Oracle-specific supply-withdraw parameters
255
+ * @returns {Cell} Complete supply-withdraw message cell
256
+ * @remarks Concrete classes must wrap the operation payload correctly for their oracle
257
+ */
168
258
  abstract createSupplyWithdrawMessage(parameters: ClassicSupplyWithdrawParameters | PythSupplyWithdrawParameters): Cell;
259
+ /**
260
+ * Sends a supply operation to the master contract
261
+ * @param provider - Contract provider instance
262
+ * @param via - Sender instance
263
+ * @param value - Transaction value in nanoTON
264
+ * @param parameters - Supply operation parameters
265
+ * @throws {Error} When validation fails or transaction fails
266
+ */
169
267
  sendSupply(provider: ContractProvider, via: Sender, value: bigint, parameters: SupplyParameters): Promise<void>;
170
268
  sendSupplyWithdraw(provider: ContractProvider, via: Sender, value: bigint, parameters: ClassicSupplyWithdrawParameters | PythSupplyWithdrawParameters): Promise<void>;
171
269
  abstract sendWithdraw(provider: ContractProvider, via: Sender, value: bigint, parameters: ClassicWithdrawParameters | PythWithdrawParameters): Promise<void>;
@@ -174,7 +272,21 @@ export declare abstract class AbstractEvaaMaster<T extends MasterData<MasterConf
174
272
  protected abstract buildLiquidationOperationPayload(parameters: PythLiquidationOperationParameters | ClassicLiquidationOperationParameters): Cell | Builder;
175
273
  protected buildLiquidationOperationPayloadBuilder(parameters: LiquidationOperationBuilderParameters): Builder;
176
274
  abstract sendLiquidation(provider: ContractProvider, via: Sender, value: bigint, parameters: ClassicLiquidationParameters | PythLiquidationParameters): Promise<void>;
275
+ /**
276
+ * Calculates the user smart contract address for a given user and subaccount
277
+ * @param userAddress - The user's wallet address
278
+ * @param lendingCode - The user contract code cell
279
+ * @param subaccountId - Optional subaccount identifier (default: 0)
280
+ * @returns {Address} The calculated user contract address
281
+ * @throws {Error} When subaccount ID is invalid
282
+ */
177
283
  calculateUserSCAddr(userAddress: Address, lendingCode: Cell, subaccountId?: number): Address;
284
+ /**
285
+ * Creates a user contract instance for the given address and subaccount
286
+ * @param userAddress - The user's wallet address
287
+ * @param subaccountId - Optional subaccount identifier (default: 0)
288
+ * @returns {EvaaUser} User contract instance
289
+ */
178
290
  openUserContract(userAddress: Address, subaccountId?: number): EvaaUser;
179
291
  getOpenedUserContract(provider: ContractProvider, userAddress: Address, subaccountId?: number): OpenedContract<EvaaUser>;
180
292
  sendOnchainGetter(provider: ContractProvider, via: Sender, value: bigint, queryID: bigint, forwardPayload: Cell): Promise<void>;
@@ -9,38 +9,82 @@ const userJettonWallet_1 = require("../utils/userJettonWallet");
9
9
  const JettonWallet_1 = require("./JettonWallet");
10
10
  const UserContract_1 = require("./UserContract");
11
11
  /**
12
- * Abstract EVAA Master base that encapsulates shared logic and structure.
13
- * Concrete implementations (Classic/Pyth) should override message creation for
14
- * withdraw/liquidation and supply-withdraw wrapping.
12
+ * Abstract base class for EVAA Master contracts
13
+ *
14
+ * This class provides shared functionality for both Classic and Pyth master implementations,
15
+ * including message creation, validation, and transaction handling. Concrete implementations
16
+ * must override oracle-specific methods for withdraw/liquidation operations.
17
+ *
18
+ * @template T - Master data type extending MasterData with specific oracle configuration
19
+ * @abstract
20
+ * @implements {Contract}
15
21
  */
16
22
  class AbstractEvaaMaster {
23
+ /**
24
+ * Initialize the abstract master contract
25
+ * @param parameters - Configuration parameters for the Evaa master
26
+ */
17
27
  constructor(parameters) {
18
28
  this.lastSync = 0;
19
29
  this._poolConfig = parameters.poolConfig;
20
30
  this.address = this._poolConfig.masterAddress;
21
31
  this.debug = parameters?.debug;
22
32
  }
33
+ /**
34
+ * Get the current pool configuration
35
+ * @returns {PoolConfig} The pool configuration object
36
+ */
23
37
  get poolConfig() {
24
38
  return this._poolConfig;
25
39
  }
40
+ /**
41
+ * Get the synchronized master data
42
+ * @returns {T | undefined} Master data if available, undefined otherwise
43
+ */
26
44
  get data() {
27
45
  return this._data;
28
46
  }
29
- // ---------- Common helpers ----------
30
- createJettonTransferMessage(parameters, defaultFees, message) {
47
+ // ========== VALIDATION METHODS ==========
48
+ /**
49
+ * Validates jetton parameters ensuring at least one amount field is provided
50
+ * @private
51
+ * @static
52
+ * @param parameters - Jetton parameters to validate
53
+ * @returns {ValidJettonParams} Validated parameters
54
+ * @throws {Error} When no amount fields are provided
55
+ */
56
+ static validateJettonParams(parameters) {
31
57
  if (parameters.amount == undefined &&
32
58
  parameters.liquidationAmount == undefined &&
33
59
  parameters.supplyAmount == undefined) {
34
- throw new Error('Either amount or liquidationAmount or supplyAmount must be provided');
60
+ throw new Error(`JettonParams validation failed: ${general_1.VALIDATION.ERRORS.MISSING_JETTON_AMOUNT}`);
61
+ }
62
+ return parameters;
63
+ }
64
+ /**
65
+ * Creates a jetton transfer message with the provided parameters
66
+ * @protected
67
+ * @param parameters - Jetton transfer parameters
68
+ * @param defaultFees - Default fee amount for the operation
69
+ * @param message - Operation message cell to include
70
+ * @returns {Cell} Complete jetton transfer message cell
71
+ * @throws {Error} When validation fails or required addresses are missing
72
+ */
73
+ createJettonTransferMessage(parameters, defaultFees, message) {
74
+ const validParams = AbstractEvaaMaster.validateJettonParams(parameters);
75
+ const amount = validParams.amount ?? validParams.liquidationAmount ?? validParams.supplyAmount ?? 0n;
76
+ const responseAddress = validParams.responseAddress ?? validParams.userAddress ?? validParams.liquidatorAddress;
77
+ if (!responseAddress) {
78
+ throw new Error(`JettonTransfer validation failed: ${general_1.VALIDATION.ERRORS.MISSING_RESPONSE_ADDRESS}`);
35
79
  }
36
80
  return (0, core_1.beginCell)()
37
81
  .storeUint(general_1.OPCODES.JETTON_TRANSFER, 32)
38
- .storeUint(parameters.queryID, 64)
39
- .storeCoins(parameters.amount ?? parameters.liquidationAmount ?? parameters.supplyAmount ?? 0n)
40
- .storeAddress(parameters.destinationAddress ?? this.address)
41
- .storeAddress(parameters.responseAddress ?? parameters.userAddress ?? parameters.liquidatorAddress)
82
+ .storeUint(validParams.queryID, 64)
83
+ .storeCoins(amount)
84
+ .storeAddress(validParams.destinationAddress ?? this.address)
85
+ .storeAddress(responseAddress)
42
86
  .storeBit(0)
43
- .storeCoins(parameters.forwardAmount ?? defaultFees)
87
+ .storeCoins(validParams.forwardAmount ?? defaultFees)
44
88
  .storeBit(1)
45
89
  .storeRef(message)
46
90
  .endCell();
@@ -58,8 +102,27 @@ class AbstractEvaaMaster {
58
102
  const generalData = this.buildGeneralDataPayload(parameters);
59
103
  return (0, core_1.beginCell)().storeRef(supplyData).storeRef(withdrawData).storeRef(generalData).endCell();
60
104
  }
61
- // ---------- Public message builders (shared) ----------
105
+ // ========== MESSAGE BUILDERS ==========
106
+ /**
107
+ * Validates supply operation parameters
108
+ * @private
109
+ * @static
110
+ * @param parameters - Supply parameters to validate
111
+ * @throws {Error} When amount is invalid or subaccount ID is out of range
112
+ */
113
+ static validateSupplyParameters(parameters) {
114
+ if (parameters.subaccountId !== undefined && !(0, __1.isValidSubaccountId)(parameters.subaccountId)) {
115
+ throw new Error(`Supply validation failed: ${general_1.VALIDATION.ERRORS.INVALID_SUBACCOUNT_ID}`);
116
+ }
117
+ }
118
+ /**
119
+ * Creates a supply operation message
120
+ * @param parameters - Supply operation parameters
121
+ * @returns {Cell} Complete supply message cell
122
+ * @throws {Error} When validation fails
123
+ */
62
124
  createSupplyMessage(parameters) {
125
+ AbstractEvaaMaster.validateSupplyParameters(parameters);
63
126
  const subaccountId = parameters.subaccountId ?? 0;
64
127
  const isTon = (0, __1.isTonAsset)(parameters.asset);
65
128
  const operationPayload = (0, core_1.beginCell)()
@@ -81,7 +144,15 @@ class AbstractEvaaMaster {
81
144
  return operationPayload;
82
145
  }
83
146
  }
84
- // ---------- Sending operations ----------
147
+ // ========== TRANSACTION OPERATIONS ==========
148
+ /**
149
+ * Sends a supply operation to the master contract
150
+ * @param provider - Contract provider instance
151
+ * @param via - Sender instance
152
+ * @param value - Transaction value in nanoTON
153
+ * @param parameters - Supply operation parameters
154
+ * @throws {Error} When validation fails or transaction fails
155
+ */
85
156
  async sendSupply(provider, via, value, parameters) {
86
157
  const message = this.createSupplyMessage(parameters);
87
158
  await this.sendTx(provider, via, value, message, parameters.asset);
@@ -106,7 +177,15 @@ class AbstractEvaaMaster {
106
177
  .storeInt(parameters.includeUserCode ? -1 : 0, 2)
107
178
  .storeUint((0, __1.isTonAsset)(parameters.asset) ? parameters.liquidationAmount : 0, 64);
108
179
  }
109
- // ---------- Read helpers ----------
180
+ // ========== CONTRACT INTERACTION HELPERS ==========
181
+ /**
182
+ * Calculates the user smart contract address for a given user and subaccount
183
+ * @param userAddress - The user's wallet address
184
+ * @param lendingCode - The user contract code cell
185
+ * @param subaccountId - Optional subaccount identifier (default: 0)
186
+ * @returns {Address} The calculated user contract address
187
+ * @throws {Error} When subaccount ID is invalid
188
+ */
110
189
  calculateUserSCAddr(userAddress, lendingCode, subaccountId = 0) {
111
190
  const subaccount = (0, core_1.beginCell)();
112
191
  if (subaccountId !== 0) {
@@ -129,6 +208,12 @@ class AbstractEvaaMaster {
129
208
  .endCell();
130
209
  return new core_1.Address(0, stateInit.hash());
131
210
  }
211
+ /**
212
+ * Creates a user contract instance for the given address and subaccount
213
+ * @param userAddress - The user's wallet address
214
+ * @param subaccountId - Optional subaccount identifier (default: 0)
215
+ * @returns {EvaaUser} User contract instance
216
+ */
132
217
  openUserContract(userAddress, subaccountId = 0) {
133
218
  return UserContract_1.EvaaUser.createFromAddress(this.calculateUserSCAddr(userAddress, this._poolConfig.lendingCode, subaccountId), this._poolConfig);
134
219
  }
@@ -167,12 +252,12 @@ class AbstractEvaaMaster {
167
252
  if (state.type === 'active') {
168
253
  this._data = (0, parser_1.parseMasterData)(state.data.toString('base64'), this._poolConfig.poolAssetsConfig, this._poolConfig.masterConstants, oracleParser);
169
254
  if (this._data.upgradeConfig.masterCodeVersion !== this._poolConfig.masterVersion) {
170
- throw Error(`Outdated SDK pool version. It supports only master code version ${this._poolConfig.masterVersion}, but the current master code version is ${this._data.upgradeConfig.masterCodeVersion}`);
255
+ throw new Error(`${general_1.VALIDATION.ERRORS.OUTDATED_SDK_VERSION}. SDK supports version ${this._poolConfig.masterVersion}, but contract version is ${this._data.upgradeConfig.masterCodeVersion}`);
171
256
  }
172
257
  this.lastSync = Math.floor(Date.now() / 1000);
173
258
  }
174
259
  else {
175
- throw Error('Master contract is not active');
260
+ throw new Error(general_1.VALIDATION.ERRORS.MASTER_CONTRACT_INACTIVE);
176
261
  }
177
262
  }
178
263
  }
@@ -2,26 +2,26 @@ import { Builder, Cell, ContractProvider, Sender } from '@ton/core';
2
2
  import { LiquidationParameters } from '..';
3
3
  import { ClassicOracleInfo } from '../api/parsers/ClassicOracleParser';
4
4
  import { AbstractEvaaMaster, BaseMasterConfig, BaseMasterData, EvaaParameters, LiquidationInnerParameters, LiquidationOperationBuilderParameters, SupplyWithdrawParameters, WithdrawParameters } from './AbstractMaster';
5
- export type ClassicSupplyWithdrawParameters = SupplyWithdrawParameters & {
6
- priceData?: Cell;
7
- };
5
+ export interface ClassicSupplyWithdrawParameters extends SupplyWithdrawParameters {
6
+ readonly priceData?: Cell;
7
+ }
8
8
  /**
9
9
  * Parameters for the withdraw message
10
10
  * @property priceData - price data cell. Can be obtained from the getPrices function
11
11
  */
12
- export type ClassicWithdrawParameters = WithdrawParameters & {
13
- priceData: Cell;
14
- };
12
+ export interface ClassicWithdrawParameters extends WithdrawParameters {
13
+ readonly priceData?: Cell;
14
+ }
15
15
  export type ClassicLiquidationOperationParameters = LiquidationOperationBuilderParameters & LiquidationInnerParameters & {
16
16
  priceData: Cell;
17
17
  };
18
18
  export type ClassicLiquidationParameters = LiquidationParameters & ClassicLiquidationOperationParameters;
19
- export type ClassicMasterConfig = BaseMasterConfig & {
20
- oraclesInfo: ClassicOracleInfo;
21
- };
22
- export type ClassicMasterData = BaseMasterData & {
23
- masterConfig: ClassicMasterConfig;
24
- };
19
+ export interface ClassicMasterConfig extends BaseMasterConfig {
20
+ readonly oraclesInfo: ClassicOracleInfo;
21
+ }
22
+ export interface ClassicMasterData extends BaseMasterData {
23
+ readonly masterConfig: ClassicMasterConfig;
24
+ }
25
25
  export declare class EvaaMasterClassic extends AbstractEvaaMaster<ClassicMasterData> {
26
26
  constructor(parameters: EvaaParameters);
27
27
  buildGeneralDataPayload(parameters: ClassicSupplyWithdrawParameters): Cell;