@lidofinance/lsv-cli 1.7.0 → 1.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.
- package/README.md +9 -1
- package/dist/abi/defi-wrapper/GenericStrategy.d.ts +308 -0
- package/dist/abi/defi-wrapper/GenericStrategy.js +409 -0
- package/dist/abi/defi-wrapper/GenericStrategy.js.map +1 -0
- package/dist/abi/defi-wrapper/MellowStrategy.d.ts +429 -0
- package/dist/abi/defi-wrapper/MellowStrategy.js +892 -0
- package/dist/abi/defi-wrapper/MellowStrategy.js.map +1 -0
- package/dist/abi/defi-wrapper/index.d.ts +2 -0
- package/dist/abi/defi-wrapper/index.js +2 -0
- package/dist/abi/defi-wrapper/index.js.map +1 -1
- package/dist/abi/defi-wrapper/sources.d.ts +103 -0
- package/dist/abi/defi-wrapper/sources.js +104 -0
- package/dist/abi/defi-wrapper/sources.js.map +1 -0
- package/dist/configs/constants.d.ts +7 -1
- package/dist/configs/deployed.d.ts +5 -0
- package/dist/configs/deployed.js +20 -2
- package/dist/configs/deployed.js.map +1 -1
- package/dist/configs/envs.js +2 -0
- package/dist/configs/envs.js.map +1 -1
- package/dist/contracts/defi-wrapper/generic-strategy.d.ts +5 -0
- package/dist/contracts/defi-wrapper/generic-strategy.js +12 -0
- package/dist/contracts/defi-wrapper/generic-strategy.js.map +1 -0
- package/dist/contracts/defi-wrapper/index.d.ts +1 -0
- package/dist/contracts/defi-wrapper/index.js +1 -0
- package/dist/contracts/defi-wrapper/index.js.map +1 -1
- package/dist/features/defi-wrapper/defi-wrapper-factory.d.ts +3 -0
- package/dist/features/defi-wrapper/defi-wrapper-factory.js +4 -1
- package/dist/features/defi-wrapper/defi-wrapper-factory.js.map +1 -1
- package/dist/features/defi-wrapper/index.d.ts +1 -0
- package/dist/features/defi-wrapper/index.js +1 -0
- package/dist/features/defi-wrapper/index.js.map +1 -1
- package/dist/features/defi-wrapper/pool-info.d.ts +18 -1
- package/dist/features/defi-wrapper/pool-info.js +47 -3
- package/dist/features/defi-wrapper/pool-info.js.map +1 -1
- package/dist/features/defi-wrapper/timelock-roles.d.ts +5 -0
- package/dist/features/defi-wrapper/timelock-roles.js +43 -0
- package/dist/features/defi-wrapper/timelock-roles.js.map +1 -0
- package/dist/features/defi-wrapper/timelock.d.ts +8929 -8
- package/dist/features/defi-wrapper/timelock.js +83 -52
- package/dist/features/defi-wrapper/timelock.js.map +1 -1
- package/dist/features/defi-wrapper/verify-contracts.d.ts +20 -0
- package/dist/features/defi-wrapper/verify-contracts.js +145 -0
- package/dist/features/defi-wrapper/verify-contracts.js.map +1 -0
- package/dist/features/utils/try-fetch.js +2 -0
- package/dist/features/utils/try-fetch.js.map +1 -1
- package/dist/programs/account/write.js +2 -1
- package/dist/programs/account/write.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/factory/write.js +77 -6
- package/dist/programs/defi-wrapper/contracts/factory/write.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/index.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/index.js +1 -0
- package/dist/programs/defi-wrapper/contracts/index.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/strategy/config.d.ts +3 -0
- package/dist/programs/defi-wrapper/contracts/strategy/config.js +40 -0
- package/dist/programs/defi-wrapper/contracts/strategy/config.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/index.d.ts +3 -0
- package/dist/programs/defi-wrapper/contracts/strategy/index.js +4 -0
- package/dist/programs/defi-wrapper/contracts/strategy/index.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/main.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/main.js +6 -0
- package/dist/programs/defi-wrapper/contracts/strategy/main.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/read.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/read.js +30 -0
- package/dist/programs/defi-wrapper/contracts/strategy/read.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/write.d.ts +1 -0
- package/dist/programs/defi-wrapper/contracts/strategy/write.js +34 -0
- package/dist/programs/defi-wrapper/contracts/strategy/write.js.map +1 -0
- package/dist/programs/defi-wrapper/contracts/stv-steth-pool/write.js +25 -21
- package/dist/programs/defi-wrapper/contracts/stv-steth-pool/write.js.map +1 -1
- package/dist/programs/defi-wrapper/contracts/withdrawal-queue/write.js +3 -4
- package/dist/programs/defi-wrapper/contracts/withdrawal-queue/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/distributor/write.js +1 -0
- package/dist/programs/defi-wrapper/use-cases/distributor/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/read.js +25 -7
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/read.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/write.js +195 -17
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/write.js +3 -3
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.d.ts +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.js +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/index.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/write.js +4 -4
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/write.js +3 -3
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.d.ts +2 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.js +3 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/index.js.map +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.d.ts +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.js +6 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/main.js.map +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.d.ts +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.js +57 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/strategy/write.js.map +1 -0
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/write.js +4 -4
- package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/write.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js +32 -11
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js.map +1 -1
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js +14 -12
- package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js.map +1 -1
- package/dist/programs/use-cases/consolidation/write.js +2 -0
- package/dist/programs/use-cases/consolidation/write.js.map +1 -1
- package/dist/providers/wallet.d.ts +2936 -8456
- package/dist/providers/wallet.js +74 -2
- package/dist/providers/wallet.js.map +1 -1
- package/dist/tests/integration/gas-estimation.test.d.ts +1 -0
- package/dist/tests/integration/gas-estimation.test.js +76 -0
- package/dist/tests/integration/gas-estimation.test.js.map +1 -0
- package/dist/tests/integration/helpers/test-client.d.ts +2071 -5761
- package/dist/tests/utils/arguments-security.test.d.ts +1 -0
- package/dist/tests/utils/arguments-security.test.js +34 -0
- package/dist/tests/utils/arguments-security.test.js.map +1 -0
- package/dist/tests/utils/arguments.test.js +2 -20
- package/dist/tests/utils/arguments.test.js.map +1 -1
- package/dist/tests/utils/cache-security.test.d.ts +1 -0
- package/dist/tests/utils/cache-security.test.js +62 -0
- package/dist/tests/utils/cache-security.test.js.map +1 -0
- package/dist/tests/utils/contract-write-stateoverride.test.d.ts +1 -0
- package/dist/tests/utils/contract-write-stateoverride.test.js +135 -0
- package/dist/tests/utils/contract-write-stateoverride.test.js.map +1 -0
- package/dist/tests/utils/data-validators.test.js +21 -5
- package/dist/tests/utils/data-validators.test.js.map +1 -1
- package/dist/tests/utils/deployed-security.test.d.ts +1 -0
- package/dist/tests/utils/deployed-security.test.js +51 -0
- package/dist/tests/utils/deployed-security.test.js.map +1 -0
- package/dist/tests/utils/get-confirmations.test.d.ts +1 -0
- package/dist/tests/utils/get-confirmations.test.js +40 -0
- package/dist/tests/utils/get-confirmations.test.js.map +1 -0
- package/dist/tests/utils/ipfs-security.test.d.ts +1 -0
- package/dist/tests/utils/ipfs-security.test.js +232 -0
- package/dist/tests/utils/ipfs-security.test.js.map +1 -0
- package/dist/tests/utils/ipfs.test.js +8 -8
- package/dist/tests/utils/ipfs.test.js.map +1 -1
- package/dist/tests/utils/parse-abi-arguments.test.d.ts +1 -0
- package/dist/tests/utils/parse-abi-arguments.test.js +399 -0
- package/dist/tests/utils/parse-abi-arguments.test.js.map +1 -0
- package/dist/tests/utils/public-client-gas-estimation.test.d.ts +1 -0
- package/dist/tests/utils/public-client-gas-estimation.test.js +231 -0
- package/dist/tests/utils/public-client-gas-estimation.test.js.map +1 -0
- package/dist/tests/utils/rate-limit-security.test.d.ts +1 -0
- package/dist/tests/utils/rate-limit-security.test.js +82 -0
- package/dist/tests/utils/rate-limit-security.test.js.map +1 -0
- package/dist/tests/utils/salt.test.d.ts +1 -0
- package/dist/tests/utils/salt.test.js +20 -0
- package/dist/tests/utils/salt.test.js.map +1 -0
- package/dist/tests/utils/stream-helpers.d.ts +1 -0
- package/dist/tests/utils/stream-helpers.js +11 -0
- package/dist/tests/utils/stream-helpers.js.map +1 -0
- package/dist/utils/arguments.d.ts +2 -7
- package/dist/utils/arguments.js +21 -17
- package/dist/utils/arguments.js.map +1 -1
- package/dist/utils/cache.js +15 -13
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/data-validators.d.ts +3 -2
- package/dist/utils/data-validators.js +8 -11
- package/dist/utils/data-validators.js.map +1 -1
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/env.js +8 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/fetch-cl.js +2 -1
- package/dist/utils/fetch-cl.js.map +1 -1
- package/dist/utils/index.d.ts +6 -5
- package/dist/utils/index.js +6 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/ipfs.d.ts +4 -2
- package/dist/utils/ipfs.js +93 -11
- package/dist/utils/ipfs.js.map +1 -1
- package/dist/utils/logging/console.d.ts +1 -0
- package/dist/utils/logging/console.js +23 -2
- package/dist/utils/logging/console.js.map +1 -1
- package/dist/utils/parse-abi-arguments.d.ts +24 -0
- package/dist/utils/parse-abi-arguments.js +159 -0
- package/dist/utils/parse-abi-arguments.js.map +1 -0
- package/dist/utils/prompts/account.d.ts +1 -0
- package/dist/utils/prompts/account.js +13 -0
- package/dist/utils/prompts/account.js.map +1 -0
- package/dist/utils/prompts/index.d.ts +3 -0
- package/dist/utils/prompts/index.js +3 -0
- package/dist/utils/prompts/index.js.map +1 -1
- package/dist/utils/prompts/strategy.d.ts +15398 -0
- package/dist/utils/prompts/strategy.js +10 -0
- package/dist/utils/prompts/strategy.js.map +1 -0
- package/dist/utils/prompts/timelock-roles.d.ts +1 -0
- package/dist/utils/prompts/timelock-roles.js +13 -0
- package/dist/utils/prompts/timelock-roles.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +6 -0
- package/dist/utils/rate-limit.js +22 -5
- package/dist/utils/rate-limit.js.map +1 -1
- package/dist/utils/salt.d.ts +3 -0
- package/dist/utils/salt.js +8 -0
- package/dist/utils/salt.js.map +1 -0
- package/dist/utils/transactions/tx-private-key.d.ts +2 -1
- package/dist/utils/transactions/tx-private-key.js +5 -8
- package/dist/utils/transactions/tx-private-key.js.map +1 -1
- package/dist/utils/transactions/tx-wc.js +3 -7
- package/dist/utils/transactions/tx-wc.js.map +1 -1
- package/dist/utils/transactions/utils.d.ts +1 -0
- package/dist/utils/transactions/utils.js +12 -0
- package/dist/utils/transactions/utils.js.map +1 -1
- package/dist/version/index.js +1 -1
- package/package.json +10 -9
package/dist/utils/index.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
export * from './arguments.js';
|
|
2
|
+
export * from './salt.js';
|
|
1
3
|
export * from './get-value.js';
|
|
2
4
|
export * from './data-validators.js';
|
|
3
5
|
export * from './resolve-path.js';
|
|
4
6
|
export * from './sleep.js';
|
|
5
7
|
export * from './error-handler.js';
|
|
8
|
+
export * from './get-commands.js';
|
|
9
|
+
export * from './logging/index.js';
|
|
10
|
+
export * from './spinner/index.js';
|
|
6
11
|
export * from './transactions/index.js';
|
|
7
12
|
export * from './proof/index.js';
|
|
13
|
+
export * from './get-deposit-data-root.js';
|
|
8
14
|
export * from './prompts/index.js';
|
|
9
|
-
export * from './spinner/index.js';
|
|
10
15
|
export * from './read-programs-by-abi.js';
|
|
11
|
-
export * from './get-commands.js';
|
|
12
|
-
export * from './get-deposit-data-root.js';
|
|
13
|
-
export * from './arguments.js';
|
|
14
16
|
export * from './report/index.js';
|
|
15
17
|
export * from './health/index.js';
|
|
16
|
-
export * from './logging/index.js';
|
|
17
18
|
export * from './fetch-cl.js';
|
|
18
19
|
export * from './ipfs.js';
|
|
19
20
|
export * from './commands/index.js';
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
package/dist/utils/ipfs.d.ts
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import { CID, Version } from 'multiformats/cid';
|
|
2
2
|
export declare const IPFS_GATEWAY = "https://ipfs.io/ipfs";
|
|
3
|
+
export declare const DEFAULT_IPFS_MAX_CONTENT_BYTES: number;
|
|
3
4
|
export type BigNumberType = 'bigint' | 'string';
|
|
4
5
|
export type ReportFetchArgs = {
|
|
5
6
|
cid: string;
|
|
6
7
|
gateway?: string;
|
|
7
8
|
bigNumberType?: BigNumberType;
|
|
9
|
+
maxBytes?: number;
|
|
8
10
|
};
|
|
9
11
|
export declare const fetchIPFS: <T>(args: ReportFetchArgs, cache?: boolean) => Promise<T>;
|
|
10
12
|
export declare const fetchIPFSDirect: <T>(args: ReportFetchArgs) => Promise<T>;
|
|
11
13
|
export declare const fetchIPFSBuffer: (args: ReportFetchArgs) => Promise<Uint8Array>;
|
|
12
14
|
export declare const calculateIPFSAddCID: (fileContent: Uint8Array, version?: Version) => Promise<CID>;
|
|
13
|
-
export declare const fetchIPFSDirectAndVerify: <T>(cid: string, gateway?: string) => Promise<{
|
|
15
|
+
export declare const fetchIPFSDirectAndVerify: <T>(cid: string, gateway?: string, maxBytes?: number) => Promise<{
|
|
14
16
|
json: T;
|
|
15
17
|
fileContent: Uint8Array;
|
|
16
18
|
}>;
|
|
17
|
-
export declare const fetchIPFSWithCacheAndVerify: <T>(cid: string, gateway?: string) => Promise<T>;
|
|
19
|
+
export declare const fetchIPFSWithCacheAndVerify: <T>(cid: string, gateway?: string, maxBytes?: number) => Promise<T>;
|
|
18
20
|
type PinToIPFSArgs = {
|
|
19
21
|
uploadUrl: string;
|
|
20
22
|
uploadAuthorization?: string;
|
package/dist/utils/ipfs.js
CHANGED
|
@@ -5,25 +5,92 @@ import jsonBigInt from 'json-bigint';
|
|
|
5
5
|
import fs from 'node:fs/promises';
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { logInfo, logTable } from './logging/console.js';
|
|
8
|
+
import { assertSafeUrl } from './data-validators.js';
|
|
9
|
+
import { parseEnvInt } from './env.js';
|
|
8
10
|
export const IPFS_GATEWAY = 'https://ipfs.io/ipfs';
|
|
11
|
+
// Max IPFS content size — guards against OOM from an oversized CID.
|
|
12
|
+
// Override: maxBytes arg > IPFS_MAX_CONTENT_BYTES env > this default.
|
|
13
|
+
export const DEFAULT_IPFS_MAX_CONTENT_BYTES = 20 * 1024 * 1024;
|
|
9
14
|
const IPFS_CACHE_DIR = path.resolve('ipfs-cache');
|
|
15
|
+
// arg > env > default
|
|
16
|
+
const resolveMaxBytes = (override) => {
|
|
17
|
+
if (typeof override === 'number' &&
|
|
18
|
+
Number.isFinite(override) &&
|
|
19
|
+
override > 0) {
|
|
20
|
+
return override;
|
|
21
|
+
}
|
|
22
|
+
return Math.max(1, parseEnvInt(process.env.IPFS_MAX_CONTENT_BYTES, DEFAULT_IPFS_MAX_CONTENT_BYTES));
|
|
23
|
+
};
|
|
24
|
+
// Cheap pre-check. Header may be absent or lie — streaming is the real limit.
|
|
25
|
+
const assertContentLengthWithinLimit = (response, maxBytes) => {
|
|
26
|
+
const declared = Number(response.headers?.get('content-length'));
|
|
27
|
+
if (Number.isFinite(declared) && declared > maxBytes) {
|
|
28
|
+
throw new Error(`IPFS content too large: ${declared} bytes exceeds limit of ${maxBytes} bytes`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
// Join collected byte chunks into a single buffer.
|
|
32
|
+
const concatChunks = (chunks, total) => {
|
|
33
|
+
const out = new Uint8Array(total);
|
|
34
|
+
let offset = 0;
|
|
35
|
+
for (const chunk of chunks) {
|
|
36
|
+
out.set(chunk, offset);
|
|
37
|
+
offset += chunk.byteLength;
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
};
|
|
41
|
+
// Read in chunks, abort once total exceeds maxBytes (before full buffering).
|
|
42
|
+
const streamBodyWithLimit = async (body, maxBytes) => {
|
|
43
|
+
const reader = body.getReader();
|
|
44
|
+
const chunks = [];
|
|
45
|
+
let total = 0;
|
|
46
|
+
try {
|
|
47
|
+
while (true) {
|
|
48
|
+
const { done, value } = await reader.read();
|
|
49
|
+
if (done)
|
|
50
|
+
break;
|
|
51
|
+
if (!value)
|
|
52
|
+
continue;
|
|
53
|
+
total += value.byteLength;
|
|
54
|
+
if (total > maxBytes) {
|
|
55
|
+
await reader.cancel();
|
|
56
|
+
throw new Error(`IPFS content exceeds size limit of ${maxBytes} bytes`);
|
|
57
|
+
}
|
|
58
|
+
chunks.push(value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
reader.releaseLock?.();
|
|
63
|
+
}
|
|
64
|
+
return concatChunks(chunks, total);
|
|
65
|
+
};
|
|
66
|
+
// Streaming is the real limit; Content-Length is just an early reject.
|
|
67
|
+
// Fail closed if there's no body — a real fetch always has one for content.
|
|
68
|
+
const readBodyWithLimit = async (response, maxBytes) => {
|
|
69
|
+
assertContentLengthWithinLimit(response, maxBytes);
|
|
70
|
+
if (!response.body) {
|
|
71
|
+
throw new Error('IPFS response has no readable body');
|
|
72
|
+
}
|
|
73
|
+
return streamBodyWithLimit(response.body, maxBytes);
|
|
74
|
+
};
|
|
10
75
|
export const fetchIPFS = async (args, cache = true) => {
|
|
11
|
-
const { cid, gateway = IPFS_GATEWAY } = args;
|
|
76
|
+
const { cid, gateway = IPFS_GATEWAY, maxBytes } = args;
|
|
12
77
|
if (cache)
|
|
13
|
-
return fetchIPFSWithCacheAndVerify(cid, gateway);
|
|
14
|
-
const { json } = await fetchIPFSDirectAndVerify(cid, gateway);
|
|
78
|
+
return fetchIPFSWithCacheAndVerify(cid, gateway, maxBytes);
|
|
79
|
+
const { json } = await fetchIPFSDirectAndVerify(cid, gateway, maxBytes);
|
|
15
80
|
return json;
|
|
16
81
|
};
|
|
17
82
|
// Fetching content by CID through IPFS gateway
|
|
18
83
|
export const fetchIPFSDirect = async (args) => {
|
|
19
84
|
const { cid, gateway = IPFS_GATEWAY, bigNumberType = 'string' } = args;
|
|
85
|
+
assertSafeUrl(gateway, 'IPFS gateway');
|
|
86
|
+
const maxBytes = resolveMaxBytes(args.maxBytes);
|
|
20
87
|
const ipfsUrl = `${gateway}/${cid}`;
|
|
21
88
|
logInfo('Fetching content from', ipfsUrl);
|
|
22
89
|
const response = await fetch(ipfsUrl);
|
|
23
90
|
if (!response.ok) {
|
|
24
91
|
throw new Error(`Failed to fetch IPFS content: ${response.statusText}`);
|
|
25
92
|
}
|
|
26
|
-
const raw = await response
|
|
93
|
+
const raw = new TextDecoder().decode(await readBodyWithLimit(response, maxBytes));
|
|
27
94
|
const params = bigNumberType === 'bigint'
|
|
28
95
|
? { useNativeBigInt: true }
|
|
29
96
|
: { storeAsString: true };
|
|
@@ -33,14 +100,15 @@ export const fetchIPFSDirect = async (args) => {
|
|
|
33
100
|
// Fetching buffer content by CID through IPFS gateway
|
|
34
101
|
export const fetchIPFSBuffer = async (args) => {
|
|
35
102
|
const { cid, gateway = IPFS_GATEWAY } = args;
|
|
103
|
+
assertSafeUrl(gateway, 'IPFS gateway');
|
|
104
|
+
const maxBytes = resolveMaxBytes(args.maxBytes);
|
|
36
105
|
const ipfsUrl = `${gateway}/${cid}`;
|
|
37
106
|
logInfo('Fetching content from', ipfsUrl);
|
|
38
107
|
const response = await fetch(ipfsUrl);
|
|
39
108
|
if (!response.ok) {
|
|
40
109
|
throw new Error(`Failed to fetch IPFS content: ${response.statusText}`);
|
|
41
110
|
}
|
|
42
|
-
|
|
43
|
-
return new Uint8Array(buffer);
|
|
111
|
+
return readBodyWithLimit(response, maxBytes);
|
|
44
112
|
};
|
|
45
113
|
// Recalculate CID using full UnixFS logic (like `ipfs add`)
|
|
46
114
|
export const calculateIPFSAddCID = async (fileContent, version = 0) => {
|
|
@@ -60,9 +128,15 @@ export const calculateIPFSAddCID = async (fileContent, version = 0) => {
|
|
|
60
128
|
return lastCid;
|
|
61
129
|
};
|
|
62
130
|
// Downloading file from IPFS and checking its integrity
|
|
63
|
-
export const fetchIPFSDirectAndVerify = async (cid, gateway = IPFS_GATEWAY) => {
|
|
64
|
-
|
|
65
|
-
|
|
131
|
+
export const fetchIPFSDirectAndVerify = async (cid, gateway = IPFS_GATEWAY, maxBytes) => {
|
|
132
|
+
let originalCID;
|
|
133
|
+
try {
|
|
134
|
+
originalCID = CID.parse(cid);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new Error(`Invalid IPFS CID: ${cid}`);
|
|
138
|
+
}
|
|
139
|
+
const fileContent = await fetchIPFSBuffer({ cid, gateway, maxBytes });
|
|
66
140
|
const calculatedCID = await calculateIPFSAddCID(fileContent, originalCID.version);
|
|
67
141
|
if (!calculatedCID.equals(originalCID)) {
|
|
68
142
|
throw new Error(`❌ File hash mismatch! Expected ${originalCID}, but got ${calculatedCID}`);
|
|
@@ -83,7 +157,14 @@ export const fetchIPFSDirectAndVerify = async (cid, gateway = IPFS_GATEWAY) => {
|
|
|
83
157
|
json,
|
|
84
158
|
};
|
|
85
159
|
};
|
|
86
|
-
export const fetchIPFSWithCacheAndVerify = async (cid, gateway = IPFS_GATEWAY) => {
|
|
160
|
+
export const fetchIPFSWithCacheAndVerify = async (cid, gateway = IPFS_GATEWAY, maxBytes) => {
|
|
161
|
+
assertSafeUrl(gateway, 'IPFS gateway');
|
|
162
|
+
try {
|
|
163
|
+
CID.parse(cid);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
throw new Error(`Invalid IPFS CID: ${cid}`);
|
|
167
|
+
}
|
|
87
168
|
await fs.mkdir(IPFS_CACHE_DIR, { recursive: true });
|
|
88
169
|
const cacheFile = path.join(IPFS_CACHE_DIR, `${cid}.json`);
|
|
89
170
|
try {
|
|
@@ -93,12 +174,13 @@ export const fetchIPFSWithCacheAndVerify = async (cid, gateway = IPFS_GATEWAY) =
|
|
|
93
174
|
}
|
|
94
175
|
catch {
|
|
95
176
|
// Not in cache, fetch from IPFS
|
|
96
|
-
const { json } = await fetchIPFSDirectAndVerify(cid, gateway);
|
|
177
|
+
const { json } = await fetchIPFSDirectAndVerify(cid, gateway, maxBytes);
|
|
97
178
|
await fs.writeFile(cacheFile, JSON.stringify(json), 'utf8');
|
|
98
179
|
return json;
|
|
99
180
|
}
|
|
100
181
|
};
|
|
101
182
|
export const pinToIPFS = async ({ fileContent, fileName = 'file.json', uploadAuthorization, uploadUrl, }) => {
|
|
183
|
+
assertSafeUrl(uploadUrl, 'IPFS upload URL');
|
|
102
184
|
const blob = new Blob([fileContent]);
|
|
103
185
|
const file = new File([blob], fileName, {
|
|
104
186
|
type: 'application/json',
|
package/dist/utils/ipfs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../utils/ipfs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../utils/ipfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ type CreateTableArgs = {
|
|
|
4
4
|
data?: (VerticalTableRow | HorizontalTableRow | CrossTableRow)[];
|
|
5
5
|
params?: TableConstructorOptions;
|
|
6
6
|
csvPath?: string;
|
|
7
|
+
explorerBaseUrl?: string;
|
|
7
8
|
};
|
|
8
9
|
export declare const openJsonLogging: () => void;
|
|
9
10
|
export declare const closeJsonLogging: () => void;
|
|
@@ -2,6 +2,8 @@ import Table from 'cli-table3';
|
|
|
2
2
|
import { program } from '../../command/index.js';
|
|
3
3
|
import { getColoredLog, TABLE_PARAMS } from './constants.js';
|
|
4
4
|
import { exportCsv } from '../csv-file.js';
|
|
5
|
+
import { isAddress } from 'viem';
|
|
6
|
+
import { CHAIN_CACHE } from '../../configs/deployed.js';
|
|
5
7
|
const bigIntStringify = (value) => {
|
|
6
8
|
return JSON.stringify(value, (_key, value) => {
|
|
7
9
|
if (typeof value === 'bigint') {
|
|
@@ -62,8 +64,12 @@ export const createConsole = (headMessage, type = 'info') => {
|
|
|
62
64
|
}
|
|
63
65
|
};
|
|
64
66
|
};
|
|
67
|
+
const createEtherscanAddressTerminalLink = (address, scanBaseUrl) => {
|
|
68
|
+
const url = `${scanBaseUrl}/address/${address}`;
|
|
69
|
+
return `\u001B]8;;${url}\u0007${address}\u001B]8;;\u0007`;
|
|
70
|
+
};
|
|
65
71
|
const createTable = (headMessage) => (args) => {
|
|
66
|
-
const { data, params, csvPath } = args;
|
|
72
|
+
const { data, params, csvPath, explorerBaseUrl = CHAIN_CACHE.currentChain?.blockExplorers.default.url, } = args;
|
|
67
73
|
if (headMessage && !program.opts().json)
|
|
68
74
|
console.info(`\n${getColoredLog(headMessage, headMessage + ':')}`);
|
|
69
75
|
if (!data)
|
|
@@ -78,7 +84,22 @@ const createTable = (headMessage) => (args) => {
|
|
|
78
84
|
}
|
|
79
85
|
else {
|
|
80
86
|
const table = new Table({ ...TABLE_PARAMS, ...params });
|
|
81
|
-
|
|
87
|
+
let dataToRender = data;
|
|
88
|
+
if (explorerBaseUrl) {
|
|
89
|
+
dataToRender = data.map((row) => {
|
|
90
|
+
if (Array.isArray(row)) {
|
|
91
|
+
row = row.map((cell) => {
|
|
92
|
+
if (typeof cell === 'string' &&
|
|
93
|
+
isAddress(cell, { strict: false })) {
|
|
94
|
+
return createEtherscanAddressTerminalLink(cell, explorerBaseUrl);
|
|
95
|
+
}
|
|
96
|
+
return cell;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return row;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
table.push(...dataToRender);
|
|
82
103
|
console.info(table.toString());
|
|
83
104
|
}
|
|
84
105
|
if (csvPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../utils/logging/console.ts"],"names":[],"mappings":"AAAA,OAAO,KAKN,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,aAAa,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../utils/logging/console.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AbiFunction } from 'viem';
|
|
2
|
+
/**
|
|
3
|
+
* Parses an array of raw string arguments into typed values
|
|
4
|
+
* according to the given ABI function definition.
|
|
5
|
+
*
|
|
6
|
+
* @param methodAbi - The viem `AbiFunction` describing the target method.
|
|
7
|
+
* @param args - Raw string arguments in the same order as `methodAbi.inputs`.
|
|
8
|
+
* @returns Typed argument array ready to pass to viem's `encodeFunctionData`.
|
|
9
|
+
* @throws If the argument count doesn't match or any value fails to parse.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { parseAbi } from "viem";
|
|
14
|
+
* import { parseAbiArguments } from "./parseAbiArguments";
|
|
15
|
+
*
|
|
16
|
+
* const [method] = parseAbi(["function transfer(address to, uint256 amount)"]);
|
|
17
|
+
* const args = parseAbiArguments(method, [
|
|
18
|
+
* "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
|
|
19
|
+
* "1000000000000000000",
|
|
20
|
+
* ]);
|
|
21
|
+
* // => ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", 1000000000000000000n]
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare const parseAbiArguments: (methodAbi: AbiFunction, args: string[]) => unknown[];
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { isAddress, isHex, size as hexSize } from 'viem';
|
|
2
|
+
/**
|
|
3
|
+
* Parses a single string value into a typed value based on its Solidity ABI type.
|
|
4
|
+
* Uses viem's `isAddress` and `isHex` for validation.
|
|
5
|
+
* Throws a descriptive error if parsing fails.
|
|
6
|
+
*/
|
|
7
|
+
const toArgString = (v) => typeof v === 'string' ? v : JSON.stringify(v);
|
|
8
|
+
const parseAbiArgument = (param, value) => {
|
|
9
|
+
const { type } = param;
|
|
10
|
+
try {
|
|
11
|
+
// --- address ---
|
|
12
|
+
if (type === 'address') {
|
|
13
|
+
if (!isAddress(value)) {
|
|
14
|
+
throw new Error(`Invalid address: "${value}"`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
// --- bool ---
|
|
19
|
+
if (type === 'bool') {
|
|
20
|
+
if (value === 'true')
|
|
21
|
+
return true;
|
|
22
|
+
if (value === 'false')
|
|
23
|
+
return false;
|
|
24
|
+
throw new Error(`Invalid bool value: "${value}". Expected "true" or "false"`);
|
|
25
|
+
}
|
|
26
|
+
// --- uint / int ---
|
|
27
|
+
if (/^(uint|int)\d*$/.test(type)) {
|
|
28
|
+
const n = BigInt(value);
|
|
29
|
+
if (type.startsWith('uint') && n < 0n) {
|
|
30
|
+
throw new Error(`Unsigned integer cannot be negative: "${value}"`);
|
|
31
|
+
}
|
|
32
|
+
return n;
|
|
33
|
+
}
|
|
34
|
+
// --- bytes1 … bytes32 (fixed-size) ---
|
|
35
|
+
const fixedBytesMatch = type.match(/^bytes(\d+)$/);
|
|
36
|
+
if (fixedBytesMatch) {
|
|
37
|
+
const expectedSize = Number.parseInt(fixedBytesMatch[1], 10);
|
|
38
|
+
if (!isHex(value)) {
|
|
39
|
+
throw new Error(`Invalid hex for ${type}: "${value}"`);
|
|
40
|
+
}
|
|
41
|
+
const actualSize = hexSize(value);
|
|
42
|
+
if (actualSize !== expectedSize) {
|
|
43
|
+
throw new Error(`Expected ${expectedSize} bytes for ${type}, got ${actualSize}`);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
// --- bytes (dynamic) ---
|
|
48
|
+
if (type === 'bytes') {
|
|
49
|
+
if (!isHex(value)) {
|
|
50
|
+
throw new Error(`Invalid hex for bytes: "${value}"`);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
// --- string ---
|
|
55
|
+
if (type === 'string') {
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
// --- fixed-size array, e.g. uint256[3] ---
|
|
59
|
+
const fixedArrayMatch = type.match(/^(.+)\[(\d+)\]$/);
|
|
60
|
+
if (fixedArrayMatch) {
|
|
61
|
+
const innerType = fixedArrayMatch[1];
|
|
62
|
+
const expectedLength = Number.parseInt(fixedArrayMatch[2], 10);
|
|
63
|
+
const parsed = JSON.parse(value);
|
|
64
|
+
if (!Array.isArray(parsed)) {
|
|
65
|
+
throw new TypeError(`Expected a JSON array for ${type}, got: "${value}"`);
|
|
66
|
+
}
|
|
67
|
+
if (parsed.length !== expectedLength) {
|
|
68
|
+
throw new Error(`Expected array of length ${expectedLength} for ${type}, got length ${parsed.length}`);
|
|
69
|
+
}
|
|
70
|
+
return parsed.map((item, i) => parseAbiArgument({ ...param, type: innerType, name: `${param.name}[${i}]` }, toArgString(item)));
|
|
71
|
+
}
|
|
72
|
+
// --- dynamic array, e.g. uint256[] ---
|
|
73
|
+
const dynamicArrayMatch = type.match(/^(.+)\[\]$/);
|
|
74
|
+
if (dynamicArrayMatch) {
|
|
75
|
+
const innerType = dynamicArrayMatch[1];
|
|
76
|
+
const parsed = JSON.parse(value);
|
|
77
|
+
if (!Array.isArray(parsed)) {
|
|
78
|
+
throw new TypeError(`Expected a JSON array for ${type}, got: "${value}"`);
|
|
79
|
+
}
|
|
80
|
+
return parsed.map((item, i) => parseAbiArgument({ ...param, type: innerType, name: `${param.name}[${i}]` }, toArgString(item)));
|
|
81
|
+
}
|
|
82
|
+
// --- tuple (struct) ---
|
|
83
|
+
if (type === 'tuple') {
|
|
84
|
+
const tupleParam = param;
|
|
85
|
+
if (!tupleParam.components || tupleParam.components.length === 0) {
|
|
86
|
+
throw new Error(`Tuple parameter "${param.name}" has no components defined in ABI`);
|
|
87
|
+
}
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
parsed = JSON.parse(value);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new Error(`Invalid JSON for tuple "${param.name}": "${value}"`);
|
|
94
|
+
}
|
|
95
|
+
// Accept array representation
|
|
96
|
+
if (Array.isArray(parsed)) {
|
|
97
|
+
if (parsed.length !== tupleParam.components.length) {
|
|
98
|
+
throw new Error(`Tuple "${param.name}" expects ${tupleParam.components.length} fields, got ${parsed.length}`);
|
|
99
|
+
}
|
|
100
|
+
return tupleParam.components.reduce((acc, comp, i) => {
|
|
101
|
+
acc[comp.name ?? i] = parseAbiArgument(comp, toArgString(parsed[i]));
|
|
102
|
+
return acc;
|
|
103
|
+
}, {});
|
|
104
|
+
}
|
|
105
|
+
// Accept object representation
|
|
106
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
107
|
+
return tupleParam.components.reduce((acc, comp) => {
|
|
108
|
+
const key = comp.name;
|
|
109
|
+
if (!key) {
|
|
110
|
+
throw new Error(`Tuple component has no name`);
|
|
111
|
+
}
|
|
112
|
+
if (!(key in parsed)) {
|
|
113
|
+
throw new Error(`Missing field "${key}" in tuple "${param.name}"`);
|
|
114
|
+
}
|
|
115
|
+
acc[key] = parseAbiArgument(comp, toArgString(parsed[key]));
|
|
116
|
+
return acc;
|
|
117
|
+
}, {});
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`Invalid value for tuple "${param.name}": expected JSON object or array`);
|
|
120
|
+
}
|
|
121
|
+
throw new Error(`Unsupported ABI type: "${type}"`);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
if (err instanceof Error && !err.message.startsWith(`[param:`)) {
|
|
125
|
+
throw new Error(`[param: "${param.name ?? '<unnamed>'}", type: "${type}"] ${err.message}`);
|
|
126
|
+
}
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Parses an array of raw string arguments into typed values
|
|
132
|
+
* according to the given ABI function definition.
|
|
133
|
+
*
|
|
134
|
+
* @param methodAbi - The viem `AbiFunction` describing the target method.
|
|
135
|
+
* @param args - Raw string arguments in the same order as `methodAbi.inputs`.
|
|
136
|
+
* @returns Typed argument array ready to pass to viem's `encodeFunctionData`.
|
|
137
|
+
* @throws If the argument count doesn't match or any value fails to parse.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* import { parseAbi } from "viem";
|
|
142
|
+
* import { parseAbiArguments } from "./parseAbiArguments";
|
|
143
|
+
*
|
|
144
|
+
* const [method] = parseAbi(["function transfer(address to, uint256 amount)"]);
|
|
145
|
+
* const args = parseAbiArguments(method, [
|
|
146
|
+
* "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
|
|
147
|
+
* "1000000000000000000",
|
|
148
|
+
* ]);
|
|
149
|
+
* // => ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", 1000000000000000000n]
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
export const parseAbiArguments = (methodAbi, args) => {
|
|
153
|
+
const { inputs } = methodAbi;
|
|
154
|
+
if (args.length !== inputs.length) {
|
|
155
|
+
throw new Error(`Argument count mismatch for "${methodAbi.name}": expected ${inputs.length}, got ${args.length}`);
|
|
156
|
+
}
|
|
157
|
+
return inputs.map((input, i) => parseAbiArgument(input, args[i]));
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=parse-abi-arguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-abi-arguments.js","sourceRoot":"","sources":["../../utils/parse-abi-arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const promptAccount: (accountInput: string | undefined, message: string) => Promise<`0x${string}`>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { addressPrompt, stringToAddress } from '../index.js';
|
|
2
|
+
export const promptAccount = async (accountInput, message) => {
|
|
3
|
+
let account;
|
|
4
|
+
if (!accountInput) {
|
|
5
|
+
const accountPrompt = await addressPrompt(message, 'account');
|
|
6
|
+
account = stringToAddress(accountPrompt.account);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
account = stringToAddress(accountInput);
|
|
10
|
+
}
|
|
11
|
+
return account;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../utils/prompts/account.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,YAAgC,EAChC,OAAe,EACf,EAAE;IACF,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9D,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -4,4 +4,7 @@ export * from './vault.js';
|
|
|
4
4
|
export * from './operations.js';
|
|
5
5
|
export * from './confirmations.js';
|
|
6
6
|
export * from './mint-burn/index.js';
|
|
7
|
+
export * from './strategy.js';
|
|
8
|
+
export * from './account.js';
|
|
9
|
+
export * from './timelock-roles.js';
|
|
7
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../utils/prompts/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../utils/prompts/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
|