@lodestar/prover 1.9.1
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/LICENSE +201 -0
- package/README.md +135 -0
- package/lib/cli/applyPreset.d.ts +2 -0
- package/lib/cli/applyPreset.js +72 -0
- package/lib/cli/applyPreset.js.map +1 -0
- package/lib/cli/cli.d.ts +8 -0
- package/lib/cli/cli.js +50 -0
- package/lib/cli/cli.js.map +1 -0
- package/lib/cli/cmds/index.d.ts +4 -0
- package/lib/cli/cmds/index.js +3 -0
- package/lib/cli/cmds/index.js.map +1 -0
- package/lib/cli/cmds/start/handler.d.ts +7 -0
- package/lib/cli/cmds/start/handler.js +30 -0
- package/lib/cli/cmds/start/handler.js.map +1 -0
- package/lib/cli/cmds/start/index.d.ts +5 -0
- package/lib/cli/cmds/start/index.js +15 -0
- package/lib/cli/cmds/start/index.js.map +1 -0
- package/lib/cli/cmds/start/options.d.ts +27 -0
- package/lib/cli/cmds/start/options.js +67 -0
- package/lib/cli/cmds/start/options.js.map +1 -0
- package/lib/cli/index.d.ts +4 -0
- package/lib/cli/index.js +25 -0
- package/lib/cli/index.js.map +1 -0
- package/lib/cli/options.d.ts +22 -0
- package/lib/cli/options.js +50 -0
- package/lib/cli/options.js.map +1 -0
- package/lib/constants.d.ts +6 -0
- package/lib/constants.js +7 -0
- package/lib/constants.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -0
- package/lib/index.web.d.ts +3 -0
- package/lib/index.web.js +3 -0
- package/lib/index.web.js.map +1 -0
- package/lib/interfaces.d.ts +69 -0
- package/lib/interfaces.js +6 -0
- package/lib/interfaces.js.map +1 -0
- package/lib/proof_provider/ordered_map.d.ts +8 -0
- package/lib/proof_provider/ordered_map.js +24 -0
- package/lib/proof_provider/ordered_map.js.map +1 -0
- package/lib/proof_provider/payload_store.d.ts +25 -0
- package/lib/proof_provider/payload_store.js +154 -0
- package/lib/proof_provider/payload_store.js.map +1 -0
- package/lib/proof_provider/proof_provider.d.ts +36 -0
- package/lib/proof_provider/proof_provider.js +171 -0
- package/lib/proof_provider/proof_provider.js.map +1 -0
- package/lib/types.d.ts +136 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/assertion.d.ts +10 -0
- package/lib/utils/assertion.js +34 -0
- package/lib/utils/assertion.js.map +1 -0
- package/lib/utils/command.d.ts +22 -0
- package/lib/utils/command.js +27 -0
- package/lib/utils/command.js.map +1 -0
- package/lib/utils/consensus.d.ts +19 -0
- package/lib/utils/consensus.js +74 -0
- package/lib/utils/consensus.js.map +1 -0
- package/lib/utils/conversion.d.ts +47 -0
- package/lib/utils/conversion.js +94 -0
- package/lib/utils/conversion.js.map +1 -0
- package/lib/utils/errors.d.ts +6 -0
- package/lib/utils/errors.js +6 -0
- package/lib/utils/errors.js.map +1 -0
- package/lib/utils/evm.d.ts +44 -0
- package/lib/utils/evm.js +193 -0
- package/lib/utils/evm.js.map +1 -0
- package/lib/utils/execution.d.ts +12 -0
- package/lib/utils/execution.js +53 -0
- package/lib/utils/execution.js.map +1 -0
- package/lib/utils/file.d.ts +8 -0
- package/lib/utils/file.js +50 -0
- package/lib/utils/file.js.map +1 -0
- package/lib/utils/gitData/gitDataPath.d.ts +17 -0
- package/lib/utils/gitData/gitDataPath.js +37 -0
- package/lib/utils/gitData/gitDataPath.js.map +1 -0
- package/lib/utils/gitData/index.d.ts +6 -0
- package/lib/utils/gitData/index.js +68 -0
- package/lib/utils/gitData/index.js.map +1 -0
- package/lib/utils/gitData/writeGitData.d.ts +3 -0
- package/lib/utils/gitData/writeGitData.js +8 -0
- package/lib/utils/gitData/writeGitData.js.map +1 -0
- package/lib/utils/json_rpc.d.ts +17 -0
- package/lib/utils/json_rpc.js +115 -0
- package/lib/utils/json_rpc.js.map +1 -0
- package/lib/utils/logger.d.ts +4 -0
- package/lib/utils/logger.js +12 -0
- package/lib/utils/logger.js.map +1 -0
- package/lib/utils/process.d.ts +20 -0
- package/lib/utils/process.js +75 -0
- package/lib/utils/process.js.map +1 -0
- package/lib/utils/req_resp.d.ts +5 -0
- package/lib/utils/req_resp.js +33 -0
- package/lib/utils/req_resp.js.map +1 -0
- package/lib/utils/rpc.d.ts +26 -0
- package/lib/utils/rpc.js +55 -0
- package/lib/utils/rpc.js.map +1 -0
- package/lib/utils/validation.d.ts +30 -0
- package/lib/utils/validation.js +94 -0
- package/lib/utils/validation.js.map +1 -0
- package/lib/utils/verification.d.ts +34 -0
- package/lib/utils/verification.js +62 -0
- package/lib/utils/verification.js.map +1 -0
- package/lib/utils/version.d.ts +12 -0
- package/lib/utils/version.js +59 -0
- package/lib/utils/version.js.map +1 -0
- package/lib/verified_requests/eth_call.d.ts +4 -0
- package/lib/verified_requests/eth_call.js +33 -0
- package/lib/verified_requests/eth_call.js.map +1 -0
- package/lib/verified_requests/eth_estimateGas.d.ts +4 -0
- package/lib/verified_requests/eth_estimateGas.js +33 -0
- package/lib/verified_requests/eth_estimateGas.js.map +1 -0
- package/lib/verified_requests/eth_getBalance.d.ts +3 -0
- package/lib/verified_requests/eth_getBalance.js +13 -0
- package/lib/verified_requests/eth_getBalance.js.map +1 -0
- package/lib/verified_requests/eth_getBlockByHash.d.ts +4 -0
- package/lib/verified_requests/eth_getBlockByHash.js +12 -0
- package/lib/verified_requests/eth_getBlockByHash.js.map +1 -0
- package/lib/verified_requests/eth_getBlockByNumber.d.ts +7 -0
- package/lib/verified_requests/eth_getBlockByNumber.js +12 -0
- package/lib/verified_requests/eth_getBlockByNumber.js.map +1 -0
- package/lib/verified_requests/eth_getCode.d.ts +3 -0
- package/lib/verified_requests/eth_getCode.js +32 -0
- package/lib/verified_requests/eth_getCode.js.map +1 -0
- package/lib/verified_requests/eth_getTransactionCount.d.ts +6 -0
- package/lib/verified_requests/eth_getTransactionCount.js +13 -0
- package/lib/verified_requests/eth_getTransactionCount.js.map +1 -0
- package/lib/web3_provider.d.ts +14 -0
- package/lib/web3_provider.js +138 -0
- package/lib/web3_provider.js.map +1 -0
- package/lib/web3_proxy.d.ts +13 -0
- package/lib/web3_proxy.js +136 -0
- package/lib/web3_proxy.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { isTruthy } from "./assertion.js";
|
|
2
|
+
export function numberToHex(num) {
|
|
3
|
+
return "0x" + num.toString(16);
|
|
4
|
+
}
|
|
5
|
+
export function hexToNumber(num) {
|
|
6
|
+
return num.startsWith("0x") ? parseInt(num.slice(2), 16) : parseInt(num, 16);
|
|
7
|
+
}
|
|
8
|
+
export function hexToBigInt(num) {
|
|
9
|
+
return num.startsWith("0x") ? BigInt(num) : BigInt(`0x${num}`);
|
|
10
|
+
}
|
|
11
|
+
export function bigIntToHex(num) {
|
|
12
|
+
return `0x${num.toString(16)}`;
|
|
13
|
+
}
|
|
14
|
+
export function bufferToHex(buffer) {
|
|
15
|
+
return "0x" + Buffer.from(buffer).toString("hex");
|
|
16
|
+
}
|
|
17
|
+
export function hexToBuffer(val) {
|
|
18
|
+
return Buffer.from(val.replace("0x", ""), "hex");
|
|
19
|
+
}
|
|
20
|
+
export function padLeft(v, length) {
|
|
21
|
+
const buf = Buffer.alloc(length);
|
|
22
|
+
Buffer.from(v).copy(buf, length - v.length);
|
|
23
|
+
if (Buffer.isBuffer(v))
|
|
24
|
+
return buf;
|
|
25
|
+
return Uint8Array.from(buf);
|
|
26
|
+
}
|
|
27
|
+
export function headerDataFromELBlock(blockInfo) {
|
|
28
|
+
var _a;
|
|
29
|
+
return {
|
|
30
|
+
parentHash: blockInfo.parentHash,
|
|
31
|
+
uncleHash: blockInfo.sha3Uncles,
|
|
32
|
+
coinbase: blockInfo.miner,
|
|
33
|
+
stateRoot: blockInfo.stateRoot,
|
|
34
|
+
transactionsTrie: blockInfo.transactionsRoot,
|
|
35
|
+
receiptTrie: blockInfo.receiptsRoot,
|
|
36
|
+
logsBloom: blockInfo.logsBloom,
|
|
37
|
+
difficulty: BigInt(blockInfo.difficulty),
|
|
38
|
+
number: BigInt(blockInfo.number),
|
|
39
|
+
gasLimit: BigInt(blockInfo.gasLimit),
|
|
40
|
+
gasUsed: BigInt(blockInfo.gasUsed),
|
|
41
|
+
timestamp: BigInt(blockInfo.timestamp),
|
|
42
|
+
extraData: blockInfo.extraData,
|
|
43
|
+
mixHash: blockInfo.mixHash,
|
|
44
|
+
nonce: blockInfo.nonce,
|
|
45
|
+
baseFeePerGas: blockInfo.baseFeePerGas ? BigInt(blockInfo.baseFeePerGas) : undefined,
|
|
46
|
+
withdrawalsRoot: (_a = blockInfo.withdrawalsRoot) !== null && _a !== void 0 ? _a : undefined,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
50
|
+
export function txDataFromELBlock(txInfo) {
|
|
51
|
+
return {
|
|
52
|
+
...txInfo,
|
|
53
|
+
data: txInfo.input,
|
|
54
|
+
gasPrice: isTruthy(txInfo.gasPrice) ? BigInt(txInfo.gasPrice) : null,
|
|
55
|
+
gasLimit: txInfo.gas,
|
|
56
|
+
to: isTruthy(txInfo.to) ? padLeft(hexToBuffer(txInfo.to), 20) : undefined,
|
|
57
|
+
value: txInfo.value ? BigInt(txInfo.value) : undefined,
|
|
58
|
+
maxFeePerGas: isTruthy(txInfo.maxFeePerGas) ? BigInt(txInfo.maxFeePerGas) : undefined,
|
|
59
|
+
maxPriorityFeePerGas: isTruthy(txInfo.maxPriorityFeePerGas) ? BigInt(txInfo.maxPriorityFeePerGas) : undefined,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function blockDataFromELBlock(blockInfo) {
|
|
63
|
+
return {
|
|
64
|
+
header: headerDataFromELBlock(blockInfo),
|
|
65
|
+
transactions: blockInfo.transactions.map(txDataFromELBlock),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function cleanObject(obj) {
|
|
69
|
+
const isNullify = (v) => v === undefined || v === null;
|
|
70
|
+
if (Array.isArray(obj))
|
|
71
|
+
return obj.filter((v) => isNullify(v));
|
|
72
|
+
if (typeof obj === "object") {
|
|
73
|
+
for (const key of Object.keys(obj)) {
|
|
74
|
+
if (isNullify(obj[key])) {
|
|
75
|
+
delete obj[key];
|
|
76
|
+
}
|
|
77
|
+
else if (typeof obj[key] === "object") {
|
|
78
|
+
cleanObject(obj[key]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return obj;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert an array to array of chunks
|
|
86
|
+
* @example
|
|
87
|
+
* chunkIntoN([1,2,3,4], 2)
|
|
88
|
+
* => [[1,2], [3,4]]
|
|
89
|
+
*/
|
|
90
|
+
export function chunkIntoN(arr, n) {
|
|
91
|
+
const size = Math.ceil(arr.length / n);
|
|
92
|
+
return Array.from({ length: n }, (v, i) => arr.slice(i * size, i * size + size));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=conversion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversion.js","sourceRoot":"","sources":["../../src/utils/conversion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { VM, RunTxResult } from "@ethereumjs/vm";
|
|
2
|
+
import { BlockHeader } from "@ethereumjs/block";
|
|
3
|
+
import { NetworkName } from "@lodestar/config/networks";
|
|
4
|
+
import { allForks } from "@lodestar/types";
|
|
5
|
+
import { Logger } from "@lodestar/utils";
|
|
6
|
+
import { ProofProvider } from "../proof_provider/proof_provider.js";
|
|
7
|
+
import { ELBlock, ELProof, ELTransaction } from "../types.js";
|
|
8
|
+
import { ELRpc } from "./rpc.js";
|
|
9
|
+
export declare function createVM({ proofProvider }: {
|
|
10
|
+
proofProvider: ProofProvider;
|
|
11
|
+
}): Promise<VM>;
|
|
12
|
+
export declare function getVMWithState({ rpc, executionPayload, tx, vm, logger, }: {
|
|
13
|
+
rpc: ELRpc;
|
|
14
|
+
vm: VM;
|
|
15
|
+
executionPayload: allForks.ExecutionPayload;
|
|
16
|
+
tx: ELTransaction;
|
|
17
|
+
logger: Logger;
|
|
18
|
+
}): Promise<VM>;
|
|
19
|
+
type VMState = Record<string, {
|
|
20
|
+
code: string;
|
|
21
|
+
proof: ELProof;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function updateVMWithState({ vm, state }: {
|
|
24
|
+
logger: Logger;
|
|
25
|
+
state: VMState;
|
|
26
|
+
vm: VM;
|
|
27
|
+
}): Promise<VM>;
|
|
28
|
+
export declare function executeVMCall({ rpc, tx, vm, executionPayload, network, }: {
|
|
29
|
+
rpc: ELRpc;
|
|
30
|
+
tx: ELTransaction;
|
|
31
|
+
vm: VM;
|
|
32
|
+
executionPayload: allForks.ExecutionPayload;
|
|
33
|
+
network: NetworkName;
|
|
34
|
+
}): Promise<RunTxResult["execResult"]>;
|
|
35
|
+
export declare function executeVMTx({ rpc, tx, vm, executionPayload, network, }: {
|
|
36
|
+
rpc: ELRpc;
|
|
37
|
+
tx: ELTransaction;
|
|
38
|
+
vm: VM;
|
|
39
|
+
executionPayload: allForks.ExecutionPayload;
|
|
40
|
+
network: NetworkName;
|
|
41
|
+
}): Promise<RunTxResult>;
|
|
42
|
+
export declare function getVMBlockHeaderFromELBlock(block: ELBlock, executionPayload: allForks.ExecutionPayload, network: NetworkName): BlockHeader;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=evm.d.ts.map
|
package/lib/utils/evm.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { Blockchain } from "@ethereumjs/blockchain";
|
|
2
|
+
import { Account, Address } from "@ethereumjs/util";
|
|
3
|
+
import { VM } from "@ethereumjs/vm";
|
|
4
|
+
import { TransactionFactory } from "@ethereumjs/tx";
|
|
5
|
+
import { BlockHeader } from "@ethereumjs/block";
|
|
6
|
+
import { ZERO_ADDRESS } from "../constants.js";
|
|
7
|
+
import { bufferToHex, chunkIntoN, cleanObject, hexToBigInt, hexToBuffer, numberToHex, padLeft } from "./conversion.js";
|
|
8
|
+
import { getChainCommon, getTxType } from "./execution.js";
|
|
9
|
+
import { isValidResponse } from "./json_rpc.js";
|
|
10
|
+
import { isNullish, isValidAccount, isValidCodeHash, isValidStorageKeys } from "./validation.js";
|
|
11
|
+
export async function createVM({ proofProvider }) {
|
|
12
|
+
const common = getChainCommon(proofProvider.config.PRESET_BASE);
|
|
13
|
+
const blockchain = await Blockchain.create({ common });
|
|
14
|
+
// Connect blockchain object with existing proof provider for block history
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
|
|
16
|
+
blockchain.getBlock = async (blockId) => {
|
|
17
|
+
const payload = await proofProvider.getExecutionPayload(blockId);
|
|
18
|
+
return {
|
|
19
|
+
hash: () => payload.blockHash,
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const vm = await VM.create({ common, blockchain });
|
|
23
|
+
return vm;
|
|
24
|
+
}
|
|
25
|
+
export async function getVMWithState({ rpc, executionPayload, tx, vm, logger, }) {
|
|
26
|
+
var _a;
|
|
27
|
+
const { stateRoot, blockHash, gasLimit } = executionPayload;
|
|
28
|
+
const blockHashHex = bufferToHex(blockHash);
|
|
29
|
+
// If tx does not have a from address then it must be initiated via zero address
|
|
30
|
+
const from = (_a = tx.from) !== null && _a !== void 0 ? _a : ZERO_ADDRESS;
|
|
31
|
+
const to = tx.to;
|
|
32
|
+
// Create Access List for the contract call
|
|
33
|
+
const accessListTx = cleanObject({
|
|
34
|
+
to,
|
|
35
|
+
from,
|
|
36
|
+
data: tx.data,
|
|
37
|
+
value: tx.value,
|
|
38
|
+
gas: tx.gas ? tx.gas : numberToHex(gasLimit),
|
|
39
|
+
gasPrice: "0x0",
|
|
40
|
+
});
|
|
41
|
+
const response = await rpc.request("eth_createAccessList", [accessListTx, blockHashHex], { raiseError: false });
|
|
42
|
+
if (!isValidResponse(response) || response.result.error) {
|
|
43
|
+
throw new Error(`Invalid response from RPC. method: eth_createAccessList, params: ${JSON.stringify(tx)}`);
|
|
44
|
+
}
|
|
45
|
+
const storageKeysMap = {};
|
|
46
|
+
for (const { address, storageKeys } of response.result.accessList) {
|
|
47
|
+
storageKeysMap[address] = storageKeys;
|
|
48
|
+
}
|
|
49
|
+
// If from address is not present then we have to fetch it for all keys
|
|
50
|
+
if (isNullish(storageKeysMap[from])) {
|
|
51
|
+
storageKeysMap[from] = [];
|
|
52
|
+
}
|
|
53
|
+
// If to address is not present then we have to fetch it with for all keys
|
|
54
|
+
if (to && isNullish(storageKeysMap[to])) {
|
|
55
|
+
storageKeysMap[to] = [];
|
|
56
|
+
}
|
|
57
|
+
const batchRequests = [];
|
|
58
|
+
for (const [address, storageKeys] of Object.entries(storageKeysMap)) {
|
|
59
|
+
batchRequests.push({ jsonrpc: "2.0", method: "eth_getProof", params: [address, storageKeys, blockHashHex] });
|
|
60
|
+
batchRequests.push({ jsonrpc: "2.0", method: "eth_getCode", params: [address, blockHashHex] });
|
|
61
|
+
}
|
|
62
|
+
// If all responses are valid then we will have even number of responses
|
|
63
|
+
// For each address, one response for eth_getProof and one for eth_getCode
|
|
64
|
+
const batchResponse = await rpc.batchRequest(batchRequests, { raiseError: true });
|
|
65
|
+
const batchResponseInChunks = chunkIntoN(batchResponse, 2);
|
|
66
|
+
const vmState = {};
|
|
67
|
+
for (const [proofResponse, codeResponse] of batchResponseInChunks) {
|
|
68
|
+
const addressHex = proofResponse.request.params[0];
|
|
69
|
+
if (!isNullish(vmState[addressHex]))
|
|
70
|
+
continue;
|
|
71
|
+
const proof = proofResponse.response.result;
|
|
72
|
+
const storageKeys = proofResponse.request.params[1];
|
|
73
|
+
const code = codeResponse.response.result;
|
|
74
|
+
const validAccount = await isValidAccount({ address: addressHex, proof, logger, stateRoot });
|
|
75
|
+
const validStorage = validAccount && (await isValidStorageKeys({ storageKeys, proof, logger }));
|
|
76
|
+
if (!validAccount || !validStorage) {
|
|
77
|
+
throw new Error(`Invalid account: ${addressHex}`);
|
|
78
|
+
}
|
|
79
|
+
if (!(await isValidCodeHash({ codeResponse: code, logger, codeHash: proof.codeHash }))) {
|
|
80
|
+
throw new Error(`Invalid code hash: ${addressHex}`);
|
|
81
|
+
}
|
|
82
|
+
vmState[addressHex] = { code, proof };
|
|
83
|
+
}
|
|
84
|
+
return updateVMWithState({ vm, state: vmState, logger });
|
|
85
|
+
}
|
|
86
|
+
export async function updateVMWithState({ vm, state }) {
|
|
87
|
+
await vm.stateManager.checkpoint();
|
|
88
|
+
for (const [addressHex, { proof, code }] of Object.entries(state)) {
|
|
89
|
+
const address = Address.fromString(addressHex);
|
|
90
|
+
const codeBuffer = hexToBuffer(code);
|
|
91
|
+
const account = Account.fromAccountData({
|
|
92
|
+
nonce: BigInt(proof.nonce),
|
|
93
|
+
balance: BigInt(proof.balance),
|
|
94
|
+
codeHash: proof.codeHash,
|
|
95
|
+
});
|
|
96
|
+
await vm.stateManager.putAccount(address, account);
|
|
97
|
+
for (const { key, value } of proof.storageProof) {
|
|
98
|
+
await vm.stateManager.putContractStorage(address, padLeft(hexToBuffer(key), 32), padLeft(hexToBuffer(value), 32));
|
|
99
|
+
}
|
|
100
|
+
if (codeBuffer.byteLength !== 0)
|
|
101
|
+
await vm.stateManager.putContractCode(address, codeBuffer);
|
|
102
|
+
}
|
|
103
|
+
await vm.stateManager.commit();
|
|
104
|
+
return vm;
|
|
105
|
+
}
|
|
106
|
+
export async function executeVMCall({ rpc, tx, vm, executionPayload, network, }) {
|
|
107
|
+
var _a;
|
|
108
|
+
const { from, to, gas, gasPrice, maxPriorityFeePerGas, value, data } = tx;
|
|
109
|
+
const { result: block } = await rpc.request("eth_getBlockByHash", [bufferToHex(executionPayload.blockHash), true], {
|
|
110
|
+
raiseError: true,
|
|
111
|
+
});
|
|
112
|
+
if (!block) {
|
|
113
|
+
throw new Error(`Block not found: ${bufferToHex(executionPayload.blockHash)}`);
|
|
114
|
+
}
|
|
115
|
+
const { execResult } = await vm.evm.runCall({
|
|
116
|
+
caller: from ? Address.fromString(from) : undefined,
|
|
117
|
+
to: to ? Address.fromString(to) : undefined,
|
|
118
|
+
gasLimit: hexToBigInt(gas !== null && gas !== void 0 ? gas : block.gasLimit),
|
|
119
|
+
gasPrice: hexToBigInt((_a = gasPrice !== null && gasPrice !== void 0 ? gasPrice : maxPriorityFeePerGas) !== null && _a !== void 0 ? _a : "0x0"),
|
|
120
|
+
value: hexToBigInt(value !== null && value !== void 0 ? value : "0x0"),
|
|
121
|
+
data: data ? hexToBuffer(data) : undefined,
|
|
122
|
+
block: {
|
|
123
|
+
header: getVMBlockHeaderFromELBlock(block, executionPayload, network),
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
if (execResult.exceptionError) {
|
|
127
|
+
throw new Error(execResult.exceptionError.error);
|
|
128
|
+
}
|
|
129
|
+
return execResult;
|
|
130
|
+
}
|
|
131
|
+
export async function executeVMTx({ rpc, tx, vm, executionPayload, network, }) {
|
|
132
|
+
var _a, _b;
|
|
133
|
+
const { result: block } = await rpc.request("eth_getBlockByHash", [bufferToHex(executionPayload.blockHash), true], {
|
|
134
|
+
raiseError: true,
|
|
135
|
+
});
|
|
136
|
+
if (!block) {
|
|
137
|
+
throw new Error(`Block not found: ${bufferToHex(executionPayload.blockHash)}`);
|
|
138
|
+
}
|
|
139
|
+
const txType = getTxType(tx);
|
|
140
|
+
const from = tx.from ? Address.fromString(tx.from) : Address.zero();
|
|
141
|
+
const to = tx.to ? Address.fromString(tx.to) : undefined;
|
|
142
|
+
const txData = {
|
|
143
|
+
...tx,
|
|
144
|
+
from,
|
|
145
|
+
to,
|
|
146
|
+
type: txType,
|
|
147
|
+
// If no gas limit is specified use the last block gas limit as an upper bound.
|
|
148
|
+
gasLimit: hexToBigInt((_a = tx.gas) !== null && _a !== void 0 ? _a : block.gasLimit),
|
|
149
|
+
};
|
|
150
|
+
if (txType === 2) {
|
|
151
|
+
// Handle EIP-1559 transactions
|
|
152
|
+
// To fix the vm error: Transaction's maxFeePerGas (0) is less than the block's baseFeePerGas
|
|
153
|
+
txData.maxFeePerGas = (_b = txData.maxFeePerGas) !== null && _b !== void 0 ? _b : block.baseFeePerGas;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Legacy transaction
|
|
157
|
+
txData.gasPrice = isNullish(txData.gasPrice) || txData.gasPrice === "0x0" ? block.baseFeePerGas : txData.gasPrice;
|
|
158
|
+
}
|
|
159
|
+
const txObject = TransactionFactory.fromTxData(txData, { common: getChainCommon(network), freeze: false });
|
|
160
|
+
// Override to avoid tx signature verification
|
|
161
|
+
txObject.getSenderAddress = () => (tx.from ? Address.fromString(tx.from) : Address.zero());
|
|
162
|
+
const result = await vm.runTx({
|
|
163
|
+
tx: txObject,
|
|
164
|
+
skipNonce: true,
|
|
165
|
+
skipBalance: true,
|
|
166
|
+
skipBlockGasLimitValidation: true,
|
|
167
|
+
skipHardForkValidation: true,
|
|
168
|
+
block: {
|
|
169
|
+
header: getVMBlockHeaderFromELBlock(block, executionPayload, network),
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
export function getVMBlockHeaderFromELBlock(block, executionPayload, network) {
|
|
175
|
+
const blockHeaderData = {
|
|
176
|
+
number: hexToBigInt(block.number),
|
|
177
|
+
cliqueSigner: () => Address.fromString(block.miner),
|
|
178
|
+
timestamp: hexToBigInt(block.timestamp),
|
|
179
|
+
difficulty: hexToBigInt(block.difficulty),
|
|
180
|
+
gasLimit: hexToBigInt(block.gasLimit),
|
|
181
|
+
baseFeePerGas: block.baseFeePerGas ? hexToBigInt(block.baseFeePerGas) : undefined,
|
|
182
|
+
// Use these values from the execution payload
|
|
183
|
+
// instead of the block values to ensure that
|
|
184
|
+
// the VM is using the verified values from the lightclient
|
|
185
|
+
prevRandao: Buffer.from(executionPayload.prevRandao),
|
|
186
|
+
stateRoot: Buffer.from(executionPayload.stateRoot),
|
|
187
|
+
parentHash: Buffer.from(executionPayload.parentHash),
|
|
188
|
+
// TODO: Fix the coinbase address
|
|
189
|
+
coinbase: Address.fromString(block.miner),
|
|
190
|
+
};
|
|
191
|
+
return BlockHeader.fromHeaderData(blockHeaderData, { common: getChainCommon(network) });
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=evm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.js","sourceRoot":"","sources":["../../src/utils/evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,EAAE,EAAc,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAC,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAQ,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAIrD,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AACrH,OAAO,EAAC,cAAc,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAG/F,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAC,aAAa,EAAiC;IAC5E,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,WAAqB,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC;IAErD,2EAA2E;IAC3E,0GAA0G;IACzG,UAAkB,CAAC,QAAQ,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;QACvD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS;SAC9B,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,UAAU,EAAC,CAAC,CAAC;IAEjD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EACnC,GAAG,EACH,gBAAgB,EAChB,EAAE,EACF,EAAE,EACF,MAAM,GAOP;;IACC,MAAM,EAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAC,GAAG,gBAAgB,CAAC;IAC1D,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAE5C,gFAAgF;IAChF,MAAM,IAAI,GAAG,MAAA,EAAE,CAAC,IAAI,mCAAI,YAAY,CAAC;IACrC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAEjB,2CAA2C;IAC3C,MAAM,YAAY,GAAG,WAAW,CAAC;QAC/B,EAAE;QACF,IAAI;QACJ,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5C,QAAQ,EAAE,KAAK;KAChB,CAAkB,CAAC;IACpB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,EAAC,UAAU,EAAE,KAAK,EAAC,CAAC,CAAC;IAE9G,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE;QACvD,MAAM,IAAI,KAAK,CAAC,oEAAoE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAC3G;IAED,MAAM,cAAc,GAA6B,EAAE,CAAC;IACpD,KAAK,MAAM,EAAC,OAAO,EAAE,WAAW,EAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;QAC/D,cAAc,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;KACvC;IAED,uEAAuE;IACvE,IAAI,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE;QACnC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;KAC3B;IAED,0EAA0E;IAC1E,IAAI,EAAE,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE;QACvC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;KACzB;IAED,MAAM,aAAa,GAAG,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QACnE,aAAa,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,EAAC,CAAC,CAAC;QAC3G,aAAa,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAC,CAAC,CAAC;KAC9F;IAED,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC,CAAC;IAChF,MAAM,qBAAqB,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,qBAAqB,EAAE;QACjE,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAAE,SAAS;QAE9C,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAiB,CAAC;QACvD,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAa,CAAC;QAChE,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAgB,CAAC;QAEpD,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAG,YAAY,IAAI,CAAC,MAAM,kBAAkB,CAAC,EAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;SACnD;QAED,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,EAAC,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAC,CAAC,CAAC,EAAE;YACpF,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;SACrD;QAED,OAAO,CAAC,UAAU,CAAC,GAAG,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC;KACrC;IAED,OAAO,iBAAiB,CAAC,EAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAC,EAAE,EAAE,KAAK,EAA2C;IAC3F,MAAM,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,UAAU,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEnD,KAAK,MAAM,EAAC,GAAG,EAAE,KAAK,EAAC,IAAI,KAAK,CAAC,YAAY,EAAE;YAC7C,MAAM,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACnH;QACD,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC;YAAE,MAAM,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;KAC7F;IAED,MAAM,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,GAAG,EACH,EAAE,EACF,EAAE,EACF,gBAAgB,EAChB,OAAO,GAOR;;IACC,MAAM,EAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAC,GAAG,EAAE,CAAC;IACxE,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE;QAC/G,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;KAChF;IAED,MAAM,EAAC,UAAU,EAAC,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;QACxC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACnD,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3C,QAAQ,EAAE,WAAW,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,KAAK,CAAC,QAAQ,CAAC;QAC5C,QAAQ,EAAE,WAAW,CAAC,MAAA,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,oBAAoB,mCAAI,KAAK,CAAC;QAChE,KAAK,EAAE,WAAW,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,KAAK,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1C,KAAK,EAAE;YACL,MAAM,EAAE,2BAA2B,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC;SACtE;KACF,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,cAAc,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;KAClD;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAChC,GAAG,EACH,EAAE,EACF,EAAE,EACF,gBAAgB,EAChB,OAAO,GAOR;;IACC,MAAM,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE;QAC/G,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;KAChF;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACpE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzD,MAAM,MAAM,GAAG;QACb,GAAG,EAAE;QACL,IAAI;QACJ,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,+EAA+E;QAC/E,QAAQ,EAAE,WAAW,CAAC,MAAA,EAAE,CAAC,GAAG,mCAAI,KAAK,CAAC,QAAQ,CAAC;KAChD,CAAC;IAEF,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,+BAA+B;QAC/B,6FAA6F;QAC7F,MAAM,CAAC,YAAY,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,KAAK,CAAC,aAAa,CAAC;KAClE;SAAM;QACL,qBAAqB;QACrB,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;KACnH;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,EAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;IAEzG,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC;QAC5B,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,IAAI;QACjB,2BAA2B,EAAE,IAAI;QACjC,sBAAsB,EAAE,IAAI;QAC5B,KAAK,EAAE;YACL,MAAM,EAAE,2BAA2B,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC;SAC7D;KACX,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAc,EACd,gBAA2C,EAC3C,OAAoB;IAEpB,MAAM,eAAe,GAAG;QACtB,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;QACnD,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;QACvC,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;QACzC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC;QACrC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;QAEjF,8CAA8C;QAC9C,6CAA6C;QAC7C,2DAA2D;QAC3D,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QACpD,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;QAClD,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAEpD,iCAAiC;QACjC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;KAC1C,CAAC;IAEF,OAAO,WAAW,CAAC,cAAc,CAAC,eAAe,EAAE,EAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,EAAC,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Common } from "@ethereumjs/common";
|
|
2
|
+
import { ELApiParams, ELApiReturn, ELTransaction } from "../types.js";
|
|
3
|
+
import { ELRpc } from "./rpc.js";
|
|
4
|
+
export type Optional<T, K extends keyof T> = Omit<T, K> & {
|
|
5
|
+
[P in keyof T]?: T[P] | undefined;
|
|
6
|
+
};
|
|
7
|
+
export declare function getELCode(rpc: ELRpc, args: ELApiParams["eth_getCode"]): Promise<ELApiReturn["eth_getCode"]>;
|
|
8
|
+
export declare function getELProof(rpc: ELRpc, args: ELApiParams["eth_getProof"]): Promise<ELApiReturn["eth_getProof"]>;
|
|
9
|
+
export declare function getELBlock(rpc: ELRpc, args: ELApiParams["eth_getBlockByNumber"]): Promise<ELApiReturn["eth_getBlockByNumber"]>;
|
|
10
|
+
export declare function getChainCommon(network: string): Common;
|
|
11
|
+
export declare function getTxType(tx: ELTransaction): number;
|
|
12
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Common, CustomChain, Hardfork } from "@ethereumjs/common";
|
|
2
|
+
import { isValidResponse } from "./json_rpc.js";
|
|
3
|
+
import { isBlockNumber, isPresent } from "./validation.js";
|
|
4
|
+
export async function getELCode(rpc, args) {
|
|
5
|
+
const codeResult = await rpc.request("eth_getCode", args, { raiseError: false });
|
|
6
|
+
if (!isValidResponse(codeResult)) {
|
|
7
|
+
throw new Error(`Can not find code for address=${args[0]}`);
|
|
8
|
+
}
|
|
9
|
+
return codeResult.result;
|
|
10
|
+
}
|
|
11
|
+
export async function getELProof(rpc, args) {
|
|
12
|
+
const proof = await rpc.request("eth_getProof", args, { raiseError: false });
|
|
13
|
+
if (!isValidResponse(proof)) {
|
|
14
|
+
throw new Error(`Can not find proof for address=${args[0]}`);
|
|
15
|
+
}
|
|
16
|
+
return proof.result;
|
|
17
|
+
}
|
|
18
|
+
export async function getELBlock(rpc, args) {
|
|
19
|
+
const block = await rpc.request(isBlockNumber(args[0]) ? "eth_getBlockByNumber" : "eth_getBlockByHash", args, {
|
|
20
|
+
raiseError: false,
|
|
21
|
+
});
|
|
22
|
+
if (!isValidResponse(block)) {
|
|
23
|
+
throw new Error(`Can not find block. id=${args[0]}`);
|
|
24
|
+
}
|
|
25
|
+
return block.result;
|
|
26
|
+
}
|
|
27
|
+
export function getChainCommon(network) {
|
|
28
|
+
switch (network) {
|
|
29
|
+
case "mainnet":
|
|
30
|
+
case "goerli":
|
|
31
|
+
case "ropsten":
|
|
32
|
+
case "sepolia":
|
|
33
|
+
// TODO: Not sure how to detect the fork during runtime
|
|
34
|
+
return new Common({ chain: network, hardfork: Hardfork.Shanghai });
|
|
35
|
+
case "minimal":
|
|
36
|
+
// TODO: Not sure how to detect the fork during runtime
|
|
37
|
+
return new Common({ chain: "mainnet", hardfork: Hardfork.Shanghai });
|
|
38
|
+
case "gnosis":
|
|
39
|
+
return new Common({ chain: CustomChain.xDaiChain });
|
|
40
|
+
default:
|
|
41
|
+
throw new Error(`Non supported network "${network}"`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function getTxType(tx) {
|
|
45
|
+
if (isPresent(tx.maxFeePerGas) || isPresent(tx.maxPriorityFeePerGas)) {
|
|
46
|
+
return 2;
|
|
47
|
+
}
|
|
48
|
+
if (isPresent(tx.accessList)) {
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/utils/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,aAAa,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAKzD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAU,EAAE,IAAgC;IAC1E,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,EAAC,UAAU,EAAE,KAAK,EAAC,CAAC,CAAC;IAE/E,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KAC7D;IAED,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAU,EAAE,IAAiC;IAC5E,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,EAAC,UAAU,EAAE,KAAK,EAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KAC9D;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAU,EACV,IAAyC;IAEzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,EAAE,IAAI,EAAE;QAC5G,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACtD;IAED,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,QAAQ,OAAO,EAAE;QACf,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACZ,uDAAuD;YACvD,OAAO,IAAI,MAAM,CAAC,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAC,CAAC,CAAC;QACnE,KAAK,SAAS;YACZ,uDAAuD;YACvD,OAAO,IAAI,MAAM,CAAC,EAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAC,CAAC,CAAC;QACrE,KAAK,QAAQ;YACX,OAAO,IAAI,MAAM,CAAC,EAAC,KAAK,EAAE,WAAW,CAAC,SAAS,EAAC,CAAC,CAAC;QACpD;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,GAAG,CAAC,CAAC;KACzD;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAiB;IACzC,IAAI,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,oBAAoB,CAAC,EAAE;QACpE,OAAO,CAAC,CAAC;KACV;IAED,IAAI,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;QAC5B,OAAO,CAAC,CAAC;KACV;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a JSON serializable object from a file
|
|
3
|
+
*
|
|
4
|
+
* Parse either from json, yaml, or toml
|
|
5
|
+
* Optional acceptedFormats object can be passed which can be an array of accepted formats, in future can be extended to include parseFn for the accepted formats
|
|
6
|
+
*/
|
|
7
|
+
export declare function readFile<T>(filepath: string, acceptedFormats?: string[]): T;
|
|
8
|
+
//# sourceMappingURL=file.d.ts.map
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import yaml from "js-yaml";
|
|
4
|
+
const { load, FAILSAFE_SCHEMA, Type } = yaml;
|
|
5
|
+
var FileFormat;
|
|
6
|
+
(function (FileFormat) {
|
|
7
|
+
FileFormat["json"] = "json";
|
|
8
|
+
FileFormat["yaml"] = "yaml";
|
|
9
|
+
FileFormat["yml"] = "yml";
|
|
10
|
+
FileFormat["toml"] = "toml";
|
|
11
|
+
})(FileFormat || (FileFormat = {}));
|
|
12
|
+
const yamlSchema = FAILSAFE_SCHEMA.extend({
|
|
13
|
+
implicit: [
|
|
14
|
+
new Type("tag:yaml.org,2002:str", {
|
|
15
|
+
kind: "scalar",
|
|
16
|
+
construct: function construct(data) {
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
18
|
+
return data !== null ? data : "";
|
|
19
|
+
},
|
|
20
|
+
}),
|
|
21
|
+
],
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Parse file contents as Json.
|
|
25
|
+
*/
|
|
26
|
+
function parse(contents, fileFormat) {
|
|
27
|
+
switch (fileFormat) {
|
|
28
|
+
case FileFormat.json:
|
|
29
|
+
return JSON.parse(contents);
|
|
30
|
+
case FileFormat.yaml:
|
|
31
|
+
case FileFormat.yml:
|
|
32
|
+
return load(contents, { schema: yamlSchema });
|
|
33
|
+
default:
|
|
34
|
+
return contents;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Read a JSON serializable object from a file
|
|
39
|
+
*
|
|
40
|
+
* Parse either from json, yaml, or toml
|
|
41
|
+
* Optional acceptedFormats object can be passed which can be an array of accepted formats, in future can be extended to include parseFn for the accepted formats
|
|
42
|
+
*/
|
|
43
|
+
export function readFile(filepath, acceptedFormats) {
|
|
44
|
+
const fileFormat = path.extname(filepath).substr(1);
|
|
45
|
+
if (acceptedFormats && !acceptedFormats.includes(fileFormat))
|
|
46
|
+
throw new Error(`UnsupportedFileFormat: ${filepath}`);
|
|
47
|
+
const contents = fs.readFileSync(filepath, "utf-8");
|
|
48
|
+
return parse(contents, fileFormat);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,MAAM,EAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;AAE3C,IAAK,UAKJ;AALD,WAAK,UAAU;IACb,2BAAa,CAAA;IACb,2BAAa,CAAA;IACb,yBAAW,CAAA;IACX,2BAAa,CAAA;AACf,CAAC,EALI,UAAU,KAAV,UAAU,QAKd;AAED,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE;QACR,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,SAAS,SAAS,CAAC,IAAI;gBAChC,+DAA+D;gBAC/D,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,CAAC;SACF,CAAC;KACH;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,KAAK,CAAI,QAAgB,EAAE,UAAsB;IACxD,QAAQ,UAAU,EAAE;QAClB,KAAK,UAAU,CAAC,IAAI;YAClB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAM,CAAC;QACnC,KAAK,UAAU,CAAC,IAAI,CAAC;QACrB,KAAK,UAAU,CAAC,GAAG;YACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,UAAU,EAAC,CAAM,CAAC;QACnD;YACE,OAAO,QAAwB,CAAC;KACnC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAI,QAAgB,EAAE,eAA0B;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACpH,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,QAAQ,EAAE,UAAwB,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WARNING!! If you change this path make sure to update:
|
|
3
|
+
* - 'packages/cli/package.json' -> .files -> `".git-data.json"`
|
|
4
|
+
*/
|
|
5
|
+
export declare const gitDataPath: string;
|
|
6
|
+
/** Git data type used to construct version information string and persistence. */
|
|
7
|
+
export type GitData = {
|
|
8
|
+
/** "developer-feature" */
|
|
9
|
+
branch: string;
|
|
10
|
+
/** "80c248bb392f512cc115d95059e22239a17bbd7d" */
|
|
11
|
+
commit: string;
|
|
12
|
+
};
|
|
13
|
+
/** Writes a persistent git data file. */
|
|
14
|
+
export declare function writeGitDataFile(gitData: GitData): void;
|
|
15
|
+
/** Reads the persistent git data file. */
|
|
16
|
+
export declare function readGitDataFile(): GitData;
|
|
17
|
+
//# sourceMappingURL=gitDataPath.d.ts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
// Global variable __dirname no longer available in ES6 modules.
|
|
5
|
+
// Solutions: https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-js-when-using-es6-modules
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
// Persist git data and distribute through NPM so CLI consumers can know exactly
|
|
9
|
+
// at what commit was this src build. This is used in the metrics and to log initially.
|
|
10
|
+
//
|
|
11
|
+
// - For NPM release (stable): Only the version is persisted. Once must then track the version's tag
|
|
12
|
+
// in Github to resolve that version to a specific commit. While this is okay, git-data.json gives
|
|
13
|
+
// a gurantee of the exact commit at build time.
|
|
14
|
+
//
|
|
15
|
+
// - For NPM release (dev): canary commits include the commit, so this feature is not really
|
|
16
|
+
// necessary. However, it's more cumbersome to have conditional logic on stable / dev.
|
|
17
|
+
//
|
|
18
|
+
// - For build from source: .git folder is available in the context of the built code, so it can extract
|
|
19
|
+
// branch and commit directly without the need for .git-data.json.
|
|
20
|
+
//
|
|
21
|
+
// - For build from source dockerized: This feature is required to know the branch and commit, since
|
|
22
|
+
// git data is not persisted past the build. However, .dockerignore prevents .git folder from being
|
|
23
|
+
// copied into the container's context, so .git-data.json can't be generated.
|
|
24
|
+
/**
|
|
25
|
+
* WARNING!! If you change this path make sure to update:
|
|
26
|
+
* - 'packages/cli/package.json' -> .files -> `".git-data.json"`
|
|
27
|
+
*/
|
|
28
|
+
export const gitDataPath = path.resolve(__dirname, "../../../.git-data.json");
|
|
29
|
+
/** Writes a persistent git data file. */
|
|
30
|
+
export function writeGitDataFile(gitData) {
|
|
31
|
+
fs.writeFileSync(gitDataPath, JSON.stringify(gitData, null, 2));
|
|
32
|
+
}
|
|
33
|
+
/** Reads the persistent git data file. */
|
|
34
|
+
export function readGitDataFile() {
|
|
35
|
+
return JSON.parse(fs.readFileSync(gitDataPath, "utf8"));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=gitDataPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitDataPath.js","sourceRoot":"","sources":["../../../src/utils/gitData/gitDataPath.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AAEvC,gEAAgE;AAChE,oHAAoH;AACpH,gEAAgE;AAChE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,gFAAgF;AAChF,uFAAuF;AACvF,EAAE;AACF,oGAAoG;AACpG,oGAAoG;AACpG,kDAAkD;AAClD,EAAE;AACF,4FAA4F;AAC5F,wFAAwF;AACxF,EAAE;AACF,wGAAwG;AACxG,oEAAoE;AACpE,EAAE;AACF,oGAAoG;AACpG,qGAAqG;AACrG,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;AAU9E,yCAAyC;AACzC,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAY,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { GitData } from "./gitDataPath.js";
|
|
2
|
+
/** Reads git data from a persisted file or local git data at build time. */
|
|
3
|
+
export declare function readAndGetGitData(): GitData;
|
|
4
|
+
/** Gets git data containing current branch and commit info from CLI. */
|
|
5
|
+
export declare function getGitData(): GitData;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|