@multiversx/sdk-dapp-liquidity 1.1.0-alpha.10 → 1.1.0-alpha.12
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/api/tests/getChains.spec.js +2 -1
- package/api/tests/getChains.spec.mjs +2 -1
- package/constants/index.d.ts +0 -1
- package/constants/index.js +0 -10
- package/constants/index.mjs +1 -11
- package/index.js +0 -1
- package/index.mjs +1 -2
- package/package.json +5 -5
- package/reactjs/hooks/useFetchBridgeData.d.ts +3 -50
- package/reactjs/hooks/useFetchTokens.d.ts +2 -34
- package/reactjs/hooks/useFiatData.d.ts +2 -34
- package/reactjs/hooks/useResolveTokenChain.d.ts +1 -16
- package/reactjs/queries/useGetAllTokens.query.d.ts +1 -17
- package/reactjs/queries/useGetAllTokens.query.js +1 -5
- package/reactjs/queries/useGetAllTokens.query.mjs +1 -5
- package/reactjs/queries/useGetChains.query.d.ts +1 -16
- package/reactjs/queries/useGetChains.query.js +1 -5
- package/reactjs/queries/useGetChains.query.mjs +1 -5
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
3
|
const axios = require("axios");
|
|
4
|
+
const types_chainType = require("../../types/chainType.js");
|
|
4
5
|
const api_getChains = require("../getChains.js");
|
|
5
6
|
jest.mock("axios");
|
|
6
7
|
const mockedAxios = axios;
|
|
@@ -13,7 +14,7 @@ describe("getChains", () => {
|
|
|
13
14
|
chainName: "msx",
|
|
14
15
|
pngUrl: "https://devnet-tools.multiversx.com/liquidity-sdk/ethereum/icon.png",
|
|
15
16
|
svgUrl: "https://devnet-tools.multiversx.com/liquidity-sdk/ethereum/icon.svg",
|
|
16
|
-
chainType:
|
|
17
|
+
chainType: types_chainType.ChainType.evm,
|
|
17
18
|
rpc: "rpc1",
|
|
18
19
|
blockExplorerUrls: ["explorer1"],
|
|
19
20
|
nativeCurrency: {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
|
+
import { ChainType } from "../../types/chainType.mjs";
|
|
2
3
|
import { getChains } from "../getChains.mjs";
|
|
3
4
|
jest.mock("axios");
|
|
4
5
|
const mockedAxios = axios;
|
|
@@ -11,7 +12,7 @@ describe("getChains", () => {
|
|
|
11
12
|
chainName: "msx",
|
|
12
13
|
pngUrl: "https://devnet-tools.multiversx.com/liquidity-sdk/ethereum/icon.png",
|
|
13
14
|
svgUrl: "https://devnet-tools.multiversx.com/liquidity-sdk/ethereum/icon.svg",
|
|
14
|
-
chainType:
|
|
15
|
+
chainType: ChainType.evm,
|
|
15
16
|
rpc: "rpc1",
|
|
16
17
|
blockExplorerUrls: ["explorer1"],
|
|
17
18
|
nativeCurrency: {
|
package/constants/index.d.ts
CHANGED
package/constants/index.js
CHANGED
|
@@ -2,14 +2,4 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
4
4
|
const MVX_CHAIN_IDS = ["31", "44", "54"];
|
|
5
|
-
const NON_EVM_CHAIN_IDS_MAP = {
|
|
6
|
-
"0": "000000000019d6689c085ae165831e93",
|
|
7
|
-
// Bitcoin
|
|
8
|
-
// TODO chain ID to be defined at the API level
|
|
9
|
-
"-1": "000000000933ea01ad0ee984209779ba",
|
|
10
|
-
// Bitcoin Testnet
|
|
11
|
-
"101": "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
12
|
-
"103": "EtWTRABZaYq6iMfeYKouRu166VU2xqa1"
|
|
13
|
-
};
|
|
14
5
|
exports.MVX_CHAIN_IDS = MVX_CHAIN_IDS;
|
|
15
|
-
exports.NON_EVM_CHAIN_IDS_MAP = NON_EVM_CHAIN_IDS_MAP;
|
package/constants/index.mjs
CHANGED
|
@@ -1,14 +1,4 @@
|
|
|
1
1
|
const MVX_CHAIN_IDS = ["31", "44", "54"];
|
|
2
|
-
const NON_EVM_CHAIN_IDS_MAP = {
|
|
3
|
-
"0": "000000000019d6689c085ae165831e93",
|
|
4
|
-
// Bitcoin
|
|
5
|
-
// TODO chain ID to be defined at the API level
|
|
6
|
-
"-1": "000000000933ea01ad0ee984209779ba",
|
|
7
|
-
// Bitcoin Testnet
|
|
8
|
-
"101": "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
9
|
-
"103": "EtWTRABZaYq6iMfeYKouRu166VU2xqa1"
|
|
10
|
-
};
|
|
11
2
|
export {
|
|
12
|
-
MVX_CHAIN_IDS
|
|
13
|
-
NON_EVM_CHAIN_IDS_MAP
|
|
3
|
+
MVX_CHAIN_IDS
|
|
14
4
|
};
|
package/index.js
CHANGED
|
@@ -92,7 +92,6 @@ exports.getTokensBalances = api_getTokensBalances.getTokensBalances;
|
|
|
92
92
|
exports.getTransactions = api_getTransactions.getTransactions;
|
|
93
93
|
exports.sendTransactions = api_sendTransactions.sendTransactions;
|
|
94
94
|
exports.MVX_CHAIN_IDS = constants_index.MVX_CHAIN_IDS;
|
|
95
|
-
exports.NON_EVM_CHAIN_IDS_MAP = constants_index.NON_EVM_CHAIN_IDS_MAP;
|
|
96
95
|
exports.decodeBase64 = helpers_base64Utils.decodeBase64;
|
|
97
96
|
exports.encodeToBase64 = helpers_base64Utils.encodeToBase64;
|
|
98
97
|
exports.isStringBase64 = helpers_base64Utils.isStringBase64;
|
package/index.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { getTokens } from "./api/getTokens.mjs";
|
|
|
5
5
|
import { getTokensBalances } from "./api/getTokensBalances.mjs";
|
|
6
6
|
import { getTransactions } from "./api/getTransactions.mjs";
|
|
7
7
|
import { sendTransactions } from "./api/sendTransactions.mjs";
|
|
8
|
-
import { MVX_CHAIN_IDS
|
|
8
|
+
import { MVX_CHAIN_IDS } from "./constants/index.mjs";
|
|
9
9
|
import { decodeBase64, encodeToBase64, isStringBase64 } from "./helpers/base64Utils.mjs";
|
|
10
10
|
import { decodeLoginToken } from "./helpers/decodeLoginToken.mjs";
|
|
11
11
|
import { decodeToken } from "./helpers/decodeToken.mjs";
|
|
@@ -104,7 +104,6 @@ export {
|
|
|
104
104
|
MxSearch,
|
|
105
105
|
MxSlideover,
|
|
106
106
|
MxTooltip,
|
|
107
|
-
NON_EVM_CHAIN_IDS_MAP,
|
|
108
107
|
SmallLoader,
|
|
109
108
|
SwitchChainButton,
|
|
110
109
|
TokenSelector,
|
package/package.json
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://github.com/multiversx/mx-sdk-dapp-liquidity#readme",
|
|
30
30
|
"license": "MIT",
|
|
31
|
-
"version": "1.1.0-alpha.
|
|
31
|
+
"version": "1.1.0-alpha.12",
|
|
32
32
|
"main": "index.js",
|
|
33
33
|
"module": "index.mjs",
|
|
34
34
|
"types": "index.d.ts",
|
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
"@fortawesome/react-fontawesome": "0.2.0",
|
|
52
52
|
"@headlessui/react": "2.2.0",
|
|
53
53
|
"@multiversx/sdk-dapp-utils": "1.0.5",
|
|
54
|
-
"@popperjs/core": "
|
|
55
|
-
"@reown/appkit": "
|
|
54
|
+
"@popperjs/core": "2.11.8",
|
|
55
|
+
"@reown/appkit": "1.7.1",
|
|
56
56
|
"@reown/appkit-adapter-bitcoin": "1.7.1",
|
|
57
57
|
"@reown/appkit-adapter-solana": "1.7.1",
|
|
58
58
|
"@reown/appkit-adapter-wagmi": "1.7.1",
|
|
59
|
-
"@solana/web3.js": "
|
|
60
|
-
"@tanstack/react-query": "
|
|
59
|
+
"@solana/web3.js": "1.98.0",
|
|
60
|
+
"@tanstack/react-query": "5.71.3",
|
|
61
61
|
"animated-number-react": "0.1.2",
|
|
62
62
|
"axios": "1.7.9",
|
|
63
63
|
"formik": "2.4.6",
|
|
@@ -43,56 +43,9 @@ export declare const useFetchBridgeData: ({ refetchTrigger, mvxAddress, mvxApiUR
|
|
|
43
43
|
}[] | undefined;
|
|
44
44
|
isLoadingMvxTokensBalances: boolean;
|
|
45
45
|
isErrorEvmTokensBalances: boolean;
|
|
46
|
-
chains:
|
|
47
|
-
chainId: string;
|
|
48
|
-
chainName: string;
|
|
49
|
-
pngUrl: string;
|
|
50
|
-
svgUrl: string;
|
|
51
|
-
chainType: import('../../types/chainType').ChainType;
|
|
52
|
-
rpc: string;
|
|
53
|
-
networkName: string;
|
|
54
|
-
nativeCurrency: {
|
|
55
|
-
name: string;
|
|
56
|
-
symbol: string;
|
|
57
|
-
decimals: number;
|
|
58
|
-
icon: string;
|
|
59
|
-
};
|
|
60
|
-
blockExplorerUrls: string[];
|
|
61
|
-
}[] | undefined;
|
|
46
|
+
chains: import('../..').ChainDTO[] | undefined;
|
|
62
47
|
isChainsLoading: boolean;
|
|
63
48
|
isChainsError: boolean;
|
|
64
|
-
fiatCurrencies:
|
|
65
|
-
|
|
66
|
-
address: string;
|
|
67
|
-
name: string;
|
|
68
|
-
symbol: string;
|
|
69
|
-
decimals: number;
|
|
70
|
-
crosschain: boolean;
|
|
71
|
-
pngUrl: string;
|
|
72
|
-
svgUrl: string;
|
|
73
|
-
metadata: {
|
|
74
|
-
minBridgeAmount: string;
|
|
75
|
-
maxBridgeAmount: string;
|
|
76
|
-
};
|
|
77
|
-
availableTokens?: string[];
|
|
78
|
-
isNative?: boolean;
|
|
79
|
-
balance?: string;
|
|
80
|
-
}[] | undefined;
|
|
81
|
-
tokens: {
|
|
82
|
-
chainId: string;
|
|
83
|
-
address: string;
|
|
84
|
-
name: string;
|
|
85
|
-
symbol: string;
|
|
86
|
-
decimals: number;
|
|
87
|
-
crosschain: boolean;
|
|
88
|
-
pngUrl: string;
|
|
89
|
-
svgUrl: string;
|
|
90
|
-
metadata: {
|
|
91
|
-
minBridgeAmount: string;
|
|
92
|
-
maxBridgeAmount: string;
|
|
93
|
-
};
|
|
94
|
-
availableTokens?: string[];
|
|
95
|
-
isNative?: boolean;
|
|
96
|
-
balance?: string;
|
|
97
|
-
}[] | undefined;
|
|
49
|
+
fiatCurrencies: import('../..').TokenType[] | undefined;
|
|
50
|
+
tokens: import('../..').TokenType[] | undefined;
|
|
98
51
|
};
|
|
@@ -43,38 +43,6 @@ export declare const useFetchTokens: ({ mvxAddress, mvxApiURL, refetchTrigger }:
|
|
|
43
43
|
availableTokens?: string[];
|
|
44
44
|
isNative?: boolean;
|
|
45
45
|
}[] | undefined;
|
|
46
|
-
fiatCurrencies:
|
|
47
|
-
|
|
48
|
-
address: string;
|
|
49
|
-
name: string;
|
|
50
|
-
symbol: string;
|
|
51
|
-
decimals: number;
|
|
52
|
-
crosschain: boolean;
|
|
53
|
-
pngUrl: string;
|
|
54
|
-
svgUrl: string;
|
|
55
|
-
metadata: {
|
|
56
|
-
minBridgeAmount: string;
|
|
57
|
-
maxBridgeAmount: string;
|
|
58
|
-
};
|
|
59
|
-
availableTokens?: string[];
|
|
60
|
-
isNative?: boolean;
|
|
61
|
-
balance?: string;
|
|
62
|
-
}[] | undefined;
|
|
63
|
-
tokens: {
|
|
64
|
-
chainId: string;
|
|
65
|
-
address: string;
|
|
66
|
-
name: string;
|
|
67
|
-
symbol: string;
|
|
68
|
-
decimals: number;
|
|
69
|
-
crosschain: boolean;
|
|
70
|
-
pngUrl: string;
|
|
71
|
-
svgUrl: string;
|
|
72
|
-
metadata: {
|
|
73
|
-
minBridgeAmount: string;
|
|
74
|
-
maxBridgeAmount: string;
|
|
75
|
-
};
|
|
76
|
-
availableTokens?: string[];
|
|
77
|
-
isNative?: boolean;
|
|
78
|
-
balance?: string;
|
|
79
|
-
}[] | undefined;
|
|
46
|
+
fiatCurrencies: import('../..').TokenType[] | undefined;
|
|
47
|
+
tokens: import('../..').TokenType[] | undefined;
|
|
80
48
|
};
|
|
@@ -24,38 +24,6 @@ export declare const useFiatData: ({ mvxAddress, mvxApiURL, refetchTrigger }: {
|
|
|
24
24
|
availableTokens?: string[];
|
|
25
25
|
isNative?: boolean;
|
|
26
26
|
}[] | undefined;
|
|
27
|
-
currencies:
|
|
28
|
-
|
|
29
|
-
address: string;
|
|
30
|
-
name: string;
|
|
31
|
-
symbol: string;
|
|
32
|
-
decimals: number;
|
|
33
|
-
crosschain: boolean;
|
|
34
|
-
pngUrl: string;
|
|
35
|
-
svgUrl: string;
|
|
36
|
-
metadata: {
|
|
37
|
-
minBridgeAmount: string;
|
|
38
|
-
maxBridgeAmount: string;
|
|
39
|
-
};
|
|
40
|
-
availableTokens?: string[];
|
|
41
|
-
isNative?: boolean;
|
|
42
|
-
balance?: string;
|
|
43
|
-
}[] | undefined;
|
|
44
|
-
tokens: {
|
|
45
|
-
chainId: string;
|
|
46
|
-
address: string;
|
|
47
|
-
name: string;
|
|
48
|
-
symbol: string;
|
|
49
|
-
decimals: number;
|
|
50
|
-
crosschain: boolean;
|
|
51
|
-
pngUrl: string;
|
|
52
|
-
svgUrl: string;
|
|
53
|
-
metadata: {
|
|
54
|
-
minBridgeAmount: string;
|
|
55
|
-
maxBridgeAmount: string;
|
|
56
|
-
};
|
|
57
|
-
availableTokens?: string[];
|
|
58
|
-
isNative?: boolean;
|
|
59
|
-
balance?: string;
|
|
60
|
-
}[] | undefined;
|
|
27
|
+
currencies: import('../..').TokenType[] | undefined;
|
|
28
|
+
tokens: import('../..').TokenType[] | undefined;
|
|
61
29
|
};
|
|
@@ -3,22 +3,7 @@ import { TokenDTO } from '../../dto/Token.dto';
|
|
|
3
3
|
export declare const useResolveTokenChain: ({ token }: {
|
|
4
4
|
token?: TokenDTO;
|
|
5
5
|
}) => {
|
|
6
|
-
tokenChain:
|
|
7
|
-
chainId: string;
|
|
8
|
-
chainName: string;
|
|
9
|
-
pngUrl: string;
|
|
10
|
-
svgUrl: string;
|
|
11
|
-
chainType: import('../../types/chainType').ChainType;
|
|
12
|
-
rpc: string;
|
|
13
|
-
networkName: string;
|
|
14
|
-
nativeCurrency: {
|
|
15
|
-
name: string;
|
|
16
|
-
symbol: string;
|
|
17
|
-
decimals: number;
|
|
18
|
-
icon: string;
|
|
19
|
-
};
|
|
20
|
-
blockExplorerUrls: string[];
|
|
21
|
-
} | undefined;
|
|
6
|
+
tokenChain: import('../..').ChainDTO | undefined;
|
|
22
7
|
isLoading: boolean;
|
|
23
8
|
chainIcon: string | null;
|
|
24
9
|
};
|
|
@@ -1,19 +1,3 @@
|
|
|
1
1
|
import { AxiosError } from 'axios';
|
|
2
2
|
|
|
3
|
-
export declare const useGetAllTokensQuery: () => import('@tanstack/react-query').UseQueryResult<
|
|
4
|
-
chainId: string;
|
|
5
|
-
address: string;
|
|
6
|
-
name: string;
|
|
7
|
-
symbol: string;
|
|
8
|
-
decimals: number;
|
|
9
|
-
crosschain: boolean;
|
|
10
|
-
pngUrl: string;
|
|
11
|
-
svgUrl: string;
|
|
12
|
-
metadata: {
|
|
13
|
-
minBridgeAmount: string;
|
|
14
|
-
maxBridgeAmount: string;
|
|
15
|
-
};
|
|
16
|
-
availableTokens?: string[];
|
|
17
|
-
isNative?: boolean;
|
|
18
|
-
balance?: string;
|
|
19
|
-
}[], AxiosError<unknown, any>>;
|
|
3
|
+
export declare const useGetAllTokensQuery: () => import('@tanstack/react-query').UseQueryResult<import('../..').TokenType[], AxiosError<unknown, any>>;
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
4
4
|
const reactQuery = require("@tanstack/react-query");
|
|
5
5
|
const api_getTokens = require("../../api/getTokens.js");
|
|
6
|
-
const constants_index = require("../../constants/index.js");
|
|
7
6
|
const helpers_getApiURL = require("../../helpers/getApiURL.js");
|
|
8
7
|
const useGetAllTokensQuery = () => {
|
|
9
8
|
const queryFn = async () => {
|
|
@@ -11,10 +10,7 @@ const useGetAllTokensQuery = () => {
|
|
|
11
10
|
const { data } = await api_getTokens.getTokens({
|
|
12
11
|
url: helpers_getApiURL.getApiURL()
|
|
13
12
|
});
|
|
14
|
-
return data
|
|
15
|
-
...token,
|
|
16
|
-
chainId: constants_index.NON_EVM_CHAIN_IDS_MAP[token.chainId] ? constants_index.NON_EVM_CHAIN_IDS_MAP[token.chainId] : token.chainId
|
|
17
|
-
}));
|
|
13
|
+
return data;
|
|
18
14
|
} catch (error) {
|
|
19
15
|
throw error;
|
|
20
16
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
2
|
import { getTokens } from "../../api/getTokens.mjs";
|
|
3
|
-
import { NON_EVM_CHAIN_IDS_MAP } from "../../constants/index.mjs";
|
|
4
3
|
import { getApiURL } from "../../helpers/getApiURL.mjs";
|
|
5
4
|
const useGetAllTokensQuery = () => {
|
|
6
5
|
const queryFn = async () => {
|
|
@@ -8,10 +7,7 @@ const useGetAllTokensQuery = () => {
|
|
|
8
7
|
const { data } = await getTokens({
|
|
9
8
|
url: getApiURL()
|
|
10
9
|
});
|
|
11
|
-
return data
|
|
12
|
-
...token,
|
|
13
|
-
chainId: NON_EVM_CHAIN_IDS_MAP[token.chainId] ? NON_EVM_CHAIN_IDS_MAP[token.chainId] : token.chainId
|
|
14
|
-
}));
|
|
10
|
+
return data;
|
|
15
11
|
} catch (error) {
|
|
16
12
|
throw error;
|
|
17
13
|
}
|
|
@@ -1,18 +1,3 @@
|
|
|
1
1
|
import { AxiosError } from 'axios';
|
|
2
2
|
|
|
3
|
-
export declare const useGetChainsQuery: () => import('@tanstack/react-query').UseQueryResult<
|
|
4
|
-
chainId: string;
|
|
5
|
-
chainName: string;
|
|
6
|
-
pngUrl: string;
|
|
7
|
-
svgUrl: string;
|
|
8
|
-
chainType: import('../../types/chainType').ChainType;
|
|
9
|
-
rpc: string;
|
|
10
|
-
networkName: string;
|
|
11
|
-
nativeCurrency: {
|
|
12
|
-
name: string;
|
|
13
|
-
symbol: string;
|
|
14
|
-
decimals: number;
|
|
15
|
-
icon: string;
|
|
16
|
-
};
|
|
17
|
-
blockExplorerUrls: string[];
|
|
18
|
-
}[], AxiosError<unknown, any>>;
|
|
3
|
+
export declare const useGetChainsQuery: () => import('@tanstack/react-query').UseQueryResult<import('../..').ChainDTO[], AxiosError<unknown, any>>;
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
4
4
|
const reactQuery = require("@tanstack/react-query");
|
|
5
5
|
const api_getChains = require("../../api/getChains.js");
|
|
6
|
-
const constants_index = require("../../constants/index.js");
|
|
7
6
|
const helpers_getApiURL = require("../../helpers/getApiURL.js");
|
|
8
7
|
const useGetChainsQuery = () => {
|
|
9
8
|
const queryFn = async () => {
|
|
@@ -11,10 +10,7 @@ const useGetChainsQuery = () => {
|
|
|
11
10
|
const { data } = await api_getChains.getChains({
|
|
12
11
|
url: helpers_getApiURL.getApiURL()
|
|
13
12
|
});
|
|
14
|
-
return data
|
|
15
|
-
...chain,
|
|
16
|
-
chainId: constants_index.NON_EVM_CHAIN_IDS_MAP[chain.chainId] ? constants_index.NON_EVM_CHAIN_IDS_MAP[chain.chainId] : chain.chainId
|
|
17
|
-
}));
|
|
13
|
+
return data;
|
|
18
14
|
} catch (error) {
|
|
19
15
|
throw error;
|
|
20
16
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
2
|
import { getChains } from "../../api/getChains.mjs";
|
|
3
|
-
import { NON_EVM_CHAIN_IDS_MAP } from "../../constants/index.mjs";
|
|
4
3
|
import { getApiURL } from "../../helpers/getApiURL.mjs";
|
|
5
4
|
const useGetChainsQuery = () => {
|
|
6
5
|
const queryFn = async () => {
|
|
@@ -8,10 +7,7 @@ const useGetChainsQuery = () => {
|
|
|
8
7
|
const { data } = await getChains({
|
|
9
8
|
url: getApiURL()
|
|
10
9
|
});
|
|
11
|
-
return data
|
|
12
|
-
...chain,
|
|
13
|
-
chainId: NON_EVM_CHAIN_IDS_MAP[chain.chainId] ? NON_EVM_CHAIN_IDS_MAP[chain.chainId] : chain.chainId
|
|
14
|
-
}));
|
|
10
|
+
return data;
|
|
15
11
|
} catch (error) {
|
|
16
12
|
throw error;
|
|
17
13
|
}
|