@railgun-community/shared-models 6.2.1 → 6.2.4
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/models/proof-of-innocence.d.ts +1 -0
- package/dist/models/proof-of-innocence.js.map +1 -1
- package/dist/utils/available-rpc.js +4 -4
- package/dist/utils/available-rpc.js.map +1 -1
- package/dist/utils/error.d.ts +1 -1
- package/dist/utils/error.js +27 -25
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/fallback-provider.js +4 -4
- package/dist/utils/fallback-provider.js.map +1 -1
- package/package.json +1 -1
|
@@ -38,6 +38,7 @@ export declare enum POIEventType {
|
|
|
38
38
|
export type POIEventLengths = Record<POIEventType, number>;
|
|
39
39
|
export type POIListStatus = {
|
|
40
40
|
poiEventLengths: POIEventLengths;
|
|
41
|
+
listProviderPOIEventQueueLength: number;
|
|
41
42
|
pendingTransactProofs: number;
|
|
42
43
|
blockedShields: number;
|
|
43
44
|
historicalMerklerootsLength: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof-of-innocence.js","sourceRoot":"","sources":["../../src/models/proof-of-innocence.ts"],"names":[],"mappings":";;;AAmCA,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,qCAAqB,CAAA;IACrB,qCAAqB,CAAA;IACrB,iDAAiC,CAAA;AACnC,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;
|
|
1
|
+
{"version":3,"file":"proof-of-innocence.js","sourceRoot":"","sources":["../../src/models/proof-of-innocence.ts"],"names":[],"mappings":";;;AAmCA,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,qCAAqB,CAAA;IACrB,qCAAqB,CAAA;IACrB,iDAAiC,CAAA;AACnC,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AA4DD,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,0CAAiB,CAAA;IACjB,8CAAqB,CAAA;IACrB,8CAAqB,CAAA;AACvB,CAAC,EAJW,qBAAqB,qCAArB,qBAAqB,QAIhC;AAoCD,IAAY,SASX;AATD,WAAY,SAAS;IACnB,6BAA6B;IAC7B,4BAAe,CAAA;IACf,iBAAiB;IACjB,4CAA+B,CAAA;IAC/B,2DAA2D;IAC3D,8CAAiC,CAAA;IACjC,sEAAsE;IACtE,gCAAmB,CAAA;AACrB,CAAC,EATW,SAAS,yBAAT,SAAS,QASpB;AAyCY,QAAA,sBAAsB,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS;AAC3C,QAAA,2BAA2B,GAAG,UAAU,CAAC;AACzC,QAAA,+BAA+B,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY;AACtD,QAAA,oCAAoC,GAAG,cAAc,CAAC;AAEnE,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,gCAAiB,CAAA;AACnB,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB;AASY,QAAA,kBAAkB,GAAc;IAC3C;QACE,GAAG,EAAE,kEAAkE;QACvE,IAAI,EAAE,WAAW,CAAC,MAAM;QACxB,IAAI,EAAE,gCAAgC;QACtC,WAAW,EACT,2KAA2K;KAC9K;CACF,CAAC","sourcesContent":["import { TXIDVersion } from './engine';\nimport { NetworkName } from './network-config';\nimport { PreTransactionPOIsPerTxidLeafPerList } from './response-types';\n\nexport type TransactProofData = {\n snarkProof: SnarkProof;\n poiMerkleroots: string[];\n txidMerkleroot: string;\n txidMerklerootIndex: number;\n blindedCommitmentsOut: string[];\n railgunTxidIfHasUnshield: string;\n};\n\nexport type SnarkProof = {\n pi_a: [string, string];\n pi_b: [[string, string], [string, string]];\n pi_c: [string, string];\n};\n\nexport type MerkleProof = {\n leaf: string; // hash of commitment\n elements: string[];\n indices: string;\n root: string;\n};\n\nexport type ShieldQueueStatus = {\n unknown: number;\n pending: number;\n allowed: number;\n blocked: number;\n addedPOI: number;\n latestShield: Optional<string>;\n};\n\nexport enum POIEventType {\n Shield = 'Shield',\n Transact = 'Transact',\n Unshield = 'Unshield',\n LegacyTransact = 'LegacyTransact',\n}\n\nexport type POIEventLengths = Record<POIEventType, number>;\n\nexport type POIListStatus = {\n poiEventLengths: POIEventLengths;\n listProviderPOIEventQueueLength: number;\n pendingTransactProofs: number;\n blockedShields: number;\n historicalMerklerootsLength: number;\n latestHistoricalMerkleroot: string;\n};\n\nexport type GetTransactProofsParams = {\n txidVersion: TXIDVersion;\n bloomFilterSerialized: string;\n listKey: string;\n};\n\nexport type GetBlockedShieldsParams = {\n txidVersion: TXIDVersion;\n bloomFilterSerialized: string;\n listKey: string;\n};\n\nexport type LegacyTransactProofData = {\n txidIndex: string;\n npk: string;\n value: string;\n tokenHash: string;\n blindedCommitment: string;\n};\n\nexport type SingleCommitmentProofsData = {\n commitment: string;\n npk: string;\n utxoTreeIn: number;\n utxoTreeOut: number;\n utxoPositionOut: number;\n railgunTxid: string;\n pois: PreTransactionPOIsPerTxidLeafPerList;\n};\n\nexport type SubmitTransactProofParams = {\n txidVersion: TXIDVersion;\n listKey: string;\n transactProofData: TransactProofData;\n};\n\nexport type SubmitLegacyTransactProofParams = {\n txidVersion: TXIDVersion;\n listKeys: string[];\n legacyTransactProofDatas: LegacyTransactProofData[];\n};\n\nexport type SubmitSingleCommitmentProofsParams = {\n txidVersion: TXIDVersion;\n singleCommitmentProofsData: SingleCommitmentProofsData;\n};\n\nexport enum BlindedCommitmentType {\n Shield = 'Shield',\n Transact = 'Transact',\n Unshield = 'Unshield',\n}\n\nexport type ValidatePOIMerklerootsParams = {\n txidVersion: TXIDVersion;\n listKey: string;\n poiMerkleroots: string[];\n};\n\nexport type BlindedCommitmentData = {\n blindedCommitment: string;\n type: BlindedCommitmentType;\n};\n\nexport type GetPOIsPerListParams = {\n txidVersion: TXIDVersion;\n listKeys: string[];\n blindedCommitmentDatas: BlindedCommitmentData[];\n};\n\nexport type GetMerkleProofsParams = {\n txidVersion: TXIDVersion;\n listKey: string;\n blindedCommitments: string[];\n};\n\nexport type ValidateTxidMerklerootParams = {\n txidVersion: TXIDVersion;\n tree: number;\n index: number;\n merkleroot: string;\n};\n\nexport type GetLatestValidatedRailgunTxidParams = {\n txidVersion: TXIDVersion;\n};\n\nexport enum POIStatus {\n // POI valdated in event list\n Valid = 'Valid',\n // Shield blocked\n ShieldBlocked = 'ShieldBlocked',\n // Transact/Unshield proof submitted, but not validated yet\n ProofSubmitted = 'ProofSubmitted',\n // Missing internal/external transact/unshield proof, or ShieldPending\n Missing = 'Missing',\n}\n\nexport type POIsPerList = {\n [listKey: string]: POIStatus;\n};\n\nexport type POIsPerListMap = {\n [blindedCommitment: string]: POIsPerList;\n};\n\nexport type TxidMerkletreeSyncStatus = {\n currentTxidIndex: number;\n currentMerkleroot: string;\n validatedTxidIndex: number;\n validatedMerkleroot: string;\n};\n\nexport type RailgunTxidStatus = {\n currentTxidIndex: Optional<number>;\n currentMerkleroot: Optional<string>;\n validatedTxidIndex: Optional<number>;\n validatedMerkleroot: Optional<string>;\n};\n\nexport type ValidatedRailgunTxidStatus = {\n validatedTxidIndex: Optional<number>;\n validatedMerkleroot: Optional<string>;\n};\n\nexport type NodeStatusAllNetworks = {\n listKeys: string[];\n forNetwork: Partial<Record<NetworkName, NodeStatusForNetwork>>;\n};\n\nexport type NodeStatusForNetwork = {\n txidStatus: RailgunTxidStatus;\n shieldQueueStatus: ShieldQueueStatus;\n listStatuses: Record<string, POIListStatus>;\n legacyTransactProofs: number;\n};\n\nexport const POI_SHIELD_PENDING_SEC = 60 * 60; // 1 hour\nexport const POI_SHIELD_PENDING_SEC_TEXT = 'One hour';\nexport const POI_SHIELD_PENDING_SEC_TEST_NET = 5 * 60; // 5 minutes\nexport const POI_SHIELD_PENDING_SEC_TEST_NET_TEXT = 'Five minutes';\n\nexport enum POIListType {\n Active = 'Active',\n Gather = 'Gather',\n}\n\nexport type POIList = {\n key: string;\n type: POIListType;\n name: string;\n description: string;\n};\n\nexport const POI_REQUIRED_LISTS: POIList[] = [\n {\n key: 'efc6ddb59c098a13fb2b618fdae94c1c3a807abc8fb1837c93620c9143ee9e88',\n type: POIListType.Active,\n name: 'Chainalysis OFAC Sanctions API',\n description:\n 'API which is used to restrict bad actors designated by the US Department of the Treasury. See: https://www.chainalysis.com/free-cryptocurrency-sanctions-screening-tools.',\n },\n];\n"]}
|
|
@@ -46,12 +46,12 @@ const getBlockNumber = async (chainId, provider, logError) => {
|
|
|
46
46
|
}
|
|
47
47
|
return block.number;
|
|
48
48
|
}
|
|
49
|
-
catch (
|
|
50
|
-
if (!(
|
|
51
|
-
throw
|
|
49
|
+
catch (cause) {
|
|
50
|
+
if (!(cause instanceof Error)) {
|
|
51
|
+
throw new Error('Non-error thrown from getBlockNumber', { cause });
|
|
52
52
|
}
|
|
53
53
|
rpcProvider.destroy();
|
|
54
|
-
logError(
|
|
54
|
+
logError(cause.message);
|
|
55
55
|
return undefined;
|
|
56
56
|
}
|
|
57
57
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"available-rpc.js","sourceRoot":"","sources":["../../src/utils/available-rpc.ts"],"names":[],"mappings":";;;AAAA,yCAAyC;AACzC,mCAAkD;AAElD,qCAA+C;AAC/C,yCAA4C;AAI5C,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC;;;GAGG;AACI,MAAM,yBAAyB,GAAG,KAAK,EAC5C,OAAe,EACf,aAA6B,EAC7B,QAAkB,EACO,EAAE;IAC3B,MAAM,YAAY,GAAuB,MAAM,OAAO,CAAC,GAAG,CACxD,aAAa,CAAC,GAAG,CACf,KAAK,EAAC,YAAY,EAAC,EAAE,CACnB,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACjE,CACF,CAAC;IAEF,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAC7C,WAAW,CAAC,EAAE,CAAC,WAAW,IAAI,IAAI,IAAI,WAAW,GAAG,CAAC,CAC1C,CAAC;IACd,MAAM,iBAAiB,GAAG,IAAA,4BAAmB,EAAC,mBAAmB,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,iBAAiB,GAAG,GAAG,CAAC;IAChD,MAAM,eAAe,GAAG,iBAAiB,GAAG,GAAG,CAAC;IAEhD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,QAAQ,CACN,+BAA+B,YAAY,CAAC,QAAQ,mBAAmB,CACxE,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QACD,IAAI,WAAW,GAAG,eAAe,EAAE;YACjC,QAAQ,CACN,+BAA+B,YAAY,CAAC,QAAQ,mBAClD,iBAAiB,GAAG,WACtB,cAAc,CACf,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QACD,IAAI,WAAW,GAAG,eAAe,EAAE;YACjC,QAAQ,CACN,+BAA+B,YAAY,CAAC,QAAQ,mBAClD,WAAW,GAAG,iBAChB,cAAc,CACf,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA7CW,QAAA,yBAAyB,6BA6CpC;AAEF,MAAM,cAAc,GAAG,KAAK,EAC1B,OAAe,EACf,QAAgB,EAChB,QAAkB,EACS,EAAE;IAC7B,MAAM,OAAO,GAAG,gBAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,wBAAe,CAAC,QAAQ,EAAE,OAAO,EAAE;QACzD,aAAa,EAAE,OAAO;KACvB,CAAC,CAAC;IACH,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAc,EAChC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC9B,uBAAuB,CACxB,CAAC;QACF,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SAClC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;KACrB;IAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"available-rpc.js","sourceRoot":"","sources":["../../src/utils/available-rpc.ts"],"names":[],"mappings":";;;AAAA,yCAAyC;AACzC,mCAAkD;AAElD,qCAA+C;AAC/C,yCAA4C;AAI5C,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC;;;GAGG;AACI,MAAM,yBAAyB,GAAG,KAAK,EAC5C,OAAe,EACf,aAA6B,EAC7B,QAAkB,EACO,EAAE;IAC3B,MAAM,YAAY,GAAuB,MAAM,OAAO,CAAC,GAAG,CACxD,aAAa,CAAC,GAAG,CACf,KAAK,EAAC,YAAY,EAAC,EAAE,CACnB,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACjE,CACF,CAAC;IAEF,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAC7C,WAAW,CAAC,EAAE,CAAC,WAAW,IAAI,IAAI,IAAI,WAAW,GAAG,CAAC,CAC1C,CAAC;IACd,MAAM,iBAAiB,GAAG,IAAA,4BAAmB,EAAC,mBAAmB,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,iBAAiB,GAAG,GAAG,CAAC;IAChD,MAAM,eAAe,GAAG,iBAAiB,GAAG,GAAG,CAAC;IAEhD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,QAAQ,CACN,+BAA+B,YAAY,CAAC,QAAQ,mBAAmB,CACxE,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QACD,IAAI,WAAW,GAAG,eAAe,EAAE;YACjC,QAAQ,CACN,+BAA+B,YAAY,CAAC,QAAQ,mBAClD,iBAAiB,GAAG,WACtB,cAAc,CACf,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QACD,IAAI,WAAW,GAAG,eAAe,EAAE;YACjC,QAAQ,CACN,+BAA+B,YAAY,CAAC,QAAQ,mBAClD,WAAW,GAAG,iBAChB,cAAc,CACf,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA7CW,QAAA,yBAAyB,6BA6CpC;AAEF,MAAM,cAAc,GAAG,KAAK,EAC1B,OAAe,EACf,QAAgB,EAChB,QAAkB,EACS,EAAE;IAC7B,MAAM,OAAO,GAAG,gBAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,wBAAe,CAAC,QAAQ,EAAE,OAAO,EAAE;QACzD,aAAa,EAAE,OAAO;KACvB,CAAC,CAAC;IACH,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAc,EAChC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC9B,uBAAuB,CACxB,CAAC;QACF,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SAClC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;KACrB;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;SACpE;QACD,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,OAAO,SAAS,CAAC;KAClB;AACH,CAAC,CAAC","sourcesContent":["/// <reference types=\"../types/global\" />\nimport { JsonRpcProvider, Network } from 'ethers';\nimport { ProviderJson } from './fallback-provider';\nimport { getUpperBoundMedian } from './median';\nimport { promiseTimeout } from './promises';\n\ntype LogError = (err: string) => void;\n\nconst BLOCK_NUMBER_TIMEOUT_MS = 5000;\n\n/**\n * Health checks ProviderJson inputs, and returns an array of available RPC providers.\n * Available means that they respond to getBlockNumber(), and they are +/- 100 blocks from the median.\n */\nexport const getAvailableProviderJSONs = async (\n chainId: number,\n providerJsons: ProviderJson[],\n logError: LogError,\n): Promise<ProviderJson[]> => {\n const blockNumbers: Optional<number>[] = await Promise.all(\n providerJsons.map(\n async providerJson =>\n await getBlockNumber(chainId, providerJson.provider, logError),\n ),\n );\n\n const nonZeroBlockNumbers = blockNumbers.filter(\n blockNumber => blockNumber != null && blockNumber > 0,\n ) as number[];\n const medianBlockNumber = getUpperBoundMedian(nonZeroBlockNumbers);\n const lowerBoundRange = medianBlockNumber - 100;\n const upperBoundRange = medianBlockNumber + 100;\n\n return providerJsons.filter((providerJson, index) => {\n const blockNumber = blockNumbers[index];\n if (blockNumber == null) {\n logError(\n `RPC Health Check failed for ${providerJson.provider}: No Block Number`,\n );\n return false;\n }\n if (blockNumber < lowerBoundRange) {\n logError(\n `RPC Health Check failed for ${providerJson.provider}: Block Number -${\n medianBlockNumber - blockNumber\n } from median`,\n );\n return false;\n }\n if (blockNumber > upperBoundRange) {\n logError(\n `RPC Health Check failed for ${providerJson.provider}: Block Number +${\n blockNumber - medianBlockNumber\n } from median`,\n );\n return false;\n }\n return true;\n });\n};\n\nconst getBlockNumber = async (\n chainId: number,\n provider: string,\n logError: LogError,\n): Promise<Optional<number>> => {\n const network = Network.from(chainId);\n const rpcProvider = new JsonRpcProvider(provider, network, {\n staticNetwork: network,\n });\n try {\n const block = await promiseTimeout(\n rpcProvider.getBlock('latest'),\n BLOCK_NUMBER_TIMEOUT_MS,\n );\n if (block == null) {\n throw new Error('Block is null');\n }\n return block.number;\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Non-error thrown from getBlockNumber', { cause });\n }\n rpcProvider.destroy();\n logError(cause.message);\n return undefined;\n }\n};\n"]}
|
package/dist/utils/error.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const sanitizeError: (
|
|
1
|
+
export declare const sanitizeError: (cause: Error) => Error;
|
package/dist/utils/error.js
CHANGED
|
@@ -8,78 +8,80 @@ const validAscii = (str) => {
|
|
|
8
8
|
// eslint-disable-next-line no-useless-escape
|
|
9
9
|
/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '');
|
|
10
10
|
};
|
|
11
|
-
const sanitizeError = (
|
|
12
|
-
if ((0, util_1.isDefined)(
|
|
13
|
-
const lowercaseMsg =
|
|
11
|
+
const sanitizeError = (cause) => {
|
|
12
|
+
if ((0, util_1.isDefined)(cause) && cause.message) {
|
|
13
|
+
const lowercaseMsg = cause.message.toLowerCase();
|
|
14
14
|
if (lowercaseMsg.includes('quorum') ||
|
|
15
15
|
lowercaseMsg.includes('could not connect to')) {
|
|
16
|
-
return new Error('Could not connect.');
|
|
16
|
+
return new Error('Could not connect.', { cause });
|
|
17
17
|
}
|
|
18
18
|
if (lowercaseMsg.includes('call revert exception')) {
|
|
19
|
-
return new Error('Failed to connect to RPC.');
|
|
19
|
+
return new Error('Failed to connect to RPC.', { cause });
|
|
20
20
|
}
|
|
21
21
|
if (lowercaseMsg.includes('already known')) {
|
|
22
|
-
return new Error('Transaction successful but ethers request for TXID failed.');
|
|
22
|
+
return new Error('Transaction successful but ethers request for TXID failed.', { cause });
|
|
23
23
|
}
|
|
24
24
|
if (lowercaseMsg.includes('missing revert data')) {
|
|
25
|
-
return new Error('RPC connection error.');
|
|
25
|
+
return new Error('RPC connection error.', { cause });
|
|
26
26
|
}
|
|
27
27
|
if (lowercaseMsg.includes('transaction may fail or may require manual gas limit')) {
|
|
28
|
-
return new Error('Unknown error. Transaction failed.');
|
|
28
|
+
return new Error('Unknown error. Transaction failed.', { cause });
|
|
29
29
|
}
|
|
30
30
|
if (lowercaseMsg.includes('replacement fee too low')) {
|
|
31
|
-
return new Error('Nonce is used in a pending transaction, and replacement fee is too low. Please increase your network fee to replace the pending transaction.');
|
|
31
|
+
return new Error('Nonce is used in a pending transaction, and replacement fee is too low. Please increase your network fee to replace the pending transaction.', { cause });
|
|
32
32
|
}
|
|
33
33
|
if (lowercaseMsg.includes('intrinsic gas too low')) {
|
|
34
|
-
return new Error('Gas price rejected. Please select a higher gas price or resubmit.');
|
|
34
|
+
return new Error('Gas price rejected. Please select a higher gas price or resubmit.', { cause });
|
|
35
35
|
}
|
|
36
36
|
if (lowercaseMsg.includes('transaction underpriced')) {
|
|
37
|
-
return new Error('Gas fee too low. Please select a higher gas price and resubmit.');
|
|
37
|
+
return new Error('Gas fee too low. Please select a higher gas price and resubmit.', { cause });
|
|
38
38
|
}
|
|
39
39
|
if (lowercaseMsg.includes('insufficient funds for intrinsic')) {
|
|
40
|
-
return new Error('Insufficient gas to process transaction.');
|
|
40
|
+
return new Error('Insufficient gas to process transaction.', { cause });
|
|
41
41
|
}
|
|
42
42
|
if (lowercaseMsg.includes('nonce has already been used')) {
|
|
43
43
|
return new Error(
|
|
44
44
|
// Do not change 'Nonce already used' string of Error message.
|
|
45
|
-
'Nonce already used: the transaction was already completed.');
|
|
45
|
+
'Nonce already used: the transaction was already completed.', { cause });
|
|
46
46
|
}
|
|
47
47
|
if (lowercaseMsg.includes('error while dialing dial tcp')) {
|
|
48
|
-
return new Error('Error while connecting to RPC provider. Please try again.');
|
|
48
|
+
return new Error('Error while connecting to RPC provider. Please try again.', { cause });
|
|
49
49
|
}
|
|
50
50
|
// Custom RAILGUN contract error messages
|
|
51
51
|
if (lowercaseMsg.includes('railgunsmartwallet')) {
|
|
52
52
|
if (lowercaseMsg.includes('invalid nft note value')) {
|
|
53
|
-
return new Error('RailgunSmartWallet: Invalid NFT Note Value.'
|
|
53
|
+
return new Error('RailgunSmartWallet: Invalid NFT Note Value.', {
|
|
54
|
+
cause,
|
|
55
|
+
});
|
|
54
56
|
}
|
|
55
57
|
if (lowercaseMsg.includes('unsupported token')) {
|
|
56
|
-
return new Error('RailgunSmartWallet: Unsupported Token. This token cannot interact with the RAILGUN contract.');
|
|
58
|
+
return new Error('RailgunSmartWallet: Unsupported Token. This token cannot interact with the RAILGUN contract.', { cause });
|
|
57
59
|
}
|
|
58
60
|
if (lowercaseMsg.includes('invalid note value')) {
|
|
59
|
-
return new Error('RailgunSmartWallet: Invalid Note Value. Please submit transaction with a corrected amount.');
|
|
61
|
+
return new Error('RailgunSmartWallet: Invalid Note Value. Please submit transaction with a corrected amount.', { cause });
|
|
60
62
|
}
|
|
61
63
|
if (lowercaseMsg.includes('invalid adapt contract as sender')) {
|
|
62
|
-
return new Error('RailgunSmartWallet: Invalid Adapt Contract as Sender. Please update your frontend to current Adapt module versions.');
|
|
64
|
+
return new Error('RailgunSmartWallet: Invalid Adapt Contract as Sender. Please update your frontend to current Adapt module versions.', { cause });
|
|
63
65
|
}
|
|
64
66
|
if (lowercaseMsg.includes('invalid merkle root')) {
|
|
65
|
-
return new Error('RailgunSmartWallet: Invalid Merkle Root. Please sync your balances and try again.');
|
|
67
|
+
return new Error('RailgunSmartWallet: Invalid Merkle Root. Please sync your balances and try again.', { cause });
|
|
66
68
|
}
|
|
67
69
|
if (lowercaseMsg.includes('note already spent')) {
|
|
68
|
-
return new Error('RailgunSmartWallet: Note Already Spent. Please sync your balances and try again.');
|
|
70
|
+
return new Error('RailgunSmartWallet: Note Already Spent. Please sync your balances and try again.', { cause });
|
|
69
71
|
}
|
|
70
72
|
if (lowercaseMsg.includes('invalid note ciphertext array length')) {
|
|
71
|
-
return new Error('RailgunSmartWallet: Invalid Note Ciphertext Array Length. Please sync balances and re-prove your transaction.');
|
|
73
|
+
return new Error('RailgunSmartWallet: Invalid Note Ciphertext Array Length. Please sync balances and re-prove your transaction.', { cause });
|
|
72
74
|
}
|
|
73
75
|
if (lowercaseMsg.includes('invalid withdraw note')) {
|
|
74
|
-
return new Error('RailgunSmartWallet: Invalid Unshield Note. Please sync balances and re-prove your transaction.');
|
|
76
|
+
return new Error('RailgunSmartWallet: Invalid Unshield Note. Please sync balances and re-prove your transaction.', { cause });
|
|
75
77
|
}
|
|
76
78
|
if (lowercaseMsg.includes('invalid snark proof')) {
|
|
77
|
-
return new Error('RailgunSmartWallet: Invalid Snark Proof. Please re-prove your transaction.');
|
|
79
|
+
return new Error('RailgunSmartWallet: Invalid Snark Proof. Please re-prove your transaction.', { cause });
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
|
-
return new Error(validAscii(
|
|
82
|
+
return new Error(validAscii(cause.message).replace(`:${STRING_PREFIX_AFTER_UNICODE_REPLACEMENT}`, ': '), { cause });
|
|
81
83
|
}
|
|
82
|
-
return new Error('Unknown error. Please try again.');
|
|
84
|
+
return new Error('Unknown error. Please try again.', { cause });
|
|
83
85
|
};
|
|
84
86
|
exports.sanitizeError = sanitizeError;
|
|
85
87
|
//# sourceMappingURL=error.js.map
|
package/dist/utils/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":";;;AAAA,iCAAmC;AAEnC,MAAM,uCAAuC,GAAG,KAAK,CAAC;AAEtD,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;IACjC,OAAO,GAAG,CAAC,OAAO;IAChB,6CAA6C;IAC7C,iEAAiE,EACjE,EAAE,CACH,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"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","sourcesContent":["import { isDefined } from './util';\n\nconst STRING_PREFIX_AFTER_UNICODE_REPLACEMENT = 'y %';\n\nconst validAscii = (str: string) => {\n return str.replace(\n // eslint-disable-next-line no-useless-escape\n /[^A-Za-z 0-9 \\.,\\?\"\"!@#\\$%\\^&\\*\\(\\)-_=\\+;:<>\\/\\\\\\|\\}\\{\\[\\]`~]*/g,\n '',\n );\n};\n\nexport const sanitizeError = (cause: Error): Error => {\n if (isDefined(cause) && cause.message) {\n const lowercaseMsg = cause.message.toLowerCase();\n if (\n lowercaseMsg.includes('quorum') ||\n lowercaseMsg.includes('could not connect to')\n ) {\n return new Error('Could not connect.', { cause });\n }\n if (lowercaseMsg.includes('call revert exception')) {\n return new Error('Failed to connect to RPC.', { cause });\n }\n if (lowercaseMsg.includes('already known')) {\n return new Error(\n 'Transaction successful but ethers request for TXID failed.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('missing revert data')) {\n return new Error('RPC connection error.', { cause });\n }\n if (\n lowercaseMsg.includes(\n 'transaction may fail or may require manual gas limit',\n )\n ) {\n return new Error('Unknown error. Transaction failed.', { cause });\n }\n if (lowercaseMsg.includes('replacement fee too low')) {\n return new Error(\n 'Nonce is used in a pending transaction, and replacement fee is too low. Please increase your network fee to replace the pending transaction.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('intrinsic gas too low')) {\n return new Error(\n 'Gas price rejected. Please select a higher gas price or resubmit.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('transaction underpriced')) {\n return new Error(\n 'Gas fee too low. Please select a higher gas price and resubmit.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('insufficient funds for intrinsic')) {\n return new Error('Insufficient gas to process transaction.', { cause });\n }\n if (lowercaseMsg.includes('nonce has already been used')) {\n return new Error(\n // Do not change 'Nonce already used' string of Error message.\n 'Nonce already used: the transaction was already completed.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('error while dialing dial tcp')) {\n return new Error(\n 'Error while connecting to RPC provider. Please try again.',\n { cause },\n );\n }\n\n // Custom RAILGUN contract error messages\n if (lowercaseMsg.includes('railgunsmartwallet')) {\n if (lowercaseMsg.includes('invalid nft note value')) {\n return new Error('RailgunSmartWallet: Invalid NFT Note Value.', {\n cause,\n });\n }\n if (lowercaseMsg.includes('unsupported token')) {\n return new Error(\n 'RailgunSmartWallet: Unsupported Token. This token cannot interact with the RAILGUN contract.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('invalid note value')) {\n return new Error(\n 'RailgunSmartWallet: Invalid Note Value. Please submit transaction with a corrected amount.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('invalid adapt contract as sender')) {\n return new Error(\n 'RailgunSmartWallet: Invalid Adapt Contract as Sender. Please update your frontend to current Adapt module versions.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('invalid merkle root')) {\n return new Error(\n 'RailgunSmartWallet: Invalid Merkle Root. Please sync your balances and try again.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('note already spent')) {\n return new Error(\n 'RailgunSmartWallet: Note Already Spent. Please sync your balances and try again.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('invalid note ciphertext array length')) {\n return new Error(\n 'RailgunSmartWallet: Invalid Note Ciphertext Array Length. Please sync balances and re-prove your transaction.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('invalid withdraw note')) {\n return new Error(\n 'RailgunSmartWallet: Invalid Unshield Note. Please sync balances and re-prove your transaction.',\n { cause },\n );\n }\n if (lowercaseMsg.includes('invalid snark proof')) {\n return new Error(\n 'RailgunSmartWallet: Invalid Snark Proof. Please re-prove your transaction.',\n { cause },\n );\n }\n }\n\n return new Error(\n validAscii(cause.message).replace(\n `:${STRING_PREFIX_AFTER_UNICODE_REPLACEMENT}`,\n ': ',\n ),\n { cause },\n );\n }\n\n return new Error('Unknown error. Please try again.', { cause });\n};\n"]}
|
|
@@ -25,11 +25,11 @@ const createFallbackProviderFromJsonConfig = (config) => {
|
|
|
25
25
|
});
|
|
26
26
|
return new ethers_1.FallbackProvider(providers, network);
|
|
27
27
|
}
|
|
28
|
-
catch (
|
|
29
|
-
if (!(
|
|
30
|
-
throw
|
|
28
|
+
catch (cause) {
|
|
29
|
+
if (!(cause instanceof Error)) {
|
|
30
|
+
throw new Error('Non-error thrown from createFallbackProviderFromJsonConfig', { cause });
|
|
31
31
|
}
|
|
32
|
-
throw new Error(`Invalid fallback provider config for chain ${config.chainId}
|
|
32
|
+
throw new Error(`Invalid fallback provider config for chain ${config.chainId}`, { cause });
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
exports.createFallbackProviderFromJsonConfig = createFallbackProviderFromJsonConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallback-provider.js","sourceRoot":"","sources":["../../src/utils/fallback-provider.ts"],"names":[],"mappings":";;;AAAA,mCAAsE;AACtE,iFAA2E;AAgBpE,MAAM,oCAAoC,GAAG,CAClD,MAAkC,EAChB,EAAE;IACpB,IAAI;QACF,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,EACjC,CAAC,CACF,CAAC;QACF,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;SACH;QAED,MAAM,OAAO,GAAG,gBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAErD,MAAM,SAAS,GAA6B,MAAM,CAAC,SAAS,CAAC,GAAG,CAC9D,CAAC,EACC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,eAAe,GAChB,EAAE,EAAE;YACH,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,WAAW;gBAC1B,CAAC,CAAC,IAAI,0BAAiB,CAAC,WAAW,EAAE,OAAO,CAAC;gBAC7C,CAAC,CAAC,IAAI,wDAAyB,CAC3B,WAAW,EACX,OAAO,EACP,eAAe,CAChB,CAAC;YAEN,MAAM,sBAAsB,GAA2B;gBACrD,QAAQ;gBACR,QAAQ;gBACR,MAAM;gBACN,YAAY;aACb,CAAC;YACF,OAAO,sBAAsB,CAAC;QAChC,CAAC,CACF,CAAC;QAEF,OAAO,IAAI,yBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;KACjD;IAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"fallback-provider.js","sourceRoot":"","sources":["../../src/utils/fallback-provider.ts"],"names":[],"mappings":";;;AAAA,mCAAsE;AACtE,iFAA2E;AAgBpE,MAAM,oCAAoC,GAAG,CAClD,MAAkC,EAChB,EAAE;IACpB,IAAI;QACF,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,EACjC,CAAC,CACF,CAAC;QACF,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;SACH;QAED,MAAM,OAAO,GAAG,gBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAErD,MAAM,SAAS,GAA6B,MAAM,CAAC,SAAS,CAAC,GAAG,CAC9D,CAAC,EACC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,eAAe,GAChB,EAAE,EAAE;YACH,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,WAAW;gBAC1B,CAAC,CAAC,IAAI,0BAAiB,CAAC,WAAW,EAAE,OAAO,CAAC;gBAC7C,CAAC,CAAC,IAAI,wDAAyB,CAC3B,WAAW,EACX,OAAO,EACP,eAAe,CAChB,CAAC;YAEN,MAAM,sBAAsB,GAA2B;gBACrD,QAAQ;gBACR,QAAQ;gBACR,MAAM;gBACN,YAAY;aACb,CAAC;YACF,OAAO,sBAAsB,CAAC;QAChC,CAAC,CACF,CAAC;QAEF,OAAO,IAAI,yBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;KACjD;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CACb,4DAA4D,EAC5D,EAAE,KAAK,EAAE,CACV,CAAC;SACH;QACD,MAAM,IAAI,KAAK,CACb,8CAA8C,MAAM,CAAC,OAAO,EAAE,EAC9D,EAAE,KAAK,EAAE,CACV,CAAC;KACH;AACH,CAAC,CAAC;AAxDW,QAAA,oCAAoC,wCAwD/C","sourcesContent":["import { FallbackProvider, Network, WebSocketProvider } from 'ethers';\nimport { ConfiguredJsonRpcProvider } from './configured-json-rpc-provider';\nimport { FallbackProviderConfig } from 'ethers/lib.commonjs/providers/provider-fallback';\n\nexport type FallbackProviderJsonConfig = {\n chainId: number;\n providers: ProviderJson[];\n};\n\nexport type ProviderJson = {\n priority: number;\n weight: number;\n provider: string;\n stallTimeout?: number;\n maxLogsPerBatch?: number;\n};\n\nexport const createFallbackProviderFromJsonConfig = (\n config: FallbackProviderJsonConfig,\n): FallbackProvider => {\n try {\n const totalWeight = config.providers.reduce(\n (acc, { weight }) => acc + weight,\n 0,\n );\n if (totalWeight < 2) {\n throw new Error(\n 'Total weight across providers must be >= 2 for fallback quorum.',\n );\n }\n\n const network = Network.from(Number(config.chainId));\n\n const providers: FallbackProviderConfig[] = config.providers.map(\n ({\n provider: providerURL,\n priority,\n weight,\n stallTimeout,\n maxLogsPerBatch,\n }) => {\n const isWebsocket = providerURL.startsWith('wss');\n const provider = isWebsocket\n ? new WebSocketProvider(providerURL, network)\n : new ConfiguredJsonRpcProvider(\n providerURL,\n network,\n maxLogsPerBatch,\n );\n\n const fallbackProviderConfig: FallbackProviderConfig = {\n provider,\n priority,\n weight,\n stallTimeout,\n };\n return fallbackProviderConfig;\n },\n );\n\n return new FallbackProvider(providers, network);\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error(\n 'Non-error thrown from createFallbackProviderFromJsonConfig',\n { cause },\n );\n }\n throw new Error(\n `Invalid fallback provider config for chain ${config.chainId}`,\n { cause },\n );\n }\n};\n"]}
|