@levrbet/shared 0.4.26 → 0.4.28
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/core/contracts/instances.d.ts +4 -0
- package/dist/core/contracts/instances.js +8 -3
- package/dist/core/contracts/instances.js.map +1 -1
- package/dist/core/indexers/{envio.test.query.d.ts → envio.health.d.ts} +1 -1
- package/dist/core/indexers/envio.health.js +36 -0
- package/dist/core/indexers/envio.health.js.map +1 -0
- package/dist/core/indexers/indexers.service.d.ts +1 -1
- package/dist/core/indexers/indexers.service.js +13 -33
- package/dist/core/indexers/indexers.service.js.map +1 -1
- package/dist/core/indexers/{subsquid.test.query.d.ts → subsquid.health.d.ts} +1 -1
- package/dist/core/indexers/subsquid.health.js +48 -0
- package/dist/core/indexers/subsquid.health.js.map +1 -0
- package/package.json +1 -1
- package/dist/core/indexers/envio.test.query.js +0 -31
- package/dist/core/indexers/envio.test.query.js.map +0 -1
- package/dist/core/indexers/subsquid.test.query.js +0 -42
- package/dist/core/indexers/subsquid.test.query.js.map +0 -1
|
@@ -2,7 +2,10 @@ import type { Account, Address, Chain, GetContractReturnType, PublicClient, Tran
|
|
|
2
2
|
import { erc20Abi } from "viem";
|
|
3
3
|
import { LevrChain, LevrEnv } from "../types";
|
|
4
4
|
import { abis } from "./abis";
|
|
5
|
+
import { levrContractAddresses } from "./addresses";
|
|
5
6
|
export type CustomWalletClient = WalletClient<Transport, Chain, Account>;
|
|
7
|
+
type ContractAddressName = keyof (typeof levrContractAddresses)["local"][LevrChain.MONAD_TESTNET];
|
|
8
|
+
export declare function getLevrContractAddress(contractName: ContractAddressName, chainId: LevrChain, levrEnv: LevrEnv): Address;
|
|
6
9
|
/**
|
|
7
10
|
* Retrieves an instance of a Levr smart contract for the specified contract name, chain, and environment.
|
|
8
11
|
*
|
|
@@ -22,3 +25,4 @@ export declare function getErc20Contract(address: Address, chainId: LevrChain, {
|
|
|
22
25
|
publicClient?: PublicClient;
|
|
23
26
|
walletClient?: WalletClient;
|
|
24
27
|
}): GetContractReturnType<typeof erc20Abi, CustomWalletClient>;
|
|
28
|
+
export {};
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLevrContractAddress = getLevrContractAddress;
|
|
3
4
|
exports.getLevrContract = getLevrContract;
|
|
4
5
|
exports.getErc20Contract = getErc20Contract;
|
|
5
6
|
const viem_1 = require("viem");
|
|
6
7
|
const abis_1 = require("./abis");
|
|
7
8
|
const addresses_1 = require("./addresses");
|
|
8
9
|
const clients_1 = require("./clients");
|
|
10
|
+
function getLevrContractAddress(contractName, chainId, levrEnv) {
|
|
11
|
+
const address = addresses_1.levrContractAddresses[levrEnv][chainId][contractName];
|
|
12
|
+
if (!address)
|
|
13
|
+
throw new Error(`Contract address not found for ${String(contractName)} on chain ${chainId.toString()}`);
|
|
14
|
+
return address;
|
|
15
|
+
}
|
|
9
16
|
/**
|
|
10
17
|
* Retrieves an instance of a Levr smart contract for the specified contract name, chain, and environment.
|
|
11
18
|
*
|
|
@@ -18,9 +25,7 @@ const clients_1 = require("./clients");
|
|
|
18
25
|
* @throws Will throw an error if the contract address is not found for the given contract name and chain.
|
|
19
26
|
*/
|
|
20
27
|
function getLevrContract(contractName, chainId, levrEnv, { publicClient, walletClient } = {}) {
|
|
21
|
-
const address =
|
|
22
|
-
if (!address)
|
|
23
|
-
throw new Error(`Contract address not found for ${contractName} on chain ${chainId.toString()}`);
|
|
28
|
+
const address = getLevrContractAddress(contractName, chainId, levrEnv);
|
|
24
29
|
const abi = abis_1.abis[contractName];
|
|
25
30
|
publicClient = publicClient ? publicClient : clients_1.publicClientService.getPublicClient(chainId);
|
|
26
31
|
if (walletClient) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instances.js","sourceRoot":"","sources":["../../../src/core/contracts/instances.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"instances.js","sourceRoot":"","sources":["../../../src/core/contracts/instances.ts"],"names":[],"mappings":";;AAWA,wDAMC;AAaD,0CA4BC;AAED,4CAuBC;AAlFD,+BAA4C;AAE5C,iCAA6B;AAC7B,2CAAmD;AACnD,uCAA+C;AAM/C,SAAgB,sBAAsB,CAAC,YAAiC,EAAE,OAAkB,EAAE,OAAgB;IAC1G,MAAM,OAAO,GAAG,iCAAqB,CAAC,OAAO,CAAC,CAAC,OAAwD,CAAC,CAAC,YAAY,CAEtG,CAAA;IACf,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,YAAY,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IACtH,OAAO,OAAO,CAAA;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,eAAe,CAC3B,YAAe,EACf,OAAkB,EAClB,OAAgB,EAChB,EAAE,YAAY,EAAE,YAAY,KAAmE,EAAE;IAEjG,MAAM,OAAO,GAAG,sBAAsB,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAEtE,MAAM,GAAG,GAAG,WAAI,CAAC,YAAY,CAAC,CAAA;IAE9B,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,6BAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAEzF,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,IAAA,kBAAW,EAAC;YACf,OAAO;YACP,GAAG;YACH,MAAM,EAAE;gBACJ,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,YAAY;aACvB;SACJ,CAAgE,CAAA;IACrE,CAAC;IAED,OAAO,IAAA,kBAAW,EAAC;QACf,OAAO;QACP,GAAG;QACH,MAAM,EAAE,YAAY;KACvB,CAAgE,CAAA;AACrE,CAAC;AAED,SAAgB,gBAAgB,CAC5B,OAAgB,EAChB,OAAkB,EAClB,EAAE,YAAY,EAAE,YAAY,KAAmE,EAAE;IAEjG,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,6BAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAEzF,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,IAAA,kBAAW,EAAC;YACf,OAAO;YACP,GAAG,EAAE,eAAQ;YACb,MAAM,EAAE;gBACJ,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,YAAY;aACvB;SACJ,CAA+D,CAAA;IACpE,CAAC;IAED,OAAO,IAAA,kBAAW,EAAC;QACf,OAAO;QACP,GAAG,EAAE,eAAQ;QACb,MAAM,EAAE,YAAY;KACvB,CAA0E,CAAA;AAC/E,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const HEALTH_CHECK_QUERY = "\n query {\n LevrFullTimeMarket_PositionOpened(order_by: {timestamp: desc}, limit: 1) {\n timestamp\n }\n }\n";
|
|
2
2
|
export declare function checkEnvioGraphQlHealth(url: string, variables?: Record<string, any>, signal?: AbortSignal): Promise<{
|
|
3
3
|
ok: boolean;
|
|
4
|
-
|
|
4
|
+
timestamp: any;
|
|
5
5
|
}>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HEALTH_CHECK_QUERY = void 0;
|
|
4
|
+
exports.checkEnvioGraphQlHealth = checkEnvioGraphQlHealth;
|
|
5
|
+
// GraphQL query to check if the endpoint is healthy by requesting LevrFullTimeMarket_PositionOpened
|
|
6
|
+
exports.HEALTH_CHECK_QUERY = `
|
|
7
|
+
query {
|
|
8
|
+
LevrFullTimeMarket_PositionOpened(order_by: {timestamp: desc}, limit: 1) {
|
|
9
|
+
timestamp
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
`;
|
|
13
|
+
async function checkEnvioGraphQlHealth(url, variables, signal) {
|
|
14
|
+
try {
|
|
15
|
+
const response = await fetch(url, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "Content-Type": "application/json" },
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
query: exports.HEALTH_CHECK_QUERY,
|
|
20
|
+
variables,
|
|
21
|
+
}),
|
|
22
|
+
// forward AbortSignal so the request can be aborted by caller
|
|
23
|
+
signal,
|
|
24
|
+
});
|
|
25
|
+
const data = await response.json();
|
|
26
|
+
const dataParsed = response.ok ? data : null;
|
|
27
|
+
return {
|
|
28
|
+
ok: response.ok === true,
|
|
29
|
+
timestamp: response.ok ? (dataParsed?.data?.LevrFullTimeMarket_PositionOpened?.[0]?.timestamp ?? null) : null,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return { ok: false, timestamp: null };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=envio.health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envio.health.js","sourceRoot":"","sources":["../../../src/core/indexers/envio.health.ts"],"names":[],"mappings":";;;AASA,0DAwBC;AAjCD,oGAAoG;AACvF,QAAA,kBAAkB,GAAG;;;;;;CAMjC,CAAA;AAEM,KAAK,UAAU,uBAAuB,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC5G,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB,KAAK,EAAE,0BAAkB;gBACzB,SAAS;aACZ,CAAC;YACF,8DAA8D;YAC9D,MAAM;SACT,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QAE5C,OAAO;YACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;YACxB,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SAChH,CAAA;IACL,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;AACL,CAAC"}
|
|
@@ -7,7 +7,7 @@ declare class IndexersService {
|
|
|
7
7
|
private checkIndexerHealth;
|
|
8
8
|
/**
|
|
9
9
|
* Get a healthy indexer for a given chain and environment
|
|
10
|
-
* Checks
|
|
10
|
+
* Checks all indexers in parallel and picks the one with the most recent timestamp
|
|
11
11
|
*/
|
|
12
12
|
getHealthyIndexer(env: LevrEnv, chain: LevrChain): Promise<{
|
|
13
13
|
type: LevrIndexer;
|
|
@@ -14,25 +14,22 @@ const ms_1 = __importDefault(require("ms"));
|
|
|
14
14
|
const typescript_memoize_1 = require("typescript-memoize");
|
|
15
15
|
const _1 = require("../.");
|
|
16
16
|
const indexers_types_1 = require("../types/indexers.types");
|
|
17
|
-
const
|
|
18
|
-
const
|
|
17
|
+
const envio_health_1 = require("./envio.health");
|
|
18
|
+
const subsquid_health_1 = require("./subsquid.health");
|
|
19
19
|
class IndexersService {
|
|
20
20
|
/**
|
|
21
21
|
* Check the health of a single indexer with caching
|
|
22
22
|
*/
|
|
23
23
|
async checkIndexerHealth(url, indexer) {
|
|
24
24
|
const controller = new AbortController();
|
|
25
|
-
// ensure we clear the timeout regardless of outcome
|
|
26
25
|
const timeoutId = setTimeout(() => controller.abort(), (0, ms_1.default)("5s"));
|
|
27
26
|
try {
|
|
28
|
-
// forward the abort signal to the helper health checks so they can cancel their fetches
|
|
29
27
|
const indexerHealth = indexer == indexers_types_1.LevrIndexer.SUBSQUID
|
|
30
|
-
? await (0,
|
|
31
|
-
: await (0,
|
|
28
|
+
? await (0, subsquid_health_1.checkSubsquidGraphQLHealth)(url, undefined, controller.signal)
|
|
29
|
+
: await (0, envio_health_1.checkEnvioGraphQlHealth)(url, undefined, controller.signal);
|
|
32
30
|
return indexerHealth;
|
|
33
31
|
}
|
|
34
32
|
catch (error) {
|
|
35
|
-
// node-fetch throws an AbortError when aborted; match on name to avoid noisy logs
|
|
36
33
|
if (error && (error.name === "AbortError" || error.type === "aborted")) {
|
|
37
34
|
console.warn(`Health check aborted (timeout) for ${url}`);
|
|
38
35
|
}
|
|
@@ -41,7 +38,7 @@ class IndexersService {
|
|
|
41
38
|
}
|
|
42
39
|
return {
|
|
43
40
|
ok: false,
|
|
44
|
-
|
|
41
|
+
timestamp: null,
|
|
45
42
|
};
|
|
46
43
|
}
|
|
47
44
|
finally {
|
|
@@ -50,36 +47,19 @@ class IndexersService {
|
|
|
50
47
|
}
|
|
51
48
|
/**
|
|
52
49
|
* Get a healthy indexer for a given chain and environment
|
|
53
|
-
* Checks
|
|
50
|
+
* Checks all indexers in parallel and picks the one with the most recent timestamp
|
|
54
51
|
*/
|
|
55
52
|
async getHealthyIndexer(env, chain) {
|
|
56
53
|
const indexers = _1.allUrls[env].indexers[chain] || [];
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
typeToBlockMap[indexer.type] = isHealthy.block;
|
|
64
|
-
}
|
|
65
|
-
// use the one with the latest block if multiple are healthy
|
|
66
|
-
const healthyIndexers = indexers.filter((idx) => typeToBlockMap[idx.type] !== null);
|
|
67
|
-
if (healthyIndexers.length > 1) {
|
|
68
|
-
healthyIndexers.sort((a, b) => {
|
|
69
|
-
const blockA = typeToBlockMap[a.type] || 0;
|
|
70
|
-
const blockB = typeToBlockMap[b.type] || 0;
|
|
71
|
-
return blockB - blockA;
|
|
72
|
-
});
|
|
73
|
-
const bestIndexer = healthyIndexers[0];
|
|
74
|
-
return { type: bestIndexer.type, url: bestIndexer.url };
|
|
75
|
-
}
|
|
76
|
-
else if (healthyIndexers.length === 1) {
|
|
77
|
-
// return the first healthy one if only one is healthy
|
|
78
|
-
return { type: healthyIndexers[0].type, url: healthyIndexers[0].url };
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
54
|
+
const results = await Promise.all(indexers.map(async (indexer) => {
|
|
55
|
+
const health = await this.checkIndexerHealth(indexer.url, indexer.type);
|
|
56
|
+
return { ...indexer, timestamp: health.timestamp };
|
|
57
|
+
}));
|
|
58
|
+
const healthy = results.filter((r) => r.timestamp !== null).sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));
|
|
59
|
+
if (healthy.length === 0) {
|
|
81
60
|
throw new Error(`No healthy indexer found for ${env} - Chain ${chain}`);
|
|
82
61
|
}
|
|
62
|
+
return { type: healthy[0].type, url: healthy[0].url };
|
|
83
63
|
}
|
|
84
64
|
getIndexer(env, chain, type) {
|
|
85
65
|
const indexers = _1.allUrls[env].indexers[chain] || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexers.service.js","sourceRoot":"","sources":["../../../src/core/indexers/indexers.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAmB;AACnB,2DAAoD;AACpD,2BAAkD;AAClD,4DAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"indexers.service.js","sourceRoot":"","sources":["../../../src/core/indexers/indexers.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkSubsquidGraphQLHealth = checkSubsquidGraphQLHealth;
|
|
4
|
+
const HEALTH_CHECK_QUERY = `
|
|
5
|
+
query HealthCheck {
|
|
6
|
+
levrFullTimeMarketSchemaPositionOpeneds(limit: 1, orderBy: timestamp_DESC) {
|
|
7
|
+
id
|
|
8
|
+
timestamp
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
async function checkSubsquidGraphQLHealth(url, variables, signal) {
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: { "Content-Type": "application/json" },
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
query: HEALTH_CHECK_QUERY,
|
|
19
|
+
variables,
|
|
20
|
+
}),
|
|
21
|
+
signal,
|
|
22
|
+
});
|
|
23
|
+
const timestamp = response.ok
|
|
24
|
+
? ((await response.json())?.data?.levrFullTimeMarketSchemaPositionOpeneds?.[0]?.timestamp ?? null)
|
|
25
|
+
: null;
|
|
26
|
+
const toUnix = (ts) => {
|
|
27
|
+
if (ts == null)
|
|
28
|
+
return null;
|
|
29
|
+
// numeric value or numeric string
|
|
30
|
+
const num = typeof ts === "number" ? ts : Number(ts);
|
|
31
|
+
if (!Number.isNaN(num) && Number.isFinite(num)) {
|
|
32
|
+
// if in milliseconds (likely > 1e12) convert to seconds, otherwise assume seconds
|
|
33
|
+
return num > 1e12 ? Math.floor(num / 1000) : Math.floor(num);
|
|
34
|
+
}
|
|
35
|
+
// try parsing ISO/date string
|
|
36
|
+
const parsed = Date.parse(String(ts));
|
|
37
|
+
return Number.isNaN(parsed) ? null : Math.floor(parsed / 1000);
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
ok: response.ok === true,
|
|
41
|
+
timestamp: toUnix(timestamp),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { ok: false, timestamp: null };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=subsquid.health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subsquid.health.js","sourceRoot":"","sources":["../../../src/core/indexers/subsquid.health.ts"],"names":[],"mappings":";;AASA,gEAoCC;AA7CD,MAAM,kBAAkB,GAAG;;;;;;;CAO1B,CAAA;AAEM,KAAK,UAAU,0BAA0B,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC/G,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB,KAAK,EAAE,kBAAkB;gBACzB,SAAS;aACZ,CAAC;YACF,MAAM;SACT,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE;YACzB,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC;YAClG,CAAC,CAAC,IAAI,CAAA;QAEV,MAAM,MAAM,GAAG,CAAC,EAAO,EAAiB,EAAE;YACtC,IAAI,EAAE,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC3B,kCAAkC;YAClC,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,kFAAkF;gBAClF,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAChE,CAAC;YACD,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;YACrC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;QAClE,CAAC,CAAA;QAED,OAAO;YACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;YACxB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;SAC/B,CAAA;IACL,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HEALTH_CHECK_QUERY = void 0;
|
|
4
|
-
exports.checkEnvioGraphQlHealth = checkEnvioGraphQlHealth;
|
|
5
|
-
// GraphQL query to check if the endpoint is healthy by requesting LevrFullTimeMarket_PositionOpened
|
|
6
|
-
exports.HEALTH_CHECK_QUERY = `
|
|
7
|
-
query {
|
|
8
|
-
LevrFullTimeMarket_PositionOpened(order_by: {timestamp: desc}, limit: 1) {
|
|
9
|
-
timestamp
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
`;
|
|
13
|
-
async function checkEnvioGraphQlHealth(url, variables, signal) {
|
|
14
|
-
const response = await fetch(url, {
|
|
15
|
-
method: "POST",
|
|
16
|
-
headers: { "Content-Type": "application/json" },
|
|
17
|
-
body: JSON.stringify({
|
|
18
|
-
query: exports.HEALTH_CHECK_QUERY,
|
|
19
|
-
variables,
|
|
20
|
-
}),
|
|
21
|
-
// forward AbortSignal so the request can be aborted by caller
|
|
22
|
-
signal,
|
|
23
|
-
});
|
|
24
|
-
const data = await response.json();
|
|
25
|
-
const dataParsed = response.ok ? data : null;
|
|
26
|
-
return {
|
|
27
|
-
ok: response.ok === true,
|
|
28
|
-
block: response.ok ? dataParsed?.data?.LevrFullTimeMarket_PositionOpened?.[0]?.timestamp ?? null : null,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=envio.test.query.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"envio.test.query.js","sourceRoot":"","sources":["../../../src/core/indexers/envio.test.query.ts"],"names":[],"mappings":";;;AASA,0DAoBC;AA7BD,oGAAoG;AACvF,QAAA,kBAAkB,GAAG;;;;;;CAMjC,CAAA;AAEM,KAAK,UAAU,uBAAuB,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC5G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC9B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACjB,KAAK,EAAE,0BAAkB;YACzB,SAAS;SACZ,CAAC;QACF,8DAA8D;QAC9D,MAAM;KACT,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAElC,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAE5C,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;QACxB,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;KAC1G,CAAA;AACL,CAAC"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.checkSubsquidGraphQLHealth = checkSubsquidGraphQLHealth;
|
|
4
|
-
const HEALTH_CHECK_QUERY = `
|
|
5
|
-
query HealthCheck {
|
|
6
|
-
levrFullTimeMarketSchemaPositionOpeneds(limit: 1, orderBy: timestamp_DESC) {
|
|
7
|
-
id
|
|
8
|
-
timestamp
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
`;
|
|
12
|
-
async function checkSubsquidGraphQLHealth(url, variables, signal) {
|
|
13
|
-
const response = await fetch(url, {
|
|
14
|
-
method: "POST",
|
|
15
|
-
headers: { "Content-Type": "application/json" },
|
|
16
|
-
body: JSON.stringify({
|
|
17
|
-
query: HEALTH_CHECK_QUERY,
|
|
18
|
-
variables,
|
|
19
|
-
}),
|
|
20
|
-
signal,
|
|
21
|
-
});
|
|
22
|
-
const timestamp = response.ok ? (await response.json()).data.levrFullTimeMarketSchemaPositionOpeneds[0]?.timestamp : null;
|
|
23
|
-
const toUnix = (ts) => {
|
|
24
|
-
if (ts == null)
|
|
25
|
-
return null;
|
|
26
|
-
// numeric value or numeric string
|
|
27
|
-
const num = typeof ts === "number" ? ts : Number(ts);
|
|
28
|
-
if (!Number.isNaN(num) && Number.isFinite(num)) {
|
|
29
|
-
// if in milliseconds (likely > 1e12) convert to seconds, otherwise assume seconds
|
|
30
|
-
return num > 1e12 ? Math.floor(num / 1000) : Math.floor(num);
|
|
31
|
-
}
|
|
32
|
-
// try parsing ISO/date string
|
|
33
|
-
const parsed = Date.parse(String(ts));
|
|
34
|
-
return Number.isNaN(parsed) ? null : Math.floor(parsed / 1000);
|
|
35
|
-
};
|
|
36
|
-
console.log("Subsquid health check response status:", response.status, url, toUnix(timestamp));
|
|
37
|
-
return {
|
|
38
|
-
ok: response.ok === true,
|
|
39
|
-
block: toUnix(timestamp),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=subsquid.test.query.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subsquid.test.query.js","sourceRoot":"","sources":["../../../src/core/indexers/subsquid.test.query.ts"],"names":[],"mappings":";;AASA,gEAgCC;AAzCD,MAAM,kBAAkB,GAAG;;;;;;;CAO1B,CAAA;AAEM,KAAK,UAAU,0BAA0B,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC/G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC9B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACjB,KAAK,EAAE,kBAAkB;YACzB,SAAS;SACZ,CAAC;QACF,MAAM;KACT,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;IAEzH,MAAM,MAAM,GAAG,CAAC,EAAO,EAAiB,EAAE;QACtC,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QAC3B,kCAAkC;QAClC,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,kFAAkF;YAClF,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChE,CAAC;QACD,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACrC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAClE,CAAC,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAE9F,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;QACxB,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;KAC3B,CAAA;AACL,CAAC"}
|