@aurigami/sdk 1.23.1 → 1.24.1
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.
- package/dist/SDK.d.ts +48 -65
- package/dist/SDK.js +165 -0
- package/dist/abis/index.d.ts +18 -18
- package/dist/abis/index.js +39 -0
- package/dist/consts/constants.d.ts +139 -139
- package/dist/consts/constants.js +185 -0
- package/dist/consts/decimals.d.ts +1 -1
- package/dist/consts/decimals.js +35 -0
- package/dist/consts/deployments.d.ts +3 -3
- package/dist/consts/deployments.js +9 -0
- package/dist/consts/dummy.d.ts +13 -13
- package/dist/consts/dummy.js +43 -0
- package/dist/consts/index.d.ts +5 -5
- package/dist/consts/index.js +9 -0
- package/dist/consts/symbols.d.ts +1 -1
- package/dist/consts/symbols.js +10 -0
- package/dist/entities/BlockchainEntity.d.ts +13 -13
- package/dist/entities/BlockchainEntity.js +36 -0
- package/dist/entities/auriEnv.d.ts +34 -40
- package/dist/entities/auriEnv.js +166 -0
- package/dist/entities/index.d.ts +4 -4
- package/dist/entities/index.js +8 -0
- package/dist/entities/token.d.ts +7 -7
- package/dist/entities/token.js +27 -0
- package/dist/entities/tokenAmount.d.ts +13 -13
- package/dist/entities/tokenAmount.js +52 -0
- package/dist/helpers/aurigami-api.d.ts +13 -13
- package/dist/helpers/aurigami-api.js +26 -0
- package/dist/helpers/aurora-api-helpers.d.ts +1 -1
- package/dist/helpers/aurora-api-helpers.js +15 -0
- package/dist/helpers/graphql-helpers.d.ts +1 -1
- package/dist/helpers/graphql-helpers.js +13 -0
- package/dist/helpers/helpers.d.ts +23 -40
- package/dist/helpers/helpers.js +148 -0
- package/dist/helpers/historicalPriceFetcher.d.ts +15 -15
- package/dist/helpers/historicalPriceFetcher.js +142 -0
- package/dist/helpers/index.d.ts +7 -7
- package/dist/helpers/index.js +11 -0
- package/dist/helpers/kyber-aggregator-api.d.ts +5 -5
- package/dist/helpers/kyber-aggregator-api.js +27 -0
- package/dist/helpers/multicall.d.ts +40 -0
- package/dist/helpers/multicall.js +203 -0
- package/dist/helpers/notification-api.d.ts +2 -2
- package/dist/helpers/notification-api.js +21 -0
- package/dist/helpers/one-inch-aggregator-api.d.ts +21 -21
- package/dist/helpers/one-inch-aggregator-api.js +19 -0
- package/dist/helpers/priceFetcher.d.ts +36 -36
- package/dist/helpers/priceFetcher.js +292 -0
- package/dist/helpers/subgraphQuery.d.ts +1 -1
- package/dist/helpers/subgraphQuery.js +22 -0
- package/dist/helpers/transfer-event-query.d.ts +17 -26
- package/dist/helpers/transfer-event-query.js +41 -0
- package/dist/index.d.ts +7 -7
- package/dist/index.js +17 -8
- package/dist/interactors/Airdrop.d.ts +17 -26
- package/dist/interactors/Airdrop.js +48 -0
- package/dist/interactors/MoneyMarket.d.ts +63 -63
- package/dist/interactors/MoneyMarket.js +392 -0
- package/dist/interactors/Multicall.d.ts +15 -18
- package/dist/interactors/Multicall.js +36 -0
- package/dist/interactors/Papermill.d.ts +27 -57
- package/dist/interactors/Papermill.js +125 -0
- package/dist/interactors/PlyGame.d.ts +30 -42
- package/dist/interactors/PlyGame.js +146 -0
- package/dist/interactors/PlyTokenLock.d.ts +16 -16
- package/dist/interactors/PlyTokenLock.js +44 -0
- package/dist/interactors/Pulp.d.ts +17 -17
- package/dist/interactors/Pulp.js +43 -0
- package/dist/interactors/Referral.d.ts +35 -78
- package/dist/interactors/Referral.js +158 -0
- package/dist/interactors/Staking.d.ts +20 -26
- package/dist/interactors/Staking.js +106 -0
- package/dist/interactors/index.d.ts +9 -9
- package/dist/interactors/index.js +13 -0
- package/dist/interactors/misc.d.ts +31 -39
- package/dist/interactors/misc.js +318 -0
- package/dist/types/index.d.ts +175 -197
- package/dist/types/index.js +18 -0
- package/package.json +4 -16
- package/dist/sdk.cjs.development.js +0 -6325
- package/dist/sdk.cjs.development.js.map +0 -1
- package/dist/sdk.cjs.production.min.js +0 -2
- package/dist/sdk.cjs.production.min.js.map +0 -1
- package/dist/sdk.esm.js +0 -6193
- package/dist/sdk.esm.js.map +0 -1
- package/src/SDK.ts +0 -223
- package/src/abis/index.ts +0 -38
- package/src/consts/constants.ts +0 -210
- package/src/consts/decimals.ts +0 -31
- package/src/consts/deployments.ts +0 -4
- package/src/consts/dummy.ts +0 -51
- package/src/consts/index.ts +0 -5
- package/src/consts/symbols.ts +0 -9
- package/src/entities/BlockchainEntity.ts +0 -29
- package/src/entities/auriEnv.ts +0 -178
- package/src/entities/index.ts +0 -4
- package/src/entities/token.ts +0 -21
- package/src/entities/tokenAmount.ts +0 -48
- package/src/helpers/aurigami-api.ts +0 -42
- package/src/helpers/aurora-api-helpers.ts +0 -17
- package/src/helpers/graphql-helpers.ts +0 -8
- package/src/helpers/helpers.ts +0 -212
- package/src/helpers/historicalPriceFetcher.ts +0 -203
- package/src/helpers/index.ts +0 -7
- package/src/helpers/kyber-aggregator-api.ts +0 -37
- package/src/helpers/notification-api.ts +0 -22
- package/src/helpers/one-inch-aggregator-api.ts +0 -45
- package/src/helpers/priceFetcher.ts +0 -389
- package/src/helpers/subgraphQuery.ts +0 -17
- package/src/helpers/transfer-event-query.ts +0 -68
- package/src/index.ts +0 -14
- package/src/interactors/Airdrop.ts +0 -72
- package/src/interactors/MoneyMarket.ts +0 -482
- package/src/interactors/Multicall.ts +0 -50
- package/src/interactors/Papermill.ts +0 -185
- package/src/interactors/PlyGame.ts +0 -172
- package/src/interactors/PlyTokenLock.ts +0 -47
- package/src/interactors/Pulp.ts +0 -39
- package/src/interactors/Referral.ts +0 -214
- package/src/interactors/Staking.ts +0 -152
- package/src/interactors/index.ts +0 -9
- package/src/interactors/misc.ts +0 -431
- package/src/types/index.ts +0 -222
package/src/SDK.ts
DELETED
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
import { TransactionResponse } from '@ethersproject/abstract-provider';
|
|
2
|
-
import BigNumber from 'bignumber.js';
|
|
3
|
-
import { ALL_STAKING_POOLS, networkAddresses } from './consts';
|
|
4
|
-
import { AuriEnv, BlockchainEntity, BlockchainEntityRead, Token, TokenAmount } from './entities';
|
|
5
|
-
import { getBlocksTimestamp, getDecimal } from './helpers';
|
|
6
|
-
import * as AuriAPI from './helpers/aurigami-api';
|
|
7
|
-
import * as NotificationApi from './helpers/notification-api';
|
|
8
|
-
import { MiscRead, StakingRead, StakingReadWrite } from './interactors';
|
|
9
|
-
import * as types from './types';
|
|
10
|
-
|
|
11
|
-
export class SdkRead extends BlockchainEntityRead {
|
|
12
|
-
protected env: AuriEnv;
|
|
13
|
-
protected _stakingRead: StakingRead;
|
|
14
|
-
protected _misc: MiscRead;
|
|
15
|
-
constructor(networkConnection: types.NetworkConnection) {
|
|
16
|
-
super(networkConnection);
|
|
17
|
-
this.env = new AuriEnv(networkConnection);
|
|
18
|
-
this._stakingRead = new StakingRead(networkConnection);
|
|
19
|
-
this._misc = new MiscRead(networkConnection);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public async getUserDetails(userAddress: string): Promise<types.UserDetails> {
|
|
23
|
-
return this._misc.getUserDetails(userAddress);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public async getPLYWNEARPoolDetails(): Promise<types.PLYWNEARPoolDetails> {
|
|
27
|
-
return this._stakingRead.getPLYWNEARPoolDetails();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public async getTokenPrice(token: Token): Promise<types.CurrencyAmount> {
|
|
31
|
-
return this._misc.getTokenPrice(token);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Get amount of staked LP tokens
|
|
36
|
-
*/
|
|
37
|
-
public async stakeBalanceOf(user: string): Promise<TokenAmount> {
|
|
38
|
-
return this._stakingRead.stakeBalanceOf(user);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Get amount of LP token in user wallet
|
|
43
|
-
*/
|
|
44
|
-
public async LpBalanceOf(user: string): Promise<TokenAmount> {
|
|
45
|
-
return this._stakingRead.LpBalanceOf(user);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public async unclaimedRewardsOf(user: string): Promise<TokenAmount[]> {
|
|
49
|
-
return this._stakingRead.unclaimedRewardsOf(user);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public calcHypotheticalStats({
|
|
53
|
-
userMarketDetail,
|
|
54
|
-
currentBorrowLimit,
|
|
55
|
-
currentBorrowValuation,
|
|
56
|
-
action,
|
|
57
|
-
tokenAmount,
|
|
58
|
-
}: {
|
|
59
|
-
userMarketDetail: types.UserMarketDetails;
|
|
60
|
-
currentBorrowLimit: types.CurrencyAmount;
|
|
61
|
-
currentBorrowValuation: types.CurrencyAmount;
|
|
62
|
-
action: types.MarketAction;
|
|
63
|
-
tokenAmount?: TokenAmount;
|
|
64
|
-
}): types.HypotheticalStats {
|
|
65
|
-
return this._misc.calcHypotheticalStats({
|
|
66
|
-
userMarketDetail,
|
|
67
|
-
currentBorrowLimit,
|
|
68
|
-
currentBorrowValuation,
|
|
69
|
-
action,
|
|
70
|
-
tokenAmount,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Get ply circulating supply.
|
|
76
|
-
* It is calculated by the total supply, minus:
|
|
77
|
-
* - Ply in team multisig contract
|
|
78
|
-
* - Ply in comptroller contract
|
|
79
|
-
* - Ply in fairlaunch contract
|
|
80
|
-
* - Ply in vesting contract
|
|
81
|
-
*/
|
|
82
|
-
public async getPlyCirculatingSupply(): Promise<TokenAmount> {
|
|
83
|
-
return this._misc.getPlyCirculatingSupply();
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
public async getUtilisation(userAddr: types.Address): Promise<BigNumber> {
|
|
87
|
-
return this._misc.getUtilisation(userAddr);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
public async sneakAccounts(
|
|
91
|
-
accounts: string[],
|
|
92
|
-
tokenAddresses: string[],
|
|
93
|
-
dust: BigNumber = new BigNumber(0.1)
|
|
94
|
-
): Promise<types.AccountAuTokensInfo[]> {
|
|
95
|
-
return this._misc.sneakAccounts(accounts, tokenAddresses, dust);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
public async getLTVAndLiquidationThreshold(userAddr: types.Address) {
|
|
99
|
-
return this._misc.getLTVAndLiquidationThreshold(userAddr);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
public async getNetApyWithoutIncentive(userAddress: types.Address): Promise<BigNumber> {
|
|
103
|
-
return this._misc.getNetApyWithoutIncentive(userAddress);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
public async getNetApyWithIncentive(userAddress: types.Address): Promise<BigNumber> {
|
|
107
|
-
return this._misc.getNetApyWithIncentive(userAddress);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
public async setUserNotificationSettings(
|
|
111
|
-
address: types.Address,
|
|
112
|
-
mail: string,
|
|
113
|
-
utilisation: number,
|
|
114
|
-
liquidation: boolean,
|
|
115
|
-
captchaResponse: string
|
|
116
|
-
) {
|
|
117
|
-
const body = {
|
|
118
|
-
address,
|
|
119
|
-
mail,
|
|
120
|
-
setting: {
|
|
121
|
-
utilisation,
|
|
122
|
-
liquidation,
|
|
123
|
-
},
|
|
124
|
-
captchaResponse,
|
|
125
|
-
};
|
|
126
|
-
const response = await NotificationApi.postApi('alert-setting/set', body);
|
|
127
|
-
return response;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
public async unsetUserNotificationSettings(address: types.Address, captchaResponse: string) {
|
|
131
|
-
const body = {
|
|
132
|
-
address,
|
|
133
|
-
mail: '',
|
|
134
|
-
setting: {
|
|
135
|
-
utilisation: null,
|
|
136
|
-
liquidation: false,
|
|
137
|
-
},
|
|
138
|
-
captchaResponse,
|
|
139
|
-
};
|
|
140
|
-
const response = await NotificationApi.postApi('alert-setting/set', body);
|
|
141
|
-
return response;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
public async getUserNotificationSettings(
|
|
145
|
-
addresses: types.Address[]
|
|
146
|
-
): Promise<types.UserNotification> {
|
|
147
|
-
const body = {
|
|
148
|
-
addresses,
|
|
149
|
-
};
|
|
150
|
-
const response = await NotificationApi.postApi('alert-setting/get-user-setting', body);
|
|
151
|
-
return response;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
public async getLiquidationHistory(address: string): Promise<types.LiquidationDetail[]> {
|
|
155
|
-
const liquidationHistoryResp = await AuriAPI.getPaginatedApi<types.LiquidationEventEntity>(
|
|
156
|
-
'/liquidate/history',
|
|
157
|
-
{
|
|
158
|
-
user: address,
|
|
159
|
-
}
|
|
160
|
-
);
|
|
161
|
-
const blocks = liquidationHistoryResp.items.map((event) => event.blockNumber);
|
|
162
|
-
const blocksTimestamp = await getBlocksTimestamp(this._networkConnection.provider, blocks);
|
|
163
|
-
|
|
164
|
-
const liquidationEvents = liquidationHistoryResp.items.map((event, idx) => {
|
|
165
|
-
const underlyingAddress = networkAddresses.auTokens.find(
|
|
166
|
-
(auToken) => auToken.address.toLowerCase() === event.marketRepayToken.toLowerCase()
|
|
167
|
-
)!.underlying;
|
|
168
|
-
const decimal = getDecimal(underlyingAddress);
|
|
169
|
-
const token = new Token(underlyingAddress, decimal);
|
|
170
|
-
const tokenAmount = new TokenAmount(token, event.repayAmount.toString(), true);
|
|
171
|
-
return {
|
|
172
|
-
liquidationTime: blocksTimestamp[idx],
|
|
173
|
-
tokenAmount,
|
|
174
|
-
transactionId: event.txnHash,
|
|
175
|
-
};
|
|
176
|
-
}) as types.LiquidationDetail[];
|
|
177
|
-
return liquidationEvents;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
public calculateBorrowPower(tokenAmount: TokenAmount): Promise<types.CurrencyAmount> {
|
|
181
|
-
return this._misc.calcBorrowPower(tokenAmount);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export class SdkReadWrite extends SdkRead {
|
|
186
|
-
/**
|
|
187
|
-
* Claim rewards in all markets + staking pools
|
|
188
|
-
*/
|
|
189
|
-
public async claim(): Promise<TransactionResponse> {
|
|
190
|
-
return this.env.auriLens
|
|
191
|
-
.connect(this._networkConnection.signer!)
|
|
192
|
-
.claimRewards(
|
|
193
|
-
this.env.comptroller.address,
|
|
194
|
-
this.env.auriFairLaunch.address,
|
|
195
|
-
ALL_STAKING_POOLS
|
|
196
|
-
);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
public async stake(amount: TokenAmount): Promise<TransactionResponse> {
|
|
200
|
-
return new StakingReadWrite(this._networkConnection).stake(amount);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
public async unstake(amount: TokenAmount): Promise<TransactionResponse> {
|
|
204
|
-
return new StakingReadWrite(this._networkConnection).unstake(amount);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// public async faucetDrip(): Promise<TransactionResponse> {
|
|
208
|
-
// return this.env.faucet.connect(this._networkConnection.signer!).drip();
|
|
209
|
-
// }
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
export class SDK extends BlockchainEntity {
|
|
213
|
-
constructor() {
|
|
214
|
-
super();
|
|
215
|
-
}
|
|
216
|
-
public read(networkConnection: types.NetworkConnection): SdkRead {
|
|
217
|
-
return new SdkRead(networkConnection);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
public readWrite(networkConnection: types.NetworkConnection): SdkReadWrite {
|
|
221
|
-
return new SdkReadWrite(networkConnection);
|
|
222
|
-
}
|
|
223
|
-
}
|
package/src/abis/index.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import AuErc20ABI from '@aurigami/contracts/artifacts/contracts/AuErc20.sol/AuErc20.json';
|
|
2
|
-
import AuETHABI from '@aurigami/contracts/artifacts/contracts/AuETH.sol/AuETH.json';
|
|
3
|
-
import AuriAirdropABI from '@aurigami/contracts/artifacts/contracts/AuriAirdrop.sol/AuriAirdrop.json';
|
|
4
|
-
import AuriFairLaunchABI from '@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json';
|
|
5
|
-
import AuriLensABI from '@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json';
|
|
6
|
-
import AuriOracleABI from '@aurigami/contracts/artifacts/contracts/AuriOracle.sol/AuriOracle.json';
|
|
7
|
-
import AuTokenABI from '@aurigami/contracts/artifacts/contracts/AuToken.sol/AuToken.json';
|
|
8
|
-
import ComptrollerABI from '@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json';
|
|
9
|
-
import EthRepayHelperABI from '@aurigami/contracts/artifacts/contracts/EthRepayHelper.sol/EthRepayHelper.json';
|
|
10
|
-
import EIP20InterfaceABI from '@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json';
|
|
11
|
-
// import FaucetABI from '@aurigami/contracts/artifacts/contracts/mock/Faucet.sol/Faucet.json';
|
|
12
|
-
import AuriInternalLensABI from '@aurigami/contracts/artifacts/contracts/mock/AuriInternalLens.sol/AuriInternalLens.json';
|
|
13
|
-
import IUniswapV2PairABI from '@aurigami/contracts/artifacts/contracts/mock/IUniswapV2Pair.sol/IUniswapV2Pair.json';
|
|
14
|
-
import Multicall2ABI from '@aurigami/contracts/artifacts/contracts/mock/Multicall2.sol/Multicall2.json';
|
|
15
|
-
import PulpABI from '@aurigami/contracts/artifacts/contracts/PULP.sol/PULP.json';
|
|
16
|
-
import ReferralDirectoryV2ABI from '@aurigami/contracts/artifacts/contracts/ReferralDirectoryV2.sol/ReferralDirectoryV2.json';
|
|
17
|
-
import PlyGameABI from '@aurigami/contracts/artifacts/contracts/plygame/PlyGame.sol/PlyGame.json';
|
|
18
|
-
import PlyTokenLockABI from '@aurigami/contracts/artifacts/contracts/PlyTokenLock.sol/PlyTokenLock.json';
|
|
19
|
-
export {
|
|
20
|
-
AuriOracleABI,
|
|
21
|
-
AuTokenABI,
|
|
22
|
-
IUniswapV2PairABI,
|
|
23
|
-
AuriAirdropABI,
|
|
24
|
-
AuriFairLaunchABI,
|
|
25
|
-
AuriLensABI,
|
|
26
|
-
ComptrollerABI,
|
|
27
|
-
// FaucetABI,
|
|
28
|
-
EIP20InterfaceABI,
|
|
29
|
-
ReferralDirectoryV2ABI,
|
|
30
|
-
AuErc20ABI,
|
|
31
|
-
AuETHABI,
|
|
32
|
-
EthRepayHelperABI,
|
|
33
|
-
Multicall2ABI,
|
|
34
|
-
PulpABI,
|
|
35
|
-
AuriInternalLensABI,
|
|
36
|
-
PlyGameABI,
|
|
37
|
-
PlyTokenLockABI,
|
|
38
|
-
};
|
package/src/consts/constants.ts
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import BigNumber from 'bignumber.js';
|
|
2
|
-
import { BigNumber as BN } from 'ethers';
|
|
3
|
-
import { MAINNET_ADDRESSES } from './deployments';
|
|
4
|
-
export const dummyAddress: string = '0xDEADbeEfEEeEEEeEEEeEEeeeeeEeEEeeeeEEEEeE';
|
|
5
|
-
export const ETHAddress: string = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
|
|
6
|
-
|
|
7
|
-
export const AURORA_CHAINID = 1313161554;
|
|
8
|
-
|
|
9
|
-
export const DECIMAL_PRECISION = 10;
|
|
10
|
-
|
|
11
|
-
export const AURORA_PLUS_API_PREFIX = 'https://aurora.plus/api/wallet/';
|
|
12
|
-
|
|
13
|
-
export const networkAddresses = {
|
|
14
|
-
auTokens: [
|
|
15
|
-
{
|
|
16
|
-
name: 'auUSDC',
|
|
17
|
-
address: MAINNET_ADDRESSES.auTokens.USDC.toLowerCase(),
|
|
18
|
-
underlying: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
name: 'auETH',
|
|
22
|
-
address: MAINNET_ADDRESSES.auTokens.ETH.toLowerCase(),
|
|
23
|
-
underlying: ETHAddress.toLowerCase(),
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: 'auWBTC',
|
|
27
|
-
address: MAINNET_ADDRESSES.auTokens.WBTC.toLowerCase(),
|
|
28
|
-
underlying: '0xf4eb217ba2454613b15dbdea6e5f22276410e89e'.toLowerCase(),
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: 'auUSDT',
|
|
32
|
-
address: MAINNET_ADDRESSES.auTokens.USDT.toLowerCase(),
|
|
33
|
-
underlying: '0x4988a896b1227218e4a686fde5eabdcabd91571f'.toLowerCase(),
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'auDAI',
|
|
37
|
-
address: MAINNET_ADDRESSES.auTokens.DAI.toLowerCase(),
|
|
38
|
-
underlying: '0xe3520349f477a5f6eb06107066048508498a291b'.toLowerCase(),
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
name: 'auWNEAR',
|
|
42
|
-
address: MAINNET_ADDRESSES.auTokens.WNEAR.toLowerCase(),
|
|
43
|
-
underlying: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: 'auSTNEAR',
|
|
47
|
-
address: MAINNET_ADDRESSES.auTokens.STNEAR.toLowerCase(),
|
|
48
|
-
underlying: '0x07F9F7f963C5cD2BBFFd30CcfB964Be114332E30'.toLowerCase(),
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
name: 'auAURORA',
|
|
52
|
-
address: MAINNET_ADDRESSES.auTokens.AURORA.toLowerCase(),
|
|
53
|
-
underlying: '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79'.toLowerCase(),
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: 'auTRI',
|
|
57
|
-
address: MAINNET_ADDRESSES.auTokens.TRI.toLowerCase(),
|
|
58
|
-
underlying: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: 'auPLY',
|
|
62
|
-
address: MAINNET_ADDRESSES.auTokens.PLY.toLowerCase(),
|
|
63
|
-
underlying: '0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f'.toLowerCase(),
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: 'auUSN',
|
|
67
|
-
address: MAINNET_ADDRESSES.auTokens.USN.toLowerCase(),
|
|
68
|
-
underlying: '0x5183e1b1091804bc2602586919e6880ac1cf2896'.toLowerCase(),
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: 'auNEARX',
|
|
72
|
-
address: MAINNET_ADDRESSES.auTokens.NEARX.toLowerCase(),
|
|
73
|
-
underlying: '0xb39eeb9e168ef6c639f5e282fef1f6bc4dcae375'.toLowerCase(),
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
name: 'auUSDCNative',
|
|
77
|
-
address: MAINNET_ADDRESSES.auTokens.USDC_NATIVE.toLowerCase(),
|
|
78
|
-
underlying: '0x368ebb46aca6b8d0787c96b2b20bd3cc3f2c45f7'.toLowerCase(),
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
name: 'auUSDTNative',
|
|
82
|
-
address: MAINNET_ADDRESSES.auTokens.USDT_NATIVE.toLowerCase(),
|
|
83
|
-
underlying: '0x80da25da4d783e57d2fcda0436873a193a4beccf'.toLowerCase(),
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
misc: {
|
|
87
|
-
COMPTROLLER: MAINNET_ADDRESSES.comptroller.toLowerCase(),
|
|
88
|
-
DEPRECATED_OLD_ORACLE: MAINNET_ADDRESSES.oracle.toLowerCase(),
|
|
89
|
-
PYTH_ORACLE: MAINNET_ADDRESSES.pythOracle.toLowerCase(),
|
|
90
|
-
AURIFAIRLAUNCH: MAINNET_ADDRESSES.fairLaunch.toLowerCase(),
|
|
91
|
-
AURILENS: MAINNET_ADDRESSES.auriLens.toLowerCase(),
|
|
92
|
-
ETHREPAYHELPER: MAINNET_ADDRESSES.ethRepayHelper.toLowerCase(),
|
|
93
|
-
AURI_AIRDROP: MAINNET_ADDRESSES.auriAirdropMultipleRedeem.toLowerCase(),
|
|
94
|
-
MULTICALL: MAINNET_ADDRESSES.multicall.toLowerCase(),
|
|
95
|
-
TEAM_MULTISIG: '0x2D05FfFE70CE64c5954710D4C308dB31C8dBd8dE'.toLowerCase(),
|
|
96
|
-
TEAM_MULTISIG_AURORA_PLUS: '0x31f501589c7a090bf68f2fe2687744bf9130e1ab'.toLowerCase(),
|
|
97
|
-
AURORA_PLUS: '0xf075c896cbbb625e7911e284cd23ee19bdccf299'.toLowerCase(),
|
|
98
|
-
PULP_CONTRACT: '0x04ac48711bcdc45b4d223fb021e09da73c71095e'.toLowerCase(),
|
|
99
|
-
PLY_TOKEN_LOCK: MAINNET_ADDRESSES.plyTokenLock.toLowerCase(),
|
|
100
|
-
REFERRAL: MAINNET_ADDRESSES.referralDirectory.toLowerCase(),
|
|
101
|
-
REFERRAL_V2: '0xCECd147409B2d64A9A2E5418e3E471E8af19E0bd'.toLowerCase(),
|
|
102
|
-
AURI_INTERNAL_LENS: MAINNET_ADDRESSES.auriInternalLens.toLowerCase(),
|
|
103
|
-
PLYGAME: MAINNET_ADDRESSES.plyGame.toLowerCase(),
|
|
104
|
-
},
|
|
105
|
-
tokens: {
|
|
106
|
-
AURORA: '0x8bec47865ade3b172a928df8f990bc7f2a3b9f79'.toLowerCase(),
|
|
107
|
-
PLY: '0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f'.toLowerCase(),
|
|
108
|
-
stNEAR: '0x07f9f7f963c5cd2bbffd30ccfb964be114332e30'.toLowerCase(),
|
|
109
|
-
USDC: '0xb12bfca5a55806aaf64e99521918a4bf0fc40802'.toLowerCase(),
|
|
110
|
-
WNEAR: '0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d'.toLowerCase(),
|
|
111
|
-
TRI: '0xFa94348467f64D5A457F75F8bc40495D33c65aBB'.toLowerCase(),
|
|
112
|
-
META: '0xc21ff01229e982d7c8b8691163b0a3cb8f357453'.toLowerCase(),
|
|
113
|
-
PULP: MAINNET_ADDRESSES.PULP.toLowerCase(),
|
|
114
|
-
PLYWNEAR: MAINNET_ADDRESSES.ply_wnear_lp.toLowerCase(),
|
|
115
|
-
USN: '0x5183e1b1091804bc2602586919e6880ac1cf2896'.toLowerCase(),
|
|
116
|
-
PLY_WNEAR: '0x044b6b0cd3bb13d2b9057781df4459c66781dce7'.toLowerCase(),
|
|
117
|
-
WNEAR_TRI: '0x84b123875f0f36b966d0b6ca14b31121bd9676ad'.toLowerCase(),
|
|
118
|
-
AURORA_WNEAR: '0x1e0e812fbcd3eb75d8562ad6f310ed94d258d008'.toLowerCase(),
|
|
119
|
-
NEARX: '0xb39eeb9e168ef6c639f5e282fef1f6bc4dcae375'.toLowerCase(),
|
|
120
|
-
STADER: '0x078e103d5f9629ac48b8563fa2bfcd2f6d5fde84'.toLowerCase(),
|
|
121
|
-
USDC_NATIVE: '0x368ebb46aca6b8d0787c96b2b20bd3cc3f2c45f7'.toLowerCase(),
|
|
122
|
-
USDT_NATIVE: '0x80da25da4d783e57d2fcda0436873a193a4beccf'.toLowerCase(),
|
|
123
|
-
},
|
|
124
|
-
} as const;
|
|
125
|
-
|
|
126
|
-
export const DEPOSIT_ONLY_TOKENS = [
|
|
127
|
-
MAINNET_ADDRESSES.auTokens.AURORA.toLowerCase(),
|
|
128
|
-
MAINNET_ADDRESSES.auTokens.TRI.toLowerCase(),
|
|
129
|
-
MAINNET_ADDRESSES.auTokens.PLY.toLowerCase(),
|
|
130
|
-
MAINNET_ADDRESSES.auTokens.USN.toLowerCase(),
|
|
131
|
-
];
|
|
132
|
-
|
|
133
|
-
// All token that we can calculate the price via oracle + coingecko
|
|
134
|
-
export const PRICE_WHITELISTED = new Set([
|
|
135
|
-
...networkAddresses.auTokens.map((t) => t.underlying),
|
|
136
|
-
networkAddresses.tokens.AURORA,
|
|
137
|
-
networkAddresses.tokens.TRI,
|
|
138
|
-
networkAddresses.tokens.META,
|
|
139
|
-
networkAddresses.tokens.stNEAR,
|
|
140
|
-
networkAddresses.tokens.STADER,
|
|
141
|
-
]);
|
|
142
|
-
|
|
143
|
-
export const REWARD_CLAIM_START = 1651759200; // Thursday, 5 May 2022 14:00:00 UTC
|
|
144
|
-
|
|
145
|
-
export const BORROW_LIMIT_BUFFER = new BigNumber(1);
|
|
146
|
-
|
|
147
|
-
export const ONE_DAY = 86400;
|
|
148
|
-
export const ONE_WEEK = ONE_DAY * 7;
|
|
149
|
-
export const ONE_YEAR = ONE_DAY * 365;
|
|
150
|
-
|
|
151
|
-
export const PLYWNEAR_POOL_ID = 0;
|
|
152
|
-
export const PLYWNEAR_REWARD_TOKENS = [
|
|
153
|
-
'0x09C9D464b58d96837f8d8b6f4d9fE4aD408d3A4f', // PLY
|
|
154
|
-
'0x04Ac48711BCdc45b4d223fb021E09DA73c71095e', // PULP
|
|
155
|
-
'0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d', // WNEAR
|
|
156
|
-
'0x07F9F7f963C5cD2BBFFd30CcfB964Be114332E30', // STNEAR
|
|
157
|
-
'0x8BEc47865aDe3B172A928df8f990Bc7f2A3b9f79', // AURORA
|
|
158
|
-
'0xFa94348467f64D5A457F75F8bc40495D33c65aBB', // TRI
|
|
159
|
-
];
|
|
160
|
-
// could call RPC to get all the staking pools but it's not necessary for now
|
|
161
|
-
export const ALL_STAKING_POOLS: number[] = [PLYWNEAR_POOL_ID];
|
|
162
|
-
export const INF = BN.from(2).pow(256).sub(1);
|
|
163
|
-
|
|
164
|
-
export const AIRDROP_START_TIMESTAMP = 1649858400;
|
|
165
|
-
export const AIRDROP_END_TIMESTAMP = 1651068000;
|
|
166
|
-
export const AIRDROP_KEEP_THRESHOLD = 7 * 86400;
|
|
167
|
-
|
|
168
|
-
export const DEPOSIT_NEAR_REWARDS_PER_WEEK: { [k: string]: string } = Object.fromEntries(
|
|
169
|
-
// lower case all addresses
|
|
170
|
-
Object.entries({
|
|
171
|
-
'0xb12bfca5a55806aaf64e99521918a4bf0fc40802': '36375', // USDC
|
|
172
|
-
'0x4988a896b1227218e4a686fde5eabdcabd91571f': '14550', // USDT
|
|
173
|
-
'0xf4eb217ba2454613b15dbdea6e5f22276410e89e': '3638', // WBTC
|
|
174
|
-
'0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE': '14550', // ETH
|
|
175
|
-
'0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': '3638', // WNEAR
|
|
176
|
-
}).map(([k, v]) => [k.toLowerCase(), v])
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
export const BORROW_NEAR_REWARDS_PER_WEEK: { [k: string]: string } = {
|
|
180
|
-
// currently 0 for all markets
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
export const HARDCODE_PRICE_TOKENS: { [k: string]: string } = Object.fromEntries([
|
|
184
|
-
[networkAddresses.tokens.USN.toLowerCase(), '1'],
|
|
185
|
-
]);
|
|
186
|
-
|
|
187
|
-
export const REFERRAL_CAMPAIGNS: { [k: string]: { start: number; end: number } } =
|
|
188
|
-
Object.fromEntries([
|
|
189
|
-
['referral-2505', { start: 1652882400, end: 1653487199 }],
|
|
190
|
-
['referrer-2505', { start: 1652882400, end: 1653487199 }],
|
|
191
|
-
['referral-0106', { start: 1653487200, end: 1654091999 }],
|
|
192
|
-
['referrer-0106', { start: 1653487200, end: 1654091999 }],
|
|
193
|
-
['referral-0806', { start: 1654092000, end: 1654696799 }],
|
|
194
|
-
['referrer-0806', { start: 1654092000, end: 1654696799 }],
|
|
195
|
-
['referral-1506', { start: 1654696800, end: 1655301599 }],
|
|
196
|
-
['referrer-1506', { start: 1654696800, end: 1655301599 }],
|
|
197
|
-
]);
|
|
198
|
-
|
|
199
|
-
export const CACHE_TIMEOUT = 10 * 1000; // 10 seconds
|
|
200
|
-
|
|
201
|
-
export const SD_INCENTIVE_IN_SD = 83.35;
|
|
202
|
-
|
|
203
|
-
export const STADER_ETH = '0x30D20208d987713f46DFD34EF128Bb16C404D10f'.toLowerCase();
|
|
204
|
-
|
|
205
|
-
export const USDT_ETH = '0xdAC17F958D2ee523a2206206994597C13D831ec7'.toLowerCase();
|
|
206
|
-
|
|
207
|
-
export const AURIGAMI_SUBGRAPH_URL =
|
|
208
|
-
'https://api.thegraph.com/subgraphs/name/takao-aurigami/aurigami-feb-27';
|
|
209
|
-
|
|
210
|
-
export const GRAPHQL_URL = 'https://old.explorer.aurora.dev/api/v1/graphql';
|
package/src/consts/decimals.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export const decimalRecords: Record<string, number> = {
|
|
2
|
-
'0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': 18,
|
|
3
|
-
'0x09c9d464b58d96837f8d8b6f4d9fe4ad408d3a4f': 18,
|
|
4
|
-
'0x3195949f267702723bc614cae037cdc8d1e94786': 8,
|
|
5
|
-
'0xfa94348467f64d5a457f75f8bc40495d33c65abb': 18,
|
|
6
|
-
'0x07f9f7f963c5cd2bbffd30ccfb964be114332e30': 24,
|
|
7
|
-
'0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d': 24,
|
|
8
|
-
'0x6ea6c03061bddce23d4ec60b6e6e880c33d24dca': 8,
|
|
9
|
-
'0xca9511b610ba5fc7e311fdef9ce16050ee4449e9': 8,
|
|
10
|
-
'0x8bec47865ade3b172a928df8f990bc7f2a3b9f79': 18,
|
|
11
|
-
'0xcfb6b0498cb7555e7e21502e0f449bf28760adbb': 8,
|
|
12
|
-
'0x4f0d864b1abf4b701799a0b30b57a22dfeb5917b': 8,
|
|
13
|
-
'0xad5a2437ff55ed7a8cad3b797b3ec7c5a19b1c54': 8,
|
|
14
|
-
'0x4988a896b1227218e4a686fde5eabdcabd91571f': 6,
|
|
15
|
-
'0xb12bfca5a55806aaf64e99521918a4bf0fc40802': 6,
|
|
16
|
-
'0xe3520349f477a5f6eb06107066048508498a291b': 18,
|
|
17
|
-
'0x8888682e24dd4df7b7ff2b91fccb575737e433bf': 8,
|
|
18
|
-
'0xae4fac24dcdae0132c6d04f564dcf059616e9423': 8,
|
|
19
|
-
'0xce4166363e3a584dac84a47bcd3414b43efcdd1c': 8,
|
|
20
|
-
'0xf4eb217ba2454613b15dbdea6e5f22276410e89e': 8,
|
|
21
|
-
'0xc21ff01229e982d7c8b8691163b0a3cb8f357453': 24,
|
|
22
|
-
'0x04ac48711bcdc45b4d223fb021e09da73c71095e': 18, // PULP
|
|
23
|
-
'0x044b6b0cd3bb13d2b9057781df4459c66781dce7': 18, // PLYWNEAR
|
|
24
|
-
'0x5183e1b1091804bc2602586919e6880ac1cf2896': 18, // USN
|
|
25
|
-
'0x84b123875f0f36b966d0b6ca14b31121bd9676ad': 18, // WNEAR_TRI,
|
|
26
|
-
'0x1e0e812fbcd3eb75d8562ad6f310ed94d258d008': 18, // AURORA_WNEAR
|
|
27
|
-
'0xb39eeb9e168ef6c639f5e282fef1f6bc4dcae375': 24, // NEARX
|
|
28
|
-
'0x078e103d5f9629ac48b8563fa2bfcd2f6d5fde84': 18, // STADER
|
|
29
|
-
'0x80da25da4d783e57d2fcda0436873a193a4beccf': 6, // decimals for USDT_NATIVE
|
|
30
|
-
'0x368ebb46aca6b8d0787c96b2b20bd3cc3f2c45f7': 6, // decimals for USDC_NATIVE
|
|
31
|
-
};
|
package/src/consts/dummy.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Token, TokenAmount } from '../entities';
|
|
2
|
-
import { ReferralReward, UserMarketDetails } from '../types';
|
|
3
|
-
import { networkAddresses } from './constants';
|
|
4
|
-
|
|
5
|
-
export const dummyToken = new Token(networkAddresses.tokens.WNEAR, 24);
|
|
6
|
-
|
|
7
|
-
export const dummyPly = new Token('0x8729438eb15e2c8b576fcc6aecda6a148776c0f5', 18);
|
|
8
|
-
|
|
9
|
-
export const dummyPlyAurora = new Token('0xE530dC2095Ef5653205CF5ea79F8979a7028065c', 18);
|
|
10
|
-
|
|
11
|
-
export const dummyTokenAmount = new TokenAmount(dummyToken, '123.456', false);
|
|
12
|
-
|
|
13
|
-
export const dummyZeroTokenAmount = new TokenAmount(dummyToken, '0');
|
|
14
|
-
|
|
15
|
-
export const dummyTokenAmount2 = new TokenAmount(dummyToken, '456.123', false);
|
|
16
|
-
|
|
17
|
-
export const dummyTokenAmount3 = new TokenAmount(dummyToken, '1000.123', false);
|
|
18
|
-
|
|
19
|
-
export const dummyMarketAddress = '0xbeb5d47a3f720ec0a390d04b4d41ed7d9688bc7f'; // qiUSDC
|
|
20
|
-
|
|
21
|
-
export const dummyUserMarketDetails: UserMarketDetails = {
|
|
22
|
-
market: dummyMarketAddress,
|
|
23
|
-
depositBalance: dummyTokenAmount2,
|
|
24
|
-
borrowBalance: dummyZeroTokenAmount,
|
|
25
|
-
isCollateral: true,
|
|
26
|
-
maxWithdrawableAmount: dummyTokenAmount,
|
|
27
|
-
collateralRatio: 0.5,
|
|
28
|
-
underlyingPrice: '1',
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const referralRewardDummy1: ReferralReward = {
|
|
32
|
-
campaign: 'testa',
|
|
33
|
-
startTime: Math.trunc(new Date(2022, 8, 1).getTime() / 1000),
|
|
34
|
-
endTime: Math.trunc(new Date(2022, 9, 30).getTime() / 1000),
|
|
35
|
-
isReferrer: false,
|
|
36
|
-
rewardTokenAmount: dummyTokenAmount,
|
|
37
|
-
transactionHash: null,
|
|
38
|
-
userAddr: '0x...123',
|
|
39
|
-
refereeAddress: '0x123..123',
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export const referralRewardDummy2: ReferralReward = {
|
|
43
|
-
campaign: 'testb',
|
|
44
|
-
startTime: Math.trunc(new Date(2022, 8, 1).getTime() / 1000),
|
|
45
|
-
endTime: Math.trunc(new Date(2022, 8, 31).getTime() / 1000),
|
|
46
|
-
isReferrer: true,
|
|
47
|
-
rewardTokenAmount: dummyTokenAmount2,
|
|
48
|
-
transactionHash: '0x4da9657663b46ef18d150b897b28c7b717f16421978b52e3a06d91b54ca3548b',
|
|
49
|
-
userAddr: '0x...456',
|
|
50
|
-
refereeAddress: '0x123..123',
|
|
51
|
-
};
|
package/src/consts/index.ts
DELETED
package/src/consts/symbols.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { networkAddresses } from './constants';
|
|
2
|
-
|
|
3
|
-
export const symbolRecords: Record<string, string> = Object.fromEntries(
|
|
4
|
-
networkAddresses.auTokens
|
|
5
|
-
.map((e) => [e.address, e.name]) // AuToken
|
|
6
|
-
.concat(networkAddresses.auTokens.map((e) => [e.underlying, e.name.slice(2)])) // underlying token
|
|
7
|
-
.concat([['0x04ac48711bcdc45b4d223fb021e09da73c71095e', 'PULP']]) // others
|
|
8
|
-
.map(([address, name]) => [address.toLowerCase(), name])
|
|
9
|
-
);
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Signer } from '@ethersproject/abstract-signer';
|
|
2
|
-
import { NetworkConnection } from '../types';
|
|
3
|
-
|
|
4
|
-
export class BlockchainEntityRead {
|
|
5
|
-
protected _networkConnection: NetworkConnection;
|
|
6
|
-
public constructor(networkConnection: NetworkConnection) {
|
|
7
|
-
this._networkConnection = networkConnection;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class BlockchainEntityReadWrite extends BlockchainEntityRead {
|
|
12
|
-
public constructor(networkConnection: NetworkConnection) {
|
|
13
|
-
if (!(networkConnection.signer instanceof Signer)) {
|
|
14
|
-
throw Error('Signer is not provided when constructing BlockchainEntityReadWrite');
|
|
15
|
-
}
|
|
16
|
-
super(networkConnection);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class BlockchainEntity {
|
|
21
|
-
constructor() {}
|
|
22
|
-
public read(networkConnection: NetworkConnection): BlockchainEntityRead {
|
|
23
|
-
return new BlockchainEntityRead(networkConnection);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public readWrite(networkConnection: NetworkConnection): BlockchainEntityReadWrite {
|
|
27
|
-
return new BlockchainEntityReadWrite(networkConnection);
|
|
28
|
-
}
|
|
29
|
-
}
|