@exodus/web3-ethereum-utils 3.38.1 → 4.0.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/lib/createSimulateMessage.d.ts +1 -1
- package/lib/createSimulateMessage.js +5 -3
- package/lib/createSimulateTransactions.js +3 -0
- package/lib/simulation/simulateMessage.d.ts +1 -1
- package/lib/simulation/simulateMessage.js +4 -4
- package/lib/simulation/simulateTransactions.d.ts +3 -2
- package/lib/simulation/simulateTransactions.js +8 -3
- package/lib/simulation/tryParsingSIWE.d.ts +2 -2
- package/lib/simulation/tryParsingSIWE.js +2 -22
- package/lib/types.d.ts +2 -2
- package/package.json +5 -4
|
@@ -5,4 +5,4 @@ export declare const createSimulateMessage: ({ apiEndpoint, headers, }?: {
|
|
|
5
5
|
headers?: {
|
|
6
6
|
'X-Api-Version': string;
|
|
7
7
|
} | undefined;
|
|
8
|
-
}) => ({ message,
|
|
8
|
+
}) => ({ message, url, asset, address, }: EthSimulateMessageParams) => Promise<MessageSimulationResult>;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import assert from 'minimalistic-assert';
|
|
1
2
|
import { getMessageType } from './simulation/getMessageType.js';
|
|
2
3
|
import { simulateMessage } from './simulation/simulateMessage.js';
|
|
3
4
|
import { tryParsingSIWE } from './simulation/tryParsingSIWE.js';
|
|
4
5
|
export const createSimulateMessage = ({ apiEndpoint = 'https://simulation.a.exodus.io/simulateMessage', headers = {
|
|
5
6
|
'X-Api-Version': '2023-06-05',
|
|
6
|
-
}, } = {}) => async ({ message,
|
|
7
|
+
}, } = {}) => async ({ message, url, asset, address, }) => {
|
|
8
|
+
assert(url instanceof URL, "'url' should be an instance of the URL object.");
|
|
7
9
|
const simulationResult = {
|
|
8
10
|
baseAssetName: asset.baseAssetName,
|
|
9
11
|
action: 'NONE',
|
|
@@ -15,7 +17,7 @@ export const createSimulateMessage = ({ apiEndpoint = 'https://simulation.a.exod
|
|
|
15
17
|
tryParsingSIWE({
|
|
16
18
|
message,
|
|
17
19
|
messageType,
|
|
18
|
-
|
|
20
|
+
url,
|
|
19
21
|
simulationResult,
|
|
20
22
|
});
|
|
21
23
|
await simulateMessage({
|
|
@@ -24,7 +26,7 @@ export const createSimulateMessage = ({ apiEndpoint = 'https://simulation.a.exod
|
|
|
24
26
|
message,
|
|
25
27
|
messageType,
|
|
26
28
|
},
|
|
27
|
-
|
|
29
|
+
url,
|
|
28
30
|
apiEndpoint,
|
|
29
31
|
headers,
|
|
30
32
|
simulationResult,
|
|
@@ -37,6 +37,9 @@ export const createSimulateTransactions = ({ apiEndpoint, headers }) => async ({
|
|
|
37
37
|
message: 'Balance changes cannot be estimated.',
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
+
if (simulationTransactionInternalResult.errorMessage) {
|
|
41
|
+
simulationResult.metadata.humanReadableError = simulationTransactionInternalResult.errorMessage;
|
|
42
|
+
}
|
|
40
43
|
return simulationResult;
|
|
41
44
|
}
|
|
42
45
|
simulationResult.displayDetails = getDisplayDetails(simulationResult.balanceChanges.willApprove);
|
|
@@ -4,4 +4,4 @@ export declare const handleActionResponse: ({ simulationResult, response, }: {
|
|
|
4
4
|
simulationResult: MessageSimulationResult;
|
|
5
5
|
response: ScanMessageEvm200Response;
|
|
6
6
|
}) => void;
|
|
7
|
-
export declare const simulateMessage: ({ address, apiEndpoint, message,
|
|
7
|
+
export declare const simulateMessage: ({ address, apiEndpoint, message, url, headers, simulationResult, }: SimulateMessageParams) => Promise<void>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { makeSimulationAPICall } from '@exodus/web3-utils';
|
|
2
2
|
import { BLOWFISH_EVM_CHAINS } from './common.js';
|
|
3
|
-
const convertToAPIPayload = ({
|
|
3
|
+
const convertToAPIPayload = ({ address, message, url, }) => {
|
|
4
4
|
const restParameters = {
|
|
5
|
-
metadata: { origin },
|
|
5
|
+
metadata: { origin: url.href },
|
|
6
6
|
userAccount: address,
|
|
7
7
|
};
|
|
8
8
|
if (message.messageType === 1 /* MessageTypeEnum.TypedData */) {
|
|
@@ -29,9 +29,9 @@ export const handleActionResponse = ({ simulationResult, response, }) => {
|
|
|
29
29
|
simulationResult.action = response.action;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
-
export const simulateMessage = async ({ address, apiEndpoint, message,
|
|
32
|
+
export const simulateMessage = async ({ address, apiEndpoint, message, url, headers, simulationResult, }) => {
|
|
33
33
|
const { network, chain } = BLOWFISH_EVM_CHAINS[simulationResult.baseAssetName];
|
|
34
|
-
const payload = convertToAPIPayload({ address,
|
|
34
|
+
const payload = convertToAPIPayload({ address, message, url });
|
|
35
35
|
const response = await makeSimulationAPICall({
|
|
36
36
|
url: apiEndpoint,
|
|
37
37
|
chain,
|
|
@@ -5,8 +5,9 @@ type SimulateTransactionParams = Required<Pick<CreateSimulateTransactionsParams,
|
|
|
5
5
|
headers?: Record<string, string>;
|
|
6
6
|
};
|
|
7
7
|
export declare const enum SimulationErrorMessages {
|
|
8
|
-
'
|
|
9
|
-
'
|
|
8
|
+
'APICallFailed' = 0,
|
|
9
|
+
'SimulationFailed' = 1,
|
|
10
|
+
'SimulationNotSupported' = 2
|
|
10
11
|
}
|
|
11
12
|
export declare const simulateTransactions: ({ transactions, apiEndpoint, origin, simulationResult, headers, asset, }: SimulateTransactionParams) => SimulateTransactionsInternalResult<undefined, SimulationErrorMessages>;
|
|
12
13
|
export {};
|
|
@@ -127,7 +127,7 @@ export const simulateTransactions = async ({ transactions, apiEndpoint, origin,
|
|
|
127
127
|
if (!BLOWFISH_EVM_CHAINS[asset.name]) {
|
|
128
128
|
return {
|
|
129
129
|
kind: 'error',
|
|
130
|
-
error:
|
|
130
|
+
error: 2 /* SimulationErrorMessages.SimulationNotSupported */,
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
133
|
const userAddress = transactions[0].from;
|
|
@@ -147,15 +147,20 @@ export const simulateTransactions = async ({ transactions, apiEndpoint, origin,
|
|
|
147
147
|
if (!response) {
|
|
148
148
|
return {
|
|
149
149
|
kind: 'error',
|
|
150
|
-
error:
|
|
150
|
+
error: 0 /* SimulationErrorMessages.APICallFailed */,
|
|
151
151
|
};
|
|
152
152
|
}
|
|
153
153
|
simulationResult.metadata.simulatedLocally = false;
|
|
154
154
|
const { expectedStateChanges = {}, error } = response.simulationResults.aggregated;
|
|
155
155
|
if (error) {
|
|
156
|
+
const { humanReadableError } = response.simulationResults.aggregated;
|
|
156
157
|
// ToDo: accept a logger dep and log the error
|
|
157
158
|
// ToDo: consider pushing an error to the "warnings" list
|
|
158
|
-
return
|
|
159
|
+
return {
|
|
160
|
+
kind: 'error',
|
|
161
|
+
error: 1 /* SimulationErrorMessages.SimulationFailed */,
|
|
162
|
+
errorMessage: humanReadableError
|
|
163
|
+
};
|
|
159
164
|
}
|
|
160
165
|
const noExpectedStateChangesDetected = Object.keys(expectedStateChanges).length === 0;
|
|
161
166
|
// This is a self-send transaction, adding a zero "transfer" so that the UI can display it.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { MessageTypeEnum } from './getMessageType.js';
|
|
2
2
|
import type { MessageSimulationResult } from '@exodus/web3-types';
|
|
3
|
-
export declare const tryParsingSIWE: ({ message, messageType,
|
|
3
|
+
export declare const tryParsingSIWE: ({ message, messageType, url, simulationResult, }: {
|
|
4
4
|
message: string;
|
|
5
5
|
messageType: MessageTypeEnum;
|
|
6
|
-
|
|
6
|
+
url: URL;
|
|
7
7
|
simulationResult: MessageSimulationResult;
|
|
8
8
|
}) => void;
|
|
@@ -1,31 +1,11 @@
|
|
|
1
|
-
const
|
|
2
|
-
try {
|
|
3
|
-
return new URL(origin);
|
|
4
|
-
}
|
|
5
|
-
catch (err) {
|
|
6
|
-
try {
|
|
7
|
-
// During this attempt we're checking if a scheme was missing in the origin as
|
|
8
|
-
// Platforms may or may nor include it.
|
|
9
|
-
return new URL(`https://${origin}`);
|
|
10
|
-
}
|
|
11
|
-
catch (err) {
|
|
12
|
-
// ToDo: accept a logger dep and log an error here
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
export const tryParsingSIWE = ({ message, messageType, origin: _origin, simulationResult, }) => {
|
|
1
|
+
export const tryParsingSIWE = ({ message, messageType, url, simulationResult, }) => {
|
|
18
2
|
if (messageType === 1 /* MessageTypeEnum.TypedData */) {
|
|
19
3
|
return;
|
|
20
4
|
}
|
|
21
|
-
const origin = createURL(_origin);
|
|
22
|
-
if (!origin) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
5
|
/*
|
|
26
6
|
Some dApps don't comply with EIP-4361 and use their custom Sign-In messages. This code block detects such known custom SIWE messages.
|
|
27
7
|
*/
|
|
28
|
-
if (
|
|
8
|
+
if (url.hostname === 'rarible.com' &&
|
|
29
9
|
message.includes('I want to login on Rarible')) {
|
|
30
10
|
simulationResult.kind = {
|
|
31
11
|
kind: 'SIWE',
|
package/lib/types.d.ts
CHANGED
|
@@ -56,7 +56,7 @@ export type EthAggregatedTransactionSimulationResult = AggregatedTransactionSimu
|
|
|
56
56
|
export interface EthSimulateMessageParams {
|
|
57
57
|
asset: Asset;
|
|
58
58
|
message: string;
|
|
59
|
-
|
|
59
|
+
url: URL;
|
|
60
60
|
address: string;
|
|
61
61
|
}
|
|
62
62
|
export interface SimulateMessageParams {
|
|
@@ -65,7 +65,7 @@ export interface SimulateMessageParams {
|
|
|
65
65
|
message: string;
|
|
66
66
|
messageType: MessageTypeEnum.RawMessage | MessageTypeEnum.TypedData;
|
|
67
67
|
};
|
|
68
|
-
|
|
68
|
+
url: EthSimulateMessageParams['url'];
|
|
69
69
|
apiEndpoint: string;
|
|
70
70
|
headers: Record<string, string>;
|
|
71
71
|
simulationResult: MessageSimulationResult;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exodus/web3-ethereum-utils",
|
|
3
3
|
"description": "Web3 Ethereum utils.",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "4.0.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"module": "lib/index.js",
|
|
@@ -34,18 +34,19 @@
|
|
|
34
34
|
"test": "run -T exodus-test --jest --esbuild"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@exodus/web3-types": "1.
|
|
37
|
+
"@exodus/web3-types": "1.53.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@exodus/basic-utils": "^3.0.1",
|
|
41
41
|
"@exodus/ethereumjs": "^1.0.0",
|
|
42
42
|
"@exodus/web3-utils": "^1.48.3",
|
|
43
|
-
"@metamask/eth-sig-util": "^4.0.1"
|
|
43
|
+
"@metamask/eth-sig-util": "^4.0.1",
|
|
44
|
+
"minimalistic-assert": "^1.0.1"
|
|
44
45
|
},
|
|
45
46
|
"author": "Exodus Movement, Inc.",
|
|
46
47
|
"bugs": {
|
|
47
48
|
"url": "https://github.com/ExodusMovement/assets/issues?q=is%3Aissue+is%3Aopen+label%3Aweb3-ethereum-utils"
|
|
48
49
|
},
|
|
49
50
|
"homepage": "https://github.com/ExodusMovement/assets/tree/master/web3/web3-ethereum-utils",
|
|
50
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "9cc59fb6f6de9bdee27a48a9695763d46d3bc07b"
|
|
51
52
|
}
|