@matterlabs/zksync-js 0.0.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 +21 -0
- package/README.md +124 -0
- package/dist/adapters/ethers/client.cjs +4548 -0
- package/dist/adapters/ethers/client.cjs.map +1 -0
- package/dist/adapters/ethers/client.d.ts +61 -0
- package/dist/adapters/ethers/client.js +5 -0
- package/dist/adapters/ethers/errors/error-ops.d.ts +20 -0
- package/dist/adapters/ethers/errors/revert.d.ts +28 -0
- package/dist/adapters/ethers/index.cjs +7537 -0
- package/dist/adapters/ethers/index.cjs.map +1 -0
- package/dist/adapters/ethers/index.d.ts +12 -0
- package/dist/adapters/ethers/index.js +8 -0
- package/dist/adapters/ethers/resources/deposits/context.d.ts +27 -0
- package/dist/adapters/ethers/resources/deposits/index.d.ts +46 -0
- package/dist/adapters/ethers/resources/deposits/routes/erc20-base.d.ts +2 -0
- package/dist/adapters/ethers/resources/deposits/routes/erc20-nonbase.d.ts +2 -0
- package/dist/adapters/ethers/resources/deposits/routes/eth-nonbase.d.ts +2 -0
- package/dist/adapters/ethers/resources/deposits/routes/eth.d.ts +2 -0
- package/dist/adapters/ethers/resources/deposits/routes/types.d.ts +10 -0
- package/dist/adapters/ethers/resources/deposits/services/verification.d.ts +9 -0
- package/dist/adapters/ethers/resources/token-info.d.ts +31 -0
- package/dist/adapters/ethers/resources/utils.d.ts +39 -0
- package/dist/adapters/ethers/resources/withdrawals/context.d.ts +19 -0
- package/dist/adapters/ethers/resources/withdrawals/index.d.ts +56 -0
- package/dist/adapters/ethers/resources/withdrawals/routes/erc20-nonbase.d.ts +2 -0
- package/dist/adapters/ethers/resources/withdrawals/routes/eth-nonbase.d.ts +2 -0
- package/dist/adapters/ethers/resources/withdrawals/routes/eth.d.ts +2 -0
- package/dist/adapters/ethers/resources/withdrawals/routes/types.d.ts +18 -0
- package/dist/adapters/ethers/resources/withdrawals/services/finalization.d.ts +33 -0
- package/dist/adapters/ethers/rpc.d.ts +4 -0
- package/dist/adapters/ethers/sdk.cjs +6245 -0
- package/dist/adapters/ethers/sdk.cjs.map +1 -0
- package/dist/adapters/ethers/sdk.d.ts +29 -0
- package/dist/adapters/ethers/sdk.js +6 -0
- package/dist/adapters/ethers/typechain/IAssetRouterBase.d.ts +198 -0
- package/dist/adapters/ethers/typechain/IBridgehub.d.ts +731 -0
- package/dist/adapters/ethers/typechain/IERC20.d.ts +108 -0
- package/dist/adapters/ethers/typechain/IL1AssetRouter.d.ts +570 -0
- package/dist/adapters/ethers/typechain/IL1NativeTokenVault.d.ts +154 -0
- package/dist/adapters/ethers/typechain/IL1Nullifier.d.ts +305 -0
- package/dist/adapters/ethers/typechain/IL2AssetRouter.d.ts +288 -0
- package/dist/adapters/ethers/typechain/IL2NativeTokenVault.d.ts +380 -0
- package/dist/adapters/ethers/typechain/common.d.ts +46 -0
- package/dist/adapters/ethers/typechain/factories/IAssetRouterBase__factory.d.ts +203 -0
- package/dist/adapters/ethers/typechain/factories/IBridgehub__factory.d.ts +998 -0
- package/dist/adapters/ethers/typechain/factories/IERC20__factory.d.ts +177 -0
- package/dist/adapters/ethers/typechain/factories/IL1AssetRouter__factory.d.ts +666 -0
- package/dist/adapters/ethers/typechain/factories/IL1NativeTokenVault__factory.d.ts +234 -0
- package/dist/adapters/ethers/typechain/factories/IL1Nullifier__factory.d.ts +382 -0
- package/dist/adapters/ethers/typechain/factories/IL2AssetRouter__factory.d.ts +327 -0
- package/dist/adapters/ethers/typechain/factories/IL2NativeTokenVault__factory.d.ts +696 -0
- package/dist/adapters/ethers/typechain/factories/index.d.ts +8 -0
- package/dist/adapters/ethers/typechain/index.d.ts +17 -0
- package/dist/adapters/viem/client.cjs +4534 -0
- package/dist/adapters/viem/client.cjs.map +1 -0
- package/dist/adapters/viem/client.d.ts +44 -0
- package/dist/adapters/viem/client.js +5 -0
- package/dist/adapters/viem/errors/error-ops.d.ts +20 -0
- package/dist/adapters/viem/errors/revert.d.ts +25 -0
- package/dist/adapters/viem/index.cjs +7772 -0
- package/dist/adapters/viem/index.cjs.map +1 -0
- package/dist/adapters/viem/index.d.ts +11 -0
- package/dist/adapters/viem/index.js +8 -0
- package/dist/adapters/viem/resources/deposits/context.d.ts +27 -0
- package/dist/adapters/viem/resources/deposits/index.d.ts +46 -0
- package/dist/adapters/viem/resources/deposits/routes/erc20-base.d.ts +2 -0
- package/dist/adapters/viem/resources/deposits/routes/erc20-nonbase.d.ts +2 -0
- package/dist/adapters/viem/resources/deposits/routes/eth-nonbase.d.ts +2 -0
- package/dist/adapters/viem/resources/deposits/routes/eth.d.ts +2 -0
- package/dist/adapters/viem/resources/deposits/routes/types.d.ts +20 -0
- package/dist/adapters/viem/resources/deposits/services/verification.d.ts +7 -0
- package/dist/adapters/viem/resources/token-info.d.ts +34 -0
- package/dist/adapters/viem/resources/utils.d.ts +42 -0
- package/dist/adapters/viem/resources/withdrawals/context.d.ts +22 -0
- package/dist/adapters/viem/resources/withdrawals/index.d.ts +56 -0
- package/dist/adapters/viem/resources/withdrawals/routes/erc20-nonbase.d.ts +2 -0
- package/dist/adapters/viem/resources/withdrawals/routes/eth-nonbase.d.ts +2 -0
- package/dist/adapters/viem/resources/withdrawals/routes/eth.d.ts +2 -0
- package/dist/adapters/viem/resources/withdrawals/routes/types.d.ts +19 -0
- package/dist/adapters/viem/resources/withdrawals/services/finalization.d.ts +33 -0
- package/dist/adapters/viem/rpc.d.ts +2 -0
- package/dist/adapters/viem/sdk.cjs +6481 -0
- package/dist/adapters/viem/sdk.cjs.map +1 -0
- package/dist/adapters/viem/sdk.d.ts +32 -0
- package/dist/adapters/viem/sdk.js +6 -0
- package/dist/chunk-263G6636.js +36 -0
- package/dist/chunk-3LALBFFE.js +138 -0
- package/dist/chunk-4HLJJKIY.js +262 -0
- package/dist/chunk-6GCT6TLS.js +45 -0
- package/dist/chunk-7M4V3FMT.js +2444 -0
- package/dist/chunk-B77GWPO5.js +339 -0
- package/dist/chunk-BD2LUO5T.js +123 -0
- package/dist/chunk-CGO27P7F.js +2187 -0
- package/dist/chunk-DI2CJDPZ.js +76 -0
- package/dist/chunk-Y75OMFK6.js +4489 -0
- package/dist/core/constants.cjs +39 -0
- package/dist/core/constants.cjs.map +1 -0
- package/dist/core/constants.d.ts +36 -0
- package/dist/core/constants.js +1 -0
- package/dist/core/errors/factory.d.ts +10 -0
- package/dist/core/errors/formatter.d.ts +2 -0
- package/dist/core/errors/rpc.d.ts +4 -0
- package/dist/core/errors/withdrawal-revert-map.d.ts +3 -0
- package/dist/core/index.cjs +552 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.ts +18 -0
- package/dist/core/index.js +4 -0
- package/dist/core/internal/abi-registry.d.ts +9 -0
- package/dist/core/internal/abis/IAssetRouterBase.d.ts +198 -0
- package/dist/core/internal/abis/IBaseToken.d.ts +162 -0
- package/dist/core/internal/abis/IBridgehub.d.ts +994 -0
- package/dist/core/internal/abis/IERC20.d.ts +224 -0
- package/dist/core/internal/abis/IL1AssetRouter.d.ts +661 -0
- package/dist/core/internal/abis/IL1Nullifier.d.ts +377 -0
- package/dist/core/internal/abis/IL2AssetRouter.d.ts +690 -0
- package/dist/core/internal/abis/L1NativeTokenVault.d.ts +719 -0
- package/dist/core/internal/abis/L2NativeTokenVault.d.ts +735 -0
- package/dist/core/internal/abis/Mailbox.d.ts +779 -0
- package/dist/core/resources/deposits/route.d.ts +6 -0
- package/dist/core/resources/withdrawals/events.d.ts +9 -0
- package/dist/core/resources/withdrawals/logs.d.ts +5 -0
- package/dist/core/resources/withdrawals/route.d.ts +6 -0
- package/dist/core/rpc/transport.d.ts +10 -0
- package/dist/core/rpc/types.d.ts +40 -0
- package/dist/core/rpc/zks.d.ts +12 -0
- package/dist/core/types/errors.d.ts +177 -0
- package/dist/core/types/flows/base.d.ts +51 -0
- package/dist/core/types/flows/deposits.d.ts +43 -0
- package/dist/core/types/flows/route.d.ts +12 -0
- package/dist/core/types/flows/withdrawals.d.ts +83 -0
- package/dist/core/types/index.d.ts +2 -0
- package/dist/core/types/primitives.d.ts +3 -0
- package/dist/core/utils/addr.d.ts +5 -0
- package/dist/core/utils/gas.d.ts +13 -0
- package/dist/index.cjs +571 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +4 -0
- package/package.json +177 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { createZksRpc, makeTransportFromEthers } from './chunk-4HLJJKIY.js';
|
|
2
|
+
import { IBridgehub_default, IL1AssetRouter_default, IL1Nullifier_default, IBaseToken_default, L2NativeTokenVault_default, IL2AssetRouter_default, L1NativeTokenVault_default } from './chunk-Y75OMFK6.js';
|
|
3
|
+
import { createError } from './chunk-B77GWPO5.js';
|
|
4
|
+
import { L2_ASSET_ROUTER_ADDRESS, L2_NATIVE_TOKEN_VAULT_ADDRESS, L2_BASE_TOKEN_ADDRESS } from './chunk-6GCT6TLS.js';
|
|
5
|
+
import { BrowserProvider, Interface, Contract } from 'ethers';
|
|
6
|
+
|
|
7
|
+
// src/adapters/ethers/rpc.ts
|
|
8
|
+
function zksRpcFromEthers(l2Provider) {
|
|
9
|
+
const maybe = l2Provider;
|
|
10
|
+
if (typeof maybe.send !== "function") {
|
|
11
|
+
throw new Error(
|
|
12
|
+
"zksRpcFromEthers requires a JSON-RPC capable provider with .send(method, params). Pass an ethers JsonRpcProvider (or wrap your EIP-1193 provider: new BrowserProvider(window.ethereum))."
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
return createZksRpc(makeTransportFromEthers(maybe));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// src/adapters/ethers/client.ts
|
|
19
|
+
function createEthersClient(args) {
|
|
20
|
+
const { l1, l2, signer } = args;
|
|
21
|
+
let boundSigner = signer;
|
|
22
|
+
const signerProvider = signer.provider;
|
|
23
|
+
const isBrowserProvider = signerProvider instanceof BrowserProvider;
|
|
24
|
+
if (!isBrowserProvider && (!boundSigner.provider || boundSigner.provider !== l1)) {
|
|
25
|
+
boundSigner = signer.connect(l1);
|
|
26
|
+
} else if (isBrowserProvider && signerProvider) {
|
|
27
|
+
void (async () => {
|
|
28
|
+
try {
|
|
29
|
+
const [signerNet, l1Net] = await Promise.all([
|
|
30
|
+
signerProvider.getNetwork(),
|
|
31
|
+
l1.getNetwork()
|
|
32
|
+
]);
|
|
33
|
+
if (signerNet.chainId !== l1Net.chainId) {
|
|
34
|
+
const warning = createError("STATE", {
|
|
35
|
+
message: `BrowserProvider signer chainId (${signerNet.chainId}) != L1 provider chainId (${l1Net.chainId}). Ensure the wallet is connected to the correct network.`,
|
|
36
|
+
resource: "helpers",
|
|
37
|
+
operation: "client.browserProvider.networkMismatch",
|
|
38
|
+
context: {
|
|
39
|
+
signerChainId: signerNet.chainId,
|
|
40
|
+
l1ChainId: l1Net.chainId
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
console.debug("[zksync-sdk] non-fatal warning:", warning);
|
|
44
|
+
}
|
|
45
|
+
} catch (e) {
|
|
46
|
+
}
|
|
47
|
+
})();
|
|
48
|
+
}
|
|
49
|
+
const zks = zksRpcFromEthers(l2);
|
|
50
|
+
let addrCache;
|
|
51
|
+
let cCache;
|
|
52
|
+
async function ensureAddresses() {
|
|
53
|
+
if (addrCache) return addrCache;
|
|
54
|
+
const bridgehub = args.overrides?.bridgehub ?? await zks.getBridgehubAddress();
|
|
55
|
+
const IBridgehub = new Interface(IBridgehub_default);
|
|
56
|
+
const bh = new Contract(bridgehub, IBridgehub, l1);
|
|
57
|
+
const l1AssetRouter = args.overrides?.l1AssetRouter ?? await bh.assetRouter();
|
|
58
|
+
const IL1AssetRouter = new Interface(IL1AssetRouter_default);
|
|
59
|
+
const ar = new Contract(l1AssetRouter, IL1AssetRouter, l1);
|
|
60
|
+
const l1Nullifier = args.overrides?.l1Nullifier ?? await ar.L1_NULLIFIER();
|
|
61
|
+
const IL1Nullifier = new Interface(IL1Nullifier_default);
|
|
62
|
+
const nf = new Contract(l1Nullifier, IL1Nullifier, l1);
|
|
63
|
+
const l1NativeTokenVault = args.overrides?.l1NativeTokenVault ?? await nf.l1NativeTokenVault();
|
|
64
|
+
const l2AssetRouter = args.overrides?.l2AssetRouter ?? L2_ASSET_ROUTER_ADDRESS;
|
|
65
|
+
const l2NativeTokenVault = args.overrides?.l2NativeTokenVault ?? L2_NATIVE_TOKEN_VAULT_ADDRESS;
|
|
66
|
+
const l2BaseTokenSystem = args.overrides?.l2BaseTokenSystem ?? L2_BASE_TOKEN_ADDRESS;
|
|
67
|
+
addrCache = {
|
|
68
|
+
bridgehub,
|
|
69
|
+
l1AssetRouter,
|
|
70
|
+
l1Nullifier,
|
|
71
|
+
l1NativeTokenVault,
|
|
72
|
+
l2AssetRouter,
|
|
73
|
+
l2NativeTokenVault,
|
|
74
|
+
l2BaseTokenSystem
|
|
75
|
+
};
|
|
76
|
+
return addrCache;
|
|
77
|
+
}
|
|
78
|
+
async function contracts() {
|
|
79
|
+
if (cCache) return cCache;
|
|
80
|
+
const a = await ensureAddresses();
|
|
81
|
+
cCache = {
|
|
82
|
+
bridgehub: new Contract(a.bridgehub, IBridgehub_default, l1),
|
|
83
|
+
l1AssetRouter: new Contract(a.l1AssetRouter, IL1AssetRouter_default, l1),
|
|
84
|
+
l1Nullifier: new Contract(a.l1Nullifier, IL1Nullifier_default, l1),
|
|
85
|
+
l1NativeTokenVault: new Contract(a.l1NativeTokenVault, L1NativeTokenVault_default, l1),
|
|
86
|
+
l2AssetRouter: new Contract(a.l2AssetRouter, IL2AssetRouter_default, l2),
|
|
87
|
+
l2NativeTokenVault: new Contract(a.l2NativeTokenVault, L2NativeTokenVault_default, l2),
|
|
88
|
+
l2BaseTokenSystem: new Contract(a.l2BaseTokenSystem, IBaseToken_default, l2)
|
|
89
|
+
};
|
|
90
|
+
return cCache;
|
|
91
|
+
}
|
|
92
|
+
function refresh() {
|
|
93
|
+
addrCache = void 0;
|
|
94
|
+
cCache = void 0;
|
|
95
|
+
}
|
|
96
|
+
function resolveSignerFor(provider) {
|
|
97
|
+
const signerProvider2 = boundSigner.provider;
|
|
98
|
+
if (signerProvider2 === provider) {
|
|
99
|
+
return boundSigner;
|
|
100
|
+
}
|
|
101
|
+
if (!isBrowserProvider && typeof boundSigner.connect === "function") {
|
|
102
|
+
return boundSigner.connect(provider);
|
|
103
|
+
}
|
|
104
|
+
if (!signerProvider2) {
|
|
105
|
+
throw createError("STATE", {
|
|
106
|
+
resource: "helpers",
|
|
107
|
+
message: "Signer has no associated provider; cannot resolve requested signer.",
|
|
108
|
+
operation: "client.resolveSignerFor"
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return boundSigner;
|
|
112
|
+
}
|
|
113
|
+
async function baseToken(chainId) {
|
|
114
|
+
const { bridgehub } = await ensureAddresses();
|
|
115
|
+
const bh = new Contract(bridgehub, IBridgehub_default, l1);
|
|
116
|
+
return await bh.baseToken(chainId);
|
|
117
|
+
}
|
|
118
|
+
const client = {
|
|
119
|
+
kind: "ethers",
|
|
120
|
+
l1,
|
|
121
|
+
l2,
|
|
122
|
+
signer: boundSigner,
|
|
123
|
+
getL1Signer() {
|
|
124
|
+
return resolveSignerFor(l1);
|
|
125
|
+
},
|
|
126
|
+
getL2Signer() {
|
|
127
|
+
return resolveSignerFor(l2);
|
|
128
|
+
},
|
|
129
|
+
zks,
|
|
130
|
+
ensureAddresses,
|
|
131
|
+
contracts,
|
|
132
|
+
refresh,
|
|
133
|
+
baseToken
|
|
134
|
+
};
|
|
135
|
+
return client;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export { createEthersClient };
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { createError, isZKsyncError, shapeCause } from './chunk-B77GWPO5.js';
|
|
2
|
+
import { __export } from './chunk-6GCT6TLS.js';
|
|
3
|
+
|
|
4
|
+
// src/core/rpc/zks.ts
|
|
5
|
+
var zks_exports = {};
|
|
6
|
+
__export(zks_exports, {
|
|
7
|
+
createZksRpc: () => createZksRpc,
|
|
8
|
+
normalizeGenesis: () => normalizeGenesis,
|
|
9
|
+
normalizeProof: () => normalizeProof
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
// src/core/errors/rpc.ts
|
|
13
|
+
async function withRpcOp(operation, message, ctx, fn) {
|
|
14
|
+
try {
|
|
15
|
+
return await fn();
|
|
16
|
+
} catch (e) {
|
|
17
|
+
if (isZKsyncError(e)) throw e;
|
|
18
|
+
throw createError("RPC", {
|
|
19
|
+
resource: "zksrpc",
|
|
20
|
+
operation,
|
|
21
|
+
message,
|
|
22
|
+
context: ctx,
|
|
23
|
+
cause: shapeCause(e)
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/core/rpc/zks.ts
|
|
29
|
+
var METHODS = {
|
|
30
|
+
getBridgehub: "zks_getBridgehubContract",
|
|
31
|
+
getL2ToL1LogProof: "zks_getL2ToL1LogProof",
|
|
32
|
+
getReceipt: "eth_getTransactionReceipt",
|
|
33
|
+
getGenesis: "zks_getGenesis"
|
|
34
|
+
};
|
|
35
|
+
function toHexArray(arr) {
|
|
36
|
+
const list = Array.isArray(arr) ? arr : [];
|
|
37
|
+
return list.map((x) => x);
|
|
38
|
+
}
|
|
39
|
+
function normalizeProof(p) {
|
|
40
|
+
try {
|
|
41
|
+
const raw = p ?? {};
|
|
42
|
+
const idRaw = raw?.id ?? raw?.index;
|
|
43
|
+
const bnRaw = raw?.batch_number ?? raw?.batchNumber;
|
|
44
|
+
if (idRaw == null || bnRaw == null) {
|
|
45
|
+
throw createError("RPC", {
|
|
46
|
+
resource: "zksrpc",
|
|
47
|
+
operation: "zksrpc.normalizeProof",
|
|
48
|
+
message: "Malformed proof: missing id or batch number.",
|
|
49
|
+
context: { keys: Object.keys(raw ?? {}) }
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const toBig = (x) => typeof x === "bigint" ? x : typeof x === "number" ? BigInt(x) : typeof x === "string" ? BigInt(x) : (() => {
|
|
53
|
+
throw createError("RPC", {
|
|
54
|
+
resource: "zksrpc",
|
|
55
|
+
operation: "zksrpc.normalizeProof",
|
|
56
|
+
message: "Malformed proof: invalid numeric field.",
|
|
57
|
+
context: { valueType: typeof x }
|
|
58
|
+
});
|
|
59
|
+
})();
|
|
60
|
+
return {
|
|
61
|
+
id: toBig(idRaw),
|
|
62
|
+
batchNumber: toBig(bnRaw),
|
|
63
|
+
proof: toHexArray(raw?.proof)
|
|
64
|
+
};
|
|
65
|
+
} catch (e) {
|
|
66
|
+
if (isZKsyncError(e)) throw e;
|
|
67
|
+
throw createError("RPC", {
|
|
68
|
+
resource: "zksrpc",
|
|
69
|
+
operation: "zksrpc.normalizeProof",
|
|
70
|
+
message: "Failed to normalize proof.",
|
|
71
|
+
context: { receivedType: typeof p },
|
|
72
|
+
cause: shapeCause(e)
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function ensureHex(value, field, context) {
|
|
77
|
+
if (typeof value === "string" && value.startsWith("0x")) return value;
|
|
78
|
+
throw createError("RPC", {
|
|
79
|
+
resource: "zksrpc",
|
|
80
|
+
operation: "zksrpc.normalizeGenesis",
|
|
81
|
+
message: "Malformed genesis response: expected 0x-prefixed hex value.",
|
|
82
|
+
context: { field, valueType: typeof value, ...context }
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function ensureNumber(value, field) {
|
|
86
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
87
|
+
if (typeof value === "bigint") return Number(value);
|
|
88
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
89
|
+
const parsed = Number(value);
|
|
90
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
91
|
+
}
|
|
92
|
+
throw createError("RPC", {
|
|
93
|
+
resource: "zksrpc",
|
|
94
|
+
operation: "zksrpc.normalizeGenesis",
|
|
95
|
+
message: "Malformed genesis response: expected numeric value.",
|
|
96
|
+
context: { field, valueType: typeof value }
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function normalizeContractTuple(tuple, index) {
|
|
100
|
+
if (!Array.isArray(tuple) || tuple.length < 2) {
|
|
101
|
+
throw createError("RPC", {
|
|
102
|
+
resource: "zksrpc",
|
|
103
|
+
operation: "zksrpc.normalizeGenesis",
|
|
104
|
+
message: "Malformed genesis response: invalid contract tuple.",
|
|
105
|
+
context: { index, valueType: typeof tuple }
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const [addrRaw, bytecodeRaw] = tuple;
|
|
109
|
+
return {
|
|
110
|
+
address: ensureHex(addrRaw, "initial_contracts.address", { index }),
|
|
111
|
+
bytecode: ensureHex(bytecodeRaw, "initial_contracts.bytecode", { index })
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function normalizeStorageTuple(tuple, index) {
|
|
115
|
+
if (!Array.isArray(tuple) || tuple.length < 2) {
|
|
116
|
+
throw createError("RPC", {
|
|
117
|
+
resource: "zksrpc",
|
|
118
|
+
operation: "zksrpc.normalizeGenesis",
|
|
119
|
+
message: "Malformed genesis response: invalid storage tuple.",
|
|
120
|
+
context: { index, valueType: typeof tuple }
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const [keyRaw, valueRaw] = tuple;
|
|
124
|
+
return {
|
|
125
|
+
key: ensureHex(keyRaw, "additional_storage.key", { index }),
|
|
126
|
+
value: ensureHex(valueRaw, "additional_storage.value", { index })
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function normalizeGenesis(raw) {
|
|
130
|
+
try {
|
|
131
|
+
if (!raw || typeof raw !== "object") {
|
|
132
|
+
throw createError("RPC", {
|
|
133
|
+
resource: "zksrpc",
|
|
134
|
+
operation: "zksrpc.normalizeGenesis",
|
|
135
|
+
message: "Malformed genesis response: expected object.",
|
|
136
|
+
context: { receivedType: typeof raw }
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
const record = raw;
|
|
140
|
+
const contractsRaw = record["initial_contracts"];
|
|
141
|
+
if (!Array.isArray(contractsRaw)) {
|
|
142
|
+
throw createError("RPC", {
|
|
143
|
+
resource: "zksrpc",
|
|
144
|
+
operation: "zksrpc.normalizeGenesis",
|
|
145
|
+
message: "Malformed genesis response: initial_contracts must be an array.",
|
|
146
|
+
context: { valueType: typeof contractsRaw }
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const storageRaw = record["additional_storage"];
|
|
150
|
+
if (!Array.isArray(storageRaw)) {
|
|
151
|
+
throw createError("RPC", {
|
|
152
|
+
resource: "zksrpc",
|
|
153
|
+
operation: "zksrpc.normalizeGenesis",
|
|
154
|
+
message: "Malformed genesis response: additional_storage must be an array.",
|
|
155
|
+
context: { valueType: typeof storageRaw }
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
const executionVersion = ensureNumber(record["execution_version"], "execution_version");
|
|
159
|
+
const genesisRoot = ensureHex(record["genesis_root"], "genesis_root", {});
|
|
160
|
+
const initialContracts = contractsRaw.map(
|
|
161
|
+
(entry, index) => normalizeContractTuple(entry, index)
|
|
162
|
+
);
|
|
163
|
+
const additionalStorage = storageRaw.map((entry, index) => normalizeStorageTuple(entry, index));
|
|
164
|
+
return {
|
|
165
|
+
initialContracts,
|
|
166
|
+
additionalStorage,
|
|
167
|
+
executionVersion,
|
|
168
|
+
genesisRoot
|
|
169
|
+
};
|
|
170
|
+
} catch (e) {
|
|
171
|
+
if (isZKsyncError(e)) throw e;
|
|
172
|
+
throw createError("RPC", {
|
|
173
|
+
resource: "zksrpc",
|
|
174
|
+
operation: "zksrpc.normalizeGenesis",
|
|
175
|
+
message: "Failed to normalize genesis response.",
|
|
176
|
+
context: { receivedType: typeof raw },
|
|
177
|
+
cause: shapeCause(e)
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function createZksRpc(transport) {
|
|
182
|
+
return {
|
|
183
|
+
// Fetches the Bridgehub contract address.
|
|
184
|
+
async getBridgehubAddress() {
|
|
185
|
+
return withRpcOp(
|
|
186
|
+
"zksrpc.getBridgehubAddress",
|
|
187
|
+
"Failed to fetch Bridgehub address.",
|
|
188
|
+
{},
|
|
189
|
+
async () => {
|
|
190
|
+
const addrRaw = await transport(METHODS.getBridgehub, []);
|
|
191
|
+
if (typeof addrRaw !== "string" || !addrRaw.startsWith("0x")) {
|
|
192
|
+
throw createError("RPC", {
|
|
193
|
+
resource: "zksrpc",
|
|
194
|
+
operation: "zksrpc.getBridgehubAddress",
|
|
195
|
+
message: "Unexpected Bridgehub address response.",
|
|
196
|
+
context: { valueType: typeof addrRaw }
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return addrRaw;
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
},
|
|
203
|
+
// Fetches a proof for an L2→L1 log emitted in the given transaction.
|
|
204
|
+
async getL2ToL1LogProof(txHash, index) {
|
|
205
|
+
return withRpcOp(
|
|
206
|
+
"zksrpc.getL2ToL1LogProof",
|
|
207
|
+
"Failed to fetch L2\u2192L1 log proof.",
|
|
208
|
+
{ txHash, index },
|
|
209
|
+
async () => {
|
|
210
|
+
const proof = await transport(METHODS.getL2ToL1LogProof, [txHash, index]);
|
|
211
|
+
if (!proof) {
|
|
212
|
+
throw createError("STATE", {
|
|
213
|
+
resource: "zksrpc",
|
|
214
|
+
operation: "zksrpc.getL2ToL1LogProof",
|
|
215
|
+
message: "Proof not yet available. Please try again later.",
|
|
216
|
+
context: { txHash, index }
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
return normalizeProof(proof);
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
},
|
|
223
|
+
// Fetches the transaction receipt, including the `l2ToL1Logs` field.
|
|
224
|
+
async getReceiptWithL2ToL1(txHash) {
|
|
225
|
+
return withRpcOp(
|
|
226
|
+
"zksrpc.getReceiptWithL2ToL1",
|
|
227
|
+
"Failed to fetch transaction receipt.",
|
|
228
|
+
{ txHash },
|
|
229
|
+
async () => {
|
|
230
|
+
const rcptRaw = await transport(METHODS.getReceipt, [txHash]);
|
|
231
|
+
if (!rcptRaw) return null;
|
|
232
|
+
const rcptObj = rcptRaw;
|
|
233
|
+
const logs = Array.isArray(rcptObj["l2ToL1Logs"]) ? rcptObj["l2ToL1Logs"] : [];
|
|
234
|
+
rcptObj["l2ToL1Logs"] = logs;
|
|
235
|
+
return rcptObj;
|
|
236
|
+
}
|
|
237
|
+
);
|
|
238
|
+
},
|
|
239
|
+
// Fetches the genesis configuration returned by `zks_getGenesis`.
|
|
240
|
+
async getGenesis() {
|
|
241
|
+
return withRpcOp(
|
|
242
|
+
"zksrpc.getGenesis",
|
|
243
|
+
"Failed to fetch genesis configuration.",
|
|
244
|
+
{},
|
|
245
|
+
async () => {
|
|
246
|
+
const genesisRaw = await transport(METHODS.getGenesis, []);
|
|
247
|
+
return normalizeGenesis(genesisRaw);
|
|
248
|
+
}
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// src/core/rpc/transport.ts
|
|
255
|
+
function makeTransportFromEthers(provider) {
|
|
256
|
+
return (m, p = []) => provider.send(m, p);
|
|
257
|
+
}
|
|
258
|
+
function makeTransportFromViem(client) {
|
|
259
|
+
return (m, p = []) => client.request({ method: m, params: p });
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export { createZksRpc, makeTransportFromEthers, makeTransportFromViem, zks_exports };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { keccak_256 } from '@noble/hashes/sha3';
|
|
2
|
+
import { bytesToHex, utf8ToBytes } from '@noble/hashes/utils';
|
|
3
|
+
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// src/core/constants.ts
|
|
11
|
+
var constants_exports = {};
|
|
12
|
+
__export(constants_exports, {
|
|
13
|
+
ETH_ADDRESS: () => ETH_ADDRESS,
|
|
14
|
+
FORMAL_ETH_ADDRESS: () => FORMAL_ETH_ADDRESS,
|
|
15
|
+
L1_FEE_ESTIMATION_COEF_DENOMINATOR: () => L1_FEE_ESTIMATION_COEF_DENOMINATOR,
|
|
16
|
+
L1_FEE_ESTIMATION_COEF_NUMERATOR: () => L1_FEE_ESTIMATION_COEF_NUMERATOR,
|
|
17
|
+
L1_MESSENGER_ADDRESS: () => L1_MESSENGER_ADDRESS,
|
|
18
|
+
L1_SOPH_TOKEN_ADDRESS: () => L1_SOPH_TOKEN_ADDRESS,
|
|
19
|
+
L2_ASSET_ROUTER_ADDRESS: () => L2_ASSET_ROUTER_ADDRESS,
|
|
20
|
+
L2_BASE_TOKEN_ADDRESS: () => L2_BASE_TOKEN_ADDRESS,
|
|
21
|
+
L2_NATIVE_TOKEN_VAULT_ADDRESS: () => L2_NATIVE_TOKEN_VAULT_ADDRESS,
|
|
22
|
+
TOPIC_CANONICAL_ASSIGNED: () => TOPIC_CANONICAL_ASSIGNED,
|
|
23
|
+
TOPIC_CANONICAL_SUCCESS: () => TOPIC_CANONICAL_SUCCESS,
|
|
24
|
+
TOPIC_L1_MESSAGE_SENT: () => TOPIC_L1_MESSAGE_SENT,
|
|
25
|
+
TOPIC_L1_MESSAGE_SENT_LEG: () => TOPIC_L1_MESSAGE_SENT_LEG,
|
|
26
|
+
TOPIC_L1_MESSAGE_SENT_NEW: () => TOPIC_L1_MESSAGE_SENT_NEW,
|
|
27
|
+
k256hex: () => k256hex
|
|
28
|
+
});
|
|
29
|
+
var k256hex = (s) => `0x${bytesToHex(keccak_256(utf8ToBytes(s)))}`.toLowerCase();
|
|
30
|
+
var FORMAL_ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
31
|
+
var ETH_ADDRESS = "0x0000000000000000000000000000000000000001";
|
|
32
|
+
var L2_ASSET_ROUTER_ADDRESS = "0x0000000000000000000000000000000000010003";
|
|
33
|
+
var L2_NATIVE_TOKEN_VAULT_ADDRESS = "0x0000000000000000000000000000000000010004";
|
|
34
|
+
var L1_MESSENGER_ADDRESS = "0x0000000000000000000000000000000000008008";
|
|
35
|
+
var L2_BASE_TOKEN_ADDRESS = "0x000000000000000000000000000000000000800A";
|
|
36
|
+
var L1_SOPH_TOKEN_ADDRESS = "0xa9544a49d4aEa4c8E074431c89C79fA9592049d8";
|
|
37
|
+
var TOPIC_L1_MESSAGE_SENT = "0x2632cc0d58b0cb1017b99cc0b6cc66ad86440cc0dd923bfdaa294f95ba1b0201";
|
|
38
|
+
var TOPIC_L1_MESSAGE_SENT_NEW = k256hex("L1MessageSent(uint256,bytes32,bytes)");
|
|
39
|
+
var TOPIC_L1_MESSAGE_SENT_LEG = k256hex("L1MessageSent(address,bytes32,bytes)");
|
|
40
|
+
var TOPIC_CANONICAL_ASSIGNED = "0x779f441679936c5441b671969f37400b8c3ed0071cb47444431bf985754560df";
|
|
41
|
+
var TOPIC_CANONICAL_SUCCESS = "0xe4def01b981193a97a9e81230d7b9f31812ceaf23f864a828a82c687911cb2df";
|
|
42
|
+
var L1_FEE_ESTIMATION_COEF_NUMERATOR = 12;
|
|
43
|
+
var L1_FEE_ESTIMATION_COEF_DENOMINATOR = 10;
|
|
44
|
+
|
|
45
|
+
export { ETH_ADDRESS, FORMAL_ETH_ADDRESS, L1_FEE_ESTIMATION_COEF_DENOMINATOR, L1_FEE_ESTIMATION_COEF_NUMERATOR, L1_MESSENGER_ADDRESS, L1_SOPH_TOKEN_ADDRESS, L2_ASSET_ROUTER_ADDRESS, L2_BASE_TOKEN_ADDRESS, L2_NATIVE_TOKEN_VAULT_ADDRESS, TOPIC_CANONICAL_ASSIGNED, TOPIC_CANONICAL_SUCCESS, TOPIC_L1_MESSAGE_SENT, TOPIC_L1_MESSAGE_SENT_LEG, TOPIC_L1_MESSAGE_SENT_NEW, __export, constants_exports, k256hex };
|