@aurigami/sdk 1.7.1 → 1.7.3
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/consts/constants.d.ts +1 -0
- package/dist/entities/auriEnv.d.ts +2 -1
- package/dist/entities/tokenAmount.d.ts +1 -0
- package/dist/helpers/helpers.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/sdk.cjs.development.js +81 -37
- package/dist/sdk.cjs.development.js.map +1 -1
- package/dist/sdk.cjs.production.min.js +1 -1
- package/dist/sdk.cjs.production.min.js.map +1 -1
- package/dist/sdk.esm.js +80 -39
- package/dist/sdk.esm.js.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/package.json +1 -1
- package/src/consts/constants.ts +8 -0
- package/src/consts/symbols.ts +3 -1
- package/src/entities/auriEnv.ts +13 -1
- package/src/entities/tokenAmount.ts +5 -1
- package/src/helpers/graphql-helpers.ts +4 -6
- package/src/helpers/helpers.ts +10 -0
- package/src/index.ts +1 -0
- package/src/types/index.ts +5 -0
|
@@ -14,6 +14,7 @@ export declare type NetworkAddresses = {
|
|
|
14
14
|
tokens: Record<string, string>;
|
|
15
15
|
};
|
|
16
16
|
export declare const networkAddresses: NetworkAddresses;
|
|
17
|
+
export declare const DEPOSIT_ONLY_TOKENS: string[];
|
|
17
18
|
export declare const PRICE_WHITELISTED: Set<string>;
|
|
18
19
|
export declare const REWARD_CLAIM_START = 1651759200;
|
|
19
20
|
export declare const BORROW_LIMIT_BUFFER: BigNumber;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AuriFairLaunch, AuriInternalLens, AuriLens, Comptroller, IERC20, PULP } from '@aurigami/contracts/typechain';
|
|
2
2
|
import { Contract } from 'ethers';
|
|
3
|
-
import { NetworkConnection } from '../types';
|
|
3
|
+
import { AuTokenWithUnderlying, NetworkConnection } from '../types';
|
|
4
4
|
import { BlockchainEntityRead } from './BlockchainEntity';
|
|
5
5
|
export declare class AuriEnv extends BlockchainEntityRead {
|
|
6
6
|
comptroller: Comptroller;
|
|
@@ -10,5 +10,6 @@ export declare class AuriEnv extends BlockchainEntityRead {
|
|
|
10
10
|
pulp: PULP;
|
|
11
11
|
auriInternalLens: AuriInternalLens;
|
|
12
12
|
getContract<CType extends Contract>(address: string, abi: any): CType;
|
|
13
|
+
getAuTokenContracts(): AuTokenWithUnderlying[];
|
|
13
14
|
constructor(networkConnection: NetworkConnection);
|
|
14
15
|
}
|
|
@@ -5,6 +5,7 @@ export declare class TokenAmount {
|
|
|
5
5
|
private rawAmnt;
|
|
6
6
|
constructor(token: Token, amount: string, isRaw?: boolean);
|
|
7
7
|
formattedAmount(): string;
|
|
8
|
+
formattedAmountWithSymbol(): string;
|
|
8
9
|
rawAmount(): string;
|
|
9
10
|
static fromAddressAndAmount(tokenAddress: Address, amount: string, isRaw?: boolean): TokenAmount;
|
|
10
11
|
}
|
|
@@ -9,6 +9,7 @@ export declare const getCurrentTimestamp: () => number;
|
|
|
9
9
|
export declare function validateAndParseAddress(address: Address): Address;
|
|
10
10
|
export declare function getDecimal(address: Address): number;
|
|
11
11
|
export declare function getSymbol(address: Address): string;
|
|
12
|
+
export declare function getUnderlying(address: Address): Address;
|
|
12
13
|
export declare function calcLMRewardApr(rewardsValue: BigNumber, totalStakeValue: BigNumber, frequencyPerYear: number): BigNumber;
|
|
13
14
|
export declare function getBlockTimestamp(provider: Provider, blockNumber: number): Promise<number>;
|
|
14
15
|
export declare function getBlocksTimestampViaRPC(provider: Provider, blocksNumber: number[]): Promise<number[]>;
|
package/dist/index.d.ts
CHANGED
|
@@ -7,26 +7,46 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
|
|
|
7
7
|
var BigNumber = _interopDefault(require('bignumber.js'));
|
|
8
8
|
var ethers = require('ethers');
|
|
9
9
|
var utils = require('ethers/lib/utils');
|
|
10
|
-
var MAINNET_ADDRESSES = _interopDefault(require('@aurigami/contracts/deployments/aurora_mainnet.json'));
|
|
11
|
-
var aurora_testnet_json = _interopDefault(require('@aurigami/contracts/deployments/aurora_testnet.json'));
|
|
12
10
|
var abis = _interopDefault(require('@aurigami/contracts/artifacts/contracts/AuErc20.sol/AuErc20.json'));
|
|
13
11
|
var abis$1 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/AuETH.sol/AuETH.json'));
|
|
14
12
|
var AuriAirdropABI = _interopDefault(require('@aurigami/contracts/artifacts/contracts/AuriAirdrop.sol/AuriAirdrop.json'));
|
|
15
13
|
var abis$2 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/AuriFairLaunch.sol/AuriFairLaunch.json'));
|
|
16
14
|
var abis$3 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/AuriLens.sol/AuriLens.json'));
|
|
17
15
|
var AuriOracleABI = _interopDefault(require('@aurigami/contracts/artifacts/contracts/AuriOracle.sol/AuriOracle.json'));
|
|
18
|
-
var
|
|
19
|
-
var abis$
|
|
20
|
-
var abis$
|
|
21
|
-
var abis$
|
|
22
|
-
var abis$
|
|
16
|
+
var abis$4 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/AuToken.sol/AuToken.json'));
|
|
17
|
+
var abis$5 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/Comptroller.sol/Comptroller.json'));
|
|
18
|
+
var abis$6 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/EthRepayHelper.sol/EthRepayHelper.json'));
|
|
19
|
+
var abis$7 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/interfaces/EIP20Interface.sol/EIP20Interface.json'));
|
|
20
|
+
var abis$8 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/mock/AuriInternalLens.sol/AuriInternalLens.json'));
|
|
23
21
|
var IUniswapV2PairABI = _interopDefault(require('@aurigami/contracts/artifacts/contracts/mock/IUniswapV2Pair.sol/IUniswapV2Pair.json'));
|
|
24
|
-
var abis$
|
|
25
|
-
var abis$
|
|
26
|
-
var abis$
|
|
22
|
+
var abis$9 = _interopDefault(require('@aurigami/contracts/artifacts/contracts/mock/Multicall2.sol/Multicall2.json'));
|
|
23
|
+
var abis$a = _interopDefault(require('@aurigami/contracts/artifacts/contracts/PULP.sol/PULP.json'));
|
|
24
|
+
var abis$b = _interopDefault(require('@aurigami/contracts/artifacts/contracts/ReferralDirectory.sol/ReferralDirectory.json'));
|
|
25
|
+
var MAINNET_ADDRESSES = _interopDefault(require('@aurigami/contracts/deployments/aurora_mainnet.json'));
|
|
26
|
+
var aurora_testnet_json = _interopDefault(require('@aurigami/contracts/deployments/aurora_testnet.json'));
|
|
27
27
|
var abstractSigner = require('@ethersproject/abstract-signer');
|
|
28
28
|
var axios = _interopDefault(require('axios'));
|
|
29
|
-
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
var index = {
|
|
33
|
+
__proto__: null,
|
|
34
|
+
AuriOracleABI: AuriOracleABI,
|
|
35
|
+
AuTokenABI: abis$4,
|
|
36
|
+
IUniswapV2PairABI: IUniswapV2PairABI,
|
|
37
|
+
AuriAirdropABI: AuriAirdropABI,
|
|
38
|
+
AuriFairLaunchABI: abis$2,
|
|
39
|
+
AuriLensABI: abis$3,
|
|
40
|
+
ComptrollerABI: abis$5,
|
|
41
|
+
EIP20InterfaceABI: abis$7,
|
|
42
|
+
ReferralDirectoryABI: abis$b,
|
|
43
|
+
AuErc20ABI: abis,
|
|
44
|
+
AuETHABI: abis$1,
|
|
45
|
+
EthRepayHelperABI: abis$6,
|
|
46
|
+
Multicall2ABI: abis$9,
|
|
47
|
+
PulpABI: abis$a,
|
|
48
|
+
AuriInternalLensABI: abis$8
|
|
49
|
+
};
|
|
30
50
|
|
|
31
51
|
var dummyAddress = '0xDEADbeEfEEeEEEeEEEeEEeeeeeEeEEeeeeEEEEeE';
|
|
32
52
|
var ETHAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
|
|
@@ -103,7 +123,8 @@ var networkAddresses = {
|
|
|
103
123
|
PLYWNEAR: /*#__PURE__*/MAINNET_ADDRESSES.ply_wnear_lp.toLowerCase(),
|
|
104
124
|
USN: /*#__PURE__*/'0x5183e1b1091804bc2602586919e6880ac1cf2896'.toLowerCase()
|
|
105
125
|
}
|
|
106
|
-
};
|
|
126
|
+
};
|
|
127
|
+
var DEPOSIT_ONLY_TOKENS = [/*#__PURE__*/MAINNET_ADDRESSES.auTokens.STNEAR.toLowerCase(), /*#__PURE__*/MAINNET_ADDRESSES.auTokens.AURORA.toLowerCase(), /*#__PURE__*/MAINNET_ADDRESSES.auTokens.TRI.toLowerCase(), /*#__PURE__*/MAINNET_ADDRESSES.auTokens.PLY.toLowerCase(), /*#__PURE__*/MAINNET_ADDRESSES.auTokens.USN.toLowerCase()]; // All token that we can calculate the price via oracle + coingecko
|
|
107
128
|
|
|
108
129
|
var PRICE_WHITELISTED = /*#__PURE__*/new Set( /*#__PURE__*/[].concat( /*#__PURE__*/networkAddresses.auTokens.map(function (t) {
|
|
109
130
|
return t.underlying;
|
|
@@ -313,13 +334,13 @@ var AuriEnv = /*#__PURE__*/function (_BlockchainEntityRead) {
|
|
|
313
334
|
var _this;
|
|
314
335
|
|
|
315
336
|
_this = _BlockchainEntityRead.call(this, networkConnection) || this;
|
|
316
|
-
_this.comptroller = _this.getContract(networkAddresses.misc.COMPTROLLER, abis$
|
|
337
|
+
_this.comptroller = _this.getContract(networkAddresses.misc.COMPTROLLER, abis$5.abi);
|
|
317
338
|
_this.auriFairLaunch = _this.getContract(networkAddresses.misc.AURIFAIRLAUNCH, abis$2.abi);
|
|
318
339
|
_this.auriLens = _this.getContract(networkAddresses.misc.AURILENS, abis$3.abi);
|
|
319
|
-
_this.ply = _this.getContract(networkAddresses.tokens.PLY, abis$
|
|
320
|
-
_this.pulp = _this.getContract(networkAddresses.tokens.PULP, abis$
|
|
340
|
+
_this.ply = _this.getContract(networkAddresses.tokens.PLY, abis$7.abi);
|
|
341
|
+
_this.pulp = _this.getContract(networkAddresses.tokens.PULP, abis$a.abi); // this.faucet = this.getContract<Faucet>(networkAddresses.misc.FAUCET, abis.FaucetABI.abi);
|
|
321
342
|
|
|
322
|
-
_this.auriInternalLens = _this.getContract(networkAddresses.misc.AURI_INTERNAL_LENS, abis$
|
|
343
|
+
_this.auriInternalLens = _this.getContract(networkAddresses.misc.AURI_INTERNAL_LENS, abis$8.abi);
|
|
323
344
|
return _this;
|
|
324
345
|
} // public faucet: Faucet;
|
|
325
346
|
|
|
@@ -330,6 +351,17 @@ var AuriEnv = /*#__PURE__*/function (_BlockchainEntityRead) {
|
|
|
330
351
|
return new ethers.Contract(address, abi, this._networkConnection.provider);
|
|
331
352
|
};
|
|
332
353
|
|
|
354
|
+
_proto.getAuTokenContracts = function getAuTokenContracts() {
|
|
355
|
+
var _this2 = this;
|
|
356
|
+
|
|
357
|
+
return networkAddresses.auTokens.map(function (auToken) {
|
|
358
|
+
var contract = _this2.getContract(auToken.address, abis$4.abi);
|
|
359
|
+
|
|
360
|
+
contract.underlying = auToken.underlying;
|
|
361
|
+
return contract;
|
|
362
|
+
});
|
|
363
|
+
};
|
|
364
|
+
|
|
333
365
|
return AuriEnv;
|
|
334
366
|
}(BlockchainEntityRead);
|
|
335
367
|
|
|
@@ -1095,7 +1127,9 @@ try {
|
|
|
1095
1127
|
|
|
1096
1128
|
var symbolRecords = /*#__PURE__*/Object.fromEntries( /*#__PURE__*/networkAddresses.auTokens.map(function (e) {
|
|
1097
1129
|
return [e.address.toLowerCase(), e.name];
|
|
1098
|
-
}))
|
|
1130
|
+
}).concat( /*#__PURE__*/networkAddresses.auTokens.map(function (e) {
|
|
1131
|
+
return [e.underlying.toLowerCase(), e.name.slice(2)];
|
|
1132
|
+
})));
|
|
1099
1133
|
|
|
1100
1134
|
var AURORA_API_BASE_URL = 'https://api.aurorascan.dev/api';
|
|
1101
1135
|
function getQuery(_x, _x2, _x3) {
|
|
@@ -1151,25 +1185,15 @@ function _queryGraphQL() {
|
|
|
1151
1185
|
switch (_context.prev = _context.next) {
|
|
1152
1186
|
case 0:
|
|
1153
1187
|
_context.next = 2;
|
|
1154
|
-
return
|
|
1155
|
-
|
|
1156
|
-
'Content-Type': 'application/json'
|
|
1157
|
-
},
|
|
1158
|
-
method: 'POST',
|
|
1159
|
-
body: JSON.stringify({
|
|
1160
|
-
query: query
|
|
1161
|
-
})
|
|
1188
|
+
return axios.post(GRAPHQL_URL, {
|
|
1189
|
+
query: query
|
|
1162
1190
|
});
|
|
1163
1191
|
|
|
1164
1192
|
case 2:
|
|
1165
1193
|
resp = _context.sent;
|
|
1166
|
-
_context.
|
|
1167
|
-
return resp.json();
|
|
1168
|
-
|
|
1169
|
-
case 5:
|
|
1170
|
-
return _context.abrupt("return", _context.sent.data);
|
|
1194
|
+
return _context.abrupt("return", resp.data.data);
|
|
1171
1195
|
|
|
1172
|
-
case
|
|
1196
|
+
case 4:
|
|
1173
1197
|
case "end":
|
|
1174
1198
|
return _context.stop();
|
|
1175
1199
|
}
|
|
@@ -1218,6 +1242,18 @@ function getSymbol(address) {
|
|
|
1218
1242
|
assert(symbolRecords[addressLowercase] != undefined, 'Symbol not found for ' + address);
|
|
1219
1243
|
return symbolRecords[addressLowercase];
|
|
1220
1244
|
}
|
|
1245
|
+
function getUnderlying(address) {
|
|
1246
|
+
var addressLowercase = address.toLowerCase();
|
|
1247
|
+
var matching = networkAddresses.auTokens.filter(function (e) {
|
|
1248
|
+
return e.address == addressLowercase;
|
|
1249
|
+
});
|
|
1250
|
+
|
|
1251
|
+
if (matching.length == 0) {
|
|
1252
|
+
throw new Error('Underlying not found for ' + address);
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
return matching[0].underlying;
|
|
1256
|
+
}
|
|
1221
1257
|
function calcLMRewardApr(rewardsValue, totalStakeValue, frequencyPerYear) {
|
|
1222
1258
|
if (rewardsValue.isZero()) {
|
|
1223
1259
|
return new BigNumber(0);
|
|
@@ -1488,6 +1524,10 @@ var TokenAmount = /*#__PURE__*/function () {
|
|
|
1488
1524
|
return new BigNumber(this.rawAmnt).div(decimalFactor(this.token.decimals)).toString();
|
|
1489
1525
|
};
|
|
1490
1526
|
|
|
1527
|
+
_proto.formattedAmountWithSymbol = function formattedAmountWithSymbol() {
|
|
1528
|
+
return this.formattedAmount() + " " + getSymbol(this.token.address);
|
|
1529
|
+
};
|
|
1530
|
+
|
|
1491
1531
|
_proto.rawAmount = function rawAmount() {
|
|
1492
1532
|
return this.rawAmnt;
|
|
1493
1533
|
};
|
|
@@ -2204,7 +2244,7 @@ var TransferEventQuery = /*#__PURE__*/function (_BlockchainEntityRead) {
|
|
|
2204
2244
|
var _this;
|
|
2205
2245
|
|
|
2206
2246
|
_this = _BlockchainEntityRead.call(this, networkConnection) || this;
|
|
2207
|
-
_this.auToken = new ethers.Contract(tokenAddr,
|
|
2247
|
+
_this.auToken = new ethers.Contract(tokenAddr, abis$4.abi, _this._networkConnection.provider);
|
|
2208
2248
|
return _this;
|
|
2209
2249
|
}
|
|
2210
2250
|
/**
|
|
@@ -2314,6 +2354,7 @@ var helpers = {
|
|
|
2314
2354
|
validateAndParseAddress: validateAndParseAddress,
|
|
2315
2355
|
getDecimal: getDecimal,
|
|
2316
2356
|
getSymbol: getSymbol,
|
|
2357
|
+
getUnderlying: getUnderlying,
|
|
2317
2358
|
calcLMRewardApr: calcLMRewardApr,
|
|
2318
2359
|
getBlockTimestamp: getBlockTimestamp,
|
|
2319
2360
|
getBlocksTimestampViaRPC: getBlocksTimestampViaRPC,
|
|
@@ -2976,7 +3017,7 @@ var MoneyMarketReadWrite = /*#__PURE__*/function (_MoneyMarketRead) {
|
|
|
2976
3017
|
var _this3;
|
|
2977
3018
|
|
|
2978
3019
|
_this3 = _MoneyMarketRead.call(this, networkConnection, auToken, underlyingAsset) || this;
|
|
2979
|
-
_this3._EthRepayHelper = new ethers.Contract(networkAddresses.misc.ETHREPAYHELPER, abis$
|
|
3020
|
+
_this3._EthRepayHelper = new ethers.Contract(networkAddresses.misc.ETHREPAYHELPER, abis$6.abi, networkConnection.provider);
|
|
2980
3021
|
return _this3;
|
|
2981
3022
|
}
|
|
2982
3023
|
|
|
@@ -3190,7 +3231,7 @@ var MulticallRead = /*#__PURE__*/function (_BlockchainEntityRead) {
|
|
|
3190
3231
|
var _this;
|
|
3191
3232
|
|
|
3192
3233
|
_this = _BlockchainEntityRead.call(this, networkConnection) || this;
|
|
3193
|
-
_this.multicall = new ethers.Contract(networkAddresses.misc.MULTICALL, abis$
|
|
3234
|
+
_this.multicall = new ethers.Contract(networkAddresses.misc.MULTICALL, abis$9.abi, networkConnection.provider);
|
|
3194
3235
|
return _this;
|
|
3195
3236
|
}
|
|
3196
3237
|
/**
|
|
@@ -3762,7 +3803,7 @@ var StakingRead = /*#__PURE__*/function (_BlockchainEntityRead) {
|
|
|
3762
3803
|
while (1) {
|
|
3763
3804
|
switch (_context3.prev = _context3.next) {
|
|
3764
3805
|
case 0:
|
|
3765
|
-
lpContract = new ethers.Contract(networkAddresses.tokens.PLYWNEAR, abis$
|
|
3806
|
+
lpContract = new ethers.Contract(networkAddresses.tokens.PLYWNEAR, abis$7.abi, this._networkConnection.provider);
|
|
3766
3807
|
_context3.next = 3;
|
|
3767
3808
|
return lpContract.balanceOf(user);
|
|
3768
3809
|
|
|
@@ -4255,7 +4296,7 @@ var MiscRead = /*#__PURE__*/function (_BlockchainEntityRead) {
|
|
|
4255
4296
|
dust = new BigNumber(0.1);
|
|
4256
4297
|
oracle = this.env.getContract(networkAddresses.misc.oracle, AuriOracleABI.abi);
|
|
4257
4298
|
tokens = tokenAddresses.map(function (addr) {
|
|
4258
|
-
return _this3.env.getContract(addr,
|
|
4299
|
+
return _this3.env.getContract(addr, abis$4.abi);
|
|
4259
4300
|
});
|
|
4260
4301
|
_context5.next = 6;
|
|
4261
4302
|
return oracle.getUnderlyingPrices(tokenAddresses);
|
|
@@ -4353,7 +4394,7 @@ var ReferralRead = /*#__PURE__*/function (_BlockchainEntityRead) {
|
|
|
4353
4394
|
var _this;
|
|
4354
4395
|
|
|
4355
4396
|
_this = _BlockchainEntityRead.call(this, networkConnection) || this;
|
|
4356
|
-
_this.referral = new ethers.Contract(networkAddresses.misc.REFERRAL, abis$
|
|
4397
|
+
_this.referral = new ethers.Contract(networkAddresses.misc.REFERRAL, abis$b.abi, networkConnection.provider);
|
|
4357
4398
|
return _this;
|
|
4358
4399
|
}
|
|
4359
4400
|
/**
|
|
@@ -5053,6 +5094,7 @@ exports.BlockchainEntityRead = BlockchainEntityRead;
|
|
|
5053
5094
|
exports.BlockchainEntityReadWrite = BlockchainEntityReadWrite;
|
|
5054
5095
|
exports.DECIMAL_PRECISION = DECIMAL_PRECISION;
|
|
5055
5096
|
exports.DEPOSIT_NEAR_REWARDS_PER_WEEK = DEPOSIT_NEAR_REWARDS_PER_WEEK;
|
|
5097
|
+
exports.DEPOSIT_ONLY_TOKENS = DEPOSIT_ONLY_TOKENS;
|
|
5056
5098
|
exports.ETHAddress = ETHAddress;
|
|
5057
5099
|
exports.HARDCODE_PRICE_TOKENS = HARDCODE_PRICE_TOKENS;
|
|
5058
5100
|
exports.INF = INF;
|
|
@@ -5084,6 +5126,7 @@ exports.StakingReadWrite = StakingReadWrite;
|
|
|
5084
5126
|
exports.Token = Token;
|
|
5085
5127
|
exports.TokenAmount = TokenAmount;
|
|
5086
5128
|
exports.TransferEventQuery = TransferEventQuery;
|
|
5129
|
+
exports.abis = index;
|
|
5087
5130
|
exports.assert = assert;
|
|
5088
5131
|
exports.calcLMRewardApr = calcLMRewardApr;
|
|
5089
5132
|
exports.calcValuation = calcValuation;
|
|
@@ -5123,6 +5166,7 @@ exports.getDecimal = getDecimal;
|
|
|
5123
5166
|
exports.getPaginatedApi = getPaginatedApi;
|
|
5124
5167
|
exports.getQuery = getQuery;
|
|
5125
5168
|
exports.getSymbol = getSymbol;
|
|
5169
|
+
exports.getUnderlying = getUnderlying;
|
|
5126
5170
|
exports.isSameAddress = isSameAddress;
|
|
5127
5171
|
exports.networkAddresses = networkAddresses;
|
|
5128
5172
|
exports.queryGraphQL = queryGraphQL;
|