@evaafi/sdk 0.6.4 → 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 (129) 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/assets.d.ts +3 -0
  28. package/dist/constants/assets.js +14 -1
  29. package/dist/constants/general/index.d.ts +65 -0
  30. package/dist/constants/general/index.js +93 -0
  31. package/dist/constants/general/mainnet.d.ts +24 -0
  32. package/dist/constants/general/mainnet.js +53 -0
  33. package/dist/constants/general/testnet.d.ts +12 -0
  34. package/dist/constants/general/testnet.js +15 -0
  35. package/dist/constants/general.d.ts +4 -4
  36. package/dist/constants/general.js +6 -6
  37. package/dist/constants/index.d.ts +3 -0
  38. package/dist/constants/index.js +19 -0
  39. package/dist/constants/pools/index.d.ts +2 -0
  40. package/dist/constants/pools/index.js +18 -0
  41. package/dist/constants/pools/mainnet.d.ts +14 -0
  42. package/dist/constants/pools/mainnet.js +145 -0
  43. package/dist/constants/pools/testnet.d.ts +9 -0
  44. package/dist/constants/pools/testnet.js +57 -0
  45. package/dist/constants/pools.js +9 -9
  46. package/dist/contracts/AbstractMaster.d.ts +185 -0
  47. package/dist/contracts/AbstractMaster.js +179 -0
  48. package/dist/contracts/ClassicMaster.d.ts +34 -0
  49. package/dist/contracts/ClassicMaster.js +87 -0
  50. package/dist/contracts/PythMaster.d.ts +61 -0
  51. package/dist/contracts/PythMaster.js +179 -0
  52. package/dist/contracts/UserContract.d.ts +1 -7
  53. package/dist/contracts/UserContract.js +1 -19
  54. package/dist/contracts/index.d.ts +5 -0
  55. package/dist/contracts/index.js +21 -0
  56. package/dist/index.d.ts +14 -14
  57. package/dist/index.js +20 -60
  58. package/dist/prices/Oracle.interface.d.ts +9 -0
  59. package/dist/prices/Oracle.interface.js +2 -0
  60. package/dist/prices/Prices.d.ts +5 -3
  61. package/dist/prices/Prices.js +13 -3
  62. package/dist/prices/PricesCollector.d.ts +17 -7
  63. package/dist/prices/PricesCollector.js +67 -51
  64. package/dist/prices/PythCollector.d.ts +22 -0
  65. package/dist/prices/PythCollector.js +217 -0
  66. package/dist/prices/Types.d.ts +17 -2
  67. package/dist/prices/Types.js +8 -1
  68. package/dist/prices/index.d.ts +4 -3
  69. package/dist/prices/index.js +4 -3
  70. package/dist/prices/sources/Backend.d.ts +5 -4
  71. package/dist/prices/sources/Backend.js +16 -13
  72. package/dist/prices/sources/Icp.d.ts +2 -1
  73. package/dist/prices/sources/Icp.js +12 -9
  74. package/dist/prices/sources/PriceSource.d.ts +7 -6
  75. package/dist/prices/utils.d.ts +10 -9
  76. package/dist/prices/utils.js +32 -46
  77. package/dist/rewards/RewardMaster.d.ts +0 -1
  78. package/dist/rewards/RewardUser.d.ts +0 -1
  79. package/dist/types/Master.d.ts +10 -31
  80. package/dist/types/Master.js +3 -0
  81. package/dist/types/MasterRewards.d.ts +0 -1
  82. package/dist/types/UserRewards.d.ts +0 -1
  83. package/dist/utils/sha256BigInt.d.ts +0 -1
  84. package/dist/utils/userJettonWallet.js +0 -8
  85. package/dist/utils/utils.d.ts +8 -1
  86. package/dist/utils/utils.js +31 -2
  87. package/package.json +4 -3
  88. package/src/api/feeds.ts +90 -0
  89. package/src/api/liquidation.ts +1 -1
  90. package/src/api/math.ts +1 -1
  91. package/src/api/parser.ts +100 -38
  92. package/src/api/parsers/AbstractOracleParser.ts +16 -0
  93. package/src/api/parsers/ClassicOracleParser.ts +20 -0
  94. package/src/api/parsers/PythOracleParser.ts +34 -0
  95. package/src/api/parsers/index.ts +3 -0
  96. package/src/api/prices.ts +32 -41
  97. package/src/constants/assets/assetId.ts +30 -0
  98. package/src/constants/assets/index.ts +3 -0
  99. package/src/constants/{assets.ts → assets/mainnet.ts} +27 -94
  100. package/src/constants/assets/testnet.ts +74 -0
  101. package/src/constants/general/index.ts +91 -0
  102. package/src/constants/{general.ts → general/mainnet.ts} +48 -72
  103. package/src/constants/general/testnet.ts +25 -0
  104. package/src/constants/index.ts +3 -0
  105. package/src/constants/pools/index.ts +2 -0
  106. package/src/constants/pools/mainnet.ts +218 -0
  107. package/src/constants/pools/testnet.ts +75 -0
  108. package/src/contracts/AbstractMaster.ts +450 -0
  109. package/src/contracts/ClassicMaster.ts +149 -0
  110. package/src/contracts/PythMaster.ts +313 -0
  111. package/src/contracts/UserContract.ts +7 -28
  112. package/src/contracts/index.ts +7 -0
  113. package/src/index.ts +18 -85
  114. package/src/prices/Oracle.interface.ts +18 -0
  115. package/src/prices/Prices.ts +17 -4
  116. package/src/prices/PricesCollector.ts +91 -68
  117. package/src/prices/PythCollector.ts +294 -0
  118. package/src/prices/Types.ts +28 -6
  119. package/src/prices/index.ts +4 -3
  120. package/src/prices/sources/Backend.ts +21 -19
  121. package/src/prices/sources/Icp.ts +13 -10
  122. package/src/prices/sources/PriceSource.ts +6 -5
  123. package/src/prices/utils.ts +65 -68
  124. package/src/types/Master.ts +29 -52
  125. package/src/types/User.ts +15 -7
  126. package/src/utils/userJettonWallet.ts +0 -8
  127. package/src/utils/utils.ts +41 -2
  128. package/src/constants/pools.ts +0 -175
  129. package/src/contracts/MasterContract.ts +0 -410
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractEvaaMaster = void 0;
4
+ const core_1 = require("@ton/core");
5
+ const __1 = require("..");
6
+ const parser_1 = require("../api/parser");
7
+ const general_1 = require("../constants/general");
8
+ const userJettonWallet_1 = require("../utils/userJettonWallet");
9
+ const JettonWallet_1 = require("./JettonWallet");
10
+ const UserContract_1 = require("./UserContract");
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.
15
+ */
16
+ class AbstractEvaaMaster {
17
+ constructor(parameters) {
18
+ this.lastSync = 0;
19
+ this._poolConfig = parameters.poolConfig;
20
+ this.address = this._poolConfig.masterAddress;
21
+ this.debug = parameters?.debug;
22
+ }
23
+ get poolConfig() {
24
+ return this._poolConfig;
25
+ }
26
+ get data() {
27
+ return this._data;
28
+ }
29
+ // ---------- Common helpers ----------
30
+ createJettonTransferMessage(parameters, defaultFees, message) {
31
+ if (parameters.amount == undefined &&
32
+ parameters.liquidationAmount == undefined &&
33
+ parameters.supplyAmount == undefined) {
34
+ throw new Error('Either amount or liquidationAmount or supplyAmount must be provided');
35
+ }
36
+ return (0, core_1.beginCell)()
37
+ .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)
42
+ .storeBit(0)
43
+ .storeCoins(parameters.forwardAmount ?? defaultFees)
44
+ .storeBit(1)
45
+ .storeRef(message)
46
+ .endCell();
47
+ }
48
+ buildSupplyWithdrawOperationPayload(parameters) {
49
+ const isTon = (0, __1.isTonAsset)(parameters.supplyAsset);
50
+ const supplyData = (0, core_1.beginCell)();
51
+ if (isTon) {
52
+ supplyData.storeUint(parameters.supplyAmount, 64);
53
+ }
54
+ const withdrawData = (0, core_1.beginCell)()
55
+ .storeUint(parameters.withdrawAmount, 64)
56
+ .storeUint(parameters.withdrawAsset.assetId, 256)
57
+ .storeAddress(parameters.withdrawRecipient);
58
+ const generalData = this.buildGeneralDataPayload(parameters);
59
+ return (0, core_1.beginCell)().storeRef(supplyData).storeRef(withdrawData).storeRef(generalData).endCell();
60
+ }
61
+ // ---------- Public message builders (shared) ----------
62
+ createSupplyMessage(parameters) {
63
+ const subaccountId = parameters.subaccountId ?? 0;
64
+ const isTon = (0, __1.isTonAsset)(parameters.asset);
65
+ const operationPayload = (0, core_1.beginCell)()
66
+ .storeUint(general_1.OPCODES.SUPPLY_MASTER, 32)
67
+ .storeBuilder(isTon ? (0, core_1.beginCell)().storeUint(parameters.queryID, 64) : (0, core_1.beginCell)())
68
+ .storeInt(parameters.includeUserCode ? -1 : 0, 2)
69
+ .storeBuilder(isTon ? (0, core_1.beginCell)().storeUint(parameters.amount, 64) : (0, core_1.beginCell)())
70
+ .storeAddress(parameters.userAddress)
71
+ .storeRef(parameters.payload)
72
+ .storeInt(subaccountId, 16)
73
+ .storeInt(parameters.returnRepayRemainingsFlag ? -1 : 0, 2)
74
+ .storeAddress(parameters.customPayloadRecipient)
75
+ .storeInt(parameters.customPayloadSaturationFlag ? -1 : 0, 2)
76
+ .endCell();
77
+ if (!isTon) {
78
+ return this.createJettonTransferMessage(parameters, general_1.FEES.SUPPLY, operationPayload);
79
+ }
80
+ else {
81
+ return operationPayload;
82
+ }
83
+ }
84
+ // ---------- Sending operations ----------
85
+ async sendSupply(provider, via, value, parameters) {
86
+ const message = this.createSupplyMessage(parameters);
87
+ await this.sendTx(provider, via, value, message, parameters.asset);
88
+ }
89
+ async sendSupplyWithdraw(provider, via, value, parameters) {
90
+ const message = this.createSupplyWithdrawMessage(parameters);
91
+ await this.sendTx(provider, via, value, message, parameters.supplyAsset);
92
+ }
93
+ buildLiquidationInnerBuilder(parameters) {
94
+ const subaccountId = parameters.subaccountId ?? 0;
95
+ return (0, core_1.beginCell)()
96
+ .storeRef(parameters.payload)
97
+ .storeInt(subaccountId, 16)
98
+ .storeAddress(parameters.customPayloadRecipient)
99
+ .storeInt(parameters.customPayloadSaturationFlag ? -1 : 0, 2);
100
+ }
101
+ buildLiquidationOperationPayloadBuilder(parameters) {
102
+ return (0, core_1.beginCell)()
103
+ .storeAddress(parameters.borrowerAddress)
104
+ .storeUint(parameters.collateralAsset, 256)
105
+ .storeUint(parameters.minCollateralAmount, 64)
106
+ .storeInt(parameters.includeUserCode ? -1 : 0, 2)
107
+ .storeUint((0, __1.isTonAsset)(parameters.asset) ? parameters.liquidationAmount : 0, 64);
108
+ }
109
+ // ---------- Read helpers ----------
110
+ calculateUserSCAddr(userAddress, lendingCode, subaccountId = 0) {
111
+ const subaccount = (0, core_1.beginCell)();
112
+ if (subaccountId !== 0) {
113
+ if (!(0, __1.isValidSubaccountId)(subaccountId))
114
+ throw new Error('Invalid subaccount id');
115
+ subaccount.storeInt(subaccountId, 16);
116
+ }
117
+ const lendingData = (0, core_1.beginCell)()
118
+ .storeAddress(this.address)
119
+ .storeAddress(userAddress)
120
+ .storeUint(0, 8)
121
+ .storeBit(0)
122
+ .storeBuilder(subaccount)
123
+ .endCell();
124
+ const stateInit = (0, core_1.beginCell)()
125
+ .store((0, core_1.storeStateInit)({
126
+ code: lendingCode,
127
+ data: lendingData,
128
+ }))
129
+ .endCell();
130
+ return new core_1.Address(0, stateInit.hash());
131
+ }
132
+ openUserContract(userAddress, subaccountId = 0) {
133
+ return UserContract_1.EvaaUser.createFromAddress(this.calculateUserSCAddr(userAddress, this._poolConfig.lendingCode, subaccountId), this._poolConfig);
134
+ }
135
+ getOpenedUserContract(provider, userAddress, subaccountId = 0) {
136
+ return provider.open(this.openUserContract(userAddress, subaccountId));
137
+ }
138
+ async sendOnchainGetter(provider, via, value, queryID, forwardPayload) {
139
+ await provider.internal(via, {
140
+ value,
141
+ sendMode: core_1.SendMode.PAY_GAS_SEPARATELY + core_1.SendMode.IGNORE_ERRORS,
142
+ body: (0, core_1.beginCell)()
143
+ .storeUint(general_1.OPCODES.ONCHAIN_GETTER, 32)
144
+ .storeUint(queryID, 64)
145
+ .storeRef(forwardPayload)
146
+ .endCell(),
147
+ });
148
+ }
149
+ async sendTx(provider, via, value, message, asset) {
150
+ if (!(0, __1.isTonAsset)(asset)) {
151
+ if (!via.address)
152
+ throw new Error('Via address is required for jetton supply');
153
+ const jettonWallet = provider.open(JettonWallet_1.JettonWallet.createFromAddress((0, userJettonWallet_1.getUserJettonWallet)(via.address, asset)));
154
+ await jettonWallet.sendTransfer(via, value, message);
155
+ }
156
+ else {
157
+ await provider.internal(via, {
158
+ value,
159
+ sendMode: core_1.SendMode.PAY_GAS_SEPARATELY + core_1.SendMode.IGNORE_ERRORS,
160
+ body: message,
161
+ });
162
+ }
163
+ }
164
+ // Centralized sync logic used by concrete masters (Classic/Pyth)
165
+ async syncMasterData(provider, oracleParser) {
166
+ const state = (await provider.getState()).state;
167
+ if (state.type === 'active') {
168
+ this._data = (0, parser_1.parseMasterData)(state.data.toString('base64'), this._poolConfig.poolAssetsConfig, this._poolConfig.masterConstants, oracleParser);
169
+ 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}`);
171
+ }
172
+ this.lastSync = Math.floor(Date.now() / 1000);
173
+ }
174
+ else {
175
+ throw Error('Master contract is not active');
176
+ }
177
+ }
178
+ }
179
+ exports.AbstractEvaaMaster = AbstractEvaaMaster;
@@ -0,0 +1,34 @@
1
+ import { Builder, Cell, ContractProvider, Sender } from '@ton/core';
2
+ import { LiquidationParameters } from '..';
3
+ import { ClassicOracleInfo } from '../api/parsers/ClassicOracleParser';
4
+ import { AbstractEvaaMaster, BaseMasterConfig, BaseMasterData, EvaaParameters, LiquidationInnerParameters, LiquidationOperationBuilderParameters, SupplyWithdrawParameters, WithdrawParameters } from './AbstractMaster';
5
+ export type ClassicSupplyWithdrawParameters = SupplyWithdrawParameters & {
6
+ priceData?: Cell;
7
+ };
8
+ /**
9
+ * Parameters for the withdraw message
10
+ * @property priceData - price data cell. Can be obtained from the getPrices function
11
+ */
12
+ export type ClassicWithdrawParameters = WithdrawParameters & {
13
+ priceData: Cell;
14
+ };
15
+ export type ClassicLiquidationOperationParameters = LiquidationOperationBuilderParameters & LiquidationInnerParameters & {
16
+ priceData: Cell;
17
+ };
18
+ export type ClassicLiquidationParameters = LiquidationParameters & ClassicLiquidationOperationParameters;
19
+ export type ClassicMasterConfig = BaseMasterConfig & {
20
+ oraclesInfo: ClassicOracleInfo;
21
+ };
22
+ export type ClassicMasterData = BaseMasterData & {
23
+ masterConfig: ClassicMasterConfig;
24
+ };
25
+ export declare class EvaaMasterClassic extends AbstractEvaaMaster<ClassicMasterData> {
26
+ constructor(parameters: EvaaParameters);
27
+ buildGeneralDataPayload(parameters: ClassicSupplyWithdrawParameters): Cell;
28
+ createSupplyWithdrawMessage(parameters: ClassicSupplyWithdrawParameters): Cell;
29
+ sendWithdraw(provider: ContractProvider, via: Sender, value: bigint, parameters: ClassicWithdrawParameters): Promise<void>;
30
+ protected buildLiquidationOperationPayload(parameters: ClassicLiquidationOperationParameters): Builder;
31
+ createLiquidationMessage(parameters: ClassicLiquidationParameters): Cell;
32
+ sendLiquidation(provider: ContractProvider, via: Sender, value: bigint, parameters: ClassicLiquidationParameters): Promise<void>;
33
+ getSync(provider: ContractProvider): Promise<void>;
34
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EvaaMasterClassic = void 0;
4
+ const core_1 = require("@ton/core");
5
+ const __1 = require("..");
6
+ const ClassicOracleParser_1 = require("../api/parsers/ClassicOracleParser");
7
+ const general_1 = require("../constants/general");
8
+ const AbstractMaster_1 = require("./AbstractMaster");
9
+ class EvaaMasterClassic extends AbstractMaster_1.AbstractEvaaMaster {
10
+ constructor(parameters) {
11
+ super(parameters);
12
+ }
13
+ buildGeneralDataPayload(parameters) {
14
+ return (0, core_1.beginCell)()
15
+ .storeInt(parameters.includeUserCode ? -1 : 0, 2)
16
+ .storeMaybeRef(parameters.priceData)
17
+ .storeUint(parameters.tonForRepayRemainings ?? 0n, 64)
18
+ .storeRef(parameters.payload)
19
+ .storeInt(parameters.subaccountId ?? 0, 16)
20
+ .storeInt(parameters.returnRepayRemainingsFlag ? -1 : 0, 2)
21
+ .storeInt(parameters.customPayloadSaturationFlag ? -1 : 0, 2)
22
+ .endCell();
23
+ }
24
+ createSupplyWithdrawMessage(parameters) {
25
+ const isTon = (0, __1.isTonAsset)(parameters.supplyAsset);
26
+ const operationPayload = this.buildSupplyWithdrawOperationPayload(parameters);
27
+ const refOpCode = parameters.priceData
28
+ ? general_1.OPCODES.SUPPLY_WITHDRAW_MASTER
29
+ : general_1.OPCODES.SUPPLY_WITHDRAW_MASTER_WITHOUT_PRICES;
30
+ if (!isTon) {
31
+ return this.createJettonTransferMessage(parameters, general_1.FEES.SUPPLY_WITHDRAW, (0, core_1.beginCell)().storeUint(refOpCode, 32).storeSlice(operationPayload.beginParse()).endCell());
32
+ }
33
+ else {
34
+ return (0, core_1.beginCell)()
35
+ .storeUint(refOpCode, 32)
36
+ .storeUint(parameters.queryID, 64)
37
+ .storeSlice(operationPayload.beginParse())
38
+ .endCell();
39
+ }
40
+ }
41
+ async sendWithdraw(provider, via, value, parameters) {
42
+ // Compatibility layer using supply-withdraw with TON zero supply
43
+ await this.sendSupplyWithdraw(provider, via, value, {
44
+ supplyAsset: __1.TON_MAINNET,
45
+ supplyAmount: 0n,
46
+ queryID: parameters.queryID,
47
+ withdrawAsset: parameters.asset,
48
+ withdrawAmount: parameters.amount,
49
+ withdrawRecipient: parameters.userAddress,
50
+ includeUserCode: parameters.includeUserCode,
51
+ forwardAmount: parameters.forwardAmount,
52
+ payload: parameters.payload,
53
+ subaccountId: parameters.subaccountId ?? 0,
54
+ customPayloadSaturationFlag: parameters.customPayloadSaturationFlag ?? false,
55
+ returnRepayRemainingsFlag: parameters.returnRepayRemainingsFlag ?? false,
56
+ tonForRepayRemainings: 0n,
57
+ priceData: parameters.priceData,
58
+ });
59
+ }
60
+ buildLiquidationOperationPayload(parameters) {
61
+ const operationPayloadBuilder = this.buildLiquidationOperationPayloadBuilder(parameters);
62
+ const innerBuilder = this.buildLiquidationInnerBuilder(parameters);
63
+ return operationPayloadBuilder.storeRef(innerBuilder).storeRef(parameters.priceData);
64
+ }
65
+ createLiquidationMessage(parameters) {
66
+ const isTon = (0, __1.isTonAsset)(parameters.asset);
67
+ const operationPayload = this.buildLiquidationOperationPayload(parameters);
68
+ if (!isTon) {
69
+ return this.createJettonTransferMessage(parameters, general_1.FEES.LIQUIDATION_JETTON_FWD, (0, core_1.beginCell)().storeUint(general_1.OPCODES.LIQUIDATE_MASTER, 32).storeBuilder(operationPayload).endCell());
70
+ }
71
+ else {
72
+ return (0, core_1.beginCell)()
73
+ .storeUint(general_1.OPCODES.LIQUIDATE_MASTER, 32)
74
+ .storeUint(parameters.queryID, 64)
75
+ .storeBuilder(operationPayload)
76
+ .endCell();
77
+ }
78
+ }
79
+ async sendLiquidation(provider, via, value, parameters) {
80
+ const message = this.createLiquidationMessage(parameters);
81
+ await this.sendTx(provider, via, value, message, parameters.asset);
82
+ }
83
+ async getSync(provider) {
84
+ await this.syncMasterData(provider, new ClassicOracleParser_1.ClassicOracleParser());
85
+ }
86
+ }
87
+ exports.EvaaMasterClassic = EvaaMasterClassic;
@@ -0,0 +1,61 @@
1
+ /// <reference types="node" />
2
+ import { HexString } from '@pythnetwork/hermes-client';
3
+ import { Address, Cell, ContractProvider, Dictionary, Sender } from '@ton/core';
4
+ import { PythOracleInfo } from '../api/parsers/PythOracleParser';
5
+ import { AbstractEvaaMaster, BaseMasterConfig, BaseMasterData, EvaaParameters, LiquidationInnerParameters, LiquidationOperationBuilderParameters, LiquidationParameters, SupplyWithdrawParameters, WithdrawParameters } from './AbstractMaster';
6
+ /**
7
+ * pyth specific parameters
8
+ */
9
+ export type PythBaseData = {
10
+ priceData: Buffer | Cell;
11
+ targetFeeds: HexString[];
12
+ requestedRefTokens: bigint[];
13
+ };
14
+ export type ProxySpecificPythParams = {
15
+ pythAddress: Address;
16
+ minPublishTime: number | bigint;
17
+ maxPublishTime: number | bigint;
18
+ };
19
+ export type OnchainSpecificPythParams = {
20
+ publishGap: number | bigint;
21
+ maxStaleness: number | bigint;
22
+ };
23
+ export type JettonPythParams = PythBaseData & OnchainSpecificPythParams;
24
+ export type TonPythParams = PythBaseData & ProxySpecificPythParams;
25
+ export type PythProxyParams = {
26
+ pyth: PythBaseData & (ProxySpecificPythParams | OnchainSpecificPythParams) & {
27
+ pythAddress: Address;
28
+ };
29
+ };
30
+ export type PythSupplyWithdrawParameters = SupplyWithdrawParameters & Partial<PythProxyParams>;
31
+ export type PythWithdrawParameters = WithdrawParameters & {
32
+ pyth: TonPythParams;
33
+ };
34
+ export type PythLiquidationOperationParameters = LiquidationOperationBuilderParameters & LiquidationInnerParameters & PythProxyParams;
35
+ export type PythLiquidationParameters = LiquidationParameters & PythLiquidationOperationParameters;
36
+ export type PythMasterConfig = BaseMasterConfig & {
37
+ oraclesInfo: PythOracleInfo;
38
+ };
39
+ export type PythMasterData = BaseMasterData & {
40
+ masterConfig: PythMasterConfig;
41
+ };
42
+ export declare class EvaaMasterPyth extends AbstractEvaaMaster<PythMasterData> {
43
+ constructor(parameters: EvaaParameters);
44
+ protected buildPythMasterMessage(args: {
45
+ queryId: number | bigint;
46
+ opCode: number | bigint;
47
+ updateDataCell: Cell;
48
+ targetFeedsCell: Cell;
49
+ publishGap: number | bigint;
50
+ maxStaleness: number | bigint;
51
+ }, operationPayload: Cell): Cell;
52
+ protected buildPythProxyMessage(targetAddress: Address, priceUpdateData: Cell, targetPythFeeds: Cell, minPublishTime: number | bigint, maxPublishTime: number | bigint, operationPayload: Cell): Cell;
53
+ createSupplyWithdrawMessage(parameters: PythSupplyWithdrawParameters): Cell;
54
+ buildRefTokensDict(requestedRefTokens: bigint[]): Dictionary<bigint, Buffer>;
55
+ buildGeneralDataPayload(parameters: PythSupplyWithdrawParameters): Cell;
56
+ sendWithdraw(provider: ContractProvider, via: Sender, value: bigint, parameters: PythWithdrawParameters): Promise<void>;
57
+ protected buildLiquidationOperationPayload(parameters: PythLiquidationOperationParameters): Cell;
58
+ createLiquidationMessage(parameters: PythLiquidationParameters): Cell;
59
+ sendLiquidation(provider: ContractProvider, via: Sender, value: bigint, parameters: PythLiquidationParameters): Promise<void>;
60
+ getSync(provider: ContractProvider): Promise<void>;
61
+ }
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EvaaMasterPyth = void 0;
4
+ const core_1 = require("@ton/core");
5
+ const PythOracleParser_1 = require("../api/parsers/PythOracleParser");
6
+ const prices_1 = require("../api/prices");
7
+ const constants_1 = require("../constants");
8
+ const general_1 = require("../constants/general");
9
+ const utils_1 = require("../utils/utils");
10
+ const AbstractMaster_1 = require("./AbstractMaster");
11
+ class EvaaMasterPyth extends AbstractMaster_1.AbstractEvaaMaster {
12
+ constructor(parameters) {
13
+ super(parameters);
14
+ }
15
+ buildPythMasterMessage(args, operationPayload) {
16
+ return (0, core_1.beginCell)()
17
+ .storeUint(args.opCode, 32)
18
+ .storeUint(args.queryId, 64)
19
+ .storeRef((0, core_1.beginCell)()
20
+ .storeRef(args.updateDataCell)
21
+ .storeRef(args.targetFeedsCell)
22
+ .storeUint(args.publishGap, 64)
23
+ .storeUint(args.maxStaleness, 64)
24
+ .endCell())
25
+ .storeRef(operationPayload)
26
+ .endCell();
27
+ }
28
+ buildPythProxyMessage(targetAddress, priceUpdateData, targetPythFeeds, minPublishTime, maxPublishTime, operationPayload) {
29
+ return (0, core_1.beginCell)()
30
+ .storeUint(5, 32) // pyth::op_parse_price_feed_updates
31
+ .storeRef(priceUpdateData)
32
+ .storeRef(targetPythFeeds)
33
+ .storeUint(minPublishTime, 64)
34
+ .storeUint(maxPublishTime, 64)
35
+ .storeAddress(targetAddress)
36
+ .storeRef(operationPayload)
37
+ .endCell();
38
+ }
39
+ // TODO: support without OPCODES.SUPPLY_WITHDRAW_MASTER_WITHOUT_PRICES
40
+ createSupplyWithdrawMessage(parameters) {
41
+ const operationPayload = this.buildSupplyWithdrawOperationPayload(parameters);
42
+ if (!(0, utils_1.isTonAsset)(parameters.supplyAsset)) {
43
+ const { priceData, targetFeeds, publishGap, maxStaleness } = parameters.pyth;
44
+ const masterMessage = this.buildPythMasterMessage({
45
+ queryId: parameters.queryID,
46
+ opCode: general_1.OPCODES.SUPPLY_WITHDRAW_MASTER_JETTON,
47
+ updateDataCell: (0, prices_1.packPythUpdatesData)(priceData),
48
+ targetFeedsCell: (0, prices_1.composeFeedsCell)(targetFeeds),
49
+ publishGap,
50
+ maxStaleness,
51
+ }, operationPayload);
52
+ return this.createJettonTransferMessage(parameters, general_1.FEES.SUPPLY_WITHDRAW, masterMessage);
53
+ }
54
+ else {
55
+ const { priceData, targetFeeds, minPublishTime, maxPublishTime } = parameters.pyth;
56
+ const wrappedOperationPayload = (0, core_1.beginCell)()
57
+ .storeUint(general_1.OPCODES.SUPPLY_WITHDRAW_MASTER, 32)
58
+ .storeUint(parameters.queryID, 64)
59
+ .storeRef(operationPayload)
60
+ .endCell();
61
+ return this.buildPythProxyMessage(this.address, (0, prices_1.packPythUpdatesData)(priceData), (0, prices_1.composeFeedsCell)(targetFeeds), minPublishTime, maxPublishTime, wrappedOperationPayload);
62
+ }
63
+ }
64
+ // private createPythWithdrawMessage(parameters: PythWithdrawParameters): Cell {
65
+ // const extraTail =
66
+ // (parameters.subaccountId ?? 0) == 0
67
+ // ? beginCell().endCell()
68
+ // : beginCell()
69
+ // .storeInt(parameters.subaccountId ?? 0, 16)
70
+ // .storeUint(0, 2)
71
+ // .endCell();
72
+ // const wrappedOperationPayload = beginCell()
73
+ // .storeUint(OPCODES.SUPPLY_WITHDRAW_MASTER, 32) // op_code: 0x4
74
+ // .storeUint(parameters.queryID, 64)
75
+ // .storeRef(
76
+ // beginCell()
77
+ // .storeUint(parameters.asset.assetId, 256)
78
+ // .storeUint(parameters.amount, 64)
79
+ // .storeAddress(parameters.userAddress)
80
+ // .storeInt(parameters.includeUserCode ? -1 : 0, 2)
81
+ // .storeUint(parameters.amountToTransfer, 64)
82
+ // .storeRef(parameters.payload)
83
+ // .storeSlice(extraTail.beginParse())
84
+ // .endCell(),
85
+ // )
86
+ // .endCell();
87
+ // const { priceData, targetFeeds, minPublishTime, maxPublishTime } = parameters.pyth as TonPythParams;
88
+ // return makePythProxyMessage(
89
+ // this.address,
90
+ // packPythUpdatesData(priceData),
91
+ // composeFeedsCell(targetFeeds),
92
+ // minPublishTime,
93
+ // maxPublishTime,
94
+ // wrappedOperationPayload,
95
+ // );
96
+ // }
97
+ buildRefTokensDict(requestedRefTokens) {
98
+ const refsDict = core_1.Dictionary.empty(core_1.Dictionary.Keys.BigUint(256), core_1.Dictionary.Values.Buffer(0));
99
+ for (const refToken of requestedRefTokens) {
100
+ refsDict.set(refToken, Buffer.alloc(0));
101
+ }
102
+ return refsDict;
103
+ }
104
+ buildGeneralDataPayload(parameters) {
105
+ const refTokensDict = this.buildRefTokensDict(parameters.pyth?.requestedRefTokens ?? []);
106
+ return (0, core_1.beginCell)()
107
+ .storeInt(parameters.includeUserCode ? -1 : 0, 2)
108
+ .storeDict(refTokensDict, core_1.Dictionary.Keys.BigUint(256), core_1.Dictionary.Values.Buffer(0))
109
+ .storeUint(parameters.tonForRepayRemainings ?? 0n, 64)
110
+ .storeRef(parameters.payload)
111
+ .storeInt(parameters.subaccountId ?? 0, 16)
112
+ .storeInt(parameters.returnRepayRemainingsFlag ? -1 : 0, 2)
113
+ .storeInt(parameters.customPayloadSaturationFlag ? -1 : 0, 2)
114
+ .endCell();
115
+ }
116
+ async sendWithdraw(provider, via, value, parameters) {
117
+ const message = this.createSupplyWithdrawMessage({
118
+ supplyAsset: constants_1.TON_MAINNET,
119
+ supplyAmount: 0n,
120
+ queryID: parameters.queryID,
121
+ withdrawAsset: parameters.asset,
122
+ withdrawAmount: parameters.amount,
123
+ withdrawRecipient: parameters.userAddress,
124
+ includeUserCode: parameters.includeUserCode,
125
+ forwardAmount: parameters.forwardAmount,
126
+ payload: parameters.payload,
127
+ subaccountId: parameters.subaccountId ?? 0,
128
+ customPayloadSaturationFlag: parameters.customPayloadSaturationFlag ?? false,
129
+ returnRepayRemainingsFlag: parameters.returnRepayRemainingsFlag ?? false,
130
+ tonForRepayRemainings: 0n,
131
+ pyth: parameters.pyth,
132
+ });
133
+ await via.send({
134
+ value,
135
+ to: parameters.pyth.pythAddress,
136
+ sendMode: core_1.SendMode.PAY_GAS_SEPARATELY + core_1.SendMode.IGNORE_ERRORS,
137
+ body: message,
138
+ });
139
+ }
140
+ buildLiquidationOperationPayload(parameters) {
141
+ const operationPayloadBuilder = this.buildLiquidationOperationPayloadBuilder(parameters);
142
+ const innerBuilder = this.buildLiquidationInnerBuilder(parameters);
143
+ const refTokensDict = this.buildRefTokensDict(parameters.pyth.requestedRefTokens);
144
+ return operationPayloadBuilder.storeDict(refTokensDict).storeRef(innerBuilder).endCell();
145
+ }
146
+ createLiquidationMessage(parameters) {
147
+ const isTon = (0, utils_1.isTonAsset)(parameters.asset);
148
+ const operationPayload = this.buildLiquidationOperationPayload(parameters);
149
+ if (!isTon) {
150
+ const { priceData, targetFeeds, publishGap, maxStaleness } = parameters.pyth;
151
+ const masterMessage = this.buildPythMasterMessage({
152
+ queryId: parameters.queryID,
153
+ opCode: general_1.OPCODES.LIQUIDATE_MASTER,
154
+ updateDataCell: (0, prices_1.packPythUpdatesData)(priceData),
155
+ targetFeedsCell: (0, prices_1.composeFeedsCell)(targetFeeds),
156
+ publishGap,
157
+ maxStaleness,
158
+ }, operationPayload);
159
+ return this.createJettonTransferMessage(parameters, general_1.FEES.LIQUIDATION_JETTON_FWD, masterMessage);
160
+ }
161
+ else {
162
+ const { priceData, targetFeeds, minPublishTime, maxPublishTime } = parameters.pyth;
163
+ const wrappedOperationPayload = (0, core_1.beginCell)()
164
+ .storeUint(general_1.OPCODES.LIQUIDATE_MASTER, 32)
165
+ .storeUint(parameters.queryID, 64)
166
+ .storeRef(operationPayload)
167
+ .endCell();
168
+ return this.buildPythProxyMessage(this.address, (0, prices_1.packPythUpdatesData)(priceData), (0, prices_1.composeFeedsCell)(targetFeeds), minPublishTime, maxPublishTime, wrappedOperationPayload);
169
+ }
170
+ }
171
+ async sendLiquidation(provider, via, value, parameters) {
172
+ const message = this.createLiquidationMessage(parameters);
173
+ await this.sendTx(provider, via, value, message, parameters.asset);
174
+ }
175
+ async getSync(provider) {
176
+ await this.syncMasterData(provider, new PythOracleParser_1.PythOracleParser());
177
+ }
178
+ }
179
+ exports.EvaaMasterPyth = EvaaMasterPyth;
@@ -1,7 +1,6 @@
1
1
  import { Address, Cell, Contract, ContractProvider, Dictionary, Sender } from '@ton/core';
2
- import { UserData, UserLiteData } from '../types/User';
3
2
  import { ExtendedAssetsConfig, ExtendedAssetsData, PoolConfig } from '../types/Master';
4
- import { LiquidationBaseData } from './MasterContract';
3
+ import { UserData, UserLiteData } from '../types/User';
5
4
  /**
6
5
  * User contract wrapper
7
6
  */
@@ -48,9 +47,4 @@ export declare class EvaaUser implements Contract {
48
47
  * @returns true if user is liquidable
49
48
  */
50
49
  get isLiquidable(): boolean;
51
- /**
52
- * Get liquidation parameters for passing to liquidation message
53
- * @returns liquidation parameters if user is liquidable, otherwise undefined
54
- */
55
- get liquidationParameters(): LiquidationBaseData | undefined;
56
50
  }
@@ -5,7 +5,6 @@ const core_1 = require("@ton/core");
5
5
  const parser_1 = require("../api/parser");
6
6
  const general_1 = require("../constants/general");
7
7
  const pools_1 = require("../constants/pools");
8
- const assets_1 = require("../constants/assets");
9
8
  /**
10
9
  * User contract wrapper
11
10
  */
@@ -57,7 +56,7 @@ class EvaaUser {
57
56
  value,
58
57
  sendMode: core_1.SendMode.PAY_GAS_SEPARATELY + core_1.SendMode.IGNORE_ERRORS,
59
58
  body: (0, core_1.beginCell)()
60
- .storeCoins(BigInt(general_1.OPCODES.ONCHAIN_GETTER))
59
+ .storeUint(general_1.OPCODES.ONCHAIN_GETTER, 32)
61
60
  .storeUint(queryID, 64)
62
61
  .storeRef(forwardPayload)
63
62
  .endCell(),
@@ -98,22 +97,5 @@ class EvaaUser {
98
97
  }
99
98
  return this._data.liquidationData.liquidable;
100
99
  }
101
- /**
102
- * Get liquidation parameters for passing to liquidation message
103
- * @returns liquidation parameters if user is liquidable, otherwise undefined
104
- */
105
- get liquidationParameters() {
106
- if (!this._data || this._data.type === 'inactive' || !this._data.liquidationData.liquidable) {
107
- return undefined;
108
- }
109
- return {
110
- borrowerAddress: this._data.ownerAddress,
111
- loanAsset: this._data.liquidationData.greatestLoanAsset.assetId,
112
- collateralAsset: this._data.liquidationData.greatestCollateralAsset.assetId,
113
- minCollateralAmount: this._data.liquidationData.minCollateralAmount,
114
- liquidationAmount: this._data.liquidationData.liquidationAmount,
115
- tonLiquidation: this._data.liquidationData.greatestLoanAsset.assetId === assets_1.TON_MAINNET.assetId,
116
- };
117
- }
118
100
  }
119
101
  exports.EvaaUser = EvaaUser;
@@ -0,0 +1,5 @@
1
+ export * from './AbstractMaster';
2
+ export * from './ClassicMaster';
3
+ export * from './PythMaster';
4
+ export * from './UserContract';
5
+ export * from './JettonWallet';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AbstractMaster"), exports);
18
+ __exportStar(require("./ClassicMaster"), exports);
19
+ __exportStar(require("./PythMaster"), exports);
20
+ __exportStar(require("./UserContract"), exports);
21
+ __exportStar(require("./JettonWallet"), exports);